diff --git a/assets/voxygen/voxel/object/anvil.vox b/assets/voxygen/voxel/object/anvil.vox new file mode 100644 index 0000000000..5c801a2586 --- /dev/null +++ b/assets/voxygen/voxel/object/anvil.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:efa901f8c256ca65e71fd240ab27877839c867276878a4403ca33e3947cc52d6 +size 56637 diff --git a/assets/voxygen/voxel/object/bed_blue.vox b/assets/voxygen/voxel/object/bed_blue.vox new file mode 100644 index 0000000000..23f77ac032 --- /dev/null +++ b/assets/voxygen/voxel/object/bed_blue.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0425b495101cf3ea75e1bf2a9d17d2196c016a670a376fe235f44664b558ee6 +size 60541 diff --git a/assets/voxygen/voxel/object/bench.vox b/assets/voxygen/voxel/object/bench.vox new file mode 100644 index 0000000000..22846826b5 --- /dev/null +++ b/assets/voxygen/voxel/object/bench.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f956ba5f857163cbba699cc497f6d40db3a8ae7ba215b37806daddfc7d43cb5d +size 56305 diff --git a/assets/voxygen/voxel/object/carpet1.vox b/assets/voxygen/voxel/object/carpet1.vox new file mode 100644 index 0000000000..8929e0cf53 --- /dev/null +++ b/assets/voxygen/voxel/object/carpet1.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd7bc5401d7b1f2dec05f6c306940c08bfdbdc9b685b64eb3a869f391b4f7c47 +size 58661 diff --git a/assets/voxygen/voxel/object/cauldron.vox b/assets/voxygen/voxel/object/cauldron.vox new file mode 100644 index 0000000000..a95497913a --- /dev/null +++ b/assets/voxygen/voxel/object/cauldron.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f083632d05ea1d59674e477b789efce291b4487e0cb287ea9fada817940bb3f3 +size 10696 diff --git a/assets/voxygen/voxel/object/chair.vox b/assets/voxygen/voxel/object/chair.vox new file mode 100644 index 0000000000..c137e0c605 --- /dev/null +++ b/assets/voxygen/voxel/object/chair.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:861f2aee863abe8b9b612abbd753ccf9a4c966ae392945624e903e8d79c8d7c7 +size 56093 diff --git a/assets/voxygen/voxel/object/door_spooky.vox b/assets/voxygen/voxel/object/door_spooky.vox new file mode 100644 index 0000000000..51f8eca2b8 --- /dev/null +++ b/assets/voxygen/voxel/object/door_spooky.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:df6b8d028f0334f37746418b8317de992e1645ad8076eb084e5a210c0753e7cc +size 69180 diff --git a/assets/voxygen/voxel/object/drawer.vox b/assets/voxygen/voxel/object/drawer.vox new file mode 100644 index 0000000000..f05829b7d7 --- /dev/null +++ b/assets/voxygen/voxel/object/drawer.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3d74477239c07cf089eca70397a099658dad7fff66d587b2d452f4eafed12d5b +size 58645 diff --git a/assets/voxygen/voxel/object/gravestone1.vox b/assets/voxygen/voxel/object/gravestone1.vox new file mode 100644 index 0000000000..56fc1d4707 --- /dev/null +++ b/assets/voxygen/voxel/object/gravestone1.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4efe0580b5cccf7f9754703d032513984940bfdd044ac43dff2f79507624ae6e +size 56333 diff --git a/assets/voxygen/voxel/object/gravestone2.vox b/assets/voxygen/voxel/object/gravestone2.vox new file mode 100644 index 0000000000..dd4cab6027 --- /dev/null +++ b/assets/voxygen/voxel/object/gravestone2.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:46c126ef04c3f242337d492240fee7464f82ead1c5dd20c0f9a776133e5d4b1c +size 57269 diff --git a/assets/voxygen/voxel/object/lantern_ground.vox b/assets/voxygen/voxel/object/lantern_ground.vox index 29746dc9dd..4f6f50f8d2 100644 --- a/assets/voxygen/voxel/object/lantern_ground.vox +++ b/assets/voxygen/voxel/object/lantern_ground.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:13073509569a24617d3dc42d323493be6d8a7e9cfae1cc928ec16d8f22a6c89e -size 45135 +oid sha256:3a27b4da28d5096aa06ce4914482363e1d16641796823e70e2745607d3df5444 +size 45187 diff --git a/assets/voxygen/voxel/object/table.vox b/assets/voxygen/voxel/object/table.vox new file mode 100644 index 0000000000..a2a003fa1c --- /dev/null +++ b/assets/voxygen/voxel/object/table.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f3ef4257a1c0d6ce67b8f7541097bf8cf5fa1689c94eaa7f2e127d13f112e024 +size 56853 diff --git a/assets/voxygen/voxel/object/tent.vox b/assets/voxygen/voxel/object/tent.vox new file mode 100644 index 0000000000..309ec9e4ff --- /dev/null +++ b/assets/voxygen/voxel/object/tent.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61b3234033b22364675297c9064eb61b2fc796a4d05e3154ae95fa744d25d0d2 +size 11248 diff --git a/assets/voxygen/voxel/object/window_spooky.vox b/assets/voxygen/voxel/object/window_spooky.vox new file mode 100644 index 0000000000..7360c573cc --- /dev/null +++ b/assets/voxygen/voxel/object/window_spooky.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:35944786a274f505a1733e95a3051c76e50e62425c3f44279d0e8027e6f531e6 +size 52396 diff --git a/common/src/comp/body/object.rs b/common/src/comp/body/object.rs index 659583a2f0..9289c38607 100644 --- a/common/src/comp/body/object.rs +++ b/common/src/comp/body/object.rs @@ -4,6 +4,7 @@ use rand::{seq::SliceRandom, thread_rng}; pub enum Body { Bomb, Scarecrow, + Cauldron, ChestVines, Chest, ChestDark, @@ -26,6 +27,18 @@ pub enum Body { PotionGreen, PotionRed, Crate, + Tent, + WindowSpooky, + DoorSpooky, + Anvil, + Gravestone1, + Gravestone2, + Bench, + Chair, + Table, + Drawer, + BedBlue, + Carpet1, } impl Body { @@ -35,9 +48,10 @@ impl Body { } } -const ALL_OBJECTS: [Body; 24] = [ +const ALL_OBJECTS: [Body; 37] = [ Body::Bomb, Body::Scarecrow, + Body::Cauldron, Body::ChestVines, Body::Chest, Body::ChestDark, @@ -60,4 +74,16 @@ const ALL_OBJECTS: [Body; 24] = [ Body::PotionBlue, Body::PotionGreen, Body::Crate, + Body::Tent, + Body::WindowSpooky, + Body::DoorSpooky, + Body::Anvil, + Body::Gravestone1, + Body::Gravestone2, + Body::Bench, + Body::Chair, + Body::Table, + Body::Drawer, + Body::BedBlue, + Body::Carpet1, ]; diff --git a/server/src/cmd.rs b/server/src/cmd.rs index d5723bf2d1..843c3e2710 100644 --- a/server/src/cmd.rs +++ b/server/src/cmd.rs @@ -3,6 +3,7 @@ //! and provide a handler function. use crate::Server; +use common::comp::object::Body; use common::{ comp, msg::ServerMsg, @@ -134,7 +135,7 @@ lazy_static! { ChatCommand::new( "object", "{}", - "/object : Spawn a random object", + "/object [Name]: Spawn an object", handle_object, ), ]; @@ -312,7 +313,7 @@ fn handle_spawn(server: &mut Server, entity: EcsEntity, args: String, action: &C let (opt_align, opt_id, opt_amount) = scan_fmt!(&args, action.arg_fmt, String, NpcKind, String); // This should be just an enum handled with scan_fmt! let opt_agent = alignment_to_agent(&opt_align.unwrap_or(String::new()), entity); - + let _objtype = scan_fmt!(&args, action.arg_fmt, String); // Make sure the amount is either not provided or a valid value let opt_amount = opt_amount .map_or(Some(1), |a| a.parse().ok()) @@ -450,7 +451,8 @@ fn handle_killnpcs(server: &mut Server, entity: EcsEntity, _args: String, _actio server.clients.notify(entity, ServerMsg::Chat(text)); } -fn handle_object(server: &mut Server, entity: EcsEntity, _args: String, _action: &ChatCommand) { +fn handle_object(server: &mut Server, entity: EcsEntity, args: String, _action: &ChatCommand) { + let obj_type = scan_fmt!(&args, _action.arg_fmt, String); let pos = server .state .ecs() @@ -458,9 +460,50 @@ fn handle_object(server: &mut Server, entity: EcsEntity, _args: String, _action: .get(entity) .copied(); if let Some(pos) = pos { - server - .create_object(pos, comp::object::Body::random()) - .build(); + let obj_type = match obj_type.as_ref().map(String::as_str) { + Some("Scarecrow") => comp::object::Body::Scarecrow, + Some("Cauldron") => comp::object::Body::Cauldron, + Some("Chest_Vines") => comp::object::Body::ChestVines, + Some("Chest") => comp::object::Body::Chest, + Some("Chest_Dark") => comp::object::Body::ChestDark, + Some("Chest_Demon") => comp::object::Body::ChestDemon, + Some("Chest_Gold") => comp::object::Body::ChestGold, + Some("Chest_Light") => comp::object::Body::ChestLight, + Some("Chest_Open") => comp::object::Body::ChestOpen, + Some("Chest_Skull") => comp::object::Body::ChestSkull, + Some("Pumpkin_1") => comp::object::Body::Pumpkin1, + Some("Pumpkin_2") => comp::object::Body::Pumpkin2, + Some("Pumpkin_3") => comp::object::Body::Pumpkin3, + Some("Pumpkin_4") => comp::object::Body::Pumpkin4, + Some("Pumpkin_5") => comp::object::Body::Pumpkin5, + Some("Campfire") => comp::object::Body::Campfire, + Some("Lantern_Ground") => comp::object::Body::LanternGround, + Some("Lantern_Ground_Open") => comp::object::Body::LanternGroundOpen, + Some("Lantern_Standing_2") => comp::object::Body::LanternStanding2, + Some("Lantern_Standing") => comp::object::Body::LanternStanding, + Some("Potion_Blue") => comp::object::Body::PotionBlue, + Some("Potion_Green") => comp::object::Body::PotionGreen, + Some("Potion_Red") => comp::object::Body::PotionRed, + Some("Crate") => comp::object::Body::Crate, + Some("Tent") => comp::object::Body::Tent, + Some("Bomb") => comp::object::Body::Bomb, + Some("Window_Spooky") => comp::object::Body::WindowSpooky, + Some("Carpet_1") => comp::object::Body::Carpet1, + Some("Table") => comp::object::Body::Table, + Some("Drawer") => comp::object::Body::Drawer, + Some("Bed_Blue") => comp::object::Body::BedBlue, + Some("Anvil") => comp::object::Body::Anvil, + Some("Gravestone_1") => comp::object::Body::Gravestone1, + Some("Gravestone_2") => comp::object::Body::Gravestone2, + Some("Chair") => comp::object::Body::Chair, + Some("Bench") => comp::object::Body::Bench, + _ => { + return server + .clients + .notify(entity, ServerMsg::Chat(String::from("Object not found!"))); + } + }; + server.create_object(pos, obj_type).build(); server .clients .notify(entity, ServerMsg::Chat(format!("Spawned object."))); diff --git a/voxygen/src/scene/figure.rs b/voxygen/src/scene/figure.rs index 3185282d06..486249b70f 100644 --- a/voxygen/src/scene/figure.rs +++ b/voxygen/src/scene/figure.rs @@ -516,6 +516,7 @@ impl FigureModelCache { let (name, offset) = match obj { object::Body::Bomb => ("object/bomb.vox", Vec3::new(-5.5, -5.5, 0.0)), object::Body::Scarecrow => ("object/scarecrow.vox", Vec3::new(-9.5, -4.0, 0.0)), + object::Body::Cauldron => ("object/cauldron.vox", Vec3::new(-10.0, -10.0, 0.0)), object::Body::ChestVines => ("object/chest_vines.vox", Vec3::new(-7.5, -6.0, 0.0)), object::Body::Chest => ("object/chest.vox", Vec3::new(-7.5, -6.0, 0.0)), object::Body::ChestDark => ("object/chest_dark.vox", Vec3::new(-7.5, -6.0, 0.0)), @@ -546,6 +547,20 @@ impl FigureModelCache { object::Body::PotionBlue => ("object/potion_blue.vox", Vec3::new(-2.0, -2.0, 0.0)), object::Body::PotionGreen => ("object/potion_green.vox", Vec3::new(-2.0, -2.0, 0.0)), object::Body::Crate => ("object/crate.vox", Vec3::new(-7.0, -7.0, 0.0)), + object::Body::Tent => ("object/tent.vox", Vec3::new(-18.5, -19.5, 0.0)), + object::Body::WindowSpooky => { + ("object/window_spooky.vox", Vec3::new(-15.0, -1.5, -1.0)) + } + object::Body::DoorSpooky => ("object/door_spooky.vox", Vec3::new(-15.0, -4.5, 0.0)), + object::Body::Table => ("object/table.vox", Vec3::new(-12.0, -6.0, 0.0)), + object::Body::Drawer => ("object/drawer.vox", Vec3::new(-6.5, -6.5, 0.0)), + object::Body::BedBlue => ("object/bed_blue.vox", Vec3::new(-8.5, -5.0, 0.0)), + object::Body::Anvil => ("object/anvil.vox", Vec3::new(-3.0, -7.0, 0.0)), + object::Body::Gravestone1 => ("object/gravestone1.vox", Vec3::new(-5.0, -2.0, 0.0)), + object::Body::Gravestone2 => ("object/gravestone2.vox", Vec3::new(-8.5, -3.0, 0.0)), + object::Body::Chair => ("object/chair.vox", Vec3::new(-3.5, -4.0, 0.0)), + object::Body::Bench => ("object/bench.vox", Vec3::new(-8.8, -5.0, 0.0)), + object::Body::Carpet1 => ("object/carpet1.vox", Vec3::new(-14.0, -14.0, -0.5)), }; Self::load_mesh(name, offset) }