From 9d98cd9e589e8fee489f6d923106487aff6986c6 Mon Sep 17 00:00:00 2001 From: unvariant Date: Mon, 14 Feb 2022 02:09:45 +0000 Subject: [PATCH] Render item drops instead of placeholder textures --- CHANGELOG.md | 1 + assets/common/npc_names.ron | 7 + assets/voxygen/voxel/item_drop_manifest.ron | 2932 +++++++++++++++++++ common/src/comp/agent.rs | 1 + common/src/comp/body.rs | 9 + common/src/comp/body/item_drop.rs | 150 + common/src/comp/fluid_dynamics.rs | 6 + common/src/comp/inventory/item/item_key.rs | 51 + common/src/comp/inventory/item/mod.rs | 1 + common/src/comp/mod.rs | 5 +- common/src/states/utils.rs | 5 +- server/src/cmd.rs | 2 +- server/src/events/entity_manipulation.rs | 23 +- server/src/events/interaction.rs | 2 +- server/src/events/inventory_manip.rs | 16 +- server/src/state_ext.rs | 17 +- voxygen/anim/src/item_drop/idle.rs | 29 + voxygen/anim/src/item_drop/mod.rs | 95 + voxygen/anim/src/lib.rs | 1 + voxygen/egui/src/lib.rs | 1 + voxygen/src/hud/crafting.rs | 11 +- voxygen/src/hud/diary.rs | 25 +- voxygen/src/hud/hotbar.rs | 6 +- voxygen/src/hud/item_imgs.rs | 48 +- voxygen/src/hud/slots.rs | 4 +- voxygen/src/scene/figure/cache.rs | 16 +- voxygen/src/scene/figure/load.rs | 83 +- voxygen/src/scene/figure/mod.rs | 159 +- voxygen/src/scene/simple.rs | 2 + voxygen/src/ui/widgets/item_tooltip.rs | 3 +- 30 files changed, 3585 insertions(+), 126 deletions(-) create mode 100644 assets/voxygen/voxel/item_drop_manifest.ron create mode 100644 common/src/comp/body/item_drop.rs create mode 100644 common/src/comp/inventory/item/item_key.rs create mode 100644 voxygen/anim/src/item_drop/idle.rs create mode 100644 voxygen/anim/src/item_drop/mod.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 08f452f7ee..3bab33fbb9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -82,6 +82,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Friendly creatures will now defend each other - Creatures will now defend their pets - [WorldGen] Change path colors +- Render item drops instead of placeholder textures ### Removed diff --git a/assets/common/npc_names.ron b/assets/common/npc_names.ron index b6dab6e74e..c8a4323465 100644 --- a/assets/common/npc_names.ron +++ b/assets/common/npc_names.ron @@ -1013,6 +1013,13 @@ ), species: () ), + item_drop: ( + body: ( + keyword: "item_drop", + names_0: [] + ), + species: () + ), ship: ( body: ( keyword: "ship", diff --git a/assets/voxygen/voxel/item_drop_manifest.ron b/assets/voxygen/voxel/item_drop_manifest.ron new file mode 100644 index 0000000000..4700e4c5e8 --- /dev/null +++ b/assets/voxygen/voxel/item_drop_manifest.ron @@ -0,0 +1,2932 @@ +// (specifier, offset, (x_rot, y_rot, z_rot), zoom) +// TODO: correct item offsets so the displayed text lines up better with the items +({ + // Bows + Tool("common.items.weapons.bow.bone-0"): ( + "voxel.weapon.bow.bone-0", + (-2.5, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.bone-1"): ( + "voxel.weapon.bow.bone-1", + (-2.5, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.bone-2"): ( + "voxel.weapon.bow.bone-2", + (-2.5, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.bone-3"): ( + "voxel.weapon.bow.bone-3", + (-2.5, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.eldwood-0"): ( + "voxel.weapon.bow.eldwood-0", + (-3.0, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.eldwood-1"): ( + "voxel.weapon.bow.eldwood-1", + (-3.0, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.eldwood-2"): ( + "voxel.weapon.bow.eldwood-2", + (-3.0, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.frostwood-0"): ( + "voxel.weapon.bow.frostwood-0", + (-2.5, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.frostwood-1"): ( + "voxel.weapon.bow.frostwood-1", + (-2.5, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.frostwood-2"): ( + "voxel.weapon.bow.frostwood-2", + (-2.5, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.hardwood-0"): ( + "voxel.weapon.bow.hardwood-0", + (-2.5, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.hardwood-1"): ( + "voxel.weapon.bow.hardwood-1", + (-2.5, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.hardwood-2"): ( + "voxel.weapon.bow.hardwood-2", + (-2.5, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.hardwood-3"): ( + "voxel.weapon.bow.hardwood-3", + (-2.5, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.hardwood-4"): ( + "voxel.weapon.bow.hardwood-4", + (-2.5, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.hardwood-5"): ( + "voxel.weapon.bow.hardwood-5", + (-2.5, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.metal-0"): ( + "voxel.weapon.bow.metal-0", + (-2.5, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.metal-1"): ( + "voxel.weapon.bow.metal-1", + (-2.5, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.metal-2"): ( + "voxel.weapon.bow.metal-2", + (-2.5, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.metal-3"): ( + "voxel.weapon.bow.metal-3", + (-2.5, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.metal-4"): ( + "voxel.weapon.bow.metal-4", + (-2.5, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.rawwood-0"): ( + "voxel.weapon.bow.rawwood-0", + (-2.5, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.rawwood-1"): ( + "voxel.weapon.bow.rawwood-1", + (-2.5, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.sagitta"): ( + "voxel.weapon.bow.sagitta", + (-3.0, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.starter"): ( + "voxel.weapon.bow.starter", + (-2.5, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.velorite"): ( + "voxel.weapon.bow.velorite", + (-3.0, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.debug.velorite_bow_debug"): ( + "voxel.weapon.bow.velorite", + (-3.0, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.wood-0"): ( + "voxel.weapon.bow.wood-0", + (-3.0, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.wood-1"): ( + "voxel.weapon.bow.wood-1", + (-3.0, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.wood-2"): ( + "voxel.weapon.bow.wood-2", + (-3.0, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.wood-3"): ( + "voxel.weapon.bow.wood-3", + (-3.0, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.bow.wood-4"): ( + "voxel.weapon.bow.wood-4", + (-3.0, -3.0, -5.0), (90.0, 90.0, 0.0), 1.0, + ), + // Daggers + Tool("common.items.weapons.dagger.starter_dagger"): ( + "voxel.weapon.dagger.dagger_rusty", + (-2.5, -5.0, -5.0), (-120.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.dagger.basic_0"): ( + "voxel.weapon.dagger.dagger_basic-0", + (-3.0, -5.0, -5.0), (-120.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.dagger.cultist_0"): ( + "voxel.weapon.dagger.dagger_cult-0", + (-3.0, -5.0, -5.0), (-120.0, 90.0, 0.0), 1.1, + ), + // Swords + Tool("common.items.weapons.sword.bloodsteel-0"): ( + "voxel.weapon.sword.bloodsteel-0", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.bloodsteel-1"): ( + "voxel.weapon.sword.bloodsteel-1", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.bloodsteel-2"): ( + "voxel.weapon.sword.bloodsteel-2", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.bronze-0"): ( + "voxel.weapon.sword.bronze-0", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.bronze-1"): ( + "voxel.weapon.sword.bronze-1", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.bronze-2"): ( + "voxel.weapon.sword.bronze-2", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.caladbolg"): ( + "voxel.weapon.sword.caladbolg", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.cobalt-0"): ( + "voxel.weapon.sword.cobalt-0", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.cobalt-1"): ( + "voxel.weapon.sword.cobalt-1", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.cobalt-2"): ( + "voxel.weapon.sword.cobalt-2", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.cobalt-3"): ( + "voxel.weapon.sword.cobalt-3", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.cultist"): ( + "voxel.weapon.sword.cultist", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.frost-0"): ( + "voxel.weapon.sword.frost-0", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.frost-1"): ( + "voxel.weapon.sword.frost-1", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.iron-0"): ( + "voxel.weapon.sword.iron-0", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.iron-1"): ( + "voxel.weapon.sword.iron-1", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.iron-10"): ( + "voxel.weapon.sword.iron-10", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.iron-2"): ( + "voxel.weapon.sword.iron-2", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.iron-3"): ( + "voxel.weapon.sword.iron-3", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.iron-4"): ( + "voxel.weapon.sword.iron-4", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.iron-5"): ( + "voxel.weapon.sword.iron-5", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.iron-6"): ( + "voxel.weapon.sword.iron-6", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.iron-7"): ( + "voxel.weapon.sword.iron-7", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.iron-8"): ( + "voxel.weapon.sword.iron-8", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.iron-9"): ( + "voxel.weapon.sword.iron-9", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.starter"): ( + "voxel.weapon.sword.starter", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.steel-0"): ( + "voxel.weapon.sword.steel-0", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.steel-1"): ( + "voxel.weapon.sword.steel-1", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.steel-2"): ( + "voxel.weapon.sword.steel-2", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.steel-3"): ( + "voxel.weapon.sword.steel-3", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.steel-4"): ( + "voxel.weapon.sword.steel-4", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.steel-5"): ( + "voxel.weapon.sword.steel-5", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.steel-6"): ( + "voxel.weapon.sword.steel-6", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.steel-7"): ( + "voxel.weapon.sword.steel-7", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.steel-8"): ( + "voxel.weapon.sword.steel-8", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.stone-0"): ( + "voxel.weapon.sword.stone-0", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.stone-1"): ( + "voxel.weapon.sword.stone-1", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.stone-2"): ( + "voxel.weapon.sword.stone-2", + (-3.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.wood-0"): ( + "voxel.weapon.sword.wood-0", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.wood-1"): ( + "voxel.weapon.sword.wood-1", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sword.wood-2"): ( + "voxel.weapon.sword.wood-2", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.debug.admin_sword"): ( + "voxel.weapon.sword.frost-1", + (-3.0, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.5, + ), + // 1h Swords + Tool("common.items.weapons.sword_1h.bloodsteel-0"): ( + "voxel.weapon.sword_1h.bloodsteel-0", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sword_1h.bloodsteel-1"): ( + "voxel.weapon.sword_1h.bloodsteel-1", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sword_1h.bloodsteel-2"): ( + "voxel.weapon.sword_1h.bloodsteel-2", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sword_1h.bronze-0"): ( + "voxel.weapon.sword_1h.bronze-0", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sword_1h.bronze-1"): ( + "voxel.weapon.sword_1h.bronze-1", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sword_1h.bronze-2"): ( + "voxel.weapon.sword_1h.bronze-2", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sword_1h.cobalt-0"): ( + "voxel.weapon.sword_1h.cobalt-0", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sword_1h.cobalt-1"): ( + "voxel.weapon.sword_1h.cobalt-1", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sword_1h.cobalt-2"): ( + "voxel.weapon.sword_1h.cobalt-2", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sword_1h.cobalt-3"): ( + "voxel.weapon.sword_1h.cobalt-3", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sword_1h.starter"): ( + "voxel.weapon.sword_1h.starter", + (-2.5, 1.0, 0.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sword_1h.iron-0"): ( + "voxel.weapon.sword_1h.iron-0", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sword_1h.iron-1"): ( + "voxel.weapon.sword_1h.iron-1", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sword_1h.iron-2"): ( + "voxel.weapon.sword_1h.iron-2", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sword_1h.iron-3"): ( + "voxel.weapon.sword_1h.iron-3", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sword_1h.iron-4"): ( + "voxel.weapon.sword_1h.iron-4", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sword_1h.obsidian-0"): ( + "voxel.weapon.sword_1h.obsidian-0", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sword_1h.orichalcum-0"): ( + "voxel.weapon.sword_1h.orichalcum-0", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sword_1h.orichalcum-1"): ( + "voxel.weapon.sword_1h.orichalcum-1", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sword_1h.steel-0"): ( + "voxel.weapon.sword_1h.steel-0", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sword_1h.steel-1"): ( + "voxel.weapon.sword_1h.steel-1", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sword_1h.steel-2"): ( + "voxel.weapon.sword_1h.steel-2", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sword_1h.steel-3"): ( + "voxel.weapon.sword_1h.steel-3", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + // Axes + Tool("common.items.weapons.axe.starter_axe"): ( + "voxel.weapon.axe.2haxe_rusty", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.axe.orc_axe-0"): ( + "voxel.weapon.axe.2haxe_orc-0", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.13, + ), + Tool("common.items.weapons.axe.bronze_axe-0"): ( + "voxel.weapon.axe.2haxe_bronze-0", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.axe.bronze_axe-1"): ( + "voxel.weapon.axe.2haxe_bronze-1", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.axe.bronze_axe-2"): ( + "voxel.weapon.axe.2haxe_bronze-2", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1., + ), + Tool("common.items.weapons.axe.iron_axe-0"): ( + "voxel.weapon.axe.2haxe_iron-0", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.05, + ), + Tool("common.items.weapons.axe.iron_axe-1"): ( + "voxel.weapon.axe.2haxe_iron-1", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.axe.iron_axe-2"): ( + "voxel.weapon.axe.2haxe_iron-2", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.axe.iron_axe-3"): ( + "voxel.weapon.axe.2haxe_iron-3", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.axe.iron_axe-4"): ( + "voxel.weapon.axe.2haxe_iron-4", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.05, + ), + Tool("common.items.weapons.axe.iron_axe-5"): ( + "voxel.weapon.axe.2haxe_iron-5", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.axe.iron_axe-6"): ( + "voxel.weapon.axe.2haxe_iron-6", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.axe.iron_axe-7"): ( + "voxel.weapon.axe.2haxe_iron-7", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.axe.iron_axe-8"): ( + "voxel.weapon.axe.2haxe_iron-8", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.13, + ), + Tool("common.items.weapons.axe.iron_axe-9"): ( + "voxel.weapon.axe.2haxe_iron-9", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.axe.steel_axe-0"): ( + "voxel.weapon.axe.2haxe_steel-0", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.axe.steel_axe-1"): ( + "voxel.weapon.axe.2haxe_steel-1", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.axe.steel_axe-2"): ( + "voxel.weapon.axe.2haxe_steel-2", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.axe.steel_axe-3"): ( + "voxel.weapon.axe.2haxe_steel-3", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.axe.steel_axe-4"): ( + "voxel.weapon.axe.2haxe_steel-4", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.axe.steel_axe-5"): ( + "voxel.weapon.axe.2haxe_steel-5", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.axe.steel_axe-6"): ( + "voxel.weapon.axe.2haxe_steel-6", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.axe.bloodsteel_axe-0"): ( + "voxel.weapon.axe.2haxe_bloodsteel-0", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.15, + ), + Tool("common.items.weapons.axe.bloodsteel_axe-1"): ( + "voxel.weapon.axe.2haxe_bloodsteel-1", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.axe.bloodsteel_axe-2"): ( + "voxel.weapon.axe.2haxe_bloodsteel-2", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.axe.cobalt_axe-0"): ( + "voxel.weapon.axe.2haxe_cobalt-0", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.axe.cobalt_axe-1"): ( + "voxel.weapon.axe.2haxe_cobalt-1", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.axe.malachite_axe-0"): ( + "voxel.weapon.axe.2haxe_malachite-0", + (-2.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.axe.parashu"): ( + "voxel.weapon.axe.parashu", + (-5.0, -3.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + // 1h Axes + Tool("common.items.weapons.axe_1h.bloodsteel-0"): ( + "voxel.weapon.axe_1h.bloodsteel-0", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 0.9, + ), + Tool("common.items.weapons.axe_1h.bloodsteel-1"): ( + "voxel.weapon.axe_1h.bloodsteel-1", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 0.9, + ), + Tool("common.items.weapons.axe_1h.bronze-0"): ( + "voxel.weapon.axe_1h.bronze-0", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 0.9, + ), + Tool("common.items.weapons.axe_1h.bronze-1"): ( + "voxel.weapon.axe_1h.bronze-1", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 0.9, + ), + Tool("common.items.weapons.axe_1h.cobalt-0"): ( + "voxel.weapon.axe_1h.cobalt-0", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 0.9, + ), + Tool("common.items.weapons.axe_1h.cobalt-1"): ( + "voxel.weapon.axe_1h.cobalt-1", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 0.9, + ), + Tool("common.items.weapons.axe_1h.iron-0"): ( + "voxel.weapon.axe_1h.iron-0", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 0.9, + ), + Tool("common.items.weapons.axe_1h.iron-1"): ( + "voxel.weapon.axe_1h.iron-1", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 0.9, + ), + Tool("common.items.weapons.axe_1h.iron-2"): ( + "voxel.weapon.axe_1h.iron-2", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 0.9, + ), + Tool("common.items.weapons.axe_1h.iron-3"): ( + "voxel.weapon.axe_1h.iron-3", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 0.9, + ), + Tool("common.items.weapons.axe_1h.orichalcum-0"): ( + "voxel.weapon.axe_1h.orichalcum-0", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 0.9, + ), + Tool("common.items.weapons.axe_1h.steel-0"): ( + "voxel.weapon.axe_1h.steel-0", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 0.9, + ), + Tool("common.items.weapons.axe_1h.steel-1"): ( + "voxel.weapon.axe_1h.steel-1", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 0.9, + ), + Tool("common.items.weapons.axe_1h.steel-2"): ( + "voxel.weapon.axe_1h.steel-2", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 0.9, + ), + Tool("common.items.weapons.axe_1h.stone-0"): ( + "voxel.weapon.axe_1h.stone-0", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 0.9, + ), + Tool("common.items.weapons.axe_1h.stone-1"): ( + "voxel.weapon.axe_1h.stone-1", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 0.9, + ), + Tool("common.items.weapons.axe_1h.wood-0"): ( + "voxel.weapon.axe_1h.wood-0", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 0.9, + ), + Tool("common.items.weapons.axe_1h.wood-1"): ( + "voxel.weapon.axe_1h.wood-1", + (-2.5, -3.0, -5.0), (-135.0, 90.0, 0.0), 0.9, + ), + // Hammers + Tool("common.items.weapons.hammer.hammer_1"): ( + "voxel.weapon.hammer.2hhammer_rusty", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.starter_hammer"): ( + "voxel.weapon.hammer.2hhammer_rusty", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.wood_hammer-0"): ( + "voxel.weapon.hammer.2hhammer_wood-0", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.flimsy_hammer"): ( + "voxel.weapon.hammer.2hhammer_flimsy", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.stone_hammer-0"): ( + "voxel.weapon.hammer.2hhammer_stone-0", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.stone_hammer-1"): ( + "voxel.weapon.hammer.2hhammer_stone-1", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.stone_hammer-2"): ( + "voxel.weapon.hammer.2hhammer_stone-2", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.stone_hammer-3"): ( + "voxel.weapon.hammer.2hhammer_stone-3", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.bronze_hammer-0"): ( + "voxel.weapon.hammer.2hhammer_bronze-0", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.bronze_hammer-1"): ( + "voxel.weapon.hammer.2hhammer_bronze-1", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.iron_hammer-0"): ( + "voxel.weapon.hammer.2hhammer_iron-0", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.iron_hammer-1"): ( + "voxel.weapon.hammer.2hhammer_iron-1", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.iron_hammer-2"): ( + "voxel.weapon.hammer.2hhammer_iron-2", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.iron_hammer-3"): ( + "voxel.weapon.hammer.2hhammer_iron-3", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.iron_hammer-4"): ( + "voxel.weapon.hammer.2hhammer_iron-4", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.iron_hammer-5"): ( + "voxel.weapon.hammer.2hhammer_iron-5", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.iron_hammer-6"): ( + "voxel.weapon.hammer.2hhammer_iron-6", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.iron_hammer-7"): ( + "voxel.weapon.hammer.2hhammer_iron-7", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.iron_hammer-8"): ( + "voxel.weapon.hammer.2hhammer_iron-8", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.steel_hammer-0"): ( + "voxel.weapon.hammer.2hhammer_steel-0", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.steel_hammer-1"): ( + "voxel.weapon.hammer.2hhammer_steel-1", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.steel_hammer-2"): ( + "voxel.weapon.hammer.2hhammer_steel-2", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.steel_hammer-3"): ( + "voxel.weapon.hammer.2hhammer_steel-3", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.steel_hammer-4"): ( + "voxel.weapon.hammer.2hhammer_steel-4", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.steel_hammer-5"): ( + "voxel.weapon.hammer.2hhammer_steel-5", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.cobalt_hammer-0"): ( + "voxel.weapon.hammer.2hhammer_cobalt-0", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.cobalt_hammer-1"): ( + "voxel.weapon.hammer.2hhammer_cobalt-1", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.runic_hammer"): ( + "voxel.weapon.hammer.2hhammer_runic", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.ramshead_hammer"): ( + "voxel.weapon.hammer.2hhammer_ramshead", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.mjolnir"): ( + "voxel.weapon.hammer.2hhammer_mjolnir", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.cultist_purp_2h-0"): ( + "voxel.weapon.hammer.cult_purp-0", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.hammer.burnt_drumstick"): ( + "voxel.weapon.hammer.burnt_drumstick", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + // 1h Hammers + Tool("common.items.weapons.hammer_1h.bloodsteel-0"): ( + "voxel.weapon.hammer_1h.bloodsteel-0", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.hammer_1h.bloodsteel-1"): ( + "voxel.weapon.hammer_1h.bloodsteel-1", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.hammer_1h.bronze-0"): ( + "voxel.weapon.hammer_1h.bronze-0", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.hammer_1h.bronze-1"): ( + "voxel.weapon.hammer_1h.bronze-1", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.hammer_1h.cobalt-0"): ( + "voxel.weapon.hammer_1h.cobalt-0", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.hammer_1h.cobalt-1"): ( + "voxel.weapon.hammer_1h.cobalt-1", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.hammer_1h.iron-0"): ( + "voxel.weapon.hammer_1h.iron-0", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.hammer_1h.iron-1"): ( + "voxel.weapon.hammer_1h.iron-1", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.hammer_1h.iron-2"): ( + "voxel.weapon.hammer_1h.iron-2", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.hammer_1h.orichalcum-0"): ( + "voxel.weapon.hammer_1h.orichalcum-0", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.hammer_1h.steel-0"): ( + "voxel.weapon.hammer_1h.steel-0", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.hammer_1h.steel-1"): ( + "voxel.weapon.hammer_1h.steel-1", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.hammer_1h.steel-2"): ( + "voxel.weapon.hammer_1h.steel-2", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.hammer_1h.stone-0"): ( + "voxel.weapon.hammer_1h.stone-0", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.hammer_1h.stone-1"): ( + "voxel.weapon.hammer_1h.stone-1", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.hammer_1h.wood-0"): ( + "voxel.weapon.hammer_1h.wood-0", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.hammer_1h.wood-1"): ( + "voxel.weapon.hammer_1h.wood-1", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + // Staffs + Tool("common.items.weapons.staff.staff_1"): ( + "voxel.weapon.staff.firestaff_starter", + (-4.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.staff.starter_staff"): ( + "voxel.weapon.staff.firestaff_starter", + (-2.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.staff.bone_staff"): ( + "voxel.weapon.staff.bone_staff", + (-2.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.staff.crimson_eye"): ( + "voxel.weapon.staff.crimson_eye", + (-4.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.staff.cultist_staff"): ( + "voxel.weapon.staff.firestaff_cultist", + (-4.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.staff.phoenix"): ( + "voxel.weapon.staff.phoenix", + (-2.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.staff.aurora"): ( + "voxel.weapon.staff.aurora", + (-4.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.staff.infused_tower"): ( + "voxel.weapon.staff.infused_tower", + (-2.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.staff.flamethrower_0"): ( + "voxel.weapon.staff.unstable_thrower", + (-2.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.staff.ley_seeker"): ( + "voxel.weapon.staff.ley_seeker", + (-2.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.staff.lava_rod"): ( + "voxel.weapon.staff.lava_rod", + (-2.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.staff.fiery_wishing_rod"): ( + "voxel.weapon.staff.fiery_wishing_rod", + (-2.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.staff.orc_iron"): ( + "voxel.weapon.staff.orcish_branding_iron", + (-2.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.staff.bent_fuse"): ( + "voxel.weapon.staff.bent_fuse", + (-2.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.staff.heated_arm"): ( + "voxel.weapon.staff.heated_arm", + (-2.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.staff.frostwood_torch"): ( + "voxel.weapon.staff.frostwood_torch", + (-2.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.staff.golden_khakkara"): ( + "voxel.weapon.staff.golden_khakkara", + (-2.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.staff.laevateinn"): ( + "voxel.weapon.staff.laevateinn", + (-2.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.staff.ruby_rod"): ( + "voxel.weapon.staff.ruby_rod", + (-2.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.staff.dragon_tongue"): ( + "voxel.weapon.staff.dragon_tongue", + (-2.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.staff.solar"): ( + "voxel.weapon.staff.solar", + (-2.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.1, + ), + // Healing Sceptres + Tool("common.items.weapons.sceptre.starter_sceptre"): ( + "voxel.weapon.sceptre.wood-simple", + (-3.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.25, + ), + Tool("common.items.weapons.sceptre.moon0"): ( + "voxel.weapon.sceptre.moon", + (-3.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sceptre.staff_nature"): ( + "voxel.weapon.sceptre.wood-nature", + (-3.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sceptre.totem_green"): ( + "voxel.weapon.sceptre.totem_green", + (-3.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sceptre.root_green0"): ( + "voxel.weapon.sceptre.root_green", + (-3.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sceptre.fork0"): ( + "voxel.weapon.sceptre.fork", + (-3.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sceptre.loops0"): ( + "voxel.weapon.sceptre.loops", + (-3.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sceptre.root_evil"): ( + "voxel.weapon.sceptre.root_evil", + (-3.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sceptre.sceptre_velorite_0"): ( + "voxel.weapon.sceptre.ore-nature", + (-3.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.15, + ), + Tool("common.items.weapons.sceptre.caduceus"): ( + "voxel.weapon.sceptre.caduceus", + (-3.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.sceptre.coralline_cane"): ( + "voxel.weapon.sceptre.coralline_cane", + (-3.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.sceptre.divine_gohei"): ( + "voxel.weapon.sceptre.divine_gohei", + (-3.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.15, + ), + Tool("common.items.weapons.sceptre.emerald"): ( + "voxel.weapon.sceptre.emerald", + (-3.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.12, + ), + Tool("common.items.weapons.sceptre.druids_arbor"): ( + "voxel.weapon.sceptre.druids_arbor", + (-3.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.12, + ), + Tool("common.items.weapons.sceptre.amethyst"): ( + "voxel.weapon.sceptre.amethyst", + (-3.5, -3.0, -5.0), (-130., 90.0, 0.0), 1.12, + ), + // Shields + Tool("common.items.weapons.shield.shield_1"): ( + "voxel.weapon.shield.wood-0", + (-3.5, -3.0, -5.0), (-90.0, 90.0, 0.0), 2.4, + ), + // Lanterns + Lantern("Black0"): ( + "voxel.lantern.black-0", + (-2.5, -2.5, 0.0), (-75.0, 20.0, 5.0), 0.9, + ), + Lantern("Green0"): ( + "voxel.lantern.green-0", + (-2.5, -2.5, 0.0), (-75.0, 20.0, 5.0), 0.9, + ), + Lantern("Magic"): ( + "voxel.lantern.magic_lantern", + (-2.5, -2.5, 0.0), (-75.0, 20.0, 5.0), 0.9, + ), + Lantern("Blue0"): ( + "voxel.lantern.blue-0", + (-2.5, -2.5, 0.0), (-75.0, 20.0, 5.0), 0.9, + ), + Lantern("Red0"): ( + "voxel.lantern.red-0", + (-2.5, -2.5, 0.0), (-75.0, 20.0, 5.0), 0.9, + ), + Lantern("GeodePurp"): ( + "voxel.lantern.geode_purp", + (-2.5, -2.5, 0.0), (-75.0, 20.0, 5.0), 0.9, + ), + Lantern("PumpkinLantern"): ( + "voxel.lantern.pumpkin", + (-2.5, -2.5, 0.0), (-100.0, 205.0, 7.0), 0.9, + ), + Lantern("PolarisLantern"): ( + "voxel.lantern.polaris", + (-2.5, -2.5, 0.0), (-90.0, 120.0, 0.0), 0.9, + ), + // Farming Equipment + Tool("common.items.weapons.tool.broom"): ( + "voxel.weapon.tool.broom-0", + (-2.0, -4.5, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.tool.hoe"): ( + "voxel.weapon.tool.hoe_green", + (-2.0, -4.5, -5.0), (130.0, 35.0, 180.0), 1.0, + ), + Tool("common.items.weapons.tool.pitchfork"): ( + "voxel.weapon.tool.pitchfork-0", + (-2.0, -4.5, -5.0), (-135.0, 90.0, 0.0), 1.1, + ), + Tool("common.items.weapons.tool.rake"): ( + "voxel.weapon.tool.rake-0", + (-2.0, -4.5, -5.0), (-135.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.tool.fishing_rod"): ( + "voxel.weapon.tool.fishing_rod_blue-0", + (-2.0, -4.5, -5.0), (90.0, 90.0, 0.0), 1.5, + ), + Tool("common.items.weapons.tool.pickaxe"): ( + "voxel.weapon.tool.pickaxe_green-0", + (-2.0, -4.5, -5.0), (-135.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.weapons.tool.shovel-0"): ( + "voxel.weapon.tool.shovel_green", + (-2.0, -4.5, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + Tool("common.items.weapons.tool.shovel-1"): ( + "voxel.weapon.tool.shovel_gold", + (-2.0, -4.5, -5.0), (-135.0, 90.0, 0.0), 1.2, + ), + // Picks + Tool("common.items.tool.pickaxe_stone"): ( + "voxel.weapon.tool.pickaxe_green-0", + (-3.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.0, + ), + Tool("common.items.tool.pickaxe_steel"): ( + "voxel.weapon.tool.pickaxe_green-1", + (-3.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 1.0, + ), + // Other + Utility(Coins): ( + "voxel.object.v-coin", + (-10.0, -10.0, 0.0), (-10.0, 15.0, 0.0), 0.8, + ), + Utility(Collar): ( + "voxel.object.collar", + (-5.0, -5.0, 0.0), (-60.0, 20.0, 10.0), 0.9, + ), + // Armor + // Starter Parts + Armor(Foot("Sandal")): ( + "voxel.armor.misc.foot.cloth_sandal", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Pants("Rugged")): ( + "voxel.armor.rugged.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Chest("Rugged")): ( + "voxel.armor.rugged.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Chest("WorkerPurpBrown")): ( + "voxel.armor.misc.chest.worker_purp_brown", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("WorkerBrown")): ( + "voxel.armor.misc.pants.worker_brown", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + // Cultist Clothing + Armor(Chest("Cultist")): ( + "voxel.armor.cultist.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Cultist")): ( + "voxel.armor.cultist.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("Cultist")): ( + "voxel.armor.cultist.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("Cultist")): ( + "voxel.armor.cultist.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Cultist")): ( + "voxel.armor.cultist.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("Cultist")): ( + "voxel.armor.cultist.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Chest("Cultist")): ( + "voxel.armor.cultist.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Cultist")): ( + "voxel.armor.cultist.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Cultist")): ( + "voxel.armor.cultist.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("Cultist")): ( + "voxel.armor.cultist.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Head("Cultist")): ( + "voxel.armor.cultist.bandana", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.9, + ), + // Villager Clothing + Armor(Pants("WorkerBlue")): ( + "voxel.armor.misc.pants.worker_blue", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Chest("WorkerGreen0")): ( + "voxel.armor.misc.chest.worker_green", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Chest("WorkerGreen1")): ( + "voxel.armor.misc.chest.shirt_white", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Chest("WorkerRed0")): ( + "voxel.armor.misc.chest.worker_green", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Chest("WorkerRed1")): ( + "voxel.armor.misc.chest.shirt_white", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Chest("WorkerPurple0")): ( + "voxel.armor.misc.chest.worker_green", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Chest("WorkerPurple1")): ( + "voxel.armor.misc.chest.shirt_white", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Chest("WorkerYellow0")): ( + "voxel.armor.misc.chest.worker_green", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Chest("WorkerYellow1")): ( + "voxel.armor.misc.chest.shirt_white", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Chest("WorkerOrange0")): ( + "voxel.armor.misc.chest.worker_green", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Chest("WorkerOrange1")): ( + "voxel.armor.misc.chest.shirt_white", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + // Merchant + Armor(Chest("Merchant")): ( + "voxel.armor.merchant.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Merchant")): ( + "voxel.armor.merchant.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("Merchant")): ( + "voxel.armor.merchant.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("Merchant")): ( + "voxel.armor.merchant.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Merchant")): ( + "voxel.armor.merchant.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("Merchant")): ( + "voxel.armor.merchant.shoulder_l", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Chest("Merchant")): ( + "voxel.armor.merchant.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Merchant")): ( + "voxel.armor.merchant.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Merchant")): ( + "voxel.armor.merchant.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Head("Merchant")): ( + "voxel.armor.merchant.turban", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Back("Merchant")): ( + "voxel.armor.merchant.back", + (-3.0, 0.0, -5.0), (-90.0, 45.0,0.0), 0.9, + ), + // Velorite Battlemage Set + Armor(Chest("VeloriteMage")): ( + "voxel.armor.velorite_battlemage.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("VeloriteMage")): ( + "voxel.armor.velorite_battlemage.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("VeloriteMage")): ( + "voxel.armor.velorite_battlemage.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("VeloriteMage")): ( + "voxel.armor.velorite_battlemage.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("VeloriteMage")): ( + "voxel.armor.velorite_battlemage.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("VeloriteMage")): ( + "voxel.armor.velorite_battlemage.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Back("VeloriteMage")): ( + "voxel.armor.velorite_battlemage.back", + (-3.0, 0.0, -5.0), (-120.0, 210.0,15.0), 1.1, + ), + // Assassin Set + Armor(Chest("Assassin")): ( + "voxel.armor.assassin.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Assassin")): ( + "voxel.armor.assassin.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("Assassin")): ( + "voxel.armor.assassin.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("Assassin")): ( + "voxel.armor.assassin.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Assassin")): ( + "voxel.armor.assassin.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("Assassin")): ( + "voxel.armor.assassin.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + //PlateLeather Armor + Armor(Chest("LeatherPlate")): ( + "voxel.armor.leather_plate.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("LeatherPlate")): ( + "voxel.armor.leather_plate.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("LeatherPlate")): ( + "voxel.armor.leather_plate.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("LeatherPlate")): ( + "voxel.armor.leather_plate.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("LeatherPlate")): ( + "voxel.armor.leather_plate.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("LeatherPlate")): ( + "voxel.armor.leather_plate.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + //Ferocious Armor + Armor(Chest("Ferocious")): ( + "voxel.armor.ferocious.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Ferocious")): ( + "voxel.armor.ferocious.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("Ferocious")): ( + "voxel.armor.ferocious.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("Ferocious")): ( + "voxel.armor.ferocious.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Ferocious")): ( + "voxel.armor.ferocious.hand", + (-2.5, -2.5, 0.0), (-90.0, 135.0, 0.0), 1.0, + ), + Armor(Shoulder("Ferocious")): ( + "voxel.armor.ferocious.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Back("Ferocious")): ( + "voxel.armor.ferocious.back", + (-3.0, 0.0, -5.0), (-120.0, 210.0,15.0), 0.9, + ), + //Blue Leather Armor + Armor(Chest("BlueLeather")): ( + "voxel.armor.leather_blue.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("BlueLeather")): ( + "voxel.armor.leather_blue.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + //Linen Cloth + Armor(Chest("ClothBlue")): ( + "voxel.armor.cloth_blue.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("ClothBlue")): ( + "voxel.armor.cloth_blue.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("ClothBlue")): ( + "voxel.armor.cloth_blue.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("ClothBlue")): ( + "voxel.armor.cloth_blue.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("ClothBlue")): ( + "voxel.armor.cloth_blue.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("ClothBlue0")): ( + "voxel.armor.cloth_blue.shoulder_0", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Shoulder("ClothBlue1")): ( + "voxel.armor.cloth_blue.shoulder_1", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + ////////////// + Armor(Chest("ClothGreen")): ( + "voxel.armor.cloth_green.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("ClothGreen")): ( + "voxel.armor.cloth_green.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("ClothGreen")): ( + "voxel.armor.cloth_green.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("ClothGreen")): ( + "voxel.armor.cloth_green.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("ClothGreen")): ( + "voxel.armor.cloth_green.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("ClothGreen")): ( + "voxel.armor.cloth_green.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + ////// + Armor(Chest("ClothPurple")): ( + "voxel.armor.cloth_purple.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("ClothPurple")): ( + "voxel.armor.cloth_purple.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("ClothPurple")): ( + "voxel.armor.cloth_purple.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("ClothPurple")): ( + "voxel.armor.cloth_purple.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("ClothPurple")): ( + "voxel.armor.cloth_purple.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("ClothPurple")): ( + "voxel.armor.cloth_purple.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Shoulder("IronSpikes")): ( + "voxel.armor.misc.shoulder.iron_spikes", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Shoulder("IronLeather3")): ( + "voxel.armor.misc.shoulder.leather_iron_3", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Shoulder("IronLeather2")): ( + "voxel.armor.misc.shoulder.leather_iron_2", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Shoulder("IronLeather1")): ( + "voxel.armor.misc.shoulder.leather_iron_1", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Shoulder("IronLeather0")): ( + "voxel.armor.misc.shoulder.leather_iron_0", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Shoulder("LeatherStrip")): ( + "voxel.armor.misc.shoulder.leather_strip", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Foot("Jackalope")): ( + "voxel.armor.misc.foot.jackalope", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + //Twig Set + Armor(Chest("Twigs")): ( + "voxel.armor.twigs.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Twigs")): ( + "voxel.armor.twigs.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("Twigs")): ( + "voxel.armor.twigs.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("Twigs")): ( + "voxel.armor.twigs.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Twigs")): ( + "voxel.armor.twigs.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("Twigs")): ( + "voxel.armor.twigs.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + //TwigsLeaves Set + Armor(Chest("TwigsLeaves")): ( + "voxel.armor.twigsleaves.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("TwigsLeaves")): ( + "voxel.armor.twigsleaves.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("TwigsLeaves")): ( + "voxel.armor.twigsleaves.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("TwigsLeaves")): ( + "voxel.armor.twigsleaves.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("TwigsLeaves")): ( + "voxel.armor.twigsleaves.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("TwigsLeaves")): ( + "voxel.armor.twigsleaves.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + //TwigsFlowers Set + Armor(Chest("TwigsFlowers")): ( + "voxel.armor.twigsflowers.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("TwigsFlowers")): ( + "voxel.armor.twigsflowers.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("TwigsFlowers")): ( + "voxel.armor.twigsflowers.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("TwigsFlowers")): ( + "voxel.armor.twigsflowers.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("TwigsFlowers")): ( + "voxel.armor.twigsflowers.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("TwigsFlowers")): ( + "voxel.armor.twigsflowers.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + //Tarasque Set + Armor(Chest("Tarasque")): ( + "voxel.armor.tarasque.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Tarasque")): ( + "voxel.armor.tarasque.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("Tarasque")): ( + "voxel.armor.tarasque.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("Tarasque")): ( + "voxel.armor.tarasque.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Tarasque")): ( + "voxel.armor.tarasque.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("Tarasque")): ( + "voxel.armor.tarasque.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + //Bonerattler Set + Armor(Chest("Bonerattler")): ( + "voxel.armor.bonerattler.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Bonerattler")): ( + "voxel.armor.bonerattler.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("Bonerattler")): ( + "voxel.armor.bonerattler.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("Bonerattler")): ( + "voxel.armor.bonerattler.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Bonerattler")): ( + "voxel.armor.bonerattler.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("Bonerattler")): ( + "voxel.armor.bonerattler.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + //Rawhide Set + Armor(Chest("Rawhide")): ( + "voxel.armor.hide.rawhide.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Rawhide")): ( + "voxel.armor.hide.rawhide.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("Rawhide")): ( + "voxel.armor.hide.rawhide.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("Rawhide")): ( + "voxel.armor.hide.rawhide.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Rawhide")): ( + "voxel.armor.hide.rawhide.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("Rawhide")): ( + "voxel.armor.hide.rawhide.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Back("Rawhide")): ( + "voxel.armor.hide.rawhide.back", + (-3.0, 0.0, -5.0), (-120.0, 210.0,15.0), 0.9, + ), + //Leather set + Armor(Chest("Leather")): ( + "voxel.armor.hide.leather.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Leather")): ( + "voxel.armor.hide.leather.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("Leather")): ( + "voxel.armor.hide.leather.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("Leather")): ( + "voxel.armor.hide.leather.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Leather")): ( + "voxel.armor.hide.leather.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("Leather")): ( + "voxel.armor.hide.leather.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Back("Leather")): ( + "voxel.armor.hide.leather.back", + (-3.0, 0.0, -5.0), (-120.0, 210.0,15.0), 0.9, + ), + //Scale Set + Armor(Chest("Scale")): ( + "voxel.armor.hide.scale.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Scale")): ( + "voxel.armor.hide.scale.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("Scale")): ( + "voxel.armor.hide.scale.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("Scale")): ( + "voxel.armor.hide.scale.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Scale")): ( + "voxel.armor.hide.scale.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("Scale")): ( + "voxel.armor.hide.scale.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Back("Scale")): ( + "voxel.armor.hide.scale.back", + (-3.0, 0.0, -5.0), (-120.0, 210.0,15.0), 0.9, + ), + //Carapace Set + Armor(Chest("Carapace")): ( + "voxel.armor.hide.carapace.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Carapace")): ( + "voxel.armor.hide.carapace.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("Carapace")): ( + "voxel.armor.hide.carapace.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("Carapace")): ( + "voxel.armor.hide.carapace.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Carapace")): ( + "voxel.armor.hide.carapace.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("Carapace")): ( + "voxel.armor.hide.carapace.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Back("Carapace")): ( + "voxel.armor.hide.carapace.back", + (-3.0, 0.0, -5.0), (-120.0, 210.0,15.0), 0.9, + ), + //Primal Set + Armor(Chest("Primal")): ( + "voxel.armor.hide.primal.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Primal")): ( + "voxel.armor.hide.primal.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("Primal")): ( + "voxel.armor.hide.primal.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("Primal")): ( + "voxel.armor.hide.primal.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Primal")): ( + "voxel.armor.hide.primal.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("Primal")): ( + "voxel.armor.hide.primal.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Back("Primal")): ( + "voxel.armor.hide.primal.back", + (-3.0, 0.0, -5.0), (-120.0, 210.0,15.0), 0.9, + ), + //Dragonscale Set + Armor(Chest("Dragonscale")): ( + "voxel.armor.hide.dragonscale.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Dragonscale")): ( + "voxel.armor.hide.dragonscale.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("Dragonscale")): ( + "voxel.armor.hide.dragonscale.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("Dragonscale")): ( + "voxel.armor.hide.dragonscale.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Dragonscale")): ( + "voxel.armor.hide.dragonscale.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("Dragonscale")): ( + "voxel.armor.hide.dragonscale.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Back("Dragonscale")): ( + "voxel.armor.hide.dragonscale.back", + (-3.0, 0.0, -5.0), (-120.0, 210.0,15.0), 0.9, + ), + //Savage Set + Armor(Chest("Savage")): ( + "voxel.armor.savage.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Savage")): ( + "voxel.armor.savage.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("Savage")): ( + "voxel.armor.savage.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("Savage")): ( + "voxel.armor.savage.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Savage")): ( + "voxel.armor.savage.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("Savage")): ( + "voxel.armor.savage.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Back("Savage")): ( + "voxel.armor.savage.back", + (-3.0, 0.0, -5.0), (-120.0, 210.0,15.0), 0.9, + ), + //Linen Set + Armor(Chest("Linen")): ( + "voxel.armor.cloth.linen.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Linen")): ( + "voxel.armor.cloth.linen.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("Linen")): ( + "voxel.armor.cloth.linen.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("Linen")): ( + "voxel.armor.cloth.linen.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Linen")): ( + "voxel.armor.cloth.linen.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("Linen")): ( + "voxel.armor.cloth.linen.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Back("Linen")): ( + "voxel.armor.cloth.linen.back", + (-3.0, 0.0, -5.0), (-120.0, 210.0,15.0), 0.9, + ), + //Woolen Set + Armor(Chest("Woolen")): ( + "voxel.armor.cloth.woolen.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Woolen")): ( + "voxel.armor.cloth.woolen.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("Woolen")): ( + "voxel.armor.cloth.woolen.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("Woolen")): ( + "voxel.armor.cloth.woolen.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Woolen")): ( + "voxel.armor.cloth.woolen.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("Woolen")): ( + "voxel.armor.cloth.woolen.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Back("Woolen")): ( + "voxel.armor.cloth.woolen.back", + (-3.0, 0.0, -5.0), (-120.0, 210.0,15.0), 0.9, + ), + //Silken Set + Armor(Chest("Silken")): ( + "voxel.armor.cloth.silken.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Silken")): ( + "voxel.armor.cloth.silken.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("Silken")): ( + "voxel.armor.cloth.silken.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("Silken")): ( + "voxel.armor.cloth.silken.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Silken")): ( + "voxel.armor.cloth.silken.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("Silken")): ( + "voxel.armor.cloth.silken.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Back("Silken")): ( + "voxel.armor.cloth.silken.back", + (-3.0, 0.0, -5.0), (-120.0, 210.0,15.0), 0.9, + ), + //Druid Set + Armor(Chest("Druid")): ( + "voxel.armor.cloth.druid.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Druid")): ( + "voxel.armor.cloth.druid.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("Druid")): ( + "voxel.armor.cloth.druid.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("Druid")): ( + "voxel.armor.cloth.druid.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Druid")): ( + "voxel.armor.cloth.druid.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("Druid")): ( + "voxel.armor.cloth.druid.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Back("Druid")): ( + "voxel.armor.cloth.druid.back", + (-3.0, 0.0, -5.0), (-120.0, 210.0,15.0), 0.9, + ), + //Moonweave Set + Armor(Chest("Moonweave")): ( + "voxel.armor.cloth.moonweave.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Moonweave")): ( + "voxel.armor.cloth.moonweave.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("Moonweave")): ( + "voxel.armor.cloth.moonweave.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("Moonweave")): ( + "voxel.armor.cloth.moonweave.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Moonweave")): ( + "voxel.armor.cloth.moonweave.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("Moonweave")): ( + "voxel.armor.cloth.moonweave.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Back("Moonweave")): ( + "voxel.armor.cloth.moonweave.back", + (-3.0, 0.0, -5.0), (-120.0, 210.0,15.0), 0.9, + ), + //Sunsilk Set + Armor(Chest("Sunsilk")): ( + "voxel.armor.cloth.sunsilk.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Sunsilk")): ( + "voxel.armor.cloth.sunsilk.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("Sunsilk")): ( + "voxel.armor.cloth.sunsilk.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("Sunsilk")): ( + "voxel.armor.cloth.sunsilk.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Sunsilk")): ( + "voxel.armor.cloth.sunsilk.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("Sunsilk")): ( + "voxel.armor.cloth.sunsilk.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Back("Sunsilk")): ( + "voxel.armor.cloth.sunsilk.back", + (-3.0, 0.0, -5.0), (-120.0, 210.0,15.0), 0.9, + ), + //Bronze Set + Armor(Chest("Bronze")): ( + "voxel.armor.mail.bronze.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Bronze")): ( + "voxel.armor.mail.bronze.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("Bronze")): ( + "voxel.armor.mail.bronze.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("Bronze")): ( + "voxel.armor.mail.bronze.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Bronze")): ( + "voxel.armor.mail.bronze.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("Bronze")): ( + "voxel.armor.mail.bronze.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Back("Bronze")): ( + "voxel.armor.mail.bronze.back", + (-3.0, 0.0, -5.0), (-120.0, 210.0,15.0), 0.9, + ), + //Iron Set + Armor(Chest("Iron")): ( + "voxel.armor.mail.iron.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Iron")): ( + "voxel.armor.mail.iron.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("Iron")): ( + "voxel.armor.mail.iron.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("Iron")): ( + "voxel.armor.mail.iron.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Iron")): ( + "voxel.armor.mail.iron.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("Iron")): ( + "voxel.armor.mail.iron.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Back("Iron")): ( + "voxel.armor.mail.iron.back", + (-3.0, 0.0, -5.0), (-120.0, 210.0,15.0), 0.9, + ), + //Steel Set + Armor(Chest("Steel")): ( + "voxel.armor.mail.steel.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Steel")): ( + "voxel.armor.mail.steel.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("Steel")): ( + "voxel.armor.mail.steel.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("Steel")): ( + "voxel.armor.mail.steel.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Steel")): ( + "voxel.armor.mail.steel.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("Steel")): ( + "voxel.armor.mail.steel.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Back("Steel")): ( + "voxel.armor.mail.steel.back", + (-3.0, 0.0, -5.0), (-120.0, 210.0,15.0), 0.9, + ), + //Cobalt Set + Armor(Chest("Cobalt")): ( + "voxel.armor.mail.cobalt.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Cobalt")): ( + "voxel.armor.mail.cobalt.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("Cobalt")): ( + "voxel.armor.mail.cobalt.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("Cobalt")): ( + "voxel.armor.mail.cobalt.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Cobalt")): ( + "voxel.armor.mail.cobalt.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("Cobalt")): ( + "voxel.armor.mail.cobalt.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Back("Cobalt")): ( + "voxel.armor.mail.cobalt.back", + (-3.0, 0.0, -5.0), (-120.0, 210.0,15.0), 0.9, + ), + //Bloodsteel Set + Armor(Chest("Bloodsteel")): ( + "voxel.armor.mail.bloodsteel.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Bloodsteel")): ( + "voxel.armor.mail.bloodsteel.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("Bloodsteel")): ( + "voxel.armor.mail.bloodsteel.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("Bloodsteel")): ( + "voxel.armor.mail.bloodsteel.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Bloodsteel")): ( + "voxel.armor.mail.bloodsteel.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("Bloodsteel")): ( + "voxel.armor.mail.bloodsteel.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Back("Bloodsteel")): ( + "voxel.armor.mail.bloodsteel.back", + (-3.0, 0.0, -5.0), (-120.0, 210.0,15.0), 0.9, + ), + //Orichalcum Set + Armor(Chest("Orichalcum")): ( + "voxel.armor.mail.orichalcum.chest", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Armor(Pants("Orichalcum")): ( + "voxel.armor.mail.orichalcum.pants", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Belt("Orichalcum")): ( + "voxel.armor.mail.orichalcum.belt", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Foot("Orichalcum")): ( + "voxel.armor.mail.orichalcum.foot", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Hand("Orichalcum")): ( + "voxel.armor.mail.orichalcum.hand", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Shoulder("Orichalcum")): ( + "voxel.armor.mail.orichalcum.shoulder", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Back("Orichalcum")): ( + "voxel.armor.mail.orichalcum.back", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + //misc + Armor(Pants("Hunting")): ( + "voxel.armor.misc.pants.grayscale", + (-2.5, -2.5, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + // Backs + Armor(Back("Short0")): ( + "voxel.armor.misc.back.short-0", + (-3.0, 0.0, -5.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Back("Short1")): ( + "voxel.armor.misc.back.short-1", + (-3.0, 0.0, -5.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Back("Admin")): ( + "voxel.armor.misc.back.admin", + (-3.0, 0.0, -5.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Back("DungeonPurple")): ( + "voxel.armor.misc.back.dungeon_purple", + (-3.0, 0.0, -5.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Back("LeatherBlue")): ( + "voxel.armor.leather_blue.back", + (-3.0, 0.0, -5.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Back("Backpack")): ( + "voxel.armor.misc.back.backpack", + (-3.0, 0.0, -5.0), (-75.0, 45.0,0.0), 0.9, + ), + Armor(Back("BackpackBlue")): ( + "voxel.armor.misc.back.backpack", + (-3.0, 0.0, -5.0), (-120.0, 210.0,15.0), 0.9, + ), + //Hats + Armor(Head("Witch")): ( + "voxel.armor.witch.hat", + (-10.0, -10.0, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Head("HogHood")): ( + "voxel.armor.misc.head.hog_hood", + (-10.0, -10.0, 0.0), (-110.0, 210.0,15.0), 1.4, + ), + Armor(Head("BambooTwig")): ( + "voxel.armor.misc.head.bamboo_twig", + (-10.0, -10.0, 0.0), (-120.0, -240.0,1.0), 2.3, + ), + Armor(Head("Pirate")): ( + "voxel.armor.pirate.hat", + (-10.0, -10.0, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Armor(Head("Thief")): ( + "voxel.armor.misc.head.bandana.thief", + (-10.0, -10.0, 0.0), (-120.0, 210.0,15.0), 1.9, + ), + Armor(Head("WanderersHat")): ( + "voxel.armor.misc.head.wanderers_hat", + (-10.0, -10.0, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Head("Red")): ( + "voxel.armor.misc.head.bandana.red", + (-10.0, -10.0, 0.0), (-120.0, 210.0,15.0), 1.9, + ), + Armor(Head("Straw")): ( + "voxel.armor.misc.head.straw", + (-10.0, -10.0, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Armor(Head("Hood")): ( + "voxel.armor.misc.head.hood", + (-10.0, -10.0, 0.0), (-120.0, 210.0,15.0), 1.3, + ), + Armor(Head("DarkHood")): ( + "voxel.armor.misc.head.hood_dark", + (-10.0, -10.0, 0.0), (-120.0, 210.0,15.0), 1.3, + ), + Armor(Head("Crown")): ( + "voxel.armor.misc.head.crown", + (-10.0, -10.0, 0.0), (-120.0, 210.0,15.0), 1.3, + ), + Armor(Head("Mitre")): ( + "voxel.armor.misc.head.mitre", + (-10.0, -10.0, 0.0), (-120.0, 210.0,15.0), 1.3, + ), + Armor(Head("Spikeguard")): ( + "voxel.armor.misc.head.spikeguard", + (-10.0, -10.0, 0.0), (-120.0, 210.0,15.0), 1.3, + ), + Armor(Head("WingedCoronet")): ( + "voxel.armor.misc.head.winged_coronet", + (-10.0, -10.0, 0.0), (-120.0, 210.0,15.0), 1.3, + ), + Armor(Head("BorealWarhelm")): ( + "voxel.armor.misc.head.boreal_warhelm", + (-10.0, -10.0, 0.0), (-120.0, 210.0,15.0), 1.3, + ), + Armor(Head("WoollyWintercap")): ( + "voxel.armor.misc.head.woolly_wintercap", + (-10.0, -10.0, 0.0), (-120.0, 210.0,15.0), 1.3, + ), + Armor(Head("Helmet")): ( + "voxel.armor.misc.head.helmet", + (-10.0, -10.0, 0.0), (-120.0, 210.0,15.0), 1.3, + ), + // Rings + Armor(Ring("Scratched")): ( + "voxel.armor.misc.ring.scratched", + (-2.5, -2.5, 0.0), (45.0, 15.0, 0.0), 0.9, + ), + Armor(Ring("Gold")): ( + "voxel.armor.misc.ring.gold", + (-2.5, -2.5, 0.0), (45.0, 15.0, 0.0), 0.9, + ), + Armor(Ring("Topaz")): ( + "voxel.armor.misc.ring.topaz", + (-2.5, -2.5, 0.0), (45.0, 15.0, 0.0), 0.9, + ), + Armor(Ring("Amethyst")): ( + "voxel.armor.misc.ring.amethyst", + (-2.5, -2.5, 0.0), (45.0, 15.0, 0.0), 0.9, + ), + Armor(Ring("Sapphire")): ( + "voxel.armor.misc.ring.sapphire", + (-2.5, -2.5, 0.0), (45.0, 15.0, 0.0), 0.9, + ), + Armor(Ring("Emerald")): ( + "voxel.armor.misc.ring.emerald", + (-2.5, -2.5, 0.0), (45.0, 15.0, 0.0), 0.9, + ), + Armor(Ring("Ruby")): ( + "voxel.armor.misc.ring.ruby", + (-2.5, -2.5, 0.0), (45.0, 15.0, 0.0), 0.9, + ), + Armor(Ring("Diamond")): ( + "voxel.armor.misc.ring.diamond", + (-2.5, -2.5, 0.0), (45.0, 20.0, 0.0), 0.9, + ), + Armor(Ring("Cultist")): ( + "voxel.armor.cultist.ring", + (-2.5, -2.5, 0.0), (45.0, 15.0, 0.0), 0.9, + ), + // Necks + Armor(Neck("Ankh")): ( + "voxel.armor.misc.neck.ankh_of_life", + (0.0, 0.2, 0.0), (-70.0, 20.0, 10.0), 0.9, + ), + Armor(Neck("Carcanet")): ( + "voxel.armor.misc.neck.carcanet_of_wrath", + (0.0, 0.2, 0.0), (-70.0, 20.0, 10.0), 0.9, + ), + Armor(Neck("Fang")): ( + "voxel.armor.misc.neck.fang", + (0.0, 0.2, 0.0), (-70.0, 20.0, 10.0), 0.9, + ), + Armor(Neck("Honeycomb")): ( + "voxel.armor.misc.neck.honeycomb_pendant", + (0.0, 0.2, 0.0), (-70.0, 20.0, 10.0), 0.9, + ), + Armor(Neck("Haniwa")): ( + "voxel.armor.misc.neck.haniwa_talisman", + (0.0, 0.2, 0.0), (-70.0, 20.0, 10.0), 0.9, + ), + Armor(Neck("Pendant")): ( + "voxel.armor.misc.neck.pendant_of_protection", + (0.0, 0.2, 0.0), (-70.0, 20.0, 10.0), 0.9, + ), + Armor(Neck("ResilienceGem")): ( + "voxel.armor.misc.neck.resilience_gem", + (0.0, 0.2, 0.0), (-70.0, 20.0, 10.0), 0.9, + ), + Armor(Neck("Shell")): ( + "voxel.armor.misc.neck.shell", + (0.0, 0.2, 0.0), (-70.0, 20.0, 10.0), 0.9, + ), + Armor(Neck("Amethyst")): ( + "voxel.armor.misc.neck.amethyst", + (0.0, 0.2, 0.0), (-70.0, 20.0, 10.0), 0.9, + ), + Armor(Neck("Diamond")): ( + "voxel.armor.misc.neck.diamond", + (0.0, 0.2, 0.0), (-70.0, 20.0, 10.0), 0.9, + ), + Armor(Neck("Cultist")): ( + "voxel.armor.cultist.necklace", + (0.0, 0.2, 0.0), (-70.0, 20.0, 10.0), 0.9, + ), + Armor(Neck("Ruby")): ( + "voxel.armor.misc.neck.ruby", + (0.0, 0.2, 0.0), (-70.0, 20.0, 10.0), 0.9, + ), + Armor(Neck("Topaz")): ( + "voxel.armor.misc.neck.topaz", + (0.0, 0.2, 0.0), (-70.0, 20.0, 10.0), 0.9, + ), + Armor(Neck("Emerald")): ( + "voxel.armor.misc.neck.emerald", + (0.0, 0.2, 0.0), (-70.0, 20.0, 10.0), 0.9, + ), + Armor(Neck("Gold")): ( + "voxel.armor.misc.neck.gold", + (0.0, 0.2, 0.0), (-70.0, 20.0, 10.0), 0.9, + ), + Armor(Neck("Sapphire")): ( + "voxel.armor.misc.neck.sapphire", + (0.0, 0.2, 0.0), (-70.0, 20.0, 10.0), 0.9, + ), + Armor(Neck("Scratched")): ( + "voxel.armor.misc.neck.scratched", + (0.0, 0.2, 0.0), (-70.0, 20.0, 10.0), 0.9, + ), + + // Tabards + Armor(Tabard("Admin")): ( + "voxel.armor.tabard_admin", + (0.0, 0.2, 0.0), (-70.0, 20.0, 10.0), 0.9, + ), + // Heads + Armor(Head("Leather")): ( + "voxel.armor.misc.head.leather-0", + (-2.5, -2.5, 0.0), (-90.0, 180.0, 0.0), 1.0, + ), + Armor(Head("Assassin")): ( + "voxel.armor.misc.head.assa_mask-0", + (-2.5, -2.5, 0.0), (-90.0, 180.0, 0.0), 1.0, + ), + Armor(Head("Exclamation")): ( + "voxel.armor.misc.head.exclamation", + (0.0, 15.0, 0.0), (-75.0, 135.0, 0.0), 3.0, + ), + // Bags + Armor(Bag("RedFace")): ( + "voxel.armor.misc.bag.soulkeeper_cursed", + (-2.5, -2.5, 0.0), (-75.0, 20.0, 5.0), 0.9, + ), + Armor(Bag("BlackHole")): ( + "voxel.armor.misc.bag.admin_black_hole", + (-2.5, -2.5, 0.0), (-75.0, 20.0, 5.0), 0.9, + ), + Armor(Bag("BlueFace")): ( + "voxel.armor.misc.bag.soulkeeper_pure", + (-2.5, -2.5, 0.0), (-75.0, 20.0, 5.0), 0.9, + ), + Armor(Bag("PurpleSkull")): ( + "voxel.armor.misc.bag.mindflayer_spellbag", + (0.0, 0.1, 0.0), (-75.0, 20.0, 5.0), 0.8, + ), + Armor(Bag("GreenLarge")): ( + "voxel.armor.misc.bag.troll_hide_pack", + (-2.5, -2.5, 0.0), (-75.0, 20.0, 5.0), 0.9, + ), + Armor(Bag("LeatherLarge")): ( + "voxel.armor.misc.bag.reliable_backpack", + (-2.5, -2.5, 0.0), (-75.0, 20.0, 5.0), 0.9, + ), + Armor(Bag("GreenMid")): ( + "voxel.armor.misc.bag.liana_kit", + (0.5, 0.0, 0.0), (-75.0, 20.0, 5.0), 0.9, + ), + Armor(Bag("LeatherSmall")): ( + "voxel.armor.misc.bag.tiny_leather_pouch", + (-2.5, -2.5, 0.0), (-75.0, 20.0, 5.0), 0.8, + ), + Armor(Bag("RedLarge")): ( + "voxel.armor.misc.bag.sturdy_red_backpack", + (-2.5, -2.5, 0.0), (-75.0, 20.0, 5.0), 0.9, + ), + Armor(Bag("RedMed")): ( + "voxel.armor.misc.bag.woven_red_bag", + (0.5, 0.0, 0.0), (-75.0, 20.0, 5.0), 0.9, + ), + Armor(Bag("RedSmall")): ( + "voxel.armor.misc.bag.knitted_red_pouch", + (0.3, 0.0, 0.0), (-75.0, 20.0, 5.0), 0.8, + ), + Armor(Bag("RedTiny")): ( + "voxel.armor.misc.bag.tiny_red_pouch", + (-2.5, -2.5, 0.0), (-75.0, 20.0, 5.0), 0.9, + ), + Armor(Bag("BluePouch")): ( + "voxel.armor.misc.bag.heavy_seabag", + (-2.5, -2.5, 0.0), (-75.0, 20.0, 5.0), 0.9, + ), + // Consumables + Consumable("common.items.food.apple"): ( + "voxel.object.apple_half", + (-5.0, -5.0, 0.0), (-60.0, -45.0, -15.0), 0.9, + ), + Consumable("common.items.food.coconut"): ( + "voxel.object.coconut_half", + (-5.0, -5.0, 0.0), (-55.0, 30.0, 20.0), 0.8, + ), + Consumable("common.items.food.cactus_colada"): ( + "voxel.object.cactus_drink", + (-5.0, -5.0, 0.0), (-50.0, 30.0, 20.0), 0.8, + ), + Consumable("common.items.consumable.potion_med"): ( + "voxel.object.potion_red", + (-2.5, -2.5, 0.0), (-50.0, 30.0, 20.0), 0.7, + ), + Consumable("common.items.consumable.potion_minor"): ( + "voxel.object.potion_red", + (-2.5, -2.5, 0.0), (-50.0, 30.0, 20.0), 0.5, + ), + Consumable("common.items.consumable.potion_big"): ( + "voxel.object.potion_red", + (-2.5, -2.5, 0.0), (-50.0, 30.0, 20.0), 0.9, + ), + Consumable("common.items.boss_drops.potions"): ( + "voxel.object.potion_red", + (-2.5, -2.5, 0.0), (-50.0, 30.0, 20.0), 0.9, + ), + Consumable("common.items.food.cheese"): ( + "voxel.object.cheese", + (-5.0, -5.0, 0.0), (-60.0, 27.0, 17.0), 0.7, + ), + Consumable("common.items.food.blue_cheese"): ( + "voxel.object.blue_cheese", + (-5.0, -5.0, 0.0), (-60.0, -10.0, 0.0), 0.8, + ), + Consumable("common.items.food.mushroom"): ( + "voxel.sprite.mushrooms.mushroom-10", + (-5.0, -5.0, 0.0), (-50.0, 70.0, 40.0), 1.0, + ), + Ingredient("Velorite"): ( + "voxel.sprite.velorite.velorite_ore", + (0.0, -1.0, 0.0), (-50.0, 40.0, 20.0), 0.8, + ), + Ingredient("VeloriteFrag"): ( + "voxel.sprite.velorite.velorite_1", + (-5.0, -5.0, 0.0), (-50.0, 40.0, 20.0), 0.8, + ), + Consumable("common.items.food.apple_mushroom_curry"): ( + "voxel.object.mushroom_curry", + (-5.0, -5.0, 0.0), (-50.0, 20.0, 17.0), 0.9, + ), + Consumable("common.items.food.spore_corruption"): ( + "voxel.sprite.spore.corruption_spore", + (-5.0, -5.0, 0.0), (-30.0, 30.0, 20.0), 0.8, + ), + Consumable("common.items.food.apple_stick"): ( + "voxel.object.apple_stick", + (-0.5, -0.3, 0.0), (-55.0, 60.0, 5.0), 1.0, + ), + Consumable("common.items.food.mushroom_stick"): ( + "voxel.object.mushroom_stick", + (0.3, 0.0, 0.0), (-55.0, 60.0, 5.0), 1.0, + ), + Consumable("common.items.food.sunflower_icetea"): ( + "voxel.object.sunflower_ice_tea", + (-5.0, -5.0, 0.0), (-50.0, -60.0, -35.0), 0.9, + ), + Consumable("common.items.food.carrot"): ( + "voxel.sprite.carrot.carrot", + (-5.0, -5.0, 0.0), (-20.0, 10.0, 20.0), 0.9, + ), + Consumable("common.items.food.tomato"): ( + "voxel.sprite.tomato.tomato", + (-5.0, -5.0, 0.0), (-50.0, 30.0, 20.0), 0.8, + ), + Consumable("common.items.food.lettuce"): ( + "voxel.sprite.cabbage.cabbage", + (-5.0, -5.0, 0.0), (-50.0, 30.0, 20.0), 0.8, + ), + Consumable("common.items.food.meat.fish_raw"): ( + "voxel.sprite.food.meat.fish_raw", + (0.1, 0.0, 0.0), (-20.0, 10.0, 20.0), 0.9, + ), + Consumable("common.items.food.meat.fish_cooked"): ( + "voxel.sprite.food.meat.fish_cooked", + (0.1, 0.0, 0.0), (-20.0, 10.0, 20.0), 0.9, + ), + Consumable("common.items.food.meat.bird_raw"): ( + "voxel.sprite.food.meat.bird_raw", + (-5.0, -5.0, 0.0), (-20.0, 10.0, 20.0), 0.9, + ), + Consumable("common.items.food.meat.bird_cooked"): ( + "voxel.sprite.food.meat.bird_cooked", + (-5.0, -5.0, 0.0), (-20.0, 10.0, 20.0), 0.9, + ), + Consumable("common.items.food.meat.bird_large_raw"): ( + "voxel.sprite.food.meat.bird_large_raw", + (-5.0, -5.0, 0.0), (-20.0, 10.0, 20.0), 0.9, + ), + Consumable("common.items.food.meat.bird_large_cooked"): ( + "voxel.sprite.food.meat.bird_large_cooked", + (-5.0, -5.0, 0.0), (-20.0, 10.0, 20.0), 0.9, + ), + Consumable("common.items.food.meat.beast_small_raw"): ( + "voxel.sprite.food.meat.beast_small_raw", + (1.1, 0.0, 0.0), (-50.0, 30.0, 0.0), 1.0, + ), + Consumable("common.items.food.meat.beast_small_cooked"): ( + "voxel.sprite.food.meat.beast_small_cooked", + (1.1, 0.0, 0.0), (-50.0, 30.0, 0.0), 1.0, + ), + Consumable("common.items.food.meat.tough_raw"): ( + "voxel.sprite.food.meat.tough_raw", + (-5.0, -5.0, 0.0), (-50.0, 10.0, 0.0), 0.9, + ), + Consumable("common.items.food.meat.tough_cooked"): ( + "voxel.sprite.food.meat.tough_cooked", + (-5.0, -5.0, 0.0), (-50.0, 20.0, 0.0), 0.9, + ), + Consumable("common.items.food.meat.beast_large_raw"): ( + "voxel.sprite.food.meat.beast_large_raw", + (0.4, 0.0, 0.0), (-60.0, 35.0, 0.0), 0.9, + ), + Consumable("common.items.food.meat.beast_large_cooked"): ( + "voxel.sprite.food.meat.beast_large_cooked", + (0.4, 0.0, 0.0), (-60.0, 35.0, 0.0), 0.9, + ), + Consumable("common.items.food.plainsalad"): ( + "voxel.sprite.food.salad_plain", + (-5.0, -5.0, 0.0), (-50.0, 30.0, 20.0), 0.8, + ), + Consumable("common.items.food.tomatosalad"): ( + "voxel.sprite.food.salad_tomato", + (-5.0, -5.0, 0.0), (-50.0, 30.0, 20.0), 0.8, + ), + // Throwables + Throwable(Bomb): ( + "voxel.object.bomb", + (0.0, 0.5, 0.0), (-50.0, 40.0, 20.0), 0.8, + ), + Throwable(Firework(Blue)): ( + "voxel.weapon.projectile.fireworks_blue-0", + (0.0, 0.5, 0.0), (-50.0, 40.0, 20.0), 0.8, + ), + Throwable(Firework(Green)): ( + "voxel.weapon.projectile.fireworks_green-0", + (0.0, 0.5, 0.0), (-50.0, 40.0, 20.0), 0.8, + ), + Throwable(Firework(Purple)): ( + "voxel.weapon.projectile.fireworks_purple-0", + (0.0, 0.5, 0.0), (-50.0, 40.0, 20.0), 0.8, + ), + Throwable(Firework(Red)): ( + "voxel.weapon.projectile.fireworks_red-0", + (0.0, 0.5, 0.0), (-50.0, 40.0, 20.0), 0.8, + ), + Throwable(Firework(White)): ( + "voxel.weapon.projectile.fireworks_white-0", + (0.0, 0.5, 0.0), (-50.0, 40.0, 20.0), 0.8, + ), + Throwable(Firework(Yellow)): ( + "voxel.weapon.projectile.fireworks_yellow-0", + (0.0, 0.5, 0.0), (-50.0, 40.0, 20.0), 0.8, + ), + Throwable(TrainingDummy): ( + "voxel.object.training_dummy", + (0.0, -1.0, 0.0), (-50.0, 40.0, 20.0), 0.8, + ), + // Ingredients + Tool("common.items.tool.craftsman_hammer"): ( + "voxel.weapon.hammer.craftsman", + (-4.5, -5.0, -5.0), (-135.0, 90.0, 0.0), 0.9, + ), + Ingredient("SewingSet"): ( + "voxel.object.sewing_set", + (0.0, -0.1, 0.0), (-45.0, 15.0, 15.0), 1.0, + ), + Ingredient("Flower"): ( + "voxel.sprite.flowers.sunflower_1", + (-2.0, -0.5, -1.0), (-60.0, 40.0, 20.0), 1.1, + ), + Ingredient("FlowerRed"): ( + "voxel.sprite.flowers.flower_red-4", + (0.0, 0.5, 0.0), (-70.0, 10.0, 0.0), 0.8, + ), + Ingredient("Sunflower"): ( + "voxel.sprite.flowers.sunflower_1", + (0.0, -1.0, 0.0), (-50.0, 40.0, 20.0), 0.8, + ), + Ingredient("Grass"): ( + "voxel.sprite.grass.grass_long_5", + (-5.0, -5.0, 0.0), (-90.0, 50.0, 0.0), 1.0, + ), + Ingredient("Stones"): ( + "voxel.sprite.rocks.rock-0", + (-5.0, -5.0, 0.0), (-50.0, 40.0, 20.0), 0.8, + ), + Ingredient("Cactus"): ( + "voxel.sprite.cacti.flat_cactus_med", + (-5.0, -5.0, 0.0), (-50.0, 40.0, 20.0), 0.9, + ), + Ingredient("Seashells"): ( + "voxel.sprite.seashells.shell-0", + (-5.0, -5.0, 0.0), (-50.0, 40.0, 20.0), 0.8, + ), + Ingredient("IcyShard"): ( + "voxel.object.ice_shard", + (-5.0, -5.0, 0.0), (10.0, -20.0, 30.0), 1.0, + ), + Ingredient("FlayerBagDamaged"): ( + "voxel.object.glowing_remains", + (-5.0, -5.0, 0.0), (-20.0, 20.0, .0), 0.9, + ), + Ingredient("RaptorFeather"): ( + "voxel.object.raptor_feather", + (-0.2, 0.0, 0.0), (10.0, 30.0, -2.0), 1.0, + ), + Ingredient("Twigs"): ( + "voxel.sprite.twigs.twigs-0", + (-5.0, -5.0, 0.0), (-20.0, 10.0, 20.0), 0.9, + ), + Ingredient("AnimalHide"): ( + "voxel.sprite.crafting_ing.hide.animal_hide", + (-5.0, -5.0, 0.0), (-20.0, 10.0, 20.0), 0.9, + ), + Ingredient("ToughHide"): ( + "voxel.sprite.crafting_ing.hide.tough_hide", + (-5.0, -5.0, 0.0), (-20.0, 10.0, 20.0), 0.9, + ), + Ingredient("RuggedHide"): ( + "voxel.sprite.crafting_ing.hide.rugged_hide", + (-5.0, -5.0, 0.0), (-20.0, 10.0, 20.0), 0.9, + ), + Ingredient("SimpleLeather"): ( + "voxel.sprite.crafting_ing.leather.simple_leather", + (-5.0, -5.0, 0.0), (-20.0, 10.0, 20.0), 0.9, + ), + Ingredient("ThickLeather"): ( + "voxel.sprite.crafting_ing.leather.thick_leather", + (-0.3, 0.0, 0.0), (-20.0, 15.0, 20.0), 0.9, + ), + Ingredient("RigidLeather"): ( + "voxel.sprite.crafting_ing.leather.rigid_leather", + (-5.0, -5.0, 0.0), (-20.0, 10.0, 20.0), 0.9, + ), + Ingredient("TrollLeather"): ( + "voxel.sprite.crafting_ing.hide.troll_hide", + (-5.0, -5.0, 0.0), (-20.0, 10.0, 20.0), 0.9, + ), + Ingredient("LeatherStrips"): ( + "voxel.sprite.crafting_ing.leather.leather_strips", + (0.5, 0.0, 0.0), (-20.0, 10.0, 60.0), 1.0, + ), + Ingredient("Plate"): ( + "voxel.sprite.crafting_ing.hide.plate", + (-5.0, -5.0, 0.0), (-20.0, 10.0, 20.0), 1.0, + ), + Ingredient("Carapace"): ( + "voxel.sprite.crafting_ing.hide.carapace", + (-5.0, -5.0, 0.0), (-20.0, 10.0, 20.0), 0.9, + ), + Ingredient("Scale"): ( + "voxel.sprite.crafting_ing.hide.scale", + (-5.0, -5.0, 0.0), (-20.0, 10.0, 20.0), 0.8, + ), + Ingredient("DragonScale"): ( + "voxel.sprite.crafting_ing.hide.dragon_scale", + (-5.0, -5.0, 0.0), (-20.0, 10.0, 20.0), 0.9, + ), + Ingredient("Claw"): ( + "voxel.sprite.crafting_ing.animal_misc.claw", + (-5.0, -5.0, 0.0), (-20.0, 10.0, 20.0), 0.9, + ), + Ingredient("VenomSac"): ( + "voxel.sprite.crafting_ing.animal_misc.venom_sac", + (-5.0, -5.0, 0.0), (-20.0, 10.0, 20.0), 0.9, + ), + Ingredient("LivelyVine"): ( + "voxel.sprite.crafting_ing.animal_misc.lively_vine", + (-5.0, -5.0, 0.0), (-40.0, -40.0, 20.0), 1.2, + ), + Ingredient("SharpFang"): ( + "voxel.sprite.crafting_ing.animal_misc.sharp_fang", + (-5.0, -5.0, 0.0), (-20.0, 10.0, 20.0), 1.0, + ), + Ingredient("Fur"): ( + "voxel.sprite.crafting_ing.animal_misc.fur", + (-5.0, -5.0, 0.0), (-40.0, -10.0, 10.0), 1.0, + ), + Ingredient("LargeHorn"): ( + "voxel.sprite.crafting_ing.animal_misc.large_horn", + (-5.0, -5.0, 0.0), (-20.0, 10.0, 20.0), 0.9, + ), + Ingredient("GrimEyeball"): ( + "voxel.sprite.crafting_ing.animal_misc.grim_eyeball", + (-5.0, -5.0, 0.0), (-60.0, 30.0, 20.0), 0.8, + ), + Ingredient("PlantFiber"): ( + "voxel.sprite.crafting_ing.plant_fiber", + (-5.0, -5.0, 0.0), (-20.0, 10.0, 20.0), 0.9, + ), + Ingredient("Moonbell"): ( + "voxel.sprite.flowers.moonbell", + (-5.0, -5.0, 0.0), (-65.0, 40.0, 20.0), 0.9, + ), + Ingredient("Pyrebloom"): ( + "voxel.sprite.flowers.pyrebloom", + (-5.0, -5.0, 0.0), (-75.0, 0.0, 20.0), 0.9, + ), + Ingredient("WildFlax"): ( + "voxel.sprite.flowers.flax", + (-5.0, -5.0, 0.0), (-75.0, 0.0, 20.0), 0.8, + ), + Ingredient("CottonBoll"): ( + "voxel.sprite.crafting_ing.cotton_boll", + (-5.0, -5.0, 0.0), (-65.0, 0.0, 20.0), 0.9, + ), + Ingredient("Cotton"): ( + "voxel.sprite.crafting_ing.cloth.cotton", + (-5.0, -5.0, 0.0), (-65.0, 0.0, 20.0), 0.9, + ), + Ingredient("Linen"): ( + "voxel.sprite.crafting_ing.cloth.linen", + (-5.0, -5.0, 0.0), (-65.0, 0.0, 20.0), 0.9, + ), + Ingredient("Wool"): ( + "voxel.sprite.crafting_ing.cloth.wool", + (-5.0, -5.0, 0.0), (-20.0, 10.0, 20.0), 0.9, + ), + Ingredient("Silk"): ( + "voxel.sprite.crafting_ing.cloth.silk", + (-5.0, -5.0, 0.0), (-65.0, 0.0, 20.0), 0.9, + ), + Ingredient("Lifecloth"): ( + "voxel.sprite.crafting_ing.cloth.lifecloth", + (-5.0, -5.0, 0.0), (-65.0, 0.0, 20.0), 0.9, + ), + Ingredient("Moonweave"): ( + "voxel.sprite.crafting_ing.cloth.moonweave", + (-5.0, -5.0, 0.0), (-65.0, 0.0, 20.0), 0.9, + ), + Ingredient("Sunsilk"): ( + "voxel.sprite.crafting_ing.cloth.sunsilk", + (-5.0, -5.0, 0.0), (-65.0, 0.0, 20.0), 0.9, + ), + Ingredient("LinenRed"): ( + "voxel.sprite.crafting_ing.cloth.linen_red", + (-5.0, -5.0, 0.0), (-65.0, 0.0, 20.0), 0.9, + ), + Ingredient("StickyThread"): ( + "voxel.sprite.crafting_ing.sticky_thread", + (-5.0, -5.0, 0.0), (-65.0, 0.0, 20.0), 0.9, + ), + Ingredient("SilverIngot"): ( + "voxel.sprite.mineral.ingot.silver", + (-5.0, -5.0, 0.0), (70.0, 30.0, 170.0), 0.85, + ), + Ingredient("GoldIngot"): ( + "voxel.sprite.mineral.ingot.gold", + (-5.0, -5.0, 0.0), (70.0, 30.0, 170.0), 0.85, + ), + Ingredient("OrichalcumIngot"): ( + "voxel.sprite.mineral.ingot.orichalcum", + (-5.0, -5.0, 0.0), (70.0, 30.0, 170.0), 0.85, + ), + Ingredient("BloodsteelIngot"): ( + "voxel.sprite.mineral.ingot.bloodsteel", + (-5.0, -5.0, 0.0), (70.0, 30.0, 170.0), 0.85, + ), + Ingredient("BronzeIngot"): ( + "voxel.sprite.mineral.ingot.bronze", + (-5.0, -5.0, 0.0), (70.0, 30.0, 170.0), 0.85, + ), + Ingredient("CobaltIngot"): ( + "voxel.sprite.mineral.ingot.cobalt", + (-5.0, -5.0, 0.0), (70.0, 30.0, 170.0), 0.85, + ), + Ingredient("CopperIngot"): ( + "voxel.sprite.mineral.ingot.copper", + (-5.0, -5.0, 0.0), (70.0, 30.0, 170.0), 0.85, + ), + Ingredient("IronIngot"): ( + "voxel.sprite.mineral.ingot.iron", + (-5.0, -5.0, 0.0), (70.0, 30.0, 170.0), 0.85, + ), + Ingredient("SteelIngot"): ( + "voxel.sprite.mineral.ingot.steel", + (-5.0, -5.0, 0.0), (70.0, 30.0, 170.0), 0.85, + ), + Ingredient("TinIngot"): ( + "voxel.sprite.mineral.ingot.tin", + (-5.0, -5.0, 0.0), (70.0, 30.0, 170.0), 0.85, + ), + Ingredient("GoldOre"): ( + "voxel.sprite.mineral.ore.gold", + (-5.0, -5.0, 0.0), (-60.0, 30.0, 15.0), 0.9, + ), + Ingredient("SilverOre"): ( + "voxel.sprite.mineral.ore.silver", + (-5.0, -5.0, 0.0), (-60.0, 30.0, 15.0), 0.9, + ), + Ingredient("BloodstoneOre"): ( + "voxel.sprite.mineral.ore.bloodstone", + (-5.0, -5.0, 0.0), (-60.0, 30.0, 15.0), 0.9, + ), + Ingredient("CobaltOre"): ( + "voxel.sprite.mineral.ore.cobalt", + (-5.0, -5.0, 0.0), (-60.0, 30.0, 15.0), 0.9, + ), + Ingredient("CopperOre"): ( + "voxel.sprite.mineral.ore.copper", + (-5.0, -5.0, 0.0), (-60.0, 30.0, 15.0), 0.9, + ), + Ingredient("IronOre"): ( + "voxel.sprite.mineral.ore.iron", + (-5.0, -5.0, 0.0), (-60.0, 30.0, 15.0), 0.9, + ), + Ingredient("TinOre"): ( + "voxel.sprite.mineral.ore.tin", + (-5.0, -5.0, 0.0), (-60.0, 30.0, 15.0), 0.9, + ), + Ingredient("Coal"): ( + "voxel.sprite.mineral.ore.coal", + (-5.0, -5.0, 0.0), (-60.0, 30.0, 15.0), 0.9, + ), + Ingredient("Honey"): ( + "voxel.object.honey", + (-5.0, -5.0, 0.0), (-20.0, 20.0, -30.0), 0.9, + ), + Ingredient("MortarPestle"): ( + "voxel.object.mortar_pestle", + (-5.0, -5.0, 0.0), (-40.0, 15.0, 17.0), 0.8, + ), + Ingredient("EmptyVial"): ( + "voxel.object.potion_empty", + (-2.5, -2.5, 0.0), (-50.0, 30.0, 20.0), 0.8, + ), + Ingredient("Bowl"): ( + "voxel.sprite.crafting_ing.bowl", + (-5.0, -5.0, 0.0), (-50.0, 30.0, 20.0), 0.8, + ), + Ingredient("Oil"): ( + "voxel.sprite.crafting_ing.oil", + (-5.0, -5.0, 0.0), (-50.0, 30.0, 20.0), 0.8, + ), + Ingredient("ViscousOoze"): ( + "voxel.sprite.crafting_ing.animal_misc.viscous_ooze", + (-5.0, -5.0, 0.0), (-50.0, 30.0, 20.0), 0.8, + ), + Ingredient("PhoenixFeather"): ( + "voxel.sprite.crafting_ing.animal_misc.phoenix_feather", + (-5.0, -5.0, 0.0), (-50.0, 30.0, 20.0), 1.2, + ), + // Gliders + Glider("Starter"): ( + "voxel.glider.starter", + (-25.0, -25.0, 0.0), (-50.0, 30.0, 20.0), 0.9, + ), + Glider("PlainCloth"): ( + "voxel.glider.basic_white", + (-25.0, -25.0, 0.0), (-50.0, 30.0, 20.0), 0.9, + ), + Glider("RedCloth"): ( + "voxel.glider.basic_red", + (-25.0, -25.0, 0.0), (-50.0, 30.0, 20.0), 0.9, + ), + Glider("Blue0"): ( + "voxel.glider.blue", + (-25.0, -25.0, 0.0), (-50.0, 30.0, 20.0), 1.1, + ), + Glider("ButterflyMorpho"): ( + "voxel.glider.butterfly1", + (-25.0, -25.0, 0.0), (-50.0, 30.0, 20.0), 1.1, + ), + Glider("ButterflyMonarch"): ( + "voxel.glider.butterfly2", + (-25.0, -25.0, 0.0), (-50.0, 30.0, 20.0), 1.1, + ), + Glider("ButterflyLove"): ( + "voxel.glider.butterfly3", + (-25.0, -25.0, 0.0), (-50.0, 30.0, 20.0), 1.1, + ), + Glider("MothLuna"): ( + "voxel.glider.moth", + (-25.0, -25.0, 0.0), (-50.0, 30.0, 20.0), 1.1, + ), + Glider("SandRaptor"): ( + "voxel.glider.sandraptor", + (-25.0, -25.0, 0.0), (-50.0, 30.0, 20.0), 1.1, + ), + Glider("SnowRaptor"): ( + "voxel.glider.snowraptor", + (-25.0, -25.0, 0.0), (-50.0, 30.0, 20.0), 1.1, + ), + Glider("WoodRaptor"): ( + "voxel.glider.woodraptor", + (-25.0, -25.0, 0.0), (-50.0, 30.0, 20.0), 1.1, + ), + Glider("Sunset"): ( + "voxel.glider.sunset", + (-25.0, -25.0, 0.0), (-50.0, 30.0, 20.0), 1.1, + ), + Glider("Moonrise"): ( + "voxel.glider.moonrise", + (-25.0, -25.0, 0.0), (-50.0, 30.0, 20.0), 1.1, + ), + Glider("Purple0"): ( + "voxel.glider.cultists", + (-25.0, -25.0, 0.0), (-50.0, 30.0, 20.0), 1.1, + ), + Glider("Leaves"): ( + "voxel.glider.leaves", + (-25.0, -25.0, 0.0), (-50.0, 30.0, 20.0), 1.1, + ), + // Debug Items + Tool("common.items.debug.admin_stick"): ( + "voxel.weapon.tool.broom_belzeshrub_purple", + (-2.5, -2.5, 0.0), (-135.0, 90.0, 0.0), 1.1, + ), + // Misc + Tool("common.items.weapons.tool.golf_club"): ( + "voxel.weapon.tool.golf_club", + (2.0, -1.0, 0.0), (-135.0, 25.0, 0.0), 1.1, + ), + // Gems + Ingredient("Amethyst"): ( + "voxel.sprite.mineral.gem.amethystgem", + (-2.5, -2.5, 0.0), (-50.0, 30.0, 20.0), 0.7, + ), + Ingredient("Topaz"): ( + "voxel.sprite.mineral.gem.topazgem", + (-2.5, -2.5, 0.0), (-50.0, 30.0, 20.0), 0.7, + ), + Ingredient("Sapphire"): ( + "voxel.sprite.mineral.gem.sapphiregem", + (-2.5, -2.5, 0.0), (-50.0, 30.0, 20.0), 0.6, + ), + Ingredient("Emerald"): ( + "voxel.sprite.mineral.gem.emeraldgem", + (-2.5, -2.5, 0.0), (-50.0, 30.0, 20.0), 0.7, + ), + Ingredient("Ruby"): ( + "voxel.sprite.mineral.gem.rubygem", + (-2.5, -2.5, 0.0), (-50.0, 30.0, 20.0), 0.7, + ), + Ingredient("Diamond"): ( + "voxel.sprite.mineral.gem.diamondgem", + (-2.5, -2.5, 0.0), (-55.0, 30.0, 20.0), 0.6, + ), + ModularComponent("common.items.crafting_ing.modular.damage.sword.tier5"): ( + "voxel.weapon_components.sword.cultist.cultist_purp_2h-0_blade", + (-2.5, -2.5, 0.0), (-135.0, 90.0, 0.0), 1.5, + ), + ModularComponent("common.items.crafting_ing.modular.held.sword.tier5"): ( + "voxel.weapon_components.sword.cultist.cultist_purp_2h-0_handle", + (-2.5, -2.5, 0.0), (-135.0, 90.0, 0.0), 1.5, + ), + Empty: ( + "voxel.armor.empty", + (0.0, 0.0, 0.0), (0.0, 0.0, 0.0), 1.5, + ), +}) \ No newline at end of file diff --git a/common/src/comp/agent.rs b/common/src/comp/agent.rs index 78ee584191..be3a485cbb 100644 --- a/common/src/comp/agent.rs +++ b/common/src/comp/agent.rs @@ -263,6 +263,7 @@ impl<'a> From<&'a Body> for Psyche { Body::FishMedium(_) => 0.75, Body::BipedLarge(_) => 0.0, Body::Object(_) => 0.0, + Body::ItemDrop(_) => 0.0, Body::Golem(_) => 0.0, Body::Theropod(_) => 0.0, Body::Ship(_) => 0.0, diff --git a/common/src/comp/body.rs b/common/src/comp/body.rs index f6b21b9bef..808de1c1c8 100644 --- a/common/src/comp/body.rs +++ b/common/src/comp/body.rs @@ -8,6 +8,7 @@ pub mod fish_medium; pub mod fish_small; pub mod golem; pub mod humanoid; +pub mod item_drop; pub mod object; pub mod quadruped_low; pub mod quadruped_medium; @@ -50,6 +51,7 @@ make_case_elim!( QuadrupedLow(body: quadruped_low::Body) = 13, Ship(body: ship::Body) = 14, Arthropod(body: arthropod::Body) = 15, + ItemDrop(body: item_drop::Body) = 16, } ); @@ -83,6 +85,7 @@ pub struct AllBodies { pub biped_large: BodyData>, pub biped_small: BodyData>, pub object: BodyData, + pub item_drop: BodyData, pub golem: BodyData>, pub theropod: BodyData>, pub quadruped_low: BodyData>, @@ -133,6 +136,7 @@ impl<'a, BodyMeta, SpeciesMeta> core::ops::Index<&'a Body> for AllBodies &self.biped_large.body, Body::BipedSmall(_) => &self.biped_small.body, Body::Object(_) => &self.object.body, + Body::ItemDrop(_) => &self.item_drop.body, Body::Golem(_) => &self.golem.body, Body::Theropod(_) => &self.theropod.body, Body::QuadrupedLow(_) => &self.quadruped_low.body, @@ -196,6 +200,7 @@ impl Body { _ => false, }, Body::Object(_) => false, + Body::ItemDrop(_) => false, Body::Golem(b1) => match other { Body::Golem(b2) => b1.species == b2.species, _ => false, @@ -235,6 +240,7 @@ impl Body { Body::Humanoid(_) => HUMAN_DENSITY, Body::Ship(ship) => ship.density().0, Body::Object(object) => object.density().0, + Body::ItemDrop(item_drop) => item_drop.density().0, _ => HUMAN_DENSITY, }; Density(d) @@ -287,6 +293,7 @@ impl Body { 65.0 * humanoid.height() / 1.75f32 }, Body::Object(obj) => obj.mass().0, + Body::ItemDrop(item_drop) => item_drop.mass().0, Body::QuadrupedLow(body) => match body.species { quadruped_low::Species::Alligator => 360.0, // ~✅ quadruped_low::Species::Asp => 300.0, @@ -411,6 +418,7 @@ impl Body { Vec3::new(height / 1.3, 1.75 / 2.0, height) }, Body::Object(object) => object.dimensions(), + Body::ItemDrop(item_drop) => item_drop.dimensions(), Body::QuadrupedMedium(body) => match body.species { quadruped_medium::Species::Barghest => Vec3::new(2.0, 4.4, 2.7), quadruped_medium::Species::Bear => Vec3::new(2.0, 3.8, 3.0), @@ -696,6 +704,7 @@ impl Body { object::Body::SeaLantern => 100, _ => 1000, }, + Body::ItemDrop(_) => 1000, Body::Golem(golem) => match golem.species { golem::Species::ClayGolem => 450, _ => 1000, diff --git a/common/src/comp/body/item_drop.rs b/common/src/comp/body/item_drop.rs new file mode 100644 index 0000000000..da7c3d9bd3 --- /dev/null +++ b/common/src/comp/body/item_drop.rs @@ -0,0 +1,150 @@ +use crate::{ + comp::{ + item::{ + armor::ArmorKind, + tool::{Tool, ToolKind}, + Item, ItemKind, Utility, + }, + Density, Mass, Ori, + }, + consts::WATER_DENSITY, + make_case_elim, + util::Dir, +}; +use rand::prelude::*; +use serde::{Deserialize, Serialize}; +use std::f32::consts::PI; +use vek::Vec3; + +make_case_elim!( + armor, + #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] + #[repr(u32)] + pub enum ItemDropArmorKind { + Shoulder = 0, + Chest = 1, + Belt = 2, + Hand = 3, + Pants = 4, + Foot = 5, + Back = 6, + Ring = 7, + Neck = 8, + Head = 9, + Tabard = 10, + Bag = 11, + } +); + +make_case_elim!( + body, + #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] + #[repr(u32)] + pub enum Body { + Tool(tool: ToolKind) = 0, + ModularComponent = 1, + Lantern = 2, + Glider = 3, + Armor(armor: ItemDropArmorKind) = 4, + Utility = 5, + Consumable = 6, + Throwable = 7, + Ingredient = 8, + Coins = 9, + CoinPouch = 10, + Empty = 11, + } +); + +impl From for super::Body { + fn from(body: Body) -> Self { super::Body::ItemDrop(body) } +} + +impl From<&Item> for Body { + fn from(item: &Item) -> Self { + match item.kind() { + ItemKind::Tool(Tool { kind, .. }) => Body::Tool(*kind), + ItemKind::ModularComponent(_) => Body::ModularComponent, + ItemKind::Lantern(_) => Body::Lantern, + ItemKind::Glider(_) => Body::Glider, + ItemKind::Armor(armor) => match armor.kind { + ArmorKind::Shoulder(_) => Body::Armor(ItemDropArmorKind::Shoulder), + ArmorKind::Chest(_) => Body::Armor(ItemDropArmorKind::Chest), + ArmorKind::Belt(_) => Body::Armor(ItemDropArmorKind::Belt), + ArmorKind::Hand(_) => Body::Armor(ItemDropArmorKind::Hand), + ArmorKind::Pants(_) => Body::Armor(ItemDropArmorKind::Pants), + ArmorKind::Foot(_) => Body::Armor(ItemDropArmorKind::Foot), + ArmorKind::Back(_) => Body::Armor(ItemDropArmorKind::Back), + ArmorKind::Ring(_) => Body::Armor(ItemDropArmorKind::Ring), + ArmorKind::Neck(_) => Body::Armor(ItemDropArmorKind::Neck), + ArmorKind::Head(_) => Body::Armor(ItemDropArmorKind::Head), + ArmorKind::Tabard(_) => Body::Armor(ItemDropArmorKind::Tabard), + ArmorKind::Bag(_) => Body::Armor(ItemDropArmorKind::Bag), + }, + ItemKind::Utility { kind, .. } => match kind { + Utility::Coins => { + if item.amount() > 100 { + Body::CoinPouch + } else { + Body::Coins + } + }, + _ => Body::Utility, + }, + ItemKind::Consumable { .. } => Body::Consumable, + ItemKind::Throwable { .. } => Body::Throwable, + ItemKind::Ingredient { .. } => Body::Ingredient, + _ => Body::Empty, + } + } +} + +impl Body { + pub fn to_string(self) -> &'static str { + match self { + Body::Tool(_) => "tool", + Body::ModularComponent => "modular_component", + Body::Lantern => "lantern", + Body::Glider => "glider", + Body::Armor(_) => "armor", + Body::Utility => "utility", + Body::Consumable => "consumable", + Body::Throwable => "throwable", + Body::Ingredient => "ingredient", + Body::Coins => "coins", + Body::CoinPouch => "coin_pouch", + Body::Empty => "empty", + } + } + + pub fn density(&self) -> Density { Density(1.1 * WATER_DENSITY) } + + pub fn mass(&self) -> Mass { Mass(2.0) } + + pub fn dimensions(&self) -> Vec3 { Vec3::new(0.0, 0.1, 0.0) } + + pub fn orientation(&self, rng: &mut impl Rng) -> Ori { + let random = rng.gen_range(-1.0..1.0f32); + let default = Ori::default(); + match self { + Body::Tool(_) => default + .pitched_down(PI / 2.0) + .yawed_left(PI / 2.0) + .pitched_towards( + Dir::from_unnormalized(Vec3::new( + random, + rng.gen_range(-1.0..1.0f32), + rng.gen_range(-1.0..1.0f32), + )) + .unwrap_or_default(), + ), + Body::Armor(kind) => match kind { + ItemDropArmorKind::Neck | ItemDropArmorKind::Back | ItemDropArmorKind::Tabard => { + default.pitched_down(PI / -2.0) + }, + _ => default.yawed_left(random), + }, + _ => default.yawed_left(random), + } + } +} diff --git a/common/src/comp/fluid_dynamics.rs b/common/src/comp/fluid_dynamics.rs index 212e4ae198..ec70c8d147 100644 --- a/common/src/comp/fluid_dynamics.rs +++ b/common/src/comp/fluid_dynamics.rs @@ -306,6 +306,12 @@ impl Body { }, }, + Body::ItemDrop(_) => { + let dim = self.dimensions(); + const CD: f32 = 2.0; + CD * (PI / 6.0 * dim.x * dim.y * dim.z).powf(2.0 / 3.0) + }, + Body::Ship(_) => { // Airships tend to use the square of the cube root of its volume for // reference area diff --git a/common/src/comp/inventory/item/item_key.rs b/common/src/comp/inventory/item/item_key.rs new file mode 100644 index 0000000000..f318d096cc --- /dev/null +++ b/common/src/comp/inventory/item/item_key.rs @@ -0,0 +1,51 @@ +use crate::{ + assets::AssetExt, + comp::inventory::item::{ + armor::{Armor, ArmorKind}, + Glider, ItemDef, ItemDesc, ItemKind, Lantern, Throwable, Utility, + }, +}; +use serde::{Deserialize, Serialize}; +use std::sync::Arc; + +#[derive(Clone, Debug, Serialize, Deserialize, Hash, Eq, PartialEq)] +pub enum ItemKey { + Tool(String), + ModularComponent(String), + Lantern(String), + Glider(String), + Armor(ArmorKind), + Utility(Utility), + Consumable(String), + Throwable(Throwable), + Ingredient(String), + TagExamples(Vec), + Empty, +} + +impl From<&T> for ItemKey { + fn from(item_desc: &T) -> Self { + let item_kind = item_desc.kind(); + let item_definition_id = item_desc.item_definition_id(); + + match item_kind { + ItemKind::Tool(_) => ItemKey::Tool(item_definition_id.to_owned()), + ItemKind::ModularComponent(_) => { + ItemKey::ModularComponent(item_definition_id.to_owned()) + }, + ItemKind::Lantern(Lantern { kind, .. }) => ItemKey::Lantern(kind.clone()), + ItemKind::Glider(Glider { kind, .. }) => ItemKey::Glider(kind.clone()), + ItemKind::Armor(Armor { kind, .. }) => ItemKey::Armor(kind.clone()), + ItemKind::Utility { kind, .. } => ItemKey::Utility(*kind), + ItemKind::Consumable { .. } => ItemKey::Consumable(item_definition_id.to_owned()), + ItemKind::Throwable { kind, .. } => ItemKey::Throwable(*kind), + ItemKind::Ingredient { kind, .. } => ItemKey::Ingredient(kind.clone()), + ItemKind::TagExamples { item_ids } => ItemKey::TagExamples( + item_ids + .iter() + .map(|id| ItemKey::from(&*Arc::::load_expect_cloned(id))) + .collect(), + ), + } + } +} diff --git a/common/src/comp/inventory/item/mod.rs b/common/src/comp/inventory/item/mod.rs index 71eba26cd7..8c9987c77d 100644 --- a/common/src/comp/inventory/item/mod.rs +++ b/common/src/comp/inventory/item/mod.rs @@ -1,4 +1,5 @@ pub mod armor; +pub mod item_key; pub mod modular; pub mod tool; diff --git a/common/src/comp/mod.rs b/common/src/comp/mod.rs index 5d45365138..2fa066f0d3 100644 --- a/common/src/comp/mod.rs +++ b/common/src/comp/mod.rs @@ -60,8 +60,8 @@ pub use self::{ beam::{Beam, BeamSegment}, body::{ arthropod, biped_large, biped_small, bird_large, bird_medium, dragon, fish_medium, - fish_small, golem, humanoid, object, quadruped_low, quadruped_medium, quadruped_small, - ship, theropod, AllBodies, Body, BodyData, + fish_small, golem, humanoid, item_drop, object, quadruped_low, quadruped_medium, + quadruped_small, ship, theropod, AllBodies, Body, BodyData, }, buff::{ Buff, BuffCategory, BuffChange, BuffData, BuffEffect, BuffId, BuffKind, BuffSource, Buffs, @@ -83,6 +83,7 @@ pub use self::{ inventory::{ item::{ self, + item_key::ItemKey, tool::{self, AbilityItem}, Item, ItemConfig, ItemDrop, }, diff --git a/common/src/states/utils.rs b/common/src/states/utils.rs index 148ea04386..0100e59408 100644 --- a/common/src/states/utils.rs +++ b/common/src/states/utils.rs @@ -109,6 +109,7 @@ impl Body { _ => 80.0, }, Body::Object(_) => 0.0, + Body::ItemDrop(_) => 0.0, Body::Golem(_) => 60.0, Body::Theropod(_) => 135.0, Body::QuadrupedLow(quadruped_low) => match quadruped_low.species { @@ -183,6 +184,7 @@ impl Body { Body::BipedLarge(_) => 2.7, Body::BipedSmall(_) => 3.5, Body::Object(_) => 2.0, + Body::ItemDrop(_) => 2.0, Body::Golem(_) => 2.0, Body::Theropod(theropod) => match theropod.species { theropod::Species::Archaeos => 2.3, @@ -208,6 +210,7 @@ impl Body { pub fn swim_thrust(&self) -> Option { match self { Body::Object(_) => None, + Body::ItemDrop(_) => None, Body::BipedLarge(_) | Body::Golem(_) => Some(200.0 * self.mass().0), Body::BipedSmall(_) => Some(100.0 * self.mass().0), Body::BirdMedium(_) => Some(50.0 * self.mass().0), @@ -247,7 +250,7 @@ impl Body { /// Returns jump impulse if the body type can jump, otherwise None pub fn jump_impulse(&self) -> Option { match self { - Body::Object(_) | Body::Ship(_) => None, + Body::Object(_) | Body::Ship(_) | Body::ItemDrop(_) => None, Body::BipedLarge(_) | Body::Dragon(_) | Body::Golem(_) | Body::QuadrupedLow(_) => { Some(0.1 * self.mass().0) }, diff --git a/server/src/cmd.rs b/server/src/cmd.rs index 34dabf9002..5eb1c8adf8 100644 --- a/server/src/cmd.rs +++ b/server/src/cmd.rs @@ -476,7 +476,7 @@ fn handle_drop_all( server .state - .create_object(Default::default(), comp::object::Body::Pouch) + .create_item_drop(Default::default(), &item) .with(comp::Pos(Vec3::new( pos.0.x + rng.gen_range(5.0..10.0), pos.0.y + rng.gen_range(5.0..10.0), diff --git a/server/src/events/entity_manipulation.rs b/server/src/events/entity_manipulation.rs index 40ba9eebba..a975731c14 100644 --- a/server/src/events/entity_manipulation.rs +++ b/server/src/events/entity_manipulation.rs @@ -17,8 +17,8 @@ use common::{ self, aura, buff, chat::{KillSource, KillType}, inventory::item::MaterialStatManifest, - object, Alignment, Auras, Body, CharacterState, Energy, Group, Health, HealthChange, - Inventory, Player, Poise, Pos, SkillSet, Stats, + Alignment, Auras, Body, CharacterState, Energy, Group, Health, HealthChange, Inventory, + Player, Poise, Pos, SkillSet, Stats, }, event::{EventBus, ServerEvent}, outcome::Outcome, @@ -427,7 +427,6 @@ pub fn handle_destroy(server: &mut Server, entity: EcsEntity, last_change: Healt // and if it is not owned by another entity (not a pet) // Decide for a loot drop before turning into a lootbag - let old_body = state.ecs().write_storage::().remove(entity); let item = { let mut item_drop = state.ecs().write_storage::(); @@ -442,23 +441,7 @@ pub fn handle_destroy(server: &mut Server, entity: EcsEntity, last_change: Healt // render the items on the ground, rather than changing the texture depending on // the body type let _ = state - .create_object(comp::Pos(pos.0 + Vec3::unit_z() * 0.25), match old_body { - Some(common::comp::Body::Humanoid(_)) => object::Body::Pouch, - Some(common::comp::Body::BipedSmall(_)) - | Some(common::comp::Body::BipedLarge(_)) => object::Body::Pouch, - Some(common::comp::Body::Golem(_)) => object::Body::Chest, - Some(common::comp::Body::QuadrupedSmall(_)) => object::Body::SmallMeat, - Some(common::comp::Body::FishMedium(_)) - | Some(common::comp::Body::FishSmall(_)) => object::Body::FishMeat, - Some(common::comp::Body::QuadrupedMedium(_)) => object::Body::BeastMeat, - Some(common::comp::Body::QuadrupedLow(_)) => object::Body::ToughMeat, - Some(common::comp::Body::BirdLarge(_)) - | Some(common::comp::Body::BirdMedium(_)) => object::Body::BirdMeat, - Some(common::comp::Body::Theropod(_)) => object::Body::BeastMeat, - Some(common::comp::Body::Dragon(_)) => object::Body::BeastMeat, - Some(common::comp::Body::Object(_)) => object::Body::Chest, - _ => object::Body::Pouch, - }) + .create_item_drop(comp::Pos(pos.0 + Vec3::unit_z() * 0.25), &item) .maybe_with(vel) .with(item) .build(); diff --git a/server/src/events/interaction.rs b/server/src/events/interaction.rs index 2a9a6325bf..2c3aca72ce 100644 --- a/server/src/events/interaction.rs +++ b/server/src/events/interaction.rs @@ -379,7 +379,7 @@ pub fn handle_mine_block( } } state - .create_object(Default::default(), comp::object::Body::Pouch) + .create_item_drop(Default::default(), &item) .with(comp::Pos(pos.map(|e| e as f32) + Vec3::new(0.5, 0.5, 0.0))) .with(item) .build(); diff --git a/server/src/events/inventory_manip.rs b/server/src/events/inventory_manip.rs index b0b24f07a1..9203892ae5 100644 --- a/server/src/events/inventory_manip.rs +++ b/server/src/events/inventory_manip.rs @@ -247,14 +247,8 @@ pub fn handle_inventory(server: &mut Server, entity: EcsEntity, manip: comp::Inv } drop(inventories); if let Some(item) = drop_item { - // TODO: Choose a body appropriate for the item - let body = match item.item_definition_id() { - "common.items.utility.coins" => comp::object::Body::Coins, - _ => comp::object::Body::Pouch, - }; - state - .create_object(Default::default(), body) + .create_item_drop(Default::default(), &item) .with(comp::Pos( Vec3::new(pos.x as f32, pos.y as f32, pos.z as f32) + Vec3::unit_z(), )) @@ -712,12 +706,6 @@ pub fn handle_inventory(server: &mut Server, entity: EcsEntity, manip: comp::Inv .into_iter() .filter(|(_, _, i)| !matches!(i.quality(), item::Quality::Debug)) { - // hack: special case coins for now - let body = match item.item_definition_id() { - "common.items.utility.coins" => comp::object::Body::Coins, - _ => comp::object::Body::Pouch, - }; - // If item is a container check inside of it for Debug items and remove them item.slots_mut().iter_mut().for_each(|x| { if let Some(contained_item) = &x { @@ -728,7 +716,7 @@ pub fn handle_inventory(server: &mut Server, entity: EcsEntity, manip: comp::Inv }); state - .create_object(Default::default(), body) + .create_item_drop(Default::default(), &item) .with(comp::Pos(pos.0 + *ori.look_dir() + Vec3::unit_z())) .with(item) .with(comp::Vel(Vec3::zero())) diff --git a/server/src/state_ext.rs b/server/src/state_ext.rs index e55db922f5..a9e47fe283 100644 --- a/server/src/state_ext.rs +++ b/server/src/state_ext.rs @@ -15,7 +15,7 @@ use common::{ comp::{ self, skills::{GeneralSkill, Skill}, - Group, Inventory, Poise, + Group, Inventory, Item, Poise, }, effect::Effect, link::{Link, LinkHandle}, @@ -54,6 +54,7 @@ pub trait StateExt { ) -> EcsEntityBuilder; /// Build a static object entity fn create_object(&mut self, pos: comp::Pos, object: comp::object::Body) -> EcsEntityBuilder; + fn create_item_drop(&mut self, pos: comp::Pos, item: &Item) -> EcsEntityBuilder; fn create_ship comp::Collider>( &mut self, pos: comp::Pos, @@ -269,6 +270,20 @@ impl StateExt for State { .with(body) } + fn create_item_drop(&mut self, pos: comp::Pos, item: &Item) -> EcsEntityBuilder { + let item_drop = comp::item_drop::Body::from(item); + let body = comp::Body::ItemDrop(item_drop); + self.ecs_mut() + .create_entity_synced() + .with(pos) + .with(comp::Vel(Vec3::zero())) + .with(item_drop.orientation(&mut thread_rng())) + .with(item_drop.mass()) + .with(item_drop.density()) + .with(capsule(&body)) + .with(body) + } + fn create_ship comp::Collider>( &mut self, pos: comp::Pos, diff --git a/voxygen/anim/src/item_drop/idle.rs b/voxygen/anim/src/item_drop/idle.rs new file mode 100644 index 0000000000..00f482bebe --- /dev/null +++ b/voxygen/anim/src/item_drop/idle.rs @@ -0,0 +1,29 @@ +use super::{ + super::{vek::*, Animation}, + ItemDropSkeleton, SkeletonAttr, +}; + +pub struct IdleAnimation; + +impl Animation for IdleAnimation { + type Dependency<'a> = f32; + type Skeleton = ItemDropSkeleton; + + #[cfg(feature = "use-dyn-lib")] + const UPDATE_FN: &'static [u8] = b"item_drop_idle\0"; + + #[cfg_attr(feature = "be-dyn-lib", export_name = "item_drop_idle")] + fn update_skeleton_inner<'a>( + skeleton: &Self::Skeleton, + _: Self::Dependency<'a>, + _anim_time: f32, + _rate: &mut f32, + s_a: &SkeletonAttr, + ) -> Self::Skeleton { + let mut next = (*skeleton).clone(); + + next.bone0.position = Vec3::new(s_a.bone0.0, s_a.bone0.1, s_a.bone0.2); + + next + } +} diff --git a/voxygen/anim/src/item_drop/mod.rs b/voxygen/anim/src/item_drop/mod.rs new file mode 100644 index 0000000000..567c8d9aed --- /dev/null +++ b/voxygen/anim/src/item_drop/mod.rs @@ -0,0 +1,95 @@ +pub mod idle; + +// Reexports +pub use self::idle::IdleAnimation; + +use super::{make_bone, vek::*, FigureBoneData, Offsets, Skeleton}; +use common::comp::{self, item_drop::ItemDropArmorKind}; +use core::convert::TryFrom; + +pub type Body = comp::item_drop::Body; + +skeleton_impls!(struct ItemDropSkeleton { + + bone0, +}); + +impl Skeleton for ItemDropSkeleton { + type Attr = SkeletonAttr; + type Body = Body; + + const BONE_COUNT: usize = 1; + #[cfg(feature = "use-dyn-lib")] + const COMPUTE_FN: &'static [u8] = b"item_drop_compute_mats\0"; + + #[cfg_attr(feature = "be-dyn-lib", export_name = "item_drop_compute_mats")] + fn compute_matrices_inner( + &self, + base_mat: Mat4, + buf: &mut [FigureBoneData; super::MAX_BONE_COUNT], + body: Self::Body, + ) -> Offsets { + let scale_mat = Mat4::scaling_3d(1.0 / 11.0 * Self::scale(&body)); + + let bone0_mat = base_mat * scale_mat * Mat4::::from(self.bone0); + + *(<&mut [_; Self::BONE_COUNT]>::try_from(&mut buf[0..Self::BONE_COUNT]).unwrap()) = + [make_bone(bone0_mat)]; + Offsets { + lantern: None, + mount_bone: Transform { + position: common::comp::Body::ItemDrop(body) + .mount_offset() + .into_tuple() + .into(), + ..Default::default() + }, + } + } +} + +impl ItemDropSkeleton { + pub fn scale(body: &Body) -> f32 { + match body { + Body::Tool(_) => 0.8, + Body::Glider => 0.45, + Body::Coins => 0.5, + Body::Armor(kind) => match kind { + ItemDropArmorKind::Neck | ItemDropArmorKind::Ring => 0.5, + ItemDropArmorKind::Back => 0.7, + _ => 0.8, + }, + _ => 1.0, + } + } +} + +pub struct SkeletonAttr { + bone0: (f32, f32, f32), +} + +impl<'a> std::convert::TryFrom<&'a comp::Body> for SkeletonAttr { + type Error = (); + + fn try_from(body: &'a comp::Body) -> Result { + match body { + comp::Body::ItemDrop(body) => Ok(SkeletonAttr::from(body)), + _ => Err(()), + } + } +} + +impl Default for SkeletonAttr { + fn default() -> Self { + Self { + bone0: (0.0, 0.0, 0.0), + } + } +} + +impl<'a> From<&'a Body> for SkeletonAttr { + fn from(_body: &'a Body) -> Self { + Self { + bone0: (0.0, 0.0, 0.0), + } + } +} diff --git a/voxygen/anim/src/lib.rs b/voxygen/anim/src/lib.rs index f60ca96751..0f9e54c801 100644 --- a/voxygen/anim/src/lib.rs +++ b/voxygen/anim/src/lib.rs @@ -58,6 +58,7 @@ pub mod fish_medium; pub mod fish_small; pub mod fixture; pub mod golem; +pub mod item_drop; pub mod object; pub mod quadruped_low; pub mod quadruped_medium; diff --git a/voxygen/egui/src/lib.rs b/voxygen/egui/src/lib.rs index 58c92fb168..c309887c80 100644 --- a/voxygen/egui/src/lib.rs +++ b/voxygen/egui/src/lib.rs @@ -728,6 +728,7 @@ fn body_species(body: &Body) -> String { Body::BipedLarge(body) => format!("{:?}", body.species), Body::BipedSmall(body) => format!("{:?}", body.species), Body::Object(body) => format!("{:?}", body), + Body::ItemDrop(body) => format!("{:?}", body), Body::Golem(body) => format!("{:?}", body.species), Body::Theropod(body) => format!("{:?}", body.species), Body::QuadrupedLow(body) => format!("{:?}", body.species), diff --git a/voxygen/src/hud/crafting.rs b/voxygen/src/hud/crafting.rs index 6266690f1e..c9426f6685 100644 --- a/voxygen/src/hud/crafting.rs +++ b/voxygen/src/hud/crafting.rs @@ -1,7 +1,7 @@ use super::{ get_quality_col, img_ids::{Imgs, ImgsRot}, - item_imgs::{animate_by_pulse, ItemImgs, ItemKey::Tool}, + item_imgs::{animate_by_pulse, ItemImgs}, Show, TEXT_COLOR, TEXT_DULL_RED_COLOR, TEXT_GRAY_COLOR, UI_HIGHLIGHT_0, UI_MAIN, }; use crate::ui::{ @@ -13,7 +13,8 @@ use common::{ assets::AssetExt, comp::{ item::{ - ItemDef, ItemDesc, ItemKind, ItemTag, MaterialStatManifest, Quality, TagExampleInfo, + item_key::ItemKey, ItemDef, ItemDesc, ItemKind, ItemTag, MaterialStatManifest, Quality, + TagExampleInfo, }, Inventory, }, @@ -634,7 +635,7 @@ impl<'a> Widget for Crafting<'a> { Button::image(animate_by_pulse( &self .item_imgs - .img_ids_or_not_found_img(Tool(station_img_str.to_string())), + .img_ids_or_not_found_img(ItemKey::Tool(station_img_str.to_string())), self.pulse, )) .image_color(color::LIGHT_RED) @@ -815,7 +816,7 @@ impl<'a> Widget for Crafting<'a> { Image::new(animate_by_pulse( &self .item_imgs - .img_ids_or_not_found_img(Tool(station_img.to_string())), + .img_ids_or_not_found_img(ItemKey::Tool(station_img.to_string())), self.pulse, )) .w_h(25.0, 25.0) @@ -1056,7 +1057,7 @@ impl<'a> Widget for Crafting<'a> { Image::new(animate_by_pulse( &self .item_imgs - .img_ids_or_not_found_img(Tool("DismantlingBench".to_string())), + .img_ids_or_not_found_img(ItemKey::Tool("DismantlingBench".to_string())), self.pulse, )) .wh([size; 2]) diff --git a/voxygen/src/hud/diary.rs b/voxygen/src/hud/diary.rs index eea5901611..fe7fa67c4a 100644 --- a/voxygen/src/hud/diary.rs +++ b/voxygen/src/hud/diary.rs @@ -1,6 +1,6 @@ use super::{ img_ids::{Imgs, ImgsRot}, - item_imgs::{animate_by_pulse, ItemImgs, ItemKey::Tool}, + item_imgs::{animate_by_pulse, ItemImgs}, Position, PositionSpecifier, Show, BLACK, CRITICAL_HP_COLOR, HP_COLOR, TEXT_COLOR, UI_HIGHLIGHT_0, UI_MAIN, XP_COLOR, }; @@ -34,6 +34,7 @@ use common::{ ability::{Ability, ActiveAbilities, AuxiliaryAbility, MAX_ABILITIES}, inventory::{ item::{ + item_key::ItemKey, tool::{MaterialStatManifest, ToolKind}, ItemKind, }, @@ -1358,7 +1359,7 @@ impl<'a> Diary<'a> { Image::new(animate_by_pulse( &self .item_imgs - .img_ids_or_not_found_img(Tool("example_general_combat_left".to_string())), + .img_ids_or_not_found_img(ItemKey::Tool("example_general_combat_left".to_string())), self.pulse, )) .wh(ART_SIZE) @@ -1367,9 +1368,9 @@ impl<'a> Diary<'a> { .set(state.ids.general_combat_render_0, ui); Image::new(animate_by_pulse( - &self - .item_imgs - .img_ids_or_not_found_img(Tool("example_general_combat_right".to_string())), + &self.item_imgs.img_ids_or_not_found_img(ItemKey::Tool( + "example_general_combat_right".to_string(), + )), self.pulse, )) .wh(ART_SIZE) @@ -1536,7 +1537,7 @@ impl<'a> Diary<'a> { Image::new(animate_by_pulse( &self .item_imgs - .img_ids_or_not_found_img(Tool("example_sword".to_string())), + .img_ids_or_not_found_img(ItemKey::Tool("example_sword".to_string())), self.pulse, )) .wh(ART_SIZE) @@ -1707,7 +1708,7 @@ impl<'a> Diary<'a> { Image::new(animate_by_pulse( &self .item_imgs - .img_ids_or_not_found_img(Tool("example_hammer".to_string())), + .img_ids_or_not_found_img(ItemKey::Tool("example_hammer".to_string())), self.pulse, )) .wh(ART_SIZE) @@ -1865,7 +1866,7 @@ impl<'a> Diary<'a> { Image::new(animate_by_pulse( &self .item_imgs - .img_ids_or_not_found_img(Tool("example_axe".to_string())), + .img_ids_or_not_found_img(ItemKey::Tool("example_axe".to_string())), self.pulse, )) .wh(ART_SIZE) @@ -2023,7 +2024,7 @@ impl<'a> Diary<'a> { Image::new(animate_by_pulse( &self .item_imgs - .img_ids_or_not_found_img(Tool("example_sceptre".to_string())), + .img_ids_or_not_found_img(ItemKey::Tool("example_sceptre".to_string())), self.pulse, )) .wh(ART_SIZE) @@ -2175,7 +2176,7 @@ impl<'a> Diary<'a> { Image::new(animate_by_pulse( &self .item_imgs - .img_ids_or_not_found_img(Tool("example_bow".to_string())), + .img_ids_or_not_found_img(ItemKey::Tool("example_bow".to_string())), self.pulse, )) .wh(ART_SIZE) @@ -2333,7 +2334,7 @@ impl<'a> Diary<'a> { Image::new(animate_by_pulse( &self .item_imgs - .img_ids_or_not_found_img(Tool("example_staff_fire".to_string())), + .img_ids_or_not_found_img(ItemKey::Tool("example_staff_fire".to_string())), self.pulse, )) .wh(ART_SIZE) @@ -2480,7 +2481,7 @@ impl<'a> Diary<'a> { Image::new(animate_by_pulse( &self .item_imgs - .img_ids_or_not_found_img(Tool("example_pick".to_string())), + .img_ids_or_not_found_img(ItemKey::Tool("example_pick".to_string())), self.pulse, )) .wh(ART_SIZE) diff --git a/voxygen/src/hud/hotbar.rs b/voxygen/src/hud/hotbar.rs index f0a94ace5c..2a13ef58a0 100644 --- a/voxygen/src/hud/hotbar.rs +++ b/voxygen/src/hud/hotbar.rs @@ -1,5 +1,7 @@ -use crate::hud::item_imgs::ItemKey; -use common::comp::{self, inventory::item::Item}; +use common::comp::{ + self, + inventory::item::{item_key::ItemKey, Item}, +}; use serde::{Deserialize, Serialize}; #[derive(Clone, Copy, Debug, PartialEq)] diff --git a/voxygen/src/hud/item_imgs.rs b/voxygen/src/hud/item_imgs.rs index 0d39f9d2ed..09ef6478d7 100644 --- a/voxygen/src/hud/item_imgs.rs +++ b/voxygen/src/hud/item_imgs.rs @@ -1,10 +1,7 @@ use crate::ui::{Graphic, SampleStrat, Transform, Ui}; use common::{ assets::{self, AssetExt, AssetHandle, DotVoxAsset, ReloadWatcher}, - comp::item::{ - armor::{Armor, ArmorKind}, - Glider, ItemDef, ItemDesc, ItemKind, Lantern, Throwable, Utility, - }, + comp::item::item_key::ItemKey, figure::Segment, }; use conrod_core::image::Id; @@ -20,48 +17,6 @@ pub fn animate_by_pulse(ids: &[Id], pulse: f32) -> Id { ids[animation_frame % ids.len()] } -#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -pub enum ItemKey { - Tool(String), - ModularComponent(String), - Lantern(String), - Glider(String), - Armor(ArmorKind), - Utility(Utility), - Consumable(String), - Throwable(Throwable), - Ingredient(String), - TagExamples(Vec), - Empty, -} - -impl From<&T> for ItemKey { - fn from(item_desc: &T) -> Self { - let item_kind = item_desc.kind(); - let item_definition_id = item_desc.item_definition_id(); - - match item_kind { - ItemKind::Tool(_) => ItemKey::Tool(item_definition_id.to_owned()), - ItemKind::ModularComponent(_) => { - ItemKey::ModularComponent(item_definition_id.to_owned()) - }, - ItemKind::Lantern(Lantern { kind, .. }) => ItemKey::Lantern(kind.clone()), - ItemKind::Glider(Glider { kind, .. }) => ItemKey::Glider(kind.clone()), - ItemKind::Armor(Armor { kind, .. }) => ItemKey::Armor(kind.clone()), - ItemKind::Utility { kind, .. } => ItemKey::Utility(*kind), - ItemKind::Consumable { .. } => ItemKey::Consumable(item_definition_id.to_owned()), - ItemKind::Throwable { kind, .. } => ItemKey::Throwable(*kind), - ItemKind::Ingredient { kind, .. } => ItemKey::Ingredient(kind.clone()), - ItemKind::TagExamples { item_ids } => ItemKey::TagExamples( - item_ids - .iter() - .map(|id| ItemKey::from(&*Arc::::load_expect_cloned(id))) - .collect(), - ), - } - } -} - #[derive(Serialize, Deserialize)] enum ImageSpec { Png(String), @@ -97,6 +52,7 @@ impl ImageSpec { } } } + #[derive(Serialize, Deserialize)] struct ItemImagesSpec(HashMap); impl assets::Asset for ItemImagesSpec { diff --git a/voxygen/src/hud/slots.rs b/voxygen/src/hud/slots.rs index 5c8f58973e..1a970396dc 100644 --- a/voxygen/src/hud/slots.rs +++ b/voxygen/src/hud/slots.rs @@ -1,14 +1,14 @@ use super::{ hotbar::{self, Slot as HotbarSlot}, img_ids, - item_imgs::{ItemImgs, ItemKey}, + item_imgs::ItemImgs, util, }; use crate::ui::slot::{self, SlotKey, SumSlot}; use common::comp::{ ability::{Ability, AbilityInput, AuxiliaryAbility}, slot::InvSlotId, - ActiveAbilities, Body, Energy, Inventory, SkillSet, + ActiveAbilities, Body, Energy, Inventory, ItemKey, SkillSet, }; use conrod_core::{image, Color}; use specs::Entity as EcsEntity; diff --git a/voxygen/src/scene/figure/cache.rs b/voxygen/src/scene/figure/cache.rs index 84b441f5be..e2a07d077a 100644 --- a/voxygen/src/scene/figure/cache.rs +++ b/voxygen/src/scene/figure/cache.rs @@ -14,6 +14,7 @@ use common::{ }, item::{ armor::{Armor, ArmorKind}, + item_key::ItemKey, Item, ItemKind, }, CharacterState, @@ -60,9 +61,12 @@ const LOD_COUNT: usize = 3; type FigureModelEntryLod<'b> = Option<&'b FigureModelEntry>; #[derive(Clone, Eq, Hash, PartialEq)] +/// TODO: merge item_key and extra field into an enum pub struct FigureKey { /// Body pointed to by this key. pub(super) body: Body, + /// Only used by Body::ItemDrop + pub item_key: Option>, /// Extra state. pub(super) extra: Option>, } @@ -323,10 +327,12 @@ where _tick: u64, camera_mode: CameraMode, character_state: Option<&CharacterState>, + item_key: Option, ) -> FigureModelEntryLod<'b> { // TODO: Use raw entries to avoid lots of allocation (among other things). let key = FigureKey { body, + item_key: item_key.map(Arc::new), extra: inventory.map(|inventory| { Arc::new(CharacterCacheKey::from( character_state, @@ -343,6 +349,7 @@ where } } + #[allow(clippy::too_many_arguments)] pub fn get_or_create_model<'c>( &'c mut self, renderer: &mut Renderer, @@ -354,6 +361,7 @@ where camera_mode: CameraMode, character_state: Option<&CharacterState>, slow_jobs: &SlowJobPool, + item_key: Option, ) -> (FigureModelEntryLod<'c>, &'c Skel::Attr) where for<'a> &'a Skel::Body: Into, @@ -363,6 +371,7 @@ where let skeleton_attr = (&body).into(); let key = FigureKey { body, + item_key: item_key.map(Arc::new), extra: inventory.map(|inventory| { Arc::new(CharacterCacheKey::from( character_state, @@ -417,7 +426,8 @@ where slow_jobs.spawn("FIGURE_MESHING", move || { // First, load all the base vertex data. - let meshes = ::bone_meshes(&key, &manifests, extra); + let meshes = + ::bone_meshes(&key, &manifests, extra); // Then, set up meshing context. let mut greedy = FigureModel::make_greedy(); @@ -447,9 +457,7 @@ where .filter_map(|(i, bm)| bm.as_ref().map(|bm| (i as u8, bm))) .for_each(|(i, (segment, offset))| { // Generate this mesh. - let (_opaque_mesh, bounds) = - generate_mesh(&mut greedy, &mut opaque, segment, *offset, i); - + let (_opaque_mesh, bounds) = generate_mesh(&mut greedy, &mut opaque, segment, *offset, i); // Update the figure bounds to the largest granularity seen so far // (NOTE: this is more than a little imperfect). // diff --git a/voxygen/src/scene/figure/load.rs b/voxygen/src/scene/figure/load.rs index 367d9c03a4..4376943aa5 100644 --- a/voxygen/src/scene/figure/load.rs +++ b/voxygen/src/scene/figure/load.rs @@ -12,8 +12,8 @@ use common::{ fish_small::{self, BodyType as FSBodyType, Species as FSSpecies}, golem::{self, BodyType as GBodyType, Species as GSpecies}, humanoid::{self, Body, BodyType, EyeColor, Skin, Species}, - item::{ItemDef, ModularComponentKind}, - object, + item::{item_key::ItemKey, ItemDef, ModularComponentKind}, + item_drop, object, quadruped_low::{self, BodyType as QLBodyType, Species as QLSpecies}, quadruped_medium::{self, BodyType as QMBodyType, Species as QMSpecies}, quadruped_small::{self, BodyType as QSBodyType, Species as QSSpecies}, @@ -23,7 +23,7 @@ use common::{ }, theropod::{self, BodyType as TBodyType, Species as TSpecies}, }, - figure::{Cell, DynaUnionizer, MatSegment, Material, Segment}, + figure::{Cell, DynaUnionizer, MatCell, MatSegment, Material, Segment}, vol::Vox, }; use hashbrown::HashMap; @@ -137,7 +137,6 @@ macro_rules! make_vox_spec { type Manifests = AssetHandle; type Extra = (); - #[allow(unused_variables)] fn load_spec() -> Result { Self::Spec::load("") } @@ -398,7 +397,7 @@ make_vox_spec!( // TODO: Add these. /* tabard: HumArmorTabardSpec = "voxygen.voxel.humanoid_armor_tabard_manifest", */ }, - |FigureKey { body, extra }, spec| { + |FigureKey { body, item_key: _, extra }, spec| { const DEFAULT_LOADOUT: super::cache::CharacterCacheKey = super::cache::CharacterCacheKey { third_person: None, tool: None, @@ -2888,7 +2887,7 @@ make_vox_spec!( armor_tail: BipedSmallArmorTailSpec = "voxygen.voxel.biped_small_armor_tail_manifest", }, - |FigureKey { body: _, extra }, spec| { + |FigureKey { body: _, item_key: _, extra }, spec| { const DEFAULT_LOADOUT: super::cache::CharacterCacheKey = super::cache::CharacterCacheKey { third_person: None, tool: None, @@ -3917,7 +3916,7 @@ make_vox_spec!( main: BipedLargeMainSpec = "voxygen.voxel.biped_weapon_manifest", second: BipedLargeSecondSpec = "voxygen.voxel.biped_weapon_manifest", }, - |FigureKey { body, extra }, spec| { + |FigureKey { body, item_key: _, extra }, spec| { const DEFAULT_LOADOUT: super::cache::CharacterCacheKey = super::cache::CharacterCacheKey { third_person: None, tool: None, @@ -4902,6 +4901,75 @@ impl ObjectCentralSpec { } } +#[derive(Deserialize)] +struct ItemDropCentralSpec(HashMap); + +make_vox_spec!( + item_drop::Body, + struct ItemDropSpec { + central: ItemDropCentralSpec = "voxygen.voxel.item_drop_manifest", + }, + | FigureKey { body, item_key, .. }, spec| { + [ + Some(spec.central.read().0.mesh_bone0(body, item_key.as_deref().unwrap_or(&ItemKey::Empty))), + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + ] + }, +); + +impl ItemDropCentralSpec { + fn mesh_bone0(&self, item_drop: &item_drop::Body, item_key: &ItemKey) -> BoneMeshes { + let coin_pouch = ( + "voxel.object.pouch".to_string(), + [-5.0, -5.0, 0.0], + [-10.0, 15.0, 0.0], + 0.8, + ); + + if let Some(spec) = match item_drop { + item_drop::Body::CoinPouch => Some(&coin_pouch), + _ => self.0.get(item_key), + } { + let full_spec: String = ["voxygen.", spec.0.as_str()].concat(); + ( + match item_drop { + item_drop::Body::Armor(_) => { + MatSegment::from(&graceful_load_vox_fullspec(&full_spec).read().0) + .map(|mat_cell| match mat_cell { + MatCell::None => None, + MatCell::Mat(_) => Some(MatCell::None), + MatCell::Normal(data) => data.is_hollow().then(|| MatCell::None), + }) + .to_segment(|_| Default::default()) + }, + _ => graceful_load_segment_fullspec(&full_spec), + }, + Vec3::from(spec.1), + ) + } else { + error!( + "No specification exists for {:?}, {:?}", + item_drop, item_key + ); + load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)) + } + } +} + fn mesh_ship_bone &ShipCentralSubSpec>( map: &HashMap, obj: &K, @@ -4925,7 +4993,6 @@ impl BodySpec for ship::Body { type Manifests = AssetHandle; type Spec = ShipSpec; - #[allow(unused_variables)] fn load_spec() -> Result { Self::Spec::load("") } fn reload_watcher(manifests: &Self::Manifests) -> ReloadWatcher { manifests.reload_watcher() } diff --git a/voxygen/src/scene/figure/mod.rs b/voxygen/src/scene/figure/mod.rs index 6b230f011d..4cc49b93d9 100644 --- a/voxygen/src/scene/figure/mod.rs +++ b/voxygen/src/scene/figure/mod.rs @@ -24,16 +24,17 @@ use anim::{ arthropod::ArthropodSkeleton, biped_large::BipedLargeSkeleton, biped_small::BipedSmallSkeleton, bird_large::BirdLargeSkeleton, bird_medium::BirdMediumSkeleton, character::CharacterSkeleton, dragon::DragonSkeleton, fish_medium::FishMediumSkeleton, fish_small::FishSmallSkeleton, - golem::GolemSkeleton, object::ObjectSkeleton, quadruped_low::QuadrupedLowSkeleton, - quadruped_medium::QuadrupedMediumSkeleton, quadruped_small::QuadrupedSmallSkeleton, - ship::ShipSkeleton, theropod::TheropodSkeleton, Animation, Skeleton, + golem::GolemSkeleton, item_drop::ItemDropSkeleton, object::ObjectSkeleton, + quadruped_low::QuadrupedLowSkeleton, quadruped_medium::QuadrupedMediumSkeleton, + quadruped_small::QuadrupedSmallSkeleton, ship::ShipSkeleton, theropod::TheropodSkeleton, + Animation, Skeleton, }; use common::{ comp::{ inventory::slot::EquipSlot, item::{Hands, ItemKind, ToolKind}, - Body, CharacterState, Collider, Controller, Health, Inventory, Item, Last, LightAnimation, - LightEmitter, Ori, PhysicsState, PoiseState, Pos, Scale, Vel, + Body, CharacterState, Collider, Controller, Health, Inventory, Item, ItemKey, Last, + LightAnimation, LightEmitter, Ori, PhysicsState, PoiseState, Pos, Scale, Vel, }, link::Is, mounting::Rider, @@ -117,6 +118,7 @@ struct FigureMgrStates { biped_small_states: HashMap>, golem_states: HashMap>, object_states: HashMap>, + item_drop_states: HashMap>, ship_states: HashMap>, volume_states: HashMap>, arthropod_states: HashMap>, @@ -139,6 +141,7 @@ impl FigureMgrStates { biped_small_states: HashMap::new(), golem_states: HashMap::new(), object_states: HashMap::new(), + item_drop_states: HashMap::new(), ship_states: HashMap::new(), volume_states: HashMap::new(), arthropod_states: HashMap::new(), @@ -202,6 +205,10 @@ impl FigureMgrStates { .map(DerefMut::deref_mut), Body::Golem(_) => self.golem_states.get_mut(entity).map(DerefMut::deref_mut), Body::Object(_) => self.object_states.get_mut(entity).map(DerefMut::deref_mut), + Body::ItemDrop(_) => self + .item_drop_states + .get_mut(entity) + .map(DerefMut::deref_mut), Body::Ship(ship) => { if ship.manifest_entry().is_some() { self.ship_states.get_mut(entity).map(DerefMut::deref_mut) @@ -236,6 +243,7 @@ impl FigureMgrStates { Body::BipedSmall(_) => self.biped_small_states.remove(entity).map(|e| e.meta), Body::Golem(_) => self.golem_states.remove(entity).map(|e| e.meta), Body::Object(_) => self.object_states.remove(entity).map(|e| e.meta), + Body::ItemDrop(_) => self.item_drop_states.remove(entity).map(|e| e.meta), Body::Ship(ship) => { if ship.manifest_entry().is_some() { self.ship_states.remove(entity).map(|e| e.meta) @@ -263,6 +271,7 @@ impl FigureMgrStates { self.biped_small_states.retain(|k, v| f(k, &mut *v)); self.golem_states.retain(|k, v| f(k, &mut *v)); self.object_states.retain(|k, v| f(k, &mut *v)); + self.item_drop_states.retain(|k, v| f(k, &mut *v)); self.ship_states.retain(|k, v| f(k, &mut *v)); self.volume_states.retain(|k, v| f(k, &mut *v)); self.arthropod_states.retain(|k, v| f(k, &mut *v)); @@ -284,6 +293,7 @@ impl FigureMgrStates { + self.biped_small_states.len() + self.golem_states.len() + self.object_states.len() + + self.item_drop_states.len() + self.ship_states.len() + self.volume_states.len() + self.arthropod_states.len() @@ -359,6 +369,11 @@ impl FigureMgrStates { .iter() .filter(|(_, c)| c.visible()) .count() + + self + .item_drop_states + .iter() + .filter(|(_, c)| c.visible()) + .count() + self .arthropod_states .iter() @@ -388,6 +403,7 @@ pub struct FigureMgr { biped_large_model_cache: FigureModelCache, biped_small_model_cache: FigureModelCache, object_model_cache: FigureModelCache, + item_drop_model_cache: FigureModelCache, ship_model_cache: FigureModelCache, golem_model_cache: FigureModelCache, volume_model_cache: FigureModelCache, @@ -412,6 +428,7 @@ impl FigureMgr { biped_large_model_cache: FigureModelCache::new(), biped_small_model_cache: FigureModelCache::new(), object_model_cache: FigureModelCache::new(), + item_drop_model_cache: FigureModelCache::new(), ship_model_cache: FigureModelCache::new(), golem_model_cache: FigureModelCache::new(), volume_model_cache: FigureModelCache::new(), @@ -446,6 +463,7 @@ impl FigureMgr { self.biped_small_model_cache .clean(&mut self.col_lights, tick); self.object_model_cache.clean(&mut self.col_lights, tick); + self.item_drop_model_cache.clean(&mut self.col_lights, tick); self.ship_model_cache.clean(&mut self.col_lights, tick); self.golem_model_cache.clean(&mut self.col_lights, tick); self.volume_model_cache.clean(&mut self.col_lights, tick); @@ -864,6 +882,7 @@ impl FigureMgr { player_camera_mode, player_character_state, &slow_jobs, + None, ); let holding_lantern = inventory @@ -1759,6 +1778,7 @@ impl FigureMgr { player_camera_mode, player_character_state, &slow_jobs, + None, ); let state = self @@ -1957,6 +1977,7 @@ impl FigureMgr { player_camera_mode, player_character_state, &slow_jobs, + None, ); let state = self @@ -2272,6 +2293,7 @@ impl FigureMgr { player_camera_mode, player_character_state, &slow_jobs, + None, ); let state = self @@ -2627,6 +2649,7 @@ impl FigureMgr { player_camera_mode, player_character_state, &slow_jobs, + None, ); let state = self @@ -2729,6 +2752,7 @@ impl FigureMgr { player_camera_mode, player_character_state, &slow_jobs, + None, ); let state = self @@ -2810,6 +2834,7 @@ impl FigureMgr { player_camera_mode, player_character_state, &slow_jobs, + None, ); let state = self @@ -3207,6 +3232,7 @@ impl FigureMgr { player_camera_mode, player_character_state, &slow_jobs, + None, ); let state = self.states.dragon_states.entry(entity).or_insert_with(|| { @@ -3292,6 +3318,7 @@ impl FigureMgr { player_camera_mode, player_character_state, &slow_jobs, + None, ); let state = self @@ -3469,6 +3496,7 @@ impl FigureMgr { player_camera_mode, player_character_state, &slow_jobs, + None, ); let state = self @@ -3759,6 +3787,7 @@ impl FigureMgr { player_camera_mode, player_character_state, &slow_jobs, + None, ); let state = self @@ -4080,6 +4109,7 @@ impl FigureMgr { player_camera_mode, player_character_state, &slow_jobs, + None, ); let state = self @@ -4161,6 +4191,7 @@ impl FigureMgr { player_camera_mode, player_character_state, &slow_jobs, + None, ); let state = self @@ -4781,6 +4812,7 @@ impl FigureMgr { player_camera_mode, player_character_state, &slow_jobs, + None, ); let state = self.states.golem_states.entry(entity).or_insert_with(|| { @@ -5020,6 +5052,7 @@ impl FigureMgr { player_camera_mode, player_character_state, &slow_jobs, + None, ); let state = self.states.object_states.entry(entity).or_insert_with(|| { @@ -5135,6 +5168,68 @@ impl FigureMgr { body, ); }, + Body::ItemDrop(body) => { + let item_key = item.map(ItemKey::from); + let (model, skeleton_attr) = self.item_drop_model_cache.get_or_create_model( + renderer, + &mut self.col_lights, + body, + inventory, + (), + tick, + player_camera_mode, + player_character_state, + &slow_jobs, + item_key, + ); + + let state = self + .states + .item_drop_states + .entry(entity) + .or_insert_with(|| { + FigureState::new(renderer, ItemDropSkeleton::default(), body) + }); + + // Average velocity relative to the current ground + let _rel_avg_vel = state.avg_vel - physics.ground_vel; + + let (character, last_character) = match (character, last_character) { + (Some(c), Some(l)) => (c, l), + _ => ( + &CharacterState::Idle(common::states::idle::Data { + is_sneaking: false, + }), + &Last { + 0: CharacterState::Idle(common::states::idle::Data { + is_sneaking: false, + }), + }, + ), + }; + + if !character.same_variant(&last_character.0) { + state.state_time = 0.0; + } + + let target_bones = anim::item_drop::IdleAnimation::update_skeleton( + &ItemDropSkeleton::default(), + time, + state.state_time, + &mut state_animation_rate, + skeleton_attr, + ); + + state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp); + state.update( + renderer, + &mut update_buf, + &common_params, + state_animation_rate, + model, + body, + ); + }, Body::Ship(body) => { let (model, skeleton_attr) = if let Some(Collider::Volume(vol)) = collider { let vk = VolumeKey { @@ -5151,6 +5246,7 @@ impl FigureMgr { player_camera_mode, player_character_state, &slow_jobs, + None, ); let state = self @@ -5180,6 +5276,7 @@ impl FigureMgr { player_camera_mode, player_character_state, &slow_jobs, + None, ) } else { // No way to determine model (this is okay, we might just not have received @@ -5282,6 +5379,7 @@ impl FigureMgr { ) { span!(_guard, "render_shadows", "FigureManager::render_shadows"); let ecs = state.ecs(); + let items = ecs.read_storage::(); ( &ecs.entities(), @@ -5312,6 +5410,7 @@ impl FigureMgr { _ => 0, }, |state| state.can_shadow_sun(), + if matches!(body, Body::ItemDrop(_)) { items.get(entity).map(ItemKey::from) } else { None }, ) { drawer.draw(model, bound); } @@ -5331,7 +5430,7 @@ impl FigureMgr { let character_state_storage = state.read_storage::(); let character_state = character_state_storage.get(player_entity); - + let items = ecs.read_storage::(); for (entity, pos, body, _, inventory, scale, collider) in ( &ecs.entities(), &ecs.read_storage::(), @@ -5362,6 +5461,11 @@ impl FigureMgr { _ => 0, }, |state| state.visible(), + if matches!(body, Body::ItemDrop(_)) { + items.get(entity).map(ItemKey::from) + } else { + None + }, ) { drawer.draw(model, bound, col_lights); } @@ -5381,6 +5485,7 @@ impl FigureMgr { let character_state_storage = state.read_storage::(); let character_state = character_state_storage.get(player_entity); + let items = ecs.read_storage::(); if let (Some(pos), Some(body)) = ( ecs.read_storage::().get(player_entity), @@ -5407,6 +5512,11 @@ impl FigureMgr { figure_lod_render_distance, 0, |state| state.visible(), + if matches!(body, Body::ItemDrop(_)) { + items.get(player_entity).map(ItemKey::from) + } else { + None + }, ) { drawer.draw(model, bound, col_lights); /*renderer.render_player_shadow( @@ -5435,6 +5545,7 @@ impl FigureMgr { figure_lod_render_distance: f32, mut_count: usize, filter_state: impl Fn(&FigureStateMeta) -> bool, + item_key: Option, ) -> Option { let body = *body; @@ -5462,6 +5573,7 @@ impl FigureMgr { biped_large_model_cache, biped_small_model_cache, object_model_cache, + item_drop_model_cache, ship_model_cache, golem_model_cache, volume_model_cache, @@ -5482,6 +5594,7 @@ impl FigureMgr { biped_small_states, golem_states, object_states, + item_drop_states, ship_states, volume_states, arthropod_states, @@ -5502,6 +5615,7 @@ impl FigureMgr { tick, player_camera_mode, character_state, + None, ), ) }), @@ -5518,6 +5632,7 @@ impl FigureMgr { tick, player_camera_mode, character_state, + None, ), ) }), @@ -5534,6 +5649,7 @@ impl FigureMgr { tick, player_camera_mode, character_state, + None, ), ) }), @@ -5550,6 +5666,7 @@ impl FigureMgr { tick, player_camera_mode, character_state, + None, ), ) }), @@ -5566,6 +5683,7 @@ impl FigureMgr { tick, player_camera_mode, character_state, + None, ), ) }), @@ -5582,6 +5700,7 @@ impl FigureMgr { tick, player_camera_mode, character_state, + None, ), ) }), @@ -5598,6 +5717,7 @@ impl FigureMgr { tick, player_camera_mode, character_state, + None, ), ) }), @@ -5614,6 +5734,7 @@ impl FigureMgr { tick, player_camera_mode, character_state, + None, ), ) }), @@ -5630,6 +5751,7 @@ impl FigureMgr { tick, player_camera_mode, character_state, + None, ), ) }), @@ -5646,6 +5768,7 @@ impl FigureMgr { tick, player_camera_mode, character_state, + None, ), ) }), @@ -5662,6 +5785,7 @@ impl FigureMgr { tick, player_camera_mode, character_state, + None, ), ) }), @@ -5678,6 +5802,7 @@ impl FigureMgr { tick, player_camera_mode, character_state, + None, ), ) }), @@ -5694,6 +5819,7 @@ impl FigureMgr { tick, player_camera_mode, character_state, + None, ), ) }), @@ -5710,6 +5836,7 @@ impl FigureMgr { tick, player_camera_mode, character_state, + None, ), ) }), @@ -5726,6 +5853,24 @@ impl FigureMgr { tick, player_camera_mode, character_state, + None, + ), + ) + }), + Body::ItemDrop(body) => item_drop_states + .get(&entity) + .filter(|state| filter_state(*state)) + .map(move |state| { + ( + state.bound(), + item_drop_model_cache.get_model( + col_lights, + body, + inventory, + tick, + player_camera_mode, + character_state, + item_key, ), ) }), @@ -5744,6 +5889,7 @@ impl FigureMgr { tick, player_camera_mode, character_state, + None, ), ) }) @@ -5761,6 +5907,7 @@ impl FigureMgr { tick, player_camera_mode, character_state, + None, ), ) }) diff --git a/voxygen/src/scene/simple.rs b/voxygen/src/scene/simple.rs index e41c919fe1..f6fc3b6d28 100644 --- a/voxygen/src/scene/simple.rs +++ b/voxygen/src/scene/simple.rs @@ -325,6 +325,7 @@ impl Scene { CameraMode::default(), None, scene_data.slow_job_pool, + None, ) .0; let mut buf = [Default::default(); anim::MAX_BONE_COUNT]; @@ -369,6 +370,7 @@ impl Scene { tick, CameraMode::default(), None, + None, ); if let Some((model, figure_state)) = model.zip(self.figure_state.as_ref()) { diff --git a/voxygen/src/ui/widgets/item_tooltip.rs b/voxygen/src/ui/widgets/item_tooltip.rs index e2b25c0526..bde83ebd0f 100644 --- a/voxygen/src/ui/widgets/item_tooltip.rs +++ b/voxygen/src/ui/widgets/item_tooltip.rs @@ -2,7 +2,7 @@ use super::image_frame::ImageFrame; use crate::hud::{ get_quality_col, img_ids::Imgs, - item_imgs::{animate_by_pulse, ItemImgs, ItemKey}, + item_imgs::{animate_by_pulse, ItemImgs}, util, }; use client::Client; @@ -11,6 +11,7 @@ use common::{ comp::{ item::{ armor::{ArmorKind, Protection}, + item_key::ItemKey, Item, ItemDesc, ItemKind, ItemTag, MaterialStatManifest, Quality, }, Energy,