From 73b25d19f0ef74d99a57591a1a037b7b2adeaea2 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 5 Oct 2014 19:49:26 +0200 Subject: [PATCH 001/129] First merging of weaponry into tinkers --- build.properties | 2 +- item_texture_backup.zip | Bin 0 -> 1362139 bytes resources/assets/tinker/sounds.json | 18 + .../assets/tinker/textures/gui/Crosshair.png | Bin 0 -> 190 bytes .../assets/tinker/textures/gui/Crosshair2.png | Bin 0 -> 185 bytes .../assets/tinker/textures/gui/Crosshair3.png | Bin 0 -> 218 bytes .../assets/tinker/textures/gui/Crosshair4.png | Bin 0 -> 233 bytes .../assets/tinker/textures/gui/icons.png | Bin 8643 -> 8887 bytes .../textures/items/arrow/_arrow_fletching.png | Bin 118 -> 201 bytes .../textures/items/arrow/_arrow_head.png | Bin 199 -> 179 bytes .../textures/items/arrow/_arrow_shaft.png | Bin 193 -> 164 bytes .../items/arrow/alumite_arrow_head.png | Bin 107 -> 208 bytes .../items/arrow/alumite_arrow_shaft.png | Bin 100 -> 0 bytes .../items/arrow/ardite_arrow_head.png | Bin 105 -> 209 bytes .../items/arrow/ardite_arrow_shaft.png | Bin 94 -> 0 bytes .../items/arrow/beheading_arrow_effect.png | Bin 133 -> 238 bytes .../items/arrow/blaze_arrow_effect.png | Bin 126 -> 263 bytes .../items/arrow/blaze_arrow_shaft.png | Bin 0 -> 222 bytes .../items/arrow/blueslime_arrow_fletching.png | Bin 119 -> 199 bytes .../items/arrow/blueslime_arrow_head.png | Bin 198 -> 213 bytes .../items/arrow/blueslime_arrow_shaft.png | Bin 212 -> 0 bytes .../textures/items/arrow/bone_arrow_head.png | Bin 107 -> 203 bytes .../textures/items/arrow/bone_arrow_shaft.png | Bin 101 -> 195 bytes .../items/arrow/bronze_arrow_head.png | Bin 106 -> 214 bytes .../items/arrow/bronze_arrow_shaft.png | Bin 99 -> 0 bytes .../items/arrow/cactus_arrow_head.png | Bin 106 -> 194 bytes .../items/arrow/cactus_arrow_shaft.png | Bin 114 -> 0 bytes .../items/arrow/cobalt_arrow_head.png | Bin 106 -> 202 bytes .../items/arrow/cobalt_arrow_shaft.png | Bin 96 -> 0 bytes .../items/arrow/copper_arrow_head.png | Bin 106 -> 215 bytes .../items/arrow/copper_arrow_shaft.png | Bin 96 -> 0 bytes .../items/arrow/diamond_arrow_effect.png | Bin 90 -> 171 bytes .../items/arrow/emerald_arrow_effect.png | Bin 100 -> 173 bytes .../items/arrow/feather_arrow_fletching.png | Bin 118 -> 201 bytes .../textures/items/arrow/flint_arrow_head.png | Bin 110 -> 191 bytes .../items/arrow/flint_arrow_shaft.png | Bin 101 -> 0 bytes .../items/arrow/flux_arrow_effect.png | Bin 1207 -> 442 bytes .../textures/items/arrow/ice_arrow_effect.png | Bin 112 -> 195 bytes .../textures/items/arrow/iron_arrow_head.png | Bin 104 -> 196 bytes .../textures/items/arrow/iron_arrow_shaft.png | Bin 99 -> 0 bytes .../items/arrow/lapis_arrow_effect.png | Bin 96 -> 178 bytes .../items/arrow/lava_arrow_effect.png | Bin 101 -> 174 bytes .../items/arrow/leaf_arrow_fletching.png | Bin 119 -> 199 bytes .../items/arrow/manyullyn_arrow_head.png | Bin 106 -> 219 bytes .../items/arrow/manyullyn_arrow_shaft.png | Bin 96 -> 0 bytes .../items/arrow/moss_arrow_effect.png | Bin 102 -> 204 bytes .../items/arrow/necrotic_arrow_effect.png | Bin 108 -> 210 bytes .../items/arrow/netherrack_arrow_head.png | Bin 116 -> 226 bytes .../items/arrow/netherrack_arrow_shaft.png | Bin 126 -> 0 bytes .../items/arrow/obsidian_arrow_head.png | Bin 106 -> 208 bytes .../items/arrow/obsidian_arrow_shaft.png | Bin 105 -> 0 bytes .../textures/items/arrow/paper_arrow_head.png | Bin 109 -> 198 bytes .../items/arrow/paper_arrow_shaft.png | Bin 111 -> 0 bytes .../items/arrow/pigiron_arrow_fletching.png | Bin 242 -> 0 bytes .../items/arrow/pigiron_arrow_head.png | Bin 226 -> 192 bytes .../items/arrow/pigiron_arrow_shaft.png | Bin 211 -> 0 bytes .../items/arrow/piston_arrow_effect.png | Bin 118 -> 200 bytes .../items/arrow/quartz_arrow_effect.png | Bin 109 -> 195 bytes .../items/arrow/redstone_arrow_effect.png | Bin 93 -> 168 bytes .../textures/items/arrow/reed_arrow_shaft.png | Bin 0 -> 241 bytes .../items/arrow/reinforced_arrow_effect.png | Bin 100 -> 185 bytes .../items/arrow/silk_arrow_effect.png | Bin 110 -> 213 bytes .../items/arrow/slime_arrow_fletching.png | Bin 119 -> 199 bytes .../textures/items/arrow/slime_arrow_head.png | Bin 106 -> 214 bytes .../items/arrow/slime_arrow_shaft.png | Bin 100 -> 0 bytes .../items/arrow/smite_arrow_effect.png | Bin 164 -> 284 bytes .../items/arrow/spider_arrow_effect.png | Bin 97 -> 176 bytes .../textures/items/arrow/steel_arrow_head.png | Bin 187 -> 199 bytes .../items/arrow/steel_arrow_shaft.png | Bin 157 -> 0 bytes .../textures/items/arrow/stone_arrow_head.png | Bin 106 -> 205 bytes .../items/arrow/stone_arrow_shaft.png | Bin 96 -> 0 bytes .../items/arrow/thaumium_arrow_head.png | Bin 116 -> 230 bytes .../items/arrow/thaumium_arrow_shaft.png | Bin 104 -> 0 bytes .../textures/items/arrow/wood_arrow_head.png | Bin 106 -> 210 bytes .../textures/items/arrow/wood_arrow_shaft.png | Bin 100 -> 195 bytes .../textures/items/bolt/_bolt_fletching.png | Bin 0 -> 183 bytes .../items/bolt/_bolt_head - Kopie.png | Bin 0 -> 196 bytes .../tinker/textures/items/bolt/_bolt_head.png | Bin 0 -> 199 bytes .../textures/items/bolt/_bolt_shaft.png | Bin 0 -> 172 bytes .../textures/items/crossbow/_crossbow.xcf | Bin 0 -> 2758 bytes .../textures/items/crossbow/_crossbow_1.xcf | Bin 0 -> 3330 bytes .../textures/items/crossbow/_crossbow_2.xcf | Bin 0 -> 2835 bytes .../textures/items/crossbow/_crossbow_3.xcf | Bin 0 -> 2851 bytes .../items/crossbow/_crossbow_3_meh.xcf | Bin 0 -> 3013 bytes .../items/crossbow/_crossbow_binding.png | Bin 0 -> 249 bytes .../items/crossbow/_crossbow_body.png | Bin 0 -> 279 bytes .../textures/items/crossbow/_crossbow_bow.png | Bin 0 -> 291 bytes .../items/crossbow/_crossbow_bow_1.png | Bin 0 -> 291 bytes .../items/crossbow/_crossbow_bow_2.png | Bin 0 -> 304 bytes .../items/crossbow/_crossbow_bow_3.png | Bin 0 -> 289 bytes .../items/crossbow/_crossbow_string.png | Bin 0 -> 248 bytes .../items/crossbow/_crossbow_string_1.png | Bin 0 -> 282 bytes .../items/crossbow/_crossbow_string_2.png | Bin 0 -> 282 bytes .../items/crossbow/_crossbow_string_3.png | Bin 0 -> 280 bytes .../items/javelin/_javelin_accessory.png | Bin 0 -> 184 bytes .../items/javelin/_javelin_handle.png | Bin 0 -> 166 bytes .../textures/items/javelin/_javelin_head.png | Bin 0 -> 218 bytes .../textures/items/longbow/_bow_bottom.png | Bin 0 -> 244 bytes .../textures/items/longbow/_bow_bottom_1.png | Bin 0 -> 209 bytes .../textures/items/longbow/_bow_bottom_2.png | Bin 0 -> 211 bytes .../textures/items/longbow/_bow_bottom_3.png | Bin 0 -> 209 bytes .../textures/items/longbow/_bow_grip.png | Bin 0 -> 264 bytes .../textures/items/longbow/_bow_top.png | Bin 0 -> 228 bytes .../textures/items/longbow/_bow_top_1.png | Bin 0 -> 209 bytes .../textures/items/longbow/_bow_top_2.png | Bin 0 -> 211 bytes .../textures/items/longbow/_bow_top_3.png | Bin 0 -> 205 bytes .../textures/items/longbow/_bowstring.png | Bin 0 -> 314 bytes .../textures/items/longbow/_bowstring_1.png | Bin 0 -> 360 bytes .../textures/items/longbow/_bowstring_2.png | Bin 0 -> 363 bytes .../textures/items/longbow/_bowstring_3.png | Bin 0 -> 166 bytes .../items/longbow/_bowstring_broken.png | Bin 0 -> 161 bytes .../textures/items/longbow/complete.png | Bin 0 -> 209 bytes .../textures/items/longbow/complete.xcf | Bin 0 -> 2340 bytes .../textures/items/parts/_arrow_shaft.png | Bin 0 -> 193 bytes .../tinker/textures/items/parts/_bolt.png | Bin 0 -> 172 bytes .../tinker/textures/items/parts/_bolt_2.png | Bin 0 -> 199 bytes .../tinker/textures/items/parts/_bow_limb.png | Bin 0 -> 283 bytes .../textures/items/parts/_crossbow_body.png | Bin 0 -> 322 bytes .../textures/items/parts/_crossbow_limb.png | Bin 0 -> 256 bytes .../tinker/textures/items/parts/_shuriken.png | Bin 0 -> 305 bytes .../textures/items/parts/iron_shuriken.png | Bin 0 -> 251 bytes .../textures/items/patterns/cast_bowlimb.png | Bin 0 -> 513 bytes .../items/patterns/cast_crossbowbody.png | Bin 0 -> 601 bytes .../items/patterns/cast_crossbowlimb.png | Bin 0 -> 551 bytes .../textures/items/patterns/cast_shuriken.png | Bin 0 -> 546 bytes .../items/patterns/pattern_bowlimb.png | Bin 0 -> 483 bytes .../items/patterns/pattern_crossbowbody.png | Bin 0 -> 488 bytes .../items/patterns/pattern_crossbowlimb.png | Bin 0 -> 452 bytes .../items/patterns/pattern_shuriken.png | Bin 0 -> 460 bytes .../textures/items/shortbow/_bowstring.png | Bin 291 -> 304 bytes .../textures/items/shortbow/_bowstring_1.png | Bin 336 -> 339 bytes .../textures/items/shortbow/_bowstring_2.png | Bin 350 -> 371 bytes .../textures/items/shortbow/_bowstring_3.png | Bin 166 -> 178 bytes .../items/shortbow/_bowstring_broken.png | Bin 161 -> 174 bytes .../items/shuriken/_shuriken - Kopie.png | Bin 0 -> 293 bytes .../textures/items/shuriken/_shuriken.png | Bin 0 -> 254 bytes .../textures/items/shuriken/iron_shuriken.png | Bin 0 -> 242 bytes .../items/throwingknife/_knife_blade.png | Bin 0 -> 477 bytes .../items/throwingknife/_knife_handle.png | Bin 0 -> 292 bytes .../items/throwingknife/iron_knife_blade.png | Bin 0 -> 340 bytes .../items/throwingknife/iron_knife_handle.png | Bin 0 -> 127 bytes .../tconstruct/weaponry/TinkerWeaponry.java | 317 +++++++++ .../weaponry/WeaponryClientProxy.java | 114 ++++ .../weaponry/WeaponryCommonProxy.java | 14 + .../tconstruct/weaponry/WeaponryHandler.java | 189 ++++++ .../tconstruct/weaponry/ammo/ArrowAmmo.java | 124 ++++ .../tconstruct/weaponry/ammo/BoltAmmo.java | 93 +++ .../weaponry/client/AmmoSlotHandler.java | 57 ++ .../weaponry/client/CrosshairHandler.java | 161 +++++ .../weaponry/client/CrosshairType.java | 12 + .../weaponry/client/IconFlipped.java | 22 + .../weaponry/client/RenderEventHandler.java | 44 ++ .../entityrenderer/ArrowEntityRenderer.java | 51 ++ .../entityrenderer/JavelinEntityRenderer.java | 29 + .../ProjectileBaseRenderer.java | 86 +++ .../ShurikenEntityRenderer.java | 30 + .../client/renderer/AmmoItemRenderer.java | 56 ++ .../weaponry/client/renderer/BowRenderer.java | 114 ++++ .../client/renderer/CrossbowRenderer.java | 72 ++ .../client/renderer/FlexibleToolRenderer.java | 310 +++++++++ .../client/renderer/JavelinRenderer.java | 24 + .../renderer/ThrowingKnifeRenderer.java | 68 ++ .../weaponry/entity/ArrowEntity.java | 103 +++ .../weaponry/entity/BoltEntity.java | 27 + .../weaponry/entity/JavelinEntity.java | 47 ++ .../weaponry/entity/ProjectileBase.java | 627 ++++++++++++++++++ .../weaponry/entity/ShurikenEntity.java | 58 ++ .../weaponry/entity/ThrowingKnifeEntity.java | 25 + .../weaponry/items/CustomToolPart.java | 26 + .../weaponry/items/DualMaterialToolPart.java | 124 ++++ .../weaponry/items/WeaponryPattern.java | 52 ++ .../weaponry/items/WeaponryToolPart.java | 14 + .../library/util/PiercingArrowDamage.java | 12 + .../weaponry/library/weaponry/AmmoItem.java | 118 ++++ .../weaponry/library/weaponry/AmmoWeapon.java | 146 ++++ .../library/weaponry/ArrowShaftMaterial.java | 29 + .../library/weaponry/BowBaseAmmo.java | 167 +++++ .../weaponry/library/weaponry/IAccuracy.java | 10 + .../weaponry/library/weaponry/IAmmo.java | 38 ++ .../weaponry/library/weaponry/IWindup.java | 20 + .../library/weaponry/ProjectileWeapon.java | 320 +++++++++ .../java/tconstruct/weaponry/util/Config.java | 4 + .../tconstruct/weaponry/util/Reference.java | 17 + .../tconstruct/weaponry/weapons/Crossbow.java | 442 ++++++++++++ .../tconstruct/weaponry/weapons/Javelin.java | 169 +++++ .../tconstruct/weaponry/weapons/LongBow.java | 131 ++++ .../tconstruct/weaponry/weapons/ShortBow.java | 114 ++++ .../tconstruct/weaponry/weapons/Shuriken.java | 169 +++++ .../weaponry/weapons/ThrowArrow.java | 92 +++ .../weaponry/weapons/ThrowArrowItem.java | 128 ++++ .../weaponry/weapons/ThrowingKnife.java | 90 +++ 191 files changed, 5325 insertions(+), 1 deletion(-) create mode 100644 item_texture_backup.zip create mode 100644 resources/assets/tinker/textures/gui/Crosshair.png create mode 100644 resources/assets/tinker/textures/gui/Crosshair2.png create mode 100644 resources/assets/tinker/textures/gui/Crosshair3.png create mode 100644 resources/assets/tinker/textures/gui/Crosshair4.png delete mode 100644 resources/assets/tinker/textures/items/arrow/alumite_arrow_shaft.png delete mode 100644 resources/assets/tinker/textures/items/arrow/ardite_arrow_shaft.png create mode 100644 resources/assets/tinker/textures/items/arrow/blaze_arrow_shaft.png delete mode 100644 resources/assets/tinker/textures/items/arrow/blueslime_arrow_shaft.png delete mode 100644 resources/assets/tinker/textures/items/arrow/bronze_arrow_shaft.png delete mode 100644 resources/assets/tinker/textures/items/arrow/cactus_arrow_shaft.png delete mode 100644 resources/assets/tinker/textures/items/arrow/cobalt_arrow_shaft.png delete mode 100644 resources/assets/tinker/textures/items/arrow/copper_arrow_shaft.png delete mode 100644 resources/assets/tinker/textures/items/arrow/flint_arrow_shaft.png delete mode 100644 resources/assets/tinker/textures/items/arrow/iron_arrow_shaft.png delete mode 100644 resources/assets/tinker/textures/items/arrow/manyullyn_arrow_shaft.png delete mode 100644 resources/assets/tinker/textures/items/arrow/netherrack_arrow_shaft.png delete mode 100644 resources/assets/tinker/textures/items/arrow/obsidian_arrow_shaft.png delete mode 100644 resources/assets/tinker/textures/items/arrow/paper_arrow_shaft.png delete mode 100644 resources/assets/tinker/textures/items/arrow/pigiron_arrow_fletching.png delete mode 100644 resources/assets/tinker/textures/items/arrow/pigiron_arrow_shaft.png create mode 100644 resources/assets/tinker/textures/items/arrow/reed_arrow_shaft.png delete mode 100644 resources/assets/tinker/textures/items/arrow/slime_arrow_shaft.png delete mode 100644 resources/assets/tinker/textures/items/arrow/steel_arrow_shaft.png delete mode 100644 resources/assets/tinker/textures/items/arrow/stone_arrow_shaft.png delete mode 100644 resources/assets/tinker/textures/items/arrow/thaumium_arrow_shaft.png create mode 100644 resources/assets/tinker/textures/items/bolt/_bolt_fletching.png create mode 100644 resources/assets/tinker/textures/items/bolt/_bolt_head - Kopie.png create mode 100644 resources/assets/tinker/textures/items/bolt/_bolt_head.png create mode 100644 resources/assets/tinker/textures/items/bolt/_bolt_shaft.png create mode 100644 resources/assets/tinker/textures/items/crossbow/_crossbow.xcf create mode 100644 resources/assets/tinker/textures/items/crossbow/_crossbow_1.xcf create mode 100644 resources/assets/tinker/textures/items/crossbow/_crossbow_2.xcf create mode 100644 resources/assets/tinker/textures/items/crossbow/_crossbow_3.xcf create mode 100644 resources/assets/tinker/textures/items/crossbow/_crossbow_3_meh.xcf create mode 100644 resources/assets/tinker/textures/items/crossbow/_crossbow_binding.png create mode 100644 resources/assets/tinker/textures/items/crossbow/_crossbow_body.png create mode 100644 resources/assets/tinker/textures/items/crossbow/_crossbow_bow.png create mode 100644 resources/assets/tinker/textures/items/crossbow/_crossbow_bow_1.png create mode 100644 resources/assets/tinker/textures/items/crossbow/_crossbow_bow_2.png create mode 100644 resources/assets/tinker/textures/items/crossbow/_crossbow_bow_3.png create mode 100644 resources/assets/tinker/textures/items/crossbow/_crossbow_string.png create mode 100644 resources/assets/tinker/textures/items/crossbow/_crossbow_string_1.png create mode 100644 resources/assets/tinker/textures/items/crossbow/_crossbow_string_2.png create mode 100644 resources/assets/tinker/textures/items/crossbow/_crossbow_string_3.png create mode 100644 resources/assets/tinker/textures/items/javelin/_javelin_accessory.png create mode 100644 resources/assets/tinker/textures/items/javelin/_javelin_handle.png create mode 100644 resources/assets/tinker/textures/items/javelin/_javelin_head.png create mode 100644 resources/assets/tinker/textures/items/longbow/_bow_bottom.png create mode 100644 resources/assets/tinker/textures/items/longbow/_bow_bottom_1.png create mode 100644 resources/assets/tinker/textures/items/longbow/_bow_bottom_2.png create mode 100644 resources/assets/tinker/textures/items/longbow/_bow_bottom_3.png create mode 100644 resources/assets/tinker/textures/items/longbow/_bow_grip.png create mode 100644 resources/assets/tinker/textures/items/longbow/_bow_top.png create mode 100644 resources/assets/tinker/textures/items/longbow/_bow_top_1.png create mode 100644 resources/assets/tinker/textures/items/longbow/_bow_top_2.png create mode 100644 resources/assets/tinker/textures/items/longbow/_bow_top_3.png create mode 100644 resources/assets/tinker/textures/items/longbow/_bowstring.png create mode 100644 resources/assets/tinker/textures/items/longbow/_bowstring_1.png create mode 100644 resources/assets/tinker/textures/items/longbow/_bowstring_2.png create mode 100644 resources/assets/tinker/textures/items/longbow/_bowstring_3.png create mode 100644 resources/assets/tinker/textures/items/longbow/_bowstring_broken.png create mode 100644 resources/assets/tinker/textures/items/longbow/complete.png create mode 100644 resources/assets/tinker/textures/items/longbow/complete.xcf create mode 100644 resources/assets/tinker/textures/items/parts/_arrow_shaft.png create mode 100644 resources/assets/tinker/textures/items/parts/_bolt.png create mode 100644 resources/assets/tinker/textures/items/parts/_bolt_2.png create mode 100644 resources/assets/tinker/textures/items/parts/_bow_limb.png create mode 100644 resources/assets/tinker/textures/items/parts/_crossbow_body.png create mode 100644 resources/assets/tinker/textures/items/parts/_crossbow_limb.png create mode 100644 resources/assets/tinker/textures/items/parts/_shuriken.png create mode 100644 resources/assets/tinker/textures/items/parts/iron_shuriken.png create mode 100644 resources/assets/tinker/textures/items/patterns/cast_bowlimb.png create mode 100644 resources/assets/tinker/textures/items/patterns/cast_crossbowbody.png create mode 100644 resources/assets/tinker/textures/items/patterns/cast_crossbowlimb.png create mode 100644 resources/assets/tinker/textures/items/patterns/cast_shuriken.png create mode 100644 resources/assets/tinker/textures/items/patterns/pattern_bowlimb.png create mode 100644 resources/assets/tinker/textures/items/patterns/pattern_crossbowbody.png create mode 100644 resources/assets/tinker/textures/items/patterns/pattern_crossbowlimb.png create mode 100644 resources/assets/tinker/textures/items/patterns/pattern_shuriken.png create mode 100644 resources/assets/tinker/textures/items/shuriken/_shuriken - Kopie.png create mode 100644 resources/assets/tinker/textures/items/shuriken/_shuriken.png create mode 100644 resources/assets/tinker/textures/items/shuriken/iron_shuriken.png create mode 100644 resources/assets/tinker/textures/items/throwingknife/_knife_blade.png create mode 100644 resources/assets/tinker/textures/items/throwingknife/_knife_handle.png create mode 100644 resources/assets/tinker/textures/items/throwingknife/iron_knife_blade.png create mode 100644 resources/assets/tinker/textures/items/throwingknife/iron_knife_handle.png create mode 100644 src/main/java/tconstruct/weaponry/TinkerWeaponry.java create mode 100644 src/main/java/tconstruct/weaponry/WeaponryClientProxy.java create mode 100644 src/main/java/tconstruct/weaponry/WeaponryCommonProxy.java create mode 100644 src/main/java/tconstruct/weaponry/WeaponryHandler.java create mode 100644 src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java create mode 100644 src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java create mode 100644 src/main/java/tconstruct/weaponry/client/AmmoSlotHandler.java create mode 100644 src/main/java/tconstruct/weaponry/client/CrosshairHandler.java create mode 100644 src/main/java/tconstruct/weaponry/client/CrosshairType.java create mode 100644 src/main/java/tconstruct/weaponry/client/IconFlipped.java create mode 100644 src/main/java/tconstruct/weaponry/client/RenderEventHandler.java create mode 100644 src/main/java/tconstruct/weaponry/client/entityrenderer/ArrowEntityRenderer.java create mode 100644 src/main/java/tconstruct/weaponry/client/entityrenderer/JavelinEntityRenderer.java create mode 100644 src/main/java/tconstruct/weaponry/client/entityrenderer/ProjectileBaseRenderer.java create mode 100644 src/main/java/tconstruct/weaponry/client/entityrenderer/ShurikenEntityRenderer.java create mode 100644 src/main/java/tconstruct/weaponry/client/renderer/AmmoItemRenderer.java create mode 100644 src/main/java/tconstruct/weaponry/client/renderer/BowRenderer.java create mode 100644 src/main/java/tconstruct/weaponry/client/renderer/CrossbowRenderer.java create mode 100644 src/main/java/tconstruct/weaponry/client/renderer/FlexibleToolRenderer.java create mode 100644 src/main/java/tconstruct/weaponry/client/renderer/JavelinRenderer.java create mode 100644 src/main/java/tconstruct/weaponry/client/renderer/ThrowingKnifeRenderer.java create mode 100644 src/main/java/tconstruct/weaponry/entity/ArrowEntity.java create mode 100644 src/main/java/tconstruct/weaponry/entity/BoltEntity.java create mode 100644 src/main/java/tconstruct/weaponry/entity/JavelinEntity.java create mode 100644 src/main/java/tconstruct/weaponry/entity/ProjectileBase.java create mode 100644 src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java create mode 100644 src/main/java/tconstruct/weaponry/entity/ThrowingKnifeEntity.java create mode 100644 src/main/java/tconstruct/weaponry/items/CustomToolPart.java create mode 100644 src/main/java/tconstruct/weaponry/items/DualMaterialToolPart.java create mode 100644 src/main/java/tconstruct/weaponry/items/WeaponryPattern.java create mode 100644 src/main/java/tconstruct/weaponry/items/WeaponryToolPart.java create mode 100644 src/main/java/tconstruct/weaponry/library/util/PiercingArrowDamage.java create mode 100644 src/main/java/tconstruct/weaponry/library/weaponry/AmmoItem.java create mode 100644 src/main/java/tconstruct/weaponry/library/weaponry/AmmoWeapon.java create mode 100644 src/main/java/tconstruct/weaponry/library/weaponry/ArrowShaftMaterial.java create mode 100644 src/main/java/tconstruct/weaponry/library/weaponry/BowBaseAmmo.java create mode 100644 src/main/java/tconstruct/weaponry/library/weaponry/IAccuracy.java create mode 100644 src/main/java/tconstruct/weaponry/library/weaponry/IAmmo.java create mode 100644 src/main/java/tconstruct/weaponry/library/weaponry/IWindup.java create mode 100644 src/main/java/tconstruct/weaponry/library/weaponry/ProjectileWeapon.java create mode 100644 src/main/java/tconstruct/weaponry/util/Config.java create mode 100644 src/main/java/tconstruct/weaponry/util/Reference.java create mode 100644 src/main/java/tconstruct/weaponry/weapons/Crossbow.java create mode 100644 src/main/java/tconstruct/weaponry/weapons/Javelin.java create mode 100644 src/main/java/tconstruct/weaponry/weapons/LongBow.java create mode 100644 src/main/java/tconstruct/weaponry/weapons/ShortBow.java create mode 100644 src/main/java/tconstruct/weaponry/weapons/Shuriken.java create mode 100644 src/main/java/tconstruct/weaponry/weapons/ThrowArrow.java create mode 100644 src/main/java/tconstruct/weaponry/weapons/ThrowArrowItem.java create mode 100644 src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java diff --git a/build.properties b/build.properties index 4e8f47c096f..f9e660c2064 100644 --- a/build.properties +++ b/build.properties @@ -1,5 +1,5 @@ minecraft_version=1.7.10 -forge_version=10.13.0.1208 +forge_version=10.13.1.1217 mantle_version=0.3.1.jenkins176 CCLIB_version=1.1.1.95 NEI_version=1.0.2.15 diff --git a/item_texture_backup.zip b/item_texture_backup.zip new file mode 100644 index 0000000000000000000000000000000000000000..28c0ead217643cd740ad8255a237785c29ceedb8 GIT binary patch literal 1362139 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

%h5gMff^3L@RPKpF%Dq$MQ;1OX}O7AY0!?r!N= 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

Q%jPL*l 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

MbxwkvM(o6bs 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 z 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≪mfVs#&Q3>NaBZ8Y| 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 literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/sounds.json b/resources/assets/tinker/sounds.json index 4374951c5c2..f2270a196af 100644 --- a/resources/assets/tinker/sounds.json +++ b/resources/assets/tinker/sounds.json @@ -16,5 +16,23 @@ "sounds": [ "launcher_clank" ] + }, + "woodHit": { + "category": "block", + "sounds": [ + "woodHit1", + "woodHit2", + "woodHit3", + "woodHit4", + "woodHit5" + ] + }, + "stoneHit": { + "category": "block", + "sounds": [ + "stoneHit1", + "stoneHit2", + "stoneHit3" + ] } } \ No newline at end of file diff --git a/resources/assets/tinker/textures/gui/Crosshair.png b/resources/assets/tinker/textures/gui/Crosshair.png new file mode 100644 index 0000000000000000000000000000000000000000..7f9268ad463be4c29e419e0c3c0f3e6fe83b1adb GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*x382Ao?FyoGi*>8b@>?NMQuI%?Xg}6*4wizA)3E6qNIEGl9PX6=% zzdf^RL#u>qPft(8(f|MdpFiM{D=v^NrEI5fAatQ8iBp)lHQ`Fb!2|~Gg%xU78ICO! aXJa_^mPh&Q+H{Z`7(8A5T-G@yGywn}v^kgn literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/gui/Crosshair2.png b/resources/assets/tinker/textures/gui/Crosshair2.png new file mode 100644 index 0000000000000000000000000000000000000000..0a9f5973da6c1c711e9280c36a7f997163e0ca90 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*x382Ao?FyoGi*>8b@>?NMQuI%?Xg}5cHoOW)#2o$pPba4!^IGvmz z!D?~vKM*7*FJ@MAn#C!3$YqU_QxP+}#7E1?6DLj-oGx+Bz#-gWjm*u97F-e%41Uh) VAM{TtUjrJ#;OXk;vd$@?2>^!BH3k3x literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/gui/Crosshair3.png b/resources/assets/tinker/textures/gui/Crosshair3.png new file mode 100644 index 0000000000000000000000000000000000000000..f1deeaea62ac258b2bbb731b00ded12beb290608 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*x382Ao?FyoGi*>8b@>?NMQuI%?Xg}7xI9^71+4it*=ba4!^IDK}~ zLB0k94(H0#|Nc*ZeX=>&UECznzr`U_dV+{(Njk@lujdZ?h-fHPtkBO0beXAe+CiJ; zu>q%~GUKt-y0Zs8b@>?NMQuI%?Xg?L2FdtNSF0u;*hba4!^IK6lB zLB0bDJWdDy|4%QwX%iAK`RvRJ16_U5DU&{=ZJnz&sn-5^oUt$m19SF@otzcsd5zJT z9uu^tF&j9{nemc~@6dglA8%xrNW4wSRlKG&SJ5q9B7K5Xa+Bo=Nq&Q$>=r_gS+!rN UsOv^6f}G3X>FVdQ&MBb@0IbPM9smFU literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/gui/icons.png b/resources/assets/tinker/textures/gui/icons.png index a1cd9908b9406ad636400c93e049d79f72443025..0ac16916dde77852a4075dd7f6e87f830a604b01 100644 GIT binary patch literal 8887 zcmd6NXH*kG+x7;Kq99$WG!djXkq!|-ia_WHp?B$0RZ4==JA!nK6p`M03n)!GDAKz~ z7ovn3$h)5BJzx3p{eHibY_c=EvomweJ@<8&jn>ssqqxp|9RL6d4RsZL0Dyp}5P*~z z{4@71cKlcJ(N|LjDo0tj!2+@E6Ezh8|L^mm<5LP)L*}J!>H`2bX#X7$AS;IvtR(T( z&{ic`x=u*R&T<&Bf(HN&KttuB;fuNb+(2K${@hJ;FITJ-qp=II9b4m@Fb6Hs2jYT7 z3R=76-NUlo+Qdw-X1LXe77nl|P5ch^f2HP%v){zX)AaNWnyi*5-CoB{D1j z)ny?KoiTQP2(1-_3S~#WBn@rB({co@RJ)zT_QD^V{2ld^rL7z&RjTMG_ zhxEcQb?gUFouT;%;`cSgAA0c5hCV&T84YZIt8Kf)dn&btXVHoV{viTNWWBj*Li^W4 zPg*=R?wmBZ3LDF%?5JFv9Q3#P?G}!0*0~XAe)w0+l61B0nH?Yhpkh}dJmJj^F)!ma>+y|hg)(f1QV(n=;0c4IL%_Zu7SaH+G6lfFjmMmo)B5uz?8 zcWAwyxJActh={S$lq(6n982K!l-dkt8h{GIB7ffqU5e1Zo%65 zot?CReipQk5gBs@9PSQz-PKNfP}(Utn|7hV`keDRc>i#=)Yy{r`1(U`8VDe0+0G~_ zDOse&K}AZ68slXUv5b5Dn&5>zTWVU`ptDSV5i!(tp#GFF6nT%I|E-ac(R1uJKd)&U z&mhr}ZMKXZF)*Xq5+AoR;mHcsd7`kFAq3!7mvd_UIu*|^gJ0NVP3s%#ZN4nLqNAhh zu_tisTpkN)Cj_dolCvYMt^w~;VOkb+%O((jP`np-9M2?Bq>a$j%Dys8jGJH>9!yRo zmkIye$Zoy+SBUiLj~dw~*>KddPFU=99Tt=6=>Wf?-dF}glJ(4BaC=0C}FxJ&Y+S_S>QXe%6-;#io!<%#npy2R-nc(OGO**(Dg%$;?FMkJ) zgfxYRx76m@$X+$t^0H;%wHKtEB&u&~7;Hc}s3bIs#aZrN!I)XJqw(`&S1=%{f!$3E zS6*I*?yapwt*?ks!X@EkK%iXOEDgeBzMZ#EC&Y4z5${Kyn-sZ#q2v%b;C!-a*|1u( z-eh-vmYLOmxN-sMUOwQofWw_MhwC+(});u$>hHw;PBM=3rRtoMJU12qgZpVU+B^eY!4HKUBs zcu;S`EPB}^7l`uuO96NPc#t8MAAggHB=XnpGisP{Z+UJVUE^_7Gva zEvSmR4oos!7#7a1`9~~=d7eK6ENr72Q=YBz(BxWR%6ue42Hk8#^W56lU|Qigiy^k4 zPYy7Bj8hy0cd68qa9IQs@bbm`)DBc7J{4{Ll~bB?8s+}ryk9M(Y|X^9i?&5Ag^7hr zyRAB4N+9a~{w~i|qnMAFpr^2RzY?-M81{*uml<?qa^tB}`R?Fj7c`4qoGhlzIMFbFlZs>T5v4W(a5kT~6aMZo>_^Rdn803| zo#cK1^BJfiAYO*M85A;zJMx4#nXd~@xUvDoa#4KXXqXG%)p!T-qUE~;5^(1_6p}B56wuN~_N~ zQM}@OkJys~lDs=Psa0X=1EB#S5V`!_R`OY*9QW5L16D`A8tKjlxX<($ryK}l^s?ry z@tL`VzQz3n)okH4w47sN;*3Q;c1Dysm^e8Q^Pw#HhXk3}GkmAqqne=Z7r>SyL5<@g z2cX`@qkH5VJL|bf$CL@lQJA;C zc={>+_I`1GO~c|l$(g~V9IaD@WNr&7mb3L|5Y>25SVar0t%ViZ~ENIP_FV>GD_`;gX*?RaaCRT1CVk%kVc&`7Ij9 zue-7~4F$h>Pt&E?AFSToz&X$t&r)O8f3ttXZLXdy^5$)C^P4Ax9Nf3=RNUaZ8%E`J zTUmS@aHE9el$*kg65wrRM?V5Mwx>p2rrD+Z&$kcA>jRZ5ev{iZunIik-1i@7z9y%k zt!Bn5Fl##S?HiZxP;o_+DLO%EPPj7X+i69|T5qS<1lNAfB&qp*pu@Rh;o!X{?p!C& z*bEy+b{eGU{&DFaZA|+)CLR7AG^zOf=j~gMs`Rup+h1`^Pc8LdyTcnZEQ?$odVT(? z`10|*_pE|RvN{nKixsUi(8h^d^2+_{i46%>4LAPX{_?Na-s$uGHq~n)48mrG$A(Gw zAve}v+w&S~@_kvYPSw{G*j=Q3mr_oSRcu4q8Cr@mrgmHFRvuq8pr`(NN#|7Sl(H$J zV1bFUk2^Z&4${GMV-pj(QlFrU4AcIDKAFE~L60f-Ppw6r&)Z7Y4KKi}LpwVzXD$;w zL+*88i?Yj*3i-okjSuO3SU-ChgfhyFE>IM z8|ub3-=t2aLAK^cYy;(J&{uz_#6WAIFdEUdAhq$OY;+*K(MrdK;2#rERBhbFxz%Cw z$haRMGh_fi@uS%LYyCKX-ln(lX9m=Z#+t@PMtSx1hTs@iv9E4RMKPz8w!}q5L=+yF z(7qeWgQs*l#2z=jS{!9X>d6sOfu>F)g~*(x|7iMZ#`5r7V1dTx%3e+OHMxT;F`c-V z5Mca=_stjH_uocawe7k$q307V|l!9#_D6c1F0W<#1KiN-&5J>F*}C#Jp`>8^?hmXnb&IUm3umP#;+o{Th0;!E`O zcWGDZhsvixN8I!6ls{RJk8>?$sNqY%8hy^z~R;pF$??haXWW#f~XQO6MOFCzme z=SC&a1{^yu;pksGiM9H(2b%wlV|*ll;Q3trRwu#Ym}#w1x{k0@sh0K9(M2YiipDFZ z@yb&>i_1nk3@`J|7pRN0BP}!129@uEJKl@`_Qe`3Y>szX=*Usd|Ic4%_aKp?+^Ndu zZH_DFV4>J$^`4e>c3pIK()ViYjh72lO4=L`ttDIOpUPm9TCwW%rtv*h%S^w{kLfdx z2i&JUWAx_vcKsv78d_8~qqcR|cfhUIlku8)GrMB<3F3&v`{%geyg=P8&}>9M3%p)h zk&DYpqA}mkB&le?##QDbHat7Cb#eYX;?MW2zxa!#R4`>mvaBVt-yF^kQQ{fBYz#^G zWR)FS0uOCt#*>E}UA+RCzaJa%<`5`CY^$g~_qd|E6 zSNTh#>{lb2ylvk5PlB+?)H4B}JFQs)NJ3lNzCh%7sIpz)%UH)#LlMyGVw=aGxR~^y z+|X|fmthFpDPNsxv&>5CsS(d13cqvkla~a~!oMUN`=c_L%bthvp)%okK%u%1I0$dj z@_D9tv~6QnP7_r?xz+CE^x>e@fUm3Nm}#yf<<3)eHy@mQO*^t*!{a z(BETsHu2(<>3lpqGMM}+Ed==y@koY?3KrCq&K_g5 zLiCHvnEdacS>UPKta6O;_><@LV~g>~kzALB;wP}UGlPk_xtN%y(KQjPjHqjOvoW7< zh}i$gL8j7xJ7oje;+fSdAz;KiZuMtdk#ol9CybF_sy&T&>V07J&ib)aY2=jMLUUsG zjuWq()fsJs{|Jf7CQ;7&0I3UIn7)zGT@mwUj^*GJi%c@JLA6qot*#KS6gngE|?-@|x;xHzQLQ@Zbh#<_!vD z61gKsc9*H~M|PbW8FNnqf$Ga=K*zkso9+)kw%aYM?A3fDb?%KTZ zk5MRr~iah;OcpD>PUauawH`hYTmPoSdCB0EaP<4Ev zD$V-)81y%lFPB}=R)!`fHzJqIMCJx0-$pMB&(6-)78E?PcXFD)RQ&UCKfM>k_V|VY zTN3wL59&n+wKP52VBKpzO7LAtPu1ZI`MK+lBv|D_%;AB$W@gMj3!v3nquum1>UNDL zUwGQ;rZMsgfu-YyO>ls4I;ufpSl{4(Z|Hbwt4i$G#*Hd$-kMcb2^!okG90|!ru4P zIt-0ZOmGrYFx&e}e~4BJz!8egE`YI&=s@3l*2m%>qK1gk`LP4p1+X+mO5$SXg&;)>ck$)sQyq;Y-|ba}KE&5RUy?Za`U zLgDsFXHKjNebpMHo3?B3r}R((bVbc#5Fqml?I$7@U5-rFOuo=%qhTv5IE{Fy_HR?k z&{Ixi?v|CMrEuygI|BDyD_54@b-FSrWk&H{%XJBzg^F&TkfsA63F+R zDY(d=3WIc4%C+n^7t;_^;w{G#2e}8-T zNjz8Y&!Eh8cplfQ%hqFN6zr!yez!?U0 zaQIjvKJ3PK>v}j1o2Q>=_uVIH+&FY?t@!C>2xnN5i&oa-wL}@u)-CrZxE)V{wdriA zon3)>qg&=vbV!FeIz*w|^18XG014<<3mKaj4`S)*2>>0$EAk~i)fXNe&Agis;yEf5 z%NL;8naH?63GCPCJ6$V!#1{Z*-$9!77N+h>69+<3TUjamY|#>NiG9x~;6gpI?M zJ2~afUH8VWHNB!l4ifDx5K_@AF^epyT!rN+lXCtuZ7g%orccUG_ZZ)npncxk?D-$CTlfe7AJtFk8DHcI+EHgkuEVM-58vd2SMO zI1uRcurF>>0f(>#0f+nhXr}`*#+fg-?+URzX2*_P*LL@l{6oq12KSSY`g-{NiEQdl z>hSRJi0uwS%*l=8y;(c>ibsk%Zi_d-$#DZwA7f-(-f?;KjpCDAq7#~uo`oXvV_#nXe zK`)F@otDPpCU>RHxwkJ*)Di{Z%5N!QuhT;tR>dI3bCj$JnqlQFHRDK8?0p*h{PT=O zuP?(F_8K2{HzylU|NM@Qmp_V4Vf8SdyhHo}9r<25>Rj_wZ{i7{jL&*RoAhUt{`vMA zpLv@;~U!`Sd+~P*rD|0(S)+notAawm<>y)=3XP9X4BAPc- z!YLu|6rx@=UFLtwTi@gn290}L!H!N6_6VXDnNz`1yIiwTomM!Rbd(X}ITR6KPk{%$ z^!{Ei*xtNtM?FGbNFTbx?s5H}vc8&yE788focJC!WkH_OqZOwn+3lp>c(sy6rJ1QQ zKuR`07e(1|sasg&Ziuh-RDqK?ut&WPTf=WQEj8S|iijXq=bL(cXX49RqF5+6OFcb3 zPTx%Aly~b#+<6{USLNaG2pQlyWwSk16tE$H#au& z(tA;&wAH2wim`FCYdRE^wOD_mL+cCt0Lqn=BU$#_SUaPCC+lX0FoJe1jas~WV zUAZky@|(XULk*Ag9RPo=50#ZVDs@0!Tvs_6V|_eP>jQ@8Ngi!NAtj9ucJE+VvXJrK zg;}JA&k*e^O1OvN8zO#xern{%zohXuX5hyVLakz!hpC`N(ay9EkhBwmdxC;Jt6w5j zZEW(Guaj~dv*8WHlsQ>tebrg?x5BF|rDDzWiXTvm&6yULmzR(A92~aG(Ic8{lEW2P zAyA%-)7WjfM1&`O!nwX@xBu=BAu$j&Q&4*X&hXg9vbE{SHSV>@8!1YY)?Bbw-S_i; zKKcB2Iv2!Oqg%X&nEyCf5N

N2$3rAv_1QeKkms7<$zv0o*v}OF&NkeoS4j1$^lkQ&y$d-o;k_Rg= z{4~CM`oSe-vrJxw<}M~tg_t8y*E*O-mNtSQeaC(fc&l}kDI`$PQ)Mafj6k0^r1`MZ zBPC$R(}7@HFhqcu!-6gXo({2~wrI`sA8rU%lz`!?tqC0Ow0$J+QvYt8kFbhfE{8Pp zh1gDzx@Cm=YT#xL&6Ya2Lh5)po)A!|b9p=y)!Ndlt*dhY?~H-y;!bW&mYgn@Mm|}a zK6$i#7>wchpzwXS<8Fup5PbIv9N_oInLn2{KopRRyEtK%WUgG@l=n<^6&fMJvG_z*d6U2Futt3Fh#sN~!`+zbj1yVX9 z-GGdOBlKPzn`1(UQx9T$@~)0-a$sST=B&WygT1|;?Qfr+pC3K*_4ij+0Lxl;y-MKs zQjSMno*!)oj#R4?KU>_h{a{G_5Be<~3E<6?_p|9v38zu5`ST4Jqvka*4#0xk+uDMv zsYSlqx+N0Aup=_@Xcl?fXZP5G=}ZG54rtT47A*c59va+&X zt;vychNbGqG`LRBX?#;PFrclitzEn3>e{yV?Gr4vDriGsyV@d4;4?}Ip$M$-DxHx{ zz165p+CrC>mF++7f1eOXb6k0|xsh4}5sOnqQL8^z0a><>ibAV+pll$CM1~H&Nn|VDDVdDj8M>Yn;s+! zS56p|@!d*t-CsYsu#mF?ACcWWHQM00&~>fO z`*0x1;GWwBq)~DC^@<20)$2WyY7!<6+`V#gitB4!6e5)(sb2*+3sFu07$~v^J!d`4 z^0?*63wbvM16~t$6it;BL|I))0%@O& z;(@9wJpd${}@YjN}QR_0G%QylOhR}^y@e|(zkzPM1J9^({E!C(}8z> zzdRZe;muQu9;?Q3Cv?i1WSm6rblfoeO1VPw^PYr&V!Zj6H}6*&#ea5YoYXfh_hnE& zf&dIv{uC1Zaf~t9R{jJ4TlSxW8eAKGN0V3n~ZP4?ERGbbxlm$3xWlEhg^7y&t_o9#dk&_dztZd4(ngc=bGk}ZVOuMk#n#!`uWR9vz>oDZm7b5PF zI~}@f%wqEJ3%E$pnDBB}^Mc;o-_g<0!e=iLWr;Kw1JrNo(b%;F^Y#Rc-9cgrtky=^ zlL@&*1OVWJ$Pq8m1Gn+OsG+=@aeGORXD`vw!MppRM=BykyHcLE=D+WmqhA^X?(a0f z2U-x$eLvJhe!K2ViG}Q4Hvb4|QnWJPM>-8x*NY-g)di|9|H{`$Fored!?@61)@+3& zAohyp9sW0f`_z8^{(V}u|9(|gaxO@Uw7%vhd0@}hTu1=t{0F6pigy_AJ3bxcd<{3a zD{=_{1Oorw1t72Hgl=PBQIiv^zI{m`P-NS$9;O$eO!{1jP&B4_5=AVeHINk8vd?q8vk?1UMz2iN1lp866y&}zGOQvkWDqpcdp9lbtu znr3s!5<7})oamft>e*P6MR(Ndtl0VixF|x4I^1DeC9o&E4sonv_Z$_WQ%<@^{0}|9 z_s2oFQz5dWR=Y2J|b zs#@gf`m1^1?Z;{3{-ww1zspHYnx#>oWY_?XeLujw)`VnW-5P^1#a(sEe3YI^iEF+o zb}y8$p}y^tCs8e&y`iyN=tu%rsu=BfM&dy6Jp!^L-L#uB2$XA;o1P(_Nx0k~yhF`L z9&yw?V}*KMR@10iHubTE`pd!fs!x3_+myF(%kYCPXReZZ9vG*#;CSbtuLo>m(!dH+w+z;lI;Wk^6}ABPdi1~8lDps(AN1LkY+WNXgJhDj`aX5)u*$h>C!8mw*y;2aygz8bnH@L%LH!YUmh{ zMsk252N;Im`2F+U=f-o-jc1>;*I9e7eQH%YAH|r0(EsSEfO>`NV*mgHo;-f|{5=Yt z?)&a}Px^Xm7e$2hO;vkRi(B1f%ifBW;IYq& zBM;->2@CoaoRX1dkVm8M;Zo4x?BCjII?-$(@;x5*={r9&Q2yc2S}iC(F|i}c-3yHh zI$Z!cvUGd(9)!?v1TXBZPk4qR*B`-XH;%t?;jg~La}x(3)D5D2kdF0UFZNDP!{4VB z7Jj01;?417dfM-%A8ezVb#lff;`_GmF2xBmxH+0)bu43M21ZNi^4+($wgA{)57ceVY6if3!d6~_Vr{f9V=+$=6;xbPOGPc`M6DEd6;}i5 zlrIa#9R9UFIlo%)n+`(7-SNec00lDcJU0S*Rsv2_Tr{{(s~toQW#hIUlU-+P>yBd0 zMXpym5@}@qyA7shefw)>eEj=kivogSJU|vxYm0M$5^(L>HFE8?u<3U_$Kt!;eHtQ9 zU)+Tpp8<<)0mS?7<)XD-RY!;ifDA&0p(xZ#&Ea$<>sBFk;c^wl(#ZM&nuF?v(pcI7v`&LdAm0+KKCz9M$Esb zprClp%=Pj*#bM>h+~#L%PoK3@Lf^*Octw70+he)q8Oi?Ocf7Mg2DV0GG70Dd+p%hU=j14 z;6kpPwNTVc0L?kJ4APJgWoKq885$Y&OyuQ#wM3^1&<{tTf1Vve+6?=gEJaF zH*|n)p#W|sijv+jAGN&eJx~93w~7DUGP1?-VWOYwxZSEZ=*Kae;q+*qNm1**j+rXX zi|h4sS5#fY&!2e`B`-Yo5`T4_Qe7D9c>msHr^fo$? zADw83Ct-J52VI-1$+v0bsXq4v{&NWY$GL;y?5lk-xv1`L)sm~#wY8>^8F9nezf03LKmA9_*i7;c|4iuJP-)&7H(j9VVd^Y>SSS+Ej z1nfVf`G71esrmczR+{2M6&3;$^Z_5yzo>y}619yT@-K&2iM4O7I>BgZ`xz~N7f1V2 zU9+okYB}juZ#ssQAF(Pv^q)fT zW7`&2VyC=ESlk>`PSR5Y)WGB=KzPFUy*_0KAE<@Z%bMk~F_a`=(Uar|XziQY3B&Vf zW^UAmt9knh{Rq};IqNY^Emi+WT>e)}z8SwP{>pmE0io_<6a~(?q`<2konhgPrN;hc zCmQBXw3SU^bmkhFVQ6hId}br|A1Qrb%{FF(t#_dY-B~+(!pi`HsGDty_-8xQF7tD8 zYDh)?2;6z-wLssYg1)fN)7Ckl-)gNOJmH#Ls=si`PtMT_vSTYT!lg9{E6XR+o&2?{ z_nQw#@E#~`@L(jg*7OB>^-#JtET{FHZOW@u`vFtd5IXE=`z;Ts;i3;JA#WXtWhQ2{ZnXXSb??2atiWuMk{I6p8PgXhJ9GarS4o~r1X_~Y6R ziJh3Nwj0gs5Jd2!1eg?hXXG&`G?H_8;$)Mg(7@ZI*5A{s;Nc}|FIn46TlIyJwY9SLN6*=1tz=l(K~Uy)Pf0JRh8vdoOCXb2e~j+H zuT17!g9?*HY-XPw-afOts!n&fOVKuU>kP_aV`IKIq7#>RxT~hvR!IZ00{TPJJlTuC z-=?@-te0~)e4C9CX`5lZABMZ8!+08ca)LCW15wO~SZs+UWDuQhJ3qVmqAE}Y=iR-7 zp=$)ys&29JWg}q~Vz=C-Mt!VdeCP$xS8`G~jRI)af=w2ukpOm6BoyC-6CcDK-gW4Z zku(vg;%(@d`?k~*ZThXfzRM+azW@eok1S|o@~lW*PaGrA9_jbIs&c~ro;)?0G!uH{ zF1~bX`{msq$JNhFVBN7#$5LS2(Y=-?*KN>qXL>eqm?TwfZWtaNK3_vVkXjD45tYv5 z!~q>8B^}weUD3f3?t|I(K-rSkA(?>$pANtBAQ>(2I%bk(Y9vytcpZOkYJ$ZU$`0$0)Q%Bc1(bLHH%D@HtDag4r z84OF4cIhrPX=F>PwCZPMQ}CO1doV|XhG8$#>~s4JDOJ2iDmFJ|izb%*!WWkJFV)sH)!aHS z6>HV>)N3G&$zR1P*Kqd>ucj;R7dg68<(e2}l9-XNpn57I$n9YTrC@G6xa9gm<92Ss z@ore(6T@Jcq1}bMf?_wR`poVKOkG@}kXxs&_rI1uExbj@KV((YbLLI=PBk--{0{c^ zY!eS!{0E9xyjN1s{1kGMyx@0kN?y*4e<<`PJhjx;j`FKFi&(2M-aG9-hPN7i!@tZ= z8hNmV#XX>}JNA6OjS(9INrxAf_bBOgNomF4ynfA@QB+FoNn2~bfJoE>w(Fgx6 zc63o&p1Sh)9Ln)XbXex7!BRgc+KKctU(fx{S5Bb(xg(9I9j#6^3X%c8NNFX=GDU;o zv8uS_h22%dio2j-_N>P5tu6cb`1oGJ05-iTTOrl6(3eUY86S^7dM~9{Pud{0Ia_0= zSagaWfZVK>00BJ{6Q|kzY_!$74|DX{U~#i_D$kB_@e!ouk`Pf=zpn!TAx}W`@N=bL ztMleh&VA)+Ev@tqdkgxB5Pr^X_kiAwJs$Y=Hi;bF@E&+({ehAi9_u6Xn`Bu6V5n!X zmH=vlf%E^S^V0*{VI525B^zZf{QOfI9A`EO>0o<#m&>n`Go7gL<@zyI&Exu>miJ20 z{urfEDl-E4otfgtB++uRu^B0dE-Kh)h1z?7`46+|k+00I|Tp9G9?fLiJ+(RJJW#qDdCwyP5xR51HN+0`Q`zVY@TLnTO-`hQh5JQEIl<@ z6VmUQkM)1bB6Ly_4JNfe>gtlP^jRmry(yb#o_;$MMx`x8+1XSJ?V8boRV|5KESGG27n3^)((Me-+;MABVgh_v&j% zH`j6!9g%mwHD2e_Q{!~^M`rh#_4auO2fl?((WefbVEivnF!h#$OiVs)(N-rf-5t1` zMESsxL#+o>3r_^#vYsglAHJJ6CjXv{9O$IR^w5wc4m2{2F@c(jJrdss+raUhHu)%! zRMD@DC_SRjtz?r{4zcMXqZdm}9WwkgpKYe7X8952$P9(GcW@Z`Ij57jj$-?d`O4AX zqNbNOOh34?on%yrP5*6vn7K6M+7?az>j!GmyO~+GC*rq6M%U0)^*jTHe|8Txu|Afe z=y{?{=S*EE3Qr)%ZJJ&goq?FFtKdFqWOlPn1~lcmYRoWj#D04e#UqDcySANvII?4r ztnh(n-acQcC)@oQQ8mjYwO4Sg?`OE+K%`1%3553?VoaG?_Sxp|3K!cPu}=6UF`7b@ zm;YX9S7+twroo=YM22kt_FCm%s!9iKSP>C$t=c2bQk3e%fgI=w zYDhDeK4|=@GIR8sdjtpGdbqya44s}U=#FYQ>Pl8*K%>$5euu*Nt@_OuhD{7e`P0`v zgXHSBmk5{(5rKo9<8j6XG6DERojvmQ7H)5pZT)5fTfxbk=5vnPs~|*!He9$Cf5R3#t5IoD^_=~Nt4j}S z9tdV`OH7Z14V)yt^&c4`OtF4^gZ0G3!~y^OxZ$f9)RHEMPz-&3Y+N@#}e59farVS!{csWM&*E&lKKnosMN zLLx|E7wzVIe|v8y>>s}hFF4Isg}sh;wX+iR!Gv@!edgEudyA$VnKXPvFwPrzUES8~H6fe2HKUM_G z0@g0cEUO+Z6J&X`_oBgatGmL-tCr;=!!m~O@Nl17-QhKR&vfL22#&r!Ef@9%m-jTi zV{4+w?eMSm-M7D>m7Nf6+|0ARh~Izj85lg7%Y6i?tc9q&=7U}6;jFhTi$sr)kE2Jm zE)(Ax)~Xxnf&Z9<8G-kg%`d6o24kU<7ne1&y+5$kT6!v51X~F^!MR)nAL|NO7Cco^ zQOVBFR~OQ`bk1{%$0}kMiP7FdDQ!An73I{cwDQXt*#(vR{(rUnW&5-2fl}yD0G3{= zJYB|az3F_bNKo0hG;ZROSvB1Trq$i!!Jc7Rc|vv zvK#_b6dT~x>m;Q#00OPpy292 zibRkJrs&+cu<*-BC=GD`|79f3&%odsCrM#p zp;m&qwdPMi20gdW$+pSOkx@i=IEAsE9;B$2C`qKZgP;<_j|~hevMcm~wyVq4`%RUU`&vPDLhBH5$53RH zIq+JNsAz=4z`#Jzp5hPES_ZN2(=5(*JpyYC^5O|FoEaXDsd6rBIkz{BWT=LMR+Z_$ z{_>6)UVdEOQ>^1qVv&G$(S&D^f=bXXBqzXmspH|x zpL*&=)E2{}NNpAqv*87EqaLfx8GCr-d=v0)bqnBDi(c%Fd#w%q{uegdnQy| z5BUl|&rnMbu<=I_%bOEy%<8$~MBHHs)wp2uX ztylz7>|6Il(bUKsc)*M|+ssfW`{-H3-PhNrL3ceQPITwCpx}-A`ug9K)X9Qmi0Qxm zv0VXt7+m7#U!Uqb-Of6laoY_cWG1xFI!rHhTtbDCM9p137-u**CKF>Q<9akH_g;zg z+)##&onBsiQHfw=4(C7|`83Q*53onC*ZT2frvy}S>0b70FWFdI_bGyhdCFq=mT0`81W>d*mG|=8 zW5=5IsWfCne|v)qcHCHgdpQ|8Iy`JvA9)|+u=@9}%uF6E3wyOT=d+yALCmb&|=ah1D`tx*gr}g2_O`^NH=U*61lykbP}!ExV~{ZW8~I z5KG*hTw8CdW74F6#%!q@WkPy$o9cvmO@TNd%Qrkc49hk~=&G7cl2D;kiR9BF?yJ}S zVQhW=Dvde@ORe3e`aoZsq_9fy%|3@;>*zsxQNJ8 zE_mIYGj3|WgYT4U^(NB%Rxd==z-=ASn|&vqcMaWNhuzex`g+L=H@=bpV#HeZzoL=! z>7eUeO+rF~fS{oJT+6vTAt31*8{7TRIwL@l;HhvIqt2Cq$-5E~&)|E$3uAn{?j9cI zR{D1c4T&ur9j22lQHmECSFEOg4rp9Gl6M)|t40tD!v@b$9CISW6Mp`H?(1 zY9~<~;MRK;h9~BQSCTINz=o-Cmz$H0@?tE;gdTWDUjy9dZCHy14uP+1QYY4#DD+kj}Vh1Ydk$O zxyRLIwxwHff0#!UoTm1aHtU#MBCZfsA_tYMFU;i@)QDl5UwDtVF6^eDq@-1}C(IQsAsvY_M<5b7Y0@1jBg0EM;xM?&rOj@KJ`)<9<9 z3IDz3FFAksERS@`s1Sq>9x_8%fGjLIH9{Bn=^3e#09=_E_9!wjkx^1oQWqx)pu6}X zW9qndWJXW??PrTAXZKk@&AD9@Kf?Gl+uGUbnQA^whPXmwqWP3;0o+?!#x zC<_a~DG4aYVORr6vLNN;aj|S}aek~!aR;oyU)V_EoLM=+RcHP{?U=7PoL`Ss@$32< zxw*N~{WDD;4l@P$|D!Pf)8IK8b%MFL?1D`&;zxL@Z`*m-$DnDbMmNv!A4xc` z%v+BTN+1l#K!!9l$Vf^_aoz}PTfwwl3`j$O*hG0pdF9{(HYFIX(!+-VCl>_Cc*lCe zQ24zc*H-_VY;s!hc}1Z}V+B@#oYqy;U-w1$M$moW$ykXUBX>Q0BL!F~SF9Bv9rKQZv2-dgb8jcWWVO zv$7*iwQ zvifb#Pnn}(A}z-@lvXzDB0w8|Y*F2U1Y?fsA9@chLW>rQGz;L0(Lmnu7_A$r!&pfJ zi%T=DAyNxx(nc~%^{11v^8xD%pD(@CCwpu?xU7L+bm{4}`)XHiUIV@ss?l2San-ES zF)6VDOPwJOdxI${*A^FEgGFOM7iwe*kt1>ICQdnGSDpFE3q8>quQQ6$rSH6bzc3l% z0ep&yXI9D{?{XI8G7*lT;u4qeX&A{%D&^juAKBR5Rh>#Q<&#%anSYm$3|*36Qx$y^ zXft~AowxUjwfDh!zLpt`TIsP$QJCaSs*der4c6rZ^5~>{T1umGq#%>V>y>V6d&TXp zqs`py+)QQWTdTenTXBxb!=|K}1cV@_wizr; z_0@3D}Zk1pdVn`kP-jy56C?skMH8LpVq~+wPgv6V~#4)$*MDkCt0d zABdmvFGLijdv6_ffeC5*S}YO*R4|3nzM`v&$2-?amrB@Tdd1k1$u@~qqZ-JJO1&Tm zzU&b!C{HU!QBve(4CC)u`k+IVes_WDIh9vM| ztmU`1@Pg^PH_YR+XqD%XKqOb`(R;b4e8fSTJreXcN%BF=J3q?^j<})?IbPq7OKyR= z3K-B%`ww#Fvmwzi*fXzM zyITx3s=J?|1bt!-Sa(laYr#h3eJhulM5%ehQuQ$a0FnN;GOf;$ouOw`;E-*6JP=7G zg5KRG3)q=dD{*qAyrgO^)X6r+({)NznIk|MB>McjI3PstV2C$GMWQ;|)E`p>auVM; znaW$VFD@Ci_jGWco0jd^E^^y7D??5Uv7)9;bI-O6IkP>8G24*yeqb)uK)Ubx*F>_U zejZV`mX(TolcYXkEzA<`mRiqu&kr=w3D=M999q9eT?WiY1awEUFvs!E?cnu&sli{g zZ6)s-#C|<#r%@iKY78$`{X9` E4@f9D761SM diff --git a/resources/assets/tinker/textures/items/arrow/_arrow_fletching.png b/resources/assets/tinker/textures/items/arrow/_arrow_fletching.png index 22451c9352765cd0c3b7c35417e9d981e4b7f416..ffc223a5b821e5e0dd4e1cd3341329a5d52c5d82 100644 GIT binary patch delta 183 zcmXRr$v8o>o`r#dVe2pRS3rufILO_JVcj{Imp~3vlDE4H!~gdFGy8!&&H|6fVg?3o zVGw3ym^DWND9B#o>FdgVk5ht+lgr_*Y&}rO*VDx@MC1J1K5Nkf3IZ(YfsVqyA{!g$ z7z;^DFpAIC@|9b%=**SP@;`1iGaOEaktaVt4Nf^~7iiAK%fWq;ZeH<>iQ`0w!H&(GpZ zyiA&Gj494$d3QW!F)H{PID1^`$>WHemB_Xrn~mYjQ@8NVPgynr4Px+g^>bP0l+XkK DS==R> diff --git a/resources/assets/tinker/textures/items/arrow/_arrow_head.png b/resources/assets/tinker/textures/items/arrow/_arrow_head.png index 613ec83dc9cc1bdcdb57d72e68cd1b0cf0c5b5c4..f6f59c5dc72ec7e8d1a2fa88e8bf40b9af6be902 100644 GIT binary patch delta 141 zcmX@kxS4T+q%sQw1H;x|=C6PhV{wqX6T`Z5GB1G~rX+877ls}A<`O*Kk56=!*hy9yWr)V|NkHVzx{vq t|Hp>^zWwk2A!=aYuwgTe~DWM4fXG%6D diff --git a/resources/assets/tinker/textures/items/arrow/_arrow_shaft.png b/resources/assets/tinker/textures/items/arrow/_arrow_shaft.png index 1d2ba201b3e62d44c462590d9a35f641358e957a..8b3dfbaad65594d1224c643b5aefb90fb86e4f98 100644 GIT binary patch delta 126 zcmX@exP)#)b#=|LZxrId_+s)ZN|x@K>fnZS@8(V*`N+ c%LEu0%qJRZW&D}H1gM9>)78&qol`;+006TpR{#J2 delta 155 zcmZ3&c#v^|q$(Q&1B3kM|A|0~u{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstP^b{vL#Af zBT9nv(@M${i&7a15;OBk^zu?m6ioCC^o)C+O%DKSGV*kB46*P}mPlK$fB*mgO|0Di zoOdo^p1`=j{=b|l3ugn*&f4GKRw#NjtZH-E$;>Aq!LZac-rDki+asWE22WQ%mvv4F FO#oM9HHQEI diff --git a/resources/assets/tinker/textures/items/arrow/alumite_arrow_head.png b/resources/assets/tinker/textures/items/arrow/alumite_arrow_head.png index 358e62bdef0426da66fa70316261f4e4a46fdc2a..9b6026cc7e5c60a82edbb15765d2f5ae905b3a19 100644 GIT binary patch delta 179 zcmd14z&Jsrp0PN{-HBn{IhmIX3=C{Z-tI08|3PrU-sO{lBAf*tk;M!Q+`=Ht$S`Y; z1W=H@#M9T6{T>&qpppgmEsm)`p#V=8#}JFt$teoLdt$0z+cN`!@=mFpPg^DS+10r3 zVKnGv`nHK@zkE&Vk6#~Tn=3X*o#adSQKb9q?Em@s`~J5}dQAK;DIp;-L&EK#hJ+Xc ZL**?c4>iri-9W<`JYD@<);T3K0RRhSJcj@P delta 77 zcmcb>m_0$o-N@6$F{I*Fa>dSX*Xjk*6vP`$>McJ%vv*}X$n*2(GwaH>29rjUW}by7 gw0RaMi1frTFz|RA&ab}M(8mA-p00i_>zopr0O6D#A^-pY diff --git a/resources/assets/tinker/textures/items/arrow/alumite_arrow_shaft.png b/resources/assets/tinker/textures/items/arrow/alumite_arrow_shaft.png deleted file mode 100644 index e9dcabed947bce139148fe1a2a813a7db8e8d4ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`+MX_sAr-fh6C~mu1l?Nq-#okj y-|`a;`}hCrlWIykG2J-djd$Tx#b)*Y3=H>mQuT5}R%-*bF?hQAxvX&qpps@{mPR^IDA3czF~s6@a*Bd*$t#0D=?Orf626#+oB8l$dld-2$YzVbX_o{=p91T!Su4r)k W3C-)8bL9}wbOujXKbLh*2~7ZdayelD delta 75 zcmcb}m^nek)xgumF{I*F@{22pKll&vJYkyfY$=<7^9eJKv=d9CjCdI{nKIcVohF7$ fxE<7x*vY`qGeI)bP0l+XkKP@5YF diff --git a/resources/assets/tinker/textures/items/arrow/ardite_arrow_shaft.png b/resources/assets/tinker/textures/items/arrow/ardite_arrow_shaft.png deleted file mode 100644 index 28ae935289b2af2acc20d4fa27b1f4cf01b36078..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`s-7;6Ar-fh6C~meG&Vl8=Lk+Y ru=G}-^9A0>EQ2hLvpkYEKiL@~mg>cDdcBMQYGCkm^>bP0l+XkKG7TC* diff --git a/resources/assets/tinker/textures/items/arrow/beheading_arrow_effect.png b/resources/assets/tinker/textures/items/arrow/beheading_arrow_effect.png index e8f62de965fdf9fbad2ce315a07281a0a83ab438..b12004587851f16b47371843963c8258e74ba3a2 100644 GIT binary patch delta 210 zcmZo=e8)IJrJk`k$lZxy-8q?;3=9lxN#5=*4F5rJ!QSPQfg+p*9+AZi4BWyX%*Zfn zjs#GUy~NYkmHi$UtDrLXTEU1zK%qQO7sn8b)5$3cj1rl@{*+%olRV?kmYzl+aC|$N zhxuf~@jDOpmy~|{KTp5^-{%?9f6~=lH!q**{o=oSPYsX#zM9k>1;5n}pRewhl<+Kd zY@2`Qzp8$#1PBx@-7Rr~Xfg)Y6eeNKbLh*2~7Zc CX;6p& delta 104 zcmV-u0GI#n0fhmOBwRC93jhG%vLk+wI0HEV0000< KMNUMnLSTY$Eh=LG diff --git a/resources/assets/tinker/textures/items/arrow/blaze_arrow_effect.png b/resources/assets/tinker/textures/items/arrow/blaze_arrow_effect.png index 20114e406150eeacac22ac5eaff8b69c5d2ede61..a5fd2704e3d7fc2726917eedcf32a1c2c8959b67 100644 GIT binary patch delta 234 zcmbU}oXkrG1_rhyZ+91l{~)+v@AAn&5zYdS$YKTtZeb8+WSBKa z0w~B{;_2(kevgY)P=#&I!%aJYLhYU|jv*GOlM@!0UznEif4%O>fAe$BzQ5-2Cw{_7 zUh|gD5NETuf6pAKd89q(yvLejE9dU~zy5yh$&?NCpWWDipl$W}dLyB?O(2Qsc{ZmP ztkgMI@b#y^+l;hDF$|j{gCplC?yfOX_WU>Z*394cPn~-8|H`?TISbEOB$z#BwaiR> fk}b!&gqb1mrqfYp&sAzbH!*m+`njxgN@xNA&Prt) delta 96 zcmV-m0H6Pd0)CJrT181jK~#9!V_={b(3WKX55iQL70(Y)*K0-AbW|YuPggKPB~!-jSoL|tN;qddAc};Se#By zkcdnu-uC4G&BQnVPhQ%i6#nb~|MR>4m-|io=|Ao4|N1Kvmsh&3`||(4{i}cXBbK}E zOZzm}cjA10qksp`88=oYZ()cuGd?KEG>6B${C`Tp`PxGkTRyQftdRB#?W{<*0NTXh M>FVdQ&MBb@0K_y?f&c&j literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/arrow/blueslime_arrow_fletching.png b/resources/assets/tinker/textures/items/arrow/blueslime_arrow_fletching.png index 2f0b1ac95a6f1453a8610ba42dddac34dd69e357..c551878c8d63cac67f73c74cef637cb4e1cd0a18 100644 GIT binary patch delta 182 zcmXRv&NxA$o`so#f#L1lM?pY}u{g-xiDBJ2nU_Ege}GSj>;M1%1NtYXt=mv?;&|MG zMXp}r%R%Z&g8YIR9G=}s196hP-CYkh>GZx^prwCn_40-{WExR1yCcILV8Ffg#k>#WBRA8v!ojX#XImo>bS8@QG$k@J{OyrYxpM#S8=wUYp00i_>zopr0G(nxf&c&j delta 127 zcmV-_0D%A10mcE4B#|*Kb=?OG1}hk5#OKWb002`-L_t(I%VY4YZ~X6B-}s+_Ou)pz zz`!7@ug^fPL5vIx3=E$2jsIo!^%?l2#2Kz`-^H-Kv7V767cej|Fz`uno<;xw002ovPDHLkV1kUiH_QM4 diff --git a/resources/assets/tinker/textures/items/arrow/blueslime_arrow_shaft.png b/resources/assets/tinker/textures/items/arrow/blueslime_arrow_shaft.png deleted file mode 100644 index 077d3ed39d1b47f2d8dc600e55d5f1f28b7d350b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)J2#s)OVQEYO+cYUPZ!4!i_^&o5^)ap7C-ja6?~`< z`eLw^>bP0l+XkKFrGtu diff --git a/resources/assets/tinker/textures/items/arrow/bone_arrow_head.png b/resources/assets/tinker/textures/items/arrow/bone_arrow_head.png index a50bfcc23bb0c6b83dba61efa99830d96e9e7679..c91c17a9ba240ec6b81af0eb5ea28415ff020829 100644 GIT binary patch delta 174 zcmc~k%{W1&p0PN{-HBn{IhmIX3=C{Z-tI08|3PrU-sO{lBAf*tk;M!Q+`=Ht$S`Y; z1W=H@#M9T6{T>&qpt5E~p`;p6$lKG!F~s6@a*BfRoBP{;*)s!y@=hsHQ5T7K_7%>v zj{W@|_W%F?_lN(pfB*KsUDCynpVLqd#!A?vsLvl{-= R6F_qrJYD@<);T3K0RUqqJtzPG delta 77 zcmX@jm_0$o-N@6$F{I*F@{RrZU+V?Z6vP`$?00PcZ|}->kmu+B_so@T4JM5y%{&WF hX!9&i5b23wV2IwXx2ETMW(ETgc)I$ztaD0e0s!n>9<2ZX diff --git a/resources/assets/tinker/textures/items/arrow/bone_arrow_shaft.png b/resources/assets/tinker/textures/items/arrow/bone_arrow_shaft.png index 36c2c70d3651309ce191eefcaea0617fd4d8ce77..b205e8109b1602596aeeb31ac541b2e27fc62f32 100644 GIT binary patch delta 178 zcmYd2%s4@!o`so#f#L1lM?pY}u{g-xiDBJ2nU_Ege}GSj>;M1%ZEaQFKHGo!)SL(R z_Hzr|E(WP93GxeOaCmkj4a7`sf zJx&QOPP6GAsp9}6Lb_9Bv=>lC~7nZ3Qlh@@HsGH0zm T<#d(+6*G9c`njxgN@xNAk_9zO delta 83 zcmX@im^wkimxGOgfkFQB|3o0A&qpc;$A&5dF}p)gMu#}JFt$teoLCT!Aw(-VL|C4BMn*<6Re#g=!N zGb}UIJl*r~=iG9h+vRr?SHxHMO>B)|er0@pUUJK=Kk-4X9gT_N%s&~PNwEQeT3et2 dR~st>!!~vC^Tv5iJAhU&c)I$ztaD0e0sy&-K864Q delta 76 zcmcb{m^DGg&Ct`uF{I*Fat4ptFaAS3Pnae=3pPIdFE~Zu%!K3B#wUzfmT)eSOyO{i gOO#+;obZH+L8o6KMc97bbOs>sboFyt=akR{0ClMwrvLx| diff --git a/resources/assets/tinker/textures/items/arrow/bronze_arrow_shaft.png b/resources/assets/tinker/textures/items/arrow/bronze_arrow_shaft.png deleted file mode 100644 index d097cffbcce8b54ea48390fba738754dcfbec151..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`TAnVBAr-fh6C~megogjBZ&5p3 w-^Ek0$2|FpfQhr;SsrQAmasOSd4HH0jvloswBzq^1nOe&boFyt=akR{0Mt7iqyPW_ diff --git a/resources/assets/tinker/textures/items/arrow/cactus_arrow_head.png b/resources/assets/tinker/textures/items/arrow/cactus_arrow_head.png index 1f5aecb57fc2062700b34a8098cbbed8477a7955..b68fc8bf1149aaa12eb80d3bf29df75242882c8a 100644 GIT binary patch delta 165 zcmc~g#5h5vp0PN{-HBn{IhmIX3=C{Z-tI08|3PrU-sO{lBAf*tk;M!Q+`=Ht$S`Y; z1W=H@#M9T6{T>&qpsJ$62eU~)Atz54#}JFt$teoLAJn}5q$dD@lDl&Lq9gz9lC3|P z#O<>C|No6<;{QZF1<5n>guea1^!4Wx=?3{X^_vbQi1aia6G$`2 i5Q@CQFbYP&$OQmbnH$K1C3TSi0000&qpc>x-o(K-0ke8>6V~EA+bPKUt;z{fTtL8(uabP-_b`;A&%KVAv-mwR6|5 S|L1_lGI+ZBxvXAyWf8|>wPp~SSJ(XJiKR89;%!Cu6?@t=DEa6-tnZn^3 gmngxyIN=Es16!Hwtp(FVdQ&MBb@0IlX6c>n+a diff --git a/resources/assets/tinker/textures/items/arrow/cobalt_arrow_shaft.png b/resources/assets/tinker/textures/items/arrow/cobalt_arrow_shaft.png deleted file mode 100644 index 7d16c19b89ec04058da4f4295d72b1d6c3fcf46b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>Ygr+Ar-fh6C~msVh+Bx=Lk-5 tc(UsI; diff --git a/resources/assets/tinker/textures/items/arrow/copper_arrow_head.png b/resources/assets/tinker/textures/items/arrow/copper_arrow_head.png index 45d399c6200c098184e20ff38302dfa631130089..bedc2a1134ceffdda27f30debf240f24965f547c 100644 GIT binary patch delta 186 zcmd10&NxA(p0PN{-HBn{IhmIX3=C{Z-tI08|3PrU-sO{lBAf*tk;M!Q+`=Ht$S`Y; z1W=H@#M9T6{T>&qpsG%sqnAEVDBRP=?Orf625qTAH(5g+VUOd z49g6U`}aS*xYwO$_PUyc46B0&PB^V$^fggenD+Cf%`g4sD#s5LJY{BPUiuHLIZ1+b daY6(GL(U@O1TaS?83{1OVq=Kym;8 delta 76 zcmcc4m^DGg&Ct`uF{I*F@`}v~Kll&vJYkyf%vh7@zorpK+KJU>wx4(yGnq2kB%LOP gOSm1>kl4wYgr+Ar-fh6C~mkoF+fC=Lk+Y tu-a^Ipz{SD%gIUxSsZJ5ByE1OGYFnD&v#@gya&|6;OXk;vd$@?2>>vi8Jz$C diff --git a/resources/assets/tinker/textures/items/arrow/diamond_arrow_effect.png b/resources/assets/tinker/textures/items/arrow/diamond_arrow_effect.png index a83fd965d639a0b1f5b1bd08863b40d84a0cb773..27cc919763a0d693d3ab802fec62aa6d8eb49e71 100644 GIT binary patch delta 142 zcma!A%{W1&p0PN{-HBn{IhmIX3=C{Z-tI08|3PrU-sO{lBAf*tk;M!Q+`=Ht$S`Y; z1W=H@#M9T6{T>&qpsM*5mFB}hA#G0=#}JFt$teoLEAnT3o!Mpfy2|)&t;ucLK6U0a4wJl delta 60 zcmZ3@7&Sq~OwrTDF{I*Fa=?9)*Y+I76Sy5_^~TR%)~Cp`I6$( P1|aZs^>bP0l+XkKlbjU1 diff --git a/resources/assets/tinker/textures/items/arrow/emerald_arrow_effect.png b/resources/assets/tinker/textures/items/arrow/emerald_arrow_effect.png index 828c6248fe9473cb8e3bf6a0eb969f877a478044..696306db6f72b36b4ce979efb36c003cbaf1677c 100644 GIT binary patch delta 144 zcmYdU%Q!)$p0PN{-HBn{IhmIX3=C{Z-tI08|3PrU-sO{lBAf*tk;M!Q+`=Ht$S`Y; z1W=H@#M9T6{T>&qpekRtBKK*akglhTV~EA+m@+}dLEF>CF{I*Fa>4>BjSQjTe aVPZINR8V!#8{ta~K;Y@>=d#Wzp$P!}{TuxN diff --git a/resources/assets/tinker/textures/items/arrow/feather_arrow_fletching.png b/resources/assets/tinker/textures/items/arrow/feather_arrow_fletching.png index 22451c9352765cd0c3b7c35417e9d981e4b7f416..fab341b0594fd92f362c587d0eb1b19263a70505 100644 GIT binary patch delta 183 zcmXRr$v8o>o`r#dVe2pRS3rufILO_JVcj{Imp~3vlDE4H!~gdFGy8!&&H|6fVg?3o zVGw3ym^DWND9B#o>FdgVk5ht+OJRd|dlpd0*VDx@MC1J1K5Nkf3IZ(YfsVqyA{!g$ z7z;^DFpAIC@|9b%=**SP@;`1iGaOEaktaVt4Nf^~7iiAK%fWq;ZeH<>iQ`0w!H&(GpZ zyiA&Gj494$d3QW!F)H{PID1^`$>WHemB_Xrn~mYjQ@8NVPgynr4Px+g^>bP0l+XkK DS==R> diff --git a/resources/assets/tinker/textures/items/arrow/flint_arrow_head.png b/resources/assets/tinker/textures/items/arrow/flint_arrow_head.png index ce4e62d37e6311ce72e197b18545c0904761af05..ffa643d5514e7324c6293fb26365e06e0bf7fa89 100644 GIT binary patch delta 162 zcmd1X&p1J)p0PN{-HBn{IhmIX3=C{Z-tI08|3PrU-sO{lBAf*tk;M!Q+`=Ht$S`Y; z1W=H@#M9T6{T>&qpgPlrg{nzFA$w03#}JFtZ!c^VJYc}XX;MAGI@F25E#n?FZLYd0b+ybAVobT*1`+l#MkGXE2`;|??;A}y{Q=nN4p00i_ I>zopr08<$^H~;_u delta 80 zcmV-W0I&bQ0d9~aN;OGDK~#9!W6;ph_z%JiKhrPLRU`!0000Lnuh@L2Hh&t&KdxXK_QqsqX*z`&3` zUxZ=(vQEN*g5)%Y1$uf6|1~ukem~p8@N!oYQE37mjVHGsW>|aqGQ&bvR)%+1mN5wF zL@~VDolH1ZV2spN{}~v<7#R#b`571(7~ly-jDP_cDRFifBPoNqr!6eN2)cmeq>K)j e7$^h-ZvX(99PUNR^I#(Y0000m ztWbvkzKo3j7wGBz2ZaZ6IK*f5V1x^@7+ex$2)bsFK>?9va5cyV!^Bx&ZcSbFpAp7J zroVsvgv^DrVd9J+Qwf2jGyK~A zp8*(NaAib=0Wh_KHGphJ)(jFP$^f`^SQrGu0E-?Jp@BDG%aYGd7cw?ift=;(>gTe~ HDWM4f{stZ9 diff --git a/resources/assets/tinker/textures/items/arrow/ice_arrow_effect.png b/resources/assets/tinker/textures/items/arrow/ice_arrow_effect.png index 1b362937a31da0ca0417aee9dff07bdade910bde..f6d61463cf77d43a69302cae4af27d0f4adb91a2 100644 GIT binary patch delta 166 zcmXRo%s4@%p0PN{-HBn{IhmIX3=C{Z-tI08|3PrU-sO{lBAf*tk;M!Q+`=Ht$S`Y; z1W=H@#M9T6{T>&qpqfbkh7$H4JL!z?gup_+!z=fu1ai)`dlpqG>^g4 L)z4*}Q$iB}ocTGj delta 82 zcmV-Y0ImPS0dSBcOgBkHK~#9!V-V2``VYbkYrn5C8xG diff --git a/resources/assets/tinker/textures/items/arrow/iron_arrow_head.png b/resources/assets/tinker/textures/items/arrow/iron_arrow_head.png index caf933598c4def78648d588084367d4d3b17405b..a360f98109fde3d1cca8579cba721d3714a85849 100644 GIT binary patch delta 167 zcmc~e!Z<;tp0PN{-HBn{IhmIX3=C{Z-tI08|3PrU-sO{lBAf*tk;M!Q+`=Ht$S`Y; z1W=H@#M9T6{T>&qpqfSzoKF{I*FvWC9yU;aZpPnae=Yi8&FxBP^{3`GTpX^INI3JgXqO6v`J dngR`q7#Th#sLRhy(Ky2Z1fH&bF6*2UngH_+8KD3G diff --git a/resources/assets/tinker/textures/items/arrow/iron_arrow_shaft.png b/resources/assets/tinker/textures/items/arrow/iron_arrow_shaft.png deleted file mode 100644 index 254ee4faa1aed72e734744399b72c0bf5b9a5e01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`TAnVBAr-fh6C~me96kEfo+CJg wful#NDeFY9w7DDa!d69gez`yP6`%MS%Ab1G`t7~d0o29d>FVdQ&MBb@0J$a{#{d8T diff --git a/resources/assets/tinker/textures/items/arrow/lapis_arrow_effect.png b/resources/assets/tinker/textures/items/arrow/lapis_arrow_effect.png index 018bebc9bd01811abb91c568ae97a1e0a78d277a..8096f8a092731d7723ebf5a522897f8b585c2286 100644 GIT binary patch delta 149 zcmYe;#5h5vp0PN{-HBn{IhmIX3=C{Z-tI08|3PrU-sO{lBAf*tk;M!Q+`=Ht$S`Y; z1W=H@#M9T6{T>&qpt_)me99i6kddd0V~EA+=fe`(+6|C1NBb4C`2 t`7s{;UA_I}=Ga^1|LQ?<&iZ#4Dr$Jy8TgOoy#i`y@O1TaS?83{1ONvyG==~G delta 66 zcmdnQm@q-bM%~lJF{I*Fa)Jcw;)ExRnfHJG-??S=zsb1_9>piWgin!XDmwXqQ=Gx1 Wly~Rju9w#tfWXt$&t;ucLK6VKsvHIY diff --git a/resources/assets/tinker/textures/items/arrow/lava_arrow_effect.png b/resources/assets/tinker/textures/items/arrow/lava_arrow_effect.png index d020a471963fcd3a6cb0a0d0d3e93c4358ab1ea4..d7d4f074289168518c7afbb74a32ef6531112061 100644 GIT binary patch delta 145 zcmYdY$2dWyp0PN{-HBn{IhmIX3=C{Z-tI08|3PrU-sO{lBAf*tk;M!Q+`=Ht$S`Y; z1W=H@#M9T6{T>&qpql)tJr%!zLVBJqjv*GOlM@!0Tbw@d;lB>^;rdOc|9>9-@c+CM r7tc>_)0Q0O1ieHF*2M`Gj12RvMg3=+9ox&m4bgTe~DWM4fPsA{! delta 71 zcmZ3-m^wklQODE8F{I*Fa>4>Ji_-@_$hVxl_9tCY;J@N!fenlfXX{UvGM*7=3pC(z b(_>%|d@ky5A|w2i0SG)@{an^LB{Ts51lSrP diff --git a/resources/assets/tinker/textures/items/arrow/leaf_arrow_fletching.png b/resources/assets/tinker/textures/items/arrow/leaf_arrow_fletching.png index 5854bbe37bffb1246d9d06f9fd98e93f7cf01aef..97342bd46a7403ab2b4872a22fd86ea94ec59009 100644 GIT binary patch delta 182 zcmXRv&NxA$o`so#f#L1lM?pY}u{g-xiDBJ2nU_Ege}GSj>;M1%10Hm%Y$S;_|;n|He5GTpo-G!lpRn`N@;VkfoEM{Qf76xHPhFNnYfP(BLp1!W^ z_c$fExETK^O*a7wsd&0LhHzX@PB2&?DV3WyV9*65Z4E4?$j~C72x(zgm!PC{xWt~$( F697l3B^Uqz diff --git a/resources/assets/tinker/textures/items/arrow/manyullyn_arrow_head.png b/resources/assets/tinker/textures/items/arrow/manyullyn_arrow_head.png index 18bc40ce9142265d8c126135fbf78ac4473ae387..a4cd1c1a4cc4ea07a80ba2073549d6eb2e38b17a 100644 GIT binary patch delta 190 zcmd10%{W1&p0PN{-HBn{IhmIX3=C{Z-tI08|3PrU-sO{lBAf*tk;M!Q+`=Ht$S`Y; z1W=H@#M9T6{T>&qpeCRC6qn;bp=eJR#}JFt$teoLKR&SjNlyR*mGH&8!ZZ$_&0gJU z&amvF?y?yVAMSMLF<-wn?Z&4}W@YY;Y&jM`w=_;{Y;1J=8}p*RQrWU?_H~I9>;~5j hK)|r4DbPTNfx*p8;;=!=3^kxV44$rjF6*2UngG1CLT>;7 delta 76 zcmcc3m^DGg&Ct`uF{I*F@`s1qKll&vJYkyfEUA0xe@!Efv=d9#9DX9nbcy8>k5P-# gdV`*(K!YMi1|?PLXbGJq*BF4n)78&qol`;+0NQpPWB>pF diff --git a/resources/assets/tinker/textures/items/arrow/manyullyn_arrow_shaft.png b/resources/assets/tinker/textures/items/arrow/manyullyn_arrow_shaft.png deleted file mode 100644 index 1be08ff34be86a49c08f1bfae6469a392bf8fca8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>Ygr+Ar-fh6C~ms`W)Zba|EXx tShD8u;st_Va)8dZGaXGnQq#H2KP(L|sY22WQ%mvv4FO#p>G96ta6 diff --git a/resources/assets/tinker/textures/items/arrow/moss_arrow_effect.png b/resources/assets/tinker/textures/items/arrow/moss_arrow_effect.png index 4e18d6e3f0076c562c603597a45e34d9315bc620..a014e849ca59f03e67057403038617a05a64f82e 100644 GIT binary patch delta 175 zcmYd0!#F{up0PN{-HBn{IhmIX3=C{Z-tI08|3PrU-sO{lBAf*tk;M!Q+`=Ht$S`Y; z1W=H@#M9T6{T>&qpt>dFsxxjtAs^Pug{m*XY=!r!!&Uq)pY$?po1#|!_ri7 Vfy9WJtU!YqJYD@<);T3K0RVTvJfHvo delta 72 zcmX@Zm^MMhN!QcGF{I*Fa)JbFvrLA1_W$J`n^Rk#)>oGQWHez}BACK)Gp_Nb&qQ-K b#zY2&ggL_hH*=(JU;qM7S3j3^P6&qpoYnh<~1fjp&(Be#}JFt$q5pyixUhO+*115WWLwS8Tz&@_n&WM zQ~z(yLGE6vo iqHV%kE&;iiMs5ZcUSV&ib0--YfWXt$&t;ucLK6VSd>t_W diff --git a/resources/assets/tinker/textures/items/arrow/netherrack_arrow_head.png b/resources/assets/tinker/textures/items/arrow/netherrack_arrow_head.png index 8b5399e5d85050ff8ee79f2c570bb829cb6448af..875d2e26721c3defb30837b113ff3b09695d3425 100644 GIT binary patch delta 197 zcmXSU#5h5vp0PN{-HBn{IhmIX3=C{Z-tI08|3PrU-sO{lBAf*tk;M!Q+`=Ht$S`Y; z1W=H@#M9T6{T>&qpoVs7_rilfp(IZi#}JFt$teoLKQ?dvpPm2&Dxt}Jtw-zGfMDi3P-Bqb!=u&;Q;qI{9f$Fi_#Vq;^Y;+rL3>r;yp+1eKK oJYk-ZEdc~GB-{>aNQf~oT>32jc#3z570@~cPgg&ebxsLQ01`Atxc~qF delta 86 zcmaFFSTaE+z}nNrF{I*F@`v>F|NMt|o-j>#7J2B<|6(1T12c4-9i;e0#sAmuTGeag q>@dq=mSfw5x1yWo+H<)b{J_8&qpoZ)&Lz4)gP=Ke4V~EA+Dry< z49hm&NaQ&nIwB4KvH+h>;HXS|Nkel1wE-}0|K?SKm)EeRtAPE X+EOOra~9qK8qVP9>gTe~DWM4fPG~(; delta 76 zcmcb>m^DGg&Ct`uF{I*Fa=})QfBc7do-j>#c4|TFe@!Efv=e<@|DQ-QU1GV!W7MLw g-k_%`(4dHsL1&ZP0sa{N!wf*+>FVdQ&MBb@0Mrc~rvLx| diff --git a/resources/assets/tinker/textures/items/arrow/obsidian_arrow_shaft.png b/resources/assets/tinker/textures/items/arrow/obsidian_arrow_shaft.png deleted file mode 100644 index a49e3fadad8cdd7557098f5450db8f5e939fb327..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`2A(dCAr-fh6C~ms{LenL=Lk-5 zs6R9{(D?$-NzNIjSsY@{C7OmTOLiJ%T>pP?ay^6VVJqjPS@8xyy$qhNelF{r5}E*Y C_8$5G diff --git a/resources/assets/tinker/textures/items/arrow/paper_arrow_head.png b/resources/assets/tinker/textures/items/arrow/paper_arrow_head.png index 6788f524781f117151d44f018a343e44689df202..4678bffe44064b117027b7284f2f1d85d28ba09e 100644 GIT binary patch delta 169 zcmc~j#yCNxp0PN{-HBn{IhmIX3=C{Z-tI08|3PrU-sO{lBAf*tk;M!Q+`=Ht$S`Y; z1W=H@#M9T6{T>&qpeA#qsznu0$j#HmF~s8Z+w&WF4=4z*96Xw9vEcpsrXoAn6QygE zz5NtjeD3%XIce)ubz3RY;K}kykZ^ypL~WGnd4${%4uq02hNsS Q0F7kuboFyt=akR{02!`2od5s; delta 79 zcmX@cm^(qm)5O!oF{I*F@(k1L!}S7b3gQhW@9$LpvUg=`G`Y9q;}3g|38@?&!W<1e j3r}eCEKU&ViD6*ac3&r?>?4a70}yz+`njxgN@xNA;(Q%~ diff --git a/resources/assets/tinker/textures/items/arrow/paper_arrow_shaft.png b/resources/assets/tinker/textures/items/arrow/paper_arrow_shaft.png deleted file mode 100644 index 79dea14b9f4bd2e4900947ca542e8b435a263686..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`W}YsNAr-fh6C~mkR8$_@a|EX_ za0KL>SQ9DD)~OiskuQ|z=FZP1PupU4m*q~_(USEt<--$sh99?l&y_B{SPwLT!PC{x JWt~$(698SAB$ogH diff --git a/resources/assets/tinker/textures/items/arrow/pigiron_arrow_fletching.png b/resources/assets/tinker/textures/items/arrow/pigiron_arrow_fletching.png deleted file mode 100644 index f3e6d65586894cbb3f43d57ceb3cc54140fc2468..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCijSl0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP(rH2 zHKHUqKdq!Zu_%=xATcwqM9KLZB)yPZ!4!3;*N<3D(7m22Y$8 z9KHM2o@er#iV1ELmVIyU`}2Q866Z^{MjnPtH?x%bRNEQ;A`FrYnzV2q8W?;jS_o8S<>}(+9b)01d?P;czkG}2308%(@?koR(oWkP z4V>@ETRF{BRA6?P<*284U7aVzdVY?yyJ=tBfdyQQ3_?pZ8LTV$jsT5e@O1TaS?83{ F1OPAIJa7O2 diff --git a/resources/assets/tinker/textures/items/arrow/pigiron_arrow_shaft.png b/resources/assets/tinker/textures/items/arrow/pigiron_arrow_shaft.png deleted file mode 100644 index 47a93bbd7ea38b31290715f93d741b90624c0d23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCijSl0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP(rH2 zHKHUqKdq!Zu_%=xATcwqM9KLZB*bPZ!4!3;*N_+& BJyQSx diff --git a/resources/assets/tinker/textures/items/arrow/piston_arrow_effect.png b/resources/assets/tinker/textures/items/arrow/piston_arrow_effect.png index 30fdff1d78061991aca4c9696cfc1fa1a2793a35..b4e966e1e62d07a18ec296daae02b8eb52ebf0aa 100644 GIT binary patch delta 183 zcmXRr!8k#po`so#f#L1lM?pY}u{g-xiDBJ2nU_G0Xn;?M>;M1%&z?P-8DeZ?WVB~S zQe<>&kwQQ-X_&TjqP67Enmu)5Xv+gyVX0f&xR!0+Y?1Of8ACbQnZA+g2JTERbSg Yn3T*oV@Zs77f>yOr>mdKI;Vst06rEqGynhq delta 100 zcmX@XST;c-j)RSXfkFQB|3n~V>*?YcQgJIeL84B<_{fj{H#evMpS-s6e9w~qZfFVdQ&MBb@ E0EJB?#{d8T diff --git a/resources/assets/tinker/textures/items/arrow/quartz_arrow_effect.png b/resources/assets/tinker/textures/items/arrow/quartz_arrow_effect.png index a04b12fe2f94a14ffdb5f16d51e3b08068699c5d..d724ede07f52f868eacdc28433b15d8a7e51a28f 100644 GIT binary patch delta 178 zcmc~j%s4@!o`so#f#L1lM?pY}u{g-xiDBJ2nU_Ege}GSj>;M1%JFAP=%$|7Z_^x-a zpOw@dUky@M666=m;PC858ivL>4nJa0`PlBg3pY5H=O z_IsQXTwDUvCT%|k6jJbXaSY+Oo}8e=!0hPAaW>@&qpr*?8{LA>S6G7^<#Be=akR{06<46wg3PC delta 63 zcmZ3%7&}45QpMB7F{I*Fa)Jb_#Db2-hxG~qlXDq7KF4QC1i5rFE=~}cz{L>9$0dJz SiS2O)AnQL70(Y)*K0-AbW|YuPggKPB~#IlWXVOQh`E+o-U3d7N?UF zBqA4Nx<2_Iy50Mqa<}2cMUjUiW<5N1bGgQ&o+Vl9x+BhcOyV}WefQz4a6gNtL`CJD zX2K>75@#!N?f&imTYtIh#DA5{E88Ztx`(Fiwho*%bAoBR_>BW|ZTA+bD@S&=M9emf faoBd2nUCT5fA1#e^ob9EmNR&|`njxgN@xNA-k4VY literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/arrow/reinforced_arrow_effect.png b/resources/assets/tinker/textures/items/arrow/reinforced_arrow_effect.png index 075fef0f6428ee1e7ed12dcfe1e79a3703939fcc..77a381cfc7510f6a1403c070f631a0aac2cb8e51 100644 GIT binary patch delta 156 zcmYe<$v8o!p0PN{-HBn{IhmIX3=C{Z-tI08|3PrU-sO{lBAf*tk;M!Q+`=Ht$S`Y; z1W=H@#M9T6{T>&qpr(HI-;kL=Axlpe#}JFt$q5pc2Rtr6-#>BL`TCMVwItK*lNQEL zcIc)!n76b_FrSOPf9S-410UvV-Aj;QUEClh#=!7ggtw}_pez??3WKMspUXO@geCxS C`ZZbr delta 70 zcmdnVm@+}dLEF>CF{I*Fa)LzN0gubi?Kvi|t&ID3`@iA3zfUBYF1c(=OL3NPJE*b1 aoPl9wnb4!P%LTO&qpr*wOy^C=`p-@j3#}JFt$teoVYt~KucmBYE0}1akeC9oypD*_R ze}U@X|F5E6{`YyZbVO@BhDw$}~t*U~e#~+cD|i|L3!hK9OX)#Bzzps6{Ef k!Qg~7&*B7;9;QtU46+rfzU6IKnHYe;)78&qol`;+0G*v6CjbBd diff --git a/resources/assets/tinker/textures/items/arrow/slime_arrow_fletching.png b/resources/assets/tinker/textures/items/arrow/slime_arrow_fletching.png index 9fe78b41dafaae2df468ee0144d485434232cdfe..dcafcf1e2fe6dac2c447f867b772c921a938e348 100644 GIT binary patch delta 182 zcmXRv&NxA$o`so#f#L1lM?pY}u{g-xiDBJ2nU_Ege}GSj>;M1%0~$Q@Hl#M4C{A4v z`?S%W3#6_j$S;_|;n|He5GTpo-G!lpRn`N@;VkfoEM{Qf76xHPhFNnYfP(BLp1!W^ z_c$fExI~}*aP|ZWsd&0LhHzX@PB2&?DmdKI;Vst E02+ZKmjD0& diff --git a/resources/assets/tinker/textures/items/arrow/slime_arrow_head.png b/resources/assets/tinker/textures/items/arrow/slime_arrow_head.png index e214d56ebaf88cd6ffcb986e0e0a9f88f0d7c036..2644d05e09eae5a54474474dc620d2880533597a 100644 GIT binary patch delta 185 zcmd10#yCNxp0PN{-HBn{IhmIX3=C{Z-tI08|3PrU-sO{lBAf*tk;M!Q+`=Ht$S`Y; z1W=H@#M9T6{T>&qpf-QfQnAZGp)gMu#}JFt$teoLEG8BI(i4C{C4BLUNgRh?SLb(_ zGc3D!!nyn5$F<=+>)-E9ym4W}+=;Cb%x1|3 delta 76 zcmcb{m^DGg&Ct`uF{I*FGDpUTKm3Pyo-j>#cExq$e@!EfG>^-jNuPKaGnq2kB%LOP gOSm1>kl4w0s(iKVVFn=ZboFyt=akR{0F2Ze6aWAK diff --git a/resources/assets/tinker/textures/items/arrow/slime_arrow_shaft.png b/resources/assets/tinker/textures/items/arrow/slime_arrow_shaft.png deleted file mode 100644 index afad823e6012a853111632b108983ba7c285302f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`+MX_sAr-fh6C~mes6_m?=Lk-5 xxZL?D(D?$-$=egGvN&{kJYz+E*ME2-&#>IjcKfW8h0Z{244$rjF6*2Ung9)|9GZx^prw85kJYlDyqr82*Fcg1yTp14TFsJR*x37`TN&n2}-D z90{Nxdx@v7EBiezRzWSEN88IZfI@RTT^vI!PA4ZU5Ru6I^=G+@y|7_d%2A7dr@IRO zsNZCm;l^)l$QCXfxF$>DW9GHsN68OT($gY}D?eB&d;Xgw`uNBDT*bDlCnuf@(zti< zC97Xq+L}i;b97pA{l88;oK@YiSH&$Msr2Ce`WwmLexKiegk5RZ+57eXQg@WR7e4$r z++L#7OyN@GD|>!*?!$e->m`7|z$AD|gBv3g1H;N1gO9zBe_jGQl)=;0&t;ucLK6V; C{bz^( delta 136 zcmV;30C)eK0;B&qpq7$dV)b*Nkb$R*V~EA+p00i_>zopr0QZ|N{r~^~ delta 67 zcmdnMm^eYjR>RZ9F{I*Fa)Jcw;sg&yUAD&m3O?JO)f!$*@R_LCtF&v1w9~e}0lNW^B#|*KYTXA51}heUe9FoI002lyL_t(I%k9pg5x_7E1i?!t9X(bZ z>Pc-G2&pCoxd5Bmiyr+Pl3G%;=>u?gfCi|lXZb}^M?`1la?Lx3nK8!LE0`5r*SUV? WR~N)iN-rG%0000&qpf+n$!T+;BAzx1y#}JFtZ_gPD9x&ixIXGF8qd|jX=0h82MuCTk;W!X_xM5g@{hddBf*nzopr027HHe*gdg diff --git a/resources/assets/tinker/textures/items/arrow/stone_arrow_shaft.png b/resources/assets/tinker/textures/items/arrow/stone_arrow_shaft.png deleted file mode 100644 index 2d33b96372ccbbcf13b9cb2109be7be086a974ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>Ygr+Ar-fh6C~meT)g&qpq6>?p7}gLp)^ky#}JFt$teoL5mGMy(i4C{DKvRO@!5Ls<`e(> z!WQ!M&x=h+P;pgeW@dJF>9Ie2^m4zXnDe@oX%)X-St)aGWLtCp_MsC84jfppGVe?L v{g7#miM-4|9in_b+xMJ3V!-8ga0Aeu7KuOZ7oIHxTFKz)>gTe~DWM4fpzKPj delta 86 zcmV-c0IC1x0d$ZgP&-LPK~#90W3V)c{13tm%fKtI@geA5X_L3^G}m! s2*?1CW{@Fdxd3Je*_ubeC>Z(x0MBV0o&5-Yr2qf`07*qoM6N<$f?KR3uK)l5 diff --git a/resources/assets/tinker/textures/items/arrow/thaumium_arrow_shaft.png b/resources/assets/tinker/textures/items/arrow/thaumium_arrow_shaft.png deleted file mode 100644 index 50070b32ec238b93435017af134566b555a2e2d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%``kpS1Ar*6y6C~msqI^E@U+Vaz zzKbWq^8c3=iWzMoscWTG+E}cv^O!rIFl%_lz`$|Bisj(W2f;wC44$rjF6*2UngELR BAE^KU diff --git a/resources/assets/tinker/textures/items/arrow/wood_arrow_head.png b/resources/assets/tinker/textures/items/arrow/wood_arrow_head.png index d891b2d86b9dbf5c79b214c68b85ff41af6f2659..192e47d8bb909c46234be8b29009766b352cf3b7 100644 GIT binary patch delta 181 zcmd10#5h5vp0PN{-HBn{IhmIX3=C{Z-tI08|3PrU-sO{lBAf*tk;M!Q+`=Ht$S`Y; z1W=H@#M9T6{T>&qpq6BR)}+Hgp&(Be#}JFt$teoL6|*}3r6&M^O8DYEEb503i{I}w zXIOUeU_i&if1ls;@W7?Ks?5ESEl1z}>ny>n&-JdJ9dCK2{F>hg1f7W@Jxz&> Z3~Co7ia4K6*$FhB!PC{xWt~$(69AExL4p7P delta 76 zcmcb_m^DGg&Ct`uF{I*F@&^;)zx;=Io-j>##$&(pzlbD@@eFdgV zk5iJvLc8$d&KW=<1y2{p5RU7~2|5Z4608e&6g8Ry1*bO{_#BupfuUJh?=?f}O~w`O TaymJS4FLZNf?+0pQ@O1TaS?83{1OSl19d-Z! diff --git a/resources/assets/tinker/textures/items/bolt/_bolt_fletching.png b/resources/assets/tinker/textures/items/bolt/_bolt_fletching.png new file mode 100644 index 0000000000000000000000000000000000000000..bb013bd9480661caf086feba32d92f2a7ed6550e GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf67>k44ofy`glX(f`FeQ1ryDFGJ~h9pUXO@geCynBs?_$ literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/bolt/_bolt_head - Kopie.png b/resources/assets/tinker/textures/items/bolt/_bolt_head - Kopie.png new file mode 100644 index 0000000000000000000000000000000000000000..80dea98b4c619c08017cdb4df76414a961a18f58 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf67>k44ofy`glX(f`FeQ1ryDP*2k44ofy`glX(f`FeQ1ryD!nkTW{|%-|??QpbGI+ZBxvXk44ofy`glX(f`FeQ1ryDhKbV@9u;c6n|HBcC4C4M;hU*zrz5(?z Nc)I$ztaD0e0sz77HxmE= literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/_crossbow.xcf b/resources/assets/tinker/textures/items/crossbow/_crossbow.xcf new file mode 100644 index 0000000000000000000000000000000000000000..baecc712a6e354dfdef4b22ce806548177b3ee18 GIT binary patch literal 2758 zcmeHJJ8u&~5T3j93pO7?!~H_VL*hX5eLT3Va8AUt!*N5Bs+v7d^Nw`mL(x7QL>&3l(AApw(XgsOdVr zPSf9A%dIxNdZ*dxI;)8&cD-8FDXo_hx&~~hr8St=t})f?&aVNR9`^RDb-(R78~Q9L zkFHZHUGbpp_Z`1o-*bCx-)S^@ZvQesw*FZ)(af519x`6F)vBtD&~jAPC*XPmm*sx$YFqSTH8I#AR(Rh!kNx;$T^I7FQDWlhwF7tr**pwdH6c0z%$QWekVmKNJO8^J}L)bJP(nuf`ki;?;$k>>-CCX`; zW4#barIv6fXr8@J#DIf=v|giUp4*#X)35aR6_I_=dF~8UwD_rA6Z)`V`;~3eMuQ zjo=jKfP%7g3eO3&>3jln@HzM&?(fX*>&efiDGTWSeDVTPcm>Rpc>%9s!iM|~;H$vb literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/_crossbow_1.xcf b/resources/assets/tinker/textures/items/crossbow/_crossbow_1.xcf new file mode 100644 index 0000000000000000000000000000000000000000..b2ca3b262119a04eb737a78a847ae30b7ecdfce0 GIT binary patch literal 3330 zcmeHJJ8u&~5S~3d_W31(5@>?ZNl+w(g9A>$ZBSYo#1C+s^I^$$LhMLM70D7v&?7pu z1r-G~NEixq5*6;;^8;Kbu^k`Z-0eAc!6_(0kiuGX^Uci8zGim3R;9LO?3T(#xl%O= zZCVlIs~{opnE~mmUyp7x0ndV>pgGWWg}L7~^j`&^wlHkAQY%_!*4nOYKt-?%nr}4s zs;1G{tX4J_lJjM&v{~KUHs)QH-L}??Ms6|Zwh3TKnHJ!>KEc(u8)pM{-EC|YOO?81 zEctUmxi?9vblIJHrD;^^rKe_t{Wr_yhS?l1kiCCbd77{*pF_+l)@ns{A~c&@%rE0t zC=?##^7+Eb{gq|5sU|+*pmB0jKZ)Wmh!O+e0`7+jcA8zohRpJ}&sNhk*4E9sd25Ng zYWzWqfjD9gNLLt)5&@hH;8Xyo12_}FSAcmezr_J~4sO8=@ie48Q@~$0`fAU^I_)*f zI!(28676Vr)S@XGwY#Dlkue&|ZdVGa)1XaViM4|h^O2-91Xx|A$3^=Xa#HDCE?FM7 zp-zQZnlMrN(#^ZinG?>V%p-HhPoO*-CnXNMop<7J0;(2$uRtJiqF=(g=ns}}(#Sy^ zPkn@wCZC25t^jhtW15p1TYRUve`=I$cr%%^L~kG1!x*^7zy&%~CxY?4$Ht3_FBcot zVy_ek#5eXftc!hMd4@(E#CO=C4uaV45Oq4ZwMPu_OOWUc#^?%n-lvy;+lw<$qPf?()7bDo9+>RnzY%;4c)_TYnhV>5p0VsyB*u zq$^q|+FX|Zyn1`p{G@6_o>;wGT>1mm`!dZNbrKYF;vk(g2WN#8;~Ya)%|Vf(2$T_U z4HfW&+#+&=L*>Wvbkey`hl@%&o>#TxI|clOBI%MJ!@A^mma$KXLy!@E3*gBh@$%6m zKN;{saGwkea5e+!^qBW0^?Ejv^?(g_&$i(v`%KlAc|YS Mfgc5S_JC*GU?+sD(=rvIK|rkSc|=kZTcFZisW5I>u5ys-~4%E=ak-A3)-O z{2P!sT1ZGfaPln@Kf*`UHc4&X*t=~~3OA?(Of)-hXLfeiJJ0JlZhO}{Y&5N=+p-C= zAeHeAs1Rrtq2|`7(|fGIOVFIOw=G%g`!Px35T5aqH)RQxAK)^@iJVtaY^( zoJUtVrLTO@arZ5^(|BR`IKSI$_U!%h4RZF6uFNx?%I9D>^>({1PlT2#Yt;?>YPH&< zO0`h6n83ve%!_d@O9`s*JTT9tWEMch6fJljDOytkwPB3aUQYY8H{8ENaYAz>l1#Ov zNaF-sFVF}k!KPu+zpxlDILYKjq9KoAmrBx;0%@2NLyCXR8fAW*5;y6C{TdZ)9ynLiIWcwM|qiwh;$e9q9*l+H|Ok&Hm>3}J^!xT z$#_2PGaT-lG~=5je0?DL2F3nB40O++u{Ria!o%C@)4=0b+b3chdpNL>k7(-5tnkm! z$9<6cQ|obm?8A-QLYY1%$9**a*0OohlRO#8EYwV~x&%R~W!!>AIExc@F1;DGB)vaw zbDdNnFEehPgV)74URR2V?_nxxqhOr*W!h(c<$i&5@JjP^=F$u|8hT7QFf64U17??( zL~Ms1MNt6C9CILuf&gj4JH{XiIHF@ljp85@Q5;}4;hiCN;SrdMr_^Z_L~jFpk+2r8 xErJuI19~(|Czv^fCJi%Kz?}X6+x?xV`z-rZGShYZ7vQ%bCpGJr@Frv`lJA}F(&zvH literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/_crossbow_3.xcf b/resources/assets/tinker/textures/items/crossbow/_crossbow_3.xcf new file mode 100644 index 0000000000000000000000000000000000000000..2c9b2cc846b695a088337a6dd91fc2f4e0bbda61 GIT binary patch literal 2851 zcmeHIzi-n(6n_3u$4wfwsD*_AOE9!Ussz$P)=I2wU6In%F_!Y9N?NI%kh1X?uzFzN zA7CS5vc!PoEfaqNp4-MH=6mP6whm>4O2Aon@4NTzouBW0_w4!I1LwHacG`Z&CA1aU z8Q($IGz_cg_RgpCN8Ewe&`tCu^m`KXy1Q7v1G(a1+lt?9dTzxV`1?>1>>8~P4^KL- zGwgT#{f**!+iUeZ{eiPCL}lRZHJ$2aRkRyGO`0~~x_5)CvOB*9?0P&rXtw;G=hW1@ zpgg%rDRq^jo`2~0z1Ayt$o~Cyd*~is2FTt&t1?aAmCwQQn%!L*7w(bkJl}JB?!!8-vCug^a3ot|UbrYR z1QoC0(lyK}WnXS(bcL6Jc`wxp0LrH5!28Iizmz})inaP6uhU07-=tXzB8fpum*^rz z+(ji4d_#)BVb*xCdC++%L zERq%_muQ(6zos{T+Kag^DL!RxGo{Z3$(iO_nt<*ZLWHS^5TB;LeLhK#`MY%<&~7VP zTnc2fb|p{&BUzT8*I6e#FOo3^5y!@4HlhWZjVJm<4=lO}CX+x5Y)Zy732-Ek#Bvtk zMb0kyD@7RUrfF$Ld5F}*Jeqk-b6qvmpv zyuv(}r2~mlnVhFyjk9=Ll;iixW`CAI1q#a9U-LTq8_$t^@JbKxs|c8K0d7u4IWSC6 zF36~s1Zm7Hn+6oeAui}C8^SmY;id(r;3I`>G2xG&Q5b9SEF=Tuh3QJ6Q6hFUC<)`Y zA^u=u0rm*b;ElBbeq(3YSU{Vm87yMU(f??F-`VbRY0YSEfc{Ka`1JchaU>Et#K-~|jFBZqNaVAi_^{WZ*UF5Kq5M#XjV?vA$s7D2AiVrzH5 z?%1uZy0@`pE!N!XR()&7UW}*wj=Ns53(JL=E&xR#T7v2N1*TGNPX}ze*V?XBy{2my z<+H%tzlbS#`F7LWwY_F_(`m8&R;|`@cEM77ELy6HXk2lVPsTXCjDZI5gEgo_&&B8&!Ogb1TJLcH3v zB;DcnzN{qir!UBOB7h7ONiyOy1$@CX+N@)d)-lQGj1DP9YDez@=rrn)GV-xugHEr<3#D_4*&5H&_>+1WQVz5K;Dc|V>7~g;6HG^`xDl#R+%|8b z2XL27I<1Co`*Y2_xP!z^T&DAUb0~5uFRSkOxq{3u0?0s7cjos=o*D8Qb%&}_eVh+I zDi1dmD}#nU>MSle2B@)tAB8;keG0<>{o{xQK^O!uQ~V<+QNR)%_BeooPzgr?Y3zxe zN`?YY>`|jZ5WWd;YQ+lh5gfxB5+6s`F&xLxq<#V|csTqY?eE*$r^#{2Wv<~9;PThS zNY=Ud6JWW*e@?Qrau3_B7nRL=qtbfrfR6%5NPY(gSWf%Rx+3)XLt=;cuVa#bOw1OP Yc?%$)34Z3>`Iq^~iU;(SU!zDr02U+KFaQ7m literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/_crossbow_binding.png b/resources/assets/tinker/textures/items/crossbow/_crossbow_binding.png new file mode 100644 index 0000000000000000000000000000000000000000..f1aa09145bd2a503131b700a1217b3c2ef0f6261 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^MeG z;2pW})j$!>0*}aI1_r*vAk26?e?6wrOx!ho zn0&jp^V%z=Lkux47A{N&&h|uQe-sLxdPXOF(W*;xjQ9MEYBzMN_$U_Ob<#FKtX}!V ngZ+L#L?-O}ANZ=U;|1G1%b=3WCwF%P9l_w~>gTe~DWM4f1;<#2 literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/_crossbow_body.png b/resources/assets/tinker/textures/items/crossbow/_crossbow_body.png new file mode 100644 index 0000000000000000000000000000000000000000..a5ebb6c413865d63a4e2b6ea378fb1730ee8458a GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^O1` z@N!aVK2U_Sz$3Dlfr0NZ2s0kfUy%Y7WH0gbb!ETDDa*mem~!?HNNBpJi(`nz>9-R% z@;WQ>u=1W#m=ZF@GUxo{p@Bw2pgU?QiP5-}rhzx1cA7)^pUXO@geCyM4QfmP literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/_crossbow_bow.png b/resources/assets/tinker/textures/items/crossbow/_crossbow_bow.png new file mode 100644 index 0000000000000000000000000000000000000000..54702314cc4bcfc2983abdc42e7fab48785428b6 GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^O1` z@N!aVK2U_Sz$3Dlfr0NZ2s0kfUy%Y7WH0gbb!ETDDa*koKkv{%cA(H=PZ!4!i_=Rd zALKovz{7Iw{E}v;-+{N>k+%|aPdl|2o%^~} z$IxxbaT%wIE8lC`1zwuUAOGmFU{y^WV_q6#z}0{A&aPQDMN9dV<@F%0U@y%;uZK4N z+j5hCq#LhJ3v)m7$t*W?YTSV$^WD39RN`+vt_}@uSXLVQoblbc`?< e%H`k5KVW(}FU+Ks$s`r%Tn0~9KbLh*2~7axh-feX literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/_crossbow_bow_1.png b/resources/assets/tinker/textures/items/crossbow/_crossbow_bow_1.png new file mode 100644 index 0000000000000000000000000000000000000000..54702314cc4bcfc2983abdc42e7fab48785428b6 GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^O1` z@N!aVK2U_Sz$3Dlfr0NZ2s0kfUy%Y7WH0gbb!ETDDa*koKkv{%cA(H=PZ!4!i_=Rd zALKovz{7Iw{E}v;-+{N>k+%|aPdl|2o%^~} z$IxxbaT%wIE8lC`1zwuUAOGmFU{y^WV_q6#z}0{A&aPQDMN9dV<@F%0U@y%;uZK4N z+j5hCq#LhJ3v)m7$t*W?YTSV$^WD39RN`+vt_}@uSXLVQoblbc`?< e%H`k5KVW(}FU+Ks$s`r%Tn0~9KbLh*2~7axh-feX literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/_crossbow_bow_2.png b/resources/assets/tinker/textures/items/crossbow/_crossbow_bow_2.png new file mode 100644 index 0000000000000000000000000000000000000000..de61cb12f07df672d3fccc9d08e26d40b8e486f4 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^O1` z@N!aVK2U_Sz$3Dlfr0NZ2s0kfUy%Y7WH0gbb!ETDDa$FwsVK%{02JEb>Eak-aeC=w zN5R7eJS^dJCvnIL3$`k7vNCh93L7xgGC48)39$E7Ke@Q~Zgp1L`SNW#cLFq774(ul zH5JVtFw9u?(j@-6sKXQS8kX#}%UM>P`aJs}pS(lh)#$m*2hJ!xm-(_{iqKlqwkgHS zwjSG-t8?1v`^hx1G%?!^G5Nc%b*(xT+kCv*({96VZ~ss10@qbvnp*7JdgilD8pDHk sk2(LXRQP>d!pK9Dv19k;+wu=s-!g@n>~wfz4Rkw$r>mdKI;Vst0C}rwJ^%m! literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/_crossbow_bow_3.png b/resources/assets/tinker/textures/items/crossbow/_crossbow_bow_3.png new file mode 100644 index 0000000000000000000000000000000000000000..cbb09ec3a683e50bd791268c655badcc98f24719 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^O1` z@N!aVK2U_Sz$3Dlfr0NZ2s0kfUy%Y7WH0gbb!ETDDa*mH@{fCR7EoxRr;B5V#p$(^ z90gkpcwFmem^RAwTyfI9!XT!^z-=hNxKm*fQ`L#M21dT!xewnX{rS<%6hG4w#C5Io zsLlC|e>czEIkU%g+3zi(Tk`^>4`+HVSarfO*!vSBza&GsV|*#%DjY)Ktxn co71a*;#P3+m83r#fR1JGboFyt=akR{02HZalK=n! literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/_crossbow_string.png b/resources/assets/tinker/textures/items/crossbow/_crossbow_string.png new file mode 100644 index 0000000000000000000000000000000000000000..a3b44903a74e30594a0ceef9bad284cae8f74ed1 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^O1` z@N!aVK2U_Sz$3Dlfr0NZ2s0kfUy%Y7WH0gbb!ETDDa*m8zeD=tYM@Ysr;B5V#p$CH zHwqq5;9-91<8-jWfK%Im<@SXNey-&nt}ReMis-0!-2LB|Or{q_&MbBf)v z-^#{hyLx4E-TTroGtkSi=VOS3pzZGSR{X*SpFf0_pS#QSe2(t7(3;cp&1LUDS>w;4 lIO9QHWOcV-B;Mle>k)La4N1=gG-(!)TeUD!6`@--~wu;Nh*#6m1QHBGb zvNuZzB)hCFW!qn_esteK%k&ljmOFcXJ04mvrD=-Lp6|)V!h(jMOMfrI@%T||jHLT#A?EEKuHBt#{Z68=ac&h(fO}g2< V-XOAvPafz>22WQ%mvv4FO#qvmXTJad literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/_crossbow_string_2.png b/resources/assets/tinker/textures/items/crossbow/_crossbow_string_2.png new file mode 100644 index 0000000000000000000000000000000000000000..8826593418987ec7a3ba045d2cc2decbede0c414 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^O1` z@N!aVK2U_Sz$3Dlfr0NZ2s0kfUy%Y7WH0gbb!ETDDa$Fv*j#a%4=6Ot)5S5w;`Gr; z8+nf^2srcpY7Q_^@HxcAbI{D>jpIWR`x?O$g00V@7ajh#`!eJIX}3%#sW2=xKYPDy z=>qe!IbVVudIYy#OD)cBPdR6)++r~E{BgSsC5@#DOIhCkeS4<=ZBX&{pWR<>=;cOV zQavD{Jj*l4(^L6hM{WDPFOna3?^og6`sh6~!vV|deNUFu@B0$pu=U&2!phYA5{Au^ WC6;&9^!EZ?$>8bg=d#Wzp$P!7+-qI{ literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/_crossbow_string_3.png b/resources/assets/tinker/textures/items/crossbow/_crossbow_string_3.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b87421e1e0586e3252e77b604b9e3f6986473f GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^O1` z@N!aVK2U_Sz$3Dlfr0NZ2s0kfUy%Y7WH0gbb!ETDDa*lc#C2cI8Yncw)5S5w;`GtU z8+ln2d04Km*KTQGS|}8?fMb_pp*&0VNm;9(jsMjv-A`P4*Qd+;XLm}thY-UK-Dgif z-12$%HElw%TXwFd*i4_g?(DT5n!Ov|n=fZs)fL2*)N^0m{&M)q{(CbVLhEPWl(Kkk z*X0?MbNNyK2KOHf1rdKjKV6-^kddK9VAl<`lPQ9C4^-dJpZz3cgVn{g{e?_clgo{Q T4=*_gbR&bOtDnm{r-UW|Lqca9 literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/javelin/_javelin_accessory.png b/resources/assets/tinker/textures/items/javelin/_javelin_accessory.png new file mode 100644 index 0000000000000000000000000000000000000000..65820ace371d9673a32b33b92f07dcae30007a0b GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^MeI z;Pl-pyMQ8`1s;*b3=DjSL74G){)!Z!AbW|YuPggKPDy?a6SWIdq=7;fo-U3d7N?UF zBv=O3zP-Ku|KznlPfS$)Z(sN4NBtE6DG8%lW|&)Wt{_-&iap`yWG%hfn;W1`@p!-LK z;e=1fR-Km&#eNLeqB=a5GUWP;2r4c5b2xbSuKxu;_|5CW6>cv}3o-%P!r0#LT=By}Z;C1rt33 zJ>#Bd(*uBNoIG6|LoEE0C0I=uxW#mS{Qv#^{r>>HOonAYzrDTv|M&0Tp5`nm46d^r zw@qFu$)d4ImPMoJ;DdsH2Y$-4ow$7F00V=VU&4K%cUR{CO=IwM^>bP0l+XkKhYv+X literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/_bow_bottom_2.png b/resources/assets/tinker/textures/items/longbow/_bow_bottom_2.png new file mode 100644 index 0000000000000000000000000000000000000000..b01cd43b9981e68347b8ffeda1d85a42e8adafac GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ>#Bd(*uBNTs&PILoEE0C0I=uxW#mS{Qv#^{r>>HOonAYzrDTv|M&0Tp5`nm46d^r zw@qFu$)d4ImSsf}!_7DenSaYquqrsrOJieWI4GQO|2p>ykh2*)UHx3vIVCg!0KIlX A%K!iX literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/_bow_bottom_3.png b/resources/assets/tinker/textures/items/longbow/_bow_bottom_3.png new file mode 100644 index 0000000000000000000000000000000000000000..3d0832f59d467a815a57ac5ed09c81426263c70b GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ>#Bd(*uBNoIG6|LoEE0C0I=uxW#mS{Qv#^{r>>HOonAYzrDTv|M&0Tp5`nm46d^r zw@qFu$)d4ImSx4GrpE7w4zw|HOjtLwk&&V7e!_je?S&;k(-=Hm{an^LB{Ts5fagT7 literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/_bow_grip.png b/resources/assets/tinker/textures/items/longbow/_bow_grip.png new file mode 100644 index 0000000000000000000000000000000000000000..188c11bc10c1120d9db51d48f2a074767ff7eb44 GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85sBugD~Uq{1qucLG}_)Usv{foD$sHtYtzvKY>CWo-U3d7N_q{ z+AYYe$m1e^#nHk0$Q1_%-2evJ2^S81UD%+_nsIL-gB zkaRLb!MT;z4f}+@-@7ifr`wq$Yge&mt0CLgYsK6CyR!;9x?JhnyzkE5?^~`-Tfa2^ zZuv9L4cC|il4F=-J{F(*%~|%izIKW3fkK(+zl?IrYb-vgdI)?5x{1Nl)z4*}Q$iB} D{9|EC literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/_bow_top.png b/resources/assets/tinker/textures/items/longbow/_bow_top.png new file mode 100644 index 0000000000000000000000000000000000000000..d78703266e742764b3ff22d5fa9ca9d8d72c40e2 GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85sBugD~Uq{1qucLG}_)Usv{foD$qx%xzgadVxYIo-U3d7N_4{ z*vQGCD8PDgqww!rTHAz#xi@e`Z{V8z_K3HLjezB0W_9C=)9%L;HJ6(0zpE)Ec!sAT z=+wUh4a}AAI}P`-?cjBDnKg4_aooDFt6!V?Uhd#svg*G5>T6ycjkn**+kXD5v%b{Q R>0#LT=By}Z;C1rt33 zJ>#Bd(*uBNoIG6|LoEE07idRpNH|!Z!XtW&e}d_se}8}fe|vlTL5U;p-oHPd%dtys y23rbGXcy-MQ=z4d(hZqyMeYYRB(5|xGBRvG9Ob-OZT&r0#LT=By}Z;C1rt33 zJ>#Bd(*uBNTs&PILoEE07g$GZNH|z8(Z=Px# literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/_bow_top_3.png b/resources/assets/tinker/textures/items/longbow/_bow_top_3.png new file mode 100644 index 0000000000000000000000000000000000000000..e563ceefa3dc74a19e830952c42de9e4754ad42f GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ>#Bd(*uBN>^xl@LoEE0CH^EFY-0Uin7Bgd4a2e*-{0T=pMQTJ@3O=kiT(Tc%kNe^ tA?4Urkhr1 literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/_bowstring.png b/resources/assets/tinker/textures/items/longbow/_bowstring.png new file mode 100644 index 0000000000000000000000000000000000000000..cb478b8272a39ab76db7e4c0de78a54afc9dc90a GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggKP6=*JzRTaHe+CNe@^oOdH*HeYJm<#75MLR5dttn-2+$V{p00i_>zopr05}hI APXGV_ literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/_bowstring_1.png b/resources/assets/tinker/textures/items/longbow/_bowstring_1.png new file mode 100644 index 0000000000000000000000000000000000000000..761017279ec92c79d5a96e8cd52a6731ceb6fef8 GIT binary patch literal 360 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggKP6=*ZmT>>wAe}EfT^vI!PA|P| z*u`Wha_r;(6DG|YS`{o5^e(R{OH%ep|0pHBeqs2{;5UXjafVy3P7!NTXljjE)#{ql zlX9idZ1+p2Ps;CWJs-?h{&3Sq&W!u>&m{jB-EPfnukX%O>Dy8B#W#Xgm%-yv$NZmS z4OcZyS4p*`-f-e(*d#M;wz5*tyvFX$e-0EC>#VuIA@C~0f@j^KUuzRKd$z|d|Fm%R-xdwW;9U}MLf=3@63_bP?lQz`{-Z;F3->7O=p^&jrXiIdNV zxlEJKs9(x(b@?vc8=u0Lf4Tl4G~t>4{hwT&wpo9Qu1kIZ`kBGg)z4*}Q$iB}x`C9_ literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/_bowstring_2.png b/resources/assets/tinker/textures/items/longbow/_bowstring_2.png new file mode 100644 index 0000000000000000000000000000000000000000..e9e02e078274c73280a64d2cc7bd67c52ca350f0 GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggKP6=)u>mNqTrvimud%8G=Se#xu zc`w%?1Cdt$rQQX?Tw+TuxyHtF>i=ID~3ZGZ`LO5mT*K<-jd=L25JhKhcIo~lH zVCmj3;4XK~yGbX1!!4PXB>5GV6W;VQZ8hl4_o-nB_?xe^#z=FzYG?3t^>bP0l+XkK DFv&0K literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/_bowstring_broken.png b/resources/assets/tinker/textures/items/longbow/_bowstring_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..8ccc79df47f7e5542f99819d66044574bd762de6 GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)I}0Nxx5SfY4}d~?o-U3d7N?UFBv?}z#l@%p54n8C zWo7mZHXEK9FQgJwq&>F1)zj1auX)L4%Oq2Vvd@BFJ4%~=0d+EXy85}Sb4q9e06s=8 AN&o-= literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/complete.png b/resources/assets/tinker/textures/items/longbow/complete.png new file mode 100644 index 0000000000000000000000000000000000000000..e10febd0ba2f7b62b3e4e4b3641a4b9961dea74e GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ>#Bd(*uBNoIG6|LoEE0C0I=uxW#mS{Qv#^{r>>HOonAYzrDTv|M&0Tp5`nm46d^r zw@qFu$)d4ImPMoJ;DdsH2Y$-4ow$7F00V=VU&4K%cUR{CO=IwM^>bP0l+XkKhYv+X literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/complete.xcf b/resources/assets/tinker/textures/items/longbow/complete.xcf new file mode 100644 index 0000000000000000000000000000000000000000..312650dd6496965fe5a05beb8cb59d693f63dab8 GIT binary patch literal 2340 zcmd6ozi!h&9LImQn>fU&D56FJ3Cjag+#yvewT4WHDod8ktVx2cl=(P&^AP8 z{QzB2@beHoxBvCx8F%PS^fmMh`Xiw^&qV${#tjdTE&2V1*DiTO{{SvRTp?#PKJK;c zQPA@bw(?HLYX!YvXgkSJ8hXu!UEVGy?FO+ULR*;HykV-0+kY24^=Ne1X!!%r-jQp; zd3=*o_)2dF{@C^ht!{h7^Mg)j)E-{}^6Wodsb_U6*CFdQ`u&Ee2yK?PclYpDsZ?H+ zcXuo9b9awpqA8zAOpKlrnp5rxje+t@+E~(s zCB43+??dymWYZyd4Q|T^A@z{@S_p}VT(!6AQ$Mi1M~hP`(ERl53{XEYoQ7CQh&;{N zF3=*Rqub1lv4$EOq{Vsk0x9tcePllQ0$jkgad61KyDG58i>FQdB822afwga|KJ7c( zc&9K&Y8XYcS%{BS3Fpx)nyS+b&BJImRi=5moK5M3KHp|;oTF@dtkcg;pW@puxdBt{1OdiL@JHOl^*%$qMl%=9|I0(Rhfvl_RpAceS7Lk^)Nh z2Lqu=TEuiF<|ceP|GT3nq}6ih(WE=6;+|7#=aX)C;y7%~Ym=^{I+w&o#0Fk+@tc8< zt0n`iCn71E`W2p_(*@_?IXYH|kW%HFk8`WItRn=gd|+x|zztZ%0Rfl`FgNn*UIONx zd-b|!SqYfy)h*Q$U~F80T^oRLWq`FOk^shj3C21F!&+7f#<>X?f(e)lhHEerU}jXb ziV2u`UbL*DVI*K?(K1v+fU$7}c5ML0lmXU7kpwXIOEA_c7}hdUFwRZD5KO>KFbJ@1 LzG|TV?Z=>BD*50O literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/parts/_arrow_shaft.png b/resources/assets/tinker/textures/items/parts/_arrow_shaft.png new file mode 100644 index 0000000000000000000000000000000000000000..1d2ba201b3e62d44c462590d9a35f641358e957a GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ>#Bd(*uBNj67W&LoEE0CDIn`-~a!A6D#*W=bcNKCot}>|1W3C!r8#Hv-bD56^b4W htJ)lPGV@7DFf28Vx3>J>_6Vq(!PC{xWt~$(69Dx3I(Yy9 literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/parts/_bolt.png b/resources/assets/tinker/textures/items/parts/_bolt.png new file mode 100644 index 0000000000000000000000000000000000000000..c908b521320157ffb0e3fd16dc9cb8f1f64bea85 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf67>k44ofy`glX(f`FeQ1ryDhKbV@9u;c6n|HBcC4C4M;hU*zrz5(?z Nc)I$ztaD0e0sz77HxmE= literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/parts/_bolt_2.png b/resources/assets/tinker/textures/items/parts/_bolt_2.png new file mode 100644 index 0000000000000000000000000000000000000000..bb974a0ed8a91e6f1f9bc2e8049118df0770da3f GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf67>k44ofy`glX(f`FeQ1ryD!nkTW{|%-|??QpbGI+ZBxvXYX0j0OA#&-X}Vuf6(jqkE@^`l5aF!(HO$OWZg6*{65Q XJudyM$M5ApXEJ!Y`njxgN@xNADg9+# literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/parts/_crossbow_body.png b/resources/assets/tinker/textures/items/parts/_crossbow_body.png new file mode 100644 index 0000000000000000000000000000000000000000..fb2ca76570238404195cfb3054920f31a726916c GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85sBugD~Uq{1qucLG}_)Usv{foU*+7mV8c>}Xgz`>}r>AO-><}3yV-?a9Q8IfzZGAy{gEiqC| z%d+5H>`{}cGrzug_Kx>VWQSqe-mPN(6LP9fm6a4eKXPSRd93^ET}%we3TxyaMsQyG zUTf;bmT`LVIW?-PwQdyoGEeW$^B;9HTVYIy|5 z0gqX$X04JsX{naER7ARr;XqQ)rKrhKuh*$Of7A9X?`50upKl9hx3_I>)lJ{sb^q4; vNB93VUu9Kn>9?-f+pMmQL70(Y)*K0-AbW|YuPggKE@pl%?T4?-+<`(HJzX3_EKa|j zw3qjY0*{+~pj)x$RLh9QF3}mvp{Ld~PMKsTz2xz%Vv$eFU9R6#kKClQL4JOtd@6&> z60N?+KXy2-K54*{eKG3yx``bdbhs~@gl<&dtr~FlGmituLqW&YE3QQ)^)M`%qGh!p z=a1ob7R8pssbAgq-duIl>iwMHH;V+5Ri4-UY1^+Jr9nawD>gTe~DWM4fR>*b6 literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/parts/iron_shuriken.png b/resources/assets/tinker/textures/items/parts/iron_shuriken.png new file mode 100644 index 0000000000000000000000000000000000000000..fd987cc31d41d81d2aeee6dc086cb11ac4f32754 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggKE@pl{{++GjlYm0io-U3d7N_3^ zZWKJAz)`c8=aIpbuyYT^);*93o3Px#24YJ`L;z_3Q~)!%1W7pn000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^(; z4KWmGx*#k700DtXL_t(I%cYV{Y862c$A8t`^YWgGFL(lPpyCC*hA4Ux590?}dyx&^JYkbixl*xyX(*Y3vM_9Fn)RE=7ziB?tlWI#fdQzVj{&z z2!gv)igCL8#Qi7lB>}iQ7w0=9I3hv_0TIC!^6024W(^!fgtPD807yVZMk%>|G&2Bh zZ|;CQ0t6BG2OeW&vtI83avm`=VvKZMhln5|^nd#4E~SKs&={9e_5hn(2UuR??h{or zW4qmAW~eGTXH*q;CxoyB7>1Ey7^+6wgOpK8DbaNu+lQ~EIsf~^OOG+`0nC&#=1E^& zcq`XMm-B#Xo|!0t5CQ=A9v{j7vRBomgcvH#!$v;+-`}2=4{O*G{ zQWu`Ndv$#7dYc6UwMNPLdHmExYU2*lYLQGk0I`;ssflJaqSgU`zV8>!tcF*xaUACo zSS&VKtJP|{pTD{L(u338XMUW0y<}W)xg_B#z#Gk9B-i-Px#24YJ`L;z_3Q~)!%1W7pn000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^(; z4KOu5$N@6|00G%aL_t(I%dL~mY7{{fg}+->)9L993Zjebe1V9dg1GWABI3`B_$mPv zB%ll5Bf%fY!j%gn1Vci=nVz2N>bloOXL>SbsRb8`g8J&7b8f*uE&*u2zcMw&OffSc z1CTqzdyn&h;62U>W=7X3$47_Ue*94afSJ+!K0=%!A~@#|5iCP$jhr*8OE`!KC%=9I z;DDY?CZ)vnJ8xt*n=zeE!3@k0z=`0UV-x}#MZvf%SAdjSRFzxz_XJ?;;Ro5=+@!8+ zVvGQU5EzX{c<(P{bSuEP+Mp~;riU+WY0kCn*Ru8Ky;N0&bB>e}P17)+&xtXv17d86 zF%o0sbbrS#yFA(674JRc@tDbELRD21MS=Hz1yId&ZNjqRoVya$WP4W@i#c^YWwDr( zQY7be$wYC(MOEeO;EDYWxpD8Es4A*T&UsyecfCO&go_B_>|o~#q%6y|8UV}ez4v(U zhW+`cr)!Ywci&1%iImcM2U+`;x-OA(#>_A?Ho}Pd>kFHHel~z^KG>5W4&M)P4=^)S z^DuGCs_UAjX-Fw?zQ6LN>pI%D?dPMH(8~~!)h7|5D2m}+M3{YfZp#Ok9t42nqi>v^ n{J0XIGr8za2U(Ya|7HCF;iLz2OdZPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^(; z4-gsv8O){t00E~-L_t(I%cYaeY7{{fg}+cDmY$XQ9T8=CrR51yK;l2RhZglgH2h@jf7m?#eC9M|u?mL=sKo6qNK_dk;0 zT}24tOiRhY>RLsX>L!!P5}+VRo% pb51*xa}s(pMTG60eYxo0%wKME?E1un0%rgK002ovPDHLkV1kZ*@A&`# literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/patterns/cast_shuriken.png b/resources/assets/tinker/textures/items/patterns/cast_shuriken.png new file mode 100644 index 0000000000000000000000000000000000000000..ea3e806e54f4cfbc6f67c10c38a860d5d62eed3f GIT binary patch literal 546 zcmV+-0^R+IP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^(; z4+$V$6}$`p00E*&L_t(I%cYaCZWBQehQFD;b8HjI4fMPK5)IV61R@|LcoANO3JJw-Z2`C&x$TO- z>vvws|JrtOagK;!)&ZaZDvGMo!<@6@hw-oC)zSTMcg$?tLeh%5u8D}tR_)gRc>6ep z5CNv+E)2cz6LuE2U+h>IZv1<%0Oq}9(Y$*S0FzWvYoZdR5+(IR zOqoP?BO=NSoE;xT(=><(-(DYtnU#zpg0^kP7AS?~k%%yvOv?HATSRPUaI*Z!*VE5C k!D-0WaE%p?fmd380M%&uQv@NnI{*Lx07*qoM6N<$f)Tyx3;+NC literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/patterns/pattern_bowlimb.png b/resources/assets/tinker/textures/items/patterns/pattern_bowlimb.png new file mode 100644 index 0000000000000000000000000000000000000000..528b0aa248a68a7daf73589b81964ef4730676cb GIT binary patch literal 483 zcmV<90UZ8`P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^(; z4JtMi?5a`#00Co3L_t(I%cYYsO9Md=g}=xd)-z}09YWxWG?75SkRo8P3D^Wnd;f$# z#y_E@*a&IFB4AJmh-p$B1Y|c&?s6KN^983g`{Sbea{k*2pZ~sKgX9 z@Qgf}rPQmTO*Ew5U`)4N13+u-sPi^;F{DIEy6qZ?lJs9EHhyt->=qb~6rE zSHC$1=0IfAqDIm|6jdlz{2w~+VO0JD-I8w+gwQ5#v?3g`xcz)lwiE$Xw zX;!R4nWdX8)T^Nl{9G0xgtN+KylZ=~=j}3`&FM4Y@L-?mY;MQ3R5~H~Oo@+ztsn1C Z_y)bfn+oi9Sm6Kw002ovPDHLkV1lUV%S`|P literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/patterns/pattern_crossbowbody.png b/resources/assets/tinker/textures/items/patterns/pattern_crossbowbody.png new file mode 100644 index 0000000000000000000000000000000000000000..762cfc29df422d7907a64e69c4d02ed51ee1cf3a GIT binary patch literal 488 zcmVP)Px#24YJ`L;z_3Q~)!%1W7pn000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^(; z4J{7@sI;8`00C%8L_t(I%cYaCOT$1E#(xd9oH21Rhfv7S#UcnT9STa9LKo@S-G9PA z#(%<$#U*2LCAdHX$mvozd%R~XGuoS&? zn`_kRY=LxKq~j7VGki~KR=y`S3xk1@F@H@o2*702VU?u-#LJ9fuVpZ@)FNJHNXKP7 zXd4AV7-=@cUW;^_8}cjw+iq}sa|vM3Q!$+_5JDh?&~ns`S>-}?crxl#K!Px$D2mFy zRi3W;fQpoI165-HD4lBB={7gKQDz|>R~ySJqnA4sOVQL70(Y)*K0-AbW|YuPggKE@pl~$p-E%BsKHc)fl2=+BYA zCw5Ax*xT&g`Tg~3<2&~Im>6Oh9VMTg7F{+uSRz@$nwMck*4E7tNiR?OE!MF}S*~c^ zyDBVjLu!I@uj-M8)Pu6Y$v!6zG_j;I7ep4YvptYtW8IV^bK%yTEa@jPJC19K^%%sj zV|y@%TO!$D?w=s_78c(-9KDk+wwiib-P+bTfA$fv=fU4ow+V5dnzM0I?zzurL#}E? z%(HjPs(o<#2K)0EhX66H4J(`ct=;AeFx|}LI5mfhSvhp;p}Jk|N4>jQqhw^|9z6cc q9lC4}_tiy}*H84{JlFkw`47g}@X0ehUf6)*iNVv=&t;ucLK6TttFPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^(; z4+3YC{^iEX7!KMlE;rBeTmh{M?jBz~3m0dHE*_71-e^}^=yzN0qPi^d$9H*^ZI48G z54OZ6^Tm=0F}pk4%oj^Hu5YC=vyY6tC`p!wjHEb7#6b$(osvIk3=1*Nij3&d sHZQ>ZPm;~Z2Ed$8ie?mmE&7N70D*B$NNIF-=>Px#07*qoM6N<$g0uNNMgRZ+ diff --git a/resources/assets/tinker/textures/items/shortbow/_bowstring_1.png b/resources/assets/tinker/textures/items/shortbow/_bowstring_1.png index f7ff4e5404085ed2829adb89ad7ed670b5f2ca15..72cf6b3ea8bb688a5071718f148778982e370e1a 100644 GIT binary patch delta 267 zcmV+m0rdXR0@DJJBnkm@Qb$4nuFf3kks&aD-UAFg7;+-`Uy8h*fiEx;jIKpB#gR95;r%i;D|( zLwR}me;A($pUpQOeZ|ncXU`t|0fx_J1_lNc+p#*GRLv+}fQ2?m&c^3_n9cZ{&Vn50 zijtfR2QHx64AY1;%5eFgV1S{!0NMYrL}F}gjNevt17Oa_nZgJGY|%#y008hnVdxG; R`||(*002ovPDHLkV1mXlc!A&Sw zkV+SIbt$+x+|tF@&{y#(e2gv`Iy+_TRw#mkbgYhbF(v8$;J1alU+%lR1o%^yNpcjr z+Bv?x;Fv;(-5lBDgTQ0Rp6`AK5|jV{1RldRzSlWvUUpv)g>DTdf1=Q0XTYuJy{VIcqs$TeV+8D!H3v${fw(X%epu$8{4^EY% z?mX}q5~0J=b{E{+|LDM)e<2E8tQHK3D6m}b0bsnU+CsyAH3e*`YkgDn1q_;K-dI1v RssI2007*qoM6N<$0fO6Cd`tiU diff --git a/resources/assets/tinker/textures/items/shortbow/_bowstring_2.png b/resources/assets/tinker/textures/items/shortbow/_bowstring_2.png index e8ba2a220d1f2b7663e4c8364ea0bff37f481137..b8e3e5fb9bba569dd66e87397c8e7202ef0a6ede 100644 GIT binary patch delta 300 zcmV+{0n`580`mfpBnkm@Qb$4nuFf3kks&aD-U2cnTkbg@M_Lk&T3qXkr-A5vOZFO4WE< zd-wJKuh#;9hVe^r;M=`*e7VE?720oSD6UUaXafiB#=`EHHbow?^&NHcZMDp(%C59SLds delta 281 zcmV+!0p|Ym0^S0UB#|*Kf87TJ02c6-q%tI#$QJn2?yHKX|v~-Y@6m-URqFoGHa| zdFT^lx%JK(EDqogCP`~CX9?~AzyyoG5Jw)?OM)zKu-Y7iVjrkEknE2F fwJ?ouOnd-P{cj?y4>fR600000NkvXXu0mjf0Hu7& diff --git a/resources/assets/tinker/textures/items/shortbow/_bowstring_3.png b/resources/assets/tinker/textures/items/shortbow/_bowstring_3.png index 8f76ed1e612007e1ce56831ee6dabc9fa9e1a512..5629a787636baf5343aac21114dade835d8d2aed 100644 GIT binary patch delta 87 zcmV-d0I2__0kQ#*Bnkm@Qb$4nuFf3kks&Z1-U%m0yY79gFSos2}=M3GZT0RScK5@IFV_+0=1002ovPDHLkV1o6W9k>7h delta 95 zcmdnQxQuav%0xrm(7Ws`4B`@=H$PotU|=xzba4!^IGvmz!OF}Y6BF~#*Z>H4SG)}= zJa|CbVdDRli)Ky~;jRAmCQ;>gTe~DWM4fJhUQs diff --git a/resources/assets/tinker/textures/items/shortbow/_bowstring_broken.png b/resources/assets/tinker/textures/items/shortbow/_bowstring_broken.png index 8ccc79df47f7e5542f99819d66044574bd762de6..84f13dbaba64932b34fd6d97b3094fd9d52c200b 100644 GIT binary patch delta 101 zcmV-r0Gj`y0j>d%Bnkm@Qb$4nuFf3kks&Zp-UQK$!8;-MT+OLG}_)Usv{foT7sKB775tuK|UYdb&7W z(=@w+bG=n_S#=*TnZnetwTwO1aoXYu#cT<&*Y_Uvb|_wXxAOM3?c4TzFXo(OtmMS8 zkZD=-c?EsJ+u0J&WfWVql+>1*%zsdjsJ67FB{m;cvX#njQ}-r*T-0P+Kar>mdKI;Vst0EN?Q@&Et; literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/shuriken/_shuriken.png b/resources/assets/tinker/textures/items/shuriken/_shuriken.png new file mode 100644 index 0000000000000000000000000000000000000000..e0e08ab4cc50551137d7a19079fc815c19e416f6 GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggKE@pmSzNhO;jsu12JY5_^EKa|j zxRIAxk;hd&(5=|>sLUFNqg*|YCYip-oO$TFLy46uXW*^ssbBYhQMvs=ozKDL&77-I z+gbZfS7@!`N>FO*_@l<~VsEe);|A4Rq89IM8IpN|yjE}5J$UElQ3=M3wT8vteLw7B svrK1j;$YaOTxr;!o^MxN{COhtxkjyM-Wh9zfG%P1boFyt=akR{06U{qa{vGU literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/shuriken/iron_shuriken.png b/resources/assets/tinker/textures/items/shuriken/iron_shuriken.png new file mode 100644 index 0000000000000000000000000000000000000000..e2ac4b08aeb471b265e470e866c194b825b9c1e6 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggK4p~8CHQz+5Z$P0UPZ!4!i_>o> zZscS!m?k(mJa}|D0r0P^uI6);zxI zprrS?%C1$fqTQ4pCG+I3wS8uN^E`{=dsznKXs-{QD^^(@jncj?%aX?C;Kg~MoU67b f`RTvu(;qOc%`r9i;$8X_XghPx#24YJ`L;(8$`vCh@S#6d8000SaNLh0L01m?d01m?e$8V@)00007bV*G`2i^%8 z3myxLC!{R^00CV|L_t(I%dL~Kio!q?MbEekK@d`kGRQQxDFm@gAF#3a6Vl{MZ1M*I zTM>lmEVQ&68w-(OEUW}8%WP#fF{9h;t=_zubKm8`2rL>7hea)=Eb7H#0l;)R1>kIsXQfs~RoO$ma4@E_3Vc4FtxIm$np*4J^SladjKOgn@%pyX zm`o=4zE2p2PcS#e6!%${iS2gFZnv{1D8ouAj4^aN9pN~RuuZQSY&M$$j^mgh2&_<9 zU**H$aNu&eFc=Kz_xk``uU8(A2LQ|EvJ(I864&c>QQvO2j|s$Izp<>>>Hnf1Cx?rd Tv<>&kwQQ<7UwdEX?S>p-C;o-U3d7N^%< z-pJdcAad-Z{icSsoP{DQ<{UfKVkpxzP0~Z+$e}|=GGg1e5>d7j2qT zoO65Hk@#?l;~%eX(|x_GD^a4(Y{j|{n{<|Z$ZS&Hb}enM;76ACyk3S5sXdNfku8h{ h$1a%oek`wJjxv(*x4WhkmDIyGblVTG=spgqb&>#RjyzcplJs43+CSg+ljIEw-b4vF?%(+Z9xKR(U}#2;K9C`>^Z-%}G6dNmyas?m m9z^5IR9H15y8zh$QUCygN)TTW#$WaT00001Tf0fM{Cj?Oa}ST_yiI!1sqW7 entry : FluidType.fluidTypes.entrySet()) { + // is tool material? + if(!entry.getValue().isToolpart) + continue; + + // get a casting recipe for it D: + FluidStack liquid = new FluidStack(entry.getValue().fluid, TConstruct.ingotLiquidValue); + CastingRecipe recipe = tb.getCastingRecipe(liquid, new ItemStack(TinkerSmeltery.metalPattern, 1, 2)); // pickaxe + // no recipe found + if(recipe == null) + continue; + + // material id for the pickaxe head == material id for the fluid! such hack. wow. + int matID = recipe.getResult().getItemDamage(); + + // register our casting stuff + for(Integer id : TConstructRegistry.toolMaterials.keySet()) { + ItemStack rod = new ItemStack(TinkerTools.toolRod, 1, id); + if(((IToolPart)TinkerTools.toolRod).getMaterialID(rod) == -1) + continue; + + tb.addCastingRecipe(DualMaterialToolPart.createDualMaterial(partBolt, id, matID), liquid, rod, true, 150); + } + } + } +} diff --git a/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java b/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java new file mode 100644 index 00000000000..95ed639eb9b --- /dev/null +++ b/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java @@ -0,0 +1,114 @@ +package boni.tinkersweaponry; + +import boni.tinkersweaponry.client.AmmoSlotHandler; +import boni.tinkersweaponry.client.CrosshairHandler; +import boni.tinkersweaponry.client.RenderEventHandler; +import boni.tinkersweaponry.client.entityrenderer.ArrowEntityRenderer; +import boni.tinkersweaponry.client.entityrenderer.JavelinEntityRenderer; +import boni.tinkersweaponry.client.entityrenderer.ProjectileBaseRenderer; +import boni.tinkersweaponry.client.entityrenderer.ShurikenEntityRenderer; +import boni.tinkersweaponry.client.renderer.*; +import boni.tinkersweaponry.entity.*; +import boni.tinkersweaponry.util.Reference; +import cpw.mods.fml.client.registry.RenderingRegistry; +import net.minecraft.item.ItemStack; +import net.minecraftforge.client.MinecraftForgeClient; +import net.minecraftforge.common.MinecraftForge; +import tconstruct.library.client.TConstructClientRegistry; +import tconstruct.library.crafting.StencilBuilder; +import tconstruct.library.tools.ToolCore; +import tconstruct.tools.TinkerTools; + +public class WeaponryClientProxy extends WeaponryCommonProxy { + public static AmmoItemRenderer renderer; + + @Override + public void init() { + super.init(); + + MinecraftForge.EVENT_BUS.register(new CrosshairHandler()); + MinecraftForge.EVENT_BUS.register(new AmmoSlotHandler()); + MinecraftForge.EVENT_BUS.register(new RenderEventHandler()); + + registerRenderers(); + registerEntityRendering(); + registerMaterialRendering(); + + buttons(); + } + + private void registerRenderers() + { + renderer = new AmmoItemRenderer(); + MinecraftForgeClient.registerItemRenderer(TinkerWeaponry.throwArrow, renderer); + MinecraftForgeClient.registerItemRenderer(TinkerWeaponry.shuriken, renderer); + MinecraftForgeClient.registerItemRenderer(TinkerWeaponry.throwingknife, new ThrowingKnifeRenderer()); + MinecraftForgeClient.registerItemRenderer(TinkerWeaponry.javelin, new JavelinRenderer()); + + MinecraftForgeClient.registerItemRenderer(TinkerWeaponry.shortbow, new BowRenderer()); + MinecraftForgeClient.registerItemRenderer(TinkerWeaponry.longbow, new BowRenderer()); + MinecraftForgeClient.registerItemRenderer(TinkerWeaponry.crossbow, new CrossbowRenderer()); + + MinecraftForgeClient.registerItemRenderer(TinkerWeaponry.arrowAmmo, renderer); + MinecraftForgeClient.registerItemRenderer(TinkerWeaponry.boltAmmo, renderer); + } + + private void registerEntityRendering() + { + ProjectileBaseRenderer defaultRenderer = new ProjectileBaseRenderer(); + RenderingRegistry.registerEntityRenderingHandler(ShurikenEntity.class, new ShurikenEntityRenderer()); + RenderingRegistry.registerEntityRenderingHandler(ThrowingKnifeEntity.class, defaultRenderer); + RenderingRegistry.registerEntityRenderingHandler(JavelinEntity.class, new JavelinEntityRenderer()); + RenderingRegistry.registerEntityRenderingHandler(ArrowEntity.class, new ArrowEntityRenderer()); + RenderingRegistry.registerEntityRenderingHandler(BoltEntity.class, new ArrowEntityRenderer(0.6f)); + } + + private void registerMaterialRendering() + { + ToolCore arrow = TinkerWeaponry.arrowAmmo; + String pre = Reference.resource(arrow.getDefaultFolder()) + "/"; + + String[] shaft = {"wood", "bone", "blaze", "reed"}; + String[] fletching = { "feather", "leaf", "slime", "blueslime" }; + + // we register different textures for the different parts per index + for(int i = 0; i < 4; i++) { + String handletex = pre + shaft[i] + arrow.getIconSuffix(2); + String acctex = pre + fletching[i] + arrow.getIconSuffix(3); + arrow.registerAlternatePartPaths(i, new String[]{null, null, handletex, acctex}); + TinkerWeaponry.boltAmmo.registerAlternatePartPaths(i, new String[]{null, null, null, acctex}); + } + + // for bolts too + pre = Reference.resource(TinkerWeaponry.boltAmmo.getDefaultFolder()) + "/"; + for(int i = 0; i < 4; i++) { + String acctex = pre + fletching[i] + TinkerWeaponry.boltAmmo.getIconSuffix(3); + TinkerWeaponry.boltAmmo.registerAlternatePartPaths(i, new String[]{null, null, null, acctex}); + } + + // todo: do properly when moving stuff into tinkers code + arrow.headStrings.clear(); + arrow.headStrings.put(TinkerTools.MaterialID.PigIron, Reference.resource(arrow.getDefaultFolder() + "/pigiron" + arrow.getIconSuffix(0))); + + /* + TConstructClientRegistry.addAlternateMaterialRenderMapping(TinkerWeaponry.shuriken, 2, Reference.RESOURCE, "iron", true); + TConstructClientRegistry.addAlternateMaterialRenderMapping(TinkerWeaponry.throwingknife, 2, Reference.RESOURCE, "iron", true); + + String[] fletching = { "feather", "leaf", "slime", "blueslime" }; + for (int arrowIter = 0; arrowIter < fletching.length; arrowIter++) + { + TConstructClientRegistry.addAlternateMaterialRenderMapping(TinkerWeaponry.throwArrow, arrowIter, "tinker", fletching[arrowIter], true); + } + */ + } + + private void buttons() + { + int base = StencilBuilder.getIndex(new ItemStack(TinkerWeaponry.woodPattern, 0, 0)); + TConstructClientRegistry.addStencilButton2(0, 4, base + 0, Reference.RESOURCE, "textures/gui/icons.png"); // shuriken + TConstructClientRegistry.addStencilButton2(1, 4, base + 1, Reference.RESOURCE, "textures/gui/icons.png"); // crossbow limb + TConstructClientRegistry.addStencilButton2(2, 4, base + 2, Reference.RESOURCE, "textures/gui/icons.png"); // crossbow body + TConstructClientRegistry.addStencilButton2(3, 4, base + 3, Reference.RESOURCE, "textures/gui/icons.png"); // bow limb + //TConstructClientRegistry.addStencilButton2(4, 4, index, Reference.RESOURCE, "textures/gui/icons.png"); // bolt + } +} diff --git a/src/main/java/tconstruct/weaponry/WeaponryCommonProxy.java b/src/main/java/tconstruct/weaponry/WeaponryCommonProxy.java new file mode 100644 index 00000000000..caad6061ae3 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/WeaponryCommonProxy.java @@ -0,0 +1,14 @@ +package boni.tinkersweaponry; + +import boni.tinkersweaponry.entity.*; +import cpw.mods.fml.common.registry.EntityRegistry; + +public class WeaponryCommonProxy { + public void init() { + EntityRegistry.registerModEntity(ShurikenEntity.class, "Shuriken", 0, TinkerWeaponry.instance, 32, 5, true); + EntityRegistry.registerModEntity(ThrowingKnifeEntity.class, "ThrowingKnife", 1, TinkerWeaponry.instance, 32, 5, true); + EntityRegistry.registerModEntity(JavelinEntity.class, "Javelin", 2, TinkerWeaponry.instance, 32, 5, true); + EntityRegistry.registerModEntity(ArrowEntity.class, "Arrow", 3, TinkerWeaponry.instance, 32, 5, true); + EntityRegistry.registerModEntity(BoltEntity.class, "Bolt", 4, TinkerWeaponry.instance, 32, 5, true); + } +} diff --git a/src/main/java/tconstruct/weaponry/WeaponryHandler.java b/src/main/java/tconstruct/weaponry/WeaponryHandler.java new file mode 100644 index 00000000000..4936f36a890 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/WeaponryHandler.java @@ -0,0 +1,189 @@ +package boni.tinkersweaponry; + +import boni.tinkersweaponry.ammo.ArrowAmmo; +import boni.tinkersweaponry.ammo.BoltAmmo; +import boni.tinkersweaponry.items.DualMaterialToolPart; +import boni.tinkersweaponry.library.weaponry.ArrowShaftMaterial; +import boni.tinkersweaponry.library.weaponry.BowBaseAmmo; +import boni.tinkersweaponry.library.weaponry.ProjectileWeapon; +import boni.tinkersweaponry.library.weaponry.IAmmo; +import boni.tinkersweaponry.weapons.Crossbow; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import tconstruct.library.TConstructRegistry; +import tconstruct.library.crafting.ToolBuilder; +import tconstruct.library.event.ToolBuildEvent; +import tconstruct.library.event.ToolCraftEvent; +import tconstruct.library.tools.*; + +public class WeaponryHandler { + // Provides ammo-items with the necessary NBT + @SubscribeEvent + public void onAmmoCrafted(ToolCraftEvent.NormalTool event) + { + if(!(event.tool instanceof IAmmo)) + return; + + NBTTagCompound tags = event.toolTag.getCompoundTag("InfiTool"); + + // calculate its stats + if(event.tool instanceof ArrowAmmo) + { + // arrows work like this: + // the head is responsible for the damage, but also adds weight + // the shaft defines how fragile the arrow is, and also adds to the weight a bit. But mostly it functions at the durability modifier + // the fletching defines the accuracy of the bow, adds a bit of durability and also breakchance + + // Shortbows work better with lighter arrows + // while Longbows require a bit heavier arrows, the lighter the arrow the more impact the accuracy has otherwise + + // summa sumarum: heavier arrows fall faster (less range) but accuracy has less impact + + // the materials + ToolMaterial head = TConstructRegistry.getMaterial(tags.getInteger("Head")); + ArrowMaterial arrow = TConstructRegistry.getArrowMaterial(tags.getInteger("Head")); + ArrowShaftMaterial shaft = (ArrowShaftMaterial) TConstructRegistry.getCustomMaterial(tags.getInteger("Handle"), ArrowShaftMaterial.class); + FletchingMaterial fletching = (FletchingMaterial) TConstructRegistry.getCustomMaterial(tags.getInteger("Accessory"), FletchingMaterial.class); + + // todo: fix leaf fletching + if(fletching == null) + fletching = (FletchingMaterial) TConstructRegistry.getCustomMaterial(tags.getInteger("Accessory"), FletchlingLeafMaterial.class); + + int durability = (int)((float)head.durability() * shaft.durabilityModifier); // todo: fletching durability + float weight = arrow.mass + shaft.weight/2f; + float accuracy = fletching.accuracy; + float breakChance = shaft.fragility + fletching.breakChance; + + tags.setInteger("TotalDurability", durability); + tags.setFloat("Mass", weight); + tags.setFloat("BreakChance", breakChance); + tags.setFloat("Accuracy", accuracy); + } + else if(event.tool instanceof BoltAmmo) + { + // bolts work like ammos, but have more weight as they have 2 main materials + // Crossbows work better with heavier bolts + + // the materials + ToolMaterial headMat = TConstructRegistry.getMaterial(tags.getInteger("Head")); + ToolMaterial coreMat = TConstructRegistry.getMaterial(tags.getInteger("Handle")); + ArrowMaterial head = TConstructRegistry.getArrowMaterial(tags.getInteger("Head")); + ArrowMaterial core = TConstructRegistry.getArrowMaterial(tags.getInteger("Handle")); + FletchingMaterial fletching = (FletchingMaterial) TConstructRegistry.getCustomMaterial(tags.getInteger("Accessory"), FletchingMaterial.class); + + // todo: fix leaf fletching + if(fletching == null) + fletching = (FletchingMaterial) TConstructRegistry.getCustomMaterial(tags.getInteger("Accessory"), FletchlingLeafMaterial.class); + + int durability = (int)((float)headMat.durability() * coreMat.handleDurability()); // todo: fletching durability + float weight = head.mass + core.mass; + float accuracy = fletching.accuracy; + float breakChance = fletching.breakChance; + + tags.setInteger("TotalDurability", durability); + tags.setFloat("Mass", weight); + tags.setFloat("BreakChance", breakChance); + tags.setFloat("Accuracy", accuracy); + } + + // now that durability has been handled... + // fill the ammo full and at the same time provide the missing NBT tag + IAmmo ammoItem = (IAmmo) event.tool; + tags.setInteger("Ammo", ammoItem.getMaxAmmo(tags)); + } + + @SubscribeEvent + public void onProjectileWeaponCrafted(ToolCraftEvent.NormalTool event) + { + if(!(event.tool instanceof ProjectileWeapon)) + return; + + NBTTagCompound tags = event.toolTag.getCompoundTag("InfiTool"); + + int drawSpeed = 0; + float flightSpeed = 0; + + BowMaterial top; + BowMaterial bottom; + BowstringMaterial string; + + if(event.tool instanceof BowBaseAmmo) { + top = TConstructRegistry.getBowMaterial(tags.getInteger("Head")); + bottom = TConstructRegistry.getBowMaterial(tags.getInteger("Accessory")); + string = (BowstringMaterial) TConstructRegistry.getCustomMaterial(tags.getInteger("Handle"), BowstringMaterial.class); + + drawSpeed = (int) ((top.drawspeed + bottom.drawspeed) / 2f * string.drawspeedModifier); + flightSpeed = (top.flightSpeedMax + bottom.flightSpeedMax)/2 * string.flightSpeedModifier; + } + else if(event.tool instanceof Crossbow) + { + top = TConstructRegistry.getBowMaterial(tags.getInteger("Head")); + string = (BowstringMaterial) TConstructRegistry.getCustomMaterial(tags.getInteger("Accessory"), BowstringMaterial.class); + + drawSpeed = (int) ((float)top.drawspeed * string.drawspeedModifier); + flightSpeed = (top.flightSpeedMax * string.flightSpeedModifier); + } + else + return; + + // enchanted fabric + /* + if (tags.getInteger("Handle") == 1) { + int modifiers = tags.getInteger("Modifiers"); + modifiers += 1; + tags.setInteger("Modifiers", modifiers); + }*/ + + tags.setInteger("DrawSpeed", drawSpeed); + tags.setFloat("FlightSpeed", flightSpeed); + } + + + // arrows use custom materials. But we don't allow the creation of those items + // we therefore replace the items with their toolpart counterparts here + @SubscribeEvent + public void buildArrow(ToolBuildEvent event) + { + if(event.headStack == null || event.handleStack == null || event.accessoryStack == null) + return; + + // are we building an arrow? + CustomMaterial mat = TConstructRegistry.getCustomMaterial(event.handleStack, ArrowShaftMaterial.class); + if(mat == null) + return; + Item extra = event.extraStack != null ? event.extraStack.getItem() : null; + ToolCore tool = ToolBuilder.instance.getMatchingRecipe(event.headStack.getItem(), mat.craftingItem.getItem(), event.accessoryStack.getItem(), extra); + + // it's an arrow! + if(tool == TinkerWeaponry.arrowAmmo) + event.handleStack = mat.craftingItem.copy(); + } + + // bolts require special treatment because of their dual-material cores + @SubscribeEvent + public void buildBolt(ToolBuildEvent event) + { + if(event.headStack == null || event.handleStack == null) + return; + + if(event.headStack.getItem() != TinkerWeaponry.partBolt) + return; + + // split the bolt into its two parts + ItemStack bolt1 = event.headStack.copy(); + ItemStack bolt2 = event.headStack; + ItemStack fletching = event.handleStack; + + + // set the correct material on the 2nd part + DualMaterialToolPart dualPart = (DualMaterialToolPart) bolt2.getItem(); + bolt1.setItemDamage(dualPart.getMaterialID2(bolt1)); + + // update the part positions xX + event.headStack = bolt1; + event.handleStack = bolt2; + event.accessoryStack = fletching; + } +} diff --git a/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java b/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java new file mode 100644 index 00000000000..d367ddc3ec0 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java @@ -0,0 +1,124 @@ +package boni.tinkersweaponry.ammo; + +import boni.tinkersweaponry.TinkerWeaponry; +import boni.tinkersweaponry.library.weaponry.AmmoItem; +import boni.tinkersweaponry.util.Reference; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import tconstruct.library.crafting.ToolBuilder; +import tconstruct.tools.TinkerTools; + +import java.util.List; + +public class ArrowAmmo extends AmmoItem { + public static ItemStack vanillaArrow; + + public ArrowAmmo() { + super(0, "Arrows"); + } + + @Override + public String getIconSuffix (int partType) + { + switch (partType) + { + case 0: + return "_arrow_head"; + case 1: + return ""; // Doesn't break + case 2: + return "_arrow_shaft"; + case 3: + return "_arrow_fletching"; + default: + return ""; + } + } + + @Override + public String getEffectSuffix () + { + return "_arrow_effect"; + } + + @Override + public String getDefaultFolder () + { + return "arrow"; + } + + @Override + public String getDefaultTexturePath() { + return Reference.RESOURCE + ":" + getDefaultFolder(); + } + + @Override + public void registerPartPaths (int index, String[] location) + { + headStrings.put(index, location[0]); + } + + @Override + public void registerAlternatePartPaths (int index, String[] location) + { + handleStrings.put(index, location[2]); + accessoryStrings.put(index, location[3]); + } + + @Override + public Item getHeadItem () + { + return TinkerTools.arrowhead; + } + + @Override + public Item getHandleItem() { + return TinkerWeaponry.partArrowShaft; + } + + @Override + public Item getAccessoryItem () + { + return TinkerTools.fletching; + } + + @Override + public String[] getTraits () + { + return new String[] { "ammo" }; + } + + @Override + public void buildTool (int id, String name, List list) + { + ItemStack handleStack = new ItemStack(getHandleItem(), 1, 0); // wooden shaft + ItemStack accessoryStack = new ItemStack(getAccessoryItem(), 1, 0); // feather fletchling + + ItemStack tool = ToolBuilder.instance.buildTool(new ItemStack(getHeadItem(), 1, id), handleStack, accessoryStack, null, ""); + if (tool != null) + { + tool.getTagCompound().getCompoundTag("InfiTool").setBoolean("Built", true); + list.add(tool); + } + } + + @Override + public void getSubItems(Item id, CreativeTabs tab, List list) { + super.getSubItems(id, tab, list); + + // vanilla arrow + ItemStack headStack = new ItemStack(getHeadItem(), 1, TinkerTools.MaterialID.Flint); // flint arrow head + ItemStack handleStack = new ItemStack(getHandleItem(), 1, 0); // wooden shaft + ItemStack accessoryStack = new ItemStack(getAccessoryItem(), 1, 0); // feather fletchling + + ItemStack tool = ToolBuilder.instance.buildTool(headStack, handleStack, accessoryStack, null, ""); + if (tool != null) + { + tool.getTagCompound().getCompoundTag("InfiTool").setBoolean("Built", true); + vanillaArrow = tool; + } + else + TinkerWeaponry.Log.error("Couldn't build vanilla equivalent of Tinker Arrow"); + } +} diff --git a/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java b/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java new file mode 100644 index 00000000000..03c63e42386 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java @@ -0,0 +1,93 @@ +package boni.tinkersweaponry.ammo; + +import boni.tinkersweaponry.TinkerWeaponry; +import boni.tinkersweaponry.items.DualMaterialToolPart; +import boni.tinkersweaponry.library.weaponry.AmmoItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import tconstruct.library.crafting.ToolBuilder; +import tconstruct.tools.TinkerTools; + +import java.util.List; + +public class BoltAmmo extends AmmoItem { + public BoltAmmo() { + super(0, "Bolts"); + } + + @Override + public String getIconSuffix(int partType) { + switch (partType) + { + case 0: + return "_bolt_head"; + case 1: + return ""; // Doesn't break + case 2: + return "_bolt_shaft"; + case 3: + return "_bolt_fletching"; + default: + return ""; + } + } + + @Override + public String getEffectSuffix() { + return "_bolt_effect"; + } + + @Override + public String getDefaultFolder() { + return "bolt"; + } + + @Override + public void registerPartPaths (int index, String[] location) + { + headStrings.put(index, location[0]); + handleStrings.put(index, location[2]); + } + + @Override + public void registerAlternatePartPaths (int index, String[] location) + { + accessoryStrings.put(index, location[3]); + } + + @Override + public Item getHeadItem() { + return TinkerWeaponry.partBolt; + } + + @Override + public Item getHandleItem() { + return TinkerWeaponry.partBolt; + } + + @Override + public Item getAccessoryItem() { + return TinkerTools.fletching; + } + + @Override + public String[] getTraits() { + return new String[] {"ammo"}; + } + + @Override + public void buildTool (int id, String name, List list) + { + // dual material head: we use wooden shafts + ItemStack headStack = DualMaterialToolPart.createDualMaterial(getHeadItem(), 0, id); // wooden shaft, material head + ItemStack handleStack = new ItemStack(getAccessoryItem(), 1, 0); // feather Fletchling + //ItemStack accessoryStack = new ItemStack(getAccessoryItem(), 1, 0); // feather fletchling + + ItemStack tool = ToolBuilder.instance.buildTool(headStack, handleStack, null, null, ""); + if (tool != null) + { + tool.getTagCompound().getCompoundTag("InfiTool").setBoolean("Built", true); + list.add(tool); + } + } +} diff --git a/src/main/java/tconstruct/weaponry/client/AmmoSlotHandler.java b/src/main/java/tconstruct/weaponry/client/AmmoSlotHandler.java new file mode 100644 index 00000000000..6b1d740e23a --- /dev/null +++ b/src/main/java/tconstruct/weaponry/client/AmmoSlotHandler.java @@ -0,0 +1,57 @@ +package boni.tinkersweaponry.client; + +import boni.tinkersweaponry.library.weaponry.ProjectileWeapon; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraftforge.client.event.RenderGameOverlayEvent; + +public class AmmoSlotHandler { + @SubscribeEvent + public void onRenderOverlay(RenderGameOverlayEvent.Pre event) + { + if(event.type != RenderGameOverlayEvent.ElementType.HOTBAR) + return; + + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + ItemStack equipped = player.getCurrentEquippedItem(); + + if(equipped == null || equipped.getItem() == null) + return; + if(!(equipped.getItem() instanceof ProjectileWeapon)) + return; + + // find ammo + // todo: cache this somehow? + ItemStack ammo = ((ProjectileWeapon) equipped.getItem()).searchForAmmo(player, equipped); + if(ammo == null) + return; + + // check if it's in the inventory + int slot = -1; + for(int i = 0; i < 9; i++) + if(player.inventory.mainInventory[i] == ammo) + { + slot = i; + break; + } + + // not in the hotbar + if(slot == -1) + return; + + int x = event.resolution.getScaledWidth() / 2 - 90 + slot * 20 + 2; + int z = event.resolution.getScaledHeight() - 16 - 3; + + int col = 0; + col |= 120 << 16; // red + col |= 150 << 8; // green + col |= 200 << 0; // blue + col |= 200 << 24; // alpha + + // render a cool underlay thing + Gui.drawRect(x,z, x+16, z+16, col); + } +} diff --git a/src/main/java/tconstruct/weaponry/client/CrosshairHandler.java b/src/main/java/tconstruct/weaponry/client/CrosshairHandler.java new file mode 100644 index 00000000000..304116da2a8 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/client/CrosshairHandler.java @@ -0,0 +1,161 @@ +package boni.tinkersweaponry.client; + +import boni.tinkersweaponry.util.Reference; +import boni.tinkersweaponry.library.weaponry.IWindup; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.event.RenderGameOverlayEvent; +import org.lwjgl.opengl.GL11; + +public class CrosshairHandler { + private static Minecraft mc = Minecraft.getMinecraft(); + + private static ResourceLocation crossHairSquare = new ResourceLocation(Reference.RESOURCE, "textures/gui/Crosshair.png"); + private static ResourceLocation crossHairTip = new ResourceLocation(Reference.RESOURCE, "textures/gui/Crosshair2.png"); + private static ResourceLocation crossHairWeird = new ResourceLocation(Reference.RESOURCE, "textures/gui/Crosshair3.png"); + private static ResourceLocation crossHairSpike = new ResourceLocation(Reference.RESOURCE, "textures/gui/Crosshair4.png"); + + @SubscribeEvent + public void onRenderOverlay(RenderGameOverlayEvent.Pre event) + { + if(event.type != RenderGameOverlayEvent.ElementType.CROSSHAIRS) + return; + + ItemStack equipped = mc.thePlayer.getCurrentEquippedItem(); + if(equipped == null || equipped.getItem() == null) + return; + if(!(equipped.getItem() instanceof IWindup)) + return; + + IWindup weapon = (IWindup) equipped.getItem(); + + float width = event.resolution.getScaledWidth(); + float height = event.resolution.getScaledHeight(); + + int type = 0; + ResourceLocation tex; + switch (weapon.getCrosshairType()) + { + case SQUARE: tex = crossHairSquare; break; + case TIP: tex = crossHairTip; break; + case WEIRD: tex = crossHairWeird; type = 1; break; + case SPIKE: tex = crossHairSpike; type = 1; break; + default: tex = crossHairSquare; type = 0; + } + + mc.getTextureManager().bindTexture(tex); + GL11.glEnable(GL11.GL_BLEND); + OpenGlHelper.glBlendFunc(GL11.GL_ONE_MINUS_DST_COLOR, GL11.GL_ONE_MINUS_SRC_COLOR, 1, 0); + + float spread = ((1.0f - weapon.getWindupProgress(equipped, mc.thePlayer)) * 25f); + + // 4 square crosshair + if(type == 0) { + drawCrosshairPart(width / 2f - spread, height / 2f - spread, 0); + drawCrosshairPart(width / 2f + spread, height / 2f - spread, 1); + drawCrosshairPart(width / 2f - spread, height / 2f + spread, 2); + drawCrosshairPart(width / 2f + spread, height / 2f + spread, 3); + } + // 4 triangle crosshair + else { + drawAlternateCrosshairPart(width/2f, height/2f - spread, 0); + drawAlternateCrosshairPart(width/2f - spread, height/2f, 1); + drawAlternateCrosshairPart(width/2f + spread, height/2f, 2); + drawAlternateCrosshairPart(width/2f, height/2f + spread, 3); + } + + OpenGlHelper.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, 1, 0); + GL11.glDisable(GL11.GL_BLEND); + + event.setCanceled(true); + } + + private void drawCrosshairPart(float width, float height, int part) + { + double w = (double)width; + double h = (double)height; + + double s = 4; + double z = -90; + + double u1 = 0; + double v1 = 0; + + switch(part) + { + // top left + case 0: + w -= s; + h -= s; + break; + case 1: + u1 = 0.5; + w += s; + h -= s; + break; + case 2: + v1 = 0.5; + w -= s; + h += s; + break; + case 3: + u1 = 0.5; + v1 = 0.5; + w += s; + h += s; + break; + } + + double u2 = u1 + 0.5; + double v2 = v1 + 0.5; + + Tessellator tessellator = Tessellator.instance; + tessellator.startDrawingQuads(); + tessellator.addVertexWithUV(w - s, h - s, z, u1, v1); + tessellator.addVertexWithUV(w - s, h + s, z, u1, v2); + tessellator.addVertexWithUV(w + s, h + s, z, u2, v2); + tessellator.addVertexWithUV(w + s, h - s, z, u2, v1); + tessellator.draw(); + } + + private void drawAlternateCrosshairPart(float width, float height, int part) + { + double w = (double)width; + double h = (double)height; + + final double s = 8d; + final double z = -90; + + Tessellator tessellator = Tessellator.instance; + tessellator.startDrawing(GL11.GL_TRIANGLES); // 4 + // top part + if(part == 0) { + tessellator.addVertexWithUV(w - s, h - s, z, 0, 0); + tessellator.addVertexWithUV(w, h, z, 0.5, 0.5); + tessellator.addVertexWithUV(w + s, h - s, z, 1, 0); + } + // left part + else if(part == 1) { + tessellator.addVertexWithUV(w - s, h - s, z, 0, 0); + tessellator.addVertexWithUV(w - s, h + s, z, 0, 1); + tessellator.addVertexWithUV(w, h, z, 0.5, 0.5); + } + // right part + else if(part == 2) { + tessellator.addVertexWithUV(w, h, z, 0.5, 0.5); + tessellator.addVertexWithUV(w + s, h + s, z, 1, 1); + tessellator.addVertexWithUV(w + s, h - s, z, 1, 0); + } + // bottom part + else if(part == 3) { + tessellator.addVertexWithUV(w, h, z, 0.5, 0.5); + tessellator.addVertexWithUV(w - s, h + s, z, 0, 1); + tessellator.addVertexWithUV(w + s, h + s, z, 1, 1); + } + tessellator.draw(); + } +} diff --git a/src/main/java/tconstruct/weaponry/client/CrosshairType.java b/src/main/java/tconstruct/weaponry/client/CrosshairType.java new file mode 100644 index 00000000000..d747e2fb5cb --- /dev/null +++ b/src/main/java/tconstruct/weaponry/client/CrosshairType.java @@ -0,0 +1,12 @@ +package boni.tinkersweaponry.client; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public enum CrosshairType { + SQUARE, + TIP, + WEIRD, + SPIKE +} diff --git a/src/main/java/tconstruct/weaponry/client/IconFlipped.java b/src/main/java/tconstruct/weaponry/client/IconFlipped.java new file mode 100644 index 00000000000..6201caf08cf --- /dev/null +++ b/src/main/java/tconstruct/weaponry/client/IconFlipped.java @@ -0,0 +1,22 @@ +package boni.tinkersweaponry.client; + +import net.minecraft.util.IIcon; + +// required to fix Mojansg bugs... +public class IconFlipped extends net.minecraft.client.renderer.IconFlipped { + private final IIcon baseIcon; + private final boolean flipV; + + public IconFlipped(IIcon p_i1560_1_, boolean p_i1560_2_, boolean p_i1560_3_) { + super(p_i1560_1_, p_i1560_2_, p_i1560_3_); + + this.baseIcon = p_i1560_1_; + this.flipV = p_i1560_3_; + } + + // has a faulty implementation in original class + public float getMinV() + { + return this.flipV ? this.baseIcon.getMaxV() : this.baseIcon.getMinV(); + } +} diff --git a/src/main/java/tconstruct/weaponry/client/RenderEventHandler.java b/src/main/java/tconstruct/weaponry/client/RenderEventHandler.java new file mode 100644 index 00000000000..00e350be0ee --- /dev/null +++ b/src/main/java/tconstruct/weaponry/client/RenderEventHandler.java @@ -0,0 +1,44 @@ +package boni.tinkersweaponry.client; + +import boni.tinkersweaponry.TinkerWeaponry; +import boni.tinkersweaponry.library.weaponry.BowBaseAmmo; +import boni.tinkersweaponry.library.weaponry.IWindup; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import net.minecraft.item.ItemStack; +import net.minecraftforge.client.event.FOVUpdateEvent; +import net.minecraftforge.client.event.RenderPlayerEvent; + +public class RenderEventHandler { + @SubscribeEvent + public void onAimZoom(FOVUpdateEvent event) + { + if(!event.entity.isUsingItem()) + return; + + if(!(event.entity.getItemInUse().getItem() instanceof IWindup)) + return; + + ItemStack weapon = event.entity.getItemInUse(); + IWindup item = (IWindup) weapon.getItem(); + + if(item.zoomOnWindup(weapon)) + event.newfov = event.fov / (event.fov + (item.getZoom(weapon)-1.0f) * item.getWindupProgress(weapon, event.entity)); + } + + @SubscribeEvent + public void onRenderPlayer(RenderPlayerEvent.Pre event) + { + if(event.entityPlayer.getCurrentEquippedItem() != null && event.entityPlayer.getCurrentEquippedItem().getItem() == TinkerWeaponry.javelin) { + + } + + if(event.entityPlayer.getItemInUse() == null) + return; + + if(event.entityPlayer.getItemInUse().getItem() instanceof BowBaseAmmo) { + event.renderer.modelBipedMain.aimedBow = true; + event.renderer.modelArmor.aimedBow = true; + event.renderer.modelArmorChestplate.aimedBow = true; + } + } +} diff --git a/src/main/java/tconstruct/weaponry/client/entityrenderer/ArrowEntityRenderer.java b/src/main/java/tconstruct/weaponry/client/entityrenderer/ArrowEntityRenderer.java new file mode 100644 index 00000000000..7e7fe862fd4 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/client/entityrenderer/ArrowEntityRenderer.java @@ -0,0 +1,51 @@ +package boni.tinkersweaponry.client.entityrenderer; + +import boni.tinkersweaponry.entity.ArrowEntity; +import org.lwjgl.opengl.GL11; + +public class ArrowEntityRenderer extends ProjectileBaseRenderer { + private int count = 0; + private final float size; + + public ArrowEntityRenderer(float size) { + this.size = size; + } + + public ArrowEntityRenderer() { + this(1.0f); + } + + @Override + public void doRender(ArrowEntity entity, double x, double y, double z, float p_76986_8_, float p_76986_9_) { + count = 0; + super.doRender(entity, x, y, z, p_76986_8_, p_76986_9_); + count = 1; + super.doRender(entity, x, y, z, p_76986_8_, p_76986_9_); + } + + @Override + public void customRendering(ArrowEntity entity, double x, double y, double z, float p_76986_8_, float p_76986_9_) { + // flip it, flop it, pop it, pull it, push it, rotate it, translate it, TECHNOLOGY + + GL11.glScalef(size, size, size); + + // rotate it into the direction we threw it + GL11.glRotatef(entity.rotationYaw, 0f, 1f, 0f); + GL11.glRotatef(-entity.rotationPitch, 1f, 0f, 0f); + + // rotate it so it's "upright" + if(count == 0) + GL11.glRotatef(90, 0f, 0f, 1f); + + GL11.glRotatef(45, 0f, 0f, 1f); + + // rotate it so it faces forward + GL11.glRotatef(90f, 1f, 0f, 0f); + + // rotate the projectile it so it faces upwards (because the graphic itself is rotated by 45°) + GL11.glRotatef(-45, 0f, 0f, 1f); + + // thinner arrows + toolCoreRenderer.setDepth(1/64f); + } +} diff --git a/src/main/java/tconstruct/weaponry/client/entityrenderer/JavelinEntityRenderer.java b/src/main/java/tconstruct/weaponry/client/entityrenderer/JavelinEntityRenderer.java new file mode 100644 index 00000000000..6e7c828a178 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/client/entityrenderer/JavelinEntityRenderer.java @@ -0,0 +1,29 @@ +package boni.tinkersweaponry.client.entityrenderer; + +import boni.tinkersweaponry.entity.JavelinEntity; +import org.lwjgl.opengl.GL11; + +public class JavelinEntityRenderer extends ProjectileBaseRenderer { + @Override + public void customRendering(JavelinEntity entity, double x, double y, double z, float p_76986_8_, float p_76986_9_) { + + // rotate it into the direction we threw it + GL11.glRotatef(entity.rotationYaw, 0f, 1f, 0f); + GL11.glRotatef(-entity.rotationPitch, 1f, 0f, 0f); + + // rotate it so it faces forward + GL11.glRotatef(90f, 1f, 0f, 0f); + + // roll it all aroun + GL11.glRotated(entity.roll, 0, 1, 0); + + // make it looooong + GL11.glScalef(1.5F, 3.0F, 1.5F); + GL11.glTranslatef(0f, -0.5f, 0f); + + // rotate the projectile it so it faces upwards (because the graphic itself is rotated by 45°) + GL11.glRotatef(45, 0f, 0f, 1f); + + toolCoreRenderer.setDepth(1/16f); + } +} diff --git a/src/main/java/tconstruct/weaponry/client/entityrenderer/ProjectileBaseRenderer.java b/src/main/java/tconstruct/weaponry/client/entityrenderer/ProjectileBaseRenderer.java new file mode 100644 index 00000000000..f79c45c36cb --- /dev/null +++ b/src/main/java/tconstruct/weaponry/client/entityrenderer/ProjectileBaseRenderer.java @@ -0,0 +1,86 @@ +package boni.tinkersweaponry.client.entityrenderer; + +import boni.tinkersweaponry.client.renderer.FlexibleToolRenderer; +import boni.tinkersweaponry.entity.ProjectileBase; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.entity.Entity; +import net.minecraft.util.MathHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.IItemRenderer; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +public class ProjectileBaseRenderer extends Render { + protected static FlexibleToolRenderer toolCoreRenderer = new FlexibleToolRenderer(); + + @Override + public void doRender(Entity p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_, float p_76986_9_) { + doRender((T)p_76986_1_, p_76986_2_, p_76986_4_, p_76986_6_, p_76986_8_, p_76986_9_); + } + + public void doRender(T entity, double x, double y, double z, float p_76986_8_, float p_76986_9_) { + // preface: Remember that the rotations are applied in reverse order. + // the rendering call does not apply any transformations. + // That'd screw things up, since it'd be applied before our transformations + // So remember to read this from the rendering call up to this line + + // can be overwritten in customRendering + toolCoreRenderer.setDepth(1/32f); + + GL11.glPushMatrix(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + + // last step: translate from 0/0/0 to correct position in world + GL11.glTranslatef((float) x, (float) y, (float) z); + // mkae it smaller + GL11.glScalef(0.5F, 0.5F, 0.5F); + + customRendering(entity, x, y, z, p_76986_8_, p_76986_9_); + + // arrow shake + float f11 = (float)entity.arrowShake - p_76986_9_; + if (f11 > 0.0F) + { + float f12 = -MathHelper.sin(f11 * 3.0F) * f11; + GL11.glRotatef(f12, 0.0F, 0.0F, 1.0F); + } + + // draw correct texture. not some weird block fragments. + renderManager.renderEngine.bindTexture(TextureMap.locationItemsTexture); + // rendering code has been optimized to be exactly at the center and without translation + toolCoreRenderer.renderItem(IItemRenderer.ItemRenderType.ENTITY, entity.getEntityItem()); + + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + GL11.glPopMatrix(); + } + + public void customRendering(T entity, double x, double y, double z, float p_76986_8_, float p_76986_9_) + { + // flip it, flop it, pop it, pull it, push it, rotate it, translate it, TECHNOLOGY + + // rotate it into the direction we threw it + GL11.glRotatef(entity.rotationYaw, 0f, 1f, 0f); + GL11.glRotatef(-entity.rotationPitch, 1f, 0f, 0f); + + // rotate it so it's "upright" + GL11.glRotatef(90, 0f, 0f, 1f); + + // rotate it so it faces forward + GL11.glRotatef(90f, 1f, 0f, 0f); + + // rotate the projectile it so it faces upwards + GL11.glRotatef(-45, 0f, 0f, 1f); + } + + @Override + protected ResourceLocation getEntityTexture (Entity par1Entity) + { + return this.func_110796_a((ProjectileBase) par1Entity); + } + + protected ResourceLocation func_110796_a (ProjectileBase par1ArrowEntity) + { + return this.renderManager.renderEngine.getResourceLocation(par1ArrowEntity.getEntityItem().getItemSpriteNumber()); + } +} diff --git a/src/main/java/tconstruct/weaponry/client/entityrenderer/ShurikenEntityRenderer.java b/src/main/java/tconstruct/weaponry/client/entityrenderer/ShurikenEntityRenderer.java new file mode 100644 index 00000000000..a2aa33f8d63 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/client/entityrenderer/ShurikenEntityRenderer.java @@ -0,0 +1,30 @@ +package boni.tinkersweaponry.client.entityrenderer; + +import boni.tinkersweaponry.entity.ShurikenEntity; +import org.lwjgl.opengl.GL11; + +public class ShurikenEntityRenderer extends ProjectileBaseRenderer { + + @Override + public void customRendering(ShurikenEntity entity, double x, double y, double z, float p_76986_8_, float p_76986_9_) { + // make it smaller + GL11.glScalef(0.6F, 0.6F, 0.6F); + + // rotate it into the direction we threw it + GL11.glRotatef(entity.rotationYaw, 0f, 1f, 0f); + GL11.glRotatef(-entity.rotationPitch, 1f, 0f, 0f); + + // add some diversity + GL11.glRotatef(entity.rollAngle, 0f, 0f, 1f); + + // rotate it into a horizontal position + GL11.glRotatef(90f, 1f, 0f, 0f); + + // shurikens spin around their center a lot. *spin* + GL11.glRotatef(entity.spin, 0f, 0f, 1f); + + + // also make it a bit thicker + toolCoreRenderer.setDepth(1/20f); + } +} diff --git a/src/main/java/tconstruct/weaponry/client/renderer/AmmoItemRenderer.java b/src/main/java/tconstruct/weaponry/client/renderer/AmmoItemRenderer.java new file mode 100644 index 00000000000..1763e3e1949 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/client/renderer/AmmoItemRenderer.java @@ -0,0 +1,56 @@ +package boni.tinkersweaponry.client.renderer; + +import boni.tinkersweaponry.library.weaponry.IAmmo; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.item.ItemStack; +import org.lwjgl.opengl.GL11; + +public class AmmoItemRenderer extends FlexibleToolRenderer { + //public static FontRenderer fontRenderer; + + public AmmoItemRenderer() { +// super(true); + //fontRenderer = new FontRenderer(Minecraft.getMinecraft().gameSettings, new ResourceLocation(Reference.RESOURCE, "textures/font/border_numbers.png"), Minecraft.getMinecraft().renderEngine, false); + } + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + if(type == ItemRenderType.INVENTORY) + return true; + + return super.handleRenderType(item, type); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + // render the item regularly + super.renderItem(type, item, data); + //RenderItem.getInstance().renderItemIntoGUI(Minecraft.getMinecraft().fontRenderer, Minecraft.getMinecraft().renderEngine, item, 0,0); + + if(item.getTagCompound() == null || type != ItemRenderType.INVENTORY) + return; + + // render custom stacksize + renderAmmoCount(item); + } + + public void renderAmmoCount(ItemStack item) + { + if(!(item.getItem() instanceof IAmmo)) + return; + int amount = ((IAmmo) item.getItem()).getAmmoCount(item); + String str = String.valueOf(amount); + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_DEPTH_TEST); + GL11.glDisable(GL11.GL_BLEND); + + GL11.glScalef(0.7f, 0.7f, 0.7f); + FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer; + fontRenderer.drawStringWithShadow(str, 7 + 19 - 2 - fontRenderer.getStringWidth(str), 7 + 6 + 3, 16777215); + + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_DEPTH_TEST); + } +} diff --git a/src/main/java/tconstruct/weaponry/client/renderer/BowRenderer.java b/src/main/java/tconstruct/weaponry/client/renderer/BowRenderer.java new file mode 100644 index 00000000000..089630c48cf --- /dev/null +++ b/src/main/java/tconstruct/weaponry/client/renderer/BowRenderer.java @@ -0,0 +1,114 @@ +package boni.tinkersweaponry.client.renderer; + +import boni.tinkersweaponry.TinkerWeaponry; +import boni.tinkersweaponry.ammo.ArrowAmmo; +import boni.tinkersweaponry.entity.ArrowEntity; +import boni.tinkersweaponry.library.weaponry.ProjectileWeapon; +import boni.tinkersweaponry.library.weaponry.IWindup; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import org.lwjgl.opengl.GL11; + +public class BowRenderer extends FlexibleToolRenderer { + private static final ArrowEntity dummy = new ArrowEntity(null); + + @Override + protected void specialAnimation(ItemRenderType type, ItemStack item) { + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + + if(type == ItemRenderType.EQUIPPED) + { + //GL11.glTranslatef(0.0F, 0.125F, 0.3125F); + GL11.glTranslatef(0.2F, -0.4F, 0.2f); + GL11.glRotatef(-20.0F, 0.0F, 1.0F, 0.0F); + //GL11.glScalef(f1, -f1, f1); + //GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F); + } + + // windup animation + if(type == ItemRenderType.EQUIPPED_FIRST_PERSON && player.isUsingItem()) + { + float progress = ((IWindup) item.getItem()).getWindupProgress(item, player); + + //GL11.glScalef(1.2f, 1.2f, 1.2f); + //float progress = ((IWindup) item.getItem()).getWindupProgress(item, Minecraft.getMinecraft().thePlayer);; + GL11.glRotatef(-18.0F, 0.0F, 0.0F, 1.0F); // tilts the bow forward a bit + GL11.glRotatef(-6.0F, 0.0F, 1.0F, 0.0F); // rotates the bow so it faces more forward + GL11.glRotatef(8.0F, 1.0F, 0.0F, 0.0F); // rotates the bow forward + GL11.glTranslatef(-0.9F, 0.2F, -1.0F); + + + // this does the "zoom closer to the bow" thing + GL11.glTranslatef(progress * -0.1f, progress * -0.125f, 0.0F); + + + + // we're crazy, so.. render the arrow =D + ItemStack ammo = ((ProjectileWeapon) item.getItem()).searchForAmmo(player, item); // we know it's a projectile weapon, it's a bow! + if(ammo != null) { + if(ammo.getItem() == Items.arrow) + dummy.returnStack = ArrowAmmo.vanillaArrow; + else + dummy.returnStack = ammo; + Render renderer = RenderManager.instance.getEntityClassRenderObject(ArrowEntity.class); + + GL11.glPushMatrix(); + // adjust position + GL11.glScalef(2, 2, 2); // bigger + GL11.glRotatef(90, 0, 1, 0); // rotate it into the same direction as the bow + GL11.glRotatef(15, 0, 1, 0); // rotate it a bit more so it's not directly inside the bow + GL11.glRotatef(-45, 1, 0, 0); // sprite is rotated by 45° in the graphics, correct that + GL11.glTranslatef(0.05f, 0, 0); // same as the not-inside-bow-rotation + + // move the arrow with the charging process + float offset = 0.075f - 0.15f * progress; + + GL11.glTranslatef(0, 0, offset); + + // render iiit + renderer.doRender(dummy, 0, 0, 0, 0, 0); + GL11.glPopMatrix(); + } + } + else if(type == ItemRenderType.EQUIPPED && player.isUsingItem()) + { + // we're crazy, so.. render the arrow =D + ItemStack ammo = ((ProjectileWeapon) item.getItem()).searchForAmmo(player, item); // we know it's a projectile weapon, it's a bow! + if(ammo != null) { + if(ammo.getItem() == Items.arrow) + dummy.returnStack = ArrowAmmo.vanillaArrow; + else + dummy.returnStack = ammo; + Render renderer = RenderManager.instance.getEntityClassRenderObject(ArrowEntity.class); + + GL11.glPushMatrix(); + // adjust position + GL11.glScalef(2, 2, 2); // bigger + GL11.glRotatef(90, 0, 1, 0); // rotate it into the same direction as the bow + GL11.glRotatef(15, 0, 1, 0); // rotate it a bit more so it's not directly inside the bow + GL11.glRotatef(-45, 1, 0, 0); // sprite is rotated by 45° in the graphics, correct that + GL11.glTranslatef(0.05f, 0, 0); // same as the not-inside-bow-rotation + + // move the arrow with the charging process + float offset = 0.075f - 0.15f * 1; + + GL11.glTranslatef(0, 0, offset); + + // render iiit + renderer.doRender(dummy, 0, 0, 0, 0, 0); + GL11.glPopMatrix(); + } + } + + + if(item.getItem() == TinkerWeaponry.longbow) + GL11.glScalef(2.3f, 2.3f, 1.0f); + else if(item.getItem() == TinkerWeaponry.shortbow) + GL11.glScalef(1.7f, 1.7f, 1.0f); + } +} diff --git a/src/main/java/tconstruct/weaponry/client/renderer/CrossbowRenderer.java b/src/main/java/tconstruct/weaponry/client/renderer/CrossbowRenderer.java new file mode 100644 index 00000000000..ecd0b5d2741 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/client/renderer/CrossbowRenderer.java @@ -0,0 +1,72 @@ +package boni.tinkersweaponry.client.renderer; + +import boni.tinkersweaponry.entity.ArrowEntity; +import boni.tinkersweaponry.entity.BoltEntity; +import boni.tinkersweaponry.weapons.Crossbow; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import org.lwjgl.opengl.GL11; + +public class CrossbowRenderer extends FlexibleToolRenderer { + private static final BoltEntity dummy = new BoltEntity(null); + + @Override + protected void specialAnimation(ItemRenderType type, ItemStack item) { + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + Crossbow crossbow = (Crossbow)item.getItem(); + + GL11.glScalef(1.5f, 1.5f, 1.5f); + + if(type == ItemRenderType.EQUIPPED_FIRST_PERSON) { + // we're crazy, so.. render the arrow =D + ItemStack ammo = crossbow.getLoadedAmmo(item); + + if(crossbow.isLoaded(item)) + { + GL11.glTranslatef(0.0f, 0.0f, -0.3f); + GL11.glRotatef(80f, 1f, 0f, 0f); + GL11.glRotatef(15f, 0f, 1f, 0f); + GL11.glRotatef(-20, 0, 0, 1); + } + else { + GL11.glScalef(1.1f, 1.1f, 1.1f); + GL11.glTranslatef(0.1f, 0f, 0f); + GL11.glRotatef(50f, 1f, 0f, 0f); + } + + if(ammo != null) { + //float progress = crossbow.getWindupProgress(item, player); + float progress = 1f; + dummy.returnStack = ammo; + Render renderer = RenderManager.instance.getEntityClassRenderObject(ArrowEntity.class); + + GL11.glPushMatrix(); + // adjust position + //GL11.glScalef(2, 2, 2); // bigger + GL11.glRotatef(95, 0, 1, 0); // rotate it into the same direction as the bow + //GL11.glRotatef(15, 0, 1, 0); // rotate it a bit more so it's not directly inside the bow + GL11.glRotatef(-45, 1, 0, 0); // sprite is rotated by 45° in the graphics, correct that + GL11.glTranslatef(0.05f, 0, 0); // same as the not-inside-bow-rotation + + // move the arrow with the charging process + float offset = -0.15f; + + GL11.glTranslatef(0, 0, offset); + + // render iiit + renderer.doRender(dummy, 0, 0, 0, 0, 0); + GL11.glPopMatrix(); + } + } + + + if(type == ItemRenderType.EQUIPPED) + { + GL11.glTranslatef(0.25f, 0, 0); + GL11.glRotatef(45.0F, 0.0F, 0.0F, 1.0F); + } + } +} diff --git a/src/main/java/tconstruct/weaponry/client/renderer/FlexibleToolRenderer.java b/src/main/java/tconstruct/weaponry/client/renderer/FlexibleToolRenderer.java new file mode 100644 index 00000000000..dea43d0aa7b --- /dev/null +++ b/src/main/java/tconstruct/weaponry/client/renderer/FlexibleToolRenderer.java @@ -0,0 +1,310 @@ +package boni.tinkersweaponry.client.renderer; + +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraftforge.client.IItemRenderer; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; +import tconstruct.TConstruct; +import tconstruct.library.tools.ToolCore; + +public class FlexibleToolRenderer implements IItemRenderer { + public float depth = 1/32f; + + public void setDepth(float d) { depth = d; } + + @Override + public boolean handleRenderType (ItemStack item, ItemRenderType type) + { + if(!item.hasTagCompound()) + return false; + + switch (type) + { + case ENTITY: + //GL11.glTranslatef(-0.0625F, -0.0625F, 0F); + return true; + case EQUIPPED: + //GL11.glTranslatef(0.03f, 0F, -0.09375F); + case EQUIPPED_FIRST_PERSON: + return true; + case INVENTORY: + return true; + default: + TConstruct.logger.warn("[TCon] Unhandled render case!"); + case FIRST_PERSON_MAP: + return false; + } + } + + @Override + public boolean shouldUseRenderHelper (ItemRenderType type, ItemStack item, ItemRendererHelper helper) + { + return handleRenderType(item, type) & helper.ordinal() < ItemRendererHelper.EQUIPPED_BLOCK.ordinal(); + } + + private static final int toolIcons = 10; + + protected void specialAnimation(ItemRenderType type, ItemStack item) {} + + @Override + public void renderItem (ItemRenderType type, ItemStack item, Object... data) { + Entity ent = null; + if (data.length > 1) + ent = (Entity) data[1]; + + IIcon[] parts = new IIcon[toolIcons]; + int iconParts = getIcons(item, type, ent, parts); + + // drawing the inventory is a simple procedure + if (type == ItemRenderType.INVENTORY) { + renderInventory(iconParts, parts, item); + return; + } + + Tessellator tess = Tessellator.instance; + float[] xMax = new float[iconParts]; + float[] yMin = new float[iconParts]; + float[] xMin = new float[iconParts]; + float[] yMax = new float[iconParts]; + + float[] width = new float[iconParts]; + float[] height = new float[iconParts]; + float[] xDiff = new float[iconParts]; + float[] yDiff = new float[iconParts]; + float[] xSub = new float[iconParts]; + float[] ySub = new float[iconParts]; + for (int i = 0; i < iconParts; ++i) + { + IIcon icon = parts[i]; + xMin[i] = icon.getMinU(); + xMax[i] = icon.getMaxU(); + yMin[i] = icon.getMinV(); + yMax[i] = icon.getMaxV(); + width[i] = icon.getIconWidth(); + height[i] = icon.getIconHeight(); + xDiff[i] = xMin[i] - xMax[i]; + yDiff[i] = yMin[i] - yMax[i]; + xSub[i] = 0.5f * (xMax[i] - xMin[i]) / width[i]; + ySub[i] = 0.5f * (yMax[i] - yMin[i]) / height[i]; + } + + GL11.glPushMatrix(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + + if(type != ItemRenderType.ENTITY) { + GL11.glTranslatef(0.5f, 0.5f, 0); + GL11.glScalef(0.5f, 0.5f, 0.5f); + + specialAnimation(type, item); + } + + // prepare colors + int[] color = new int[iconParts]; + for(int i = 0; i < iconParts; i++) + color[i] = item.getItem().getColorFromItemStack(item, i); + + // one side + tess.startDrawingQuads(); + tess.setNormal(0, 0, 1); + for (int i = 0; i < iconParts; ++i) + { + tess.setColorOpaque_I(color[i]); + tess.addVertexWithUV(-0.5, -0.5, +depth, xMax[i], yMax[i]); + tess.addVertexWithUV(+0.5, -0.5, +depth, xMin[i], yMax[i]); + tess.addVertexWithUV(+0.5, +0.5, +depth, xMin[i], yMin[i]); + tess.addVertexWithUV(-0.5, +0.5, +depth, xMax[i], yMin[i]); + } + tess.draw(); + + // other side + tess.startDrawingQuads(); + tess.setNormal(0, 0, -1); + for (int i = 0; i < iconParts; ++i) + { + tess.setColorOpaque_I(color[i]); + tess.addVertexWithUV(-0.5, +0.5, -depth, xMax[i], yMin[i]); + tess.addVertexWithUV(+0.5, +0.5, -depth, xMin[i], yMin[i]); + tess.addVertexWithUV(+0.5, -0.5, -depth, xMin[i], yMax[i]); + tess.addVertexWithUV(-0.5, -0.5, -depth, xMax[i], yMax[i]); + } + tess.draw(); + + // make it have "depth" + tess.startDrawingQuads(); + tess.setNormal(-1, 0, 0); + float pos; + float iconPos; + + for (int i = 0; i < iconParts; ++i) + { + tess.setColorOpaque_I(color[i]); + float w = width[i], m = xMax[i], d = xDiff[i], s = xSub[i]; + for (int k = 0, e = (int)w; k < e; ++k) + { + pos = k / w; + iconPos = m + d * pos - s; + pos -= 0.5f; + tess.addVertexWithUV(pos, -0.5, -depth, iconPos, yMax[i]); + tess.addVertexWithUV(pos, -0.5, +depth, iconPos, yMax[i]); + tess.addVertexWithUV(pos, +0.5, +depth, iconPos, yMin[i]); + tess.addVertexWithUV(pos, +0.5, -depth, iconPos, yMin[i]); + } + } + + tess.draw(); + tess.startDrawingQuads(); + tess.setNormal(1, 0, 0); + float posEnd; + + for (int i = 0; i < iconParts; ++i) + { + tess.setColorOpaque_I(color[i]); + float w = width[i], m = xMax[i], d = xDiff[i], s = xSub[i]; + float d2 = 1f / w; + for (int k = 0, e = (int)w; k < e; ++k) + { + pos = k / w; + iconPos = m + d * pos - s; + pos -= 0.5f; + posEnd = pos + d2; + tess.addVertexWithUV(posEnd, +0.5, -depth, iconPos, yMin[i]); + tess.addVertexWithUV(posEnd, +0.5, +depth, iconPos, yMin[i]); + tess.addVertexWithUV(posEnd, -0.5, +depth, iconPos, yMax[i]); + tess.addVertexWithUV(posEnd, -0.5, -depth, iconPos, yMax[i]); + } + } + + tess.draw(); + tess.startDrawingQuads(); + tess.setNormal(0, 1, 0); + + for (int i = 0; i < iconParts; ++i) + { + tess.setColorOpaque_I(color[i]); + float h = height[i], m = yMax[i], d = yDiff[i], s = ySub[i]; + float d2 = 1f / h; + for (int k = 0, e = (int)h; k < e; ++k) + { + pos = k / h; + iconPos = m + d * pos - s; + pos -= 0.5f; + posEnd = pos + d2; + tess.addVertexWithUV(-0.5, posEnd, +depth, xMax[i], iconPos); + tess.addVertexWithUV(+0.5, posEnd, +depth, xMin[i], iconPos); + tess.addVertexWithUV(+0.5, posEnd, -depth, xMin[i], iconPos); + tess.addVertexWithUV(-0.5, posEnd, -depth, xMax[i], iconPos); + } + } + + tess.draw(); + tess.startDrawingQuads(); + tess.setNormal(0, -1, 0); + + for (int i = 0; i < iconParts; ++i) + { + tess.setColorOpaque_I(color[i]); + float h = height[i], m = yMax[i], d = yDiff[i], s = ySub[i]; + for (int k = 0, e = (int)h; k < e; ++k) + { + pos = k / h; + iconPos = m + d * pos - s; + pos -= 0.5f; + tess.addVertexWithUV(+0.5, pos, +depth, xMin[i], iconPos); + tess.addVertexWithUV(-0.5, pos, +depth, xMax[i], iconPos); + tess.addVertexWithUV(-0.5, pos, -depth, xMax[i], iconPos); + tess.addVertexWithUV(+0.5, pos, -depth, xMin[i], iconPos); + } + } + + tess.draw(); + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + GL11.glPopMatrix(); + } + + public void renderInventory(int count, IIcon[] icons, ItemStack item) + { + Tessellator tess = Tessellator.instance; + GL11.glPushMatrix(); + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glAlphaFunc(GL11.GL_GREATER, 0.5F); + GL11.glDisable(GL11.GL_BLEND); + + tess.startDrawingQuads(); + + // draw a simple rectangle for the inventory icon + for (int i = 0; i < count; ++i) + { + tess.setColorOpaque_I(item.getItem().getColorFromItemStack(item, i)); + + final IIcon icon = icons[i]; + final float xmin = icon.getMinU(); + final float xmax = icon.getMaxU(); + final float ymin = icon.getMinV(); + final float ymax = icon.getMaxV(); + tess.addVertexWithUV( 0, 16, 0, xmin, ymax); + tess.addVertexWithUV(16, 16, 0, xmax, ymax); + tess.addVertexWithUV(16, 0, 0, xmax, ymin); + tess.addVertexWithUV( 0, 0, 0, xmin, ymin); + } + tess.draw(); + + GL11.glEnable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glPopMatrix(); + } + + public int getIcons(ItemStack item, ItemRenderType type, Entity ent, IIcon[] parts) + { + int iconParts = toolIcons;//tool.getRenderPasses(item.getItemDamage()); + // TODO: have the tools define how many render passes they have + // (requires more logic rewrite than it sounds like) + + boolean isInventory = type == ItemRenderType.INVENTORY; + ToolCore tool = (ToolCore) item.getItem(); + + IIcon[] tempParts = new IIcon[iconParts]; + label: + { + if (!isInventory && ent instanceof EntityPlayer) + { + EntityPlayer player = (EntityPlayer) ent; + ItemStack itemInUse = player.getItemInUse(); + if (itemInUse != null) + { + int useCount = player.getItemInUseCount(); + for (int i = iconParts; i-- > 0;) + tempParts[i] = tool.getIcon(item, i, player, itemInUse, useCount); + break label; + } + } + for (int i = iconParts; i-- > 0;) + tempParts[i] = tool.getIcon(item, i); + } + + int count = 0; + for (int i = 0; i < iconParts; ++i) + { + IIcon part = tempParts[i]; + if (part == null || part == ToolCore.blankSprite || part == ToolCore.emptyIcon) + ++count; + else + parts[i - count] = part; + } + iconParts -= count; + + if (iconParts <= 0) + { + iconParts = 1; + parts[0] = ToolCore.blankSprite; + } + + return iconParts; + } +} diff --git a/src/main/java/tconstruct/weaponry/client/renderer/JavelinRenderer.java b/src/main/java/tconstruct/weaponry/client/renderer/JavelinRenderer.java new file mode 100644 index 00000000000..966262d049c --- /dev/null +++ b/src/main/java/tconstruct/weaponry/client/renderer/JavelinRenderer.java @@ -0,0 +1,24 @@ +package boni.tinkersweaponry.client.renderer; + +import boni.tinkersweaponry.library.weaponry.IWindup; +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; +import org.lwjgl.opengl.GL11; + +public class JavelinRenderer extends AmmoItemRenderer { + + @Override + protected void specialAnimation(ItemRenderType type, ItemStack item) { + float progress = ((IWindup)item.getItem()).getWindupProgress(item, Minecraft.getMinecraft().thePlayer); // 0.5 while not winding + + if(type == ItemRenderType.EQUIPPED) + GL11.glRotatef(90, 0, 0, 1); + + GL11.glRotatef(-45, 0, 0, 1); + GL11.glScalef(1.5F, 2F, 1.5F); + + if(type == ItemRenderType.EQUIPPED_FIRST_PERSON) + GL11.glTranslatef(0, progress * 0.4f, 0); + GL11.glRotatef(45, 0, 0, 1); + } +} diff --git a/src/main/java/tconstruct/weaponry/client/renderer/ThrowingKnifeRenderer.java b/src/main/java/tconstruct/weaponry/client/renderer/ThrowingKnifeRenderer.java new file mode 100644 index 00000000000..feb40f6dfb5 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/client/renderer/ThrowingKnifeRenderer.java @@ -0,0 +1,68 @@ +package boni.tinkersweaponry.client.renderer; + +import boni.tinkersweaponry.library.weaponry.IWindup; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.entity.RenderPlayer; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.item.ItemStack; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +public class ThrowingKnifeRenderer extends AmmoItemRenderer { + private static Minecraft mc = Minecraft.getMinecraft(); + + @Override + protected void specialAnimation(ItemRenderType type, ItemStack item) { + float progress = ((IWindup)item.getItem()).getWindupProgress(item, mc.thePlayer); + + if(type == ItemRenderType.EQUIPPED_FIRST_PERSON) { + GL11.glPushMatrix(); + GL11.glScalef(2.5f, 2.5f, 2.5f); + // rotate it, otherwise it's drawn over our item :( + GL11.glTranslatef(0.5f, -0.6f, 0f); + //GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F); + //GL11.glRotatef(-85.0F, 0.0F, 0.0F, 1.0F); + + GL11.glRotatef(-25.0F, 0.0F, 0.0F, 1.0F); + + GL11.glRotatef(progress * 35.0F, 0.0F, 0.0F, 1.0F); + + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + mc.getTextureManager().bindTexture(mc.thePlayer.getLocationSkin()); + RenderPlayer plrRender = (RenderPlayer) RenderManager.instance.getEntityRenderObject(mc.thePlayer); + plrRender.renderFirstPersonArm(mc.thePlayer); + + GL11.glPopMatrix(); + mc.getTextureManager().bindTexture(TextureMap.locationItemsTexture); + + // rotate it aroooound + //GL11.glRotatef(-180, 0, 0, 1); + //GL11.glTranslatef(0.5f, -0.6f, 0f); + //GL11.glRotatef(-25.0F, 0.0F, 0.0F, 1.0F); + + GL11.glTranslatef(1.3f, 0.4f, -0.2f); + + //GL11.glTranslatef(-0.5f, 0.6f, 0f); + //GL11.glTranslatef(0.f, 1f, 0f); + //GL11.glTranslatef(progress * -1.5f, 0.0f, 0f); + GL11.glTranslatef(0.0f, -1.85f, 0f); + GL11.glRotatef(progress * 35.0F, 0.0F, 0.0F, 1.0F); + GL11.glTranslatef(0.0f, 1.85f, 0f); + GL11.glRotatef(progress * -15.0F, 0.0F, 0.0F, 1.0F); + //GL11.glTranslatef(-0.f, -1f, 0f); + //GL11.glTranslatef(0.5f, -0.6f, 0f); + + + GL11.glScalef(1.5f, 1.5f, 1.5f); + + GL11.glRotatef(-180, 0, 0, 1); + GL11.glTranslatef(0.5f, -0.6f, 0f); + GL11.glRotatef(-25.0F, 0.0F, 0.0F, 1.0F); + } + + if(type == ItemRenderType.EQUIPPED) + GL11.glRotatef(-180, 0, 0, 1); + + } +} diff --git a/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java b/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java new file mode 100644 index 00000000000..477d042ec62 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java @@ -0,0 +1,103 @@ +package boni.tinkersweaponry.entity; + +import boni.tinkersweaponry.library.util.PiercingArrowDamage; +import cpw.mods.fml.common.network.ByteBufUtils; +import io.netty.buffer.ByteBuf; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import tconstruct.TConstruct; +import tconstruct.library.tools.AbilityHelper; +import tconstruct.library.tools.ToolCore; + +public class ArrowEntity extends ProjectileBase { + public ArrowEntity(World world) { + super(world); + } + + public ArrowEntity(World world, double d, double d1, double d2) { + super(world, d, d1, d2); + } + + public ArrowEntity(World world, EntityPlayer player, float speed, float accuracy, ItemStack stack) { + super(world, player, speed, accuracy, stack); + } + + @Override + protected double getStuckDepth() { + return 0.25d; + } + + @Override + protected double getSlowdown() { + // todo: fletchling material of arrows impact + return super.getSlowdown(); + } + + @Override + protected double getGravity() { + float mass = returnStack.getTagCompound().getCompoundTag("InfiTool").getFloat("Mass"); + mass /= 36f; // why 36? simple because it's roughly 0.05 with flint head and wooden arrow shaft! Yes, that's the only reason. + return mass; + } + + @Override + public void onHitBlock(MovingObjectPosition movingobjectposition) { + super.onHitBlock(movingobjectposition); + + // we might break! oh noez! + float chance = returnStack.getTagCompound().getCompoundTag("InfiTool").getFloat("BreakChance"); + if(chance > TConstruct.random.nextFloat()) + this.setDead(); + } + + @Override + protected void playHitBlockSound(int x, int y, int z) { + this.playSound("random.bowhit", 1.0F, 1.2F / (this.rand.nextFloat() * 0.2F + 0.9F)); + } + + @Override + protected void playHitEntitySound() { + this.playSound("random.bowhit", 1.0F, 1.2F / (this.rand.nextFloat() * 0.2F + 0.9F)); + } + + // returns true if it was successful + @Override + public boolean dealDamage(float damage, ToolCore ammo, NBTTagCompound tags, Entity entityHit) + { + boolean dealtDamage; + + //Minecraft.getMinecraft().thePlayer.sendChatMessage("Damage/Weight: " + damage + " - " + tags.getFloat("Mass")); + + // we take the weight, and shift the damage done towards armor piercing, the more weight the arrow/bolt has! + float shift = (tags.getFloat("Mass") - 0.7f); + + if(shift < 0) + shift = 0; + if(shift > damage) + shift = damage; + + // deal regular damage + dealtDamage = super.dealDamage(damage-shift, ammo, tags, entityHit); + + // deal armor piercing damage + if(shift > 0) { + DamageSource damagesource; + if (this.shootingEntity == null) + damagesource = new PiercingArrowDamage("arrow", this, this); + else + damagesource = new PiercingArrowDamage("arrow", this, this.shootingEntity); + + //Minecraft.getMinecraft().thePlayer.sendChatMessage("Piercing Damage: " + shift); + + dealtDamage |= entityHit.attackEntityFrom(damagesource, shift); + } + + return dealtDamage; + } +} diff --git a/src/main/java/tconstruct/weaponry/entity/BoltEntity.java b/src/main/java/tconstruct/weaponry/entity/BoltEntity.java new file mode 100644 index 00000000000..1e4759ce763 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/entity/BoltEntity.java @@ -0,0 +1,27 @@ +package boni.tinkersweaponry.entity; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class BoltEntity extends ArrowEntity { + public BoltEntity(World world) { + super(world); + this.setSize(0.3f, 0.3f); + } + + public BoltEntity(World world, double d, double d1, double d2) { + super(world, d, d1, d2); + this.setSize(0.3f, 0.3f); + } + + public BoltEntity(World world, EntityPlayer player, float speed, float accuracy, ItemStack stack) { + super(world, player, speed, accuracy, stack); + this.setSize(0.3f, 0.3f); + } + + @Override + protected void playHitBlockSound(int x, int y, int z) { + this.playSound("random.bowhit", 1.0F, 1.0F); + } +} diff --git a/src/main/java/tconstruct/weaponry/entity/JavelinEntity.java b/src/main/java/tconstruct/weaponry/entity/JavelinEntity.java new file mode 100644 index 00000000000..3badab8cf4b --- /dev/null +++ b/src/main/java/tconstruct/weaponry/entity/JavelinEntity.java @@ -0,0 +1,47 @@ +package boni.tinkersweaponry.entity; + +import boni.tinkersweaponry.TinkerWeaponry; +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class JavelinEntity extends ProjectileBase { + public int roll = 0; + + public JavelinEntity(World world) { + super(world); + } + + public JavelinEntity(World world, double d, double d1, double d2) { + super(world, d, d1, d2); + } + + public JavelinEntity(World world, EntityPlayer player, float speed, float accuracy, ItemStack stack) { + super(world, player, speed, accuracy, stack); + } + + @Override + public void onUpdate() { + // you turn me right round baby + if(this.ticksInGround == 0) + roll = (roll + 13) % 360; + + super.onUpdate(); + } + + @Override + public void readSpawnData(ByteBuf data) { + super.readSpawnData(data); + + // this is only relevant clientside only, so we don't actually have it on the server + roll = TinkerWeaponry.random.nextInt(360); + } + + protected double getGravity() { return 0.07; } + + @Override + protected double getStuckDepth() { + return 0.5f; + } +} diff --git a/src/main/java/tconstruct/weaponry/entity/ProjectileBase.java b/src/main/java/tconstruct/weaponry/entity/ProjectileBase.java new file mode 100644 index 00000000000..0adb84e8cf0 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/entity/ProjectileBase.java @@ -0,0 +1,627 @@ +package boni.tinkersweaponry.entity; + +import boni.tinkersweaponry.library.weaponry.AmmoItem; +import boni.tinkersweaponry.util.Reference; +import cpw.mods.fml.common.network.ByteBufUtils; +import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.EntityEnderman; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.play.server.S2BPacketChangeGameState; +import net.minecraft.util.*; +import net.minecraft.world.World; +import tconstruct.library.ActiveToolMod; +import tconstruct.library.TConstructRegistry; +import tconstruct.library.tools.AbilityHelper; +import tconstruct.library.tools.ToolCore; + +import java.util.List; + +// have to base this on EntityArrow, otherwise minecraft does derp things because everything is handled based on class. +public abstract class ProjectileBase extends EntityArrow implements IEntityAdditionalSpawnData { + public final static String woodSound = Reference.resource("woodHit"); + public final static String stoneSound = Reference.resource("stoneHit"); + + public ItemStack returnStack; + public int returnStackSlot; + + public boolean bounceOnNoDamage = true; + + public ProjectileBase(World world) { + super(world); + } + + public ProjectileBase(World world, double d, double d1, double d2) { + this(world); + this.setPosition(d, d1, d2); + } + + public ProjectileBase(World world, EntityPlayer player, float speed, float accuracy, ItemStack stack) { + this(world); + + this.shootingEntity = player; + + canBePickedUp = 1; + + // stuff from the arrow + this.setLocationAndAngles(player.posX, player.posY + (double)player.getEyeHeight(), player.posZ, player.rotationYaw, player.rotationPitch); + this.posX -= MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F; + this.posY -= 0.10000000149011612D; + this.posZ -= MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F; + this.setPosition(this.posX, this.posY, this.posZ); + this.yOffset = 0.0F; + this.motionX = -MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI); + this.motionZ = +MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI); + this.motionY = -MathHelper.sin(this.rotationPitch / 180.0F * (float)Math.PI); + this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, speed, accuracy); + + // our stuff + returnStackSlot = player.inventory.currentItem; + returnStack = stack; + +/* + // fix upward default angle + motionY = -MathHelper.sin((rotationPitch / 180F) * 3.141593F - 0.2f); + setArrowHeading(motionX, motionY, motionZ, speed, 0.0f); + + // set better position and move it a tad so we don't hit ourselves. + this.setPosition(player.posX, player.posY + player.getEyeHeight(), player.posZ); + */ + /* + double l = Math.sqrt(motionX*motionX + motionY*motionY + motionZ*motionZ); + double vx = motionX/l; + double vy = motionY/l; + double vz = motionZ/l; + + posX += vx*1.5f; + posY += vy*1.5f; + posZ += vz*1.5f; + */ + + //init(); + } + + public ItemStack getEntityItem () + { + return returnStack; + } + + protected void playHitBlockSound(int x, int y, int z) + { + Block block = worldObj.getBlock(x,y,z); + if(block != null && block.blockMaterial == Material.wood) + worldObj.playSoundAtEntity(this, woodSound, 1.0f, 1.0f); + else { + worldObj.playSoundAtEntity(this, stoneSound, 1.0f, 1.0f); + } + + if(block != null) + worldObj.playSoundAtEntity(this, block.stepSound.getBreakSound(), 0.7f, 1.0f); + } + + protected void playHitEntitySound() + { + + } + + /** + * How deep the item enters stuff it hits. Should be bigger for bigger objects, and smaller for smaller objects. + * 1.0f is exactly halfway in. + */ + protected double getStuckDepth() { return 0.5f; } + + protected void doLivingHit(EntityLivingBase entityHit) + { + if (!this.worldObj.isRemote) + { + entityHit.setArrowCountInEntity(entityHit.getArrowCountInEntity() + 1); + } + + if (this.knockbackStrength > 0) + { + double horizontalSpeed = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); + + if (horizontalSpeed > 0.0F) + { + entityHit.addVelocity(this.motionX * (double) this.knockbackStrength * 0.6000000238418579D / (double) horizontalSpeed, 0.1D, this.motionZ * (double) this.knockbackStrength * 0.6000000238418579D / (double) horizontalSpeed); + } + } + + if (this.shootingEntity != null && this.shootingEntity instanceof EntityLivingBase) + { + EnchantmentHelper.func_151384_a(entityHit, this.shootingEntity); + EnchantmentHelper.func_151385_b((EntityLivingBase)this.shootingEntity, entityHit); + } + + if (this.shootingEntity != null && entityHit != this.shootingEntity && entityHit instanceof EntityPlayer && this.shootingEntity instanceof EntityPlayerMP) + { + ((EntityPlayerMP)this.shootingEntity).playerNetServerHandler.sendPacket(new S2BPacketChangeGameState(6, 0.0F)); + } + } + + public void onHitBlock(MovingObjectPosition movingobjectposition) { + this.field_145791_d = movingobjectposition.blockX; + this.field_145792_e = movingobjectposition.blockY; + this.field_145789_f = movingobjectposition.blockZ; + this.field_145790_g = this.worldObj.getBlock(this.field_145791_d, this.field_145792_e, this.field_145789_f); + this.inData = this.worldObj.getBlockMetadata(this.field_145791_d, this.field_145792_e, this.field_145789_f); + this.motionX = movingobjectposition.hitVec.xCoord - this.posX; + this.motionY = movingobjectposition.hitVec.yCoord - this.posY; + this.motionZ = movingobjectposition.hitVec.zCoord - this.posZ; + double speed = getStuckDepth() * MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ); + this.posX -= this.motionX / speed * 0.05000000074505806D; + this.posY -= this.motionY / speed * 0.05000000074505806D; + this.posZ -= this.motionZ / speed * 0.05000000074505806D; + + playHitBlockSound(movingobjectposition.blockX, movingobjectposition.blockY, movingobjectposition.blockZ); + + this.inGround = true; + this.arrowShake = 7; + this.setIsCritical(false); + + if (this.field_145790_g.getMaterial() != Material.air) + { + this.field_145790_g.onEntityCollidedWithBlock(this.worldObj, this.field_145791_d, this.field_145792_e, this.field_145789_f, this); + } + } + + public void onHitEntity(MovingObjectPosition movingobjectposition) { + NBTTagCompound tags = returnStack.getTagCompound().getCompoundTag("InfiTool"); + double speed = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ); + int damage = MathHelper.ceiling_double_int(speed * tags.getInteger("Attack")); + + // Damage calculations and stuff. For reference see AbilityHelper.onLeftClickEntity + ToolCore ammo = (ToolCore)returnStack.getItem(); + + // factor in modified stuff for base damage + // basically we pass the base damage to all modifiers and take the highest one + int baseDamage = 0; + for(ActiveToolMod toolmod : TConstructRegistry.activeModifiers) { + int dmg = toolmod.baseAttackDamage(baseDamage, damage, ammo, returnStack.getTagCompound(), tags, returnStack, (EntityPlayer)this.shootingEntity, movingobjectposition.entityHit); + if(dmg > baseDamage) + baseDamage = dmg; + } + damage += baseDamage; + + // damage modification from the weapon itself + damage *= ammo.getDamageModifier(); + + // unlike the regular weapons, we do no gain more damage from potion of strength/weakness since we don't hit stuff directly + + // stonebound decreases, jagged increases damage too + float bonusDamage = -AbilityHelper.calcStoneboundBonus(ammo, tags); + // enchantments might add too + if(shootingEntity != null) + bonusDamage += EnchantmentHelper.getEnchantmentModifierLiving((EntityLivingBase)this.shootingEntity, (EntityLivingBase)movingobjectposition.entityHit); + damage += bonusDamage; + + // ensure we still have damage + if(damage < 1) + damage = 1; + + // the regular tool modifier damage stuff + int modDamage = 0; + for (ActiveToolMod mod : TConstructRegistry.activeModifiers) + { + modDamage += mod.attackDamage(modDamage, damage, ammo, returnStack.getTagCompound(), tags, returnStack, (EntityPlayer)this.shootingEntity, movingobjectposition.entityHit); + } + damage += modDamage; + + // calculate critical damaaage + if (this.getIsCritical()) + damage += this.rand.nextInt(damage / 2 + 2); + + // and now we come to the part where we actually deal the damage! + if(!dealDamage(damage, ammo, tags, movingobjectposition.entityHit)) + { + if(!bounceOnNoDamage) + this.setDead(); + + // bounce off if we didn't deal damage + this.motionX *= -0.10000000149011612D; + this.motionY *= -0.10000000149011612D; + this.motionZ *= -0.10000000149011612D; + this.rotationYaw += 180.0F; + this.prevRotationYaw += 180.0F; + this.ticksInAir = 0; + return; + } + + + if (movingobjectposition.entityHit instanceof EntityLivingBase) + doLivingHit((EntityLivingBase)movingobjectposition.entityHit); + + playHitEntitySound(); + + if (!(movingobjectposition.entityHit instanceof EntityEnderman)) + { + this.setDead(); + } + } + + // returns true if it was successful + public boolean dealDamage(float damage, ToolCore ammo, NBTTagCompound tags, Entity entityHit) + { + boolean dealtDamage = false; + + // deal regular damage + DamageSource damagesource; + if (this.shootingEntity == null) + damagesource = DamageSource.causeArrowDamage(this, this); + else + damagesource = DamageSource.causeArrowDamage(this, this.shootingEntity); + dealtDamage = entityHit.attackEntityFrom(damagesource, damage); + + return dealtDamage; + } + + @Override + // this function is the same as the vanilla EntityArrow + public void onUpdate() { + // call the entity update routine + // luckily we can call this directly and take the arrow-code, since we'd have to call super.onUpdate otherwise. Which would not work. + onEntityUpdate(); + + // boioioiooioing + if (this.arrowShake > 0) + --this.arrowShake; + + // If we don't have our rotation set correctly, infer it from our motion direction + if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) + { + float f = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); + this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI); + this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(this.motionY, (double)f) * 180.0D / Math.PI); + } + + // we previously hit something. Check if the block is still there. + Block block = this.worldObj.getBlock(this.field_145791_d, this.field_145792_e, this.field_145789_f); + if (block.getMaterial() != Material.air) + { + block.setBlockBoundsBasedOnState(this.worldObj, this.field_145791_d, this.field_145792_e, this.field_145789_f); + AxisAlignedBB axisalignedbb = block.getCollisionBoundingBoxFromPool(this.worldObj, this.field_145791_d, this.field_145792_e, this.field_145789_f); + + // we are stuck in a block. yay. + if (axisalignedbb != null && axisalignedbb.isVecInside(Vec3.createVectorHelper(this.posX, this.posY, this.posZ))) + this.inGround = true; + } + + if (this.inGround) + updateInGround(); + else + updateInAir(); + } + + // Update while we're stuck in a block + protected void updateInGround() + { + Block block = this.worldObj.getBlock(this.field_145791_d, this.field_145792_e, this.field_145789_f); + int j = this.worldObj.getBlockMetadata(this.field_145791_d, this.field_145792_e, this.field_145789_f); + + // check if it's still the same block + if (block == this.field_145790_g && j == this.inData) + { + ++this.ticksInGround; + + if (this.ticksInGround == 1200) + { + this.setDead(); + } + } + else + { + this.inGround = false; + this.motionX *= (double)(this.rand.nextFloat() * 0.2F); + this.motionY *= (double)(this.rand.nextFloat() * 0.2F); + this.motionZ *= (double)(this.rand.nextFloat() * 0.2F); + this.ticksInGround = 0; + this.ticksInAir = 0; + } + } + + // update while traveling + protected void updateInAir() + { + // tick tock + ++this.ticksInAir; + + // do a raytrace from old to new position + Vec3 curPos = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); + Vec3 newPos = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); + MovingObjectPosition movingobjectposition = this.worldObj.func_147447_a(curPos, newPos, false, true, false); + + // raytrace messes with the positions. get new ones! + curPos = Vec3.createVectorHelper(this.posX, this.posY, this.posZ); + + // if we hit something, the collision point is our new position + if (movingobjectposition != null) + newPos = Vec3.createVectorHelper(movingobjectposition.hitVec.xCoord, movingobjectposition.hitVec.yCoord, movingobjectposition.hitVec.zCoord); + else + newPos = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); + + + // Check all the entities we on our way + Entity entity = null; + List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D)); + double distance = 0.0D; + float f1; + + for(Entity ent : list) + { + if(!ent.canBeCollidedWith()) + continue; + // we don't shoot ourselves into the foot. + if(ent == this.shootingEntity && this.ticksInAir < 5) + continue; + + f1 = 0.3F; + AxisAlignedBB axisalignedbb1 = ent.boundingBox.expand((double)f1, (double)f1, (double)f1); + MovingObjectPosition movingobjectposition1 = axisalignedbb1.calculateIntercept(curPos, newPos); + + // did we actually collide with the entity, or was it just really close nearby? + if (movingobjectposition1 != null) + { + // check if this entity is closer than the other one we already hit + double otherDistance = curPos.distanceTo(movingobjectposition1.hitVec); + + if (otherDistance < distance || distance == 0.0D) + { + entity = ent; + distance = otherDistance; + } + } + } + + // if we hit something, new collision point! + if (entity != null) + movingobjectposition = new MovingObjectPosition(entity); + + // did we hit a player? + if (movingobjectposition != null && movingobjectposition.entityHit != null && movingobjectposition.entityHit instanceof EntityPlayer) + { + EntityPlayer entityplayer = (EntityPlayer)movingobjectposition.entityHit; + + // can we attack said player? + if (entityplayer.capabilities.disableDamage || this.shootingEntity instanceof EntityPlayer && !((EntityPlayer)this.shootingEntity).canAttackPlayer(entityplayer)) + movingobjectposition = null; + + // this check should probably done inside of the loop for accuracy.. + } + + + // time to hit the object + if (movingobjectposition != null) + { + if (movingobjectposition.entityHit != null) + onHitEntity(movingobjectposition); + else + onHitBlock(movingobjectposition); + } + + // crithit particles + if (this.getIsCritical()) + drawCritParticles(); + + // MOVEMENT! yay. + doMoveUpdate(); + double slowdown = 1.0d - getSlowdown(); + + // bubblez + if (this.isInWater()) + { + for (int l = 0; l < 4; ++l) + { + float f4 = 0.25F; + this.worldObj.spawnParticle("bubble", this.posX - this.motionX * (double)f4, this.posY - this.motionY * (double)f4, this.posZ - this.motionZ * (double)f4, this.motionX, this.motionY, this.motionZ); + } + + // more slowdown in water + slowdown = 1d - 20d*getSlowdown(); + } + + // phshshshshshs + if (this.isWet()) + this.extinguish(); + + // minimalistic slowdown! + this.motionX *= slowdown; + this.motionY *= slowdown; + this.motionZ *= slowdown; + // gravity + this.motionY -= getGravity(); + this.setPosition(this.posX, this.posY, this.posZ); + + // tell blocks we collided with, that we collided with them! + this.func_145775_I(); + } + + public void drawCritParticles() + { + for (int i = 0; i < 4; ++i) + { + this.worldObj.spawnParticle("crit", this.posX + this.motionX * (double)i / 4.0D, this.posY + this.motionY * (double)i / 4.0D, this.posZ + this.motionZ * (double)i / 4.0D, -this.motionX, -this.motionY + 0.2D, -this.motionZ); + } + } + + protected void doMoveUpdate() + { + this.posX += this.motionX; + this.posY += this.motionY; + this.posZ += this.motionZ; + double f2 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); + this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI); + this.rotationPitch = (float)(Math.atan2(this.motionY, f2) * 180.0D / Math.PI); + + // normalize rotations + while (this.rotationPitch - this.prevRotationPitch < -180.0F) + this.prevRotationPitch -= 360.0F; + + while (this.rotationPitch - this.prevRotationPitch >= 180.0F) + this.prevRotationPitch += 360.0F; + + while (this.rotationYaw - this.prevRotationYaw < -180.0F) + this.prevRotationYaw -= 360.0F; + + while (this.rotationYaw - this.prevRotationYaw >= 180.0F) + this.prevRotationYaw += 360.0F; + + this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; + this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; + } + + /** + * Factor for the slowdown. 0 = no slowdown, >0 = (1-slowdown)*speed slowdown, <0 = speedup + */ + protected double getSlowdown() { return 0.01; } + + /** + * Added to the y-velocity as gravitational pull. Otherwise stuff would simply float midair. + */ + protected double getGravity() { return 0.05; } + + /** + * Called by a player entity when they collide with an entity + */ + public void onCollideWithPlayer(EntityPlayer player) + { + if (!this.worldObj.isRemote && this.inGround && this.arrowShake <= 0) + { + boolean flag = this.canBePickedUp == 1 || this.canBePickedUp == 2 && player.capabilities.isCreativeMode; + + if (this.canBePickedUp == 1) + { + // ammo pickup + if(this.returnStack != null && this.returnStack.getItem() instanceof AmmoItem) + { + if(!((AmmoItem) this.returnStack.getItem()).pickupAmmo(returnStack, null, player)) + flag = false; + } + // regular pickup. + // Note that you can't pick up ammo items without the proper itemstack in your inventory to prevent dupes + else if(!player.inventory.addItemStackToInventory(new ItemStack(Items.arrow, 1))) + { + flag = false; + } + } + + if (flag) + { + this.playSound("random.pop", 0.2F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F); + player.onItemPickup(this, 1); + this.setDead(); + } + } + } + + + /** NBT stuff **/ + + @Override + public void writeEntityToNBT (NBTTagCompound tags) + { + super.writeEntityToNBT(tags); + + tags.setTag("Throwable", this.returnStack.writeToNBT(new NBTTagCompound())); + tags.setByte("onGround", (byte) (onGround ? 1 : 0)); + //tags.setBoolean("Retrieval", doNotRetrieve); + } + + @Override + public void readEntityFromNBT(NBTTagCompound tags) { + super.readEntityFromNBT(tags); + + this.returnStack = ItemStack.loadItemStackFromNBT(tags.getCompoundTag("Throwable")); + onGround = tags.getByte("onGround") == 1; + //doNotRetrieve = tags.getBoolean("Retrieval"); + } + + @Override + public void writeSpawnData(ByteBuf data) { + NBTTagCompound tags = returnStack.getTagCompound().getCompoundTag("InfiTool"); + ByteBufUtils.writeItemStack(data, returnStack); + data.writeFloat(rotationYaw); + /* + data.writeInt(tags.getInteger("RenderHandle")); + data.writeInt(tags.getInteger("RenderHead")); + data.writeInt(tags.getInteger("RenderAccessory")); + data.writeInt(tags.getInteger("RenderExtra")); + + int effects = 0; + if (tags.hasKey("Effect1")) + effects++; + if (tags.hasKey("Effect2")) + effects++; + if (tags.hasKey("Effect3")) + effects++; + if (tags.hasKey("Effect4")) + effects++; + if (tags.hasKey("Effect5")) + effects++; + if (tags.hasKey("Effect6")) + effects++; + data.writeInt(effects); + + switch (effects) + { + case 6: + data.writeInt(tags.getInteger("Effect6")); + case 5: + data.writeInt(tags.getInteger("Effect5")); + case 4: + data.writeInt(tags.getInteger("Effect4")); + case 3: + data.writeInt(tags.getInteger("Effect3")); + case 2: + data.writeInt(tags.getInteger("Effect2")); + case 1: + data.writeInt(tags.getInteger("Effect1")); + } +*/ + // shooting entity + int id = shootingEntity == null ? this.getEntityId() : shootingEntity.getEntityId(); + data.writeInt(id); + } + + @Override + public void readSpawnData(ByteBuf data) { + returnStack = ByteBufUtils.readItemStack(data); + rotationYaw = data.readFloat(); + /* + NBTTagCompound compound = new NBTTagCompound(); + NBTTagCompound toolTag = new NBTTagCompound(); + toolTag.setInteger("RenderHandle", data.readInt()); + toolTag.setInteger("RenderHead", data.readInt()); + toolTag.setInteger("RenderAccessory", data.readInt()); + toolTag.setInteger("RenderExtra", data.readInt()); + + switch (data.readInt()) + { + case 6: + toolTag.setInteger("Effect6", data.readInt()); + case 5: + toolTag.setInteger("Effect5", data.readInt()); + case 4: + toolTag.setInteger("Effect4", data.readInt()); + case 3: + toolTag.setInteger("Effect3", data.readInt()); + case 2: + toolTag.setInteger("Effect2", data.readInt()); + case 1: + toolTag.setInteger("Effect1", data.readInt()); + } + compound.setTag("InfiTool", toolTag); + returnStack.setTagCompound(compound); +*/ + shootingEntity = worldObj.getEntityByID(data.readInt()); + } +} diff --git a/src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java b/src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java new file mode 100644 index 00000000000..46af84cbe53 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java @@ -0,0 +1,58 @@ +package boni.tinkersweaponry.entity; + +import boni.tinkersweaponry.TinkerWeaponry; +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class ShurikenEntity extends ProjectileBase { + public int spin = 0; + public int rollAngle = 0; + + public ShurikenEntity(World world) { + super(world); + setSize(0.3f, 0.1f); + this.bounceOnNoDamage = false; + } + + public ShurikenEntity(World world, double d, double d1, double d2) { + super(world, d, d1, d2); + setSize(0.3f, 0.1f); + this.bounceOnNoDamage = false; + } + + public ShurikenEntity(World world, EntityPlayer player, float speed, float accuracy, ItemStack stack) { + super(world, player, speed, accuracy, stack); + setSize(0.3f, 0.1f); + this.bounceOnNoDamage = false; + } + + @Override + public void onUpdate() { + // you turn me right round baby + if(this.ticksInGround == 0) + spin = (spin + 33) % 360; + + super.onUpdate(); + } + + @Override + public void readSpawnData(ByteBuf data) { + super.readSpawnData(data); + + // this is only relevant clientside only, so we don't actually have it on the server + rollAngle = (TinkerWeaponry.random.nextInt(3)-1)*45 + TinkerWeaponry.random.nextInt(30)-15; + spin = TinkerWeaponry.random.nextInt(360); + } + + @Override + protected double getGravity() { + return (this.ticksExisted/8) * 0.018d; // integer division. so the first 20 ticks it will have no gravity at all. + } + + @Override + protected double getStuckDepth() { + return 0.8d; + } +} diff --git a/src/main/java/tconstruct/weaponry/entity/ThrowingKnifeEntity.java b/src/main/java/tconstruct/weaponry/entity/ThrowingKnifeEntity.java new file mode 100644 index 00000000000..70cd9523b12 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/entity/ThrowingKnifeEntity.java @@ -0,0 +1,25 @@ +package boni.tinkersweaponry.entity; + +import boni.tinkersweaponry.TinkerWeaponry; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class ThrowingKnifeEntity extends ProjectileBase { + public ThrowingKnifeEntity(World world) { + super(world); + } + + public ThrowingKnifeEntity(World world, double d, double d1, double d2) { + super(world, d, d1, d2); + } + + public ThrowingKnifeEntity(World world, EntityPlayer player, float speed, float accuracy, ItemStack stack) { + super(world, player, speed, accuracy, stack); + } + + @Override + protected double getStuckDepth() { + return 0.3d + TinkerWeaponry.random.nextDouble(); + } +} diff --git a/src/main/java/tconstruct/weaponry/items/CustomToolPart.java b/src/main/java/tconstruct/weaponry/items/CustomToolPart.java new file mode 100644 index 00000000000..12d906eb5f8 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/items/CustomToolPart.java @@ -0,0 +1,26 @@ +package boni.tinkersweaponry.items; + +import net.minecraft.item.ItemStack; +import tconstruct.TConstruct; +import tconstruct.library.TConstructRegistry; +import tconstruct.library.tools.CustomMaterial; +import tconstruct.library.tools.DynamicToolPart; + +public class CustomToolPart extends WeaponryToolPart { + private final Class customMat; + + public CustomToolPart(String texture, String name, Class customMatClass) { + super(texture, name); + + this.customMat = customMatClass; + } + + @Override + public int getMaterialID (ItemStack stack) + { + if(TConstructRegistry.getCustomMaterial(stack.getItemDamage(), customMat) != null) + return stack.getItemDamage(); + + return -1; + } +} diff --git a/src/main/java/tconstruct/weaponry/items/DualMaterialToolPart.java b/src/main/java/tconstruct/weaponry/items/DualMaterialToolPart.java new file mode 100644 index 00000000000..e6fea053ea5 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/items/DualMaterialToolPart.java @@ -0,0 +1,124 @@ +package boni.tinkersweaponry.items; + +import boni.tinkersweaponry.TinkerWeaponry; +import boni.tinkersweaponry.util.Reference; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.IIcon; +import tconstruct.library.TConstructRegistry; +import tconstruct.library.tools.DynamicToolPart; +import tconstruct.library.util.TextureHelper; +import tconstruct.tools.TinkerTools; +import tconstruct.util.config.PHConstruct; + +import java.util.List; +import java.util.Map; + +public class DualMaterialToolPart extends WeaponryToolPart { + public IIcon defaultIcon2; + public IIcon[] icons2; + + public DualMaterialToolPart(String textureType, String name) { + super(textureType, name); + } + + public static ItemStack createDualMaterial(Item item, int mat1, int mat2) + { + ItemStack stack = new ItemStack(item, 1, mat1); + NBTTagCompound tags = new NBTTagCompound(); + NBTTagCompound subtag = new NBTTagCompound(); + subtag.setInteger("Material2", mat2); + + tags.setTag("DualMat", subtag); + stack.setTagCompound(tags); + + return stack; + } + + public int getMaterialID2(ItemStack stack) + { + if(!stack.hasTagCompound()) + return -1; + + int id = stack.getTagCompound().getCompoundTag("DualMat").getInteger("Material2"); + + if (TConstructRegistry.toolMaterials.keySet().contains(id)) + return id; + + return -1; + } + + @Override + public void getSubItems (Item item, CreativeTabs tab, List list) + { + // material id == metadata + for(Integer matID : TConstructRegistry.toolMaterials.keySet()) + list.add(createDualMaterial(item, matID, TinkerTools.MaterialID.Iron)); + } + + @Override + public int getRenderPasses(int metadata) { + return 2; + } + + @Override + public boolean requiresMultipleRenderPasses() { + return true; + } + + @SideOnly(Side.CLIENT) + @Override + public void registerIcons(IIconRegister iconRegister) { + super.registerIcons(iconRegister); + + // same as in super, secondary icon :I + this.icons2 = new IIcon[icons.length]; + + // register icon for each material that has one + if(!PHConstruct.minimalTextures) + for(Map.Entry entry : TConstructRegistry.toolMaterials.entrySet()) + { + String tex = modTexPrefix + ":" + folder + entry.getValue().materialName.toLowerCase() + texture + "_2"; + if(TextureHelper.itemTextureExists(tex)) + this.icons2[entry.getKey()] = iconRegister.registerIcon(tex); + } + + this.defaultIcon2 = iconRegister.registerIcon(modTexPrefix + ":" + folder + texture + "_2"); + } + + @Override + public IIcon getIconFromDamageForRenderPass(int meta, int pass) { + // secondary item + if(pass > 0) { + if(meta > icons.length) + return defaultIcon2; + + if(icons2[meta] == null) + return defaultIcon2; + + return icons2[meta]; + } + return super.getIconFromDamageForRenderPass(meta, pass); + } + + @Override + public int getColorFromItemStack(ItemStack stack, int renderpass) { + if(renderpass > 0) + { + int matId = getMaterialID2(stack); + if(matId > icons2.length) + return super.getColorFromItemStack(stack, renderpass); + + if(icons[matId] == null) + return TConstructRegistry.getMaterial(matId).primaryColor(); + + return super.getColorFromItemStack(stack, renderpass); + } + return super.getColorFromItemStack(stack, renderpass); + } +} diff --git a/src/main/java/tconstruct/weaponry/items/WeaponryPattern.java b/src/main/java/tconstruct/weaponry/items/WeaponryPattern.java new file mode 100644 index 00000000000..465c87a04db --- /dev/null +++ b/src/main/java/tconstruct/weaponry/items/WeaponryPattern.java @@ -0,0 +1,52 @@ +package boni.tinkersweaponry.items; + +import boni.tinkersweaponry.util.Reference; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import tconstruct.library.TConstructRegistry; +import tconstruct.library.crafting.PatternBuilder; +import tconstruct.tools.items.Pattern; + +import java.util.List; + +public class WeaponryPattern extends Pattern { + private static final String[] patternName = new String[] { "shuriken", "crossbowlimb", "crossbowbody", "bowlimb" }; + + public WeaponryPattern(String patternType, String name) { + super(patternName, getPatternNames(patternName, patternType), "patterns/"); + this.modTexPrefix = Reference.RESOURCE; + + this.setUnlocalizedName(Reference.prefix(name)); + } + + public static String[] getPatternNames (String[] patternName, String partType) + { + String[] names = new String[patternName.length]; + for (int i = 0; i < patternName.length; i++) + names[i] = partType + patternName[i]; + return names; + } + + @Override + public void getSubItems (Item b, CreativeTabs tab, List list) + { + for (int i = 0; i < patternName.length; i++) + { + // if (i != 23) + list.add(new ItemStack(b, 1, i)); + } + } + + @Override + public int getPatternCost(ItemStack pattern) { + switch(pattern.getItemDamage()) + { + case 0: return 1; // shuriken + case 1: return 8; // crossbow limb + case 2: return 10; // crossbow body + case 3: return 3; // bowlimb + } + return 0; + } +} diff --git a/src/main/java/tconstruct/weaponry/items/WeaponryToolPart.java b/src/main/java/tconstruct/weaponry/items/WeaponryToolPart.java new file mode 100644 index 00000000000..b8ef74ea52f --- /dev/null +++ b/src/main/java/tconstruct/weaponry/items/WeaponryToolPart.java @@ -0,0 +1,14 @@ +package boni.tinkersweaponry.items; + +import boni.tinkersweaponry.TinkerWeaponry; +import boni.tinkersweaponry.util.Reference; +import tconstruct.library.tools.DynamicToolPart; + +public class WeaponryToolPart extends DynamicToolPart { + public WeaponryToolPart(String textureType, String name) { + super(textureType, name, Reference.RESOURCE); + + this.setUnlocalizedName(Reference.prefix(name)); + this.setCreativeTab(TinkerWeaponry.creativeTab); + } +} diff --git a/src/main/java/tconstruct/weaponry/library/util/PiercingArrowDamage.java b/src/main/java/tconstruct/weaponry/library/util/PiercingArrowDamage.java new file mode 100644 index 00000000000..bf27a794fd2 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/library/util/PiercingArrowDamage.java @@ -0,0 +1,12 @@ +package boni.tinkersweaponry.library.util; + +import net.minecraft.entity.Entity; +import net.minecraft.util.EntityDamageSourceIndirect; + +public class PiercingArrowDamage extends EntityDamageSourceIndirect { + public PiercingArrowDamage(String p_i1568_1_, Entity p_i1568_2_, Entity p_i1568_3_) { + super(p_i1568_1_, p_i1568_2_, p_i1568_3_); + this.setDamageBypassesArmor(); + this.setProjectile(); + } +} diff --git a/src/main/java/tconstruct/weaponry/library/weaponry/AmmoItem.java b/src/main/java/tconstruct/weaponry/library/weaponry/AmmoItem.java new file mode 100644 index 00000000000..5ee30d58916 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/library/weaponry/AmmoItem.java @@ -0,0 +1,118 @@ +package boni.tinkersweaponry.library.weaponry; + +import boni.tinkersweaponry.TinkerWeaponry; +import boni.tinkersweaponry.util.Reference; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import tconstruct.library.tools.ToolCore; + +public abstract class AmmoItem extends ToolCore implements IAmmo { + public AmmoItem(int baseDamage, String name) { + super(baseDamage); + this.setUnlocalizedName(Reference.prefix(name)); + this.setCreativeTab(TinkerWeaponry.creativeTab); + } + + @Override + public int getAmmoCount(ItemStack stack) { + NBTTagCompound tags = stack.getTagCompound().getCompoundTag("InfiTool"); + return tags.getInteger("Ammo"); + } + + @Override + public int getMaxAmmo(ItemStack stack) { + NBTTagCompound tags = stack.getTagCompound().getCompoundTag("InfiTool"); + return getMaxAmmo(tags); + } + + @Override + public int getMaxAmmo(NBTTagCompound tags) { + float dur = tags.getInteger("TotalDurability"); + return (int)Math.ceil(dur*getAmmoModifier()); + } + + @Override + public int addAmmo(int toAdd, ItemStack stack) { + NBTTagCompound tags = stack.getTagCompound().getCompoundTag("InfiTool"); + int oldCount = tags.getInteger("Ammo"); + int newCount = Math.min(oldCount + toAdd, getMaxAmmo(stack)); + tags.setInteger("Ammo", newCount); + return toAdd - (newCount - oldCount); + } + + @Override + public int consumeAmmo(int toUse, ItemStack stack) { + NBTTagCompound tags = stack.getTagCompound().getCompoundTag("InfiTool"); + int oldCount = tags.getInteger("Ammo"); + int newCount = Math.max(oldCount - toUse, 0); + tags.setInteger("Ammo", newCount); + return toUse - (oldCount - newCount); + } + + public float getAmmoModifier() { return 0.1f; } + + public boolean pickupAmmo(ItemStack stack, ItemStack candidate, EntityPlayer player) + { + if(stack.getItem() == null || !(stack.getItem() instanceof IAmmo)) + return false; + + // check if our candidate fits + if(candidate != null) + { + // same item + if(testIfAmmoMatches(stack, candidate)) { + IAmmo pickedup = ((IAmmo) stack.getItem()); + IAmmo ininventory = ((IAmmo) candidate.getItem()); + // we can be sure that it's ammo, since stack is ammo and they're equal + ininventory.addAmmo(pickedup.getAmmoCount(stack), candidate); + + return true; + } + } + + // search the players inventory + for(ItemStack invItem : player.inventory.mainInventory) { + if (testIfAmmoMatches(stack, invItem)) { + IAmmo pickedup = ((IAmmo) stack.getItem()); + IAmmo ininventory = ((IAmmo) invItem.getItem()); + // we can be sure that it's ammo, since stack is ammo and they're equal + ininventory.addAmmo(pickedup.getAmmoCount(stack), invItem); + + return true; + } + } + + // couldn't find a matching thing. + return false; + } + + private boolean testIfAmmoMatches(ItemStack reference, ItemStack candidate) + { + if(candidate == null) + return false; + if(!candidate.hasTagCompound() || !candidate.getTagCompound().hasKey("InfiTool")) + return false; + + // create a stack to test against + ItemStack testsubject = candidate.copy(); + // all NBT has to match, but the ammo-count obviously differs. So we set our testsubject to the same + // this ensures that it's the one to collect and the one we have matches. + testsubject.getTagCompound().getCompoundTag("InfiTool").setInteger("Ammo", getAmmoCount(reference)); + + return ItemStack.areItemStacksEqual(reference, testsubject); + } + + @Override + public boolean onLeftClickEntity (ItemStack stack, EntityPlayer player, Entity entity) + { + // ammo doesn't hurt on smacking stuff with it + return false; + } + + @Override + public String getDefaultTexturePath() { + return Reference.RESOURCE + ":" + getDefaultFolder(); + } +} diff --git a/src/main/java/tconstruct/weaponry/library/weaponry/AmmoWeapon.java b/src/main/java/tconstruct/weaponry/library/weaponry/AmmoWeapon.java new file mode 100644 index 00000000000..1eb4dc57c50 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/library/weaponry/AmmoWeapon.java @@ -0,0 +1,146 @@ +package boni.tinkersweaponry.library.weaponry; + +import boni.tinkersweaponry.client.CrosshairType; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumAction; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +/** + * Throwing weapons that utilize the ammo system on themselves. + * Throwing knifes etc. + */ +public abstract class AmmoWeapon extends AmmoItem implements IAccuracy, IWindup { + public AmmoWeapon(int baseDamage, String name) { + super(baseDamage, name); + } + + @Override + public EnumAction getItemUseAction(ItemStack par1ItemStack) { + return EnumAction.none; + } // we use custom animation renderiiing! + + @Override + public int getMaxItemUseDuration(ItemStack par1ItemStack) { + return 72000; + } + + @Override + public ItemStack onItemRightClick (ItemStack stack, World world, EntityPlayer player) + { + player.setItemInUse(stack, this.getMaxItemUseDuration(stack)); + return stack; + } + + @Override + public boolean onItemUse (ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float clickX, float clickY, float clickZ) + { + return false; + } + + /** + * How long it takes to "ready" the weapon. To reach the point, where holding the right mouse button any longer doesn't have an impact. + */ + @Override + public int getWindupTime(ItemStack itemStack) { return 0; } + + @Override + public float getMinWindupProgress(ItemStack itemStack) { + return 0; + } + + public float getWindupProgress(ItemStack itemStack, int timeInUse) + { + float time = (float) timeInUse; + float windup = getWindupTime(itemStack); + if(time > windup) + time = windup; + + return time/windup; + } + + + public float minAccuracy(ItemStack itemStack) { return 0.5f; } + public float maxAccuracy(ItemStack itemStack) { return 0.5f; } + + public float getWindupProgress(ItemStack itemStack, EntityPlayer player) + { + // what are you doing! + if(player.inventory.getCurrentItem() != itemStack) + return 0f; + + // are we using it? + if(player.getItemInUse() == null) + return 0f; + + return getWindupProgress(itemStack, getMaxItemUseDuration(itemStack) - player.getItemInUseCount()); + } + + public float getAccuracy(ItemStack itemStack, EntityPlayer player) + { + float dif = minAccuracy(itemStack) - maxAccuracy(itemStack); + + return minAccuracy(itemStack) - dif * getWindupProgress(itemStack, player); + } + + @Override + public String[] getTraits() { + return new String[] {"weapon", "throwing", "ammo"}; + } + + @Override + public void onPlayerStoppedUsing(ItemStack stack, World world, EntityPlayer player, int durationLeft) { + int time = this.getMaxItemUseDuration(stack) - durationLeft; + if(getWindupProgress(stack, time) >= getMinWindupProgress(stack)) + launchProjectile(stack, world, player); + } + + protected void launchProjectile(ItemStack stack, World world, EntityPlayer player) { + // spawn projectile on server + if(!world.isRemote) { + ItemStack reference = stack.copy(); + reference.stackSize = 1; + reference.getTagCompound().getCompoundTag("InfiTool").setInteger("Ammo", 1); + Entity projectile = createProjectile(reference, world, player, getAccuracy(stack, player)); + world.spawnEntityInWorld(projectile); + } + + // reduce ammo + this.consumeAmmo(1, stack); + } + + protected abstract Entity createProjectile(ItemStack reference, World world, EntityPlayer player, float accuracy); + + @Override + public void registerPartPaths(int index, String[] location) { + + } + + @Override + public void registerAlternatePartPaths(int index, String[] location) { + headStrings.put(index, location[0]); + brokenPartStrings.put(index, location[1]); + handleStrings.put(index, location[2]); + if (location.length > 3) + accessoryStrings.put(index, location[3]); + if (location.length > 4) + extraStrings.put(index, location[4]); + } + + + @SideOnly(Side.CLIENT) + public CrosshairType getCrosshairType() { return CrosshairType.SQUARE; } + + @Override + public boolean zoomOnWindup(ItemStack itemStack) { + return false; + } + + @Override + public float getZoom(ItemStack itemStack) { + return 1.0f; + } +} diff --git a/src/main/java/tconstruct/weaponry/library/weaponry/ArrowShaftMaterial.java b/src/main/java/tconstruct/weaponry/library/weaponry/ArrowShaftMaterial.java new file mode 100644 index 00000000000..fdd888b3f77 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/library/weaponry/ArrowShaftMaterial.java @@ -0,0 +1,29 @@ +package boni.tinkersweaponry.library.weaponry; + +import boni.tinkersweaponry.TinkerWeaponry; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import tconstruct.library.tools.CustomMaterial; + +public class ArrowShaftMaterial extends CustomMaterial { + public final float durabilityModifier; // like the durability modifier of handles, but for arrows! + public final float fragility; // 1.0 = breaks 100%, 0.0 = never breaks + public final float weight; // baseline: 1.0 = default, smaller = lighter, higher = heavier + + public ArrowShaftMaterial(int materialID, int value, ItemStack input, ItemStack craftingItem, float durabilityModifier, float weight, float fragility, int color) { + super(materialID, value, input, craftingItem, color); + this.durabilityModifier = durabilityModifier; + this.fragility = fragility; + this.weight = weight; + } + + public static ArrowShaftMaterial createMaterial(int id, Item input, float durabilityModifier, float weight, float fragility, int color) + { + return createMaterial(id, input, 0, durabilityModifier, weight, fragility, color); + } + + public static ArrowShaftMaterial createMaterial(int id, Item input, int inputMeta, float durabilityModifier, float weight, float fragility, int color) + { + return new ArrowShaftMaterial(id, 2, new ItemStack(input, 1, inputMeta), new ItemStack(TinkerWeaponry.partArrowShaft, 0, id), durabilityModifier, weight, fragility, color); + } +} diff --git a/src/main/java/tconstruct/weaponry/library/weaponry/BowBaseAmmo.java b/src/main/java/tconstruct/weaponry/library/weaponry/BowBaseAmmo.java new file mode 100644 index 00000000000..25aae575722 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/library/weaponry/BowBaseAmmo.java @@ -0,0 +1,167 @@ +package boni.tinkersweaponry.library.weaponry; + +import boni.tinkersweaponry.ammo.ArrowAmmo; +import boni.tinkersweaponry.entity.ArrowEntity; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import tconstruct.library.crafting.ToolBuilder; + +import java.util.List; + +public abstract class BowBaseAmmo extends ProjectileWeapon { + public BowBaseAmmo(int baseDamage, String name) { + super(baseDamage, name); + } + + @Override + public int durabilityTypeAccessory() { + return 2; // head-type + } + + @Override + public int durabilityTypeExtra() { + return 1; // handle-type + } + + @Override + public boolean zoomOnWindup(ItemStack itemStack) { + return true; + } + + @Override + public float getZoom(ItemStack itemStack) { + return 1.2f; + } + + @Override + public float getMinWindupProgress(ItemStack itemStack) { + return 0.5f; + } + + @Override + public ItemStack searchForAmmo(EntityPlayer player, ItemStack weapon) + { + // arrow priority: hotbar > inventory, tinker arrows > regular arrows + ItemStack[] inventory = player.inventory.mainInventory; + + // check hotbar for tinker arrows + for(int i = 0; i < InventoryPlayer.getHotbarSize(); i++) + if(checkTinkerArrow(inventory[i])) + return inventory[i]; + + // check hotbar for vanilla arrows + for(int i = 0; i < InventoryPlayer.getHotbarSize(); i++) + if(checkVanillaArrow(inventory[i])) + return inventory[i]; + + // check the rest of the inventory for tinker arrows + for(int i = InventoryPlayer.getHotbarSize(); i < inventory.length; i++) + if(checkTinkerArrow(inventory[i])) + return inventory[i]; + + // check the rest of the inventory for vanilla arrows + for(int i = InventoryPlayer.getHotbarSize(); i < inventory.length; i++) + if(checkVanillaArrow(inventory[i])) + return inventory[i]; + + // creative mode + if(player.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, weapon) > 0) + return new ItemStack(Items.arrow); + + return null; + } + + private boolean checkTinkerArrow(ItemStack stack) + { + // null + if(stack == null) + return false; + // no tinker arrow + if(!(stack.getItem() instanceof ArrowAmmo)) + return false; + // no ammo left + if(((IAmmo) stack.getItem()).getAmmoCount(stack) <= 0) + return false; + + return true; + } + + private boolean checkVanillaArrow(ItemStack stack) + { + // null + if(stack == null) + return false; + // no arrow + if(!(stack.getItem() == Items.arrow)) + return false; + // inventory shouldn't contain stacksize 0 items so we don't have to check that. + + return true; + } + + @Override + protected Entity createProjectile(ItemStack arrows, World world, EntityPlayer player, float speed, float accuracy) { + EntityArrow arrow; + + if(arrows.getItem() == Items.arrow) { + arrow = new EntityArrow(world, player, speed/1.5f); // vanilla arrows internally do x1.5 + } + else { + ItemStack reference = arrows.copy(); + reference.stackSize = 1; + reference.getTagCompound().getCompoundTag("InfiTool").setInteger("Ammo", 1); + arrow = new ArrowEntity(world, player, speed, accuracy, reference); + } + + if(player.capabilities.isCreativeMode) + arrow.canBePickedUp = 2; + + return arrow; + } + + @Override + public void playFiringSound(World world, EntityPlayer player, ItemStack weapon, ItemStack ammo, float speed, float accuracy) { + world.playSoundAtEntity(player, "random.bow", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + speed * 0.5F); + } + + @Override + public void buildTool (int id, String name, List list) + { + // all creative bows use regular bowstring + ItemStack handleStack = new ItemStack(getHandleItem(), 1, 0); // regular bowstring + ItemStack accessoryStack = getPartAmount() > 2 ? new ItemStack(getAccessoryItem(), 1, id) : null; + ItemStack extraStack = getPartAmount() > 3 ? new ItemStack(getExtraItem(), 1, id) : null; + + ItemStack tool = ToolBuilder.instance.buildTool(new ItemStack(getHeadItem(), 1, id), handleStack, accessoryStack, extraStack, ""); + if (tool != null) + { + tool.getTagCompound().getCompoundTag("InfiTool").setBoolean("Built", true); + list.add(tool); + } + } +/* + @Override + public int getColorFromItemStack(ItemStack stack, int renderPass) { + if(renderPass != 0 || !stack.hasTagCompound()) + return super.getColorFromItemStack(stack, renderPass); + + // bowstring: custom material -> custom coloring + // todo: move this into the custom material itself + int mat = stack.getTagCompound().getCompoundTag("InfiTool").getInteger("Handle"); + switch(mat) + { + case 0: return 0xffffffff; // string = white + case 1: return 0xffccccff; // macig string = light blue + case 2: return 0xffffcccc; // flamestring = light red + } + return super.getColorFromItemStack(stack, renderPass); + } + */ +} diff --git a/src/main/java/tconstruct/weaponry/library/weaponry/IAccuracy.java b/src/main/java/tconstruct/weaponry/library/weaponry/IAccuracy.java new file mode 100644 index 00000000000..30ab05ba834 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/library/weaponry/IAccuracy.java @@ -0,0 +1,10 @@ +package boni.tinkersweaponry.library.weaponry; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +public interface IAccuracy { + public float minAccuracy(ItemStack itemStack); + public float maxAccuracy(ItemStack itemStack); + public float getAccuracy(ItemStack itemStack, EntityPlayer player); +} diff --git a/src/main/java/tconstruct/weaponry/library/weaponry/IAmmo.java b/src/main/java/tconstruct/weaponry/library/weaponry/IAmmo.java new file mode 100644 index 00000000000..ae06eba96e4 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/library/weaponry/IAmmo.java @@ -0,0 +1,38 @@ +package boni.tinkersweaponry.library.weaponry; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public interface IAmmo { + /** + * Returns the current ammo amount of the item. + */ + int getAmmoCount(ItemStack stack); + + /** + * Returns the maximum amount of ammo the item can have + */ + int getMaxAmmo(ItemStack stack); + + /** + * Returns the maximum amount of ammo the item can have + * @param tags InfiTool tag compound of the item + */ + int getMaxAmmo(NBTTagCompound tags); + + /** + * Adds the given amount of ammo cache. Will not go over max-ammo. + * @param count How much to add + * @param stack The itemstack to add the ammo to. Has to have the proper NBT. + * @return The amount of ammo that couldn't be added. + */ + int addAmmo(int count, ItemStack stack); + + /** + * Removes the given amount fro the ammo cache. Will not go below zero. + * @param count How much to remove + * @param stack The itemstack to add the ammo to. Has to have the proper NBT. + * @return The amount of ammo that couldn't be removed. If you try to remove 5, but only 3 are left, it'll return 2. + */ + int consumeAmmo(int count, ItemStack stack); +} diff --git a/src/main/java/tconstruct/weaponry/library/weaponry/IWindup.java b/src/main/java/tconstruct/weaponry/library/weaponry/IWindup.java new file mode 100644 index 00000000000..4b72714a571 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/library/weaponry/IWindup.java @@ -0,0 +1,20 @@ +package boni.tinkersweaponry.library.weaponry; + +import boni.tinkersweaponry.client.CrosshairType; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +/** + * This class has a windup time, meaning it takes some time to reach full potency. + * Windup progress is visualized with a special crosshair. + */ +public interface IWindup { + public int getWindupTime(ItemStack itemStack); // how long it takes to fully wind up + public float getWindupProgress(ItemStack itemStack, EntityPlayer player); // how far we've winded up, 0.0-1.0 + public float getMinWindupProgress(ItemStack itemStack); // how long it has been winded up at least to fire (0.0-1.0) + + public CrosshairType getCrosshairType(); + + public boolean zoomOnWindup(ItemStack itemStack); + public float getZoom(ItemStack itemStack); +} diff --git a/src/main/java/tconstruct/weaponry/library/weaponry/ProjectileWeapon.java b/src/main/java/tconstruct/weaponry/library/weaponry/ProjectileWeapon.java new file mode 100644 index 00000000000..ec4fc2c0331 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/library/weaponry/ProjectileWeapon.java @@ -0,0 +1,320 @@ +package boni.tinkersweaponry.library.weaponry; + +import boni.tinkersweaponry.TinkerWeaponry; +import boni.tinkersweaponry.client.CrosshairType; +import boni.tinkersweaponry.util.Reference; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumAction; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.player.ArrowLooseEvent; +import tconstruct.library.tools.AbilityHelper; +import tconstruct.library.tools.ToolCore; +import tconstruct.library.util.TextureHelper; + +import java.util.HashMap; +import java.util.Map; + +/** + * Weapons that utilize ammo that uses the ammo system to shoot projectiles. + * Bows,... + */ +public abstract class ProjectileWeapon extends ToolCore implements IAccuracy, IWindup { + public ProjectileWeapon(int baseDamage, String name) { + super(baseDamage); + this.setUnlocalizedName(Reference.prefix(name)); + this.setCreativeTab(TinkerWeaponry.creativeTab); + } + + @SideOnly(Side.CLIENT) + public CrosshairType getCrosshairType() { + return CrosshairType.SQUARE; + } + + @Override + public boolean zoomOnWindup(ItemStack itemStack) { + return false; + } + + @Override + public float getZoom(ItemStack itemStack) { + return 1.0f; + } + + /** + * Searches the player for ammo to use + * @param player the player + * @return the itemstack found to be ammo + */ + public abstract ItemStack searchForAmmo(EntityPlayer player, ItemStack weapon); + + /** + * Creates the projectile to be fired. + * @param ammo The ammo used + * @param world world. + * @param player player. + * @param speed the speed calculated for the projectile + * @param accuracy the accuracy calculated for the projectile + * @return A banana. + */ + protected abstract Entity createProjectile(ItemStack ammo, World world, EntityPlayer player, float speed, float accuracy); + + + /* Accuracy */ + public abstract float minAccuracy(ItemStack itemStack); + public abstract float maxAccuracy(ItemStack itemStack); + + public float getAccuracy(ItemStack itemStack, EntityPlayer player) + { + return getAccuracy(itemStack, getMaxItemUseDuration(itemStack) - player.getItemInUseCount()); + } + + public float getAccuracy(ItemStack itemStack, int time) + { + float dif = minAccuracy(itemStack) - maxAccuracy(itemStack); + + return minAccuracy(itemStack) - dif * getWindupProgress(itemStack, time); + } + + /* Windup */ + public int getWindupTime(ItemStack itemStack) { + NBTTagCompound toolTag = itemStack.getTagCompound().getCompoundTag("InfiTool"); + return (int)((float)toolTag.getInteger("DrawSpeed")*windupModifier(itemStack)); + } + + protected float windupModifier(ItemStack itemStack) { return 1.0f; } + + public float getWindupProgress(ItemStack itemStack, EntityPlayer player) + { + // what are you doing! + if(player.inventory.getCurrentItem() != itemStack) + return 0f; + + // are we using it? + if(player.getItemInUse() == null) + return 0f; + + return getWindupProgress(itemStack, getMaxItemUseDuration(itemStack) - player.getItemInUseCount()); + } + + public float getWindupProgress(ItemStack itemStack, int timeInUse) + { + float time = (float) timeInUse; + float windup = getWindupTime(itemStack); + if(time > windup) + return 1.0f; + + return time/windup; + } + + public float getProjectileSpeed(ItemStack itemStack) + { + NBTTagCompound toolTag = itemStack.getTagCompound().getCompoundTag("InfiTool"); + return toolTag.getFloat("FlightSpeed") * projectileSpeedModifier(itemStack); + } + + protected float projectileSpeedModifier(ItemStack itemStack) { return 1.0f; } + + /* Bow usage */ + @Override + public EnumAction getItemUseAction(ItemStack par1ItemStack) { + return EnumAction.none; + } + + @Override + public int getMaxItemUseDuration(ItemStack par1ItemStack) { + return 72000; + } + + @Override + public ItemStack onItemRightClick (ItemStack stack, World world, EntityPlayer player) + { + if(getWindupTime(stack) == 0.0f) + return stack; + + // only if ammo is present + if(searchForAmmo(player, stack) != null) + player.setItemInUse(stack, this.getMaxItemUseDuration(stack)); + return stack; + } + + @Override + public void onPlayerStoppedUsing (ItemStack weapon, World world, EntityPlayer player, int useRemaining) + { + int time = this.getMaxItemUseDuration(weapon) - useRemaining; + + // we abuse the arrowLooseEvent for all projectiles + ArrowLooseEvent event = new ArrowLooseEvent(player, weapon, time); + MinecraftForge.EVENT_BUS.post(event); + if (event.isCanceled()) + { + return; + } + time = event.charge; + + // find ammo + ItemStack ammo = searchForAmmo(player, weapon); + + // no ammo found. :( + if(ammo == null) + return; + + NBTTagCompound toolTag = weapon.getTagCompound().getCompoundTag("InfiTool"); + float projectileSpeed = getProjectileSpeed(weapon); + float windup = getWindupProgress(weapon, time); + float accuracy = getAccuracy(weapon, time); + + // needs a minimum windup + if(windup < this.getMinWindupProgress(weapon)) + return; + + // take windup time into account + projectileSpeed *= windup; + + Entity projectile = createProjectile(ammo, world, player, projectileSpeed, accuracy); + + + int reinforced = 0; + if (toolTag.hasKey("Unbreaking")) + reinforced = toolTag.getInteger("Unbreaking"); + + if (random.nextInt(10) < 10 - reinforced) + AbilityHelper.damageTool(weapon, 1, player, false); + + playFiringSound(world, player, weapon, ammo, projectileSpeed, accuracy); + + + // use up ammo + if(ammo.getItem() instanceof IAmmo) + ((IAmmo) ammo.getItem()).consumeAmmo(1, ammo); + else + player.inventory.consumeInventoryItem(ammo.getItem()); + + // FIREEEEEEE + if (!world.isRemote) + world.spawnEntityInWorld(projectile); + } + + public abstract void playFiringSound(World world, EntityPlayer player, ItemStack weapon, ItemStack ammo, float speed, float accuracy); + + public HashMap animationHeadIcons = new HashMap(); + public HashMap animationHandleIcons = new HashMap(); + public HashMap animationAccessoryIcons = new HashMap(); + public HashMap animationExtraIcons = new HashMap(); + + // todo: animated effects + + @Override + public String getDefaultTexturePath() { + return Reference.RESOURCE + ":" + getDefaultFolder(); + } + + /** + * return true if the current renderpass should use animations. + * 0 == handle + * 1 == head + * 2 == accessory + * 3 == extra + */ + protected boolean animateLayer(int renderPass) + { + return false; + } + + @Override + public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) { + // animate? + if(!animateLayer(renderPass)) + return super.getIcon(stack, renderPass, player, usingItem, useRemaining); + + if(usingItem == null || stack != usingItem || !stack.hasTagCompound()) + return super.getIcon(stack, renderPass, player, usingItem, useRemaining); + + NBTTagCompound tags = stack.getTagCompound().getCompoundTag("InfiTool"); + + // effects aren't animated + // todo: make effects animated + if(renderPass >= getPartAmount() || tags == null) + return super.getIcon(stack, renderPass, player, usingItem, useRemaining); + + float progress = getWindupProgress(usingItem, getMaxItemUseDuration(usingItem) - useRemaining); + // get the correct icon + switch (renderPass) + { + case 0: return getCorrectAnimationIcon(animationHandleIcons, tags.getInteger("RenderHandle"), progress); + case 1: return getCorrectAnimationIcon(animationHeadIcons, tags.getInteger("renderHead"), progress); + case 2: return getCorrectAnimationIcon(animationAccessoryIcons, tags.getInteger("renderAccessory"), progress); + case 3: return getCorrectAnimationIcon(animationExtraIcons, tags.getInteger("renderExtra"), progress); + } + + return emptyIcon; + } + + protected IIcon getCorrectAnimationIcon(Map icons, int id, float progress) + { + // animation count, standard texture as reference + float count = icons.get(-1).length - 1; + int step = Math.round(progress * count); + + if(icons.containsKey(id)) + return icons.get(id)[step]; + + // default icon + return icons.get(-1)[step]; + } + + @Override + public void registerIcons(IIconRegister iconRegister) { + super.registerIcons(iconRegister); + + addAnimationIcons(headStrings, animationHeadIcons, iconRegister, getIconSuffix(0)); + addAnimationIcons(handleStrings, animationHandleIcons, iconRegister, getIconSuffix(2)); + addAnimationIcons(accessoryStrings, animationAccessoryIcons, iconRegister, getIconSuffix(3)); + addAnimationIcons(extraStrings, animationExtraIcons, iconRegister, getIconSuffix(4)); + } + + private void addAnimationIcons(HashMap textures, HashMap icons, IIconRegister iconRegister, String standard) + { + icons.clear(); + + // we use the standard to determine how many animations there are + if(standard == null || standard.isEmpty()) + return; + + int count = 1; + standard = getDefaultTexturePath() + "/" + standard; + while(TextureHelper.itemTextureExists(standard + "_" + count)) + count++; + + count--; + + // add the standard icons + IIcon[] anims = new IIcon[count]; + for(int i = 0; i < count; i++) + anims[i] = iconRegister.registerIcon(standard + "_" + (i+1)); + icons.put(-1, anims); + + // now do the same for each entry + for(Map.Entry entry : textures.entrySet()) + { + anims = new IIcon[count]; + boolean empty = true; + for(int i = 0; i < count; i++) { + String tex = entry.getValue() + "_" + (i+1); + if (TextureHelper.itemTextureExists(tex)) { + anims[i] = iconRegister.registerIcon(tex); + empty = false; + } + } + if(!empty) + icons.put(entry.getKey(), anims); + } + } +} diff --git a/src/main/java/tconstruct/weaponry/util/Config.java b/src/main/java/tconstruct/weaponry/util/Config.java new file mode 100644 index 00000000000..053634fb231 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/util/Config.java @@ -0,0 +1,4 @@ +package boni.tinkersweaponry.util; + +public class Config { +} diff --git a/src/main/java/tconstruct/weaponry/util/Reference.java b/src/main/java/tconstruct/weaponry/util/Reference.java new file mode 100644 index 00000000000..f69f03cbe60 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/util/Reference.java @@ -0,0 +1,17 @@ +package boni.tinkersweaponry.util; + +public final class Reference { + private Reference() {} + + public static final String MOD_ID = "tinkersweaponry"; + public static final String MOD_NAME = "Tinker's Weaponry"; + public static final String TCON_MOD_ID = "TConstruct"; + + public static final String RESOURCE = MOD_ID.toLowerCase(); + + public static String resource(String res) + { + return String.format("%s:%s", RESOURCE, res); + } + public static String prefix(String name) { return String.format("tcon.weaponry.%s", name);} +} diff --git a/src/main/java/tconstruct/weaponry/weapons/Crossbow.java b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java new file mode 100644 index 00000000000..24bd92d1395 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java @@ -0,0 +1,442 @@ +package boni.tinkersweaponry.weapons; + +import boni.tinkersweaponry.TinkerWeaponry; +import boni.tinkersweaponry.ammo.BoltAmmo; +import boni.tinkersweaponry.entity.BoltEntity; +import boni.tinkersweaponry.library.weaponry.AmmoItem; +import boni.tinkersweaponry.library.weaponry.ProjectileWeapon; +import boni.tinkersweaponry.util.Reference; +import boni.tinkersweaponry.library.weaponry.IAmmo; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import tconstruct.library.crafting.ToolBuilder; +import tconstruct.library.tools.AbilityHelper; +import tconstruct.tools.TinkerTools; + +import java.util.List; + +public class Crossbow extends ProjectileWeapon { + public Crossbow() { + super(0, "Crossbow"); + this.setMaxDamage(100); + } + + public boolean isLoaded(ItemStack itemStack) + { + if(itemStack.hasTagCompound()) + return isLoaded(itemStack.getTagCompound().getCompoundTag("InfiTool")); + + return false; + } + + public boolean isLoaded(NBTTagCompound tags) + { + return tags.getBoolean("Loaded"); + } + + public ItemStack getLoadedAmmo(ItemStack itemStack) + { + NBTTagCompound tags = itemStack.getTagCompound().getCompoundTag("InfiTool"); + if(!isLoaded(tags)) + return null; + + return ItemStack.loadItemStackFromNBT(tags.getCompoundTag("LoadedItem")); + } + + @Override + public int getWindupTime(ItemStack itemStack) { + NBTTagCompound toolTag = itemStack.getTagCompound().getCompoundTag("InfiTool"); + return (int)((float)toolTag.getInteger("DrawSpeed") * 2.5f); + } + + @Override + public float getMinWindupProgress(ItemStack itemStack) { + return 1.0f; + } + + @Override + public float getProjectileSpeed(ItemStack itemStack) { + return super.getProjectileSpeed(itemStack); + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + NBTTagCompound tags = stack.getTagCompound().getCompoundTag("InfiTool"); + + // unload on shift-rightclick + if(player.isSneaking()) + if(unload(stack, player, tags)) + return stack; + + // loaded + if(tags.getBoolean("Loaded")) + fire(stack, world, player); + + // reload (automatically after firing) + initiateReload(stack, player, tags); + + return stack; + } + + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int par4, boolean par5) { + super.onUpdate(stack, world, entity, par4, par5); + + if(!stack.hasTagCompound()) + return; + + if(!(entity instanceof EntityPlayer)) + return; + + EntityPlayer player = (EntityPlayer) entity; + if(player.inventory.getCurrentItem() != stack) + return; + + NBTTagCompound tags = stack.getTagCompound().getCompoundTag("InfiTool"); + if(tags.hasKey("Reloading")) + { + int timeLeft = tags.getInteger("Reloading"); + timeLeft--; + if(timeLeft > 0) + tags.setInteger("Reloading", timeLeft); + else { + tags.removeTag("Reloading"); + reload(stack, player, world, tags); + } + } + } + + @Override + public float getWindupProgress(ItemStack itemStack, EntityPlayer player) { + NBTTagCompound tags = itemStack.getTagCompound().getCompoundTag("InfiTool"); + + // loaded, full accuracy + if(tags.getBoolean("Loaded")) + return 1.0f; + // not loaded, but reloading -> progress + else if(tags.hasKey("Reloading")) + return 1.0f - ((float)tags.getInteger("Reloading"))/((float)getWindupTime(itemStack)); + // not loaded and not reloading -> no accuracy! + else + return 0.0f; + } + + public void initiateReload(ItemStack stack, EntityPlayer player, NBTTagCompound tags) { + if(tags.getBoolean("Broken")) + return; + + // has ammo? + if(searchForAmmo(player, stack) != null) + if(!tags.hasKey("Reloading")) + // start reloading + tags.setInteger("Reloading", getWindupTime(stack)); + } + + // called after the reloading is done. Does the actual loading + public boolean reload(ItemStack weapon, EntityPlayer player, World world, NBTTagCompound tags) + { + ItemStack ammo = searchForAmmo(player, weapon); + // no ammo present + if(ammo == null) + return false; + + // already loaded + if(tags.getBoolean("Loaded")) + return false; + + ItemStack copy = ammo.copy(); + copy.getTagCompound().getCompoundTag("InfiTool").setInteger("Ammo", 1); + + + // load ammo into nbt + NBTTagCompound ammotag = new NBTTagCompound(); + copy.writeToNBT(ammotag); + //ammotag.getCompoundTag("tag"; // set ammo count to 1 + tags.setTag("LoadedItem", ammotag); + tags.setBoolean("Loaded", true); + + // remove loaded item + if(ammo.getItem() instanceof IAmmo) + ((IAmmo) ammo.getItem()).consumeAmmo(1, ammo); + else + player.inventory.consumeInventoryItem(ammo.getItem()); + + playReloadSound(world, player, weapon, ammo); + + return true; + } + + // stops reloading, or unloads the ammo if it has been loaded + public boolean unload(ItemStack weapon, EntityPlayer player, NBTTagCompound tags) + { + // is reloading? + if(tags.hasKey("Reloading")) + { + // stop it + tags.removeTag("Reloading"); + return true; + } + + // loaded? + if(tags.getBoolean("Loaded")) + { + // unload + ItemStack loadedItem = ItemStack.loadItemStackFromNBT(tags.getCompoundTag("LoadedItem")); + AmmoItem ammo = (AmmoItem) loadedItem.getItem(); + // try to pick it up + ammo.pickupAmmo(loadedItem, searchForAmmo(player, weapon), player); + + // unloaded + tags.setBoolean("Loaded", false); + tags.removeTag("LoadedItem"); + + return true; + } + + // nothing to unload + return false; + } + + // called if loaded to SHOOOOOOOT + public void fire(ItemStack weapon, World world, EntityPlayer player) + { + NBTTagCompound tags = weapon.getTagCompound().getCompoundTag("InfiTool"); + // not loaded + if(!tags.getBoolean("Loaded")) + return; + + // get ammo + ItemStack ammo = ItemStack.loadItemStackFromNBT(tags.getCompoundTag("LoadedItem")); + + // unload + tags.setBoolean("Loaded", false); + tags.removeTag("LoadedItem"); + + // safety + if(ammo == null) + return; + + float projectileSpeed = getProjectileSpeed(weapon); + float windup = getWindupTime(weapon); // max windup time + float accuracy = getAccuracy(weapon, (int)windup); + + Entity projectile = createProjectile(ammo, world, player, projectileSpeed, accuracy); + + int reinforced = 0; + + if (tags.hasKey("Unbreaking")) + reinforced = tags.getInteger("Unbreaking"); + + if (random.nextInt(10) < 10 - reinforced) + AbilityHelper.damageTool(weapon, 1, player, false); + + playFiringSound(world, player, weapon, ammo, projectileSpeed, accuracy); + + // thwock + if (!world.isRemote) + world.spawnEntityInWorld(projectile); + } + + @Override + public ItemStack searchForAmmo(EntityPlayer player, ItemStack weapon) { + // arrow priority: hotbar > inventory, tinker arrows > regular arrows + ItemStack[] inventory = player.inventory.mainInventory; + + // check hotbar for tinker arrows + for(int i = 0; i < inventory.length; i++) + { + ItemStack stack = inventory[i]; + if(stack == null) + continue; + if(!(stack.getItem() instanceof BoltAmmo)) + continue; + if(((IAmmo) stack.getItem()).getAmmoCount(stack) <= 0) + continue; + + return stack; + } + + return null; + } + + @Override + protected Entity createProjectile(ItemStack ammo, World world, EntityPlayer player, float speed, float accuracy) { + EntityArrow arrow; + + ItemStack reference = ammo.copy(); + reference.stackSize = 1; + reference.getTagCompound().getCompoundTag("InfiTool").setInteger("Ammo", 1); + arrow = new BoltEntity(world, player, speed, accuracy, reference); + + if(player.capabilities.isCreativeMode) + arrow.canBePickedUp = 2; + + return arrow; + } + + @Override + public float minAccuracy(ItemStack itemStack) { + return 0; + } + + @Override + public float maxAccuracy(ItemStack itemStack) { + return 0; + } + + public void playReloadSound(World world, EntityPlayer player, ItemStack weapon, ItemStack ammo) { + world.playSoundAtEntity(player, Reference.resource("woodHit"), 1.0f, 1.0f); + } + + @Override + public void playFiringSound(World world, EntityPlayer player, ItemStack weapon, ItemStack ammo, float speed, float accuracy) { + // todo: THWOCK + } + + @Override + public IIcon getIcon(ItemStack stack, int renderPass) { + if(!animateLayer(renderPass)) + return super.getIcon(stack, renderPass); + + if(!stack.hasTagCompound()) + return super.getIcon(stack, renderPass); + + NBTTagCompound tags = stack.getTagCompound().getCompoundTag("InfiTool"); + + float progress; + + if(tags.getBoolean("Loaded")) + progress = 1; + else if(!tags.hasKey("Reloading")) + return super.getIcon(stack, renderPass); + else + progress = getWindupProgress(stack, getWindupTime(stack) - tags.getInteger("Reloading")); + + // effects aren't animated + // todo: make effects animated + if(renderPass >= getPartAmount()) + return super.getIcon(stack, renderPass); + + // get the correct icon + switch (renderPass) + { + case 0: return getCorrectAnimationIcon(animationHandleIcons, tags.getInteger("RenderHandle"), progress); + case 1: return getCorrectAnimationIcon(animationHeadIcons, tags.getInteger("renderHead"), progress); + case 2: return getCorrectAnimationIcon(animationAccessoryIcons, tags.getInteger("renderAccessory"), progress); + case 3: return getCorrectAnimationIcon(animationExtraIcons, tags.getInteger("renderExtra"), progress); + } + + return emptyIcon; + } + + @Override + public String getIconSuffix (int partType) + { + switch (partType) + { + case 0: + return "_crossbow_bow"; // head + case 1: + return ""; // broken + case 2: + return "_crossbow_body"; // handle + case 3: + return "_crossbow_string"; // accessory + case 4: + return "_crossbow_binding"; // extra + default: + return ""; + } + } + + @Override + public String getEffectSuffix () + { + return "_crossbow_effect"; + } + + @Override + public String getDefaultFolder () + { + return "crossbow"; + } + + @Override + public int getPartAmount() { + return 4; + } + + @Override + protected boolean animateLayer(int renderPass) { + return renderPass == 1 || renderPass == 2; + } + + @Override + public Item getHeadItem () + { + return TinkerWeaponry.partCrossbowLimb; + } + + @Override + public Item getHandleItem () + { + return TinkerWeaponry.partCrossbowBody; + } + + @Override + public Item getAccessoryItem () + { + return TinkerTools.bowstring; + } + + @Override + public Item getExtraItem() { + return TinkerTools.toughBinding; + } + + @Override + public String[] getTraits() { + return new String[] {"weapon", "ranged", "crossbow"}; + } + + + @Override + public void buildTool (int id, String name, List list) + { + // all creative bows use regular bowstring + ItemStack headStack = new ItemStack(getHeadItem(), 1, id); + ItemStack handleStack = new ItemStack(getHandleItem(), 1, id); + ItemStack accessoryStack = new ItemStack(getAccessoryItem(), 1, 0); // bowstring + ItemStack extraStack = getPartAmount() > 3 ? new ItemStack(getExtraItem(), 1, id) : null; + + ItemStack tool = ToolBuilder.instance.buildTool(headStack, handleStack, accessoryStack, extraStack, ""); + if (tool != null) + { + tool.getTagCompound().getCompoundTag("InfiTool").setBoolean("Built", true); + list.add(tool); + } + } + + @Override + public int getColorFromItemStack(ItemStack stack, int renderPass) { + if(renderPass != 2 || !stack.hasTagCompound()) + return super.getColorFromItemStack(stack, renderPass); + + // bowstring: custom material -> custom coloring + // todo: move this into the custom material itself + int mat = stack.getTagCompound().getCompoundTag("InfiTool").getInteger("Accessory"); + switch(mat) + { + case 0: return 0xffffffff; // string = white + case 1: return 0xffccccff; // macig string = light blue + case 2: return 0xffffcccc; // flamestring = light red + } + return super.getColorFromItemStack(stack, renderPass); + } +} diff --git a/src/main/java/tconstruct/weaponry/weapons/Javelin.java b/src/main/java/tconstruct/weaponry/weapons/Javelin.java new file mode 100644 index 00000000000..49bc11ede4c --- /dev/null +++ b/src/main/java/tconstruct/weaponry/weapons/Javelin.java @@ -0,0 +1,169 @@ +package boni.tinkersweaponry.weapons; + +import boni.tinkersweaponry.entity.JavelinEntity; +import boni.tinkersweaponry.library.weaponry.AmmoWeapon; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import tconstruct.library.tools.AbilityHelper; +import tconstruct.tools.TinkerTools; + +public class Javelin extends AmmoWeapon { + public Javelin() { + super(3, "Javelin"); + } + + @Override + public boolean onLeftClickEntity (ItemStack stack, EntityPlayer player, Entity entity) + { + // javelin is the only throwing/ammo weapon that hurts on leftclicking + return AbilityHelper.onLeftClickEntity(stack, player, entity, this, 0); + } + + @Override + public float getWindupProgress(ItemStack itemStack, EntityPlayer player) { + if(!itemStack.hasTagCompound()) + return super.getWindupProgress(itemStack, player); + + if(!itemStack.getTagCompound().getCompoundTag("InfiTool").hasKey("Throwing")) + return 0.5f; + + float timeleft = itemStack.getTagCompound().getCompoundTag("InfiTool").getInteger("Throwing"); + float threshold = getWindupTime(itemStack)/5; + if(timeleft < threshold) + return (threshold-timeleft)/threshold; + else + return 0.5f - 0.25f * ((float)getWindupTime(itemStack)-timeleft)/threshold; + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + NBTTagCompound tags = stack.getTagCompound().getCompoundTag("InfiTool"); + + // already throwing + if(tags.hasKey("Throwing")) + return stack; + + // has ammo? + if(this.getAmmoCount(stack) <= 0) + return stack; + + // start throwing + tags.setInteger("Throwing", getWindupTime(stack)); + + return stack; + } + + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int par4, boolean par5) { + super.onUpdate(stack, world, entity, par4, par5); + + if(!stack.hasTagCompound()) + return; + + NBTTagCompound tags = stack.getTagCompound().getCompoundTag("InfiTool"); + if(!tags.hasKey("Throwing")) + return; + + EntityPlayer player = (EntityPlayer) entity; + if(player.inventory.getCurrentItem() != stack) + return; + + int timeLeft = tags.getInteger("Throwing"); + timeLeft--; + if(timeLeft > 0) + tags.setInteger("Throwing", timeLeft); + else { + onPlayerStoppedUsing(stack, world, player, 0); + tags.removeTag("Throwing"); + } + } + + @Override + public boolean zoomOnWindup(ItemStack itemStack) { + return true; + } + + @Override + public float getZoom(ItemStack itemStack) { + return 1.5f; + } + + @Override + public float minAccuracy(ItemStack itemStack) { + return 2.5f; + } + + @Override + public float maxAccuracy(ItemStack itemStack) { + return 0.5f; + } + + @Override + public int getWindupTime(ItemStack itemStack) { + return 20; + } + + @Override + public int getPartAmount() { + return 3; + } + + @Override + public String getIconSuffix(int partType) { + switch (partType) + { + case 0: + return "_javelin_head"; + case 1: + return ""; // no broken, since it runs out of ammo + case 2: + return "_javelin_handle"; + case 3: + return "_javelin_accessory"; + default: + return ""; + } + } + + @Override + public String getEffectSuffix() { + return "_javelin_effect"; + } + + @Override + public String getDefaultFolder() { + return "javelin"; + } + + @Override + public float getAmmoModifier() { + return 0.02f; + } + + @Override + public Item getHeadItem() { + return TinkerTools.arrowhead; + } + + @Override + public Item getHandleItem() { + return TinkerTools.toughRod; + } + + @Override + public Item getAccessoryItem() { + return TinkerTools.toughRod; + } + + @Override + protected Entity createProjectile(ItemStack reference, World world, EntityPlayer player, float accuracy) { + reference.getTagCompound().getCompoundTag("InfiTool").removeTag("Throwing"); // needed so the NBTs are equal + JavelinEntity entity = new JavelinEntity(world, player, 2.0f, accuracy, reference); + + return entity; + } +} diff --git a/src/main/java/tconstruct/weaponry/weapons/LongBow.java b/src/main/java/tconstruct/weaponry/weapons/LongBow.java new file mode 100644 index 00000000000..d3302d90d05 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/weapons/LongBow.java @@ -0,0 +1,131 @@ +package boni.tinkersweaponry.weapons; + +import boni.tinkersweaponry.TinkerWeaponry; +import boni.tinkersweaponry.ammo.ArrowAmmo; +import boni.tinkersweaponry.library.weaponry.BowBaseAmmo; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import tconstruct.tools.TinkerTools; + +public class LongBow extends BowBaseAmmo { + public LongBow() { + super(0, "Longbow"); + } + + @Override + public float minAccuracy(ItemStack itemStack) { + return 7.5f; + } + + @Override + public float maxAccuracy(ItemStack itemStack) { + return 0.5f; + } + + @Override + public float getZoom(ItemStack itemStack) { + return 1.7f; + } + + @Override + protected float windupModifier(ItemStack itemStack) { + return 1.5f; + } + + @Override + protected float projectileSpeedModifier(ItemStack itemStack) { + return 1.5f; + } + + @Override + protected Entity createProjectile(ItemStack arrows, World world, EntityPlayer player, float speed, float accuracy) { + if(arrows.getItem() instanceof ArrowAmmo) + { + // modify accuraccy of the arrow depending on its accuraccy and weight + NBTTagCompound tags = arrows.getTagCompound().getCompoundTag("InfiTool"); + float matAccuracy = tags.getFloat("Accuracy"); + float weight = tags.getFloat("Mass"); + + // we need heavier arrows because we have POW. therefore we increase the weight penality on accuracy + accuracy += ((100f-matAccuracy)/10f)/(weight-1f); + if(accuracy < 0) + accuracy = 0; + } + + return super.createProjectile(arrows, world, player, speed, accuracy); + } + + @Override + public String getIconSuffix (int partType) + { + switch (partType) + { + case 0: + return "_bow_top"; + case 1: + return "_bowstring_broken"; + case 2: + return "_bowstring"; + case 3: + return "_bow_bottom"; + case 4: + return "_bow_grip"; + default: + return ""; + } + } + + @Override + public String getEffectSuffix () + { + return "_bow_effect"; + } + + @Override + public String getDefaultFolder () + { + return "longbow"; + } + + @Override + public int getPartAmount() { + return 4; + } + + @Override + protected boolean animateLayer(int renderPass) { + return renderPass < 3; + } + + @Override + public Item getHeadItem () + { + return TinkerWeaponry.partBowLimb; + } + + @Override + public Item getHandleItem () + { + return TinkerTools.bowstring; + } + + @Override + public Item getAccessoryItem () + { + return TinkerWeaponry.partBowLimb; + } + + @Override + public Item getExtraItem() { + return TinkerTools.largePlate; + } + + @Override + public String[] getTraits() { + return new String[] {"weapon", "ranged", "bow"}; + } +} diff --git a/src/main/java/tconstruct/weaponry/weapons/ShortBow.java b/src/main/java/tconstruct/weaponry/weapons/ShortBow.java new file mode 100644 index 00000000000..82e33676350 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/weapons/ShortBow.java @@ -0,0 +1,114 @@ +package boni.tinkersweaponry.weapons; + +import boni.tinkersweaponry.TinkerWeaponry; +import boni.tinkersweaponry.ammo.ArrowAmmo; +import boni.tinkersweaponry.library.weaponry.BowBaseAmmo; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import tconstruct.tools.TinkerTools; + +public class ShortBow extends BowBaseAmmo { + public ShortBow() { + super(0, "Shortbow"); + } + + @Override + protected float windupModifier(ItemStack itemStack) { + return 0.9f; // SHORT bows have a SHORTER windup because they're SHORT. hahahaha.... get it? + } + + @Override + public float minAccuracy(ItemStack itemStack) { + return 1; + } + + @Override + public float maxAccuracy(ItemStack itemStack) { + return 1; + } + + @Override + protected Entity createProjectile(ItemStack arrows, World world, EntityPlayer player, float speed, float accuracy) { + if(arrows.getItem() instanceof ArrowAmmo) + { + // modify accuraccy of the arrow depending on its accuraccy and weight + NBTTagCompound tags = arrows.getTagCompound().getCompoundTag("InfiTool"); + float matAccuracy = tags.getFloat("Accuracy"); + float weight = tags.getFloat("Mass"); + + // weight influences the accuracy too, but only a little bit. + accuracy += ((100f-matAccuracy)/10f)/(weight); + if(accuracy < 0) + accuracy = 0; + } + + return super.createProjectile(arrows, world, player, speed, accuracy); + } + + @Override + public String getIconSuffix (int partType) + { + switch (partType) + { + case 0: + return "_bow_top"; + case 1: + return "_bowstring_broken"; + case 2: + return "_bowstring"; + case 3: + return "_bow_bottom"; + default: + return ""; + } + } + + @Override + public String getEffectSuffix () + { + return "_bow_effect"; + } + + @Override + public String getDefaultFolder () + { + return "shortbow"; + } + + @Override + public int getPartAmount() { + return 3; + } + + @Override + protected boolean animateLayer(int renderPass) { + return renderPass < 3; + } + + @Override + public Item getHeadItem () + { + return TinkerWeaponry.partBowLimb; + } + + @Override + public Item getHandleItem () + { + return TinkerTools.bowstring; + } + + @Override + public Item getAccessoryItem () + { + return TinkerWeaponry.partBowLimb; + } + + @Override + public String[] getTraits() { + return new String[] {"weapon", "ranged", "bow"}; + } +} diff --git a/src/main/java/tconstruct/weaponry/weapons/Shuriken.java b/src/main/java/tconstruct/weaponry/weapons/Shuriken.java new file mode 100644 index 00000000000..6384c0e2369 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/weapons/Shuriken.java @@ -0,0 +1,169 @@ +package boni.tinkersweaponry.weapons; + +import boni.tinkersweaponry.TinkerWeaponry; +import boni.tinkersweaponry.client.CrosshairType; +import boni.tinkersweaponry.client.IconFlipped; +import boni.tinkersweaponry.entity.ShurikenEntity; +import boni.tinkersweaponry.library.weaponry.AmmoWeapon; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumAction; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +import java.util.Iterator; +import java.util.Map; + +public class Shuriken extends AmmoWeapon { + + public Shuriken() { + super(1, "shuriken"); + } + + @Override + public float getDamageModifier() { + return 0.4f; + } + + @Override + public int getPartAmount() { + return 4; + } + + @Override + public String getIconSuffix(int partType) { + switch (partType) + { + case 0: + return "_shuriken"; + case 1: + return ""; // no broken, since it runs out of ammo + case 2: + return "_shuriken"; + case 3: + return "_shuriken"; + case 4: + return "_shuriken"; + default: + return ""; + } + } + + @Override + public String getEffectSuffix() { + return "_shuriken_effect"; + } + + @Override + public String getDefaultFolder() { + return "shuriken"; + } + + @Override + public Item getHeadItem() { + return TinkerWeaponry.partShuriken; + } + + @Override + public Item getHandleItem() { + return TinkerWeaponry.partShuriken; + } + + @Override + public Item getAccessoryItem() { + return TinkerWeaponry.partShuriken; + } + + @Override + public Item getExtraItem() { + return TinkerWeaponry.partShuriken; + } + + @Override + public float minAccuracy(ItemStack itemStack) { + return 0; + } + + @Override + public float maxAccuracy(ItemStack itemStack) { + return 0; + } + + @Override + public float getWindupProgress(ItemStack itemStack, EntityPlayer player) { + return 1.0f; // always fully winded! + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + launchProjectile(stack, world, player); + + // this is only used for the animation + player.setItemInUse(stack, this.getMaxItemUseDuration(stack)); + + return stack; + } + + @Override + protected Entity createProjectile(ItemStack reference, World world, EntityPlayer player, float accuracy) { + return new ShurikenEntity(world, player, 1.9f, 0f, reference); + } + + @Override + public void onPlayerStoppedUsing(ItemStack stack, World world, EntityPlayer player, int durationLeft) { + // do nothing, or we'd throw double-shurikens! + } + + @Override + public int getMaxItemUseDuration(ItemStack par1ItemStack) { + return 2; + } + + @Override + public EnumAction getItemUseAction(ItemStack par1ItemStack) { + return EnumAction.block; + } + + @Override + public void registerIcons(IIconRegister iconRegister) { + // register icons as usually + super.registerIcons(iconRegister); + + // now we flip all the different part icons, so we only need 1 graphic for 4 different orientations \o/ + // handle first: flip x + Iterator> iter = handleIcons.entrySet().iterator(); + while(iter.hasNext()) + { + Map.Entry entry = iter.next(); + entry.setValue(new IconFlipped(entry.getValue(), true, false)); + // the entry object should reference the direct object in the map, no further updating needed + } + + // accessory: flip y + iter = accessoryIcons.entrySet().iterator(); + while(iter.hasNext()) + { + Map.Entry entry = iter.next(); + entry.setValue(new IconFlipped(entry.getValue(), false, true)); + } + + // extra: flip x and y + iter = extraIcons.entrySet().iterator(); + while(iter.hasNext()) + { + Map.Entry entry = iter.next(); + entry.setValue(new IconFlipped(entry.getValue(), true, true)); + } + } + + @SideOnly(Side.CLIENT) + @Override + public CrosshairType getCrosshairType() { + return CrosshairType.TIP; + } +} diff --git a/src/main/java/tconstruct/weaponry/weapons/ThrowArrow.java b/src/main/java/tconstruct/weaponry/weapons/ThrowArrow.java new file mode 100644 index 00000000000..980142c9418 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/weapons/ThrowArrow.java @@ -0,0 +1,92 @@ +package boni.tinkersweaponry.weapons; + +import boni.tinkersweaponry.entity.ArrowEntity; +import boni.tinkersweaponry.library.weaponry.AmmoWeapon; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import tconstruct.tools.TinkerTools; + +public class ThrowArrow extends AmmoWeapon { + public ThrowArrow() { + super(1, "ThrowArrow"); + + headIcons = TinkerTools.arrow.headIcons; + handleIcons = TinkerTools.arrow.handleIcons; + accessoryIcons = TinkerTools.arrow.accessoryIcons; + extraIcons = TinkerTools.arrow.extraIcons; + } + + @Override + public String getIconSuffix (int partType) + { + switch (partType) + { + case 0: + return "_arrow_head"; + case 1: + return ""; // Doesn't break + case 2: + return "_arrow_shaft"; + case 3: + case 4: + return "_arrow_fletching"; + default: + return ""; + } + } + + @Override + public String getEffectSuffix () + { + return "_arrow_effect"; + } + + @Override + public String getDefaultFolder () + { + return "arrow"; + } + + @Override + public int getPartAmount() { + return 4; + } + + @Override + public Item getHeadItem () + { + return TinkerTools.arrowhead; + } + + @Override + public Item getAccessoryItem () + { + return TinkerTools.fletching; + } + + @Override + public Item getExtraItem () + { + return TinkerTools.fletching; + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + ItemStack reference = stack.copy(); + reference.stackSize = 1; + Entity projectile = new ArrowEntity(world, player, 1.9f, 0f, reference); + + if(!world.isRemote) + world.spawnEntityInWorld(projectile); + + return stack; + } + + @Override + protected Entity createProjectile(ItemStack reference, World world, EntityPlayer player, float accuracy) { + return new ArrowEntity(world, player, 1.0f, accuracy, reference); + } +} diff --git a/src/main/java/tconstruct/weaponry/weapons/ThrowArrowItem.java b/src/main/java/tconstruct/weaponry/weapons/ThrowArrowItem.java new file mode 100644 index 00000000000..7793a0591a4 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/weapons/ThrowArrowItem.java @@ -0,0 +1,128 @@ +package boni.tinkersweaponry.weapons; + +import boni.tinkersweaponry.entity.ArrowEntity; +import boni.tinkersweaponry.util.Reference; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.item.EnumAction; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import tconstruct.library.crafting.ToolBuilder; +import tconstruct.library.tools.Weapon; +import tconstruct.tools.TinkerTools; + +import java.util.List; + +public class ThrowArrowItem extends Weapon { + public ThrowArrowItem() { + super(1); + this.setUnlocalizedName(Reference.prefix("ThrowArrow")); + + headIcons = TinkerTools.arrow.headIcons; + handleIcons = TinkerTools.arrow.handleIcons; + accessoryIcons = TinkerTools.arrow.accessoryIcons; + extraIcons = TinkerTools.arrow.extraIcons; + } + + @Override + public ItemStack onItemRightClick (ItemStack itemstack, World world, EntityPlayer player) + { + ItemStack stack = itemstack.copy(); + if (!world.isRemote) + { + EntityArrow arrow = new ArrowEntity(world, player, 1.0f, 1.0f, stack); + world.spawnEntityInWorld(arrow); + } + + return itemstack; + } + + @Override + public String getIconSuffix (int partType) + { + switch (partType) + { + case 0: + return "_arrow_head"; + case 1: + return ""; // Doesn't break + case 2: + return "_arrow_shaft"; + case 3: + return "_arrow_fletching"; + default: + return ""; + } + } + + @Override + public String getEffectSuffix () + { + return "_arrow_effect"; + } + + @Override + public String getDefaultFolder () + { + return "arrow"; + } + + @Override + public void registerPartPaths (int index, String[] location) + { + headStrings.put(index, location[0]); + handleStrings.put(index, location[2]); + } + + @Override + public void registerAlternatePartPaths (int index, String[] location) + { + accessoryStrings.put(index, location[3]); + } + + @Override + public Item getHeadItem () + { + return TinkerTools.arrowhead; + } + + @Override + public Item getAccessoryItem () + { + return TinkerTools.fletching; + } + + @Override + public EnumAction getItemUseAction (ItemStack par1ItemStack) + { + return EnumAction.bow; + } + + @Override + public String[] getTraits () + { + return new String[] { "weapon", "throwing" }; + } + + @Override + public void getSubItems (Item id, CreativeTabs tab, List list) + { + ItemStack toolMine = new ItemStack(this); + + Item accessory = getAccessoryItem(); + ItemStack accessoryStack = accessory != null ? new ItemStack(getAccessoryItem(), 1, 0) : null; + Item extra = getExtraItem(); + ItemStack extraStack = extra != null ? new ItemStack(extra, 1, 0) : null; + ItemStack tool = ToolBuilder.instance.buildTool(new ItemStack(getHeadItem(), 1, 3), new ItemStack(getHandleItem(), 1, 0), accessoryStack, extraStack, ""); + if (tool != null) + { + tool.stackSize = 1; + tool.getTagCompound().getCompoundTag("InfiTool").setBoolean("Built", true); + + toolMine.setTagCompound(tool.getTagCompound()); + list.add(toolMine); + } + } +} diff --git a/src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java b/src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java new file mode 100644 index 00000000000..c21b9571f82 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java @@ -0,0 +1,90 @@ +package boni.tinkersweaponry.weapons; + +import boni.tinkersweaponry.client.CrosshairType; +import boni.tinkersweaponry.entity.ThrowingKnifeEntity; +import boni.tinkersweaponry.library.weaponry.AmmoWeapon; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import tconstruct.tools.TinkerTools; + +public class ThrowingKnife extends AmmoWeapon { + public ThrowingKnife() { + super(1, "throwingknife"); + } + + @Override + public int getPartAmount() { + return 2; + } + + @Override + public String getIconSuffix(int partType) { + switch (partType) + { + case 0: + return "_knife_blade"; + case 1: + return ""; // no broken, since it runs out of ammo + case 2: + return "_knife_handle"; + default: + return ""; + } + } + + @Override + public String getEffectSuffix() { + return "_throwingknife_effect"; + } + + @Override + public String getDefaultFolder() { + return "throwingknife"; + } + + @Override + public Item getHeadItem() { + return TinkerTools.knifeBlade; + } + + @Override + public Item getAccessoryItem() { + return null; + } + + @Override + public int getWindupTime(ItemStack itemStack) { return 30; } // 1 1/2 seconds + + @Override + public float getMinWindupProgress(ItemStack itemStack) { + return 0.6f; + } + + @Override + public float maxAccuracy(ItemStack itemStack) { + return 1f; + } + + @Override + public float minAccuracy(ItemStack itemStack) { + return 10f; + } + + @Override + protected Entity createProjectile(ItemStack reference, World world, EntityPlayer player, float accuracy) { + float speed = 1.5f; + + return new ThrowingKnifeEntity(world, player, speed, accuracy, reference); + } + + @SideOnly(Side.CLIENT) + @Override + public CrosshairType getCrosshairType() { + return CrosshairType.SPIKE; + } +} From 4bb32da4c8f998007077d67f84ec21e5ef2ba78f Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 5 Oct 2014 20:14:56 +0200 Subject: [PATCH 002/129] Another step at cleaning up integration --- resources/assets/tinker/sounds/Credits.txt | 9 +++ resources/assets/tinker/sounds/stoneHit1.ogg | Bin 0 -> 6790 bytes resources/assets/tinker/sounds/stoneHit2.ogg | Bin 0 -> 6142 bytes resources/assets/tinker/sounds/stoneHit3.ogg | Bin 0 -> 6066 bytes resources/assets/tinker/sounds/woodHit1.ogg | Bin 0 -> 9915 bytes resources/assets/tinker/sounds/woodHit2.ogg | Bin 0 -> 9316 bytes resources/assets/tinker/sounds/woodHit3.ogg | Bin 0 -> 9801 bytes resources/assets/tinker/sounds/woodHit4.ogg | Bin 0 -> 9667 bytes resources/assets/tinker/sounds/woodHit5.ogg | Bin 0 -> 9481 bytes src/main/java/tconstruct/TConstruct.java | 2 + .../tconstruct/weaponry/TinkerWeaponry.java | 52 ++++++++---------- .../weaponry/WeaponryClientProxy.java | 24 ++++---- .../weaponry/WeaponryCommonProxy.java | 15 ++--- .../tconstruct/weaponry/WeaponryHandler.java | 20 +++---- .../tconstruct/weaponry/ammo/ArrowAmmo.java | 11 ++-- .../tconstruct/weaponry/ammo/BoltAmmo.java | 8 +-- .../weaponry/client/AmmoSlotHandler.java | 4 +- .../weaponry/client/CrosshairHandler.java | 6 +- .../weaponry/client/CrosshairType.java | 2 +- .../weaponry/client/IconFlipped.java | 2 +- .../weaponry/client/RenderEventHandler.java | 8 +-- .../entityrenderer/ArrowEntityRenderer.java | 4 +- .../entityrenderer/JavelinEntityRenderer.java | 4 +- .../ProjectileBaseRenderer.java | 6 +- .../ShurikenEntityRenderer.java | 4 +- .../client/renderer/AmmoItemRenderer.java | 4 +- .../weaponry/client/renderer/BowRenderer.java | 12 ++-- .../client/renderer/CrossbowRenderer.java | 8 +-- .../client/renderer/FlexibleToolRenderer.java | 2 +- .../client/renderer/JavelinRenderer.java | 4 +- .../renderer/ThrowingKnifeRenderer.java | 4 +- .../weaponry/entity/ArrowEntity.java | 4 +- .../weaponry/entity/BoltEntity.java | 2 +- .../weaponry/entity/JavelinEntity.java | 4 +- .../weaponry/entity/ProjectileBase.java | 6 +- .../weaponry/entity/ShurikenEntity.java | 4 +- .../weaponry/entity/ThrowingKnifeEntity.java | 4 +- .../weaponry/items/CustomToolPart.java | 2 +- .../weaponry/items/DualMaterialToolPart.java | 6 +- .../weaponry/items/WeaponryPattern.java | 4 +- .../weaponry/items/WeaponryToolPart.java | 6 +- .../library/util/PiercingArrowDamage.java | 2 +- .../weaponry/library/weaponry/AmmoItem.java | 6 +- .../weaponry/library/weaponry/AmmoWeapon.java | 4 +- .../library/weaponry/ArrowShaftMaterial.java | 4 +- .../library/weaponry/BowBaseAmmo.java | 6 +- .../weaponry/library/weaponry/IAccuracy.java | 2 +- .../weaponry/library/weaponry/IAmmo.java | 2 +- .../weaponry/library/weaponry/IWindup.java | 4 +- .../library/weaponry/ProjectileWeapon.java | 8 +-- .../java/tconstruct/weaponry/util/Config.java | 2 +- .../tconstruct/weaponry/util/Reference.java | 2 +- .../tconstruct/weaponry/weapons/Crossbow.java | 18 +++--- .../tconstruct/weaponry/weapons/Javelin.java | 6 +- .../tconstruct/weaponry/weapons/LongBow.java | 8 +-- .../tconstruct/weaponry/weapons/ShortBow.java | 8 +-- .../tconstruct/weaponry/weapons/Shuriken.java | 12 ++-- .../weaponry/weapons/ThrowArrow.java | 6 +- .../weaponry/weapons/ThrowArrowItem.java | 6 +- .../weaponry/weapons/ThrowingKnife.java | 8 +-- 60 files changed, 189 insertions(+), 182 deletions(-) create mode 100644 resources/assets/tinker/sounds/Credits.txt create mode 100644 resources/assets/tinker/sounds/stoneHit1.ogg create mode 100644 resources/assets/tinker/sounds/stoneHit2.ogg create mode 100644 resources/assets/tinker/sounds/stoneHit3.ogg create mode 100644 resources/assets/tinker/sounds/woodHit1.ogg create mode 100644 resources/assets/tinker/sounds/woodHit2.ogg create mode 100644 resources/assets/tinker/sounds/woodHit3.ogg create mode 100644 resources/assets/tinker/sounds/woodHit4.ogg create mode 100644 resources/assets/tinker/sounds/woodHit5.ogg diff --git a/resources/assets/tinker/sounds/Credits.txt b/resources/assets/tinker/sounds/Credits.txt new file mode 100644 index 00000000000..a22f86fa60b --- /dev/null +++ b/resources/assets/tinker/sounds/Credits.txt @@ -0,0 +1,9 @@ +Stone-Hit: +Pickaxe mining stone by ryanconway +https://www.freesound.org/people/ryanconway/sounds/240801/ +metal falling on stone by p3n10 +https://www.freesound.org/people/p3n10/sounds/171294/ + +Wood-Hit: +Hitting Wood by altfuture +https://www.freesound.org/people/altfuture/sounds/174633/ \ No newline at end of file diff --git a/resources/assets/tinker/sounds/stoneHit1.ogg b/resources/assets/tinker/sounds/stoneHit1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..04fe1bee08c89f72c479f589b9b20727ad316fdd GIT binary patch literal 6790 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 a1ai;*d%HCEL)oJ^N=-@cN4p>2!2dVdAKktH literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/sounds/stoneHit2.ogg b/resources/assets/tinker/sounds/stoneHit2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..68ee18816d6a1d553daa517a1772acda90847de9 GIT binary patch literal 6142 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 literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/sounds/stoneHit3.ogg b/resources/assets/tinker/sounds/stoneHit3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..057eddfa0cbc067775d22958d208f645f6e24108 GIT binary patch literal 6066 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 z zk6&Hn^jqiTG92#Sy-6ns=f6MS zt^lf_>qf-mPr%s4A=x&=*#~Ls&3~V0HmX0#?^14;z`1Rw0)eTLNQQy!Z3jo%F zoA7A60_^PMwRi46egO>4tchf*x38H7{T_G$Krlxn7N^|v^4au0o#7uC%w&Z}zy+W* zwZf-DxvYa?POubBjezjA%G;g#Df!mHIRH2Ga$pYw&; zwI-bHI-g37A7rMbIt37Xs|oA;=q`mR$5UuV(a!v?R9wJIm+QFi_h+EfRB0-!yMZb1 z?_B(_>iUiEPdOWIa@f58l=RWh=Q`i1T>DilGxu4-<(KI#W>nuHVv}bsPrb`Y!YoM5 zHjc)1x%gZ*GEzqW(63}$`oA1#7_w;;Q@=uYk^+rINz$I->B*DNyAdv8E8N-6^ z(20o&fK`QWacFCLU%goJ`SA4qxGB}u1l93lq1-6;K|at+OXc&9`Lc|A*d~7dT#D0x z+NNuS7x^{gGMZ||opwS~Fy@z=^>qbDG5yH`?ogeCjKLqCng6TEvdc7og^_4|1StW1 zXoWx+klyFIBHb-4w4O!bn*hAU0RMw04lz}q@2kq*in{Y&@h6{r@&*54!K0;5Ui$kC zE>x{^dk2rAS!d)ww&HIKS=wcIrO9SjLz$~L( z{rqT6&ozfh{S?E|{4hfFliQ8K-`B>JB(~LBgE(>gPC;5}I!mQ{)`_G<3vB-0)~Ftd zh|vFBxiB+Rmt5Z_Y)(~=;kn#2LB;w0I6>$92DW8SN>6WR*Xh*WXIXyzG0Y<=N5J+D z6{^|SXKY(p`;)2uVQeH|qiX({mJ|pYC z|KJF{m7bY?nBLVs;M)!eeW;ZSX*XM_M}E%K{gJl{4N$I$e(LRCoPF%neOy^(QIE}E zrB^cZ>6*03=AaN5u=@j}+AZBnXxoNJ#!U7_v5`tJQW40@X9vpU&-b>ayC?&;$&<@Hh#$)mLjj#M?<5cD6q$I08lt9WUf_&+wSRF3u>_4HtI*$PQWZm(NzN z0{`T;Ub_19$bZfFT`mZA+HXl#{r#73g8n2fYO6?OW~a1lepJTEd}3N(V-Ykw{K&qr zwzk%#MlbFIg;h_0c zu1%+O;}1BWF#4GDPW}*PF|gVd4BMA)VixF-%)r-44dySd9jtgVvvhoWZm9V}!MASV z`oSq10!Kdk^2^5SQa#W3=dpi#D6ZK!zh*3Nh&jlrw1*EGmT{=@Y+rS)N9ftUqp1fJ zEBYsNj_{5t!m5QMEGtR8FlpjG+iqP<*VX>MqZ^~Tc*m2Kg^B~h9b?>XT~wjd)!xD0 z$L8qfrWM|%9DjO~Zr0@4Qa8=!P-t&fW|CbwY$mL?Y>KGUGQ6K){ zK<*`_k_YIfCScU&=D3Pt9K*YHo0W+=$~#JtDA~G{jZLnYqzBHSD2L&e4f-E{YjWop z7Wp?o$yZgw*TLzhS?A8zKT2-x?4=MLB-_b*Khjy6(F=^d{PTBSKaKrhjt;CwiSC6| G>isv3?Mm422oK!Fkv7|5|to9 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 literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/sounds/woodHit2.ogg b/resources/assets/tinker/sounds/woodHit2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..339ae097c906189bddfd89c13f999eac4192765d GIT binary patch literal 9316 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 literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/sounds/woodHit3.ogg b/resources/assets/tinker/sounds/woodHit3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..3b24d95bedfe6110c137cc6378a0679f23687df2 GIT binary patch literal 9801 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 literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/sounds/woodHit4.ogg b/resources/assets/tinker/sounds/woodHit4.ogg new file mode 100644 index 0000000000000000000000000000000000000000..06279c661758ddf92d4a3f0e215435822f5ab417 GIT binary patch literal 9667 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 gA_lb++8*BDzn4cw { diff --git a/src/main/java/tconstruct/weaponry/client/entityrenderer/JavelinEntityRenderer.java b/src/main/java/tconstruct/weaponry/client/entityrenderer/JavelinEntityRenderer.java index 6e7c828a178..b328e60ee65 100644 --- a/src/main/java/tconstruct/weaponry/client/entityrenderer/JavelinEntityRenderer.java +++ b/src/main/java/tconstruct/weaponry/client/entityrenderer/JavelinEntityRenderer.java @@ -1,6 +1,6 @@ -package boni.tinkersweaponry.client.entityrenderer; +package tconstruct.weaponry.client.entityrenderer; -import boni.tinkersweaponry.entity.JavelinEntity; +import tconstruct.weaponry.entity.JavelinEntity; import org.lwjgl.opengl.GL11; public class JavelinEntityRenderer extends ProjectileBaseRenderer { diff --git a/src/main/java/tconstruct/weaponry/client/entityrenderer/ProjectileBaseRenderer.java b/src/main/java/tconstruct/weaponry/client/entityrenderer/ProjectileBaseRenderer.java index f79c45c36cb..a4cc34aecc5 100644 --- a/src/main/java/tconstruct/weaponry/client/entityrenderer/ProjectileBaseRenderer.java +++ b/src/main/java/tconstruct/weaponry/client/entityrenderer/ProjectileBaseRenderer.java @@ -1,7 +1,7 @@ -package boni.tinkersweaponry.client.entityrenderer; +package tconstruct.weaponry.client.entityrenderer; -import boni.tinkersweaponry.client.renderer.FlexibleToolRenderer; -import boni.tinkersweaponry.entity.ProjectileBase; +import tconstruct.weaponry.client.renderer.FlexibleToolRenderer; +import tconstruct.weaponry.entity.ProjectileBase; import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.entity.Entity; diff --git a/src/main/java/tconstruct/weaponry/client/entityrenderer/ShurikenEntityRenderer.java b/src/main/java/tconstruct/weaponry/client/entityrenderer/ShurikenEntityRenderer.java index a2aa33f8d63..e085e1c7c89 100644 --- a/src/main/java/tconstruct/weaponry/client/entityrenderer/ShurikenEntityRenderer.java +++ b/src/main/java/tconstruct/weaponry/client/entityrenderer/ShurikenEntityRenderer.java @@ -1,6 +1,6 @@ -package boni.tinkersweaponry.client.entityrenderer; +package tconstruct.weaponry.client.entityrenderer; -import boni.tinkersweaponry.entity.ShurikenEntity; +import tconstruct.weaponry.entity.ShurikenEntity; import org.lwjgl.opengl.GL11; public class ShurikenEntityRenderer extends ProjectileBaseRenderer { diff --git a/src/main/java/tconstruct/weaponry/client/renderer/AmmoItemRenderer.java b/src/main/java/tconstruct/weaponry/client/renderer/AmmoItemRenderer.java index 1763e3e1949..e40ab1f4e82 100644 --- a/src/main/java/tconstruct/weaponry/client/renderer/AmmoItemRenderer.java +++ b/src/main/java/tconstruct/weaponry/client/renderer/AmmoItemRenderer.java @@ -1,6 +1,6 @@ -package boni.tinkersweaponry.client.renderer; +package tconstruct.weaponry.client.renderer; -import boni.tinkersweaponry.library.weaponry.IAmmo; +import tconstruct.weaponry.library.weaponry.IAmmo; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/tconstruct/weaponry/client/renderer/BowRenderer.java b/src/main/java/tconstruct/weaponry/client/renderer/BowRenderer.java index 089630c48cf..bec766b7d8f 100644 --- a/src/main/java/tconstruct/weaponry/client/renderer/BowRenderer.java +++ b/src/main/java/tconstruct/weaponry/client/renderer/BowRenderer.java @@ -1,10 +1,10 @@ -package boni.tinkersweaponry.client.renderer; +package tconstruct.weaponry.client.renderer; -import boni.tinkersweaponry.TinkerWeaponry; -import boni.tinkersweaponry.ammo.ArrowAmmo; -import boni.tinkersweaponry.entity.ArrowEntity; -import boni.tinkersweaponry.library.weaponry.ProjectileWeapon; -import boni.tinkersweaponry.library.weaponry.IWindup; +import tconstruct.weaponry.TinkerWeaponry; +import tconstruct.weaponry.ammo.ArrowAmmo; +import tconstruct.weaponry.entity.ArrowEntity; +import tconstruct.weaponry.library.weaponry.ProjectileWeapon; +import tconstruct.weaponry.library.weaponry.IWindup; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.RenderManager; diff --git a/src/main/java/tconstruct/weaponry/client/renderer/CrossbowRenderer.java b/src/main/java/tconstruct/weaponry/client/renderer/CrossbowRenderer.java index ecd0b5d2741..1fc398fef4b 100644 --- a/src/main/java/tconstruct/weaponry/client/renderer/CrossbowRenderer.java +++ b/src/main/java/tconstruct/weaponry/client/renderer/CrossbowRenderer.java @@ -1,8 +1,8 @@ -package boni.tinkersweaponry.client.renderer; +package tconstruct.weaponry.client.renderer; -import boni.tinkersweaponry.entity.ArrowEntity; -import boni.tinkersweaponry.entity.BoltEntity; -import boni.tinkersweaponry.weapons.Crossbow; +import tconstruct.weaponry.entity.ArrowEntity; +import tconstruct.weaponry.entity.BoltEntity; +import tconstruct.weaponry.weapons.Crossbow; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.RenderManager; diff --git a/src/main/java/tconstruct/weaponry/client/renderer/FlexibleToolRenderer.java b/src/main/java/tconstruct/weaponry/client/renderer/FlexibleToolRenderer.java index dea43d0aa7b..68f839229b7 100644 --- a/src/main/java/tconstruct/weaponry/client/renderer/FlexibleToolRenderer.java +++ b/src/main/java/tconstruct/weaponry/client/renderer/FlexibleToolRenderer.java @@ -1,4 +1,4 @@ -package boni.tinkersweaponry.client.renderer; +package tconstruct.weaponry.client.renderer; import net.minecraft.client.renderer.Tessellator; import net.minecraft.entity.Entity; diff --git a/src/main/java/tconstruct/weaponry/client/renderer/JavelinRenderer.java b/src/main/java/tconstruct/weaponry/client/renderer/JavelinRenderer.java index 966262d049c..2f10315d1db 100644 --- a/src/main/java/tconstruct/weaponry/client/renderer/JavelinRenderer.java +++ b/src/main/java/tconstruct/weaponry/client/renderer/JavelinRenderer.java @@ -1,6 +1,6 @@ -package boni.tinkersweaponry.client.renderer; +package tconstruct.weaponry.client.renderer; -import boni.tinkersweaponry.library.weaponry.IWindup; +import tconstruct.weaponry.library.weaponry.IWindup; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; import org.lwjgl.opengl.GL11; diff --git a/src/main/java/tconstruct/weaponry/client/renderer/ThrowingKnifeRenderer.java b/src/main/java/tconstruct/weaponry/client/renderer/ThrowingKnifeRenderer.java index feb40f6dfb5..f8583b1d92d 100644 --- a/src/main/java/tconstruct/weaponry/client/renderer/ThrowingKnifeRenderer.java +++ b/src/main/java/tconstruct/weaponry/client/renderer/ThrowingKnifeRenderer.java @@ -1,6 +1,6 @@ -package boni.tinkersweaponry.client.renderer; +package tconstruct.weaponry.client.renderer; -import boni.tinkersweaponry.library.weaponry.IWindup; +import tconstruct.weaponry.library.weaponry.IWindup; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.entity.RenderPlayer; diff --git a/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java b/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java index 477d042ec62..562e35fb28d 100644 --- a/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java +++ b/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java @@ -1,6 +1,6 @@ -package boni.tinkersweaponry.entity; +package tconstruct.weaponry.entity; -import boni.tinkersweaponry.library.util.PiercingArrowDamage; +import tconstruct.weaponry.library.util.PiercingArrowDamage; import cpw.mods.fml.common.network.ByteBufUtils; import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; diff --git a/src/main/java/tconstruct/weaponry/entity/BoltEntity.java b/src/main/java/tconstruct/weaponry/entity/BoltEntity.java index 1e4759ce763..82dccd44dc3 100644 --- a/src/main/java/tconstruct/weaponry/entity/BoltEntity.java +++ b/src/main/java/tconstruct/weaponry/entity/BoltEntity.java @@ -1,4 +1,4 @@ -package boni.tinkersweaponry.entity; +package tconstruct.weaponry.entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/tconstruct/weaponry/entity/JavelinEntity.java b/src/main/java/tconstruct/weaponry/entity/JavelinEntity.java index 3badab8cf4b..3a3547e21fe 100644 --- a/src/main/java/tconstruct/weaponry/entity/JavelinEntity.java +++ b/src/main/java/tconstruct/weaponry/entity/JavelinEntity.java @@ -1,6 +1,6 @@ -package boni.tinkersweaponry.entity; +package tconstruct.weaponry.entity; -import boni.tinkersweaponry.TinkerWeaponry; +import tconstruct.weaponry.TinkerWeaponry; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/tconstruct/weaponry/entity/ProjectileBase.java b/src/main/java/tconstruct/weaponry/entity/ProjectileBase.java index 0adb84e8cf0..51e2ae8afd8 100644 --- a/src/main/java/tconstruct/weaponry/entity/ProjectileBase.java +++ b/src/main/java/tconstruct/weaponry/entity/ProjectileBase.java @@ -1,7 +1,7 @@ -package boni.tinkersweaponry.entity; +package tconstruct.weaponry.entity; -import boni.tinkersweaponry.library.weaponry.AmmoItem; -import boni.tinkersweaponry.util.Reference; +import tconstruct.weaponry.library.weaponry.AmmoItem; +import tconstruct.weaponry.util.Reference; import cpw.mods.fml.common.network.ByteBufUtils; import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; import io.netty.buffer.ByteBuf; diff --git a/src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java b/src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java index 46af84cbe53..02f3f5d96cc 100644 --- a/src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java +++ b/src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java @@ -1,6 +1,6 @@ -package boni.tinkersweaponry.entity; +package tconstruct.weaponry.entity; -import boni.tinkersweaponry.TinkerWeaponry; +import tconstruct.weaponry.TinkerWeaponry; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/tconstruct/weaponry/entity/ThrowingKnifeEntity.java b/src/main/java/tconstruct/weaponry/entity/ThrowingKnifeEntity.java index 70cd9523b12..3226f6b71b3 100644 --- a/src/main/java/tconstruct/weaponry/entity/ThrowingKnifeEntity.java +++ b/src/main/java/tconstruct/weaponry/entity/ThrowingKnifeEntity.java @@ -1,6 +1,6 @@ -package boni.tinkersweaponry.entity; +package tconstruct.weaponry.entity; -import boni.tinkersweaponry.TinkerWeaponry; +import tconstruct.weaponry.TinkerWeaponry; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; diff --git a/src/main/java/tconstruct/weaponry/items/CustomToolPart.java b/src/main/java/tconstruct/weaponry/items/CustomToolPart.java index 12d906eb5f8..7a01cbb6663 100644 --- a/src/main/java/tconstruct/weaponry/items/CustomToolPart.java +++ b/src/main/java/tconstruct/weaponry/items/CustomToolPart.java @@ -1,4 +1,4 @@ -package boni.tinkersweaponry.items; +package tconstruct.weaponry.items; import net.minecraft.item.ItemStack; import tconstruct.TConstruct; diff --git a/src/main/java/tconstruct/weaponry/items/DualMaterialToolPart.java b/src/main/java/tconstruct/weaponry/items/DualMaterialToolPart.java index e6fea053ea5..d80efa72995 100644 --- a/src/main/java/tconstruct/weaponry/items/DualMaterialToolPart.java +++ b/src/main/java/tconstruct/weaponry/items/DualMaterialToolPart.java @@ -1,7 +1,7 @@ -package boni.tinkersweaponry.items; +package tconstruct.weaponry.items; -import boni.tinkersweaponry.TinkerWeaponry; -import boni.tinkersweaponry.util.Reference; +import tconstruct.weaponry.TinkerWeaponry; +import tconstruct.weaponry.util.Reference; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.renderer.texture.IIconRegister; diff --git a/src/main/java/tconstruct/weaponry/items/WeaponryPattern.java b/src/main/java/tconstruct/weaponry/items/WeaponryPattern.java index 465c87a04db..c72e77e8aad 100644 --- a/src/main/java/tconstruct/weaponry/items/WeaponryPattern.java +++ b/src/main/java/tconstruct/weaponry/items/WeaponryPattern.java @@ -1,6 +1,6 @@ -package boni.tinkersweaponry.items; +package tconstruct.weaponry.items; -import boni.tinkersweaponry.util.Reference; +import tconstruct.weaponry.util.Reference; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; diff --git a/src/main/java/tconstruct/weaponry/items/WeaponryToolPart.java b/src/main/java/tconstruct/weaponry/items/WeaponryToolPart.java index b8ef74ea52f..c5c100aeab5 100644 --- a/src/main/java/tconstruct/weaponry/items/WeaponryToolPart.java +++ b/src/main/java/tconstruct/weaponry/items/WeaponryToolPart.java @@ -1,7 +1,7 @@ -package boni.tinkersweaponry.items; +package tconstruct.weaponry.items; -import boni.tinkersweaponry.TinkerWeaponry; -import boni.tinkersweaponry.util.Reference; +import tconstruct.weaponry.TinkerWeaponry; +import tconstruct.weaponry.util.Reference; import tconstruct.library.tools.DynamicToolPart; public class WeaponryToolPart extends DynamicToolPart { diff --git a/src/main/java/tconstruct/weaponry/library/util/PiercingArrowDamage.java b/src/main/java/tconstruct/weaponry/library/util/PiercingArrowDamage.java index bf27a794fd2..e68c919e057 100644 --- a/src/main/java/tconstruct/weaponry/library/util/PiercingArrowDamage.java +++ b/src/main/java/tconstruct/weaponry/library/util/PiercingArrowDamage.java @@ -1,4 +1,4 @@ -package boni.tinkersweaponry.library.util; +package tconstruct.weaponry.library.util; import net.minecraft.entity.Entity; import net.minecraft.util.EntityDamageSourceIndirect; diff --git a/src/main/java/tconstruct/weaponry/library/weaponry/AmmoItem.java b/src/main/java/tconstruct/weaponry/library/weaponry/AmmoItem.java index 5ee30d58916..555d4b351f0 100644 --- a/src/main/java/tconstruct/weaponry/library/weaponry/AmmoItem.java +++ b/src/main/java/tconstruct/weaponry/library/weaponry/AmmoItem.java @@ -1,7 +1,7 @@ -package boni.tinkersweaponry.library.weaponry; +package tconstruct.weaponry.library.weaponry; -import boni.tinkersweaponry.TinkerWeaponry; -import boni.tinkersweaponry.util.Reference; +import tconstruct.weaponry.TinkerWeaponry; +import tconstruct.weaponry.util.Reference; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/tconstruct/weaponry/library/weaponry/AmmoWeapon.java b/src/main/java/tconstruct/weaponry/library/weaponry/AmmoWeapon.java index 1eb4dc57c50..9bfadf08ec5 100644 --- a/src/main/java/tconstruct/weaponry/library/weaponry/AmmoWeapon.java +++ b/src/main/java/tconstruct/weaponry/library/weaponry/AmmoWeapon.java @@ -1,6 +1,6 @@ -package boni.tinkersweaponry.library.weaponry; +package tconstruct.weaponry.library.weaponry; -import boni.tinkersweaponry.client.CrosshairType; +import tconstruct.weaponry.client.CrosshairType; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.Entity; diff --git a/src/main/java/tconstruct/weaponry/library/weaponry/ArrowShaftMaterial.java b/src/main/java/tconstruct/weaponry/library/weaponry/ArrowShaftMaterial.java index fdd888b3f77..23745dd08cf 100644 --- a/src/main/java/tconstruct/weaponry/library/weaponry/ArrowShaftMaterial.java +++ b/src/main/java/tconstruct/weaponry/library/weaponry/ArrowShaftMaterial.java @@ -1,6 +1,6 @@ -package boni.tinkersweaponry.library.weaponry; +package tconstruct.weaponry.library.weaponry; -import boni.tinkersweaponry.TinkerWeaponry; +import tconstruct.weaponry.TinkerWeaponry; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import tconstruct.library.tools.CustomMaterial; diff --git a/src/main/java/tconstruct/weaponry/library/weaponry/BowBaseAmmo.java b/src/main/java/tconstruct/weaponry/library/weaponry/BowBaseAmmo.java index 25aae575722..af99fcfd0c1 100644 --- a/src/main/java/tconstruct/weaponry/library/weaponry/BowBaseAmmo.java +++ b/src/main/java/tconstruct/weaponry/library/weaponry/BowBaseAmmo.java @@ -1,7 +1,7 @@ -package boni.tinkersweaponry.library.weaponry; +package tconstruct.weaponry.library.weaponry; -import boni.tinkersweaponry.ammo.ArrowAmmo; -import boni.tinkersweaponry.entity.ArrowEntity; +import tconstruct.weaponry.ammo.ArrowAmmo; +import tconstruct.weaponry.entity.ArrowEntity; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; diff --git a/src/main/java/tconstruct/weaponry/library/weaponry/IAccuracy.java b/src/main/java/tconstruct/weaponry/library/weaponry/IAccuracy.java index 30ab05ba834..ee93370bb64 100644 --- a/src/main/java/tconstruct/weaponry/library/weaponry/IAccuracy.java +++ b/src/main/java/tconstruct/weaponry/library/weaponry/IAccuracy.java @@ -1,4 +1,4 @@ -package boni.tinkersweaponry.library.weaponry; +package tconstruct.weaponry.library.weaponry; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/tconstruct/weaponry/library/weaponry/IAmmo.java b/src/main/java/tconstruct/weaponry/library/weaponry/IAmmo.java index ae06eba96e4..441b2bf96cb 100644 --- a/src/main/java/tconstruct/weaponry/library/weaponry/IAmmo.java +++ b/src/main/java/tconstruct/weaponry/library/weaponry/IAmmo.java @@ -1,4 +1,4 @@ -package boni.tinkersweaponry.library.weaponry; +package tconstruct.weaponry.library.weaponry; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/tconstruct/weaponry/library/weaponry/IWindup.java b/src/main/java/tconstruct/weaponry/library/weaponry/IWindup.java index 4b72714a571..417a253ece4 100644 --- a/src/main/java/tconstruct/weaponry/library/weaponry/IWindup.java +++ b/src/main/java/tconstruct/weaponry/library/weaponry/IWindup.java @@ -1,6 +1,6 @@ -package boni.tinkersweaponry.library.weaponry; +package tconstruct.weaponry.library.weaponry; -import boni.tinkersweaponry.client.CrosshairType; +import tconstruct.weaponry.client.CrosshairType; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/tconstruct/weaponry/library/weaponry/ProjectileWeapon.java b/src/main/java/tconstruct/weaponry/library/weaponry/ProjectileWeapon.java index ec4fc2c0331..478c2c8cb49 100644 --- a/src/main/java/tconstruct/weaponry/library/weaponry/ProjectileWeapon.java +++ b/src/main/java/tconstruct/weaponry/library/weaponry/ProjectileWeapon.java @@ -1,8 +1,8 @@ -package boni.tinkersweaponry.library.weaponry; +package tconstruct.weaponry.library.weaponry; -import boni.tinkersweaponry.TinkerWeaponry; -import boni.tinkersweaponry.client.CrosshairType; -import boni.tinkersweaponry.util.Reference; +import tconstruct.weaponry.TinkerWeaponry; +import tconstruct.weaponry.client.CrosshairType; +import tconstruct.weaponry.util.Reference; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.renderer.texture.IIconRegister; diff --git a/src/main/java/tconstruct/weaponry/util/Config.java b/src/main/java/tconstruct/weaponry/util/Config.java index 053634fb231..c01a3430003 100644 --- a/src/main/java/tconstruct/weaponry/util/Config.java +++ b/src/main/java/tconstruct/weaponry/util/Config.java @@ -1,4 +1,4 @@ -package boni.tinkersweaponry.util; +package tconstruct.weaponry.util; public class Config { } diff --git a/src/main/java/tconstruct/weaponry/util/Reference.java b/src/main/java/tconstruct/weaponry/util/Reference.java index f69f03cbe60..731ce9ec67e 100644 --- a/src/main/java/tconstruct/weaponry/util/Reference.java +++ b/src/main/java/tconstruct/weaponry/util/Reference.java @@ -1,4 +1,4 @@ -package boni.tinkersweaponry.util; +package tconstruct.weaponry.util; public final class Reference { private Reference() {} diff --git a/src/main/java/tconstruct/weaponry/weapons/Crossbow.java b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java index 24bd92d1395..398b1c3bbb5 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Crossbow.java +++ b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java @@ -1,12 +1,12 @@ -package boni.tinkersweaponry.weapons; - -import boni.tinkersweaponry.TinkerWeaponry; -import boni.tinkersweaponry.ammo.BoltAmmo; -import boni.tinkersweaponry.entity.BoltEntity; -import boni.tinkersweaponry.library.weaponry.AmmoItem; -import boni.tinkersweaponry.library.weaponry.ProjectileWeapon; -import boni.tinkersweaponry.util.Reference; -import boni.tinkersweaponry.library.weaponry.IAmmo; +package tconstruct.weaponry.weapons; + +import tconstruct.weaponry.TinkerWeaponry; +import tconstruct.weaponry.ammo.BoltAmmo; +import tconstruct.weaponry.entity.BoltEntity; +import tconstruct.weaponry.library.weaponry.AmmoItem; +import tconstruct.weaponry.library.weaponry.ProjectileWeapon; +import tconstruct.weaponry.util.Reference; +import tconstruct.weaponry.library.weaponry.IAmmo; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityArrow; diff --git a/src/main/java/tconstruct/weaponry/weapons/Javelin.java b/src/main/java/tconstruct/weaponry/weapons/Javelin.java index 49bc11ede4c..f30c028a591 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Javelin.java +++ b/src/main/java/tconstruct/weaponry/weapons/Javelin.java @@ -1,7 +1,7 @@ -package boni.tinkersweaponry.weapons; +package tconstruct.weaponry.weapons; -import boni.tinkersweaponry.entity.JavelinEntity; -import boni.tinkersweaponry.library.weaponry.AmmoWeapon; +import tconstruct.weaponry.entity.JavelinEntity; +import tconstruct.weaponry.library.weaponry.AmmoWeapon; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; diff --git a/src/main/java/tconstruct/weaponry/weapons/LongBow.java b/src/main/java/tconstruct/weaponry/weapons/LongBow.java index d3302d90d05..9ffbd7a8937 100644 --- a/src/main/java/tconstruct/weaponry/weapons/LongBow.java +++ b/src/main/java/tconstruct/weaponry/weapons/LongBow.java @@ -1,8 +1,8 @@ -package boni.tinkersweaponry.weapons; +package tconstruct.weaponry.weapons; -import boni.tinkersweaponry.TinkerWeaponry; -import boni.tinkersweaponry.ammo.ArrowAmmo; -import boni.tinkersweaponry.library.weaponry.BowBaseAmmo; +import tconstruct.weaponry.TinkerWeaponry; +import tconstruct.weaponry.ammo.ArrowAmmo; +import tconstruct.weaponry.library.weaponry.BowBaseAmmo; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; diff --git a/src/main/java/tconstruct/weaponry/weapons/ShortBow.java b/src/main/java/tconstruct/weaponry/weapons/ShortBow.java index 82e33676350..a96182a9c7c 100644 --- a/src/main/java/tconstruct/weaponry/weapons/ShortBow.java +++ b/src/main/java/tconstruct/weaponry/weapons/ShortBow.java @@ -1,8 +1,8 @@ -package boni.tinkersweaponry.weapons; +package tconstruct.weaponry.weapons; -import boni.tinkersweaponry.TinkerWeaponry; -import boni.tinkersweaponry.ammo.ArrowAmmo; -import boni.tinkersweaponry.library.weaponry.BowBaseAmmo; +import tconstruct.weaponry.TinkerWeaponry; +import tconstruct.weaponry.ammo.ArrowAmmo; +import tconstruct.weaponry.library.weaponry.BowBaseAmmo; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; diff --git a/src/main/java/tconstruct/weaponry/weapons/Shuriken.java b/src/main/java/tconstruct/weaponry/weapons/Shuriken.java index 6384c0e2369..468105184df 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Shuriken.java +++ b/src/main/java/tconstruct/weaponry/weapons/Shuriken.java @@ -1,10 +1,10 @@ -package boni.tinkersweaponry.weapons; +package tconstruct.weaponry.weapons; -import boni.tinkersweaponry.TinkerWeaponry; -import boni.tinkersweaponry.client.CrosshairType; -import boni.tinkersweaponry.client.IconFlipped; -import boni.tinkersweaponry.entity.ShurikenEntity; -import boni.tinkersweaponry.library.weaponry.AmmoWeapon; +import tconstruct.weaponry.TinkerWeaponry; +import tconstruct.weaponry.client.CrosshairType; +import tconstruct.weaponry.client.IconFlipped; +import tconstruct.weaponry.entity.ShurikenEntity; +import tconstruct.weaponry.library.weaponry.AmmoWeapon; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.renderer.texture.IIconRegister; diff --git a/src/main/java/tconstruct/weaponry/weapons/ThrowArrow.java b/src/main/java/tconstruct/weaponry/weapons/ThrowArrow.java index 980142c9418..3e225d08951 100644 --- a/src/main/java/tconstruct/weaponry/weapons/ThrowArrow.java +++ b/src/main/java/tconstruct/weaponry/weapons/ThrowArrow.java @@ -1,7 +1,7 @@ -package boni.tinkersweaponry.weapons; +package tconstruct.weaponry.weapons; -import boni.tinkersweaponry.entity.ArrowEntity; -import boni.tinkersweaponry.library.weaponry.AmmoWeapon; +import tconstruct.weaponry.entity.ArrowEntity; +import tconstruct.weaponry.library.weaponry.AmmoWeapon; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; diff --git a/src/main/java/tconstruct/weaponry/weapons/ThrowArrowItem.java b/src/main/java/tconstruct/weaponry/weapons/ThrowArrowItem.java index 7793a0591a4..1384f15de14 100644 --- a/src/main/java/tconstruct/weaponry/weapons/ThrowArrowItem.java +++ b/src/main/java/tconstruct/weaponry/weapons/ThrowArrowItem.java @@ -1,7 +1,7 @@ -package boni.tinkersweaponry.weapons; +package tconstruct.weaponry.weapons; -import boni.tinkersweaponry.entity.ArrowEntity; -import boni.tinkersweaponry.util.Reference; +import tconstruct.weaponry.entity.ArrowEntity; +import tconstruct.weaponry.util.Reference; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityArrow; diff --git a/src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java b/src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java index c21b9571f82..7bfde93ad66 100644 --- a/src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java +++ b/src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java @@ -1,8 +1,8 @@ -package boni.tinkersweaponry.weapons; +package tconstruct.weaponry.weapons; -import boni.tinkersweaponry.client.CrosshairType; -import boni.tinkersweaponry.entity.ThrowingKnifeEntity; -import boni.tinkersweaponry.library.weaponry.AmmoWeapon; +import tconstruct.weaponry.client.CrosshairType; +import tconstruct.weaponry.entity.ThrowingKnifeEntity; +import tconstruct.weaponry.library.weaponry.AmmoWeapon; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.Entity; From 0bdf31912b46f76ae671a145981be2673f4e98a0 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 5 Oct 2014 20:46:12 +0200 Subject: [PATCH 003/129] Lots of integration. Graphics n stuff. Items. Everything. --- .../renderer => client}/AmmoItemRenderer.java | 4 +- .../FlexibleToolRenderer.java | 2 +- .../{weaponry => }/client/IconFlipped.java | 2 +- .../library/TConstructRegistry.java | 1 + .../entity/ProjectileBase.java | 6 +- .../tools}/DualMaterialToolPart.java | 6 +- .../library/util/PiercingArrowDamage.java | 2 +- .../library/weaponry/AmmoItem.java | 13 +- .../library/weaponry/AmmoWeapon.java | 2 +- .../library/weaponry/ArrowShaftMaterial.java | 2 +- .../library/weaponry/BowBaseAmmo.java | 2 +- .../library/weaponry/IAccuracy.java | 2 +- .../library/weaponry/IAmmo.java | 2 +- .../library/weaponry/IWindup.java | 2 +- .../library/weaponry/ProjectileWeapon.java | 14 +- .../{weaponry => }/util/Reference.java | 11 +- .../tconstruct/weaponry/TinkerWeaponry.java | 51 ++++--- .../weaponry/WeaponryClientProxy.java | 15 +- .../tconstruct/weaponry/WeaponryHandler.java | 10 +- .../tconstruct/weaponry/ammo/ArrowAmmo.java | 9 +- .../tconstruct/weaponry/ammo/BoltAmmo.java | 4 +- .../weaponry/client/AmmoSlotHandler.java | 2 +- .../weaponry/client/CrosshairHandler.java | 4 +- .../weaponry/client/RenderEventHandler.java | 4 +- .../ArrowEntityRenderer.java | 2 +- .../JavelinEntityRenderer.java | 2 +- .../ProjectileBaseRenderer.java | 6 +- .../ShurikenEntityRenderer.java | 2 +- .../{renderer => item}/BowRenderer.java | 7 +- .../{renderer => item}/CrossbowRenderer.java | 3 +- .../{renderer => item}/JavelinRenderer.java | 5 +- .../ThrowingKnifeRenderer.java | 5 +- .../weaponry/entity/ArrowEntity.java | 7 +- .../weaponry/entity/JavelinEntity.java | 1 + .../weaponry/entity/ShurikenEntity.java | 1 + .../weaponry/entity/ThrowingKnifeEntity.java | 1 + .../weaponry/items/CustomToolPart.java | 26 ---- .../weaponry/items/WeaponryPattern.java | 5 +- .../weaponry/items/WeaponryToolPart.java | 14 -- .../java/tconstruct/weaponry/util/Config.java | 4 - .../tconstruct/weaponry/weapons/Crossbow.java | 8 +- .../tconstruct/weaponry/weapons/Javelin.java | 2 +- .../tconstruct/weaponry/weapons/LongBow.java | 2 +- .../tconstruct/weaponry/weapons/ShortBow.java | 2 +- .../tconstruct/weaponry/weapons/Shuriken.java | 4 +- .../weaponry/weapons/ThrowArrow.java | 92 ------------- .../weaponry/weapons/ThrowArrowItem.java | 128 ------------------ .../weaponry/weapons/ThrowingKnife.java | 2 +- 48 files changed, 119 insertions(+), 384 deletions(-) rename src/main/java/tconstruct/{weaponry/client/renderer => client}/AmmoItemRenderer.java (95%) rename src/main/java/tconstruct/{weaponry/client/renderer => client}/FlexibleToolRenderer.java (99%) rename src/main/java/tconstruct/{weaponry => }/client/IconFlipped.java (94%) rename src/main/java/tconstruct/{weaponry => library}/entity/ProjectileBase.java (99%) rename src/main/java/tconstruct/{weaponry/items => library/tools}/DualMaterialToolPart.java (95%) rename src/main/java/tconstruct/{weaponry => }/library/util/PiercingArrowDamage.java (90%) rename src/main/java/tconstruct/{weaponry => }/library/weaponry/AmmoItem.java (92%) rename src/main/java/tconstruct/{weaponry => }/library/weaponry/AmmoWeapon.java (99%) rename src/main/java/tconstruct/{weaponry => }/library/weaponry/ArrowShaftMaterial.java (96%) rename src/main/java/tconstruct/{weaponry => }/library/weaponry/BowBaseAmmo.java (99%) rename src/main/java/tconstruct/{weaponry => }/library/weaponry/IAccuracy.java (86%) rename src/main/java/tconstruct/{weaponry => }/library/weaponry/IAmmo.java (96%) rename src/main/java/tconstruct/{weaponry => }/library/weaponry/IWindup.java (94%) rename src/main/java/tconstruct/{weaponry => }/library/weaponry/ProjectileWeapon.java (97%) rename src/main/java/tconstruct/{weaponry => }/util/Reference.java (55%) rename src/main/java/tconstruct/weaponry/client/{entityrenderer => entity}/ArrowEntityRenderer.java (96%) rename src/main/java/tconstruct/weaponry/client/{entityrenderer => entity}/JavelinEntityRenderer.java (94%) rename src/main/java/tconstruct/weaponry/client/{entityrenderer => entity}/ProjectileBaseRenderer.java (95%) rename src/main/java/tconstruct/weaponry/client/{entityrenderer => entity}/ShurikenEntityRenderer.java (94%) rename src/main/java/tconstruct/weaponry/client/{renderer => item}/BowRenderer.java (96%) rename src/main/java/tconstruct/weaponry/client/{renderer => item}/CrossbowRenderer.java (96%) rename src/main/java/tconstruct/weaponry/client/{renderer => item}/JavelinRenderer.java (84%) rename src/main/java/tconstruct/weaponry/client/{renderer => item}/ThrowingKnifeRenderer.java (95%) delete mode 100644 src/main/java/tconstruct/weaponry/items/CustomToolPart.java delete mode 100644 src/main/java/tconstruct/weaponry/items/WeaponryToolPart.java delete mode 100644 src/main/java/tconstruct/weaponry/util/Config.java delete mode 100644 src/main/java/tconstruct/weaponry/weapons/ThrowArrow.java delete mode 100644 src/main/java/tconstruct/weaponry/weapons/ThrowArrowItem.java diff --git a/src/main/java/tconstruct/weaponry/client/renderer/AmmoItemRenderer.java b/src/main/java/tconstruct/client/AmmoItemRenderer.java similarity index 95% rename from src/main/java/tconstruct/weaponry/client/renderer/AmmoItemRenderer.java rename to src/main/java/tconstruct/client/AmmoItemRenderer.java index e40ab1f4e82..13d048c6733 100644 --- a/src/main/java/tconstruct/weaponry/client/renderer/AmmoItemRenderer.java +++ b/src/main/java/tconstruct/client/AmmoItemRenderer.java @@ -1,6 +1,6 @@ -package tconstruct.weaponry.client.renderer; +package tconstruct.client; -import tconstruct.weaponry.library.weaponry.IAmmo; +import tconstruct.library.weaponry.IAmmo; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/tconstruct/weaponry/client/renderer/FlexibleToolRenderer.java b/src/main/java/tconstruct/client/FlexibleToolRenderer.java similarity index 99% rename from src/main/java/tconstruct/weaponry/client/renderer/FlexibleToolRenderer.java rename to src/main/java/tconstruct/client/FlexibleToolRenderer.java index 68f839229b7..9b0a737fb60 100644 --- a/src/main/java/tconstruct/weaponry/client/renderer/FlexibleToolRenderer.java +++ b/src/main/java/tconstruct/client/FlexibleToolRenderer.java @@ -1,4 +1,4 @@ -package tconstruct.weaponry.client.renderer; +package tconstruct.client; import net.minecraft.client.renderer.Tessellator; import net.minecraft.entity.Entity; diff --git a/src/main/java/tconstruct/weaponry/client/IconFlipped.java b/src/main/java/tconstruct/client/IconFlipped.java similarity index 94% rename from src/main/java/tconstruct/weaponry/client/IconFlipped.java rename to src/main/java/tconstruct/client/IconFlipped.java index 230c786dbfb..64e14e08a43 100644 --- a/src/main/java/tconstruct/weaponry/client/IconFlipped.java +++ b/src/main/java/tconstruct/client/IconFlipped.java @@ -1,4 +1,4 @@ -package tconstruct.weaponry.client; +package tconstruct.client; import net.minecraft.util.IIcon; diff --git a/src/main/java/tconstruct/library/TConstructRegistry.java b/src/main/java/tconstruct/library/TConstructRegistry.java index 554b032b36e..df402c1c38b 100644 --- a/src/main/java/tconstruct/library/TConstructRegistry.java +++ b/src/main/java/tconstruct/library/TConstructRegistry.java @@ -26,6 +26,7 @@ public class TConstructRegistry public static TConstructCreativeTab materialTab; public static TConstructCreativeTab blockTab; public static TConstructCreativeTab equipableTab; + public static TConstructCreativeTab weaponryTab; /* Items */ diff --git a/src/main/java/tconstruct/weaponry/entity/ProjectileBase.java b/src/main/java/tconstruct/library/entity/ProjectileBase.java similarity index 99% rename from src/main/java/tconstruct/weaponry/entity/ProjectileBase.java rename to src/main/java/tconstruct/library/entity/ProjectileBase.java index 51e2ae8afd8..2f6e6aea684 100644 --- a/src/main/java/tconstruct/weaponry/entity/ProjectileBase.java +++ b/src/main/java/tconstruct/library/entity/ProjectileBase.java @@ -1,7 +1,7 @@ -package tconstruct.weaponry.entity; +package tconstruct.library.entity; -import tconstruct.weaponry.library.weaponry.AmmoItem; -import tconstruct.weaponry.util.Reference; +import tconstruct.library.weaponry.AmmoItem; +import tconstruct.util.Reference; import cpw.mods.fml.common.network.ByteBufUtils; import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; import io.netty.buffer.ByteBuf; diff --git a/src/main/java/tconstruct/weaponry/items/DualMaterialToolPart.java b/src/main/java/tconstruct/library/tools/DualMaterialToolPart.java similarity index 95% rename from src/main/java/tconstruct/weaponry/items/DualMaterialToolPart.java rename to src/main/java/tconstruct/library/tools/DualMaterialToolPart.java index d80efa72995..995a246a23c 100644 --- a/src/main/java/tconstruct/weaponry/items/DualMaterialToolPart.java +++ b/src/main/java/tconstruct/library/tools/DualMaterialToolPart.java @@ -1,7 +1,5 @@ -package tconstruct.weaponry.items; +package tconstruct.library.tools; -import tconstruct.weaponry.TinkerWeaponry; -import tconstruct.weaponry.util.Reference; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.renderer.texture.IIconRegister; @@ -19,7 +17,7 @@ import java.util.List; import java.util.Map; -public class DualMaterialToolPart extends WeaponryToolPart { +public class DualMaterialToolPart extends DynamicToolPart { public IIcon defaultIcon2; public IIcon[] icons2; diff --git a/src/main/java/tconstruct/weaponry/library/util/PiercingArrowDamage.java b/src/main/java/tconstruct/library/util/PiercingArrowDamage.java similarity index 90% rename from src/main/java/tconstruct/weaponry/library/util/PiercingArrowDamage.java rename to src/main/java/tconstruct/library/util/PiercingArrowDamage.java index e68c919e057..0ed991081b9 100644 --- a/src/main/java/tconstruct/weaponry/library/util/PiercingArrowDamage.java +++ b/src/main/java/tconstruct/library/util/PiercingArrowDamage.java @@ -1,4 +1,4 @@ -package tconstruct.weaponry.library.util; +package tconstruct.library.util; import net.minecraft.entity.Entity; import net.minecraft.util.EntityDamageSourceIndirect; diff --git a/src/main/java/tconstruct/weaponry/library/weaponry/AmmoItem.java b/src/main/java/tconstruct/library/weaponry/AmmoItem.java similarity index 92% rename from src/main/java/tconstruct/weaponry/library/weaponry/AmmoItem.java rename to src/main/java/tconstruct/library/weaponry/AmmoItem.java index 555d4b351f0..1ba901021ae 100644 --- a/src/main/java/tconstruct/weaponry/library/weaponry/AmmoItem.java +++ b/src/main/java/tconstruct/library/weaponry/AmmoItem.java @@ -1,7 +1,8 @@ -package tconstruct.weaponry.library.weaponry; +package tconstruct.library.weaponry; +import tconstruct.library.TConstructRegistry; import tconstruct.weaponry.TinkerWeaponry; -import tconstruct.weaponry.util.Reference; +import tconstruct.util.Reference; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -11,8 +12,7 @@ public abstract class AmmoItem extends ToolCore implements IAmmo { public AmmoItem(int baseDamage, String name) { super(baseDamage); - this.setUnlocalizedName(Reference.prefix(name)); - this.setCreativeTab(TinkerWeaponry.creativeTab); + this.setCreativeTab(TConstructRegistry.weaponryTab); } @Override @@ -110,9 +110,4 @@ public boolean onLeftClickEntity (ItemStack stack, EntityPlayer player, Entity e // ammo doesn't hurt on smacking stuff with it return false; } - - @Override - public String getDefaultTexturePath() { - return Reference.RESOURCE + ":" + getDefaultFolder(); - } } diff --git a/src/main/java/tconstruct/weaponry/library/weaponry/AmmoWeapon.java b/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java similarity index 99% rename from src/main/java/tconstruct/weaponry/library/weaponry/AmmoWeapon.java rename to src/main/java/tconstruct/library/weaponry/AmmoWeapon.java index 9bfadf08ec5..24eb1e65f87 100644 --- a/src/main/java/tconstruct/weaponry/library/weaponry/AmmoWeapon.java +++ b/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java @@ -1,4 +1,4 @@ -package tconstruct.weaponry.library.weaponry; +package tconstruct.library.weaponry; import tconstruct.weaponry.client.CrosshairType; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/tconstruct/weaponry/library/weaponry/ArrowShaftMaterial.java b/src/main/java/tconstruct/library/weaponry/ArrowShaftMaterial.java similarity index 96% rename from src/main/java/tconstruct/weaponry/library/weaponry/ArrowShaftMaterial.java rename to src/main/java/tconstruct/library/weaponry/ArrowShaftMaterial.java index 23745dd08cf..b83da4a9b98 100644 --- a/src/main/java/tconstruct/weaponry/library/weaponry/ArrowShaftMaterial.java +++ b/src/main/java/tconstruct/library/weaponry/ArrowShaftMaterial.java @@ -1,4 +1,4 @@ -package tconstruct.weaponry.library.weaponry; +package tconstruct.library.weaponry; import tconstruct.weaponry.TinkerWeaponry; import net.minecraft.item.Item; diff --git a/src/main/java/tconstruct/weaponry/library/weaponry/BowBaseAmmo.java b/src/main/java/tconstruct/library/weaponry/BowBaseAmmo.java similarity index 99% rename from src/main/java/tconstruct/weaponry/library/weaponry/BowBaseAmmo.java rename to src/main/java/tconstruct/library/weaponry/BowBaseAmmo.java index af99fcfd0c1..7d286b59fb4 100644 --- a/src/main/java/tconstruct/weaponry/library/weaponry/BowBaseAmmo.java +++ b/src/main/java/tconstruct/library/weaponry/BowBaseAmmo.java @@ -1,4 +1,4 @@ -package tconstruct.weaponry.library.weaponry; +package tconstruct.library.weaponry; import tconstruct.weaponry.ammo.ArrowAmmo; import tconstruct.weaponry.entity.ArrowEntity; diff --git a/src/main/java/tconstruct/weaponry/library/weaponry/IAccuracy.java b/src/main/java/tconstruct/library/weaponry/IAccuracy.java similarity index 86% rename from src/main/java/tconstruct/weaponry/library/weaponry/IAccuracy.java rename to src/main/java/tconstruct/library/weaponry/IAccuracy.java index ee93370bb64..07bae711586 100644 --- a/src/main/java/tconstruct/weaponry/library/weaponry/IAccuracy.java +++ b/src/main/java/tconstruct/library/weaponry/IAccuracy.java @@ -1,4 +1,4 @@ -package tconstruct.weaponry.library.weaponry; +package tconstruct.library.weaponry; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/tconstruct/weaponry/library/weaponry/IAmmo.java b/src/main/java/tconstruct/library/weaponry/IAmmo.java similarity index 96% rename from src/main/java/tconstruct/weaponry/library/weaponry/IAmmo.java rename to src/main/java/tconstruct/library/weaponry/IAmmo.java index 441b2bf96cb..5ed123e8b5b 100644 --- a/src/main/java/tconstruct/weaponry/library/weaponry/IAmmo.java +++ b/src/main/java/tconstruct/library/weaponry/IAmmo.java @@ -1,4 +1,4 @@ -package tconstruct.weaponry.library.weaponry; +package tconstruct.library.weaponry; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/tconstruct/weaponry/library/weaponry/IWindup.java b/src/main/java/tconstruct/library/weaponry/IWindup.java similarity index 94% rename from src/main/java/tconstruct/weaponry/library/weaponry/IWindup.java rename to src/main/java/tconstruct/library/weaponry/IWindup.java index 417a253ece4..31a6ae23ab3 100644 --- a/src/main/java/tconstruct/weaponry/library/weaponry/IWindup.java +++ b/src/main/java/tconstruct/library/weaponry/IWindup.java @@ -1,4 +1,4 @@ -package tconstruct.weaponry.library.weaponry; +package tconstruct.library.weaponry; import tconstruct.weaponry.client.CrosshairType; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/tconstruct/weaponry/library/weaponry/ProjectileWeapon.java b/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java similarity index 97% rename from src/main/java/tconstruct/weaponry/library/weaponry/ProjectileWeapon.java rename to src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java index 478c2c8cb49..22d0a831ff8 100644 --- a/src/main/java/tconstruct/weaponry/library/weaponry/ProjectileWeapon.java +++ b/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java @@ -1,8 +1,9 @@ -package tconstruct.weaponry.library.weaponry; +package tconstruct.library.weaponry; +import tconstruct.library.TConstructRegistry; import tconstruct.weaponry.TinkerWeaponry; import tconstruct.weaponry.client.CrosshairType; -import tconstruct.weaponry.util.Reference; +import tconstruct.util.Reference; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.renderer.texture.IIconRegister; @@ -29,8 +30,8 @@ public abstract class ProjectileWeapon extends ToolCore implements IAccuracy, IWindup { public ProjectileWeapon(int baseDamage, String name) { super(baseDamage); - this.setUnlocalizedName(Reference.prefix(name)); - this.setCreativeTab(TinkerWeaponry.creativeTab); + + this.setCreativeTab(TConstructRegistry.weaponryTab); } @SideOnly(Side.CLIENT) @@ -211,11 +212,6 @@ public void onPlayerStoppedUsing (ItemStack weapon, World world, EntityPlayer pl // todo: animated effects - @Override - public String getDefaultTexturePath() { - return Reference.RESOURCE + ":" + getDefaultFolder(); - } - /** * return true if the current renderpass should use animations. * 0 == handle diff --git a/src/main/java/tconstruct/weaponry/util/Reference.java b/src/main/java/tconstruct/util/Reference.java similarity index 55% rename from src/main/java/tconstruct/weaponry/util/Reference.java rename to src/main/java/tconstruct/util/Reference.java index 731ce9ec67e..769a6c9af03 100644 --- a/src/main/java/tconstruct/weaponry/util/Reference.java +++ b/src/main/java/tconstruct/util/Reference.java @@ -1,11 +1,12 @@ -package tconstruct.weaponry.util; +package tconstruct.util; + +import tconstruct.TConstruct; public final class Reference { private Reference() {} - public static final String MOD_ID = "tinkersweaponry"; - public static final String MOD_NAME = "Tinker's Weaponry"; - public static final String TCON_MOD_ID = "TConstruct"; + public static final String MOD_ID = TConstruct.modID; + public static final String MOD_NAME = "Tinkers' Construct"; public static final String RESOURCE = MOD_ID.toLowerCase(); @@ -13,5 +14,5 @@ public static String resource(String res) { return String.format("%s:%s", RESOURCE, res); } - public static String prefix(String name) { return String.format("tcon.weaponry.%s", name);} + public static String prefix(String name) { return String.format("tconstruct.%s", name);} } diff --git a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java index 35bd23921ef..2e9096f8ec4 100644 --- a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java +++ b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java @@ -1,7 +1,6 @@ package tconstruct.weaponry; -import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.SidedProxy; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; @@ -12,6 +11,7 @@ import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; @@ -19,6 +19,7 @@ import tconstruct.library.TConstructCreativeTab; import tconstruct.library.TConstructRegistry; import tconstruct.library.crafting.*; +import tconstruct.library.tools.DynamicToolPart; import tconstruct.library.tools.ToolCore; import tconstruct.library.util.IPattern; import tconstruct.library.util.IToolPart; @@ -27,13 +28,12 @@ import tconstruct.tools.items.Pattern; import tconstruct.weaponry.ammo.ArrowAmmo; import tconstruct.weaponry.ammo.BoltAmmo; -import tconstruct.weaponry.items.DualMaterialToolPart; +import tconstruct.library.tools.DualMaterialToolPart; import tconstruct.weaponry.items.WeaponryPattern; -import tconstruct.weaponry.items.WeaponryToolPart; -import tconstruct.weaponry.library.weaponry.AmmoItem; -import tconstruct.weaponry.library.weaponry.AmmoWeapon; -import tconstruct.weaponry.library.weaponry.ArrowShaftMaterial; -import tconstruct.weaponry.library.weaponry.ProjectileWeapon; +import tconstruct.library.weaponry.AmmoItem; +import tconstruct.library.weaponry.AmmoWeapon; +import tconstruct.library.weaponry.ArrowShaftMaterial; +import tconstruct.library.weaponry.ProjectileWeapon; import tconstruct.weaponry.weapons.*; import java.util.Map; @@ -48,7 +48,6 @@ public class TinkerWeaponry { public static WeaponryCommonProxy proxy; // Throwing Weapons - public static ToolCore throwArrow; public static AmmoWeapon shuriken; public static AmmoWeapon throwingknife; public static AmmoWeapon javelin; @@ -62,11 +61,11 @@ public class TinkerWeaponry { public static AmmoItem boltAmmo; // Tool Parts - public static WeaponryToolPart partShuriken; - public static WeaponryToolPart partArrowShaft; // not craftable, used internally - public static WeaponryToolPart partBowLimb; - public static WeaponryToolPart partCrossbowLimb; - public static WeaponryToolPart partCrossbowBody; + public static DynamicToolPart partShuriken; + public static DynamicToolPart partArrowShaft; // not craftable, used internally + public static DynamicToolPart partBowLimb; + public static DynamicToolPart partCrossbowLimb; + public static DynamicToolPart partCrossbowBody; public static DualMaterialToolPart partBolt; // patterns/casts @@ -106,15 +105,14 @@ public void postInit(FMLPostInitializationEvent event) private void registerItems() { // create tool part - partShuriken = new WeaponryToolPart("_shuriken", "Shuriken"); - partArrowShaft = new WeaponryToolPart("_arrow_shaft", "Shaft"); - partBowLimb = new WeaponryToolPart("_bow_limb", "BowLimb"); - partCrossbowLimb = new WeaponryToolPart("_crossbow_limb", "CrossbowLimb"); - partCrossbowBody = new WeaponryToolPart("_crossbow_body", "CrossbowBody"); + partShuriken = new DynamicToolPart("_shuriken", "Shuriken"); + partArrowShaft = new DynamicToolPart("_arrow_shaft", "Shaft"); + partBowLimb = new DynamicToolPart("_bow_limb", "BowLimb"); + partCrossbowLimb = new DynamicToolPart("_crossbow_limb", "CrossbowLimb"); + partCrossbowBody = new DynamicToolPart("_crossbow_body", "CrossbowBody"); partBolt = new DualMaterialToolPart("_bolt", "Bolt"); // create throwing weapons - throwArrow = new ThrowArrowItem(); shuriken = new Shuriken(); throwingknife = new ThrowingKnife(); javelin = new Javelin(); @@ -136,7 +134,6 @@ private void registerItems() GameRegistry.registerItem(partCrossbowBody, "CrossbowBodyPart"); GameRegistry.registerItem(partBolt, "BoltPart"); // register throwing weapons - GameRegistry.registerItem(throwArrow, "ThrowArrow"); GameRegistry.registerItem(shuriken, "Shuriken"); GameRegistry.registerItem(throwingknife, "ThrowingKnife"); GameRegistry.registerItem(javelin, "Javelin"); @@ -308,4 +305,18 @@ private void registerBoltCasting() } } } + + private void setupCreativeTab() + { + ItemStack tool = new ItemStack(TinkerWeaponry.longbow, 1, 0); + + NBTTagCompound compound = new NBTTagCompound(); + compound.setTag("InfiTool", new NBTTagCompound()); + compound.getCompoundTag("InfiTool").setInteger("RenderHead", 0); + compound.getCompoundTag("InfiTool").setInteger("RenderHandle", 0); + compound.getCompoundTag("InfiTool").setInteger("RenderAccessory", 0); + tool.setTagCompound(compound); + + TConstructRegistry.weaponryTab.init(tool); + } } diff --git a/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java b/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java index 6588cd56346..0cbd3c4cfc0 100644 --- a/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java +++ b/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java @@ -1,15 +1,17 @@ package tconstruct.weaponry; +import tconstruct.client.AmmoItemRenderer; +import tconstruct.library.entity.ProjectileBase; import tconstruct.weaponry.client.AmmoSlotHandler; import tconstruct.weaponry.client.CrosshairHandler; import tconstruct.weaponry.client.RenderEventHandler; -import tconstruct.weaponry.client.entityrenderer.ArrowEntityRenderer; -import tconstruct.weaponry.client.entityrenderer.JavelinEntityRenderer; -import tconstruct.weaponry.client.entityrenderer.ProjectileBaseRenderer; -import tconstruct.weaponry.client.entityrenderer.ShurikenEntityRenderer; -import tconstruct.weaponry.client.renderer.*; +import tconstruct.weaponry.client.entity.ArrowEntityRenderer; +import tconstruct.weaponry.client.entity.JavelinEntityRenderer; +import tconstruct.weaponry.client.entity.ProjectileBaseRenderer; +import tconstruct.weaponry.client.entity.ShurikenEntityRenderer; +import tconstruct.weaponry.client.item.*; import tconstruct.weaponry.entity.*; -import tconstruct.weaponry.util.Reference; +import tconstruct.util.Reference; import cpw.mods.fml.client.registry.RenderingRegistry; import net.minecraft.item.ItemStack; import net.minecraftforge.client.MinecraftForgeClient; @@ -40,7 +42,6 @@ public void init() { private void registerRenderers() { renderer = new AmmoItemRenderer(); - MinecraftForgeClient.registerItemRenderer(TinkerWeaponry.throwArrow, renderer); MinecraftForgeClient.registerItemRenderer(TinkerWeaponry.shuriken, renderer); MinecraftForgeClient.registerItemRenderer(TinkerWeaponry.throwingknife, new ThrowingKnifeRenderer()); MinecraftForgeClient.registerItemRenderer(TinkerWeaponry.javelin, new JavelinRenderer()); diff --git a/src/main/java/tconstruct/weaponry/WeaponryHandler.java b/src/main/java/tconstruct/weaponry/WeaponryHandler.java index 5c8b56ab2bc..219a3b9fa38 100644 --- a/src/main/java/tconstruct/weaponry/WeaponryHandler.java +++ b/src/main/java/tconstruct/weaponry/WeaponryHandler.java @@ -2,11 +2,11 @@ import tconstruct.weaponry.ammo.ArrowAmmo; import tconstruct.weaponry.ammo.BoltAmmo; -import tconstruct.weaponry.items.DualMaterialToolPart; -import tconstruct.weaponry.library.weaponry.ArrowShaftMaterial; -import tconstruct.weaponry.library.weaponry.BowBaseAmmo; -import tconstruct.weaponry.library.weaponry.ProjectileWeapon; -import tconstruct.weaponry.library.weaponry.IAmmo; +import tconstruct.library.tools.DualMaterialToolPart; +import tconstruct.library.weaponry.ArrowShaftMaterial; +import tconstruct.library.weaponry.BowBaseAmmo; +import tconstruct.library.weaponry.ProjectileWeapon; +import tconstruct.library.weaponry.IAmmo; import tconstruct.weaponry.weapons.Crossbow; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.item.Item; diff --git a/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java b/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java index e68e47cf852..aae00f51946 100644 --- a/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java +++ b/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java @@ -2,8 +2,8 @@ import tconstruct.TConstruct; import tconstruct.weaponry.TinkerWeaponry; -import tconstruct.weaponry.library.weaponry.AmmoItem; -import tconstruct.weaponry.util.Reference; +import tconstruct.library.weaponry.AmmoItem; +import tconstruct.util.Reference; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -49,11 +49,6 @@ public String getDefaultFolder () return "arrow"; } - @Override - public String getDefaultTexturePath() { - return Reference.RESOURCE + ":" + getDefaultFolder(); - } - @Override public void registerPartPaths (int index, String[] location) { diff --git a/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java b/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java index 4d75989c21a..297d4e7e454 100644 --- a/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java +++ b/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java @@ -1,8 +1,8 @@ package tconstruct.weaponry.ammo; import tconstruct.weaponry.TinkerWeaponry; -import tconstruct.weaponry.items.DualMaterialToolPart; -import tconstruct.weaponry.library.weaponry.AmmoItem; +import tconstruct.library.tools.DualMaterialToolPart; +import tconstruct.library.weaponry.AmmoItem; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import tconstruct.library.crafting.ToolBuilder; diff --git a/src/main/java/tconstruct/weaponry/client/AmmoSlotHandler.java b/src/main/java/tconstruct/weaponry/client/AmmoSlotHandler.java index 1b1d3ba30ac..a36f6f4a9cd 100644 --- a/src/main/java/tconstruct/weaponry/client/AmmoSlotHandler.java +++ b/src/main/java/tconstruct/weaponry/client/AmmoSlotHandler.java @@ -1,6 +1,6 @@ package tconstruct.weaponry.client; -import tconstruct.weaponry.library.weaponry.ProjectileWeapon; +import tconstruct.library.weaponry.ProjectileWeapon; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; diff --git a/src/main/java/tconstruct/weaponry/client/CrosshairHandler.java b/src/main/java/tconstruct/weaponry/client/CrosshairHandler.java index 6fe04498938..df1d26ce95b 100644 --- a/src/main/java/tconstruct/weaponry/client/CrosshairHandler.java +++ b/src/main/java/tconstruct/weaponry/client/CrosshairHandler.java @@ -1,7 +1,7 @@ package tconstruct.weaponry.client; -import tconstruct.weaponry.util.Reference; -import tconstruct.weaponry.library.weaponry.IWindup; +import tconstruct.util.Reference; +import tconstruct.library.weaponry.IWindup; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.OpenGlHelper; diff --git a/src/main/java/tconstruct/weaponry/client/RenderEventHandler.java b/src/main/java/tconstruct/weaponry/client/RenderEventHandler.java index d68656fe34f..200ab7fa588 100644 --- a/src/main/java/tconstruct/weaponry/client/RenderEventHandler.java +++ b/src/main/java/tconstruct/weaponry/client/RenderEventHandler.java @@ -1,8 +1,8 @@ package tconstruct.weaponry.client; import tconstruct.weaponry.TinkerWeaponry; -import tconstruct.weaponry.library.weaponry.BowBaseAmmo; -import tconstruct.weaponry.library.weaponry.IWindup; +import tconstruct.library.weaponry.BowBaseAmmo; +import tconstruct.library.weaponry.IWindup; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.item.ItemStack; import net.minecraftforge.client.event.FOVUpdateEvent; diff --git a/src/main/java/tconstruct/weaponry/client/entityrenderer/ArrowEntityRenderer.java b/src/main/java/tconstruct/weaponry/client/entity/ArrowEntityRenderer.java similarity index 96% rename from src/main/java/tconstruct/weaponry/client/entityrenderer/ArrowEntityRenderer.java rename to src/main/java/tconstruct/weaponry/client/entity/ArrowEntityRenderer.java index f0098ba48ef..066675d789d 100644 --- a/src/main/java/tconstruct/weaponry/client/entityrenderer/ArrowEntityRenderer.java +++ b/src/main/java/tconstruct/weaponry/client/entity/ArrowEntityRenderer.java @@ -1,4 +1,4 @@ -package tconstruct.weaponry.client.entityrenderer; +package tconstruct.weaponry.client.entity; import tconstruct.weaponry.entity.ArrowEntity; import org.lwjgl.opengl.GL11; diff --git a/src/main/java/tconstruct/weaponry/client/entityrenderer/JavelinEntityRenderer.java b/src/main/java/tconstruct/weaponry/client/entity/JavelinEntityRenderer.java similarity index 94% rename from src/main/java/tconstruct/weaponry/client/entityrenderer/JavelinEntityRenderer.java rename to src/main/java/tconstruct/weaponry/client/entity/JavelinEntityRenderer.java index b328e60ee65..796e4a0f297 100644 --- a/src/main/java/tconstruct/weaponry/client/entityrenderer/JavelinEntityRenderer.java +++ b/src/main/java/tconstruct/weaponry/client/entity/JavelinEntityRenderer.java @@ -1,4 +1,4 @@ -package tconstruct.weaponry.client.entityrenderer; +package tconstruct.weaponry.client.entity; import tconstruct.weaponry.entity.JavelinEntity; import org.lwjgl.opengl.GL11; diff --git a/src/main/java/tconstruct/weaponry/client/entityrenderer/ProjectileBaseRenderer.java b/src/main/java/tconstruct/weaponry/client/entity/ProjectileBaseRenderer.java similarity index 95% rename from src/main/java/tconstruct/weaponry/client/entityrenderer/ProjectileBaseRenderer.java rename to src/main/java/tconstruct/weaponry/client/entity/ProjectileBaseRenderer.java index a4cc34aecc5..02f77becc81 100644 --- a/src/main/java/tconstruct/weaponry/client/entityrenderer/ProjectileBaseRenderer.java +++ b/src/main/java/tconstruct/weaponry/client/entity/ProjectileBaseRenderer.java @@ -1,7 +1,7 @@ -package tconstruct.weaponry.client.entityrenderer; +package tconstruct.weaponry.client.entity; -import tconstruct.weaponry.client.renderer.FlexibleToolRenderer; -import tconstruct.weaponry.entity.ProjectileBase; +import tconstruct.client.FlexibleToolRenderer; +import tconstruct.library.entity.ProjectileBase; import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.entity.Entity; diff --git a/src/main/java/tconstruct/weaponry/client/entityrenderer/ShurikenEntityRenderer.java b/src/main/java/tconstruct/weaponry/client/entity/ShurikenEntityRenderer.java similarity index 94% rename from src/main/java/tconstruct/weaponry/client/entityrenderer/ShurikenEntityRenderer.java rename to src/main/java/tconstruct/weaponry/client/entity/ShurikenEntityRenderer.java index e085e1c7c89..ff6ed7c4c52 100644 --- a/src/main/java/tconstruct/weaponry/client/entityrenderer/ShurikenEntityRenderer.java +++ b/src/main/java/tconstruct/weaponry/client/entity/ShurikenEntityRenderer.java @@ -1,4 +1,4 @@ -package tconstruct.weaponry.client.entityrenderer; +package tconstruct.weaponry.client.entity; import tconstruct.weaponry.entity.ShurikenEntity; import org.lwjgl.opengl.GL11; diff --git a/src/main/java/tconstruct/weaponry/client/renderer/BowRenderer.java b/src/main/java/tconstruct/weaponry/client/item/BowRenderer.java similarity index 96% rename from src/main/java/tconstruct/weaponry/client/renderer/BowRenderer.java rename to src/main/java/tconstruct/weaponry/client/item/BowRenderer.java index bec766b7d8f..6c3d9181958 100644 --- a/src/main/java/tconstruct/weaponry/client/renderer/BowRenderer.java +++ b/src/main/java/tconstruct/weaponry/client/item/BowRenderer.java @@ -1,10 +1,11 @@ -package tconstruct.weaponry.client.renderer; +package tconstruct.weaponry.client.item; +import tconstruct.client.FlexibleToolRenderer; import tconstruct.weaponry.TinkerWeaponry; import tconstruct.weaponry.ammo.ArrowAmmo; import tconstruct.weaponry.entity.ArrowEntity; -import tconstruct.weaponry.library.weaponry.ProjectileWeapon; -import tconstruct.weaponry.library.weaponry.IWindup; +import tconstruct.library.weaponry.ProjectileWeapon; +import tconstruct.library.weaponry.IWindup; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.RenderManager; diff --git a/src/main/java/tconstruct/weaponry/client/renderer/CrossbowRenderer.java b/src/main/java/tconstruct/weaponry/client/item/CrossbowRenderer.java similarity index 96% rename from src/main/java/tconstruct/weaponry/client/renderer/CrossbowRenderer.java rename to src/main/java/tconstruct/weaponry/client/item/CrossbowRenderer.java index 1fc398fef4b..315ef543366 100644 --- a/src/main/java/tconstruct/weaponry/client/renderer/CrossbowRenderer.java +++ b/src/main/java/tconstruct/weaponry/client/item/CrossbowRenderer.java @@ -1,5 +1,6 @@ -package tconstruct.weaponry.client.renderer; +package tconstruct.weaponry.client.item; +import tconstruct.client.FlexibleToolRenderer; import tconstruct.weaponry.entity.ArrowEntity; import tconstruct.weaponry.entity.BoltEntity; import tconstruct.weaponry.weapons.Crossbow; diff --git a/src/main/java/tconstruct/weaponry/client/renderer/JavelinRenderer.java b/src/main/java/tconstruct/weaponry/client/item/JavelinRenderer.java similarity index 84% rename from src/main/java/tconstruct/weaponry/client/renderer/JavelinRenderer.java rename to src/main/java/tconstruct/weaponry/client/item/JavelinRenderer.java index 2f10315d1db..e2b231eb81e 100644 --- a/src/main/java/tconstruct/weaponry/client/renderer/JavelinRenderer.java +++ b/src/main/java/tconstruct/weaponry/client/item/JavelinRenderer.java @@ -1,6 +1,7 @@ -package tconstruct.weaponry.client.renderer; +package tconstruct.weaponry.client.item; -import tconstruct.weaponry.library.weaponry.IWindup; +import tconstruct.client.AmmoItemRenderer; +import tconstruct.library.weaponry.IWindup; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; import org.lwjgl.opengl.GL11; diff --git a/src/main/java/tconstruct/weaponry/client/renderer/ThrowingKnifeRenderer.java b/src/main/java/tconstruct/weaponry/client/item/ThrowingKnifeRenderer.java similarity index 95% rename from src/main/java/tconstruct/weaponry/client/renderer/ThrowingKnifeRenderer.java rename to src/main/java/tconstruct/weaponry/client/item/ThrowingKnifeRenderer.java index f8583b1d92d..41f5bb7a197 100644 --- a/src/main/java/tconstruct/weaponry/client/renderer/ThrowingKnifeRenderer.java +++ b/src/main/java/tconstruct/weaponry/client/item/ThrowingKnifeRenderer.java @@ -1,6 +1,7 @@ -package tconstruct.weaponry.client.renderer; +package tconstruct.weaponry.client.item; -import tconstruct.weaponry.library.weaponry.IWindup; +import tconstruct.client.AmmoItemRenderer; +import tconstruct.library.weaponry.IWindup; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.entity.RenderPlayer; diff --git a/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java b/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java index 562e35fb28d..e8c8264da2c 100644 --- a/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java +++ b/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java @@ -1,9 +1,7 @@ package tconstruct.weaponry.entity; -import tconstruct.weaponry.library.util.PiercingArrowDamage; -import cpw.mods.fml.common.network.ByteBufUtils; -import io.netty.buffer.ByteBuf; -import net.minecraft.client.Minecraft; +import tconstruct.library.entity.ProjectileBase; +import tconstruct.library.util.PiercingArrowDamage; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -12,7 +10,6 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; import tconstruct.TConstruct; -import tconstruct.library.tools.AbilityHelper; import tconstruct.library.tools.ToolCore; public class ArrowEntity extends ProjectileBase { diff --git a/src/main/java/tconstruct/weaponry/entity/JavelinEntity.java b/src/main/java/tconstruct/weaponry/entity/JavelinEntity.java index 3a3547e21fe..81a96c78367 100644 --- a/src/main/java/tconstruct/weaponry/entity/JavelinEntity.java +++ b/src/main/java/tconstruct/weaponry/entity/JavelinEntity.java @@ -1,5 +1,6 @@ package tconstruct.weaponry.entity; +import tconstruct.library.entity.ProjectileBase; import tconstruct.weaponry.TinkerWeaponry; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java b/src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java index 02f3f5d96cc..4675fbf15b3 100644 --- a/src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java +++ b/src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java @@ -1,5 +1,6 @@ package tconstruct.weaponry.entity; +import tconstruct.library.entity.ProjectileBase; import tconstruct.weaponry.TinkerWeaponry; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/tconstruct/weaponry/entity/ThrowingKnifeEntity.java b/src/main/java/tconstruct/weaponry/entity/ThrowingKnifeEntity.java index 3226f6b71b3..e0768e0c76f 100644 --- a/src/main/java/tconstruct/weaponry/entity/ThrowingKnifeEntity.java +++ b/src/main/java/tconstruct/weaponry/entity/ThrowingKnifeEntity.java @@ -1,5 +1,6 @@ package tconstruct.weaponry.entity; +import tconstruct.library.entity.ProjectileBase; import tconstruct.weaponry.TinkerWeaponry; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/tconstruct/weaponry/items/CustomToolPart.java b/src/main/java/tconstruct/weaponry/items/CustomToolPart.java deleted file mode 100644 index 7a01cbb6663..00000000000 --- a/src/main/java/tconstruct/weaponry/items/CustomToolPart.java +++ /dev/null @@ -1,26 +0,0 @@ -package tconstruct.weaponry.items; - -import net.minecraft.item.ItemStack; -import tconstruct.TConstruct; -import tconstruct.library.TConstructRegistry; -import tconstruct.library.tools.CustomMaterial; -import tconstruct.library.tools.DynamicToolPart; - -public class CustomToolPart extends WeaponryToolPart { - private final Class customMat; - - public CustomToolPart(String texture, String name, Class customMatClass) { - super(texture, name); - - this.customMat = customMatClass; - } - - @Override - public int getMaterialID (ItemStack stack) - { - if(TConstructRegistry.getCustomMaterial(stack.getItemDamage(), customMat) != null) - return stack.getItemDamage(); - - return -1; - } -} diff --git a/src/main/java/tconstruct/weaponry/items/WeaponryPattern.java b/src/main/java/tconstruct/weaponry/items/WeaponryPattern.java index c72e77e8aad..9de1b572adc 100644 --- a/src/main/java/tconstruct/weaponry/items/WeaponryPattern.java +++ b/src/main/java/tconstruct/weaponry/items/WeaponryPattern.java @@ -1,11 +1,9 @@ package tconstruct.weaponry.items; -import tconstruct.weaponry.util.Reference; +import tconstruct.util.Reference; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import tconstruct.library.TConstructRegistry; -import tconstruct.library.crafting.PatternBuilder; import tconstruct.tools.items.Pattern; import java.util.List; @@ -15,7 +13,6 @@ public class WeaponryPattern extends Pattern { public WeaponryPattern(String patternType, String name) { super(patternName, getPatternNames(patternName, patternType), "patterns/"); - this.modTexPrefix = Reference.RESOURCE; this.setUnlocalizedName(Reference.prefix(name)); } diff --git a/src/main/java/tconstruct/weaponry/items/WeaponryToolPart.java b/src/main/java/tconstruct/weaponry/items/WeaponryToolPart.java deleted file mode 100644 index c5c100aeab5..00000000000 --- a/src/main/java/tconstruct/weaponry/items/WeaponryToolPart.java +++ /dev/null @@ -1,14 +0,0 @@ -package tconstruct.weaponry.items; - -import tconstruct.weaponry.TinkerWeaponry; -import tconstruct.weaponry.util.Reference; -import tconstruct.library.tools.DynamicToolPart; - -public class WeaponryToolPart extends DynamicToolPart { - public WeaponryToolPart(String textureType, String name) { - super(textureType, name, Reference.RESOURCE); - - this.setUnlocalizedName(Reference.prefix(name)); - this.setCreativeTab(TinkerWeaponry.creativeTab); - } -} diff --git a/src/main/java/tconstruct/weaponry/util/Config.java b/src/main/java/tconstruct/weaponry/util/Config.java deleted file mode 100644 index c01a3430003..00000000000 --- a/src/main/java/tconstruct/weaponry/util/Config.java +++ /dev/null @@ -1,4 +0,0 @@ -package tconstruct.weaponry.util; - -public class Config { -} diff --git a/src/main/java/tconstruct/weaponry/weapons/Crossbow.java b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java index 398b1c3bbb5..c5bfaf2e822 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Crossbow.java +++ b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java @@ -3,10 +3,10 @@ import tconstruct.weaponry.TinkerWeaponry; import tconstruct.weaponry.ammo.BoltAmmo; import tconstruct.weaponry.entity.BoltEntity; -import tconstruct.weaponry.library.weaponry.AmmoItem; -import tconstruct.weaponry.library.weaponry.ProjectileWeapon; -import tconstruct.weaponry.util.Reference; -import tconstruct.weaponry.library.weaponry.IAmmo; +import tconstruct.library.weaponry.AmmoItem; +import tconstruct.library.weaponry.ProjectileWeapon; +import tconstruct.util.Reference; +import tconstruct.library.weaponry.IAmmo; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityArrow; diff --git a/src/main/java/tconstruct/weaponry/weapons/Javelin.java b/src/main/java/tconstruct/weaponry/weapons/Javelin.java index f30c028a591..7b9ef448d96 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Javelin.java +++ b/src/main/java/tconstruct/weaponry/weapons/Javelin.java @@ -1,7 +1,7 @@ package tconstruct.weaponry.weapons; import tconstruct.weaponry.entity.JavelinEntity; -import tconstruct.weaponry.library.weaponry.AmmoWeapon; +import tconstruct.library.weaponry.AmmoWeapon; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; diff --git a/src/main/java/tconstruct/weaponry/weapons/LongBow.java b/src/main/java/tconstruct/weaponry/weapons/LongBow.java index 9ffbd7a8937..88ef29e5ea6 100644 --- a/src/main/java/tconstruct/weaponry/weapons/LongBow.java +++ b/src/main/java/tconstruct/weaponry/weapons/LongBow.java @@ -2,7 +2,7 @@ import tconstruct.weaponry.TinkerWeaponry; import tconstruct.weaponry.ammo.ArrowAmmo; -import tconstruct.weaponry.library.weaponry.BowBaseAmmo; +import tconstruct.library.weaponry.BowBaseAmmo; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; diff --git a/src/main/java/tconstruct/weaponry/weapons/ShortBow.java b/src/main/java/tconstruct/weaponry/weapons/ShortBow.java index a96182a9c7c..fa5a61d44ff 100644 --- a/src/main/java/tconstruct/weaponry/weapons/ShortBow.java +++ b/src/main/java/tconstruct/weaponry/weapons/ShortBow.java @@ -2,7 +2,7 @@ import tconstruct.weaponry.TinkerWeaponry; import tconstruct.weaponry.ammo.ArrowAmmo; -import tconstruct.weaponry.library.weaponry.BowBaseAmmo; +import tconstruct.library.weaponry.BowBaseAmmo; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; diff --git a/src/main/java/tconstruct/weaponry/weapons/Shuriken.java b/src/main/java/tconstruct/weaponry/weapons/Shuriken.java index 468105184df..143ef074567 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Shuriken.java +++ b/src/main/java/tconstruct/weaponry/weapons/Shuriken.java @@ -2,9 +2,9 @@ import tconstruct.weaponry.TinkerWeaponry; import tconstruct.weaponry.client.CrosshairType; -import tconstruct.weaponry.client.IconFlipped; +import tconstruct.client.IconFlipped; import tconstruct.weaponry.entity.ShurikenEntity; -import tconstruct.weaponry.library.weaponry.AmmoWeapon; +import tconstruct.library.weaponry.AmmoWeapon; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.renderer.texture.IIconRegister; diff --git a/src/main/java/tconstruct/weaponry/weapons/ThrowArrow.java b/src/main/java/tconstruct/weaponry/weapons/ThrowArrow.java deleted file mode 100644 index 3e225d08951..00000000000 --- a/src/main/java/tconstruct/weaponry/weapons/ThrowArrow.java +++ /dev/null @@ -1,92 +0,0 @@ -package tconstruct.weaponry.weapons; - -import tconstruct.weaponry.entity.ArrowEntity; -import tconstruct.weaponry.library.weaponry.AmmoWeapon; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import tconstruct.tools.TinkerTools; - -public class ThrowArrow extends AmmoWeapon { - public ThrowArrow() { - super(1, "ThrowArrow"); - - headIcons = TinkerTools.arrow.headIcons; - handleIcons = TinkerTools.arrow.handleIcons; - accessoryIcons = TinkerTools.arrow.accessoryIcons; - extraIcons = TinkerTools.arrow.extraIcons; - } - - @Override - public String getIconSuffix (int partType) - { - switch (partType) - { - case 0: - return "_arrow_head"; - case 1: - return ""; // Doesn't break - case 2: - return "_arrow_shaft"; - case 3: - case 4: - return "_arrow_fletching"; - default: - return ""; - } - } - - @Override - public String getEffectSuffix () - { - return "_arrow_effect"; - } - - @Override - public String getDefaultFolder () - { - return "arrow"; - } - - @Override - public int getPartAmount() { - return 4; - } - - @Override - public Item getHeadItem () - { - return TinkerTools.arrowhead; - } - - @Override - public Item getAccessoryItem () - { - return TinkerTools.fletching; - } - - @Override - public Item getExtraItem () - { - return TinkerTools.fletching; - } - - @Override - public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { - ItemStack reference = stack.copy(); - reference.stackSize = 1; - Entity projectile = new ArrowEntity(world, player, 1.9f, 0f, reference); - - if(!world.isRemote) - world.spawnEntityInWorld(projectile); - - return stack; - } - - @Override - protected Entity createProjectile(ItemStack reference, World world, EntityPlayer player, float accuracy) { - return new ArrowEntity(world, player, 1.0f, accuracy, reference); - } -} diff --git a/src/main/java/tconstruct/weaponry/weapons/ThrowArrowItem.java b/src/main/java/tconstruct/weaponry/weapons/ThrowArrowItem.java deleted file mode 100644 index 1384f15de14..00000000000 --- a/src/main/java/tconstruct/weaponry/weapons/ThrowArrowItem.java +++ /dev/null @@ -1,128 +0,0 @@ -package tconstruct.weaponry.weapons; - -import tconstruct.weaponry.entity.ArrowEntity; -import tconstruct.weaponry.util.Reference; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.projectile.EntityArrow; -import net.minecraft.item.EnumAction; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import tconstruct.library.crafting.ToolBuilder; -import tconstruct.library.tools.Weapon; -import tconstruct.tools.TinkerTools; - -import java.util.List; - -public class ThrowArrowItem extends Weapon { - public ThrowArrowItem() { - super(1); - this.setUnlocalizedName(Reference.prefix("ThrowArrow")); - - headIcons = TinkerTools.arrow.headIcons; - handleIcons = TinkerTools.arrow.handleIcons; - accessoryIcons = TinkerTools.arrow.accessoryIcons; - extraIcons = TinkerTools.arrow.extraIcons; - } - - @Override - public ItemStack onItemRightClick (ItemStack itemstack, World world, EntityPlayer player) - { - ItemStack stack = itemstack.copy(); - if (!world.isRemote) - { - EntityArrow arrow = new ArrowEntity(world, player, 1.0f, 1.0f, stack); - world.spawnEntityInWorld(arrow); - } - - return itemstack; - } - - @Override - public String getIconSuffix (int partType) - { - switch (partType) - { - case 0: - return "_arrow_head"; - case 1: - return ""; // Doesn't break - case 2: - return "_arrow_shaft"; - case 3: - return "_arrow_fletching"; - default: - return ""; - } - } - - @Override - public String getEffectSuffix () - { - return "_arrow_effect"; - } - - @Override - public String getDefaultFolder () - { - return "arrow"; - } - - @Override - public void registerPartPaths (int index, String[] location) - { - headStrings.put(index, location[0]); - handleStrings.put(index, location[2]); - } - - @Override - public void registerAlternatePartPaths (int index, String[] location) - { - accessoryStrings.put(index, location[3]); - } - - @Override - public Item getHeadItem () - { - return TinkerTools.arrowhead; - } - - @Override - public Item getAccessoryItem () - { - return TinkerTools.fletching; - } - - @Override - public EnumAction getItemUseAction (ItemStack par1ItemStack) - { - return EnumAction.bow; - } - - @Override - public String[] getTraits () - { - return new String[] { "weapon", "throwing" }; - } - - @Override - public void getSubItems (Item id, CreativeTabs tab, List list) - { - ItemStack toolMine = new ItemStack(this); - - Item accessory = getAccessoryItem(); - ItemStack accessoryStack = accessory != null ? new ItemStack(getAccessoryItem(), 1, 0) : null; - Item extra = getExtraItem(); - ItemStack extraStack = extra != null ? new ItemStack(extra, 1, 0) : null; - ItemStack tool = ToolBuilder.instance.buildTool(new ItemStack(getHeadItem(), 1, 3), new ItemStack(getHandleItem(), 1, 0), accessoryStack, extraStack, ""); - if (tool != null) - { - tool.stackSize = 1; - tool.getTagCompound().getCompoundTag("InfiTool").setBoolean("Built", true); - - toolMine.setTagCompound(tool.getTagCompound()); - list.add(toolMine); - } - } -} diff --git a/src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java b/src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java index 7bfde93ad66..ea3a6af54b0 100644 --- a/src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java +++ b/src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java @@ -2,7 +2,7 @@ import tconstruct.weaponry.client.CrosshairType; import tconstruct.weaponry.entity.ThrowingKnifeEntity; -import tconstruct.weaponry.library.weaponry.AmmoWeapon; +import tconstruct.library.weaponry.AmmoWeapon; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.Entity; From 86fc2ddbf312490847faebd414d3691a3a29937a Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 5 Oct 2014 21:04:11 +0200 Subject: [PATCH 004/129] Bowstring Textures fixing --- .../textures/items/longbow/_bowstring.png | Bin 314 -> 315 bytes .../textures/items/longbow/_bowstring_1.png | Bin 360 -> 365 bytes .../textures/items/longbow/_bowstring_2.png | Bin 363 -> 347 bytes .../textures/items/longbow/_bowstring_3.png | Bin 166 -> 179 bytes .../items/longbow/_bowstring_broken.png | Bin 161 -> 174 bytes .../textures/items/shortbow/_bowstring.png | Bin 304 -> 305 bytes .../textures/items/shortbow/_bowstring_1.png | Bin 339 -> 353 bytes .../textures/items/shortbow/_bowstring_2.png | Bin 371 -> 347 bytes .../textures/items/shortbow/_bowstring_3.png | Bin 178 -> 179 bytes .../items/shortbow/_bowstring_broken.png | Bin 174 -> 175 bytes .../library/weaponry/BowBaseAmmo.java | 25 +++++++----------- 11 files changed, 9 insertions(+), 16 deletions(-) diff --git a/resources/assets/tinker/textures/items/longbow/_bowstring.png b/resources/assets/tinker/textures/items/longbow/_bowstring.png index cb478b8272a39ab76db7e4c0de78a54afc9dc90a..d4e08f37038431582bde460da222a9203a8a26a9 100644 GIT binary patch delta 177 zcmV;i08an90=oi`Uw;Y(5;zAB*I_CE006s5L_t(I%VS`m5HOOW*waiDg}?pOYr+Pg zYjQ9YVz~eOJA(_~Izxt^9D{}&H-`MaeF6KC-!~-&cv4oBoM_LuVj006p4L_t(I%VS`m5HOOW*waiDg}?pOYX%ll zH8~gxG2DOtok3BOli@d?{(lxi8etk37#J87B{>=9Z-2tTz`($8=bPpKJ$v>rGUCz< z(|F**TNJq)kG?XvxVZe^vu6(@PMbT^)fqDU-!~*gUQm?egeOn3 evLz|bMg{<1c~je=Up*860000T&VEUB$hrV~W45KFO))k0$a3{E%fy#2nJorOQ6QKxwB zTB-bWepFxZ4b8@FF84Q%Z8BNyW1|Yx0Dxng98Na?mfK@2gnwulMX&}n01$)_U0+Bk z%PsHLLpF;Zqh2d>E~P{%73;iNq#T4#qU$RI`@UbUUZxDB)N`%Zg;Oo)Y1gscEZc!3 ztdxp{5ShI(l5g(VCPA2nwe38(u>Z<|egB2IYtiqR1mTnJV2bB?)vC!BwEgAw_%oP^ dU+m_^2OHvMa1f7N@1Otx002ovPDHLkV1n=pf?xmu delta 274 zcmV+t0qy?n0_XyeUw;W03oQg!PrK;=008JoL_t(I%cavXiUKhd#_|8iG=s2(AUGf{ z)2w!4BTQ%U8XK>nSJ_kSF>GEjwbhgsf*^v0SgM6ZY>Z^oaW=c@Lh>W;eM#V-Bk)n|oj<|gEO;`mj07&A9pZOMm)hRWq8h?ak*g^{cvK*G1BO+3s zfs3>Jz;bgetlzLv)c~O8i&gb~V6#bwUZ?)FX3G{4Q;NT*U2j}y!KUp~cJ198aIuKo zgL6md-gy#7WO)(WvR~oS{wo7}{0rk@lh0N}mLF(;r2y5Zx-Ho9SEuyX@Ks>uFW>nJ Yi9Krka@QH~01E&B07*qoM6N<$f<{(@G5`Po diff --git a/resources/assets/tinker/textures/items/longbow/_bowstring_2.png b/resources/assets/tinker/textures/items/longbow/_bowstring_2.png index e9e02e078274c73280a64d2cc7bd67c52ca350f0..d6681c652dc2fdd38e1ecb25311693b407f874d4 100644 GIT binary patch delta 260 zcmV+f0sH>z0^0(RUw;Y(5;zt7ZV+Ms007%bL_t(I%VS`m5HOOW*waiDg}?pOYX%ll zH8~gxG2DOtok3BOli~i0Z@66m(+JbRz`($uD9On%fBO@-nj4S4VmH9kOcbv1z=gLc zayK4*WpHtEVW_IA`tRiA#K=NO^NmMeQRH1*T=4t1GhLk_!+lSVK|_ukLmsAi-@bkS zVPZ_^ityRIXU`toE`ZsN&t?}F7ZlquTmTDgY&H{>NYMR`>|AWNqi9C=0AQm;07p4axxsaz`#&dRYjCW41g{Ahyeh8#BOS6A(Ku30000< KMNUMnLSTZ&^?MNj delta 277 zcmV+w0qXwS0_y^hUw;W03oJYMGN+XQ008SrL_t(I%cYaO3c@fHg-@kRa1#m^q|!xQ zT?%dvS-SWd`YJv}AEQf#&Q2Y>6-q%tI#$QJn2?yHKX|v~-Y@6m-URqFoGHa|dFT^lx%JK(EDqogCP`~CX9?~AzyyoG5Jw)?OM)zKu-Y7iVjrkEknE2FwJ?ou bOnd-P{cj?yH4bo500000NkvXXu0mjf0zi84 diff --git a/resources/assets/tinker/textures/items/longbow/_bowstring_3.png b/resources/assets/tinker/textures/items/longbow/_bowstring_3.png index 8f76ed1e612007e1ce56831ee6dabc9fa9e1a512..8ea152791c57b6400c6d22d89f24351cc00be127 100644 GIT binary patch delta 106 zcmZ3+xS4T+3KwH>kh>GZx^prwCn_3*-s55wvM`EFS<1=4z+mj@;uvCaIypgtm6`q9 z+uPsgHv&PXL+H4SG)}= zJa|CbVdDRli)Ky~;jRAmCQ;>gTe~DWM4fJrg2% diff --git a/resources/assets/tinker/textures/items/longbow/_bowstring_broken.png b/resources/assets/tinker/textures/items/longbow/_bowstring_broken.png index 8ccc79df47f7e5542f99819d66044574bd762de6..70cb036f6accc2d9e420aa7bad435602c29bba39 100644 GIT binary patch delta 101 zcmV-r0Gj`y0j>d%Bnkm@Qb$4nuFf3kks&Zp-U??>}DulC2qL07aTR)744V%!JH=g*LiooB@Vz0I8bc2EgK6QIeA+%{cu}Fu<^R r0p@>_Y(_Q!=6q5#qX2BtM+^V}BC}HfYe8ed00000NkvXXu0mjfVb40K delta 136 zcmV;30C)ef0c5II2jIHc*`K8X30=hRYllV kAY3jW##XEVTl5hF0Ln~fCdR{8-T(jq07*qoM6N<$f@0H91poj5 delta 168 zcmV;Z09XIv0@DJJVG9v36*loCGXMYp(~)dee=s&S{@>Zz$%s{RXSzB=hMydRh8#DB zyo-wqLwR}me;A($pUpQOeZ|ncXU`t|0fx_J1_lNc+p#*GRLv+}fQ2?m&c^3_n9cZ{ z&Vn50ijtfR2QHx64AY1;%5eFgV1S{!0NMYrL}F}gjNevt17Oa_nZgJGY|%#y008hn W5@F~LMf>vr0000#Sv)4;&Mz@R9}$uNKW6S$fikG^6zz|%|=uJOQyw4+c8`K3vFyR6O~BN{f_KhY__9lM)v};v+-)i=6`fQ zCa&mIQn_u7tC`xiN9Js*1P*qh$ltv7IE&7N70Di=7YG@&oP5=M^07*qo IM6N<$f}K=)>;M1& delta 283 zcmV+$0p$MM0`mfpVSf=Y4!o4@-v9sr^GQTOR5;6}ld%qhFc5}+3=45HA(6yjSk%=t zA#roKg~ivw+r4#s zxx@Sw+HYqlu1|Q5h2r)YcfcS60N^wFD?d#a3ApmzdhV4KVxXXb@cl`RYzzzxMxHK?Ar_~T6C_xf*-xE5{omLC2zXb#4JkZ$K-yvA s|CNhoP88vtJ9lo6%Wap5!Jdo^s&9poRB!!=1?pz-boFyt=akR{0F3G&vH$=8 diff --git a/resources/assets/tinker/textures/items/shortbow/_bowstring_broken.png b/resources/assets/tinker/textures/items/shortbow/_bowstring_broken.png index 84f13dbaba64932b34fd6d97b3094fd9d52c200b..722baa87af8d0e233dfbd25165e1537de0049af6 100644 GIT binary patch delta 85 zcmV-b0IL740j~j&VNMb`8gF5tfqnb-{im8{CQ4nyG~i*t rMArZ#*+8;w-?wkye~L5@tz-=VUwI%wl;?iL00000NkvXXu0mjfo`)gL delta 84 zcmV-a0IUD60j>d%VNDS*5iy+LDgXcgE=fc|R5;6HU>F5tf%5Y5|5Ve=M5$|-20RRy q=o(-o8%Vb8<>lr7DbhT&k~ILId>8K^81%;g0000 custom coloring - // todo: move this into the custom material itself - int mat = stack.getTagCompound().getCompoundTag("InfiTool").getInteger("Handle"); - switch(mat) - { - case 0: return 0xffffffff; // string = white - case 1: return 0xffccccff; // macig string = light blue - case 2: return 0xffffcccc; // flamestring = light red - } - return super.getColorFromItemStack(stack, renderPass); + protected int getDefaultColor(int renderPass, int materialID) { + // bowstring uses custom material + if(renderPass == 0) + return TConstructRegistry.getCustomMaterial(materialID, BowstringMaterial.class).color; + + return super.getDefaultColor(renderPass, materialID); } - */ } From bdbda639bb3dac3460ad45f8b46e1b0b591afb2a Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 5 Oct 2014 21:19:11 +0200 Subject: [PATCH 005/129] Fix projectile rendering and some more ui rendering --- src/main/java/tconstruct/util/Reference.java | 2 +- .../java/tconstruct/weaponry/WeaponryCommonProxy.java | 10 +++++----- .../weaponry/client/entity/ProjectileBaseRenderer.java | 1 + 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/tconstruct/util/Reference.java b/src/main/java/tconstruct/util/Reference.java index 769a6c9af03..ccbccbd822d 100644 --- a/src/main/java/tconstruct/util/Reference.java +++ b/src/main/java/tconstruct/util/Reference.java @@ -8,7 +8,7 @@ private Reference() {} public static final String MOD_ID = TConstruct.modID; public static final String MOD_NAME = "Tinkers' Construct"; - public static final String RESOURCE = MOD_ID.toLowerCase(); + public static final String RESOURCE = "tinker"; public static String resource(String res) { diff --git a/src/main/java/tconstruct/weaponry/WeaponryCommonProxy.java b/src/main/java/tconstruct/weaponry/WeaponryCommonProxy.java index 4fb65e8d274..11414ee620f 100644 --- a/src/main/java/tconstruct/weaponry/WeaponryCommonProxy.java +++ b/src/main/java/tconstruct/weaponry/WeaponryCommonProxy.java @@ -6,10 +6,10 @@ public class WeaponryCommonProxy { public void init() { - EntityRegistry.registerModEntity(ShurikenEntity.class, "Shuriken", 0, TConstruct.instance, 32, 5, true); - EntityRegistry.registerModEntity(ThrowingKnifeEntity.class, "ThrowingKnife", 1, TConstruct.instance, 32, 5, true); - EntityRegistry.registerModEntity(JavelinEntity.class, "Javelin", 2, TConstruct.instance, 32, 5, true); - EntityRegistry.registerModEntity(ArrowEntity.class, "Arrow", 3, TConstruct.instance, 32, 5, true); - EntityRegistry.registerModEntity(BoltEntity.class, "Bolt", 4, TConstruct.instance, 32, 5, true); + EntityRegistry.registerModEntity(ShurikenEntity.class, "Shuriken", 10, TConstruct.instance, 32, 5, true); + EntityRegistry.registerModEntity(ThrowingKnifeEntity.class, "ThrowingKnife", 11, TConstruct.instance, 32, 5, true); + EntityRegistry.registerModEntity(JavelinEntity.class, "Javelin", 12, TConstruct.instance, 32, 5, true); + EntityRegistry.registerModEntity(ArrowEntity.class, "Arrow", 13, TConstruct.instance, 32, 5, true); + EntityRegistry.registerModEntity(BoltEntity.class, "Bolt", 14, TConstruct.instance, 32, 5, true); } } diff --git a/src/main/java/tconstruct/weaponry/client/entity/ProjectileBaseRenderer.java b/src/main/java/tconstruct/weaponry/client/entity/ProjectileBaseRenderer.java index 02f77becc81..4cc3e6dc4f5 100644 --- a/src/main/java/tconstruct/weaponry/client/entity/ProjectileBaseRenderer.java +++ b/src/main/java/tconstruct/weaponry/client/entity/ProjectileBaseRenderer.java @@ -14,6 +14,7 @@ public class ProjectileBaseRenderer extends Render { protected static FlexibleToolRenderer toolCoreRenderer = new FlexibleToolRenderer(); + @SuppressWarnings("unchecked") @Override public void doRender(Entity p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_, float p_76986_9_) { doRender((T)p_76986_1_, p_76986_2_, p_76986_4_, p_76986_6_, p_76986_8_, p_76986_9_); From e7666e031b069a1b8ca8a4b3c51350e4f2591ac9 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 5 Oct 2014 22:19:04 +0200 Subject: [PATCH 006/129] Take all the shortbow and arrow stuff out of the Tools module, and try to keep backwards compatibility >_> --- src/main/java/tconstruct/TConstruct.java | 1 + .../java/tconstruct/items/tools/Arrow.java | 7 +- .../java/tconstruct/items/tools/Shortbow.java | 3 +- .../library/TConstructRegistry.java | 16 ++- .../library/tools/ArrowMaterial.java | 10 +- .../tconstruct/library/tools/BowMaterial.java | 10 +- .../tconstruct/tools/TinkerToolEvents.java | 51 ------- .../java/tconstruct/tools/TinkerTools.java | 94 +++---------- .../tconstruct/tools/ToolProxyClient.java | 26 +--- .../tconstruct/weaponry/TinkerWeaponry.java | 132 ++++++++++-------- .../weaponry/WeaponryClientProxy.java | 15 +- .../tconstruct/weaponry/ammo/ArrowAmmo.java | 5 +- .../tconstruct/weaponry/ammo/BoltAmmo.java | 3 +- .../tconstruct/weaponry/weapons/Crossbow.java | 2 +- .../tconstruct/weaponry/weapons/Javelin.java | 3 +- .../tconstruct/weaponry/weapons/LongBow.java | 2 +- .../tconstruct/weaponry/weapons/ShortBow.java | 3 +- 17 files changed, 143 insertions(+), 240 deletions(-) diff --git a/src/main/java/tconstruct/TConstruct.java b/src/main/java/tconstruct/TConstruct.java index fc704cef363..1a36d343e7b 100644 --- a/src/main/java/tconstruct/TConstruct.java +++ b/src/main/java/tconstruct/TConstruct.java @@ -145,6 +145,7 @@ public void preInit (FMLPreInitializationEvent event) TConstructRegistry.partTab = new TConstructCreativeTab("TConstructParts"); TConstructRegistry.blockTab = new TConstructCreativeTab("TConstructBlocks"); TConstructRegistry.equipableTab = new TConstructCreativeTab("TConstructEquipables"); + TConstructRegistry.weaponryTab = new TConstructCreativeTab("TConstructWeaponry"); tableCasting = new LiquidCasting(); basinCasting = new LiquidCasting(); diff --git a/src/main/java/tconstruct/items/tools/Arrow.java b/src/main/java/tconstruct/items/tools/Arrow.java index 35e610291bf..a9b1cce301f 100644 --- a/src/main/java/tconstruct/items/tools/Arrow.java +++ b/src/main/java/tconstruct/items/tools/Arrow.java @@ -10,10 +10,9 @@ import net.minecraft.world.World; import tconstruct.library.TConstructRegistry; import tconstruct.library.crafting.ToolBuilder; -import tconstruct.library.tools.BowstringMaterial; import tconstruct.library.tools.FletchingMaterial; import tconstruct.library.tools.ToolCore; -import tconstruct.tools.TinkerTools; +import tconstruct.weaponry.TinkerWeaponry; public class Arrow extends ToolCore { @@ -81,13 +80,13 @@ public void registerAlternatePartPaths (int index, String[] location) @Override public Item getHeadItem () { - return TinkerTools.arrowhead; + return TinkerWeaponry.arrowhead; } @Override public Item getAccessoryItem () { - return TinkerTools.fletching; + return TinkerWeaponry.fletching; } @Override diff --git a/src/main/java/tconstruct/items/tools/Shortbow.java b/src/main/java/tconstruct/items/tools/Shortbow.java index 9acb9f6ec9b..6086e27831e 100644 --- a/src/main/java/tconstruct/items/tools/Shortbow.java +++ b/src/main/java/tconstruct/items/tools/Shortbow.java @@ -12,6 +12,7 @@ import tconstruct.library.TConstructRegistry; import tconstruct.library.tools.BowstringMaterial; import tconstruct.tools.TinkerTools; +import tconstruct.weaponry.TinkerWeaponry; public class Shortbow extends BowBase { @@ -71,7 +72,7 @@ public Item getHeadItem () @Override public Item getHandleItem () { - return TinkerTools.bowstring; + return TinkerWeaponry.bowstring; } @Override diff --git a/src/main/java/tconstruct/library/TConstructRegistry.java b/src/main/java/tconstruct/library/TConstructRegistry.java index df402c1c38b..e6a310d24a9 100644 --- a/src/main/java/tconstruct/library/TConstructRegistry.java +++ b/src/main/java/tconstruct/library/TConstructRegistry.java @@ -372,12 +372,18 @@ public static ToolMaterial getMaterial (String key) // Bow materials public static HashMap bowMaterials = new HashMap(40); + @Deprecated public static void addBowMaterial (int materialID, int durability, int drawSpeed, float speedMax) + { + addBowMaterial(materialID, drawSpeed, speedMax); + } + + public static void addBowMaterial (int materialID, int drawSpeed, float speedMax) { BowMaterial mat = bowMaterials.get(materialID); if (mat == null) { - mat = new BowMaterial(durability, drawSpeed, speedMax); + mat = new BowMaterial(drawSpeed, speedMax); bowMaterials.put(materialID, mat); } else @@ -396,12 +402,18 @@ public static BowMaterial getBowMaterial (int materialID) public static HashMap arrowMaterials = new HashMap(40); + @Deprecated public static void addArrowMaterial (int materialID, float mass, float breakChance, float accuracy) + { + addArrowMaterial(materialID, mass, breakChance, 0); + } + + public static void addArrowMaterial (int materialID, float mass, float breakChance) { ArrowMaterial mat = arrowMaterials.get(materialID); if (mat == null) { - mat = new ArrowMaterial(mass, breakChance, accuracy); + mat = new ArrowMaterial(mass, breakChance); arrowMaterials.put(materialID, mat); } else diff --git a/src/main/java/tconstruct/library/tools/ArrowMaterial.java b/src/main/java/tconstruct/library/tools/ArrowMaterial.java index 884e3edc49a..3f361f8ab20 100644 --- a/src/main/java/tconstruct/library/tools/ArrowMaterial.java +++ b/src/main/java/tconstruct/library/tools/ArrowMaterial.java @@ -4,12 +4,16 @@ public class ArrowMaterial { public final float mass; public final float breakChance; - public final float accuracy; - public ArrowMaterial(float weight, float breakChance, float accuracy) + public ArrowMaterial(float weight, float breakChance) { this.mass = weight; this.breakChance = breakChance; - this.accuracy = accuracy; + } + + @Deprecated + public ArrowMaterial(float weight, float breakChance, float accuraccy) + { + this(weight, breakChance); } } diff --git a/src/main/java/tconstruct/library/tools/BowMaterial.java b/src/main/java/tconstruct/library/tools/BowMaterial.java index 89d0c80ef26..8769fabfb00 100644 --- a/src/main/java/tconstruct/library/tools/BowMaterial.java +++ b/src/main/java/tconstruct/library/tools/BowMaterial.java @@ -2,14 +2,18 @@ public class BowMaterial { - public final int durability; public final int drawspeed; public final float flightSpeedMax; - public BowMaterial(int durability, int drawspeed, float attack) + public BowMaterial(int drawspeed, float attack) { - this.durability = durability; this.drawspeed = drawspeed; this.flightSpeedMax = attack; } + + @Deprecated + public BowMaterial(int durability, int drawspeed, float attack) + { + this(drawspeed, attack); + } } diff --git a/src/main/java/tconstruct/tools/TinkerToolEvents.java b/src/main/java/tconstruct/tools/TinkerToolEvents.java index ecb5d4e7634..f7c7ca6089f 100644 --- a/src/main/java/tconstruct/tools/TinkerToolEvents.java +++ b/src/main/java/tconstruct/tools/TinkerToolEvents.java @@ -84,57 +84,6 @@ public void craftTool (ToolCraftEvent.NormalTool event) handlePaper(toolTag, event.tool); handleThaumium(toolTag, event.tool); - if (event.tool == TinkerTools.shortbow) - { - BowMaterial top = TConstructRegistry.getBowMaterial(toolTag.getInteger("Head")); - BowMaterial bottom = TConstructRegistry.getBowMaterial(toolTag.getInteger("Accessory")); - BowstringMaterial string = (BowstringMaterial) TConstructRegistry.getCustomMaterial(toolTag.getInteger("Handle"), BowstringMaterial.class); - - if (top != null && bottom != null && string != null) - { - if (toolTag.getInteger("Handle") == 1) - { - int modifiers = toolTag.getInteger("Modifiers"); - modifiers += 1; - toolTag.setInteger("Modifiers", modifiers); - } - - int durability = (int) ((top.durability + bottom.durability) / 2 * string.durabilityModifier); - toolTag.setInteger("TotalDurability", durability); - toolTag.setInteger("BaseDurability", durability); - - int drawSpeed = (int) ((top.drawspeed + bottom.drawspeed) / 2 * string.drawspeedModifier); - toolTag.setInteger("DrawSpeed", drawSpeed); - toolTag.setInteger("BaseDrawSpeed", drawSpeed); - - float flightSpeed = (top.flightSpeedMax + bottom.flightSpeedMax) / 2f * string.flightSpeedModifier; - toolTag.setFloat("FlightSpeed", flightSpeed); - } - } - - if (event.tool == TinkerTools.arrow) - { - ArrowMaterial head = TConstructRegistry.getArrowMaterial(toolTag.getInteger("Head")); - ArrowMaterial shaft = TConstructRegistry.getArrowMaterial(toolTag.getInteger("Handle")); - FletchingMaterial fletching = (FletchingMaterial) TConstructRegistry.getCustomMaterial(toolTag.getInteger("Accessory"), FletchingMaterial.class); - - if (head != null && shaft != null && fletching != null) - { - float mass = head.mass / 5f + shaft.mass + fletching.mass; - float shatter = (head.breakChance + shaft.breakChance + fletching.breakChance) / 4f; - float accuracy = (head.accuracy + shaft.accuracy + fletching.accuracy) / 3; - - ItemStack arrow = new ItemStack(event.tool, 4); - toolTag.setInteger("TotalDurability", 0); - toolTag.setFloat("Mass", mass); - toolTag.setFloat("BreakChance", shatter); - toolTag.setFloat("Accuracy", accuracy); - toolTag.setInteger("Unbreaking", 10); - arrow.setTagCompound(event.toolTag); - event.overrideResult(arrow); - } - } - if (event.tool == TinkerTools.battlesign) { int modifiers = toolTag.getInteger("Modifiers"); diff --git a/src/main/java/tconstruct/tools/TinkerTools.java b/src/main/java/tconstruct/tools/TinkerTools.java index 490c8480f81..0bf2cd920ef 100644 --- a/src/main/java/tconstruct/tools/TinkerTools.java +++ b/src/main/java/tconstruct/tools/TinkerTools.java @@ -31,6 +31,7 @@ import tconstruct.tools.logic.*; import tconstruct.util.ItemHelper; import tconstruct.util.config.PHConstruct; +import tconstruct.weaponry.TinkerWeaponry; import tconstruct.world.TinkerWorld; import tconstruct.world.blocks.SoilBlock; import tconstruct.world.itemblocks.CraftedSoilItemBlock; @@ -45,6 +46,13 @@ public class TinkerTools @SidedProxy(clientSide = "tconstruct.tools.ToolProxyClient", serverSide = "tconstruct.tools.ToolProxyCommon") public static ToolProxyCommon proxy; + // backwards compatibility + public static Item bowstring; + public static DynamicToolPart arrowhead; + public static Item fletching; + public static ToolCore shortbow; + public static ToolCore arrow; + // Crafting blocks public static Block toolStationWood; public static Block toolStationStone; @@ -100,15 +108,10 @@ public class TinkerTools public static ToolCore cleaver; public static ToolCore hammer; public static ToolCore battleaxe; - public static ToolCore shortbow; - public static ToolCore arrow; public static Item potionLauncher; public static Item handGuard; public static Item crossbar; public static Item fullGuard; - public static Item bowstring; - public static Item arrowhead; - public static Item fletching; public static Block craftedSoil; //TODO: Untwine this public static Block multiBrick; public static Block multiBrickFancy; @@ -209,11 +212,8 @@ public void preInit (FMLPreInitializationEvent event) TinkerTools.hammer = new Hammer(); TinkerTools.battleaxe = new Battleaxe(); - TinkerTools.shortbow = new Shortbow(); - TinkerTools.arrow = new Arrow(); - - Item[] tools = { TinkerTools.pickaxe, TinkerTools.shovel, TinkerTools.hatchet, TinkerTools.broadsword, TinkerTools.longsword, TinkerTools.rapier, TinkerTools.dagger, TinkerTools.cutlass, TinkerTools.frypan, TinkerTools.battlesign, TinkerTools.mattock, TinkerTools.chisel, TinkerTools.lumberaxe, TinkerTools.cleaver, TinkerTools.scythe, TinkerTools.excavator, TinkerTools.hammer, TinkerTools.battleaxe, TinkerTools.shortbow, TinkerTools.arrow }; - String[] toolStrings = { "pickaxe", "shovel", "hatchet", "broadsword", "longsword", "rapier", "dagger", "cutlass", "frypan", "battlesign", "mattock", "chisel", "lumberaxe", "cleaver", "scythe", "excavator", "hammer", "battleaxe", "shortbow", "arrow" }; + Item[] tools = { TinkerTools.pickaxe, TinkerTools.shovel, TinkerTools.hatchet, TinkerTools.broadsword, TinkerTools.longsword, TinkerTools.rapier, TinkerTools.dagger, TinkerTools.cutlass, TinkerTools.frypan, TinkerTools.battlesign, TinkerTools.mattock, TinkerTools.chisel, TinkerTools.lumberaxe, TinkerTools.cleaver, TinkerTools.scythe, TinkerTools.excavator, TinkerTools.hammer, TinkerTools.battleaxe}; + String[] toolStrings = { "pickaxe", "shovel", "hatchet", "broadsword", "longsword", "rapier", "dagger", "cutlass", "frypan", "battlesign", "mattock", "chisel", "lumberaxe", "cleaver", "scythe", "excavator", "hammer", "battleaxe"}; for (int i = 0; i < tools.length; i++) { @@ -250,12 +250,10 @@ public void preInit (FMLPreInitializationEvent event) TinkerTools.largeSwordBlade = new DynamicToolPart("_large_sword_blade", "LargeSwordBlade"); TinkerTools.hammerHead = new DynamicToolPart("_hammer_head", "HammerHead"); - TinkerTools.bowstring = new Bowstring().setUnlocalizedName("tconstruct.Bowstring"); - TinkerTools.arrowhead = new ToolPart("_arrowhead", "ArrowHead").setUnlocalizedName("tconstruct.Arrowhead"); - TinkerTools.fletching = new Fletching().setUnlocalizedName("tconstruct.Fletching"); - Item[] toolParts = { TinkerTools.toolRod, TinkerTools.toolShard, TinkerTools.pickaxeHead, TinkerTools.shovelHead, TinkerTools.hatchetHead, TinkerTools.binding, TinkerTools.toughBinding, TinkerTools.toughRod, TinkerTools.largePlate, TinkerTools.swordBlade, TinkerTools.wideGuard, TinkerTools.handGuard, TinkerTools.crossbar, TinkerTools.knifeBlade, TinkerTools.fullGuard, TinkerTools.frypanHead, TinkerTools.signHead, TinkerTools.chiselHead, TinkerTools.scytheBlade, TinkerTools.broadAxeHead, TinkerTools.excavatorHead, TinkerTools.largeSwordBlade, TinkerTools.hammerHead, TinkerTools.bowstring, TinkerTools.fletching, TinkerTools.arrowhead }; - String[] toolPartStrings = { "toolRod", "toolShard", "pickaxeHead", "shovelHead", "hatchetHead", "binding", "toughBinding", "toughRod", "heavyPlate", "swordBlade", "wideGuard", "handGuard", "crossbar", "knifeBlade", "fullGuard", "frypanHead", "signHead", "chiselHead", "scytheBlade", "broadAxeHead", "excavatorHead", "largeSwordBlade", "hammerHead", "bowstring", "fletching", "arrowhead" }; + + Item[] toolParts = { TinkerTools.toolRod, TinkerTools.toolShard, TinkerTools.pickaxeHead, TinkerTools.shovelHead, TinkerTools.hatchetHead, TinkerTools.binding, TinkerTools.toughBinding, TinkerTools.toughRod, TinkerTools.largePlate, TinkerTools.swordBlade, TinkerTools.wideGuard, TinkerTools.handGuard, TinkerTools.crossbar, TinkerTools.knifeBlade, TinkerTools.fullGuard, TinkerTools.frypanHead, TinkerTools.signHead, TinkerTools.chiselHead, TinkerTools.scytheBlade, TinkerTools.broadAxeHead, TinkerTools.excavatorHead, TinkerTools.largeSwordBlade, TinkerTools.hammerHead}; + String[] toolPartStrings = { "toolRod", "toolShard", "pickaxeHead", "shovelHead", "hatchetHead", "binding", "toughBinding", "toughRod", "heavyPlate", "swordBlade", "wideGuard", "handGuard", "crossbar", "knifeBlade", "fullGuard", "frypanHead", "signHead", "chiselHead", "scytheBlade", "broadAxeHead", "excavatorHead", "largeSwordBlade", "hammerHead" }; for (int i = 0; i < toolParts.length; i++) { @@ -279,7 +277,7 @@ public void preInit (FMLPreInitializationEvent event) registerStencils(); // this array is only used to register the remaining pattern-part-interactions - TinkerTools.patternOutputs = new Item[] { TinkerTools.toolRod, TinkerTools.pickaxeHead, TinkerTools.shovelHead, TinkerTools.hatchetHead, TinkerTools.swordBlade, TinkerTools.wideGuard, TinkerTools.handGuard, TinkerTools.crossbar, TinkerTools.binding, TinkerTools.frypanHead, TinkerTools.signHead, TinkerTools.knifeBlade, TinkerTools.chiselHead, TinkerTools.toughRod, TinkerTools.toughBinding, TinkerTools.largePlate, TinkerTools.broadAxeHead, TinkerTools.scytheBlade, TinkerTools.excavatorHead, TinkerTools.largeSwordBlade, TinkerTools.hammerHead, TinkerTools.fullGuard, null, null, TinkerTools.arrowhead, null }; + TinkerTools.patternOutputs = new Item[] { TinkerTools.toolRod, TinkerTools.pickaxeHead, TinkerTools.shovelHead, TinkerTools.hatchetHead, TinkerTools.swordBlade, TinkerTools.wideGuard, TinkerTools.handGuard, TinkerTools.crossbar, TinkerTools.binding, TinkerTools.frypanHead, TinkerTools.signHead, TinkerTools.knifeBlade, TinkerTools.chiselHead, TinkerTools.toughRod, TinkerTools.toughBinding, TinkerTools.largePlate, TinkerTools.broadAxeHead, TinkerTools.scytheBlade, TinkerTools.excavatorHead, TinkerTools.largeSwordBlade, TinkerTools.hammerHead, TinkerTools.fullGuard, null, null, TinkerWeaponry.arrowhead, null }; //Moved temporarily to deal with AE2 Quartz TinkerTools.modFlux = new ModFlux(); @@ -395,10 +393,6 @@ private void addRecipesForToolBuilder () tb.addNormalToolRecipe(TinkerTools.hammer, TinkerTools.hammerHead, TinkerTools.toughRod, TinkerTools.largePlate, TinkerTools.largePlate); tb.addNormalToolRecipe(TinkerTools.battleaxe, TinkerTools.broadAxeHead, TinkerTools.toughRod, TinkerTools.broadAxeHead, TinkerTools.toughBinding); - BowRecipe recipe = new BowRecipe(TinkerTools.toolRod, TinkerTools.bowstring, TinkerTools.toolRod, TinkerTools.shortbow); - tb.addCustomToolRecipe(recipe); - tb.addNormalToolRecipe(TinkerTools.arrow, TinkerTools.arrowhead, TinkerTools.toolRod, TinkerTools.fletching); - ItemStack diamond = new ItemStack(Items.diamond); ModifyBuilder.registerModifier(new ModToolRepair()); ModifyBuilder.registerModifier(new ModDurability(new ItemStack[] { diamond }, 0, 500, 0f, 3, "Diamond", "\u00a7b" + StatCollector.translateToLocal("modifier.tool.diamond"), "\u00a7b")); @@ -695,9 +689,9 @@ private void modIntegration () TConstructRegistry.addPartMapping(TinkerTools.woodPattern, meta + 1, 31, new ItemStack(TinkerTools.patternOutputs[meta], 1, 31)); } - TConstructRegistry.addBowstringMaterial(1, 2, new ItemStack((Item) obj, 1, 7), new ItemStack(TinkerTools.bowstring, 1, 1), 1F, 1F, 0.9f, 0x63bcd9); - TConstructRegistry.addBowMaterial(31, 576, 40, 1.2f); - TConstructRegistry.addArrowMaterial(31, 1.8F, 0.5F, 100F); + TConstructRegistry.addBowstringMaterial(1, 2, new ItemStack((Item) obj, 1, 7), new ItemStack(TinkerWeaponry.bowstring, 1, 1), 1F, 1F, 0.9f, 0x63bcd9); + TConstructRegistry.addBowMaterial(31, 40, 1.2f); + TConstructRegistry.addArrowMaterial(31, 1.8F, 0.5F); } else { @@ -709,7 +703,7 @@ private void modIntegration () try { Object plantItem = ItemHelper.getStaticItem("plantItem", "mods.natura.common.NContent"); - TConstructRegistry.addBowstringMaterial(2, 2, new ItemStack((Item) plantItem, 1, 7), new ItemStack(TinkerTools.bowstring, 1, 2), 1.2F, 0.8F, 1.3f, 0xd3414f); + TConstructRegistry.addBowstringMaterial(2, 2, new ItemStack((Item) plantItem, 1, 7), new ItemStack(TinkerWeaponry.bowstring, 1, 2), 1.2F, 0.8F, 1.3f, 0xd3414f); } catch (Exception e) { @@ -740,54 +734,6 @@ void registerMaterials () TConstructRegistry.addToolMaterial(MaterialID.BlueSlime, "BlueSlime", 0, 1200, 150, 0, 2.0F, 0, 0f, AQUA.toString(), 0x66AEB0); TConstructRegistry.addToolMaterial(MaterialID.PigIron, "PigIron", 3, 250, 600, 2, 1.3F, 1, 0f, RED.toString(), 0xF0A8A4); - // Bow Materials: Material ID, durability, drawspeed, arrow speed - TConstructRegistry.addBowMaterial(MaterialID.Wood, 384, 20, 1.0f); // Wood - TConstructRegistry.addBowMaterial(MaterialID.Stone, 10, 80, 0.2f); // Stone - TConstructRegistry.addBowMaterial(MaterialID.Iron, 576, 30, 1.2f); // Iron - TConstructRegistry.addBowMaterial(MaterialID.Flint, 10, 80, 0.2f); // Flint - TConstructRegistry.addBowMaterial(MaterialID.Cactus, 384, 20, 1.0f); // Cactus - TConstructRegistry.addBowMaterial(MaterialID.Bone, 192, 30, 1.0f); // Bone - TConstructRegistry.addBowMaterial(MaterialID.Obsidian, 10, 80, 0.2f); // Obsidian - TConstructRegistry.addBowMaterial(MaterialID.Netherrack, 10, 80, 0.2f); // Netherrack - TConstructRegistry.addBowMaterial(MaterialID.Slime, 1536, 30, 1.2f); // Slime - TConstructRegistry.addBowMaterial(MaterialID.Paper, 48, 25, 0.5f); // Paper - TConstructRegistry.addBowMaterial(MaterialID.Cobalt, 1152, 30, 1.2f); // Cobalt - TConstructRegistry.addBowMaterial(MaterialID.Ardite, 960, 30, 1.2f); // Ardite - TConstructRegistry.addBowMaterial(MaterialID.Manyullyn, 1536, 30, 1.2f); // Manyullyn - TConstructRegistry.addBowMaterial(MaterialID.Copper, 384, 30, 1.2f); // Copper - TConstructRegistry.addBowMaterial(MaterialID.Bronze, 576, 30, 1.2f); // Bronze - TConstructRegistry.addBowMaterial(MaterialID.Alumite, 768, 30, 1.2f); // Alumite - TConstructRegistry.addBowMaterial(MaterialID.Steel, 768, 30, 1.2f); // Steel - TConstructRegistry.addBowMaterial(MaterialID.BlueSlime, 576, 20, 1.2f); // Blue Slime - TConstructRegistry.addBowMaterial(MaterialID.PigIron, 384, 20, 1.2f); // Pig Iron - - // Fletchling Materials: Material ID, mass, fragility - TConstructRegistry.addArrowMaterial(MaterialID.Wood, 0.69F, 1.0F, 100F); //Wood - TConstructRegistry.addArrowMaterial(MaterialID.Stone, 2.05F, 5.0F, 100F); //Stone - TConstructRegistry.addArrowMaterial(MaterialID.Iron, 3.6F, 0.5F, 100F); //Iron - TConstructRegistry.addArrowMaterial(MaterialID.Flint, 1.325F, 1.0F, 100F); //Flint - TConstructRegistry.addArrowMaterial(MaterialID.Cactus, 0.76F, 1.0F, 100F); //Cactus - TConstructRegistry.addArrowMaterial(MaterialID.Bone, 0.69F, 1.0F, 100); //Bone - TConstructRegistry.addArrowMaterial(MaterialID.Obsidian, 2.4F, 1.0F, 100F); //Obsidian - TConstructRegistry.addArrowMaterial(MaterialID.Netherrack, 1.5F, 1.0F, 100F); //Netherrack - TConstructRegistry.addArrowMaterial(MaterialID.Slime, 0.22F, 0.0F, 100F); //Slime - TConstructRegistry.addArrowMaterial(MaterialID.Paper, 0.69F, 3.0F, 90F); //Paper - TConstructRegistry.addArrowMaterial(MaterialID.Cobalt, 3.0F, 0.25F, 100F); //Cobalt - TConstructRegistry.addArrowMaterial(MaterialID.Ardite, 1.25F, 0.25F, 100F); //Ardite - TConstructRegistry.addArrowMaterial(MaterialID.Manyullyn, 2.25F, 0.1F, 100F); //Manyullyn - TConstructRegistry.addArrowMaterial(MaterialID.Copper, 2.7F, 0.5F, 100F); //Copper - TConstructRegistry.addArrowMaterial(MaterialID.Bronze, 3.6F, 0.25F, 100F); //Bronze - TConstructRegistry.addArrowMaterial(MaterialID.Alumite, 1.1F, 0.25F, 100F); //Alumite - TConstructRegistry.addArrowMaterial(MaterialID.Steel, 3.6F, 0.25F, 100F); //Steel - TConstructRegistry.addArrowMaterial(MaterialID.BlueSlime, 0.22F, 0.0F, 100F); //Blue Slime - TConstructRegistry.addArrowMaterial(MaterialID.PigIron, 3.6F, 0.5F, 100F); //Pigiron - - TConstructRegistry.addBowstringMaterial(0, 2, new ItemStack(Items.string), new ItemStack(TinkerTools.bowstring, 1, 0), 1F, 1F, 1f, 0xeeeeee); // String - TConstructRegistry.addFletchingMaterial(0, 2, new ItemStack(Items.feather), new ItemStack(TinkerTools.fletching, 1, 0), 100F, 0F, 0.05F, 0xffffff); // Feather - TConstructRegistry.addCustomMaterial(new FletchlingLeafMaterial(1, 2, "treeLeaves", new ItemStack(TinkerTools.fletching, 1, 1), 75F, 0F, 0.2F)); // all vanilla and oredicted leaves. and all leaves in general. - TConstructRegistry.addFletchingMaterial(2, 2, new ItemStack(TinkerTools.materials, 1, 1), new ItemStack(TinkerTools.fletching, 1, 2), 100F, 0F, 0.12F, 0x82c873); // Slime - TConstructRegistry.addFletchingMaterial(3, 2, new ItemStack(TinkerTools.materials, 1, 17), new ItemStack(TinkerTools.fletching, 1, 3), 100F, 0F, 0.12F, 0x74c8c7); // BlueSlime - PatternBuilder pb = PatternBuilder.instance; if (PHConstruct.enableTWood) pb.registerFullMaterial(Blocks.planks, 2, "Wood", new ItemStack(Items.stick), new ItemStack(Items.stick), 0); @@ -874,10 +820,6 @@ private void registerStencils () StencilBuilder.registerStencil(TinkerTools.woodPattern, 8); // crossbar StencilBuilder.registerStencil(TinkerTools.woodPattern, 7); // small guard StencilBuilder.registerStencil(TinkerTools.woodPattern, 6); // wide guard - - StencilBuilder.registerStencil(TinkerTools.woodPattern, 25); // arrow head - StencilBuilder.registerStencil(TinkerTools.woodPattern, 24); // fletchling - StencilBuilder.registerStencil(TinkerTools.woodPattern, 23); // bowstring } public static final class MaterialID diff --git a/src/main/java/tconstruct/tools/ToolProxyClient.java b/src/main/java/tconstruct/tools/ToolProxyClient.java index c31f5db1cea..561d0047138 100644 --- a/src/main/java/tconstruct/tools/ToolProxyClient.java +++ b/src/main/java/tconstruct/tools/ToolProxyClient.java @@ -26,6 +26,7 @@ import tconstruct.tools.gui.*; import tconstruct.tools.logic.*; import tconstruct.tools.model.*; +import tconstruct.weaponry.TinkerWeaponry; public class ToolProxyClient extends ToolProxyCommon { @@ -72,10 +73,8 @@ public void registerRenderer () MinecraftForgeClient.registerItemRenderer(TinkerTools.mattock, renderer); MinecraftForgeClient.registerItemRenderer(TinkerTools.rapier, renderer); MinecraftForgeClient.registerItemRenderer(TinkerTools.scythe, renderer); - MinecraftForgeClient.registerItemRenderer(TinkerTools.shortbow, renderer); renderer = new ToolCoreRenderer(true); - MinecraftForgeClient.registerItemRenderer(TinkerTools.arrow, renderer); - MinecraftForgeClient.registerItemRenderer(TinkerTools.dagger, renderer); + MinecraftForgeClient.registerItemRenderer(TinkerTools.dagger, renderer); // todo proper renderer TileEntityRendererDispatcher.instance.mapSpecialRenderers.put(BattlesignLogic.class, new BattlesignTesr()); } @@ -95,8 +94,8 @@ public void registerManualIcons () MantleClientRegistry.registerManualIcon("frypanicon", ToolBuilder.instance.buildTool(new ItemStack(TinkerTools.frypanHead, 1, 10), new ItemStack(TinkerTools.toolRod, 1, 11), null, "")); MantleClientRegistry.registerManualIcon("battlesignicon", ToolBuilder.instance.buildTool(new ItemStack(TinkerTools.signHead, 1, 10), new ItemStack(TinkerTools.toolRod, 1, 11), null, "")); MantleClientRegistry.registerManualIcon("chiselicon", ToolBuilder.instance.buildTool(new ItemStack(TinkerTools.chiselHead, 1, 10), new ItemStack(TinkerTools.toolRod, 1, 11), null, "")); - MantleClientRegistry.registerManualIcon("shortbowIcon", ToolBuilder.instance.buildTool(new ItemStack(TinkerTools.toolRod, 1, 10), new ItemStack(TinkerTools.bowstring, 1, 0), new ItemStack(TinkerTools.toolRod, 1, 12), "")); - MantleClientRegistry.registerManualIcon("arrowIcon", ToolBuilder.instance.buildTool(new ItemStack(TinkerTools.arrowhead, 1, 10), new ItemStack(TinkerTools.toolRod, 1, 11), new ItemStack(TinkerTools.fletching, 1, 0), "")); + MantleClientRegistry.registerManualIcon("shortbowIcon", ToolBuilder.instance.buildTool(new ItemStack(TinkerTools.toolRod, 1, 10), new ItemStack(TinkerWeaponry.bowstring, 1, 0), new ItemStack(TinkerTools.toolRod, 1, 12), "")); + MantleClientRegistry.registerManualIcon("arrowIcon", ToolBuilder.instance.buildTool(new ItemStack(TinkerWeaponry.arrowhead, 1, 10), new ItemStack(TinkerTools.toolRod, 1, 11), new ItemStack(TinkerWeaponry.fletching, 1, 0), "")); MantleClientRegistry.registerManualIcon("hammericon", ToolBuilder.instance.buildTool(new ItemStack(TinkerTools.hammerHead, 1, 10), new ItemStack(TinkerTools.toughRod, 1, 11), new ItemStack(TinkerTools.largePlate, 1, 12), new ItemStack(TinkerTools.largePlate, 8), "")); MantleClientRegistry.registerManualIcon("lumbericon", ToolBuilder.instance.buildTool(new ItemStack(TinkerTools.broadAxeHead, 1, 10), new ItemStack(TinkerTools.toughRod, 1, 11), new ItemStack(TinkerTools.largePlate, 1, 12), new ItemStack(TinkerTools.toughBinding, 8), "")); @@ -132,9 +131,9 @@ public void registerManualIcons () MantleClientRegistry.registerManualIcon("toughbinding", new ItemStack(TinkerTools.toughBinding, 1, 17)); MantleClientRegistry.registerManualIcon("largeplate", new ItemStack(TinkerTools.largePlate, 1, 17)); - MantleClientRegistry.registerManualIcon("bowstring", new ItemStack(TinkerTools.bowstring, 1, 0)); - MantleClientRegistry.registerManualIcon("arrowhead", new ItemStack(TinkerTools.arrowhead, 1, 2)); - MantleClientRegistry.registerManualIcon("fletching", new ItemStack(TinkerTools.fletching, 1, 0)); + MantleClientRegistry.registerManualIcon("bowstring", new ItemStack(TinkerWeaponry.bowstring, 1, 0)); + MantleClientRegistry.registerManualIcon("arrowhead", new ItemStack(TinkerWeaponry.arrowhead, 1, 2)); + MantleClientRegistry.registerManualIcon("fletching", new ItemStack(TinkerWeaponry.fletching, 1, 0)); //Tables MantleClientRegistry.registerManualIcon("blankpattern", new ItemStack(TinkerTools.blankPattern, 1, 0)); @@ -456,16 +455,5 @@ void addToolRenderMappings () } } - String[] bowstringTypes = { "string", "magicfabric", "flamestring" }; - for (int bowIter = 0; bowIter < bowstringTypes.length; bowIter++) - { - TConstructClientRegistry.addAlternateMaterialRenderMapping(TinkerTools.shortbow, bowIter, "tinker", bowstringTypes[bowIter], true); - } - - String[] fletching = { "feather", "leaf", "slime", "blueslime" }; - for (int arrowIter = 0; arrowIter < fletching.length; arrowIter++) - { - TConstructClientRegistry.addAlternateMaterialRenderMapping(TinkerTools.arrow, arrowIter, "tinker", fletching[arrowIter], true); - } } } diff --git a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java index 2e9096f8ec4..aa4876f18e4 100644 --- a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java +++ b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java @@ -20,11 +20,13 @@ import tconstruct.library.TConstructRegistry; import tconstruct.library.crafting.*; import tconstruct.library.tools.DynamicToolPart; -import tconstruct.library.tools.ToolCore; +import tconstruct.library.tools.FletchlingLeafMaterial; import tconstruct.library.util.IPattern; import tconstruct.library.util.IToolPart; import tconstruct.smeltery.TinkerSmeltery; import tconstruct.tools.TinkerTools; +import tconstruct.tools.items.Bowstring; +import tconstruct.tools.items.Fletching; import tconstruct.tools.items.Pattern; import tconstruct.weaponry.ammo.ArrowAmmo; import tconstruct.weaponry.ammo.BoltAmmo; @@ -61,6 +63,9 @@ public class TinkerWeaponry { public static AmmoItem boltAmmo; // Tool Parts + public static Item bowstring; + public static DynamicToolPart arrowhead; + public static Item fletching; public static DynamicToolPart partShuriken; public static DynamicToolPart partArrowShaft; // not craftable, used internally public static DynamicToolPart partBowLimb; @@ -69,12 +74,10 @@ public class TinkerWeaponry { public static DualMaterialToolPart partBolt; // patterns/casts - public static Pattern woodPattern; public static Pattern metalPattern; // other stuff - public static TConstructCreativeTab creativeTab = new TConstructCreativeTab("TConstructWeaponry"); public static Random random = new Random(); @@ -91,6 +94,7 @@ public void init(FMLInitializationEvent event) addPartRecipies(); addWeaponRecipies(); registerBoltCasting(); + setupCreativeTab(); } @Handler @@ -105,6 +109,9 @@ public void postInit(FMLPostInitializationEvent event) private void registerItems() { // create tool part + TinkerTools.bowstring = bowstring = new Bowstring().setUnlocalizedName("tconstruct.Bowstring"); + TinkerTools.arrowhead = arrowhead = new DynamicToolPart("_arrowhead", "ArrowHead"); + TinkerTools.fletching = fletching = new Fletching().setUnlocalizedName("tconstruct.Fletching"); partShuriken = new DynamicToolPart("_shuriken", "Shuriken"); partArrowShaft = new DynamicToolPart("_arrow_shaft", "Shaft"); partBowLimb = new DynamicToolPart("_bow_limb", "BowLimb"); @@ -128,6 +135,9 @@ private void registerItems() metalPattern = new WeaponryPattern("cast_", "Cast"); // register tool parts + GameRegistry.registerItem(bowstring, "bowstring"); // 1.8 todo: rename properly + GameRegistry.registerItem(arrowhead, "arrowhead"); + GameRegistry.registerItem(fletching, "fletching"); GameRegistry.registerItem(partShuriken, "ShurikenPart"); GameRegistry.registerItem(partBowLimb, "BowLimbPart"); GameRegistry.registerItem(partCrossbowLimb, "CrossbowLimbPart"); @@ -151,6 +161,11 @@ private void registerItems() private void addPartRecipies() { + + StencilBuilder.registerStencil(TinkerTools.woodPattern, 25); // arrow head + StencilBuilder.registerStencil(TinkerTools.woodPattern, 24); // fletchling + StencilBuilder.registerStencil(TinkerTools.woodPattern, 23); // bowstring + StencilBuilder.registerStencil(woodPattern, 0); StencilBuilder.registerStencil(woodPattern, 1); StencilBuilder.registerStencil(woodPattern, 2); @@ -191,57 +206,52 @@ private void addPartRecipies() private void registerMaterials() { - // todo: un-hax - TConstructRegistry.arrowMaterials.clear(); - TConstructRegistry.bowMaterials.clear(); - - // todo: remove durability from this // Bow Materials: Material ID, durability, drawspeed, arrow speed // speed 3.0 == exactly the vanilla bow if 2 parts of speed 3 are used - // Wooden stuff is flexible, therefore good - TConstructRegistry.addBowMaterial(TinkerTools.MaterialID.Wood, 0, 18, 3.0f); // Wood + // Wooden stuff is flexible, therefore good. Reference. + TConstructRegistry.addBowMaterial(TinkerTools.MaterialID.Wood, 18, 3.0f); // Wood // other organic materials also are good - TConstructRegistry.addBowMaterial(MaterialID.Cactus, 0, 20, 2.4f); // Cactus - TConstructRegistry.addBowMaterial(MaterialID.Bone, 0, 38, 2.0f); // Bone - TConstructRegistry.addBowMaterial(MaterialID.Slime, 0, 28, 4.0f); // Slime - TConstructRegistry.addBowMaterial(MaterialID.BlueSlime, 0, 21, 4.0f); // Blue Slime - TConstructRegistry.addBowMaterial(MaterialID.Paper, 0, 25, 2.3f); // Paper + TConstructRegistry.addBowMaterial(MaterialID.Cactus, 20, 2.4f); // Cactus + TConstructRegistry.addBowMaterial(MaterialID.Bone, 38, 2.0f); // Bone + TConstructRegistry.addBowMaterial(MaterialID.Slime, 28, 4.0f); // Slime + TConstructRegistry.addBowMaterial(MaterialID.BlueSlime, 21, 4.0f); // Blue Slime + TConstructRegistry.addBowMaterial(MaterialID.Paper, 25, 2.3f); // Paper // Metal stuff has a lot of POW, but takes LONG to wind up since it's so hard - TConstructRegistry.addBowMaterial(MaterialID.Iron, 0, 40, 5.2f); // Iron - TConstructRegistry.addBowMaterial(MaterialID.Steel, 0, 50, 5.5f); // Steel - TConstructRegistry.addBowMaterial(MaterialID.PigIron, 0, 30, 5.2f); // Pig Iron - it's meat! - TConstructRegistry.addBowMaterial(MaterialID.Ardite, 0, 50, 4.5f); // Ardite - TConstructRegistry.addBowMaterial(MaterialID.Cobalt, 0, 35, 5.2f); // Cobalt - TConstructRegistry.addBowMaterial(MaterialID.Manyullyn, 0, 45, 4.5f); // Manyullyn - TConstructRegistry.addBowMaterial(MaterialID.Copper, 0, 30, 5.1f); // Copper - TConstructRegistry.addBowMaterial(MaterialID.Bronze, 0, 35, 5.2f); // Bronze - TConstructRegistry.addBowMaterial(MaterialID.Alumite, 0, 35, 4.8f); // Alumite - a bit stone-ish since it has obsidian + TConstructRegistry.addBowMaterial(MaterialID.Iron, 40, 5.2f); // Iron + TConstructRegistry.addBowMaterial(MaterialID.Steel, 50, 5.5f); // Steel + TConstructRegistry.addBowMaterial(MaterialID.PigIron, 30, 5.2f); // Pig Iron - it's meat! + TConstructRegistry.addBowMaterial(MaterialID.Ardite, 50, 4.5f); // Ardite + TConstructRegistry.addBowMaterial(MaterialID.Cobalt, 35, 5.2f); // Cobalt + TConstructRegistry.addBowMaterial(MaterialID.Manyullyn, 45, 4.5f); // Manyullyn + TConstructRegistry.addBowMaterial(MaterialID.Copper, 30, 5.1f); // Copper + TConstructRegistry.addBowMaterial(MaterialID.Bronze, 35, 5.2f); // Bronze + TConstructRegistry.addBowMaterial(MaterialID.Alumite, 35, 4.8f); // Alumite - a bit stone-ish since it has obsidian // Stone doesn't bend. takes forever, has no pow. WHY WOULD YOU DO THAT - TConstructRegistry.addBowMaterial(MaterialID.Stone, 0, 80, 1.0f); // Stone - TConstructRegistry.addBowMaterial(MaterialID.Flint, 0, 80, 1.0f); // Flint - TConstructRegistry.addBowMaterial(MaterialID.Obsidian, 0, 99, 1.0f); // Obsidian - TConstructRegistry.addBowMaterial(MaterialID.Netherrack,0, 70, 1.0f); // Netherrack + TConstructRegistry.addBowMaterial(MaterialID.Stone, 80, 1.0f); // Stone + TConstructRegistry.addBowMaterial(MaterialID.Flint, 80, 1.0f); // Flint + TConstructRegistry.addBowMaterial(MaterialID.Obsidian, 99, 1.0f); // Obsidian + TConstructRegistry.addBowMaterial(MaterialID.Netherrack, 70, 1.0f); // Netherrack // Arrow Head Materials: Material ID, mass, fragility - TConstructRegistry.addArrowMaterial(MaterialID.Wood, 0.69F, 1.0F, 100F); //Wood - TConstructRegistry.addArrowMaterial(MaterialID.Stone, 2.05F, 5.0F, 100F); //Stone - TConstructRegistry.addArrowMaterial(MaterialID.Iron, 3.6F, 0.5F, 100F); //Iron - TConstructRegistry.addArrowMaterial(MaterialID.Flint, 1.325F, 1.0F, 100F); //Flint - TConstructRegistry.addArrowMaterial(MaterialID.Cactus, 0.76F, 1.0F, 100F); //Cactus - TConstructRegistry.addArrowMaterial(MaterialID.Bone, 0.69F, 1.0F, 100F); //Bone - TConstructRegistry.addArrowMaterial(MaterialID.Obsidian, 2.4F, 1.0F, 100F); //Obsidian - TConstructRegistry.addArrowMaterial(MaterialID.Netherrack, 1.5F, 1.0F, 100F); //Netherrack - TConstructRegistry.addArrowMaterial(MaterialID.Slime, 0.22F, 0.0F, 100F); //Slime - TConstructRegistry.addArrowMaterial(MaterialID.Paper, 0.69F, 3.0F, 90F); //Paper - TConstructRegistry.addArrowMaterial(MaterialID.Cobalt, 3.0F, 0.25F, 100F); //Cobalt - TConstructRegistry.addArrowMaterial(MaterialID.Ardite, 1.25F, 0.25F, 100F); //Ardite - TConstructRegistry.addArrowMaterial(MaterialID.Manyullyn, 2.25F, 0.1F, 100F); //Manyullyn - TConstructRegistry.addArrowMaterial(MaterialID.Copper, 2.7F, 0.5F, 100F); //Copper - TConstructRegistry.addArrowMaterial(MaterialID.Bronze, 3.6F, 0.25F, 100F); //Bronze - TConstructRegistry.addArrowMaterial(MaterialID.Alumite, 1.1F, 0.25F, 100F); //Alumite - TConstructRegistry.addArrowMaterial(MaterialID.Steel, 3.6F, 0.25F, 100F); //Steel - TConstructRegistry.addArrowMaterial(MaterialID.BlueSlime, 0.22F, 0.0F, 100F); //Blue Slime - TConstructRegistry.addArrowMaterial(MaterialID.PigIron, 3.6F, 0.5F, 100F); //Pigiron + TConstructRegistry.addArrowMaterial(MaterialID.Wood, 0.69F, 1.0F); //Wood + TConstructRegistry.addArrowMaterial(MaterialID.Stone, 2.05F, 5.0F); //Stone + TConstructRegistry.addArrowMaterial(MaterialID.Iron, 3.6F, 0.5F); //Iron + TConstructRegistry.addArrowMaterial(MaterialID.Flint, 1.325F, 1.0F); //Flint + TConstructRegistry.addArrowMaterial(MaterialID.Cactus, 0.76F, 1.0F); //Cactus + TConstructRegistry.addArrowMaterial(MaterialID.Bone, 0.69F, 1.0F); //Bone + TConstructRegistry.addArrowMaterial(MaterialID.Obsidian, 2.4F, 1.0F); //Obsidian + TConstructRegistry.addArrowMaterial(MaterialID.Netherrack, 1.5F, 1.0F); //Netherrack + TConstructRegistry.addArrowMaterial(MaterialID.Slime, 0.22F, 0.0F); //Slime + TConstructRegistry.addArrowMaterial(MaterialID.Paper, 0.69F, 3.0F); //Paper + TConstructRegistry.addArrowMaterial(MaterialID.Cobalt, 3.0F, 0.25f); //Cobalt + TConstructRegistry.addArrowMaterial(MaterialID.Ardite, 1.25F, 0.25f); //Ardite + TConstructRegistry.addArrowMaterial(MaterialID.Manyullyn, 2.25F, 0.1F); //Manyullyn + TConstructRegistry.addArrowMaterial(MaterialID.Copper, 2.7F, 0.5F); //Copper + TConstructRegistry.addArrowMaterial(MaterialID.Bronze, 3.6F, 0.25f); //Bronze + TConstructRegistry.addArrowMaterial(MaterialID.Alumite, 1.1F, 0.25f); //Alumite + TConstructRegistry.addArrowMaterial(MaterialID.Steel, 3.6F, 0.25f); //Steel + TConstructRegistry.addArrowMaterial(MaterialID.BlueSlime, 0.22F, 0.0F); //Blue Slime + TConstructRegistry.addArrowMaterial(MaterialID.PigIron, 3.6F, 0.5F); //Pigiron // Arrow Shaft Materials: Material ID, crafting item, durability-medifier, mass, fragility TConstructRegistry.addCustomMaterial(ArrowShaftMaterial.createMaterial(0, Items.stick, 1.0f, 1.0f, 0.15f, 0x866526)); // wood: reference material, 10% break chance @@ -252,27 +262,28 @@ private void registerMaterials() TConstructRegistry.addCustomMaterial(ArrowShaftMaterial.createMaterial(0, TinkerTools.toolRod, MaterialID.Wood, 1.0f, 1.0f, 0.15f, 0x866526)); // wood: reference material, 10% break chance TConstructRegistry.addCustomMaterial(ArrowShaftMaterial.createMaterial(1, TinkerTools.toolRod, MaterialID.Bone, 0.95f, 1.2f, 0.01f, 0xede6bf)); // bone: heavier, but durable - // Arrow Fletching Materials: Material ID + // Arrow Fletching Materials + TConstructRegistry.addFletchingMaterial(0, 2, new ItemStack(Items.feather), new ItemStack(TinkerWeaponry.fletching, 1, 0), 100F, 0F, 0.05F, 0xffffff); // Feather + TConstructRegistry.addCustomMaterial(new FletchlingLeafMaterial(1, 2, "treeLeaves", new ItemStack(TinkerWeaponry.fletching, 1, 1), 75F, 0F, 0.2F)); // all vanilla and oredicted leaves. and all leaves in general. + TConstructRegistry.addFletchingMaterial(2, 2, new ItemStack(TinkerTools.materials, 1, 1), new ItemStack(TinkerWeaponry.fletching, 1, 2), 100F, 0F, 0.12F, 0x82c873); // Slime + TConstructRegistry.addFletchingMaterial(3, 2, new ItemStack(TinkerTools.materials, 1, 17), new ItemStack(TinkerWeaponry.fletching, 1, 3), 100F, 0F, 0.12F, 0x74c8c7); // BlueSlime + + // Bowstring Materials + TConstructRegistry.addBowstringMaterial(0, 2, new ItemStack(Items.string), new ItemStack(TinkerWeaponry.bowstring, 1, 0), 1F, 1F, 1f, 0xeeeeee); // String } private void addWeaponRecipies() { TConstructRegistry.addToolRecipe(shuriken, partShuriken, partShuriken, partShuriken, partShuriken); TConstructRegistry.addToolRecipe(throwingknife, TinkerTools.knifeBlade, TinkerTools.toolRod); - TConstructRegistry.addToolRecipe(javelin, TinkerTools.arrowhead, TinkerTools.toughRod, TinkerTools.toughRod); - - // hax - //ToolRecipe recipe = ToolBuilder.instance.recipeList.get(TinkerTools.shortbow); - //ToolBuilder.instance.recipeList.remove(TinkerTools.shortbow); - //ToolBuilder.instance.combos.remove(recipe); + TConstructRegistry.addToolRecipe(javelin, arrowhead, TinkerTools.toughRod, TinkerTools.toughRod); - // todo - TConstructRegistry.addToolRecipe(shortbow, partBowLimb, TinkerTools.bowstring, partBowLimb); - TConstructRegistry.addToolRecipe(longbow, partBowLimb, TinkerTools.bowstring, partBowLimb, TinkerTools.largePlate); - TConstructRegistry.addToolRecipe(crossbow, partCrossbowLimb, partCrossbowBody, TinkerTools.bowstring, TinkerTools.toughBinding); + TConstructRegistry.addToolRecipe(shortbow, partBowLimb, bowstring, partBowLimb); + TConstructRegistry.addToolRecipe(longbow, partBowLimb, bowstring, partBowLimb, TinkerTools.largePlate); + TConstructRegistry.addToolRecipe(crossbow, partCrossbowLimb, partCrossbowBody, bowstring, TinkerTools.toughBinding); - TConstructRegistry.addToolRecipe(arrowAmmo, TinkerTools.arrowhead, partArrowShaft, TinkerTools.fletching); - TConstructRegistry.addToolRecipe(boltAmmo, partBolt, partBolt, TinkerTools.fletching); + TConstructRegistry.addToolRecipe(arrowAmmo, arrowhead, partArrowShaft, fletching); + TConstructRegistry.addToolRecipe(boltAmmo, partBolt, partBolt, fletching); } private void registerBoltCasting() @@ -315,6 +326,7 @@ private void setupCreativeTab() compound.getCompoundTag("InfiTool").setInteger("RenderHead", 0); compound.getCompoundTag("InfiTool").setInteger("RenderHandle", 0); compound.getCompoundTag("InfiTool").setInteger("RenderAccessory", 0); + compound.getCompoundTag("InfiTool").setInteger("RenderExtra", 1); tool.setTagCompound(compound); TConstructRegistry.weaponryTab.init(tool); diff --git a/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java b/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java index 0cbd3c4cfc0..96300393455 100644 --- a/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java +++ b/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java @@ -87,20 +87,13 @@ private void registerMaterialRendering() TinkerWeaponry.boltAmmo.registerAlternatePartPaths(i, new String[]{null, null, null, acctex}); } - // todo: do properly when moving stuff into tinkers code - arrow.headStrings.clear(); - arrow.headStrings.put(TinkerTools.MaterialID.PigIron, Reference.resource(arrow.getDefaultFolder() + "/pigiron" + arrow.getIconSuffix(0))); - /* - TConstructClientRegistry.addAlternateMaterialRenderMapping(TinkerWeaponry.shuriken, 2, Reference.RESOURCE, "iron", true); - TConstructClientRegistry.addAlternateMaterialRenderMapping(TinkerWeaponry.throwingknife, 2, Reference.RESOURCE, "iron", true); - - String[] fletching = { "feather", "leaf", "slime", "blueslime" }; - for (int arrowIter = 0; arrowIter < fletching.length; arrowIter++) + // bowstring + String[] bowstringTypes = { "string", "magicfabric", "flamestring" }; + for (int bowIter = 0; bowIter < bowstringTypes.length; bowIter++) { - TConstructClientRegistry.addAlternateMaterialRenderMapping(TinkerWeaponry.throwArrow, arrowIter, "tinker", fletching[arrowIter], true); + TConstructClientRegistry.addAlternateMaterialRenderMapping(TinkerWeaponry.shortbow, bowIter, Reference.RESOURCE, bowstringTypes[bowIter], true); } - */ } private void buttons() diff --git a/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java b/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java index aae00f51946..04b4343760b 100644 --- a/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java +++ b/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java @@ -3,7 +3,6 @@ import tconstruct.TConstruct; import tconstruct.weaponry.TinkerWeaponry; import tconstruct.library.weaponry.AmmoItem; -import tconstruct.util.Reference; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -65,7 +64,7 @@ public void registerAlternatePartPaths (int index, String[] location) @Override public Item getHeadItem () { - return TinkerTools.arrowhead; + return TinkerWeaponry.arrowhead; } @Override @@ -76,7 +75,7 @@ public Item getHandleItem() { @Override public Item getAccessoryItem () { - return TinkerTools.fletching; + return TinkerWeaponry.fletching; } @Override diff --git a/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java b/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java index 297d4e7e454..5e3c4fb8bc6 100644 --- a/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java +++ b/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java @@ -6,7 +6,6 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import tconstruct.library.crafting.ToolBuilder; -import tconstruct.tools.TinkerTools; import java.util.List; @@ -67,7 +66,7 @@ public Item getHandleItem() { @Override public Item getAccessoryItem() { - return TinkerTools.fletching; + return TinkerWeaponry.fletching; } @Override diff --git a/src/main/java/tconstruct/weaponry/weapons/Crossbow.java b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java index c5bfaf2e822..3c40692c05e 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Crossbow.java +++ b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java @@ -392,7 +392,7 @@ public Item getHandleItem () @Override public Item getAccessoryItem () { - return TinkerTools.bowstring; + return TinkerWeaponry.bowstring; } @Override diff --git a/src/main/java/tconstruct/weaponry/weapons/Javelin.java b/src/main/java/tconstruct/weaponry/weapons/Javelin.java index 7b9ef448d96..20f01b50fdb 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Javelin.java +++ b/src/main/java/tconstruct/weaponry/weapons/Javelin.java @@ -1,5 +1,6 @@ package tconstruct.weaponry.weapons; +import tconstruct.weaponry.TinkerWeaponry; import tconstruct.weaponry.entity.JavelinEntity; import tconstruct.library.weaponry.AmmoWeapon; import net.minecraft.entity.Entity; @@ -146,7 +147,7 @@ public float getAmmoModifier() { @Override public Item getHeadItem() { - return TinkerTools.arrowhead; + return TinkerWeaponry.arrowhead; } @Override diff --git a/src/main/java/tconstruct/weaponry/weapons/LongBow.java b/src/main/java/tconstruct/weaponry/weapons/LongBow.java index 88ef29e5ea6..f46fac06db4 100644 --- a/src/main/java/tconstruct/weaponry/weapons/LongBow.java +++ b/src/main/java/tconstruct/weaponry/weapons/LongBow.java @@ -110,7 +110,7 @@ public Item getHeadItem () @Override public Item getHandleItem () { - return TinkerTools.bowstring; + return TinkerWeaponry.bowstring; } @Override diff --git a/src/main/java/tconstruct/weaponry/weapons/ShortBow.java b/src/main/java/tconstruct/weaponry/weapons/ShortBow.java index fa5a61d44ff..44405f17a7e 100644 --- a/src/main/java/tconstruct/weaponry/weapons/ShortBow.java +++ b/src/main/java/tconstruct/weaponry/weapons/ShortBow.java @@ -9,7 +9,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import tconstruct.tools.TinkerTools; public class ShortBow extends BowBaseAmmo { public ShortBow() { @@ -98,7 +97,7 @@ public Item getHeadItem () @Override public Item getHandleItem () { - return TinkerTools.bowstring; + return TinkerWeaponry.bowstring; } @Override From 26181dd916f9a8b3f6fced81c512caa369b6afb2 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 5 Oct 2014 22:52:12 +0200 Subject: [PATCH 007/129] Spontanously added slimeleaf fletchling --- .../items/arrow/slimeleaf_arrow_fletching.png | Bin 0 -> 230 bytes .../{leaf_fletching.png => leaf_fletching .png} | Bin .../textures/items/parts/slimeleaf_fletching.png | Bin 0 -> 312 bytes .../tconstruct/library/TConstructRegistry.java | 4 ++-- .../library/tools/FletchingMaterial.java | 11 +++++++---- .../library/tools/FletchlingLeafMaterial.java | 2 +- .../java/tconstruct/tools/items/Fletching.java | 4 ++-- .../java/tconstruct/weaponry/TinkerWeaponry.java | 8 +++++--- .../tconstruct/weaponry/WeaponryClientProxy.java | 8 ++++---- 9 files changed, 21 insertions(+), 16 deletions(-) create mode 100644 resources/assets/tinker/textures/items/arrow/slimeleaf_arrow_fletching.png rename resources/assets/tinker/textures/items/parts/{leaf_fletching.png => leaf_fletching .png} (100%) create mode 100644 resources/assets/tinker/textures/items/parts/slimeleaf_fletching.png diff --git a/resources/assets/tinker/textures/items/arrow/slimeleaf_arrow_fletching.png b/resources/assets/tinker/textures/items/arrow/slimeleaf_arrow_fletching.png new file mode 100644 index 0000000000000000000000000000000000000000..0246e41a2757d30c640916b8bf00eb56d3bd85a1 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggKE>;m`4x`JbLF&>xT^vI!PA4Zw zur5w8U~rRgR$TtbzUOa(7rXLBwgV=wR<1TYaoXG1=UZ`l$cdFd{MRV@a4mAum{n~4 z_K$y;_zb=)(+%sYzO$|S`S9@aC#{Xn$=B=c6b0M7&GRRUu=yCUol#xF#85gz{etMp S|C@j|GI+ZBxvXQL70(Y)*K0-AbW|YuPggKE>;mmMW=AXTA5cwxY+ztuQ}UjPfI#h60zdSE3MdjMg6A#Wm_vZoej!3f^JU_&+X>;PNLa7B)0zb@eY;0tlzWL)Z zCNuTL*3!!vk61~sW?W(+eV8F=Zf_EUr0Qyao%!(UCwJTY{dJR Date: Sun, 5 Oct 2014 23:14:32 +0200 Subject: [PATCH 008/129] Fix animated icon textures and deprecate old tinkers stuff --- src/main/java/tconstruct/items/tools/Arrow.java | 1 + src/main/java/tconstruct/items/tools/BowBase.java | 1 + src/main/java/tconstruct/items/tools/Shortbow.java | 1 + .../java/tconstruct/library/weaponry/ProjectileWeapon.java | 6 +++--- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/tconstruct/items/tools/Arrow.java b/src/main/java/tconstruct/items/tools/Arrow.java index a9b1cce301f..2d551aa8c52 100644 --- a/src/main/java/tconstruct/items/tools/Arrow.java +++ b/src/main/java/tconstruct/items/tools/Arrow.java @@ -14,6 +14,7 @@ import tconstruct.library.tools.ToolCore; import tconstruct.weaponry.TinkerWeaponry; +@Deprecated public class Arrow extends ToolCore { diff --git a/src/main/java/tconstruct/items/tools/BowBase.java b/src/main/java/tconstruct/items/tools/BowBase.java index 2d65129832b..7d8bf8a21fe 100644 --- a/src/main/java/tconstruct/items/tools/BowBase.java +++ b/src/main/java/tconstruct/items/tools/BowBase.java @@ -19,6 +19,7 @@ import tconstruct.tools.entity.ArrowEntity; import tconstruct.util.config.PHConstruct; +@Deprecated public abstract class BowBase extends ToolCore { public BowBase() diff --git a/src/main/java/tconstruct/items/tools/Shortbow.java b/src/main/java/tconstruct/items/tools/Shortbow.java index 6086e27831e..ee33e3e7958 100644 --- a/src/main/java/tconstruct/items/tools/Shortbow.java +++ b/src/main/java/tconstruct/items/tools/Shortbow.java @@ -14,6 +14,7 @@ import tconstruct.tools.TinkerTools; import tconstruct.weaponry.TinkerWeaponry; +@Deprecated public class Shortbow extends BowBase { public Shortbow() diff --git a/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java b/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java index 22d0a831ff8..d4a8e27ce14 100644 --- a/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java +++ b/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java @@ -245,9 +245,9 @@ public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemS switch (renderPass) { case 0: return getCorrectAnimationIcon(animationHandleIcons, tags.getInteger("RenderHandle"), progress); - case 1: return getCorrectAnimationIcon(animationHeadIcons, tags.getInteger("renderHead"), progress); - case 2: return getCorrectAnimationIcon(animationAccessoryIcons, tags.getInteger("renderAccessory"), progress); - case 3: return getCorrectAnimationIcon(animationExtraIcons, tags.getInteger("renderExtra"), progress); + case 1: return getCorrectAnimationIcon(animationHeadIcons, tags.getInteger("RenderHead"), progress); + case 2: return getCorrectAnimationIcon(animationAccessoryIcons, tags.getInteger("RenderAccessory"), progress); + case 3: return getCorrectAnimationIcon(animationExtraIcons, tags.getInteger("RenderExtra"), progress); } return emptyIcon; From 2370b0cc356af1f067d20e826cea185be5b9c71c Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 5 Oct 2014 23:14:41 +0200 Subject: [PATCH 009/129] Sounds for crossbow/arrow break! --- src/main/java/tconstruct/weaponry/entity/ArrowEntity.java | 4 +++- src/main/java/tconstruct/weaponry/weapons/Crossbow.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java b/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java index e8c8264da2c..9e52593ebb6 100644 --- a/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java +++ b/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java @@ -49,8 +49,10 @@ public void onHitBlock(MovingObjectPosition movingobjectposition) { // we might break! oh noez! float chance = returnStack.getTagCompound().getCompoundTag("InfiTool").getFloat("BreakChance"); - if(chance > TConstruct.random.nextFloat()) + if(chance > TConstruct.random.nextFloat()) { this.setDead(); + this.playSound("random.break", 1.0F, 1.5F / (this.rand.nextFloat() * 0.2F + 0.9F)); + } } @Override diff --git a/src/main/java/tconstruct/weaponry/weapons/Crossbow.java b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java index 3c40692c05e..17dec841e9a 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Crossbow.java +++ b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java @@ -296,7 +296,7 @@ public void playReloadSound(World world, EntityPlayer player, ItemStack weapon, @Override public void playFiringSound(World world, EntityPlayer player, ItemStack weapon, ItemStack ammo, float speed, float accuracy) { - // todo: THWOCK + world.playSoundAtEntity(player, "random.bow", 1.0F, 0.5F); } @Override From f3fcee2d6143a3052ca6faa726dcb7d0de9cb31d Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Mon, 6 Oct 2014 00:04:01 +0200 Subject: [PATCH 010/129] Give shurikens more slowdown. They're now really close range, and it's awesome. :D --- src/main/java/tconstruct/weaponry/entity/ArrowEntity.java | 1 + src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java b/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java index 9e52593ebb6..fc4cec36e01 100644 --- a/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java +++ b/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java @@ -33,6 +33,7 @@ protected double getStuckDepth() { @Override protected double getSlowdown() { // todo: fletchling material of arrows impact + // note: not done because fletchlings also balance amount you get now. Rather use slowdown for different projectile types return super.getSlowdown(); } diff --git a/src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java b/src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java index 4675fbf15b3..5a8a298de1a 100644 --- a/src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java +++ b/src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java @@ -52,6 +52,11 @@ protected double getGravity() { return (this.ticksExisted/8) * 0.018d; // integer division. so the first 20 ticks it will have no gravity at all. } + @Override + protected double getSlowdown() { + return 0.15f; + } + @Override protected double getStuckDepth() { return 0.8d; From 3427ed620863a5cbc29b127d6916eb1b8040d20f Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Thu, 9 Oct 2014 17:35:49 +0200 Subject: [PATCH 011/129] Redstone-Modifier for bows and similar! --- .../library/weaponry/AmmoWeapon.java | 2 +- .../library/weaponry/BowBaseAmmo.java | 5 ++ .../modifiers/tools/ModRedstone.java | 17 ++-- .../tconstruct/modifiers/tools/ModWindup.java | 82 +++++++++++++++++++ .../tconstruct/tools/gui/ToolStationGui.java | 2 +- .../tconstruct/weaponry/TinkerWeaponry.java | 6 ++ .../tconstruct/weaponry/WeaponryHandler.java | 1 + .../tconstruct/weaponry/weapons/Crossbow.java | 2 +- .../tconstruct/weaponry/weapons/LongBow.java | 5 -- .../tconstruct/weaponry/weapons/ShortBow.java | 5 -- 10 files changed, 104 insertions(+), 23 deletions(-) create mode 100644 src/main/java/tconstruct/modifiers/tools/ModWindup.java diff --git a/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java b/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java index 24eb1e65f87..a111116b096 100644 --- a/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java +++ b/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java @@ -88,7 +88,7 @@ public float getAccuracy(ItemStack itemStack, EntityPlayer player) @Override public String[] getTraits() { - return new String[] {"weapon", "throwing", "ammo"}; + return new String[] {"weapon", "throwing", "ammo", "windup"}; } @Override diff --git a/src/main/java/tconstruct/library/weaponry/BowBaseAmmo.java b/src/main/java/tconstruct/library/weaponry/BowBaseAmmo.java index 142dffbf2c3..864f62a1ac0 100644 --- a/src/main/java/tconstruct/library/weaponry/BowBaseAmmo.java +++ b/src/main/java/tconstruct/library/weaponry/BowBaseAmmo.java @@ -157,4 +157,9 @@ protected int getDefaultColor(int renderPass, int materialID) { return super.getDefaultColor(renderPass, materialID); } + + @Override + public String[] getTraits() { + return new String[] {"weapon", "ranged", "bow", "windup"}; + } } diff --git a/src/main/java/tconstruct/modifiers/tools/ModRedstone.java b/src/main/java/tconstruct/modifiers/tools/ModRedstone.java index 63782062659..b40861f9b28 100644 --- a/src/main/java/tconstruct/modifiers/tools/ModRedstone.java +++ b/src/main/java/tconstruct/modifiers/tools/ModRedstone.java @@ -8,8 +8,8 @@ public class ModRedstone extends ItemModTypeFilter { - String tooltipName; - int max = 50; + public String tooltipName; + public int max = 50; public ModRedstone(int effect, ItemStack[] items, int[] values) { @@ -111,13 +111,6 @@ public void modify (ItemStack[] input, ItemStack tool) tags.setInteger(type[i], speed); } } - - if (tags.hasKey("DrawSpeed")) - { - int baseDrawSpeed = tags.getInteger("BaseDrawSpeed"); - int drawSpeed = (int) (baseDrawSpeed - (0.1f * baseDrawSpeed * (keyPair[0] / 50f))); - tags.setInteger("DrawSpeed", drawSpeed); - } } void updateModTag (ItemStack tool, int[] keys) @@ -136,6 +129,10 @@ public boolean validType (IModifyable input) public boolean validType (ToolCore tool) { List list = Arrays.asList(tool.getTraits()); - return list.contains("harvest") || list.contains("utility") || list.contains("bow"); + + // handled by the windup modifier + if(list.contains("windup")) + return false; + return list.contains("harvest") || list.contains("utility"); } } diff --git a/src/main/java/tconstruct/modifiers/tools/ModWindup.java b/src/main/java/tconstruct/modifiers/tools/ModWindup.java new file mode 100644 index 00000000000..3a5ca3314e9 --- /dev/null +++ b/src/main/java/tconstruct/modifiers/tools/ModWindup.java @@ -0,0 +1,82 @@ +package tconstruct.modifiers.tools; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import tconstruct.library.tools.ToolCore; + +import java.util.Arrays; +import java.util.List; + +public class ModWindup extends ModRedstone { + public ModWindup(int effect, ItemStack[] items, int[] values) { + super(effect, items, values); + } + + public boolean validType (ToolCore tool) + { + List list = Arrays.asList(tool.getTraits()); + return list.contains("windup"); + } + + @Override + protected boolean canModify(ItemStack tool, ItemStack[] input) { + if(!super.canModify(tool, input)) + return false; + + float drawSSpeed = tool.getTagCompound().getCompoundTag("InfiTool").getFloat("DrawSpeed"); + return drawSSpeed > 0.25f * 20f; // can't get below 1/4s + } + + @Override + public void modify (ItemStack[] input, ItemStack tool) + { + NBTTagCompound tags = tool.getTagCompound().getCompoundTag("InfiTool"); + int[] keyPair; + int increase = matchingAmount(input); + int current = 0; + if (tags.hasKey(key)) + { + keyPair = tags.getIntArray(key); + if (keyPair[0] % max == 0) + { + keyPair[0] += increase; + keyPair[1] += max; + tags.setIntArray(key, keyPair); + + int modifiers = tags.getInteger("Modifiers"); + modifiers -= 1; + tags.setInteger("Modifiers", modifiers); + } + else + { + keyPair[0] += increase; + tags.setIntArray(key, keyPair); + } + current = keyPair[0]; + updateModTag(tool, keyPair); + } + else + { + int modifiers = tags.getInteger("Modifiers"); + modifiers -= 1; + tags.setInteger("Modifiers", modifiers); + String modName = "\u00a74Redstone (" + increase + "/" + max + ")"; + int tooltipIndex = addToolTip(tool, tooltipName, modName); + keyPair = new int[] { increase, max, tooltipIndex }; + current = keyPair[0]; + tags.setIntArray(key, keyPair); + } + + // 0.005 reduction per second, numbers are in ticks -> 0.10 == 0.005s + float boost = 0.10f * current; + // with added bonus for multiple modifiers of redstone + // so every 50 redstone you get a bonus speed + for(int i = 0; i < current/50; i++) + boost += 2.0f; + + int baseDrawSpeed = tags.getInteger("BaseDrawSpeed"); + int drawSpeed = baseDrawSpeed - (int)boost; + tags.setInteger("DrawSpeed", drawSpeed); + } +} diff --git a/src/main/java/tconstruct/tools/gui/ToolStationGui.java b/src/main/java/tconstruct/tools/gui/ToolStationGui.java index f7770bd259e..763f9c554ac 100644 --- a/src/main/java/tconstruct/tools/gui/ToolStationGui.java +++ b/src/main/java/tconstruct/tools/gui/ToolStationGui.java @@ -265,7 +265,7 @@ protected void drawModularToolStats (ItemStack stack, ToolCore tool, NBTTagCompo df.setRoundingMode(RoundingMode.DOWN); int drawSpeed = tags.getInteger("DrawSpeed"); float flightSpeed = tags.getFloat("FlightSpeed"); - float trueDraw = drawSpeed / 20f * flightSpeed; + float trueDraw = drawSpeed / 20f; this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation6") + df.format(trueDraw) + "s", x, base + offset * 10, 0xffffff); offset++; this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation7") + df.format(flightSpeed) + "x", x, base + offset * 10, 0xffffff); diff --git a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java index 95a2fbf973e..c8f3624b51e 100644 --- a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java +++ b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java @@ -8,6 +8,7 @@ import cpw.mods.fml.common.registry.GameRegistry; import mantle.pulsar.pulse.Handler; import mantle.pulsar.pulse.Pulse; +import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -23,6 +24,7 @@ import tconstruct.library.tools.FletchlingLeafMaterial; import tconstruct.library.util.IPattern; import tconstruct.library.util.IToolPart; +import tconstruct.modifiers.tools.ModWindup; import tconstruct.smeltery.TinkerSmeltery; import tconstruct.tools.TinkerTools; import tconstruct.tools.items.Bowstring; @@ -96,6 +98,10 @@ public void init(FMLInitializationEvent event) addWeaponRecipies(); registerBoltCasting(); setupCreativeTab(); + + ItemStack redstoneItem = new ItemStack(Items.redstone); + ItemStack redstoneBlock = new ItemStack(Blocks.redstone_block); + ModifyBuilder.registerModifier(new ModWindup(2, new ItemStack[] { redstoneItem, redstoneBlock }, new int[] { 1, 9 })); } @Handler diff --git a/src/main/java/tconstruct/weaponry/WeaponryHandler.java b/src/main/java/tconstruct/weaponry/WeaponryHandler.java index 219a3b9fa38..f812a99cc3c 100644 --- a/src/main/java/tconstruct/weaponry/WeaponryHandler.java +++ b/src/main/java/tconstruct/weaponry/WeaponryHandler.java @@ -137,6 +137,7 @@ else if(event.tool instanceof Crossbow) }*/ tags.setInteger("DrawSpeed", drawSpeed); + tags.setInteger("BaseDrawSpeed", drawSpeed); // used to calculate correct speed increase with redstone modifier tags.setFloat("FlightSpeed", flightSpeed); } diff --git a/src/main/java/tconstruct/weaponry/weapons/Crossbow.java b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java index 17dec841e9a..2508642fb5a 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Crossbow.java +++ b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java @@ -402,7 +402,7 @@ public Item getExtraItem() { @Override public String[] getTraits() { - return new String[] {"weapon", "ranged", "crossbow"}; + return new String[] {"weapon", "ranged", "crossbow", "windup"}; } diff --git a/src/main/java/tconstruct/weaponry/weapons/LongBow.java b/src/main/java/tconstruct/weaponry/weapons/LongBow.java index f46fac06db4..98aaf2d53dd 100644 --- a/src/main/java/tconstruct/weaponry/weapons/LongBow.java +++ b/src/main/java/tconstruct/weaponry/weapons/LongBow.java @@ -123,9 +123,4 @@ public Item getAccessoryItem () public Item getExtraItem() { return TinkerTools.largePlate; } - - @Override - public String[] getTraits() { - return new String[] {"weapon", "ranged", "bow"}; - } } diff --git a/src/main/java/tconstruct/weaponry/weapons/ShortBow.java b/src/main/java/tconstruct/weaponry/weapons/ShortBow.java index 44405f17a7e..8716c80e6e3 100644 --- a/src/main/java/tconstruct/weaponry/weapons/ShortBow.java +++ b/src/main/java/tconstruct/weaponry/weapons/ShortBow.java @@ -105,9 +105,4 @@ public Item getAccessoryItem () { return TinkerWeaponry.partBowLimb; } - - @Override - public String[] getTraits() { - return new String[] {"weapon", "ranged", "bow"}; - } } From ca786eb2edc50602f019acc2184aab0866d28636 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Thu, 9 Oct 2014 18:11:06 +0200 Subject: [PATCH 012/129] Animated effects are back! --- .../tconstruct/library/tools/ToolCore.java | 40 ++---------- .../library/weaponry/ProjectileWeapon.java | 62 ++++++++++++++++--- 2 files changed, 59 insertions(+), 43 deletions(-) diff --git a/src/main/java/tconstruct/library/tools/ToolCore.java b/src/main/java/tconstruct/library/tools/ToolCore.java index 996d1106cec..61c824f965d 100644 --- a/src/main/java/tconstruct/library/tools/ToolCore.java +++ b/src/main/java/tconstruct/library/tools/ToolCore.java @@ -269,43 +269,11 @@ else if (renderPass == 3) return getCorrectIcon(extraIcons, tags.getInteger("RenderExtra")); } // Effects - else + else if (renderPass <= 10) { - if (renderPass == getPartAmount()) - { - if (tags.hasKey("Effect1")) - return (effectIcons.get(tags.getInteger("Effect1"))); - } - - else if (renderPass == getPartAmount() + 1) - { - if (tags.hasKey("Effect2")) - return (effectIcons.get(tags.getInteger("Effect2"))); - } - - else if (renderPass == getPartAmount() + 2) - { - if (tags.hasKey("Effect3")) - return (effectIcons.get(tags.getInteger("Effect3"))); - } - - else if (renderPass == getPartAmount() + 3) - { - if (tags.hasKey("Effect4")) - return (effectIcons.get(tags.getInteger("Effect4"))); - } - - else if (renderPass == getPartAmount() + 4) - { - if (tags.hasKey("Effect5")) - return (effectIcons.get(tags.getInteger("Effect5"))); - } - - else if (renderPass == getPartAmount() + 5) - { - if (tags.hasKey("Effect6")) - return (effectIcons.get(tags.getInteger("Effect6"))); - } + String effect = "Effect" + (1 + renderPass - getPartAmount()); + if(tags.hasKey(effect)) + return effectIcons.get(tags.getInteger(effect)); } return blankSprite; } diff --git a/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java b/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java index d4a8e27ce14..39a81a67607 100644 --- a/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java +++ b/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java @@ -209,6 +209,7 @@ public void onPlayerStoppedUsing (ItemStack weapon, World world, EntityPlayer pl public HashMap animationHandleIcons = new HashMap(); public HashMap animationAccessoryIcons = new HashMap(); public HashMap animationExtraIcons = new HashMap(); + public HashMap animationEffectIcons = new HashMap(); // todo: animated effects @@ -226,18 +227,31 @@ protected boolean animateLayer(int renderPass) @Override public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) { - // animate? - if(!animateLayer(renderPass)) + NBTTagCompound tags = stack.getTagCompound().getCompoundTag("InfiTool"); + + if(tags == null || renderPass > 10) return super.getIcon(stack, renderPass, player, usingItem, useRemaining); - if(usingItem == null || stack != usingItem || !stack.hasTagCompound()) + // are we drawing an effect? + if(renderPass >= getPartAmount()) { + // is the effect animated? + String effect = "Effect" + (1 + renderPass - getPartAmount()); + if(tags.hasKey(effect)) { + int index = tags.getInteger(effect); + if(animationEffectIcons.get(index) != null) + return getCorrectAnimationIcon(animationEffectIcons, index, getWindupProgress(usingItem, getMaxItemUseDuration(usingItem) - useRemaining)); + else + // non-animated + return effectIcons.get(index); + } return super.getIcon(stack, renderPass, player, usingItem, useRemaining); + } - NBTTagCompound tags = stack.getTagCompound().getCompoundTag("InfiTool"); + // animate? + if(!animateLayer(renderPass)) + return super.getIcon(stack, renderPass, player, usingItem, useRemaining); - // effects aren't animated - // todo: make effects animated - if(renderPass >= getPartAmount() || tags == null) + if(usingItem == null || stack != usingItem || !stack.hasTagCompound()) return super.getIcon(stack, renderPass, player, usingItem, useRemaining); float progress = getWindupProgress(usingItem, getMaxItemUseDuration(usingItem) - useRemaining); @@ -274,6 +288,40 @@ public void registerIcons(IIconRegister iconRegister) { addAnimationIcons(handleStrings, animationHandleIcons, iconRegister, getIconSuffix(2)); addAnimationIcons(accessoryStrings, animationAccessoryIcons, iconRegister, getIconSuffix(3)); addAnimationIcons(extraStrings, animationExtraIcons, iconRegister, getIconSuffix(4)); + + // animated effects... + // find out the longest animation + int count = 0; + if(animationHeadIcons.get(-1) != null) + count = Math.max(count, animationHeadIcons.get(-1).length); + if(animationHandleIcons.get(-1) != null) + count = Math.max(count, animationHandleIcons.get(-1).length); + if(animationAccessoryIcons.get(-1) != null) + count = Math.max(count, animationAccessoryIcons.get(-1).length); + if(animationExtraIcons.get(-1) != null) + count = Math.max(count, animationExtraIcons.get(-1).length); + + + for(Map.Entry entry : effectStrings.entrySet()) + { + IIcon[] anims = new IIcon[count]; + boolean empty = true; + for(int i = 0; i < count; i++) { + String tex = entry.getValue() + "_" + (i+1); + if (TextureHelper.itemTextureExists(tex)) { + anims[i] = iconRegister.registerIcon(tex); + empty = false; + } + } + if(!empty) + animationEffectIcons.put(entry.getKey(), anims); + } + + // default for effects is blank + IIcon[] anims = new IIcon[count]; + for(int i = 0; i < count; i++) + anims[i] = blankSprite; + animationEffectIcons.put(-1, anims); } private void addAnimationIcons(HashMap textures, HashMap icons, IIconRegister iconRegister, String standard) From 94deae82928dfb0ea60c61fb48e15247b84a869d Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Thu, 9 Oct 2014 18:24:04 +0200 Subject: [PATCH 013/129] Less obstrusive redstone bow effect :I --- .../items/shortbow/redstone_bow_effect.png | Bin 88 -> 153 bytes .../items/shortbow/redstone_bow_effect_1.png | Bin 105 -> 188 bytes .../items/shortbow/redstone_bow_effect_2.png | Bin 99 -> 163 bytes .../items/shortbow/redstone_bow_effect_3.png | Bin 106 -> 165 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/assets/tinker/textures/items/shortbow/redstone_bow_effect.png b/resources/assets/tinker/textures/items/shortbow/redstone_bow_effect.png index ab1281dce13ed619911eba2be206c28a107c14d6..8c933a6d72389bc3ce3ff3a6f7f4a1f934d16def 100644 GIT binary patch delta 123 zcma!;$v8o!l(9I--HBn{IhmIX3=C{Z-tI08ML-rqRUpR&AjMhW5n0T@z%2~Ij105p zNB{-dOFVsD+3#_23WysqX?@!S6q59GaSX9Iotz-C^MO6{;s1&&Dn)wKgk~`^h^TXa UeH;^^1XRS}>FVdQ&MBb@08Qo~BLDyZ delta 58 zcmbQq7%@S`MBdZIF{I*Fa)JbFO5=Zr5SC?bru|vVTGIp;coP0o1^Je|4cehSGz-GR(PclgK-e;z-sgnAP8ggAggBUzr{an^L HB{Ts5i{3P3 delta 75 zcmdnPm^nek)xgumF{I*Fa)QLo1s#nK?QhO%wE90em%()w`?YV1uSzDkb(x4yTwIxu f)4DV_$drlU7qh|l74w46F#v(5tDnm{r-UW|+F&1G diff --git a/resources/assets/tinker/textures/items/shortbow/redstone_bow_effect_2.png b/resources/assets/tinker/textures/items/shortbow/redstone_bow_effect_2.png index 20dc025284ca7e0eb15665ed8d2da2a4e0a07361..166995a830965e2fd0bb0ce515e76c340035a807 100644 GIT binary patch delta 133 zcmYdZ%s4@%p0PN{-HBn{IhmIX3=C{Z-tI08ML-rqRUpR&AjMhW5n0T@z%2~Ij105p zNB{-dOFVsD+3#_23W%%ce;0}b3MqTKIEGl9PEL?uO=Z eky0|(H8fbZ>p g9-jX%#X=d37IXegjaQ5YYGCkm^>bP0#FWqk08+aq2mk;8 delta 76 zcmZ3=m^DGg&Ct`uF{I*Fa)Jb_NTU*4+y9howpV}b3)pzpymh|wUnQF@)8Uv)w%fIa go=(4cOEMT3rY|~y85}Sb4q9e0CA}uwg3PC From a3d699409f66436013b95691c5098ad3c4dd08bd Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Thu, 9 Oct 2014 18:40:15 +0200 Subject: [PATCH 014/129] Remove duplicate non-animated effect graphics --- .../items/shortbow/beheading_bow_effect_1.png | Bin 148 -> 0 bytes .../items/shortbow/beheading_bow_effect_2.png | Bin 148 -> 0 bytes .../items/shortbow/beheading_bow_effect_3.png | Bin 148 -> 0 bytes .../items/shortbow/diamond_bow_effect_1.png | Bin 107 -> 0 bytes .../items/shortbow/diamond_bow_effect_2.png | Bin 107 -> 0 bytes .../items/shortbow/diamond_bow_effect_3.png | Bin 107 -> 0 bytes .../items/shortbow/emerald_bow_effect_1.png | Bin 109 -> 0 bytes .../items/shortbow/emerald_bow_effect_2.png | Bin 109 -> 0 bytes .../items/shortbow/emerald_bow_effect_3.png | Bin 109 -> 0 bytes .../items/shortbow/flux_bow_effect_1.png | Bin 1207 -> 0 bytes .../items/shortbow/flux_bow_effect_2.png | Bin 1207 -> 0 bytes .../items/shortbow/flux_bow_effect_3.png | Bin 1207 -> 0 bytes .../items/shortbow/lava_bow_effect_1.png | Bin 112 -> 0 bytes .../items/shortbow/lava_bow_effect_2.png | Bin 119 -> 0 bytes .../items/shortbow/lava_bow_effect_3.png | Bin 119 -> 0 bytes .../items/shortbow/necrotic_bow_effect_1.png | Bin 117 -> 0 bytes .../items/shortbow/necrotic_bow_effect_2.png | Bin 117 -> 0 bytes .../items/shortbow/necrotic_bow_effect_3.png | Bin 117 -> 0 bytes .../items/shortbow/piston_bow_effect_1.png | Bin 160 -> 0 bytes .../items/shortbow/piston_bow_effect_2.png | Bin 160 -> 0 bytes .../items/shortbow/piston_bow_effect_3.png | Bin 160 -> 0 bytes .../items/shortbow/reinforced_bow_effect_1.png | Bin 106 -> 0 bytes .../items/shortbow/reinforced_bow_effect_2.png | Bin 106 -> 0 bytes .../items/shortbow/reinforced_bow_effect_3.png | Bin 106 -> 0 bytes .../items/shortbow/smite_bow_effect_1.png | Bin 148 -> 0 bytes .../items/shortbow/smite_bow_effect_2.png | Bin 148 -> 0 bytes .../items/shortbow/smite_bow_effect_3.png | Bin 148 -> 0 bytes 27 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 resources/assets/tinker/textures/items/shortbow/beheading_bow_effect_1.png delete mode 100644 resources/assets/tinker/textures/items/shortbow/beheading_bow_effect_2.png delete mode 100644 resources/assets/tinker/textures/items/shortbow/beheading_bow_effect_3.png delete mode 100644 resources/assets/tinker/textures/items/shortbow/diamond_bow_effect_1.png delete mode 100644 resources/assets/tinker/textures/items/shortbow/diamond_bow_effect_2.png delete mode 100644 resources/assets/tinker/textures/items/shortbow/diamond_bow_effect_3.png delete mode 100644 resources/assets/tinker/textures/items/shortbow/emerald_bow_effect_1.png delete mode 100644 resources/assets/tinker/textures/items/shortbow/emerald_bow_effect_2.png delete mode 100644 resources/assets/tinker/textures/items/shortbow/emerald_bow_effect_3.png delete mode 100644 resources/assets/tinker/textures/items/shortbow/flux_bow_effect_1.png delete mode 100644 resources/assets/tinker/textures/items/shortbow/flux_bow_effect_2.png delete mode 100644 resources/assets/tinker/textures/items/shortbow/flux_bow_effect_3.png delete mode 100644 resources/assets/tinker/textures/items/shortbow/lava_bow_effect_1.png delete mode 100644 resources/assets/tinker/textures/items/shortbow/lava_bow_effect_2.png delete mode 100644 resources/assets/tinker/textures/items/shortbow/lava_bow_effect_3.png delete mode 100644 resources/assets/tinker/textures/items/shortbow/necrotic_bow_effect_1.png delete mode 100644 resources/assets/tinker/textures/items/shortbow/necrotic_bow_effect_2.png delete mode 100644 resources/assets/tinker/textures/items/shortbow/necrotic_bow_effect_3.png delete mode 100644 resources/assets/tinker/textures/items/shortbow/piston_bow_effect_1.png delete mode 100644 resources/assets/tinker/textures/items/shortbow/piston_bow_effect_2.png delete mode 100644 resources/assets/tinker/textures/items/shortbow/piston_bow_effect_3.png delete mode 100644 resources/assets/tinker/textures/items/shortbow/reinforced_bow_effect_1.png delete mode 100644 resources/assets/tinker/textures/items/shortbow/reinforced_bow_effect_2.png delete mode 100644 resources/assets/tinker/textures/items/shortbow/reinforced_bow_effect_3.png delete mode 100644 resources/assets/tinker/textures/items/shortbow/smite_bow_effect_1.png delete mode 100644 resources/assets/tinker/textures/items/shortbow/smite_bow_effect_2.png delete mode 100644 resources/assets/tinker/textures/items/shortbow/smite_bow_effect_3.png diff --git a/resources/assets/tinker/textures/items/shortbow/beheading_bow_effect_1.png b/resources/assets/tinker/textures/items/shortbow/beheading_bow_effect_1.png deleted file mode 100644 index 440a43069fe9851cabaf7173e34ebaa106f875af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(Vi}jAr-fh6C9Y`X4(CBoY5G< zaCyh#NB{qyS`fQLvT4o4l(PoR3A2)8exKYfyF{|3@(k~R87j9E6B#bu`26%@{mWN5 xmv|aCI?i&KwX=3^hdG1ngeR?m23!pc4AL)rgS6hRTnw~^!PC{xWt~$(69C)0IZyxq diff --git a/resources/assets/tinker/textures/items/shortbow/beheading_bow_effect_2.png b/resources/assets/tinker/textures/items/shortbow/beheading_bow_effect_2.png deleted file mode 100644 index 440a43069fe9851cabaf7173e34ebaa106f875af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(Vi}jAr-fh6C9Y`X4(CBoY5G< zaCyh#NB{qyS`fQLvT4o4l(PoR3A2)8exKYfyF{|3@(k~R87j9E6B#bu`26%@{mWN5 xmv|aCI?i&KwX=3^hdG1ngeR?m23!pc4AL)rgS6hRTnw~^!PC{xWt~$(69C)0IZyxq diff --git a/resources/assets/tinker/textures/items/shortbow/beheading_bow_effect_3.png b/resources/assets/tinker/textures/items/shortbow/beheading_bow_effect_3.png deleted file mode 100644 index 440a43069fe9851cabaf7173e34ebaa106f875af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(Vi}jAr-fh6C9Y`X4(CBoY5G< zaCyh#NB{qyS`fQLvT4o4l(PoR3A2)8exKYfyF{|3@(k~R87j9E6B#bu`26%@{mWN5 xmv|aCI?i&KwX=3^hdG1ngeR?m23!pc4AL)rgS6hRTnw~^!PC{xWt~$(69C)0IZyxq diff --git a/resources/assets/tinker/textures/items/shortbow/diamond_bow_effect_1.png b/resources/assets/tinker/textures/items/shortbow/diamond_bow_effect_1.png deleted file mode 100644 index 8e818f54021bf993a5b131f763332a18d01bd999..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`MxHK?Ar-fh6D0OEoWJ+Ro@4Ub zn?Jt3{D15C^*`#-n}02fT(Y}C>8t^>!#TCv?-wT=VPd$^rjU6jP9_$po59o7&t;uc GLK6Tx%qRf> diff --git a/resources/assets/tinker/textures/items/shortbow/diamond_bow_effect_2.png b/resources/assets/tinker/textures/items/shortbow/diamond_bow_effect_2.png deleted file mode 100644 index 8e818f54021bf993a5b131f763332a18d01bd999..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`MxHK?Ar-fh6D0OEoWJ+Ro@4Ub zn?Jt3{D15C^*`#-n}02fT(Y}C>8t^>!#TCv?-wT=VPd$^rjU6jP9_$po59o7&t;uc GLK6Tx%qRf> diff --git a/resources/assets/tinker/textures/items/shortbow/diamond_bow_effect_3.png b/resources/assets/tinker/textures/items/shortbow/diamond_bow_effect_3.png deleted file mode 100644 index 8e818f54021bf993a5b131f763332a18d01bd999..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`MxHK?Ar-fh6D0OEoWJ+Ro@4Ub zn?Jt3{D15C^*`#-n}02fT(Y}C>8t^>!#TCv?-wT=VPd$^rjU6jP9_$po59o7&t;uc GLK6Tx%qRf> diff --git a/resources/assets/tinker/textures/items/shortbow/emerald_bow_effect_1.png b/resources/assets/tinker/textures/items/shortbow/emerald_bow_effect_1.png deleted file mode 100644 index fedf64cbedec6a0254325010d9113569d41bf748..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`CY~;iAr-fh6C{=?%y?)oGkNjN zkHx3!+m5oONHAR8^ZNhP|2%IuJ&|PCHdE)U$nRQ_o)iWKkudqa;;gK9fchCcUHx3v IIVCg!0K(lP=>Px# diff --git a/resources/assets/tinker/textures/items/shortbow/emerald_bow_effect_2.png b/resources/assets/tinker/textures/items/shortbow/emerald_bow_effect_2.png deleted file mode 100644 index fedf64cbedec6a0254325010d9113569d41bf748..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`CY~;iAr-fh6C{=?%y?)oGkNjN zkHx3!+m5oONHAR8^ZNhP|2%IuJ&|PCHdE)U$nRQ_o)iWKkudqa;;gK9fchCcUHx3v IIVCg!0K(lP=>Px# diff --git a/resources/assets/tinker/textures/items/shortbow/emerald_bow_effect_3.png b/resources/assets/tinker/textures/items/shortbow/emerald_bow_effect_3.png deleted file mode 100644 index fedf64cbedec6a0254325010d9113569d41bf748..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`CY~;iAr-fh6C{=?%y?)oGkNjN zkHx3!+m5oONHAR8^ZNhP|2%IuJ&|PCHdE)U$nRQ_o)iWKkudqa;;gK9fchCcUHx3v IIVCg!0K(lP=>Px# diff --git a/resources/assets/tinker/textures/items/shortbow/flux_bow_effect_1.png b/resources/assets/tinker/textures/items/shortbow/flux_bow_effect_1.png deleted file mode 100644 index 90f36e86b55d35a71080435881a47357593b81d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)0nbnGDT&%Z_gcif|Tq zL>4nJa0`PlBg3pY5H=O_Pg9Xtm=}_#XoNY3dv@MM3gw^=jNv7l>oU649-QV zi6yBi3gww484B*6z5ywEsq734EYhAXjv*F;i~=n0e}fecZGsV-^Iz^t`VSI+@#Hpx ze$rvAYOv`8i-9!%ezxcTe@)H*3-t8GgLWmtRp zGQ+R!c=a=&7yxoI1H&?~nT7@YV9jZ(8Sr`mLlWlXliLq75Ymk7`cd}C4uNbJJq>}> Rcc3DM!PC{xWt~$(69E3GRcZhL diff --git a/resources/assets/tinker/textures/items/shortbow/flux_bow_effect_2.png b/resources/assets/tinker/textures/items/shortbow/flux_bow_effect_2.png deleted file mode 100644 index f0e6a6609d5efbc6e46ab345a7dc67f49752b4ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)0nbnGDT&%Z_gcif|Tq zL>4nJa0`PlBg3pY5H=O_Pg9Xtm-QJ>-R4Q3dv@MM3gw^=jNv7l>oU649-QV zi6yBi3gww484B*6z5ywEsq734EYhAXjv*F;i~=n0e}fecZGsV-^Iz^t`VSI+@#Hpx ze$rvAYOv`8i-9!%ezxcTe@)H*3-t8GgLWmtRp zGQ+R!c=a=&7yxoI1H&?~nT7@YV9jZ(8Sr`mLlWlXliLq75Ymk7`cd}C4uNbJJq>}> Rcc3DM!PC{xWt~$(696IaRdN6T diff --git a/resources/assets/tinker/textures/items/shortbow/flux_bow_effect_3.png b/resources/assets/tinker/textures/items/shortbow/flux_bow_effect_3.png deleted file mode 100644 index dd15a505655f9fa9240e4c406b58ce8720beb6e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)0nbnGDT&%Z_gcif|Tq zL>4nJa0`PlBg3pY5H=O_Pg9Xtm>v$&(9A93dv@MM3gw^=jNv7l>oU649-QV zi6yBi3gww484B*6z5ywEsq734EYhAXjv*F;i~=n0e}fecZGsV-^Iz^t`VSI+@#Hpx ze$rvAYOv`8i-9!%ezxcTe@)H*3-t8GgLWmtRp zGQ+R!c=a=&7yxoI1H&?~nT7@YV9jZ(8Sr`mLlWlXliLq75Ymk7`cd}C4uNbJJq>}> Rcc3DM!PC{xWt~$(6972IRd)aY diff --git a/resources/assets/tinker/textures/items/shortbow/lava_bow_effect_1.png b/resources/assets/tinker/textures/items/shortbow/lava_bow_effect_1.png deleted file mode 100644 index d45a0fe07cd215964d62399ae30f8f559b86518e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar-fh6Bd|SoIdbDzU}0t zAL)t$lNbLyFRzuMc6vYaV#z#)rL#Qw3`CeuT;(xtNEG3bVPKfK#5Qw@np+vr2nJ7A KKbLh*2~7ab5F!Bp diff --git a/resources/assets/tinker/textures/items/shortbow/lava_bow_effect_2.png b/resources/assets/tinker/textures/items/shortbow/lava_bow_effect_2.png deleted file mode 100644 index 5650ccbec6726d87e1aa73cb71444148aa956250..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`cAhSdAr-fh6Bd|SoIdbDUUKr9 zkLR5f(i##bnf(9Re8FeagJ&-xU`> Q1)0R)>FVdQ&MBb@0Dz<@gJ&-xU`> Q1)0R)>FVdQ&MBb@0Dz<@RJMQ|j?kEm^^B4+SRXILDqlqA9G!pu-;RJMQ|j?kEm^^B4+SRXILDqlqA9G!pu-;RJMQ|j?kEm^^B4+SRXILDqlqA9G!pu-;7Fi*Ar-fh6B?S%2s}1UKR@s9 zc?Uj*%zMVlFZWNJC@3*`O=VrTenfIy+`a!NPIz46VYHN9l6Yx}=l|%asDI+3qJRB8 zJr&OiOn9UjyzEbYM#hi(H*R?BGEZom@TMlG&7h|#&;V%bNjIz1++|^xfL1biy85}S Ib4q9e04$X}(*OVf diff --git a/resources/assets/tinker/textures/items/shortbow/piston_bow_effect_2.png b/resources/assets/tinker/textures/items/shortbow/piston_bow_effect_2.png deleted file mode 100644 index cfaee27fd555fee4951c746b5cc82daabd503fbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>7Fi*Ar-fh6B?S%2s}1UKR@s9 zc?Uj*%zMVlFZWNJC@3*`O=VrTenfIy+`a!NPIz46VYHN9l6Yx}=l|%asDI+3qJRB8 zJr&OiOn9UjyzEbYM#hi(H*R?BGEZom@TMlG&7h|#&;V%bNjIz1++|^xfL1biy85}S Ib4q9e04$X}(*OVf diff --git a/resources/assets/tinker/textures/items/shortbow/piston_bow_effect_3.png b/resources/assets/tinker/textures/items/shortbow/piston_bow_effect_3.png deleted file mode 100644 index cfaee27fd555fee4951c746b5cc82daabd503fbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>7Fi*Ar-fh6B?S%2s}1UKR@s9 zc?Uj*%zMVlFZWNJC@3*`O=VrTenfIy+`a!NPIz46VYHN9l6Yx}=l|%asDI+3qJRB8 zJr&OiOn9UjyzEbYM#hi(H*R?BGEZom@TMlG&7h|#&;V%bNjIz1++|^xfL1biy85}S Ib4q9e04$X}(*OVf diff --git a/resources/assets/tinker/textures/items/shortbow/reinforced_bow_effect_1.png b/resources/assets/tinker/textures/items/shortbow/reinforced_bow_effect_1.png deleted file mode 100644 index 96767628b3f1e0bc0f78b1a7b50c74083175b3fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`hMq2tAr-fh6C~yx@VNZko@esX z%D8{G|4((??P1OkS=^ItU&(gBWO6Qp>pyu`WibYZdls5i+alLq0cvLOboFyt=akR{ E00L4V@Bjb+ diff --git a/resources/assets/tinker/textures/items/shortbow/reinforced_bow_effect_2.png b/resources/assets/tinker/textures/items/shortbow/reinforced_bow_effect_2.png deleted file mode 100644 index 96767628b3f1e0bc0f78b1a7b50c74083175b3fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`hMq2tAr-fh6C~yx@VNZko@esX z%D8{G|4((??P1OkS=^ItU&(gBWO6Qp>pyu`WibYZdls5i+alLq0cvLOboFyt=akR{ E00L4V@Bjb+ diff --git a/resources/assets/tinker/textures/items/shortbow/reinforced_bow_effect_3.png b/resources/assets/tinker/textures/items/shortbow/reinforced_bow_effect_3.png deleted file mode 100644 index 96767628b3f1e0bc0f78b1a7b50c74083175b3fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`hMq2tAr-fh6C~yx@VNZko@esX z%D8{G|4((??P1OkS=^ItU&(gBWO6Qp>pyu`WibYZdls5i+alLq0cvLOboFyt=akR{ E00L4V@Bjb+ diff --git a/resources/assets/tinker/textures/items/shortbow/smite_bow_effect_1.png b/resources/assets/tinker/textures/items/shortbow/smite_bow_effect_1.png deleted file mode 100644 index 5f771c694aa7b99ed03e3e5ae7b9ff1e61353212..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(Vi}jAr-fh6BeiiOn>}yz2^DP z@qTkY+n=1}D79Dj$iMa*-v9i+PW-K}ee9!rih}2?iAR;@F6}61J#kVlZPEXe->gsU yeCQYSUz6{EihkrL-i;T8{+u`9a$}sy!0=|7^p>5~i;n=UVeoYIb6Mw<&;$T`mph&S diff --git a/resources/assets/tinker/textures/items/shortbow/smite_bow_effect_2.png b/resources/assets/tinker/textures/items/shortbow/smite_bow_effect_2.png deleted file mode 100644 index 5f771c694aa7b99ed03e3e5ae7b9ff1e61353212..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(Vi}jAr-fh6BeiiOn>}yz2^DP z@qTkY+n=1}D79Dj$iMa*-v9i+PW-K}ee9!rih}2?iAR;@F6}61J#kVlZPEXe->gsU yeCQYSUz6{EihkrL-i;T8{+u`9a$}sy!0=|7^p>5~i;n=UVeoYIb6Mw<&;$T`mph&S diff --git a/resources/assets/tinker/textures/items/shortbow/smite_bow_effect_3.png b/resources/assets/tinker/textures/items/shortbow/smite_bow_effect_3.png deleted file mode 100644 index 5f771c694aa7b99ed03e3e5ae7b9ff1e61353212..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(Vi}jAr-fh6BeiiOn>}yz2^DP z@qTkY+n=1}D79Dj$iMa*-v9i+PW-K}ee9!rih}2?iAR;@F6}61J#kVlZPEXe->gsU yeCQYSUz6{EihkrL-i;T8{+u`9a$}sy!0=|7^p>5~i;n=UVeoYIb6Mw<&;$T`mph&S From a2374c3f369fb042ff5401d1e25767409eb1b703 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Fri, 10 Oct 2014 00:25:36 +0200 Subject: [PATCH 015/129] Effects for the longbow --- .../items/longbow/beheading_bow_effect.png | Bin 0 -> 148 bytes .../textures/items/longbow/complete.xcf | Bin 2340 -> 3422 bytes .../items/longbow/diamond_bow_effect.png | Bin 0 -> 169 bytes .../items/longbow/emerald_bow_effect.png | Bin 0 -> 109 bytes .../items/longbow/flux_bow_effect.png | Bin 0 -> 1207 bytes .../textures/items/longbow/ice_bow_effect.png | Bin 0 -> 112 bytes .../items/longbow/ice_bow_effect_1.png | Bin 0 -> 112 bytes .../items/longbow/ice_bow_effect_2.png | Bin 0 -> 108 bytes .../items/longbow/ice_bow_effect_3.png | Bin 0 -> 108 bytes .../items/longbow/lapis_bow_effect.png | Bin 0 -> 256 bytes .../items/longbow/lapis_bow_effect_1.png | Bin 0 -> 194 bytes .../items/longbow/lapis_bow_effect_2.png | Bin 0 -> 194 bytes .../items/longbow/lapis_bow_effect_3.png | Bin 0 -> 197 bytes .../items/longbow/lava_bow_effect.png | Bin 0 -> 112 bytes .../items/longbow/moss_bow_effect.png | Bin 0 -> 272 bytes .../items/longbow/moss_bow_effect_1.png | Bin 0 -> 265 bytes .../items/longbow/moss_bow_effect_2.png | Bin 0 -> 266 bytes .../items/longbow/moss_bow_effect_3.png | Bin 0 -> 252 bytes .../items/longbow/necrotic_bow_effect.png | Bin 0 -> 117 bytes .../items/longbow/piston_bow_effect.png | Bin 0 -> 160 bytes .../items/longbow/quartz_bow_effect.png | Bin 0 -> 140 bytes .../items/longbow/quartz_bow_effect_1.png | Bin 0 -> 140 bytes .../items/longbow/quartz_bow_effect_2.png | Bin 0 -> 135 bytes .../items/longbow/quartz_bow_effect_3.png | Bin 0 -> 136 bytes .../items/longbow/redstone_bow_effect.png | Bin 0 -> 154 bytes .../items/longbow/redstone_bow_effect_1.png | Bin 0 -> 160 bytes .../items/longbow/redstone_bow_effect_2.png | Bin 0 -> 163 bytes .../items/longbow/redstone_bow_effect_3.png | Bin 0 -> 165 bytes .../items/longbow/reinforced_bow_effect.png | Bin 0 -> 106 bytes .../items/longbow/silk_bow_effect.png | Bin 0 -> 166 bytes .../items/longbow/silk_bow_effect_1.png | Bin 0 -> 166 bytes .../items/longbow/silk_bow_effect_2.png | Bin 0 -> 163 bytes .../items/longbow/silk_bow_effect_3.png | Bin 0 -> 158 bytes .../items/longbow/smite_bow_effect.png | Bin 0 -> 148 bytes .../items/longbow/spider_bow_effect.png | Bin 0 -> 160 bytes .../items/longbow/spider_bow_effect_1.png | Bin 0 -> 160 bytes .../items/longbow/spider_bow_effect_2.png | Bin 0 -> 154 bytes .../items/longbow/spider_bow_effect_3.png | Bin 0 -> 149 bytes 38 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 resources/assets/tinker/textures/items/longbow/beheading_bow_effect.png create mode 100644 resources/assets/tinker/textures/items/longbow/diamond_bow_effect.png create mode 100644 resources/assets/tinker/textures/items/longbow/emerald_bow_effect.png create mode 100644 resources/assets/tinker/textures/items/longbow/flux_bow_effect.png create mode 100644 resources/assets/tinker/textures/items/longbow/ice_bow_effect.png create mode 100644 resources/assets/tinker/textures/items/longbow/ice_bow_effect_1.png create mode 100644 resources/assets/tinker/textures/items/longbow/ice_bow_effect_2.png create mode 100644 resources/assets/tinker/textures/items/longbow/ice_bow_effect_3.png create mode 100644 resources/assets/tinker/textures/items/longbow/lapis_bow_effect.png create mode 100644 resources/assets/tinker/textures/items/longbow/lapis_bow_effect_1.png create mode 100644 resources/assets/tinker/textures/items/longbow/lapis_bow_effect_2.png create mode 100644 resources/assets/tinker/textures/items/longbow/lapis_bow_effect_3.png create mode 100644 resources/assets/tinker/textures/items/longbow/lava_bow_effect.png create mode 100644 resources/assets/tinker/textures/items/longbow/moss_bow_effect.png create mode 100644 resources/assets/tinker/textures/items/longbow/moss_bow_effect_1.png create mode 100644 resources/assets/tinker/textures/items/longbow/moss_bow_effect_2.png create mode 100644 resources/assets/tinker/textures/items/longbow/moss_bow_effect_3.png create mode 100644 resources/assets/tinker/textures/items/longbow/necrotic_bow_effect.png create mode 100644 resources/assets/tinker/textures/items/longbow/piston_bow_effect.png create mode 100644 resources/assets/tinker/textures/items/longbow/quartz_bow_effect.png create mode 100644 resources/assets/tinker/textures/items/longbow/quartz_bow_effect_1.png create mode 100644 resources/assets/tinker/textures/items/longbow/quartz_bow_effect_2.png create mode 100644 resources/assets/tinker/textures/items/longbow/quartz_bow_effect_3.png create mode 100644 resources/assets/tinker/textures/items/longbow/redstone_bow_effect.png create mode 100644 resources/assets/tinker/textures/items/longbow/redstone_bow_effect_1.png create mode 100644 resources/assets/tinker/textures/items/longbow/redstone_bow_effect_2.png create mode 100644 resources/assets/tinker/textures/items/longbow/redstone_bow_effect_3.png create mode 100644 resources/assets/tinker/textures/items/longbow/reinforced_bow_effect.png create mode 100644 resources/assets/tinker/textures/items/longbow/silk_bow_effect.png create mode 100644 resources/assets/tinker/textures/items/longbow/silk_bow_effect_1.png create mode 100644 resources/assets/tinker/textures/items/longbow/silk_bow_effect_2.png create mode 100644 resources/assets/tinker/textures/items/longbow/silk_bow_effect_3.png create mode 100644 resources/assets/tinker/textures/items/longbow/smite_bow_effect.png create mode 100644 resources/assets/tinker/textures/items/longbow/spider_bow_effect.png create mode 100644 resources/assets/tinker/textures/items/longbow/spider_bow_effect_1.png create mode 100644 resources/assets/tinker/textures/items/longbow/spider_bow_effect_2.png create mode 100644 resources/assets/tinker/textures/items/longbow/spider_bow_effect_3.png diff --git a/resources/assets/tinker/textures/items/longbow/beheading_bow_effect.png b/resources/assets/tinker/textures/items/longbow/beheading_bow_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..440a43069fe9851cabaf7173e34ebaa106f875af GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(Vi}jAr-fh6C9Y`X4(CBoY5G< zaCyh#NB{qyS`fQLvT4o4l(PoR3A2)8exKYfyF{|3@(k~R87j9E6B#bu`26%@{mWN5 xmv|aCI?i&KwX=3^hdG1ngeR?m23!pc4AL)rgS6hRTnw~^!PC{xWt~$(69C)0IZyxq literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/complete.xcf b/resources/assets/tinker/textures/items/longbow/complete.xcf index 312650dd6496965fe5a05beb8cb59d693f63dab8..0ebca9567afcae801ba3cd03a7eb7fd1fadc1cb0 100644 GIT binary patch delta 948 zcmZWn&ui3B5T5sv?2ngiDodf(wp0+dNG`3lxfC1ru=F531y3HtA8Qd|LG+-Z5TpgM zAQW?IL3^kN3sundBt;MpJ@h1a@!~(wV-JGaZ2Tt4ilGlCGxNRgdvE4V-qe4c+gudG zAKaT_>?@IWjY!`jGJX@4uM<@ch}6^Yofw@MY2E9rwC{d9Sb5Yw-@4WAv@cvDEC~xY z_0^!lS+?YpJU9c-ri1sQh{;!+*GQ-uMQUPPks?i*FvcE`L>#M@5=z03!<#9FT^kD9 zTeewYLxEh_0VGIbyJHI*5_=gQ5*W69Nc^`uK1+N^kP9CQ#IgU~7d{mJ4m=bv>?SqR zU?K_VCG`_P5~)mvvIMmcniGgeTJ=-UGmB?AD=6I4ZwF;=He0%p2LnAGM;|L<`bEy? zsc+%leiNU#`I!RRqs!FuTn}wT-pQ^bY$S~Nmq^;_c@y< zVb!Q-&GGCaYi`=&!c(sR+ZM`u&MX%!_xO-m?(s*LS*ZuhJ#@iprZfjM=V+g4&e68R zwA6#<>^u2k>F~07a@J?y1VNMtKm~So=G4pD7s5~nF0@yUHQUCw| delta 233 zcmca7wM1xw9V6>T`$R^Otqcszk_-$iRSXPl_6!g(`5WszHKqtCPXI`RFbe|%Qx2*a zQ_bdGY}Slw%sWxVL28-LqKYx!-7L*v$Ee0Ciz*IM%W8-!#_G7ao>QKYg$XD;Igh=@ a5U2(Q*xo`}NbX{1L=|Hf-0aRR&IADMfE9`W diff --git a/resources/assets/tinker/textures/items/longbow/diamond_bow_effect.png b/resources/assets/tinker/textures/items/longbow/diamond_bow_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..288df910efbeac020ed73b494a6e1dd832a487c7 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggKE>1B%jfA7Ol7K>*o-U3d7N?UF zB=$9&zxT%8byjcu{D1xv)4uv{{x|szSC>if+5d|ZT$mVK1thec+5*afnixD?{an^L HB{Ts59Q!fb literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/emerald_bow_effect.png b/resources/assets/tinker/textures/items/longbow/emerald_bow_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..fedf64cbedec6a0254325010d9113569d41bf748 GIT binary patch literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`CY~;iAr-fh6C{=?%y?)oGkNjN zkHx3!+m5oONHAR8^ZNhP|2%IuJ&|PCHdE)U$nRQ_o)iWKkudqa;;gK9fchCcUHx3v IIVCg!0K(lP=>Px# literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/flux_bow_effect.png b/resources/assets/tinker/textures/items/longbow/flux_bow_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..90f36e86b55d35a71080435881a47357593b81d3 GIT binary patch literal 1207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)0nbnGDT&%Z_gcif|Tq zL>4nJa0`PlBg3pY5H=O_Pg9Xtm=}_#XoNY3dv@MM3gw^=jNv7l>oU649-QV zi6yBi3gww484B*6z5ywEsq734EYhAXjv*F;i~=n0e}fecZGsV-^Iz^t`VSI+@#Hpx ze$rvAYOv`8i-9!%ezxcTe@)H*3-t8GgLWmtRp zGQ+R!c=a=&7yxoI1H&?~nT7@YV9jZ(8Sr`mLlWlXliLq75Ymk7`cd}C4uNbJJq>}> Rcc3DM!PC{xWt~$(69E3GRcZhL literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/ice_bow_effect.png b/resources/assets/tinker/textures/items/longbow/ice_bow_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..1b950f37b1ec0425bb6e662e04e85bef952c881f GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar-fh6BL9xUaQL70(Y)*K0-AbW|YuPggKE>1B4(Kl~at^o=)c)B=-Se#By zP+%^|4FCK5(z;*g4*-Er-?KGynA)uK?-~6`y_%Pxa+raQjjio}fS$6jWt_mJ3&|oO zL8&UIx%bD*r~Np*QL70(Y)*K0-AbW|YuPggKE>1CF$#dn~T!2DOo-U3d7N?UF zBsdN%jr}^`d-p4QW*{)OoVB@#OXA(0%F`dFhwg4n67OjWY?x@FaVf^=uW01TZq8#7 f`*L3&s9&@={5S3j3^P6QL70(Y)*K0-AbW|YuPggKE>1Baaf2(Xn1Dh~o-U3d7N?UF zBsdN%jr}^`d-p4QW*{)OoVB@#OXA(0%F`dFhwg4n67OjWY?x@FaVf^=uW01TZq8#7 f`*L3&s9&@={5S3j3^P6QL70(Y)*K0-AbW|YuPggKE>1CFZrgLmd4NK$o-U3d7N?UF zBqlX@?|x-Jz3gf|8xW)wnWR4zF}PFtdD=t$)n&{_^(0si^9P7*kGU24-+S49CCf$w i#o}rCx4r8185kC7NM72=I8Os;AcLo?pUXO@geCxeTRIW| literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/lava_bow_effect.png b/resources/assets/tinker/textures/items/longbow/lava_bow_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..d45a0fe07cd215964d62399ae30f8f559b86518e GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar-fh6Bd|SoIdbDzU}0t zAL)t$lNbLyFRzuMc6vYaV#z#)rL#Qw3`CeuT;(xtNEG3bVPKfK#5Qw@np+vr2nJ7A KKbLh*2~7ab5F!Bp literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/moss_bow_effect.png b/resources/assets/tinker/textures/items/longbow/moss_bow_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..a8b742651a2cb6bb1e921fd3f2ed8a64a8a22afa GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggKE>1BKB?H@&%Yi}@JY5_^EKa|j zpvc$kAmAz=8zao(d6vt~>|i0=k$DT+UBB?W=;~5EJ48r>uTNxd7CVU($zEOP2TmF-(uhTJoX=q)^0lUEKAvJfNo>( MboFyt=akR{0PcTa00000 literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/moss_bow_effect_1.png b/resources/assets/tinker/textures/items/longbow/moss_bow_effect_1.png new file mode 100644 index 0000000000000000000000000000000000000000..88925a019d3b2704bf028584afca8117321415bd GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggKE>1B~hCgmQnSer_o-U3d7N?UF zBv=;WaKOaaz~GO&P`b)B1~rYp^BWr*A6|a# z&*Q;1DTP6qnVGqH!Y+a4DGNn*Wq)9DoAG%m&r%7yz5kAUczRO2t=(E)=zS}YG&(Rx ze~F$;kQL70(Y)*K0-AbW|YuPggKE>1B~#SQu^V}L?ko-U3d7N?UF zBv=;WaKOaaz~GO&P`b)B1~rYp^BWr*A6|a# z&*Q-+lz-sxTz*MO2?>doE3Fbsc$Qv>Z5B5;G)F&GWZb+wml#p_P$&zJ~na#e4fbHpw1sNPj+m;#59{t|_WTM$zx516{@7>FVdQ&MBb@ E00*2}wg3PC literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/moss_bow_effect_3.png b/resources/assets/tinker/textures/items/longbow/moss_bow_effect_3.png new file mode 100644 index 0000000000000000000000000000000000000000..57a14586a7bd0b5f08a1031d3f50049adfb86476 GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggKE>1Bq&8atw)&hlUJY5_^EKVmU zNU$z$Xl#@`Hlcia`US45NeR!=(tcEYSH8%$;ed&;fx#blp>&mN3~CyG=QlPsKD_+e zpT~nuDF49Wx%`rn5)u+ES6U^O@GQL$>wJS@MsNMSzm2<_Lc|RY>`_>v=dz2@;DGw6 q;~z5KEAN=@VfNtW&vcdL%nbXlD6X|@^qLKH2ZN`ppUXO@geCy*8&}o< literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/necrotic_bow_effect.png b/resources/assets/tinker/textures/items/longbow/necrotic_bow_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..9e2dcc599110d4234f65d3584780ab287a481301 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Hl8kyAr-fh6Am!?`1t&5Hej}N z2nzbNfBky>RJMQ|j?kEm^^B4+SRXILDqlqA9G!pu-;7Fi*Ar-fh6B?S%2s}1UKR@s9 zc?Uj*%zMVlFZWNJC@3*`O=VrTenfIy+`a!NPIz46VYHN9l6Yx}=l|%asDI+3qJRB8 zJr&OiOn9UjyzEbYM#hi(H*R?BGEZom@TMlG&7h|#&;V%bNjIz1++|^xfL1biy85}S Ib4q9e04$X}(*OVf literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/quartz_bow_effect.png b/resources/assets/tinker/textures/items/longbow/quartz_bow_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..861f99449f1e863e19320d71f222b6ed52adddef GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`!JaOTAr-fh6BGoGRNefat{~oE z5^uHdwS7lh;v}9IYxMr@Py6PwLGgW@z4Bd#l-Zh}PH9L?VGvoqz{M%-&Y?-_8m$xO oT1>cXag%Mr)NL0pTUb^xc20A3KIgEv5@mdKI;Vst065|@#sB~S literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/quartz_bow_effect_1.png b/resources/assets/tinker/textures/items/longbow/quartz_bow_effect_1.png new file mode 100644 index 0000000000000000000000000000000000000000..861f99449f1e863e19320d71f222b6ed52adddef GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`!JaOTAr-fh6BGoGRNefat{~oE z5^uHdwS7lh;v}9IYxMr@Py6PwLGgW@z4Bd#l-Zh}PH9L?VGvoqz{M%-&Y?-_8m$xO oT1>cXag%Mr)NL0pTUb^xc20A3KIgEv5@mdKI;Vst065|@#sB~S literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/quartz_bow_effect_2.png b/resources/assets/tinker/textures/items/longbow/quartz_bow_effect_2.png new file mode 100644 index 0000000000000000000000000000000000000000..4e99eac5af00514faf8862e7503dbe332ad3d9ff GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ex5FlAr-fh6BGoGRNefat{~oE z5^uHdwS7lh;v}9IYxMr@Py6PwLGgW@z4Bd#32B>hO|y=5d%kx%)bOiF8Abv1^

lUBH1r=)ARSB9rQ#?-e#Xm{$ k+Qyio>i;FhYn2^?@hVs6Uu*b}0gYzxboFyt=akR{0RKlZiU0rr literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/redstone_bow_effect.png b/resources/assets/tinker/textures/items/longbow/redstone_bow_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..5cbf7e0606909f97113774b6e8d4108ffa1ac132 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggKE>1CVGsaVXl0YFTPZ!4!i_^&o r5|Gavr1xS~>|hsWT{By|Q6b?&d{re3fEs$%eT^>bP0l+XkKt6?Zq literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/redstone_bow_effect_1.png b/resources/assets/tinker/textures/items/longbow/redstone_bow_effect_1.png new file mode 100644 index 0000000000000000000000000000000000000000..8cbb9024e46b3f8c547e9c863ab3627ea6757bd9 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggKE>1BCRi-z>96%ujPZ!4!i_^&o x5|Gas(+GBq~rX$myZxNLUwFVdQ&MBb@0EY7= Ar2qf` literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/redstone_bow_effect_3.png b/resources/assets/tinker/textures/items/longbow/redstone_bow_effect_3.png new file mode 100644 index 0000000000000000000000000000000000000000..97e54a7d9174b0af2b98c2ccd136a707c62bb42e GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Ndh zEQYE;jtfAFv%n*=n1O*?7=#%aX3dcR3bL1Y`ns~;gnPbVsSb- zL4uW;{hzVHpY#MEkP5i%esBTb+y6W~|6huQG8ir9{FxfB7!B0G;OXk;vd$@?2>>ZY BDL?=K literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/reinforced_bow_effect.png b/resources/assets/tinker/textures/items/longbow/reinforced_bow_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..96767628b3f1e0bc0f78b1a7b50c74083175b3fa GIT binary patch literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`hMq2tAr-fh6C~yx@VNZko@esX z%D8{G|4((??P1OkS=^ItU&(gBWO6Qp>pyu`WibYZdls5i+alLq0cvLOboFyt=akR{ E00L4V@Bjb+ literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/silk_bow_effect.png b/resources/assets/tinker/textures/items/longbow/silk_bow_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..bfc83c8f9373a9eabe7fe0d7e0972cdb902979e2 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`xt=bLAr-fh6BLBjteg6;zsK|1 zm(OP({g+?2E!<+P9S#6RG+ybP0l+XkKf6h7J literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/silk_bow_effect_1.png b/resources/assets/tinker/textures/items/longbow/silk_bow_effect_1.png new file mode 100644 index 0000000000000000000000000000000000000000..bfc83c8f9373a9eabe7fe0d7e0972cdb902979e2 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`xt=bLAr-fh6BLBjteg6;zsK|1 zm(OP({g+?2E!<+P9S#6RG+ybP0l+XkKf6h7J literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/silk_bow_effect_2.png b/resources/assets/tinker/textures/items/longbow/silk_bow_effect_2.png new file mode 100644 index 0000000000000000000000000000000000000000..e62b5a459f25f59b0f122be66ab0654259f31134 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`S)MMAAr-fh6BHQNteg6e|FB9n z!$bb?OaJX}J!d~w!RvUPVNw0QNS?I#n=crTNANagwq&+xvVH6#az{VyWPVBDg_oX|F5F+YRul=W*LCLXN@+REVR L>gTe~DWM4fI%qbw literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/silk_bow_effect_3.png b/resources/assets/tinker/textures/items/longbow/silk_bow_effect_3.png new file mode 100644 index 0000000000000000000000000000000000000000..6e5da9bdbc108bdb11918d02479cfe2ca1ce3504 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`sh%#5Ar-fh6BejO#A^SQ7gzIo z+^+rdzx>$H7#lvu84&}(os+^nj>&`Q3=kf$+|?Iv50&!+l`bG^bE4$kq6 zKWo68!057#Q9(Q)h2dtSdBvdyCFX=SAm@xg&{qbA}yz2^DP z@qTkY+n=1}D79Dj$iMa*-v9i+PW-K}ee9!rih}2?iAR;@F6}61J#kVlZPEXe->gsU yeCQYSUz6{EihkrL-i;T8{+u`9a$}sy!0=|7^p>5~i;n=UVeoYIb6Mw<&;$T`mph&S literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/spider_bow_effect.png b/resources/assets/tinker/textures/items/longbow/spider_bow_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..6b12a3c11874135c6fdfa1c4dba19e127372e072 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>7Fi*Ar-fh6C_v{H{3eV;rL=d zYx9kIjp;K>m~XiJ%kSa*yZ)#G!!eaiz9)fy?&rMwvp>+~`~Q72Ui@F(B|FSJnR4f literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/spider_bow_effect_1.png b/resources/assets/tinker/textures/items/longbow/spider_bow_effect_1.png new file mode 100644 index 0000000000000000000000000000000000000000..6b12a3c11874135c6fdfa1c4dba19e127372e072 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>7Fi*Ar-fh6C_v{H{3eV;rL=d zYx9kIjp;K>m~XiJ%kSa*yZ)#G!!eaiz9)fy?&rMwvp>+~`~Q72Ui@F(B|FSJnR4f literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/spider_bow_effect_2.png b/resources/assets/tinker/textures/items/longbow/spider_bow_effect_2.png new file mode 100644 index 0000000000000000000000000000000000000000..c474a568b0afaeba76f4538159f0497a9207173c GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`iJmTwAr-fh6C_v{H{3eV;rL=d zYx9kIjp;K>m~XiJ%kSa*yZ)#G!!eaiz9)fy?&rMwvp>+~`~Q72Ui@F(B!=JvL6(~SG~S7IK+70BUHx3vIVCg! E0L&vkJOBUy literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/longbow/spider_bow_effect_3.png b/resources/assets/tinker/textures/items/longbow/spider_bow_effect_3.png new file mode 100644 index 0000000000000000000000000000000000000000..dd07a1f76ae082ab38cf3e0c43222c0bdbcb9eed GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`F`h1tAr-fh6C_v{H{3eV;rL=d zYx9kIUAD&m4tmBf**0|kxi2C7YyZ6?oM{{%6(+cUtlzxz^M5zNyZ?VDE&9Kn%TM8~ yz=TI~vY-F|4pRE}{l<@p&$%YBrP!Dx@iCZgP+h-f_cvXjJq(_%elF{r5}E)|D?8l) literal 0 HcmV?d00001 From 6715a955210b2934a8d20ed424be06b54b51926d Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Fri, 10 Oct 2014 00:38:16 +0200 Subject: [PATCH 016/129] Shinier crossbows! --- .../items/crossbow/_crossbow_binding.png | Bin 249 -> 246 bytes .../textures/items/crossbow/_crossbow_body.png | Bin 279 -> 319 bytes .../textures/items/crossbow/_crossbow_bow.png | Bin 291 -> 315 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/assets/tinker/textures/items/crossbow/_crossbow_binding.png b/resources/assets/tinker/textures/items/crossbow/_crossbow_binding.png index f1aa09145bd2a503131b700a1217b3c2ef0f6261..e4ffa75ada473a17fc14423414cda281b5b7e76c 100644 GIT binary patch delta 172 zcmV;d08{_@0rmlqHwn4`x&XRBNs6A4Kp%e!2^JhW>xkR=0001XNklrPyOO%tHwoGR+5p`0I~63~QT%hfAo^PX{IfX~vYG&RDC9IpDEKt?-nrK5 zBEkS%L^wnOz|D+WYw;3QmCP(xqN>uIGraj)hcQNY@fJ`@$vsdOe1)~Hwpg${{a7>y{D6rKp%e!2^Jg*%~9)B0002LNklVU z3`KuXdO9i!24MpRVF0X5VTl!30*L`qWP`L6Y=Mxkf(vi~q`UHdY0KaL=>vcLUR~E= zo@aRP<*Q@ooG|mPi9Qa-al|kTYFQR3%Mz;z5vfPt+qT_i%q-41@!m(%B**VZrDD-K%N v+94vPWBgY}%q&gQ0Kgk3#vck;x%f6h6m zl2Tf#=sWtu#5uQE=(}Hxh-!dlh~D)-*(~p|>%R*TNeDrnm9}~Fk%lMs00000NkvXX Hu0mjfKnz>v diff --git a/resources/assets/tinker/textures/items/crossbow/_crossbow_bow.png b/resources/assets/tinker/textures/items/crossbow/_crossbow_bow.png index 54702314cc4bcfc2983abdc42e7fab48785428b6..e7e9d8929890a6779bd33a7bdacc77311bf68daf 100644 GIT binary patch delta 241 zcmV_zF$V0002HNklM3LdDuaoZnoz8FrIp_X^Hr{*8 z9r3!Z0Eh_AIjps$lqjVbb4M&9oagzKAcXKgfvWa5u>lAn-0!TaJ;vA>LC(3i)|g#F zjFHwF*LAV)JHwwdvUchoUySt1eU)tk)Ra1bbbzSEH?#|x{W&qL-V+s&s1Q2&0?jPU+>7G_J Tg#t8X00000NkvXXu0mjfzo1#( From 2988b75490174195e1fbb54c4f60445e2f3e10f5 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Fri, 10 Oct 2014 13:06:34 +0200 Subject: [PATCH 017/129] Fix colors for fletchlings on arrows --- .../java/tconstruct/tools/ToolProxyClient.java | 2 ++ .../tconstruct/weaponry/ammo/ArrowAmmo.java | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/main/java/tconstruct/tools/ToolProxyClient.java b/src/main/java/tconstruct/tools/ToolProxyClient.java index 561d0047138..42aaf6b0310 100644 --- a/src/main/java/tconstruct/tools/ToolProxyClient.java +++ b/src/main/java/tconstruct/tools/ToolProxyClient.java @@ -56,6 +56,7 @@ public void registerRenderer () //MinecraftForgeClient.registerItemRenderer(TinkerTools.shortbow, new CustomBowRenderer()); ToolCoreRenderer renderer = new ToolCoreRenderer(false); + /* MinecraftForgeClient.registerItemRenderer(TinkerTools.pickaxe, renderer); MinecraftForgeClient.registerItemRenderer(TinkerTools.shovel, renderer); MinecraftForgeClient.registerItemRenderer(TinkerTools.hatchet, renderer); @@ -73,6 +74,7 @@ public void registerRenderer () MinecraftForgeClient.registerItemRenderer(TinkerTools.mattock, renderer); MinecraftForgeClient.registerItemRenderer(TinkerTools.rapier, renderer); MinecraftForgeClient.registerItemRenderer(TinkerTools.scythe, renderer); + */ renderer = new ToolCoreRenderer(true); MinecraftForgeClient.registerItemRenderer(TinkerTools.dagger, renderer); // todo proper renderer diff --git a/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java b/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java index 04b4343760b..66f2a9cdc07 100644 --- a/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java +++ b/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java @@ -1,6 +1,10 @@ package tconstruct.weaponry.ammo; import tconstruct.TConstruct; +import tconstruct.library.TConstructRegistry; +import tconstruct.library.tools.CustomMaterial; +import tconstruct.library.tools.FletchingMaterial; +import tconstruct.library.tools.FletchlingLeafMaterial; import tconstruct.weaponry.TinkerWeaponry; import tconstruct.library.weaponry.AmmoItem; import net.minecraft.creativetab.CreativeTabs; @@ -116,4 +120,18 @@ public void getSubItems(Item id, CreativeTabs tab, List list) { else TConstruct.logger.error("Couldn't build vanilla equivalent of Tinker Arrow"); } + + @Override + protected int getDefaultColor(int renderPass, int materialID) { + if(renderPass != 2) + return super.getDefaultColor(renderPass, materialID); + + CustomMaterial mat = TConstructRegistry.getCustomMaterial(materialID, FletchingMaterial.class); + if(mat == null) + TConstructRegistry.getCustomMaterial(materialID, FletchlingLeafMaterial.class); + if(mat == null) + return 0xffffff; + + return mat.color; + } } From 69fad3c103c9438a7ede24d62efd8da22d4d6dd3 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Fri, 10 Oct 2014 17:37:39 +0200 Subject: [PATCH 018/129] Fix entity rendering, but screw up all the animations n stuff.. sigh --- .../client/FlexibleToolRenderer.java | 54 +++++++++---------- .../client/entity/ProjectileBaseRenderer.java | 4 +- .../weaponry/entity/ShurikenEntity.java | 5 +- 3 files changed, 32 insertions(+), 31 deletions(-) diff --git a/src/main/java/tconstruct/client/FlexibleToolRenderer.java b/src/main/java/tconstruct/client/FlexibleToolRenderer.java index 9b0a737fb60..97e60b84947 100644 --- a/src/main/java/tconstruct/client/FlexibleToolRenderer.java +++ b/src/main/java/tconstruct/client/FlexibleToolRenderer.java @@ -101,6 +101,8 @@ public void renderItem (ItemRenderType type, ItemStack item, Object... data) { specialAnimation(type, item); } + else + GL11.glTranslatef(-0.5f, -0.25f, 0); // why? because.. minecraft. // prepare colors int[] color = new int[iconParts]; @@ -113,10 +115,10 @@ public void renderItem (ItemRenderType type, ItemStack item, Object... data) { for (int i = 0; i < iconParts; ++i) { tess.setColorOpaque_I(color[i]); - tess.addVertexWithUV(-0.5, -0.5, +depth, xMax[i], yMax[i]); - tess.addVertexWithUV(+0.5, -0.5, +depth, xMin[i], yMax[i]); - tess.addVertexWithUV(+0.5, +0.5, +depth, xMin[i], yMin[i]); - tess.addVertexWithUV(-0.5, +0.5, +depth, xMax[i], yMin[i]); + tess.addVertexWithUV(0, 0, +depth, xMax[i], yMax[i]); + tess.addVertexWithUV(1, 0, +depth, xMin[i], yMax[i]); + tess.addVertexWithUV(1, 1, +depth, xMin[i], yMin[i]); + tess.addVertexWithUV(0, 1, +depth, xMax[i], yMin[i]); } tess.draw(); @@ -126,10 +128,10 @@ public void renderItem (ItemRenderType type, ItemStack item, Object... data) { for (int i = 0; i < iconParts; ++i) { tess.setColorOpaque_I(color[i]); - tess.addVertexWithUV(-0.5, +0.5, -depth, xMax[i], yMin[i]); - tess.addVertexWithUV(+0.5, +0.5, -depth, xMin[i], yMin[i]); - tess.addVertexWithUV(+0.5, -0.5, -depth, xMin[i], yMax[i]); - tess.addVertexWithUV(-0.5, -0.5, -depth, xMax[i], yMax[i]); + tess.addVertexWithUV(0, 1, -depth, xMax[i], yMin[i]); + tess.addVertexWithUV(1, 1, -depth, xMin[i], yMin[i]); + tess.addVertexWithUV(1, 0, -depth, xMin[i], yMax[i]); + tess.addVertexWithUV(0, 0, -depth, xMax[i], yMax[i]); } tess.draw(); @@ -147,11 +149,10 @@ public void renderItem (ItemRenderType type, ItemStack item, Object... data) { { pos = k / w; iconPos = m + d * pos - s; - pos -= 0.5f; - tess.addVertexWithUV(pos, -0.5, -depth, iconPos, yMax[i]); - tess.addVertexWithUV(pos, -0.5, +depth, iconPos, yMax[i]); - tess.addVertexWithUV(pos, +0.5, +depth, iconPos, yMin[i]); - tess.addVertexWithUV(pos, +0.5, -depth, iconPos, yMin[i]); + tess.addVertexWithUV(pos, 0, -depth, iconPos, yMax[i]); + tess.addVertexWithUV(pos, 0, +depth, iconPos, yMax[i]); + tess.addVertexWithUV(pos, 1, +depth, iconPos, yMin[i]); + tess.addVertexWithUV(pos, 1, -depth, iconPos, yMin[i]); } } @@ -169,12 +170,11 @@ public void renderItem (ItemRenderType type, ItemStack item, Object... data) { { pos = k / w; iconPos = m + d * pos - s; - pos -= 0.5f; posEnd = pos + d2; - tess.addVertexWithUV(posEnd, +0.5, -depth, iconPos, yMin[i]); - tess.addVertexWithUV(posEnd, +0.5, +depth, iconPos, yMin[i]); - tess.addVertexWithUV(posEnd, -0.5, +depth, iconPos, yMax[i]); - tess.addVertexWithUV(posEnd, -0.5, -depth, iconPos, yMax[i]); + tess.addVertexWithUV(posEnd, 1, -depth, iconPos, yMin[i]); + tess.addVertexWithUV(posEnd, 1, +depth, iconPos, yMin[i]); + tess.addVertexWithUV(posEnd, 0, +depth, iconPos, yMax[i]); + tess.addVertexWithUV(posEnd, 0, -depth, iconPos, yMax[i]); } } @@ -191,12 +191,11 @@ public void renderItem (ItemRenderType type, ItemStack item, Object... data) { { pos = k / h; iconPos = m + d * pos - s; - pos -= 0.5f; posEnd = pos + d2; - tess.addVertexWithUV(-0.5, posEnd, +depth, xMax[i], iconPos); - tess.addVertexWithUV(+0.5, posEnd, +depth, xMin[i], iconPos); - tess.addVertexWithUV(+0.5, posEnd, -depth, xMin[i], iconPos); - tess.addVertexWithUV(-0.5, posEnd, -depth, xMax[i], iconPos); + tess.addVertexWithUV(0, posEnd, +depth, xMax[i], iconPos); + tess.addVertexWithUV(1, posEnd, +depth, xMin[i], iconPos); + tess.addVertexWithUV(1, posEnd, -depth, xMin[i], iconPos); + tess.addVertexWithUV(0, posEnd, -depth, xMax[i], iconPos); } } @@ -212,11 +211,10 @@ public void renderItem (ItemRenderType type, ItemStack item, Object... data) { { pos = k / h; iconPos = m + d * pos - s; - pos -= 0.5f; - tess.addVertexWithUV(+0.5, pos, +depth, xMin[i], iconPos); - tess.addVertexWithUV(-0.5, pos, +depth, xMax[i], iconPos); - tess.addVertexWithUV(-0.5, pos, -depth, xMax[i], iconPos); - tess.addVertexWithUV(+0.5, pos, -depth, xMin[i], iconPos); + tess.addVertexWithUV(1, pos, +depth, xMin[i], iconPos); + tess.addVertexWithUV(0, pos, +depth, xMax[i], iconPos); + tess.addVertexWithUV(0, pos, -depth, xMax[i], iconPos); + tess.addVertexWithUV(1, pos, -depth, xMin[i], iconPos); } } diff --git a/src/main/java/tconstruct/weaponry/client/entity/ProjectileBaseRenderer.java b/src/main/java/tconstruct/weaponry/client/entity/ProjectileBaseRenderer.java index 4cc3e6dc4f5..4f7651b36fe 100644 --- a/src/main/java/tconstruct/weaponry/client/entity/ProjectileBaseRenderer.java +++ b/src/main/java/tconstruct/weaponry/client/entity/ProjectileBaseRenderer.java @@ -33,7 +33,7 @@ public void doRender(T entity, double x, double y, double z, float p_76986_8_, f GL11.glEnable(GL12.GL_RESCALE_NORMAL); // last step: translate from 0/0/0 to correct position in world - GL11.glTranslatef((float) x, (float) y, (float) z); + GL11.glTranslated(x, y, z); // mkae it smaller GL11.glScalef(0.5F, 0.5F, 0.5F); @@ -50,7 +50,9 @@ public void doRender(T entity, double x, double y, double z, float p_76986_8_, f // draw correct texture. not some weird block fragments. renderManager.renderEngine.bindTexture(TextureMap.locationItemsTexture); // rendering code has been optimized to be exactly at the center and without translation + GL11.glTranslatef(0.0f, -0.25f, 0); toolCoreRenderer.renderItem(IItemRenderer.ItemRenderType.ENTITY, entity.getEntityItem()); + GL11.glTranslatef(0.0f, 0.25f, 0); GL11.glDisable(GL12.GL_RESCALE_NORMAL); GL11.glPopMatrix(); diff --git a/src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java b/src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java index 5a8a298de1a..8e497a76b2e 100644 --- a/src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java +++ b/src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java @@ -43,13 +43,14 @@ public void readSpawnData(ByteBuf data) { super.readSpawnData(data); // this is only relevant clientside only, so we don't actually have it on the server - rollAngle = (TinkerWeaponry.random.nextInt(3)-1)*45 + TinkerWeaponry.random.nextInt(30)-15; + //rollAngle = (TinkerWeaponry.random.nextInt(3)-1)*45 + TinkerWeaponry.random.nextInt(30)-15; spin = TinkerWeaponry.random.nextInt(360); } @Override protected double getGravity() { - return (this.ticksExisted/8) * 0.018d; // integer division. so the first 20 ticks it will have no gravity at all. + return 0; + //return (this.ticksExisted/8) * 0.018d; // integer division. so the first 20 ticks it will have no gravity at all. } @Override From 28f16ac76c3e8271771551a9b85d968f9fd1354c Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Fri, 10 Oct 2014 17:48:19 +0200 Subject: [PATCH 019/129] Don't use up ammo in creative mode --- .../java/tconstruct/library/weaponry/AmmoWeapon.java | 3 ++- .../tconstruct/library/weaponry/ProjectileWeapon.java | 10 ++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java b/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java index a111116b096..d755c20dc5e 100644 --- a/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java +++ b/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java @@ -109,7 +109,8 @@ protected void launchProjectile(ItemStack stack, World world, EntityPlayer playe } // reduce ammo - this.consumeAmmo(1, stack); + if(!player.capabilities.isCreativeMode) + this.consumeAmmo(1, stack); } protected abstract Entity createProjectile(ItemStack reference, World world, EntityPlayer player, float accuracy); diff --git a/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java b/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java index 39a81a67607..da3c40dc646 100644 --- a/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java +++ b/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java @@ -193,10 +193,12 @@ public void onPlayerStoppedUsing (ItemStack weapon, World world, EntityPlayer pl // use up ammo - if(ammo.getItem() instanceof IAmmo) - ((IAmmo) ammo.getItem()).consumeAmmo(1, ammo); - else - player.inventory.consumeInventoryItem(ammo.getItem()); + if(!player.capabilities.isCreativeMode) { + if (ammo.getItem() instanceof IAmmo) + ((IAmmo) ammo.getItem()).consumeAmmo(1, ammo); + else + player.inventory.consumeInventoryItem(ammo.getItem()); + } // FIREEEEEEE if (!world.isRemote) From 17593a3909498b835d849de65afddf32bf34e504 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Fri, 10 Oct 2014 17:52:17 +0200 Subject: [PATCH 020/129] Reimplement the changes to the entity rendering in the custom renderers so their animations n stuff isn't b0rked anymore. (todo: do properly later) --- src/main/java/tconstruct/client/FlexibleToolRenderer.java | 3 --- .../java/tconstruct/weaponry/client/item/BowRenderer.java | 5 +++++ .../tconstruct/weaponry/client/item/CrossbowRenderer.java | 5 +++++ .../tconstruct/weaponry/client/item/JavelinRenderer.java | 5 +++++ .../weaponry/client/item/ThrowingKnifeRenderer.java | 5 +++++ 5 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/main/java/tconstruct/client/FlexibleToolRenderer.java b/src/main/java/tconstruct/client/FlexibleToolRenderer.java index 97e60b84947..1c8173aacd8 100644 --- a/src/main/java/tconstruct/client/FlexibleToolRenderer.java +++ b/src/main/java/tconstruct/client/FlexibleToolRenderer.java @@ -96,9 +96,6 @@ public void renderItem (ItemRenderType type, ItemStack item, Object... data) { GL11.glEnable(GL12.GL_RESCALE_NORMAL); if(type != ItemRenderType.ENTITY) { - GL11.glTranslatef(0.5f, 0.5f, 0); - GL11.glScalef(0.5f, 0.5f, 0.5f); - specialAnimation(type, item); } else diff --git a/src/main/java/tconstruct/weaponry/client/item/BowRenderer.java b/src/main/java/tconstruct/weaponry/client/item/BowRenderer.java index 6c3d9181958..8d843ee2495 100644 --- a/src/main/java/tconstruct/weaponry/client/item/BowRenderer.java +++ b/src/main/java/tconstruct/weaponry/client/item/BowRenderer.java @@ -21,6 +21,9 @@ public class BowRenderer extends FlexibleToolRenderer { protected void specialAnimation(ItemRenderType type, ItemStack item) { EntityPlayer player = Minecraft.getMinecraft().thePlayer; + GL11.glTranslatef(0.5f, 0.5f, 0); + GL11.glScalef(0.5f, 0.5f, 0.5f); + if(type == ItemRenderType.EQUIPPED) { //GL11.glTranslatef(0.0F, 0.125F, 0.3125F); @@ -111,5 +114,7 @@ else if(type == ItemRenderType.EQUIPPED && player.isUsingItem()) GL11.glScalef(2.3f, 2.3f, 1.0f); else if(item.getItem() == TinkerWeaponry.shortbow) GL11.glScalef(1.7f, 1.7f, 1.0f); + + GL11.glTranslatef(-0.5f, -0.5f, 0f); } } diff --git a/src/main/java/tconstruct/weaponry/client/item/CrossbowRenderer.java b/src/main/java/tconstruct/weaponry/client/item/CrossbowRenderer.java index 315ef543366..587e55317b2 100644 --- a/src/main/java/tconstruct/weaponry/client/item/CrossbowRenderer.java +++ b/src/main/java/tconstruct/weaponry/client/item/CrossbowRenderer.java @@ -19,6 +19,9 @@ protected void specialAnimation(ItemRenderType type, ItemStack item) { EntityPlayer player = Minecraft.getMinecraft().thePlayer; Crossbow crossbow = (Crossbow)item.getItem(); + GL11.glTranslatef(0.5f, 0.5f, 0); + GL11.glScalef(0.5f, 0.5f, 0.5f); + GL11.glScalef(1.5f, 1.5f, 1.5f); if(type == ItemRenderType.EQUIPPED_FIRST_PERSON) { @@ -69,5 +72,7 @@ protected void specialAnimation(ItemRenderType type, ItemStack item) { GL11.glTranslatef(0.25f, 0, 0); GL11.glRotatef(45.0F, 0.0F, 0.0F, 1.0F); } + + GL11.glTranslatef(-0.5f, -0.5f, 0f); } } diff --git a/src/main/java/tconstruct/weaponry/client/item/JavelinRenderer.java b/src/main/java/tconstruct/weaponry/client/item/JavelinRenderer.java index e2b231eb81e..4731d528deb 100644 --- a/src/main/java/tconstruct/weaponry/client/item/JavelinRenderer.java +++ b/src/main/java/tconstruct/weaponry/client/item/JavelinRenderer.java @@ -10,6 +10,9 @@ public class JavelinRenderer extends AmmoItemRenderer { @Override protected void specialAnimation(ItemRenderType type, ItemStack item) { + GL11.glTranslatef(0.5f, 0.5f, 0); + GL11.glScalef(0.5f, 0.5f, 0.5f); + float progress = ((IWindup)item.getItem()).getWindupProgress(item, Minecraft.getMinecraft().thePlayer); // 0.5 while not winding if(type == ItemRenderType.EQUIPPED) @@ -21,5 +24,7 @@ protected void specialAnimation(ItemRenderType type, ItemStack item) { if(type == ItemRenderType.EQUIPPED_FIRST_PERSON) GL11.glTranslatef(0, progress * 0.4f, 0); GL11.glRotatef(45, 0, 0, 1); + + GL11.glTranslatef(-0.5f, -0.5f, 0f); } } diff --git a/src/main/java/tconstruct/weaponry/client/item/ThrowingKnifeRenderer.java b/src/main/java/tconstruct/weaponry/client/item/ThrowingKnifeRenderer.java index 41f5bb7a197..9fad436c099 100644 --- a/src/main/java/tconstruct/weaponry/client/item/ThrowingKnifeRenderer.java +++ b/src/main/java/tconstruct/weaponry/client/item/ThrowingKnifeRenderer.java @@ -15,6 +15,9 @@ public class ThrowingKnifeRenderer extends AmmoItemRenderer { @Override protected void specialAnimation(ItemRenderType type, ItemStack item) { + GL11.glTranslatef(0.5f, 0.5f, 0); + GL11.glScalef(0.5f, 0.5f, 0.5f); + float progress = ((IWindup)item.getItem()).getWindupProgress(item, mc.thePlayer); if(type == ItemRenderType.EQUIPPED_FIRST_PERSON) { @@ -65,5 +68,7 @@ protected void specialAnimation(ItemRenderType type, ItemStack item) { if(type == ItemRenderType.EQUIPPED) GL11.glRotatef(-180, 0, 0, 1); + + GL11.glTranslatef(-0.5f, -0.5f, 0f); } } From 8fe42be9f2f627cb3ada89c2db02e9bc20374948 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Fri, 10 Oct 2014 18:00:15 +0200 Subject: [PATCH 021/129] Fix entity id conflicts --- .../java/tconstruct/weaponry/WeaponryCommonProxy.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/tconstruct/weaponry/WeaponryCommonProxy.java b/src/main/java/tconstruct/weaponry/WeaponryCommonProxy.java index 11414ee620f..bce2b81bbce 100644 --- a/src/main/java/tconstruct/weaponry/WeaponryCommonProxy.java +++ b/src/main/java/tconstruct/weaponry/WeaponryCommonProxy.java @@ -6,10 +6,10 @@ public class WeaponryCommonProxy { public void init() { - EntityRegistry.registerModEntity(ShurikenEntity.class, "Shuriken", 10, TConstruct.instance, 32, 5, true); - EntityRegistry.registerModEntity(ThrowingKnifeEntity.class, "ThrowingKnife", 11, TConstruct.instance, 32, 5, true); - EntityRegistry.registerModEntity(JavelinEntity.class, "Javelin", 12, TConstruct.instance, 32, 5, true); - EntityRegistry.registerModEntity(ArrowEntity.class, "Arrow", 13, TConstruct.instance, 32, 5, true); - EntityRegistry.registerModEntity(BoltEntity.class, "Bolt", 14, TConstruct.instance, 32, 5, true); + EntityRegistry.registerModEntity(ShurikenEntity.class, "Shuriken", 20, TConstruct.instance, 32, 5, true); + EntityRegistry.registerModEntity(ThrowingKnifeEntity.class, "ThrowingKnife", 21, TConstruct.instance, 32, 5, true); + EntityRegistry.registerModEntity(JavelinEntity.class, "Javelin", 22, TConstruct.instance, 32, 5, true); + EntityRegistry.registerModEntity(ArrowEntity.class, "Arrow", 23, TConstruct.instance, 32, 5, true); + EntityRegistry.registerModEntity(BoltEntity.class, "Bolt", 24, TConstruct.instance, 32, 5, true); } } From 4f9f63ac932eb0d351b652c555f2b6e920c9dc79 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Fri, 10 Oct 2014 18:02:55 +0200 Subject: [PATCH 022/129] Fix bolt fletchling color --- .../tconstruct/weaponry/ammo/BoltAmmo.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java b/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java index 5e3c4fb8bc6..2827aaf364c 100644 --- a/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java +++ b/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java @@ -1,5 +1,9 @@ package tconstruct.weaponry.ammo; +import tconstruct.library.TConstructRegistry; +import tconstruct.library.tools.CustomMaterial; +import tconstruct.library.tools.FletchingMaterial; +import tconstruct.library.tools.FletchlingLeafMaterial; import tconstruct.weaponry.TinkerWeaponry; import tconstruct.library.tools.DualMaterialToolPart; import tconstruct.library.weaponry.AmmoItem; @@ -89,4 +93,18 @@ public void buildTool (int id, String name, List list) list.add(tool); } } + + @Override + protected int getDefaultColor(int renderPass, int materialID) { + if(renderPass != 2) + return super.getDefaultColor(renderPass, materialID); + + CustomMaterial mat = TConstructRegistry.getCustomMaterial(materialID, FletchingMaterial.class); + if(mat == null) + TConstructRegistry.getCustomMaterial(materialID, FletchlingLeafMaterial.class); + if(mat == null) + return 0xffffff; + + return mat.color; + } } From 503dd488d2e8d78f3eaa6f9800fc8a7ac3ee27ab Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Fri, 10 Oct 2014 18:03:10 +0200 Subject: [PATCH 023/129] Render bolts a bit bigger --- src/main/java/tconstruct/weaponry/WeaponryClientProxy.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java b/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java index 1dbb63fe81e..ead74c5fdac 100644 --- a/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java +++ b/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java @@ -61,7 +61,7 @@ private void registerEntityRendering() RenderingRegistry.registerEntityRenderingHandler(ThrowingKnifeEntity.class, defaultRenderer); RenderingRegistry.registerEntityRenderingHandler(JavelinEntity.class, new JavelinEntityRenderer()); RenderingRegistry.registerEntityRenderingHandler(ArrowEntity.class, new ArrowEntityRenderer()); - RenderingRegistry.registerEntityRenderingHandler(BoltEntity.class, new ArrowEntityRenderer(0.6f)); + RenderingRegistry.registerEntityRenderingHandler(BoltEntity.class, new ArrowEntityRenderer(0.8f)); } private void registerMaterialRendering() From cd58fde59f9c7a3a4a0fb62f1b0317a59b6558b2 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Fri, 10 Oct 2014 18:21:02 +0200 Subject: [PATCH 024/129] Fix throwing weapons not using their proper textures if present --- .../tconstruct/library/weaponry/AmmoWeapon.java | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java b/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java index d755c20dc5e..ed69241f975 100644 --- a/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java +++ b/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java @@ -115,23 +115,6 @@ protected void launchProjectile(ItemStack stack, World world, EntityPlayer playe protected abstract Entity createProjectile(ItemStack reference, World world, EntityPlayer player, float accuracy); - @Override - public void registerPartPaths(int index, String[] location) { - - } - - @Override - public void registerAlternatePartPaths(int index, String[] location) { - headStrings.put(index, location[0]); - brokenPartStrings.put(index, location[1]); - handleStrings.put(index, location[2]); - if (location.length > 3) - accessoryStrings.put(index, location[3]); - if (location.length > 4) - extraStrings.put(index, location[4]); - } - - @SideOnly(Side.CLIENT) public CrosshairType getCrosshairType() { return CrosshairType.SQUARE; } From 457239f9610311b64af1fc427e2b84a96cc9946e Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Fri, 10 Oct 2014 18:21:15 +0200 Subject: [PATCH 025/129] Pig Iron Javelin Heaaaaad --- .../items/javelin/pigiron_javelin_head.png | Bin 0 -> 258 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 resources/assets/tinker/textures/items/javelin/pigiron_javelin_head.png diff --git a/resources/assets/tinker/textures/items/javelin/pigiron_javelin_head.png b/resources/assets/tinker/textures/items/javelin/pigiron_javelin_head.png new file mode 100644 index 0000000000000000000000000000000000000000..2eb03334fd67d457e1391813d2b520f51c52a5f7 GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QK$!8;-MT+OLG}_)Usv{fTwDU|(h~14gN$kNba4!^IGz0F z{rhwWHn#P4f68<6Q&JR!3=9nn3{)g$|MNF6`^ztUCqDB3d=+L15SVY9;4wwyZ@r^W zL&oigY&sUzvnDn+Ha`4w^fnL3g#9HiO)j!+kl6F$XK(V&Y$)RnGzqxY+m^82l${y%tT+5eB-3!PC{xWt~$(69DHVS6Ki6 literal 0 HcmV?d00001 From 952bc7ed0e94cdf2ea5a7c42e7d734ad0df90b56 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Fri, 10 Oct 2014 18:41:12 +0200 Subject: [PATCH 026/129] Crossbow Reload Sound --- resources/assets/tinker/sounds.json | 6 ++++++ .../assets/tinker/sounds/crossbowReload.ogg | Bin 0 -> 6597 bytes .../tconstruct/weaponry/weapons/Crossbow.java | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 resources/assets/tinker/sounds/crossbowReload.ogg diff --git a/resources/assets/tinker/sounds.json b/resources/assets/tinker/sounds.json index f2270a196af..af7090a45df 100644 --- a/resources/assets/tinker/sounds.json +++ b/resources/assets/tinker/sounds.json @@ -34,5 +34,11 @@ "stoneHit2", "stoneHit3" ] + }, + "crossbowReload": { + "category": "neutral", + "sounds": [ + "crossbowReload" + ] } } \ No newline at end of file diff --git a/resources/assets/tinker/sounds/crossbowReload.ogg b/resources/assets/tinker/sounds/crossbowReload.ogg new file mode 100644 index 0000000000000000000000000000000000000000..32f37e65a554ec6e9a9784fed14528a4bfd2ef19 GIT binary patch literal 6597 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 O!7^N2bd34=;r{~&fl`M6 literal 0 HcmV?d00001 diff --git a/src/main/java/tconstruct/weaponry/weapons/Crossbow.java b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java index 2508642fb5a..3a137f762e8 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Crossbow.java +++ b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java @@ -291,7 +291,7 @@ public float maxAccuracy(ItemStack itemStack) { } public void playReloadSound(World world, EntityPlayer player, ItemStack weapon, ItemStack ammo) { - world.playSoundAtEntity(player, Reference.resource("woodHit"), 1.0f, 1.0f); + world.playSoundAtEntity(player, Reference.resource("crossbowReload"), 1.0f, 1.0f); } @Override From 77ee46bc8ce1cdba5479b3cc44429c13bfe1af28 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Thu, 16 Oct 2014 18:03:34 +0200 Subject: [PATCH 027/129] Merge fixes n more --- .../library/TConstructRegistry.java | 2 +- .../java/tconstruct/tools/TinkerTools.java | 51 ------------------- 2 files changed, 1 insertion(+), 52 deletions(-) diff --git a/src/main/java/tconstruct/library/TConstructRegistry.java b/src/main/java/tconstruct/library/TConstructRegistry.java index 0ab91987ad1..4b205b2dcf4 100644 --- a/src/main/java/tconstruct/library/TConstructRegistry.java +++ b/src/main/java/tconstruct/library/TConstructRegistry.java @@ -414,7 +414,7 @@ public static BowMaterial getBowMaterial (int materialID) @Deprecated public static void addArrowMaterial (int materialID, float mass, float breakChance, float accuracy) { - addArrowMaterial(materialID, mass, breakChance, 0); + addArrowMaterial(materialID, mass, breakChance); } public static void addArrowMaterial (int materialID, float mass, float breakChance) diff --git a/src/main/java/tconstruct/tools/TinkerTools.java b/src/main/java/tconstruct/tools/TinkerTools.java index 40ccf8201b5..7359eaef9d1 100644 --- a/src/main/java/tconstruct/tools/TinkerTools.java +++ b/src/main/java/tconstruct/tools/TinkerTools.java @@ -734,56 +734,6 @@ void registerMaterials () TConstructRegistry.addToolMaterial(MaterialID.BlueSlime, "BlueSlime", 0, 1200, 150, 0, 2.0F, 0, 0f, AQUA.toString(), 0x66AEB0); TConstructRegistry.addToolMaterial(MaterialID.PigIron, "PigIron", 3, 250, 600, 2, 1.3F, 1, 0f, RED.toString(), 0xF0A8A4); -<<<<<<< HEAD -======= - // Bow Materials: Material ID, durability, drawspeed, arrow speed - TConstructRegistry.addBowMaterial(MaterialID.Wood, 384, 20, 1.0f); // Wood - TConstructRegistry.addBowMaterial(MaterialID.Stone, 10, 80, 0.2f); // Stone - TConstructRegistry.addBowMaterial(MaterialID.Iron, 576, 30, 1.2f); // Iron - TConstructRegistry.addBowMaterial(MaterialID.Flint, 10, 80, 0.2f); // Flint - TConstructRegistry.addBowMaterial(MaterialID.Cactus, 384, 20, 1.0f); // Cactus - TConstructRegistry.addBowMaterial(MaterialID.Bone, 192, 30, 1.0f); // Bone - TConstructRegistry.addBowMaterial(MaterialID.Obsidian, 10, 80, 0.2f); // Obsidian - TConstructRegistry.addBowMaterial(MaterialID.Netherrack, 10, 80, 0.2f); // Netherrack - TConstructRegistry.addBowMaterial(MaterialID.Slime, 1536, 30, 1.2f); // Slime - TConstructRegistry.addBowMaterial(MaterialID.Paper, 48, 25, 0.5f); // Paper - TConstructRegistry.addBowMaterial(MaterialID.Cobalt, 1152, 30, 1.2f); // Cobalt - TConstructRegistry.addBowMaterial(MaterialID.Ardite, 960, 30, 1.2f); // Ardite - TConstructRegistry.addBowMaterial(MaterialID.Manyullyn, 1536, 30, 1.2f); // Manyullyn - TConstructRegistry.addBowMaterial(MaterialID.Copper, 384, 30, 1.2f); // Copper - TConstructRegistry.addBowMaterial(MaterialID.Bronze, 576, 30, 1.2f); // Bronze - TConstructRegistry.addBowMaterial(MaterialID.Alumite, 768, 30, 1.2f); // Alumite - TConstructRegistry.addBowMaterial(MaterialID.Steel, 768, 30, 1.2f); // Steel - TConstructRegistry.addBowMaterial(MaterialID.BlueSlime, 576, 20, 1.2f); // Blue Slime - TConstructRegistry.addBowMaterial(MaterialID.PigIron, 384, 20, 1.2f); // Pig Iron - - // Fletchling Materials: Material ID, mass, fragility - TConstructRegistry.addArrowMaterial(MaterialID.Wood, 0.69F, 1.0F, 100F); //Wood - TConstructRegistry.addArrowMaterial(MaterialID.Stone, 2.05F, 5.0F, 100F); //Stone - TConstructRegistry.addArrowMaterial(MaterialID.Iron, 3.6F, 0.5F, 100F); //Iron - TConstructRegistry.addArrowMaterial(MaterialID.Flint, 1.325F, 1.0F, 100F); //Flint - TConstructRegistry.addArrowMaterial(MaterialID.Cactus, 0.76F, 1.0F, 100F); //Cactus - TConstructRegistry.addArrowMaterial(MaterialID.Bone, 0.69F, 1.0F, 100); //Bone - TConstructRegistry.addArrowMaterial(MaterialID.Obsidian, 2.4F, 1.0F, 100F); //Obsidian - TConstructRegistry.addArrowMaterial(MaterialID.Netherrack, 1.5F, 1.0F, 100F); //Netherrack - TConstructRegistry.addArrowMaterial(MaterialID.Slime, 0.22F, 0.0F, 100F); //Slime - TConstructRegistry.addArrowMaterial(MaterialID.Paper, 0.69F, 3.0F, 90F); //Paper - TConstructRegistry.addArrowMaterial(MaterialID.Cobalt, 3.0F, 0.25F, 100F); //Cobalt - TConstructRegistry.addArrowMaterial(MaterialID.Ardite, 1.25F, 0.25F, 100F); //Ardite - TConstructRegistry.addArrowMaterial(MaterialID.Manyullyn, 2.25F, 0.1F, 100F); //Manyullyn - TConstructRegistry.addArrowMaterial(MaterialID.Copper, 2.7F, 0.5F, 100F); //Copper - TConstructRegistry.addArrowMaterial(MaterialID.Bronze, 3.6F, 0.25F, 100F); //Bronze - TConstructRegistry.addArrowMaterial(MaterialID.Alumite, 1.1F, 0.25F, 100F); //Alumite - TConstructRegistry.addArrowMaterial(MaterialID.Steel, 3.6F, 0.25F, 100F); //Steel - TConstructRegistry.addArrowMaterial(MaterialID.BlueSlime, 0.22F, 0.0F, 100F); //Blue Slime - TConstructRegistry.addArrowMaterial(MaterialID.PigIron, 3.6F, 0.5F, 100F); //Pigiron - - TConstructRegistry.addBowstringMaterial(0, 2, new ItemStack(Items.string), new ItemStack(TinkerTools.bowstring, 1, 0), 1F, 1F, 1f, 0xeeeeee); // String - TConstructRegistry.addFletchingMaterial(0, 2, new ItemStack(Items.feather), new ItemStack(TinkerTools.fletching, 1, 0), 100F, 0F, 0.05F, 0xffffff); // Feather - TConstructRegistry.addCustomMaterial(new FletchlingLeafMaterial(1, 2, "treeLeaves", new ItemStack(TinkerTools.fletching, 1, 1), 75F, 0F, 0.2F)); // all vanilla and oredicted leaves. and all leaves in general. - TConstructRegistry.addFletchingMaterial(2, 2, new ItemStack(TinkerTools.materials, 1, 1), new ItemStack(TinkerTools.fletching, 1, 2), 100F, 0F, 0.12F, 0x82c873); // Slime - TConstructRegistry.addFletchingMaterial(3, 2, new ItemStack(TinkerTools.materials, 1, 17), new ItemStack(TinkerTools.fletching, 1, 3), 100F, 0F, 0.12F, 0x74c8c7); // BlueSlime - // Register all the materials for default toolparts TConstructRegistry.addDefaultToolPartMaterial(MaterialID.Wood); TConstructRegistry.addDefaultToolPartMaterial(MaterialID.Stone); @@ -805,7 +755,6 @@ void registerMaterials () TConstructRegistry.addDefaultToolPartMaterial(MaterialID.BlueSlime ); TConstructRegistry.addDefaultToolPartMaterial(MaterialID.PigIron); ->>>>>>> master PatternBuilder pb = PatternBuilder.instance; if (PHConstruct.enableTWood) pb.registerFullMaterial(Blocks.planks, 2, "Wood", new ItemStack(Items.stick), new ItemStack(Items.stick), 0); From a7f7258b047a77f3afcb47ffb4739966f029793b Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Thu, 16 Oct 2014 18:03:46 +0200 Subject: [PATCH 028/129] Throwingknife and Shuriken modifiers --- .../items/shuriken/beheading_shuriken_effect.png | Bin 0 -> 250 bytes .../items/shuriken/blaze_shuriken_effect.png | Bin 0 -> 279 bytes .../tinker/textures/items/shuriken/complete.png | Bin 0 -> 379 bytes .../tinker/textures/items/shuriken/complete.xcf | Bin 0 -> 9164 bytes .../items/shuriken/diamond_shuriken_effect.png | Bin 0 -> 247 bytes .../items/shuriken/emerald_shuriken_effect.png | Bin 0 -> 206 bytes .../items/shuriken/lapis_shuriken_effect.png | Bin 0 -> 180 bytes .../items/shuriken/lava_shuriken_effect.png | Bin 0 -> 223 bytes .../items/shuriken/necrotic_shuriken_effect.png | Bin 0 -> 259 bytes .../items/shuriken/piston_shuriken_effect.png | Bin 0 -> 356 bytes .../items/shuriken/quartz_shuriken_effect.png | Bin 0 -> 257 bytes .../shuriken/reinforced_shuriken_effect.png | Bin 0 -> 454 bytes .../items/shuriken/silky_shuriken_effect.png | Bin 0 -> 301 bytes .../items/shuriken/smite_shuriken_effect.png | Bin 0 -> 283 bytes .../items/shuriken/spider_shuriken_effect.png | Bin 0 -> 268 bytes .../throwingknife/beheading_knife_effect.png | Bin 0 -> 285 bytes .../items/throwingknife/blaze_knife_effect.png | Bin 0 -> 245 bytes .../textures/items/throwingknife/complete.png | Bin 0 -> 301 bytes .../textures/items/throwingknife/complete.xcf | Bin 0 -> 2367 bytes .../items/throwingknife/diamond_knife_effect.png | Bin 0 -> 206 bytes .../items/throwingknife/emerald_knife_effect.png | Bin 0 -> 202 bytes .../items/throwingknife/lapis_knife_effect.png | Bin 0 -> 186 bytes .../items/throwingknife/lava_knife_effect.png | Bin 0 -> 211 bytes .../throwingknife/necrotic_knife_effect.png | Bin 0 -> 225 bytes .../items/throwingknife/piston_knife_effect.png | Bin 0 -> 284 bytes .../items/throwingknife/quartz_knife_effect.png | Bin 0 -> 242 bytes .../throwingknife/reinforced_knife_effect.png | Bin 0 -> 192 bytes .../items/throwingknife/silk_knife_effect.png | Bin 0 -> 251 bytes .../items/throwingknife/smite_knife_effect.png | Bin 0 -> 379 bytes .../items/throwingknife/spider_knife_effect.png | Bin 0 -> 213 bytes .../weaponry/weapons/ThrowingKnife.java | 2 +- weaponry.txt | 12 ++++++++++++ 32 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 resources/assets/tinker/textures/items/shuriken/beheading_shuriken_effect.png create mode 100644 resources/assets/tinker/textures/items/shuriken/blaze_shuriken_effect.png create mode 100644 resources/assets/tinker/textures/items/shuriken/complete.png create mode 100644 resources/assets/tinker/textures/items/shuriken/complete.xcf create mode 100644 resources/assets/tinker/textures/items/shuriken/diamond_shuriken_effect.png create mode 100644 resources/assets/tinker/textures/items/shuriken/emerald_shuriken_effect.png create mode 100644 resources/assets/tinker/textures/items/shuriken/lapis_shuriken_effect.png create mode 100644 resources/assets/tinker/textures/items/shuriken/lava_shuriken_effect.png create mode 100644 resources/assets/tinker/textures/items/shuriken/necrotic_shuriken_effect.png create mode 100644 resources/assets/tinker/textures/items/shuriken/piston_shuriken_effect.png create mode 100644 resources/assets/tinker/textures/items/shuriken/quartz_shuriken_effect.png create mode 100644 resources/assets/tinker/textures/items/shuriken/reinforced_shuriken_effect.png create mode 100644 resources/assets/tinker/textures/items/shuriken/silky_shuriken_effect.png create mode 100644 resources/assets/tinker/textures/items/shuriken/smite_shuriken_effect.png create mode 100644 resources/assets/tinker/textures/items/shuriken/spider_shuriken_effect.png create mode 100644 resources/assets/tinker/textures/items/throwingknife/beheading_knife_effect.png create mode 100644 resources/assets/tinker/textures/items/throwingknife/blaze_knife_effect.png create mode 100644 resources/assets/tinker/textures/items/throwingknife/complete.png create mode 100644 resources/assets/tinker/textures/items/throwingknife/complete.xcf create mode 100644 resources/assets/tinker/textures/items/throwingknife/diamond_knife_effect.png create mode 100644 resources/assets/tinker/textures/items/throwingknife/emerald_knife_effect.png create mode 100644 resources/assets/tinker/textures/items/throwingknife/lapis_knife_effect.png create mode 100644 resources/assets/tinker/textures/items/throwingknife/lava_knife_effect.png create mode 100644 resources/assets/tinker/textures/items/throwingknife/necrotic_knife_effect.png create mode 100644 resources/assets/tinker/textures/items/throwingknife/piston_knife_effect.png create mode 100644 resources/assets/tinker/textures/items/throwingknife/quartz_knife_effect.png create mode 100644 resources/assets/tinker/textures/items/throwingknife/reinforced_knife_effect.png create mode 100644 resources/assets/tinker/textures/items/throwingknife/silk_knife_effect.png create mode 100644 resources/assets/tinker/textures/items/throwingknife/smite_knife_effect.png create mode 100644 resources/assets/tinker/textures/items/throwingknife/spider_knife_effect.png create mode 100644 weaponry.txt diff --git a/resources/assets/tinker/textures/items/shuriken/beheading_shuriken_effect.png b/resources/assets/tinker/textures/items/shuriken/beheading_shuriken_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..4512b6b1fe6d8fa79c09245ad05923f172235d24 GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^K$v zTwzFmq1a>!6yYrJh%9Dc;1&j9Muu5)B!GhKC7!;n?Dx0?_(jY_80Q)Qg{nMV978Nl zCnrd-Ry0mrcD`QOcmDsB?0bP9|Nrmn`d`7DcyQ^>SmS=hl>Lg#K;XPCO&mxa{$G53 zyMa)yasSSP|L5uV|MLz{|Nq?3{J={gwVJlC+sln=c9hJu`5(^q_SgC3ybtq_-+54< ndO`0J^W+;2OJYs>6c`v*uW;@y;P%=HbOnQ_tDnm{r-UW|MDJHV literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/shuriken/blaze_shuriken_effect.png b/resources/assets/tinker/textures/items/shuriken/blaze_shuriken_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..b30e46fa3001a15ee0be06cc0a7a971a6350e19a GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^K$v zTwzFmq1a>!6yYrJh%9Dc;1&j9Muu5)B!GhKC7!;n?Dx0?_{9v)heWjlg{FJDIEGl9 zPEJ@LVBqxff5edvCLaSgzbJ{rSI)(h9PTi82#%bi7*uI`xXCAPhT?zEk4((W%!mK8 z&b-5OMtz^rpREtlJZAixn)3bt&(HsPy)2P>3p5Pa`6fK_S#vL0DeUuZQ=ttS$L8^I zH2PNC8yn33(KW}!6yYrJh%9Dc;1&j9Muu5)B!GhKC7!;n?Dx0?_=PN%J{I2y6#DJy;uvCa zdgaPxXjOACw(ix!$o$B!xOO;&0HCWja!zKI4qklQGYJ|{+Y9yNk_60!-f7x za5r?km~-0lzSx-?b3PZTRKLGf9WEFs=;)%?oi1}Ane9qcry-NZg60(Us}jmvuZdrB z+z^q?n6XySN#gr)Z$*}|MtM=HN~;v40DQ| zxz1Szc`cb@w>`z&|9oEj({pkLo`*MYWjJ$cd}Ms0Ws4@;Co(5bw8Wo`>*pa%yPFh4){_s(>ZP~*c7|D}Cr_U^l^x5p zw0p6joOzhi)op)%EIZYb9Xs{4^d$3-4-ZeKr%C{s`$3hXsm#iHsLq@i9X;XJh^&i0 z*|`IM-QC??@y^cfor#@0nC3pluTarn7pWN)38Hq*UXd?+Rb&uZyfd zAhO|-NK>6i%Rw(UsMnlqoprq^bb9z--_J~?TY68X$I_d0tZJmOH5J}kmj@B}(t7g2 zGQPfyH_Q0P%J?C1a+z%T|MulJPU^!=TaRKg2e-&>VB-w!G86k|Rp_vWv>H~;AsVcmI9< z()>qx237X2uD|p4PyYFrpEBsVlgD5B@eeM4ckZR*4BB_-$V>0M{mx5A`WO__x4!)? z@NjVv!qkzzDF*Eu_)4D>^w*~3?<#c{?O*)4@~Ps_rG{L9T$L2>s%mn6v7fNX+6ZEA zwvlezn_)oSr}-LL0k5E~lltj6~>r;JdEgv zRk2E4RX61Z@g1wdYe@dsFBXrX4sIP={KYX5d>4d^5J8u{987KT!4qW&h7^^%G_Pt)KOa;Cri| zR5L_LCNGj_0#QOHN+*}ypC`(EKT(!=pe(Zj$_gJqNx3YFxENNTXKX`b(a@jpgM7h*MlqDW0%dCL1!Us@NE{h^A zh85@;+tAoFN(Ge45WlLz>rtN=&>QNMOMRb9H;{+<*rh7^{zK+tJw8@z9O!;ckeIrg z99qJQaZuY{sjK}m<$AGmS$qx4elv@4zGA)hs`Y*rQ^vA&-yOM-ha<5KLf+OcO66BlG91vGd;qiy0;RzV+&B7H5>~o0i4+ z*&N&v$Do7b{Gf;9^}$DnWAJqk$KZJf$DoI!!@)7o;o&&h@#t`Lob+&X3^+JC92|x+ z(G!DGrD~;G)k#3rqZd9VMTOykj|r(B+B&4x!YT-B6MdM=d#T-j%f8{!&esZS242jW zsI~|94ciFNd4m7uGG+61@Ryak;D1pb7GKy9BaD&SxjYb-nead-7As%p%0L)wCn6c0 zM!49CzVunRvokzHO?U-KFo2~IUPcZ|5I)seAcfI8jZRDfoogQmG5xzjO#h!loc>)Q zPXECnGUx)RD0B%d{eqReMrzPU{JO8yf_LUX9}FDBjjUd;{@GvLHQl0qwdS%fF}U-X zy8Xd>7%`Wbwwvhc9^>8>2EH6hm%}=gD-?2AOO`d2T)`+9IiD2C6mwXJH0Ku|B`iZQ z1F>};Xr97kRNztsg}=hq%?TUV+j36eUT0i!gBcn`gKQN0tpaM$F1*Dxt^fgR83`g5 zq@a}`*po2@pS}`TRbfH<`?-B(ep}=mnhXVZo7G#|0?Lo6flHYmZvah=5ukcq8gTVK z*wD^f3jdI$?vZzoDoi1tp;aF?g+$!u2U+7CQ_8x>nkU?JSGPt_Ip^eG#0X+{9GvP6 zVw%VYpNMebF@p7?)3zdQ>)(%UW!lz*16!H4)lEB#w6nkd@GR5Le(%k*OgrnQ>4~}? zb^7~Gzj`HJt)b;@kx@kr$;x^{FO&uxPxa&0UBlNXosr^~1#8cBaB0a;9y~b7nmG8I zw-0Kn{#H}1AA*g2K8^*-UTBi%Vb96u{#$WRQ8wYMYOUxA#3}gNzi?>zgtK<6Qn&W6 zDK|*b#7@U&8e*Fr80rPHwF9$@CVnwY8zKfTwU_}&Ft8n|NPENFffvU!o!-%EGMxn0 zB!0<*kZKX0sjY?<2Y1sjal|ua4RIuhBLN(VTf~w0(JkU20gi;NsTSdxTErp2EJk}H z0UQb7pr&x^M+v5rxDs$cN)QLN@Js?6w-O==BLN%<2S=PZ;=mFAfH>lBd_Zdw;E3Cr zY7w5PMH~{~puG_XjyP~oQ~2PGIMYd72{<6diGx~rCIOBQ;v#V)4jgd@hawKW5OTfq z;pL^QFD2#YBQtBD(yYT({Frbam_cC}X7>xx_8}rNyfxSKlVFuP(};NbwS;I{VTHYR5)uK=LEI zwq9a`(8>q#>f$agY*!aAp+WM{j-b_;1I@DtVFUdSU!da)*Rmwpb`m>#js7pt{{`&t z#6~Lo5AOo*_7MFe2mCie*nsBtxpO?X+1!Y8HuEWrT9*&# zjXL$*ma}pz`bf3DCZTq<`b8CkJ5Okr%arwt(7sAt=&vaE;aG@u&zhg-fo;W_G0hns z;_g}V=F1TiTHHc`kJOXL;m)>OAKCO)6+3}i5*BJ4#emsHl4WpjRdst z0{$BVN6lPM*#Vr6-P0zA!#9bUZygoIW-6A)u}?Xsns&98g;KVmOf(5&seHTeHz<4 zsK6h!a1po^+pBU~=%N(eV`<@JtMaS=Y&z^n>Tr`%mZe%x>crfhs4~?5SVyfc^pc}U z*c-#?Z7=XM*+;lx}yiRPPPsGaVK?o+0rE}01oOXKwYhwGEz0lFjt}* zQtEn&1u#Ql1^!}+kj;?FX<;p;y2mXoG?^?w?FL6u8)`8cQp#-7iMhw?Sb)^U)LM*< ziz!QmOco$@kpm=Ug(0E7#%H$w<+BYeR72vc z`*u^8Z`j)1zydT>sdMsOtcW&NVct1#DAkqSKj@jp>xO09yH)+IV&?u(iFo&99!3n6 z$Ux=riQp2J?P|2v%Str1cW*3;Nhd!jG6-!kis5JvM!BTK1~L5Y!59_`yLB%%9V>fV zMKouFgSKRWJ&u<#2EL16e@@1Go6!iYZCbfZ$&^dV*cT#W?g ze0Pd-*s2ug?ihEBxy3socjo3q=H?vk4(c2UczyEOojHLTO#uc?0UnJ79t~IGzf{JT z>m7UC>N-yDd;J9Q9*Am`p$Y(}f6hM(w6ng2;w;h5E*J~O?BasR!tAWb?5x8r5bXkA zpk0_1sDTy?qJsxo@IY1Kfwsh#>m7Tbb)4My`U&Da5Y;F{6#!2EtUm&@5nrYlA=*gB z$QY4Dv{EL5`-Diu;c$N@NWcrUnTS9Qv|tb&JkWv%suB;hCB9tm*aNNOZP2$%{|$%sq{o<;`y;5cF>1yc4)_g2YR)Bf@M6fqdh%ljS|lT zx2OMoer@(PTgcXe-?{WtHiK`}=Q3zr-Nt5GG>AWm6I~KJ`Q-9)(n$JciHt~c`Q}Z? z|1HVn&6`@0ym{kB5~eron@KdVk^J<=Wg1?-k;F>pPv$Qtlb4YN7ir05VG91R=OocQ zZllYLmXhV!^A+Clqm_=&j9z%63do9!&Pd|en&gjG|6hRBZh_C=tyW>URAB(t>njE4 h?z9dU2lo{J1%sb*zDnv!KQ{)D$A`Sk|KOeL{{ng8P*MN@ literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/shuriken/diamond_shuriken_effect.png b/resources/assets/tinker/textures/items/shuriken/diamond_shuriken_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..78dea30dfe4e0ded46cb749eb25281fb73636f2c GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^K$v zTwzFmq1a>!6yYrJh%9Dc;1&j9Muu5)B!GhKC7!;n?Dx0?_$64`Q#NY>g~~l$978Nl zCnqdmdthk(!@ny^!cEYmuJ)I`;jF9XXPp91vn1D8*3Dy_u4o{=boFM53LRd_b6vBH zgi@^xi(Ir-j&<`$G#dY5Fw-|m4DQet0IK1*o%H9|m-?^1n>Vnj*;(?i?htus(z4)X kMwa0xrj?luSua@`!6yYrJh%9Dc;1&j9Muu5)B!GhKC7!;n?Dx0?_$4egxX-Tz3i)}uIEGl9 zPEL?uW#*SCJSAfMC%u9pRolS8;7d~Y>6Xh4>^wYu+))w|Ogs_~*e0ehFf%)=`ZF*e up1i$c?}4UZx5mbUx-RSwTLTR`7#Y6o=8C??(fb2vGJ~h9pUXO@geCw*YBz8I literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/shuriken/lapis_shuriken_effect.png b/resources/assets/tinker/textures/items/shuriken/lapis_shuriken_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..7423654debca115553979cb6d03c55b58689f43d GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^K$v zTwzFmq1a>!6yYrJh%9Dc;1&j9Muu5)B!GhKC7!;n?Dx0?_$8Ik6tPbO3YmDiIEGl9 zPEL?uZI&s>4FCK5(z;*%+n!B&x&GhoXR$}JIk@ed!`|FH{^9@i?~I=gX)I7?V2EuN VS(IZvF9fKc!PC{xWt~$(69DKjH>3an literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/shuriken/lava_shuriken_effect.png b/resources/assets/tinker/textures/items/shuriken/lava_shuriken_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..c00071a8ae67d13999b79b58b144c935ce0c4d77 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^K$v zTwzFmq1a>!6yYrJh%9Dc;1&j9Muu5)B!GhKC7!;n?Dx0?_@#N3CS}|P3dMW6IEGl9 zemmKbufc$W<+%CJM|K_Z6E8GhU7%TYL+-A(u!NazfWTHpi6fFX+}B*1V#<-dyQij<1Km@b}B^x!Yh ODh5wiKbLh*2~7YuuSuK$ literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/shuriken/necrotic_shuriken_effect.png b/resources/assets/tinker/textures/items/shuriken/necrotic_shuriken_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..ce3a0fd98a1126bb2849b53476b559d6d8ef60b3 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^K$v zTwzFmq1a>!6yYrJh%9Dc;1&j9Muu5)B!GhKC7!;n?Dx0?_+@1?>+f3vg_=EG978Nl zznyTF_izA5v+s6?H4hI~<&=Ms>M)Gs=e-zQH;Zq=`!>}ao`T|z-TdY9>7UOeYfq3- zx&HHSRi7*S$+?}fk~%9VT#;JE#h`HV-zvwVFE8CsE*G73#>GWJX~N9xsi(RAuKD?9 zr(fvJr>uK*PO3zPCf2?2Z(g;@@7{~uUuNseyVkqp>bPks0iDC(>FVdQ&MBb@0N9*c Am;e9( literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/shuriken/piston_shuriken_effect.png b/resources/assets/tinker/textures/items/shuriken/piston_shuriken_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..7942da505efe00276f105b8f0fd3cf91900b3e89 GIT binary patch literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^K$v zTwzFmq1a>!6yYrJh%9Dc;1&j9Muu5)B!GhKC7!;n?Dx0?_~m4sf_i=dg`Rl2IEGl9 zK0C=U>xhAX>-?5%(PMd&m{*tzJ&|gAAiTq1#|cZO+j$cYX?|l+TpqAhVPY7&2bXjW zi}uumOQ&kB|9$lTnKSYyj#SS-c5Yd0x6EckHO4(Q_C^1HJ$!q(Tj}_n@3yzM74E&e zgNN5aDE(|y_LgfRt_N+-TRfk!jI&Zrp+zC7heI*q`qb1&h7H%|#VfWbG^F$>9^3J{ z=9}}s;D1K*Y-aTu-c!6yYrJh%9Dc;1&j9Muu5)B!GhKC7!;n?Dx0?_!Y#axccz}g&I9w978Nl zCnqcrFfcMOFgQ|m^M5<1&b_h;g7ewdWF_x?^FQ8d-|PRoub=;?tbJhF&%3YF|Le=% zXAM8jGI>hi#l(uD=Uj)6w4N@!WmovHs7<|moxzC}FCLi9oiLwsXORex#sUqgiNO+f y&J(UCEOCk8I^ExYB(u7%M#bi6khyUn6NB@T^tHZs*L4CN!{F)a=d#Wzp$Pz&Hd>$n literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/shuriken/reinforced_shuriken_effect.png b/resources/assets/tinker/textures/items/shuriken/reinforced_shuriken_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..059b078ef8747105540829e118d8b2781b54cc48 GIT binary patch literal 454 zcmV;%0XhDOP)Px#24YJ`L;&yr)BtDbA%Zmk000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^)0 z4c9dz869v^;{XPVK|))aS_BF$t=u|c99rBt)5$sS^X7a2vmFJ=*9(%bPt(w_ zMp5!D_`cBfhC)&DtuP%4D&})u$@w0MYF~rx4iM)PSWjmjk1nDI|4uN0m7WU4sG+Pq zpk>rh?=-}G&MQqdxIObNo};2-wV|2saG8TRmjopo6r&2+tc%yD!&2Z1$NT52rrT^V zjOlV}8=2HDJT^kdQ8CY_K}iJdz6|B7%MgRZ+ literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/shuriken/silky_shuriken_effect.png b/resources/assets/tinker/textures/items/shuriken/silky_shuriken_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..34bf94e5270c81cbe1b1330fbdf373258002d582 GIT binary patch literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^K$v zTwzFmq1a>!6yYrJh%9Dc;1&j9Muu5)B!GhKC7!;n?Dx0?_|*dV{!7l#u%sX{O~% zfBvCM!YuDzAAZ1Xa-Zpdg?~PiQmqlExBsNw`5#jm816pcWq9&LLt&E7;q85&Lq2*j zb>@9&iIWrO9nBQh-S@Em!)?i!s$!6yYrJh%9Dc;1&j9Muu5)B!GhKC7!;n?Dx0?_|>iF-EP?n6q@bn;uvCa zIyqs1YQXfzKiBIW|13XWN-U?T=+T`2J1u8OPEpw@0Rl55B>&a_{W$&M#nbP5TyD!H z>Hn0Mo?YhPH|MjxW!B6Do;<#^MRTNp!t-Z0OB!$4t9zuQtZ{p*giYCu6=H0&KH2>5 z{Mxk4X4)3VJcUbq0<$Mbbb6lpKCeFcz|<)lpRvw3RR3S{pRs{~!JV2ftrOGYSQ&OT WSp>~G_WKdgnGBw;elF{r5}E)a!6yYrJh%9Dc;1&j9Muu5)B!GhKC7!;n?Dx0?_%&G%T5g#E6zcJGaSX9I zotz-Sy0~H5feyzP`&pZB)N4$aoNlEyM{R?lVaTx?#u9BmZ8Xmh#_ztMPOb<|3eo z{)s35{^#``sn^!lUNh@sTO;S^Ft%sH@seh5|DH)$qU>B%us>S)W4)uAdE9h)#$TdzocA=WdDNVaqn^W*^+VbWzzw7_;d?`IF9D2VvV%lqCpZ@!t%yjjn$uIsJU zl3wyFF2VLj&UhbOQSfsBKE3qv>oIoV8F&&t1wRyFt~-eOCB(fRWas>9(R1g#y1xdB zFs{&Sqq$LW^+v7YuNj%ylDAr`)av?d80PBUN>MlG&Cn)*lhKfYsVftv#^d_$0Z(l; z){Cot;OQshwLor6A|r0@df+#8KUlryHh6xmRBE`*pBv=azfvP+=Ttt2DX&wIrS#zNm4DfppddW zJcs5;TFJtI1W*dJDiRnTR$6LH5re)Ul|EV*FW!B0M~Lmd2=jtVBeT%; z{X(bP?I@k0MQLny=Kp{47v9MUQe>7Aau+4#G)=)%z^O1YpQWLsOWcQXqw<5=pU0QM zExmf-HC;Ww;s)VYF>dck&x>dM>F34kMwZ%)K)h=_uhg5JTEImfssHEm;gnJar*`-sMDn!ajBvKr7deS4s3Qql!hHK1w? z$Y50iss>aIr3F2ipzX>@#%&=akU)yCHLyJVz5?m=hp*|D<<^<^MAS*61>RB(yt>B z?-sp~?(XE$?>Rq8gL0m-^u7EfPZ@;#C`4Hl?v0ZV`(f68DtJQsY5TX~jA%o8aON;+ V|KLKm={}l5L)&D>TmyHMegKzgQQiOm literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/throwingknife/diamond_knife_effect.png b/resources/assets/tinker/textures/items/throwingknife/diamond_knife_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..a010b129f7dd0c3719c93264ea1d17f622538bfd GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^NiR zUNfBDb~rWwD8gCb5n0T@z;_sg8IR|$NC676mw5WRvftwp;4_uJ)4XpYP{_~I#WBR< zbaH}3QN!^&5A6GQ9<1MFDz)G4?|hx!SF_U+ub%1fS7v5rZuaQ0XWqTXgt>pI;^D}^ vV4kl&KXTNU%v`|OVj|3{XE)7O>#9+v>0xzffBA<{r0FHaZ85R22v z2@{XE)7O>#9+v>0wR&#;`x!tXD^C~45R22v z2@=?9HVcL7ad@O1TaS?83{1OSRuI;#Kx literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/throwingknife/lava_knife_effect.png b/resources/assets/tinker/textures/items/throwingknife/lava_knife_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..66f46344a89ba3778b20f385aca4fe1c9f865496 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4Zmr z1_PEQ8LxmW&H|6fVg?4j!ywFfJby(BP>{XE)7O>#9+v>0m2l_*tsJ0Gu&0Y-h{fsT z1c{;tI?RXvZ|33opID<7Wco^9{XE)7O>#9+v<=6PNn8kOZJmqNj^vh{fr* z6F2fU81S&1&v|HDXW(_iu)3lrfVEMCX@^Tq=FfANr2o}ezKgrN_ugCIy$^St5p@un z)F!lhmtJQF!-6SE{jBa4EM=_u4<{=yGe=}wF~5&Lafl(8e1> O7(8A5T-G@yGywo4=tolk literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/throwingknife/piston_knife_effect.png b/resources/assets/tinker/textures/items/throwingknife/piston_knife_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..211a066292a85939ccf7e51ea60c56195f95c4a8 GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4Zmr z1_PEQ8LxmW&H|6fVg?4j!ywFfJby(BP>{XE)7O>#9+v<=v&ADq3s1fN z=lS0I|AYBQBu+nF^7OCT)=kCh7-IUX-}S5C6<|GZ<&^K`4LaQ0_bs=TXYew2nJ9HL zs(Y(gGS6cRA*Tb?{i{yBi+1$#EIQZ0@!7`MSD0Z{l)d6o6^Fue6N}?MzhBdT=f;mG ZtmO;L5C8bflLK@ogQu&X%Q~loCIH5OW{dy; literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/throwingknife/quartz_knife_effect.png b/resources/assets/tinker/textures/items/throwingknife/quartz_knife_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..e7410047cbaa664e8d2599498ff641c0f2a29c46 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4Zmr z1_PEQ8LxmW&H|6fVg?4j!ywFfJby(BP>{XE)7O>#9+v<=8=uSf&|08Sk*AAeh{fsT z1c@SrYp4I!ubKY0USfV{NUyNCp8EM?P;TA#Uy^NaSq?XJPMs~7wz+}9{-@&q_us?UY!jB{_E~eM fhi7qu05ij`NXtF%0_0nPwljFT`njxgN@xNAs)$sx literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/throwingknife/reinforced_knife_effect.png b/resources/assets/tinker/textures/items/throwingknife/reinforced_knife_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..10f2318373f4369ed4227c3a7a25f43cbd4eb0d1 GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^K$v zTwzFmq1a>!6yYrJh%9Dc;5!V$jK}j=qyPokOFVsD+3#@)@N-)5T)m?W6msx%aSX9I zotz-S%FHiO=xL%N^S}R4d_rfaF1Ov~_cpc%4*>sc?F=?*;CP*n)o_ e*Io3G6JlUE=guR}*u5KMCxfS}pUXO@geCx|_BxaR literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/throwingknife/silk_knife_effect.png b/resources/assets/tinker/textures/items/throwingknife/silk_knife_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..f9477cc83b4d6426bf6aaa0a63e29da1bdc2cc7c GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^K$v zTwzFmq1a>!6yYrJh%9Dc;5!V$jK}j=qyPokOFVsD+3#@)@Ut5gHB0OU3RQc$IEGl9 zPEL?8N+@0X<^R>Km;T$wc>dqNE9{rO&zy-8y*xm$?x7us;$gBfmITS_FEE}wu@MMb zMZog%>z4e#zqg1xMwVOe>ifYd5n`RXN45is{RRFVdQ&MBb@0Ay%U*Z=?k literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/throwingknife/smite_knife_effect.png b/resources/assets/tinker/textures/items/throwingknife/smite_knife_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..6f206daae19aa646ddaca11045b0a49f2679ed2d GIT binary patch literal 379 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^K$v zTwzFmq1a>!6yYrJh%9Dc;5!V$jK}j=qyPokOFVsD+3#@)@C&kAtjP2S3jOwUaSX9I z{dUqu@52rfNAFK}sk(k_A)lt8)IrylGV!Pr4_?e#TAwH$?#}LbFm}40tX9OWg|a@r zN7T+MDr~%-aNz3peedhO-z#VT6Btx(@FHW9OR(jPGf69XEx2Q%n0S7>cTCnjwtan& zw&R71IhxYT>x6eDKK_-bxBEen(BlG;Up-FqfB(7o)NuDaB?gP#Y1e~gzT9%VvMJ`R z!;%fU$*YwLwg&HdXI&7Sug5N}rf9IZdH+daBls=?nGU Xu7tm!6yYrJh%9Dc;5!V$jK}j=qyPokOFVsD+3#@)@C$J?TdB(eg+e`D978Nl zCnrd-E@ogiND}y!e^BAu{Km${nG>Sa)-1~L;hAdqjVFqSsouj(VS@X|`UMN^4!6ph zOGq^_OKg!~`8W9ut1esPe@m%b|4&}($vMH%S;VleP|$X6jC=&p0tQc4KbLh*2~7b1 C1V9G> literal 0 HcmV?d00001 diff --git a/src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java b/src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java index ea3a6af54b0..0678e3eeeb6 100644 --- a/src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java +++ b/src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java @@ -39,7 +39,7 @@ public String getIconSuffix(int partType) { @Override public String getEffectSuffix() { - return "_throwingknife_effect"; + return "_knife_effect"; } @Override diff --git a/weaponry.txt b/weaponry.txt new file mode 100644 index 00000000000..9e656d4e301 --- /dev/null +++ b/weaponry.txt @@ -0,0 +1,12 @@ +TODO: +* Effect graphics for arrows, throwing knifes, javelins,... +* Separate book explaining the system, text only, sorry folks +* Turn dagger into a proper projectile +* Reinforced gives a chance that projectiles aren't broken on entity-hit! +* Toolstation GUI for weaponry stuff +* Partbuilder stuff for weaponry stuff? +* Bring bowmaterial stats etc in line? +* Can't have flux or redstone or moss on ammo tools + +maybe give javelins slight armor piercing? or do they have that already? + From 62905da39273bf00161f57ca114379e64982ba54 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Thu, 16 Oct 2014 19:34:52 +0200 Subject: [PATCH 029/129] Crossbow Modifier Graphics \o/ --- .../textures/items/crossbow/_crossbow_1.xcf | Bin 3330 -> 3212 bytes .../textures/items/crossbow/_crossbow_2.xcf | Bin 2835 -> 3035 bytes .../textures/items/crossbow/_crossbow_3.xcf | Bin 2851 -> 3117 bytes .../crossbow/beheading_crossbow_effect.png | Bin 0 -> 229 bytes .../textures/items/crossbow/complete.xcf | Bin 0 -> 7899 bytes .../textures/items/crossbow/complete_1.xcf | Bin 0 -> 2816 bytes .../textures/items/crossbow/complete_2.xcf | Bin 0 -> 2728 bytes .../textures/items/crossbow/complete_3.xcf | Bin 0 -> 2580 bytes .../crossbow/diamond_crossbow_effect.png | Bin 0 -> 207 bytes .../crossbow/emerald_crossbow_effect.png | Bin 0 -> 206 bytes .../crossbow/emerald_crossbow_effect_1.png | Bin 0 -> 223 bytes .../crossbow/emerald_crossbow_effect_2.png | Bin 0 -> 201 bytes .../crossbow/emerald_crossbow_effect_3.png | Bin 0 -> 193 bytes .../items/crossbow/flux_crossbow_effect.png | Bin 0 -> 254 bytes .../items/crossbow/lapis_crossbow_effect.png | Bin 0 -> 209 bytes .../items/crossbow/lava_crossbow_effect.png | Bin 0 -> 193 bytes .../crossbow/necrotic_crossbow_effect.png | Bin 0 -> 239 bytes .../items/crossbow/piston_crossbow_effect.png | Bin 0 -> 274 bytes .../items/crossbow/quartz_crossbow_effect.png | Bin 0 -> 209 bytes .../crossbow/quartz_crossbow_effect_1.png | Bin 0 -> 209 bytes .../crossbow/quartz_crossbow_effect_2.png | Bin 0 -> 260 bytes .../crossbow/quartz_crossbow_effect_3.png | Bin 0 -> 253 bytes .../crossbow/redstone_crossbow_effect.png | Bin 0 -> 154 bytes .../crossbow/redstone_crossbow_effect_1.png | Bin 0 -> 154 bytes .../crossbow/redstone_crossbow_effect_2.png | Bin 0 -> 166 bytes .../crossbow/redstone_crossbow_effect_3.png | Bin 0 -> 160 bytes .../crossbow/reinforced_crossbow_effect.png | Bin 0 -> 200 bytes .../items/crossbow/silk_crossbow_effect.png | Bin 0 -> 178 bytes .../items/crossbow/smite_crossbow_effect.png | Bin 0 -> 229 bytes .../items/crossbow/spider_crossbow_effect.png | Bin 0 -> 223 bytes .../tconstruct/modifiers/tools/ModFlux.java | 9 ++++++++ .../tconstruct/weaponry/weapons/Crossbow.java | 20 ++++++++++++++---- weaponry.txt | 2 ++ 33 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 resources/assets/tinker/textures/items/crossbow/beheading_crossbow_effect.png create mode 100644 resources/assets/tinker/textures/items/crossbow/complete.xcf create mode 100644 resources/assets/tinker/textures/items/crossbow/complete_1.xcf create mode 100644 resources/assets/tinker/textures/items/crossbow/complete_2.xcf create mode 100644 resources/assets/tinker/textures/items/crossbow/complete_3.xcf create mode 100644 resources/assets/tinker/textures/items/crossbow/diamond_crossbow_effect.png create mode 100644 resources/assets/tinker/textures/items/crossbow/emerald_crossbow_effect.png create mode 100644 resources/assets/tinker/textures/items/crossbow/emerald_crossbow_effect_1.png create mode 100644 resources/assets/tinker/textures/items/crossbow/emerald_crossbow_effect_2.png create mode 100644 resources/assets/tinker/textures/items/crossbow/emerald_crossbow_effect_3.png create mode 100644 resources/assets/tinker/textures/items/crossbow/flux_crossbow_effect.png create mode 100644 resources/assets/tinker/textures/items/crossbow/lapis_crossbow_effect.png create mode 100644 resources/assets/tinker/textures/items/crossbow/lava_crossbow_effect.png create mode 100644 resources/assets/tinker/textures/items/crossbow/necrotic_crossbow_effect.png create mode 100644 resources/assets/tinker/textures/items/crossbow/piston_crossbow_effect.png create mode 100644 resources/assets/tinker/textures/items/crossbow/quartz_crossbow_effect.png create mode 100644 resources/assets/tinker/textures/items/crossbow/quartz_crossbow_effect_1.png create mode 100644 resources/assets/tinker/textures/items/crossbow/quartz_crossbow_effect_2.png create mode 100644 resources/assets/tinker/textures/items/crossbow/quartz_crossbow_effect_3.png create mode 100644 resources/assets/tinker/textures/items/crossbow/redstone_crossbow_effect.png create mode 100644 resources/assets/tinker/textures/items/crossbow/redstone_crossbow_effect_1.png create mode 100644 resources/assets/tinker/textures/items/crossbow/redstone_crossbow_effect_2.png create mode 100644 resources/assets/tinker/textures/items/crossbow/redstone_crossbow_effect_3.png create mode 100644 resources/assets/tinker/textures/items/crossbow/reinforced_crossbow_effect.png create mode 100644 resources/assets/tinker/textures/items/crossbow/silk_crossbow_effect.png create mode 100644 resources/assets/tinker/textures/items/crossbow/smite_crossbow_effect.png create mode 100644 resources/assets/tinker/textures/items/crossbow/spider_crossbow_effect.png diff --git a/resources/assets/tinker/textures/items/crossbow/_crossbow_1.xcf b/resources/assets/tinker/textures/items/crossbow/_crossbow_1.xcf index b2ca3b262119a04eb737a78a847ae30b7ecdfce0..9de2a1db22cbe7bb6fa91c46a6ab5eb5cd8d7817 100644 GIT binary patch literal 3212 zcmeHJJ5L)y5S}|5KhJ>(LJIP5q!dsXfdnL!;V(pKgNz@?DSjXy&kBhm59uTtOOaAt zoqrG{D=i(Vj)FEnAQE|ju{YoB?P4RGnj%?yZoiqGx!s%nZuV@ax|ZE8l(S{0QX;ew zC5&%F3nXP(7agJK)f5cP(FVYIb&3 z&jsVoAfvM7Hfqj#)~OX%OD@OP%VoE;ez`!7zHSOFS3@}uF*{$a=2b>$Y-W0H9>2xK z#iuiKbBha47Up?OHRBT!eIG#qQSxPIOn*~@daF3|t%#?aUaQ&c zXe#d*dfqbuNhr*bNrll-st>38u+@h%eRvp{@1z^B#SN%sEI|L9}pciG1FO-h)qeLBmYPuquDvxhtq|B!oC-Nd!N#*g&nl(#@?7k zUH1D2<`bMxf$c{=!2uySpA7Izk|ElcXqdW!cIh2&gx)D;%H1Bv-1P=1wmhpzc2nef zz-tU!^os&|$skws>s4FyJL@?-ttG`2QR?_@iV&l=-v%)ZjC7ETNXVgn6BWDDe#4V7#WB%|Fh!EOJ_5lz0p9&z%HXUZIWj}?lHptpQqyu1 zWg=BZrPl;+vStAjcdSQTE|53QS`>8M;;$9b>ji7$AFkTsA6ZY(P%A;*RuBn{y%=4z zg20dXaWVqaPf)u>fsgmN(`tiOA(NA^2Ejh8-1F!;_iO<0CBTU9qa<+8m9p3GK~Ga> zkFWpk+)=!+F%gF(P$Q5Z`Cj8C7Bm4v8s#7bNdsGbA}M>1w@vRW^Ki7EhsB+nE}n9I zyha@Se5!NP%LNTnk3y5SrDj=w&L`|KA0p@uJ#dLjoOkGX6eC&s$U8jtQ2KtzBIzBU zo_hEwkms^N=iVttnV}w`ws*K0s;H<@GQ19Ajj;5_=ojuw#Pu{zXPy9N@^-z=|EuWb z;zd{&~w6WZL0xgv);14YmoQ@z43jz literal 3330 zcmeHJJ8u&~5S~3d_W31(5@>?ZNl+w(g9A>$ZBSYo#1C+s^I^$$LhMLM70D7v&?7pu z1r-G~NEixq5*6;;^8;Kbu^k`Z-0eAc!6_(0kiuGX^Uci8zGim3R;9LO?3T(#xl%O= zZCVlIs~{opnE~mmUyp7x0ndV>pgGWWg}L7~^j`&^wlHkAQY%_!*4nOYKt-?%nr}4s zs;1G{tX4J_lJjM&v{~KUHs)QH-L}??Ms6|Zwh3TKnHJ!>KEc(u8)pM{-EC|YOO?81 zEctUmxi?9vblIJHrD;^^rKe_t{Wr_yhS?l1kiCCbd77{*pF_+l)@ns{A~c&@%rE0t zC=?##^7+Eb{gq|5sU|+*pmB0jKZ)Wmh!O+e0`7+jcA8zohRpJ}&sNhk*4E9sd25Ng zYWzWqfjD9gNLLt)5&@hH;8Xyo12_}FSAcmezr_J~4sO8=@ie48Q@~$0`fAU^I_)*f zI!(28676Vr)S@XGwY#Dlkue&|ZdVGa)1XaViM4|h^O2-91Xx|A$3^=Xa#HDCE?FM7 zp-zQZnlMrN(#^ZinG?>V%p-HhPoO*-CnXNMop<7J0;(2$uRtJiqF=(g=ns}}(#Sy^ zPkn@wCZC25t^jhtW15p1TYRUve`=I$cr%%^L~kG1!x*^7zy&%~CxY?4$Ht3_FBcot zVy_ek#5eXftc!hMd4@(E#CO=C4uaV45Oq4ZwMPu_OOWUc#^?%n-lvy;+lw<$qPf?()7bDo9+>RnzY%;4c)_TYnhV>5p0VsyB*u zq$^q|+FX|Zyn1`p{G@6_o>;wGT>1mm`!dZNbrKYF;vk(g2WN#8;~Ya)%|Vf(2$T_U z4HfW&+#+&=L*>Wvbkey`hl@%&o>#TxI|clOBI%MJ!@A^mma$KXLy!@E3*gBh@$%6m zKN;{saGwkea5e+!^qBW0^?Ejv^?(g_&$i(v`%KlAc|YS M<%8*u1uyICljbwghc z=7MqWHlwm--`CBKZq|$2rZt!T0 zA82t1ZC!ssX+!kG}B2;s>Pegw?#3R(hy=inA5h;JdSsX(xFjMYAl+q5q0 zSrT%>6HP{GXuA|4My~Ci9)d&>;DPNyA&2-+5vVSEd^Jix*-H}tR$@uN*m+%n9`oKJ zHJQXDr|45OvL(+wl9YK^#;6mjdLq$ z9yKBZVELzJ*l$LG82pmW7({6+W{1Cl+d*UlXm9voi}dQ5DP!>x`o`UyqP$^>=&~1vE;+ z8X{JBbrSFUjrS69HBHdDC4rf-BWvej6<4{~@M|QKE&}o~A)`usebOT&`vqUe!4@+k zXG4rM>m^*}cTGxs(FHBNtWdCGkTU&t+?L*8eVRsHToZ#M>M}Erh>p7`S?9Rj*^~l0 zwvRm|xfgc5S_JC*GU?+sD(=rvIK|rkSc|=kZTcFZisW5I>u5ys-~4%E=ak-A3)-O z{2P!sT1ZGfaPln@Kf*`UHc4&X*t=~~3OA?(Of)-hXLfeiJJ0JlZhO}{Y&5N=+p-C= zAeHeAs1Rrtq2|`7(|fGIOVFIOw=G%g`!Px35T5aqH)RQxAK)^@iJVtaY^( zoJUtVrLTO@arZ5^(|BR`IKSI$_U!%h4RZF6uFNx?%I9D>^>({1PlT2#Yt;?>YPH&< zO0`h6n83ve%!_d@O9`s*JTT9tWEMch6fJljDOytkwPB3aUQYY8H{8ENaYAz>l1#Ov zNaF-sFVF}k!KPu+zpxlDILYKjq9KoAmrBx;0%@2NLyCXR8fAW*5;y6C{TdZ)9ynLiIWcwM|qiwh;$e9q9*l+H|Ok&Hm>3}J^!xT z$#_2PGaT-lG~=5je0?DL2F3nB40O++u{Ria!o%C@)4=0b+b3chdpNL>k7(-5tnkm! z$9<6cQ|obm?8A-QLYY1%$9**a*0OohlRO#8EYwV~x&%R~W!!>AIExc@F1;DGB)vaw zbDdNnFEehPgV)74URR2V?_nxxqhOr*W!h(c<$i&5@JjP^=F$u|8hT7QFf64U17??( zL~Ms1MNt6C9CILuf&gj4JH{XiIHF@ljp85@Q5;}4;hiCN;SrdMr_^Z_L~jFpk+2r8 xErJuI19~(|Czv^fCJi%Kz?}X6+x?xV`z-rZGShYZ7vQ%bCpGJr@Frv`lJA}F(&zvH diff --git a/resources/assets/tinker/textures/items/crossbow/_crossbow_3.xcf b/resources/assets/tinker/textures/items/crossbow/_crossbow_3.xcf index 2c9b2cc846b695a088337a6dd91fc2f4e0bbda61..2f7782ff7f82dcb931cec21cab9871dabd5b033f 100644 GIT binary patch literal 3117 zcmeHJJ8#oa6h5|-*l}74w3LCx14BC`N<~}9gw(%)n5#4oV<|7ip^pivAR#16T_Ul1 z;|Cy?N)cD?CU(*GB9;$Z*=ed&f`9E?sw0%X;mA>exYoXtxAbd z?uyFz9;zgvSwz*gzV;t;1ztjpp|bO`!0h(`{#&d!F>Tta=FL*tY+6OA2zH59?AAf0 zWZ3nJRb16q%4VTnsW*+4pi4K+oxG9FWP@@ASQDmI4Bfe6Xk<734S49j-N+ZLnrW;> zYe9K%l~U-^uWMGzuxf=@C7Z|B%VoRN8gGzCUsi>h*`XYVgqg2a^CBX&l+CPf;Frtg zo@Lk9bDK{$H`peM^aX+bOr$<1N`8y9=%Zues6X5;H0!p#Q{UURTTT42?I)Q=&17$x z8R%V-`C5n)F9;Cr7nG0h&FbRsS=K1t!C&ksz0o1XY1HY-J=s-BLaUM2 zp`MGoI_!8LV0Zp@In?Po4qlO8oIc6vo;qOZ&mgxtr)Osl62Hj2=gt|A z5}8;b&*|=lA`)?oBxi`RQkb_B^c(XM@uVvC9UqtpJaTq#cQJ{@%P?y)=@gKWi5L?# zl;;CNvR&c_K00D%B(6Tb7g&`9I&n_|B(;ZNn$8Sk-+-2>kZ;_9YL}H5AZ&Pf7~g>P_#qx3;c+~{ X8YDi%lL3BsLws+H7MOo;=mY%))4PAD literal 2851 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 e{0@EW>nhGC(vOd}ILBu+w#adixhSZljX` literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/complete_1.xcf b/resources/assets/tinker/textures/items/crossbow/complete_1.xcf new file mode 100644 index 0000000000000000000000000000000000000000..58524bc74a6dcdda328c5766ee4ffcbcbbf0046b GIT binary patch literal 2816 zcmeHIO=}xh6ut9dS&?O$Hf|{-0hMOqAZ+B~r1fe@z>5xarCq}iY*|u8ZOM3?G?o^j zArK6+aS@c_MGb+{g}ZDQqN0>8?45}z_CLs?flx@B*cy3W&l$}anYeUSLZMH*xp&Sx z_n!CeyNt?}g~iOBLMc^F!i7Fx^x$(&>_)SeseUO`+oVxn{)hk?!hW5RPu_iL`I|73k zg^jO?RUetgVTz?+ek?B+Gt;xhYVq9(QguEs5}3R#g_(?e#+`|L7)kZ{Lw$a_&mZpd zUxUwF@fd_d4UV`wMtiS(>I;z{?;BkG^OKm4bBd%zOQpq6El;PgDL-}LJgostOWly* znheWP>l)6cr-r0MS_%j0kVhg>P_syp{j!>6ifsNPS_7Dt{ZRBg*76UZ<$-nb4-_0t z^z4BAk$>Rhzd`HBA)f|6UoLxtA67t-6y1BZ#x%<>Xtvk-{=BhZl zlaydp-j=|TA+Up87@tI(%nvzf5>RJn)!`)oBejd9p+PnVrYUNR*c7$>EwQ(3&4#G` zWWCW?-+E$G)ZSWeh^^ZYZBW!^tQ~B@_#{#^jdM2(OEuS>t$lWLwl=pizE~|&?NycL0>yh{ z@Vm%~w~NvY{(KS}e8l&pnC$@xn)vnv?LA{JxQFl2K}(v_-rL*IH&8Q8UbIAZns_HG z1ezkPb~6SHIc)B#;Puw@}KoGgn%Xo_&4&lZ!_m1DN2#$z1a5zJKa#I`T-nV>H?%n?X zeE<3TQ|M1NT|%K>_%Emu3XOt>PzIcEt^duC0WiZpG<)l&B$32W8m5V<<1f^}Cy-41 Z`(lRibad72^;VBP2tY$Oo`D^P{R_&V$ff`Q literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/complete_2.xcf b/resources/assets/tinker/textures/items/crossbow/complete_2.xcf new file mode 100644 index 0000000000000000000000000000000000000000..abb570949b6fb8b0e500a3ea22b818d91ff82739 GIT binary patch literal 2728 zcmeHIKWH0g6o2=fEIGDJ)7A~8#h|nu9Ex1II7vMnHqCOSlg4rcS(a2${c(M68l%B9 zxER4L0(B@_1X;CqIVw7IkT-(}(%8+5!Hd!qODBE#z55d^;${nh(ocH#e((SHz3*|C z%NKWI57XILHebjP)^(p4zYS6pJl+M(ZvJuc2@~)lCE&_a6K=!LR3#Hl8o0 za+!E;H@^)P!LHDHA+`mfc>*7C@@_Vs-DgAB6=a0R(YD~ zQ0_xGmns%hen)6Av9fj>zxDO?FA{5O>v!(nxy?3zDZde^t3)%uAg~c=!Gmk!t}ouh zVKUi2f6wh@V)wQ(rOd~lv#a0-Rv5&$B|)=3=D2G<2BW!4c>WTOUcw8P@LRx~D_9W# zuE8sqj!!+2pQ7mFVBhc+KTYdIjpZ+CvO!TAZ`hP%xIkljgEnZ5L~@=+$-(0!Ha<)a zY%)@vSxyOeIVCV4364*GgM4NaXqMoz#gxPp0 zL928?zmg&sXe3EWII5B02hYSGP;Ihgz1@a-fdM|-E#xiIy8W*hA?JnQlSvusrO`RlxvUOc z(S?q(6)vlDs6Od{jr6ldh0E&WPKE2}4algYS9DkGG}zlgUY8*u$GT;;F=<>@b84Ec zDH_UZr*_S(*{2$p)qqV+XeeuPS&c)ri48W=PHQHY)yB5Tb+j5})X_}M73~^(JIL!Y zB;?pALM9Rp-XzUY2-5@wl1n%UNNf@AoPEQW65JZkSU8z4e7DcqH#JuuaB**i@A@Fv zA?7Ol)wC|`9wE+$Ti}O#)&u(4JFOx=qywCb=~X_+8Pwn|+_<0KEt}?6`N#WP`O-FC zc`G}m92b65UBTBbSdp)N6zmvXiKM1=k?&c)MrwP8CUtxamA2ZOJi=>wXj7fqJ*6j_ z=$1myY@(BTuh(osc#79{oycz2drkPlLC{70qO5N!nTb@y+r|n*^ZXH_| zzww1DHi@j`zQw*y8)+08TK&O*%_Deo-k~*+$f0-+$SIxU2QOr7R)Va*`^d@}@Lmkj zKd3_V2slEHB`v;a>%spg{7>AW#FX+u!cuiVge1dKkb`NIA%F`8_^U9xGdUwe-ZX|h pjY<)WjB8Q>LNE)&v6W*uhk(xG!ksVn6Vma9OSl4F)A$f8@;O#$v`PQ~ literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/complete_3.xcf b/resources/assets/tinker/textures/items/crossbow/complete_3.xcf new file mode 100644 index 0000000000000000000000000000000000000000..3517fb2efa2b509ecff1f7c6b53812b2fd0428c1 GIT binary patch literal 2580 zcmeHI&ube;6n;A^$*wHZG)+SYnp%g?#4?RdXgBzs(pgjZ%ty&UWyF2~fXg9T}lUoUtj{P*>``(Y4 zd2ckb?6q~{VYzBl?OKH}u0+E44Tz@U<4wrq$`5Dnu>fC#Bp{5hN0|NIg8vHUD;Cnu z*=t3sGG}ertDp#Wjb@$Aty;x!8Z~?MW_q@2l^eCjhB2$AxecpSG_vzqH7)@Qk?AHv zOP7SkcH_l>LmxWp#j;(ujD>hDkXx6L5jXc~-QG0pdij%z!|{!3)v0Vg-ylc-lNvGO zpq>+GOQ0+KR5TJ0z-2T5mPYUK<;2S3+(Scp1~AkXJ`eVyI9YkdCXHVlcfdP zp|42DOe6scmmy8*H+YNj8Mua%rd_+g_3i@mm(`j1f4k23&c#FjDMIlcQD^;^aZZ2A z`Xq$~)IcwwsD)ookGZIY)8qYpkl{YPJu+*B@Dv0*j`!iA6@pWC@C#7ya*jOb$ipN5 zq;tqQ@}0x&ZO*aHIoPb_!wx2R9By-te9&PBKMz&q$U)O{@W}n#I^Z0+)`8=I3?0tF zW-S-CFu~)%;T*Z3#SVTB>RmiQxgC6L?6@x6yOio3v#+Xi zS9$T#NPZrHc!%g*^6POf`3>vyd^mN?X+}HrrMjHz#5*__%gcO_B3^^5aQ$9+qv1HE z#%K3Rc6}8O$^3fV;)PySRrsBWM(QX6@s3fI)OX`ts>6Dk^mc+m4?i)Yt@px50Ou|8 zsNEAi(fkvSUyJC(>-CyiQ=>nid!X80uSq)BQKK{OqyC_qp0;~E z&+WP{9F_O)AeuyOx9{@Ps*&G@uF*5MKNz@wGlI_DLBGo$LlvUa(Ct2W9+5=%o^g&* zxGp&b)`coHnW8gSy7Wlm)`#wc|4;d!>ZMdyO`{1ZXee=K#<)_ zCP#NOF=B*@RM(O34U19)@+BnyaN*k^bzlKw0wSQNlq36afRG`{1V|x$l6=oJ`4<`} BhdBTM literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/diamond_crossbow_effect.png b/resources/assets/tinker/textures/items/crossbow/diamond_crossbow_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..6da1a0de398893ce10fd6faa793c826b65fbe5f9 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^K$v zTwzFmq1a>!6yYrJh%9Dc;5!V$jK}j=qyPokOFVsD+3#@)2$)&ls&IY)6!Q0UaSX9I zotz*srQ!IU2lht3MgjLtUfcKYJXrtLck{o=OK<-8`trZQtO-?aDe2zf>4qO7q>MIj xd@%g;^F!yuH7higPu8hlOM8_i$EqyHz_8$^Mu+)d8yld}44$rjF6*2UngDLcN1Olv literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/emerald_crossbow_effect.png b/resources/assets/tinker/textures/items/crossbow/emerald_crossbow_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..7e1af109c59567f8821e6d90043c10eba8423407 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^K$v zTwzFmq1a>!6yYrJh%9Dc;5!V$jK}j=qyPokOFVsD+3#@)2v`WtcUZmyDCFnq;uvCa zIypgtb#Vh%!$ghHgFOEqzS+8>YDUL4tpg1Q3mv&vC8|h%c%tj9>d(-o*yAECaOT7O wgD%q=9o=R$CLU(p5ia4$WoVOVSirz=_>I7vx<3Z(K$96fUHx3vIVCg!0CdzqS^xk5 literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/emerald_crossbow_effect_1.png b/resources/assets/tinker/textures/items/crossbow/emerald_crossbow_effect_1.png new file mode 100644 index 0000000000000000000000000000000000000000..84376d9d5e69fa945fa0f830c351164904714a23 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^K$v zTwzFmq1a>!6yYrJh%9Dc;5!V$jK}j=qyPokOFVsD+3#@)2r9_`R;;)P6pHtBaSX9I zotz-Sy10R>VWLLpK^_qJFDU^8*A~4>RJye2KMx}tPak)bghbOqwuu=G%!em$=b385 zDA8shl!6yYrJh%9Dc;5!V$jK}j=qyPokOFVsD+3#@)2v{mvc7J~l6!P?RaSX9I zotz-Sy0{@vVa7vyXM@A_r+5+)5(@s@acXpYyXk-V-~FHD?+S=5;i~s-t literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/emerald_crossbow_effect_3.png b/resources/assets/tinker/textures/items/crossbow/emerald_crossbow_effect_3.png new file mode 100644 index 0000000000000000000000000000000000000000..7a086ec5acaeb43c3a46d1247d0c6473e071d877 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^K$v zTwzFmq1a>!6yYrJh%9Dc;5!V$jK}j=qyPokOFVsD+3#@)2w3qc)SWmF6ms-*aSX9I zotz-Sy10R>VWLLpL7x8)-)vn`HKSvj)`5nDg^t{91|QjMDo+QT6mEE_H0fYc^ZyfU i29uUZ`bY4{Ffg1nwVAu=l=5LU;Lc(-}5KP ziKU!%vI^vRzfLFl#<^3cHhlY(+7^GC^Od{Ahes!Kfo7!gfIu7TAD;c&{-=9HpFQ9a pBynI)P0{bfMJD}Cfexk&40nR{G?*8kG6uSY!PC{xWt~$(69C{gUAh1O literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/lapis_crossbow_effect.png b/resources/assets/tinker/textures/items/crossbow/lapis_crossbow_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..478f04a040780c8af335d6d6dbe7ce17e858d27b GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^K$v zTwzFmq1a>!6yYrJh%9Dc;5!V$jK}j=qyPokOFVsD+3#@)2pAd09nAj)6bkfoaSX9I zot&V+T#y<5_xYuDzs?^30;j%bYvwSubzh%vER&k>!6yYrJh%9Dc;5!V$jK}j=qyPokOFVsD+3#@)2pB52h58l(g&aLy978Nl zzwO&7$e_T(RR3SsXo7TMd+XFNwOcREL--HmO8tn4Gv2%A0PmU`Ix|udIlCvWWbayJ iGganf;1v7wml;n~n@fM(dUhqyFa}RoKbLh*2~7a%bUX_H literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/necrotic_crossbow_effect.png b/resources/assets/tinker/textures/items/crossbow/necrotic_crossbow_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..9edc57e5319767c007fd9000da44241a9a8c9a88 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^K$v zTwzFmq1a>!6yYrJh%9Dc;5!V$jK}j=qyPokOFVsD+3#@)2aSX9I z{dVF;-U9|4EC){s?LYqBzVZ7HLyu%{%?-YjLv{-3{5YJJ?`Y(4>}BlfE(Rut%)n^V zs`qRM{4{H>vk0j8UXpornq}r@mHD1wG5*hYYF?iB#G94DFlfdSldP9)qR-#zhs^2k fsc!jObDVd=1Pj^U+NDQ!6yYrJh%9Dc;5!V$jK}j=qyPokOFVsD+3#@)2xzm_)+E0L3Qh8KaSX9I z{r18}PG?1dV;|pl&TXv~+rX>7q=<)of&jNTN6O?6X(ze7qS7~P7Sr?fn0!n;XkUEo z_vaQ5bSqC=rXSOvwEfSH`7=9abeOrOe46HeoO#`A;d7Q-t}!%tYn~2yP!uhg?83pg zx7;gnf@9NBM~7@RnI3>R#5(`4N&Uengm(QCM3tDk=T&0h!ZzRQnmUu(QOP%lUl P=sE^ZS3j3^P6FOC literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/quartz_crossbow_effect.png b/resources/assets/tinker/textures/items/crossbow/quartz_crossbow_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..6ab7c23848a2e37310bfee633a22310e02815111 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^K$v zTwzFmq1a>!6yYrJh%9Dc;5!V$jK}j=qyPokOFVsD+3#@)2&hWteRrM)6bkfoaSX9I zot&V+bfoI$|8xa*5Y_*6)BpOHKlJ9X83-DsJUaB0XZyOC^cQRN{`qfuJH7Ayul;G? xj{H~2c4HICRMWnYA$E%;IdMtrHw_0yhU}k~i(^ioS_d?o!PC{xWt~$(69DcQNn`*3 literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/quartz_crossbow_effect_1.png b/resources/assets/tinker/textures/items/crossbow/quartz_crossbow_effect_1.png new file mode 100644 index 0000000000000000000000000000000000000000..9dd3776f74f9125a524ebdaa587ffcb2d4ed8f2d GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^K$v zTwzFmq1a>!6yYrJh%9Dc;5!V$jK}j=qyPokOFVsD+3#@)2&nVj7g}-|C=}@F;uvCa zIypgs=}6Vh|LF?sAgcfCrvLRXf9TC&GY~XNd35M0&-QgO=`Ysk{qx`Sc6#6YU;ER( x9r>@4?ZzgOsiu7)L+lnya^jNKZyFAa4B0;|7ss4FwGL=FgQu&X%Q~loCII`2NreCa literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/quartz_crossbow_effect_2.png b/resources/assets/tinker/textures/items/crossbow/quartz_crossbow_effect_2.png new file mode 100644 index 0000000000000000000000000000000000000000..898f4021f52e392a550eb660d43e3c24bc1a19a9 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^K$v zTwzFmq1a>!6yYrJh%9Dc;5!V$jK}j=qyPokOFVsD+3#@)2xzD@8y21d3blB;IEGl9 zPEJq|I#PA>|8cc*PHWWuA5dsJdYf-j8Ur&k^Wh_{rzPjz*?Fko^{G;}NihPiQ~&SZ zvTau4{kE$-U8`Bx`)Bj)z4*}Q$iB}mp5N2 literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/quartz_crossbow_effect_3.png b/resources/assets/tinker/textures/items/crossbow/quartz_crossbow_effect_3.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9f5b7b5452c5ad1e263827de775d37ae449a09 GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^K$v zTwzFmq1a>!6yYrJh%9Dc;5!V$jK}j=qyPokOFVsD+3#@)2&fqr{k3b; zZfs99J$#qF|HSv?^wN*@Y`Yl0I4FB2ubKY$zxVO-i8&0yMH%;Z70petKg?TE^qdQ% rR^n82wd6^o2iK;)=2@K3z`(F2*I=`GcEfg{Ll`_={an^LB{Ts5-1J^m literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/redstone_crossbow_effect.png b/resources/assets/tinker/textures/items/crossbow/redstone_crossbow_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..ebff98e756eb857be06d23ab53efe4658abef80a GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^K$v zTwzFmq1a>!6yYrJh%9Dc;5!V$jK}j=qyPokOFVsD+3#@)2*_AQ%f5R86q53EaSX9I uotz-C>481-;s1&&Dn)vhZ8$jl5W|KU++Wj|v>ySgV(@hJb6Mw<&;$T2KP-a) literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/redstone_crossbow_effect_1.png b/resources/assets/tinker/textures/items/crossbow/redstone_crossbow_effect_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e36d69794ccf6c52e8c227535c053333f05f8124 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^K$v zTwzFmq1a>!6yYrJh%9Dc;5!V$jK}j=qyPokOFVsD+3#@)2*_DxYWJi8g`_-P978Nl uCnrd3dSK6d_`l+cN|Byr8xGDs#IRuo_t*3#?MHyB7(8A5T-G@yGywnxhbzGV literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/redstone_crossbow_effect_2.png b/resources/assets/tinker/textures/items/crossbow/redstone_crossbow_effect_2.png new file mode 100644 index 0000000000000000000000000000000000000000..5d6b61d0a93e895f2a1a4e5002fd94a17373c372 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^K$v zTwzFmq1a>!6yYrJh%9Dc;5!V$jK}j=qyPokOFVsD+3#@)2q^GP2sRP{3aNRzIEGl9 zPEL^6^uV6^a6KCkEMweSE7HUCN`2CQ9-jZ~Dy@tRtxTLh({Co80_tG!boFyt=akR{ E0EvJr!~g&Q literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/redstone_crossbow_effect_3.png b/resources/assets/tinker/textures/items/crossbow/redstone_crossbow_effect_3.png new file mode 100644 index 0000000000000000000000000000000000000000..a34f368a52a1da2890705e2cdbdffd0f96d85efb GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^K$v zTwzFmq1a>!6yYrJh%9Dc;5!V$jK}j=qyPokOFVsD+3#@)2q+4_^2_f53MqKHIEGl9 zPEL@x^uV6^aDA7lv0+bBpn=9^vzsqx$MiCMX6F1^P!6yYrJh%9Dc;5!V$jK}j=qyPokOFVsD+3#@)2x#$T?YT7%DCFVk;uvCa zIyph&Q-k2_1rwK@ub23J=c{hd51xcW%Pf!QDmL#!6yYrJh%9Dc;5!V$jK}j=qyPokOFVsD+3#@)2(qY!o)N4E3K@C2IEGl9 zPEK%OUY))4zwrd_u51|+ S%{&6s&EV!6yYrJh%9Dc;5!V$jK}j=qyPokOFVsD+3#@)2r|iOPvJ`k3Z;6wIEGl9 zPEI($Wb(A~-|5ccf9VQL8y0Y{IQ{XDdBDTu2M<#cZxp_|TCc|^);7C;pMlW?W~I4H z{~2Fk1uB`4D?E9b&G~xeP`gdK>A!wG)@SBd=T42AAo}=+e_%tP5ZmH}2nGgS1FbP0l+XkK^&U*Y literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/crossbow/spider_crossbow_effect.png b/resources/assets/tinker/textures/items/crossbow/spider_crossbow_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..66bb964cd47777aabc09c60ddd5e41eda1d38ba1 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^K$v zTwzFmq1a>!6yYrJh%9Dc;5!V$jK}j=qyPokOFVsD+3#@)2r_G@*!*S%3dMW6IEGl9 zPEL?uU7QfX;8tXkX~^*>Js~0Chx+%~jWcD=1}E*2+;Ou)a$S7=(E~24o&^Xiw-xi- z8Q+lZFf;&y4HI55mdK II;Vst05r8k*Z=?k literal 0 HcmV?d00001 diff --git a/src/main/java/tconstruct/modifiers/tools/ModFlux.java b/src/main/java/tconstruct/modifiers/tools/ModFlux.java index 3be1d427713..e8a69cade43 100644 --- a/src/main/java/tconstruct/modifiers/tools/ModFlux.java +++ b/src/main/java/tconstruct/modifiers/tools/ModFlux.java @@ -2,6 +2,9 @@ import cofh.api.energy.IEnergyContainerItem; import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import tconstruct.library.tools.ToolCore; @@ -23,6 +26,12 @@ public boolean matches (ItemStack[] input, ItemStack tool) { NBTTagCompound tags = tool.getTagCompound().getCompoundTag("InfiTool"); + // not on ammo weapons, since they don't have durability technically + String[] traits = ((ToolCore)tool.getItem()).getTraits(); + for(String trait : traits) + if("ammo".equals(trait)) + return false; + ItemStack foundBattery = null; // try to find the battery in the input for (ItemStack stack : input) diff --git a/src/main/java/tconstruct/weaponry/weapons/Crossbow.java b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java index 3a137f762e8..b726d3fad1b 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Crossbow.java +++ b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java @@ -301,13 +301,15 @@ public void playFiringSound(World world, EntityPlayer player, ItemStack weapon, @Override public IIcon getIcon(ItemStack stack, int renderPass) { - if(!animateLayer(renderPass)) + if(!animateLayer(renderPass) && renderPass < getPartAmount()) return super.getIcon(stack, renderPass); if(!stack.hasTagCompound()) return super.getIcon(stack, renderPass); NBTTagCompound tags = stack.getTagCompound().getCompoundTag("InfiTool"); + if(tags == null || renderPass > 10) + return super.getIcon(stack, renderPass); float progress; @@ -318,10 +320,20 @@ else if(!tags.hasKey("Reloading")) else progress = getWindupProgress(stack, getWindupTime(stack) - tags.getInteger("Reloading")); - // effects aren't animated - // todo: make effects animated - if(renderPass >= getPartAmount()) + // are we drawing an effect? + if(renderPass >= getPartAmount()) { + // is the effect animated? + String effect = "Effect" + (1 + renderPass - getPartAmount()); + if(tags.hasKey(effect)) { + int index = tags.getInteger(effect); + if(animationEffectIcons.get(index) != null) + return getCorrectAnimationIcon(animationEffectIcons, index, progress); + else + // non-animated + return effectIcons.get(index); + } return super.getIcon(stack, renderPass); + } // get the correct icon switch (renderPass) diff --git a/weaponry.txt b/weaponry.txt index 9e656d4e301..2ea661e6821 100644 --- a/weaponry.txt +++ b/weaponry.txt @@ -7,6 +7,8 @@ TODO: * Partbuilder stuff for weaponry stuff? * Bring bowmaterial stats etc in line? * Can't have flux or redstone or moss on ammo tools +* Knockback on projectiles knocks towards their moving direction +* Glassmakers Arrows :D maybe give javelins slight armor piercing? or do they have that already? From 8db17b6b4a692900948680a02ab67dc3b7d7ea3f Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sat, 18 Oct 2014 13:07:03 +0200 Subject: [PATCH 030/129] Tooodoooo Ideas --- weaponry.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/weaponry.txt b/weaponry.txt index 2ea661e6821..2576d3ac60c 100644 --- a/weaponry.txt +++ b/weaponry.txt @@ -12,3 +12,10 @@ TODO: maybe give javelins slight armor piercing? or do they have that already? + +Ideas: +* Liquid Purple Slime + Obsidian + Metal = Obslimite... Jademite, Obsidimite, Purplemite, Ironslime + - Lower durability than slime + - Bouncy.. harvested stuff gets knocked around? Maybe Knockback1? + - Jagged + Reinforced +* Magma Cube -> Magma Slime Balls -> Tool Material. Slime + Fiery by default, high quality slime! From e7454a56ac265f6157ba5a720b8635b8a39cace9 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 19 Oct 2014 15:45:08 +0200 Subject: [PATCH 031/129] Some rendering stuff and fixes with bolts/arrows --- .../textures/items/arrow/reed_arrow_shaft.png | Bin 241 -> 231 bytes .../{leaf_fletching .png => leaf_fletching.png} | Bin .../library/weaponry/ProjectileWeapon.java | 2 -- .../weaponry/WeaponryClientProxy.java | 2 +- .../java/tconstruct/weaponry/ammo/BoltAmmo.java | 2 +- 5 files changed, 2 insertions(+), 4 deletions(-) rename resources/assets/tinker/textures/items/parts/{leaf_fletching .png => leaf_fletching.png} (100%) diff --git a/resources/assets/tinker/textures/items/arrow/reed_arrow_shaft.png b/resources/assets/tinker/textures/items/arrow/reed_arrow_shaft.png index bbd111876b2884dc1adae19be17acfb3a0f9c817..2d49d531fbd417eede7d4677fe2dac3247edea1f 100644 GIT binary patch delta 144 zcmV;B0B`^C0p|gbUw;Y{4J->v#}--u003u6L_t(I%VS^|Ss<^^`~RxjCI6Adm`KrV zH@0r3HlUw;W66B;zu&xU0H0041GL_t(I%VS^|S)ge}AHWM^}7|nQXKK{S`f76P{|0HSD zwvdHKRc5<8QJR^MHHR12z@0t4awj8MiG*02Fxbq=M(=+f animationExtraIcons = new HashMap(); public HashMap animationEffectIcons = new HashMap(); - // todo: animated effects - /** * return true if the current renderpass should use animations. * 0 == handle diff --git a/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java b/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java index ead74c5fdac..34e747ba708 100644 --- a/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java +++ b/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java @@ -69,7 +69,7 @@ private void registerMaterialRendering() ToolCore arrow = TinkerWeaponry.arrowAmmo; String pre = Reference.resource(arrow.getDefaultFolder()) + "/"; - String[] shaft = {"wood", "bone", "blaze", "reed", null}; + String[] shaft = {"wood", "bone", "reed", "blaze", null}; String[] fletching = { "feather", "leaf", "slime", "blueslime", "slimeleaf" }; // we register different textures for the different parts per index diff --git a/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java b/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java index 2827aaf364c..f98c0c44be3 100644 --- a/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java +++ b/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java @@ -101,7 +101,7 @@ protected int getDefaultColor(int renderPass, int materialID) { CustomMaterial mat = TConstructRegistry.getCustomMaterial(materialID, FletchingMaterial.class); if(mat == null) - TConstructRegistry.getCustomMaterial(materialID, FletchlingLeafMaterial.class); + mat = TConstructRegistry.getCustomMaterial(materialID, FletchlingLeafMaterial.class); if(mat == null) return 0xffffff; From 1194d60678dbcb71993c281ede2bfee5b9661548 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 19 Oct 2014 15:50:06 +0200 Subject: [PATCH 032/129] Remove unused fletchling materials, and add a durability modifier to it. Basically the fletchling plays a huge role in your max-ammo now. --- .../tconstruct/library/TConstructRegistry.java | 4 ++-- .../library/tools/FletchingMaterial.java | 15 ++++++--------- .../library/tools/FletchlingLeafMaterial.java | 4 ++-- .../java/tconstruct/weaponry/TinkerWeaponry.java | 16 ++++++++-------- .../tconstruct/weaponry/WeaponryHandler.java | 10 +++++----- .../tconstruct/weaponry/entity/ArrowEntity.java | 2 +- 6 files changed, 24 insertions(+), 27 deletions(-) diff --git a/src/main/java/tconstruct/library/TConstructRegistry.java b/src/main/java/tconstruct/library/TConstructRegistry.java index d3bd4cfa07f..13c18f6eb69 100644 --- a/src/main/java/tconstruct/library/TConstructRegistry.java +++ b/src/main/java/tconstruct/library/TConstructRegistry.java @@ -464,9 +464,9 @@ public static void addBowstringMaterial (int materialID, int value, ItemStack in customMaterials.add(mat); } - public static void addFletchingMaterial (int materialID, int value, ItemStack input, ItemStack craftingMaterial, float accuracy, float breakChance, float mass, float durabilityModifier, int color) + public static void addFletchingMaterial (int materialID, int value, ItemStack input, ItemStack craftingMaterial, float accuracy, float breakChance, float durabilityModifier, int color) { - FletchingMaterial mat = new FletchingMaterial(materialID, value, input, craftingMaterial, accuracy, breakChance, mass, durabilityModifier, color); + FletchingMaterial mat = new FletchingMaterial(materialID, value, input, craftingMaterial, accuracy, breakChance, durabilityModifier, color); customMaterials.add(mat); } diff --git a/src/main/java/tconstruct/library/tools/FletchingMaterial.java b/src/main/java/tconstruct/library/tools/FletchingMaterial.java index ffe76a4dc1a..a77de02e775 100644 --- a/src/main/java/tconstruct/library/tools/FletchingMaterial.java +++ b/src/main/java/tconstruct/library/tools/FletchingMaterial.java @@ -6,36 +6,33 @@ public class FletchingMaterial extends CustomMaterial { public final float accuracy; public final float breakChance; - public final float mass; public final float durabilityModifier; - public FletchingMaterial(int materialID, int value, ItemStack input, ItemStack craftingItem, float accuracy, float breakChance, float mass, float durabilityModifier, int color) + public FletchingMaterial(int materialID, int value, ItemStack input, ItemStack craftingItem, float accuracy, float breakChance, float duribalityModifier, int color) { super(materialID, value, input, craftingItem, color); this.accuracy = accuracy; this.breakChance = breakChance; - this.mass = mass; - this.durabilityModifier = durabilityModifier; + this.durabilityModifier = duribalityModifier; } @Deprecated public FletchingMaterial(int materialID, int value, ItemStack input, ItemStack craftingItem, float accuracy, float breakChance, float mass) { - this(materialID, value, input, craftingItem, accuracy, breakChance, mass, 1f, 0xffffffff); + this(materialID, value, input, craftingItem, accuracy, 0.01f, 1f, 0xffffffff); } - public FletchingMaterial(int materialID, int value, String oredict, ItemStack craftingItem, float accuracy, float breakChance, float mass, float durabilityModifier, int color) + public FletchingMaterial(int materialID, int value, String oredict, ItemStack craftingItem, float accuracy, float breakChance, float duribalityModifier, int color) { super(materialID, value, oredict, craftingItem, color); this.accuracy = accuracy; this.breakChance = breakChance; - this.mass = mass; - this.durabilityModifier = durabilityModifier; + this.durabilityModifier = duribalityModifier; } @Deprecated public FletchingMaterial(int materialID, int value, String oredict, ItemStack craftingItem, float accuracy, float breakChance, float mass) { - this(materialID, value, oredict, craftingItem, accuracy, breakChance, mass, 1f, 0xffffffff); + this(materialID, value, oredict, craftingItem, accuracy, 0.01f, 1f, 0xffffffff); } } diff --git a/src/main/java/tconstruct/library/tools/FletchlingLeafMaterial.java b/src/main/java/tconstruct/library/tools/FletchlingLeafMaterial.java index ae574405fcd..d9546cc7af3 100644 --- a/src/main/java/tconstruct/library/tools/FletchlingLeafMaterial.java +++ b/src/main/java/tconstruct/library/tools/FletchlingLeafMaterial.java @@ -6,9 +6,9 @@ public class FletchlingLeafMaterial extends FletchingMaterial { - public FletchlingLeafMaterial(int materialID, int value, String oredict, ItemStack craftingItem, float accuracy, float breakChance, float mass) + public FletchlingLeafMaterial(int materialID, int value, String oredict, ItemStack craftingItem, float accuracy, float breakChance, float durabilityModifier) { - super(materialID, value, oredict, craftingItem, accuracy, breakChance, mass, 1.6f, 0x5ece46); + super(materialID, value, oredict, craftingItem, accuracy, breakChance, durabilityModifier, 0x5ece46); } @Override diff --git a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java index c8f3624b51e..db7aece68fc 100644 --- a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java +++ b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java @@ -261,20 +261,20 @@ private void registerMaterials() TConstructRegistry.addArrowMaterial(MaterialID.PigIron, 3.6F, 0.5F); //Pigiron // Arrow Shaft Materials: Material ID, crafting item, durability-medifier, mass, fragility - TConstructRegistry.addCustomMaterial(ArrowShaftMaterial.createMaterial(0, Items.stick, 1.0f, 1.0f, 0.15f, 0x866526)); // wood: reference material, 10% break chance - TConstructRegistry.addCustomMaterial(ArrowShaftMaterial.createMaterial(1, Items.bone, 0.95f, 1.2f, 0.05f, 0xede6bf)); // bone: heavier, but durable - TConstructRegistry.addCustomMaterial(ArrowShaftMaterial.createMaterial(2, Items.reeds, 1.5f, 0.8f, 0.66f, 0xc7ff87)); // reed: light, but less durable + TConstructRegistry.addCustomMaterial(ArrowShaftMaterial.createMaterial(0, Items.stick, 1.0f, 1.0f, 0.15f, 0x866526)); // wood: reference material, 10% break chance + TConstructRegistry.addCustomMaterial(ArrowShaftMaterial.createMaterial(1, Items.bone, 0.95f, 1.4f, 0.02f, 0xede6bf)); // bone: heavier, but durable + TConstructRegistry.addCustomMaterial(ArrowShaftMaterial.createMaterial(2, Items.reeds, 1.5f, 0.5f, 0.66f, 0xc7ff87)); // reed: light, but less durable TConstructRegistry.addCustomMaterial(ArrowShaftMaterial.createMaterial(3, Items.blaze_rod, 1.2f, 0.9f, 0.08f, 0xfff32d)); // blaze: tad lighter, tad more durable, fieryyyy // also add the tool rod variants, same stats TConstructRegistry.addCustomMaterial(ArrowShaftMaterial.createMaterial(0, TinkerTools.toolRod, MaterialID.Wood, 1.0f, 1.0f, 0.15f, 0x866526)); // wood: reference material, 10% break chance TConstructRegistry.addCustomMaterial(ArrowShaftMaterial.createMaterial(1, TinkerTools.toolRod, MaterialID.Bone, 0.95f, 1.2f, 0.01f, 0xede6bf)); // bone: heavier, but durable // Arrow Fletching Materials - TConstructRegistry.addFletchingMaterial(0, 2, new ItemStack(Items.feather), new ItemStack(TinkerWeaponry.fletching, 1, 0), 95F, 0F, 0.05F, 1f, 0xffffff); // Feather - TConstructRegistry.addCustomMaterial(new FletchlingLeafMaterial(1, 2, "treeLeaves", new ItemStack(TinkerWeaponry.fletching, 1, 1), 75F, 0F, 0.2F)); // all vanilla and oredicted leaves. and all leaves in general. - TConstructRegistry.addFletchingMaterial(2, 2, new ItemStack(TinkerTools.materials, 1, 1), new ItemStack(TinkerWeaponry.fletching, 1, 2), 100F, 0F, 0.12F, 0.95f, 0x82c873); // Slime - TConstructRegistry.addFletchingMaterial(3, 2, new ItemStack(TinkerTools.materials, 1, 17), new ItemStack(TinkerWeaponry.fletching, 1, 3), 100F, 0F, 0.12F, 0.95f, 0x74c8c7); // BlueSlime - TConstructRegistry.addFletchingMaterial(4, 2, new ItemStack(TinkerWorld.slimeLeaves, 1, 0), new ItemStack(TinkerWeaponry.fletching, 1, 4), 98F, 0.03F, 0.08F, 1.2f, 0x74e8c7); // Slime leaves + TConstructRegistry.addFletchingMaterial(0, 2, new ItemStack(Items.feather), new ItemStack(TinkerWeaponry.fletching, 1, 0), 95F, 0.05F, 1.0f, 0xffffff); // Feather + TConstructRegistry.addCustomMaterial(new FletchlingLeafMaterial(1, 2, "treeLeaves", new ItemStack(TinkerWeaponry.fletching, 1, 1), 75F, 0F, 2.5f)); // all vanilla and oredicted leaves. and all leaves in general. + TConstructRegistry.addFletchingMaterial(2, 2, new ItemStack(TinkerTools.materials, 1, 1), new ItemStack(TinkerWeaponry.fletching, 1, 2), 100F, 0.005F, 0.8f, 0x82c873); // Slime + TConstructRegistry.addFletchingMaterial(3, 2, new ItemStack(TinkerTools.materials, 1, 17), new ItemStack(TinkerWeaponry.fletching, 1, 3), 100F, 0.005F, 0.8f, 0x74c8c7); // BlueSlime + TConstructRegistry.addFletchingMaterial(4, 2, new ItemStack(TinkerWorld.slimeLeaves, 1, 0), new ItemStack(TinkerWeaponry.fletching, 1, 4), 98F, 0.02F, 1.4F, 0x74e8c7); // Slime leaves // Bowstring Materials TConstructRegistry.addBowstringMaterial(0, 2, new ItemStack(Items.string), new ItemStack(TinkerWeaponry.bowstring, 1, 0), 1F, 1F, 1f, 0xeeeeee); // String diff --git a/src/main/java/tconstruct/weaponry/WeaponryHandler.java b/src/main/java/tconstruct/weaponry/WeaponryHandler.java index f812a99cc3c..161f5e7a6fa 100644 --- a/src/main/java/tconstruct/weaponry/WeaponryHandler.java +++ b/src/main/java/tconstruct/weaponry/WeaponryHandler.java @@ -33,8 +33,8 @@ public void onAmmoCrafted(ToolCraftEvent.NormalTool event) { // arrows work like this: // the head is responsible for the damage, but also adds weight - // the shaft defines how fragile the arrow is, and also adds to the weight a bit. But mostly it functions at the durability modifier - // the fletching defines the accuracy of the bow, adds a bit of durability and also breakchance + // the shaft defines how fragile the arrow is, and also adds to the weight a bit. But mostly the fragility. + // the fletching defines the accuracy of the arrow and adds a bit breakchance. Mostly there for the durability modifier because availability // Shortbows work better with lighter arrows // while Longbows require a bit heavier arrows, the lighter the arrow the more impact the accuracy has otherwise @@ -51,7 +51,7 @@ public void onAmmoCrafted(ToolCraftEvent.NormalTool event) if(fletching == null) fletching = (FletchingMaterial) TConstructRegistry.getCustomMaterial(tags.getInteger("Accessory"), FletchlingLeafMaterial.class); - int durability = (int)((float)head.durability() * shaft.durabilityModifier); // todo: fletching durability + int durability = (int)((float)head.durability() * shaft.durabilityModifier * fletching.durabilityModifier); float weight = arrow.mass + shaft.weight/2f; float accuracy = fletching.accuracy; float breakChance = shaft.fragility + fletching.breakChance; @@ -77,10 +77,10 @@ else if(event.tool instanceof BoltAmmo) if(fletching == null) fletching = (FletchingMaterial) TConstructRegistry.getCustomMaterial(tags.getInteger("Accessory"), FletchlingLeafMaterial.class); - int durability = (int)((float)headMat.durability() * coreMat.handleDurability()); // todo: fletching durability + int durability = (int)((float)headMat.durability() * coreMat.handleDurability() * fletching.durabilityModifier); float weight = head.mass + core.mass; float accuracy = fletching.accuracy; - float breakChance = fletching.breakChance; + float breakChance = fletching.breakChance*3; tags.setInteger("TotalDurability", durability); tags.setFloat("Mass", weight); diff --git a/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java b/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java index fc4cec36e01..ca63d6d955e 100644 --- a/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java +++ b/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java @@ -32,7 +32,7 @@ protected double getStuckDepth() { @Override protected double getSlowdown() { - // todo: fletchling material of arrows impact + // we could use the fletchling material for the slowdown, hm // note: not done because fletchlings also balance amount you get now. Rather use slowdown for different projectile types return super.getSlowdown(); } From 11fcf21eb61a92b42a2f2b8e68277d30a7acdefd Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 19 Oct 2014 16:23:01 +0200 Subject: [PATCH 033/129] More arrow tags and display fixes --- resources/assets/tinker/lang/en_US.lang | 2 +- .../java/tconstruct/items/tools/Arrow.java | 4 ++-- .../java/tconstruct/items/tools/Shortbow.java | 6 ++--- .../tconstruct/library/tools/ToolCore.java | 10 ++++----- .../tconstruct/library/weaponry/AmmoItem.java | 5 +++++ .../tconstruct/weaponry/WeaponryHandler.java | 22 ++++++++++++------- .../tconstruct/weaponry/ammo/ArrowAmmo.java | 14 ++++++++++++ .../tconstruct/weaponry/ammo/BoltAmmo.java | 8 +++++++ 8 files changed, 52 insertions(+), 19 deletions(-) diff --git a/resources/assets/tinker/lang/en_US.lang b/resources/assets/tinker/lang/en_US.lang index 5e6d70e083b..e88b2b24321 100644 --- a/resources/assets/tinker/lang/en_US.lang +++ b/resources/assets/tinker/lang/en_US.lang @@ -819,7 +819,7 @@ modifier.tool.beheading=Beheading creativeModLock.tooltip=Target Lock: -attribute.name.ammo.attackDamage=Average Shot Damage +attribute.name.ammo.attackDamage=Base Damage tool.pickaxe=Pickaxe tool.shovel=Shovel diff --git a/src/main/java/tconstruct/items/tools/Arrow.java b/src/main/java/tconstruct/items/tools/Arrow.java index 20f7075eb33..8b776c25f32 100644 --- a/src/main/java/tconstruct/items/tools/Arrow.java +++ b/src/main/java/tconstruct/items/tools/Arrow.java @@ -197,11 +197,11 @@ else if (power > this.getMaxEnergyStored(stack) * 2 / 3) int head = tags.getCompoundTag("InfiTool").getInteger("Head"); int handle = tags.getCompoundTag("InfiTool").getInteger("Handle"); - String headName = getAbilityNameForType(head); + String headName = getAbilityNameForType(head, 0); if (!headName.equals("")) list.add(getStyleForType(head) + headName); - String handleName = getAbilityNameForType(handle); + String handleName = getAbilityNameForType(handle, 0); if (!handleName.equals("") && handle != head) list.add(getStyleForType(handle) + handleName); diff --git a/src/main/java/tconstruct/items/tools/Shortbow.java b/src/main/java/tconstruct/items/tools/Shortbow.java index 1edb77904dd..c2cafe20b03 100644 --- a/src/main/java/tconstruct/items/tools/Shortbow.java +++ b/src/main/java/tconstruct/items/tools/Shortbow.java @@ -148,7 +148,7 @@ else if (power > this.getMaxEnergyStored(stack) * 2 / 3) int binding = tags.getCompoundTag("InfiTool").getInteger("Accessory"); int extra = tags.getCompoundTag("InfiTool").getInteger("Extra"); - String headName = getAbilityNameForType(head); + String headName = getAbilityNameForType(head, 0); if (!headName.equals("")) list.add(getStyleForType(head) + headName); @@ -158,14 +158,14 @@ else if (power > this.getMaxEnergyStored(stack) * 2 / 3) if (getPartAmount() >= 3) { - String bindingName = getAbilityNameForType(binding); + String bindingName = getAbilityNameForType(binding, 0); if (!bindingName.equals("") && binding != head && binding != handle) list.add(getStyleForType(binding) + bindingName); } if (getPartAmount() >= 4) { - String extraName = getAbilityNameForType(extra); + String extraName = getAbilityNameForType(extra, 0); if (!extraName.equals("") && extra != head && extra != handle && extra != binding) list.add(getStyleForType(extra) + extraName); } diff --git a/src/main/java/tconstruct/library/tools/ToolCore.java b/src/main/java/tconstruct/library/tools/ToolCore.java index e45656d9016..be9e5f057a1 100644 --- a/src/main/java/tconstruct/library/tools/ToolCore.java +++ b/src/main/java/tconstruct/library/tools/ToolCore.java @@ -328,24 +328,24 @@ else if (RF > this.getMaxEnergyStored(stack) * 2 / 3) int binding = tags.getCompoundTag("InfiTool").getInteger("Accessory"); int extra = tags.getCompoundTag("InfiTool").getInteger("Extra"); - String headName = getAbilityNameForType(head); + String headName = getAbilityNameForType(head, 0); if (!headName.equals("")) list.add(getStyleForType(head) + headName); - String handleName = getAbilityNameForType(handle); + String handleName = getAbilityNameForType(handle, 1); if (!handleName.equals("") && handle != head) list.add(getStyleForType(handle) + handleName); if (getPartAmount() >= 3) { - String bindingName = getAbilityNameForType(binding); + String bindingName = getAbilityNameForType(binding, 2); if (!bindingName.equals("") && binding != head && binding != handle) list.add(getStyleForType(binding) + bindingName); } if (getPartAmount() >= 4) { - String extraName = getAbilityNameForType(extra); + String extraName = getAbilityNameForType(extra, 3); if (!extraName.equals("") && extra != head && extra != handle && extra != binding) list.add(getStyleForType(extra) + extraName); } @@ -386,7 +386,7 @@ public static String getStyleForType (int type) /** * Returns the localized name of the materials ability. Only use this for display purposes, not for logic. */ - public String getAbilityNameForType (int type) + public String getAbilityNameForType (int type, int part) { return TConstructRegistry.getMaterial(type).ability(); } diff --git a/src/main/java/tconstruct/library/weaponry/AmmoItem.java b/src/main/java/tconstruct/library/weaponry/AmmoItem.java index 1ba901021ae..d02198a1431 100644 --- a/src/main/java/tconstruct/library/weaponry/AmmoItem.java +++ b/src/main/java/tconstruct/library/weaponry/AmmoItem.java @@ -1,5 +1,8 @@ package tconstruct.library.weaponry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.util.StatCollector; import tconstruct.library.TConstructRegistry; import tconstruct.weaponry.TinkerWeaponry; import tconstruct.util.Reference; @@ -9,6 +12,8 @@ import net.minecraft.nbt.NBTTagCompound; import tconstruct.library.tools.ToolCore; +import java.util.List; + public abstract class AmmoItem extends ToolCore implements IAmmo { public AmmoItem(int baseDamage, String name) { super(baseDamage); diff --git a/src/main/java/tconstruct/weaponry/WeaponryHandler.java b/src/main/java/tconstruct/weaponry/WeaponryHandler.java index 161f5e7a6fa..f6ed3db82c9 100644 --- a/src/main/java/tconstruct/weaponry/WeaponryHandler.java +++ b/src/main/java/tconstruct/weaponry/WeaponryHandler.java @@ -56,10 +56,7 @@ public void onAmmoCrafted(ToolCraftEvent.NormalTool event) float accuracy = fletching.accuracy; float breakChance = shaft.fragility + fletching.breakChance; - tags.setInteger("TotalDurability", durability); - tags.setFloat("Mass", weight); - tags.setFloat("BreakChance", breakChance); - tags.setFloat("Accuracy", accuracy); + setAmmoData(tags, durability, weight, accuracy, breakChance, head.shoddy(), head.reinforced()); } else if(event.tool instanceof BoltAmmo) { @@ -81,11 +78,10 @@ else if(event.tool instanceof BoltAmmo) float weight = head.mass + core.mass; float accuracy = fletching.accuracy; float breakChance = fletching.breakChance*3; + float shoddy = (headMat.shoddy() + coreMat.shoddy())/2f; + int reinforced = Math.max(headMat.reinforced(), coreMat.reinforced()); - tags.setInteger("TotalDurability", durability); - tags.setFloat("Mass", weight); - tags.setFloat("BreakChance", breakChance); - tags.setFloat("Accuracy", accuracy); + setAmmoData(tags, durability, weight, accuracy, breakChance, shoddy, reinforced); } // now that durability has been handled... @@ -187,4 +183,14 @@ public void buildBolt(ToolBuildEvent event) event.handleStack = bolt2; event.accessoryStack = fletching; } + + private void setAmmoData(NBTTagCompound tags, int durability, float weight, float breakChance, float accuracy, float shoddy, int reinforced) + { + tags.setInteger("TotalDurability", durability); + tags.setFloat("Mass", weight); + tags.setFloat("BreakChance", breakChance); + tags.setFloat("Accuracy", accuracy); + tags.setFloat("Shoddy", shoddy); // we could actually always set this to 0 since it has zero impact on ammo + tags.setInteger("Unbreaking", reinforced); + } } diff --git a/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java b/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java index 66f2a9cdc07..724fafc8c2a 100644 --- a/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java +++ b/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java @@ -82,6 +82,12 @@ public Item getAccessoryItem () return TinkerWeaponry.fletching; } + // handle is custom material + @Override + public int durabilityTypeHandle() { + return 0; + } + @Override public String[] getTraits () { @@ -134,4 +140,12 @@ protected int getDefaultColor(int renderPass, int materialID) { return mat.color; } + + // fix tooltip custom materials + @Override + public String getAbilityNameForType(int type, int part) { + if(part >= 1) // only head has ability + return ""; + return super.getAbilityNameForType(type, part); + } } diff --git a/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java b/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java index f98c0c44be3..a13d927a81f 100644 --- a/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java +++ b/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java @@ -107,4 +107,12 @@ protected int getDefaultColor(int renderPass, int materialID) { return mat.color; } + + // fix tooltip custom materials + @Override + public String getAbilityNameForType(int type, int part) { + if(part >= 2) // only head and handle have ability + return ""; + return super.getAbilityNameForType(type, part); + } } From 591954cce1c5ca3dd470ff830d26f1ca0aa3f362 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 19 Oct 2014 16:46:01 +0200 Subject: [PATCH 034/129] Let's try this... Tinker Projectiles now deal actual unclamped damage instead of capped to 1/2 heart steps damage. --- .../java/tconstruct/library/entity/ProjectileBase.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/tconstruct/library/entity/ProjectileBase.java b/src/main/java/tconstruct/library/entity/ProjectileBase.java index 2f6e6aea684..8ced6d1754f 100644 --- a/src/main/java/tconstruct/library/entity/ProjectileBase.java +++ b/src/main/java/tconstruct/library/entity/ProjectileBase.java @@ -177,8 +177,8 @@ public void onHitBlock(MovingObjectPosition movingobjectposition) { public void onHitEntity(MovingObjectPosition movingobjectposition) { NBTTagCompound tags = returnStack.getTagCompound().getCompoundTag("InfiTool"); - double speed = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ); - int damage = MathHelper.ceiling_double_int(speed * tags.getInteger("Attack")); + float speed = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ); + float damage = speed * tags.getInteger("Attack"); // Damage calculations and stuff. For reference see AbilityHelper.onLeftClickEntity ToolCore ammo = (ToolCore)returnStack.getItem(); @@ -187,7 +187,7 @@ public void onHitEntity(MovingObjectPosition movingobjectposition) { // basically we pass the base damage to all modifiers and take the highest one int baseDamage = 0; for(ActiveToolMod toolmod : TConstructRegistry.activeModifiers) { - int dmg = toolmod.baseAttackDamage(baseDamage, damage, ammo, returnStack.getTagCompound(), tags, returnStack, (EntityPlayer)this.shootingEntity, movingobjectposition.entityHit); + int dmg = toolmod.baseAttackDamage(baseDamage, (int)damage, ammo, returnStack.getTagCompound(), tags, returnStack, (EntityPlayer)this.shootingEntity, movingobjectposition.entityHit); if(dmg > baseDamage) baseDamage = dmg; } @@ -213,13 +213,13 @@ public void onHitEntity(MovingObjectPosition movingobjectposition) { int modDamage = 0; for (ActiveToolMod mod : TConstructRegistry.activeModifiers) { - modDamage += mod.attackDamage(modDamage, damage, ammo, returnStack.getTagCompound(), tags, returnStack, (EntityPlayer)this.shootingEntity, movingobjectposition.entityHit); + modDamage += mod.attackDamage(modDamage, (int)damage, ammo, returnStack.getTagCompound(), tags, returnStack, (EntityPlayer)this.shootingEntity, movingobjectposition.entityHit); } damage += modDamage; // calculate critical damaaage if (this.getIsCritical()) - damage += this.rand.nextInt(damage / 2 + 2); + damage += this.rand.nextFloat() * (damage / 2f + 2f); // and now we come to the part where we actually deal the damage! if(!dealDamage(damage, ammo, tags, movingobjectposition.entityHit)) From 9f64ef46e8af15c82d2bfe70f00500ce9969834d Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 19 Oct 2014 16:46:48 +0200 Subject: [PATCH 035/129] Projectile Weapons tooltip displays the max damage with the current ammo --- resources/assets/tinker/lang/en_US.lang | 1 + .../java/tconstruct/client/TProxyClient.java | 3 ++ .../library/entity/ProjectileBase.java | 2 +- .../library/weaponry/ProjectileWeapon.java | 33 +++++++++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/resources/assets/tinker/lang/en_US.lang b/resources/assets/tinker/lang/en_US.lang index e88b2b24321..14cd6fc2692 100644 --- a/resources/assets/tinker/lang/en_US.lang +++ b/resources/assets/tinker/lang/en_US.lang @@ -820,6 +820,7 @@ modifier.tool.beheading=Beheading creativeModLock.tooltip=Target Lock: attribute.name.ammo.attackDamage=Base Damage +attribute.name.ammo.maxAttackDamage=Max. Damage tool.pickaxe=Pickaxe tool.shovel=Shovel diff --git a/src/main/java/tconstruct/client/TProxyClient.java b/src/main/java/tconstruct/client/TProxyClient.java index 6f517f5c53c..a16518c2149 100644 --- a/src/main/java/tconstruct/client/TProxyClient.java +++ b/src/main/java/tconstruct/client/TProxyClient.java @@ -1,6 +1,7 @@ package tconstruct.client; import java.io.InputStream; +import java.text.DecimalFormat; import javax.xml.parsers.*; import mantle.client.SmallFontRenderer; import mantle.lib.client.MantleClientRegistry; @@ -18,6 +19,8 @@ public class TProxyClient extends TProxyCommon { + public static DecimalFormat df = new DecimalFormat("##.#"); + /* TODO: Split this class up into its respective parts */ public static SmallFontRenderer smallFontRenderer; public static IIcon metalBall; diff --git a/src/main/java/tconstruct/library/entity/ProjectileBase.java b/src/main/java/tconstruct/library/entity/ProjectileBase.java index 8ced6d1754f..847b90b3a5a 100644 --- a/src/main/java/tconstruct/library/entity/ProjectileBase.java +++ b/src/main/java/tconstruct/library/entity/ProjectileBase.java @@ -178,7 +178,7 @@ public void onHitBlock(MovingObjectPosition movingobjectposition) { public void onHitEntity(MovingObjectPosition movingobjectposition) { NBTTagCompound tags = returnStack.getTagCompound().getCompoundTag("InfiTool"); float speed = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ); - float damage = speed * tags.getInteger("Attack"); + float damage = speed * tags.getInteger("Attack"); // todo: potentially change this back to MathHelper.ceiling_float_int to get 1/2 heart steps back // Damage calculations and stuff. For reference see AbilityHelper.onLeftClickEntity ToolCore ammo = (ToolCore)returnStack.getItem(); diff --git a/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java b/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java index ae055c09dac..461b87cc8eb 100644 --- a/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java +++ b/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java @@ -1,5 +1,8 @@ package tconstruct.library.weaponry; +import net.minecraft.init.Items; +import net.minecraft.util.StatCollector; +import tconstruct.client.TProxyClient; import tconstruct.library.TConstructRegistry; import tconstruct.weaponry.TinkerWeaponry; import tconstruct.weaponry.client.CrosshairType; @@ -21,6 +24,7 @@ import tconstruct.library.util.TextureHelper; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -361,4 +365,33 @@ private void addAnimationIcons(HashMap textures, HashMap Date: Sun, 19 Oct 2014 17:34:04 +0200 Subject: [PATCH 036/129] Make Ammo stuff more resilient against corrupt tools with no nbt --- src/main/java/tconstruct/library/weaponry/AmmoItem.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/tconstruct/library/weaponry/AmmoItem.java b/src/main/java/tconstruct/library/weaponry/AmmoItem.java index d02198a1431..7a8d0980d2e 100644 --- a/src/main/java/tconstruct/library/weaponry/AmmoItem.java +++ b/src/main/java/tconstruct/library/weaponry/AmmoItem.java @@ -22,12 +22,14 @@ public AmmoItem(int baseDamage, String name) { @Override public int getAmmoCount(ItemStack stack) { + if(!stack.hasTagCompound()) return 0; NBTTagCompound tags = stack.getTagCompound().getCompoundTag("InfiTool"); return tags.getInteger("Ammo"); } @Override public int getMaxAmmo(ItemStack stack) { + if(!stack.hasTagCompound()) return 0; NBTTagCompound tags = stack.getTagCompound().getCompoundTag("InfiTool"); return getMaxAmmo(tags); } @@ -40,6 +42,7 @@ public int getMaxAmmo(NBTTagCompound tags) { @Override public int addAmmo(int toAdd, ItemStack stack) { + if(!stack.hasTagCompound()) return toAdd; NBTTagCompound tags = stack.getTagCompound().getCompoundTag("InfiTool"); int oldCount = tags.getInteger("Ammo"); int newCount = Math.min(oldCount + toAdd, getMaxAmmo(stack)); @@ -49,6 +52,7 @@ public int addAmmo(int toAdd, ItemStack stack) { @Override public int consumeAmmo(int toUse, ItemStack stack) { + if(!stack.hasTagCompound()) return toUse; NBTTagCompound tags = stack.getTagCompound().getCompoundTag("InfiTool"); int oldCount = tags.getInteger("Ammo"); int newCount = Math.max(oldCount - toUse, 0); @@ -60,7 +64,7 @@ public int consumeAmmo(int toUse, ItemStack stack) { public boolean pickupAmmo(ItemStack stack, ItemStack candidate, EntityPlayer player) { - if(stack.getItem() == null || !(stack.getItem() instanceof IAmmo)) + if(stack.getItem() == null || !stack.hasTagCompound() || !(stack.getItem() instanceof IAmmo)) return false; // check if our candidate fits From cb33bb1b727dd2defb388b534db76a88793d0f8d Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 19 Oct 2014 17:34:16 +0200 Subject: [PATCH 037/129] Fix flux modifier throwing errors --- src/main/java/tconstruct/modifiers/tools/ModFlux.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/tconstruct/modifiers/tools/ModFlux.java b/src/main/java/tconstruct/modifiers/tools/ModFlux.java index e8a69cade43..46dad3a1db9 100644 --- a/src/main/java/tconstruct/modifiers/tools/ModFlux.java +++ b/src/main/java/tconstruct/modifiers/tools/ModFlux.java @@ -7,6 +7,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import tconstruct.library.modifier.IModifyable; import tconstruct.library.tools.ToolCore; /* TE3 support */ @@ -27,7 +28,7 @@ public boolean matches (ItemStack[] input, ItemStack tool) NBTTagCompound tags = tool.getTagCompound().getCompoundTag("InfiTool"); // not on ammo weapons, since they don't have durability technically - String[] traits = ((ToolCore)tool.getItem()).getTraits(); + String[] traits = ((IModifyable)tool.getItem()).getTraits(); for(String trait : traits) if("ammo".equals(trait)) return false; From 1c1ae28b69a45ac1040b3ff91105a1d3d756f79e Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 19 Oct 2014 17:34:38 +0200 Subject: [PATCH 038/129] Fix Division through zero with Longbow with low weight arrows --- src/main/java/tconstruct/weaponry/weapons/LongBow.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/tconstruct/weaponry/weapons/LongBow.java b/src/main/java/tconstruct/weaponry/weapons/LongBow.java index 98aaf2d53dd..03d99ab1076 100644 --- a/src/main/java/tconstruct/weaponry/weapons/LongBow.java +++ b/src/main/java/tconstruct/weaponry/weapons/LongBow.java @@ -51,7 +51,7 @@ protected Entity createProjectile(ItemStack arrows, World world, EntityPlayer pl float weight = tags.getFloat("Mass"); // we need heavier arrows because we have POW. therefore we increase the weight penality on accuracy - accuracy += ((100f-matAccuracy)/10f)/(weight-1f); + accuracy += ((100f-matAccuracy)/10f)/Math.max(1f, weight-1f); if(accuracy < 0) accuracy = 0; } From a968f41af7ca6effff55d55135a4bda7657b682b Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 19 Oct 2014 17:41:52 +0200 Subject: [PATCH 039/129] Legendary Glassmakers arrows! Only available in creative. --- .../tconstruct/weaponry/TinkerWeaponry.java | 7 ++ .../weaponry/items/GlassArrows.java | 70 +++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 src/main/java/tconstruct/weaponry/items/GlassArrows.java diff --git a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java index db7aece68fc..f71ebc46d97 100644 --- a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java +++ b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java @@ -33,6 +33,7 @@ import tconstruct.weaponry.ammo.ArrowAmmo; import tconstruct.weaponry.ammo.BoltAmmo; import tconstruct.library.tools.DualMaterialToolPart; +import tconstruct.weaponry.items.GlassArrows; import tconstruct.weaponry.items.WeaponryPattern; import tconstruct.library.weaponry.AmmoItem; import tconstruct.library.weaponry.AmmoWeapon; @@ -88,6 +89,7 @@ public class TinkerWeaponry { public void preInit(FMLPreInitializationEvent event) { registerItems(); + registerLegendaries(); registerMaterials(); } @@ -211,6 +213,11 @@ private void addPartRecipies() } + private void registerLegendaries() + { + GameRegistry.registerItem(new GlassArrows(), "GlassArrows"); + } + private void registerMaterials() { // Bow Materials: Material ID, durability, drawspeed, arrow speed diff --git a/src/main/java/tconstruct/weaponry/items/GlassArrows.java b/src/main/java/tconstruct/weaponry/items/GlassArrows.java new file mode 100644 index 00000000000..9f85f0844af --- /dev/null +++ b/src/main/java/tconstruct/weaponry/items/GlassArrows.java @@ -0,0 +1,70 @@ +package tconstruct.weaponry.items; + +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import tconstruct.library.client.TConstructClientRegistry; +import tconstruct.library.crafting.ToolBuilder; +import tconstruct.util.Reference; +import tconstruct.weaponry.TinkerWeaponry; +import tconstruct.weaponry.ammo.ArrowAmmo; + +import java.util.List; + +public class GlassArrows extends ArrowAmmo { + public GlassArrows() { + super(); + this.setUnlocalizedName(Reference.prefix("glassArrows")); + } + + @Override + public float getAmmoModifier() { + return 1.0f; + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean par4) { + super.addInformation(stack, player, list, par4); + + list.add(EnumChatFormatting.DARK_PURPLE + "Crafted by a legendary Glassmaker"); + } + + @Override + public void getSubItems(Item id, CreativeTabs tab, List list) { + ItemStack headStack = new ItemStack(getHeadItem(), 1, 0); + ItemStack handleStack = new ItemStack(getHandleItem(), 1, 0); // wooden shaft + ItemStack accessoryStack = new ItemStack(getAccessoryItem(), 1, 0); // feather fletchling + + ItemStack tool = ToolBuilder.instance.buildTool(headStack, handleStack, accessoryStack, null, ""); + if (tool != null) + { + tool.getTagCompound().getCompoundTag("InfiTool").setBoolean("Built", true); + } + else + return; + + // now turn it into legendary glass arrows! + NBTTagCompound tags = tool.getTagCompound().getCompoundTag("InfiTool"); + tags.setInteger("TotalDurability", 100); // 100 arrows + tags.setInteger("Ammo", 100); // full ammo + tags.setFloat("Mass", 5.0f); // durp + tags.setFloat("BreakChance", 200f); // 200% break chance! + tags.setFloat("Accuracy", 0.001f); // very full accuraccy + tags.setFloat("Shoddy", 0); // no stonebound/jagged + tags.setInteger("Unbreaking", 0); // no reinforced + tags.setInteger("Attack", 10); // insane damage! + + // now make them look like glass + tags.setInteger("RenderHead", -1); + tags.setInteger("RenderHandle", -1); + tags.setInteger("RenderAccessory", -1); + tags.setInteger("HeadColor", 0xccfff3); + tags.setInteger("HandleColor", 0xbcfff3); + tags.setInteger("AccessoryColor", 0xccfff3); + + list.add(tool); + } +} From 514847a10dddeefa59aadab3068cf44e5c1eda0f Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Wed, 22 Oct 2014 20:31:35 +0200 Subject: [PATCH 040/129] NEI Support for right side of stencil table --- .../tconstruct/tools/gui/StencilTableGui.java | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/main/java/tconstruct/tools/gui/StencilTableGui.java b/src/main/java/tconstruct/tools/gui/StencilTableGui.java index 31b4384ada3..e74ee65fced 100644 --- a/src/main/java/tconstruct/tools/gui/StencilTableGui.java +++ b/src/main/java/tconstruct/tools/gui/StencilTableGui.java @@ -1,5 +1,9 @@ package tconstruct.tools.gui; +import codechicken.nei.VisiblityData; +import codechicken.nei.api.INEIGuiHandler; +import codechicken.nei.api.TaggedInventoryArea; +import cpw.mods.fml.common.Optional; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; @@ -14,7 +18,11 @@ import tconstruct.tools.logic.StencilTableLogic; import tconstruct.util.network.PatternTablePacket; -public class StencilTableGui extends GuiContainer +import java.util.Collections; +import java.util.List; + +@Optional.Interface(iface = "codechicken.nei.api.INEIGuiHandler", modid = "NotEnoughItems") +public class StencilTableGui extends GuiContainer implements INEIGuiHandler { StencilTableLogic logic; int activeButton; @@ -135,4 +143,34 @@ void updateServer (ItemStack stack) { TConstruct.packetPipeline.sendToServer(new PatternTablePacket(logic.xCoord, logic.yCoord, logic.zCoord, stack)); } + + @Override + public VisiblityData modifyVisiblity(GuiContainer guiContainer, VisiblityData visiblityData) { + return visiblityData; + } + + @Override + public Iterable getItemSpawnSlots(GuiContainer guiContainer, ItemStack itemStack) { + return null; + } + + @Override + public List getInventoryAreas(GuiContainer guiContainer) { + return Collections.emptyList(); + } + + @Override + public boolean handleDragNDrop(GuiContainer guiContainer, int i, int i2, ItemStack itemStack, int i3) { + return false; + } + + @Override + public boolean hideItemPanelSlot(GuiContainer guiContainer, int x, int y, int w, int h) { + // is it in the horizontal column of the right buttons? + if(x > this.guiLeft + this.xSize + 4 && x < this.guiLeft + this.xSize + 4 + 22*3 + 16) + if(y > this.guiTop + 2 && y < this.guiTop + 2 + 22*(TConstructClientRegistry.stencilButtons2.size()-1)/4) + return true; + + return false; + } } \ No newline at end of file From dbc446636fc33f8e651899f3002a489b56dcf4f7 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Wed, 22 Oct 2014 23:36:44 +0200 Subject: [PATCH 041/129] Rework dagger into a projectileBase entity! --- .../client/entity/projectile/ArrowRender.java | 1 + .../entity/projectile/ArrowRenderCustom.java | 1 + .../entity/projectile/DaggerRender.java | 1 + .../entity/projectile/DaggerRenderCustom.java | 1 + .../java/tconstruct/items/tools/Dagger.java | 8 +- .../tconstruct/tools/ToolProxyClient.java | 6 +- .../tools/client/DaggerEntityRenderer.java | 25 +++++ .../tconstruct/tools/entity/ArrowEntity.java | 1 + .../tconstruct/tools/entity/DaggerEntity.java | 100 +++++++----------- .../tconstruct/tools/entity/RotatingBase.java | 1 + .../weaponry/entity/ShurikenEntity.java | 2 +- 11 files changed, 78 insertions(+), 69 deletions(-) create mode 100644 src/main/java/tconstruct/tools/client/DaggerEntityRenderer.java diff --git a/src/main/java/tconstruct/client/entity/projectile/ArrowRender.java b/src/main/java/tconstruct/client/entity/projectile/ArrowRender.java index 77c7e8d38f1..3a8ad1046df 100644 --- a/src/main/java/tconstruct/client/entity/projectile/ArrowRender.java +++ b/src/main/java/tconstruct/client/entity/projectile/ArrowRender.java @@ -15,6 +15,7 @@ import tconstruct.tools.entity.ArrowEntity; @SideOnly(Side.CLIENT) +@Deprecated public class ArrowRender extends Render { private static final ResourceLocation RES_ITEM_GLINT = new ResourceLocation("textures/misc/enchanted_item_glint.png"); diff --git a/src/main/java/tconstruct/client/entity/projectile/ArrowRenderCustom.java b/src/main/java/tconstruct/client/entity/projectile/ArrowRenderCustom.java index 25a366b6a33..c20ec110207 100644 --- a/src/main/java/tconstruct/client/entity/projectile/ArrowRenderCustom.java +++ b/src/main/java/tconstruct/client/entity/projectile/ArrowRenderCustom.java @@ -13,6 +13,7 @@ import tconstruct.tools.entity.ArrowEntity; @SideOnly(Side.CLIENT) +@Deprecated public class ArrowRenderCustom extends Render { private static RenderItem renderer = new RenderItem(); diff --git a/src/main/java/tconstruct/client/entity/projectile/DaggerRender.java b/src/main/java/tconstruct/client/entity/projectile/DaggerRender.java index 4f426331344..3d085afd7bb 100644 --- a/src/main/java/tconstruct/client/entity/projectile/DaggerRender.java +++ b/src/main/java/tconstruct/client/entity/projectile/DaggerRender.java @@ -17,6 +17,7 @@ import tconstruct.tools.entity.DaggerEntity; @SideOnly(Side.CLIENT) +@Deprecated public class DaggerRender extends Render { private static final ResourceLocation RES_ITEM_GLINT = new ResourceLocation("textures/misc/enchanted_item_glint.png"); diff --git a/src/main/java/tconstruct/client/entity/projectile/DaggerRenderCustom.java b/src/main/java/tconstruct/client/entity/projectile/DaggerRenderCustom.java index b36ea7f0579..bfe43abf403 100644 --- a/src/main/java/tconstruct/client/entity/projectile/DaggerRenderCustom.java +++ b/src/main/java/tconstruct/client/entity/projectile/DaggerRenderCustom.java @@ -14,6 +14,7 @@ import tconstruct.tools.entity.DaggerEntity; @SideOnly(Side.CLIENT) +@Deprecated public class DaggerRenderCustom extends Render { private static RenderItem renderer = new RenderItem(); diff --git a/src/main/java/tconstruct/items/tools/Dagger.java b/src/main/java/tconstruct/items/tools/Dagger.java index 34ee9da5789..3b5685f6ec6 100644 --- a/src/main/java/tconstruct/items/tools/Dagger.java +++ b/src/main/java/tconstruct/items/tools/Dagger.java @@ -21,9 +21,10 @@ public ItemStack onItemRightClick (ItemStack itemstack, World world, EntityPlaye ItemStack stack = itemstack.copy(); if (!world.isRemote) { - DaggerEntity dagger = new DaggerEntity(stack, world, player); + DaggerEntity dagger = new DaggerEntity(world, player, 1.5f, 0, stack); + //dagger.motionY++; if (player.capabilities.isCreativeMode) - dagger.doNotRetrieve = true; + dagger.canBePickedUp = 2; world.spawnEntityInWorld(dagger); } itemstack.stackSize--; @@ -36,7 +37,8 @@ public ItemStack onEaten (ItemStack itemstack, World world, EntityPlayer player) ItemStack stack = itemstack.copy(); if (!world.isRemote) { - DaggerEntity dagger = new DaggerEntity(stack, world, player); + DaggerEntity dagger = new DaggerEntity(world, player, 1.5f, 0, stack); + //dagger.motionY++; world.spawnEntityInWorld(dagger); } itemstack.stackSize--; diff --git a/src/main/java/tconstruct/tools/ToolProxyClient.java b/src/main/java/tconstruct/tools/ToolProxyClient.java index 56a70a40e0e..cfdecf8a2af 100644 --- a/src/main/java/tconstruct/tools/ToolProxyClient.java +++ b/src/main/java/tconstruct/tools/ToolProxyClient.java @@ -23,6 +23,7 @@ import tconstruct.library.crafting.*; import tconstruct.library.tools.ToolCore; import tconstruct.smeltery.TinkerSmeltery; +import tconstruct.tools.client.DaggerEntityRenderer; import tconstruct.tools.entity.*; import tconstruct.tools.gui.*; import tconstruct.tools.logic.*; @@ -51,8 +52,9 @@ public void registerRenderer () RenderingRegistry.registerBlockHandler(new BattlesignRender()); RenderingRegistry.registerEntityRenderingHandler(LaunchedPotion.class, new LaunchedItemRender(Items.potionitem, 16384)); - RenderingRegistry.registerEntityRenderingHandler(DaggerEntity.class, new DaggerRenderCustom()); - RenderingRegistry.registerEntityRenderingHandler(ArrowEntity.class, new ArrowRenderCustom()); + RenderingRegistry.registerEntityRenderingHandler(DaggerEntity.class, new DaggerEntityRenderer()); + //RenderingRegistry.registerEntityRenderingHandler(DaggerEntity.class, new DaggerRenderCustom()); + //RenderingRegistry.registerEntityRenderingHandler(ArrowEntity.class, new ArrowRenderCustom()); RenderingRegistry.registerEntityRenderingHandler(FancyEntityItem.class, new FancyItemRender()); //MinecraftForgeClient.registerItemRenderer(TinkerTools.shortbow, new CustomBowRenderer()); diff --git a/src/main/java/tconstruct/tools/client/DaggerEntityRenderer.java b/src/main/java/tconstruct/tools/client/DaggerEntityRenderer.java new file mode 100644 index 00000000000..da953c912e6 --- /dev/null +++ b/src/main/java/tconstruct/tools/client/DaggerEntityRenderer.java @@ -0,0 +1,25 @@ +package tconstruct.tools.client; + +import org.lwjgl.opengl.GL11; +import tconstruct.tools.entity.DaggerEntity; +import tconstruct.weaponry.client.entity.ProjectileBaseRenderer; + +public class DaggerEntityRenderer extends ProjectileBaseRenderer { + @Override + public void customRendering(DaggerEntity entity, double x, double y, double z, float p_76986_8_, float p_76986_9_) { + + // rotate it into the direction we threw it + GL11.glRotatef(entity.rotationYaw, 0f, 1f, 0f); + GL11.glRotatef(-entity.rotationPitch, 1f, 0f, 0f); + + // rotate it into a vertical position + GL11.glRotatef(90f, 0f, 1f, 0f); + + // it rotates! + GL11.glRotatef(entity.roll, 0f, 0f, 1f); + + + // also make it a bit thicker + toolCoreRenderer.setDepth(1/20f); + } +} diff --git a/src/main/java/tconstruct/tools/entity/ArrowEntity.java b/src/main/java/tconstruct/tools/entity/ArrowEntity.java index a721182a200..cab200912ad 100644 --- a/src/main/java/tconstruct/tools/entity/ArrowEntity.java +++ b/src/main/java/tconstruct/tools/entity/ArrowEntity.java @@ -17,6 +17,7 @@ import net.minecraft.util.*; import net.minecraft.world.World; +@Deprecated public class ArrowEntity extends EntityArrow implements IEntityAdditionalSpawnData { public ItemStack returnStack; diff --git a/src/main/java/tconstruct/tools/entity/DaggerEntity.java b/src/main/java/tconstruct/tools/entity/DaggerEntity.java index 94668b40cdb..89fd24decaf 100644 --- a/src/main/java/tconstruct/tools/entity/DaggerEntity.java +++ b/src/main/java/tconstruct/tools/entity/DaggerEntity.java @@ -6,86 +6,60 @@ import net.minecraft.util.*; import net.minecraft.world.World; import tconstruct.items.tools.Dagger; +import tconstruct.library.entity.ProjectileBase; import tconstruct.library.tools.*; -public class DaggerEntity extends RotatingBase +public class DaggerEntity extends ProjectileBase { + public int roll; - public DaggerEntity(World world) - { + public DaggerEntity(World world) { super(world); } - public DaggerEntity(ItemStack itemstack, World world, EntityPlayer entityplayer) - { - super(world, entityplayer, 0.75F, 0.8F); - // TConstruct.logger.info("Stack: "+itemstack); - returnStackSlot = entityplayer.inventory.currentItem; - returnStack = itemstack; + public DaggerEntity(World world, double d, double d1, double d2) { + super(world, d, d1, d2); } - public DaggerEntity(World world, EntityPlayer entityplayer, float f, float g) - { - super(world, entityplayer, f, g); + public DaggerEntity(World world, EntityPlayer player, float speed, float accuracy, ItemStack stack) { + super(world, player, speed, accuracy, stack); + + float pitch = Math.max(-90f, player.rotationPitch - 20f); + // same as in the others, but with pitch upped + this.setLocationAndAngles(player.posX, player.posY + (double)player.getEyeHeight(), player.posZ, player.rotationYaw, pitch); + this.posX -= MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F; + this.posY -= 0.10000000149011612D; + this.posZ -= MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F; + this.setPosition(this.posX, this.posY, this.posZ); + this.yOffset = 0.0F; + this.motionX = -MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI); + this.motionZ = +MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI); + this.motionY = -MathHelper.sin(this.rotationPitch / 180.0F * (float)Math.PI); + this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, speed, accuracy); } - /* - * public void entityInit () { super.entityInit(); } - */ + @Override + public void onUpdate() { + // you turn me right round baby + if(this.ticksInGround == 0) + roll = (roll + 20) % 360; + + super.onUpdate(); + } @Override - public void onHit (MovingObjectPosition movingobjectposition) - { - if (movingobjectposition.entityHit != null) - { - if (movingobjectposition.entityHit.attackEntityFrom(DamageSource.causeMobDamage(owner), damageDealt)) - { - worldObj.playSoundAtEntity(this, "random.drr", 1.0F, 1.2F / (rand.nextFloat() * 0.2F + 0.9F)); - motionX *= -0.1D; - motionY *= -0.1D; - motionZ *= -0.1D; - rotationYaw += 180F; - prevRotationYaw += 180F; - ticksInAir = 0; - if (movingobjectposition.entityHit instanceof EntityLiving) - { - Dagger dagger = (Dagger) returnStack.getItem(); - this.hitEntity(returnStack, (EntityLiving) movingobjectposition.entityHit, owner, dagger); - } - } - } - else - { - onGround = true; - xTile = movingobjectposition.blockX; - yTile = movingobjectposition.blockY; - zTile = movingobjectposition.blockZ; - inTile = worldObj.getBlock(xTile, yTile, zTile); - motionX = (float) (movingobjectposition.hitVec.xCoord - posX); - motionY = (float) (movingobjectposition.hitVec.yCoord - posY); - motionZ = (float) (movingobjectposition.hitVec.zCoord - posZ); - float f = MathHelper.sqrt_double(motionX * motionX + motionY * motionY + motionZ * motionZ); - posX -= (motionX / (double) f) * 0.05D; - posY -= (motionY / (double) f) * 0.05D; - posZ -= (motionZ / (double) f) * 0.05D; - worldObj.playSoundAtEntity(this, "random.drr", 1.0F, 1.2F / (rand.nextFloat() * 0.2F + 0.9F)); - arrowShake = 7; - if (!worldObj.isRemote) - AbilityHelper.damageTool(returnStack, 1, owner, false); - } + public void onHitEntity(MovingObjectPosition movingobjectposition) { + AbilityHelper.onLeftClickEntity(returnStack, (EntityPlayer)shootingEntity, movingobjectposition.entityHit, (ToolCore)returnStack.getItem()); + //super.onHitEntity(movingobjectposition); } - public boolean hitEntity (ItemStack stack, EntityLiving mob, EntityPlayer player, ToolCore weapon) - { - if (!worldObj.isRemote && player.canAttackWithItem()) - { - AbilityHelper.onLeftClickEntity(stack, player, mob, weapon); - } - return true; + @Override + protected double getGravity() { + return 0.1; } @Override - protected void dealFireDamage (int i) - { + protected double getSlowdown() { + return 0.02; } } diff --git a/src/main/java/tconstruct/tools/entity/RotatingBase.java b/src/main/java/tconstruct/tools/entity/RotatingBase.java index c3e3fae38da..f591a1b11f3 100644 --- a/src/main/java/tconstruct/tools/entity/RotatingBase.java +++ b/src/main/java/tconstruct/tools/entity/RotatingBase.java @@ -14,6 +14,7 @@ import net.minecraft.world.World; import tconstruct.library.tools.AbilityHelper; +@Deprecated public class RotatingBase extends Entity implements IEntityAdditionalSpawnData { diff --git a/src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java b/src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java index 8e497a76b2e..f44e51f828d 100644 --- a/src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java +++ b/src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java @@ -49,7 +49,7 @@ public void readSpawnData(ByteBuf data) { @Override protected double getGravity() { - return 0; + return 0; // todo: remove debug code ;) //return (this.ticksExisted/8) * 0.018d; // integer division. so the first 20 ticks it will have no gravity at all. } From 5bfdb0d769aa9708b2579256c8adbf96494d93f6 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Fri, 24 Oct 2014 13:30:46 +0200 Subject: [PATCH 042/129] Rework stencil table button layout to weaponry and more NEI fix --- .../tconstruct/tools/gui/StencilTableGui.java | 2 +- .../tconstruct/weaponry/WeaponryClientProxy.java | 16 +++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/java/tconstruct/tools/gui/StencilTableGui.java b/src/main/java/tconstruct/tools/gui/StencilTableGui.java index a20d3150fe7..76e2c6a6bf0 100644 --- a/src/main/java/tconstruct/tools/gui/StencilTableGui.java +++ b/src/main/java/tconstruct/tools/gui/StencilTableGui.java @@ -168,7 +168,7 @@ public boolean handleDragNDrop(GuiContainer guiContainer, int i, int i2, ItemSta public boolean hideItemPanelSlot(GuiContainer guiContainer, int x, int y, int w, int h) { // is it in the horizontal column of the right buttons? if(x > this.guiLeft + this.xSize + 4 && x < this.guiLeft + this.xSize + 4 + 22*3 + 16) - if(y > this.guiTop + 2 && y < this.guiTop + 2 + 22*(TConstructClientRegistry.stencilButtons2.size()-1)/4) + if(y > this.guiTop - 10 && y < this.guiTop + 2 + 22*(TConstructClientRegistry.stencilButtons2.size()-1)/4 + 22*(TConstructClientRegistry.stencilButtons2.size()%4 > 0 ? 1 : 0)) return true; return false; diff --git a/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java b/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java index 34e747ba708..5c3b813ff85 100644 --- a/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java +++ b/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java @@ -98,11 +98,17 @@ private void registerMaterialRendering() private void buttons() { - int base = StencilBuilder.getIndex(new ItemStack(TinkerWeaponry.woodPattern, 0, 0)); - TConstructClientRegistry.addStencilButton2(0, 4, base + 0, Reference.RESOURCE, "textures/gui/icons.png"); // shuriken - TConstructClientRegistry.addStencilButton2(1, 4, base + 1, Reference.RESOURCE, "textures/gui/icons.png"); // crossbow limb - TConstructClientRegistry.addStencilButton2(2, 4, base + 2, Reference.RESOURCE, "textures/gui/icons.png"); // crossbow body - TConstructClientRegistry.addStencilButton2(3, 4, base + 3, Reference.RESOURCE, "textures/gui/icons.png"); // bow limb + TConstructClientRegistry.addStencilButton2(11, 3, 21, Reference.RESOURCE, "textures/gui/icons.png"); // arrow head + TConstructClientRegistry.addStencilButton2(12, 3, 22, Reference.RESOURCE, "textures/gui/icons.png"); // fletchling + TConstructClientRegistry.addStencilButton2(0,0, -1, null, null); + TConstructClientRegistry.addStencilButton2(0,0, -1, null, null); + + TConstructClientRegistry.addStencilButton2(3, 4, 27, Reference.RESOURCE, "textures/gui/icons.png"); // bow limb + TConstructClientRegistry.addStencilButton2(10, 3, 23, Reference.RESOURCE, "textures/gui/icons.png"); // bowstring + TConstructClientRegistry.addStencilButton2(1, 4, 25, Reference.RESOURCE, "textures/gui/icons.png"); // crossbow limb + TConstructClientRegistry.addStencilButton2(2, 4, 26, Reference.RESOURCE, "textures/gui/icons.png"); // crossbow body + + TConstructClientRegistry.addStencilButton2(0, 4, 24, Reference.RESOURCE, "textures/gui/icons.png"); // shuriken //TConstructClientRegistry.addStencilButton2(4, 4, index, Reference.RESOURCE, "textures/gui/icons.png"); // bolt } } From 4c1852546ef7758ebab428ef8325a4ffd06cb255 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Fri, 24 Oct 2014 14:58:27 +0200 Subject: [PATCH 043/129] ToolStation/Forge GUI for the new weapons --- .../assets/tinker/textures/gui/icons.png | Bin 8887 -> 7430 bytes .../textures/items/parts/iron_shuriken.png | Bin 251 -> 0 bytes .../textures/items/shuriken/iron_shuriken.png | Bin 242 -> 0 bytes .../items/throwingknife/iron_knife_blade.png | Bin 340 -> 0 bytes .../items/throwingknife/iron_knife_handle.png | Bin 127 -> 0 bytes .../tconstruct/client/AmmoItemRenderer.java | 2 +- .../java/tconstruct/tools/TinkerTools.java | 2 + .../tconstruct/tools/ToolProxyClient.java | 3 - .../tconstruct/tools/gui/ToolForgeGui.java | 8 +++ .../tconstruct/weaponry/TinkerWeaponry.java | 4 +- .../weaponry/WeaponryClientProxy.java | 62 ++++++++++++++++-- 11 files changed, 68 insertions(+), 13 deletions(-) delete mode 100644 resources/assets/tinker/textures/items/parts/iron_shuriken.png delete mode 100644 resources/assets/tinker/textures/items/shuriken/iron_shuriken.png delete mode 100644 resources/assets/tinker/textures/items/throwingknife/iron_knife_blade.png delete mode 100644 resources/assets/tinker/textures/items/throwingknife/iron_knife_handle.png diff --git a/resources/assets/tinker/textures/gui/icons.png b/resources/assets/tinker/textures/gui/icons.png index 0ac16916dde77852a4075dd7f6e87f830a604b01..c0a0a8e415f89a9804622dfcdaa9e11eecd40fa5 100644 GIT binary patch literal 7430 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 literal 8887 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 Date: Sun, 26 Oct 2014 18:50:50 +0100 Subject: [PATCH 044/129] Arrows with knockback :D:D --- .../tconstruct/client/AmmoItemRenderer.java | 2 +- .../library/entity/ProjectileBase.java | 74 ++----------------- .../tconstruct/modifiers/tools/ModPiston.java | 2 +- 3 files changed, 10 insertions(+), 68 deletions(-) diff --git a/src/main/java/tconstruct/client/AmmoItemRenderer.java b/src/main/java/tconstruct/client/AmmoItemRenderer.java index 6570a85cdd7..13d048c6733 100644 --- a/src/main/java/tconstruct/client/AmmoItemRenderer.java +++ b/src/main/java/tconstruct/client/AmmoItemRenderer.java @@ -48,7 +48,7 @@ public void renderAmmoCount(ItemStack item) GL11.glScalef(0.7f, 0.7f, 0.7f); FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer; - //fontRenderer.drawStringWithShadow(str, 7 + 19 - 2 - fontRenderer.getStringWidth(str), 7 + 6 + 3, 16777215); + fontRenderer.drawStringWithShadow(str, 7 + 19 - 2 - fontRenderer.getStringWidth(str), 7 + 6 + 3, 16777215); GL11.glEnable(GL11.GL_LIGHTING); GL11.glEnable(GL11.GL_DEPTH_TEST); diff --git a/src/main/java/tconstruct/library/entity/ProjectileBase.java b/src/main/java/tconstruct/library/entity/ProjectileBase.java index 847b90b3a5a..68c9e7f7aa6 100644 --- a/src/main/java/tconstruct/library/entity/ProjectileBase.java +++ b/src/main/java/tconstruct/library/entity/ProjectileBase.java @@ -120,20 +120,24 @@ protected void playHitEntitySound() */ protected double getStuckDepth() { return 0.5f; } - protected void doLivingHit(EntityLivingBase entityHit) + protected void doLivingHit(EntityLivingBase entityHit) { + float knockback = returnStack.getTagCompound().getCompoundTag("InfiTool").getFloat("Knockback"); + if(shootingEntity instanceof EntityLivingBase) + knockback += EnchantmentHelper.getKnockbackModifier((EntityLivingBase) shootingEntity, entityHit); + if (!this.worldObj.isRemote) { entityHit.setArrowCountInEntity(entityHit.getArrowCountInEntity() + 1); } - if (this.knockbackStrength > 0) + if (knockback > 0) { double horizontalSpeed = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); if (horizontalSpeed > 0.0F) { - entityHit.addVelocity(this.motionX * (double) this.knockbackStrength * 0.6000000238418579D / (double) horizontalSpeed, 0.1D, this.motionZ * (double) this.knockbackStrength * 0.6000000238418579D / (double) horizontalSpeed); + entityHit.addVelocity(this.motionX * (double) knockback * 0.6000000238418579D / horizontalSpeed, 0.1D, this.motionZ * (double) knockback * 0.6000000238418579D / (double) horizontalSpeed); } } @@ -550,43 +554,7 @@ public void writeSpawnData(ByteBuf data) { NBTTagCompound tags = returnStack.getTagCompound().getCompoundTag("InfiTool"); ByteBufUtils.writeItemStack(data, returnStack); data.writeFloat(rotationYaw); - /* - data.writeInt(tags.getInteger("RenderHandle")); - data.writeInt(tags.getInteger("RenderHead")); - data.writeInt(tags.getInteger("RenderAccessory")); - data.writeInt(tags.getInteger("RenderExtra")); - - int effects = 0; - if (tags.hasKey("Effect1")) - effects++; - if (tags.hasKey("Effect2")) - effects++; - if (tags.hasKey("Effect3")) - effects++; - if (tags.hasKey("Effect4")) - effects++; - if (tags.hasKey("Effect5")) - effects++; - if (tags.hasKey("Effect6")) - effects++; - data.writeInt(effects); - - switch (effects) - { - case 6: - data.writeInt(tags.getInteger("Effect6")); - case 5: - data.writeInt(tags.getInteger("Effect5")); - case 4: - data.writeInt(tags.getInteger("Effect4")); - case 3: - data.writeInt(tags.getInteger("Effect3")); - case 2: - data.writeInt(tags.getInteger("Effect2")); - case 1: - data.writeInt(tags.getInteger("Effect1")); - } -*/ + // shooting entity int id = shootingEntity == null ? this.getEntityId() : shootingEntity.getEntityId(); data.writeInt(id); @@ -596,32 +564,6 @@ public void writeSpawnData(ByteBuf data) { public void readSpawnData(ByteBuf data) { returnStack = ByteBufUtils.readItemStack(data); rotationYaw = data.readFloat(); - /* - NBTTagCompound compound = new NBTTagCompound(); - NBTTagCompound toolTag = new NBTTagCompound(); - toolTag.setInteger("RenderHandle", data.readInt()); - toolTag.setInteger("RenderHead", data.readInt()); - toolTag.setInteger("RenderAccessory", data.readInt()); - toolTag.setInteger("RenderExtra", data.readInt()); - - switch (data.readInt()) - { - case 6: - toolTag.setInteger("Effect6", data.readInt()); - case 5: - toolTag.setInteger("Effect5", data.readInt()); - case 4: - toolTag.setInteger("Effect4", data.readInt()); - case 3: - toolTag.setInteger("Effect3", data.readInt()); - case 2: - toolTag.setInteger("Effect2", data.readInt()); - case 1: - toolTag.setInteger("Effect1", data.readInt()); - } - compound.setTag("InfiTool", toolTag); - returnStack.setTagCompound(compound); -*/ shootingEntity = worldObj.getEntityByID(data.readInt()); } } diff --git a/src/main/java/tconstruct/modifiers/tools/ModPiston.java b/src/main/java/tconstruct/modifiers/tools/ModPiston.java index 8c54ede98d6..d850c48fd29 100644 --- a/src/main/java/tconstruct/modifiers/tools/ModPiston.java +++ b/src/main/java/tconstruct/modifiers/tools/ModPiston.java @@ -96,6 +96,6 @@ void updateModTag (ItemStack tool, int[] keys) public boolean validType (ToolCore tool) { List list = Arrays.asList(tool.getTraits()); - return list.contains("weapon"); + return list.contains("weapon") || list.contains("ammo"); } } From 08cd6c5354069d78da79bf64743f912b7781cbad Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 26 Oct 2014 19:42:10 +0100 Subject: [PATCH 045/129] Fix arrow/bolt accuracy and breakchance being mixed up :( --- src/main/java/tconstruct/weaponry/WeaponryHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/tconstruct/weaponry/WeaponryHandler.java b/src/main/java/tconstruct/weaponry/WeaponryHandler.java index f6ed3db82c9..d4047fd6e21 100644 --- a/src/main/java/tconstruct/weaponry/WeaponryHandler.java +++ b/src/main/java/tconstruct/weaponry/WeaponryHandler.java @@ -56,7 +56,7 @@ public void onAmmoCrafted(ToolCraftEvent.NormalTool event) float accuracy = fletching.accuracy; float breakChance = shaft.fragility + fletching.breakChance; - setAmmoData(tags, durability, weight, accuracy, breakChance, head.shoddy(), head.reinforced()); + setAmmoData(tags, durability, weight, breakChance, accuracy, head.shoddy(), head.reinforced()); } else if(event.tool instanceof BoltAmmo) { @@ -81,7 +81,7 @@ else if(event.tool instanceof BoltAmmo) float shoddy = (headMat.shoddy() + coreMat.shoddy())/2f; int reinforced = Math.max(headMat.reinforced(), coreMat.reinforced()); - setAmmoData(tags, durability, weight, accuracy, breakChance, shoddy, reinforced); + setAmmoData(tags, durability, weight, breakChance, accuracy, shoddy, reinforced); } // now that durability has been handled... From f9fedafa6021af807a6f7cf43f31c8271cfa05a0 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 26 Oct 2014 19:42:27 +0100 Subject: [PATCH 046/129] Reinforced on projectiles causes them to sometimes not break when hitting entities! --- .../library/entity/ProjectileBase.java | 95 ++++++++++--------- .../weaponry/entity/ArrowEntity.java | 3 + 2 files changed, 55 insertions(+), 43 deletions(-) diff --git a/src/main/java/tconstruct/library/entity/ProjectileBase.java b/src/main/java/tconstruct/library/entity/ProjectileBase.java index 68c9e7f7aa6..cf9777e121b 100644 --- a/src/main/java/tconstruct/library/entity/ProjectileBase.java +++ b/src/main/java/tconstruct/library/entity/ProjectileBase.java @@ -36,6 +36,7 @@ public abstract class ProjectileBase extends EntityArrow implements IEntityAddit public int returnStackSlot; public boolean bounceOnNoDamage = true; + public boolean defused = false; // if this is true it wont hit any entities anymore public ProjectileBase(World world) { super(world); @@ -238,6 +239,7 @@ public void onHitEntity(MovingObjectPosition movingobjectposition) { this.rotationYaw += 180.0F; this.prevRotationYaw += 180.0F; this.ticksInAir = 0; + defused = true; return; } @@ -249,7 +251,17 @@ public void onHitEntity(MovingObjectPosition movingobjectposition) { if (!(movingobjectposition.entityHit instanceof EntityEnderman)) { - this.setDead(); + // reinforced helps for them to not break! + if(rand.nextInt(10)+1 > tags.getInteger("Reinforced")) + this.setDead(); + else + { + this.motionX = 0; + this.motionY = 0; + this.motionZ = 0; + this.ticksInAir = 0; + defused = true; + } } } @@ -354,58 +366,55 @@ protected void updateInAir() newPos = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); - // Check all the entities we on our way - Entity entity = null; - List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D)); - double distance = 0.0D; - float f1; - - for(Entity ent : list) - { - if(!ent.canBeCollidedWith()) - continue; - // we don't shoot ourselves into the foot. - if(ent == this.shootingEntity && this.ticksInAir < 5) - continue; - - f1 = 0.3F; - AxisAlignedBB axisalignedbb1 = ent.boundingBox.expand((double)f1, (double)f1, (double)f1); - MovingObjectPosition movingobjectposition1 = axisalignedbb1.calculateIntercept(curPos, newPos); - - // did we actually collide with the entity, or was it just really close nearby? - if (movingobjectposition1 != null) - { - // check if this entity is closer than the other one we already hit - double otherDistance = curPos.distanceTo(movingobjectposition1.hitVec); - - if (otherDistance < distance || distance == 0.0D) - { - entity = ent; - distance = otherDistance; + if(!defused) { + // Check all the entities we on our way + Entity entity = null; + List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D)); + double distance = 0.0D; + float f1; + + for (Entity ent : list) { + if (!ent.canBeCollidedWith()) + continue; + // we don't shoot ourselves into the foot. + if (ent == this.shootingEntity && this.ticksInAir < 5) + continue; + + f1 = 0.3F; + AxisAlignedBB axisalignedbb1 = ent.boundingBox.expand((double) f1, (double) f1, (double) f1); + MovingObjectPosition movingobjectposition1 = axisalignedbb1.calculateIntercept(curPos, newPos); + + // did we actually collide with the entity, or was it just really close nearby? + if (movingobjectposition1 != null) { + // check if this entity is closer than the other one we already hit + double otherDistance = curPos.distanceTo(movingobjectposition1.hitVec); + + if (otherDistance < distance || distance == 0.0D) { + entity = ent; + distance = otherDistance; + } } } - } - // if we hit something, new collision point! - if (entity != null) - movingobjectposition = new MovingObjectPosition(entity); + // if we hit something, new collision point! + if (entity != null) + movingobjectposition = new MovingObjectPosition(entity); - // did we hit a player? - if (movingobjectposition != null && movingobjectposition.entityHit != null && movingobjectposition.entityHit instanceof EntityPlayer) - { - EntityPlayer entityplayer = (EntityPlayer)movingobjectposition.entityHit; + // did we hit a player? + if (movingobjectposition != null && movingobjectposition.entityHit != null && movingobjectposition.entityHit instanceof EntityPlayer) { + EntityPlayer entityplayer = (EntityPlayer) movingobjectposition.entityHit; - // can we attack said player? - if (entityplayer.capabilities.disableDamage || this.shootingEntity instanceof EntityPlayer && !((EntityPlayer)this.shootingEntity).canAttackPlayer(entityplayer)) - movingobjectposition = null; + // can we attack said player? + if (entityplayer.capabilities.disableDamage || this.shootingEntity instanceof EntityPlayer && !((EntityPlayer) this.shootingEntity).canAttackPlayer(entityplayer)) + movingobjectposition = null; - // this check should probably done inside of the loop for accuracy.. + // this check should probably done inside of the loop for accuracy.. + } } // time to hit the object - if (movingobjectposition != null) - { + if (movingobjectposition != null) { if (movingobjectposition.entityHit != null) onHitEntity(movingobjectposition); else diff --git a/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java b/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java index ca63d6d955e..b963c932ffc 100644 --- a/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java +++ b/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java @@ -48,6 +48,9 @@ protected double getGravity() { public void onHitBlock(MovingObjectPosition movingobjectposition) { super.onHitBlock(movingobjectposition); + if(defused) + return; + // we might break! oh noez! float chance = returnStack.getTagCompound().getCompoundTag("InfiTool").getFloat("BreakChance"); if(chance > TConstruct.random.nextFloat()) { From 0691d2167f8af05cf9defc18cfe86c29876ec99f Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 26 Oct 2014 19:59:54 +0100 Subject: [PATCH 047/129] De-debug shuriken :I --- src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java b/src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java index f44e51f828d..e242e9248eb 100644 --- a/src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java +++ b/src/main/java/tconstruct/weaponry/entity/ShurikenEntity.java @@ -49,8 +49,7 @@ public void readSpawnData(ByteBuf data) { @Override protected double getGravity() { - return 0; // todo: remove debug code ;) - //return (this.ticksExisted/8) * 0.018d; // integer division. so the first 20 ticks it will have no gravity at all. + return (this.ticksExisted/8) * 0.018d; // integer division. so the first 20 ticks it will have no gravity at all. } @Override From 24cc1e773d7abcec9c83f77da71ddb78d3374f2c Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 26 Oct 2014 20:08:10 +0100 Subject: [PATCH 048/129] Projectiles now slowly regrow with moss :D --- src/main/java/tconstruct/tools/TActiveOmniMod.java | 11 ++++++++++- weaponry.txt | 12 +++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/main/java/tconstruct/tools/TActiveOmniMod.java b/src/main/java/tconstruct/tools/TActiveOmniMod.java index 7cbcb30db1c..3d298301b78 100644 --- a/src/main/java/tconstruct/tools/TActiveOmniMod.java +++ b/src/main/java/tconstruct/tools/TActiveOmniMod.java @@ -15,6 +15,7 @@ import net.minecraftforge.common.ForgeHooks; import tconstruct.library.ActiveToolMod; import tconstruct.library.tools.*; +import tconstruct.library.weaponry.IAmmo; import tconstruct.util.config.PHConstruct; import tconstruct.world.TinkerWorld; import tconstruct.world.entity.BlueSlime; @@ -34,7 +35,15 @@ public void updateTool (ToolCore tool, ItemStack stack, World world, Entity enti { int chance = tags.getInteger("Moss"); int check = world.canBlockSeeTheSky((int) entity.posX, (int) entity.posY, (int) entity.posZ) ? 350 : 1150; - if (random.nextInt(check) < chance) + // REGROWING AMMO :OOoo + if(tool instanceof IAmmo && random.nextInt(check*10) < chance) // ammo regenerates at a much slower rate + { + IAmmo ammothing = (IAmmo)tool; + if(ammothing.getAmmoCount(stack) > 0) // must have ammo + ammothing.addAmmo(1, stack); + } + // selfrepairing tool. LAAAAAME + else if (random.nextInt(check) < chance) { AbilityHelper.healTool(stack, 1, (EntityLivingBase) entity, true); } diff --git a/weaponry.txt b/weaponry.txt index 2576d3ac60c..d3a14d5de1c 100644 --- a/weaponry.txt +++ b/weaponry.txt @@ -1,14 +1,16 @@ TODO: -* Effect graphics for arrows, throwing knifes, javelins,... +* Effect graphics for arrows, throwing knifes, javelins,... MOSTLY DONE * Separate book explaining the system, text only, sorry folks -* Turn dagger into a proper projectile -* Reinforced gives a chance that projectiles aren't broken on entity-hit! +* Turn dagger into a proper projectile DONE +* Reinforced gives a chance that projectiles aren't broken on entity-hit! DONE * Toolstation GUI for weaponry stuff * Partbuilder stuff for weaponry stuff? * Bring bowmaterial stats etc in line? * Can't have flux or redstone or moss on ammo tools -* Knockback on projectiles knocks towards their moving direction -* Glassmakers Arrows :D +* Knockback on projectiles knocks towards their moving direction DONEish +* Glassmakers Arrows :D DONE +* Check why arrow repairing doesn't work +* REGROWING PROJECTILES HAR maybe give javelins slight armor piercing? or do they have that already? From ecf5d0e9901a1ecec3739d976ff2ece494edb95b Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 26 Oct 2014 20:11:24 +0100 Subject: [PATCH 049/129] Give javelin the other crosshair thing --- src/main/java/tconstruct/weaponry/weapons/Javelin.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/tconstruct/weaponry/weapons/Javelin.java b/src/main/java/tconstruct/weaponry/weapons/Javelin.java index 20f01b50fdb..b9b15e68e38 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Javelin.java +++ b/src/main/java/tconstruct/weaponry/weapons/Javelin.java @@ -1,6 +1,9 @@ package tconstruct.weaponry.weapons; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import tconstruct.weaponry.TinkerWeaponry; +import tconstruct.weaponry.client.CrosshairType; import tconstruct.weaponry.entity.JavelinEntity; import tconstruct.library.weaponry.AmmoWeapon; import net.minecraft.entity.Entity; @@ -167,4 +170,8 @@ protected Entity createProjectile(ItemStack reference, World world, EntityPlayer return entity; } + + @SideOnly(Side.CLIENT) + @Override + public CrosshairType getCrosshairType() { return CrosshairType.WEIRD; } } From 98d3cc8dc1cb82ea08a2fa65067cfca1bbc8fa87 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 26 Oct 2014 20:38:28 +0100 Subject: [PATCH 050/129] We can now restock ammo stuff. yay. --- .../modifiers/tools/ModAmmoRestock.java | 113 ++++++++++++++++++ .../tconstruct/weaponry/TinkerWeaponry.java | 3 +- weaponry.txt | 1 + 3 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 src/main/java/tconstruct/modifiers/tools/ModAmmoRestock.java diff --git a/src/main/java/tconstruct/modifiers/tools/ModAmmoRestock.java b/src/main/java/tconstruct/modifiers/tools/ModAmmoRestock.java new file mode 100644 index 00000000000..cc21cb6b87b --- /dev/null +++ b/src/main/java/tconstruct/modifiers/tools/ModAmmoRestock.java @@ -0,0 +1,113 @@ +package tconstruct.modifiers.tools; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import tconstruct.library.crafting.PatternBuilder; +import tconstruct.library.modifier.IModifyable; +import tconstruct.library.modifier.ItemModifier; +import tconstruct.library.tools.AbilityHelper; +import tconstruct.library.tools.ToolCore; +import tconstruct.library.weaponry.AmmoItem; +import tconstruct.library.weaponry.IAmmo; + +public class ModAmmoRestock extends ItemModifier { + public ModAmmoRestock() + { + super(new ItemStack[0], 0, ""); + } + + @Override + public boolean matches (ItemStack[] input, ItemStack tool) + { + return canModify(tool, input); + } + + @Override + protected boolean canModify (ItemStack tool, ItemStack[] input) + { + if(!(tool.getItem() instanceof AmmoItem)) + return false; + + IAmmo ammo = (IAmmo)tool.getItem(); + + // full? + if(ammo.getAmmoCount(tool) >= ammo.getMaxAmmo(tool)) + return false; + + NBTTagCompound tags = tool.getTagCompound().getCompoundTag("InfiTool"); + // correct material? + + int headID = tags.getInteger("Head"); + boolean areInputsValid = true; + for (ItemStack curInput : input) + { + if (curInput != null && headID != PatternBuilder.instance.getPartID(curInput)) + { + areInputsValid = false; + break; + } + } + + return areInputsValid; + } + + private int calculateIncrease (ItemStack tool, int materialValue, int itemsUsed) + { + NBTTagCompound tags = tool.getTagCompound().getCompoundTag("InfiTool"); + float dur = tags.getInteger("BaseDurability") * ((AmmoItem)tool.getItem()).getAmmoModifier(); + float increase = (5 * itemsUsed + (dur * 0.4f * materialValue/2f)); + + int modifiers = tags.getInteger("Modifiers"); + float mods = 1.0f; + if (modifiers == 2) + mods = 0.9f; + else if (modifiers == 1) + mods = 0.8f; + else if (modifiers == 0) + mods = 0.7f; + + increase *= mods; + + int repair = tags.getInteger("RepairCount"); + float repairCount = (100 - repair) / 100f; + if (repairCount < 0.5f) + repairCount = 0.5f; + increase *= repairCount; + increase /= ((ToolCore) tool.getItem()).getRepairCost(); + + return (int)increase; + } + + @Override + public void modify (ItemStack[] input, ItemStack tool) + { + NBTTagCompound tags = tool.getTagCompound().getCompoundTag("InfiTool"); + int itemsUsed = 0; + int materialValue = 0; + for (ItemStack curInput : input) + { + if (curInput != null) + { + materialValue += PatternBuilder.instance.getPartValue(curInput); + itemsUsed++; + } + } + + int increase = calculateIncrease(tool, materialValue, itemsUsed); + int repair = tags.getInteger("RepairCount"); + repair += itemsUsed; + tags.setInteger("RepairCount", repair); + + ((IAmmo)tool.getItem()).addAmmo(increase, tool); + } + + @Override + public void addMatchingEffect (ItemStack tool) + { + } + + public boolean validType (IModifyable input) + { + return input.getModifyType().equals("Tool") || input.getModifyType().equals("Armor"); + } +} diff --git a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java index 80a901dc17e..2405217c55a 100644 --- a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java +++ b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java @@ -17,7 +17,6 @@ import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import tconstruct.TConstruct; -import tconstruct.library.TConstructCreativeTab; import tconstruct.library.TConstructRegistry; import tconstruct.library.crafting.*; import tconstruct.library.tools.DynamicToolPart; @@ -25,6 +24,7 @@ import tconstruct.library.util.IPattern; import tconstruct.library.util.IToolPart; import tconstruct.modifiers.tools.ModWindup; +import tconstruct.modifiers.tools.ModAmmoRestock; import tconstruct.smeltery.TinkerSmeltery; import tconstruct.tools.TinkerTools; import tconstruct.tools.items.Bowstring; @@ -104,6 +104,7 @@ public void init(FMLInitializationEvent event) ItemStack redstoneItem = new ItemStack(Items.redstone); ItemStack redstoneBlock = new ItemStack(Blocks.redstone_block); ModifyBuilder.registerModifier(new ModWindup(2, new ItemStack[] { redstoneItem, redstoneBlock }, new int[] { 1, 9 })); + ModifyBuilder.registerModifier(new ModAmmoRestock()); } @Handler diff --git a/weaponry.txt b/weaponry.txt index d3a14d5de1c..31d5343b25e 100644 --- a/weaponry.txt +++ b/weaponry.txt @@ -11,6 +11,7 @@ TODO: * Glassmakers Arrows :D DONE * Check why arrow repairing doesn't work * REGROWING PROJECTILES HAR +* Javelins need lower durability. When leftclick attacking and it has no durability, it should use up 1 ammo and get durability. maybe give javelins slight armor piercing? or do they have that already? From 2618ebba3c962ae56de725272b58aa1e19cdc8d4 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 26 Oct 2014 20:50:04 +0100 Subject: [PATCH 051/129] Allow all materials for restocking for shuriken --- .../modifiers/tools/ModAmmoRestock.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/tconstruct/modifiers/tools/ModAmmoRestock.java b/src/main/java/tconstruct/modifiers/tools/ModAmmoRestock.java index cc21cb6b87b..91a44a95020 100644 --- a/src/main/java/tconstruct/modifiers/tools/ModAmmoRestock.java +++ b/src/main/java/tconstruct/modifiers/tools/ModAmmoRestock.java @@ -9,6 +9,10 @@ import tconstruct.library.tools.ToolCore; import tconstruct.library.weaponry.AmmoItem; import tconstruct.library.weaponry.IAmmo; +import tconstruct.weaponry.weapons.Shuriken; + +import java.util.HashSet; +import java.util.Set; public class ModAmmoRestock extends ItemModifier { public ModAmmoRestock() @@ -37,11 +41,19 @@ protected boolean canModify (ItemStack tool, ItemStack[] input) NBTTagCompound tags = tool.getTagCompound().getCompoundTag("InfiTool"); // correct material? - int headID = tags.getInteger("Head"); + Set materials = new HashSet(); + materials.add(tags.getInteger("Head")); + // shuriken allow all their components + if(tool.getItem() instanceof Shuriken) { + materials.add(tags.getInteger("Handle")); + materials.add(tags.getInteger("Accessory")); + materials.add(tags.getInteger("Extra")); + } + boolean areInputsValid = true; for (ItemStack curInput : input) { - if (curInput != null && headID != PatternBuilder.instance.getPartID(curInput)) + if (curInput != null && !materials.contains(PatternBuilder.instance.getPartID(curInput))) { areInputsValid = false; break; From 54957221948ae202303fdf138b736cd20c1d4547 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Tue, 28 Oct 2014 10:57:23 +0100 Subject: [PATCH 052/129] Pull tool info stuff out from toolstation/craftingstation gui and unify in helper class --- .../tools/gui/CraftingStationGui.java | 366 +---------------- .../tconstruct/tools/gui/ToolStationGui.java | 343 +--------------- .../tools/gui/ToolStationGuiHelper.java | 375 ++++++++++++++++++ weaponry.txt | 6 - 4 files changed, 378 insertions(+), 712 deletions(-) create mode 100644 src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java diff --git a/src/main/java/tconstruct/tools/gui/CraftingStationGui.java b/src/main/java/tconstruct/tools/gui/CraftingStationGui.java index e75ae7a8209..4cdf1278fef 100644 --- a/src/main/java/tconstruct/tools/gui/CraftingStationGui.java +++ b/src/main/java/tconstruct/tools/gui/CraftingStationGui.java @@ -139,8 +139,7 @@ else if (logic.isStackInSlot(5)) // center slot if no output item void drawToolStats (ItemStack stack) { - int offsetX = descTextLeft + 63; - int descX = descTextLeft + 10; + ToolStationGuiHelper.drawToolStats(stack, descTextLeft + 10, 0); if (centerStack != stack) { @@ -154,373 +153,10 @@ void drawToolStats (ItemStack stack) materialEnum = TConstructRegistry.getMaterial(matID); hasMaterial = true; centerTitle = "\u00A7n" + materialEnum.localizedName(); - } - else if (stack.getItem() instanceof ToolCore) - { - ToolCore tool = (ToolCore) stack.getItem(); - tags = stack.getTagCompound().getCompoundTag(tool.getBaseTagName()); - hasTool = true; - centerTitle = "\u00A7n" + tool.getLocalizedToolName(); - } - else if (stack.getItem() instanceof ArmorCore) - { - ArmorCore armor = (ArmorCore) stack.getItem(); - tags = stack.getTagCompound().getCompoundTag(armor.getBaseTagName()); - hasArmor = true; - centerTitle = "\u00A7n" + stack.getDisplayName(); // todo: localize - } - else if (stack.getItem() instanceof AccessoryCore) - { - AccessoryCore accessory = (AccessoryCore) stack.getItem(); - tags = stack.getTagCompound().getCompoundTag(accessory.getBaseTagName()); - hasAccessory = true; - centerTitle = "\u00A7n" + stack.getDisplayName(); // todo: localize - } - } - - if (hasAccessory || hasArmor || hasMaterial || hasTool) - { - this.drawCenteredString(fontRendererObj, centerTitle, offsetX, 8, 0xffffff); - if (hasTool) - { - drawModularToolStats(); - } - else if (hasArmor) - { - drawModularArmorStats(); - } - else if (hasAccessory) - { - drawModularAccessoryStats(); - } - else if (hasMaterial) - { drawMaterialStats(); } } - else - { - drawToolInformation(); - } - } - - protected void drawModularToolStats () - { - ToolCore tool = (ToolCore)centerStack.getItem(); - - List categories = Arrays.asList(tool.getTraits()); - final int durability = tags.getInteger("Damage"); - final int maxDur = tags.getInteger("TotalDurability"); - int availableDurability = maxDur - durability; - - // Durability - final int baseX = descTextLeft + 10; - final int baseY = 24; - int offset = 0; - if (maxDur > 0) - { - if (maxDur >= 10000) - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation1"), baseX, baseY + offset * 11, 0xffffff); - offset++; - fontRendererObj.drawString("- " + availableDurability + "/" + maxDur, baseX, baseY + offset * 10, 0xffffff); - offset++; - } - else - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation2") + availableDurability + "/" + maxDur, baseX, baseY + offset * 10, 0xffffff); - offset++; - } - } - - final float stonebound = tags.getFloat("Shoddy"); - // Attack - if (categories.contains("weapon")) - { - int attack = (int) (tags.getInteger("Attack")) + 1; - float stoneboundDamage = (float) Math.log(durability / 72f + 1) * -2 * stonebound; - attack += stoneboundDamage; - attack *= tool.getDamageModifier(); - if (attack < 1) - attack = 1; - - String heart = attack == 2 ? StatCollector.translateToLocal("gui.partcrafter8") : StatCollector.translateToLocal("gui.partcrafter9"); - if (attack % 2 == 0) - this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation3") + attack / 2 + heart, baseX, baseY + offset * 10, 0xffffff); - else - this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation3") + attack / 2f + heart, baseX, baseY + offset * 10, 0xffffff); - offset++; - - if (stoneboundDamage != 0) - { - DecimalFormat df = new DecimalFormat("##.##"); - heart = stoneboundDamage == 2 ? StatCollector.translateToLocal("gui.partcrafter8") : StatCollector.translateToLocal("gui.partcrafter9"); - String bloss = stoneboundDamage > 0 ? StatCollector.translateToLocal("gui.toolstation4") : StatCollector.translateToLocal("gui.toolstation5"); - this.fontRendererObj.drawString(bloss + df.format(stoneboundDamage / 2f) + heart, baseX, baseY + offset * 10, 0xffffff); - offset++; - } - offset++; - } - - if (categories.contains("bow")) - { - DecimalFormat df = new DecimalFormat("##.##"); - df.setRoundingMode(RoundingMode.DOWN); - int drawSpeed = tags.getInteger("DrawSpeed"); - float flightSpeed = tags.getFloat("FlightSpeed"); - float trueDraw = drawSpeed / 20f * flightSpeed; - this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation6") + df.format(trueDraw) + "s", baseX, baseY + offset * 10, 0xffffff); - offset++; - this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation7") + df.format(flightSpeed) + "x", baseX, baseY + offset * 10, 0xffffff); - offset++; - offset++; - } - - if (categories.contains("ammo")) - { - DecimalFormat df = new DecimalFormat("##.##"); - df.setRoundingMode(RoundingMode.DOWN); - int attack = (int) (tags.getInteger("Attack")); - float mass = tags.getFloat("Mass"); - float shatter = tags.getFloat("BreakChance"); - float accuracy = tags.getFloat("Accuracy"); - - this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation10"), baseX, baseY + offset * 10, 0xffffff); - offset++; - String heart = attack == 2 ? StatCollector.translateToLocal("gui.partcrafter8") : StatCollector.translateToLocal("gui.partcrafter9"); - if (attack % 2 == 0) - this.fontRendererObj.drawString("- " + attack / 2 + heart, baseX, baseY + offset * 10, 0xffffff); - else - this.fontRendererObj.drawString("- " + attack / 2f + heart, baseX, baseY + offset * 10, 0xffffff); - offset++; - int minAttack = attack; - int maxAttack = attack * 2; - heart = StatCollector.translateToLocal("gui.partcrafter9"); - this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation11"), baseX, baseY + offset * 10, 0xffffff); - offset++; - this.fontRendererObj.drawString(df.format(minAttack / 2f) + "-" + df.format(maxAttack / 2f) + heart, baseX, baseY + offset * 10, 0xffffff); - offset++; - offset++; - - this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation8") + df.format(mass), baseX, baseY + offset * 10, 0xffffff); - offset++; - this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation9") + df.format(accuracy - 4) + "%", baseX, baseY + offset * 10, 0xffffff); - offset++; - /* - * this.fontRendererObj.drawString("Chance to break: " + - * df.format(shatter)+"%", xSize + 8, base + offset * 10, 0xffffff); - * offset++; - */ - offset++; - } - - // Mining - if (categories.contains("dualharvest")) - { - float mineSpeed = tags.getInteger("MiningSpeed") / 100f * ((HarvestTool) tool).breakSpeedModifier(); - float mineSpeed2 = tags.getInteger("MiningSpeed2") / 100f * ((HarvestTool) tool).breakSpeedModifier(); - float stoneboundSpeed = (float) Math.log(durability / ((HarvestTool) tool).stoneboundModifier() + 1) * 2 * stonebound; - DecimalFormat df = new DecimalFormat("##.##"); - df.setRoundingMode(RoundingMode.DOWN); - float trueSpeed = mineSpeed + stoneboundSpeed; - float trueSpeed2 = mineSpeed2 + stoneboundSpeed; - - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation12"), baseX, baseY + offset * 10, 0xffffff); - offset++; - fontRendererObj.drawString("- " + df.format(trueSpeed) + ", " + df.format(trueSpeed2), baseX, baseY + offset * 10, 0xffffff); - offset++; - if (stoneboundSpeed != 0) - { - String bloss = stoneboundSpeed > 0 ? StatCollector.translateToLocal("gui.toolstation4") : StatCollector.translateToLocal("gui.toolstation5"); - fontRendererObj.drawString(bloss + df.format(stoneboundSpeed), baseX, baseY + offset * 10, 0xffffff); - offset++; - } - offset++; - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation13"), baseX, baseY + offset * 10, 0xffffff); - offset++; - fontRendererObj.drawString("- " + HarvestLevels.getHarvestLevelName(tags.getInteger("HarvestLevel")) + ", " + HarvestLevels.getHarvestLevelName(tags.getInteger("HarvestLevel2")), baseX, baseY + offset * 10, 0xffffff); - offset++; - offset++; - } - else if (categories.contains("harvest")) - { - float trueSpeed = AbilityHelper.calcToolSpeed(tool, tags); - float stoneboundSpeed = AbilityHelper.calcToolSpeed(tool, tags); - - DecimalFormat df = new DecimalFormat("##.##"); - df.setRoundingMode(RoundingMode.DOWN); - trueSpeed += stoneboundSpeed; - if (trueSpeed < 0) - trueSpeed = 0; - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation14") + df.format(trueSpeed), baseX, baseY + offset * 10, 0xffffff); - offset++; - if (stoneboundSpeed != 0 && !Float.isNaN(stoneboundSpeed)) - { - String bloss = stoneboundSpeed > 0 ? StatCollector.translateToLocal("gui.toolstation4") : StatCollector.translateToLocal("gui.toolstation5"); - fontRendererObj.drawString(bloss + df.format(stoneboundSpeed), baseX, baseY + offset * 10, 0xffffff); - offset++; - } - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation15") + HarvestLevels.getHarvestLevelName(tags.getInteger("HarvestLevel")), baseX, baseY + offset * 10, 0xffffff); - offset++; - offset++; - } - else if (categories.contains("utility")) - { - float mineSpeed = tags.getInteger("MiningSpeed"); - float trueSpeed = mineSpeed / (100f); - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation16") + trueSpeed, baseX, baseY + offset * 10, 0xffffff); - offset++; - offset++; - } - - int modifiers = tags.getInteger("Modifiers"); - if (modifiers > 0) - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation18") + tags.getInteger("Modifiers"), baseX, baseY + offset * 10, 0xffffff); - offset++; - } - if (tags.hasKey("Tooltip1")) - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation17"), baseX, baseY + offset * 10, 0xffffff); - } - - boolean displayToolTips = true; - int tipNum = 0; - while (displayToolTips) - { - tipNum++; - String tooltip = "ModifierTip" + tipNum; - if (tags.hasKey(tooltip)) - { - String tipName = tags.getString(tooltip); - fontRendererObj.drawString("- " + tipName, baseX, baseY + (offset + tipNum) * 10, 0xffffff); - } - else - displayToolTips = false; - } - } - - private static DecimalFormat df = new DecimalFormat("##.#"); - - // todo: do this properly, quick and dirty fix - protected void drawModularArmorStats () - { - ArmorCore armor = (ArmorCore)centerStack.getItem(); - List categories = Arrays.asList(armor.getTraits()); - final int baseX = descTextLeft + 10; - final int baseY = 24; - int offset = 0; - - // durability - final int durability = tags.getInteger("Damage"); - final int maxDur = tags.getInteger("TotalDurability"); - int availableDurability = maxDur - durability; - - // Durability - if (maxDur > 0) - { - if (maxDur >= 10000) - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation1"), baseX, baseY + offset * 11, 0xffffff); - offset++; - fontRendererObj.drawString("- " + availableDurability + "/" + maxDur, baseX, baseY + offset * 10, 0xffffff); - offset++; - } - else - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation2") + availableDurability + "/" + maxDur, baseX, baseY + offset * 10, 0xffffff); - offset++; - } - } - // Damage reduction - double damageReduction = tags.getDouble("DamageReduction"); - if(damageReduction > 0.000001d) - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation19") + df.format(damageReduction), baseX, baseY + offset * 10, 0xffffff); - offset++; - } - - // Protection - double protection = armor.getProtection(centerStack); - double maxProtection = tags.getDouble("MaxDefense"); - //if(maxProtection > protection) - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation20") + df.format(protection) + "/" + df.format(maxProtection), baseX, baseY + offset * 10, 0xffffff); - //else - // fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation20") + df.format(protection), x, base + offset * 10, 0xffffff); - offset++; - - offset++; - int modifiers = tags.getInteger("Modifiers"); - if (modifiers > 0) - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation18") + tags.getInteger("Modifiers"), baseX, baseY + offset * 10, 0xffffff); - offset++; - } - if (tags.hasKey("Tooltip1")) - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation17"), baseX, baseY + offset * 10, 0xffffff); - } - - boolean displayToolTips = true; - int tipNum = 0; - while (displayToolTips) - { - tipNum++; - String tooltip = "ModifierTip" + tipNum; - if (tags.hasKey(tooltip)) - { - String tipName = tags.getString(tooltip); - fontRendererObj.drawString("- " + tipName, baseX, baseY + (offset + tipNum) * 10, 0xffffff); - } - else - displayToolTips = false; - } - } - - // todo: also quick and dirty fix - protected void drawModularAccessoryStats () - { - AccessoryCore accessory = (AccessoryCore)centerStack.getItem(); - List categories = Arrays.asList(accessory.getTraits()); - final int baseX = descTextLeft + 10; - final int baseY = 24; - int offset = 0; - - if (categories.contains("utility")) - { - float mineSpeed = tags.getInteger("MiningSpeed"); - float trueSpeed = mineSpeed / (100f); - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation16") + trueSpeed, baseX, baseY + offset * 10, 0xffffff); - offset++; - } - - offset++; - int modifiers = tags.getInteger("Modifiers"); - if (modifiers > 0) - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation18") + tags.getInteger("Modifiers"), baseX, baseY + offset * 10, 0xffffff); - offset++; - } - if (tags.hasKey("Tooltip1")) - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation17"), baseX, baseY + offset * 10, 0xffffff); - } - - boolean displayToolTips = true; - int tipNum = 0; - while (displayToolTips) - { - tipNum++; - String tooltip = "ModifierTip" + tipNum; - if (tags.hasKey(tooltip)) - { - String tipName = tags.getString(tooltip); - fontRendererObj.drawString("- " + tipName, baseX, baseY + (offset + tipNum) * 10, 0xffffff); - } - else - displayToolTips = false; - } } protected void drawMaterialStats() diff --git a/src/main/java/tconstruct/tools/gui/ToolStationGui.java b/src/main/java/tconstruct/tools/gui/ToolStationGui.java index 77cb78ab27f..8f0602f33d0 100644 --- a/src/main/java/tconstruct/tools/gui/ToolStationGui.java +++ b/src/main/java/tconstruct/tools/gui/ToolStationGui.java @@ -7,6 +7,7 @@ import java.text.DecimalFormat; import java.util.*; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.*; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; @@ -178,351 +179,11 @@ protected void drawGuiContainerForegroundLayer (int par1, int par2) this.fontRendererObj.drawString(toolName + "_", 180, 8, 0xffffff); if (logic.isStackInSlot(0)) - drawToolStats(); + ToolStationGuiHelper.drawToolStats(logic.getStackInSlot(0), 294, 0); else drawToolInformation(); } - protected void drawToolStats () - { - ItemStack stack = logic.getStackInSlot(0); - if (stack.getItem() instanceof ToolCore) - { - ToolCore tool = (ToolCore) stack.getItem(); - NBTTagCompound tags = stack.getTagCompound().getCompoundTag(tool.getBaseTagName()); - this.drawCenteredString(fontRendererObj, "\u00A7n" + tool.getLocalizedToolName(), 349, 8, 0xffffff); - - drawModularToolStats(stack, tool, tags, 294, 24); - } - if(stack.getItem() instanceof ArmorCore) - { - ArmorCore armor = (ArmorCore) stack.getItem(); - NBTTagCompound tags = stack.getTagCompound().getCompoundTag(armor.getBaseTagName()); - this.drawCenteredString(fontRendererObj, "\u00A7n" + stack.getDisplayName(), 349, 8, 0xffffff); // todo: localize - - drawModularArmorStats(stack, armor, tags, 294, 24); - } - if(stack.getItem() instanceof AccessoryCore) - { - AccessoryCore accessory = (AccessoryCore) stack.getItem(); - NBTTagCompound tags = stack.getTagCompound().getCompoundTag(accessory.getBaseTagName()); - this.drawCenteredString(fontRendererObj, "\u00A7n" + stack.getDisplayName(), 349, 8, 0xffffff); // todo: localize - - drawModularAccessoryStats(stack, accessory, tags, 294, 24); - } - } - - protected void drawModularToolStats (ItemStack stack, ToolCore tool, NBTTagCompound tags, int x, int y) - { - List categories = Arrays.asList(tool.getTraits()); - final int durability = tags.getInteger("Damage"); - final int maxDur = tags.getInteger("TotalDurability"); - int availableDurability = maxDur - durability; - - // Durability - int base = y; - int offset = 0; - if (maxDur > 0) - { - if (maxDur >= 10000) - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation1"), x, base + offset * 11, 0xffffff); - offset++; - fontRendererObj.drawString("- " + availableDurability + "/" + maxDur, x, base + offset * 10, 0xffffff); - offset++; - } - else - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation2") + availableDurability + "/" + maxDur, x, base + offset * 10, 0xffffff); - offset++; - } - } - - final float stonebound = tags.getFloat("Shoddy"); - // Attack - if (categories.contains("weapon")) - { - int attack = (int) (tags.getInteger("Attack")) + 1; - float stoneboundDamage = (float) Math.log(durability / 72f + 1) * -2 * stonebound; - attack += stoneboundDamage; - attack *= tool.getDamageModifier(); - if (attack < 1) - attack = 1; - - String heart = attack == 2 ? StatCollector.translateToLocal("gui.partcrafter8") : StatCollector.translateToLocal("gui.partcrafter9"); - if (attack % 2 == 0) - this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation3") + attack / 2 + heart, x, base + offset * 10, 0xffffff); - else - this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation3") + attack / 2f + heart, x, base + offset * 10, 0xffffff); - offset++; - - if (stoneboundDamage != 0) - { - DecimalFormat df = new DecimalFormat("##.##"); - heart = stoneboundDamage == 2 ? StatCollector.translateToLocal("gui.partcrafter8") : StatCollector.translateToLocal("gui.partcrafter9"); - String bloss = stoneboundDamage > 0 ? StatCollector.translateToLocal("gui.toolstation4") : StatCollector.translateToLocal("gui.toolstation5"); - this.fontRendererObj.drawString(bloss + df.format(stoneboundDamage / 2f) + heart, x, base + offset * 10, 0xffffff); - offset++; - } - offset++; - } - - if (categories.contains("bow")) - { - DecimalFormat df = new DecimalFormat("##.##"); - df.setRoundingMode(RoundingMode.DOWN); - int drawSpeed = tags.getInteger("DrawSpeed"); - float flightSpeed = tags.getFloat("FlightSpeed"); - float trueDraw = drawSpeed / 20f; - this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation6") + df.format(trueDraw) + "s", x, base + offset * 10, 0xffffff); - offset++; - this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation7") + df.format(flightSpeed) + "x", x, base + offset * 10, 0xffffff); - offset++; - offset++; - } - - if (categories.contains("ammo")) - { - DecimalFormat df = new DecimalFormat("##.##"); - df.setRoundingMode(RoundingMode.DOWN); - int attack = (int) (tags.getInteger("Attack")); - float mass = tags.getFloat("Mass"); - float shatter = tags.getFloat("BreakChance"); - float accuracy = tags.getFloat("Accuracy"); - - this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation10"), x, base + offset * 10, 0xffffff); - offset++; - String heart = attack == 2 ? StatCollector.translateToLocal("gui.partcrafter8") : StatCollector.translateToLocal("gui.partcrafter9"); - if (attack % 2 == 0) - this.fontRendererObj.drawString("- " + attack / 2 + heart, x, base + offset * 10, 0xffffff); - else - this.fontRendererObj.drawString("- " + attack / 2f + heart, x, base + offset * 10, 0xffffff); - offset++; - int minAttack = attack; - int maxAttack = attack * 2; - heart = StatCollector.translateToLocal("gui.partcrafter9"); - this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation11"), x, base + offset * 10, 0xffffff); - offset++; - this.fontRendererObj.drawString(df.format(minAttack / 2f) + "-" + df.format(maxAttack / 2f) + heart, x, base + offset * 10, 0xffffff); - offset++; - offset++; - - this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation8") + df.format(mass), x, base + offset * 10, 0xffffff); - offset++; - this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation9") + df.format(accuracy - 4) + "%", x, base + offset * 10, 0xffffff); - offset++; - /* - * this.fontRendererObj.drawString("Chance to break: " + - * df.format(shatter)+"%", xSize + 8, base + offset * 10, 0xffffff); - * offset++; - */ - offset++; - } - - // Mining - if (categories.contains("dualharvest")) - { - float mineSpeed = tags.getInteger("MiningSpeed") / 100f * ((HarvestTool) tool).breakSpeedModifier(); - float mineSpeed2 = tags.getInteger("MiningSpeed2") / 100f * ((HarvestTool) tool).breakSpeedModifier(); - float stoneboundSpeed = (float) Math.log(durability / ((HarvestTool) tool).stoneboundModifier() + 1) * 2 * stonebound; - DecimalFormat df = new DecimalFormat("##.##"); - df.setRoundingMode(RoundingMode.DOWN); - float trueSpeed = mineSpeed + stoneboundSpeed; - float trueSpeed2 = mineSpeed2 + stoneboundSpeed; - - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation12"), x, base + offset * 10, 0xffffff); - offset++; - fontRendererObj.drawString("- " + df.format(trueSpeed) + ", " + df.format(trueSpeed2), x, base + offset * 10, 0xffffff); - offset++; - if (stoneboundSpeed != 0) - { - String bloss = stoneboundSpeed > 0 ? StatCollector.translateToLocal("gui.toolstation4") : StatCollector.translateToLocal("gui.toolstation5"); - fontRendererObj.drawString(bloss + df.format(stoneboundSpeed), x, base + offset * 10, 0xffffff); - offset++; - } - offset++; - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation13"), x, base + offset * 10, 0xffffff); - offset++; - fontRendererObj.drawString("- " + HarvestLevels.getHarvestLevelName(tags.getInteger("HarvestLevel")) + ", " + HarvestLevels.getHarvestLevelName(tags.getInteger("HarvestLevel2")), x, base + offset * 10, 0xffffff); - offset++; - offset++; - } - else if (categories.contains("harvest")) - { - float trueSpeed = AbilityHelper.calcToolSpeed(tool, tags); - float stoneboundSpeed = AbilityHelper.calcToolSpeed(tool, tags); - - DecimalFormat df = new DecimalFormat("##.##"); - df.setRoundingMode(RoundingMode.DOWN); - trueSpeed += stoneboundSpeed; - if (trueSpeed < 0) - trueSpeed = 0; - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation14") + df.format(trueSpeed), x, base + offset * 10, 0xffffff); - offset++; - if (stoneboundSpeed != 0 && !Float.isNaN(stoneboundSpeed)) - { - String bloss = stoneboundSpeed > 0 ? StatCollector.translateToLocal("gui.toolstation4") : StatCollector.translateToLocal("gui.toolstation5"); - fontRendererObj.drawString(bloss + df.format(stoneboundSpeed), x, base + offset * 10, 0xffffff); - offset++; - } - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation15") + HarvestLevels.getHarvestLevelName(tags.getInteger("HarvestLevel")), x, base + offset * 10, 0xffffff); - offset++; - offset++; - } - else if (categories.contains("utility")) - { - float mineSpeed = tags.getInteger("MiningSpeed"); - float trueSpeed = mineSpeed / (100f); - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation16") + trueSpeed, x, base + offset * 10, 0xffffff); - offset++; - offset++; - } - - int modifiers = tags.getInteger("Modifiers"); - if (modifiers > 0) - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation18") + tags.getInteger("Modifiers"), x, base + offset * 10, 0xffffff); - offset++; - } - if (tags.hasKey("Tooltip1")) - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation17"), x, base + offset * 10, 0xffffff); - } - - boolean displayToolTips = true; - int tipNum = 0; - while (displayToolTips) - { - tipNum++; - String tooltip = "ModifierTip" + tipNum; - if (tags.hasKey(tooltip)) - { - String tipName = tags.getString(tooltip); - fontRendererObj.drawString("- " + tipName, x, base + (offset + tipNum) * 10, 0xffffff); - } - else - displayToolTips = false; - } - } - - private static DecimalFormat df = new DecimalFormat("##.#"); - - // todo: do this properly, quick and dirty fix - protected void drawModularArmorStats (ItemStack stack, ArmorCore armor, NBTTagCompound tags, int x, int y) - { - List categories = Arrays.asList(armor.getTraits()); - int base = y; - int offset = 0; - - // durability - final int durability = tags.getInteger("Damage"); - final int maxDur = tags.getInteger("TotalDurability"); - int availableDurability = maxDur - durability; - - // Durability - if (maxDur > 0) - { - if (maxDur >= 10000) - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation1"), x, base + offset * 11, 0xffffff); - offset++; - fontRendererObj.drawString("- " + availableDurability + "/" + maxDur, x, base + offset * 10, 0xffffff); - offset++; - } - else - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation2") + availableDurability + "/" + maxDur, x, base + offset * 10, 0xffffff); - offset++; - } - } - // Damage reduction - double damageReduction = tags.getDouble("DamageReduction"); - if(damageReduction > 0.000001d) - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation19") + df.format(damageReduction), x, base + offset * 10, 0xffffff); - offset++; - } - - // Protection - double protection = armor.getProtection(stack); - double maxProtection = tags.getDouble("MaxDefense"); - //if(maxProtection > protection) - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation20") + df.format(protection) + "/" + df.format(maxProtection), 294, base + offset * 10, 0xffffff); - //else - // fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation20") + df.format(protection), x, base + offset * 10, 0xffffff); - offset++; - - offset++; - int modifiers = tags.getInteger("Modifiers"); - if (modifiers > 0) - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation18") + tags.getInteger("Modifiers"), x, base + offset * 10, 0xffffff); - offset++; - } - if (tags.hasKey("Tooltip1")) - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation17"), x, base + offset * 10, 0xffffff); - } - - boolean displayToolTips = true; - int tipNum = 0; - while (displayToolTips) - { - tipNum++; - String tooltip = "ModifierTip" + tipNum; - if (tags.hasKey(tooltip)) - { - String tipName = tags.getString(tooltip); - fontRendererObj.drawString("- " + tipName, x, base + (offset + tipNum) * 10, 0xffffff); - } - else - displayToolTips = false; - } - } - - // todo: also quick and dirty fix - protected void drawModularAccessoryStats (ItemStack stack, AccessoryCore accessory, NBTTagCompound tags, int x, int y) - { - List categories = Arrays.asList(accessory.getTraits()); - int base = y; - int offset = 0; - - if (categories.contains("utility")) - { - float mineSpeed = tags.getInteger("MiningSpeed"); - float trueSpeed = mineSpeed / (100f); - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation16") + trueSpeed, x, base + offset * 10, 0xffffff); - offset++; - } - - offset++; - int modifiers = tags.getInteger("Modifiers"); - if (modifiers > 0) - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation18") + tags.getInteger("Modifiers"), x, base + offset * 10, 0xffffff); - offset++; - } - if (tags.hasKey("Tooltip1")) - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation17"), x, base + offset * 10, 0xffffff); - } - - boolean displayToolTips = true; - int tipNum = 0; - while (displayToolTips) - { - tipNum++; - String tooltip = "ModifierTip" + tipNum; - if (tags.hasKey(tooltip)) - { - String tipName = tags.getString(tooltip); - fontRendererObj.drawString("- " + tipName, x, base + (offset + tipNum) * 10, 0xffffff); - } - else - displayToolTips = false; - } - } - protected void drawToolInformation () { this.drawCenteredString(fontRendererObj, title, 349, 8, 0xffffff); diff --git a/src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java b/src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java new file mode 100644 index 00000000000..4abbc3bf30f --- /dev/null +++ b/src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java @@ -0,0 +1,375 @@ +package tconstruct.tools.gui; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.StatCollector; +import tconstruct.library.accessory.AccessoryCore; +import tconstruct.library.armor.ArmorCore; +import tconstruct.library.tools.AbilityHelper; +import tconstruct.library.tools.HarvestTool; +import tconstruct.library.tools.ToolCore; +import tconstruct.library.util.HarvestLevels; + +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.util.Arrays; +import java.util.List; + +public final class ToolStationGuiHelper { + // non-instantiable + private ToolStationGuiHelper() {} + + private static FontRenderer fontRendererObj = Minecraft.getMinecraft().fontRenderer; + + public static void drawToolStats (ItemStack stack, int x, int y) + { + + if (stack.getItem() instanceof ToolCore) + { + ToolCore tool = (ToolCore) stack.getItem(); + NBTTagCompound tags = stack.getTagCompound().getCompoundTag(tool.getBaseTagName()); + drawCenteredString(fontRendererObj, "\u00A7n" + tool.getLocalizedToolName(), x + 55, y+8, 0xffffff); + + drawModularToolStats(stack, tool, tags, x, y + 24); + } + if(stack.getItem() instanceof ArmorCore) + { + ArmorCore armor = (ArmorCore) stack.getItem(); + NBTTagCompound tags = stack.getTagCompound().getCompoundTag(armor.getBaseTagName()); + drawCenteredString(fontRendererObj, "\u00A7n" + stack.getDisplayName(), x+55, y+8, 0xffffff); // todo: localize + + drawModularArmorStats(stack, armor, tags, x, y+24); + } + if(stack.getItem() instanceof AccessoryCore) + { + AccessoryCore accessory = (AccessoryCore) stack.getItem(); + NBTTagCompound tags = stack.getTagCompound().getCompoundTag(accessory.getBaseTagName()); + drawCenteredString(fontRendererObj, "\u00A7n" + stack.getDisplayName(), x+55, y+8, 0xffffff); // todo: localize + + drawModularAccessoryStats(stack, accessory, tags, x, y+24); + } + } + + public static void drawModularToolStats (ItemStack stack, ToolCore tool, NBTTagCompound tags, int x, int y) + { + FontRenderer fontRendererObj = Minecraft.getMinecraft().fontRenderer; + List categories = Arrays.asList(tool.getTraits()); + final int durability = tags.getInteger("Damage"); + final int maxDur = tags.getInteger("TotalDurability"); + int availableDurability = maxDur - durability; + + // Durability + int base = y; + int offset = 0; + if (maxDur > 0) + { + if (maxDur >= 10000) + { + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation1"), x, base + offset * 11, 0xffffff); + offset++; + fontRendererObj.drawString("- " + availableDurability + "/" + maxDur, x, base + offset * 10, 0xffffff); + offset++; + } + else + { + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation2") + availableDurability + "/" + maxDur, x, base + offset * 10, 0xffffff); + offset++; + } + } + + final float stonebound = tags.getFloat("Shoddy"); + // Attack + if (categories.contains("weapon")) + { + int attack = (int) (tags.getInteger("Attack")) + 1; + float stoneboundDamage = (float) Math.log(durability / 72f + 1) * -2 * stonebound; + attack += stoneboundDamage; + attack *= tool.getDamageModifier(); + if (attack < 1) + attack = 1; + + String heart = attack == 2 ? StatCollector.translateToLocal("gui.partcrafter8") : StatCollector.translateToLocal("gui.partcrafter9"); + if (attack % 2 == 0) + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation3") + attack / 2 + heart, x, base + offset * 10, 0xffffff); + else + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation3") + attack / 2f + heart, x, base + offset * 10, 0xffffff); + offset++; + + if (stoneboundDamage != 0) + { + DecimalFormat df = new DecimalFormat("##.##"); + heart = stoneboundDamage == 2 ? StatCollector.translateToLocal("gui.partcrafter8") : StatCollector.translateToLocal("gui.partcrafter9"); + String bloss = stoneboundDamage > 0 ? StatCollector.translateToLocal("gui.toolstation4") : StatCollector.translateToLocal("gui.toolstation5"); + fontRendererObj.drawString(bloss + df.format(stoneboundDamage / 2f) + heart, x, base + offset * 10, 0xffffff); + offset++; + } + offset++; + } + + if (categories.contains("bow")) + { + DecimalFormat df = new DecimalFormat("##.##"); + df.setRoundingMode(RoundingMode.DOWN); + int drawSpeed = tags.getInteger("DrawSpeed"); + float flightSpeed = tags.getFloat("FlightSpeed"); + float trueDraw = drawSpeed / 20f; + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation6") + df.format(trueDraw) + "s", x, base + offset * 10, 0xffffff); + offset++; + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation7") + df.format(flightSpeed) + "x", x, base + offset * 10, 0xffffff); + offset++; + offset++; + } + + if (categories.contains("ammo")) + { + DecimalFormat df = new DecimalFormat("##.##"); + df.setRoundingMode(RoundingMode.DOWN); + int attack = (int) (tags.getInteger("Attack")); + float mass = tags.getFloat("Mass"); + float shatter = tags.getFloat("BreakChance"); + float accuracy = tags.getFloat("Accuracy"); + + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation10"), x, base + offset * 10, 0xffffff); + offset++; + String heart = attack == 2 ? StatCollector.translateToLocal("gui.partcrafter8") : StatCollector.translateToLocal("gui.partcrafter9"); + if (attack % 2 == 0) + fontRendererObj.drawString("- " + attack / 2 + heart, x, base + offset * 10, 0xffffff); + else + fontRendererObj.drawString("- " + attack / 2f + heart, x, base + offset * 10, 0xffffff); + offset++; + int minAttack = attack; + int maxAttack = attack * 2; + heart = StatCollector.translateToLocal("gui.partcrafter9"); + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation11"), x, base + offset * 10, 0xffffff); + offset++; + fontRendererObj.drawString(df.format(minAttack / 2f) + "-" + df.format(maxAttack / 2f) + heart, x, base + offset * 10, 0xffffff); + offset++; + offset++; + + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation8") + df.format(mass), x, base + offset * 10, 0xffffff); + offset++; + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation9") + df.format(accuracy - 4) + "%", x, base + offset * 10, 0xffffff); + offset++; + /* + * this.fontRendererObj.drawString("Chance to break: " + + * df.format(shatter)+"%", xSize + 8, base + offset * 10, 0xffffff); + * offset++; + */ + offset++; + } + + // Mining + if (categories.contains("dualharvest")) + { + float mineSpeed = tags.getInteger("MiningSpeed") / 100f * ((HarvestTool) tool).breakSpeedModifier(); + float mineSpeed2 = tags.getInteger("MiningSpeed2") / 100f * ((HarvestTool) tool).breakSpeedModifier(); + float stoneboundSpeed = (float) Math.log(durability / ((HarvestTool) tool).stoneboundModifier() + 1) * 2 * stonebound; + DecimalFormat df = new DecimalFormat("##.##"); + df.setRoundingMode(RoundingMode.DOWN); + float trueSpeed = mineSpeed + stoneboundSpeed; + float trueSpeed2 = mineSpeed2 + stoneboundSpeed; + + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation12"), x, base + offset * 10, 0xffffff); + offset++; + fontRendererObj.drawString("- " + df.format(trueSpeed) + ", " + df.format(trueSpeed2), x, base + offset * 10, 0xffffff); + offset++; + if (stoneboundSpeed != 0) + { + String bloss = stoneboundSpeed > 0 ? StatCollector.translateToLocal("gui.toolstation4") : StatCollector.translateToLocal("gui.toolstation5"); + fontRendererObj.drawString(bloss + df.format(stoneboundSpeed), x, base + offset * 10, 0xffffff); + offset++; + } + offset++; + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation13"), x, base + offset * 10, 0xffffff); + offset++; + fontRendererObj.drawString("- " + HarvestLevels.getHarvestLevelName(tags.getInteger("HarvestLevel")) + ", " + HarvestLevels.getHarvestLevelName(tags.getInteger("HarvestLevel2")), x, base + offset * 10, 0xffffff); + offset++; + offset++; + } + else if (categories.contains("harvest")) + { + float trueSpeed = AbilityHelper.calcToolSpeed(tool, tags); + float stoneboundSpeed = AbilityHelper.calcToolSpeed(tool, tags); + + DecimalFormat df = new DecimalFormat("##.##"); + df.setRoundingMode(RoundingMode.DOWN); + trueSpeed += stoneboundSpeed; + if (trueSpeed < 0) + trueSpeed = 0; + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation14") + df.format(trueSpeed), x, base + offset * 10, 0xffffff); + offset++; + if (stoneboundSpeed != 0 && !Float.isNaN(stoneboundSpeed)) + { + String bloss = stoneboundSpeed > 0 ? StatCollector.translateToLocal("gui.toolstation4") : StatCollector.translateToLocal("gui.toolstation5"); + fontRendererObj.drawString(bloss + df.format(stoneboundSpeed), x, base + offset * 10, 0xffffff); + offset++; + } + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation15") + HarvestLevels.getHarvestLevelName(tags.getInteger("HarvestLevel")), x, base + offset * 10, 0xffffff); + offset++; + offset++; + } + else if (categories.contains("utility")) + { + float mineSpeed = tags.getInteger("MiningSpeed"); + float trueSpeed = mineSpeed / (100f); + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation16") + trueSpeed, x, base + offset * 10, 0xffffff); + offset++; + offset++; + } + + int modifiers = tags.getInteger("Modifiers"); + if (modifiers > 0) + { + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation18") + tags.getInteger("Modifiers"), x, base + offset * 10, 0xffffff); + offset++; + } + if (tags.hasKey("Tooltip1")) + { + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation17"), x, base + offset * 10, 0xffffff); + } + + boolean displayToolTips = true; + int tipNum = 0; + while (displayToolTips) + { + tipNum++; + String tooltip = "ModifierTip" + tipNum; + if (tags.hasKey(tooltip)) + { + String tipName = tags.getString(tooltip); + fontRendererObj.drawString("- " + tipName, x, base + (offset + tipNum) * 10, 0xffffff); + } + else + displayToolTips = false; + } + } + + private static DecimalFormat df = new DecimalFormat("##.#"); + + // todo: do this properly, quick and dirty fix + public static void drawModularArmorStats (ItemStack stack, ArmorCore armor, NBTTagCompound tags, int x, int y) + { + List categories = Arrays.asList(armor.getTraits()); + int base = y; + int offset = 0; + + // durability + final int durability = tags.getInteger("Damage"); + final int maxDur = tags.getInteger("TotalDurability"); + int availableDurability = maxDur - durability; + + // Durability + if (maxDur > 0) + { + if (maxDur >= 10000) + { + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation1"), x, base + offset * 11, 0xffffff); + offset++; + fontRendererObj.drawString("- " + availableDurability + "/" + maxDur, x, base + offset * 10, 0xffffff); + offset++; + } + else + { + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation2") + availableDurability + "/" + maxDur, x, base + offset * 10, 0xffffff); + offset++; + } + } + // Damage reduction + double damageReduction = tags.getDouble("DamageReduction"); + if(damageReduction > 0.000001d) + { + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation19") + df.format(damageReduction), x, base + offset * 10, 0xffffff); + offset++; + } + + // Protection + double protection = armor.getProtection(stack); + double maxProtection = tags.getDouble("MaxDefense"); + //if(maxProtection > protection) + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation20") + df.format(protection) + "/" + df.format(maxProtection), 294, base + offset * 10, 0xffffff); + //else + // fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation20") + df.format(protection), x, base + offset * 10, 0xffffff); + offset++; + + offset++; + int modifiers = tags.getInteger("Modifiers"); + if (modifiers > 0) + { + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation18") + tags.getInteger("Modifiers"), x, base + offset * 10, 0xffffff); + offset++; + } + if (tags.hasKey("Tooltip1")) + { + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation17"), x, base + offset * 10, 0xffffff); + } + + boolean displayToolTips = true; + int tipNum = 0; + while (displayToolTips) + { + tipNum++; + String tooltip = "ModifierTip" + tipNum; + if (tags.hasKey(tooltip)) + { + String tipName = tags.getString(tooltip); + fontRendererObj.drawString("- " + tipName, x, base + (offset + tipNum) * 10, 0xffffff); + } + else + displayToolTips = false; + } + } + + // todo: also quick and dirty fix + public static void drawModularAccessoryStats (ItemStack stack, AccessoryCore accessory, NBTTagCompound tags, int x, int y) + { + List categories = Arrays.asList(accessory.getTraits()); + int base = y; + int offset = 0; + + if (categories.contains("utility")) + { + float mineSpeed = tags.getInteger("MiningSpeed"); + float trueSpeed = mineSpeed / (100f); + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation16") + trueSpeed, x, base + offset * 10, 0xffffff); + offset++; + } + + offset++; + int modifiers = tags.getInteger("Modifiers"); + if (modifiers > 0) + { + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation18") + tags.getInteger("Modifiers"), x, base + offset * 10, 0xffffff); + offset++; + } + if (tags.hasKey("Tooltip1")) + { + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation17"), x, base + offset * 10, 0xffffff); + } + + boolean displayToolTips = true; + int tipNum = 0; + while (displayToolTips) + { + tipNum++; + String tooltip = "ModifierTip" + tipNum; + if (tags.hasKey(tooltip)) + { + String tipName = tags.getString(tooltip); + fontRendererObj.drawString("- " + tipName, x, base + (offset + tipNum) * 10, 0xffffff); + } + else + displayToolTips = false; + } + } + + /** + * Renders the specified text to the screen, center-aligned. + * Copied out of GUI + */ + public static void drawCenteredString(FontRenderer p_73732_1_, String p_73732_2_, int p_73732_3_, int p_73732_4_, int p_73732_5_) + { + p_73732_1_.drawStringWithShadow(p_73732_2_, p_73732_3_ - p_73732_1_.getStringWidth(p_73732_2_) / 2, p_73732_4_, p_73732_5_); + } +} diff --git a/weaponry.txt b/weaponry.txt index 31d5343b25e..cd0a8b92c88 100644 --- a/weaponry.txt +++ b/weaponry.txt @@ -1,16 +1,10 @@ TODO: * Effect graphics for arrows, throwing knifes, javelins,... MOSTLY DONE * Separate book explaining the system, text only, sorry folks -* Turn dagger into a proper projectile DONE -* Reinforced gives a chance that projectiles aren't broken on entity-hit! DONE * Toolstation GUI for weaponry stuff * Partbuilder stuff for weaponry stuff? * Bring bowmaterial stats etc in line? -* Can't have flux or redstone or moss on ammo tools * Knockback on projectiles knocks towards their moving direction DONEish -* Glassmakers Arrows :D DONE -* Check why arrow repairing doesn't work -* REGROWING PROJECTILES HAR * Javelins need lower durability. When leftclick attacking and it has no durability, it should use up 1 ammo and get durability. maybe give javelins slight armor piercing? or do they have that already? From e6469587fe2df023f21b9fd33f9229e438f5e1dc Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Tue, 28 Oct 2014 17:56:09 +0100 Subject: [PATCH 053/129] Move DualHarvest speed calc also into AbilityHelper --- .../library/tools/AbilityHelper.java | 16 +++++++++++++ .../library/tools/DualHarvestTool.java | 24 ++++--------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/main/java/tconstruct/library/tools/AbilityHelper.java b/src/main/java/tconstruct/library/tools/AbilityHelper.java index e0225cf8889..08d6a6d1c03 100644 --- a/src/main/java/tconstruct/library/tools/AbilityHelper.java +++ b/src/main/java/tconstruct/library/tools/AbilityHelper.java @@ -699,6 +699,22 @@ public static float calcToolSpeed (ToolCore tool, NBTTagCompound tags) return trueSpeed; } + public static float calcDualToolSpeed (ToolCore tool, NBTTagCompound tags, boolean secondary) + { + String tag = "MiningSpeed"; + if(secondary) tag += "2"; + + float mineSpeed = tags.getInteger(tag); + float speedMod = 1f; + if (tool instanceof HarvestTool) + speedMod = ((HarvestTool) tool).breakSpeedModifier(); + + float trueSpeed = mineSpeed / 100f * speedMod; + trueSpeed += calcStoneboundBonus(tool, tags); + + return trueSpeed; + } + public static float calcStoneboundBonus (ToolCore tool, NBTTagCompound tags) { int durability = tags.getInteger("Damage"); diff --git a/src/main/java/tconstruct/library/tools/DualHarvestTool.java b/src/main/java/tconstruct/library/tools/DualHarvestTool.java index a41cd634767..bfc39df8c59 100644 --- a/src/main/java/tconstruct/library/tools/DualHarvestTool.java +++ b/src/main/java/tconstruct/library/tools/DualHarvestTool.java @@ -56,16 +56,8 @@ public float getDigSpeed (ItemStack stack, Block block, int meta) { if (materials[i] == block.getMaterial()) { - float speed = tags.getInteger("MiningSpeed"); - speed /= 100f; - int hlvl = block.getHarvestLevel(meta); - int durability = tags.getInteger("Damage"); - - float shoddy = tags.getFloat("Shoddy"); - speed += shoddy * durability / 100f; - - if (hlvl <= tags.getInteger("HarvestLevel")) - return speed; + if (block.getHarvestLevel(meta) <= tags.getInteger("HarvestLevel")) + AbilityHelper.calcDualToolSpeed(this, tags, false); return 0.1f; } } @@ -74,16 +66,8 @@ public float getDigSpeed (ItemStack stack, Block block, int meta) { if (materials[i] == block.getMaterial()) { - float speed = tags.getInteger("MiningSpeed2"); - speed /= 100f; - int hlvl = block.getHarvestLevel(meta); - int durability = tags.getInteger("Damage"); - - float shoddy = tags.getFloat("Shoddy"); - speed += shoddy * durability / 100f; - - if (hlvl <= tags.getInteger("HarvestLevel2")) - return speed; + if (block.getHarvestLevel(meta) <= tags.getInteger("HarvestLevel2")) + AbilityHelper.calcDualToolSpeed(this, tags, true); return 0.1f; } } From 159b772f5a10d2814699230c6f33f0699fbd9952 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Tue, 28 Oct 2014 17:56:29 +0100 Subject: [PATCH 054/129] Clean up GUI stuff for tools! \o/ --- .../tools/gui/CraftingStationGui.java | 39 +- .../tools/gui/ToolStationGuiHelper.java | 513 ++++++++---------- 2 files changed, 235 insertions(+), 317 deletions(-) diff --git a/src/main/java/tconstruct/tools/gui/CraftingStationGui.java b/src/main/java/tconstruct/tools/gui/CraftingStationGui.java index 4cdf1278fef..6bd42bd7695 100644 --- a/src/main/java/tconstruct/tools/gui/CraftingStationGui.java +++ b/src/main/java/tconstruct/tools/gui/CraftingStationGui.java @@ -22,6 +22,7 @@ import tconstruct.library.accessory.AccessoryCore; import tconstruct.library.armor.ArmorCore; import tconstruct.library.crafting.PatternBuilder; +import tconstruct.library.modifier.IModifyable; import tconstruct.library.tools.*; import tconstruct.library.util.HarvestLevels; import tconstruct.tools.logic.CraftingStationLogic; @@ -34,15 +35,6 @@ public class CraftingStationGui extends GuiContainer implements INEIGuiHandler public GuiTextField text; public String title, body = ""; CraftingStationLogic logic; - - boolean hasMaterial; - boolean hasTool; - boolean hasArmor; - boolean hasAccessory; - ItemStack centerStack; - ToolMaterial materialEnum; - String centerTitle; - NBTTagCompound tags; public static final int CHEST_WIDTH = 116; @@ -139,30 +131,29 @@ else if (logic.isStackInSlot(5)) // center slot if no output item void drawToolStats (ItemStack stack) { - ToolStationGuiHelper.drawToolStats(stack, descTextLeft + 10, 0); + if(stack.getItem() instanceof IModifyable) + ToolStationGuiHelper.drawToolStats(stack, descTextLeft + 10, 0); - if (centerStack != stack) - { - centerStack = stack; - hasAccessory = hasArmor = hasMaterial = hasTool = false; - int matID = PatternBuilder.instance.getPartID(stack); + int matID = PatternBuilder.instance.getPartID(stack); - if (matID != Short.MAX_VALUE) - { - materialEnum = TConstructRegistry.getMaterial(matID); - hasMaterial = true; - centerTitle = "\u00A7n" + materialEnum.localizedName(); + if (matID != Short.MAX_VALUE && matID > 0) + { + ToolMaterial material = TConstructRegistry.getMaterial(matID); - drawMaterialStats(); - } + if(material != null) + drawMaterialStats(material); } } - protected void drawMaterialStats() + protected void drawMaterialStats(ToolMaterial materialEnum) { final int baseX = descTextLeft + 8; - final int baseY = 24; + final int baseY = 8; + + String centerTitle = "\u00A7n" + materialEnum.localizedName(); + + drawCenteredString(this.fontRendererObj, centerTitle, baseX + 55, baseY, 16777215); this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.partcrafter4") + materialEnum.durability(), baseX, baseY + 16, 16777215); this.fontRendererObj.drawString(StatCollector.translateToLocal("gui.partcrafter5") + materialEnum.handleDurability() + "x", baseX, baseY + 27, 16777215); diff --git a/src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java b/src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java index 4abbc3bf30f..f8fd2a794ed 100644 --- a/src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java +++ b/src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java @@ -2,365 +2,292 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.StatCollector; import tconstruct.library.accessory.AccessoryCore; import tconstruct.library.armor.ArmorCore; +import tconstruct.library.modifier.IModifyable; import tconstruct.library.tools.AbilityHelper; +import tconstruct.library.tools.DualHarvestTool; import tconstruct.library.tools.HarvestTool; import tconstruct.library.tools.ToolCore; import tconstruct.library.util.HarvestLevels; +import tconstruct.library.weaponry.IAmmo; import java.math.RoundingMode; import java.text.DecimalFormat; import java.util.Arrays; +import java.util.Collection; +import java.util.LinkedList; import java.util.List; public final class ToolStationGuiHelper { // non-instantiable private ToolStationGuiHelper() {} - private static FontRenderer fontRendererObj = Minecraft.getMinecraft().fontRenderer; + private static final FontRenderer fontRendererObj = Minecraft.getMinecraft().fontRenderer; + private static int xPos, yPos; - public static void drawToolStats (ItemStack stack, int x, int y) + private static final DecimalFormat df = new DecimalFormat("##.#"); + + private static void newline() { + yPos += 10; + } - if (stack.getItem() instanceof ToolCore) - { - ToolCore tool = (ToolCore) stack.getItem(); - NBTTagCompound tags = stack.getTagCompound().getCompoundTag(tool.getBaseTagName()); - drawCenteredString(fontRendererObj, "\u00A7n" + tool.getLocalizedToolName(), x + 55, y+8, 0xffffff); - drawModularToolStats(stack, tool, tags, x, y + 24); + private static void write(String s) + { + fontRendererObj.drawString(s, xPos, yPos, 0xffffffff); + newline(); + } + + public static void drawToolStats (ItemStack stack, int x, int y) + { + String name = stack.getItem() instanceof ToolCore ? ((ToolCore) stack.getItem()).getLocalizedToolName() : stack.getDisplayName(); + Item item = stack.getItem(); + NBTTagCompound tags = stack.getTagCompound(); + Collection categories = new LinkedList(); + + // initialize drawing variables + xPos = x; + yPos = y + 8; + + // get the correct tags + if(item instanceof IModifyable) { + IModifyable modifyable = (IModifyable) item; + tags = tags.getCompoundTag(modifyable.getBaseTagName()); + categories = Arrays.asList(modifyable.getTraits()); } - if(stack.getItem() instanceof ArmorCore) - { - ArmorCore armor = (ArmorCore) stack.getItem(); - NBTTagCompound tags = stack.getTagCompound().getCompoundTag(armor.getBaseTagName()); - drawCenteredString(fontRendererObj, "\u00A7n" + stack.getDisplayName(), x+55, y+8, 0xffffff); // todo: localize - drawModularArmorStats(stack, armor, tags, x, y+24); + drawCenteredString(fontRendererObj, "\u00A7n" + name, xPos + 55, yPos, 0xffffffff); + newline(); + newline(); + + // does it have ammo instead of durability? + if(item instanceof IAmmo) + drawAmmo((IAmmo) item, stack); + // regular durability? + else if(item instanceof ToolCore || item instanceof ArmorCore) + drawDurability(tags); + + // tools + if(item instanceof ToolCore) { + ToolCore tool = (ToolCore) item; + // DualHarvest tool? + if (categories.contains("dualharvest")) + drawDualHarvestStats(tool, tags); + // or regular Harvest tool? + else if (categories.contains("harvest")) + drawHarvestStats(tool, tags); + // weapon? + if (categories.contains("weapon")) + drawWeaponStats(tool, tags); + // projectile weapon? + if (categories.contains("projectileweapon")) + drawProjectileWeaponStats(tags); + // projectile? + if (categories.contains("projectile")) + drawProjectileStats(tags); } - if(stack.getItem() instanceof AccessoryCore) + // armor + if(item instanceof ArmorCore) { - AccessoryCore accessory = (AccessoryCore) stack.getItem(); - NBTTagCompound tags = stack.getTagCompound().getCompoundTag(accessory.getBaseTagName()); - drawCenteredString(fontRendererObj, "\u00A7n" + stack.getDisplayName(), x+55, y+8, 0xffffff); // todo: localize - - drawModularAccessoryStats(stack, accessory, tags, x, y+24); + ArmorCore armor = (ArmorCore) item; + drawArmorStats(armor, tags, stack); } + // Accessory + if(item instanceof AccessoryCore) + { + AccessoryCore accessory = (AccessoryCore) item; + drawAccessoryStats(accessory, tags); + } + + newline(); + + // Modifiers + drawModifiers(tags); } - public static void drawModularToolStats (ItemStack stack, ToolCore tool, NBTTagCompound tags, int x, int y) - { - FontRenderer fontRendererObj = Minecraft.getMinecraft().fontRenderer; - List categories = Arrays.asList(tool.getTraits()); + private static void drawDurability(NBTTagCompound tags) { final int durability = tags.getInteger("Damage"); final int maxDur = tags.getInteger("TotalDurability"); - int availableDurability = maxDur - durability; + final int availableDurability = maxDur - durability; - // Durability - int base = y; - int offset = 0; - if (maxDur > 0) + // big durabilities have to split to 2 lines + if (maxDur >= 10000) { - if (maxDur >= 10000) - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation1"), x, base + offset * 11, 0xffffff); - offset++; - fontRendererObj.drawString("- " + availableDurability + "/" + maxDur, x, base + offset * 10, 0xffffff); - offset++; - } - else - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation2") + availableDurability + "/" + maxDur, x, base + offset * 10, 0xffffff); - offset++; - } + write(StatCollector.translateToLocal("gui.toolstation1")); + write("- " + availableDurability + "/" + maxDur); } - - final float stonebound = tags.getFloat("Shoddy"); - // Attack - if (categories.contains("weapon")) + else { - int attack = (int) (tags.getInteger("Attack")) + 1; - float stoneboundDamage = (float) Math.log(durability / 72f + 1) * -2 * stonebound; - attack += stoneboundDamage; - attack *= tool.getDamageModifier(); - if (attack < 1) - attack = 1; - - String heart = attack == 2 ? StatCollector.translateToLocal("gui.partcrafter8") : StatCollector.translateToLocal("gui.partcrafter9"); - if (attack % 2 == 0) - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation3") + attack / 2 + heart, x, base + offset * 10, 0xffffff); - else - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation3") + attack / 2f + heart, x, base + offset * 10, 0xffffff); - offset++; - - if (stoneboundDamage != 0) - { - DecimalFormat df = new DecimalFormat("##.##"); - heart = stoneboundDamage == 2 ? StatCollector.translateToLocal("gui.partcrafter8") : StatCollector.translateToLocal("gui.partcrafter9"); - String bloss = stoneboundDamage > 0 ? StatCollector.translateToLocal("gui.toolstation4") : StatCollector.translateToLocal("gui.toolstation5"); - fontRendererObj.drawString(bloss + df.format(stoneboundDamage / 2f) + heart, x, base + offset * 10, 0xffffff); - offset++; - } - offset++; + write(StatCollector.translateToLocal("gui.toolstation2") + availableDurability + "/" + maxDur); } + } - if (categories.contains("bow")) - { - DecimalFormat df = new DecimalFormat("##.##"); - df.setRoundingMode(RoundingMode.DOWN); - int drawSpeed = tags.getInteger("DrawSpeed"); - float flightSpeed = tags.getFloat("FlightSpeed"); - float trueDraw = drawSpeed / 20f; - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation6") + df.format(trueDraw) + "s", x, base + offset * 10, 0xffffff); - offset++; - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation7") + df.format(flightSpeed) + "x", x, base + offset * 10, 0xffffff); - offset++; - offset++; - } + private static void drawAmmo(IAmmo ammoItem, ItemStack stack) + { + final int max = ammoItem.getAmmoCount(stack); + final int current = ammoItem.getAmmoCount(stack); - if (categories.contains("ammo")) - { - DecimalFormat df = new DecimalFormat("##.##"); - df.setRoundingMode(RoundingMode.DOWN); - int attack = (int) (tags.getInteger("Attack")); - float mass = tags.getFloat("Mass"); - float shatter = tags.getFloat("BreakChance"); - float accuracy = tags.getFloat("Accuracy"); - - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation10"), x, base + offset * 10, 0xffffff); - offset++; - String heart = attack == 2 ? StatCollector.translateToLocal("gui.partcrafter8") : StatCollector.translateToLocal("gui.partcrafter9"); - if (attack % 2 == 0) - fontRendererObj.drawString("- " + attack / 2 + heart, x, base + offset * 10, 0xffffff); - else - fontRendererObj.drawString("- " + attack / 2f + heart, x, base + offset * 10, 0xffffff); - offset++; - int minAttack = attack; - int maxAttack = attack * 2; - heart = StatCollector.translateToLocal("gui.partcrafter9"); - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation11"), x, base + offset * 10, 0xffffff); - offset++; - fontRendererObj.drawString(df.format(minAttack / 2f) + "-" + df.format(maxAttack / 2f) + heart, x, base + offset * 10, 0xffffff); - offset++; - offset++; - - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation8") + df.format(mass), x, base + offset * 10, 0xffffff); - offset++; - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation9") + df.format(accuracy - 4) + "%", x, base + offset * 10, 0xffffff); - offset++; - /* - * this.fontRendererObj.drawString("Chance to break: " + - * df.format(shatter)+"%", xSize + 8, base + offset * 10, 0xffffff); - * offset++; - */ - offset++; - } + write(String.format("%s: %d/%d", StatCollector.translateToLocal("gui.toolstation21"), current, max)); + } - // Mining - if (categories.contains("dualharvest")) - { - float mineSpeed = tags.getInteger("MiningSpeed") / 100f * ((HarvestTool) tool).breakSpeedModifier(); - float mineSpeed2 = tags.getInteger("MiningSpeed2") / 100f * ((HarvestTool) tool).breakSpeedModifier(); - float stoneboundSpeed = (float) Math.log(durability / ((HarvestTool) tool).stoneboundModifier() + 1) * 2 * stonebound; - DecimalFormat df = new DecimalFormat("##.##"); - df.setRoundingMode(RoundingMode.DOWN); - float trueSpeed = mineSpeed + stoneboundSpeed; - float trueSpeed2 = mineSpeed2 + stoneboundSpeed; - - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation12"), x, base + offset * 10, 0xffffff); - offset++; - fontRendererObj.drawString("- " + df.format(trueSpeed) + ", " + df.format(trueSpeed2), x, base + offset * 10, 0xffffff); - offset++; - if (stoneboundSpeed != 0) - { - String bloss = stoneboundSpeed > 0 ? StatCollector.translateToLocal("gui.toolstation4") : StatCollector.translateToLocal("gui.toolstation5"); - fontRendererObj.drawString(bloss + df.format(stoneboundSpeed), x, base + offset * 10, 0xffffff); - offset++; - } - offset++; - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation13"), x, base + offset * 10, 0xffffff); - offset++; - fontRendererObj.drawString("- " + HarvestLevels.getHarvestLevelName(tags.getInteger("HarvestLevel")) + ", " + HarvestLevels.getHarvestLevelName(tags.getInteger("HarvestLevel2")), x, base + offset * 10, 0xffffff); - offset++; - offset++; - } - else if (categories.contains("harvest")) - { - float trueSpeed = AbilityHelper.calcToolSpeed(tool, tags); - float stoneboundSpeed = AbilityHelper.calcToolSpeed(tool, tags); - - DecimalFormat df = new DecimalFormat("##.##"); - df.setRoundingMode(RoundingMode.DOWN); - trueSpeed += stoneboundSpeed; - if (trueSpeed < 0) - trueSpeed = 0; - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation14") + df.format(trueSpeed), x, base + offset * 10, 0xffffff); - offset++; - if (stoneboundSpeed != 0 && !Float.isNaN(stoneboundSpeed)) - { - String bloss = stoneboundSpeed > 0 ? StatCollector.translateToLocal("gui.toolstation4") : StatCollector.translateToLocal("gui.toolstation5"); - fontRendererObj.drawString(bloss + df.format(stoneboundSpeed), x, base + offset * 10, 0xffffff); - offset++; + private static void drawModifiers(NBTTagCompound tags) + { + int modifiers = tags.getInteger("Modifiers"); + // remaining modifiers + if (modifiers != 0) + write(StatCollector.translateToLocal("gui.toolstation18") + modifiers); + + // Modifier-header (if we have modifiers) + if (tags.hasKey("ModifierTip1")) { + write(StatCollector.translateToLocal("gui.toolstation17")); + + String tooltip = "ModifierTip"; + int tipNum = 1; + while (tags.hasKey(tooltip + tipNum)) { + write("- " + tags.getString(tooltip + tipNum)); + tipNum++; } - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation15") + HarvestLevels.getHarvestLevelName(tags.getInteger("HarvestLevel")), x, base + offset * 10, 0xffffff); - offset++; - offset++; - } - else if (categories.contains("utility")) - { - float mineSpeed = tags.getInteger("MiningSpeed"); - float trueSpeed = mineSpeed / (100f); - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation16") + trueSpeed, x, base + offset * 10, 0xffffff); - offset++; - offset++; } + } - int modifiers = tags.getInteger("Modifiers"); - if (modifiers > 0) - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation18") + tags.getInteger("Modifiers"), x, base + offset * 10, 0xffffff); - offset++; - } - if (tags.hasKey("Tooltip1")) + private static void drawHarvestStats(ToolCore tool, NBTTagCompound tags) + { + float mineSpeed = AbilityHelper.calcToolSpeed(tool, tags); + float stoneboundSpeed = AbilityHelper.calcStoneboundBonus(tool, tags); + + write(StatCollector.translateToLocal("gui.toolstation14") + df.format(mineSpeed)); + if(stoneboundSpeed != 0) { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation17"), x, base + offset * 10, 0xffffff); + String bloss = stoneboundSpeed > 0 ? StatCollector.translateToLocal("gui.toolstation4") : StatCollector.translateToLocal("gui.toolstation5"); + write(bloss + df.format(stoneboundSpeed)); } + write(StatCollector.translateToLocal("gui.toolstation15") + HarvestLevels.getHarvestLevelName(tags.getInteger("HarvestLevel"))); + } - boolean displayToolTips = true; - int tipNum = 0; - while (displayToolTips) + private static void drawDualHarvestStats(ToolCore tool, NBTTagCompound tags) + { + float mineSpeed = AbilityHelper.calcDualToolSpeed(tool, tags, false); + float mineSpeed2 = AbilityHelper.calcDualToolSpeed(tool, tags, true); + float stoneboundSpeed = AbilityHelper.calcStoneboundBonus(tool, tags); + + write(StatCollector.translateToLocal("gui.toolstation12")); + write("- " + df.format(mineSpeed) + ", " + df.format(mineSpeed2)); + if (stoneboundSpeed != 0) { - tipNum++; - String tooltip = "ModifierTip" + tipNum; - if (tags.hasKey(tooltip)) - { - String tipName = tags.getString(tooltip); - fontRendererObj.drawString("- " + tipName, x, base + (offset + tipNum) * 10, 0xffffff); - } - else - displayToolTips = false; + String bloss = stoneboundSpeed > 0 ? StatCollector.translateToLocal("gui.toolstation4") : StatCollector.translateToLocal("gui.toolstation5"); + write(bloss + df.format(stoneboundSpeed)); } - } - private static DecimalFormat df = new DecimalFormat("##.#"); + write(StatCollector.translateToLocal("gui.toolstation13")); + write("- " + HarvestLevels.getHarvestLevelName(tags.getInteger("HarvestLevel")) + ", " + HarvestLevels.getHarvestLevelName(tags.getInteger("HarvestLevel2"))); + } - // todo: do this properly, quick and dirty fix - public static void drawModularArmorStats (ItemStack stack, ArmorCore armor, NBTTagCompound tags, int x, int y) + private static void drawWeaponStats(ToolCore tool, NBTTagCompound tags) { - List categories = Arrays.asList(armor.getTraits()); - int base = y; - int offset = 0; + // DAMAGE + int attack = (tags.getInteger("Attack")) + 1; - // durability - final int durability = tags.getInteger("Damage"); - final int maxDur = tags.getInteger("TotalDurability"); - int availableDurability = maxDur - durability; + // factor in Stonebound + float stoneboundDamage = -AbilityHelper.calcStoneboundBonus(tool, tags); + attack += stoneboundDamage; + attack *= tool.getDamageModifier(); - // Durability - if (maxDur > 0) - { - if (maxDur >= 10000) - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation1"), x, base + offset * 11, 0xffffff); - offset++; - fontRendererObj.drawString("- " + availableDurability + "/" + maxDur, x, base + offset * 10, 0xffffff); - offset++; - } - else - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation2") + availableDurability + "/" + maxDur, x, base + offset * 10, 0xffffff); - offset++; - } - } - // Damage reduction - double damageReduction = tags.getDouble("DamageReduction"); - if(damageReduction > 0.000001d) + if (attack < 1) + attack = 1; + + String heart = attack == 2 ? StatCollector.translateToLocal("gui.partcrafter8") : StatCollector.translateToLocal("gui.partcrafter9"); + if (attack % 2 == 0) + write(StatCollector.translateToLocal("gui.toolstation3") + attack / 2 + heart); + else + write(StatCollector.translateToLocal("gui.toolstation3") + df.format(attack / 2f) + heart); + + if (stoneboundDamage != 0) { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation19") + df.format(damageReduction), x, base + offset * 10, 0xffffff); - offset++; + heart = stoneboundDamage == 2 ? StatCollector.translateToLocal("gui.partcrafter8") : StatCollector.translateToLocal("gui.partcrafter9"); + String bloss = stoneboundDamage > 0 ? StatCollector.translateToLocal("gui.toolstation4") : StatCollector.translateToLocal("gui.toolstation5"); + write(bloss + df.format(stoneboundDamage / 2f) + heart); } + } - // Protection - double protection = armor.getProtection(stack); - double maxProtection = tags.getDouble("MaxDefense"); - //if(maxProtection > protection) - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation20") + df.format(protection) + "/" + df.format(maxProtection), 294, base + offset * 10, 0xffffff); - //else - // fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation20") + df.format(protection), x, base + offset * 10, 0xffffff); + private static void drawProjectileWeaponStats(NBTTagCompound tags) + { + /* + DecimalFormat df = new DecimalFormat("##.##"); + df.setRoundingMode(RoundingMode.DOWN); + int drawSpeed = tags.getInteger("DrawSpeed"); + float flightSpeed = tags.getFloat("FlightSpeed"); + float trueDraw = drawSpeed / 20f; + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation6") + df.format(trueDraw) + "s", x, base + offset * 10, 0xffffff); + offset++; + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation7") + df.format(flightSpeed) + "x", x, base + offset * 10, 0xffffff); offset++; + offset++;*/ + } + private static void drawProjectileStats(NBTTagCompound tags) + {/* + DecimalFormat df = new DecimalFormat("##.##"); + df.setRoundingMode(RoundingMode.DOWN); + int attack = (int) (tags.getInteger("Attack")); + float mass = tags.getFloat("Mass"); + float shatter = tags.getFloat("BreakChance"); + float accuracy = tags.getFloat("Accuracy"); + + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation10"), x, base + offset * 10, 0xffffff); + offset++; + String heart = attack == 2 ? StatCollector.translateToLocal("gui.partcrafter8") : StatCollector.translateToLocal("gui.partcrafter9"); + if (attack % 2 == 0) + fontRendererObj.drawString("- " + attack / 2 + heart, x, base + offset * 10, 0xffffff); + else + fontRendererObj.drawString("- " + attack / 2f + heart, x, base + offset * 10, 0xffffff); + offset++; + int minAttack = attack; + int maxAttack = attack * 2; + heart = StatCollector.translateToLocal("gui.partcrafter9"); + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation11"), x, base + offset * 10, 0xffffff); + offset++; + fontRendererObj.drawString(df.format(minAttack / 2f) + "-" + df.format(maxAttack / 2f) + heart, x, base + offset * 10, 0xffffff); + offset++; offset++; - int modifiers = tags.getInteger("Modifiers"); - if (modifiers > 0) - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation18") + tags.getInteger("Modifiers"), x, base + offset * 10, 0xffffff); - offset++; - } - if (tags.hasKey("Tooltip1")) - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation17"), x, base + offset * 10, 0xffffff); - } - boolean displayToolTips = true; - int tipNum = 0; - while (displayToolTips) - { - tipNum++; - String tooltip = "ModifierTip" + tipNum; - if (tags.hasKey(tooltip)) - { - String tipName = tags.getString(tooltip); - fontRendererObj.drawString("- " + tipName, x, base + (offset + tipNum) * 10, 0xffffff); - } - else - displayToolTips = false; - } + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation8") + df.format(mass), x, base + offset * 10, 0xffffff); + offset++; + fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation9") + df.format(accuracy - 4) + "%", x, base + offset * 10, 0xffffff); + offset++; + /* + * this.fontRendererObj.drawString("Chance to break: " + + * df.format(shatter)+"%", xSize + 8, base + offset * 10, 0xffffff); + * offset++; + + offset++;*/ } - // todo: also quick and dirty fix - public static void drawModularAccessoryStats (ItemStack stack, AccessoryCore accessory, NBTTagCompound tags, int x, int y) + private static void drawArmorStats(ArmorCore armor, NBTTagCompound tags, ItemStack stack) { - List categories = Arrays.asList(accessory.getTraits()); - int base = y; - int offset = 0; +// Damage reduction + double damageReduction = tags.getDouble("DamageReduction"); + if(damageReduction > 0) + write(StatCollector.translateToLocal("gui.toolstation19") + df.format(damageReduction)); - if (categories.contains("utility")) - { - float mineSpeed = tags.getInteger("MiningSpeed"); - float trueSpeed = mineSpeed / (100f); - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation16") + trueSpeed, x, base + offset * 10, 0xffffff); - offset++; - } + // Protection + double protection = armor.getProtection(stack); + double maxProtection = tags.getDouble("MaxDefense"); - offset++; - int modifiers = tags.getInteger("Modifiers"); - if (modifiers > 0) - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation18") + tags.getInteger("Modifiers"), x, base + offset * 10, 0xffffff); - offset++; - } - if (tags.hasKey("Tooltip1")) - { - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation17"), x, base + offset * 10, 0xffffff); - } + write(StatCollector.translateToLocal("gui.toolstation20") + df.format(protection) + "/" + df.format(maxProtection)); + } - boolean displayToolTips = true; - int tipNum = 0; - while (displayToolTips) - { - tipNum++; - String tooltip = "ModifierTip" + tipNum; - if (tags.hasKey(tooltip)) - { - String tipName = tags.getString(tooltip); - fontRendererObj.drawString("- " + tipName, x, base + (offset + tipNum) * 10, 0xffffff); - } - else - displayToolTips = false; + private static void drawAccessoryStats(AccessoryCore core, NBTTagCompound tags) + { + if(tags.hasKey("MiningSpeed")) { + float mineSpeed = tags.getInteger("MiningSpeed"); + float trueSpeed = mineSpeed / (100f); + write(StatCollector.translateToLocal("gui.toolstation16") + trueSpeed); } } From 01466272626b88ef3fcb7a0f39d829d805dd8957 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Tue, 28 Oct 2014 18:16:08 +0100 Subject: [PATCH 055/129] Bring Traits in line with GUI stuff etc. --- resources/assets/tinker/lang/en_US.lang | 8 ++- .../library/weaponry/AmmoWeapon.java | 2 +- .../library/weaponry/BowBaseAmmo.java | 2 +- .../tools/gui/ToolStationGuiHelper.java | 72 ++++++------------- .../tconstruct/weaponry/ammo/ArrowAmmo.java | 2 +- .../tconstruct/weaponry/ammo/BoltAmmo.java | 5 +- .../tconstruct/weaponry/weapons/Crossbow.java | 2 +- 7 files changed, 35 insertions(+), 58 deletions(-) diff --git a/resources/assets/tinker/lang/en_US.lang b/resources/assets/tinker/lang/en_US.lang index 3e55d2e135d..cb17f58337d 100644 --- a/resources/assets/tinker/lang/en_US.lang +++ b/resources/assets/tinker/lang/en_US.lang @@ -747,7 +747,7 @@ gui.toolstation6=Draw Speed: gui.toolstation7=Arrow Speed: gui.toolstation8=Weight: gui.toolstation9=Accuracy: -gui.toolstation10=Base Attack: +gui.toolstation10=Base Damage: gui.toolstation11=Shortbow Attack: gui.toolstation12=Mining Speeds: gui.toolstation13=Harvest Levels: @@ -756,8 +756,10 @@ gui.toolstation15=Mining Level: gui.toolstation16=Usage Speed: gui.toolstation17=Modifiers gui.toolstation18=Modifiers remaining: -gui.toolstation19=Damage Reduction: -gui.toolstation20=Protection: +gui.toolstation19=Damage Reduction: +gui.toolstation20=Protection: +gui.toolstation21=Ammo: +gui.toolstation22=Break Chance: gui.mining1=Stone gui.mining2=Iron diff --git a/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java b/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java index ed69241f975..4c4b8a20745 100644 --- a/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java +++ b/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java @@ -88,7 +88,7 @@ public float getAccuracy(ItemStack itemStack, EntityPlayer player) @Override public String[] getTraits() { - return new String[] {"weapon", "throwing", "ammo", "windup"}; + return new String[] {"weapon", "projectile", "ammo", "windup"}; } @Override diff --git a/src/main/java/tconstruct/library/weaponry/BowBaseAmmo.java b/src/main/java/tconstruct/library/weaponry/BowBaseAmmo.java index 864f62a1ac0..9de56090291 100644 --- a/src/main/java/tconstruct/library/weaponry/BowBaseAmmo.java +++ b/src/main/java/tconstruct/library/weaponry/BowBaseAmmo.java @@ -160,6 +160,6 @@ protected int getDefaultColor(int renderPass, int materialID) { @Override public String[] getTraits() { - return new String[] {"weapon", "ranged", "bow", "windup"}; + return new String[] {"weapon", "bow", "windup"}; } } diff --git a/src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java b/src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java index f8fd2a794ed..42b2ba1f6ee 100644 --- a/src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java +++ b/src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java @@ -30,7 +30,7 @@ private ToolStationGuiHelper() {} private static final FontRenderer fontRendererObj = Minecraft.getMinecraft().fontRenderer; private static int xPos, yPos; - private static final DecimalFormat df = new DecimalFormat("##.#"); + private static final DecimalFormat df = new DecimalFormat("#.##"); private static void newline() { @@ -86,7 +86,7 @@ else if (categories.contains("harvest")) if (categories.contains("weapon")) drawWeaponStats(tool, tags); // projectile weapon? - if (categories.contains("projectileweapon")) + if (categories.contains("bow")) drawProjectileWeaponStats(tags); // projectile? if (categories.contains("projectile")) @@ -133,7 +133,7 @@ private static void drawAmmo(IAmmo ammoItem, ItemStack stack) final int max = ammoItem.getAmmoCount(stack); final int current = ammoItem.getAmmoCount(stack); - write(String.format("%s: %d/%d", StatCollector.translateToLocal("gui.toolstation21"), current, max)); + write(StatCollector.translateToLocal("gui.toolstation21") + current + "/" + max); } private static void drawModifiers(NBTTagCompound tags) @@ -217,55 +217,29 @@ private static void drawWeaponStats(ToolCore tool, NBTTagCompound tags) private static void drawProjectileWeaponStats(NBTTagCompound tags) { - /* - DecimalFormat df = new DecimalFormat("##.##"); - df.setRoundingMode(RoundingMode.DOWN); - int drawSpeed = tags.getInteger("DrawSpeed"); - float flightSpeed = tags.getFloat("FlightSpeed"); - float trueDraw = drawSpeed / 20f; - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation6") + df.format(trueDraw) + "s", x, base + offset * 10, 0xffffff); - offset++; - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation7") + df.format(flightSpeed) + "x", x, base + offset * 10, 0xffffff); - offset++; - offset++;*/ + // drawspeed + final int drawSpeed = tags.getInteger("DrawSpeed"); + final float trueDraw = drawSpeed / 20f; + write(StatCollector.translateToLocal("gui.toolstation6") + df.format(trueDraw) + "s"); + + // flightspeed + final int flightSpeed = tags.getInteger("FlightSpeed"); + write(StatCollector.translateToLocal("gui.toolstation7") + df.format(flightSpeed) + "x"); } private static void drawProjectileStats(NBTTagCompound tags) - {/* - DecimalFormat df = new DecimalFormat("##.##"); - df.setRoundingMode(RoundingMode.DOWN); - int attack = (int) (tags.getInteger("Attack")); - float mass = tags.getFloat("Mass"); - float shatter = tags.getFloat("BreakChance"); - float accuracy = tags.getFloat("Accuracy"); - - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation10"), x, base + offset * 10, 0xffffff); - offset++; - String heart = attack == 2 ? StatCollector.translateToLocal("gui.partcrafter8") : StatCollector.translateToLocal("gui.partcrafter9"); - if (attack % 2 == 0) - fontRendererObj.drawString("- " + attack / 2 + heart, x, base + offset * 10, 0xffffff); - else - fontRendererObj.drawString("- " + attack / 2f + heart, x, base + offset * 10, 0xffffff); - offset++; - int minAttack = attack; - int maxAttack = attack * 2; - heart = StatCollector.translateToLocal("gui.partcrafter9"); - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation11"), x, base + offset * 10, 0xffffff); - offset++; - fontRendererObj.drawString(df.format(minAttack / 2f) + "-" + df.format(maxAttack / 2f) + heart, x, base + offset * 10, 0xffffff); - offset++; - offset++; - - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation8") + df.format(mass), x, base + offset * 10, 0xffffff); - offset++; - fontRendererObj.drawString(StatCollector.translateToLocal("gui.toolstation9") + df.format(accuracy - 4) + "%", x, base + offset * 10, 0xffffff); - offset++; - /* - * this.fontRendererObj.drawString("Chance to break: " + - * df.format(shatter)+"%", xSize + 8, base + offset * 10, 0xffffff); - * offset++; - - offset++;*/ + { + // weight + final float weight = tags.getFloat("Mass"); + write(StatCollector.translateToLocal("gui.toolstation8") + df.format(weight)); + + // accuracy + final float accuracy = tags.getFloat("Accuracy"); + write(StatCollector.translateToLocal("gui.toolstation9") + df.format(accuracy) + "%"); + + // breakchance + final float breakChance = tags.getFloat("BreakChance"); + write(StatCollector.translateToLocal("gui.toolstation22") + df.format(breakChance) + "%"); } private static void drawArmorStats(ArmorCore armor, NBTTagCompound tags, ItemStack stack) diff --git a/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java b/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java index 724fafc8c2a..2c8293bc3ba 100644 --- a/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java +++ b/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java @@ -91,7 +91,7 @@ public int durabilityTypeHandle() { @Override public String[] getTraits () { - return new String[] { "ammo" }; + return new String[] { "ammo", "projectile" }; } @Override diff --git a/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java b/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java index a13d927a81f..484f68cb929 100644 --- a/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java +++ b/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java @@ -74,8 +74,9 @@ public Item getAccessoryItem() { } @Override - public String[] getTraits() { - return new String[] {"ammo"}; + public String[] getTraits () + { + return new String[] { "ammo", "projectile" }; } @Override diff --git a/src/main/java/tconstruct/weaponry/weapons/Crossbow.java b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java index b726d3fad1b..f40fd55dd35 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Crossbow.java +++ b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java @@ -414,7 +414,7 @@ public Item getExtraItem() { @Override public String[] getTraits() { - return new String[] {"weapon", "ranged", "crossbow", "windup"}; + return new String[] {"weapon", "bow", "windup"}; } From 92fd2cc222e0485a79c858af3558650181f4fbbe Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Tue, 28 Oct 2014 18:21:25 +0100 Subject: [PATCH 056/129] Correct stats for projectile weapons --- .../tconstruct/tools/gui/ToolStationGuiHelper.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java b/src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java index 42b2ba1f6ee..a080d37e90a 100644 --- a/src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java +++ b/src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java @@ -15,6 +15,7 @@ import tconstruct.library.tools.ToolCore; import tconstruct.library.util.HarvestLevels; import tconstruct.library.weaponry.IAmmo; +import tconstruct.library.weaponry.ProjectileWeapon; import java.math.RoundingMode; import java.text.DecimalFormat; @@ -86,8 +87,8 @@ else if (categories.contains("harvest")) if (categories.contains("weapon")) drawWeaponStats(tool, tags); // projectile weapon? - if (categories.contains("bow")) - drawProjectileWeaponStats(tags); + if (categories.contains("bow") && tool instanceof ProjectileWeapon) + drawProjectileWeaponStats((ProjectileWeapon) tool, tags, stack); // projectile? if (categories.contains("projectile")) drawProjectileStats(tags); @@ -215,15 +216,15 @@ private static void drawWeaponStats(ToolCore tool, NBTTagCompound tags) } } - private static void drawProjectileWeaponStats(NBTTagCompound tags) + private static void drawProjectileWeaponStats(ProjectileWeapon weapon, NBTTagCompound tags, ItemStack stack) { // drawspeed - final int drawSpeed = tags.getInteger("DrawSpeed"); + final int drawSpeed = weapon.getWindupTime(stack); final float trueDraw = drawSpeed / 20f; write(StatCollector.translateToLocal("gui.toolstation6") + df.format(trueDraw) + "s"); // flightspeed - final int flightSpeed = tags.getInteger("FlightSpeed"); + final float flightSpeed = weapon.getProjectileSpeed(stack); write(StatCollector.translateToLocal("gui.toolstation7") + df.format(flightSpeed) + "x"); } From 525baf8aad1e5ba1596ef40349e78893e5ead89e Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Tue, 28 Oct 2014 18:52:11 +0100 Subject: [PATCH 057/129] Add display and calculation stuff for maximum damage with thrown weapons --- resources/assets/tinker/lang/en_US.lang | 1 + .../library/weaponry/AmmoWeapon.java | 6 ++++- .../tools/gui/ToolStationGuiHelper.java | 25 +++++++++++++++++-- .../tconstruct/weaponry/weapons/Javelin.java | 12 ++++++++- .../tconstruct/weaponry/weapons/Shuriken.java | 7 +++++- .../weaponry/weapons/ThrowingKnife.java | 7 ++++-- 6 files changed, 51 insertions(+), 7 deletions(-) diff --git a/resources/assets/tinker/lang/en_US.lang b/resources/assets/tinker/lang/en_US.lang index cb17f58337d..ef18f8dc45a 100644 --- a/resources/assets/tinker/lang/en_US.lang +++ b/resources/assets/tinker/lang/en_US.lang @@ -760,6 +760,7 @@ gui.toolstation19=Damage Reduction: gui.toolstation20=Protection: gui.toolstation21=Ammo: gui.toolstation22=Break Chance: +gui.toolstation23=Max. Attack: gui.mining1=Stone gui.mining2=Iron diff --git a/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java b/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java index 4c4b8a20745..ce554568902 100644 --- a/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java +++ b/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java @@ -88,7 +88,7 @@ public float getAccuracy(ItemStack itemStack, EntityPlayer player) @Override public String[] getTraits() { - return new String[] {"weapon", "projectile", "ammo", "windup"}; + return new String[] {"weapon", "thrown", "ammo", "windup"}; } @Override @@ -115,6 +115,10 @@ protected void launchProjectile(ItemStack stack, World world, EntityPlayer playe protected abstract Entity createProjectile(ItemStack reference, World world, EntityPlayer player, float accuracy); + /** used for displaying the damage, return the value used for pseed in createProjectile/ProjectileBase constructor + */ + public abstract float getProjectileSpeed(); + @SideOnly(Side.CLIENT) public CrosshairType getCrosshairType() { return CrosshairType.SQUARE; } diff --git a/src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java b/src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java index a080d37e90a..c8b32650790 100644 --- a/src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java +++ b/src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java @@ -14,6 +14,7 @@ import tconstruct.library.tools.HarvestTool; import tconstruct.library.tools.ToolCore; import tconstruct.library.util.HarvestLevels; +import tconstruct.library.weaponry.AmmoWeapon; import tconstruct.library.weaponry.IAmmo; import tconstruct.library.weaponry.ProjectileWeapon; @@ -86,6 +87,9 @@ else if (categories.contains("harvest")) // weapon? if (categories.contains("weapon")) drawWeaponStats(tool, tags); + // throwing weapon? + if (categories.contains("thrown") && tool instanceof AmmoWeapon) + drawThrowingWeaponStats((AmmoWeapon) tool, tags); // projectile weapon? if (categories.contains("bow") && tool instanceof ProjectileWeapon) drawProjectileWeaponStats((ProjectileWeapon) tool, tags, stack); @@ -192,7 +196,7 @@ private static void drawDualHarvestStats(ToolCore tool, NBTTagCompound tags) private static void drawWeaponStats(ToolCore tool, NBTTagCompound tags) { // DAMAGE - int attack = (tags.getInteger("Attack")) + 1; + int attack = (tags.getInteger("Attack")); // factor in Stonebound float stoneboundDamage = -AbilityHelper.calcStoneboundBonus(tool, tags); @@ -216,6 +220,23 @@ private static void drawWeaponStats(ToolCore tool, NBTTagCompound tags) } } + private static void drawThrowingWeaponStats(AmmoWeapon weapon, NBTTagCompound tags) { + float attackf = (tags.getInteger("Attack")); + attackf *= weapon.getDamageModifier(); + attackf *= weapon.getProjectileSpeed(); + + if (attackf < 1) + attackf = 1; + + int attack = (int)attackf; + + String heart = attack == 2 ? StatCollector.translateToLocal("gui.partcrafter8") : StatCollector.translateToLocal("gui.partcrafter9"); + if (attack % 2 == 0) + write(StatCollector.translateToLocal("gui.toolstation23") + attack / 2 + heart); + else + write(StatCollector.translateToLocal("gui.toolstation23") + df.format(attack / 2f) + heart); + } + private static void drawProjectileWeaponStats(ProjectileWeapon weapon, NBTTagCompound tags, ItemStack stack) { // drawspeed @@ -245,7 +266,7 @@ private static void drawProjectileStats(NBTTagCompound tags) private static void drawArmorStats(ArmorCore armor, NBTTagCompound tags, ItemStack stack) { -// Damage reduction + // Damage reduction double damageReduction = tags.getDouble("DamageReduction"); if(damageReduction > 0) write(StatCollector.translateToLocal("gui.toolstation19") + df.format(damageReduction)); diff --git a/src/main/java/tconstruct/weaponry/weapons/Javelin.java b/src/main/java/tconstruct/weaponry/weapons/Javelin.java index b9b15e68e38..448e596f8a5 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Javelin.java +++ b/src/main/java/tconstruct/weaponry/weapons/Javelin.java @@ -163,14 +163,24 @@ public Item getAccessoryItem() { return TinkerTools.toughRod; } + @Override + public String[] getTraits() { + return new String[] {"weapon", "thrown", "ammo", "windup"}; + } + @Override protected Entity createProjectile(ItemStack reference, World world, EntityPlayer player, float accuracy) { reference.getTagCompound().getCompoundTag("InfiTool").removeTag("Throwing"); // needed so the NBTs are equal - JavelinEntity entity = new JavelinEntity(world, player, 2.0f, accuracy, reference); + JavelinEntity entity = new JavelinEntity(world, player, getProjectileSpeed(), accuracy, reference); return entity; } + @Override + public float getProjectileSpeed() { + return 2.0f; + } + @SideOnly(Side.CLIENT) @Override public CrosshairType getCrosshairType() { return CrosshairType.WEIRD; } diff --git a/src/main/java/tconstruct/weaponry/weapons/Shuriken.java b/src/main/java/tconstruct/weaponry/weapons/Shuriken.java index 143ef074567..c9193d45b28 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Shuriken.java +++ b/src/main/java/tconstruct/weaponry/weapons/Shuriken.java @@ -111,7 +111,12 @@ public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer pla @Override protected Entity createProjectile(ItemStack reference, World world, EntityPlayer player, float accuracy) { - return new ShurikenEntity(world, player, 1.9f, 0f, reference); + return new ShurikenEntity(world, player, getProjectileSpeed(), 0f, reference); + } + + @Override + public float getProjectileSpeed() { + return 1.9f; } @Override diff --git a/src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java b/src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java index 0678e3eeeb6..c109255631d 100644 --- a/src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java +++ b/src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java @@ -77,9 +77,12 @@ public float minAccuracy(ItemStack itemStack) { @Override protected Entity createProjectile(ItemStack reference, World world, EntityPlayer player, float accuracy) { - float speed = 1.5f; + return new ThrowingKnifeEntity(world, player, getProjectileSpeed(), accuracy, reference); + } - return new ThrowingKnifeEntity(world, player, speed, accuracy, reference); + @Override + public float getProjectileSpeed() { + return 1.5f; } @SideOnly(Side.CLIENT) From f4616cfe6fc62b923ac5716f80338b8849f81358 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Tue, 28 Oct 2014 19:23:34 +0100 Subject: [PATCH 058/129] Localize weaponry --- resources/assets/tinker/lang/en_US.lang | 22 ++++++++++++++++++- .../tconstruct/weaponry/TinkerWeaponry.java | 4 ++-- weaponry.txt | 1 - 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/resources/assets/tinker/lang/en_US.lang b/resources/assets/tinker/lang/en_US.lang index ef18f8dc45a..81edf5ef672 100644 --- a/resources/assets/tinker/lang/en_US.lang +++ b/resources/assets/tinker/lang/en_US.lang @@ -192,6 +192,10 @@ item.tconstruct.Pattern.fullguard.name=Full Guard Pattern item.tconstruct.Pattern.bowstring.name=Bowstring Pattern item.tconstruct.Pattern.fletching.name=Fletching Pattern item.tconstruct.Pattern.arrowhead.name=Arrowhead Pattern +item.tconstruct.Pattern.shuriken.name=Shuriken Pattern +item.tconstruct.Pattern.crossbowlimb.name=Crossbow Limb Pattern +item.tconstruct.Pattern.crossbowbody.name=Crossbow Body Pattern +item.tconstruct.Pattern.bowlimb.name=Bow Limb Pattern item.tconstruct.Pattern.blank_cast.name=Blank Cast item.tconstruct.MetalPattern.rod.name=Tool Rod Cast @@ -221,6 +225,10 @@ item.tconstruct.MetalPattern.fletching.name=Fletching Cast item.tconstruct.MetalPattern.arrowhead.name=Arrowhead Cast item.tconstruct.MetalPattern.ingot.name=Ingot Cast item.tconstruct.MetalPattern.gem.name=Gem Cast +item.tconstruct.MetalPattern.shuriken.name=Shuriken Cast +item.tconstruct.MetalPattern.crossbowlimb.name=Crossbow Limb Cast +item.tconstruct.MetalPattern.crossbowbody.name=Crossbow Body Cast +item.tconstruct.MetalPattern.bowlimb.name=Bow Limb Cast item.tconstruct.Materials.PaperStack.name=Paper Stack item.tconstruct.Materials.SlimeCrystal.name=Slime Crystal @@ -417,6 +425,7 @@ item.tconstruct.Fletching.feather.name=Feather Fletching item.tconstruct.Fletching.leaf.name=Leaf Fletching item.tconstruct.Fletching.slime.name=Slime Fletching item.tconstruct.Fletching.blueslime.name=Slime Fletching +item.tconstruct.Fletching.slimeleaf.name=Slimeleaf Fletching item.tconstruct.manual.beginner.name=Materials and You: Volume 1 item.tconstruct.manual.toolstation.name=Materials and You: Volume 2 @@ -570,6 +579,11 @@ toolpart.HammerHead=%%material Hammer Head toolpart.Bowstring=%%material Bowstring toolpart.ArrowHead=%%material Arrowhead toolpart.Fletching=%%material Fletching +toolpart.Shuriken=%%material Shuriken +toolpart.CrossbowLimb=%%material Crossbow Limb +toolpart.CrossbowBody=%%material Crossbow Body +toolpart.BowLimb=%%material Bow Limb +toolpart.Bolt=%%material Bolt # Now with translations of specific material and part combinations: #toolpart.ToolRod.wood=Wooden Tool Rod @@ -879,7 +893,13 @@ tool.excavator=Excavator tool.hammer=Hammer tool.battleaxe=Battleaxe tool.shortbow=Shortbow -tool.arrow=Arrow +tool.longbow=Longbow +tool.crossbow=Crossbow +tool.arrowammo=Arrows +tool.boltammo=Bolts +tool.shuriken=Shuriken +tool.throwingknife=Throwing Knife +tool.javelin=Javelin # Customization of default tool names based on tool and material #tool.shovel.wood=Wooden Shovel diff --git a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java index 2405217c55a..9bfccd28669 100644 --- a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java +++ b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java @@ -142,7 +142,7 @@ private void registerItems() boltAmmo = new BoltAmmo(); woodPattern = new WeaponryPattern("pattern_", "Pattern"); - metalPattern = new WeaponryPattern("cast_", "Cast"); + metalPattern = new WeaponryPattern("cast_", "MetalPattern"); // register tool parts GameRegistry.registerItem(bowstring, "bowstring"); // 1.8 todo: rename properly? @@ -223,7 +223,7 @@ private void registerMaterials() // Bow Materials: Material ID, durability, drawspeed, arrow speed // speed 3.0 == exactly the vanilla bow if 2 parts of speed 3 are used // Wooden stuff is flexible, therefore good. Reference. - TConstructRegistry.addBowMaterial(TinkerTools.MaterialID.Wood, 18, 3.0f); // Wood + TConstructRegistry.addBowMaterial(MaterialID.Wood, 18, 3.0f); // Wood // other organic materials also are good TConstructRegistry.addBowMaterial(MaterialID.Cactus, 20, 2.4f); // Cactus TConstructRegistry.addBowMaterial(MaterialID.Bone, 38, 2.0f); // Bone diff --git a/weaponry.txt b/weaponry.txt index cd0a8b92c88..54bd6749671 100644 --- a/weaponry.txt +++ b/weaponry.txt @@ -1,7 +1,6 @@ TODO: * Effect graphics for arrows, throwing knifes, javelins,... MOSTLY DONE * Separate book explaining the system, text only, sorry folks -* Toolstation GUI for weaponry stuff * Partbuilder stuff for weaponry stuff? * Bring bowmaterial stats etc in line? * Knockback on projectiles knocks towards their moving direction DONEish From 0763397e1245ba34ad1ae71478617bd360d51600 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Tue, 28 Oct 2014 19:53:36 +0100 Subject: [PATCH 059/129] Bolt effect graphics --- .../textures/items/arrow/smite_arrow_effect.png | Bin 284 -> 283 bytes .../items/bolt/beheading_bolt_effect.png | Bin 0 -> 210 bytes .../textures/items/bolt/blaze_bolt_effect.png | Bin 0 -> 249 bytes .../tinker/textures/items/bolt/complete.xcf | Bin 0 -> 6071 bytes .../textures/items/bolt/diamond_bolt_effect.png | Bin 0 -> 170 bytes .../textures/items/bolt/emerald_bolt_effect.png | Bin 0 -> 179 bytes .../textures/items/bolt/lapis_bolt_effect.png | Bin 0 -> 180 bytes .../textures/items/bolt/lava_bolt_effect.png | Bin 0 -> 177 bytes .../textures/items/bolt/moss_bolt_effect.png | Bin 0 -> 204 bytes .../items/bolt/necrotic_bolt_effect.png | Bin 0 -> 210 bytes .../textures/items/bolt/piston_bolt_effect.png | Bin 0 -> 211 bytes .../textures/items/bolt/quartz_bolt_effect.png | Bin 0 -> 198 bytes .../items/bolt/reinforced_bolt_effect.png | Bin 0 -> 185 bytes .../textures/items/bolt/silk_bolt_effect.png | Bin 0 -> 218 bytes .../textures/items/bolt/smite_bolt_effect.png | Bin 0 -> 277 bytes .../textures/items/bolt/spider_bolt_effect.png | Bin 0 -> 176 bytes .../items/shuriken/moss_shuriken_effect.png | Bin 0 -> 286 bytes ...iken_effect.png => silk_shuriken_effect.png} | Bin .../items/throwingknife/moss_knife_effect.png | Bin 0 -> 205 bytes 19 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 resources/assets/tinker/textures/items/bolt/beheading_bolt_effect.png create mode 100644 resources/assets/tinker/textures/items/bolt/blaze_bolt_effect.png create mode 100644 resources/assets/tinker/textures/items/bolt/complete.xcf create mode 100644 resources/assets/tinker/textures/items/bolt/diamond_bolt_effect.png create mode 100644 resources/assets/tinker/textures/items/bolt/emerald_bolt_effect.png create mode 100644 resources/assets/tinker/textures/items/bolt/lapis_bolt_effect.png create mode 100644 resources/assets/tinker/textures/items/bolt/lava_bolt_effect.png create mode 100644 resources/assets/tinker/textures/items/bolt/moss_bolt_effect.png create mode 100644 resources/assets/tinker/textures/items/bolt/necrotic_bolt_effect.png create mode 100644 resources/assets/tinker/textures/items/bolt/piston_bolt_effect.png create mode 100644 resources/assets/tinker/textures/items/bolt/quartz_bolt_effect.png create mode 100644 resources/assets/tinker/textures/items/bolt/reinforced_bolt_effect.png create mode 100644 resources/assets/tinker/textures/items/bolt/silk_bolt_effect.png create mode 100644 resources/assets/tinker/textures/items/bolt/smite_bolt_effect.png create mode 100644 resources/assets/tinker/textures/items/bolt/spider_bolt_effect.png create mode 100644 resources/assets/tinker/textures/items/shuriken/moss_shuriken_effect.png rename resources/assets/tinker/textures/items/shuriken/{silky_shuriken_effect.png => silk_shuriken_effect.png} (100%) create mode 100644 resources/assets/tinker/textures/items/throwingknife/moss_knife_effect.png diff --git a/resources/assets/tinker/textures/items/arrow/smite_arrow_effect.png b/resources/assets/tinker/textures/items/arrow/smite_arrow_effect.png index a27ec281f058b5299dd758bd0b68237544e48366..e310f587c2106f7729c79e08c967d5aeaac36139 100644 GIT binary patch delta 195 zcmV;!06hPk0-FMmV1FDEE)Cv`CH4RS0GmlfK~y-)V_={Z7-{-Yq@RfxMY3WX|7FEE z{*!C~OrwXH7=x>cC{{I$_%!P&@iB0+Gc&9?_?(d>f60n*{P(sH!|LQnXDJl#;Pe6~ zJ2O^s9!?g*wx{~YVYNNPUJ@fPvAW>zKdky0zW@A7d?2FR{5<{VUxrKfJ~2Fg^@EXU x10tQJ{_}9MFzh(>ih+TF0YfuI31}1`0080(FY*JxK~4Yw002ovPDHLkV1n3uSP}pL delta 196 zcmV;#06YJi0-OSnV1ES>Dh%Scb|?S<0GvrgK~y-)V_={Z7-{OT)B3&W06uNW8@7%((blz>J70ssK1d@%8inPXdL4JY5_^EKVmU zNC+M9xct06^}@RUHqY4pSDxYhC!P80kNQmkx#H&km#*IYU%k)f*ZJf;2J?na5of!Y yUFR;`zvsCxJRxoc&#kZX9~mS{ur6+x#lXN6DC4wol0z!cbOujXKbLh*2~7Y6*-5?t literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/bolt/blaze_bolt_effect.png b/resources/assets/tinker/textures/items/bolt/blaze_bolt_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..1c506a3f1b346854ce4a26aae4dcac689dc96e09 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85sBugD~Uq{1qucLG}_)Usv{fTrxtc7TISkH?)<<0e(lK( z^`G6?fS_&l`FbOvw@o1N>3KG%7p&AdSMc?xzuSzoMKKJUBZDL7DDJK?Qa;I;o|^i# kJ}doQeOsUb*9QiMLQ&lla>>ygKu0imy85}Sb4q9e09$unE&u=k literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/bolt/complete.xcf b/resources/assets/tinker/textures/items/bolt/complete.xcf new file mode 100644 index 0000000000000000000000000000000000000000..ad50c0cfe7b828bd15c02543bd7f06ed55e3f7d4 GIT binary patch literal 6071 zcmd^DUu;`v6+d?V*s-0&4T&|^b7~2s#IZ6QH;a?<5YeeETb&{;*-+I2N>ax&&7UdG zMAHx=)C$Qk(FIa58bO0P!9yaZmc0uiwB?J z1HKtgHJa!vZw?rC$577TE(&Wcv-NQr- zDG#7(N-+b{asvN&a_l#6r)H9&6C=sV?($>xwS}h(6~kN*wvve^M&5Z?L~0Z-}kKBe{-^jSi#;`n3*m zL)HP^TVgx!5&e9#^qH1kSbEQ$^U~6LuG33PFD>Dv;E}3=3y%kU2c4_v2f+sTD+?F> zvz3Eu)>QFb^;?Tq2?MUGKb6X=P%o$w$;YIguUfGMtI1S@(UU#pg1W@D1a%3eGxjzQfWtZ|7(&ES$q>Ef{ii}7^QjnkbZ)hBwK$-ZI5&Q5@hV?{ z=lpr8%=r%csE({l_SUv{ce7ZVRaqU>A^%+4-rmh_Q?$3XyPaKQWv!tPgw_DYw>fYQ z1D7{jR{@?g4*0 zVe<2C19j^@b!)NOy-)2fQvZAFEqgO6vvu?^&q{)5;ZXJ%Q^yo+Jh%uOO-(vL^x%?Q zEURapl9GG`t5ZAD7h!FZ0KQ262#9t>j>ro%8KudoOQSR)fyrq86irUaDbwV?@KS&m zVruRH@L0fA;ss`*(mbFxjqid=!^+s@cH}lDXtoC9XaKMB1*{Ef$F^h*pQmjAt6u{? zIbGY@B2J*(1h-I@x8+I6|ByXR8u;R&zJTxn+?I;Ys$bKQigW-n-L$DBGW>Ai-KiWh zAqF>F2uVO#}q#Sa);?Du?@1OV1Ae8R}J$g0SnA|Q#UV<#EE8T zk3p)kA9s(rit~3Ds~!50#i)FN)S>lK*`eRDUoW;c>?UnT+gKoYFUTJ#yaVB#ojVlb zZ3%Bcc;lTL6yj|Ojb&#-^hbJBArB~~F4|PAnCRSUoGGQNMY zwM1}Dj_j^*o6kj7ZbkTwcYQoUs$D;Jom>0$ag*%p0W7FK#~sQKH~zJ>aoYORU4FXB zj`>No?6EA}WXDXhuLn0!8EzbK<9NdDU^Wgnsv2%4UUZOZ6UQd#X5vMY?CZe|RE8T& zoLS%e+T_=%dAhLHzfO>fC$eeZRi73Wo5sgfdJTh{t@$;JQQ4x>o8KsvHNV9^uH3O% z4}SgvYM#KW9-y`Ntj8VjQ1Ft+GmEm;o)vyJy-DNn^YM6?y7=7R;xz7w56s0WI1`UQ zPvaipca&kASdT^%)I~4ei_*9ydi-LPg4SqsoyIM~4=Wn;dZ{)RdjY2yFY<3PMfE>$ z>3BYqo}5Wer>0+-yg*$!tZDbZ_=S!B*~%>$e)wChMY9-{C$RRBXR~C!5IglaYYO;R zZ8!B-uV5dw8?+96ZTAWVVBQ5&C;Ce6itP#tcqMm@irf+y8Z2om?_NVjwxzxIz%7A& zaNFbnFC_0RVR+7<__^-(lC=Gwg^l1?QkOz5T|QjOb*M0>)Z(c@zuJ&tM=!L?zW}dt B4u${# literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/bolt/diamond_bolt_effect.png b/resources/assets/tinker/textures/items/bolt/diamond_bolt_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..b9b340a900d6c51fcbcb9b97c6199b17d1cc4d36 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85sBugD~Uq{1qucLG}_)Usv{fTrxsx(vRAt)&qsKJY5_^EKVmU zNEA8LUS9M6)$Fvt?H^})Ts@PV>9OzavGx9oZ`g6U9W-EKIIPdB*|M0o0H}+>)78&q Iol`;+06~Z~Z2$lO literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/bolt/emerald_bolt_effect.png b/resources/assets/tinker/textures/items/bolt/emerald_bolt_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..1fcca360ac813c178674df4bce19f60e6d147e71 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85sBugD~Uq{1qucLG}_)Usv{fTrxuHs#br@T!BKyo-U3d7N?UF zBv?xr4)Xk$Y?A!_7YY8uD?@5+5_C8BIz0@#UBB;j25tB|Xa+`+4{eFTXxt qVxP^=Lk`o#fmGA=XMql`3=B(C#RU>0X0ig!W$<+Mb6Mw<&;$VRR6;`l literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/bolt/necrotic_bolt_effect.png b/resources/assets/tinker/textures/items/bolt/necrotic_bolt_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..fedf3872e90c094af665f6ed43ee1bf167ba1959 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85sBugD~Uq{1qucLG}_)Usv{fTrxtMmK*BaTYy4Ao-U3d7N?UF zBv=r3f~Y5FC3F0#+gOA53Cjc4$5^>bP0l+XkK{dGn0 literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/bolt/quartz_bolt_effect.png b/resources/assets/tinker/textures/items/bolt/quartz_bolt_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..00171742190370bb7aba7ff5a0c9bc633bdfd702 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85sBugD~Uq{1qucLG}_)Usv{fTrxsBav98QtAIjoo-U3d7N?UF zBr*d}9LvdV0IWo94{)?};rwZnLcn8@M|!Q2D0ZVLZDz2b#|&CcT1n*Zx& k+J3Y@tRcbLEX2SNtj~92(y`s=fF?3{y85}Sb4q9e0Q!eM=Kufz literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/bolt/reinforced_bolt_effect.png b/resources/assets/tinker/textures/items/bolt/reinforced_bolt_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..dfd1310b049f68c54d745a00518da83dd0a90fc6 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85sBugD~Uq{1qucLG}_)Usv{fTrxts?4rfU~g+y9V{$1+m*vKbhv X9`IK6e6Vc*8p7b|>gTe~DWM4fv_RIhI`C|Y77pVTVKcm0~1ZqJ%KmR@A zU|!zBTNzie<^22qC;z5{v`IM4o^NE-(-dg1f`P$qkEE5DWR@_{76wmOKbLh*2~7YW CG)G4O literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/bolt/smite_bolt_effect.png b/resources/assets/tinker/textures/items/bolt/smite_bolt_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..2e93179eb164a51f723aded33200da21d4df9c85 GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85sBugD~Uq{1qucLG}_)Usv{fTrxs>+B|IwxPd}bJzX3_EKVmU zNC-KE^*pxMvs81ENd|0NXFV+ihO0i z%e$beaq?VA=bWGS(tB9;Dr+D6Xn)n6Z*`MEwdbRl58vg>xcB}4)2(>S!)Hdz4ex*d z|9#d!ytI10gxvmL2R*hhPCOU%ztSR7qHIpp(E|q#G%TFC;)a6dKX(NNhOj1+{|BU! Rq=61(@O1TaS?83{1ORL2Xxjh) literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/bolt/spider_bolt_effect.png b/resources/assets/tinker/textures/items/bolt/spider_bolt_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..b9b5d1fbda62a9826ef1c83e3618fa5b4cd48386 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85sBugD~Uq{1qucLG}_)Usv{fTrxuXoCp41SO*j`@N{tuu{fQa zAi=u0VVXm?QL70(Y)*K0-AbW|YuPggKE*T*?vF;VOKsx7nx;TbdoPIlT zFITgHNUOc-;uMY@9-WJe=O0{n{*EI5rHd1MPYArz*b>}5i{%%?y^lrbcRpudm+5u- zqv5{nhNnAa3|6tc%adi;b)8{}DWig;kyGfeMb*7VT<>id%C@z$SBvI$Dy-#v|Hpq_ z`Me)p9uv+uMF$sr%Ta5dn>($4m8Qfy<^vBax^LG@dI+d++&4IzvPx`LRP0u*^DNg7 Zu#4t8N38!@eG2GO22WQ%mvv4FO#rGgY4rdA literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/shuriken/silky_shuriken_effect.png b/resources/assets/tinker/textures/items/shuriken/silk_shuriken_effect.png similarity index 100% rename from resources/assets/tinker/textures/items/shuriken/silky_shuriken_effect.png rename to resources/assets/tinker/textures/items/shuriken/silk_shuriken_effect.png diff --git a/resources/assets/tinker/textures/items/throwingknife/moss_knife_effect.png b/resources/assets/tinker/textures/items/throwingknife/moss_knife_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..533cf7190510549c18f14f2b1313b2364ab6adb7 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85sBugD~Uq{1qucLG}_)Usv{fTrxrm!n@c_rGY}eo-U3d7N?UF zBv=pgp4ff*|Mc?d|NXn<)JhoTB<0wGcn%soI6YZkMY1XBz~Q<4l9Cb<5-nF+JH9a~ sS4n(0@xh>`@)K*GL?ol-p-X%W6KX`Jul=4Z1~iz#)78&qol`;+06n=sCIA2c literal 0 HcmV?d00001 From db7e4196dbfdcc8562c8df987ae9032ce59870a4 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Tue, 28 Oct 2014 20:48:22 +0100 Subject: [PATCH 060/129] Re-enable enchanted fabric bonus modifier --- src/main/java/tconstruct/weaponry/WeaponryHandler.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/tconstruct/weaponry/WeaponryHandler.java b/src/main/java/tconstruct/weaponry/WeaponryHandler.java index d4047fd6e21..1c2d47577cc 100644 --- a/src/main/java/tconstruct/weaponry/WeaponryHandler.java +++ b/src/main/java/tconstruct/weaponry/WeaponryHandler.java @@ -125,12 +125,11 @@ else if(event.tool instanceof Crossbow) return; // enchanted fabric - /* if (tags.getInteger("Handle") == 1) { int modifiers = tags.getInteger("Modifiers"); modifiers += 1; tags.setInteger("Modifiers", modifiers); - }*/ + } tags.setInteger("DrawSpeed", drawSpeed); tags.setInteger("BaseDrawSpeed", drawSpeed); // used to calculate correct speed increase with redstone modifier From ff7c6c17fc6a1eb69c8b7c3ce11f49660c7e9ae5 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Tue, 28 Oct 2014 21:10:48 +0100 Subject: [PATCH 061/129] Move the drawspeed calculation to the tool building, so the saved values are the actual values instead of calculating them every time --- .../library/weaponry/ProjectileWeapon.java | 6 +----- .../java/tconstruct/weaponry/WeaponryHandler.java | 14 ++++++++++++++ .../java/tconstruct/weaponry/weapons/Crossbow.java | 6 ------ .../java/tconstruct/weaponry/weapons/LongBow.java | 5 ----- .../java/tconstruct/weaponry/weapons/ShortBow.java | 5 ----- 5 files changed, 15 insertions(+), 21 deletions(-) diff --git a/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java b/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java index 461b87cc8eb..2c73e84153c 100644 --- a/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java +++ b/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java @@ -4,9 +4,7 @@ import net.minecraft.util.StatCollector; import tconstruct.client.TProxyClient; import tconstruct.library.TConstructRegistry; -import tconstruct.weaponry.TinkerWeaponry; import tconstruct.weaponry.client.CrosshairType; -import tconstruct.util.Reference; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.renderer.texture.IIconRegister; @@ -91,11 +89,9 @@ public float getAccuracy(ItemStack itemStack, int time) /* Windup */ public int getWindupTime(ItemStack itemStack) { NBTTagCompound toolTag = itemStack.getTagCompound().getCompoundTag("InfiTool"); - return (int)((float)toolTag.getInteger("DrawSpeed")*windupModifier(itemStack)); + return toolTag.getInteger("DrawSpeed"); } - protected float windupModifier(ItemStack itemStack) { return 1.0f; } - public float getWindupProgress(ItemStack itemStack, EntityPlayer player) { // what are you doing! diff --git a/src/main/java/tconstruct/weaponry/WeaponryHandler.java b/src/main/java/tconstruct/weaponry/WeaponryHandler.java index 1c2d47577cc..d17b5f5bf67 100644 --- a/src/main/java/tconstruct/weaponry/WeaponryHandler.java +++ b/src/main/java/tconstruct/weaponry/WeaponryHandler.java @@ -17,6 +17,8 @@ import tconstruct.library.event.ToolBuildEvent; import tconstruct.library.event.ToolCraftEvent; import tconstruct.library.tools.*; +import tconstruct.weaponry.weapons.LongBow; +import tconstruct.weaponry.weapons.ShortBow; public class WeaponryHandler { // Provides ammo-items with the necessary NBT @@ -97,6 +99,7 @@ public void onProjectileWeaponCrafted(ToolCraftEvent.NormalTool event) return; NBTTagCompound tags = event.toolTag.getCompoundTag("InfiTool"); + ProjectileWeapon weapon = (ProjectileWeapon)event.tool; int drawSpeed = 0; float flightSpeed = 0; @@ -112,6 +115,13 @@ public void onProjectileWeaponCrafted(ToolCraftEvent.NormalTool event) drawSpeed = (int) ((top.drawspeed + bottom.drawspeed) / 2f * string.drawspeedModifier); flightSpeed = (top.flightSpeedMax + bottom.flightSpeedMax)/2 * string.flightSpeedModifier; + + // SHORT bows have a SHORTER windup because they're SHORT. hahahaha.... get it? + if(event.tool instanceof ShortBow) + drawSpeed *= 0.9; + // longbows have LONGER drawspeed. LOGIC! + if(event.tool instanceof LongBow) + drawSpeed *= 1.5f; } else if(event.tool instanceof Crossbow) { @@ -120,6 +130,10 @@ else if(event.tool instanceof Crossbow) drawSpeed = (int) ((float)top.drawspeed * string.drawspeedModifier); flightSpeed = (top.flightSpeedMax * string.flightSpeedModifier); + + // crossbows are more efficient the higher the base drawspeed is. So the higher the drawspeed, the more bonus you get + drawSpeed *= 2.5f; + drawSpeed -= drawSpeed*0.25f; } else return; diff --git a/src/main/java/tconstruct/weaponry/weapons/Crossbow.java b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java index f40fd55dd35..11989d648af 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Crossbow.java +++ b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java @@ -49,12 +49,6 @@ public ItemStack getLoadedAmmo(ItemStack itemStack) return ItemStack.loadItemStackFromNBT(tags.getCompoundTag("LoadedItem")); } - @Override - public int getWindupTime(ItemStack itemStack) { - NBTTagCompound toolTag = itemStack.getTagCompound().getCompoundTag("InfiTool"); - return (int)((float)toolTag.getInteger("DrawSpeed") * 2.5f); - } - @Override public float getMinWindupProgress(ItemStack itemStack) { return 1.0f; diff --git a/src/main/java/tconstruct/weaponry/weapons/LongBow.java b/src/main/java/tconstruct/weaponry/weapons/LongBow.java index 03d99ab1076..fda84eaa76f 100644 --- a/src/main/java/tconstruct/weaponry/weapons/LongBow.java +++ b/src/main/java/tconstruct/weaponry/weapons/LongBow.java @@ -31,11 +31,6 @@ public float getZoom(ItemStack itemStack) { return 1.7f; } - @Override - protected float windupModifier(ItemStack itemStack) { - return 1.5f; - } - @Override protected float projectileSpeedModifier(ItemStack itemStack) { return 1.5f; diff --git a/src/main/java/tconstruct/weaponry/weapons/ShortBow.java b/src/main/java/tconstruct/weaponry/weapons/ShortBow.java index 8716c80e6e3..111684c238d 100644 --- a/src/main/java/tconstruct/weaponry/weapons/ShortBow.java +++ b/src/main/java/tconstruct/weaponry/weapons/ShortBow.java @@ -15,11 +15,6 @@ public ShortBow() { super(0, "Shortbow"); } - @Override - protected float windupModifier(ItemStack itemStack) { - return 0.9f; // SHORT bows have a SHORTER windup because they're SHORT. hahahaha.... get it? - } - @Override public float minAccuracy(ItemStack itemStack) { return 1; From b291c2671c6d62c3f3dc83422fd403218c3b22e4 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Tue, 28 Oct 2014 21:35:11 +0100 Subject: [PATCH 062/129] Weaponry Book content --- .../assets/tinker/manuals/en_US/weaponry.xml | 124 ++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 resources/assets/tinker/manuals/en_US/weaponry.xml diff --git a/resources/assets/tinker/manuals/en_US/weaponry.xml b/resources/assets/tinker/manuals/en_US/weaponry.xml new file mode 100644 index 00000000000..cabe601c817 --- /dev/null +++ b/resources/assets/tinker/manuals/en_US/weaponry.xml @@ -0,0 +1,124 @@ + + + + +Tinkers' Weaponry +Brings the hurt whole new places + +By Sheriff Bownana + + + +Table of Contents + + Introduction + smelterybook + 3 + + + Throwing Weapons + castingtable + 5 + + + Projectile Weapons + smeltery + 5 + + + Projectiles + liquidiron + 9 + + + + +Why walk up to hit stuff, when you can do that while standing here! + +A tinkerer knows how to create varied ranged weapons. There are two big categories: Thrown weapons and weapons that shoot projectiles. + +Both types utilize an ammo system. Instead of having several items, these ranged weapons consist of one item that contains many of it. Why carry around 2 stacks of arrows, when you can have 200 in one stack! +These Ammo-Items don't have a durability, but use up their ammo for each projectile thrown/shot. + + + +Throwing Weapons: +* Throwing Knife +* Shuriken +* Javelin + +Projectile Weapons: +* Shortbow +* Longbow +* Crossbow + +Projectiles: +* Arrows +* Bolts + + + +Throwing Weapons + +Throwing Knifes: +These knifes are crafted from a knife blade and a handle. +Hold rightclick to take aim, and release it to throw a knife. +Throwing knifes stack up to a moderate amount, and deal moderate damage. + +Shuriken: +Small delicate projectiles put together from 4 parts, that are thrown from the wrist. Because of this you don't need to take aim and can throw them directly. +Since they're so small you can carry many of them, however they don't deal much damage. + +Javelin: +This is a hybrid between a melee and a ranged weapon, consisting of an arrow head on two tough tool rods. It deals moderate damage as a melee weapon, but to unleash its true potential you have to throw it at your enemy. +The throwing has a small windup. Because of their size you can only carry a few, but they pack a punch. + + + +Projectile Weapons + +Shortbow: +Put together from two bow limbs and a bowstring, this weapon is a fast and handy bow. Keep in mind that inflexible materials like stone can hardly be drawn back and can't accelerate projectiles well. Organic materials are favoured for quick bows, while metals require lots of strengt to draw back, but provide more power. +The bow requires arrows as ammo. +Offensive modifiers on bows do not count for arrows. The only modifiers affecting its ranged performance are Redstone and lapis. + +Longbow: +The big brother. This bow is much bigger, requiring more time to pull it back, but boy oh boy are those arrows fast. +Because of this the longbow performs slightly better against armored targets. Furthermore this makes the longbow less accurate with very light arrows. +The longbow is constructed from two bow limbs, a bowstring and a large plate. + +Crossbow: +Those pesky metals are such a pain to pull back. Luckily a tinkerer knows how to help himself! The crossbow allows you to pre-load it with a bolt, and have it ready instantly to fire. Since this allows for much more power, it can shoot heavier projectiles, resulting in more damage and armor penetration. +To load a crossbow simply rightclick and wait until the animation is done. The loading process can be stopped by pressing rightclick while sneaking. The crossbow can be unloaded in the same way. + + + +Projectiles +For these projectiles goes: The heavier the projectile, the more damage carries through armor. + +Arrows: +The bread and butter of every ranger. Arrows can be built from many different materials. It needs an arrow head, a shaft and a fletching. +The choice of materials allows a balance between damage, arrow-count, accuracy and fragility. The head material is crucial for its weight. +A fragile arrow has a chance to break on impact with terrain. Arrows always break when they hit a target, however the reinforced trait gives a chance for the arrow to survive the impact. + +Valid Shaft Materials: +* Stick +* Sugarcane +* Bone +* Blaze Rod + +Valid Fletching Materials: +* Leaves +* Slimeleaves +* Feathers +* Slime + +Bolts: +Crafting bolts is a delicate process. First you need a core in the form of a tool rod. +Take this tool rod to a smeltery and put it into a Casting Table. Pour some metal onto it to coat the tip with a more damaging material. +After this process, add a fletching and your bolts are ready to be used. + +Since the bolts consist of a harder core and tip they carry more weight than regular arrows, making them perfect to fight armored targets. + + + \ No newline at end of file From 6cd7b497e85eab2095086a137e3bb2760c802cbd Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Wed, 29 Oct 2014 22:33:00 +0100 Subject: [PATCH 063/129] Weaponry booooooook --- resources/assets/tinker/lang/en_US.lang | 1 + .../assets/tinker/manuals/en_US/weaponry.xml | 44 ++++++-- .../java/tconstruct/client/TProxyClient.java | 106 +++++++----------- .../tconstruct/tools/ToolProxyClient.java | 4 +- .../java/tconstruct/tools/items/Manual.java | 6 +- .../tconstruct/tools/items/ManualInfo.java | 3 +- .../weaponry/WeaponryClientProxy.java | 15 +++ 7 files changed, 94 insertions(+), 85 deletions(-) diff --git a/resources/assets/tinker/lang/en_US.lang b/resources/assets/tinker/lang/en_US.lang index 81edf5ef672..e781e737072 100644 --- a/resources/assets/tinker/lang/en_US.lang +++ b/resources/assets/tinker/lang/en_US.lang @@ -431,6 +431,7 @@ item.tconstruct.manual.beginner.name=Materials and You: Volume 1 item.tconstruct.manual.toolstation.name=Materials and You: Volume 2 item.tconstruct.manual.smeltery.name=Mighty Smelting item.tconstruct.manual.diary.name=Diary of a Tinker +item.tconstruct.manual.weaponry.name=Tinkers' Weaponry item.tconstruct.bucket.Iron.name=Molten Iron Bucket item.tconstruct.bucket.Gold.name=Molten Gold Bucket diff --git a/resources/assets/tinker/manuals/en_US/weaponry.xml b/resources/assets/tinker/manuals/en_US/weaponry.xml index cabe601c817..e030b51258d 100644 --- a/resources/assets/tinker/manuals/en_US/weaponry.xml +++ b/resources/assets/tinker/manuals/en_US/weaponry.xml @@ -12,23 +12,23 @@ By Sheriff Bownana Table of Contents Introduction - smelterybook + weaponrybook 3 Throwing Weapons - castingtable + throwingknifeIcon 5 Projectile Weapons - smeltery - 5 + shortbowIcon + 7 Projectiles - liquidiron - 9 + arrowIcon + 10 @@ -67,7 +67,11 @@ Throwing knifes stack up to a moderate amount, and deal moderate damage. Shuriken: Small delicate projectiles put together from 4 parts, that are thrown from the wrist. Because of this you don't need to take aim and can throw them directly. -Since they're so small you can carry many of them, however they don't deal much damage. +Since they're so small you can carry many of them, however they don't deal much damage. + + + + Javelin: This is a hybrid between a melee and a ranged weapon, consisting of an arrow head on two tough tool rods. It deals moderate damage as a melee weapon, but to unleash its true potential you have to throw it at your enemy. @@ -80,12 +84,20 @@ The throwing has a small windup. Because of their size you can only carry a few, Shortbow: Put together from two bow limbs and a bowstring, this weapon is a fast and handy bow. Keep in mind that inflexible materials like stone can hardly be drawn back and can't accelerate projectiles well. Organic materials are favoured for quick bows, while metals require lots of strengt to draw back, but provide more power. The bow requires arrows as ammo. -Offensive modifiers on bows do not count for arrows. The only modifiers affecting its ranged performance are Redstone and lapis. +Offensive modifiers on bows do not count for arrows. The only modifiers affecting its ranged performance are Redstone and lapis. + + + + Longbow: The big brother. This bow is much bigger, requiring more time to pull it back, but boy oh boy are those arrows fast. Because of this the longbow performs slightly better against armored targets. Furthermore this makes the longbow less accurate with very light arrows. -The longbow is constructed from two bow limbs, a bowstring and a large plate. +The longbow is constructed from two bow limbs, a bowstring and a large plate. + + + + Crossbow: Those pesky metals are such a pain to pull back. Luckily a tinkerer knows how to help himself! The crossbow allows you to pre-load it with a bolt, and have it ready instantly to fire. Since this allows for much more power, it can shoot heavier projectiles, resulting in more damage and armor penetration. @@ -99,7 +111,11 @@ For these projectiles goes: The heavier the projectile, the more damage carries Arrows: The bread and butter of every ranger. Arrows can be built from many different materials. It needs an arrow head, a shaft and a fletching. The choice of materials allows a balance between damage, arrow-count, accuracy and fragility. The head material is crucial for its weight. -A fragile arrow has a chance to break on impact with terrain. Arrows always break when they hit a target, however the reinforced trait gives a chance for the arrow to survive the impact. +A fragile arrow has a chance to break on impact with terrain. Arrows always break when they hit a target, however the reinforced trait gives a chance for the arrow to survive the impact. + + + + Valid Shaft Materials: * Stick @@ -111,14 +127,18 @@ Valid Fletching Materials: * Leaves * Slimeleaves * Feathers -* Slime +* Slime + + + + Bolts: Crafting bolts is a delicate process. First you need a core in the form of a tool rod. Take this tool rod to a smeltery and put it into a Casting Table. Pour some metal onto it to coat the tip with a more damaging material. After this process, add a fletching and your bolts are ready to be used. -Since the bolts consist of a harder core and tip they carry more weight than regular arrows, making them perfect to fight armored targets. +Since the bolts consist of a harder core and tip they carry more weight than regular arrows, making them perfect to fight armored targets. \ No newline at end of file diff --git a/src/main/java/tconstruct/client/TProxyClient.java b/src/main/java/tconstruct/client/TProxyClient.java index 26499568b10..93f1fc1a03c 100644 --- a/src/main/java/tconstruct/client/TProxyClient.java +++ b/src/main/java/tconstruct/client/TProxyClient.java @@ -3,6 +3,7 @@ import java.io.InputStream; import java.text.DecimalFormat; import javax.xml.parsers.*; + import mantle.client.SmallFontRenderer; import mantle.lib.client.MantleClientRegistry; import net.minecraft.client.Minecraft; @@ -17,8 +18,7 @@ import tconstruct.common.TProxyCommon; import tconstruct.tools.items.ManualInfo; -public class TProxyClient extends TProxyCommon -{ +public class TProxyClient extends TProxyCommon { public static DecimalFormat df = new DecimalFormat("##.#"); /* TODO: Split this class up into its respective parts */ @@ -27,15 +27,13 @@ public class TProxyClient extends TProxyCommon public static Minecraft mc; public static RenderItem itemRenderer = new RenderItem(); - public void initialize () - { + public void initialize() { registerRenderer(); readManuals(); } /* Registers any rendering code. */ - public void registerRenderer () - { + public void registerRenderer() { Minecraft mc = Minecraft.getMinecraft(); smallFontRenderer = new SmallFontRenderer(mc.gameSettings, new ResourceLocation("textures/font/ascii.png"), mc.renderEngine, false); } @@ -44,68 +42,45 @@ public void registerRenderer () public static Document volume1; public static Document volume2; public static Document smelter; + public static Document weaponry; public static ManualInfo manualData; - public void readManuals () - { + public void readManuals() { DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); - String CurrentLanguage = Minecraft.getMinecraft().getLanguageManager().getCurrentLanguage().getLanguageCode(); - - Document diary_cl = readManual("/assets/tinker/manuals/" + CurrentLanguage + "/diary.xml", dbFactory); - Document volume1_cl = readManual("/assets/tinker/manuals/" + CurrentLanguage + "/firstday.xml", dbFactory); - Document volume2_cl = readManual("/assets/tinker/manuals/" + CurrentLanguage + "/materials.xml", dbFactory); - Document smelter_cl = readManual("/assets/tinker/manuals/" + CurrentLanguage + "/smeltery.xml", dbFactory); - - diary = readManual("/assets/tinker/manuals/en_US/diary.xml", dbFactory); - volume1 = readManual("/assets/tinker/manuals/en_US/firstday.xml", dbFactory); - volume2 = readManual("/assets/tinker/manuals/en_US/materials.xml", dbFactory); - smelter = readManual("/assets/tinker/manuals/en_US/smeltery.xml", dbFactory); - - if(diary_cl != null) - { - diary = diary_cl; - } - - if(volume1_cl != null) - { - volume1 = volume1_cl; - } - - if(volume2_cl != null) - { - volume2 = volume2_cl; - } - - if(smelter_cl != null) - { - smelter = smelter_cl; - } - - initManualIcons(); + String CurrentLanguage = Minecraft.getMinecraft().getLanguageManager().getCurrentLanguage().getLanguageCode(); + + Document diary_cl = readManual("/assets/tinker/manuals/" + CurrentLanguage + "/diary.xml", dbFactory); + Document volume1_cl = readManual("/assets/tinker/manuals/" + CurrentLanguage + "/firstday.xml", dbFactory); + Document volume2_cl = readManual("/assets/tinker/manuals/" + CurrentLanguage + "/materials.xml", dbFactory); + Document smelter_cl = readManual("/assets/tinker/manuals/" + CurrentLanguage + "/smeltery.xml", dbFactory); + Document weaponry_cl = readManual("/assets/tinker/manuals/" + CurrentLanguage + "/weaponry.xml", dbFactory); + + diary = diary_cl != null ? diary_cl : readManual("/assets/tinker/manuals/en_US/diary.xml", dbFactory); + volume1 = volume1_cl != null ? volume1_cl : readManual("/assets/tinker/manuals/en_US/firstday.xml", dbFactory); + volume2 = volume2_cl != null ? volume2_cl : readManual("/assets/tinker/manuals/en_US/materials.xml", dbFactory); + smelter = smelter_cl != null ? smelter_cl : readManual("/assets/tinker/manuals/en_US/smeltery.xml", dbFactory); + weaponry = weaponry_cl != null ? weaponry_cl : readManual("/assets/tinker/manuals/en_US/weaponry.xml", dbFactory); + + initManualIcons(); initManualRecipes(); initManualPages(); manualData = new ManualInfo(); } - Document readManual (String location, DocumentBuilderFactory dbFactory) - { - try - { + Document readManual(String location, DocumentBuilderFactory dbFactory) { + try { InputStream stream = TConstruct.class.getResourceAsStream(location); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(stream); doc.getDocumentElement().normalize(); return doc; - } - catch (Exception e) - { + } catch (Exception e) { e.printStackTrace(); return null; } } - public void initManualIcons () - { + public void initManualIcons() { MantleClientRegistry.registerManualIcon("torch", new ItemStack(Blocks.torch)); MantleClientRegistry.registerManualIcon("sapling", new ItemStack(Blocks.sapling)); MantleClientRegistry.registerManualIcon("workbench", new ItemStack(Blocks.crafting_table)); @@ -121,34 +96,29 @@ public void initManualIcons () MantleClientRegistry.registerManualIcon("netherrack", new ItemStack(Blocks.netherrack)); } - public void initManualRecipes () - { + public void initManualRecipes() { } - void initManualPages () - { + void initManualPages() { } - public static Document getManualFromStack (ItemStack stack) - { - switch (stack.getItemDamage()) - { - case 0: - return volume1; - case 1: - return volume2; - case 2: - return smelter; - case 3: - return diary; + public static Document getManualFromStack(ItemStack stack) { + switch (stack.getItemDamage()) { + case 0: + return volume1; + case 1: + return volume2; + case 2: + return smelter; + case 3: + return diary; } return null; } - public void recalculateHealth () - { + public void recalculateHealth() { ArmorProxyClient.armorExtended.recalculateHealth(mc.thePlayer, TPlayerStats.get(mc.thePlayer)); } diff --git a/src/main/java/tconstruct/tools/ToolProxyClient.java b/src/main/java/tconstruct/tools/ToolProxyClient.java index 33650f37075..2290044c7e4 100644 --- a/src/main/java/tconstruct/tools/ToolProxyClient.java +++ b/src/main/java/tconstruct/tools/ToolProxyClient.java @@ -101,8 +101,8 @@ public void registerManualIcons () MantleClientRegistry.registerManualIcon("frypanicon", ToolBuilder.instance.buildTool(new ItemStack(TinkerTools.frypanHead, 1, 10), new ItemStack(TinkerTools.toolRod, 1, 11), null, "")); MantleClientRegistry.registerManualIcon("battlesignicon", ToolBuilder.instance.buildTool(new ItemStack(TinkerTools.signHead, 1, 10), new ItemStack(TinkerTools.toolRod, 1, 11), null, "")); MantleClientRegistry.registerManualIcon("chiselicon", ToolBuilder.instance.buildTool(new ItemStack(TinkerTools.chiselHead, 1, 10), new ItemStack(TinkerTools.toolRod, 1, 11), null, "")); - MantleClientRegistry.registerManualIcon("shortbowIcon", ToolBuilder.instance.buildTool(new ItemStack(TinkerTools.toolRod, 1, 10), new ItemStack(TinkerWeaponry.bowstring, 1, 0), new ItemStack(TinkerTools.toolRod, 1, 12), "")); - MantleClientRegistry.registerManualIcon("arrowIcon", ToolBuilder.instance.buildTool(new ItemStack(TinkerWeaponry.arrowhead, 1, 10), new ItemStack(TinkerTools.toolRod, 1, 11), new ItemStack(TinkerWeaponry.fletching, 1, 0), "")); + //MantleClientRegistry.registerManualIcon("shortbowIcon", ToolBuilder.instance.buildTool(new ItemStack(TinkerTools.toolRod, 1, 10), new ItemStack(TinkerWeaponry.bowstring, 1, 0), new ItemStack(TinkerTools.toolRod, 1, 12), "")); + //MantleClientRegistry.registerManualIcon("arrowIcon", ToolBuilder.instance.buildTool(new ItemStack(TinkerWeaponry.arrowhead, 1, 10), new ItemStack(TinkerTools.toolRod, 1, 11), new ItemStack(TinkerWeaponry.fletching, 1, 0), "")); MantleClientRegistry.registerManualIcon("hammericon", ToolBuilder.instance.buildTool(new ItemStack(TinkerTools.hammerHead, 1, 10), new ItemStack(TinkerTools.toughRod, 1, 11), new ItemStack(TinkerTools.largePlate, 1, 12), new ItemStack(TinkerTools.largePlate, 8), "")); MantleClientRegistry.registerManualIcon("lumbericon", ToolBuilder.instance.buildTool(new ItemStack(TinkerTools.broadAxeHead, 1, 10), new ItemStack(TinkerTools.toughRod, 1, 11), new ItemStack(TinkerTools.largePlate, 1, 12), new ItemStack(TinkerTools.toughBinding, 8), "")); diff --git a/src/main/java/tconstruct/tools/items/Manual.java b/src/main/java/tconstruct/tools/items/Manual.java index 1b8edc01596..142cd5f6c9c 100644 --- a/src/main/java/tconstruct/tools/items/Manual.java +++ b/src/main/java/tconstruct/tools/items/Manual.java @@ -18,8 +18,8 @@ public class Manual extends CraftingItem { - static String[] name = new String[] { "beginner", "toolstation", "smeltery", "diary" }; - static String[] textureName = new String[] { "tinkerbook_diary", "tinkerbook_toolstation", "tinkerbook_smeltery", "tinkerbook_blue" }; + static String[] name = new String[] { "beginner", "toolstation", "smeltery", "diary", "weaponry" }; + static String[] textureName = new String[] { "tinkerbook_diary", "tinkerbook_toolstation", "tinkerbook_smeltery", "tinkerbook_blue", "tinkerbook_green" }; public Manual() { @@ -50,6 +50,8 @@ private BookData getData (ItemStack stack) return TProxyClient.manualData.toolStation; case 2: return TProxyClient.manualData.smeltery; + case 4: + return TProxyClient.manualData.weaponry; default: return TProxyClient.manualData.diary; } diff --git a/src/main/java/tconstruct/tools/items/ManualInfo.java b/src/main/java/tconstruct/tools/items/ManualInfo.java index 5c68e0f4f3a..e97f2e2f8d7 100644 --- a/src/main/java/tconstruct/tools/items/ManualInfo.java +++ b/src/main/java/tconstruct/tools/items/ManualInfo.java @@ -16,6 +16,7 @@ public class ManualInfo BookData toolStation = new BookData(); BookData smeltery = new BookData(); BookData diary = new BookData(); + BookData weaponry = new BookData(); /* diary = readManual("/assets/tinker/manuals/diary.xml", dbFactory); volume1 = readManual("/assets/tinker/manuals/firstday.xml", dbFactory); @@ -29,7 +30,7 @@ public ManualInfo() toolStation = initManual(toolStation, "tconstruct.manual.toolstation", "\u00a7o" + StatCollector.translateToLocal("manual2.tooltip"), side == Side.CLIENT ? TProxyClient.volume2 : null, "tinker:tinkerbook_toolstation"); smeltery = initManual(smeltery, "tconstruct.manual.smeltery", "\u00a7o" + StatCollector.translateToLocal("manual3.tooltip"), side == Side.CLIENT ? TProxyClient.smelter : null, "tinker:tinkerbook_smeltery"); diary = initManual(diary, "tconstruct.manual.diary", "\u00a7o" + StatCollector.translateToLocal("manual4.tooltip"), side == Side.CLIENT ? TProxyClient.diary : null, "tinker:tinkerbook_blue"); - + weaponry = initManual(weaponry, "tconstruct.manual.weaponry", "\u00a7o" + StatCollector.translateToLocal("manual5.tooltip"), side == Side.CLIENT ? TProxyClient.weaponry : null, "tinker:tinkerbook_green"); } public BookData initManual (BookData data, String unlocName, String toolTip, Document xmlDoc, String itemImage) diff --git a/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java b/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java index 0710a82a48d..0ea3e427baf 100644 --- a/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java +++ b/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java @@ -1,6 +1,9 @@ package tconstruct.weaponry; +import mantle.lib.client.MantleClientRegistry; +import net.minecraft.init.Items; import tconstruct.client.AmmoItemRenderer; +import tconstruct.library.crafting.ToolBuilder; import tconstruct.library.entity.ProjectileBase; import tconstruct.weaponry.client.AmmoSlotHandler; import tconstruct.weaponry.client.CrosshairHandler; @@ -39,6 +42,7 @@ public void init() { registerMaterialRendering(); buttons(); + registerManualIcons(); } private void registerRenderers() @@ -159,4 +163,15 @@ private void buttons() TConstructClientRegistry.addTierTwoButton(icons[i][0], icons[i][1], icons[i][2], coords[i*2], coords[i*2+1], tools[i].getLocalizedToolName(), locString, Reference.RESOURCE, tex); } } + + + /* Manual Stuff */ + public void registerManualIcons () + { + MantleClientRegistry.registerManualIcon("throwingknifeIcon", ToolBuilder.instance.buildTool(new ItemStack(TinkerTools.knifeBlade, 1, TinkerTools.MaterialID.Iron), new ItemStack(TinkerTools.toolRod, 1, 11), null, "")); + MantleClientRegistry.registerManualIcon("shortbowIcon", ToolBuilder.instance.buildTool(new ItemStack(TinkerWeaponry.partBowLimb, 1, TinkerTools.MaterialID.Wood), new ItemStack(TinkerWeaponry.bowstring, 1, 0), new ItemStack(TinkerWeaponry.partBowLimb, 1, TinkerTools.MaterialID.Wood), "")); + MantleClientRegistry.registerManualIcon("arrowIcon", ToolBuilder.instance.buildTool(new ItemStack(TinkerWeaponry.arrowhead, 1, TinkerTools.MaterialID.Flint), new ItemStack(Items.stick), new ItemStack(TinkerWeaponry.fletching, 1, 0), "")); + + MantleClientRegistry.registerManualIcon("weaponrybook", new ItemStack(TinkerTools.manualBook, 1, 4)); + } } From 5a03a15ec4b95d99a788a1e27ef6b42d6642b155 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Thu, 30 Oct 2014 12:31:54 +0100 Subject: [PATCH 064/129] Make weaponry book available! --- .../tconstruct/armor/player/TPlayerStats.java | 4 ++++ .../java/tconstruct/tools/TinkerTools.java | 4 +++- .../tconstruct/weaponry/TinkerWeaponry.java | 5 ++++- .../tconstruct/weaponry/WeaponryHandler.java | 21 +++++++++++++++++++ weaponry.txt | 1 - 5 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/main/java/tconstruct/armor/player/TPlayerStats.java b/src/main/java/tconstruct/armor/player/TPlayerStats.java index d5bd3d77422..41bd0b24148 100644 --- a/src/main/java/tconstruct/armor/player/TPlayerStats.java +++ b/src/main/java/tconstruct/armor/player/TPlayerStats.java @@ -27,6 +27,7 @@ public class TPlayerStats implements IExtendedEntityProperties, IPlayerExtendedI public boolean beginnerManual; public boolean materialManual; public boolean smelteryManual; + public boolean weaponryManual; public boolean battlesignBonus; // death-penality @@ -61,6 +62,7 @@ public void saveNBTData (NBTTagCompound compound) tTag.setBoolean("beginnerManual", this.beginnerManual); tTag.setBoolean("materialManual", this.materialManual); tTag.setBoolean("smelteryManual", this.smelteryManual); + tTag.setBoolean("weaponryManual", this.weaponryManual); tTag.setBoolean("battlesignBonus", this.battlesignBonus); tTag.setInteger("derpLevel", this.derpLevel); compound.setTag(PROP_NAME, tTag); @@ -76,6 +78,7 @@ public void loadNBTData (NBTTagCompound compound) this.beginnerManual = properties.getBoolean("beginnerManual"); this.materialManual = properties.getBoolean("materialManual"); this.smelteryManual = properties.getBoolean("smelteryManual"); + this.weaponryManual = properties.getBoolean("weaponryManual"); this.battlesignBonus = properties.getBoolean("battlesignBonus"); this.derpLevel = properties.getInteger("derpLevel"); } @@ -95,6 +98,7 @@ public void copyFrom (TPlayerStats stats, boolean copyCalc) this.beginnerManual = stats.beginnerManual; this.materialManual = stats.materialManual; this.smelteryManual = stats.smelteryManual; + this.weaponryManual = stats.weaponryManual; this.battlesignBonus = stats.battlesignBonus; this.derpLevel = stats.derpLevel; diff --git a/src/main/java/tconstruct/tools/TinkerTools.java b/src/main/java/tconstruct/tools/TinkerTools.java index fb75808949a..2f9b29caa98 100644 --- a/src/main/java/tconstruct/tools/TinkerTools.java +++ b/src/main/java/tconstruct/tools/TinkerTools.java @@ -612,7 +612,9 @@ private void craftingTableRecipes () GameRegistry.addShapelessRecipe(new ItemStack(TinkerTools.manualBook, 2, 1), new ItemStack(TinkerTools.manualBook, 1, 1), Items.book); GameRegistry.addShapelessRecipe(new ItemStack(TinkerTools.manualBook, 1, 2), new ItemStack(TinkerTools.manualBook, 1, 1)); GameRegistry.addShapelessRecipe(new ItemStack(TinkerTools.manualBook, 2, 2), new ItemStack(TinkerTools.manualBook, 1, 2), Items.book); - GameRegistry.addShapelessRecipe(new ItemStack(TinkerTools.manualBook, 1, 3), new ItemStack(TinkerTools.manualBook, 1, 2)); + GameRegistry.addShapelessRecipe(new ItemStack(TinkerTools.manualBook, 2, 4), new ItemStack(TinkerTools.manualBook, 1, 4), Items.book); + GameRegistry.addShapelessRecipe(new ItemStack(TinkerTools.manualBook, 1, 4), new ItemStack(TinkerTools.manualBook, 1, 2)); + GameRegistry.addShapelessRecipe(new ItemStack(TinkerTools.manualBook, 1, 3), new ItemStack(TinkerTools.manualBook, 1, 4)); // alternative Vanilla Book Recipe GameRegistry.addShapelessRecipe(new ItemStack(Items.book), Items.paper, Items.paper, Items.paper, Items.string, TinkerTools.blankPattern, TinkerTools.blankPattern); GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(Items.name_tag), "P~ ", "~O ", " ~", '~', Items.string, 'P', Items.paper, 'O', "slimeball")); diff --git a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java index 9bfccd28669..ebd34087b0d 100644 --- a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java +++ b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java @@ -1,6 +1,7 @@ package tconstruct.weaponry; +import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.SidedProxy; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; @@ -111,7 +112,9 @@ public void init(FMLInitializationEvent event) public void postInit(FMLPostInitializationEvent event) { // this handler takes care that ammo weapons get ammo. - MinecraftForge.EVENT_BUS.register(new WeaponryHandler()); + WeaponryHandler weaponryHandler = new WeaponryHandler(); + MinecraftForge.EVENT_BUS.register(weaponryHandler); + FMLCommonHandler.instance().bus().register(weaponryHandler); proxy.init(); } diff --git a/src/main/java/tconstruct/weaponry/WeaponryHandler.java b/src/main/java/tconstruct/weaponry/WeaponryHandler.java index d17b5f5bf67..cd35f487258 100644 --- a/src/main/java/tconstruct/weaponry/WeaponryHandler.java +++ b/src/main/java/tconstruct/weaponry/WeaponryHandler.java @@ -1,5 +1,8 @@ package tconstruct.weaponry; +import cpw.mods.fml.common.gameevent.PlayerEvent; +import tconstruct.armor.player.TPlayerStats; +import tconstruct.tools.TinkerTools; import tconstruct.weaponry.ammo.ArrowAmmo; import tconstruct.weaponry.ammo.BoltAmmo; import tconstruct.library.tools.DualMaterialToolPart; @@ -21,6 +24,24 @@ import tconstruct.weaponry.weapons.ShortBow; public class WeaponryHandler { + @SubscribeEvent + public void onCrafting (PlayerEvent.ItemCraftedEvent event) + { + Item item = event.crafting.getItem(); + if (!event.player.worldObj.isRemote) + { + if (item == Item.getItemFromBlock(TinkerTools.toolStationWood)) + { + TPlayerStats stats = TPlayerStats.get(event.player); + if (!stats.weaponryManual) + { + stats.weaponryManual = true; + AbilityHelper.spawnItemAtPlayer(event.player, new ItemStack(TinkerTools.manualBook, 1, 4)); + } + } + } + } + // Provides ammo-items with the necessary NBT @SubscribeEvent public void onAmmoCrafted(ToolCraftEvent.NormalTool event) diff --git a/weaponry.txt b/weaponry.txt index 54bd6749671..04f106fecf2 100644 --- a/weaponry.txt +++ b/weaponry.txt @@ -1,6 +1,5 @@ TODO: * Effect graphics for arrows, throwing knifes, javelins,... MOSTLY DONE -* Separate book explaining the system, text only, sorry folks * Partbuilder stuff for weaponry stuff? * Bring bowmaterial stats etc in line? * Knockback on projectiles knocks towards their moving direction DONEish From 62904b92dc7286d024139ce9704aecebea71ed97 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Thu, 30 Oct 2014 13:08:01 +0100 Subject: [PATCH 065/129] Fix Max ammo display in tables --- src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java b/src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java index c8b32650790..eab364ca99d 100644 --- a/src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java +++ b/src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java @@ -135,7 +135,7 @@ private static void drawDurability(NBTTagCompound tags) { private static void drawAmmo(IAmmo ammoItem, ItemStack stack) { - final int max = ammoItem.getAmmoCount(stack); + final int max = ammoItem.getMaxAmmo(stack); final int current = ammoItem.getAmmoCount(stack); write(StatCollector.translateToLocal("gui.toolstation21") + current + "/" + max); From 9d7d33fea35f84dfac8754467ab2fff25b449119 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Thu, 30 Oct 2014 13:14:43 +0100 Subject: [PATCH 066/129] Javelins now can be used properly as melee and ranged weapons --- .../items/javelin/_javelin_head_broken.png | Bin 0 -> 221 bytes .../tconstruct/weaponry/TinkerWeaponry.java | 2 + .../weaponry/WeaponryActiveToolMod.java | 35 ++++++++++++++++++ .../tconstruct/weaponry/weapons/Javelin.java | 9 ++++- 4 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 resources/assets/tinker/textures/items/javelin/_javelin_head_broken.png create mode 100644 src/main/java/tconstruct/weaponry/WeaponryActiveToolMod.java diff --git a/resources/assets/tinker/textures/items/javelin/_javelin_head_broken.png b/resources/assets/tinker/textures/items/javelin/_javelin_head_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..116f7485b11e9dd495d113b085fc9c7ebac9a22a GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QK$!8;-MT+OLG}_)Usv{fTyoszy2qvefXt2cba4!^IQ{m# zq2K`n9+rc}7M-nu9gP!gn1zjmX182Q3v!L+(r=jkU#)X_$AU*p1?6{S8_GWfGbFs9 zyZ1XwP|!4{WS)j?*AAWW;=Wb9ZRXQClRGj(JhlGY_x<0&xY17jj?4U5NuWgxp00i_ I>zopr0Fi1-1poj5 literal 0 HcmV?d00001 diff --git a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java index ebd34087b0d..974d5c3e57c 100644 --- a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java +++ b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java @@ -106,6 +106,8 @@ public void init(FMLInitializationEvent event) ItemStack redstoneBlock = new ItemStack(Blocks.redstone_block); ModifyBuilder.registerModifier(new ModWindup(2, new ItemStack[] { redstoneItem, redstoneBlock }, new int[] { 1, 9 })); ModifyBuilder.registerModifier(new ModAmmoRestock()); + + TConstructRegistry.registerActiveToolMod(new WeaponryActiveToolMod()); } @Handler diff --git a/src/main/java/tconstruct/weaponry/WeaponryActiveToolMod.java b/src/main/java/tconstruct/weaponry/WeaponryActiveToolMod.java new file mode 100644 index 00000000000..90d72532507 --- /dev/null +++ b/src/main/java/tconstruct/weaponry/WeaponryActiveToolMod.java @@ -0,0 +1,35 @@ +package tconstruct.weaponry; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import tconstruct.library.ActiveToolMod; +import tconstruct.library.weaponry.IAmmo; + +public class WeaponryActiveToolMod extends ActiveToolMod { + @Override + public boolean damageTool(ItemStack stack, int damage, EntityLivingBase entity) { + if(stack.getItem() == TinkerWeaponry.javelin && stack.hasTagCompound()) { + NBTTagCompound tags = stack.getTagCompound().getCompoundTag("InfiTool"); + IAmmo ammo =(IAmmo)stack.getItem(); + if(tags.getInteger("Damage") == 0) + { + int rem = ammo.consumeAmmo(1, stack); + if(rem > 0) + return true; + } + else if(ammo.getAmmoCount(stack) > 0) + { + int d = tags.getInteger("Damage") + damage; + int max = tags.getInteger("TotalDurability"); + if(d > max) + { + tags.setInteger("Damage", 0); + return true; + } + } + } + + return false; + } +} diff --git a/src/main/java/tconstruct/weaponry/weapons/Javelin.java b/src/main/java/tconstruct/weaponry/weapons/Javelin.java index 448e596f8a5..92e8de56f33 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Javelin.java +++ b/src/main/java/tconstruct/weaponry/weapons/Javelin.java @@ -123,7 +123,7 @@ public String getIconSuffix(int partType) { case 0: return "_javelin_head"; case 1: - return ""; // no broken, since it runs out of ammo + return "_javelin_head_broken"; // no broken, since it runs out of ammo case 2: return "_javelin_handle"; case 3: @@ -145,7 +145,12 @@ public String getDefaultFolder() { @Override public float getAmmoModifier() { - return 0.02f; + return 0.2f; + } + + @Override + public float getDurabilityModifier() { + return 0.1f; } @Override From 3f74dd75350f6d46fd5d919456fc5c87bec290d1 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Thu, 30 Oct 2014 13:16:41 +0100 Subject: [PATCH 067/129] Make shuriken and ammoweapon/throwing knifes not throwable without ammo --- src/main/java/tconstruct/library/weaponry/AmmoWeapon.java | 3 ++- src/main/java/tconstruct/weaponry/weapons/Shuriken.java | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java b/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java index ce554568902..b540e760c5f 100644 --- a/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java +++ b/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java @@ -31,7 +31,8 @@ public int getMaxItemUseDuration(ItemStack par1ItemStack) { @Override public ItemStack onItemRightClick (ItemStack stack, World world, EntityPlayer player) { - player.setItemInUse(stack, this.getMaxItemUseDuration(stack)); + if(getAmmoCount(stack) > 0) + player.setItemInUse(stack, this.getMaxItemUseDuration(stack)); return stack; } diff --git a/src/main/java/tconstruct/weaponry/weapons/Shuriken.java b/src/main/java/tconstruct/weaponry/weapons/Shuriken.java index c9193d45b28..6f36c6532c2 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Shuriken.java +++ b/src/main/java/tconstruct/weaponry/weapons/Shuriken.java @@ -101,6 +101,9 @@ public float getWindupProgress(ItemStack itemStack, EntityPlayer player) { @Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + if(getAmmoCount(stack) <= 0) + return stack; + launchProjectile(stack, world, player); // this is only used for the animation From eb1a6701de05041c25390e864ba78a24ae06e0c2 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Thu, 30 Oct 2014 22:34:56 +0100 Subject: [PATCH 068/129] Fix Projectile Weapons and arrows/bolts building creative items with materials that have no bow/arrow material stats --- src/main/java/tconstruct/library/weaponry/BowBaseAmmo.java | 5 +++++ src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java | 4 ++++ src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java | 3 +++ src/main/java/tconstruct/weaponry/weapons/Crossbow.java | 5 +++++ 4 files changed, 17 insertions(+) diff --git a/src/main/java/tconstruct/library/weaponry/BowBaseAmmo.java b/src/main/java/tconstruct/library/weaponry/BowBaseAmmo.java index 9de56090291..14457f25f21 100644 --- a/src/main/java/tconstruct/library/weaponry/BowBaseAmmo.java +++ b/src/main/java/tconstruct/library/weaponry/BowBaseAmmo.java @@ -1,6 +1,7 @@ package tconstruct.library.weaponry; import tconstruct.library.TConstructRegistry; +import tconstruct.library.tools.BowMaterial; import tconstruct.library.tools.BowstringMaterial; import tconstruct.weaponry.ammo.ArrowAmmo; import tconstruct.weaponry.entity.ArrowEntity; @@ -136,6 +137,10 @@ public void playFiringSound(World world, EntityPlayer player, ItemStack weapon, @Override public void buildTool (int id, String name, List list) { + // does the material have a bow material? + if(TConstructRegistry.getBowMaterial(id) == null) + return; + // all creative bows use regular bowstring ItemStack handleStack = new ItemStack(getHandleItem(), 1, 0); // regular bowstring ItemStack accessoryStack = getPartAmount() > 2 ? new ItemStack(getAccessoryItem(), 1, id) : null; diff --git a/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java b/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java index 2c8293bc3ba..b2652a12012 100644 --- a/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java +++ b/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java @@ -2,6 +2,7 @@ import tconstruct.TConstruct; import tconstruct.library.TConstructRegistry; +import tconstruct.library.tools.ArrowMaterial; import tconstruct.library.tools.CustomMaterial; import tconstruct.library.tools.FletchingMaterial; import tconstruct.library.tools.FletchlingLeafMaterial; @@ -97,6 +98,9 @@ public String[] getTraits () @Override public void buildTool (int id, String name, List list) { + if(TConstructRegistry.getArrowMaterial(id) == null) + return; + ItemStack handleStack = new ItemStack(getHandleItem(), 1, 0); // wooden shaft ItemStack accessoryStack = new ItemStack(getAccessoryItem(), 1, 0); // feather fletchling diff --git a/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java b/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java index 484f68cb929..0e640f0a6f0 100644 --- a/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java +++ b/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java @@ -82,6 +82,9 @@ public String[] getTraits () @Override public void buildTool (int id, String name, List list) { + if(TConstructRegistry.getArrowMaterial(id) == null) + return; + // dual material head: we use wooden shafts ItemStack headStack = DualMaterialToolPart.createDualMaterial(getHeadItem(), 0, id); // wooden shaft, material head ItemStack handleStack = new ItemStack(getAccessoryItem(), 1, 0); // feather Fletchling diff --git a/src/main/java/tconstruct/weaponry/weapons/Crossbow.java b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java index 11989d648af..90a1f3175f4 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Crossbow.java +++ b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java @@ -1,5 +1,6 @@ package tconstruct.weaponry.weapons; +import tconstruct.library.TConstructRegistry; import tconstruct.weaponry.TinkerWeaponry; import tconstruct.weaponry.ammo.BoltAmmo; import tconstruct.weaponry.entity.BoltEntity; @@ -415,6 +416,10 @@ public String[] getTraits() { @Override public void buildTool (int id, String name, List list) { + // does the material have a bow material? + if(TConstructRegistry.getBowMaterial(id) == null) + return; + // all creative bows use regular bowstring ItemStack headStack = new ItemStack(getHeadItem(), 1, id); ItemStack handleStack = new ItemStack(getHandleItem(), 1, id); From 0fc518487dfbbc0a36c3bea7061e238c1db2732b Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Fri, 31 Oct 2014 14:17:46 +0100 Subject: [PATCH 069/129] Toolforge localizations for the new stuffs --- build.properties | 2 +- resources/assets/tinker/lang/en_US.lang | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/build.properties b/build.properties index 4a8a5abc32a..85262113665 100644 --- a/build.properties +++ b/build.properties @@ -4,5 +4,5 @@ mantle_version=0.3.1.jenkins176 CCLIB_version=1.1.1.95 NEI_version=1.0.2.15 ccc_version=1.0.2.9 -mod_version=1.7.1 +mod_version=1.7.experimental waila_version=1.5.3_1.7.10 \ No newline at end of file diff --git a/resources/assets/tinker/lang/en_US.lang b/resources/assets/tinker/lang/en_US.lang index e781e737072..04fdaee43fc 100644 --- a/resources/assets/tinker/lang/en_US.lang +++ b/resources/assets/tinker/lang/en_US.lang @@ -795,8 +795,6 @@ gui.toolstation.dagger.desc=The Dagger is a short blade that can be thrown.\n\nS gui.toolstation.fryingpan.desc=The Frying Pan is a heavy weapon that uses sheer weight to stun foes.\n\nSpecial Ability: Block\nNatural Ability: Heavy\nShift+rClick: Place Frying Pan\nDamage: Low\nDurability: High\n\nRequired parts:\n- Pan\n- Handle gui.toolstation.battlesign.desc=The Battlesign is an advance in weapon technology worthy of Zombie Pigmen everywhere.\n\nSpecial Ability:\nDamage Reflector\n\nNatural Ability: Writable\n\nDamage: Low\nDurability: Average gui.toolstation.chisel.desc=The Chisel is a utility tool that carves shapes into blocks.\n\nCrafting Grid:\n- Shape Items\nSpecial Ability: Chisel\nDurability: Average\n\nRequired parts:\n- Chisel Head\n- Handle -gui.toolstation.shortbow.desc=The Shortbow is a ranged weapon. It fires arrows quickly and precisely at its foes.\n\nDraw Speed: Quick\n\nRequired parts:\n- Tool Rod\n- Bowstring\n- Tool Rod -gui.toolstation.arrow.desc=Arrows are projectiles usually fired from bows.\n\nRequired parts:\n- Arrowhead\n- Tool Rod\n- Fletching gui.toolstation.hammer.desc=The Hammer is a broad mining tool. It harvests blocks in a wide range and is effective against undead.\n\nNatural Abilities:\nArea of Effect\n- (3x3)\n- Smite\n\nDurability: High gui.toolstation.lumberaxe.desc=The Lumber Axe is a broad chopping tool. It can fell entire trees or gather wood in a wide range.\n\nNatural Abilities:\nArea of Effect\n- Fell Trees\n- (3x3x3)\n\nDurability: Average gui.toolstation.excavator.desc=The Excavator is a broad digging tool. It harvests soil and snow in a wide range.\n\nNatural Ability:\n- Area of Effect\n- (3x3)\n\nDurability: Average @@ -804,6 +802,16 @@ gui.toolstation.scythe.desc=The Scythe is a broad reaping tool. It is effective gui.toolstation.cleaver.desc=The Cleaver is a heavy defensive weapon. It has powerful strikes, but is difficult to wield.\n\nSpecial Ability: Block\nNatural Ability:\n- Beheading\n\nDamage: High\nDurability: Average gui.toolstation.battleaxe.desc=The Battleaxe is a heavy offensive weapon. It is capable of bringing down small trees and can send foes flying.\n\nSpecial Ability: Block\nNatural Abilities:\n- Knockback\n- Area of Effect\n- (1x9)\n\nDamage: Average\nDurability: Average +gui.toolstation.shortbow.desc=The Shortbow is a ranged weapon. It fires arrows quickly and precisely at its foes.\n\nDraw Speed: Quick\n\nRequired parts:\n- Bow Limb\n- Bowstring\n- Bow Limb +gui.toolstation.longbow.desc=The Longbow is a ranged weapon. It has greater range than a shortbow and is able to shoot heavier arrows, but performs worse with light arrows.\n\n Required parts:\n- Bow Limb\n- Bowstring\n- Bow Limb\n- Large Plate +gui.toolstation.arrowammo.desc=Arrows are projectiles usually fired from bows.\n\nRequired parts:\n- Arrowhead\n- Tool Rod\n- Fletching +gui.toolstation.crossbow.desc=The crossbow is a precise ranged weapon. It loads bolts, that are fired on trigger.\n\nSpecial Ability:\n- Reduced reload time with harder materials +gui.toolstation.boltammo.desc=Bolts are projectiles fired from Crossbows.\n\nRequired Parts:\n- Bolt Core\n- Fletching\n\nBolt cores are obtained by pouring metal over a tool rod in a Casting Table. +gui.toolstation.throwingknife.desc=Mid ranged throwing weapon. Hold to take aim, release to throw.\n\nDamage: Medium\nCapacity: Medium +gui.toolstation.shuriken.desc=Short ranged throwing weapon. Thrown instantly.\n\nDamage: Low\nCapacity: High +gui.toolstation.javelin.desc=Ranged Melee weapon hybrid. Potent as a melee weapon, devasting at range.\n\nDamage: High\nCapacity: Low + + material.wood=Wood material.wood.display=Wooden material.stone=Stone From ce8b37a39e59474800086568ed90ff33ae5c7adb Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sat, 1 Nov 2014 20:56:46 +0100 Subject: [PATCH 070/129] Javelin Modifier Graphics --- .../items/javelin/beheading_javelin_effect.png | Bin 0 -> 245 bytes .../items/javelin/blaze_javelin_effect.png | Bin 0 -> 248 bytes .../tinker/textures/items/javelin/complete.xcf | Bin 0 -> 9522 bytes .../items/javelin/diamond_javelin_effect.png | Bin 0 -> 176 bytes .../items/javelin/emerald_javelin_effect.png | Bin 0 -> 207 bytes .../items/javelin/lapis_javelin_effect.png | Bin 0 -> 179 bytes .../items/javelin/lava_javelin_effect.png | Bin 0 -> 204 bytes .../items/javelin/moss_javelin_effect.png | Bin 0 -> 236 bytes .../items/javelin/necrotic_javelin_effect.png | Bin 0 -> 209 bytes .../items/javelin/piston_javelin_effect.png | Bin 0 -> 221 bytes .../items/javelin/quartz_javelin_effect.png | Bin 0 -> 216 bytes .../items/javelin/reinforced_javelin_effect.png | Bin 0 -> 211 bytes .../items/javelin/silk_javelin_effect.png | Bin 0 -> 229 bytes .../items/javelin/smite_javelin_effect.png | Bin 0 -> 338 bytes .../items/javelin/spider_javelin_effect.png | Bin 0 -> 267 bytes 15 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 resources/assets/tinker/textures/items/javelin/beheading_javelin_effect.png create mode 100644 resources/assets/tinker/textures/items/javelin/blaze_javelin_effect.png create mode 100644 resources/assets/tinker/textures/items/javelin/complete.xcf create mode 100644 resources/assets/tinker/textures/items/javelin/diamond_javelin_effect.png create mode 100644 resources/assets/tinker/textures/items/javelin/emerald_javelin_effect.png create mode 100644 resources/assets/tinker/textures/items/javelin/lapis_javelin_effect.png create mode 100644 resources/assets/tinker/textures/items/javelin/lava_javelin_effect.png create mode 100644 resources/assets/tinker/textures/items/javelin/moss_javelin_effect.png create mode 100644 resources/assets/tinker/textures/items/javelin/necrotic_javelin_effect.png create mode 100644 resources/assets/tinker/textures/items/javelin/piston_javelin_effect.png create mode 100644 resources/assets/tinker/textures/items/javelin/quartz_javelin_effect.png create mode 100644 resources/assets/tinker/textures/items/javelin/reinforced_javelin_effect.png create mode 100644 resources/assets/tinker/textures/items/javelin/silk_javelin_effect.png create mode 100644 resources/assets/tinker/textures/items/javelin/smite_javelin_effect.png create mode 100644 resources/assets/tinker/textures/items/javelin/spider_javelin_effect.png diff --git a/resources/assets/tinker/textures/items/javelin/beheading_javelin_effect.png b/resources/assets/tinker/textures/items/javelin/beheading_javelin_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..8d0371aaced7ea7762ffbb31b181cbc1c18bd6ad GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85sBugD~Uq{1qucLG}_)Usv{f+>FA!I-6$o@c@NNJzX3_EKVnz zT>A3!d;`n5*!zc0I4~t7B_t#iTtAbX@%jFl13=J_r=WP?5RmcV$LG+t=Is&^c^_>P z6+{gT4Gauosy9tf{B+rF8k%+J*Cdjf?jJY5_^EKVn< zBqaPe-@qjy>A~Q`0|b_ti9Es9#feG(JTKey4&|Iv|=f6sezE1#6sXnV4x_3!m*DgX0RQ(dPif{f)6 g$&_PV+#tii5LK(d@?M;w73c;APgg&ebxsLQ0JH5+kN^Mx literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/javelin/complete.xcf b/resources/assets/tinker/textures/items/javelin/complete.xcf new file mode 100644 index 0000000000000000000000000000000000000000..db4373eeeb3435d7eec636dc344354f1a8e62600 GIT binary patch literal 9522 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 IN3M?k8+9t*a{vGU literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/javelin/diamond_javelin_effect.png b/resources/assets/tinker/textures/items/javelin/diamond_javelin_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..133d4269d2d41e03a5940b45ed335b2e5e64d2c6 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85sBugD~Uq{1qucLG}_)Usv{f+>FA)s`BidZ(!LsXU~BX4q5^COEg?1sZU9Ffm*`CG9o&u-I#$ OUItHBKbLh*2~7Ywi#K=x literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/javelin/emerald_javelin_effect.png b/resources/assets/tinker/textures/items/javelin/emerald_javelin_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..061e97d0cf0083e9bb8e64ce7f0450cd4e554f4e GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85sBugD~Uq{1qucLG}_)Usv{f+>F8^f`y;5S%E_So-U3d7N?UF z76=#^82|x`@t^kYHLYEOoHHJ*VPIxE&Z@hjZDPuS$=i9R+Ayj}Hx=X=9Ij^*j$~t# sOk`{075DhYbx1&HuK}0a!3PWsL8}Gr-#@oC0vgTW>FVdQ&MBb@0P*)be*gdg literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/javelin/lapis_javelin_effect.png b/resources/assets/tinker/textures/items/javelin/lapis_javelin_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..eb932c560dae3b3f2eb72421f101e25d923e508a GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85sBugD~Uq{1qucLG}_)Usv{f+>FBF<{g*zS_6fQJzX3_EKVmU zNU%mQPA|J!ulIJ<|CDUKng3qx&%Wonh$r!&+K#02c5VOn@8h2!?sl+)g`wt>$f6A! S?`#BWXYh3Ob6Mw<&;$S->^fNh literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/javelin/lava_javelin_effect.png b/resources/assets/tinker/textures/items/javelin/lava_javelin_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..e8b98edff2da1c7a275bf45fb6c0979da65ec81d GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85sBugD~Uq{1qucLG}_)Usv{f+>F8!R)xRsdIE)fJY5_^EKa{Y zw~>>{ rKC*<#+hvk{gp!b;)|RS@Soay{?r2!LNj&lan#gTe~DWM4fSFS%} literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/javelin/moss_javelin_effect.png b/resources/assets/tinker/textures/items/javelin/moss_javelin_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..984b4087c98564e70267a1a37f7a0f84a71344e2 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85sBugD~Uq{1qucLG}_)Usv{f+>F9f`g#J<3P7P8PZ!4!i_^&o z60FTKCw8CyKfQeV|9*d7WxKOBMm9Y0^J*HqZSVXPaJCh;yS(4#=b;12hYu^HYP1IP z`Y|VL<6OyYSX1@4vxGU}!Nq&-JT;4I3i2nWFl?G%nNqQ#jgi}MY YaPzFfq?W?`KA^n}p00i_>zopr0PJc|@Bjb+ literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/javelin/necrotic_javelin_effect.png b/resources/assets/tinker/textures/items/javelin/necrotic_javelin_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..bedeb37c90253144221b6996ad35750799857db8 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85sBugD~Uq{1qucLG}_)Usv{f+>F99@^O>TfXol{ba4!^IQ@3Q zM&1JkJcsAhEwumgpY`A2^cBJF3a!k!l8bIGVRVzRoust#-LspX3@i*cnIFBVhAT5BflQ0_ba4!^IGvmz z!MZrXgGpI=@&6MwYC)#IfBsx3amb}Bjh&sHO-xLzt)+!!hhoo?T?dXGYkPQNqB74; z$4fj_^LUp?G8iw>KHHG^c3$@r_9r(tr~glHllY&WkdVN@aFJQMKx4~7FQ7#Xp00i_ I>zopr05b1L+5i9m literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/javelin/quartz_javelin_effect.png b/resources/assets/tinker/textures/items/javelin/quartz_javelin_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..1e248670038308f012ec2429d812caaa3bd4e259 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85sBugD~Uq{1qucLG}_)Usv{f+>FACMukgm90UqQc)B=-Se#Do z`MT-<`34rTeCrb@9GDW45)u+L)~-#Pv7^9}83cAUvN*1p{`Y_R`uTtNm(*MbF(xjP zeAe{mhXFAiT5L;NLF$4%T^vI!PA4Zw zur|v`Wd8c2zNC$FewwaidQ;nm2a_zyYq^z~nGe^OpS59QV{7{#U{`r>#`OQ+><#ZN x+^aa%akl|aqT)4%h#46tErR9Lnzc7FGIama2t4{w?hnv-22WQ%mvv4FO#mWULsb9( literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/javelin/silk_javelin_effect.png b/resources/assets/tinker/textures/items/javelin/silk_javelin_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..991cc3f8fb904e4b7033b6d630b35c938214d12b GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85sBugD~Uq{1qucLG}_)Usv{f+>FBN5`SE`O#}+1db&7JcGrUMr*vJU53wY3yf~90a$)Al69*0)Xvk9tWK)nn z;=t4({o$dPl~;toYc9741*L3-qoO@LKybqFq0~F)P3CR~H5N!PFa#ZyYPZ?-ToY&^ NgQu&X%Q~loCIG4;NvQw; literal 0 HcmV?d00001 diff --git a/resources/assets/tinker/textures/items/javelin/smite_javelin_effect.png b/resources/assets/tinker/textures/items/javelin/smite_javelin_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..468821c1abe94c16b4b3d98ea22a09b7cf656149 GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85sBugD~Uq{1qucLG}_)Usv{f+>F8+l03I&od615@^o%H{)4D$;o z%Xy35*i3KEJYgbVzN2$rcEGmA19Q6#S9Bc_4S%J?5|*^PZ|$X=E6;XC_~~wn;u5uD zXkcf&sQa`iaY{qSshuBUoA)&Oxpt?ey66>lCB{1ki*1aWAFFASTodbGg#(4UJzX3_EKVmU zNX$FX;rL=dYx9kIjp>r}qtwCZs(Oc#wRf?2(n Date: Sat, 1 Nov 2014 20:57:08 +0100 Subject: [PATCH 071/129] Fix low durability ammos (javelins) possibly having 0 max ammo --- src/main/java/tconstruct/library/weaponry/AmmoItem.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/tconstruct/library/weaponry/AmmoItem.java b/src/main/java/tconstruct/library/weaponry/AmmoItem.java index 7a8d0980d2e..196e814ca4b 100644 --- a/src/main/java/tconstruct/library/weaponry/AmmoItem.java +++ b/src/main/java/tconstruct/library/weaponry/AmmoItem.java @@ -37,7 +37,7 @@ public int getMaxAmmo(ItemStack stack) { @Override public int getMaxAmmo(NBTTagCompound tags) { float dur = tags.getInteger("TotalDurability"); - return (int)Math.ceil(dur*getAmmoModifier()); + return Math.max(1, (int)Math.ceil(dur*getAmmoModifier())); } @Override From f94d9bf3515b09d13f9e17bac887206b87ed1b84 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sat, 1 Nov 2014 20:57:20 +0100 Subject: [PATCH 072/129] Fix moss modifier using up ammo instead of adding it --- src/main/java/tconstruct/weaponry/WeaponryActiveToolMod.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/tconstruct/weaponry/WeaponryActiveToolMod.java b/src/main/java/tconstruct/weaponry/WeaponryActiveToolMod.java index 90d72532507..dfdbd5a9c43 100644 --- a/src/main/java/tconstruct/weaponry/WeaponryActiveToolMod.java +++ b/src/main/java/tconstruct/weaponry/WeaponryActiveToolMod.java @@ -14,7 +14,7 @@ public boolean damageTool(ItemStack stack, int damage, EntityLivingBase entity) IAmmo ammo =(IAmmo)stack.getItem(); if(tags.getInteger("Damage") == 0) { - int rem = ammo.consumeAmmo(1, stack); + int rem = ammo.addAmmo(1, stack); if(rem > 0) return true; } From d26f176defc18fe95e48228a3bd738da3d698b05 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sat, 1 Nov 2014 21:28:24 +0100 Subject: [PATCH 073/129] Increase weight and weight-to-arpen ratio for bolts --- .../java/tconstruct/weaponry/WeaponryHandler.java | 2 +- .../java/tconstruct/weaponry/entity/ArrowEntity.java | 11 ++++++++--- .../java/tconstruct/weaponry/entity/BoltEntity.java | 5 +++++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/tconstruct/weaponry/WeaponryHandler.java b/src/main/java/tconstruct/weaponry/WeaponryHandler.java index cd35f487258..57db051c3f8 100644 --- a/src/main/java/tconstruct/weaponry/WeaponryHandler.java +++ b/src/main/java/tconstruct/weaponry/WeaponryHandler.java @@ -98,7 +98,7 @@ else if(event.tool instanceof BoltAmmo) fletching = (FletchingMaterial) TConstructRegistry.getCustomMaterial(tags.getInteger("Accessory"), FletchlingLeafMaterial.class); int durability = (int)((float)headMat.durability() * coreMat.handleDurability() * fletching.durabilityModifier); - float weight = head.mass + core.mass; + float weight = head.mass + core.mass*1.5f; float accuracy = fletching.accuracy; float breakChance = fletching.breakChance*3; float shoddy = (headMat.shoddy() + coreMat.shoddy())/2f; diff --git a/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java b/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java index b963c932ffc..2f3041bdb7e 100644 --- a/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java +++ b/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java @@ -73,20 +73,23 @@ protected void playHitEntitySound() { @Override public boolean dealDamage(float damage, ToolCore ammo, NBTTagCompound tags, Entity entityHit) { - boolean dealtDamage; + boolean dealtDamage = false; //Minecraft.getMinecraft().thePlayer.sendChatMessage("Damage/Weight: " + damage + " - " + tags.getFloat("Mass")); // we take the weight, and shift the damage done towards armor piercing, the more weight the arrow/bolt has! - float shift = (tags.getFloat("Mass") - 0.7f); + float shift = (tags.getFloat("Mass") - 0.7f)*armorPenetrationModifier(); if(shift < 0) shift = 0; if(shift > damage) shift = damage; + damage -= shift; + // deal regular damage - dealtDamage = super.dealDamage(damage-shift, ammo, tags, entityHit); + if(damage > 0) + dealtDamage = super.dealDamage(damage, ammo, tags, entityHit); // deal armor piercing damage if(shift > 0) { @@ -103,4 +106,6 @@ public boolean dealDamage(float damage, ToolCore ammo, NBTTagCompound tags, Enti return dealtDamage; } + + protected float armorPenetrationModifier() { return 1.0f; } } diff --git a/src/main/java/tconstruct/weaponry/entity/BoltEntity.java b/src/main/java/tconstruct/weaponry/entity/BoltEntity.java index 82dccd44dc3..9e5936d32fc 100644 --- a/src/main/java/tconstruct/weaponry/entity/BoltEntity.java +++ b/src/main/java/tconstruct/weaponry/entity/BoltEntity.java @@ -24,4 +24,9 @@ public BoltEntity(World world, EntityPlayer player, float speed, float accuracy, protected void playHitBlockSound(int x, int y, int z) { this.playSound("random.bowhit", 1.0F, 1.0F); } + + @Override + protected float armorPenetrationModifier() { + return 1.5f; + } } From 83e1a33bc779eac88f1e8117a75e3d6446a38eeb Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 2 Nov 2014 18:19:17 +0100 Subject: [PATCH 074/129] Fix Shuriken damage calculation only taking the first part into account >_> --- .../tconstruct/weaponry/weapons/Shuriken.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/tconstruct/weaponry/weapons/Shuriken.java b/src/main/java/tconstruct/weaponry/weapons/Shuriken.java index 6f36c6532c2..09124a75ba0 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Shuriken.java +++ b/src/main/java/tconstruct/weaponry/weapons/Shuriken.java @@ -27,7 +27,7 @@ public Shuriken() { @Override public float getDamageModifier() { - return 0.4f; + return 0.8f; } @Override @@ -35,6 +35,21 @@ public int getPartAmount() { return 4; } + @Override + public int durabilityTypeHandle() { + return 2; + } + + @Override + public int durabilityTypeAccessory() { + return 2; + } + + @Override + public int durabilityTypeExtra() { + return 2; + } + @Override public String getIconSuffix(int partType) { switch (partType) @@ -174,4 +189,6 @@ public void registerIcons(IIconRegister iconRegister) { public CrosshairType getCrosshairType() { return CrosshairType.TIP; } + + } From 02ede76be81696a9e69de193856bf244faf9d29a Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Tue, 4 Nov 2014 15:44:22 +0100 Subject: [PATCH 075/129] Fix DualHarvest Tools and hide in a corner --- src/main/java/tconstruct/library/tools/DualHarvestTool.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/tconstruct/library/tools/DualHarvestTool.java b/src/main/java/tconstruct/library/tools/DualHarvestTool.java index bfc39df8c59..aa4bf76a045 100644 --- a/src/main/java/tconstruct/library/tools/DualHarvestTool.java +++ b/src/main/java/tconstruct/library/tools/DualHarvestTool.java @@ -57,7 +57,7 @@ public float getDigSpeed (ItemStack stack, Block block, int meta) if (materials[i] == block.getMaterial()) { if (block.getHarvestLevel(meta) <= tags.getInteger("HarvestLevel")) - AbilityHelper.calcDualToolSpeed(this, tags, false); + return AbilityHelper.calcDualToolSpeed(this, tags, false); return 0.1f; } } @@ -67,7 +67,7 @@ public float getDigSpeed (ItemStack stack, Block block, int meta) if (materials[i] == block.getMaterial()) { if (block.getHarvestLevel(meta) <= tags.getInteger("HarvestLevel2")) - AbilityHelper.calcDualToolSpeed(this, tags, true); + return AbilityHelper.calcDualToolSpeed(this, tags, true); return 0.1f; } } From 936e0483da0ed4ca6e4f826fdf80be2783220764 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Tue, 4 Nov 2014 19:31:43 +0100 Subject: [PATCH 076/129] Fix arrowheads not being craftable --- .../tconstruct/weaponry/TinkerWeaponry.java | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java index 974d5c3e57c..5d11159126d 100644 --- a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java +++ b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java @@ -193,9 +193,9 @@ private void addPartRecipies() Item[] patternOutputs = new Item[] { partShuriken, partCrossbowLimb, partCrossbowBody, partBowLimb }; // register part crafting - for (int m = 0; m < patternOutputs.length; m++) - for (int nonMetal : nonMetals) - TConstructRegistry.addPartMapping(woodPattern, m, nonMetal, new ItemStack(patternOutputs[m], 1, nonMetal)); + for (int m = 0; m < patternOutputs.length; m++) + for (int nonMetal : nonMetals) + TConstructRegistry.addPartMapping(woodPattern, m, nonMetal, new ItemStack(patternOutputs[m], 1, nonMetal)); // register part casting LiquidCasting tableCasting = TConstructRegistry.getTableCasting(); @@ -216,6 +216,22 @@ private void addPartRecipies() } } + // arrowhead is still integrated in tinkertools.. bla n stuff + for (int nonMetal : nonMetals) + TConstructRegistry.addPartMapping(TinkerTools.woodPattern, 25, nonMetal, new ItemStack(arrowhead, 1, nonMetal)); + + ItemStack cast = new ItemStack(TinkerSmeltery.metalPattern, 1, 25); + tableCasting.addCastingRecipe(cast, new FluidStack(TinkerSmeltery.moltenAlubrassFluid, TConstruct.ingotLiquidValue), new ItemStack(arrowhead, 1, Short.MAX_VALUE), false, 50); + tableCasting.addCastingRecipe(cast, new FluidStack(TinkerSmeltery.moltenGoldFluid, TConstruct.ingotLiquidValue * 2), new ItemStack(arrowhead, 1, Short.MAX_VALUE), false, 50); + + for (int iterTwo = 0; iterTwo < TinkerSmeltery.liquids.length; iterTwo++) + { + Fluid fs = TinkerSmeltery.liquids[iterTwo].getFluid(); + int fluidAmount = ((IPattern) TinkerSmeltery.metalPattern).getPatternCost(cast) * TConstruct.ingotLiquidValue / 2; + ItemStack metalCast = new ItemStack(arrowhead, 1, liquidDamage[iterTwo]); + tableCasting.addCastingRecipe(metalCast, new FluidStack(fs, fluidAmount), cast, 50); + Smeltery.addMelting(FluidType.getFluidType(fs), metalCast, 0, fluidAmount); + } } private void registerLegendaries() From 253dde7cce277144c1a3576375d27af9dbd303ec Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Thu, 6 Nov 2014 23:06:09 +0100 Subject: [PATCH 077/129] Change the accuraccy stuff to not call clientside methods serverside >_> --- .../java/tconstruct/library/weaponry/AmmoWeapon.java | 11 ++++++----- .../java/tconstruct/library/weaponry/IAccuracy.java | 2 +- .../java/tconstruct/weaponry/weapons/Shuriken.java | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java b/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java index b540e760c5f..026749bed5e 100644 --- a/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java +++ b/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java @@ -67,6 +67,7 @@ public float getWindupProgress(ItemStack itemStack, int timeInUse) public float minAccuracy(ItemStack itemStack) { return 0.5f; } public float maxAccuracy(ItemStack itemStack) { return 0.5f; } + @SideOnly(Side.CLIENT) public float getWindupProgress(ItemStack itemStack, EntityPlayer player) { // what are you doing! @@ -80,11 +81,11 @@ public float getWindupProgress(ItemStack itemStack, EntityPlayer player) return getWindupProgress(itemStack, getMaxItemUseDuration(itemStack) - player.getItemInUseCount()); } - public float getAccuracy(ItemStack itemStack, EntityPlayer player) + public float getAccuracy(ItemStack itemStack, int time) { float dif = minAccuracy(itemStack) - maxAccuracy(itemStack); - return minAccuracy(itemStack) - dif * getWindupProgress(itemStack, player); + return minAccuracy(itemStack) - dif * getWindupProgress(itemStack, time); } @Override @@ -96,16 +97,16 @@ public String[] getTraits() { public void onPlayerStoppedUsing(ItemStack stack, World world, EntityPlayer player, int durationLeft) { int time = this.getMaxItemUseDuration(stack) - durationLeft; if(getWindupProgress(stack, time) >= getMinWindupProgress(stack)) - launchProjectile(stack, world, player); + launchProjectile(stack, world, player, time); } - protected void launchProjectile(ItemStack stack, World world, EntityPlayer player) { + protected void launchProjectile(ItemStack stack, World world, EntityPlayer player, int time) { // spawn projectile on server if(!world.isRemote) { ItemStack reference = stack.copy(); reference.stackSize = 1; reference.getTagCompound().getCompoundTag("InfiTool").setInteger("Ammo", 1); - Entity projectile = createProjectile(reference, world, player, getAccuracy(stack, player)); + Entity projectile = createProjectile(reference, world, player, getAccuracy(stack, time)); world.spawnEntityInWorld(projectile); } diff --git a/src/main/java/tconstruct/library/weaponry/IAccuracy.java b/src/main/java/tconstruct/library/weaponry/IAccuracy.java index 07bae711586..764ce990f26 100644 --- a/src/main/java/tconstruct/library/weaponry/IAccuracy.java +++ b/src/main/java/tconstruct/library/weaponry/IAccuracy.java @@ -6,5 +6,5 @@ public interface IAccuracy { public float minAccuracy(ItemStack itemStack); public float maxAccuracy(ItemStack itemStack); - public float getAccuracy(ItemStack itemStack, EntityPlayer player); + public float getAccuracy(ItemStack itemStack, int time); } diff --git a/src/main/java/tconstruct/weaponry/weapons/Shuriken.java b/src/main/java/tconstruct/weaponry/weapons/Shuriken.java index 09124a75ba0..d0bf8328fab 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Shuriken.java +++ b/src/main/java/tconstruct/weaponry/weapons/Shuriken.java @@ -119,7 +119,7 @@ public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer pla if(getAmmoCount(stack) <= 0) return stack; - launchProjectile(stack, world, player); + launchProjectile(stack, world, player, 1); // this is only used for the animation player.setItemInUse(stack, this.getMaxItemUseDuration(stack)); From 2b161aa0bb6eee0d1cffb5104c8dfe1343937e3a Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Thu, 6 Nov 2014 23:14:38 +0100 Subject: [PATCH 078/129] Buff crossbow projectile speed, nerf lognbow proj. speed and move the proper modifications into the stats of the weapon --- .../tconstruct/library/weaponry/ProjectileWeapon.java | 4 +--- src/main/java/tconstruct/weaponry/WeaponryHandler.java | 10 ++++++++-- .../java/tconstruct/weaponry/weapons/Crossbow.java | 5 ----- src/main/java/tconstruct/weaponry/weapons/LongBow.java | 5 ----- 4 files changed, 9 insertions(+), 15 deletions(-) diff --git a/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java b/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java index 2c73e84153c..f6b4a7c11f3 100644 --- a/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java +++ b/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java @@ -118,11 +118,9 @@ public float getWindupProgress(ItemStack itemStack, int timeInUse) public float getProjectileSpeed(ItemStack itemStack) { NBTTagCompound toolTag = itemStack.getTagCompound().getCompoundTag("InfiTool"); - return toolTag.getFloat("FlightSpeed") * projectileSpeedModifier(itemStack); + return toolTag.getFloat("FlightSpeed"); } - protected float projectileSpeedModifier(ItemStack itemStack) { return 1.0f; } - /* Bow usage */ @Override public EnumAction getItemUseAction(ItemStack par1ItemStack) { diff --git a/src/main/java/tconstruct/weaponry/WeaponryHandler.java b/src/main/java/tconstruct/weaponry/WeaponryHandler.java index 57db051c3f8..416279d5cd1 100644 --- a/src/main/java/tconstruct/weaponry/WeaponryHandler.java +++ b/src/main/java/tconstruct/weaponry/WeaponryHandler.java @@ -138,11 +138,14 @@ public void onProjectileWeaponCrafted(ToolCraftEvent.NormalTool event) flightSpeed = (top.flightSpeedMax + bottom.flightSpeedMax)/2 * string.flightSpeedModifier; // SHORT bows have a SHORTER windup because they're SHORT. hahahaha.... get it? - if(event.tool instanceof ShortBow) + if(event.tool instanceof ShortBow) { drawSpeed *= 0.9; + } // longbows have LONGER drawspeed. LOGIC! - if(event.tool instanceof LongBow) + if(event.tool instanceof LongBow) { drawSpeed *= 1.5f; + flightSpeed *= 1.3f; + } } else if(event.tool instanceof Crossbow) { @@ -155,6 +158,9 @@ else if(event.tool instanceof Crossbow) // crossbows are more efficient the higher the base drawspeed is. So the higher the drawspeed, the more bonus you get drawSpeed *= 2.5f; drawSpeed -= drawSpeed*0.25f; + + // crossbows are stronk + flightSpeed *= 1.5; } else return; diff --git a/src/main/java/tconstruct/weaponry/weapons/Crossbow.java b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java index 90a1f3175f4..85901261eac 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Crossbow.java +++ b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java @@ -55,11 +55,6 @@ public float getMinWindupProgress(ItemStack itemStack) { return 1.0f; } - @Override - public float getProjectileSpeed(ItemStack itemStack) { - return super.getProjectileSpeed(itemStack); - } - @Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { NBTTagCompound tags = stack.getTagCompound().getCompoundTag("InfiTool"); diff --git a/src/main/java/tconstruct/weaponry/weapons/LongBow.java b/src/main/java/tconstruct/weaponry/weapons/LongBow.java index fda84eaa76f..256deb1c1db 100644 --- a/src/main/java/tconstruct/weaponry/weapons/LongBow.java +++ b/src/main/java/tconstruct/weaponry/weapons/LongBow.java @@ -31,11 +31,6 @@ public float getZoom(ItemStack itemStack) { return 1.7f; } - @Override - protected float projectileSpeedModifier(ItemStack itemStack) { - return 1.5f; - } - @Override protected Entity createProjectile(ItemStack arrows, World world, EntityPlayer player, float speed, float accuracy) { if(arrows.getItem() instanceof ArrowAmmo) From c5789432a3f88eb55cc54c49304bcbf837e2f2ed Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Thu, 6 Nov 2014 23:18:09 +0100 Subject: [PATCH 079/129] Nerf metal bow drawing times --- .../tconstruct/weaponry/TinkerWeaponry.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java index 5d11159126d..ffd5f0559bc 100644 --- a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java +++ b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java @@ -252,20 +252,20 @@ private void registerMaterials() TConstructRegistry.addBowMaterial(MaterialID.BlueSlime, 21, 4.0f); // Blue Slime TConstructRegistry.addBowMaterial(MaterialID.Paper, 25, 2.3f); // Paper // Metal stuff has a lot of POW, but takes LONG to wind up since it's so hard - TConstructRegistry.addBowMaterial(MaterialID.Iron, 40, 5.2f); // Iron - TConstructRegistry.addBowMaterial(MaterialID.Steel, 50, 5.5f); // Steel - TConstructRegistry.addBowMaterial(MaterialID.PigIron, 30, 5.2f); // Pig Iron - it's meat! - TConstructRegistry.addBowMaterial(MaterialID.Ardite, 50, 4.5f); // Ardite - TConstructRegistry.addBowMaterial(MaterialID.Cobalt, 35, 5.2f); // Cobalt - TConstructRegistry.addBowMaterial(MaterialID.Manyullyn, 45, 4.5f); // Manyullyn - TConstructRegistry.addBowMaterial(MaterialID.Copper, 30, 5.1f); // Copper - TConstructRegistry.addBowMaterial(MaterialID.Bronze, 35, 5.2f); // Bronze - TConstructRegistry.addBowMaterial(MaterialID.Alumite, 35, 4.8f); // Alumite - a bit stone-ish since it has obsidian + TConstructRegistry.addBowMaterial(MaterialID.Iron, 50, 5.2f); // Iron + TConstructRegistry.addBowMaterial(MaterialID.Steel, 60, 5.5f); // Steel + TConstructRegistry.addBowMaterial(MaterialID.PigIron, 40, 5.2f); // Pig Iron - it's meat! + TConstructRegistry.addBowMaterial(MaterialID.Ardite, 60, 4.5f); // Ardite + TConstructRegistry.addBowMaterial(MaterialID.Cobalt, 45, 5.2f); // Cobalt + TConstructRegistry.addBowMaterial(MaterialID.Manyullyn, 55, 4.5f); // Manyullyn + TConstructRegistry.addBowMaterial(MaterialID.Copper, 40, 5.1f); // Copper + TConstructRegistry.addBowMaterial(MaterialID.Bronze, 45, 5.2f); // Bronze + TConstructRegistry.addBowMaterial(MaterialID.Alumite, 45, 4.8f); // Alumite - a bit stone-ish since it has obsidian // Stone doesn't bend. takes forever, has no pow. WHY WOULD YOU DO THAT - TConstructRegistry.addBowMaterial(MaterialID.Stone, 80, 1.0f); // Stone - TConstructRegistry.addBowMaterial(MaterialID.Flint, 80, 1.0f); // Flint - TConstructRegistry.addBowMaterial(MaterialID.Obsidian, 99, 1.0f); // Obsidian - TConstructRegistry.addBowMaterial(MaterialID.Netherrack, 70, 1.0f); // Netherrack + TConstructRegistry.addBowMaterial(MaterialID.Stone, 90, 1.0f); // Stone + TConstructRegistry.addBowMaterial(MaterialID.Flint, 90, 1.0f); // Flint + TConstructRegistry.addBowMaterial(MaterialID.Obsidian, 109, 1.0f); // Obsidian + TConstructRegistry.addBowMaterial(MaterialID.Netherrack, 80, 1.0f); // Netherrack // Arrow Head Materials: Material ID, mass, fragility TConstructRegistry.addArrowMaterial(MaterialID.Wood, 0.69F, 1.0F); //Wood From cbcac3b5f0bdf26c6c1aaa4c9ac90508b5b02ec1 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sat, 8 Nov 2014 11:38:31 +0100 Subject: [PATCH 080/129] Fix ammo items getting damage on death --- src/main/java/tconstruct/weaponry/WeaponryActiveToolMod.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/tconstruct/weaponry/WeaponryActiveToolMod.java b/src/main/java/tconstruct/weaponry/WeaponryActiveToolMod.java index dfdbd5a9c43..87187a450ed 100644 --- a/src/main/java/tconstruct/weaponry/WeaponryActiveToolMod.java +++ b/src/main/java/tconstruct/weaponry/WeaponryActiveToolMod.java @@ -29,6 +29,9 @@ else if(ammo.getAmmoCount(stack) > 0) } } } + // all other ammo items can't be damaged + else if(stack.getItem() instanceof IAmmo) + return true; return false; } From 388823599b0a634ef6eb6dc24bc87732663b090d Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sat, 8 Nov 2014 14:15:20 +0100 Subject: [PATCH 081/129] Possible fix for the clientside arrow-movement desync --- .../java/tconstruct/library/entity/ProjectileBase.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/tconstruct/library/entity/ProjectileBase.java b/src/main/java/tconstruct/library/entity/ProjectileBase.java index cf9777e121b..5cf95a55584 100644 --- a/src/main/java/tconstruct/library/entity/ProjectileBase.java +++ b/src/main/java/tconstruct/library/entity/ProjectileBase.java @@ -567,6 +567,11 @@ public void writeSpawnData(ByteBuf data) { // shooting entity int id = shootingEntity == null ? this.getEntityId() : shootingEntity.getEntityId(); data.writeInt(id); + + // motion stuff. This has to be sent separately since MC seems to do hardcoded stuff to arrows with this + data.writeDouble(this.motionX); + data.writeDouble(this.motionY); + data.writeDouble(this.motionZ); } @Override @@ -574,5 +579,9 @@ public void readSpawnData(ByteBuf data) { returnStack = ByteBufUtils.readItemStack(data); rotationYaw = data.readFloat(); shootingEntity = worldObj.getEntityByID(data.readInt()); + + this.motionX = data.readDouble(); + this.motionY = data.readDouble(); + this.motionZ = data.readDouble(); } } From 00c24208d510a88689d2f25e08c2266c12636c2a Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sat, 8 Nov 2014 14:34:16 +0100 Subject: [PATCH 082/129] Generalize handling of fiery stuff on tools --- .../library/tools/AbilityHelper.java | 52 ++++++++++--------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/src/main/java/tconstruct/library/tools/AbilityHelper.java b/src/main/java/tconstruct/library/tools/AbilityHelper.java index 08d6a6d1c03..07e83795c36 100644 --- a/src/main/java/tconstruct/library/tools/AbilityHelper.java +++ b/src/main/java/tconstruct/library/tools/AbilityHelper.java @@ -146,14 +146,6 @@ public static boolean onLeftClickEntity (ItemStack stack, EntityLivingBase playe { damage *= tool.getDamageModifier(); } - boolean var6 = false; - int fireAspect = EnchantmentHelper.getFireAspectModifier(player); - - if (entity instanceof EntityLivingBase && fireAspect > 0 && !entity.isBurning()) - { - var6 = true; - entity.setFire(1); - } if (broken) { @@ -250,23 +242,8 @@ public static boolean onLeftClickEntity (ItemStack stack, EntityLivingBase playe stack.getItem().hitEntity(stack, (EntityLivingBase) entity, player); } - if ((fireAspect > 0 || toolTags.hasKey("Fiery") || toolTags.hasKey("Lava")) && causedDamage) - { - fireAspect *= 4; - if (toolTags.hasKey("Fiery")) - { - fireAspect += toolTags.getInteger("Fiery") / 5 + 1; - } - if (toolTags.getBoolean("Lava")) - { - fireAspect += 3; - } - entity.setFire(fireAspect); - } - else if (var6) - { - entity.extinguish(); - } + if(causedDamage) + processFiery(player, entity, toolTags); } if (entity instanceof EntityPlayer) @@ -279,6 +256,31 @@ else if (var6) return false; } + public static void processFiery(Entity player, Entity target, NBTTagCompound toolTags) + { + // only living things burnnnn + if(!(target instanceof EntityLivingBase)) + return; + + int fireAspect = 0; + if(player instanceof EntityLivingBase) + fireAspect = EnchantmentHelper.getFireAspectModifier((EntityLivingBase)player); + + if ((fireAspect > 0 || toolTags.hasKey("Fiery") || toolTags.hasKey("Lava"))) + { + fireAspect *= 4; + if (toolTags.hasKey("Fiery")) + { + fireAspect += toolTags.getInteger("Fiery") / 5 + 1; + } + if (toolTags.getBoolean("Lava")) + { + fireAspect += 3; + } + target.setFire(fireAspect); + } + } + static void alertPlayerWolves (EntityPlayer player, EntityLivingBase living, boolean par2) { if (!(living instanceof EntityCreeper) && !(living instanceof EntityGhast)) From f7069f8eb04899f5331e2cf0c1dd6ab91add7e3d Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sat, 8 Nov 2014 14:34:53 +0100 Subject: [PATCH 083/129] Fix fiery not working on projectiles and blaze rod shafts not giving fiery --- src/main/java/tconstruct/library/entity/ProjectileBase.java | 3 +++ src/main/java/tconstruct/weaponry/WeaponryHandler.java | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/src/main/java/tconstruct/library/entity/ProjectileBase.java b/src/main/java/tconstruct/library/entity/ProjectileBase.java index 5cf95a55584..b32b00eb35d 100644 --- a/src/main/java/tconstruct/library/entity/ProjectileBase.java +++ b/src/main/java/tconstruct/library/entity/ProjectileBase.java @@ -242,6 +242,9 @@ public void onHitEntity(MovingObjectPosition movingobjectposition) { defused = true; return; } + // we hit it, BURNNNNNN + else + AbilityHelper.processFiery(shootingEntity, movingobjectposition.entityHit, tags); if (movingobjectposition.entityHit instanceof EntityLivingBase) diff --git a/src/main/java/tconstruct/weaponry/WeaponryHandler.java b/src/main/java/tconstruct/weaponry/WeaponryHandler.java index 416279d5cd1..89d982b5cd1 100644 --- a/src/main/java/tconstruct/weaponry/WeaponryHandler.java +++ b/src/main/java/tconstruct/weaponry/WeaponryHandler.java @@ -80,6 +80,12 @@ public void onAmmoCrafted(ToolCraftEvent.NormalTool event) float breakChance = shaft.fragility + fletching.breakChance; setAmmoData(tags, durability, weight, breakChance, accuracy, head.shoddy(), head.reinforced()); + + // Blaze shafts give fiery + if(tags.getInteger("Handle") == 3) + { + tags.setInteger("Fiery", 5); + } } else if(event.tool instanceof BoltAmmo) { From 9a3120573ea275489dfd79b1fd663fd3bc0d95d8 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sat, 8 Nov 2014 15:13:59 +0100 Subject: [PATCH 084/129] Generalize damage and knockback calculations --- .../library/tools/AbilityHelper.java | 125 +++++++++++------- 1 file changed, 77 insertions(+), 48 deletions(-) diff --git a/src/main/java/tconstruct/library/tools/AbilityHelper.java b/src/main/java/tconstruct/library/tools/AbilityHelper.java index 07e83795c36..25cbcdc1a0a 100644 --- a/src/main/java/tconstruct/library/tools/AbilityHelper.java +++ b/src/main/java/tconstruct/library/tools/AbilityHelper.java @@ -62,7 +62,6 @@ public static boolean onLeftClickEntity (ItemStack stack, EntityLivingBase playe { NBTTagCompound tags = stack.getTagCompound(); NBTTagCompound toolTags = stack.getTagCompound().getCompoundTag("InfiTool"); - int damage = toolTags.getInteger("Attack") + baseDamage; boolean broken = toolTags.getBoolean("Broken"); int durability = tags.getCompoundTag("InfiTool").getInteger("Damage"); @@ -70,61 +69,17 @@ public static boolean onLeftClickEntity (ItemStack stack, EntityLivingBase playe float stoneboundDamage = (float) Math.log(durability / 72f + 1) * -2 * stonebound; - int earlyModDamage = 0; - for (ActiveToolMod mod : TConstructRegistry.activeModifiers) - { - earlyModDamage = mod.baseAttackDamage(earlyModDamage, damage, tool, tags, toolTags, stack, player, entity); - } - damage += earlyModDamage; - - if (player.isPotionActive(Potion.damageBoost)) - { - damage += 3 << player.getActivePotionEffect(Potion.damageBoost).getAmplifier(); - } - - if (player.isPotionActive(Potion.weakness)) - { - damage -= 2 << player.getActivePotionEffect(Potion.weakness).getAmplifier(); - } + int damage = calcDamage(player, entity, stack, tool, toolTags, baseDamage); + float knockback = calcKnockback(player, entity, stack, tool, toolTags, baseDamage); - float knockback = 0; float enchantDamage = 0; + // magic extra damage if (entity instanceof EntityLivingBase) { enchantDamage = EnchantmentHelper.getEnchantmentModifierLiving(player, (EntityLivingBase) entity); - knockback += EnchantmentHelper.getKnockbackModifier(player, (EntityLivingBase) entity); - } - - damage += stoneboundDamage; - if (damage < 1) - damage = 1; - - if (player.isSprinting()) - { - knockback++; - float lunge = tool.chargeAttack(); - if (lunge > 1f) - { - knockback += lunge - 1.0f; - damage *= lunge; - } } - float modKnockback = 0f; - for (ActiveToolMod mod : TConstructRegistry.activeModifiers) - { - modKnockback = mod.knockback(modKnockback, knockback, tool, tags, toolTags, stack, player, entity); - } - knockback += modKnockback; - - int modDamage = 0; - for (ActiveToolMod mod : TConstructRegistry.activeModifiers) - { - modDamage = mod.attackDamage(modDamage, damage, tool, tags, toolTags, stack, player, entity); - } - damage += modDamage; - if (damage > 0 || enchantDamage > 0) { boolean criticalHit = player.fallDistance > 0.0F && !player.onGround && !player.isOnLadder() && !player.isInWater() && !player.isPotionActive(Potion.blindness) && player.ridingEntity == null && entity instanceof EntityLivingBase; @@ -256,6 +211,80 @@ public static boolean onLeftClickEntity (ItemStack stack, EntityLivingBase playe return false; } + public static int calcDamage(Entity user, Entity entity, ItemStack stack, ToolCore tool, NBTTagCompound toolTags, int baseDamage) + { + EntityLivingBase living = user instanceof EntityLivingBase ? (EntityLivingBase)user : null; + + int damage = toolTags.getInteger("Attack") + baseDamage; + int earlyModDamage = 0; + for (ActiveToolMod mod : TConstructRegistry.activeModifiers) + { + earlyModDamage = mod.baseAttackDamage(earlyModDamage, damage, tool, stack.getTagCompound(), toolTags, stack, living, entity); + } + damage += earlyModDamage; + + if(living != null) { + if (living.isPotionActive(Potion.damageBoost)) { + damage += 3 << living.getActivePotionEffect(Potion.damageBoost).getAmplifier(); + } + + if (living.isPotionActive(Potion.weakness)) { + damage -= 2 << living.getActivePotionEffect(Potion.weakness).getAmplifier(); + } + } + + damage -= calcStoneboundBonus(tool, toolTags); + if (damage < 1) + damage = 1; + + if (user.isSprinting()) + { + float lunge = tool.chargeAttack(); + if (lunge > 1f) + { + damage *= lunge; + } + } + + int modDamage = 0; + for (ActiveToolMod mod : TConstructRegistry.activeModifiers) + { + modDamage = mod.attackDamage(modDamage, damage, tool, stack.getTagCompound(), toolTags, stack, living, entity); + } + damage += modDamage; + + return damage; + } + + public static float calcKnockback(Entity user, Entity entity, ItemStack stack, ToolCore tool, NBTTagCompound toolTags, int baseDamage) + { + float knockback = 0; + + if (entity instanceof EntityLivingBase && user instanceof EntityLivingBase) + { + knockback += EnchantmentHelper.getKnockbackModifier((EntityLivingBase)user, (EntityLivingBase) entity); + } + + if (user.isSprinting()) + { + knockback++; + float lunge = tool.chargeAttack(); + if (lunge > 1f) + { + knockback += lunge - 1.0f; + } + } + + float modKnockback = 0f; + for (ActiveToolMod mod : TConstructRegistry.activeModifiers) + { + modKnockback = mod.knockback(modKnockback, knockback, tool, stack.getTagCompound(), toolTags, stack, user instanceof EntityLivingBase ? (EntityLivingBase)user : null, entity); + } + knockback += modKnockback; + + return knockback; + } + public static void processFiery(Entity player, Entity target, NBTTagCompound toolTags) { // only living things burnnnn From e74bdae54bd4f9230c0b253aa8dd1fef7d4b7818 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Fri, 14 Nov 2014 15:14:25 +0100 Subject: [PATCH 085/129] .gitignore++ --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 11cd2fc271b..287e293b298 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ Thumbs.db /.gradle /build/ /run/ +/run*/ /ui/ gradle-app.setting #IDEA files from Gradle From c0f762221776b633be030a0dc63e308b27643030 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Fri, 14 Nov 2014 15:14:44 +0100 Subject: [PATCH 086/129] Fix weaponry parts using incorrect amounts of liquid stuff to cast --- src/main/java/tconstruct/weaponry/TinkerWeaponry.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java index ffd5f0559bc..6914533d5f2 100644 --- a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java +++ b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java @@ -209,7 +209,7 @@ private void addPartRecipies() for (int iterTwo = 0; iterTwo < TinkerSmeltery.liquids.length; iterTwo++) { Fluid fs = TinkerSmeltery.liquids[iterTwo].getFluid(); - int fluidAmount = ((IPattern) TinkerSmeltery.metalPattern).getPatternCost(cast) * TConstruct.ingotLiquidValue / 2; + int fluidAmount = metalPattern.getPatternCost(cast) * TConstruct.ingotLiquidValue / 2; ItemStack metalCast = new ItemStack(patternOutputs[i], 1, liquidDamage[iterTwo]); tableCasting.addCastingRecipe(metalCast, new FluidStack(fs, fluidAmount), cast, 50); Smeltery.addMelting(FluidType.getFluidType(fs), metalCast, 0, fluidAmount); From f3f31bc0458f98842dedc7efef2f1171fd1f33f5 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 16 Nov 2014 19:10:53 +0100 Subject: [PATCH 087/129] Add vanilla critical behaviour to the tinker bows (critical if fully drawn) --- src/main/java/tconstruct/library/weaponry/BowBaseAmmo.java | 5 ++++- .../java/tconstruct/library/weaponry/ProjectileWeapon.java | 4 ++-- src/main/java/tconstruct/weaponry/weapons/Crossbow.java | 4 ++-- src/main/java/tconstruct/weaponry/weapons/LongBow.java | 4 ++-- src/main/java/tconstruct/weaponry/weapons/ShortBow.java | 4 ++-- 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/main/java/tconstruct/library/weaponry/BowBaseAmmo.java b/src/main/java/tconstruct/library/weaponry/BowBaseAmmo.java index 14457f25f21..ee6452444f1 100644 --- a/src/main/java/tconstruct/library/weaponry/BowBaseAmmo.java +++ b/src/main/java/tconstruct/library/weaponry/BowBaseAmmo.java @@ -110,7 +110,7 @@ private boolean checkVanillaArrow(ItemStack stack) } @Override - protected Entity createProjectile(ItemStack arrows, World world, EntityPlayer player, float speed, float accuracy) { + protected Entity createProjectile(ItemStack arrows, World world, EntityPlayer player, float speed, float accuracy, float windup) { EntityArrow arrow; if(arrows.getItem() == Items.arrow) { @@ -126,6 +126,9 @@ protected Entity createProjectile(ItemStack arrows, World world, EntityPlayer pl if(player.capabilities.isCreativeMode) arrow.canBePickedUp = 2; + if(windup >= 1f) + arrow.setIsCritical(true); + return arrow; } diff --git a/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java b/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java index f6b4a7c11f3..acc1b6db1c1 100644 --- a/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java +++ b/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java @@ -67,7 +67,7 @@ public float getZoom(ItemStack itemStack) { * @param accuracy the accuracy calculated for the projectile * @return A banana. */ - protected abstract Entity createProjectile(ItemStack ammo, World world, EntityPlayer player, float speed, float accuracy); + protected abstract Entity createProjectile(ItemStack ammo, World world, EntityPlayer player, float speed, float accuracy, float windup); /* Accuracy */ @@ -177,7 +177,7 @@ public void onPlayerStoppedUsing (ItemStack weapon, World world, EntityPlayer pl // take windup time into account projectileSpeed *= windup; - Entity projectile = createProjectile(ammo, world, player, projectileSpeed, accuracy); + Entity projectile = createProjectile(ammo, world, player, projectileSpeed, accuracy, windup); int reinforced = 0; diff --git a/src/main/java/tconstruct/weaponry/weapons/Crossbow.java b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java index 85901261eac..33e8747af2f 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Crossbow.java +++ b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java @@ -216,7 +216,7 @@ public void fire(ItemStack weapon, World world, EntityPlayer player) float windup = getWindupTime(weapon); // max windup time float accuracy = getAccuracy(weapon, (int)windup); - Entity projectile = createProjectile(ammo, world, player, projectileSpeed, accuracy); + Entity projectile = createProjectile(ammo, world, player, projectileSpeed, accuracy, 1.0f); int reinforced = 0; @@ -256,7 +256,7 @@ public ItemStack searchForAmmo(EntityPlayer player, ItemStack weapon) { } @Override - protected Entity createProjectile(ItemStack ammo, World world, EntityPlayer player, float speed, float accuracy) { + protected Entity createProjectile(ItemStack ammo, World world, EntityPlayer player, float speed, float accuracy, float windup) { EntityArrow arrow; ItemStack reference = ammo.copy(); diff --git a/src/main/java/tconstruct/weaponry/weapons/LongBow.java b/src/main/java/tconstruct/weaponry/weapons/LongBow.java index 256deb1c1db..9ee0ab99c12 100644 --- a/src/main/java/tconstruct/weaponry/weapons/LongBow.java +++ b/src/main/java/tconstruct/weaponry/weapons/LongBow.java @@ -32,7 +32,7 @@ public float getZoom(ItemStack itemStack) { } @Override - protected Entity createProjectile(ItemStack arrows, World world, EntityPlayer player, float speed, float accuracy) { + protected Entity createProjectile(ItemStack arrows, World world, EntityPlayer player, float speed, float accuracy, float windup) { if(arrows.getItem() instanceof ArrowAmmo) { // modify accuraccy of the arrow depending on its accuraccy and weight @@ -46,7 +46,7 @@ protected Entity createProjectile(ItemStack arrows, World world, EntityPlayer pl accuracy = 0; } - return super.createProjectile(arrows, world, player, speed, accuracy); + return super.createProjectile(arrows, world, player, speed, accuracy, windup); } @Override diff --git a/src/main/java/tconstruct/weaponry/weapons/ShortBow.java b/src/main/java/tconstruct/weaponry/weapons/ShortBow.java index 111684c238d..11b4518fd2d 100644 --- a/src/main/java/tconstruct/weaponry/weapons/ShortBow.java +++ b/src/main/java/tconstruct/weaponry/weapons/ShortBow.java @@ -26,7 +26,7 @@ public float maxAccuracy(ItemStack itemStack) { } @Override - protected Entity createProjectile(ItemStack arrows, World world, EntityPlayer player, float speed, float accuracy) { + protected Entity createProjectile(ItemStack arrows, World world, EntityPlayer player, float speed, float accuracy, float windup) { if(arrows.getItem() instanceof ArrowAmmo) { // modify accuraccy of the arrow depending on its accuraccy and weight @@ -40,7 +40,7 @@ protected Entity createProjectile(ItemStack arrows, World world, EntityPlayer pl accuracy = 0; } - return super.createProjectile(arrows, world, player, speed, accuracy); + return super.createProjectile(arrows, world, player, speed, accuracy, windup); } @Override From 1fe8bb26f34808a044bb923d5769fdf726a00223 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 16 Nov 2014 19:19:47 +0100 Subject: [PATCH 088/129] Fix random crashes with a line that wasn't even used. No idea why that caused crashes. --- src/main/java/tconstruct/library/entity/ProjectileBase.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/tconstruct/library/entity/ProjectileBase.java b/src/main/java/tconstruct/library/entity/ProjectileBase.java index b32b00eb35d..d5b50a5e38e 100644 --- a/src/main/java/tconstruct/library/entity/ProjectileBase.java +++ b/src/main/java/tconstruct/library/entity/ProjectileBase.java @@ -563,7 +563,6 @@ public void readEntityFromNBT(NBTTagCompound tags) { @Override public void writeSpawnData(ByteBuf data) { - NBTTagCompound tags = returnStack.getTagCompound().getCompoundTag("InfiTool"); ByteBufUtils.writeItemStack(data, returnStack); data.writeFloat(rotationYaw); From 911755bef77745bb7ba367b179fe60f148d0649e Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 16 Nov 2014 21:08:06 +0100 Subject: [PATCH 089/129] Change windup-modifier to not allow going below 0.25 (was possible if the last application was more) --- src/main/java/tconstruct/modifiers/tools/ModWindup.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/tconstruct/modifiers/tools/ModWindup.java b/src/main/java/tconstruct/modifiers/tools/ModWindup.java index 3a5ca3314e9..a654b3d4b93 100644 --- a/src/main/java/tconstruct/modifiers/tools/ModWindup.java +++ b/src/main/java/tconstruct/modifiers/tools/ModWindup.java @@ -77,6 +77,7 @@ public void modify (ItemStack[] input, ItemStack tool) int baseDrawSpeed = tags.getInteger("BaseDrawSpeed"); int drawSpeed = baseDrawSpeed - (int)boost; + drawSpeed = Math.max(5, drawSpeed); // 0.25f is the minimum tags.setInteger("DrawSpeed", drawSpeed); } } From 6f0be6a3340941087a38cb8b70e3a66e11a117c2 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 16 Nov 2014 21:09:23 +0100 Subject: [PATCH 090/129] Fix the weird projectile movements for fast projectiles on clientside. Seriously Mojang, why would you randomly hardcap it there? To a value that's far from the types maximum? --- .../java/tconstruct/library/entity/ProjectileBase.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/tconstruct/library/entity/ProjectileBase.java b/src/main/java/tconstruct/library/entity/ProjectileBase.java index d5b50a5e38e..3a76971bd06 100644 --- a/src/main/java/tconstruct/library/entity/ProjectileBase.java +++ b/src/main/java/tconstruct/library/entity/ProjectileBase.java @@ -284,6 +284,13 @@ public boolean dealDamage(float damage, ToolCore ammo, NBTTagCompound tags, Enti return dealtDamage; } + @Override + public void setVelocity(double p_70016_1_, double p_70016_3_, double p_70016_5_) { + // don't do anything, we set it ourselves at spawn + // Mojangs code has a hard cap of 3.9 speed, but our projectiles can go faster, which desyncs client and server speeds + // Packet that's causing it: S12PacketEntityVelocity + } + @Override // this function is the same as the vanilla EntityArrow public void onUpdate() { From a4aecae14ef6e63e64f2449b1e2db3ebaac22f30 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 16 Nov 2014 21:09:48 +0100 Subject: [PATCH 091/129] Make longbows slower, but also stronger. --- src/main/java/tconstruct/weaponry/WeaponryHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/tconstruct/weaponry/WeaponryHandler.java b/src/main/java/tconstruct/weaponry/WeaponryHandler.java index 89d982b5cd1..35a91a617b0 100644 --- a/src/main/java/tconstruct/weaponry/WeaponryHandler.java +++ b/src/main/java/tconstruct/weaponry/WeaponryHandler.java @@ -149,8 +149,8 @@ public void onProjectileWeaponCrafted(ToolCraftEvent.NormalTool event) } // longbows have LONGER drawspeed. LOGIC! if(event.tool instanceof LongBow) { - drawSpeed *= 1.5f; - flightSpeed *= 1.3f; + drawSpeed *= 1.8f; + flightSpeed *= 1.5f; } } else if(event.tool instanceof Crossbow) From 4c26f857c751e84baf496aea4af5133387b411c7 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 16 Nov 2014 21:17:38 +0100 Subject: [PATCH 092/129] Fix Break-Chance display for arrows in toolstations etc. --- src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java b/src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java index eab364ca99d..288709323a3 100644 --- a/src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java +++ b/src/main/java/tconstruct/tools/gui/ToolStationGuiHelper.java @@ -260,7 +260,7 @@ private static void drawProjectileStats(NBTTagCompound tags) write(StatCollector.translateToLocal("gui.toolstation9") + df.format(accuracy) + "%"); // breakchance - final float breakChance = tags.getFloat("BreakChance"); + final float breakChance = tags.getFloat("BreakChance") * 100; write(StatCollector.translateToLocal("gui.toolstation22") + df.format(breakChance) + "%"); } From 6d9dc59f0febe3bcd1f2082d1e7cdfd5a92a99c3 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 16 Nov 2014 21:21:39 +0100 Subject: [PATCH 093/129] Fix damage for arrows/bolts not being displayed in stations --- src/main/java/tconstruct/modifiers/tools/ModLapis.java | 2 +- src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java | 2 +- src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/tconstruct/modifiers/tools/ModLapis.java b/src/main/java/tconstruct/modifiers/tools/ModLapis.java index 941bc894e27..8758769c0b7 100644 --- a/src/main/java/tconstruct/modifiers/tools/ModLapis.java +++ b/src/main/java/tconstruct/modifiers/tools/ModLapis.java @@ -218,6 +218,6 @@ void updateModTag (ItemStack tool, int[] keys) public boolean validType (ToolCore tool) { List list = Arrays.asList(tool.getTraits()); - return list.contains("weapon") || list.contains("harvest"); + return !list.contains("ammo") && (list.contains("weapon") || list.contains("harvest")); } } diff --git a/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java b/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java index b2652a12012..69030878b80 100644 --- a/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java +++ b/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java @@ -92,7 +92,7 @@ public int durabilityTypeHandle() { @Override public String[] getTraits () { - return new String[] { "ammo", "projectile" }; + return new String[] { "ammo", "projectile", "weapon" }; } @Override diff --git a/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java b/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java index 0e640f0a6f0..3df4432f81b 100644 --- a/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java +++ b/src/main/java/tconstruct/weaponry/ammo/BoltAmmo.java @@ -76,7 +76,7 @@ public Item getAccessoryItem() { @Override public String[] getTraits () { - return new String[] { "ammo", "projectile" }; + return new String[] { "ammo", "projectile", "weapon" }; } @Override From 83168aaee16c3beb34953da6e5468f64ad8f4b81 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 16 Nov 2014 21:33:14 +0100 Subject: [PATCH 094/129] Since we buffed longbow strength, we're now nerfing its accuracy! --- src/main/java/tconstruct/weaponry/weapons/LongBow.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/tconstruct/weaponry/weapons/LongBow.java b/src/main/java/tconstruct/weaponry/weapons/LongBow.java index 9ee0ab99c12..cc3982968d1 100644 --- a/src/main/java/tconstruct/weaponry/weapons/LongBow.java +++ b/src/main/java/tconstruct/weaponry/weapons/LongBow.java @@ -23,7 +23,7 @@ public float minAccuracy(ItemStack itemStack) { @Override public float maxAccuracy(ItemStack itemStack) { - return 0.5f; + return 3.33f; } @Override From 0756c25c70ded2e8f3eaa9249eb0ebb447055394 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 16 Nov 2014 21:39:53 +0100 Subject: [PATCH 095/129] Adjust projectile weights a bit --- src/main/java/tconstruct/weaponry/TinkerWeaponry.java | 10 +++++----- src/main/java/tconstruct/weaponry/WeaponryHandler.java | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java index 6914533d5f2..bfb48519774 100644 --- a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java +++ b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java @@ -270,10 +270,10 @@ private void registerMaterials() // Arrow Head Materials: Material ID, mass, fragility TConstructRegistry.addArrowMaterial(MaterialID.Wood, 0.69F, 1.0F); //Wood TConstructRegistry.addArrowMaterial(MaterialID.Stone, 2.05F, 5.0F); //Stone - TConstructRegistry.addArrowMaterial(MaterialID.Iron, 3.6F, 0.5F); //Iron + TConstructRegistry.addArrowMaterial(MaterialID.Iron, 3.3F, 0.5F); //Iron TConstructRegistry.addArrowMaterial(MaterialID.Flint, 1.325F, 1.0F); //Flint TConstructRegistry.addArrowMaterial(MaterialID.Cactus, 0.76F, 1.0F); //Cactus - TConstructRegistry.addArrowMaterial(MaterialID.Bone, 0.69F, 1.0F); //Bone + TConstructRegistry.addArrowMaterial(MaterialID.Bone, 1.69F, 1.0F); //Bone TConstructRegistry.addArrowMaterial(MaterialID.Obsidian, 2.4F, 1.0F); //Obsidian TConstructRegistry.addArrowMaterial(MaterialID.Netherrack, 1.5F, 1.0F); //Netherrack TConstructRegistry.addArrowMaterial(MaterialID.Slime, 0.22F, 0.0F); //Slime @@ -282,7 +282,7 @@ private void registerMaterials() TConstructRegistry.addArrowMaterial(MaterialID.Ardite, 1.25F, 0.25f); //Ardite TConstructRegistry.addArrowMaterial(MaterialID.Manyullyn, 2.25F, 0.1F); //Manyullyn TConstructRegistry.addArrowMaterial(MaterialID.Copper, 2.7F, 0.5F); //Copper - TConstructRegistry.addArrowMaterial(MaterialID.Bronze, 3.6F, 0.25f); //Bronze + TConstructRegistry.addArrowMaterial(MaterialID.Bronze, 3.2F, 0.25f); //Bronze TConstructRegistry.addArrowMaterial(MaterialID.Alumite, 1.1F, 0.25f); //Alumite TConstructRegistry.addArrowMaterial(MaterialID.Steel, 3.6F, 0.25f); //Steel TConstructRegistry.addArrowMaterial(MaterialID.BlueSlime, 0.22F, 0.0F); //Blue Slime @@ -290,12 +290,12 @@ private void registerMaterials() // Arrow Shaft Materials: Material ID, crafting item, durability-medifier, mass, fragility TConstructRegistry.addCustomMaterial(ArrowShaftMaterial.createMaterial(0, Items.stick, 1.0f, 1.0f, 0.15f, 0x866526)); // wood: reference material, 10% break chance - TConstructRegistry.addCustomMaterial(ArrowShaftMaterial.createMaterial(1, Items.bone, 0.95f, 1.4f, 0.02f, 0xede6bf)); // bone: heavier, but durable + TConstructRegistry.addCustomMaterial(ArrowShaftMaterial.createMaterial(1, Items.bone, 0.95f, 1.8f, 0.02f, 0xede6bf)); // bone: heavier, but durable TConstructRegistry.addCustomMaterial(ArrowShaftMaterial.createMaterial(2, Items.reeds, 1.5f, 0.5f, 0.66f, 0xc7ff87)); // reed: light, but less durable TConstructRegistry.addCustomMaterial(ArrowShaftMaterial.createMaterial(3, Items.blaze_rod, 1.2f, 0.9f, 0.08f, 0xfff32d)); // blaze: tad lighter, tad more durable, fieryyyy // also add the tool rod variants, same stats TConstructRegistry.addCustomMaterial(ArrowShaftMaterial.createMaterial(0, TinkerTools.toolRod, MaterialID.Wood, 1.0f, 1.0f, 0.15f, 0x866526)); // wood: reference material, 10% break chance - TConstructRegistry.addCustomMaterial(ArrowShaftMaterial.createMaterial(1, TinkerTools.toolRod, MaterialID.Bone, 0.95f, 1.2f, 0.01f, 0xede6bf)); // bone: heavier, but durable + TConstructRegistry.addCustomMaterial(ArrowShaftMaterial.createMaterial(1, TinkerTools.toolRod, MaterialID.Bone, 0.95f, 1.8f, 0.02f, 0xede6bf)); // bone: heavier, but durable // Arrow Fletching Materials TConstructRegistry.addFletchingMaterial(0, 2, new ItemStack(Items.feather), new ItemStack(TinkerWeaponry.fletching, 1, 0), 95F, 0.05F, 1.0f, 0xffffff); // Feather diff --git a/src/main/java/tconstruct/weaponry/WeaponryHandler.java b/src/main/java/tconstruct/weaponry/WeaponryHandler.java index 35a91a617b0..27f73e76e2e 100644 --- a/src/main/java/tconstruct/weaponry/WeaponryHandler.java +++ b/src/main/java/tconstruct/weaponry/WeaponryHandler.java @@ -75,7 +75,7 @@ public void onAmmoCrafted(ToolCraftEvent.NormalTool event) fletching = (FletchingMaterial) TConstructRegistry.getCustomMaterial(tags.getInteger("Accessory"), FletchlingLeafMaterial.class); int durability = (int)((float)head.durability() * shaft.durabilityModifier * fletching.durabilityModifier); - float weight = arrow.mass + shaft.weight/2f; + float weight = arrow.mass + shaft.weight; float accuracy = fletching.accuracy; float breakChance = shaft.fragility + fletching.breakChance; @@ -105,7 +105,7 @@ else if(event.tool instanceof BoltAmmo) int durability = (int)((float)headMat.durability() * coreMat.handleDurability() * fletching.durabilityModifier); float weight = head.mass + core.mass*1.5f; - float accuracy = fletching.accuracy; + float accuracy = (100f + fletching.accuracy)/2f; float breakChance = fletching.breakChance*3; float shoddy = (headMat.shoddy() + coreMat.shoddy())/2f; int reinforced = Math.max(headMat.reinforced(), coreMat.reinforced()); From 86ef2cee0af12dfd10ed167ad84cbda4c876dafd Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 16 Nov 2014 21:42:04 +0100 Subject: [PATCH 096/129] Reduce the amount of modifiers to 2 on arrows/bolts --- src/main/java/tconstruct/weaponry/WeaponryHandler.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/tconstruct/weaponry/WeaponryHandler.java b/src/main/java/tconstruct/weaponry/WeaponryHandler.java index 27f73e76e2e..720ac78136c 100644 --- a/src/main/java/tconstruct/weaponry/WeaponryHandler.java +++ b/src/main/java/tconstruct/weaponry/WeaponryHandler.java @@ -86,6 +86,8 @@ public void onAmmoCrafted(ToolCraftEvent.NormalTool event) { tags.setInteger("Fiery", 5); } + // arrows get only 2 modifiers + tags.setInteger("Modifiers", 2); } else if(event.tool instanceof BoltAmmo) { @@ -111,6 +113,7 @@ else if(event.tool instanceof BoltAmmo) int reinforced = Math.max(headMat.reinforced(), coreMat.reinforced()); setAmmoData(tags, durability, weight, breakChance, accuracy, shoddy, reinforced); + tags.setInteger("Modifiers", 2); } // now that durability has been handled... From 39206b231b37493a659d1e540389f81f860cc56d Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 16 Nov 2014 21:44:39 +0100 Subject: [PATCH 097/129] Tweak bow material stats a bit --- src/main/java/tconstruct/weaponry/TinkerWeaponry.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java index bfb48519774..3ed498b0f04 100644 --- a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java +++ b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java @@ -246,9 +246,9 @@ private void registerMaterials() // Wooden stuff is flexible, therefore good. Reference. TConstructRegistry.addBowMaterial(MaterialID.Wood, 18, 3.0f); // Wood // other organic materials also are good - TConstructRegistry.addBowMaterial(MaterialID.Cactus, 20, 2.4f); // Cactus + TConstructRegistry.addBowMaterial(MaterialID.Cactus, 20, 3.4f); // Cactus TConstructRegistry.addBowMaterial(MaterialID.Bone, 38, 2.0f); // Bone - TConstructRegistry.addBowMaterial(MaterialID.Slime, 28, 4.0f); // Slime + TConstructRegistry.addBowMaterial(MaterialID.Slime, 28, 4.1f); // Slime TConstructRegistry.addBowMaterial(MaterialID.BlueSlime, 21, 4.0f); // Blue Slime TConstructRegistry.addBowMaterial(MaterialID.Paper, 25, 2.3f); // Paper // Metal stuff has a lot of POW, but takes LONG to wind up since it's so hard @@ -260,7 +260,7 @@ private void registerMaterials() TConstructRegistry.addBowMaterial(MaterialID.Manyullyn, 55, 4.5f); // Manyullyn TConstructRegistry.addBowMaterial(MaterialID.Copper, 40, 5.1f); // Copper TConstructRegistry.addBowMaterial(MaterialID.Bronze, 45, 5.2f); // Bronze - TConstructRegistry.addBowMaterial(MaterialID.Alumite, 45, 4.8f); // Alumite - a bit stone-ish since it has obsidian + TConstructRegistry.addBowMaterial(MaterialID.Alumite, 45, 4.9f); // Alumite - a bit stone-ish since it has obsidian // Stone doesn't bend. takes forever, has no pow. WHY WOULD YOU DO THAT TConstructRegistry.addBowMaterial(MaterialID.Stone, 90, 1.0f); // Stone TConstructRegistry.addBowMaterial(MaterialID.Flint, 90, 1.0f); // Flint From c5dff65efa978c6fc0120de1973e7a1793a5e211 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 16 Nov 2014 21:53:16 +0100 Subject: [PATCH 098/129] Add fiery tooltip thingie to blaze arrows --- src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java b/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java index 69030878b80..012762a02a7 100644 --- a/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java +++ b/src/main/java/tconstruct/weaponry/ammo/ArrowAmmo.java @@ -1,5 +1,6 @@ package tconstruct.weaponry.ammo; +import net.minecraft.util.StatCollector; import tconstruct.TConstruct; import tconstruct.library.TConstructRegistry; import tconstruct.library.tools.ArrowMaterial; @@ -148,7 +149,10 @@ protected int getDefaultColor(int renderPass, int materialID) { // fix tooltip custom materials @Override public String getAbilityNameForType(int type, int part) { - if(part >= 1) // only head has ability + // blaze shaft? + if(part == 1 && type == 3) + return "\u00a76" + StatCollector.translateToLocal("modifier.tool.blaze"); + if(part >= 1) // only head has ability otherwise return ""; return super.getAbilityNameForType(type, part); } From 16138a8cf3ab984ef6a3b1175b514ac51e5d9a9d Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 16 Nov 2014 21:58:25 +0100 Subject: [PATCH 099/129] 10% crit chance for crossbows! --- src/main/java/tconstruct/weaponry/weapons/Crossbow.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/tconstruct/weaponry/weapons/Crossbow.java b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java index 33e8747af2f..3d7f3c90ff3 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Crossbow.java +++ b/src/main/java/tconstruct/weaponry/weapons/Crossbow.java @@ -1,5 +1,6 @@ package tconstruct.weaponry.weapons; +import tconstruct.TConstruct; import tconstruct.library.TConstructRegistry; import tconstruct.weaponry.TinkerWeaponry; import tconstruct.weaponry.ammo.BoltAmmo; @@ -267,6 +268,10 @@ protected Entity createProjectile(ItemStack ammo, World world, EntityPlayer play if(player.capabilities.isCreativeMode) arrow.canBePickedUp = 2; + // 10% crit hit chance! + if(!world.isRemote && TConstruct.random.nextFloat() < 0.1f) + arrow.setIsCritical(true); + return arrow; } From 08bdb0789a620b8364a85fe5f22b0a9fccf73aa3 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 16 Nov 2014 23:39:49 +0100 Subject: [PATCH 100/129] Remove the resizing for perfect dodge and add a 10% chance to dodge projectiles instead --- .../java/tconstruct/armor/ArmorAbilities.java | 33 ------------------- .../tconstruct/armor/TinkerArmorEvents.java | 22 +++++++++++++ 2 files changed, 22 insertions(+), 33 deletions(-) diff --git a/src/main/java/tconstruct/armor/ArmorAbilities.java b/src/main/java/tconstruct/armor/ArmorAbilities.java index 0bd1ab34a79..b6a5661fd15 100644 --- a/src/main/java/tconstruct/armor/ArmorAbilities.java +++ b/src/main/java/tconstruct/armor/ArmorAbilities.java @@ -21,11 +21,6 @@ public class ArmorAbilities { - //Abilities - boolean morphed; - boolean morphLoaded = Loader.isModLoaded("Morph"); - boolean smartmoveLoaded = Loader.isModLoaded("SmartMoving"); - public static List stepBoostedPlayers = new ArrayList(); //ItemStack prevFeet; double prevMotionY; @@ -91,34 +86,6 @@ else if (stepBoosted && (feet == null || !(feet.getItem() instanceof TravelGear) { stack.getItem().onUpdate(stack, player.worldObj, player, 8, true); }*/ - - if (morphLoaded) - { - if (morph.api.Api.hasMorph(player.getCommandSenderName(), event.side.isClient())) - { - morphed = true; - } - } - - if (!player.isPlayerSleeping() && !smartmoveLoaded) - { - ItemStack chest = player.getCurrentArmor(2); - if (chest == null || !(chest.getItem() instanceof IModifyable)) - { - if (!(morphLoaded && morphed)) - PlayerAbilityHelper.setEntitySize(player, 0.6F, 1.8F); - } - else - { - NBTTagCompound tag = chest.getTagCompound().getCompoundTag(((IModifyable) chest.getItem()).getBaseTagName()); - int dodge = tag.getInteger("Perfect Dodge"); - if (dodge > 0) - { - if (!(morphLoaded && morphed)) - PlayerAbilityHelper.setEntitySize(player, Math.max(0.15F, 0.6F - (dodge * 0.09f)), 1.8F - (dodge * 0.04f)); - } - } - } } diff --git a/src/main/java/tconstruct/armor/TinkerArmorEvents.java b/src/main/java/tconstruct/armor/TinkerArmorEvents.java index 0ba03176044..eb9b47f961e 100644 --- a/src/main/java/tconstruct/armor/TinkerArmorEvents.java +++ b/src/main/java/tconstruct/armor/TinkerArmorEvents.java @@ -5,6 +5,7 @@ import net.minecraft.entity.boss.*; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.monster.IMob; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.event.entity.living.*; @@ -103,4 +104,25 @@ public void slimefall (LivingFallEvent event) } } } + + @SubscribeEvent + public void perfectDodge(LivingAttackEvent event) + { + if(!event.source.isProjectile()) + return; + + // perfect dodge? + if(!(event.entityLiving instanceof EntityPlayer)) + return; + + EntityPlayer player = (EntityPlayer) event.entityLiving; + ItemStack chest = player.getCurrentArmor(2); + if(chest == null || !(chest.getItem() instanceof IModifyable) || !chest.hasTagCompound()) + return; + + NBTTagCompound tags = chest.getTagCompound().getCompoundTag(((IModifyable) chest.getItem()).getBaseTagName()); + int dodge = tags.getInteger("Perfect Dodge"); + if(dodge > TConstruct.random.nextInt(10)) + event.setCanceled(true); + } } From 811ad8739c9d535b449c87dac6e86c64b392c6f0 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Mon, 17 Nov 2014 00:35:26 +0100 Subject: [PATCH 101/129] Add bow and arrow stats to NEI for toolmaterials --- resources/assets/tinker/lang/en_US.lang | 1 + .../nei/RecipeHandlerToolMaterials.java | 45 +++++++++++++++++-- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/resources/assets/tinker/lang/en_US.lang b/resources/assets/tinker/lang/en_US.lang index 04fdaee43fc..17ebdfa6029 100644 --- a/resources/assets/tinker/lang/en_US.lang +++ b/resources/assets/tinker/lang/en_US.lang @@ -724,6 +724,7 @@ tconstruct.waila.subtanks=Subtanks: tconstruct.waila.invalidstructure=Invalid structure tconstruct.nei.toolmaterials=Tool Materials +tconstruct.nei.projectilematerials=Bow & Arrow tconstruct.nei.alloying=Smeltery Alloying tconstruct.nei.castingbasin=Casting Basin tconstruct.nei.castingtable=Casting Table diff --git a/src/main/java/tconstruct/plugins/nei/RecipeHandlerToolMaterials.java b/src/main/java/tconstruct/plugins/nei/RecipeHandlerToolMaterials.java index 1e3ee128145..15113caa43d 100644 --- a/src/main/java/tconstruct/plugins/nei/RecipeHandlerToolMaterials.java +++ b/src/main/java/tconstruct/plugins/nei/RecipeHandlerToolMaterials.java @@ -15,6 +15,8 @@ import tconstruct.library.crafting.PatternBuilder; import tconstruct.library.crafting.PatternBuilder.ItemKey; import tconstruct.library.crafting.PatternBuilder.MaterialSet; +import tconstruct.library.tools.ArrowMaterial; +import tconstruct.library.tools.BowMaterial; import tconstruct.library.tools.DynamicToolPart; import tconstruct.library.tools.ToolMaterial; import tconstruct.library.util.HarvestLevels; @@ -32,6 +34,8 @@ public class CachedToolMaterialsRecipe extends CachedBaseRecipe public List toolParts; public ToolMaterial material; + public BowMaterial bowMaterial; + public ArrowMaterial arrowMaterial; public CachedToolMaterialsRecipe(List toolParts, int materialID) { @@ -43,6 +47,17 @@ public CachedToolMaterialsRecipe(List toolParts, int materialID) this.material = TConstructRegistry.getMaterial(materialID); } + public CachedToolMaterialsRecipe(List toolParts, int materialID, boolean arrowBow) + { + this.toolParts = new ArrayList(); + for (ItemStack stack : toolParts) + { + this.toolParts.add(new PositionedStack(stack, 10, 10)); + } + this.arrowMaterial = TConstructRegistry.getArrowMaterial(materialID); + this.bowMaterial = TConstructRegistry.getBowMaterial(materialID); + } + @Override public PositionedStack getIngredient () { @@ -135,6 +150,23 @@ public void drawExtras (int recipe) } } } + if (crecipe.bowMaterial != null) + { + int y = 20; + int x = 35; + GuiDraw.drawString(EnumChatFormatting.BOLD + StatCollector.translateToLocal("tconstruct.nei.projectilematerials"), 35, 10, 0x404040, false); + GuiDraw.drawString(StatCollector.translateToLocal("gui.toolstation6") + crecipe.bowMaterial.drawspeed, x, y, 0x404040, false); + y += 10; + GuiDraw.drawString(StatCollector.translateToLocal("gui.toolstation7") + crecipe.bowMaterial.flightSpeedMax, x, y, 0x404040, false); + } + if (crecipe.arrowMaterial != null) + { + int y = 50; + int x = 35; + GuiDraw.drawString(StatCollector.translateToLocal("gui.toolstation8") + crecipe.arrowMaterial.mass, x, y, 0x404040, false); + y += 10; + GuiDraw.drawString(StatCollector.translateToLocal("gui.toolstation22") + crecipe.arrowMaterial.breakChance, x, y, 0x404040, false); + } } @Override @@ -146,6 +178,7 @@ public void loadCraftingRecipes (String outputId, Object... results) for (int matID : TConstructRegistry.toolMaterials.keySet()) { List toolParts = new ArrayList(); + mat = TConstructRegistry.toolMaterials.get(matID); for (ItemKey key : PatternBuilder.instance.materials) { @@ -178,8 +211,10 @@ public void loadCraftingRecipes (String outputId, Object... results) } } - if(toolParts.size() > 0) + if(toolParts.size() > 0) { this.arecipes.add(new CachedToolMaterialsRecipe(toolParts, matID)); + this.arecipes.add(new CachedToolMaterialsRecipe(toolParts, matID, true)); + } } } else @@ -197,16 +232,20 @@ public void loadUsageRecipes (ItemStack ingred) if (materialID >= 0) { List toolParts = getSingleList(ingred); - if(toolParts.size() > 0) + if(toolParts.size() > 0) { this.arecipes.add(new CachedToolMaterialsRecipe(toolParts, materialID)); + this.arecipes.add(new CachedToolMaterialsRecipe(toolParts, materialID, true)); + } } } else if (PatternBuilder.instance.getPartID(ingred) < Short.MAX_VALUE) { int materialID = PatternBuilder.instance.getPartID(ingred); List toolParts = getSingleList(ingred); - if(toolParts.size() > 0) + if(toolParts.size() > 0) { this.arecipes.add(new CachedToolMaterialsRecipe(toolParts, materialID)); + this.arecipes.add(new CachedToolMaterialsRecipe(toolParts, materialID, true)); + } } else { From 69a40221d8cb5eb26f81d2d451b42b8d0bd91f83 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Tue, 18 Nov 2014 18:24:16 +0100 Subject: [PATCH 102/129] Some more tinkering with the bow values. Making materials more balanced against each other in their category. --- .../tconstruct/weaponry/TinkerWeaponry.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java index 3ed498b0f04..3031d1de53a 100644 --- a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java +++ b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java @@ -247,20 +247,20 @@ private void registerMaterials() TConstructRegistry.addBowMaterial(MaterialID.Wood, 18, 3.0f); // Wood // other organic materials also are good TConstructRegistry.addBowMaterial(MaterialID.Cactus, 20, 3.4f); // Cactus - TConstructRegistry.addBowMaterial(MaterialID.Bone, 38, 2.0f); // Bone - TConstructRegistry.addBowMaterial(MaterialID.Slime, 28, 4.1f); // Slime + TConstructRegistry.addBowMaterial(MaterialID.Bone, 38, 3.0f); // Bone + TConstructRegistry.addBowMaterial(MaterialID.Slime, 28, 4.2f); // Slime TConstructRegistry.addBowMaterial(MaterialID.BlueSlime, 21, 4.0f); // Blue Slime - TConstructRegistry.addBowMaterial(MaterialID.Paper, 25, 2.3f); // Paper + TConstructRegistry.addBowMaterial(MaterialID.Paper, 10, 1.1f); // Paper // Metal stuff has a lot of POW, but takes LONG to wind up since it's so hard - TConstructRegistry.addBowMaterial(MaterialID.Iron, 50, 5.2f); // Iron + TConstructRegistry.addBowMaterial(MaterialID.Iron, 54, 5.2f); // Iron TConstructRegistry.addBowMaterial(MaterialID.Steel, 60, 5.5f); // Steel - TConstructRegistry.addBowMaterial(MaterialID.PigIron, 40, 5.2f); // Pig Iron - it's meat! - TConstructRegistry.addBowMaterial(MaterialID.Ardite, 60, 4.5f); // Ardite - TConstructRegistry.addBowMaterial(MaterialID.Cobalt, 45, 5.2f); // Cobalt - TConstructRegistry.addBowMaterial(MaterialID.Manyullyn, 55, 4.5f); // Manyullyn - TConstructRegistry.addBowMaterial(MaterialID.Copper, 40, 5.1f); // Copper - TConstructRegistry.addBowMaterial(MaterialID.Bronze, 45, 5.2f); // Bronze - TConstructRegistry.addBowMaterial(MaterialID.Alumite, 45, 4.9f); // Alumite - a bit stone-ish since it has obsidian + TConstructRegistry.addBowMaterial(MaterialID.PigIron, 42, 5.2f); // Pig Iron - it's meat! + TConstructRegistry.addBowMaterial(MaterialID.Ardite, 55, 4.9f); // Ardite + TConstructRegistry.addBowMaterial(MaterialID.Cobalt, 45, 5.3f); // Cobalt + TConstructRegistry.addBowMaterial(MaterialID.Manyullyn, 50, 5.0f); // Manyullyn + TConstructRegistry.addBowMaterial(MaterialID.Copper, 40, 4.9f); // Copper + TConstructRegistry.addBowMaterial(MaterialID.Bronze, 45, 5.1f); // Bronze + TConstructRegistry.addBowMaterial(MaterialID.Alumite, 45, 5.0f); // Alumite - a bit stone-ish since it has obsidian // Stone doesn't bend. takes forever, has no pow. WHY WOULD YOU DO THAT TConstructRegistry.addBowMaterial(MaterialID.Stone, 90, 1.0f); // Stone TConstructRegistry.addBowMaterial(MaterialID.Flint, 90, 1.0f); // Flint From 5d0a151947399b6fc6e594dc3d6e1f04a0ef128e Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Tue, 18 Nov 2014 19:05:28 +0100 Subject: [PATCH 103/129] The arrow material now has an impact on the breakchance of the arrow (head for arrow, head+core for bolt) --- .../tconstruct/weaponry/TinkerWeaponry.java | 26 +++++++++---------- .../tconstruct/weaponry/WeaponryHandler.java | 4 +-- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java index 3031d1de53a..55469e7982c 100644 --- a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java +++ b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java @@ -268,25 +268,25 @@ private void registerMaterials() TConstructRegistry.addBowMaterial(MaterialID.Netherrack, 80, 1.0f); // Netherrack // Arrow Head Materials: Material ID, mass, fragility - TConstructRegistry.addArrowMaterial(MaterialID.Wood, 0.69F, 1.0F); //Wood - TConstructRegistry.addArrowMaterial(MaterialID.Stone, 2.05F, 5.0F); //Stone - TConstructRegistry.addArrowMaterial(MaterialID.Iron, 3.3F, 0.5F); //Iron + TConstructRegistry.addArrowMaterial(MaterialID.Wood, 0.69F, 0.5F); //Wood + TConstructRegistry.addArrowMaterial(MaterialID.Stone, 2.05F, 1.0F); //Stone + TConstructRegistry.addArrowMaterial(MaterialID.Iron, 3.3F, 0.8F); //Iron TConstructRegistry.addArrowMaterial(MaterialID.Flint, 1.325F, 1.0F); //Flint TConstructRegistry.addArrowMaterial(MaterialID.Cactus, 0.76F, 1.0F); //Cactus TConstructRegistry.addArrowMaterial(MaterialID.Bone, 1.69F, 1.0F); //Bone TConstructRegistry.addArrowMaterial(MaterialID.Obsidian, 2.4F, 1.0F); //Obsidian - TConstructRegistry.addArrowMaterial(MaterialID.Netherrack, 1.5F, 1.0F); //Netherrack + TConstructRegistry.addArrowMaterial(MaterialID.Netherrack, 1.5F, 1.3F); //Netherrack TConstructRegistry.addArrowMaterial(MaterialID.Slime, 0.22F, 0.0F); //Slime - TConstructRegistry.addArrowMaterial(MaterialID.Paper, 0.69F, 3.0F); //Paper - TConstructRegistry.addArrowMaterial(MaterialID.Cobalt, 3.0F, 0.25f); //Cobalt - TConstructRegistry.addArrowMaterial(MaterialID.Ardite, 1.25F, 0.25f); //Ardite - TConstructRegistry.addArrowMaterial(MaterialID.Manyullyn, 2.25F, 0.1F); //Manyullyn - TConstructRegistry.addArrowMaterial(MaterialID.Copper, 2.7F, 0.5F); //Copper - TConstructRegistry.addArrowMaterial(MaterialID.Bronze, 3.2F, 0.25f); //Bronze - TConstructRegistry.addArrowMaterial(MaterialID.Alumite, 1.1F, 0.25f); //Alumite - TConstructRegistry.addArrowMaterial(MaterialID.Steel, 3.6F, 0.25f); //Steel + TConstructRegistry.addArrowMaterial(MaterialID.Paper, 0.69F, 10.0F); //Paper + TConstructRegistry.addArrowMaterial(MaterialID.Cobalt, 3.0F, 2.0f); //Cobalt + TConstructRegistry.addArrowMaterial(MaterialID.Ardite, 1.25F, 2.0f); //Ardite + TConstructRegistry.addArrowMaterial(MaterialID.Manyullyn, 2.25F, 1.0F); //Manyullyn + TConstructRegistry.addArrowMaterial(MaterialID.Copper, 2.7F, 1.1F); //Copper + TConstructRegistry.addArrowMaterial(MaterialID.Bronze, 3.2F, 1.2f); //Bronze + TConstructRegistry.addArrowMaterial(MaterialID.Alumite, 1.1F, 0.7f); //Alumite + TConstructRegistry.addArrowMaterial(MaterialID.Steel, 3.6F, 0.9f); //Steel TConstructRegistry.addArrowMaterial(MaterialID.BlueSlime, 0.22F, 0.0F); //Blue Slime - TConstructRegistry.addArrowMaterial(MaterialID.PigIron, 3.6F, 0.5F); //Pigiron + TConstructRegistry.addArrowMaterial(MaterialID.PigIron, 3.0F, 0.5F); //Pigiron // Arrow Shaft Materials: Material ID, crafting item, durability-medifier, mass, fragility TConstructRegistry.addCustomMaterial(ArrowShaftMaterial.createMaterial(0, Items.stick, 1.0f, 1.0f, 0.15f, 0x866526)); // wood: reference material, 10% break chance diff --git a/src/main/java/tconstruct/weaponry/WeaponryHandler.java b/src/main/java/tconstruct/weaponry/WeaponryHandler.java index 720ac78136c..a86171e03b9 100644 --- a/src/main/java/tconstruct/weaponry/WeaponryHandler.java +++ b/src/main/java/tconstruct/weaponry/WeaponryHandler.java @@ -77,7 +77,7 @@ public void onAmmoCrafted(ToolCraftEvent.NormalTool event) int durability = (int)((float)head.durability() * shaft.durabilityModifier * fletching.durabilityModifier); float weight = arrow.mass + shaft.weight; float accuracy = fletching.accuracy; - float breakChance = shaft.fragility + fletching.breakChance; + float breakChance = shaft.fragility * arrow.breakChance + fletching.breakChance; setAmmoData(tags, durability, weight, breakChance, accuracy, head.shoddy(), head.reinforced()); @@ -108,7 +108,7 @@ else if(event.tool instanceof BoltAmmo) int durability = (int)((float)headMat.durability() * coreMat.handleDurability() * fletching.durabilityModifier); float weight = head.mass + core.mass*1.5f; float accuracy = (100f + fletching.accuracy)/2f; - float breakChance = fletching.breakChance*3; + float breakChance = (fletching.breakChance*2 + 0.15f * core.breakChance) * head.breakChance/2f; float shoddy = (headMat.shoddy() + coreMat.shoddy())/2f; int reinforced = Math.max(headMat.reinforced(), coreMat.reinforced()); From 7372d0af899e3acb1e324637c41ca437ae36ff12 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Tue, 18 Nov 2014 19:40:23 +0100 Subject: [PATCH 104/129] Change quartz to be less effective on projectiles --- .../tconstruct/modifiers/tools/ModAttack.java | 26 +++++++++++++++++++ .../tconstruct/weaponry/TinkerWeaponry.java | 5 ++++ 2 files changed, 31 insertions(+) diff --git a/src/main/java/tconstruct/modifiers/tools/ModAttack.java b/src/main/java/tconstruct/modifiers/tools/ModAttack.java index 92337b18ad6..8c7309bb07c 100644 --- a/src/main/java/tconstruct/modifiers/tools/ModAttack.java +++ b/src/main/java/tconstruct/modifiers/tools/ModAttack.java @@ -3,6 +3,9 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import tconstruct.library.modifier.IModifyable; +import tconstruct.library.tools.ToolCore; + +import java.util.Arrays; public class ModAttack extends ItemModTypeFilter { @@ -11,7 +14,9 @@ public class ModAttack extends ItemModTypeFilter int threshold; String guiType; String modifierType; + boolean ammoOnly; + // Regular weapons public ModAttack(String type, int effect, ItemStack[] items, int[] value) { super(effect, "ModAttack", items, value); @@ -20,8 +25,22 @@ public ModAttack(String type, int effect, ItemStack[] items, int[] value) max = 72; threshold = 24; modifierType = "Tool"; + ammoOnly = false; } + // projectiles + public ModAttack(String type, int effect, ItemStack[] items, int[] value, boolean ammoOnly) + { + super(effect, "ModAttack", items, value); + tooltipName = "\u00a7fSharpness"; + guiType = type; + max = 48; + threshold = 24; + modifierType = "Tool"; + this.ammoOnly = ammoOnly; + } + + // gloves public ModAttack(String type, int effect, ItemStack[] items, int[] value, int max, int threshold, String modifierType) { super(effect, "ModAttack", items, value); @@ -30,11 +49,18 @@ public ModAttack(String type, int effect, ItemStack[] items, int[] value, int ma this.max = max; this.threshold = threshold; this.modifierType = modifierType; + ammoOnly = false; } @Override protected boolean canModify (ItemStack tool, ItemStack[] input) { + if(tool.getItem() instanceof ToolCore) + { + if(Arrays.asList(((ToolCore) tool.getItem()).getTraits()).contains("ammo") != ammoOnly) + return false; + } + if (tool.getItem() instanceof IModifyable) { IModifyable toolItem = (IModifyable) tool.getItem(); diff --git a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java index 55469e7982c..015387c0ed8 100644 --- a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java +++ b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java @@ -24,6 +24,7 @@ import tconstruct.library.tools.FletchlingLeafMaterial; import tconstruct.library.util.IPattern; import tconstruct.library.util.IToolPart; +import tconstruct.modifiers.tools.ModAttack; import tconstruct.modifiers.tools.ModWindup; import tconstruct.modifiers.tools.ModAmmoRestock; import tconstruct.smeltery.TinkerSmeltery; @@ -102,11 +103,15 @@ public void init(FMLInitializationEvent event) registerBoltCasting(); setupCreativeTab(); + // Modifiers ItemStack redstoneItem = new ItemStack(Items.redstone); ItemStack redstoneBlock = new ItemStack(Blocks.redstone_block); ModifyBuilder.registerModifier(new ModWindup(2, new ItemStack[] { redstoneItem, redstoneBlock }, new int[] { 1, 9 })); ModifyBuilder.registerModifier(new ModAmmoRestock()); + TinkerTools.modAttack = new ModAttack("Quartz", 11, new ItemStack[] { new ItemStack(Items.quartz), new ItemStack(Blocks.quartz_block, 1, Short.MAX_VALUE) }, new int[] { 1, 4 }, true); + ModifyBuilder.registerModifier(TinkerTools.modAttack); + TConstructRegistry.registerActiveToolMod(new WeaponryActiveToolMod()); } From 2396c9c21c2a28e9bccf925b3a770ea478d7f8ad Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Thu, 20 Nov 2014 15:06:16 +0100 Subject: [PATCH 105/129] Prevent crash when hitting ghast-fireballs etc. with tinker projectiles --- src/main/java/tconstruct/library/entity/ProjectileBase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/tconstruct/library/entity/ProjectileBase.java b/src/main/java/tconstruct/library/entity/ProjectileBase.java index 3a76971bd06..7fe2d814732 100644 --- a/src/main/java/tconstruct/library/entity/ProjectileBase.java +++ b/src/main/java/tconstruct/library/entity/ProjectileBase.java @@ -206,7 +206,7 @@ public void onHitEntity(MovingObjectPosition movingobjectposition) { // stonebound decreases, jagged increases damage too float bonusDamage = -AbilityHelper.calcStoneboundBonus(ammo, tags); // enchantments might add too - if(shootingEntity != null) + if(shootingEntity != null && movingobjectposition.entityHit instanceof EntityLivingBase) bonusDamage += EnchantmentHelper.getEnchantmentModifierLiving((EntityLivingBase)this.shootingEntity, (EntityLivingBase)movingobjectposition.entityHit); damage += bonusDamage; From 8687296199bcaf455ec11274b693cd0dc09288b4 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Thu, 20 Nov 2014 15:40:21 +0100 Subject: [PATCH 106/129] Bring flamestring in line so it's an actual choice instead of just making normal tools lategame power. Also bring enchanted string in line a bit. --- src/main/java/tconstruct/tools/TinkerTools.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/tconstruct/tools/TinkerTools.java b/src/main/java/tconstruct/tools/TinkerTools.java index de4849cabe4..cea399b2a07 100644 --- a/src/main/java/tconstruct/tools/TinkerTools.java +++ b/src/main/java/tconstruct/tools/TinkerTools.java @@ -703,7 +703,7 @@ private void modIntegration () TConstructRegistry.addPartMapping(TinkerTools.woodPattern, meta + 1, 31, new ItemStack(TinkerTools.patternOutputs[meta], 1, 31)); } - TConstructRegistry.addBowstringMaterial(1, 2, new ItemStack((Item) obj, 1, 7), new ItemStack(TinkerWeaponry.bowstring, 1, 1), 1F, 1F, 0.9f, 0x63bcd9); + TConstructRegistry.addBowstringMaterial(1, 2, new ItemStack((Item) obj, 1, 7), new ItemStack(TinkerWeaponry.bowstring, 1, 1), 1F, 0.8F, 0.9f, 0x63bcd9); TConstructRegistry.addBowMaterial(31, 40, 1.2f); TConstructRegistry.addArrowMaterial(31, 1.8F, 0.5F); @@ -720,7 +720,7 @@ private void modIntegration () try { Object plantItem = ItemHelper.getStaticItem("plantItem", "mods.natura.common.NContent"); - TConstructRegistry.addBowstringMaterial(2, 2, new ItemStack((Item) plantItem, 1, 7), new ItemStack(TinkerWeaponry.bowstring, 1, 2), 1.2F, 0.8F, 1.3f, 0xd3414f); + TConstructRegistry.addBowstringMaterial(2, 2, new ItemStack((Item) plantItem, 1, 7), new ItemStack(TinkerWeaponry.bowstring, 1, 2), 1.2F, 1.1F, 1.2f, 0xd3414f); } catch (Exception e) { From 8161d2b493c034836712a6c74c823d2da199c492 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Thu, 20 Nov 2014 15:42:20 +0100 Subject: [PATCH 107/129] Adjust Thaumium bow-stats --- src/main/java/tconstruct/tools/TinkerTools.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/tconstruct/tools/TinkerTools.java b/src/main/java/tconstruct/tools/TinkerTools.java index cea399b2a07..5ed2ed6e9b4 100644 --- a/src/main/java/tconstruct/tools/TinkerTools.java +++ b/src/main/java/tconstruct/tools/TinkerTools.java @@ -704,7 +704,7 @@ private void modIntegration () } TConstructRegistry.addBowstringMaterial(1, 2, new ItemStack((Item) obj, 1, 7), new ItemStack(TinkerWeaponry.bowstring, 1, 1), 1F, 0.8F, 0.9f, 0x63bcd9); - TConstructRegistry.addBowMaterial(31, 40, 1.2f); + TConstructRegistry.addBowMaterial(31, 35, 4.75f); TConstructRegistry.addArrowMaterial(31, 1.8F, 0.5F); TConstructRegistry.addDefaultToolPartMaterial(MaterialID.Thaumium); From a44919a2f2f7a21fe9196205396b68f139e9026c Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Fri, 21 Nov 2014 18:26:39 +0100 Subject: [PATCH 108/129] Shortbows give less slowdown while aiming --- .../tconstruct/weaponry/weapons/ShortBow.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/main/java/tconstruct/weaponry/weapons/ShortBow.java b/src/main/java/tconstruct/weaponry/weapons/ShortBow.java index 11b4518fd2d..2fb79333fb9 100644 --- a/src/main/java/tconstruct/weaponry/weapons/ShortBow.java +++ b/src/main/java/tconstruct/weaponry/weapons/ShortBow.java @@ -1,5 +1,8 @@ package tconstruct.weaponry.weapons; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.entity.EntityPlayerSP; import tconstruct.weaponry.TinkerWeaponry; import tconstruct.weaponry.ammo.ArrowAmmo; import tconstruct.library.weaponry.BowBaseAmmo; @@ -100,4 +103,22 @@ public Item getAccessoryItem () { return TinkerWeaponry.partBowLimb; } + + @Override + @SideOnly(Side.CLIENT) + public void onUpdate (ItemStack stack, World world, Entity entity, int par4, boolean par5) + { + // shortbows are smaller and more mobile than longbows + super.onUpdate(stack, world, entity, par4, par5); + if (entity instanceof EntityPlayerSP) + { + EntityPlayerSP player = (EntityPlayerSP) entity; + ItemStack usingItem = player.getItemInUse(); + if (usingItem != null && usingItem.getItem() == this) + { + player.movementInput.moveForward *= 1.5F; + player.movementInput.moveStrafe *= 1.5F; + } + } + } } From d57f8b64a80f30b56172d548ec62718757417e05 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Fri, 21 Nov 2014 18:27:33 +0100 Subject: [PATCH 109/129] Throwing knives windup is shorter and they nearly don't slow you down while doing so. Also minimal javelin buff. --- .../tconstruct/weaponry/weapons/Javelin.java | 2 +- .../weaponry/weapons/ThrowingKnife.java | 21 ++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/main/java/tconstruct/weaponry/weapons/Javelin.java b/src/main/java/tconstruct/weaponry/weapons/Javelin.java index 92e8de56f33..936c8b44bba 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Javelin.java +++ b/src/main/java/tconstruct/weaponry/weapons/Javelin.java @@ -108,7 +108,7 @@ public float maxAccuracy(ItemStack itemStack) { @Override public int getWindupTime(ItemStack itemStack) { - return 20; + return 17; } @Override diff --git a/src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java b/src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java index c109255631d..f1d0205cb1e 100644 --- a/src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java +++ b/src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java @@ -1,5 +1,6 @@ package tconstruct.weaponry.weapons; +import net.minecraft.client.entity.EntityPlayerSP; import tconstruct.weaponry.client.CrosshairType; import tconstruct.weaponry.entity.ThrowingKnifeEntity; import tconstruct.library.weaponry.AmmoWeapon; @@ -58,7 +59,7 @@ public Item getAccessoryItem() { } @Override - public int getWindupTime(ItemStack itemStack) { return 30; } // 1 1/2 seconds + public int getWindupTime(ItemStack itemStack) { return 15; } // 1 1/2 seconds @Override public float getMinWindupProgress(ItemStack itemStack) { @@ -90,4 +91,22 @@ public float getProjectileSpeed() { public CrosshairType getCrosshairType() { return CrosshairType.SPIKE; } + + @Override + @SideOnly(Side.CLIENT) + public void onUpdate (ItemStack stack, World world, Entity entity, int par4, boolean par5) + { + // aiming with throwing knives slows down much less than with a bow + super.onUpdate(stack, world, entity, par4, par5); + if (entity instanceof EntityPlayerSP) + { + EntityPlayerSP player = (EntityPlayerSP) entity; + ItemStack usingItem = player.getItemInUse(); + if (usingItem != null && usingItem.getItem() == this) + { + player.movementInput.moveForward *= 3.0F; + player.movementInput.moveStrafe *= 3.0F; + } + } + } } From 40a2e9194395d53dad3682f2f912c1207d1cd109 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Fri, 21 Nov 2014 18:50:04 +0100 Subject: [PATCH 110/129] Throwing knives now crit when they're aimed long enough --- .../java/tconstruct/library/weaponry/AmmoWeapon.java | 4 ++-- src/main/java/tconstruct/weaponry/weapons/Javelin.java | 2 +- .../java/tconstruct/weaponry/weapons/Shuriken.java | 2 +- .../tconstruct/weaponry/weapons/ThrowingKnife.java | 10 ++++++++-- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java b/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java index 026749bed5e..fac9cc2804e 100644 --- a/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java +++ b/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java @@ -106,7 +106,7 @@ protected void launchProjectile(ItemStack stack, World world, EntityPlayer playe ItemStack reference = stack.copy(); reference.stackSize = 1; reference.getTagCompound().getCompoundTag("InfiTool").setInteger("Ammo", 1); - Entity projectile = createProjectile(reference, world, player, getAccuracy(stack, time)); + Entity projectile = createProjectile(reference, world, player, getAccuracy(stack, time), time); world.spawnEntityInWorld(projectile); } @@ -115,7 +115,7 @@ protected void launchProjectile(ItemStack stack, World world, EntityPlayer playe this.consumeAmmo(1, stack); } - protected abstract Entity createProjectile(ItemStack reference, World world, EntityPlayer player, float accuracy); + protected abstract Entity createProjectile(ItemStack reference, World world, EntityPlayer player, float accuracy, int time); /** used for displaying the damage, return the value used for pseed in createProjectile/ProjectileBase constructor */ diff --git a/src/main/java/tconstruct/weaponry/weapons/Javelin.java b/src/main/java/tconstruct/weaponry/weapons/Javelin.java index 936c8b44bba..3510e9210cd 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Javelin.java +++ b/src/main/java/tconstruct/weaponry/weapons/Javelin.java @@ -174,7 +174,7 @@ public String[] getTraits() { } @Override - protected Entity createProjectile(ItemStack reference, World world, EntityPlayer player, float accuracy) { + protected Entity createProjectile(ItemStack reference, World world, EntityPlayer player, float accuracy, int time) { reference.getTagCompound().getCompoundTag("InfiTool").removeTag("Throwing"); // needed so the NBTs are equal JavelinEntity entity = new JavelinEntity(world, player, getProjectileSpeed(), accuracy, reference); diff --git a/src/main/java/tconstruct/weaponry/weapons/Shuriken.java b/src/main/java/tconstruct/weaponry/weapons/Shuriken.java index d0bf8328fab..b8912f78b2e 100644 --- a/src/main/java/tconstruct/weaponry/weapons/Shuriken.java +++ b/src/main/java/tconstruct/weaponry/weapons/Shuriken.java @@ -128,7 +128,7 @@ public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer pla } @Override - protected Entity createProjectile(ItemStack reference, World world, EntityPlayer player, float accuracy) { + protected Entity createProjectile(ItemStack reference, World world, EntityPlayer player, float accuracy, int time) { return new ShurikenEntity(world, player, getProjectileSpeed(), 0f, reference); } diff --git a/src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java b/src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java index f1d0205cb1e..862939e19f9 100644 --- a/src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java +++ b/src/main/java/tconstruct/weaponry/weapons/ThrowingKnife.java @@ -1,6 +1,7 @@ package tconstruct.weaponry.weapons; import net.minecraft.client.entity.EntityPlayerSP; +import tconstruct.library.entity.ProjectileBase; import tconstruct.weaponry.client.CrosshairType; import tconstruct.weaponry.entity.ThrowingKnifeEntity; import tconstruct.library.weaponry.AmmoWeapon; @@ -77,8 +78,13 @@ public float minAccuracy(ItemStack itemStack) { } @Override - protected Entity createProjectile(ItemStack reference, World world, EntityPlayer player, float accuracy) { - return new ThrowingKnifeEntity(world, player, getProjectileSpeed(), accuracy, reference); + protected Entity createProjectile(ItemStack reference, World world, EntityPlayer player, float accuracy, int time) { + ProjectileBase knife = new ThrowingKnifeEntity(world, player, getProjectileSpeed(), accuracy, reference); + // if you aim long enough, it's a crit! + if(time >= this.getWindupTime(reference)*1.5f) + knife.setIsCritical(true); + + return knife; } @Override From 584c2e77f67930ac30cb41b750f000df06a91108 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Fri, 21 Nov 2014 18:58:07 +0100 Subject: [PATCH 111/129] Add 'metal-part-creation-in-part-table' config to weaponry --- .../java/tconstruct/weaponry/TinkerWeaponry.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java index 015387c0ed8..f26a1472847 100644 --- a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java +++ b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java @@ -32,6 +32,7 @@ import tconstruct.tools.items.Bowstring; import tconstruct.tools.items.Fletching; import tconstruct.tools.items.Pattern; +import tconstruct.util.config.PHConstruct; import tconstruct.weaponry.ammo.ArrowAmmo; import tconstruct.weaponry.ammo.BoltAmmo; import tconstruct.library.tools.DualMaterialToolPart; @@ -197,10 +198,19 @@ private void addPartRecipies() int[] liquidDamage = new int[] { 2, 13, 10, 11, 12, 14, 15, 6, 16, 18 }; Item[] patternOutputs = new Item[] { partShuriken, partCrossbowLimb, partCrossbowBody, partBowLimb }; + // register part crafting - for (int m = 0; m < patternOutputs.length; m++) - for (int nonMetal : nonMetals) - TConstructRegistry.addPartMapping(woodPattern, m, nonMetal, new ItemStack(patternOutputs[m], 1, nonMetal)); + if (PHConstruct.craftMetalTools) + { + for (int m = 0; m < patternOutputs.length; m++) + for (int i = 0; i < 18; i++) + TConstructRegistry.addPartMapping(woodPattern, m, i, new ItemStack(patternOutputs[m], 1, i)); + } + else { + for (int m = 0; m < patternOutputs.length; m++) + for (int nonMetal : nonMetals) + TConstructRegistry.addPartMapping(woodPattern, m, nonMetal, new ItemStack(patternOutputs[m], 1, nonMetal)); + } // register part casting LiquidCasting tableCasting = TConstructRegistry.getTableCasting(); From eea8d165a43ed6fbabb239ec4b988edf469fa225 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Fri, 21 Nov 2014 19:16:12 +0100 Subject: [PATCH 112/129] Fix javelin not taking damage on attack if it was full and adding ammo. Oops. --- src/main/java/tconstruct/weaponry/WeaponryActiveToolMod.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/tconstruct/weaponry/WeaponryActiveToolMod.java b/src/main/java/tconstruct/weaponry/WeaponryActiveToolMod.java index 87187a450ed..d07f9744462 100644 --- a/src/main/java/tconstruct/weaponry/WeaponryActiveToolMod.java +++ b/src/main/java/tconstruct/weaponry/WeaponryActiveToolMod.java @@ -14,7 +14,7 @@ public boolean damageTool(ItemStack stack, int damage, EntityLivingBase entity) IAmmo ammo =(IAmmo)stack.getItem(); if(tags.getInteger("Damage") == 0) { - int rem = ammo.addAmmo(1, stack); + int rem = ammo.consumeAmmo(1, stack); if(rem > 0) return true; } From 81da6633ed1a29781d1940e9cbc948be08f1af0e Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Fri, 21 Nov 2014 19:25:41 +0100 Subject: [PATCH 113/129] Fix broken bows being usable --- .../java/tconstruct/library/weaponry/ProjectileWeapon.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java b/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java index acc1b6db1c1..bbfb47523d6 100644 --- a/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java +++ b/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java @@ -138,6 +138,10 @@ public ItemStack onItemRightClick (ItemStack stack, World world, EntityPlayer pl if(getWindupTime(stack) == 0.0f) return stack; + // broken tool? + if(stack.hasTagCompound() && stack.getTagCompound().hasKey(getBaseTagName()) && stack.getTagCompound().getCompoundTag(getBaseTagName()).getBoolean("Broken")) + return stack; + // only if ammo is present if(searchForAmmo(player, stack) != null) player.setItemInUse(stack, this.getMaxItemUseDuration(stack)); From 3c7d9f00ddb23f7fc20f39c39b68865f2e2602f7 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Fri, 21 Nov 2014 19:34:03 +0100 Subject: [PATCH 114/129] Fix bows replacing the wrong texture when broken --- .../library/weaponry/ProjectileWeapon.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java b/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java index bbfb47523d6..5ed98a9aa49 100644 --- a/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java +++ b/src/main/java/tconstruct/library/weaponry/ProjectileWeapon.java @@ -282,6 +282,49 @@ protected IIcon getCorrectAnimationIcon(Map icons, int id, flo return icons.get(-1)[step]; } + @Override + @SideOnly(Side.CLIENT) + // exactly the same as the ToolCore one but with broken check for Handle instead of Head + public IIcon getIcon (ItemStack stack, int renderPass) + { + NBTTagCompound tags = stack.getTagCompound(); + + if (tags != null) + { + tags = stack.getTagCompound().getCompoundTag("InfiTool"); + if (renderPass < getPartAmount()) + { + // Handle + if (renderPass == 0) { + if (tags.getBoolean("Broken")) + return getCorrectIcon(brokenIcons, tags.getInteger("RenderHandle")); + else + return getCorrectIcon(handleIcons, tags.getInteger("RenderHandle")); + } + // Head + else if (renderPass == 1) + { + return getCorrectIcon(headIcons, tags.getInteger("RenderHead")); + } + // Accessory + else if (renderPass == 2) + return getCorrectIcon(accessoryIcons, tags.getInteger("RenderAccessory")); + // Extra + else if (renderPass == 3) + return getCorrectIcon(extraIcons, tags.getInteger("RenderExtra")); + } + // Effects + else if (renderPass <= 10) + { + String effect = "Effect" + (1 + renderPass - getPartAmount()); + if(tags.hasKey(effect)) + return effectIcons.get(tags.getInteger(effect)); + } + return blankSprite; + } + return emptyIcon; + } + @Override public void registerIcons(IIconRegister iconRegister) { super.registerIcons(iconRegister); From ce47cd3c9643da42876db73af1c7af76c139d713 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Fri, 21 Nov 2014 19:34:48 +0100 Subject: [PATCH 115/129] Fix broken textures not getting colored correctly if a special head-texture is present, but not a broken one --- src/main/java/tconstruct/library/tools/ToolCore.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/tconstruct/library/tools/ToolCore.java b/src/main/java/tconstruct/library/tools/ToolCore.java index 90a3c8b2597..93feca0eca3 100644 --- a/src/main/java/tconstruct/library/tools/ToolCore.java +++ b/src/main/java/tconstruct/library/tools/ToolCore.java @@ -648,7 +648,7 @@ public int getColorFromItemStack(ItemStack stack, int renderPass) { switch(renderPass) { case 0: return getCorrectColor(stack, renderPass, tags, "Handle", handleIcons); - case 1: return getCorrectColor(stack, renderPass, tags, "Head", headIcons); + case 1: return tags.getBoolean("Broken") ? getCorrectColor(stack, renderPass, tags, "Head", brokenIcons) : getCorrectColor(stack, renderPass, tags, "Head", headIcons); case 2: return getCorrectColor(stack, renderPass, tags, "Accessory", accessoryIcons); case 3: return getCorrectColor(stack, renderPass, tags, "Extra", extraIcons); } From 5fae9b7ced2135e0d0af75f59876616da813b6b1 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sat, 22 Nov 2014 23:21:11 +0100 Subject: [PATCH 116/129] Thaumium Toolparts for weaponry --- src/main/java/tconstruct/weaponry/TinkerWeaponry.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java index f26a1472847..bf9ccfb24e9 100644 --- a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java +++ b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java @@ -247,6 +247,13 @@ private void addPartRecipies() tableCasting.addCastingRecipe(metalCast, new FluidStack(fs, fluidAmount), cast, 50); Smeltery.addMelting(FluidType.getFluidType(fs), metalCast, 0, fluidAmount); } + + // Thaumium weaponry toolparts + if(TinkerTools.thaumcraftAvailable) + { + for (int m = 0; m < patternOutputs.length; m++) + TConstructRegistry.addPartMapping(woodPattern, m, MaterialID.Thaumium, new ItemStack(patternOutputs[m], 1, MaterialID.Thaumium)); + } } private void registerLegendaries() From dc3a2b0ff7b1f5fd91f4f7bf75bbdd1a38f4b5a6 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Wed, 26 Nov 2014 22:37:08 +0100 Subject: [PATCH 117/129] Battlesigns now properly reflect all projectiles, not just arrows. --- .../tconstruct/tools/TinkerToolEvents.java | 64 ++++++++++-------- .../util/network/MovementUpdatePacket.java | 66 +++++++++++++++++++ .../util/network/PacketPipeline.java | 2 + 3 files changed, 104 insertions(+), 28 deletions(-) create mode 100644 src/main/java/tconstruct/util/network/MovementUpdatePacket.java diff --git a/src/main/java/tconstruct/tools/TinkerToolEvents.java b/src/main/java/tconstruct/tools/TinkerToolEvents.java index 5d8c7307987..51ece8843de 100644 --- a/src/main/java/tconstruct/tools/TinkerToolEvents.java +++ b/src/main/java/tconstruct/tools/TinkerToolEvents.java @@ -13,6 +13,7 @@ import net.minecraft.init.Items; import net.minecraft.item.*; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.play.server.S14PacketEntity; import net.minecraft.util.*; import net.minecraft.world.EnumDifficulty; import net.minecraftforge.event.entity.living.*; @@ -26,6 +27,7 @@ import tconstruct.library.tools.*; import tconstruct.util.ItemHelper; import tconstruct.util.config.PHConstruct; +import tconstruct.util.network.MovementUpdatePacket; public class TinkerToolEvents { @@ -225,35 +227,41 @@ public void onAttack (LivingAttackEvent event) DamageSource source = event.source; if (!source.isUnblockable() && !source.isMagicDamage() && !source.isExplosion()) { - if (source instanceof EntityDamageSourceIndirect) + if (source.isProjectile()) { - if (TConstruct.random.nextInt(3) == 0) - { - Entity attacker = source.getEntity(); - Entity projectile = ((EntityDamageSourceIndirect) source).getSourceOfDamage(); - projectile.motionX *= -1; - projectile.motionZ *= -1; - projectile.setDead(); - event.setCanceled(true); - - if (projectile.getClass() == EntityArrow.class && !player.worldObj.isRemote) - { - EntityArrow reflection = null; - if (attacker instanceof EntityLivingBase) - reflection = new EntityArrow(player.worldObj, (EntityLivingBase) attacker, 0); - else - reflection = new EntityArrow(player.worldObj, player, 0); - - Vec3 look = player.getLookVec(); - reflection.posX = projectile.posX; - reflection.posY = projectile.posY; - reflection.posZ = projectile.posZ; - reflection.motionX = (projectile.motionX + (look.xCoord * 8)) / 6; - reflection.motionY = (projectile.motionY + (look.yCoord * 8)) / 6; - reflection.motionZ = (projectile.motionZ + (look.zCoord * 8)) / 6; - reflection.damage = ((EntityArrow) projectile).damage; - player.worldObj.spawnEntityInWorld(reflection); - } + // no damage, hooraaay + event.setCanceled(true); + + Entity projectile = source.getSourceOfDamage(); + + double speed = projectile.motionX*projectile.motionX + projectile.motionY*projectile.motionY + projectile.motionZ*projectile.motionZ; + speed = Math.sqrt(speed); + + Vec3 look = player.getLookVec(); + + // now we simply set the look vector with the speed and get our new vector! + projectile.motionX = look.xCoord * speed; + projectile.motionY = look.yCoord * speed; + projectile.motionZ = look.zCoord * speed; + + projectile.rotationYaw = (float)(Math.atan2(projectile.motionX, projectile.motionZ) * 180.0D / Math.PI); + projectile.rotationPitch = (float)(Math.atan2(projectile.motionY, speed) * 180.0D / Math.PI); + + // send the current status to the client + TConstruct.packetPipeline.sendToAll(new MovementUpdatePacket(projectile)); + + if(projectile instanceof EntityArrow) { + ((EntityArrow) projectile).shootingEntity = player; + + // the inverse is done when the event is cancelled in arrows etc. + // we reverse it so it has no effect. yay + projectile.motionX /= -0.10000000149011612D; + projectile.motionY /= -0.10000000149011612D; + projectile.motionZ /= -0.10000000149011612D; +// projectile.rotationYaw -= 180.0F; +// projectile.prevRotationYaw -= 180.0F; + + // not needed at the client since it gets the absolute values sent } } else diff --git a/src/main/java/tconstruct/util/network/MovementUpdatePacket.java b/src/main/java/tconstruct/util/network/MovementUpdatePacket.java new file mode 100644 index 00000000000..5e11a46ebb0 --- /dev/null +++ b/src/main/java/tconstruct/util/network/MovementUpdatePacket.java @@ -0,0 +1,66 @@ +package tconstruct.util.network; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import mantle.common.network.AbstractPacket; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityList; +import net.minecraft.entity.player.EntityPlayer; + +public class MovementUpdatePacket extends AbstractPacket { + public int entityID; + public double x; + public double y; + public double z; + public float yaw; + public float pitch; + + public MovementUpdatePacket() { + } + + public MovementUpdatePacket(Entity entity) { + this.entityID = entity.getEntityId(); + this.x = entity.motionX; + this.y = entity.motionY; + this.z = entity.motionZ; + this.yaw = entity.rotationYaw; + this.pitch = entity.rotationPitch; + } + + @Override + public void encodeInto(ChannelHandlerContext ctx, ByteBuf buffer) { + buffer.writeInt(entityID); + buffer.writeDouble(x); + buffer.writeDouble(y); + buffer.writeDouble(z); + buffer.writeFloat(yaw); + buffer.writeFloat(pitch); + } + + @Override + public void decodeInto(ChannelHandlerContext ctx, ByteBuf buffer) { + this.entityID = buffer.readInt(); + this.x = buffer.readDouble(); + this.y = buffer.readDouble(); + this.z = buffer.readDouble(); + this.yaw = buffer.readFloat(); + this.pitch = buffer.readFloat(); + } + + @Override + public void handleClientSide(EntityPlayer player) { + Entity entity = player.worldObj.getEntityByID(entityID); + if(entity != null) { + entity.motionX = x; + entity.motionY = y; + entity.motionZ = z; + entity.rotationYaw = yaw; + entity.rotationPitch = pitch; + } + } + + @Override + public void handleServerSide(EntityPlayer player) { + // only sent to client + } +} diff --git a/src/main/java/tconstruct/util/network/PacketPipeline.java b/src/main/java/tconstruct/util/network/PacketPipeline.java index 77c17c9bc11..c87eaa6be88 100644 --- a/src/main/java/tconstruct/util/network/PacketPipeline.java +++ b/src/main/java/tconstruct/util/network/PacketPipeline.java @@ -133,6 +133,8 @@ public void registerPackets () registerPacket(BeltPacket.class); registerPacket(GogglePacket.class); + + registerPacket(MovementUpdatePacket.class); } // Method to call from FMLPostInitializationEvent From 5187f3bb319a413b3c64e413f7de7adb2982e70b Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Fri, 28 Nov 2014 14:37:49 +0100 Subject: [PATCH 118/129] Restore Tic-Tooltips compatibility so it doesn't crash anymore with new stuff --- src/main/java/tconstruct/library/tools/ArrowMaterial.java | 3 +++ src/main/java/tconstruct/library/tools/BowMaterial.java | 3 +++ .../java/tconstruct/library/tools/FletchingMaterial.java | 3 +++ src/main/java/tconstruct/tools/TinkerTools.java | 7 ++++++- 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/tconstruct/library/tools/ArrowMaterial.java b/src/main/java/tconstruct/library/tools/ArrowMaterial.java index 3f361f8ab20..4f705b6d63b 100644 --- a/src/main/java/tconstruct/library/tools/ArrowMaterial.java +++ b/src/main/java/tconstruct/library/tools/ArrowMaterial.java @@ -16,4 +16,7 @@ public ArrowMaterial(float weight, float breakChance, float accuraccy) { this(weight, breakChance); } + + @Deprecated + public float accuracy = 0f; // tic-tooltips compatibility } diff --git a/src/main/java/tconstruct/library/tools/BowMaterial.java b/src/main/java/tconstruct/library/tools/BowMaterial.java index 8769fabfb00..628dba52c4b 100644 --- a/src/main/java/tconstruct/library/tools/BowMaterial.java +++ b/src/main/java/tconstruct/library/tools/BowMaterial.java @@ -16,4 +16,7 @@ public BowMaterial(int durability, int drawspeed, float attack) { this(drawspeed, attack); } + + @Deprecated + public int durability = 0; // tic-tooltips compatibility } diff --git a/src/main/java/tconstruct/library/tools/FletchingMaterial.java b/src/main/java/tconstruct/library/tools/FletchingMaterial.java index a77de02e775..9cb5b766c33 100644 --- a/src/main/java/tconstruct/library/tools/FletchingMaterial.java +++ b/src/main/java/tconstruct/library/tools/FletchingMaterial.java @@ -35,4 +35,7 @@ public FletchingMaterial(int materialID, int value, String oredict, ItemStack cr { this(materialID, value, oredict, craftingItem, accuracy, 0.01f, 1f, 0xffffffff); } + + @Deprecated + public float mass = 0; // tic-tooltips compatibility } diff --git a/src/main/java/tconstruct/tools/TinkerTools.java b/src/main/java/tconstruct/tools/TinkerTools.java index 5ed2ed6e9b4..2e7c09d2fb4 100644 --- a/src/main/java/tconstruct/tools/TinkerTools.java +++ b/src/main/java/tconstruct/tools/TinkerTools.java @@ -47,10 +47,15 @@ public class TinkerTools public static ToolProxyCommon proxy; // backwards compatibility + @Deprecated public static Item bowstring; - public static DynamicToolPart arrowhead; + @Deprecated + public static Item arrowhead; + @Deprecated public static Item fletching; + @Deprecated public static ToolCore shortbow; + @Deprecated public static ToolCore arrow; // Crafting blocks From 49813550b4018a44c83182dfb251fc9855943d6d Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 30 Nov 2014 14:20:41 +0100 Subject: [PATCH 119/129] Change battlesign-blocking to actually require you to look at the arrow + reflection speed depends on how much you looked at it (+buffed) --- .../java/tconstruct/tools/TinkerToolEvents.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/main/java/tconstruct/tools/TinkerToolEvents.java b/src/main/java/tconstruct/tools/TinkerToolEvents.java index 51ece8843de..4c2342d502e 100644 --- a/src/main/java/tconstruct/tools/TinkerToolEvents.java +++ b/src/main/java/tconstruct/tools/TinkerToolEvents.java @@ -229,15 +229,25 @@ public void onAttack (LivingAttackEvent event) { if (source.isProjectile()) { + Entity projectile = source.getSourceOfDamage(); + Vec3 motion = Vec3.createVectorHelper(projectile.motionX, projectile.motionY, projectile.motionZ); + Vec3 look = player.getLookVec(); + + // this gives a factor of how much we're looking at the incoming arrow + double strength = -look.dotProduct(motion.normalize()); + // we're looking away. oh no. + if(strength < 0.1) + return; + // no damage, hooraaay event.setCanceled(true); - Entity projectile = source.getSourceOfDamage(); - double speed = projectile.motionX*projectile.motionX + projectile.motionY*projectile.motionY + projectile.motionZ*projectile.motionZ; speed = Math.sqrt(speed); - Vec3 look = player.getLookVec(); + speed = (speed+2)*strength; + + // now we simply set the look vector with the speed and get our new vector! projectile.motionX = look.xCoord * speed; From af6fbec293e3b3a180609465770f0bd8a98a861d Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 30 Nov 2014 14:34:28 +0100 Subject: [PATCH 120/129] Battlesign reflecting takes durability and doesn't work while it's broken --- src/main/java/tconstruct/tools/TinkerToolEvents.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/tconstruct/tools/TinkerToolEvents.java b/src/main/java/tconstruct/tools/TinkerToolEvents.java index 4c2342d502e..550aa55b4ac 100644 --- a/src/main/java/tconstruct/tools/TinkerToolEvents.java +++ b/src/main/java/tconstruct/tools/TinkerToolEvents.java @@ -222,8 +222,12 @@ public void onAttack (LivingAttackEvent event) EntityPlayer player = (EntityPlayer) event.entityLiving; //Cutlass ItemStack stack = player.getCurrentEquippedItem(); - if (stack != null && stack.getItem() == TinkerTools.battlesign && player.isUsingItem()) + if (stack != null && stack.getItem() == TinkerTools.battlesign) { + // broken battlesign? + if(!stack.hasTagCompound() || stack.getTagCompound().getCompoundTag("InfiTool").getBoolean("Broken")) + return; + DamageSource source = event.source; if (!source.isUnblockable() && !source.isMagicDamage() && !source.isExplosion()) { @@ -282,6 +286,9 @@ public void onAttack (LivingAttackEvent event) attacker.attackEntityFrom(DamageSource.causeThornsDamage(player), event.ammount); } } + + // durability-- + AbilityHelper.damageTool(stack, (int)Math.ceil(event.ammount/2f), player, false); } } } From c4d9ebd5059fa28c1d6f38d97c870385d41f6baf Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Tue, 2 Dec 2014 21:03:01 +0100 Subject: [PATCH 121/129] Add a possibly missing rendering state reset --- src/main/java/tconstruct/client/FlexibleToolRenderer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/tconstruct/client/FlexibleToolRenderer.java b/src/main/java/tconstruct/client/FlexibleToolRenderer.java index 1c8173aacd8..66a6e1a6bae 100644 --- a/src/main/java/tconstruct/client/FlexibleToolRenderer.java +++ b/src/main/java/tconstruct/client/FlexibleToolRenderer.java @@ -251,6 +251,7 @@ public void renderInventory(int count, IIcon[] icons, ItemStack item) GL11.glEnable(GL11.GL_BLEND); GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F); GL11.glEnable(GL11.GL_LIGHTING); GL11.glPopMatrix(); } From 011298e0b811bfedbdade0b0ea8a4df791b79b71 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Tue, 2 Dec 2014 21:34:09 +0100 Subject: [PATCH 122/129] Experimenta: native FMP support for the bocks *sawsaw* --- build.gradle | 1 + build.properties | 3 +- src/main/java/tconstruct/TConstruct.java | 2 + .../tconstruct/plugins/fmp/TinkerFMP.java | 56 +++++++++++++++++++ 4 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 src/main/java/tconstruct/plugins/fmp/TinkerFMP.java diff --git a/build.gradle b/build.gradle index 658c32c3891..5edbf4cc8d4 100644 --- a/build.gradle +++ b/build.gradle @@ -67,6 +67,7 @@ dependencies { compile "codechicken:CodeChickenLib:${config.minecraft_version}-${config.CCLIB_version}:dev" compile "codechicken:CodeChickenCore:${config.minecraft_version}-${config.ccc_version}:dev" compile "codechicken:NotEnoughItems:${config.minecraft_version}-${config.NEI_version}:dev" + compile "codechicken:ForgeMultipart:${config.minecraft_version}-${config.fmp_version}:dev" //compile "mcp.mobius.waila:Waila:${config.waila_version}:dev" deployerJars 'org.apache.maven.wagon:wagon-ssh:2.2' } diff --git a/build.properties b/build.properties index 632a042d07c..5da4c5be204 100644 --- a/build.properties +++ b/build.properties @@ -5,4 +5,5 @@ CCLIB_version=1.1.1.99 NEI_version=1.0.3.66 ccc_version=1.0.4.29 mod_version=1.7.experimental -waila_version=1.5.3_1.7.10 \ No newline at end of file +waila_version=1.5.3_1.7.10 +fmp_version=1.1.0.314 \ No newline at end of file diff --git a/src/main/java/tconstruct/TConstruct.java b/src/main/java/tconstruct/TConstruct.java index 6989dfdc2ca..0d9f1356d62 100644 --- a/src/main/java/tconstruct/TConstruct.java +++ b/src/main/java/tconstruct/TConstruct.java @@ -32,6 +32,7 @@ import tconstruct.mechworks.TinkerMechworks; import tconstruct.mechworks.landmine.behavior.Behavior; import tconstruct.mechworks.landmine.behavior.stackCombo.SpecialStackHandler; +import tconstruct.plugins.fmp.TinkerFMP; import tconstruct.plugins.ic2.TinkerIC2; import tconstruct.plugins.imc.TinkerAE2; import tconstruct.plugins.imc.TinkerBuildCraft; @@ -134,6 +135,7 @@ public void preInit (FMLPreInitializationEvent event) pulsar.registerPulse(new TinkerMystcraft()); pulsar.registerPulse(new TinkerMFR()); pulsar.registerPulse(new TinkerTE4()); + pulsar.registerPulse(new TinkerFMP()); /*pulsar.registerPulse(new TinkerPrayers()); pulsar.registerPulse(new TinkerCropify());*/ diff --git a/src/main/java/tconstruct/plugins/fmp/TinkerFMP.java b/src/main/java/tconstruct/plugins/fmp/TinkerFMP.java new file mode 100644 index 00000000000..8016b34bc37 --- /dev/null +++ b/src/main/java/tconstruct/plugins/fmp/TinkerFMP.java @@ -0,0 +1,56 @@ +package tconstruct.plugins.fmp; + +import codechicken.microblock.BlockMicroMaterial; +import cpw.mods.fml.common.event.FMLInitializationEvent; +import mantle.pulsar.pulse.Handler; +import mantle.pulsar.pulse.Pulse; +import tconstruct.TConstruct; +import tconstruct.smeltery.TinkerSmeltery; +import tconstruct.tools.TinkerTools; +import tconstruct.world.TinkerWorld; + +@Pulse(id = "Tinkers FMP Compatibility", description = "Makes Tinkers Blocks Multipart compatible", modsRequired = "ForgeMultipart", forced = true) +public class TinkerFMP { + @Handler + public void init(FMLInitializationEvent event) + { + + TConstruct.logger.info("ForgeMultipart detected. Registering TConstruct decorative blocks with FMP."); + + //make Tconstruct blocks multipartable! + if(TinkerWorld.metalBlock != null) { + // metal blocks + for (int i = 0; i < 11; i++) + BlockMicroMaterial.createAndRegister(TinkerWorld.metalBlock, i); + } + + if(TinkerSmeltery.smeltery != null) { + // smeltery bricks + for (int i = 2; i < 12; i++) { + if (i == 3) + continue; + BlockMicroMaterial.createAndRegister(TinkerSmeltery.smeltery, i); + BlockMicroMaterial.createAndRegister(TinkerSmeltery.smelteryNether, i, TinkerSmeltery.smelteryNether.getUnlocalizedName() + "Nether"); + } + + // brownstone + for (int i = 0; i < 7; i++) + BlockMicroMaterial.createAndRegister(TinkerSmeltery.speedBlock, i); + + // clear glass + BlockMicroMaterial.createAndRegister(TinkerSmeltery.clearGlass, 0); + for (int i = 0; i < 16; i++) + BlockMicroMaterial.createAndRegister(TinkerSmeltery.stainedGlassClear, i); + } + + if(TinkerTools.multiBrick != null) { + // chisel bricks + for (int i = 0; i < 14; i++) + BlockMicroMaterial.createAndRegister(TinkerTools.multiBrick, i); + + for (int i = 0; i < 16; i++) + BlockMicroMaterial.createAndRegister(TinkerTools.multiBrickFancy, i); + } + + } +} From d2b06da1ecb8dfc50c12ffee623f7277381b023e Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Wed, 3 Dec 2014 20:57:28 +0100 Subject: [PATCH 123/129] The piercing damage of arrows/bolts doesn't determine whether an entity has been hit anymore (since it always hits since it's unblockable) --- src/main/java/tconstruct/library/entity/ProjectileBase.java | 2 -- src/main/java/tconstruct/weaponry/entity/ArrowEntity.java | 3 ++- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/tconstruct/library/entity/ProjectileBase.java b/src/main/java/tconstruct/library/entity/ProjectileBase.java index 7fe2d814732..4944ad67f1b 100644 --- a/src/main/java/tconstruct/library/entity/ProjectileBase.java +++ b/src/main/java/tconstruct/library/entity/ProjectileBase.java @@ -33,7 +33,6 @@ public abstract class ProjectileBase extends EntityArrow implements IEntityAddit public final static String stoneSound = Reference.resource("stoneHit"); public ItemStack returnStack; - public int returnStackSlot; public boolean bounceOnNoDamage = true; public boolean defused = false; // if this is true it wont hit any entities anymore @@ -67,7 +66,6 @@ public ProjectileBase(World world, EntityPlayer player, float speed, float accur this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, speed, accuracy); // our stuff - returnStackSlot = player.inventory.currentItem; returnStack = stack; /* diff --git a/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java b/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java index 2f3041bdb7e..8513ef954e4 100644 --- a/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java +++ b/src/main/java/tconstruct/weaponry/entity/ArrowEntity.java @@ -101,7 +101,8 @@ public boolean dealDamage(float damage, ToolCore ammo, NBTTagCompound tags, Enti //Minecraft.getMinecraft().thePlayer.sendChatMessage("Piercing Damage: " + shift); - dealtDamage |= entityHit.attackEntityFrom(damagesource, shift); + // piercing damage does not affect wether the entity was hit (return value), since it should go through always + entityHit.attackEntityFrom(damagesource, shift); } return dealtDamage; From 429c3b7fb78434c2ae10dcf807d1c78b05cec383 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Wed, 3 Dec 2014 20:58:07 +0100 Subject: [PATCH 124/129] Remove the dispenser behaviour for the old arrows --- .../tools/TDispenserBehaviorArrow.java | 47 ------------------- .../java/tconstruct/world/TinkerWorld.java | 2 - 2 files changed, 49 deletions(-) delete mode 100644 src/main/java/tconstruct/tools/TDispenserBehaviorArrow.java diff --git a/src/main/java/tconstruct/tools/TDispenserBehaviorArrow.java b/src/main/java/tconstruct/tools/TDispenserBehaviorArrow.java deleted file mode 100644 index 917020e64cc..00000000000 --- a/src/main/java/tconstruct/tools/TDispenserBehaviorArrow.java +++ /dev/null @@ -1,47 +0,0 @@ -package tconstruct.tools; - -import net.minecraft.block.BlockDispenser; -import net.minecraft.dispenser.*; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; -import net.minecraft.world.World; -import tconstruct.tools.entity.ArrowEntity; - -public class TDispenserBehaviorArrow extends BehaviorDefaultDispenseItem -{ - - @Override - public ItemStack dispenseStack (IBlockSource dispenser, ItemStack stack) - { - World world = dispenser.getWorld(); - // TODO getIPositionFromBlockSource - IPosition iposition = BlockDispenser.func_149939_a(dispenser); - // TODO getFacing - EnumFacing enumfacing = BlockDispenser.func_149937_b(dispenser.getBlockMetadata()); - - ItemStack arrowItem = stack.splitStack(1); - - ArrowEntity projectile = new ArrowEntity(world, iposition.getX(), iposition.getY(), iposition.getZ(), arrowItem); - projectile.canBePickedUp = 1; - projectile.setThrowableHeading((double) enumfacing.getFrontOffsetX(), (double) ((float) enumfacing.getFrontOffsetY() + 0.1F), (double) enumfacing.getFrontOffsetZ(), this.func_82500_b(), this.func_82498_a()); - world.spawnEntityInWorld(projectile); - - return stack; - } - - @Override - protected void playDispenseSound (IBlockSource dispenser) - { - dispenser.getWorld().playAuxSFX(1002, dispenser.getXInt(), dispenser.getYInt(), dispenser.getZInt(), 0); - } - - protected float func_82498_a () - { - return 6.0F; - } - - protected float func_82500_b () - { - return 1.1F; - } -} diff --git a/src/main/java/tconstruct/world/TinkerWorld.java b/src/main/java/tconstruct/world/TinkerWorld.java index 24945fe8681..6b62a1fc93a 100644 --- a/src/main/java/tconstruct/world/TinkerWorld.java +++ b/src/main/java/tconstruct/world/TinkerWorld.java @@ -564,8 +564,6 @@ public void oreRegistry () BlockDispenser.dispenseBehaviorRegistry.putObject(TinkerTools.titleIcon, new TDispenserBehaviorSpawnEgg()); - BlockDispenser.dispenseBehaviorRegistry.putObject(TinkerTools.arrow, new TDispenserBehaviorArrow()); - // Vanilla stuff OreDictionary.registerOre("slimeball", new ItemStack(Items.slime_ball)); OreDictionary.registerOre("slimeball", new ItemStack(TinkerWorld.strangeFood, 1, 0)); From d16acb6846c09d5e8390b22602880165d524373e Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Wed, 3 Dec 2014 21:26:32 +0100 Subject: [PATCH 125/129] Tinker arrows/bolts/shuriken/throwingknives/javelins now work with dispensers :OOoo --- .../util/BehaviorProjectileBaseDispense.java | 74 +++++++++++++++++++ .../tconstruct/library/weaponry/AmmoItem.java | 8 ++ .../library/weaponry/AmmoWeapon.java | 3 +- .../tconstruct/library/weaponry/IAmmo.java | 7 ++ .../tconstruct/weaponry/TinkerWeaponry.java | 57 ++++++++++++++ 5 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 src/main/java/tconstruct/library/util/BehaviorProjectileBaseDispense.java diff --git a/src/main/java/tconstruct/library/util/BehaviorProjectileBaseDispense.java b/src/main/java/tconstruct/library/util/BehaviorProjectileBaseDispense.java new file mode 100644 index 00000000000..784849cbe26 --- /dev/null +++ b/src/main/java/tconstruct/library/util/BehaviorProjectileBaseDispense.java @@ -0,0 +1,74 @@ +package tconstruct.library.util; + +import net.minecraft.block.BlockDispenser; +import net.minecraft.dispenser.BehaviorDefaultDispenseItem; +import net.minecraft.dispenser.IBlockSource; +import net.minecraft.dispenser.IPosition; +import net.minecraft.entity.Entity; +import net.minecraft.entity.IProjectile; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; +import tconstruct.library.entity.ProjectileBase; +import tconstruct.library.weaponry.IAmmo; + +public abstract class BehaviorProjectileBaseDispense extends BehaviorDefaultDispenseItem { + /** + * Dispense the specified stack, play the dispense sound and spawn particles. + */ + @Override + public ItemStack dispenseStack(IBlockSource blockSource, ItemStack stack) + { + World world = blockSource.getWorld(); + IPosition iposition = BlockDispenser.func_149939_a(blockSource); + EnumFacing enumfacing = BlockDispenser.func_149937_b(blockSource.getBlockMetadata()); + + ItemStack reference; + + if(stack.getItem() instanceof IAmmo) + { + IAmmo ammo = (IAmmo) stack.getItem(); + // needs ammo to shoot + if(ammo.getAmmoCount(stack) <= 0) + return stack; + ammo.consumeAmmo(1, stack); + reference = stack.copy(); + ((IAmmo)reference.getItem()).setAmmo(1, reference); + } + else + reference = stack.splitStack(1); + + ProjectileBase projectile = this.getProjectileEntity(world, iposition, reference); + projectile.setThrowableHeading((double)enumfacing.getFrontOffsetX(), (double)((float)enumfacing.getFrontOffsetY() + ballistic()), (double)enumfacing.getFrontOffsetZ(), this.accuraccy(), this.speed()); + projectile.returnStack = reference; + projectile.canBePickedUp = 1; + world.spawnEntityInWorld(projectile); + + return stack; + } + + /** + * Play the dispense sound from the specified block. + */ + protected void playDispenseSound(IBlockSource p_82485_1_) + { + p_82485_1_.getWorld().playAuxSFX(1002, p_82485_1_.getXInt(), p_82485_1_.getYInt(), p_82485_1_.getZInt(), 0); + } + + /** + * Return the projectile entity spawned by this dispense behavior. + */ + protected abstract ProjectileBase getProjectileEntity(World world, IPosition position, ItemStack stack); + + protected float speed() + { + return 6.0F; + } + + protected float accuraccy() + { + return 1.1F; + } + + protected float ballistic() { return 0.1f; } +} diff --git a/src/main/java/tconstruct/library/weaponry/AmmoItem.java b/src/main/java/tconstruct/library/weaponry/AmmoItem.java index 196e814ca4b..aeb80b94072 100644 --- a/src/main/java/tconstruct/library/weaponry/AmmoItem.java +++ b/src/main/java/tconstruct/library/weaponry/AmmoItem.java @@ -60,6 +60,14 @@ public int consumeAmmo(int toUse, ItemStack stack) { return toUse - (oldCount - newCount); } + @Override + public void setAmmo(int count, ItemStack stack) { + if(!stack.hasTagCompound()) return; + + NBTTagCompound tags = stack.getTagCompound().getCompoundTag("InfiTool"); + tags.setInteger("Ammo", count); + } + public float getAmmoModifier() { return 0.1f; } public boolean pickupAmmo(ItemStack stack, ItemStack candidate, EntityPlayer player) diff --git a/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java b/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java index fac9cc2804e..9209d55e6b2 100644 --- a/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java +++ b/src/main/java/tconstruct/library/weaponry/AmmoWeapon.java @@ -105,7 +105,8 @@ protected void launchProjectile(ItemStack stack, World world, EntityPlayer playe if(!world.isRemote) { ItemStack reference = stack.copy(); reference.stackSize = 1; - reference.getTagCompound().getCompoundTag("InfiTool").setInteger("Ammo", 1); + ((IAmmo)reference.getItem()).setAmmo(1, reference); + Entity projectile = createProjectile(reference, world, player, getAccuracy(stack, time), time); world.spawnEntityInWorld(projectile); } diff --git a/src/main/java/tconstruct/library/weaponry/IAmmo.java b/src/main/java/tconstruct/library/weaponry/IAmmo.java index 5ed123e8b5b..8c70a9c1885 100644 --- a/src/main/java/tconstruct/library/weaponry/IAmmo.java +++ b/src/main/java/tconstruct/library/weaponry/IAmmo.java @@ -35,4 +35,11 @@ public interface IAmmo { * @return The amount of ammo that couldn't be removed. If you try to remove 5, but only 3 are left, it'll return 2. */ int consumeAmmo(int count, ItemStack stack); + + /** + * Sets the Ammo amount to that absolute value. Behaviour for values below 0 or above the max ammo is undefined. + * @param count How much + * @param stack The itemstack to set the ammo for. Has to have proper NBT. + */ + void setAmmo(int count, ItemStack stack); } diff --git a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java index bf9ccfb24e9..37b82c296c6 100644 --- a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java +++ b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java @@ -9,19 +9,24 @@ import cpw.mods.fml.common.registry.GameRegistry; import mantle.pulsar.pulse.Handler; import mantle.pulsar.pulse.Pulse; +import net.minecraft.block.BlockDispenser; +import net.minecraft.dispenser.IPosition; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import tconstruct.TConstruct; import tconstruct.library.TConstructRegistry; import tconstruct.library.crafting.*; +import tconstruct.library.entity.ProjectileBase; import tconstruct.library.tools.DynamicToolPart; import tconstruct.library.tools.FletchlingLeafMaterial; +import tconstruct.library.util.BehaviorProjectileBaseDispense; import tconstruct.library.util.IPattern; import tconstruct.library.util.IToolPart; import tconstruct.modifiers.tools.ModAttack; @@ -36,6 +41,7 @@ import tconstruct.weaponry.ammo.ArrowAmmo; import tconstruct.weaponry.ammo.BoltAmmo; import tconstruct.library.tools.DualMaterialToolPart; +import tconstruct.weaponry.entity.*; import tconstruct.weaponry.items.GlassArrows; import tconstruct.weaponry.items.WeaponryPattern; import tconstruct.library.weaponry.AmmoItem; @@ -114,6 +120,8 @@ public void init(FMLInitializationEvent event) ModifyBuilder.registerModifier(TinkerTools.modAttack); TConstructRegistry.registerActiveToolMod(new WeaponryActiveToolMod()); + + registerDispenserProjectiles(); } @Handler @@ -389,4 +397,53 @@ private void setupCreativeTab() TConstructRegistry.weaponryTab.init(tool); } + + private void registerDispenserProjectiles() { + // shuriken + BlockDispenser.dispenseBehaviorRegistry.putObject(shuriken, new BehaviorProjectileBaseDispense() { + + @Override + protected ProjectileBase getProjectileEntity(World world, IPosition position, ItemStack stack) { + return new ShurikenEntity(world, position.getX(), position.getY(), position.getZ()); + } + + @Override + protected float ballistic() { + // shurikens are shot out straight + return 0f; + } + }); + // throwing knifes + BlockDispenser.dispenseBehaviorRegistry.putObject(throwingknife, new BehaviorProjectileBaseDispense() { + + @Override + protected ProjectileBase getProjectileEntity(World world, IPosition position, ItemStack stack) { + return new ThrowingKnifeEntity(world, position.getX(), position.getY(), position.getZ()); + } + }); + // Javelin + BlockDispenser.dispenseBehaviorRegistry.putObject(javelin, new BehaviorProjectileBaseDispense() { + + @Override + protected ProjectileBase getProjectileEntity(World world, IPosition position, ItemStack stack) { + return new JavelinEntity(world, position.getX(), position.getY(), position.getZ()); + } + }); + + // arrows + BlockDispenser.dispenseBehaviorRegistry.putObject(arrowAmmo, new BehaviorProjectileBaseDispense() { + @Override + protected ProjectileBase getProjectileEntity(World world, IPosition position, ItemStack stack) { + return new ArrowEntity(world, position.getX(), position.getY(), position.getZ()); + } + }); + + // bolts + BlockDispenser.dispenseBehaviorRegistry.putObject(boltAmmo, new BehaviorProjectileBaseDispense() { + @Override + protected ProjectileBase getProjectileEntity(World world, IPosition position, ItemStack stack) { + return new BoltEntity(world, position.getX(), position.getY(), position.getZ()); + } + }); + } } From 633814d6473894467b7c90a61732925bce374ed7 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sun, 7 Dec 2014 20:47:33 +0100 Subject: [PATCH 126/129] Fix reflected tinker projectiles not hitting stuff --- src/main/java/tconstruct/tools/TinkerToolEvents.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/tconstruct/tools/TinkerToolEvents.java b/src/main/java/tconstruct/tools/TinkerToolEvents.java index 550aa55b4ac..6a104b67aa7 100644 --- a/src/main/java/tconstruct/tools/TinkerToolEvents.java +++ b/src/main/java/tconstruct/tools/TinkerToolEvents.java @@ -23,6 +23,7 @@ import tconstruct.TConstruct; import tconstruct.armor.player.TPlayerStats; import tconstruct.library.TConstructRegistry; +import tconstruct.library.entity.ProjectileBase; import tconstruct.library.event.*; import tconstruct.library.tools.*; import tconstruct.util.ItemHelper; @@ -276,6 +277,12 @@ public void onAttack (LivingAttackEvent event) // projectile.prevRotationYaw -= 180.0F; // not needed at the client since it gets the absolute values sent + + + // tinker projectiles don't check for stuff hit to prevent weird behaviour. + // we have to de-defuse them so the reflected projectiles can hit stuff again + if(projectile instanceof ProjectileBase) + ((ProjectileBase) projectile).defused = false; } } else From d3c4ab0d0ecb93c74b0c35ae9da9a03ee7e75cd2 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sat, 13 Dec 2014 15:53:02 +0100 Subject: [PATCH 127/129] Fix arrow stuff buttons being in the stencil table twice --- src/main/java/tconstruct/tools/ToolProxyClient.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/tconstruct/tools/ToolProxyClient.java b/src/main/java/tconstruct/tools/ToolProxyClient.java index 31870e54069..b8efe4c1d01 100644 --- a/src/main/java/tconstruct/tools/ToolProxyClient.java +++ b/src/main/java/tconstruct/tools/ToolProxyClient.java @@ -342,10 +342,6 @@ void addStencilButtons () {}, { 4, 3 }, // crossbar { 3, 3 }, // small guard { 2, 3 }, // wide guard - - {}, { 11, 3 }, // arrow head - { 12, 3 }, // fletchling - { 10, 3 }, // bowstring }; int i = 0; From da254927a61f856520b626c38cc8eea2adb78ad5 Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sat, 13 Dec 2014 15:53:16 +0100 Subject: [PATCH 128/129] Fix Thaumium toolparts for weaponry parts --- src/main/java/tconstruct/tools/TinkerTools.java | 15 ++++++++++++--- .../java/tconstruct/weaponry/TinkerWeaponry.java | 11 +++-------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/main/java/tconstruct/tools/TinkerTools.java b/src/main/java/tconstruct/tools/TinkerTools.java index 2e7c09d2fb4..945bb96e00d 100644 --- a/src/main/java/tconstruct/tools/TinkerTools.java +++ b/src/main/java/tconstruct/tools/TinkerTools.java @@ -708,9 +708,18 @@ private void modIntegration () TConstructRegistry.addPartMapping(TinkerTools.woodPattern, meta + 1, 31, new ItemStack(TinkerTools.patternOutputs[meta], 1, 31)); } - TConstructRegistry.addBowstringMaterial(1, 2, new ItemStack((Item) obj, 1, 7), new ItemStack(TinkerWeaponry.bowstring, 1, 1), 1F, 0.8F, 0.9f, 0x63bcd9); - TConstructRegistry.addBowMaterial(31, 35, 4.75f); - TConstructRegistry.addArrowMaterial(31, 1.8F, 0.5F); + // Thaumium weaponry toolparts + if(TConstruct.pulsar.isPulseLoaded("Tinkers' Weaponry")) + { + for (int m = 0; m < TinkerWeaponry.patternOutputs.length; m++) + TConstructRegistry.addPartMapping(TinkerWeaponry.woodPattern, m, MaterialID.Thaumium, new ItemStack(TinkerWeaponry.patternOutputs[m], 1, MaterialID.Thaumium)); + + TConstructRegistry.addPartMapping(TinkerTools.woodPattern, 25, MaterialID.Thaumium, new ItemStack(TinkerWeaponry.arrowhead, 1, MaterialID.Thaumium)); + + TConstructRegistry.addBowstringMaterial(1, 2, new ItemStack((Item) obj, 1, 7), new ItemStack(TinkerWeaponry.bowstring, 1, 1), 1F, 0.8F, 0.9f, 0x63bcd9); + TConstructRegistry.addBowMaterial(31, 35, 4.75f); + TConstructRegistry.addArrowMaterial(31, 1.8F, 0.5F); + } TConstructRegistry.addDefaultToolPartMaterial(MaterialID.Thaumium); TConstructRegistry.addDefaultShardMaterial(MaterialID.Thaumium); diff --git a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java index 37b82c296c6..c5f7af74a26 100644 --- a/src/main/java/tconstruct/weaponry/TinkerWeaponry.java +++ b/src/main/java/tconstruct/weaponry/TinkerWeaponry.java @@ -94,6 +94,8 @@ public class TinkerWeaponry { public static Random random = new Random(); + public static Item[] patternOutputs; + @Handler public void preInit(FMLPreInitializationEvent event) { @@ -204,7 +206,7 @@ private void addPartRecipies() // todo: integrate into tcon int[] nonMetals = { 0, 1, 3, 4, 5, 6, 7, 8, 9, 17 }; int[] liquidDamage = new int[] { 2, 13, 10, 11, 12, 14, 15, 6, 16, 18 }; - Item[] patternOutputs = new Item[] { partShuriken, partCrossbowLimb, partCrossbowBody, partBowLimb }; + patternOutputs = new Item[] { partShuriken, partCrossbowLimb, partCrossbowBody, partBowLimb }; // register part crafting @@ -255,13 +257,6 @@ private void addPartRecipies() tableCasting.addCastingRecipe(metalCast, new FluidStack(fs, fluidAmount), cast, 50); Smeltery.addMelting(FluidType.getFluidType(fs), metalCast, 0, fluidAmount); } - - // Thaumium weaponry toolparts - if(TinkerTools.thaumcraftAvailable) - { - for (int m = 0; m < patternOutputs.length; m++) - TConstructRegistry.addPartMapping(woodPattern, m, MaterialID.Thaumium, new ItemStack(patternOutputs[m], 1, MaterialID.Thaumium)); - } } private void registerLegendaries() From f9067594e00b7f38e4c626ff65faa8bc65e1ecdc Mon Sep 17 00:00:00 2001 From: Bernhard Bonigl Date: Sat, 13 Dec 2014 16:31:49 +0100 Subject: [PATCH 129/129] Fix arrows not hitting stuff after being deflected/damage rejected --- src/main/java/tconstruct/library/entity/ProjectileBase.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/tconstruct/library/entity/ProjectileBase.java b/src/main/java/tconstruct/library/entity/ProjectileBase.java index 4944ad67f1b..aec11e9ff41 100644 --- a/src/main/java/tconstruct/library/entity/ProjectileBase.java +++ b/src/main/java/tconstruct/library/entity/ProjectileBase.java @@ -171,6 +171,7 @@ public void onHitBlock(MovingObjectPosition movingobjectposition) { this.inGround = true; this.arrowShake = 7; this.setIsCritical(false); + this.defused = true; // defuse it so it doesn't hit stuff anymore, being weird if (this.field_145790_g.getMaterial() != Material.air) { @@ -237,7 +238,6 @@ public void onHitEntity(MovingObjectPosition movingobjectposition) { this.rotationYaw += 180.0F; this.prevRotationYaw += 180.0F; this.ticksInAir = 0; - defused = true; return; } // we hit it, BURNNNNNN @@ -261,7 +261,6 @@ public void onHitEntity(MovingObjectPosition movingobjectposition) { this.motionY = 0; this.motionZ = 0; this.ticksInAir = 0; - defused = true; } } }

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 = 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