From 771baaaae5dca497178abf53cd6472bf6d1c7fd1 Mon Sep 17 00:00:00 2001 From: Pfauenauge90 <44173739+Pfauenauge90@users.noreply.github.com> Date: Mon, 6 Apr 2020 02:25:52 +0200 Subject: [PATCH] cape item --- assets/common/items/armor/back/short_0.ron | 8 +++ .../voxel/humanoid_armor_back_manifest.ron | 12 ++++ common/src/comp/inventory/item/armor.rs | 7 +++ server/src/events/inventory_manip.rs | 1 + voxygen/src/scene/figure/load.rs | 59 +++++++++++++++++++ 5 files changed, 87 insertions(+) create mode 100644 assets/common/items/armor/back/short_0.ron create mode 100644 assets/voxygen/voxel/humanoid_armor_back_manifest.ron diff --git a/assets/common/items/armor/back/short_0.ron b/assets/common/items/armor/back/short_0.ron new file mode 100644 index 0000000000..805b88edd0 --- /dev/null +++ b/assets/common/items/armor/back/short_0.ron @@ -0,0 +1,8 @@ +Item( + name: "Short leather Cape", + description: "WIP", + kind: Armor( + kind: Back(Short0), + stats: (20), + ), +) diff --git a/assets/voxygen/voxel/humanoid_armor_back_manifest.ron b/assets/voxygen/voxel/humanoid_armor_back_manifest.ron new file mode 100644 index 0000000000..4d1db6dcff --- /dev/null +++ b/assets/voxygen/voxel/humanoid_armor_back_manifest.ron @@ -0,0 +1,12 @@ +(( + default: ( + vox_spec: ("armor.empty", (0.0, 0.0, 0.0)), + color: None + ), + map: { + Short0: ( + vox_spec: ("armor.back.short-0", (0.0, 0.0, 0.0)), + color: None + ), + }, +)) diff --git a/common/src/comp/inventory/item/armor.rs b/common/src/comp/inventory/item/armor.rs index 88cd537203..339ef7c92a 100644 --- a/common/src/comp/inventory/item/armor.rs +++ b/common/src/comp/inventory/item/armor.rs @@ -163,6 +163,12 @@ pub const ALL_SHOULDERS: [Shoulder; 9] = [ Shoulder::ClothBlue0, Shoulder::ClothGreen0, ]; +#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[repr(u32)] +pub enum Back { + Short0 = 1, +} +pub const ALL_BACKS: [Back; 1] = [Back::Short0]; #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub enum Armor { @@ -172,6 +178,7 @@ pub enum Armor { Hand(Hand), Pants(Pants), Foot(Foot), + Back(Back), } #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] diff --git a/server/src/events/inventory_manip.rs b/server/src/events/inventory_manip.rs index f5929ec4f5..57900f7c86 100644 --- a/server/src/events/inventory_manip.rs +++ b/server/src/events/inventory_manip.rs @@ -138,6 +138,7 @@ pub fn handle_inventory(server: &mut Server, entity: EcsEntity, manip: comp::Inv Hand(_) => &mut loadout.hand, Pants(_) => &mut loadout.pants, Foot(_) => &mut loadout.foot, + Back(_) => &mut loadout.back, }; // Insert old item into inventory diff --git a/voxygen/src/scene/figure/load.rs b/voxygen/src/scene/figure/load.rs index fcb221726d..bbfb0bb309 100644 --- a/voxygen/src/scene/figure/load.rs +++ b/voxygen/src/scene/figure/load.rs @@ -255,6 +255,8 @@ pub struct HumArmorPantsSpec(ArmorVoxSpecMap); #[derive(Serialize, Deserialize)] pub struct HumArmorFootSpec(ArmorVoxSpecMap); #[derive(Serialize, Deserialize)] +pub struct HumArmorBackSpec(ArmorVoxSpecMap); +#[derive(Serialize, Deserialize)] pub struct HumMainWeaponSpec(HashMap); impl Asset for HumArmorShoulderSpec { @@ -299,6 +301,13 @@ impl Asset for HumArmorFootSpec { ron::de::from_reader(buf_reader).map_err(assets::Error::parse_error) } } +impl Asset for HumArmorBackSpec { + const ENDINGS: &'static [&'static str] = &["ron"]; + + fn parse(buf_reader: BufReader) -> Result { + ron::de::from_reader(buf_reader).map_err(assets::Error::parse_error) + } +} impl Asset for HumMainWeaponSpec { const ENDINGS: &'static [&'static str] = &["ron"]; @@ -597,6 +606,56 @@ impl HumArmorFootSpec { self.mesh_foot(body, loadout, false) } } +impl HumArmorBackSpec { + pub fn load_watched(indicator: &mut ReloadIndicator) -> Arc { + assets::load_watched::("voxygen.voxel.humanoid_armor_back_manifest", indicator) + .unwrap() + } + + pub fn mesh_back(&self, body: &Body, loadout: &Loadout) -> Mesh { + let spec = if let Some(ItemKind::Armor { + kind: Armor::Back(back), + .. + }) = loadout.back.as_ref().map(|i| &i.kind) + { + match self.0.map.get(&back) { + Some(spec) => spec, + None => { + error!("No back-armor specification exists for {:?}", back); + return load_mesh("not_found", Vec3::new(-5.0, -3.5, 1.0)); + }, + } + } else { + &self.0.default + }; + + let color = |mat_segment| { + color_segment( + mat_segment, + body.race.skin_color(body.skin), + body.race.hair_color(body.hair_color), + body.race.eye_color(body.eye_color), + ) + }; + + let bare_back = graceful_load_mat_segment("armor.empty"); + + let mut back_armor = graceful_load_mat_segment(&spec.vox_spec.0); + + if let Some(color) = spec.color { + let back_color = Vec3::from(color); + back_armor = back_armor.map_rgb(|rgb| recolor_grey(rgb, Rgb::from(back_color))); + } + + let back = DynaUnionizer::new() + .add(color(bare_back), Vec3::new(0, 0, 0)) + .add(color(back_armor), Vec3::new(0, 0, 0)) + .unify() + .0; + + generate_mesh(&back, Vec3::from(spec.vox_spec.1)) + } +} impl HumMainWeaponSpec { pub fn load_watched(indicator: &mut ReloadIndicator) -> Arc {