From 3e69ed407474dd46003e63930ac0aba19b80139f Mon Sep 17 00:00:00 2001 From: Gordon-Frohman <58332807+Gordon-Frohman@users.noreply.github.com> Date: Sat, 29 Jun 2024 16:58:37 +0700 Subject: [PATCH] Various additions (#44) * Update .gitignore * Trophy pedestal tweaks "You are unwothy." message is now translatable. Added russian translation Deactivated pedestal can (finally) be collected * Add mini-bosses and Questing Ram trophies Unobtainable yet * Add trophy drops Now you can finally collect them all! * Spotless apply * Fix Aurora Palace map icon * Add trophy pedestal comparator output * Change trophy sound to cloth * Add yeti sounds * Add trophy sounds * Trophies are now wearable * Move Knightmetal Ring texture to center * Custom stalactite generation * Remove test stalactite generator * Update TFGenCaveStalactite.java Added metadata for stalactite blocks Added an option to clear stalactite lists entirely * Add tooltips for compressed blocks "Usable for Beacon bases", just like in TiC * Add traits for compressed blocks - Fiery metal blocks now sustain fire, provide light and damage player standing in top (unless he/she wears fiery boots or sneaks), just like magma blocks from future versions - Fur and steeleaf blocks now decrease fall damage 75% and 25% accorgingly * Add fiery block renderer Now it renders with glowing outline + Multiple blocks render seamlessly, but it can sometimes look awkward * Fiery blood/tears are now interchangeable in NEI ***OreDictionary magic*** * Add direct fiery armor crafting from iron armor * Attempt to fix server crash * Update ItemBlockTFCompressed.java * IDK, maybe this should help * Spotless applied * Revert "Spotless applied" This reverts commit bfa25e433f948553495339fc11605a5ce6249056. * Revert "IDK, maybe this should help" This reverts commit 96e2acc6cc8248bac25983456348e17f8d522117. * Revert "Update ItemBlockTFCompressed.java" This reverts commit ecfd4cf651546130ecf4e02ac859589ea0f11e39. * Remove 'static' from renderer methods * Revert "Remove 'static' from renderer methods" This reverts commit 3edfab335f6eec6df7359c820f9addbd0c57cc1a. * Please work * Remove item renderer registeration For testing purposes * Make fiery block item render client only * Make trophies equippable with Shift+rightclicking * Make outdated tooltip universal * Rename "Trophy armor" to "Decorative armor" * Make fireflies, cicadas and moonworms wearable * Revert "Update TFGenCaveStalactite.java" This reverts commit a7fa7a46476a42b6d4ebf4e9b8c81a72f69acd20. * Revert "Remove test stalactite generator" This reverts commit 93125823eb4e3ce932dfc34ba0a735371af5f72d. * Revert "Custom stalactite generation" This reverts commit 6877a79f0223817337ab0ac3a3fbf5e5640ba6ba. * Update TFRecipes.java Huge water lily and thorn rose can now be crafted into magenta and red dye accordingly * Wispy clouds can now be harvested Any tool will do Silk touch required * Achievements tuning "Twilight hunter" and progression achievements now can only be gained when in Twilight Forest * Mosquitos are now count as arthropods * Druid skeletons now don't cast without a hoe In case you can take it away from it somehow * Add missing boss spawners For Minoshroom, Alpha Yeti and Snow Queen * Fix boss spawner names * Every boss now leave behind its spawner when going into peaceful * Spotless applied * Ice bomb tweaks Now adds snow to already existing layers Snow generation shape is now more circular * Charms effects finally render properly * Thorn rose tweaking Thorn rose can now be placed on leaves and any blocks that can sustain flowers * Add way of getting progression achievements using new trophies * Charms of Keeping now keep inventory even if you log out instead of respawning * Update TFEventListener.java * Phantom armor features Now Phantom armor will be kept on death regardless of having any Charms of Keeping Added corresponding tooltip * Crumble horn can now crumble much more blocks * Fixed generated water not flowing * Fixed (another) nagastone crash * Add chests made of twilight wood + trapped versions * Fix chests render * Allow projectiles to break burnt thorns * Bugs can now be killed with projectiles Fireflies will drop glowstone, cicadas will drop green dye, and moonworms will drop lime dye * Cicadas now shut up once broken * Update to match the master branch * Remove broken import * Etched nagastone direction is now never null * Add missing check for Baubles * Add cicada client check * Update BlockTFCicada.java * Register missing tile entities * Remove ISound from TileEntityTFCicada * Fix a stupid mistake * Remove @SideOnly(Side.CLIENT) from BlockTFCicada * Remove ISound from BlockTFCicada as well Maybe this should do the trick * Remove ALL client-related stuff from TileEntityTFCicada * Remove unnecessary stuff * Update TFClientProxy.java * Spotless applied * Update BlockTFCicada.java * Remove unnecessary tessellator calls * Fix fiery metal block brightness * Add GTNH check for recipes * Fix cicada crash * Spotless applied * Fix chest issues --------- Co-authored-by: Martin Robertz --- .gitignore | 86 ------ .../java/twilightforest/TFCommonProxy.java | 26 ++ .../java/twilightforest/TFEventListener.java | 119 ++++++--- .../java/twilightforest/TFPlayerHandler.java | 126 +++++++++ src/main/java/twilightforest/TFTreasure.java | 21 +- .../twilightforest/TwilightForestMod.java | 17 +- .../block/BlockTFBossSpawner.java | 18 +- .../block/BlockTFBurntThorns.java | 3 +- .../twilightforest/block/BlockTFChest.java | 87 ++++++ .../twilightforest/block/BlockTFCicada.java | 58 ++++ .../block/BlockTFCompressed.java | 199 +++++++++++++- .../twilightforest/block/BlockTFCritter.java | 76 +++++- .../twilightforest/block/BlockTFFirefly.java | 2 +- .../twilightforest/block/BlockTFMoonworm.java | 3 + .../block/BlockTFNagastone.java | 1 - .../block/BlockTFThornRose.java | 12 +- .../twilightforest/block/BlockTFTrophy.java | 109 ++++++++ .../block/BlockTFTrophyPedestal.java | 76 +++++- .../block/BlockTFWispyCloud.java | 29 +- .../java/twilightforest/block/TFBlocks.java | 68 ++++- .../twilightforest/client/TFClientProxy.java | 114 +++++++- .../client/model/ModelTFChest.java | 17 ++ .../client/model/ModelTFCritterArmor.java | 77 ++++++ .../client/model/ModelTFLargeChest.java | 17 ++ .../client/model/ModelTFQuestRam.java | 26 +- .../client/model/ModelTFTrophyArmor.java | 170 ++++++++++++ .../client/model/ModelTFYetiAlpha.java | 26 ++ .../renderer/TFFieryMetalBlockRenderer.java | 57 ++++ .../renderer/TileEntityTFChestRenderer.java | 158 +++++++++++ .../TileEntityTFMoonwormRenderer.java | 8 +- .../renderer/TileEntityTFTrophyRenderer.java | 127 ++++++++- .../blocks/RenderBlockTFCastleMagic.java | 20 -- .../renderer/blocks/RenderBlockTFChest.java | 51 ++++ .../blocks/RenderBlockTFFieryMetal.java | 249 ++++++++++++++++++ .../blocks/RenderBlockTFFireflyJar.java | 26 -- .../blocks/RenderBlockTFKnightMetal.java | 10 - .../blocks/RenderBlockTFMagicLeaves.java | 10 - .../blocks/RenderBlockTFNagastone.java | 10 - .../blocks/RenderBlockTFNagastone2.java | 10 - .../blocks/RenderBlockTFNagastoneStairs.java | 10 - .../blocks/RenderBlockTFPedestal.java | 10 - .../blocks/RenderBlockTFSpiralBricks.java | 10 - .../renderer/blocks/RenderBlockTFThorns.java | 10 - .../client/renderer/entity/RenderTFCharm.java | 79 ------ .../entity/EntityTFAdherent.java | 4 +- .../entity/EntityTFBlockGoblin.java | 3 +- .../entity/EntityTFBoggard.java | 3 +- .../entity/EntityTFCharmEffect.java | 99 +++++-- .../entity/EntityTFDeathTome.java | 4 +- .../entity/EntityTFFireBeetle.java | 4 +- .../entity/EntityTFHarbingerCube.java | 4 +- .../entity/EntityTFHedgeSpider.java | 4 +- .../entity/EntityTFHelmetCrab.java | 4 +- .../entity/EntityTFHostileWolf.java | 4 +- .../entity/EntityTFIceExploder.java | 3 +- .../entity/EntityTFIceShooter.java | 3 +- .../twilightforest/entity/EntityTFKobold.java | 3 +- .../entity/EntityTFMinotaur.java | 4 +- .../entity/EntityTFMosquitoSwarm.java | 12 +- .../entity/EntityTFPinchBeetle.java | 4 +- .../twilightforest/entity/EntityTFRedcap.java | 3 +- .../entity/EntityTFRedcapSapper.java | 4 +- .../entity/EntityTFSkeletonDruid.java | 78 +++++- .../entity/EntityTFSlimeBeetle.java | 4 +- .../entity/EntityTFSwarmSpider.java | 4 +- .../twilightforest/entity/EntityTFTroll.java | 4 +- .../twilightforest/entity/EntityTFWraith.java | 3 +- .../twilightforest/entity/EntityTFYeti.java | 31 ++- .../entity/ai/EntityAITFThrowRider.java | 5 + .../entity/boss/EntityTFHydra.java | 68 ++++- .../entity/boss/EntityTFIceBomb.java | 9 +- .../entity/boss/EntityTFKnightPhantom.java | 36 ++- .../entity/boss/EntityTFLich.java | 47 +++- .../entity/boss/EntityTFLichMinion.java | 4 +- .../entity/boss/EntityTFMinoshroom.java | 62 +++++ .../entity/boss/EntityTFNaga.java | 10 +- .../entity/boss/EntityTFSnowQueen.java | 57 +++- .../entity/boss/EntityTFUrGhast.java | 49 +++- .../entity/boss/EntityTFYetiAlpha.java | 87 +++++- .../entity/passive/EntityTFBighorn.java | 4 +- .../entity/passive/EntityTFBoar.java | 4 +- .../entity/passive/EntityTFBunny.java | 4 +- .../entity/passive/EntityTFDeer.java | 4 +- .../entity/passive/EntityTFPenguin.java | 4 +- .../entity/passive/EntityTFQuestRam.java | 10 + .../entity/passive/EntityTFSquirrel.java | 4 +- .../entity/passive/EntityTFTinyBird.java | 3 +- .../integration/TFBaublesIntegration.java | 57 ++++ .../integration/TFThaumcraftIntegration.java | 3 + .../TFTinkerConstructIntegration.java | 28 ++ .../item/ItemBlockTFCompressed.java | 32 +++ .../item/ItemBlockTFCritter.java | 29 ++ .../twilightforest/item/ItemTFChainBlock.java | 5 +- .../twilightforest/item/ItemTFCritter.java | 176 +++++++++++++ .../item/ItemTFCrumbleHorn.java | 137 +++++++++- .../item/ItemTFKnightlyArmor.java | 4 +- .../item/ItemTFPhantomArmor.java | 13 + .../twilightforest/item/ItemTFTrophy.java | 48 +++- .../java/twilightforest/item/TFItems.java | 5 + .../java/twilightforest/item/TFRecipes.java | 84 +++++- ...mponentTFNagaCourtyardRotatedAbstract.java | 18 +- .../ComponentTFNagaCourtyardTerraceDuct.java | 43 ++- .../TileEntityTFAlphaYetiSpawner.java | 20 ++ .../tileentity/TileEntityTFChest.java | 117 ++++++++ .../tileentity/TileEntityTFCicada.java | 19 +- .../tileentity/TileEntityTFHydraSpawner.java | 12 + .../TileEntityTFKnightPhantomsSpawner.java | 4 +- .../TileEntityTFMinoshroomSpawner.java | 20 ++ .../TileEntityTFTowerBossSpawner.java | 11 + .../resources/META-INF/twilightforest_at.cfg | 3 + .../assets/twilightforest/lang/en_US.lang | 32 ++- .../assets/twilightforest/lang/ru_RU.lang | 42 ++- .../assets/twilightforest/sounds.json | 54 ++++ .../twilightforest/sounds/mob/yeti/alert.ogg | Bin 0 -> 12194 bytes .../twilightforest/sounds/mob/yeti/death.ogg | Bin 0 -> 43874 bytes .../twilightforest/sounds/mob/yeti/grab.ogg | Bin 0 -> 12573 bytes .../twilightforest/sounds/mob/yeti/growl1.ogg | Bin 0 -> 28167 bytes .../twilightforest/sounds/mob/yeti/growl2.ogg | Bin 0 -> 34212 bytes .../twilightforest/sounds/mob/yeti/growl3.ogg | Bin 0 -> 36225 bytes .../twilightforest/sounds/mob/yeti/hurt1.ogg | Bin 0 -> 12528 bytes .../twilightforest/sounds/mob/yeti/hurt2.ogg | Bin 0 -> 9368 bytes .../twilightforest/sounds/mob/yeti/hurt3.ogg | Bin 0 -> 12431 bytes .../twilightforest/sounds/mob/yeti/pant1.ogg | Bin 0 -> 10560 bytes .../twilightforest/sounds/mob/yeti/pant2.ogg | Bin 0 -> 15430 bytes .../twilightforest/sounds/mob/yeti/pant3.ogg | Bin 0 -> 9717 bytes .../twilightforest/sounds/mob/yeti/roar.ogg | Bin 0 -> 29233 bytes .../twilightforest/sounds/mob/yeti/throw.ogg | Bin 0 -> 13152 bytes .../textures/blocks/fiery_block_inner.png | Bin 0 -> 4476 bytes .../blocks/fiery_block_inner_cross.png | Bin 0 -> 933 bytes .../blocks/fiery_block_inner_full.png | Bin 0 -> 4486 bytes .../blocks/fiery_block_inner_horizontal.png | Bin 0 -> 866 bytes .../blocks/fiery_block_inner_vertical.png | Bin 0 -> 899 bytes .../textures/blocks/fiery_pattern.png | Bin 0 -> 4629 bytes .../twilightforest/textures/gui/mapicons.png | Bin 1274 -> 5351 bytes .../textures/items/alphaYetiTrophy.png | Bin 0 -> 4474 bytes .../textures/items/chainBlockRing.png | Bin 0 -> 152 bytes .../textures/items/knightPhantomTrophy.png | Bin 0 -> 4491 bytes .../textures/items/knightmetalRing.png | Bin 152 -> 4278 bytes .../textures/items/minoshroomTrophy.png | Bin 0 -> 4430 bytes .../textures/items/questingRamTrophy.png | Bin 0 -> 4545 bytes .../textures/items/trophyTemplate.xcf | Bin 0 -> 7707 bytes .../textures/model/chest/canopy.png | Bin 0 -> 5226 bytes .../textures/model/chest/canopy_double.png | Bin 0 -> 5693 bytes .../textures/model/chest/darkwood.png | Bin 0 -> 5020 bytes .../textures/model/chest/darkwood_double.png | Bin 0 -> 5411 bytes .../textures/model/chest/double.xcf | Bin 0 -> 60985 bytes .../textures/model/chest/mangrove.png | Bin 0 -> 5086 bytes .../textures/model/chest/mangrove_double.png | Bin 0 -> 5403 bytes .../textures/model/chest/mining.png | Bin 0 -> 5143 bytes .../textures/model/chest/mining_double.png | Bin 0 -> 5613 bytes .../textures/model/chest/normal.xcf | Bin 0 -> 40623 bytes .../textures/model/chest/sort.png | Bin 0 -> 5008 bytes .../textures/model/chest/sort_double.png | Bin 0 -> 5333 bytes .../textures/model/chest/time.png | Bin 0 -> 5118 bytes .../textures/model/chest/time_double.png | Bin 0 -> 5750 bytes .../textures/model/chest/trans.png | Bin 0 -> 5214 bytes .../textures/model/chest/trans_double.png | Bin 0 -> 6301 bytes .../textures/model/chest/twilight.png | Bin 0 -> 5099 bytes .../textures/model/chest/twilight_double.png | Bin 0 -> 5523 bytes .../textures/model/phantomtrophy.png | Bin 0 -> 6054 bytes 160 files changed, 3679 insertions(+), 539 deletions(-) create mode 100644 src/main/java/twilightforest/TFPlayerHandler.java create mode 100644 src/main/java/twilightforest/block/BlockTFChest.java create mode 100644 src/main/java/twilightforest/client/model/ModelTFChest.java create mode 100644 src/main/java/twilightforest/client/model/ModelTFCritterArmor.java create mode 100644 src/main/java/twilightforest/client/model/ModelTFLargeChest.java create mode 100644 src/main/java/twilightforest/client/model/ModelTFTrophyArmor.java create mode 100644 src/main/java/twilightforest/client/renderer/TFFieryMetalBlockRenderer.java create mode 100644 src/main/java/twilightforest/client/renderer/TileEntityTFChestRenderer.java create mode 100644 src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFChest.java create mode 100644 src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFFieryMetal.java delete mode 100644 src/main/java/twilightforest/client/renderer/entity/RenderTFCharm.java create mode 100644 src/main/java/twilightforest/item/ItemBlockTFCompressed.java create mode 100644 src/main/java/twilightforest/item/ItemBlockTFCritter.java create mode 100644 src/main/java/twilightforest/item/ItemTFCritter.java create mode 100644 src/main/java/twilightforest/tileentity/TileEntityTFAlphaYetiSpawner.java create mode 100644 src/main/java/twilightforest/tileentity/TileEntityTFChest.java create mode 100644 src/main/java/twilightforest/tileentity/TileEntityTFMinoshroomSpawner.java create mode 100644 src/main/resources/assets/twilightforest/sounds/mob/yeti/alert.ogg create mode 100644 src/main/resources/assets/twilightforest/sounds/mob/yeti/death.ogg create mode 100644 src/main/resources/assets/twilightforest/sounds/mob/yeti/grab.ogg create mode 100644 src/main/resources/assets/twilightforest/sounds/mob/yeti/growl1.ogg create mode 100644 src/main/resources/assets/twilightforest/sounds/mob/yeti/growl2.ogg create mode 100644 src/main/resources/assets/twilightforest/sounds/mob/yeti/growl3.ogg create mode 100644 src/main/resources/assets/twilightforest/sounds/mob/yeti/hurt1.ogg create mode 100644 src/main/resources/assets/twilightforest/sounds/mob/yeti/hurt2.ogg create mode 100644 src/main/resources/assets/twilightforest/sounds/mob/yeti/hurt3.ogg create mode 100644 src/main/resources/assets/twilightforest/sounds/mob/yeti/pant1.ogg create mode 100644 src/main/resources/assets/twilightforest/sounds/mob/yeti/pant2.ogg create mode 100644 src/main/resources/assets/twilightforest/sounds/mob/yeti/pant3.ogg create mode 100644 src/main/resources/assets/twilightforest/sounds/mob/yeti/roar.ogg create mode 100644 src/main/resources/assets/twilightforest/sounds/mob/yeti/throw.ogg create mode 100644 src/main/resources/assets/twilightforest/textures/blocks/fiery_block_inner.png create mode 100644 src/main/resources/assets/twilightforest/textures/blocks/fiery_block_inner_cross.png create mode 100644 src/main/resources/assets/twilightforest/textures/blocks/fiery_block_inner_full.png create mode 100644 src/main/resources/assets/twilightforest/textures/blocks/fiery_block_inner_horizontal.png create mode 100644 src/main/resources/assets/twilightforest/textures/blocks/fiery_block_inner_vertical.png create mode 100644 src/main/resources/assets/twilightforest/textures/blocks/fiery_pattern.png create mode 100644 src/main/resources/assets/twilightforest/textures/items/alphaYetiTrophy.png create mode 100644 src/main/resources/assets/twilightforest/textures/items/chainBlockRing.png create mode 100644 src/main/resources/assets/twilightforest/textures/items/knightPhantomTrophy.png create mode 100644 src/main/resources/assets/twilightforest/textures/items/minoshroomTrophy.png create mode 100644 src/main/resources/assets/twilightforest/textures/items/questingRamTrophy.png create mode 100644 src/main/resources/assets/twilightforest/textures/items/trophyTemplate.xcf create mode 100644 src/main/resources/assets/twilightforest/textures/model/chest/canopy.png create mode 100644 src/main/resources/assets/twilightforest/textures/model/chest/canopy_double.png create mode 100644 src/main/resources/assets/twilightforest/textures/model/chest/darkwood.png create mode 100644 src/main/resources/assets/twilightforest/textures/model/chest/darkwood_double.png create mode 100644 src/main/resources/assets/twilightforest/textures/model/chest/double.xcf create mode 100644 src/main/resources/assets/twilightforest/textures/model/chest/mangrove.png create mode 100644 src/main/resources/assets/twilightforest/textures/model/chest/mangrove_double.png create mode 100644 src/main/resources/assets/twilightforest/textures/model/chest/mining.png create mode 100644 src/main/resources/assets/twilightforest/textures/model/chest/mining_double.png create mode 100644 src/main/resources/assets/twilightforest/textures/model/chest/normal.xcf create mode 100644 src/main/resources/assets/twilightforest/textures/model/chest/sort.png create mode 100644 src/main/resources/assets/twilightforest/textures/model/chest/sort_double.png create mode 100644 src/main/resources/assets/twilightforest/textures/model/chest/time.png create mode 100644 src/main/resources/assets/twilightforest/textures/model/chest/time_double.png create mode 100644 src/main/resources/assets/twilightforest/textures/model/chest/trans.png create mode 100644 src/main/resources/assets/twilightforest/textures/model/chest/trans_double.png create mode 100644 src/main/resources/assets/twilightforest/textures/model/chest/twilight.png create mode 100644 src/main/resources/assets/twilightforest/textures/model/chest/twilight_double.png create mode 100644 src/main/resources/assets/twilightforest/textures/model/phantomtrophy.png diff --git a/.gitignore b/.gitignore index 6e337fc088..5e80e0ae57 100644 --- a/.gitignore +++ b/.gitignore @@ -36,89 +36,3 @@ addon.local.gradle.kts addon.late.local.gradle addon.late.local.gradle.kts layout.json -src/main/resources/assets/tinker/textures/items/textures to draw/_sword_accessory.png -src/main/resources/assets/tinker/textures/items/textures to draw/_shuriken.png -src/main/resources/assets/tinker/textures/items/textures to draw/_shuriken (2).png -src/main/resources/assets/tinker/textures/items/textures to draw/_shovel_handle.png -src/main/resources/assets/tinker/textures/items/textures to draw/_scythe_handle.png -src/main/resources/assets/tinker/textures/items/textures to draw/_scythe_binding.png -src/main/resources/assets/tinker/textures/items/textures to draw/_scythe_accessory.png -src/main/resources/assets/tinker/textures/items/textures to draw/_rod.png -src/main/resources/assets/tinker/textures/items/textures to draw/_rapier_handle.png -src/main/resources/assets/tinker/textures/items/textures to draw/_rapier_accessory.png -src/main/resources/assets/tinker/textures/items/textures to draw/_pickaxe_handle.png -src/main/resources/assets/tinker/textures/items/textures to draw/_pickaxe_accessory.png -src/main/resources/assets/tinker/textures/items/textures to draw/_medium_guard.png -src/main/resources/assets/tinker/textures/items/textures to draw/_mattock_handle.png -src/main/resources/assets/tinker/textures/items/textures to draw/_lumberaxe_handle.png -src/main/resources/assets/tinker/textures/items/textures to draw/_lumberaxe_binding.png -src/main/resources/assets/tinker/textures/items/textures to draw/_longsword_handle.png -src/main/resources/assets/tinker/textures/items/textures to draw/_longsword_accessory.png -src/main/resources/assets/tinker/textures/items/textures to draw/_large_guard.png -src/main/resources/assets/tinker/textures/items/textures to draw/_knife_handle.png -src/main/resources/assets/tinker/textures/items/textures to draw/_knife_blade.png -src/main/resources/assets/tinker/textures/items/textures to draw/_knife_blade (2).png -src/main/resources/assets/tinker/textures/items/textures to draw/_javelin_head_broken.png -src/main/resources/assets/tinker/textures/items/textures to draw/_javelin_head.png -src/main/resources/assets/tinker/textures/items/textures to draw/_javelin_handle.png -src/main/resources/assets/tinker/textures/items/textures to draw/_javelin_accessory.png -src/main/resources/assets/tinker/textures/items/textures to draw/_hammer_handle_broken.png -src/main/resources/assets/tinker/textures/items/textures to draw/_hammer_handle.png -src/main/resources/assets/tinker/textures/items/textures to draw/_full_guard.png -src/main/resources/assets/tinker/textures/items/textures to draw/_frypan_handle.png -src/main/resources/assets/tinker/textures/items/textures to draw/_excavator_handle.png -src/main/resources/assets/tinker/textures/items/textures to draw/_excavator_grip.png -src/main/resources/assets/tinker/textures/items/textures to draw/_dagger_handle.png -src/main/resources/assets/tinker/textures/items/textures to draw/_dagger_blade_broken.png -src/main/resources/assets/tinker/textures/items/textures to draw/_dagger_blade.png -src/main/resources/assets/tinker/textures/items/textures to draw/_dagger_accessory.png -src/main/resources/assets/tinker/textures/items/textures to draw/_cutlass_handle.png -src/main/resources/assets/tinker/textures/items/textures to draw/_cutlass_guard.png -src/main/resources/assets/tinker/textures/items/textures to draw/_cutlass_blade_broken.png -src/main/resources/assets/tinker/textures/items/textures to draw/_cutlass_blade.png -src/main/resources/assets/tinker/textures/items/textures to draw/_crossbow_limb.png -src/main/resources/assets/tinker/textures/items/textures to draw/_crossbow_bow_3.png -src/main/resources/assets/tinker/textures/items/textures to draw/_crossbow_bow_2.png -src/main/resources/assets/tinker/textures/items/textures to draw/_crossbow_bow_1.png -src/main/resources/assets/tinker/textures/items/textures to draw/_crossbow_bow.png -src/main/resources/assets/tinker/textures/items/textures to draw/_crossbow_body.png -src/main/resources/assets/tinker/textures/items/textures to draw/_crossbow_body (2).png -src/main/resources/assets/tinker/textures/items/textures to draw/_crossbow_binding.png -src/main/resources/assets/tinker/textures/items/textures to draw/_crossbar.png -src/main/resources/assets/tinker/textures/items/textures to draw/_cleaver_handle.png -src/main/resources/assets/tinker/textures/items/textures to draw/_cleaver_guard.png -src/main/resources/assets/tinker/textures/items/textures to draw/_chisel_head_broken.png -src/main/resources/assets/tinker/textures/items/textures to draw/_chisel_head.png -src/main/resources/assets/tinker/textures/items/textures to draw/_chisel_head (2).png -src/main/resources/assets/tinker/textures/items/textures to draw/_chisel_handle.png -src/main/resources/assets/tinker/textures/items/textures to draw/_bow_top_3.png -src/main/resources/assets/tinker/textures/items/textures to draw/_bow_top_3 (2).png -src/main/resources/assets/tinker/textures/items/textures to draw/_bow_top_2.png -src/main/resources/assets/tinker/textures/items/textures to draw/_bow_top_2 (2).png -src/main/resources/assets/tinker/textures/items/textures to draw/_bow_top_1.png -src/main/resources/assets/tinker/textures/items/textures to draw/_bow_top_1 (2).png -src/main/resources/assets/tinker/textures/items/textures to draw/_bow_top.png -src/main/resources/assets/tinker/textures/items/textures to draw/_bow_top (2).png -src/main/resources/assets/tinker/textures/items/textures to draw/_bow_limb.png -src/main/resources/assets/tinker/textures/items/textures to draw/_bow_grip.png -src/main/resources/assets/tinker/textures/items/textures to draw/_bow_bottom_3.png -src/main/resources/assets/tinker/textures/items/textures to draw/_bow_bottom_3 (2).png -src/main/resources/assets/tinker/textures/items/textures to draw/_bow_bottom_2.png -src/main/resources/assets/tinker/textures/items/textures to draw/_bow_bottom_2 (2).png -src/main/resources/assets/tinker/textures/items/textures to draw/_bow_bottom_1.png -src/main/resources/assets/tinker/textures/items/textures to draw/_bow_bottom_1 (2).png -src/main/resources/assets/tinker/textures/items/textures to draw/_bow_bottom.png -src/main/resources/assets/tinker/textures/items/textures to draw/_bow_bottom (2).png -src/main/resources/assets/tinker/textures/items/textures to draw/_binding.png -src/main/resources/assets/tinker/textures/items/textures to draw/_battlesign_handle.png -src/main/resources/assets/tinker/textures/items/textures to draw/_battleaxe_head_broken.png -src/main/resources/assets/tinker/textures/items/textures to draw/_battleaxe_head.png -src/main/resources/assets/tinker/textures/items/textures to draw/_battleaxe_handle.png -src/main/resources/assets/tinker/textures/items/textures to draw/_battleaxe_fronthead_broken.png -src/main/resources/assets/tinker/textures/items/textures to draw/_battleaxe_fronthead.png -src/main/resources/assets/tinker/textures/items/textures to draw/_battleaxe_front.png -src/main/resources/assets/tinker/textures/items/textures to draw/_battleaxe_binding.png -src/main/resources/assets/tinker/textures/items/textures to draw/_battleaxe_backhead.png -src/main/resources/assets/tinker/textures/items/textures to draw/_battleaxe_back.png -src/main/resources/assets/tinker/textures/items/textures to draw/_axe_handle.png -src/main/resources/assets/tinker/textures/items/textures to draw/_arrow_shaft.png diff --git a/src/main/java/twilightforest/TFCommonProxy.java b/src/main/java/twilightforest/TFCommonProxy.java index c43111fd32..ee05325822 100644 --- a/src/main/java/twilightforest/TFCommonProxy.java +++ b/src/main/java/twilightforest/TFCommonProxy.java @@ -2,6 +2,8 @@ import net.minecraft.client.model.ModelBiped; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; import cpw.mods.fml.common.network.IGuiHandler; @@ -39,6 +41,10 @@ public int getCakeBlockRenderID() { return 0; } + public int getChestBlockRenderID() { + return 0; + } + public int getComplexBlockRenderID() { return 0; } @@ -75,6 +81,10 @@ public int getKnightmetalBlockRenderID() { return 0; } + public int getFieryMetalBlockRenderID() { + return 0; + } + public int getHugeLilyPadBlockRenderID() { return 0; } @@ -142,6 +152,22 @@ public ModelBiped getFieryArmorModel(int armorSlot) { return null; } + public ModelBiped getTrophyArmorModel(int boss) { + return null; + } + + public ModelBiped getCritterArmorModel(int critter) { + return null; + } + public void doBlockAnnihilateEffect(World worldObj, int blockX, int blockY, int blockZ) {} + public boolean checkForSound(ChunkCoordinates chunkcoordinates) { + return true; + } + + public void stopSound(World worldIn, int x, int y, int z) {} + + public void playSound(World worldObj, ChunkCoordinates chunkcoordinates, ResourceLocation soundResource) {} + } diff --git a/src/main/java/twilightforest/TFEventListener.java b/src/main/java/twilightforest/TFEventListener.java index bf93b21f0b..dbce21c0a0 100644 --- a/src/main/java/twilightforest/TFEventListener.java +++ b/src/main/java/twilightforest/TFEventListener.java @@ -1,5 +1,7 @@ package twilightforest; +import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; @@ -34,14 +36,15 @@ import net.minecraftforge.event.entity.living.LivingHurtEvent; import net.minecraftforge.event.entity.player.BonemealEvent; import net.minecraftforge.event.entity.player.EntityItemPickupEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action; import net.minecraftforge.event.world.BlockEvent.BreakEvent; import net.minecraftforge.event.world.BlockEvent.HarvestDropsEvent; import net.minecraftforge.event.world.WorldEvent; -import baubles.common.container.InventoryBaubles; -import baubles.common.lib.PlayerHandler; +import com.google.common.io.Files; + import cpw.mods.fml.common.FMLLog; import cpw.mods.fml.common.eventhandler.Event.Result; import cpw.mods.fml.common.eventhandler.SubscribeEvent; @@ -61,6 +64,7 @@ import twilightforest.entity.EntityTFPinchBeetle; import twilightforest.entity.EntityTFYeti; import twilightforest.integration.TFBaublesIntegration; +import twilightforest.item.ItemTFPhantomArmor; import twilightforest.item.TFItems; import twilightforest.world.ChunkProviderTwilightForest; import twilightforest.world.TFWorldChunkManager; @@ -71,6 +75,9 @@ */ public class TFEventListener { + public static String fileName = "tf"; + public static String fileNameBackup = "tfback"; + protected HashMap playerKeepsMap = new HashMap<>(); protected HashMap playerBaublesMap = new HashMap<>(); private boolean isBreakingWithGiantPick = false; @@ -102,6 +109,9 @@ public void pickupItem(EntityItemPickupEvent event) { case 2 -> event.entityPlayer.triggerAchievement(TFAchievementPage.twilightKillLich); case 3 -> event.entityPlayer.triggerAchievement(TFAchievementPage.twilightProgressUrghast); case 4 -> event.entityPlayer.triggerAchievement(TFAchievementPage.twilightProgressGlacier); + case 5 -> event.entityPlayer.triggerAchievement(TFAchievementPage.twilightProgressLabyrinth); + case 6 -> event.entityPlayer.triggerAchievement(TFAchievementPage.twilightProgressKnights); + case 7 -> event.entityPlayer.triggerAchievement(TFAchievementPage.twilightProgressYeti); } // mazebreaker } else if (item == TFItems.mazebreakerPick) { @@ -421,24 +431,19 @@ public void entityHurts(LivingHurtEvent event) { EntityTFCharmEffect effect = new EntityTFCharmEffect( player.worldObj, player, - charm1 ? TFItems.charmOfLife1 : TFItems.charmOfLife2); + charm1 ? TFItems.charmOfLife1 : TFItems.charmOfLife2, + 0); player.worldObj.spawnEntityInWorld(effect); EntityTFCharmEffect effect2 = new EntityTFCharmEffect( player.worldObj, player, - charm1 ? TFItems.charmOfLife1 : TFItems.charmOfLife2); - effect2.offset = (float) Math.PI; + charm1 ? TFItems.charmOfLife1 : TFItems.charmOfLife2, + (float) Math.PI); player.worldObj.spawnEntityInWorld(effect2); // sound - player.worldObj.playSoundEffect( - player.posX + 0.5D, - player.posY + 0.5D, - player.posZ + 0.5D, - "mob.zombie.unfect", - 1.5F, - 1.0F); + player.worldObj.playSoundEffect(player.posX, player.posY, player.posZ, "mob.zombie.unfect", 1.5F, 1.0F); } } @@ -570,6 +575,17 @@ public void livingDies(LivingDeathEvent event) { } playerKeepsMap.put(player.getCommandSenderName(), keepInventory); } + + // check for phantom armor + for (int i = 0; i < 4; i++) { + if (player.inventory.armorInventory[i] != null + && player.inventory.armorInventory[i].getItem() instanceof ItemTFPhantomArmor) { + InventoryPlayer keepInventory = retrieveOrMakeKeepInventory(player); + keepInventory.armorInventory[i] = ItemStack.copyItemStack(player.inventory.armorInventory[i]); + player.inventory.armorInventory[i] = null; + playerKeepsMap.put(player.getCommandSenderName(), keepInventory); + } + } } if (playerKeepsMap.size() > 1) { @@ -599,6 +615,51 @@ private void keepAllArmor(EntityPlayer player, InventoryPlayer keepInventory) { } } + @SubscribeEvent + public void playerLoad(PlayerEvent.LoadFromFile event) { + playerLoadDo(event.entityPlayer, event.playerDirectory); + } + + private void playerLoadDo(EntityPlayer player, File directory) { + File file1, file2; + + // look for normal files first + file1 = getPlayerFile(fileName, directory, player.getCommandSenderName()); + file2 = getPlayerFile(fileNameBackup, directory, player.getCommandSenderName()); + + // look for uuid files when normal file missing + if (!file1.exists()) { + File filep = getPlayerFileUUID(fileName, directory, player.getGameProfile().getId().toString()); + if (filep.exists()) { + try { + Files.copy(filep, file1); + System.out.println( + "Using and converting UUID Charm of Keeping savefile for " + player.getCommandSenderName()); + filep.delete(); + File fb = getPlayerFileUUID(fileNameBackup, directory, player.getGameProfile().getId().toString()); + if (fb.exists()) fb.delete(); + } catch (IOException e) {} + } + } + + TFPlayerHandler.loadPlayerKeepInventory(player, file1, file2); + } + + public static File getPlayerFile(String suffix, File playerDirectory, String playername) { + if ("dat".equals(suffix)) throw new IllegalArgumentException("The suffix 'dat' is reserved"); + return new File(playerDirectory, playername + "." + suffix); + } + + public File getPlayerFileUUID(String suffix, File playerDirectory, String playerUUID) { + if ("dat".equals(suffix)) throw new IllegalArgumentException("The suffix 'dat' is reserved"); + return new File(playerDirectory, playerUUID + "." + suffix); + } + + @SubscribeEvent + public void playerSave(PlayerEvent.SaveToFile event) { + TFBaublesIntegration.playerSaveDo(event.entityPlayer, event.playerDirectory); + } + /** * Maybe we kept some stuff for the player! */ @@ -627,35 +688,25 @@ public void onPlayerRespawn(PlayerRespawnEvent event) { } } - if (TwilightForestMod.areBaublesLoaded && baublesInventory != null) { - InventoryBaubles inventoryBaubles = PlayerHandler.getPlayerBaubles(player); - for (int i = 0; i < inventoryBaubles.getSizeInventory(); i++) { - if (baublesInventory[i] != null) inventoryBaubles.setInventorySlotContents(i, baublesInventory[i]); - } - } + TFBaublesIntegration.restoreBaubles(player, baublesInventory); // spawn effect thingers if (keepInventory.getItemStack() != null) { EntityTFCharmEffect effect = new EntityTFCharmEffect( player.worldObj, player, - keepInventory.getItemStack().getItem()); + keepInventory.getItemStack().getItem(), + 0); player.worldObj.spawnEntityInWorld(effect); EntityTFCharmEffect effect2 = new EntityTFCharmEffect( player.worldObj, player, - keepInventory.getItemStack().getItem()); - effect2.offset = (float) Math.PI; + keepInventory.getItemStack().getItem(), + (float) Math.PI); player.worldObj.spawnEntityInWorld(effect2); - player.worldObj.playSoundEffect( - player.posX + 0.5D, - player.posY + 0.5D, - player.posZ + 0.5D, - "mob.zombie.unfect", - 1.5F, - 1.0F); + player.worldObj.playSoundEffect(player.posX, player.posY, player.posZ, "mob.zombie.unfect", 1.5F, 1.0F); } playerKeepsMap.remove(player.getCommandSenderName()); playerBaublesMap.remove(player.getCommandSenderName()); @@ -668,18 +719,8 @@ public void onPlayerRespawn(PlayerRespawnEvent event) { @SubscribeEvent public void onPlayerLogout(PlayerLoggedOutEvent event) { EntityPlayer player = event.player; - if (playerKeepsMap.containsKey(player.getCommandSenderName())) { - FMLLog.warning( - "[TwilightForest] Mod was keeping inventory items in reserve for player %s but they logged out! Items are being dropped.", - player.getCommandSenderName()); - InventoryPlayer keepInventory = playerKeepsMap.get(player.getCommandSenderName()); - - // set player to the player logging out - keepInventory.player = player; - keepInventory.dropAllItems(); - + if (playerKeepsMap.containsKey(player.getCommandSenderName())) playerKeepsMap.remove(player.getCommandSenderName()); - } } /** diff --git a/src/main/java/twilightforest/TFPlayerHandler.java b/src/main/java/twilightforest/TFPlayerHandler.java new file mode 100644 index 0000000000..3c6e1b7fa4 --- /dev/null +++ b/src/main/java/twilightforest/TFPlayerHandler.java @@ -0,0 +1,126 @@ +package twilightforest; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.util.HashMap; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.nbt.CompressedStreamTools; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +import com.google.common.io.Files; + +import twilightforest.integration.TFBaublesIntegration; + +public class TFPlayerHandler { + + protected static HashMap playerKeepsMap = new HashMap<>(); + + public static void clearPlayerMaps(EntityPlayer player) { + playerKeepsMap.remove(player.getCommandSenderName()); + TFBaublesIntegration.clearPlayerMap(player); + } + + public static InventoryPlayer getPlayerKeepInventory(EntityPlayer player) { + if (!playerKeepsMap.containsKey(player.getCommandSenderName())) { + InventoryPlayer inventory = new InventoryPlayer(player); + playerKeepsMap.put(player.getCommandSenderName(), inventory); + } + return playerKeepsMap.get(player.getCommandSenderName()); + } + + public static void setPlayerKeepInventory(EntityPlayer player, InventoryPlayer inventory) { + playerKeepsMap.put(player.getCommandSenderName(), inventory); + } + + public static void loadPlayerKeepInventory(EntityPlayer player, File file1, File file2) { + if (player != null && !player.worldObj.isRemote) { + try { + NBTTagCompound data = null; + boolean save = false; + if (file1 != null && file1.exists()) { + try { + FileInputStream fileinputstream = new FileInputStream(file1); + data = CompressedStreamTools.readCompressed(fileinputstream); + fileinputstream.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + if (file1 == null || !file1.exists() || data == null || data.hasNoTags()) { + System.out.println( + "Data not found for " + player.getCommandSenderName() + ". Trying to load backup data."); + if (file2 != null && file2.exists()) { + try { + FileInputStream fileinputstream = new FileInputStream(file2); + data = CompressedStreamTools.readCompressed(fileinputstream); + fileinputstream.close(); + save = true; + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + if (data != null) { + InventoryPlayer keepInventory = new InventoryPlayer(player); + keepInventory.readFromNBT(data.getTagList("KeepInventory", 10)); + playerKeepsMap.put(player.getCommandSenderName(), keepInventory); + + TFBaublesIntegration.loadPlayerKeepBaubles(player, data); + + if (save) savePlayerKeepInventory(player, file1, file2); + } + } catch (Exception exception1) { + System.out.println("Error loading keep inventory"); + exception1.printStackTrace(); + } + } + } + + public static void savePlayerKeepInventory(EntityPlayer player, File file1, File file2) { + if (player != null && !player.worldObj.isRemote) { + try { + if (file1 != null && file1.exists()) { + try { + Files.copy(file1, file2); + } catch (Exception e) { + System.out.println( + "Could not backup old keep inventory file for player " + player.getCommandSenderName()); + } + } + + try { + if (file1 != null) { + InventoryPlayer inventory = getPlayerKeepInventory(player); + NBTTagCompound data = new NBTTagCompound(); + data.setTag("KeepInventory", inventory.writeToNBT(new NBTTagList())); + + TFBaublesIntegration.savePlayerKeepBaubles(player, data); + + FileOutputStream fileoutputstream = new FileOutputStream(file1); + CompressedStreamTools.writeCompressed(data, fileoutputstream); + fileoutputstream.close(); + + } + } catch (Exception e) { + System.out + .println("Could not save keep inventory file for player " + player.getCommandSenderName()); + e.printStackTrace(); + if (file1.exists()) { + try { + file1.delete(); + } catch (Exception e2) {} + } + } + } catch (Exception exception1) { + System.out.println("Error saving keep inventory"); + exception1.printStackTrace(); + } + } + } +} diff --git a/src/main/java/twilightforest/TFTreasure.java b/src/main/java/twilightforest/TFTreasure.java index 0f4a43b190..e6b8c38231 100644 --- a/src/main/java/twilightforest/TFTreasure.java +++ b/src/main/java/twilightforest/TFTreasure.java @@ -260,7 +260,7 @@ protected void fill(int i) { uncommon.add(Items.melon_seeds, 4); uncommon.add(Items.pumpkin_seeds, 4); uncommon.add(Items.arrow, 12); - uncommon.add(TFBlocks.firefly, 4); + uncommon.add(new ItemStack(TFItems.critter, 4, 0)); rare.add(Blocks.web, 3); rare.add(Items.shears, 1); rare.add(Items.saddle, 1); @@ -278,7 +278,7 @@ protected void fill(int i) { common.add(TFItems.mazeWafer, 12); common.add(Items.gunpowder, 4); common.add(TFItems.ironwoodIngot, 4); - common.add(TFBlocks.firefly, 5); + common.add(new ItemStack(TFItems.critter, 5, 0)); common.add(Items.milk_bucket, 1); uncommon.add(TFItems.steeleafIngot, 6); uncommon.add(TFItems.steeleafLegs, 1); @@ -306,7 +306,7 @@ protected void fill(int i) { uncommon.add(Items.paper, 5); uncommon.add(Items.iron_ingot, 6); uncommon.add(TFItems.ironwoodIngot, 8); - uncommon.add(TFBlocks.firefly, 5); + uncommon.add(new ItemStack(TFItems.critter, 5, 0)); uncommon.add(TFItems.charmOfKeeping1, 1); rare.add(TFItems.steeleafIngot, 8); rare.add(Items.golden_apple, 1); @@ -471,7 +471,7 @@ protected void fill(int i) { uncommon.add(Blocks.redstone_lamp, 3); uncommon.add(Items.iron_ingot, 6); uncommon.add(TFItems.ironwoodIngot, 8); - uncommon.add(TFBlocks.firefly, 5); + uncommon.add(new ItemStack(TFItems.critter, 5, 0)); uncommon.add(TFItems.charmOfKeeping1, 1); rare.add(TFItems.steeleafIngot, 8); rare.add(Items.diamond, 2); @@ -484,7 +484,7 @@ protected void fill(int i) { common.add(TFItems.experiment115, 12); common.add(Items.gunpowder, 4); common.add(TFItems.ironwoodIngot, 4); - common.add(TFBlocks.firefly, 5); + common.add(new ItemStack(TFItems.critter, 5, 0)); common.add(Items.redstone, 12); common.add(Items.glowstone_dust, 12); uncommon.add(TFItems.steeleafIngot, 6); @@ -518,7 +518,7 @@ protected void fill(int i) { common.add(Items.water_bucket, 1); common.add(Items.milk_bucket, 1); common.add(Items.melon_seeds, 5); - uncommon.add(new ItemStack(TFBlocks.firefly, 12)); + uncommon.add(new ItemStack(TFItems.critter, 12, 0)); uncommon.add(new ItemStack(TFBlocks.sapling, 4, 0)); uncommon.add(new ItemStack(TFBlocks.sapling, 4, 1)); uncommon.add(new ItemStack(TFBlocks.sapling, 4, 2)); @@ -544,7 +544,7 @@ protected void fill(int i) { uncommon.add(Items.bucket, 1); uncommon.add(Items.iron_ingot, 6); uncommon.add(TFItems.ironwoodIngot, 6); - uncommon.add(TFBlocks.firefly, 5); + uncommon.add(new ItemStack(TFItems.critter, 5, 0)); uncommon.add(TFItems.charmOfKeeping1, 1); uncommon.add(TFItems.armorShard, 3); rare.add(TFItems.knightMetal, 8); @@ -568,7 +568,7 @@ protected void fill(int i) { common.add(TFItems.mazeWafer, 12); common.add(Items.gunpowder, 4); common.add(TFItems.ironwoodIngot, 4); - common.add(TFBlocks.firefly, 5); + common.add(new ItemStack(TFItems.critter, 5, 0)); common.add(Items.milk_bucket, 1); uncommon.add(TFItems.steeleafIngot, 6); uncommon.add(TFItems.steeleafLegs, 1); @@ -596,6 +596,7 @@ protected void fill(int i) { uncommon.addRandomEnchanted(TFItems.phantomPlate, 20); rare.addRandomEnchanted(TFItems.phantomHelm, 30); rare.addRandomEnchanted(TFItems.phantomPlate, 30); + rare.add(new ItemStack(TFItems.trophy, 1, 6)); } case 18 -> { // aurora cache @@ -608,7 +609,7 @@ protected void fill(int i) { common.add(TFItems.ironwoodIngot, 2); uncommon.add(TFBlocks.auroraBlock, 12); uncommon.add(TFItems.ironwoodIngot, 6); - uncommon.add(TFBlocks.firefly, 5); + uncommon.add(new ItemStack(TFItems.critter, 5, 0)); uncommon.add(TFItems.charmOfKeeping1, 1); uncommon.add(TFItems.arcticFur, 3); rare.add(TFItems.arcticFur, 8); @@ -629,7 +630,7 @@ protected void fill(int i) { common.add(Blocks.packed_ice, 4); common.add(TFItems.mazeWafer, 12); common.add(TFItems.iceBomb, 4); - common.add(TFBlocks.firefly, 5); + common.add(new ItemStack(TFItems.critter, 5, 0)); uncommon.add(TFItems.arcticFur, 6); uncommon.add(TFItems.arcticLegs, 1); uncommon.add(TFItems.arcticPlate, 1); diff --git a/src/main/java/twilightforest/TwilightForestMod.java b/src/main/java/twilightforest/TwilightForestMod.java index 8e94100f50..43cef69d99 100644 --- a/src/main/java/twilightforest/TwilightForestMod.java +++ b/src/main/java/twilightforest/TwilightForestMod.java @@ -39,8 +39,10 @@ import twilightforest.item.TFItems; import twilightforest.item.TFRecipes; import twilightforest.structures.StructureTFMajorFeatureStart; +import twilightforest.tileentity.TileEntityTFAlphaYetiSpawner; import twilightforest.tileentity.TileEntityTFCReactorActive; import twilightforest.tileentity.TileEntityTFCake; +import twilightforest.tileentity.TileEntityTFChest; import twilightforest.tileentity.TileEntityTFCicada; import twilightforest.tileentity.TileEntityTFCinderFurnace; import twilightforest.tileentity.TileEntityTFFirefly; @@ -50,6 +52,7 @@ import twilightforest.tileentity.TileEntityTFHydraSpawner; import twilightforest.tileentity.TileEntityTFKnightPhantomsSpawner; import twilightforest.tileentity.TileEntityTFLichSpawner; +import twilightforest.tileentity.TileEntityTFMinoshroomSpawner; import twilightforest.tileentity.TileEntityTFMoonworm; import twilightforest.tileentity.TileEntityTFNagaSpawner; import twilightforest.tileentity.TileEntityTFNagastone; @@ -93,6 +96,7 @@ public class TwilightForestMod { public static String portalCreationItemString; // integration + public static boolean isGTNHLoaded = false; public static boolean isSkinportLoaded = false; public static boolean areBaublesLoaded = false; public static boolean isNeiLoaded = false; @@ -252,6 +256,7 @@ public void preInit(FMLPreInitializationEvent event) { } else { areBaublesLoaded = false; } + isGTNHLoaded = Loader.isModLoaded("dreamcraft"); // check for biome conflicts, load biomes TFBiomeBase.assignBlankBiomeIds(); @@ -372,6 +377,9 @@ public void postInit(FMLPostInitializationEvent evt) { TFNeiIntegration.hideItem(new ItemStack(TFBlocks.doorTime)); TFNeiIntegration.hideItem(new ItemStack(TFBlocks.doorTrans)); TFNeiIntegration.hideItem(new ItemStack(TFBlocks.doorTwilight)); + TFNeiIntegration.hideItem(new ItemStack(TFBlocks.firefly)); + TFNeiIntegration.hideItem(new ItemStack(TFBlocks.cicada)); + TFNeiIntegration.hideItem(new ItemStack(TFBlocks.moonworm)); for (int i = 0; i < 16; i++) TFNeiIntegration.hideItem(new ItemStack(TFBlocks.oldNagastone, 1, i)); } @@ -883,7 +891,12 @@ private void registerTileEntities() { GameRegistry.registerTileEntity(TileEntityTFCicada.class, "Cicada"); GameRegistry.registerTileEntity(TileEntityTFNagaSpawner.class, "Naga Spawner"); GameRegistry.registerTileEntity(TileEntityTFLichSpawner.class, "Lich Spawner"); + GameRegistry.registerTileEntity(TileEntityTFMinoshroomSpawner.class, "Minoshroom Spawner"); GameRegistry.registerTileEntity(TileEntityTFHydraSpawner.class, "Hydra Spawner"); + GameRegistry.registerTileEntity(TileEntityTFKnightPhantomsSpawner.class, "Knight Phantom Spawner"); + GameRegistry.registerTileEntity(TileEntityTFTowerBossSpawner.class, "Tower Boss Spawner"); + GameRegistry.registerTileEntity(TileEntityTFAlphaYetiSpawner.class, "Alpha Yeti Spawner"); + GameRegistry.registerTileEntity(TileEntityTFSnowQueenSpawner.class, "Snow Queen Spawner"); GameRegistry.registerTileEntity(TileEntityTFSmoker.class, "Swamp Smoker"); GameRegistry.registerTileEntity(TileEntityTFPoppingJet.class, "Popping Flame Jet"); GameRegistry.registerTileEntity(TileEntityTFFlameJet.class, "Lit Flame Jet"); @@ -891,13 +904,11 @@ private void registerTileEntities() { GameRegistry.registerTileEntity(TileEntityTFTowerBuilder.class, "Tower Builder"); GameRegistry.registerTileEntity(TileEntityTFReverter.class, "Tower Reverter"); GameRegistry.registerTileEntity(TileEntityTFTrophy.class, "TF Trophy"); - GameRegistry.registerTileEntity(TileEntityTFTowerBossSpawner.class, "Tower Boss Spawner"); GameRegistry.registerTileEntity(TileEntityTFGhastTrapInactive.class, "Inactive Ghast Trap"); GameRegistry.registerTileEntity(TileEntityTFGhastTrapActive.class, "Active Ghast Trap"); GameRegistry.registerTileEntity(TileEntityTFCReactorActive.class, "Active Carminite Reactor"); - GameRegistry.registerTileEntity(TileEntityTFKnightPhantomsSpawner.class, "Knight Phantom Spawner"); - GameRegistry.registerTileEntity(TileEntityTFSnowQueenSpawner.class, "Snow Queen Spawner"); GameRegistry.registerTileEntity(TileEntityTFCinderFurnace.class, "Cinder Furnace"); + GameRegistry.registerTileEntity(TileEntityTFChest.class, "TF Chest"); } /** diff --git a/src/main/java/twilightforest/block/BlockTFBossSpawner.java b/src/main/java/twilightforest/block/BlockTFBossSpawner.java index 552d882c02..ec00b32262 100644 --- a/src/main/java/twilightforest/block/BlockTFBossSpawner.java +++ b/src/main/java/twilightforest/block/BlockTFBossSpawner.java @@ -16,9 +16,11 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import twilightforest.tileentity.TileEntityTFAlphaYetiSpawner; import twilightforest.tileentity.TileEntityTFHydraSpawner; import twilightforest.tileentity.TileEntityTFKnightPhantomsSpawner; import twilightforest.tileentity.TileEntityTFLichSpawner; +import twilightforest.tileentity.TileEntityTFMinoshroomSpawner; import twilightforest.tileentity.TileEntityTFNagaSpawner; import twilightforest.tileentity.TileEntityTFSnowQueenSpawner; import twilightforest.tileentity.TileEntityTFTowerBossSpawner; @@ -58,6 +60,8 @@ public TileEntity createTileEntity(World world, int meta) { case 3 -> new TileEntityTFTowerBossSpawner(); case 4 -> new TileEntityTFKnightPhantomsSpawner(); case 5 -> new TileEntityTFSnowQueenSpawner(); + case 6 -> new TileEntityTFMinoshroomSpawner(); + case 7 -> new TileEntityTFAlphaYetiSpawner(); default -> null; }; } @@ -90,12 +94,14 @@ public boolean isOpaqueCube() { */ @Override public void getSubBlocks(Item item, CreativeTabs tab, List list) { - list.add(new ItemStack(item, 1, 0)); - list.add(new ItemStack(item, 1, 1)); - list.add(new ItemStack(item, 1, 2)); - list.add(new ItemStack(item, 1, 3)); - list.add(new ItemStack(item, 1, 4)); - list.add(new ItemStack(item, 1, 5)); + list.add(new ItemStack(item, 1, 0)); // Naga + list.add(new ItemStack(item, 1, 1)); // Lich + list.add(new ItemStack(item, 1, 6)); // Minoshroom + list.add(new ItemStack(item, 1, 2)); // Hydra + list.add(new ItemStack(item, 1, 4)); // Knight Phantoms + list.add(new ItemStack(item, 1, 3)); // Ur-Ghast + list.add(new ItemStack(item, 1, 7)); // Alpha Yeti + list.add(new ItemStack(item, 1, 5)); // Snow Queen } /** diff --git a/src/main/java/twilightforest/block/BlockTFBurntThorns.java b/src/main/java/twilightforest/block/BlockTFBurntThorns.java index 14eec5f5de..01d5b650f1 100644 --- a/src/main/java/twilightforest/block/BlockTFBurntThorns.java +++ b/src/main/java/twilightforest/block/BlockTFBurntThorns.java @@ -3,6 +3,7 @@ import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.IProjectile; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; @@ -27,7 +28,7 @@ protected BlockTFBurntThorns() { */ public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { // dissolve - if (!world.isRemote && entity instanceof EntityLivingBase) { + if (!world.isRemote && (entity instanceof EntityLivingBase || entity instanceof IProjectile)) { int metadata = world.getBlockMetadata(x, y, z); world.playAuxSFX(2001, x, y, z, Block.getIdFromBlock(this) + (metadata << 12)); world.setBlockToAir(x, y, z); diff --git a/src/main/java/twilightforest/block/BlockTFChest.java b/src/main/java/twilightforest/block/BlockTFChest.java new file mode 100644 index 0000000000..5f7dd01709 --- /dev/null +++ b/src/main/java/twilightforest/block/BlockTFChest.java @@ -0,0 +1,87 @@ +package twilightforest.block; + +import net.minecraft.block.BlockChest; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityChest; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import twilightforest.TwilightForestMod; +import twilightforest.item.TFItems; +import twilightforest.tileentity.TileEntityTFChest; + +public class BlockTFChest extends BlockChest { + + public enum WoodType { + TWILIGHT, + CANOPY, + MANGROVE, + DARKWOOD, + TIME, + TRANS, + MINING, + SORT, + NULL + } + + private WoodType material = WoodType.CANOPY; + + protected BlockTFChest(int type, WoodType material) { + super(type); + this.material = material; + this.setHardness(2.5F); + this.setStepSound(soundTypeWood); + this.setCreativeTab(TFItems.creativeTab); + } + + public WoodType getWoodType() { + return material; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + this.blockIcon = reg + .registerIcon(TwilightForestMod.ID + ":wood/planks_" + BlockTFWood.names[material.ordinal()] + "_0"); + } + + /** + * The type of render function that is called for this block + */ + @Override + public int getRenderType() { + return TwilightForestMod.proxy.getChestBlockRenderID(); + } + + /** + * Returns a new instance of a block's tile entity class. Called on placing the block. + */ + public TileEntity createNewTileEntity(World worldIn, int meta) { + TileEntityTFChest tileentitychest = new TileEntityTFChest(); + return tileentitychest; + } + + /** + * Called when a tile entity on a side of this block changes is created or is destroyed. + * + * @param world The world + * @param x The x position of this block instance + * @param y The y position of this block instance + * @param z The z position of this block instance + * @param tileX The x position of the tile that changed + * @param tileY The y position of the tile that changed + * @param tileZ The z position of the tile that changed + */ + public void onNeighborChange(IBlockAccess world, int x, int y, int z, int tileX, int tileY, int tileZ) { + super.onNeighborChange(world, x, y, z, tileX, tileY, tileZ); + TileEntityChest tileentitychest = (TileEntityChest) world.getTileEntity(x, y, z); + + if (tileentitychest != null) { + tileentitychest.updateContainingBlockInfo(); + } + } + +} diff --git a/src/main/java/twilightforest/block/BlockTFCicada.java b/src/main/java/twilightforest/block/BlockTFCicada.java index 0b01d8cdde..0452776370 100644 --- a/src/main/java/twilightforest/block/BlockTFCicada.java +++ b/src/main/java/twilightforest/block/BlockTFCicada.java @@ -1,8 +1,13 @@ package twilightforest.block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.Explosion; import net.minecraft.world.World; +import twilightforest.TwilightForestMod; import twilightforest.tileentity.TileEntityTFCicada; public class BlockTFCicada extends BlockTFCritter { @@ -11,6 +16,8 @@ public class BlockTFCicada extends BlockTFCritter { protected BlockTFCicada() { super(); + this.dropItem = Items.dye; + this.dropMeta = 2; } @Override @@ -18,4 +25,55 @@ public TileEntity createTileEntity(World world, int metadata) { return new TileEntityTFCicada(); } + /** + * Triggered whenever an entity collides with this block (enters into the block). Args: world, x, y, z, entity + */ + @Override + public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { + super.onEntityCollidedWithBlock(world, x, y, z, entity); + // TwilightForestMod.proxy.stopSound(worldIn, x, y, z); + } + + @Override + public boolean dropCritterIfCantStay(World world, int x, int y, int z) { + if (!super.dropCritterIfCantStay(world, x, y, z)) { + TwilightForestMod.proxy.stopSound(world, x, y, z); + return false; + } + return true; + } + + /** + * Called when the block is attempted to be harvested + */ + public void onBlockHarvested(World worldIn, int x, int y, int z, int meta, EntityPlayer player) { + TwilightForestMod.proxy.stopSound(worldIn, x, y, z); + } + + /** + * Called right before the block is destroyed by a player. Args: world, x, y, z, metaData + */ + public void onBlockDestroyedByPlayer(World worldIn, int x, int y, int z, int meta) { + TwilightForestMod.proxy.stopSound(worldIn, x, y, z); + } + + /** + * Called upon the block being destroyed by an explosion + */ + public void onBlockDestroyedByExplosion(World worldIn, int x, int y, int z, Explosion explosionIn) { + TwilightForestMod.proxy.stopSound(worldIn, x, y, z); + } + + /** + * Called upon block activation (right click on the block.) + */ + public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, + float subY, float subZ) { + if (super.onBlockActivated(worldIn, x, y, z, player, side, subX, subY, subZ)) { + TwilightForestMod.proxy.stopSound(worldIn, x, y, z); + return true; + } + return false; + } + } diff --git a/src/main/java/twilightforest/block/BlockTFCompressed.java b/src/main/java/twilightforest/block/BlockTFCompressed.java index 11f6e318f2..5b1b7b8c95 100644 --- a/src/main/java/twilightforest/block/BlockTFCompressed.java +++ b/src/main/java/twilightforest/block/BlockTFCompressed.java @@ -1,9 +1,24 @@ package twilightforest.block; +import static net.minecraftforge.common.util.ForgeDirection.UP; + import net.minecraft.block.BlockCompressed; import net.minecraft.block.material.MapColor; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import twilightforest.TwilightForestMod; +import twilightforest.client.renderer.BetterIconFlipped; import twilightforest.item.TFItems; public class BlockTFCompressed extends BlockCompressed { @@ -16,7 +31,10 @@ public enum BlockType { STEELEAF } - private BlockType type; + public BlockType type; + + public IIcon[] fieryPattern; + public IIcon[] fieryCore; // 0 - single, 1 - horizontal, 2 - vertical, 3 - cross, 4 - full protected BlockTFCompressed(BlockType blockType) { super(typeToMapColor(blockType)); @@ -39,6 +57,7 @@ protected BlockTFCompressed(BlockType blockType) { textureName = "carminite_block"; break; case FIERY_METAL: + this.setLightLevel(0.5F); hardness = 5.0F; resistance = 10.0F; stepSound = soundTypeMetal; @@ -89,4 +108,182 @@ private static MapColor typeToMapColor(BlockType blockType) { return mapColor; } + /** + * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been + * cleared to be reused) + */ + public AxisAlignedBB getCollisionBoundingBoxFromPool(World worldIn, int x, int y, int z) { + if (this.type == BlockType.FIERY_METAL) return AxisAlignedBB.getBoundingBox( + (double) x, + (double) y, + (double) z, + (double) (x + 1), + (double) (y + 0.99f), + (double) (z + 1)); + else return super.getCollisionBoundingBoxFromPool(worldIn, x, y, z); + } + + /** + * Triggered whenever an entity collides with this block (enters into the block). Args: world, x, y, z, entity + */ + public void onEntityCollidedWithBlock(World worldIn, int x, int y, int z, Entity entityIn) { + if (this.type == BlockType.FIERY_METAL) { + if (entityIn.isSneaking()) return; + if (entityIn instanceof EntityPlayer && ((EntityPlayer) entityIn).inventory.armorInventory[0] != null + && ((EntityPlayer) entityIn).inventory.armorInventory[0].getItem() == TFItems.fieryBoots) + return; + if (entityIn instanceof EntityLivingBase && ((EntityLivingBase) entityIn).getEquipmentInSlot(1) != null + && ((EntityLivingBase) entityIn).getEquipmentInSlot(1).getItem() == TFItems.fieryBoots) + return; + entityIn.attackEntityFrom(DamageSource.inFire, 1); + } + } + + /** + * Block's chance to react to an entity falling on it. + */ + @Override + public void onFallenUpon(World worldIn, int x, int y, int z, Entity entityIn, float fallDistance) { + switch (type) { + case ARCTIC_FUR: + entityIn.fallDistance *= 0.25; + break; + case STEELEAF: + entityIn.fallDistance *= 0.75; + break; + default: + break; + } + } + + /** + * Determines if this block can be used as the base of a beacon. + * + * @param world The current world + * @param x X Position + * @param y Y Position + * @param z Z position + * @param beaconX Beacons X Position + * @param beaconY Beacons Y Position + * @param beaconZ Beacons Z Position + * @return True, to support the beacon, and make it active with this block. + */ + public boolean isBeaconBase(IBlockAccess worldObj, int x, int y, int z, int beaconX, int beaconY, int beaconZ) { + return true; + } + + /** + * Currently only called by fire when it is on top of this block. Returning true will prevent the fire from + * naturally dying during updating. Also prevents firing from dying from rain. + * + * @param world The current world + * @param x The blocks X position + * @param y The blocks Y position + * @param z The blocks Z position + * @param metadata The blocks current metadata + * @param side The face that the fire is coming from + * @return True if this block sustains fire, meaning it will never go out. + */ + public boolean isFireSource(World world, int x, int y, int z, ForgeDirection side) { + if (this.type == BlockType.FIERY_METAL && side == UP) return true; + return false; + } + + /** + * How bright to render this block based on the light its receiving. Args: iBlockAccess, x, y, z + */ + @SideOnly(Side.CLIENT) + public int getMixedBrightnessForBlock(IBlockAccess worldIn, int x, int y, int z) { + if (this.type == BlockType.FIERY_METAL) return 255; + return super.getMixedBrightnessForBlock(worldIn, x, y, z); + } + + /** + * Returns a integer with hex for 0xrrggbb with this color multiplied against the blocks color. Note only called + * when first determining what to render. + */ + @SideOnly(Side.CLIENT) + public int colorMultiplier(IBlockAccess worldIn, int x, int y, int z) { + if (this.type == BlockType.FIERY_METAL) return 0xffffff; + return super.colorMultiplier(worldIn, x, y, z); + } + + public boolean canConnectFieryTo(IBlockAccess worldIn, int x, int y, int z) { + return worldIn.getBlock(x, y, z) == TFBlocks.fieryMetalStorage; + } + + /** + * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) + */ + @Override + public boolean renderAsNormalBlock() { + return this.type != BlockType.FIERY_METAL; + } + + /** + * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two + * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. + */ + @Override + public boolean isOpaqueCube() { + return true; + } + + /** + * Return true if the block is a normal, solid cube. This determines indirect power state, entity ejection from + * blocks, and a few others. + * + * @param world The current world + * @param x X Position + * @param y Y position + * @param z Z position + * @return True if the block is a full cube + */ + @Override + public boolean isNormalCube(IBlockAccess world, int x, int y, int z) { + return true; + } + + /** + * Checks if the block is a solid face on the given side, used by placement logic. + * + * @param world The current world + * @param x X Position + * @param y Y position + * @param z Z position + * @param side The side to check + * @return True if the block is solid on the specified side. + */ + @Override + public boolean isSideSolid(IBlockAccess world, int x, int y, int z, ForgeDirection side) { + if (this.type == BlockType.FIERY_METAL) return side == ForgeDirection.UP; + return true; + } + + /** + * The type of render function that is called for this block + */ + @Override + public int getRenderType() { + if (this.type == BlockType.FIERY_METAL) return TwilightForestMod.proxy.getFieryMetalBlockRenderID(); + else return super.getRenderType(); + } + + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + this.fieryPattern = new IIcon[4]; + this.fieryPattern[0] = reg.registerIcon(TwilightForestMod.ID + ":fiery_pattern"); + this.fieryPattern[1] = new BetterIconFlipped(this.fieryPattern[0], true, false); + this.fieryPattern[2] = new BetterIconFlipped(this.fieryPattern[0], false, true); + this.fieryPattern[3] = new BetterIconFlipped(this.fieryPattern[0], true, true); + + this.fieryCore = new IIcon[5]; + this.fieryCore[0] = reg.registerIcon(TwilightForestMod.ID + ":fiery_block_inner"); + this.fieryCore[1] = reg.registerIcon(TwilightForestMod.ID + ":fiery_block_inner_horizontal"); + this.fieryCore[2] = reg.registerIcon(TwilightForestMod.ID + ":fiery_block_inner_vertical"); + this.fieryCore[3] = reg.registerIcon(TwilightForestMod.ID + ":fiery_block_inner_cross"); + this.fieryCore[4] = reg.registerIcon(TwilightForestMod.ID + ":fiery_block_inner_full"); + super.registerBlockIcons(reg); + } + } diff --git a/src/main/java/twilightforest/block/BlockTFCritter.java b/src/main/java/twilightforest/block/BlockTFCritter.java index eb78910e4c..3b53850601 100644 --- a/src/main/java/twilightforest/block/BlockTFCritter.java +++ b/src/main/java/twilightforest/block/BlockTFCritter.java @@ -6,11 +6,17 @@ import static net.minecraftforge.common.util.ForgeDirection.WEST; import java.util.List; +import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.IProjectile; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -25,6 +31,9 @@ public abstract class BlockTFCritter extends Block { + protected Item dropItem = Items.glowstone_dust; + protected int dropMeta = 0; + protected BlockTFCritter() { super(Material.circuits); this.setHardness(0.0F); @@ -33,6 +42,27 @@ protected BlockTFCritter() { this.stepSound = new StepSoundTFInsect("squish", 0.25F, 0.6F); } + /** + * Triggered whenever an entity collides with this block (enters into the block). Args: world, x, y, z, entity + */ + public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { + // squish + if (!world.isRemote && (entity instanceof IProjectile)) { + int metadata = world.getBlockMetadata(x, y, z); + world.playAuxSFX(2001, x, y, z, Block.getIdFromBlock(this) + (metadata << 12)); + world.setBlockToAir(x, y, z); + double dx = this.getBlockBoundsMinX() + + world.rand.nextDouble() * (this.getBlockBoundsMaxX() - this.getBlockBoundsMinX()); + double dy = this.getBlockBoundsMinY() + + world.rand.nextDouble() * (this.getBlockBoundsMaxY() - this.getBlockBoundsMinY()); + double dz = this.getBlockBoundsMinZ() + + world.rand.nextDouble() * (this.getBlockBoundsMaxZ() - this.getBlockBoundsMinZ()); + EntityItem entityitem = new EntityItem(world, x + dx, y + dy, z + dz, new ItemStack(dropItem, 1, dropMeta)); + entityitem.delayBeforeCanPickup = 10; + world.spawnEntityInWorld(entityitem); + } + } + // Updates the blocks bounds based on its current state. Args: world, x, y, z @Override public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { @@ -255,7 +285,51 @@ public boolean hasTileEntity(int metadata) { */ @Override public void getSubBlocks(Item item, CreativeTabs par2CreativeTabs, List itemList) { - itemList.add(new ItemStack(item, 1, 0)); + // itemList.add(new ItemStack(item, 1, 0)); + // We're using an item instead + } + + @Override + public Item getItemDropped(int meta, Random random, int fortune) { + return TFItems.critter; + } + + /** + * Determines the damage on the item the block drops. Used in cloth and wood. + */ + @Override + public int damageDropped(int par1) { + int metadata = 0; + if (this == TFBlocks.cicada) metadata = 1; + else if (this == TFBlocks.moonworm) metadata = 2; + return metadata; + } + + /** + * Gets an item for the block being called on. Args: world, x, y, z + */ + @SideOnly(Side.CLIENT) + public Item getItem(World p_149694_1_, int p_149694_2_, int p_149694_3_, int p_149694_4_) { + return TFItems.critter; + } + + @SideOnly(Side.CLIENT) + @Override + public int getDamageValue(World worldIn, int x, int y, int z) { + return this.damageDropped(0); + } + + /** + * Called upon block activation (right click on the block.) + */ + public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, + float subY, float subZ) { + if (player.isSneaking() && player.inventory.armorInventory[3] == null) { + player.inventory.armorInventory[3] = new ItemStack(TFItems.critter, 1, this.damageDropped(0)); + if (!player.capabilities.isCreativeMode) worldIn.setBlockToAir(x, y, z); + return true; + } + return false; } /** diff --git a/src/main/java/twilightforest/block/BlockTFFirefly.java b/src/main/java/twilightforest/block/BlockTFFirefly.java index d7af5871ee..475bb03a61 100644 --- a/src/main/java/twilightforest/block/BlockTFFirefly.java +++ b/src/main/java/twilightforest/block/BlockTFFirefly.java @@ -12,7 +12,7 @@ public class BlockTFFirefly extends BlockTFCritter { // public static Random rand = new Random(); - protected BlockTFFirefly() { + public BlockTFFirefly() { super(); this.setLightLevel(0.9375F); } diff --git a/src/main/java/twilightforest/block/BlockTFMoonworm.java b/src/main/java/twilightforest/block/BlockTFMoonworm.java index 81dc651eca..78de43d0b3 100644 --- a/src/main/java/twilightforest/block/BlockTFMoonworm.java +++ b/src/main/java/twilightforest/block/BlockTFMoonworm.java @@ -2,6 +2,7 @@ import java.util.Random; +import net.minecraft.init.Items; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; @@ -14,6 +15,8 @@ public class BlockTFMoonworm extends BlockTFCritter { protected BlockTFMoonworm() { super(); + this.dropItem = Items.dye; + this.dropMeta = 10; } /** diff --git a/src/main/java/twilightforest/block/BlockTFNagastone.java b/src/main/java/twilightforest/block/BlockTFNagastone.java index 5fe8de8374..99aa30a7d6 100644 --- a/src/main/java/twilightforest/block/BlockTFNagastone.java +++ b/src/main/java/twilightforest/block/BlockTFNagastone.java @@ -170,7 +170,6 @@ public boolean placePerfectFitBody(World world, int x, int y, int z) { */ public boolean placePerfectFitHead(World world, int x, int y, int z) { int connect = getOnlyNSEWConnection(world, x, y, z); - if (connect != -1) { // if the first connection is n/s/e/w, and the second connection is not, we win! // System.out.println("Got a perfect head fit : " + connect); diff --git a/src/main/java/twilightforest/block/BlockTFThornRose.java b/src/main/java/twilightforest/block/BlockTFThornRose.java index cc758a614b..5343433cee 100644 --- a/src/main/java/twilightforest/block/BlockTFThornRose.java +++ b/src/main/java/twilightforest/block/BlockTFThornRose.java @@ -2,6 +2,7 @@ import net.minecraft.block.Block; import net.minecraft.block.material.Material; +import net.minecraft.init.Blocks; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -74,18 +75,19 @@ public void onNeighborBlockChange(World world, int x, int y, int z, Block block) * Can this block stay at this position. Similar to canPlaceBlockAt except gets checked often with plants. */ public boolean canBlockStay(World world, int x, int y, int z) { - boolean supported = false; - for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { int dx = x + dir.offsetX; int dy = y + dir.offsetY; int dz = z + dir.offsetZ; - if (world.getBlock(dx, dy, dz).canSustainLeaves(world, dx, dy, dz)) { - supported = true; + Block block = world.getBlock(dx, dy, dz); + if (block.canSustainLeaves(world, dx, dy, dz) || block.isLeaves(world, dx, dy, dz) + || (dir == ForgeDirection.DOWN + && block.canSustainPlant(world, dx, dy, dz, ForgeDirection.UP, Blocks.red_flower))) { + return true; } } - return supported; + return false; } } diff --git a/src/main/java/twilightforest/block/BlockTFTrophy.java b/src/main/java/twilightforest/block/BlockTFTrophy.java index e21d2279b2..c4058e8519 100644 --- a/src/main/java/twilightforest/block/BlockTFTrophy.java +++ b/src/main/java/twilightforest/block/BlockTFTrophy.java @@ -23,6 +23,15 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import thaumcraft.api.crafting.IInfusionStabiliser; +import twilightforest.entity.boss.EntityTFHydra; +import twilightforest.entity.boss.EntityTFKnightPhantom; +import twilightforest.entity.boss.EntityTFLich; +import twilightforest.entity.boss.EntityTFMinoshroom; +import twilightforest.entity.boss.EntityTFNaga; +import twilightforest.entity.boss.EntityTFSnowQueen; +import twilightforest.entity.boss.EntityTFUrGhast; +import twilightforest.entity.boss.EntityTFYetiAlpha; +import twilightforest.entity.passive.EntityTFQuestRam; import twilightforest.item.TFItems; import twilightforest.tileentity.TileEntityTFTrophy; @@ -35,6 +44,7 @@ public class BlockTFTrophy extends BlockContainer implements IInfusionStabiliser public BlockTFTrophy() { super(Material.circuits); + this.setStepSound(soundTypeCloth); this.setBlockBounds(0.25F, 0.0F, 0.25F, 0.75F, 0.5F, 0.75F); } @@ -91,6 +101,41 @@ public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int x, int } else if (trophy != null && trophy.func_145904_a() == 3) { // urghast bounds this.setBlockBounds(0.25F, 0.5F, 0.25F, 0.75F, 1F, 0.75F); + } else if (trophy != null && trophy.func_145904_a() == 7) { + // alpha yeti skull bounds + float pixel = 1f / 16; + switch (meta) { + default -> this + .setBlockBounds(pixel * 3.2f, 0.0F, pixel * 3.2f, 1 - pixel * 3.2f, 0.665F, 1 - pixel * 3.2f); + case 2 -> this.setBlockBounds( + pixel * 3.2f, + pixel * 4, + pixel * 4.4f * 2, + 1 - pixel * 3.2f, + 0.67F + pixel * 4, + 1.0f); + case 3 -> this.setBlockBounds( + pixel * 3.2f, + pixel * 4, + 0.0f, + 1 - pixel * 3.2f, + 0.67F + pixel * 4, + 1.0f - pixel * 4.4f * 2); + case 4 -> this.setBlockBounds( + pixel * 4.4f * 2, + pixel * 4, + pixel * 3.2f, + 1.0f, + 0.67F + pixel * 4, + 1 - pixel * 3.2f); + case 5 -> this.setBlockBounds( + 0.0f, + pixel * 4, + pixel * 3.2f, + 1.0f - pixel * 4.4f * 2, + 0.67F + pixel * 4, + 1 - pixel * 3.2f); + } } else { // normal skull bounds switch (meta) { @@ -148,6 +193,14 @@ public int damageDropped(int par1) { return par1; } + /** + * Gets an item for the block being called on. Args: world, x, y, z + */ + @SideOnly(Side.CLIENT) + public Item getItem(World p_149694_1_, int p_149694_2_, int p_149694_3_, int p_149694_4_) { + return TFItems.trophy; + } + /** * Called when the block is attempted to be harvested */ @@ -215,6 +268,62 @@ public void registerBlockIcons(IIconRegister par1IconRegister) { // don't load anything } + /** + * Called upon block activation (right click on the block.) + */ + @Override + public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, + float subY, float subZ) { + if (player.isSneaking() && player.inventory.armorInventory[3] == null) { + player.inventory.armorInventory[3] = new ItemStack( + TFItems.trophy, + 1, + this.getDamageValue(worldIn, x, y, z)); + if (!player.capabilities.isCreativeMode) worldIn.setBlockToAir(x, y, z); + return true; + } else { + String sound; + switch (((TileEntitySkull) worldIn.getTileEntity(x, y, z)).func_145904_a()) { + default: + case 0: + sound = new EntityTFHydra(worldIn).getTrophySound(); + break; + case 1: + sound = new EntityTFNaga(worldIn).getTrophySound(); + break; + case 2: + sound = new EntityTFLich(worldIn).getTrophySound(); + break; + case 3: + sound = new EntityTFUrGhast(worldIn).getTrophySound(); + break; + case 4: + sound = new EntityTFSnowQueen(worldIn).getTrophySound(); + break; + case 5: + sound = new EntityTFMinoshroom(worldIn).getTrophySound(); + break; + case 6: + sound = new EntityTFKnightPhantom(worldIn).getTrophySound(); + break; + case 7: + sound = new EntityTFYetiAlpha(worldIn).getTrophySound(); + break; + case 8: + sound = new EntityTFQuestRam(worldIn).getTrophySound(); + break; + } + worldIn.playSoundEffect( + (double) x + 0.5D, + (double) y + 0.5D, + (double) z + 0.5D, + sound, + 1.0F, + worldIn.rand.nextFloat() * 0.1F + 0.9F); + return true; + } + } + @Override public boolean canStabaliseInfusion(World world, int x, int y, int z) { return true; diff --git a/src/main/java/twilightforest/block/BlockTFTrophyPedestal.java b/src/main/java/twilightforest/block/BlockTFTrophyPedestal.java index 8c6391e73a..128fc3d21c 100644 --- a/src/main/java/twilightforest/block/BlockTFTrophyPedestal.java +++ b/src/main/java/twilightforest/block/BlockTFTrophyPedestal.java @@ -16,10 +16,12 @@ import net.minecraft.item.ItemStack; import net.minecraft.stats.StatFileWriter; import net.minecraft.stats.StatisticsFile; +import net.minecraft.tileentity.TileEntitySkull; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.ChatComponentText; import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; +import net.minecraft.util.StatCollector; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; @@ -188,10 +190,35 @@ public void onNeighborBlockChange(World par1World, int x, int y, int z, Block my if (isTrophyOnTop(par1World, x, y, z)) { par1World.scheduleBlockUpdate(x, y, z, this, 1); } + updateComparators(par1World, x, y, z); } } + private void updateComparators(World par1World, int x, int y, int z) { + for (int i = 1; i <= 4; i++) { + int neighbourX = x; + int neighbourZ = z; + switch (i) { + case 1: + neighbourX++; + break; + case 2: + neighbourX--; + break; + case 3: + neighbourZ++; + break; + case 4: + neighbourZ--; + break; + } + Block neighbour = par1World.getBlock(neighbourX, y, neighbourZ); + if (neighbour == Blocks.powered_comparator || neighbour == Blocks.unpowered_comparator) + par1World.scheduleBlockUpdate(neighbourX, y, neighbourZ, neighbour, 1); + } + } + /** * Called when the block is placed in the world. */ @@ -264,7 +291,8 @@ private void warnIneligiblePlayers(World world, int x, int y, int z) { for (EntityPlayer player : nearbyPlayers) { if (!isPlayerEligible(player)) { - player.addChatMessage(new ChatComponentText("You are unworthy.")); + player.addChatMessage( + new ChatComponentText(StatCollector.translateToLocal("chat.tf.pedestalunworthy"))); } } } @@ -356,19 +384,59 @@ public int tickRate(World world) { */ @Override public float getPlayerRelativeBlockHardness(EntityPlayer par1EntityPlayer, World world, int x, int y, int z) { - // not breakable if meta > 0 + // not breakable if meta > 7 int meta = world.getBlockMetadata(x, y, z); - if (meta > 0) { + if (meta > 7) { return -1; } else { return super.getPlayerRelativeBlockHardness(par1EntityPlayer, world, x, y, z); } } + /** + * If this returns true, then comparators facing away from this block will use the value from + * getComparatorInputOverride instead of the actual redstone signal strength. + */ @Override - public boolean canStabaliseInfusion(World world, int x, int y, int z) { + public boolean hasComparatorInputOverride() { return true; } + /** + * If hasComparatorInputOverride returns true, the return value from this is used instead of the redstone signal + * strength when this block inputs to a comparator. + */ + @Override + public int getComparatorInputOverride(World worldIn, int x, int y, int z, int side) { + if (worldIn.getBlock(x, y + 1, z) == TFBlocks.trophy) { + // Gives power proportionally to boss' order (might change later) + switch (((TileEntitySkull) worldIn.getTileEntity(x, y + 1, z)).func_145904_a()) { + case 8: + return 1; // Questing Ram + case 1: + return 5; // Naga + case 2: + return 6; // Lich + case 5: + return 7; // Minoshroom + case 0: + return 8; // Hydra + case 6: + return 9; // Knight Phantom + case 3: + return 10; // Ur-Ghast + case 7: + return 11; // Alpha Yeti + case 4: + return 12; // Snow Queen + } + } + return 0; + } + + @Override + public boolean canStabaliseInfusion(World world, int x, int y, int z) { + return true; + } } diff --git a/src/main/java/twilightforest/block/BlockTFWispyCloud.java b/src/main/java/twilightforest/block/BlockTFWispyCloud.java index 73eaae6920..04ad14126e 100644 --- a/src/main/java/twilightforest/block/BlockTFWispyCloud.java +++ b/src/main/java/twilightforest/block/BlockTFWispyCloud.java @@ -1,10 +1,18 @@ package twilightforest.block; +import java.util.ArrayList; import java.util.Random; +import net.minecraft.block.Block; import net.minecraft.block.BlockBreakable; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.stats.StatList; +import net.minecraft.world.World; +import net.minecraftforge.event.ForgeEventFactory; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -14,7 +22,7 @@ public class BlockTFWispyCloud extends BlockBreakable { protected BlockTFWispyCloud() { - super("", Material.craftedSnow, false); + super("", Material.ice, false); this.setStepSound(soundTypeCloth); this.setCreativeTab(TFItems.creativeTab); @@ -43,6 +51,25 @@ protected boolean canSilkHarvest() { return true; } + /** + * Called when the player destroys a block with an item that can harvest it. (i, j, k) are the coordinates of the + * block and l is the block's subtype/damage. + */ + public void harvestBlock(World worldIn, EntityPlayer player, int x, int y, int z, int meta) { + player.addStat(StatList.mineBlockStatArray[Block.getIdFromBlock(this)], 1); + player.addExhaustion(0.025F); + + if (this.canSilkHarvest(worldIn, player, x, y, z, meta) && EnchantmentHelper.getSilkTouchModifier(player)) { + ArrayList items = new ArrayList(); + ItemStack itemstack = this.createStackedBlock(meta); + + if (itemstack != null) items.add(itemstack); + + ForgeEventFactory.fireBlockHarvesting(items, worldIn, this, x, y, z, meta, 0, 1.0f, true, player); + for (ItemStack is : items) this.dropBlockAsItem(worldIn, x, y, z, is); + } + } + /** * Returns the quantity of items to drop on block destruction. */ diff --git a/src/main/java/twilightforest/block/TFBlocks.java b/src/main/java/twilightforest/block/TFBlocks.java index 0bd99be2a6..128df76f63 100644 --- a/src/main/java/twilightforest/block/TFBlocks.java +++ b/src/main/java/twilightforest/block/TFBlocks.java @@ -7,6 +7,8 @@ import cpw.mods.fml.common.registry.GameRegistry; import twilightforest.TwilightForestMod; +import twilightforest.block.BlockTFChest.WoodType; +import twilightforest.item.ItemBlockTFCritter; import twilightforest.item.ItemBlockTFMeta; import twilightforest.item.ItemBlockTFNagastone; @@ -40,6 +42,22 @@ public class TFBlocks { public static Block trapdoorTrans; public static Block trapdoorMine; public static Block trapdoorSort; + public static Block chestTwilight; + public static Block chestCanopy; + public static Block chestMangrove; + public static Block chestDarkwood; + public static Block chestTime; + public static Block chestTrans; + public static Block chestMine; + public static Block chestSort; + public static Block trappedChestTwilight; + public static Block trappedChestCanopy; + public static Block trappedChestMangrove; + public static Block trappedChestDarkwood; + public static Block trappedChestTime; + public static Block trappedChestTrans; + public static Block trappedChestMine; + public static Block trappedChestSort; public static Block leaves; public static Block firefly; public static Block portal; @@ -154,6 +172,22 @@ public static void registerBlocks() { trapdoorTrans = (new BlockTFTrapDoor(5)).setBlockName("TFTrapDoorTrans"); trapdoorMine = (new BlockTFTrapDoor(6)).setBlockName("TFTrapDoorMine"); trapdoorSort = (new BlockTFTrapDoor(7)).setBlockName("TFTrapDoorSort"); + chestTwilight = (new BlockTFChest(0, WoodType.TWILIGHT)).setBlockName("TFChestTwilight"); + chestCanopy = (new BlockTFChest(0, WoodType.CANOPY)).setBlockName("TFChestCanopy"); + chestMangrove = (new BlockTFChest(0, WoodType.MANGROVE)).setBlockName("TFChestMangrove"); + chestDarkwood = (new BlockTFChest(0, WoodType.DARKWOOD)).setBlockName("TFChestDarkwood"); + chestTime = (new BlockTFChest(0, WoodType.TIME)).setBlockName("TFChestTime"); + chestTrans = (new BlockTFChest(0, WoodType.TRANS)).setBlockName("TFChestTrans"); + chestMine = (new BlockTFChest(0, WoodType.MINING)).setBlockName("TFChestMine"); + chestSort = (new BlockTFChest(0, WoodType.SORT)).setBlockName("TFChestSort"); + trappedChestTwilight = (new BlockTFChest(1, WoodType.TWILIGHT)).setBlockName("TFChestTrapTwilight"); + trappedChestCanopy = (new BlockTFChest(1, WoodType.CANOPY)).setBlockName("TFChestTrapCanopy"); + trappedChestMangrove = (new BlockTFChest(1, WoodType.MANGROVE)).setBlockName("TFChestTrapMangrove"); + trappedChestDarkwood = (new BlockTFChest(1, WoodType.DARKWOOD)).setBlockName("TFChestTrapDarkwood"); + trappedChestTime = (new BlockTFChest(1, WoodType.TIME)).setBlockName("TFChestTrapTime"); + trappedChestTrans = (new BlockTFChest(1, WoodType.TRANS)).setBlockName("TFChestTrapTrans"); + trappedChestMine = (new BlockTFChest(1, WoodType.MINING)).setBlockName("TFChestTrapMine"); + trappedChestSort = (new BlockTFChest(1, WoodType.SORT)).setBlockName("TFChestTrapSort"); leaves = (new BlockTFLeaves()).setBlockName("TFLeaves").setBlockTextureName("leaves_oak"); firefly = (new BlockTFFirefly()).setBlockName("TFFirefly"); cicada = (new BlockTFCicada()).setBlockName("TFCicada"); @@ -288,10 +322,26 @@ public static void registerBlocks() { registerMyBlock(trapdoorTrans); registerMyBlock(trapdoorMine); registerMyBlock(trapdoorSort); + registerMyBlock(chestTwilight); + registerMyBlock(chestCanopy); + registerMyBlock(chestMangrove); + registerMyBlock(chestDarkwood); + registerMyBlock(chestTime); + registerMyBlock(chestTrans); + registerMyBlock(chestMine); + registerMyBlock(chestSort); + registerMyBlock(trappedChestTwilight); + registerMyBlock(trappedChestCanopy); + registerMyBlock(trappedChestMangrove); + registerMyBlock(trappedChestDarkwood); + registerMyBlock(trappedChestTime); + registerMyBlock(trappedChestTrans); + registerMyBlock(trappedChestMine); + registerMyBlock(trappedChestSort); registerMyBlock(root); registerMyBlock(leaves); - registerMyBlock(firefly, ItemBlock.class); - registerMyBlock(cicada, ItemBlock.class); + registerMyBlock(firefly, ItemBlockTFCritter.class); + registerMyBlock(cicada, ItemBlockTFCritter.class); registerMyBlock(portal, ItemBlock.class); registerMyBlock(mazestone); registerMyBlock(hedge); @@ -317,7 +367,7 @@ public static void registerBlocks() { registerMyBlock(nagastonePillarWeathered); registerMyBlock(spiralStoneBricks); registerMyBlock(sapling); - registerMyBlock(moonworm, ItemBlock.class); + registerMyBlock(moonworm, ItemBlockTFCritter.class); registerMyBlock(magicLog); registerMyBlock(magicLeaves); registerMyBlock(magicLogSpecial); @@ -366,12 +416,12 @@ public static void registerBlocks() { registerMyBlock(trollVidr, ItemBlock.class); registerMyBlock(unripeTrollBer, ItemBlock.class); registerMyBlock(trollBer, ItemBlock.class); - registerMyBlock(knightmetalStorage, ItemBlock.class); - registerMyBlock(arcticFurStorage, ItemBlock.class); - registerMyBlock(carminiteStorage, ItemBlock.class); - registerMyBlock(fieryMetalStorage, ItemBlock.class); - registerMyBlock(ironwoodStorage, ItemBlock.class); - registerMyBlock(steeleafStorage, ItemBlock.class); + registerMyBlock(knightmetalStorage, twilightforest.item.ItemBlockTFCompressed.class); + registerMyBlock(arcticFurStorage, twilightforest.item.ItemBlockTFCompressed.class); + registerMyBlock(carminiteStorage, twilightforest.item.ItemBlockTFCompressed.class); + registerMyBlock(fieryMetalStorage, twilightforest.item.ItemBlockTFCompressed.class); + registerMyBlock(ironwoodStorage, twilightforest.item.ItemBlockTFCompressed.class); + registerMyBlock(steeleafStorage, twilightforest.item.ItemBlockTFCompressed.class); registerMyBlock(hugeLilyPad, twilightforest.item.ItemBlockTFHugeLilyPad.class); registerMyBlock(hugeWaterLily, twilightforest.item.ItemBlockTFHugeWaterLily.class); registerMyBlock(slider); diff --git a/src/main/java/twilightforest/client/TFClientProxy.java b/src/main/java/twilightforest/client/TFClientProxy.java index 7eb8863ccd..c20690e9fa 100644 --- a/src/main/java/twilightforest/client/TFClientProxy.java +++ b/src/main/java/twilightforest/client/TFClientProxy.java @@ -1,6 +1,8 @@ package twilightforest.client; import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.ISound; +import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.model.ModelBiped; import net.minecraft.client.model.ModelPig; import net.minecraft.client.model.ModelSilverfish; @@ -8,9 +10,12 @@ import net.minecraft.client.model.ModelWolf; import net.minecraft.client.particle.EntityFX; import net.minecraft.client.particle.EntitySmokeFX; +import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.client.renderer.entity.RenderSnowball; import net.minecraft.init.Items; import net.minecraft.item.Item; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; import net.minecraftforge.client.MinecraftForgeClient; import net.minecraftforge.common.MinecraftForge; @@ -29,6 +34,7 @@ import twilightforest.client.model.ModelTFBlockGoblin; import twilightforest.client.model.ModelTFBoar; import twilightforest.client.model.ModelTFBunny; +import twilightforest.client.model.ModelTFCritterArmor; import twilightforest.client.model.ModelTFDeathTome; import twilightforest.client.model.ModelTFDeer; import twilightforest.client.model.ModelTFFieryArmor; @@ -64,6 +70,7 @@ import twilightforest.client.model.ModelTFTowerBoss; import twilightforest.client.model.ModelTFTowerGolem; import twilightforest.client.model.ModelTFTroll; +import twilightforest.client.model.ModelTFTrophyArmor; import twilightforest.client.model.ModelTFWraith; import twilightforest.client.model.ModelTFYeti; import twilightforest.client.model.ModelTFYetiAlpha; @@ -79,19 +86,23 @@ import twilightforest.client.particle.EntityTFSnowGuardianFX; import twilightforest.client.particle.EntityTFSnowWarningFX; import twilightforest.client.renderer.TFFieryItemRenderer; +import twilightforest.client.renderer.TFFieryMetalBlockRenderer; import twilightforest.client.renderer.TFGiantBlockRenderer; import twilightforest.client.renderer.TFGiantItemRenderer; import twilightforest.client.renderer.TFIceItemRenderer; import twilightforest.client.renderer.TFMagicMapRenderer; import twilightforest.client.renderer.TFMazeMapRenderer; import twilightforest.client.renderer.TileEntityTFCakeRenderer; +import twilightforest.client.renderer.TileEntityTFChestRenderer; import twilightforest.client.renderer.TileEntityTFCicadaRenderer; import twilightforest.client.renderer.TileEntityTFFireflyRenderer; import twilightforest.client.renderer.TileEntityTFMoonwormRenderer; import twilightforest.client.renderer.TileEntityTFTrophyRenderer; import twilightforest.client.renderer.blocks.RenderBlockTFCake; import twilightforest.client.renderer.blocks.RenderBlockTFCastleMagic; +import twilightforest.client.renderer.blocks.RenderBlockTFChest; import twilightforest.client.renderer.blocks.RenderBlockTFCritters; +import twilightforest.client.renderer.blocks.RenderBlockTFFieryMetal; import twilightforest.client.renderer.blocks.RenderBlockTFFireflyJar; import twilightforest.client.renderer.blocks.RenderBlockTFHugeLilyPad; import twilightforest.client.renderer.blocks.RenderBlockTFKnightMetal; @@ -111,7 +122,6 @@ import twilightforest.client.renderer.entity.RenderTFBoar; import twilightforest.client.renderer.entity.RenderTFBunny; import twilightforest.client.renderer.entity.RenderTFChainBlock; -import twilightforest.client.renderer.entity.RenderTFCharm; import twilightforest.client.renderer.entity.RenderTFCubeOfAnnihilation; import twilightforest.client.renderer.entity.RenderTFDeer; import twilightforest.client.renderer.entity.RenderTFFallingIce; @@ -160,6 +170,7 @@ import twilightforest.client.renderer.entity.RenderTFYeti; import twilightforest.item.TFItems; import twilightforest.tileentity.TileEntityTFCake; +import twilightforest.tileentity.TileEntityTFChest; import twilightforest.tileentity.TileEntityTFCicada; import twilightforest.tileentity.TileEntityTFFirefly; import twilightforest.tileentity.TileEntityTFMoonworm; @@ -169,7 +180,8 @@ public class TFClientProxy extends TFCommonProxy { int critterRenderID; int plantRenderID; - int blockCakeRenderID; + int cakeRenderID; + int chestRenderID; int blockComplexRenderID; int nagastoneRenderID; int newNagastoneRenderID; @@ -180,6 +192,7 @@ public class TFClientProxy extends TFCommonProxy { int pedestalRenderID; int thornsRenderID; int knightmetalBlockRenderID; + int fieryMetalBlockRenderID; int hugeLilyPadBlockRenderID; int castleMagicBlockRenderID; @@ -188,6 +201,9 @@ public class TFClientProxy extends TFCommonProxy { ModelBiped[] yetiArmorModel; ModelBiped[] arcticArmorModel; ModelBiped[] fieryArmorModel; + ModelBiped[] trophyArmorModel; + ModelBiped[] critterArmorModel; + TFClientEvents clientEvents; boolean isDangerOverlayShown; @@ -441,9 +457,8 @@ public void doOnLoadRegistration() { RenderingRegistry.registerEntityRenderingHandler( twilightforest.entity.EntityTFMoonwormShot.class, new RenderTFMoonwormShot()); - RenderingRegistry.registerEntityRenderingHandler( - twilightforest.entity.EntityTFCharmEffect.class, - new RenderTFCharm(TFItems.charmOfLife1.getIconFromDamage(0))); + RenderingRegistry + .registerEntityRenderingHandler(twilightforest.entity.EntityTFCharmEffect.class, new RenderItem()); RenderingRegistry.registerEntityRenderingHandler( twilightforest.entity.boss.EntityTFLichBomb.class, new RenderSnowball(Items.magma_cream)); @@ -494,6 +509,7 @@ public void doOnLoadRegistration() { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTFMoonworm.class, new TileEntityTFMoonwormRenderer()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTFTrophy.class, new TileEntityTFTrophyRenderer()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTFCake.class, new TileEntityTFCakeRenderer()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTFChest.class, new TileEntityTFChestRenderer()); // map item renderer MinecraftForgeClient.registerItemRenderer( @@ -524,6 +540,10 @@ public void doOnLoadRegistration() { MinecraftForgeClient.registerItemRenderer(TFItems.fieryLegs, fieryRenderer); MinecraftForgeClient.registerItemRenderer(TFItems.fieryBoots, fieryRenderer); + MinecraftForgeClient.registerItemRenderer( + Item.getItemFromBlock(TFBlocks.fieryMetalStorage), + new TFFieryMetalBlockRenderer()); + // ice item renderers TFIceItemRenderer iceRenderer = new TFIceItemRenderer(mc.gameSettings, mc.getTextureManager()); MinecraftForgeClient.registerItemRenderer(TFItems.iceSword, iceRenderer); @@ -531,8 +551,11 @@ public void doOnLoadRegistration() { MinecraftForgeClient.registerItemRenderer(TFItems.iceBow, iceRenderer); // block render ids - blockCakeRenderID = RenderingRegistry.getNextAvailableRenderId(); - RenderingRegistry.registerBlockHandler(new RenderBlockTFCake(blockCakeRenderID)); + cakeRenderID = RenderingRegistry.getNextAvailableRenderId(); + RenderingRegistry.registerBlockHandler(new RenderBlockTFCake(cakeRenderID)); + + chestRenderID = RenderingRegistry.getNextAvailableRenderId(); + RenderingRegistry.registerBlockHandler(new RenderBlockTFChest(chestRenderID)); blockComplexRenderID = RenderingRegistry.getNextAvailableRenderId(); RenderingRegistry.registerBlockHandler(new RenderBlockTFFireflyJar(blockComplexRenderID)); @@ -567,6 +590,9 @@ public void doOnLoadRegistration() { knightmetalBlockRenderID = RenderingRegistry.getNextAvailableRenderId(); RenderingRegistry.registerBlockHandler(new RenderBlockTFKnightMetal(knightmetalBlockRenderID)); + fieryMetalBlockRenderID = RenderingRegistry.getNextAvailableRenderId(); + RenderingRegistry.registerBlockHandler(new RenderBlockTFFieryMetal(fieryMetalBlockRenderID)); + hugeLilyPadBlockRenderID = RenderingRegistry.getNextAvailableRenderId(); RenderingRegistry.registerBlockHandler(new RenderBlockTFHugeLilyPad(hugeLilyPadBlockRenderID)); @@ -602,6 +628,22 @@ public void doOnLoadRegistration() { fieryArmorModel[2] = new ModelTFFieryArmor(2, 0.5F); fieryArmorModel[3] = new ModelTFFieryArmor(3, 0.5F); + trophyArmorModel = new ModelBiped[9]; + trophyArmorModel[0] = new ModelTFTrophyArmor(0, 0.5F); + trophyArmorModel[1] = new ModelTFTrophyArmor(1, 0.5F); + trophyArmorModel[2] = new ModelTFTrophyArmor(2, 0.5F); + trophyArmorModel[3] = new ModelTFTrophyArmor(3, 0.5F); + trophyArmorModel[4] = new ModelTFTrophyArmor(4, 0.5F); + trophyArmorModel[5] = new ModelTFTrophyArmor(5, 0.5F); + trophyArmorModel[6] = new ModelTFTrophyArmor(6, 0.5F); + trophyArmorModel[7] = new ModelTFTrophyArmor(7, 0.5F); + trophyArmorModel[8] = new ModelTFTrophyArmor(8, 0.5F); + + critterArmorModel = new ModelBiped[3]; + critterArmorModel[0] = new ModelTFCritterArmor(0, 0.5F); + critterArmorModel[1] = new ModelTFCritterArmor(1, 0.5F); + critterArmorModel[2] = new ModelTFCritterArmor(2, 0.5F); + } public int getCritterBlockRenderID() { @@ -613,7 +655,11 @@ public int getPlantBlockRenderID() { } public int getCakeBlockRenderID() { - return blockCakeRenderID; + return cakeRenderID; + } + + public int getChestBlockRenderID() { + return chestRenderID; } public int getComplexBlockRenderID() { @@ -656,6 +702,10 @@ public int getKnightmetalBlockRenderID() { return knightmetalBlockRenderID; } + public int getFieryMetalBlockRenderID() { + return fieryMetalBlockRenderID; + } + public int getHugeLilyPadBlockRenderID() { return hugeLilyPadBlockRenderID; } @@ -754,6 +804,14 @@ public ModelBiped getFieryArmorModel(int armorSlot) { return this.fieryArmorModel[armorSlot]; } + public ModelBiped getTrophyArmorModel(int boss) { + return this.trophyArmorModel[boss]; + } + + public ModelBiped getCritterArmorModel(int critter) { + return this.critterArmorModel[critter]; + } + public boolean isDangerOverlayShown() { return isDangerOverlayShown; } @@ -802,4 +860,44 @@ public void doBlockAnnihilateEffect(World worldObj, int blockX, int blockY, int } } + public boolean checkForSound(ChunkCoordinates chunkcoordinates) { + Minecraft mc = Minecraft.getMinecraft(); + ISound isound = (ISound) mc.renderGlobal.mapSoundPositions.get(chunkcoordinates); + if (isound == null) return false; + else { + if (mc.getSoundHandler().isSoundPlaying(isound)) return true; + else { + mc.getSoundHandler().stopSound(isound); + mc.renderGlobal.mapSoundPositions.remove(chunkcoordinates); + return false; + } + } + } + + public void stopSound(World worldIn, int x, int y, int z) { + ChunkCoordinates chunkcoordinates = new ChunkCoordinates(x, y, z); + Minecraft mc = Minecraft.getMinecraft(); + ISound isound = (ISound) mc.renderGlobal.mapSoundPositions.get(chunkcoordinates); + + while (isound != null) { + mc.getSoundHandler().stopSound(isound); + mc.renderGlobal.mapSoundPositions.remove(chunkcoordinates); + isound = (ISound) mc.renderGlobal.mapSoundPositions.get(chunkcoordinates); + } + } + + @SuppressWarnings("unchecked") + public void playSound(World worldObj, ChunkCoordinates chunkcoordinates, ResourceLocation soundResource) { + PositionedSoundRecord positionedsoundrecord = new PositionedSoundRecord( + soundResource, + 1.0f, + (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2F + 1.0F, + (float) chunkcoordinates.posX, + (float) chunkcoordinates.posY, + (float) chunkcoordinates.posZ); + Minecraft mc = Minecraft.getMinecraft(); + mc.renderGlobal.mapSoundPositions.put(chunkcoordinates, positionedsoundrecord); + mc.getSoundHandler().playSound(positionedsoundrecord); + } + } diff --git a/src/main/java/twilightforest/client/model/ModelTFChest.java b/src/main/java/twilightforest/client/model/ModelTFChest.java new file mode 100644 index 0000000000..5ff6dfd2a0 --- /dev/null +++ b/src/main/java/twilightforest/client/model/ModelTFChest.java @@ -0,0 +1,17 @@ +package twilightforest.client.model; + +import net.minecraft.client.model.ModelChest; +import net.minecraft.client.model.ModelRenderer; + +public class ModelTFChest extends ModelChest { + + public ModelTFChest() { + super(); + chestLid = (new ModelRenderer(this, 0, 0)).setTextureSize(64, 64); + this.chestLid.addBox(0.0F, -5.0F, -14.0F, 14, 5, 14, 0.01F); + this.chestLid.rotationPointX = 1.0F; + this.chestLid.rotationPointY = 7.0F; + this.chestLid.rotationPointZ = 15.0F; + } + +} diff --git a/src/main/java/twilightforest/client/model/ModelTFCritterArmor.java b/src/main/java/twilightforest/client/model/ModelTFCritterArmor.java new file mode 100644 index 0000000000..f34c22891d --- /dev/null +++ b/src/main/java/twilightforest/client/model/ModelTFCritterArmor.java @@ -0,0 +1,77 @@ +package twilightforest.client.model; + +import net.minecraft.client.model.ModelBiped; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; + +public class ModelTFCritterArmor extends ModelBiped { + + ModelRenderer critterBody; + + public ModelTFCritterArmor(int critter, float expand) { + super(expand); + this.bipedHead = new ModelRenderer(this, 0, 0); + this.bipedHead.setRotationPoint(0, 0, 0); + + this.critterBody = new ModelRenderer(this, 0, 0); + this.critterBody.setRotationPoint(0, 0, 0); + + this.bipedHead.showModel = true; + this.bipedHeadwear.showModel = false; + this.bipedBody.showModel = false; + this.bipedRightArm.showModel = false; + this.bipedLeftArm.showModel = false; + this.bipedRightLeg.showModel = false; + this.bipedLeftLeg.showModel = false; + + switch (critter) { + case 0 -> { // Firefly + ModelTFFirefly fireflyModel = new ModelTFFirefly(); + critterBody.addChild(fireflyModel.fatbody); + critterBody.addChild(fireflyModel.skinnybody); + critterBody.addChild(fireflyModel.legs); + critterBody.rotateAngleY = (float) Math.PI; // 180 degrees + } + case 1 -> { // Cicada + ModelTFCicada cicadaModel = new ModelTFCicada(); + critterBody.addChild(cicadaModel.fatbody); + critterBody.addChild(cicadaModel.skinnybody); + critterBody.addChild(cicadaModel.legs); + critterBody.addChild(cicadaModel.eye1); + critterBody.addChild(cicadaModel.eye2); + critterBody.addChild(cicadaModel.wings); + critterBody.rotateAngleY = (float) Math.PI; // 180 degrees + } + case 2 -> { // Moonworm + ModelTFMoonworm moonwormModel = new ModelTFMoonworm(); + critterBody.addChild(moonwormModel.head); + critterBody.addChild(moonwormModel.Shape1); + critterBody.addChild(moonwormModel.Shape2); + critterBody.addChild(moonwormModel.Shape3); + critterBody.rotateAngleY = (float) Math.PI * 3 / 2; // 270 degrees + } + } + critterBody.offsetY = -1.0f; + critterBody.offsetZ = 0.0f; + bipedHead.addChild(critterBody); + } + + /** + * Sets the models various rotation angles then renders the model. + */ + @Override + public void render(Entity par1Entity, float par2, float par3, float par4, float par5, float par6, float par7) { + + if (par1Entity != null) { + this.isSneak = par1Entity.isSneaking(); + } + + if (par1Entity != null && par1Entity instanceof EntityLivingBase) { + this.heldItemRight = ((EntityLivingBase) par1Entity).getHeldItem() != null ? 1 : 0; + } + + super.render(par1Entity, par2, par3, par4, par5, par6, par7); + } + +} diff --git a/src/main/java/twilightforest/client/model/ModelTFLargeChest.java b/src/main/java/twilightforest/client/model/ModelTFLargeChest.java new file mode 100644 index 0000000000..87a5f856a2 --- /dev/null +++ b/src/main/java/twilightforest/client/model/ModelTFLargeChest.java @@ -0,0 +1,17 @@ +package twilightforest.client.model; + +import net.minecraft.client.model.ModelLargeChest; +import net.minecraft.client.model.ModelRenderer; + +public class ModelTFLargeChest extends ModelLargeChest { + + public ModelTFLargeChest() { + super(); + this.chestLid = (new ModelRenderer(this, 0, 0)).setTextureSize(128, 64); + this.chestLid.addBox(0.0F, -5.0F, -14.0F, 30, 5, 14, 0.01F); + this.chestLid.rotationPointX = 1.0F; + this.chestLid.rotationPointY = 7.0F; + this.chestLid.rotationPointZ = 15.0F; + } + +} diff --git a/src/main/java/twilightforest/client/model/ModelTFQuestRam.java b/src/main/java/twilightforest/client/model/ModelTFQuestRam.java index 392aff5127..4c9d05c1b0 100644 --- a/src/main/java/twilightforest/client/model/ModelTFQuestRam.java +++ b/src/main/java/twilightforest/client/model/ModelTFQuestRam.java @@ -20,19 +20,19 @@ public class ModelTFQuestRam extends ModelBase { // fields - ModelRenderer frontbody; - ModelRenderer rearbody; - ModelRenderer leg1; - ModelRenderer haunch1; - ModelRenderer leg2; - ModelRenderer haunch2; - ModelRenderer leg3; - ModelRenderer haunch3; - ModelRenderer leg4; - ModelRenderer haunch4; - ModelRenderer neck; - ModelRenderer nose; - ModelRenderer head; + public ModelRenderer frontbody; + public ModelRenderer rearbody; + public ModelRenderer leg1; + public ModelRenderer haunch1; + public ModelRenderer leg2; + public ModelRenderer haunch2; + public ModelRenderer leg3; + public ModelRenderer haunch3; + public ModelRenderer leg4; + public ModelRenderer haunch4; + public ModelRenderer neck; + public ModelRenderer nose; + public ModelRenderer head; ModelRenderer[] segments; boolean[] segmentEnabled; diff --git a/src/main/java/twilightforest/client/model/ModelTFTrophyArmor.java b/src/main/java/twilightforest/client/model/ModelTFTrophyArmor.java new file mode 100644 index 0000000000..47de8f2dd5 --- /dev/null +++ b/src/main/java/twilightforest/client/model/ModelTFTrophyArmor.java @@ -0,0 +1,170 @@ +package twilightforest.client.model; + +import net.minecraft.client.model.ModelBiped; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; + +import org.lwjgl.opengl.GL11; + +public class ModelTFTrophyArmor extends ModelBiped { + + private int boss = 0; + private int time = 0; + + public ModelTFTrophyArmor(int boss, float expand) { + super(expand); + this.boss = boss; + + this.bipedHead = new ModelRenderer(this, 0, 0); + this.bipedHead.setRotationPoint(0, 0, 0); + + this.bipedHead.showModel = true; + this.bipedHeadwear.showModel = false; + this.bipedBody.showModel = false; + this.bipedRightArm.showModel = false; + this.bipedLeftArm.showModel = false; + this.bipedRightLeg.showModel = false; + this.bipedLeftLeg.showModel = false; + + switch (boss) { + case 0 -> { // Hydra + ModelTFHydraHead hydraHeadModel = new ModelTFHydraHead(); + hydraHeadModel.head.offsetY = -1.0f; + hydraHeadModel.head.offsetZ = 1.1f; + bipedHead.addChild(hydraHeadModel.head); + } + case 1 -> { // Naga + ModelTFNaga nagaHeadModel = new ModelTFNaga(); + nagaHeadModel.head.offsetY = -0.25f; + bipedHead.addChild(nagaHeadModel.head); + } + case 2 -> { // Lich + ModelTFLich lichModel = new ModelTFLich(); + bipedHead = lichModel.bipedHead; + bipedHeadwear = lichModel.bipedHeadwear; + bipedHeadwear.showModel = true; + } + case 3 -> { // Ur-Ghast + ModelTFTowerBoss urGhastModel = new ModelTFTowerBoss(); + urGhastModel.body.offsetY = -1f; + bipedHead.addChild(urGhastModel.body); + } + case 4 -> { // Snow Queen + ModelTFSnowQueen snowQueenModel = new ModelTFSnowQueen(); + bipedHead = snowQueenModel.bipedHead; + bipedHeadwear = snowQueenModel.bipedHeadwear; + bipedHeadwear.showModel = true; + } + case 5 -> { // Minoshroom + ModelTFMinoshroom minoshroomModel = new ModelTFMinoshroom(); + bipedHead = minoshroomModel.bipedHead; + } + case 6 -> { // Knight Phantom + ModelTFKnightlyArmor knightPhantomArmorModel = new ModelTFKnightlyArmor(0, 0.5F); + bipedHead = knightPhantomArmorModel.bipedHead; + ModelRenderer skeletonHead = new ModelRenderer(this, 0, 16); + skeletonHead.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8); + skeletonHead.setRotationPoint(0.0F, 0.0F, 0.0F); + bipedHead.addChild(skeletonHead); + } + case 7 -> { // Alpha Yeti + ModelTFYetiAlpha alphaYetiModel = new ModelTFYetiAlpha().trophySetup(); + alphaYetiModel.bipedBody.offsetY = 0.75f; + bipedHead.addChild(alphaYetiModel.bipedBody); + } + case 8 -> { // Questing Ram + ModelTFQuestRam questingRamModel = new ModelTFQuestRam(); + questingRamModel.head.offsetY = 0.525f; + questingRamModel.head.offsetZ = 0.75f; + bipedHead.addChild(questingRamModel.head); + } + } + } + + /** + * Sets the models various rotation angles then renders the model. + */ + @Override + public void render(Entity par1Entity, float par2, float par3, float par4, float par5, float par6, float par7) { + + if (par1Entity != null) { + this.isSneak = par1Entity.isSneaking(); + } + + if (par1Entity != null && par1Entity instanceof EntityLivingBase) { + this.heldItemRight = ((EntityLivingBase) par1Entity).getHeldItem() != null ? 1 : 0; + } + + float scale = 1.0f; + float dX = 0.0f; + float dY = 0.0f; + float dZ = 0.0f; + + switch (boss) { + case 0 -> { // Hydra + scale = 0.3f * 1.06f; + dX = 0.0f; + dY = 0.0f; + dZ = 0.0f; + } + case 1 -> { // Naga + scale = 0.5f * 1.06f; + dX = 0.0f; + dY = 0.005f; + dZ = 0.0f; + } + case 2, 4 -> { // Lich, Snow Queen + scale = 1.06f; + dX = 0.0f; + dY = 0.005f; + dZ = 0.0f; + } + case 3 -> { // Ur-Ghast + bipedHead = new ModelRenderer(this, 0, 0); + ModelTFTowerBoss urGhastModel = new ModelTFTowerBoss(); + urGhastModel.body.offsetY = -1f; + urGhastModel.setRotationAngles(0.0F, 0, time, 0, 0.0F, 0.0625F, par1Entity); + time++; + bipedHead.addChild(urGhastModel.body); + scale = 0.5f * 1.06f; + dX = 0.0f; + dY = 0.005f; + dZ = 0.0f; + } + case 5 -> { // Minoshroom + scale = 1.06f; + dX = 0.0f; + dY = 0.005f; + dZ = 0.565f; + } + case 6 -> { // Knight Phantom + scale = 1.0f; + dX = 0.0f; + dY = 0.0f; + dZ = 0.0f; + } + case 7 -> { // Alpha Yeti + scale = 0.23f; + dX = 0.0f; + dY = 0.005f; + dZ = 0.0f; + } + case 8 -> { // Questing Ram + scale = 0.75f; + dX = 0.0f; + dY = 0.0f; + dZ = 0.0f; + } + } + + GL11.glScalef(scale, scale, scale); + GL11.glTranslatef(dX, dY, dZ); + + super.render(par1Entity, par2, par3, par4, par5, par6, par7); + + GL11.glScalef(1 / scale, 1 / scale, 1 / scale); + GL11.glTranslatef(-dX, -dY, -dZ); + } + +} diff --git a/src/main/java/twilightforest/client/model/ModelTFYetiAlpha.java b/src/main/java/twilightforest/client/model/ModelTFYetiAlpha.java index 2f40416629..4f28264e44 100644 --- a/src/main/java/twilightforest/client/model/ModelTFYetiAlpha.java +++ b/src/main/java/twilightforest/client/model/ModelTFYetiAlpha.java @@ -72,6 +72,32 @@ public ModelTFYetiAlpha() { } + public ModelTFYetiAlpha trophySetup() { + this.bipedBody = new ModelRenderer(this, 80, 0); + this.bipedBody.addBox(-24.0F, -60.0F, -18.0F, 48, 54, 36); + this.bipedBody.setRotationPoint(0.0F, -6.0F, 0.0F); + + this.mouth = new ModelRenderer(this, 121, 50); + this.mouth.addBox(-17.0F, -7.0F, -1.5F, 34, 29, 2); + this.mouth.setRotationPoint(0.0F, -37.0F, -18.0F); + this.bipedBody.addChild(mouth); + + this.rightEye = new ModelRenderer(this, 64, 0); + this.rightEye.addBox(-6.0F, -6.0F, -1.5F, 12, 12, 2); + this.rightEye.setRotationPoint(-14.0F, -50.0F, -18.0F); + this.bipedBody.addChild(rightEye); + + this.leftEye = new ModelRenderer(this, 64, 0); + this.leftEye.addBox(-6.0F, -6.0F, -1.5F, 12, 12, 2); + this.leftEye.setRotationPoint(14.0F, -50.0F, -18.0F); + this.bipedBody.addChild(leftEye); + + addPairHorns(-58.0F, 35F); + addPairHorns(-46.0F, 15F); + addPairHorns(-36.0F, -5F); + return this; + } + /** * Add a pair of horns */ diff --git a/src/main/java/twilightforest/client/renderer/TFFieryMetalBlockRenderer.java b/src/main/java/twilightforest/client/renderer/TFFieryMetalBlockRenderer.java new file mode 100644 index 0000000000..ac6908c398 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/TFFieryMetalBlockRenderer.java @@ -0,0 +1,57 @@ +package twilightforest.client.renderer; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; +import net.minecraftforge.client.IItemRenderer; + +import org.lwjgl.opengl.GL11; + +import twilightforest.block.BlockTFCompressed; +import twilightforest.block.TFBlocks; +import twilightforest.client.renderer.blocks.RenderBlockTFFieryMetal; + +public class TFFieryMetalBlockRenderer implements IItemRenderer { + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return type == ItemRenderType.EQUIPPED; + } + + public void renderInventoryItem(RenderBlocks renderer, ItemStack item) { + int metadata = item.getItemDamage(); + renderInvSimpleBlock(renderer, TFBlocks.fieryMetalStorage, metadata); + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + switch (type) { + case EQUIPPED: + GL11.glTranslatef(0.5F, 0.5F, 0.5F); + renderInventoryItem((RenderBlocks) data[0], item); + break; + default: + break; + } + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return true; + } + + public static void renderInvSimpleBlock(RenderBlocks renderblocks, Block par1Block, int meta) { + Tessellator tessellator = Tessellator.instance; + + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + renderblocks.setRenderBounds(0, 0, 0, 1, 1, 1); + RenderBlockTFFieryMetal.renderInvBlock(renderblocks, (BlockTFCompressed) par1Block, meta, tessellator); + + GL11.glTranslatef(0.5F, 0.5F, 0.5F); + + par1Block.setBlockBoundsForItemRender(); + } +} diff --git a/src/main/java/twilightforest/client/renderer/TileEntityTFChestRenderer.java b/src/main/java/twilightforest/client/renderer/TileEntityTFChestRenderer.java new file mode 100644 index 0000000000..42fd0ce8bb --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/TileEntityTFChestRenderer.java @@ -0,0 +1,158 @@ +package twilightforest.client.renderer; + +import net.minecraft.block.Block; +import net.minecraft.client.model.ModelChest; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityChest; +import net.minecraft.util.ResourceLocation; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import cpw.mods.fml.common.FMLLog; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import twilightforest.TwilightForestMod; +import twilightforest.block.BlockTFChest; +import twilightforest.block.BlockTFChest.WoodType; +import twilightforest.client.model.ModelTFChest; +import twilightforest.client.model.ModelTFLargeChest; +import twilightforest.tileentity.TileEntityTFChest; + +@SideOnly(Side.CLIENT) +public class TileEntityTFChestRenderer extends TileEntitySpecialRenderer { + + public static final String[] names = { "twilight", "canopy", "mangrove", "darkwood", "time", "trans", "mining", + "sort" }; + private static final ResourceLocation[] doubleTextures = new ResourceLocation[names.length]; + private static final ResourceLocation[] textures = new ResourceLocation[names.length]; + private ModelChest modelChest = new ModelTFChest(); + private ModelChest modelLargeChest = new ModelTFLargeChest(); + + public TileEntityTFChestRenderer() { + for (int i = 0; i < names.length; i++) { + doubleTextures[i] = new ResourceLocation(TwilightForestMod.MODEL_DIR + "chest/" + names[i] + "_double.png"); + textures[i] = new ResourceLocation(TwilightForestMod.MODEL_DIR + "chest/" + names[i] + ".png"); + } + } + + public void renderTileEntityAt(TileEntityChest tileEntity, double x, double y, double z, float f) { + int i; + + if (!tileEntity.hasWorldObj()) { + i = 0; + } else { + Block block = tileEntity.getBlockType(); + i = tileEntity.getBlockMetadata(); + + if (block instanceof BlockTFChest && i == 0) { + try { + ((BlockTFChest) block).func_149954_e( + tileEntity.getWorldObj(), + tileEntity.xCoord, + tileEntity.yCoord, + tileEntity.zCoord); + } catch (ClassCastException e) { + FMLLog.severe( + "Attempted to render a chest at %d, %d, %d that was not a chest", + tileEntity.xCoord, + tileEntity.yCoord, + tileEntity.zCoord); + } + i = tileEntity.getBlockMetadata(); + } + + ((TileEntityTFChest) tileEntity).checkForAdjacentChests(); + } + + WoodType type = WoodType.CANOPY; + if (tileEntity instanceof TileEntityTFChest) { + if (((TileEntityTFChest) tileEntity).cachedMaterial == WoodType.NULL) { + Block block = tileEntity.getWorldObj() + .getBlock(tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord); + if (block instanceof BlockTFChest) type = ((BlockTFChest) block).getWoodType(); + } else type = ((TileEntityTFChest) tileEntity).cachedMaterial; + } + + if (tileEntity.adjacentChestZNeg == null && tileEntity.adjacentChestXNeg == null) { + ModelChest modelchest; + + if (tileEntity.adjacentChestXPos == null && tileEntity.adjacentChestZPos == null) { + modelchest = this.modelChest; + this.bindTexture(textures[type.ordinal()]); + } else { + modelchest = this.modelLargeChest; + this.bindTexture(doubleTextures[type.ordinal()]); + } + + GL11.glPushMatrix(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glTranslatef((float) x, (float) y + 1.0F, (float) z + 1.0F); + GL11.glScalef(1.0F, -1.0F, -1.0F); + GL11.glTranslatef(0.5F, 0.5F, 0.5F); + short short1 = 0; + + if (i == 2) { + short1 = 180; + } + + if (i == 3) { + short1 = 0; + } + + if (i == 4) { + short1 = 90; + } + + if (i == 5) { + short1 = -90; + } + + if (i == 2 && tileEntity.adjacentChestXPos != null) { + GL11.glTranslatef(1.0F, 0.0F, 0.0F); + } + + if (i == 5 && tileEntity.adjacentChestZPos != null) { + GL11.glTranslatef(0.0F, 0.0F, -1.0F); + } + + GL11.glRotatef((float) short1, 0.0F, 1.0F, 0.0F); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + float f1 = tileEntity.prevLidAngle + (tileEntity.lidAngle - tileEntity.prevLidAngle) * f; + float f2; + + if (tileEntity.adjacentChestZNeg != null) { + f2 = tileEntity.adjacentChestZNeg.prevLidAngle + + (tileEntity.adjacentChestZNeg.lidAngle - tileEntity.adjacentChestZNeg.prevLidAngle) * f; + + if (f2 > f1) { + f1 = f2; + } + } + + if (tileEntity.adjacentChestXNeg != null) { + f2 = tileEntity.adjacentChestXNeg.prevLidAngle + + (tileEntity.adjacentChestXNeg.lidAngle - tileEntity.adjacentChestXNeg.prevLidAngle) * f; + + if (f2 > f1) { + f1 = f2; + } + } + + f1 = 1.0F - f1; + f1 = 1.0F - f1 * f1 * f1; + modelchest.chestLid.rotateAngleX = -(f1 * (float) Math.PI / 2.0F); + modelchest.renderAll(); + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + GL11.glPopMatrix(); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + } + } + + public void renderTileEntityAt(TileEntity p_147500_1_, double p_147500_2_, double p_147500_4_, double p_147500_6_, + float p_147500_8_) { + this.renderTileEntityAt((TileEntityTFChest) p_147500_1_, p_147500_2_, p_147500_4_, p_147500_6_, p_147500_8_); + } +} diff --git a/src/main/java/twilightforest/client/renderer/TileEntityTFMoonwormRenderer.java b/src/main/java/twilightforest/client/renderer/TileEntityTFMoonwormRenderer.java index 85d60d673e..a2d2bd82a6 100644 --- a/src/main/java/twilightforest/client/renderer/TileEntityTFMoonwormRenderer.java +++ b/src/main/java/twilightforest/client/renderer/TileEntityTFMoonwormRenderer.java @@ -22,14 +22,14 @@ public TileEntityTFMoonwormRenderer() { @Override public void renderTileEntityAt(TileEntity tileentity, double d, double d1, double d2, float f) { - renderTileEntityFireflyAt((TileEntityTFMoonworm) tileentity, d, d1, d2, f); + renderTileEntityMoonwormAt((TileEntityTFMoonworm) tileentity, d, d1, d2, f); } /** - * Render a cute firefly! + * Render a cute moonworm! */ - private void renderTileEntityFireflyAt(TileEntityTFMoonworm tileentity, double d, double d1, double d2, + private void renderTileEntityMoonwormAt(TileEntityTFMoonworm tileentity, double d, double d1, double d2, float partialTime) { GL11.glPushMatrix(); int facing = tileentity.getBlockMetadata(); @@ -65,7 +65,7 @@ private void renderTileEntityFireflyAt(TileEntityTFMoonworm tileentity, double d moonwormModel.setLivingAnimations(tileentity, partialTime); - // render the firefly body + // render the moonworm body moonwormModel.render(0.0625f); GL11.glPopMatrix(); diff --git a/src/main/java/twilightforest/client/renderer/TileEntityTFTrophyRenderer.java b/src/main/java/twilightforest/client/renderer/TileEntityTFTrophyRenderer.java index 21ecc9a50b..428c85eb2b 100644 --- a/src/main/java/twilightforest/client/renderer/TileEntityTFTrophyRenderer.java +++ b/src/main/java/twilightforest/client/renderer/TileEntityTFTrophyRenderer.java @@ -8,10 +8,15 @@ import twilightforest.TwilightForestMod; import twilightforest.client.model.ModelTFHydraHead; +import twilightforest.client.model.ModelTFKnightPhantom2; +import twilightforest.client.model.ModelTFKnightlyArmor; import twilightforest.client.model.ModelTFLich; +import twilightforest.client.model.ModelTFMinoshroom; import twilightforest.client.model.ModelTFNaga; +import twilightforest.client.model.ModelTFQuestRam; import twilightforest.client.model.ModelTFSnowQueen; import twilightforest.client.model.ModelTFTowerBoss; +import twilightforest.client.model.ModelTFYetiAlpha; import twilightforest.tileentity.TileEntityTFTrophy; public class TileEntityTFTrophyRenderer extends TileEntitySpecialRenderer { @@ -31,6 +36,23 @@ public class TileEntityTFTrophyRenderer extends TileEntitySpecialRenderer { private ModelTFSnowQueen snowQueenModel; private static final ResourceLocation textureLocSnowQueen = new ResourceLocation( TwilightForestMod.MODEL_DIR + "snowqueen.png"); + private ModelTFMinoshroom minoshroomModel; + private static final ResourceLocation textureLocMinoshroom = new ResourceLocation( + TwilightForestMod.MODEL_DIR + "minoshroomtaur.png"); + private ModelTFKnightPhantom2 knightPhantomModel; + private ModelTFKnightlyArmor knightPhantomArmorModel; + private static final ResourceLocation textureLocKnightPhantom = new ResourceLocation( + TwilightForestMod.MODEL_DIR + "phantomskeleton.png"); + private static final ResourceLocation textureLocKnightPhantomArmor = new ResourceLocation( + TwilightForestMod.ARMOR_DIR + "phantom_1.png"); + private ModelTFYetiAlpha alphaYetiModel; + private static final ResourceLocation textureLocAlphaYeti = new ResourceLocation( + TwilightForestMod.MODEL_DIR + "yetialpha.png"); + private ModelTFQuestRam questingRamModel; + private static final ResourceLocation textureLocQuestingRam = new ResourceLocation( + TwilightForestMod.MODEL_DIR + "questram.png"); + private static final ResourceLocation textureLocQuestingRamLines = new ResourceLocation( + TwilightForestMod.MODEL_DIR + "questram_lines.png"); public TileEntityTFTrophyRenderer() { hydraHeadModel = new ModelTFHydraHead(); @@ -38,6 +60,11 @@ public TileEntityTFTrophyRenderer() { lichModel = new ModelTFLich(); urGhastModel = new ModelTFTowerBoss(); snowQueenModel = new ModelTFSnowQueen(); + minoshroomModel = new ModelTFMinoshroom(); + knightPhantomModel = new ModelTFKnightPhantom2(); + knightPhantomArmorModel = new ModelTFKnightlyArmor(0, 0.5F); + alphaYetiModel = new ModelTFYetiAlpha().trophySetup(); + questingRamModel = new ModelTFQuestRam(); } @Override @@ -79,6 +106,10 @@ public void renderTileEntityAt(TileEntity tileentity, double x, double y, double case 2 -> renderLichHead(rotation, onGround); case 3 -> renderUrGhastHead(trophy, rotation, onGround, partialTime); case 4 -> renderSnowQueenHead(rotation, onGround); + case 5 -> renderMinoshroomHead(rotation, onGround); + case 6 -> renderKnightPhantomHead(rotation, onGround); + case 7 -> renderAlphaYetiHead(rotation, onGround); + case 8 -> renderQuestingRamHead(rotation, onGround); } GL11.glPopMatrix(); @@ -145,7 +176,7 @@ private void renderLichHead(float rotation, boolean onGround) { GL11.glTranslatef(0, onGround ? 1.75F : 1.5F, onGround ? 0F : 0.24F); - // render the naga head + // render the lich head lichModel.bipedHead.render(0.0625F); lichModel.bipedHeadwear.render(0.0625F); } @@ -166,7 +197,7 @@ private void renderUrGhastHead(TileEntityTFTrophy trophy, float rotation, boolea GL11.glTranslatef(0, onGround ? 1F : 1F, onGround ? 0F : 0F); - // render the naga head + // render the ur-ghast head urGhastModel.render(null, 0.0F, 0, trophy.ticksExisted + partialTime, 0, 0.0F, 0.0625F); } @@ -186,9 +217,99 @@ private void renderSnowQueenHead(float rotation, boolean onGround) { GL11.glTranslatef(0, onGround ? 1.5F : 1.25F, onGround ? 0F : 0.24F); - // render the naga head + // render the snow queen head snowQueenModel.bipedHead.render(0.0625F); snowQueenModel.bipedHeadwear.render(0.0625F); } + private void renderMinoshroomHead(float rotation, boolean onGround) { + + // GL11.glScalef(0.5f, 0.5f, 0.5f); + + this.bindTexture(textureLocMinoshroom); + + GL11.glScalef(1f, -1f, -1f); + + // we seem to be getting a 180 degree rotation here + GL11.glRotatef(rotation, 0F, 1F, 0F); + GL11.glRotatef(180F, 0F, 1F, 0F); + + GL11.glTranslatef(0, -0.625f, 0.57f); + + GL11.glTranslatef(0, onGround ? 1.5F : 1.25F, onGround ? 0F : 0.24F); + + // render the minoshroom head + minoshroomModel.bipedHead.render(0.0625F); + minoshroomModel.bipedHeadwear.render(0.0625F); + } + + private void renderKnightPhantomHead(float rotation, boolean onGround) { + + float scale = 0.89f; + GL11.glScalef(scale, scale, scale); + + GL11.glTranslatef(0, 0.97f, 0); + + this.bindTexture(textureLocKnightPhantom); + + GL11.glScalef(1f, -1f, -1f); + + // we seem to be getting a 180 degree rotation here + GL11.glRotatef(rotation, 0F, 1F, 0F); + GL11.glRotatef(180F, 0F, 1F, 0F); + + GL11.glTranslatef(0, onGround ? 1.5F : 1.22F, onGround ? 0F : 0.28F); + + // render the knight phantom head + knightPhantomModel.bipedHead.render(0.0625F); + + this.bindTexture(textureLocKnightPhantomArmor); + + // render the knight phantom armor + knightPhantomArmorModel.bipedHead.render(0.0625F); + knightPhantomArmorModel.bipedHeadwear.render(0.0625F); + } + + private void renderAlphaYetiHead(float rotation, boolean onGround) { + + float scale = 0.2f; + GL11.glScalef(scale, scale, scale); + + GL11.glTranslatef(0, -1.8f, 0); + + this.bindTexture(textureLocAlphaYeti); + + GL11.glScalef(1f, -1f, -1f); + + // we seem to be getting a 180 degree rotation here + GL11.glRotatef(rotation, 0F, 1F, 0F); + GL11.glRotatef(180F, 0F, 1F, 0F); + + GL11.glTranslatef(0, onGround ? 1.5F : 0.2F, onGround ? 0F : 1.385F); + + // render the alpha yeti head + alphaYetiModel.bipedBody.render(0.0625F); + } + + private void renderQuestingRamHead(float rotation, boolean onGround) { + + float scale = 0.65f; + GL11.glScalef(scale, scale, scale); + + this.bindTexture(textureLocQuestingRam); + + GL11.glScalef(1f, -1f, -1f); + + // we seem to be getting a 180 degree rotation here + GL11.glRotatef(rotation, 0F, 1F, 0F); + GL11.glRotatef(180F, 0F, 1F, 0F); + + GL11.glTranslatef(0, -0.25f, 0.67f); + + GL11.glTranslatef(0, onGround ? 1.5F : 1.175F, onGround ? 0.05F : 0.41F); + + // render the questing ram head + questingRamModel.head.render(0.0625F); + } + } diff --git a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFCastleMagic.java b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFCastleMagic.java index edc05eefde..c908826843 100644 --- a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFCastleMagic.java +++ b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFCastleMagic.java @@ -42,24 +42,14 @@ protected static void renderInvBlock(RenderBlocks renderblocks, Block block, int tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, -1.0F, 0.0F); renderblocks.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, block.getIcon(0, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 1.0F, 0.0F); renderblocks.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, block.getIcon(1, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, -1.0F); renderblocks.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, block.getIcon(2, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, 1.0F); renderblocks.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, block.getIcon(3, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(-1.0F, 0.0F, 0.0F); renderblocks.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, block.getIcon(4, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(1.0F, 0.0F, 0.0F); renderblocks.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, block.getIcon(5, meta)); tessellator.draw(); @@ -82,28 +72,18 @@ protected static void renderInvBlock(RenderBlocks renderblocks, Block block, int tessellator.setBrightness(15 << 20 | 15 << 4); // full brightness tessellator.setColorOpaque_F(red, grn, blu); renderblocks.renderFaceYNeg(block, 0.0D, -pixel, 0.0D, icon); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setBrightness(15 << 20 | 15 << 4); // full brightness tessellator.setColorOpaque_F(red, grn, blu); renderblocks.renderFaceYPos(block, 0.0D, +pixel, 0.0D, icon); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setBrightness(15 << 20 | 15 << 4); // full brightness tessellator.setColorOpaque_F(red, grn, blu); renderblocks.renderFaceXPos(block, +pixel, 0.0D, 0.0D, icon); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setBrightness(15 << 20 | 15 << 4); // full brightness tessellator.setColorOpaque_F(red, grn, blu); renderblocks.renderFaceXNeg(block, -pixel, 0.0D, 0.0D, icon); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setBrightness(15 << 20 | 15 << 4); // full brightness tessellator.setColorOpaque_F(red, grn, blu); renderblocks.renderFaceZNeg(block, 0.0D, 0.0D, -pixel, icon); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setBrightness(15 << 20 | 15 << 4); // full brightness tessellator.setColorOpaque_F(red, grn, blu); renderblocks.renderFaceZPos(block, 0.0D, 0.0D, +pixel, icon); diff --git a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFChest.java b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFChest.java new file mode 100644 index 0000000000..ac60bf6399 --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFChest.java @@ -0,0 +1,51 @@ +package twilightforest.client.renderer.blocks; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.world.IBlockAccess; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import twilightforest.block.BlockTFChest; +import twilightforest.tileentity.TileEntityTFChest; + +public class RenderBlockTFChest implements ISimpleBlockRenderingHandler { + + final int renderID; + + public RenderBlockTFChest(int blockChestRenderID) { + this.renderID = blockChestRenderID; + } + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { + GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + TileEntityRendererDispatcher.instance.renderTileEntityAt( + new TileEntityTFChest(((BlockTFChest) block).getWoodType()), + 0.0D, + 0.0D, + 0.0D, + 0.0F); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + return false; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } + + @Override + public int getRenderId() { + return renderID; + } +} diff --git a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFFieryMetal.java b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFFieryMetal.java new file mode 100644 index 0000000000..c49a4d00df --- /dev/null +++ b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFFieryMetal.java @@ -0,0 +1,249 @@ +package twilightforest.client.renderer.blocks; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; + +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import twilightforest.block.BlockTFCompressed; + +public class RenderBlockTFFieryMetal implements ISimpleBlockRenderingHandler { + + final int renderID; + + public RenderBlockTFFieryMetal(int blockComplexRenderID) { + this.renderID = blockComplexRenderID; + } + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { + renderInvJar(renderer, block, metadata); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, + RenderBlocks renderer) { + return renderGlowingEdgeBlock(renderer, world, x, y, z, (BlockTFCompressed) block); + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } + + @Override + public int getRenderId() { + return renderID; + } + + public static boolean renderGlowingEdgeBlock(RenderBlocks renderblocks, IBlockAccess world, int x, int y, int z, + BlockTFCompressed block) { + float p = 1F / 16F; + float m = (1.0f - p) / 2; + float s = 0.001f; + + Tessellator tessellator = Tessellator.instance; + tessellator.setBrightness(15 << 20 | 15 << 4); // full brightness + tessellator.setColorOpaque_F(1.0f, 1.0f, 1.0f); + + renderblocks.enableAO = false; + + // middle + renderblocks.renderAllFaces = true; + renderblocks.setRenderBounds(p, p, p, 1.0f - p, 1.0f - p, 1.0f - p); + renderInnerPart(renderblocks, world, x, y, z, block); + renderblocks.renderAllFaces = false; + + for (int rx = -1; rx <= 1; rx++) { + for (int ry = -1; ry <= 1; ry++) { + for (int rz = -1; rz <= 1; rz++) { + int moveAxis = Math.abs(rx) + Math.abs(ry) + Math.abs(rz); + if (moveAxis == 1 || moveAxis == 2) if (block.canConnectFieryTo(world, x + rx, y + ry, z + rz)) { + if (moveAxis == 2) { + int neighbours = 0; + if (rx != 0) neighbours += (block.canConnectFieryTo(world, x + rx, y, z)) ? 1 : 0; + if (ry != 0) neighbours += (block.canConnectFieryTo(world, x, y + ry, z)) ? 1 : 0; + if (rz != 0) neighbours += (block.canConnectFieryTo(world, x, y, z + rz)) ? 1 : 0; + if (neighbours != 2) continue; + } + renderblocks.renderAllFaces = true; + float minX = (rx == 0) ? p : m + m * rx; + float minY = (ry == 0) ? p : m + m * ry; + float minZ = (rz == 0) ? p : m + m * rz; + float maxX = (rx == 0) ? 1.0f - p : m + m * rx + p; + float maxY = (ry == 0) ? 1.0f - p : m + m * ry + p; + float maxZ = (rz == 0) ? 1.0f - p : m + m * rz + p; + renderblocks.setRenderBounds(minX, minY, minZ, maxX, maxY, maxZ); + renderInnerPart(renderblocks, world, x, y, z, block); + renderblocks.renderAllFaces = false; + } else { + // edge + if (moveAxis == 1) { + renderblocks.setRenderBounds( + (world.getBlock(x, y, z).isBlockSolid(world, x, y, z, 0) ? 0 : s), + (world.getBlock(x, y, z).isBlockSolid(world, x, y, z, 0) ? 0 : s), + (world.getBlock(x, y, z).isBlockSolid(world, x, y, z, 0) ? 0 : s), + 1 - (world.getBlock(x, y, z).isBlockSolid(world, x, y, z, 0) ? 0 : s), + 1 - (world.getBlock(x, y, z).isBlockSolid(world, x, y, z, 0) ? 0 : s), + 1 - (world.getBlock(x, y, z).isBlockSolid(world, x, y, z, 0) ? 0 : s)); + renderblocks.renderFromInside = true; + boolean flipTextures = (x + y + z) % 2 == 0; + if (rx != 0) { + if (rx == -1) renderblocks + .renderFaceXNeg(block, x, y, z, block.fieryPattern[flipTextures ? 0 : 1]); + else renderblocks + .renderFaceXPos(block, x, y, z, block.fieryPattern[flipTextures ? 3 : 2]); + } else { + if (ry != 0) { + if (ry == -1) renderblocks + .renderFaceYNeg(block, x, y, z, block.fieryPattern[flipTextures ? 2 : 0]); + else renderblocks + .renderFaceYPos(block, x, y, z, block.fieryPattern[flipTextures ? 3 : 1]); + } else { + if (rz == -1) renderblocks + .renderFaceZNeg(block, x, y, z, block.fieryPattern[flipTextures ? 1 : 0]); + else renderblocks + .renderFaceZPos(block, x, y, z, block.fieryPattern[flipTextures ? 2 : 3]); + } + } + renderblocks.renderFromInside = false; + } + } + } + } + } + + block.setBlockBoundsForItemRender(); + + renderblocks.enableAO = false; + return true; + } + + public static void renderInnerPart(RenderBlocks renderblocks, IBlockAccess world, int x, int y, int z, + BlockTFCompressed block) { + boolean neighbourU = block.canConnectFieryTo(world, x, y + 1, z); + boolean neighbourD = block.canConnectFieryTo(world, x, y - 1, z); + boolean neighbourN = block.canConnectFieryTo(world, x + 1, y, z); + boolean neighbourS = block.canConnectFieryTo(world, x - 1, y, z); + boolean neighbourE = block.canConnectFieryTo(world, x, y, z + 1); + boolean neighbourW = block.canConnectFieryTo(world, x, y, z - 1); + boolean neighbourUN = neighbourU && neighbourN && block.canConnectFieryTo(world, x + 1, y + 1, z); + boolean neighbourUS = neighbourU && neighbourS && block.canConnectFieryTo(world, x - 1, y + 1, z); + boolean neighbourUE = neighbourU && neighbourE && block.canConnectFieryTo(world, x, y + 1, z + 1); + boolean neighbourUW = neighbourU && neighbourW && block.canConnectFieryTo(world, x, y + 1, z - 1); + boolean neighbourDN = neighbourD && neighbourN && block.canConnectFieryTo(world, x + 1, y - 1, z); + boolean neighbourDS = neighbourD && neighbourS && block.canConnectFieryTo(world, x - 1, y - 1, z); + boolean neighbourDE = neighbourD && neighbourE && block.canConnectFieryTo(world, x, y - 1, z + 1); + boolean neighbourDW = neighbourD && neighbourW && block.canConnectFieryTo(world, x, y - 1, z - 1); + boolean neighbourNE = neighbourN && neighbourE && block.canConnectFieryTo(world, x + 1, y, z + 1); + boolean neighbourNW = neighbourN && neighbourW && block.canConnectFieryTo(world, x + 1, y, z - 1); + boolean neighbourSE = neighbourS && neighbourE && block.canConnectFieryTo(world, x - 1, y, z + 1); + boolean neighbourSW = neighbourS && neighbourW && block.canConnectFieryTo(world, x - 1, y, z - 1); + boolean neighboursUD = neighbourU || neighbourD; + boolean neighboursNS = neighbourN || neighbourS; + boolean neighboursEW = neighbourE || neighbourW; + IIcon icon; + + // X faces + if (neighboursUD) { + if (neighboursEW) { + if (neighbourUE || neighbourUW || neighbourDE || neighbourDW) icon = block.fieryCore[4]; + else icon = block.fieryCore[3]; + } else icon = block.fieryCore[2]; + } else { + if (neighboursEW) icon = block.fieryCore[1]; + else icon = block.fieryCore[0]; + } + renderblocks.renderFaceXPos(block, x, y, z, icon); + renderblocks.renderFaceXNeg(block, x, y, z, icon); + + // Z faces + if (neighboursUD) { + if (neighboursNS) { + if (neighbourUN || neighbourUS || neighbourDN || neighbourDS) icon = block.fieryCore[4]; + else icon = block.fieryCore[3]; + } else icon = block.fieryCore[2]; + } else { + if (neighboursNS) icon = block.fieryCore[1]; + else icon = block.fieryCore[0]; + } + renderblocks.renderFaceZPos(block, x, y, z, icon); + renderblocks.renderFaceZNeg(block, x, y, z, icon); + + // Y faces + if (neighboursEW) { + if (neighboursNS) { + if (neighbourNE || neighbourNW || neighbourSE || neighbourSW) icon = block.fieryCore[4]; + else icon = block.fieryCore[3]; + } else icon = block.fieryCore[2]; + } else { + if (neighboursNS) icon = block.fieryCore[1]; + else icon = block.fieryCore[0]; + } + renderblocks.renderFaceYPos(block, x, y, z, icon); + renderblocks.renderFaceYNeg(block, x, y, z, icon); + } + + public static void renderInvJar(RenderBlocks renderblocks, Block par1Block, int meta) { + Tessellator tessellator = Tessellator.instance; + + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + float p = 1F / 16F; + + // middle + renderblocks.setRenderBounds(p, p, p, 1 - p, 1 - p, 1 - p); + renderInvBlock(renderblocks, par1Block, meta, tessellator); + + // outline + renderblocks.setRenderBounds(0, 0, 0, 1, 1, 1); + renderInvOutline(renderblocks, (BlockTFCompressed) par1Block, meta, tessellator); + + GL11.glTranslatef(0.5F, 0.5F, 0.5F); + + par1Block.setBlockBoundsForItemRender(); + } + + public static void renderInvBlock(RenderBlocks renderblocks, Block par1Block, int meta, Tessellator tessellator) { + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 1.0F, 0.0F); + renderblocks.renderFaceYNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(0, meta)); + tessellator.setNormal(0.0F, 1.0F, 0.0F); + renderblocks.renderFaceYPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(1, meta)); + tessellator.setNormal(0.0F, 1.0F, 0.0F); + renderblocks.renderFaceXPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(2, meta)); + tessellator.setNormal(0.0F, 1.0F, 0.0F); + renderblocks.renderFaceXNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(3, meta)); + tessellator.setNormal(0.0F, 1.0F, 0.0F); + renderblocks.renderFaceZNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(4, meta)); + tessellator.setNormal(0.0F, 1.0F, 0.0F); + renderblocks.renderFaceZPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(5, meta)); + tessellator.draw(); + } + + protected static void renderInvOutline(RenderBlocks renderblocks, BlockTFCompressed block, int meta, + Tessellator tessellator) { + renderblocks.renderFromInside = true; + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 1.0F, 0.0F); + renderblocks.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, block.fieryPattern[2]); + tessellator.setNormal(0.0F, 1.0F, 0.0F); + renderblocks.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, block.fieryPattern[3]); + tessellator.setNormal(0.0F, 1.0F, 0.0F); + renderblocks.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, block.fieryPattern[0]); + tessellator.setNormal(0.0F, 1.0F, 0.0F); + renderblocks.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, block.fieryPattern[3]); + tessellator.setNormal(0.0F, 1.0F, 0.0F); + renderblocks.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, block.fieryPattern[2]); + tessellator.setNormal(0.0F, 1.0F, 0.0F); + renderblocks.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, block.fieryPattern[1]); + tessellator.draw(); + renderblocks.renderFromInside = false; + } + +} diff --git a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFFireflyJar.java b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFFireflyJar.java index d07a21291b..db7c4f1d2a 100644 --- a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFFireflyJar.java +++ b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFFireflyJar.java @@ -69,24 +69,14 @@ public static void renderInvJar(RenderBlocks renderblocks, Block par1Block, int tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, -1.0F, 0.0F); renderblocks.renderFaceYNeg(par1Block, 0.0D, 0.0D, 0.0D, BlockTFFireflyJar.jarTop); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 1.0F, 0.0F); renderblocks.renderFaceYPos(par1Block, 0.0D, 0.0D, 0.0D, BlockTFFireflyJar.jarTop); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, -1.0F); renderblocks.renderFaceXPos(par1Block, 0.0D, 0.0D, 0.0D, BlockTFFireflyJar.jarSide); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, 1.0F); renderblocks.renderFaceXNeg(par1Block, 0.0D, 0.0D, 0.0D, BlockTFFireflyJar.jarSide); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(-1.0F, 0.0F, 0.0F); renderblocks.renderFaceZNeg(par1Block, 0.0D, 0.0D, 0.0D, BlockTFFireflyJar.jarSide); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(1.0F, 0.0F, 0.0F); renderblocks.renderFaceZPos(par1Block, 0.0D, 0.0D, 0.0D, BlockTFFireflyJar.jarSide); tessellator.draw(); @@ -97,33 +87,17 @@ public static void renderInvJar(RenderBlocks renderblocks, Block par1Block, int tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, -1.0F, 0.0F); renderblocks.renderFaceYNeg(par1Block, 0.0D, 0.0D, 0.0D, BlockTFFireflyJar.jarCork); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 1.0F, 0.0F); renderblocks.renderFaceYPos(par1Block, 0.0D, 0.0D, 0.0D, BlockTFFireflyJar.jarCork); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, -1.0F); renderblocks.renderFaceXPos(par1Block, 0.0D, 0.0D, 0.0D, BlockTFFireflyJar.jarCork); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, 1.0F); renderblocks.renderFaceXNeg(par1Block, 0.0D, 0.0D, 0.0D, BlockTFFireflyJar.jarCork); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(-1.0F, 0.0F, 0.0F); renderblocks.renderFaceZNeg(par1Block, 0.0D, 0.0D, 0.0D, BlockTFFireflyJar.jarCork); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(1.0F, 0.0F, 0.0F); renderblocks.renderFaceZPos(par1Block, 0.0D, 0.0D, 0.0D, BlockTFFireflyJar.jarCork); tessellator.draw(); - // renderblocks.renderBottomFace(par1Block, 0.0D, 0.0D, 0.0D, sprLid); - // renderblocks.renderFaceYPos(par1Block, 0.0D, 0.0D, 0.0D, sprLid); - // renderblocks.renderFaceXPos(par1Block, 0.0D, 0.0D, 0.0D, sprLid); - // renderblocks.renderFaceXNeg(par1Block, 0.0D, 0.0D, 0.0D, sprLid); - // renderblocks.renderFaceZNeg(par1Block, 0.0D, 0.0D, 0.0D, sprLid); - // renderblocks.renderFaceZPos(par1Block, 0.0D, 0.0D, 0.0D, sprLid); GL11.glTranslatef(0.5F, 0.5F, 0.5F); diff --git a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFKnightMetal.java b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFKnightMetal.java index 51ed4aed69..4470004fd2 100644 --- a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFKnightMetal.java +++ b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFKnightMetal.java @@ -112,24 +112,14 @@ protected static void renderInvBlock(RenderBlocks renderblocks, Block par1Block, tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, -1.0F, 0.0F); renderblocks.renderFaceYNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(0, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 1.0F, 0.0F); renderblocks.renderFaceYPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(1, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, -1.0F); renderblocks.renderFaceXPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(2, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, 1.0F); renderblocks.renderFaceXNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(3, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(-1.0F, 0.0F, 0.0F); renderblocks.renderFaceZNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(4, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(1.0F, 0.0F, 0.0F); renderblocks.renderFaceZPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(5, meta)); tessellator.draw(); diff --git a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFMagicLeaves.java b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFMagicLeaves.java index 31cc008f24..4ddbca61bf 100644 --- a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFMagicLeaves.java +++ b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFMagicLeaves.java @@ -125,24 +125,14 @@ public static void renderInvNormalBlock(RenderBlocks renderblocks, Block par1Blo tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, -1.0F, 0.0F); renderblocks.renderFaceYNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(0, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 1.0F, 0.0F); renderblocks.renderFaceYPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(1, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, -1.0F); renderblocks.renderFaceXPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(2, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, 1.0F); renderblocks.renderFaceXNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(3, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(-1.0F, 0.0F, 0.0F); renderblocks.renderFaceZNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(4, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(1.0F, 0.0F, 0.0F); renderblocks.renderFaceZPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(5, meta)); tessellator.draw(); diff --git a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFNagastone.java b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFNagastone.java index f9e219200e..e5c67428b5 100644 --- a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFNagastone.java +++ b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFNagastone.java @@ -137,24 +137,14 @@ public static void renderInvNormalBlock(RenderBlocks renderblocks, Block par1Blo tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, -1.0F, 0.0F); renderblocks.renderFaceYNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(0, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 1.0F, 0.0F); renderblocks.renderFaceYPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(1, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, -1.0F); renderblocks.renderFaceXPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(2, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, 1.0F); renderblocks.renderFaceXNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(3, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(-1.0F, 0.0F, 0.0F); renderblocks.renderFaceZNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(4, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(1.0F, 0.0F, 0.0F); renderblocks.renderFaceZPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(5, meta)); tessellator.draw(); diff --git a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFNagastone2.java b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFNagastone2.java index 383559c6d5..66a225f110 100644 --- a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFNagastone2.java +++ b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFNagastone2.java @@ -3795,25 +3795,15 @@ public static void renderInvNormalBlock(RenderBlocks renderblocks, Block par1Blo tessellator.setNormal(0.0F, -1.0F, 0.0F); renderblocks.uvRotateBottom = 3; renderblocks.renderFaceYNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(0, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 1.0F, 0.0F); renderblocks.uvRotateTop = 3; renderblocks.renderFaceYPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(1, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, -1.0F); renderblocks.renderFaceXPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(2, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, 1.0F); renderblocks.renderFaceXNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(3, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(-1.0F, 0.0F, 0.0F); renderblocks.renderFaceZNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(4, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(1.0F, 0.0F, 0.0F); renderblocks.renderFaceZPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(5, meta)); tessellator.draw(); diff --git a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFNagastoneStairs.java b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFNagastoneStairs.java index ef12c2f126..dd81237e1b 100644 --- a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFNagastoneStairs.java +++ b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFNagastoneStairs.java @@ -77,24 +77,14 @@ public void renderInventoryBlock(Block block, int metadata, int modelId, RenderB tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, -1.0F, 0.0F); renderer.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSide(block, 0)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 1.0F, 0.0F); renderer.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSide(block, 1)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, -1.0F); renderer.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSide(block, 2)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, 1.0F); renderer.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSide(block, 3)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(-1.0F, 0.0F, 0.0F); renderer.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSide(block, 4)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(1.0F, 0.0F, 0.0F); renderer.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSide(block, 5)); tessellator.draw(); diff --git a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFPedestal.java b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFPedestal.java index 165249f2a4..91817bfb50 100644 --- a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFPedestal.java +++ b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFPedestal.java @@ -88,24 +88,14 @@ protected static void renderInvBlock(RenderBlocks renderblocks, Block par1Block, tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, -1.0F, 0.0F); renderblocks.renderFaceYNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(0, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 1.0F, 0.0F); renderblocks.renderFaceYPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(1, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, -1.0F); renderblocks.renderFaceXPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(2, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, 1.0F); renderblocks.renderFaceXNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(3, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(-1.0F, 0.0F, 0.0F); renderblocks.renderFaceZNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(4, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(1.0F, 0.0F, 0.0F); renderblocks.renderFaceZPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(5, meta)); tessellator.draw(); diff --git a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFSpiralBricks.java b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFSpiralBricks.java index 914d0bd62d..76821b380f 100644 --- a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFSpiralBricks.java +++ b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFSpiralBricks.java @@ -1095,24 +1095,14 @@ protected static void renderInvBlock(RenderBlocks renderblocks, Block par1Block, tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, -1.0F, 0.0F); renderblocks.renderFaceYNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(0, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 1.0F, 0.0F); renderblocks.renderFaceYPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(1, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, -1.0F); renderblocks.renderFaceXPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(2, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, 1.0F); renderblocks.renderFaceXNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(3, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(-1.0F, 0.0F, 0.0F); renderblocks.renderFaceZNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(4, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(1.0F, 0.0F, 0.0F); renderblocks.renderFaceZPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(5, meta)); tessellator.draw(); diff --git a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFThorns.java b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFThorns.java index ffa8a5cae2..24ea7fc588 100644 --- a/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFThorns.java +++ b/src/main/java/twilightforest/client/renderer/blocks/RenderBlockTFThorns.java @@ -619,24 +619,14 @@ protected static void renderInvBlock(RenderBlocks renderblocks, Block par1Block, tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, -1.0F, 0.0F); renderblocks.renderFaceYNeg(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(0, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 1.0F, 0.0F); renderblocks.renderFaceYPos(par1Block, 0.0D, 0.0D, 0.0D, par1Block.getIcon(1, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, -1.0F); renderblocks.renderFaceXPos(par1Block, -onePixel, 0.0D, 0.0D, par1Block.getIcon(2, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 0.0F, 1.0F); renderblocks.renderFaceXNeg(par1Block, onePixel, 0.0D, 0.0D, par1Block.getIcon(3, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(-1.0F, 0.0F, 0.0F); renderblocks.renderFaceZNeg(par1Block, 0.0D, 0.0D, onePixel, par1Block.getIcon(4, meta)); - tessellator.draw(); - tessellator.startDrawingQuads(); tessellator.setNormal(1.0F, 0.0F, 0.0F); renderblocks.renderFaceZPos(par1Block, 0.0D, 0.0D, -onePixel, par1Block.getIcon(5, meta)); tessellator.draw(); diff --git a/src/main/java/twilightforest/client/renderer/entity/RenderTFCharm.java b/src/main/java/twilightforest/client/renderer/entity/RenderTFCharm.java deleted file mode 100644 index 3c09946893..0000000000 --- a/src/main/java/twilightforest/client/renderer/entity/RenderTFCharm.java +++ /dev/null @@ -1,79 +0,0 @@ -package twilightforest.client.renderer.entity; - -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.entity.Render; -import net.minecraft.client.renderer.texture.TextureMap; -import net.minecraft.entity.Entity; -import net.minecraft.util.IIcon; -import net.minecraft.util.ResourceLocation; - -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import twilightforest.entity.EntityTFCharmEffect; -import twilightforest.item.TFItems; - -@SideOnly(Side.CLIENT) -public class RenderTFCharm extends Render { - - /** - * Have the icon index (in items.png) that will be used to render the image. Currently, eggs and snowballs uses this - * classes. - */ - private IIcon itemIcon; - - public RenderTFCharm(IIcon par1) { - this.itemIcon = par1; - } - - /** - * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then - * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic - * (Render 0) { - // this.itemIcon = Items.itemsList[charm.getItemID()].getIconFromDamage(0); - this.itemIcon = TFItems.charmOfKeeping1.getIconFromDamage(0); - } - } - - GL11.glPushMatrix(); - GL11.glTranslatef((float) par2, (float) par4, (float) par6); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glScalef(0.5F, 0.5F, 0.5F); - this.bindEntityTexture(par1Entity); - Tessellator var10 = Tessellator.instance; - - this.func_77026_a(var10, this.itemIcon); - GL11.glDisable(GL12.GL_RESCALE_NORMAL); - GL11.glPopMatrix(); - } - - private void func_77026_a(Tessellator par1Tessellator, IIcon par2Icon) { - float f = par2Icon.getMinU(); - float f1 = par2Icon.getMaxU(); - float f2 = par2Icon.getMinV(); - float f3 = par2Icon.getMaxV(); - float f4 = 1.0F; - float f5 = 0.5F; - float f6 = 0.25F; - GL11.glRotatef(180.0F - this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F); - GL11.glRotatef(-this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F); - par1Tessellator.startDrawingQuads(); - par1Tessellator.setNormal(0.0F, 1.0F, 0.0F); - par1Tessellator.addVertexWithUV(0.0F - f5, 0.0F - f6, 0.0D, f, f3); - par1Tessellator.addVertexWithUV(f4 - f5, 0.0F - f6, 0.0D, f1, f3); - par1Tessellator.addVertexWithUV(f4 - f5, f4 - f6, 0.0D, f1, f2); - par1Tessellator.addVertexWithUV(0.0F - f5, f4 - f6, 0.0D, f, f2); - par1Tessellator.draw(); - } - - protected ResourceLocation getEntityTexture(Entity par1Entity) { - return TextureMap.locationItemsTexture; - } -} diff --git a/src/main/java/twilightforest/entity/EntityTFAdherent.java b/src/main/java/twilightforest/entity/EntityTFAdherent.java index 60faaa6875..a25f667b5d 100644 --- a/src/main/java/twilightforest/entity/EntityTFAdherent.java +++ b/src/main/java/twilightforest/entity/EntityTFAdherent.java @@ -20,6 +20,7 @@ import net.minecraft.world.World; import twilightforest.TFAchievementPage; +import twilightforest.TwilightForestMod; import twilightforest.item.TFItems; public class EntityTFAdherent extends EntityMob implements IRangedAttackMob, ITFCharger { @@ -84,7 +85,8 @@ protected void dropFewItems(boolean hitByPlayer, int looting) { @Override public void onDeath(DamageSource damageSource) { super.onDeath(damageSource); - if (damageSource.getEntity() instanceof EntityPlayer) { + if (damageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) damageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) damageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); } } diff --git a/src/main/java/twilightforest/entity/EntityTFBlockGoblin.java b/src/main/java/twilightforest/entity/EntityTFBlockGoblin.java index 0923fe61ca..d2250a27f8 100644 --- a/src/main/java/twilightforest/entity/EntityTFBlockGoblin.java +++ b/src/main/java/twilightforest/entity/EntityTFBlockGoblin.java @@ -119,7 +119,8 @@ protected Item getDropItemId() { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); } } diff --git a/src/main/java/twilightforest/entity/EntityTFBoggard.java b/src/main/java/twilightforest/entity/EntityTFBoggard.java index 0260789279..850468a547 100644 --- a/src/main/java/twilightforest/entity/EntityTFBoggard.java +++ b/src/main/java/twilightforest/entity/EntityTFBoggard.java @@ -163,7 +163,8 @@ public boolean isTargetLookingAtMe() { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); // are we in a level 1 hill? int chunkX = MathHelper.floor_double(posX) >> 4; diff --git a/src/main/java/twilightforest/entity/EntityTFCharmEffect.java b/src/main/java/twilightforest/entity/EntityTFCharmEffect.java index 87400cbce9..a3ec2abe75 100644 --- a/src/main/java/twilightforest/entity/EntityTFCharmEffect.java +++ b/src/main/java/twilightforest/entity/EntityTFCharmEffect.java @@ -1,20 +1,23 @@ package twilightforest.entity; -import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +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.DamageSource; import net.minecraft.util.MathHelper; import net.minecraft.util.Vec3; import net.minecraft.world.World; import twilightforest.item.TFItems; -public class EntityTFCharmEffect extends Entity { +public class EntityTFCharmEffect extends EntityItem { private static final int DATA_OWNER = 17; private static final int DATA_ITEMID = 16; - private static final double DISTANCE = 1.75; + private static final double DISTANCE = 1; private EntityLivingBase orbiting; private double newPosX; private double newPosY; @@ -22,8 +25,7 @@ public class EntityTFCharmEffect extends Entity { private double newRotationYaw; private double newRotationPitch; private int newPosRotationIncrements; - - public float offset; + private float offset = 0; // client constructor public EntityTFCharmEffect(World par1World) { @@ -31,29 +33,32 @@ public EntityTFCharmEffect(World par1World) { this.setSize(0.25F, 0.25F); this.setItemID(TFItems.charmOfLife1); + // this.setEntityItemStack(new ItemStack(TFItems.charmOfLife1)); } // server constructor - public EntityTFCharmEffect(World par1World, EntityLivingBase par2EntityLiving, Item item) { + public EntityTFCharmEffect(World par1World, EntityLivingBase par2EntityLiving, Item item, float offset) { super(par1World); this.setSize(0.25F, 0.25F); this.orbiting = par2EntityLiving; - // this.setOwner(orbiting.getEntityName()); + if (this.orbiting instanceof EntityPlayer) this.setOwner(((EntityPlayer) orbiting).getDisplayName()); this.setItemID(item); + this.setEntityItemStack(new ItemStack(item)); Vec3 look = Vec3.createVectorHelper(DISTANCE, 0, 0); + this.offset = offset; + look.rotateAroundY(offset); this.setLocationAndAngles( par2EntityLiving.posX, - par2EntityLiving.posY + par2EntityLiving.getEyeHeight(), + par2EntityLiving.posY + par2EntityLiving.getEyeHeight() - 0.5d, par2EntityLiving.posZ, par2EntityLiving.rotationYaw, par2EntityLiving.rotationPitch); - this.posX += look.xCoord * DISTANCE; - // this.posY += look.yCoord * DISTANCE; - this.posZ += look.zCoord * DISTANCE; - this.setPosition(this.posX, this.posY, this.posZ); + this.posX += look.xCoord; + this.posY += look.yCoord; + this.posZ += look.zCoord; this.yOffset = 0.0F; } @@ -65,7 +70,7 @@ public void onUpdate() { this.lastTickPosX = this.posX; this.lastTickPosY = this.posY; this.lastTickPosZ = this.posZ; - super.onUpdate(); + this.onEntityUpdate(); if (this.newPosRotationIncrements > 0) { double var1 = this.posX + (this.newPosX - this.posX) / (double) this.newPosRotationIncrements; @@ -89,7 +94,7 @@ public void onUpdate() { if (this.orbiting != null && !worldObj.isRemote) { this.setLocationAndAngles( orbiting.posX, - orbiting.posY + orbiting.getEyeHeight(), + orbiting.posY + orbiting.getEyeHeight() - 0.5d, orbiting.posZ, orbiting.rotationYaw, orbiting.rotationPitch); @@ -97,18 +102,15 @@ public void onUpdate() { Vec3 look = Vec3.createVectorHelper(DISTANCE, 0, 0); look.rotateAroundY(rotation); this.posX += look.xCoord; - // this.posY += Math.sin(this.ticksExisted / 3.0F + offset); + this.posY += Math.sin(this.ticksExisted / 3.0F + offset) / 8; this.posZ += look.zCoord; - - this.setPosition(this.posX, this.posY, this.posZ); - } if (this.getItemID() > 0) { for (int i = 0; i < 3; i++) { - double dx = posX + 0.5 * (rand.nextDouble() - rand.nextDouble()); - double dy = posY + 0.5 * (rand.nextDouble() - rand.nextDouble()); - double dz = posZ + 0.5 * (rand.nextDouble() - rand.nextDouble()); + double dx = posX + 0.25 * (rand.nextDouble() - rand.nextDouble()); + double dy = posY + 0.25 * (rand.nextDouble() - rand.nextDouble()); + double dz = posZ + 0.25 * (rand.nextDouble() - rand.nextDouble()); worldObj.spawnParticle("iconcrack_" + this.getItemID(), dx, dy, dz, 0, 0.2, 0); } @@ -136,6 +138,7 @@ public void setPositionAndRotation2(double par1, double par3, double par5, float protected void entityInit() { this.dataWatcher.addObject(DATA_ITEMID, 0); this.dataWatcher.addObject(DATA_OWNER, ""); + super.entityInit(); } public String getOwnerName() { @@ -155,19 +158,65 @@ public int getItemID() { } public void setItemID(Item charmOfLife1) { - // this.dataWatcher.updateObject(DATA_ITEMID, Integer.valueOf(charmOfLife1)); + this.dataWatcher.updateObject(DATA_ITEMID, Item.getIdFromItem(charmOfLife1)); + } + + public void setItemID(int id) { + this.dataWatcher.updateObject(DATA_ITEMID, id); } @Override - protected void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) { + public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) { + super.readEntityFromNBT(par1NBTTagCompound); par1NBTTagCompound.setString("Owner", this.getOwnerName()); par1NBTTagCompound.setShort("ItemID", (short) this.getItemID()); } @Override - protected void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) { + public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) { this.setOwner(par1NBTTagCompound.getString("Owner")); - // this.setItemID(par1NBTTagCompound.getShort("ItemID")); + this.setItemID(par1NBTTagCompound.getShort("ItemID")); + super.writeEntityToNBT(par1NBTTagCompound); + } + + /** + * Called by a player entity when they collide with an entity + */ + public void onCollideWithPlayer(EntityPlayer entityIn) { + // Can't pick it up + } + + /** + * Tries to merge this item with the item passed as the parameter. Returns true if successful. Either this item or + * the other item will be removed from the world. + */ + public boolean combineItems(EntityItem p_70289_1_) { + // No, we don't + return false; + } + + /** + * Returns if this entity is in water and will end up adding the waters velocity to the entity + */ + public boolean handleWaterMovement() { + // Magic is not affected by water + return false; + } + + /** + * Will deal the specified amount of damage to the entity if the entity isn't immune to fire damage. Args: + * amountDamage + */ + protected void dealFireDamage(int amount) { + // No, we don't + } + + /** + * Called when the entity is attacked. + */ + public boolean attackEntityFrom(DamageSource source, float amount) { + // Can't be attacked, magic + return false; } } diff --git a/src/main/java/twilightforest/entity/EntityTFDeathTome.java b/src/main/java/twilightforest/entity/EntityTFDeathTome.java index 665cd2b1a9..9940708246 100644 --- a/src/main/java/twilightforest/entity/EntityTFDeathTome.java +++ b/src/main/java/twilightforest/entity/EntityTFDeathTome.java @@ -16,6 +16,7 @@ import net.minecraft.world.World; import twilightforest.TFAchievementPage; +import twilightforest.TwilightForestMod; import twilightforest.entity.ai.EntityAITFMagicAttack; import twilightforest.item.TFItems; @@ -133,7 +134,8 @@ protected void dropRareDrop(int par1) { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); } } diff --git a/src/main/java/twilightforest/entity/EntityTFFireBeetle.java b/src/main/java/twilightforest/entity/EntityTFFireBeetle.java index 4de6f156c5..36be21f3a8 100644 --- a/src/main/java/twilightforest/entity/EntityTFFireBeetle.java +++ b/src/main/java/twilightforest/entity/EntityTFFireBeetle.java @@ -20,6 +20,7 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import twilightforest.TFAchievementPage; +import twilightforest.TwilightForestMod; import twilightforest.entity.ai.EntityAITFBreathAttack; public class EntityTFFireBeetle extends EntityMob implements IBreathAttacker { @@ -204,7 +205,8 @@ public int getBrightnessForRender(float par1) { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); } } diff --git a/src/main/java/twilightforest/entity/EntityTFHarbingerCube.java b/src/main/java/twilightforest/entity/EntityTFHarbingerCube.java index 4007eeb854..8bf8445403 100644 --- a/src/main/java/twilightforest/entity/EntityTFHarbingerCube.java +++ b/src/main/java/twilightforest/entity/EntityTFHarbingerCube.java @@ -14,6 +14,7 @@ import net.minecraft.world.World; import twilightforest.TFAchievementPage; +import twilightforest.TwilightForestMod; import twilightforest.item.TFItems; public class EntityTFHarbingerCube extends EntityMob { @@ -44,7 +45,8 @@ protected void applyEntityAttributes() { @Override public void onDeath(DamageSource damageSource) { super.onDeath(damageSource); - if (damageSource.getEntity() instanceof EntityPlayer) { + if (damageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) damageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) damageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); } } diff --git a/src/main/java/twilightforest/entity/EntityTFHedgeSpider.java b/src/main/java/twilightforest/entity/EntityTFHedgeSpider.java index 910a006970..a766fabb6e 100644 --- a/src/main/java/twilightforest/entity/EntityTFHedgeSpider.java +++ b/src/main/java/twilightforest/entity/EntityTFHedgeSpider.java @@ -9,6 +9,7 @@ import twilightforest.TFAchievementPage; import twilightforest.TFFeature; +import twilightforest.TwilightForestMod; /** * The hedge spider is just like a normal spider, but it can spawn in the daytime. @@ -60,7 +61,8 @@ protected boolean isValidLightLevel() { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); // are in a hedge maze? int chunkX = MathHelper.floor_double(posX) >> 4; diff --git a/src/main/java/twilightforest/entity/EntityTFHelmetCrab.java b/src/main/java/twilightforest/entity/EntityTFHelmetCrab.java index 5bb94eaccc..c68a0031ca 100644 --- a/src/main/java/twilightforest/entity/EntityTFHelmetCrab.java +++ b/src/main/java/twilightforest/entity/EntityTFHelmetCrab.java @@ -19,6 +19,7 @@ import net.minecraft.world.World; import twilightforest.TFAchievementPage; +import twilightforest.TwilightForestMod; import twilightforest.item.TFItems; public class EntityTFHelmetCrab extends EntityMob { @@ -117,7 +118,8 @@ protected void dropFewItems(boolean flag, int i) { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); } } diff --git a/src/main/java/twilightforest/entity/EntityTFHostileWolf.java b/src/main/java/twilightforest/entity/EntityTFHostileWolf.java index 2c9abdf1ce..9f3172543d 100644 --- a/src/main/java/twilightforest/entity/EntityTFHostileWolf.java +++ b/src/main/java/twilightforest/entity/EntityTFHostileWolf.java @@ -14,6 +14,7 @@ import twilightforest.TFAchievementPage; import twilightforest.TFFeature; +import twilightforest.TwilightForestMod; public class EntityTFHostileWolf extends EntityWolf implements IMob { @@ -52,7 +53,8 @@ public void onUpdate() { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); } } diff --git a/src/main/java/twilightforest/entity/EntityTFIceExploder.java b/src/main/java/twilightforest/entity/EntityTFIceExploder.java index 17c0de1aea..b7246a053c 100644 --- a/src/main/java/twilightforest/entity/EntityTFIceExploder.java +++ b/src/main/java/twilightforest/entity/EntityTFIceExploder.java @@ -113,7 +113,8 @@ public float getEyeHeight() { @Override public void onDeath(DamageSource damageSource) { super.onDeath(damageSource); - if (damageSource.getEntity() instanceof EntityPlayer) { + if (damageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) damageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) damageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); } } diff --git a/src/main/java/twilightforest/entity/EntityTFIceShooter.java b/src/main/java/twilightforest/entity/EntityTFIceShooter.java index 3a25d559a2..c031da5c10 100644 --- a/src/main/java/twilightforest/entity/EntityTFIceShooter.java +++ b/src/main/java/twilightforest/entity/EntityTFIceShooter.java @@ -109,7 +109,8 @@ protected String getDeathSound() { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); } } diff --git a/src/main/java/twilightforest/entity/EntityTFKobold.java b/src/main/java/twilightforest/entity/EntityTFKobold.java index bd620ca970..868b218695 100644 --- a/src/main/java/twilightforest/entity/EntityTFKobold.java +++ b/src/main/java/twilightforest/entity/EntityTFKobold.java @@ -151,7 +151,8 @@ public void onLivingUpdate() { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); } } diff --git a/src/main/java/twilightforest/entity/EntityTFMinotaur.java b/src/main/java/twilightforest/entity/EntityTFMinotaur.java index 8fda0b2b2f..b6477b2306 100644 --- a/src/main/java/twilightforest/entity/EntityTFMinotaur.java +++ b/src/main/java/twilightforest/entity/EntityTFMinotaur.java @@ -19,6 +19,7 @@ import net.minecraft.world.World; import twilightforest.TFAchievementPage; +import twilightforest.TwilightForestMod; import twilightforest.entity.ai.EntityAITFChargeAttack; import twilightforest.item.TFItems; @@ -189,7 +190,8 @@ protected void dropRareDrop(int par1) { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); } } diff --git a/src/main/java/twilightforest/entity/EntityTFMosquitoSwarm.java b/src/main/java/twilightforest/entity/EntityTFMosquitoSwarm.java index 8e67a1f2e0..6301a3141c 100644 --- a/src/main/java/twilightforest/entity/EntityTFMosquitoSwarm.java +++ b/src/main/java/twilightforest/entity/EntityTFMosquitoSwarm.java @@ -2,6 +2,7 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.EnumCreatureAttribute; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.EntityAIAttackOnCollide; import net.minecraft.entity.ai.EntityAIHurtByTarget; @@ -120,9 +121,18 @@ public int getMaxSpawnedInChunk() { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); } } + /** + * Get this Entity's EnumCreatureAttribute + */ + @Override + public EnumCreatureAttribute getCreatureAttribute() { + return EnumCreatureAttribute.ARTHROPOD; + } + } diff --git a/src/main/java/twilightforest/entity/EntityTFPinchBeetle.java b/src/main/java/twilightforest/entity/EntityTFPinchBeetle.java index b73e4e9c83..864881791e 100644 --- a/src/main/java/twilightforest/entity/EntityTFPinchBeetle.java +++ b/src/main/java/twilightforest/entity/EntityTFPinchBeetle.java @@ -19,6 +19,7 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import twilightforest.TFAchievementPage; +import twilightforest.TwilightForestMod; import twilightforest.entity.ai.EntityAITFChargeAttack; import twilightforest.entity.ai.EntityAITFKidnapRider; @@ -146,7 +147,8 @@ public void onLivingUpdate() { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); } } diff --git a/src/main/java/twilightforest/entity/EntityTFRedcap.java b/src/main/java/twilightforest/entity/EntityTFRedcap.java index 7268582815..285811426a 100644 --- a/src/main/java/twilightforest/entity/EntityTFRedcap.java +++ b/src/main/java/twilightforest/entity/EntityTFRedcap.java @@ -159,7 +159,8 @@ public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer) { + if (par1DamageSource.getSourceOfDamage() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getSourceOfDamage()).triggerAchievement(TFAchievementPage.twilightHunter); // are we in a level 1 hill? int chunkX = MathHelper.floor_double(posX) >> 4; diff --git a/src/main/java/twilightforest/entity/EntityTFRedcapSapper.java b/src/main/java/twilightforest/entity/EntityTFRedcapSapper.java index 6085790797..ab47fd0403 100644 --- a/src/main/java/twilightforest/entity/EntityTFRedcapSapper.java +++ b/src/main/java/twilightforest/entity/EntityTFRedcapSapper.java @@ -9,6 +9,7 @@ import twilightforest.TFAchievementPage; import twilightforest.TFFeature; +import twilightforest.TwilightForestMod; import twilightforest.entity.ai.EntityAITFRedcapPlantTNT; import twilightforest.item.TFItems; @@ -61,7 +62,8 @@ public ItemStack getPick() { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); // are we in a level 2 hill? int chunkX = MathHelper.floor_double(posX) >> 4; diff --git a/src/main/java/twilightforest/entity/EntityTFSkeletonDruid.java b/src/main/java/twilightforest/entity/EntityTFSkeletonDruid.java index a0c11b5a5d..f5f440ecc8 100644 --- a/src/main/java/twilightforest/entity/EntityTFSkeletonDruid.java +++ b/src/main/java/twilightforest/entity/EntityTFSkeletonDruid.java @@ -1,12 +1,16 @@ package twilightforest.entity; +import java.util.Calendar; + import net.minecraft.block.Block; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.EnumCreatureAttribute; +import net.minecraft.entity.IEntityLivingData; import net.minecraft.entity.IRangedAttackMob; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.EntityAIArrowAttack; +import net.minecraft.entity.ai.EntityAIAttackOnCollide; import net.minecraft.entity.ai.EntityAIFleeSun; import net.minecraft.entity.ai.EntityAIHurtByTarget; import net.minecraft.entity.ai.EntityAILookIdle; @@ -17,8 +21,10 @@ import net.minecraft.entity.ai.EntityAIWatchClosest; import net.minecraft.entity.monster.EntityMob; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; +import net.minecraft.item.ItemHoe; import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; @@ -26,10 +32,18 @@ import net.minecraft.world.World; import twilightforest.TFAchievementPage; +import twilightforest.TwilightForestMod; import twilightforest.item.TFItems; public class EntityTFSkeletonDruid extends EntityMob implements IRangedAttackMob { + private EntityAIArrowAttack aiArrowAttack = new EntityAIArrowAttack(this, 1.0D, 60, 10.0F); + private EntityAIAttackOnCollide aiAttackOnCollide = new EntityAIAttackOnCollide( + this, + EntityPlayer.class, + 1.2D, + false); + public EntityTFSkeletonDruid(World world) { super(world); // texture = TwilightForestMod.MODEL_DIR + "skeletondruid.png"; @@ -38,14 +52,18 @@ public EntityTFSkeletonDruid(World world) { this.tasks.addTask(1, new EntityAISwimming(this)); this.tasks.addTask(2, new EntityAIRestrictSun(this)); this.tasks.addTask(3, new EntityAIFleeSun(this, 1.0D)); - this.tasks.addTask(4, new EntityAIArrowAttack(this, 1.0D, 60, 10.0F)); - this.tasks.addTask(5, new EntityAIWander(this, 1.0D)); - this.tasks.addTask(6, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); + // this.tasks.addTask(4, new EntityAIArrowAttack(this, 1.0D, 60, 10.0F)); + this.tasks.addTask(4, new EntityAIWander(this, 1.0D)); + this.tasks.addTask(5, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); this.tasks.addTask(6, new EntityAILookIdle(this)); this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); - this.setCurrentItemOrArmor(0, new ItemStack(Items.golden_hoe)); + if (world != null && !world.isRemote) { + this.setCombatTask(); + } + + // this.setCurrentItemOrArmor(0, new ItemStack(Items.golden_hoe)); } @@ -134,11 +152,61 @@ public EnumCreatureAttribute getCreatureAttribute() { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); } } + /** + * Makes entity wear random armor based on difficulty + */ + protected void addRandomArmor() { + super.addRandomArmor(); + this.setCurrentItemOrArmor(0, new ItemStack(Items.golden_hoe)); + } + + public IEntityLivingData onSpawnWithEgg(IEntityLivingData p_110161_1_) { + p_110161_1_ = super.onSpawnWithEgg(p_110161_1_); + + // this.tasks.addTask(4, this.aiArrowAttack); + this.addRandomArmor(); + // this.enchantEquipment(); + + this.setCanPickUpLoot( + this.rand.nextFloat() < 0.55F * this.worldObj.func_147462_b(this.posX, this.posY, this.posZ)); + + this.setCombatTask(); + + if (this.getEquipmentInSlot(4) == null) { + Calendar calendar = this.worldObj.getCurrentDate(); + + if (calendar.get(2) + 1 == 10 && calendar.get(5) == 31 && this.rand.nextFloat() < 0.25F) { + this.setCurrentItemOrArmor( + 4, + new ItemStack(this.rand.nextFloat() < 0.1F ? Blocks.lit_pumpkin : Blocks.pumpkin)); + this.equipmentDropChances[4] = 0.0F; + } + } + + return p_110161_1_; + } + + /** + * sets this entity's combat AI. + */ + public void setCombatTask() { + this.tasks.removeTask(this.aiAttackOnCollide); + this.tasks.removeTask(this.aiArrowAttack); + ItemStack itemstack = this.getHeldItem(); + + if (itemstack != null && itemstack.getItem() instanceof ItemHoe) { + this.tasks.addTask(4, this.aiArrowAttack); + } else { + this.tasks.addTask(4, this.aiAttackOnCollide); + } + } + /** * Attack the specified entity using a ranged attack. */ diff --git a/src/main/java/twilightforest/entity/EntityTFSlimeBeetle.java b/src/main/java/twilightforest/entity/EntityTFSlimeBeetle.java index bf70abd769..244e6fe422 100644 --- a/src/main/java/twilightforest/entity/EntityTFSlimeBeetle.java +++ b/src/main/java/twilightforest/entity/EntityTFSlimeBeetle.java @@ -21,6 +21,7 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import twilightforest.TFAchievementPage; +import twilightforest.TwilightForestMod; import twilightforest.entity.ai.EntityAITFMagicAttack; public class EntityTFSlimeBeetle extends EntityMob { @@ -121,7 +122,8 @@ public void onLivingUpdate() { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); } } diff --git a/src/main/java/twilightforest/entity/EntityTFSwarmSpider.java b/src/main/java/twilightforest/entity/EntityTFSwarmSpider.java index 8649744131..5a0d901939 100644 --- a/src/main/java/twilightforest/entity/EntityTFSwarmSpider.java +++ b/src/main/java/twilightforest/entity/EntityTFSwarmSpider.java @@ -11,6 +11,7 @@ import twilightforest.TFAchievementPage; import twilightforest.TFFeature; +import twilightforest.TwilightForestMod; public class EntityTFSwarmSpider extends EntitySpider { @@ -167,7 +168,8 @@ public void readEntityFromNBT(NBTTagCompound nbttagcompound) { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); // are we in a hedge maze? int chunkX = MathHelper.floor_double(posX) >> 4; diff --git a/src/main/java/twilightforest/entity/EntityTFTroll.java b/src/main/java/twilightforest/entity/EntityTFTroll.java index 8425ddd049..00f11aee62 100644 --- a/src/main/java/twilightforest/entity/EntityTFTroll.java +++ b/src/main/java/twilightforest/entity/EntityTFTroll.java @@ -27,6 +27,7 @@ import net.minecraft.world.WorldServer; import twilightforest.TFAchievementPage; +import twilightforest.TwilightForestMod; import twilightforest.block.TFBlocks; import twilightforest.entity.ai.EntityAITFCollideAttackFixed; import twilightforest.entity.boss.EntityTFIceBomb; @@ -186,7 +187,8 @@ private void ripenBer(int offset, int cx, int cy, int cz) { @Override public void onDeath(DamageSource damageSource) { super.onDeath(damageSource); - if (damageSource.getEntity() instanceof EntityPlayer) { + if (damageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) damageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) damageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); } diff --git a/src/main/java/twilightforest/entity/EntityTFWraith.java b/src/main/java/twilightforest/entity/EntityTFWraith.java index 13eaa8683f..42aa4041b3 100644 --- a/src/main/java/twilightforest/entity/EntityTFWraith.java +++ b/src/main/java/twilightforest/entity/EntityTFWraith.java @@ -239,7 +239,8 @@ protected Item getDropItem() { @Override public void onDeath(DamageSource damageSource) { super.onDeath(damageSource); - if (damageSource.getEntity() instanceof EntityPlayer) { + if (damageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) damageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) damageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); // are we in a level 3 hill? int chunkX = MathHelper.floor_double(posX) >> 4; diff --git a/src/main/java/twilightforest/entity/EntityTFYeti.java b/src/main/java/twilightforest/entity/EntityTFYeti.java index 298b161569..a631c7dc8a 100644 --- a/src/main/java/twilightforest/entity/EntityTFYeti.java +++ b/src/main/java/twilightforest/entity/EntityTFYeti.java @@ -18,6 +18,7 @@ import net.minecraft.world.World; import twilightforest.TFAchievementPage; +import twilightforest.TwilightForestMod; import twilightforest.biomes.TFBiomeBase; import twilightforest.entity.ai.EntityAITFThrowRider; import twilightforest.item.TFItems; @@ -123,6 +124,7 @@ public boolean interact(EntityPlayer par1EntityPlayer) { @Override public boolean attackEntityAsMob(Entity par1Entity) { if (this.riddenByEntity == null && par1Entity.ridingEntity == null) { + this.playSound(TwilightForestMod.ID + ":mob.yeti.grab", 4F, 0.75F + rand.nextFloat() * 0.25F); par1Entity.mountEntity(this); } @@ -232,13 +234,14 @@ public boolean canRiderInteract() { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); } } /** - * We're allowed to spawn in bright light only in sniw + * We're allowed to spawn in bright light only in snow */ @Override public boolean getCanSpawnHere() { @@ -273,4 +276,28 @@ protected Item getDropItem() { return TFItems.arcticFur; } + /** + * Returns the sound this mob makes while it's alive. + */ + @Override + protected String getLivingSound() { + return TwilightForestMod.ID + ":mob.yeti.growl"; + } + + /** + * Returns the sound this mob makes when it is hurt. + */ + @Override + protected String getHurtSound() { + return TwilightForestMod.ID + ":mob.yeti.hurt"; + } + + /** + * Returns the sound this mob makes on death. + */ + @Override + protected String getDeathSound() { + return TwilightForestMod.ID + ":mob.yeti.death"; + } + } diff --git a/src/main/java/twilightforest/entity/ai/EntityAITFThrowRider.java b/src/main/java/twilightforest/entity/ai/EntityAITFThrowRider.java index 8787370e9c..b148c50b2d 100644 --- a/src/main/java/twilightforest/entity/ai/EntityAITFThrowRider.java +++ b/src/main/java/twilightforest/entity/ai/EntityAITFThrowRider.java @@ -60,6 +60,11 @@ public void startExecuting() { } + theEntityCreature.playSound( + TwilightForestMod.ID + ":mob.yeti.throw", + 4F, + 0.75F + this.theEntityCreature.rand.nextFloat() * 0.25F); + FMLLog.finer("[TwilightForest] throw!"); this.throwTimer = 0; } diff --git a/src/main/java/twilightforest/entity/boss/EntityTFHydra.java b/src/main/java/twilightforest/entity/boss/EntityTFHydra.java index cd86623c9a..c0a88be70c 100644 --- a/src/main/java/twilightforest/entity/boss/EntityTFHydra.java +++ b/src/main/java/twilightforest/entity/boss/EntityTFHydra.java @@ -17,7 +17,9 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ChunkCoordinates; import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; import net.minecraft.world.EnumDifficulty; @@ -26,6 +28,7 @@ import twilightforest.TFAchievementPage; import twilightforest.TFFeature; import twilightforest.TwilightForestMod; +import twilightforest.block.TFBlocks; import twilightforest.item.TFItems; import twilightforest.world.ChunkProviderTwilightForest; import twilightforest.world.TFWorldChunkManager; @@ -33,6 +36,10 @@ public class EntityTFHydra extends EntityLiving implements IBossDisplayData, IEntityMultiPart, IMob { + private ChunkCoordinates homePosition = new ChunkCoordinates(0, 0, 0); + /** If -1 there is no maximum distance */ + private float maximumHomeDistance = -1.0F; + private static int TICKS_BEFORE_HEALING = 1000; private static int HEAD_RESPAWN_TICKS = 100; private static int HEAD_MAX_DAMAGE = 120; @@ -285,7 +292,7 @@ public void onLivingUpdate() { } } } - + despawnIfInvalid(); } @Override @@ -307,12 +314,51 @@ public void setSpawnHeads(boolean flag) { } } + protected void despawnIfInvalid() { + // check to see if we're valid + if (!worldObj.isRemote && worldObj.difficultySetting == EnumDifficulty.PEACEFUL) { + despawnMe(); + } + } + + /** + * Despawn the hydra, and restore the boss spawner at our home location, if set + */ + protected void despawnMe() { + if (this.hasHome()) { + ChunkCoordinates home = this.getHomePosition(); + worldObj.setBlock(home.posX, home.posY, home.posZ, TFBlocks.bossSpawner, 2, 2); + } + this.deathTime = 200; // For heads and stuff to despawn + setDead(); + } + + private ChunkCoordinates getHomePosition() { + return homePosition; + } + + private boolean hasHome() { + return maximumHomeDistance > -1; + } + + public void setHomeArea(int hx, int hy, int hz, int i) { + homePosition = new ChunkCoordinates(hx, hy, hz); + maximumHomeDistance = i; + } + + public void detachHome() { + this.maximumHomeDistance = -1.0F; + } + /** * Save to disk. */ @Override public void writeEntityToNBT(NBTTagCompound nbttagcompound) { super.writeEntityToNBT(nbttagcompound); + ChunkCoordinates home = this.getHomePosition(); + nbttagcompound.setTag("Home", newDoubleNBTList(home.posX, home.posY, home.posZ)); + nbttagcompound.setBoolean("HasHome", this.hasHome()); nbttagcompound.setBoolean("SpawnHeads", shouldSpawnHeads()); nbttagcompound.setByte("NumHeads", (byte) countActiveHeads()); } @@ -323,6 +369,16 @@ public void writeEntityToNBT(NBTTagCompound nbttagcompound) { @Override public void readEntityFromNBT(NBTTagCompound nbttagcompound) { super.readEntityFromNBT(nbttagcompound); + if (nbttagcompound.hasKey("Home", 9)) { + NBTTagList nbttaglist = nbttagcompound.getTagList("Home", 6); + int hx = (int) nbttaglist.func_150309_d(0); + int hy = (int) nbttaglist.func_150309_d(1); + int hz = (int) nbttaglist.func_150309_d(2); + this.setHomeArea(hx, hy, hz, 20); + } + if (!nbttagcompound.getBoolean("HasHome")) { + this.detachHome(); + } setSpawnHeads(nbttagcompound.getBoolean("SpawnHeads")); activateNumberOfHeads(nbttagcompound.getByte("NumHeads")); } @@ -919,6 +975,13 @@ protected String getLivingSound() { return TwilightForestMod.ID + ":mob.hydra.growl"; } + /** + * Basically a public getter for living sounds + */ + public String getTrophySound() { + return this.getLivingSound(); + } + /** * Returns the sound this mob makes when it is hurt. */ @@ -949,7 +1012,8 @@ protected float getSoundVolume() { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightKillHydra); } diff --git a/src/main/java/twilightforest/entity/boss/EntityTFIceBomb.java b/src/main/java/twilightforest/entity/boss/EntityTFIceBomb.java index 25c3337cee..f4cbd717b2 100644 --- a/src/main/java/twilightforest/entity/boss/EntityTFIceBomb.java +++ b/src/main/java/twilightforest/entity/boss/EntityTFIceBomb.java @@ -12,6 +12,7 @@ import net.minecraft.potion.PotionEffect; import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; import net.minecraft.world.World; import twilightforest.TwilightForestMod; @@ -64,7 +65,8 @@ private void doTerrainEffects() { for (int x = -range; x <= range; x++) { for (int y = -range; y <= range; y++) { for (int z = -range; z <= range; z++) { - this.doTerrainEffect(ix + x, iy + y, iz + z); + if (Vec3.createVectorHelper(x, y, z).lengthVector() <= range + 0.5d) + this.doTerrainEffect(ix + x, iy + y, iz + z); } } } @@ -82,7 +84,10 @@ private void doTerrainEffect(int x, int y, int z) { } if (this.worldObj.isAirBlock(x, y, z) && Blocks.snow_layer.canPlaceBlockAt(this.worldObj, x, y, z)) { this.worldObj.setBlock(x, y, z, Blocks.snow_layer); - } + } else + if (this.worldObj.getBlock(x, y, z) == Blocks.snow_layer && this.worldObj.getBlockMetadata(x, y, z) < 7) { + this.worldObj.setBlockMetadataWithNotify(x, y, z, this.worldObj.getBlockMetadata(x, y, z) + 1, 2); + } } /** diff --git a/src/main/java/twilightforest/entity/boss/EntityTFKnightPhantom.java b/src/main/java/twilightforest/entity/boss/EntityTFKnightPhantom.java index d71e56d13f..0b308aa6ef 100644 --- a/src/main/java/twilightforest/entity/boss/EntityTFKnightPhantom.java +++ b/src/main/java/twilightforest/entity/boss/EntityTFKnightPhantom.java @@ -26,7 +26,9 @@ import twilightforest.TFFeature; import twilightforest.TFTreasure; import twilightforest.TwilightForestMod; +import twilightforest.block.TFBlocks; import twilightforest.item.TFItems; +import twilightforest.tileentity.TileEntityTFKnightPhantomsSpawner; import twilightforest.world.ChunkProviderTwilightForest; import twilightforest.world.TFWorldChunkManager; import twilightforest.world.WorldProviderTwilightForest; @@ -117,6 +119,7 @@ public boolean attackEntityFrom(DamageSource par1DamageSource, float par2) { * use this to react to sunlight and start to burn. */ public void onLivingUpdate() { + despawnIfInvalid(); super.onLivingUpdate(); if (this.isChargingAtPlayer()) { @@ -144,6 +147,29 @@ public void onLivingUpdate() { } } + protected void despawnIfInvalid() { + // check to see if we're valid + if (!worldObj.isRemote && worldObj.difficultySetting == EnumDifficulty.PEACEFUL) { + despawnMe(); + } + } + + /** + * Despawn the knight phantom, and restore the boss spawner at our home location, if set + */ + protected void despawnMe() { + if (this.hasHome()) { + ChunkCoordinates home = this.getHomePosition(); + if (worldObj.getBlock(home.posX, home.posY, home.posZ) != TFBlocks.bossSpawner) { + worldObj.setBlock(home.posX, home.posY, home.posZ, TFBlocks.bossSpawner, 4, 2); + TileEntityTFKnightPhantomsSpawner spawner = (TileEntityTFKnightPhantomsSpawner) worldObj + .getTileEntity(home.posX, home.posY, home.posZ); + spawner.knightsCount = getNearbyKnights().size(); + } + } + setDead(); + } + // handles entity death timer, experience orb and particle creation @Override protected void onDeathUpdate() { @@ -168,7 +194,8 @@ protected void onDeathUpdate() { @Override public void onDeath(DamageSource damageSource) { super.onDeath(damageSource); - if (damageSource.getEntity() instanceof EntityPlayer) { + if (damageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) damageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) damageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); ((EntityPlayer) damageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightProgressKnights); } @@ -612,6 +639,13 @@ protected String getLivingSound() { return TwilightForestMod.ID + ":mob.wraith.wraith"; } + /** + * Basically a public getter for living sounds + */ + public String getTrophySound() { + return this.getLivingSound(); + } + @Override protected String getHurtSound() { return TwilightForestMod.ID + ":mob.wraith.wraith"; diff --git a/src/main/java/twilightforest/entity/boss/EntityTFLich.java b/src/main/java/twilightforest/entity/boss/EntityTFLich.java index c93e8098cd..24b2a91c2c 100644 --- a/src/main/java/twilightforest/entity/boss/EntityTFLich.java +++ b/src/main/java/twilightforest/entity/boss/EntityTFLich.java @@ -21,14 +21,19 @@ import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ChunkCoordinates; import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; import net.minecraft.util.Vec3; +import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; import twilightforest.TFAchievementPage; import twilightforest.TFFeature; +import twilightforest.TwilightForestMod; +import twilightforest.block.TFBlocks; import twilightforest.entity.EntityTFSwarmSpider; import twilightforest.item.TFItems; import twilightforest.world.ChunkProviderTwilightForest; @@ -162,6 +167,24 @@ private void dropGoldThing() { this.entityDropItem(goldThing, 0); } + protected void despawnIfInvalid() { + // check to see if we're valid + if (!worldObj.isRemote && worldObj.difficultySetting == EnumDifficulty.PEACEFUL) { + despawnMe(); + } + } + + /** + * Despawn the lich, and restore the boss spawner at our home location, if set + */ + protected void despawnMe() { + if (this.hasHome()) { + ChunkCoordinates home = this.getHomePosition(); + worldObj.setBlock(home.posX, home.posY, home.posZ, TFBlocks.bossSpawner, 1, 2); + } + setDead(); + } + /** * Sets the Entity inside a web block. We are immune to webs. */ @@ -214,6 +237,7 @@ public int getPhase() { */ @Override public void onLivingUpdate() { + despawnIfInvalid(); // determine the hand position float angle = ((renderYawOffset * 3.141593F) / 180F); @@ -981,6 +1005,13 @@ protected String getLivingSound() { return "mob.blaze.breathe"; } + /** + * Basically a public getter for living sounds + */ + public String getTrophySound() { + return this.getLivingSound(); + } + /** * Returns the sound this mob makes when it is hurt. */ @@ -1000,6 +1031,9 @@ protected String getDeathSound() { @Override public void writeEntityToNBT(NBTTagCompound nbttagcompound) { super.writeEntityToNBT(nbttagcompound); + ChunkCoordinates home = this.getHomePosition(); + nbttagcompound.setTag("Home", newDoubleNBTList(home.posX, home.posY, home.posZ)); + nbttagcompound.setBoolean("HasHome", this.hasHome()); nbttagcompound.setBoolean("ShadowClone", isShadowClone()); nbttagcompound.setByte("ShieldStrength", getShieldStrength()); nbttagcompound.setByte("MinionsToSummon", getMinionsToSummon()); @@ -1008,6 +1042,16 @@ public void writeEntityToNBT(NBTTagCompound nbttagcompound) { @Override public void readEntityFromNBT(NBTTagCompound nbttagcompound) { super.readEntityFromNBT(nbttagcompound); + if (nbttagcompound.hasKey("Home", 9)) { + NBTTagList nbttaglist = nbttagcompound.getTagList("Home", 6); + int hx = (int) nbttaglist.func_150309_d(0); + int hy = (int) nbttaglist.func_150309_d(1); + int hz = (int) nbttaglist.func_150309_d(2); + this.setHomeArea(hx, hy, hz, 20); + } + if (!nbttagcompound.getBoolean("HasHome")) { + this.detachHome(); + } setShadowClone(nbttagcompound.getBoolean("ShadowClone")); setShieldStrength(nbttagcompound.getByte("ShieldStrength")); setMinionsToSummon(nbttagcompound.getByte("MinionsToSummon")); @@ -1019,7 +1063,8 @@ public void readEntityFromNBT(NBTTagCompound nbttagcompound) { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightKillLich); diff --git a/src/main/java/twilightforest/entity/boss/EntityTFLichMinion.java b/src/main/java/twilightforest/entity/boss/EntityTFLichMinion.java index c37842be21..4ff1923d44 100644 --- a/src/main/java/twilightforest/entity/boss/EntityTFLichMinion.java +++ b/src/main/java/twilightforest/entity/boss/EntityTFLichMinion.java @@ -15,6 +15,7 @@ import net.minecraft.world.World; import twilightforest.TFAchievementPage; +import twilightforest.TwilightForestMod; public class EntityTFLichMinion extends EntityZombie { @@ -108,7 +109,8 @@ private void findNewMaster() { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); } } diff --git a/src/main/java/twilightforest/entity/boss/EntityTFMinoshroom.java b/src/main/java/twilightforest/entity/boss/EntityTFMinoshroom.java index 4d71d5f4d3..a1e8e60b63 100644 --- a/src/main/java/twilightforest/entity/boss/EntityTFMinoshroom.java +++ b/src/main/java/twilightforest/entity/boss/EntityTFMinoshroom.java @@ -3,8 +3,13 @@ import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; +import twilightforest.block.TFBlocks; import twilightforest.entity.EntityTFMinotaur; import twilightforest.item.TFItems; @@ -48,6 +53,9 @@ protected void dropFewItems(boolean par1, int par2) { for (int i = 0; i < numDrops; ++i) { this.dropItem(TFItems.meefStroganoff, 1); } + + // trophy + this.entityDropItem(new ItemStack(TFItems.trophy, 1, 5), 0); } /** @@ -58,6 +66,53 @@ protected boolean canDespawn() { return false; } + @Override + public void onLivingUpdate() { + despawnIfInvalid(); + super.onLivingUpdate(); + } + + protected void despawnIfInvalid() { + // check to see if we're valid + if (!worldObj.isRemote && worldObj.difficultySetting == EnumDifficulty.PEACEFUL) { + despawnMe(); + } + } + + /** + * Despawn the minoshroom, and restore the boss spawner at our home location, if set + */ + protected void despawnMe() { + if (this.hasHome()) { + ChunkCoordinates home = this.getHomePosition(); + worldObj.setBlock(home.posX, home.posY, home.posZ, TFBlocks.bossSpawner, 6, 2); + } + setDead(); + } + + @Override + public void writeEntityToNBT(NBTTagCompound nbttagcompound) { + super.writeEntityToNBT(nbttagcompound); + ChunkCoordinates home = this.getHomePosition(); + nbttagcompound.setTag("Home", newDoubleNBTList(home.posX, home.posY, home.posZ)); + nbttagcompound.setBoolean("HasHome", this.hasHome()); + } + + @Override + public void readEntityFromNBT(NBTTagCompound nbttagcompound) { + super.readEntityFromNBT(nbttagcompound); + if (nbttagcompound.hasKey("Home", 9)) { + NBTTagList nbttaglist = nbttagcompound.getTagList("Home", 6); + int hx = (int) nbttaglist.func_150309_d(0); + int hy = (int) nbttaglist.func_150309_d(1); + int hz = (int) nbttaglist.func_150309_d(2); + this.setHomeArea(hx, hy, hz, 20); + } + if (!nbttagcompound.getBoolean("HasHome")) { + this.detachHome(); + } + } + /** * Drop the equipment for this entity. */ @@ -67,4 +122,11 @@ protected void dropEquipment(boolean par1, int par2) { } + /** + * Basically a public getter for living sounds + */ + public String getTrophySound() { + return this.getLivingSound(); + } + } diff --git a/src/main/java/twilightforest/entity/boss/EntityTFNaga.java b/src/main/java/twilightforest/entity/boss/EntityTFNaga.java index 59f65b4dfc..2cf6e05da1 100644 --- a/src/main/java/twilightforest/entity/boss/EntityTFNaga.java +++ b/src/main/java/twilightforest/entity/boss/EntityTFNaga.java @@ -447,6 +447,13 @@ protected String getLivingSound() { : TwilightForestMod.ID + ":mob.naga.rattle"; } + /** + * Basically a public getter for living sounds + */ + public String getTrophySound() { + return this.getLivingSound(); + } + /** * Returns the sound this mob makes when it is hurt. */ @@ -1073,7 +1080,8 @@ public void readEntityFromNBT(NBTTagCompound nbttagcompound) { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightKillNaga); } diff --git a/src/main/java/twilightforest/entity/boss/EntityTFSnowQueen.java b/src/main/java/twilightforest/entity/boss/EntityTFSnowQueen.java index 87a8f48bd6..b92296ea8c 100644 --- a/src/main/java/twilightforest/entity/boss/EntityTFSnowQueen.java +++ b/src/main/java/twilightforest/entity/boss/EntityTFSnowQueen.java @@ -23,15 +23,20 @@ import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ChunkCoordinates; import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; import net.minecraft.util.Vec3; +import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; import twilightforest.TFAchievementPage; import twilightforest.TFFeature; import twilightforest.TwilightForestMod; +import twilightforest.block.TFBlocks; import twilightforest.entity.IBreathAttacker; import twilightforest.entity.ai.EntityAITFHoverBeam; import twilightforest.entity.ai.EntityAITFHoverSummon; @@ -122,6 +127,13 @@ protected String getLivingSound() { return TwilightForestMod.ID + ":mob.ice.noise"; } + /** + * Basically a public getter for living sounds + */ + public String getTrophySound() { + return this.getLivingSound(); + } + /** * Returns the sound this mob makes when it is hurt. */ @@ -162,6 +174,7 @@ public IEntityLivingData onSpawnWithEgg(IEntityLivingData par1EntityLivingData) * use this to react to sunlight and start to burn. */ public void onLivingUpdate() { + despawnIfInvalid(); super.onLivingUpdate(); // make snow particles for (int i = 0; i < 3; i++) { @@ -243,6 +256,47 @@ public void onLivingUpdate() { } + protected void despawnIfInvalid() { + // check to see if we're valid + if (!worldObj.isRemote && worldObj.difficultySetting == EnumDifficulty.PEACEFUL) { + despawnMe(); + } + } + + /** + * Despawn the snow queen, and restore the boss spawner at our home location, if set + */ + protected void despawnMe() { + if (this.hasHome()) { + ChunkCoordinates home = this.getHomePosition(); + worldObj.setBlock(home.posX, home.posY, home.posZ, TFBlocks.bossSpawner, 5, 2); + } + setDead(); + } + + @Override + public void writeEntityToNBT(NBTTagCompound nbttagcompound) { + super.writeEntityToNBT(nbttagcompound); + ChunkCoordinates home = this.getHomePosition(); + nbttagcompound.setTag("Home", newDoubleNBTList(home.posX, home.posY, home.posZ)); + nbttagcompound.setBoolean("HasHome", this.hasHome()); + } + + @Override + public void readEntityFromNBT(NBTTagCompound nbttagcompound) { + super.readEntityFromNBT(nbttagcompound); + if (nbttagcompound.hasKey("Home", 9)) { + NBTTagList nbttaglist = nbttagcompound.getTagList("Home", 6); + int hx = (int) nbttaglist.func_150309_d(0); + int hy = (int) nbttaglist.func_150309_d(1); + int hz = (int) nbttaglist.func_150309_d(2); + this.setHomeArea(hx, hy, hz, 20); + } + if (!nbttagcompound.getBoolean("HasHome")) { + this.detachHome(); + } + } + // Keep ice shield position updated @Override public void onUpdate() { @@ -326,7 +380,8 @@ private void dropBow() { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightProgressGlacier); diff --git a/src/main/java/twilightforest/entity/boss/EntityTFUrGhast.java b/src/main/java/twilightforest/entity/boss/EntityTFUrGhast.java index cc17e9bc41..5f38620bd1 100644 --- a/src/main/java/twilightforest/entity/boss/EntityTFUrGhast.java +++ b/src/main/java/twilightforest/entity/boss/EntityTFUrGhast.java @@ -8,6 +8,7 @@ import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; import net.minecraft.server.MinecraftServer; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.ChunkCoordinates; @@ -110,12 +111,17 @@ protected boolean canDespawn() { return false; } + @Override + public void onLivingUpdate() { + despawnIfInvalid(); + super.onLivingUpdate(); + } + /** * Keep health updated */ @Override public void onUpdate() { - super.onUpdate(); // extra death explosions @@ -138,6 +144,24 @@ public void onUpdate() { } } + protected void despawnIfInvalid() { + // check to see if we're valid + if (!worldObj.isRemote && worldObj.difficultySetting == EnumDifficulty.PEACEFUL) { + despawnMe(); + } + } + + /** + * Despawn the minoshroom, and restore the boss spawner at our home location, if set + */ + protected void despawnMe() { + if (this.hasHome()) { + ChunkCoordinates home = this.getHomePosition(); + worldObj.setBlock(home.posX, home.posY, home.posZ, TFBlocks.bossSpawner, 3, 2); + } + setDead(); + } + /** * Called when the entity is attacked. */ @@ -759,6 +783,13 @@ protected float getSoundPitch() { return (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 0.5F; } + /** + * Basically a public getter for living sounds + */ + public String getTrophySound() { + return this.getLivingSound(); + } + /** * Needed for boss health bar on the client */ @@ -770,12 +801,25 @@ protected float getSoundPitch() { @Override public void writeEntityToNBT(NBTTagCompound nbttagcompound) { nbttagcompound.setBoolean("inTantrum", this.isInTantrum()); + ChunkCoordinates home = this.getHomePosition(); + nbttagcompound.setTag("Home", newDoubleNBTList(home.posX, home.posY, home.posZ)); + nbttagcompound.setBoolean("HasHome", this.hasHome()); super.writeEntityToNBT(nbttagcompound); } @Override public void readEntityFromNBT(NBTTagCompound nbttagcompound) { super.readEntityFromNBT(nbttagcompound); + if (nbttagcompound.hasKey("Home", 9)) { + NBTTagList nbttaglist = nbttagcompound.getTagList("Home", 6); + int hx = (int) nbttaglist.func_150309_d(0); + int hy = (int) nbttaglist.func_150309_d(1); + int hz = (int) nbttaglist.func_150309_d(2); + this.setHomeArea(hx, hy, hz, 20); + } + if (!nbttagcompound.getBoolean("HasHome")) { + this.detachHome(); + } this.setInTantrum(nbttagcompound.getBoolean("inTantrum")); } @@ -798,7 +842,8 @@ protected void onDeathUpdate() { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightProgressUrghast); diff --git a/src/main/java/twilightforest/entity/boss/EntityTFYetiAlpha.java b/src/main/java/twilightforest/entity/boss/EntityTFYetiAlpha.java index 8d4b2209cf..b43aea9033 100644 --- a/src/main/java/twilightforest/entity/boss/EntityTFYetiAlpha.java +++ b/src/main/java/twilightforest/entity/boss/EntityTFYetiAlpha.java @@ -17,6 +17,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.AxisAlignedBB; @@ -24,11 +25,13 @@ import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; import net.minecraft.util.Vec3; +import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; import twilightforest.TFAchievementPage; import twilightforest.TFFeature; import twilightforest.TwilightForestMod; +import twilightforest.block.TFBlocks; import twilightforest.entity.ai.EntityAIStayNearHome; import twilightforest.entity.ai.EntityAITFThrowRider; import twilightforest.entity.ai.EntityAITFYetiRampage; @@ -60,7 +63,19 @@ public EntityTFYetiAlpha(World par1World) { this.tasks.addTask(7, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); this.tasks.addTask(8, new EntityAILookIdle(this)); this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false)); - this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, false)); + this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, false) { + + /** + * Execute a one shot task or start executing a continuous task + */ + @Override + public void startExecuting() { + this.taskOwner + .playSound(TwilightForestMod.ID + ":mob.yeti.alert", 4F, 0.75F + rand.nextFloat() * 0.25F); + this.taskOwner.setAttackTarget(this.targetEntity); + super.startExecuting(); + } + }); this.experienceValue = 317; @@ -98,6 +113,7 @@ protected void applyEntityAttributes() { */ @Override public void onLivingUpdate() { + despawnIfInvalid(); if (this.riddenByEntity != null) { // stop player sneaking so that they can't dismount! @@ -106,8 +122,6 @@ public void onLivingUpdate() { this.riddenByEntity.setSneaking(false); } - } else { - } super.onLivingUpdate(); @@ -157,6 +171,24 @@ public void onLivingUpdate() { } + protected void despawnIfInvalid() { + // check to see if we're valid + if (!worldObj.isRemote && worldObj.difficultySetting == EnumDifficulty.PEACEFUL) { + despawnMe(); + } + } + + /** + * Despawn the alpha yeti, and restore the boss spawner at our home location, if set + */ + protected void despawnMe() { + if (this.hasHome()) { + ChunkCoordinates home = this.getHomePosition(); + worldObj.setBlock(home.posX, home.posY, home.posZ, TFBlocks.bossSpawner, 7, 2); + } + setDead(); + } + private void addSnowEffect(float rotation, float hgt) { double px = 3F * Math.cos(rotation); double py = hgt % 5F; @@ -195,6 +227,7 @@ public boolean interact(EntityPlayer par1EntityPlayer) { @Override public boolean attackEntityAsMob(Entity par1Entity) { if (this.riddenByEntity == null && par1Entity.ridingEntity == null) { + this.playSound(TwilightForestMod.ID + ":mob.yeti.grab", 4F, 0.75F + rand.nextFloat() * 0.25F); par1Entity.mountEntity(this); } @@ -238,6 +271,9 @@ protected void dropFewItems(boolean flag, int looting) { this.dropItem(bombs, 1); } + // trophy + this.entityDropItem(new ItemStack(TFItems.trophy, 1, 7), 0); + } @Override @@ -409,7 +445,10 @@ public void attackEntityWithRangedAttack(EntityLivingBase target, float par2) { float f1 = MathHelper.sqrt_double(d0 * d0 + d2 * d2) * 0.2F; ice.setThrowableHeading(d0, d1 + (double) f1, d2, 0.75F, 12.0F); - this.playSound("random.bow", 1.0F, 1.0F / (this.getRNG().nextFloat() * 0.4F + 0.8F)); + this.playSound( + TwilightForestMod.ID + ":mob.yeti.pant", + 1.0F, + 1.0F / (this.getRNG().nextFloat() * 0.4F + 0.8F)); this.worldObj.spawnEntityInWorld(ice); } } @@ -426,6 +465,7 @@ public boolean canRampage() { * Set whether this yeti is currently in rampage mode. */ public void setRampaging(boolean par1) { + if (par1) this.playSound(TwilightForestMod.ID + ":mob.yeti.roar", 4F, 0.75F + rand.nextFloat() * 0.25F); this.getDataWatcher().updateObject(RAMPAGE_FLAG, (byte) (par1 ? 1 : 0)); } @@ -459,7 +499,10 @@ protected void fall(float par1) { if (this.isRampaging()) { // make jump effects - this.playSound("random.bow", 1.0F, 1.0F / (this.getRNG().nextFloat() * 0.4F + 0.8F)); + this.playSound( + TwilightForestMod.ID + ":mob.yeti.pant", + 1.0F, + 1.0F / (this.getRNG().nextFloat() * 0.4F + 0.8F)); int i = MathHelper.floor_double(this.posX); int j = MathHelper.floor_double(this.posY - 0.20000000298023224D - (double) this.yOffset); @@ -498,7 +541,8 @@ private void hitNearbyEntities() { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightProgressYeti); } @@ -545,4 +589,35 @@ public void readEntityFromNBT(NBTTagCompound nbttagcompound) { } } + /** + * Returns the sound this mob makes while it's alive. + */ + @Override + protected String getLivingSound() { + return TwilightForestMod.ID + ":mob.yeti.growl"; + } + + /** + * Basically a public getter for living sounds + */ + public String getTrophySound() { + return this.getLivingSound(); + } + + /** + * Returns the sound this mob makes when it is hurt. + */ + @Override + protected String getHurtSound() { + return TwilightForestMod.ID + ":mob.yeti.hurt"; + } + + /** + * Returns the sound this mob makes on death. + */ + @Override + protected String getDeathSound() { + return TwilightForestMod.ID + ":mob.yeti.death"; + } + } diff --git a/src/main/java/twilightforest/entity/passive/EntityTFBighorn.java b/src/main/java/twilightforest/entity/passive/EntityTFBighorn.java index 6e57f275e1..d4cde514f7 100644 --- a/src/main/java/twilightforest/entity/passive/EntityTFBighorn.java +++ b/src/main/java/twilightforest/entity/passive/EntityTFBighorn.java @@ -10,6 +10,7 @@ import net.minecraft.world.World; import twilightforest.TFAchievementPage; +import twilightforest.TwilightForestMod; public class EntityTFBighorn extends EntitySheep { @@ -65,7 +66,8 @@ public EntitySheep createChild(EntityAgeable entityanimal) { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); } } diff --git a/src/main/java/twilightforest/entity/passive/EntityTFBoar.java b/src/main/java/twilightforest/entity/passive/EntityTFBoar.java index 2c6533ac3d..69a6cdad19 100644 --- a/src/main/java/twilightforest/entity/passive/EntityTFBoar.java +++ b/src/main/java/twilightforest/entity/passive/EntityTFBoar.java @@ -7,6 +7,7 @@ import net.minecraft.world.World; import twilightforest.TFAchievementPage; +import twilightforest.TwilightForestMod; public class EntityTFBoar extends EntityPig { @@ -35,7 +36,8 @@ public EntityPig createChild(EntityAgeable entityanimal) { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); } } diff --git a/src/main/java/twilightforest/entity/passive/EntityTFBunny.java b/src/main/java/twilightforest/entity/passive/EntityTFBunny.java index b44c68e71e..7dcab05988 100644 --- a/src/main/java/twilightforest/entity/passive/EntityTFBunny.java +++ b/src/main/java/twilightforest/entity/passive/EntityTFBunny.java @@ -18,6 +18,7 @@ import net.minecraft.world.World; import twilightforest.TFAchievementPage; +import twilightforest.TwilightForestMod; public class EntityTFBunny extends EntityCreature implements IAnimals { @@ -164,7 +165,8 @@ public float getBlockPathWeight(int par1, int par2, int par3) { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); } } diff --git a/src/main/java/twilightforest/entity/passive/EntityTFDeer.java b/src/main/java/twilightforest/entity/passive/EntityTFDeer.java index 94fc55cb78..94e5e165aa 100644 --- a/src/main/java/twilightforest/entity/passive/EntityTFDeer.java +++ b/src/main/java/twilightforest/entity/passive/EntityTFDeer.java @@ -10,6 +10,7 @@ import net.minecraft.world.World; import twilightforest.TFAchievementPage; +import twilightforest.TwilightForestMod; import twilightforest.item.TFItems; /** @@ -111,7 +112,8 @@ public EntityCow createChild(EntityAgeable entityanimal) { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); } } diff --git a/src/main/java/twilightforest/entity/passive/EntityTFPenguin.java b/src/main/java/twilightforest/entity/passive/EntityTFPenguin.java index 0c369e132c..3d0bb4e223 100644 --- a/src/main/java/twilightforest/entity/passive/EntityTFPenguin.java +++ b/src/main/java/twilightforest/entity/passive/EntityTFPenguin.java @@ -19,6 +19,7 @@ import net.minecraft.world.World; import twilightforest.TFAchievementPage; +import twilightforest.TwilightForestMod; public class EntityTFPenguin extends EntityTFBird { @@ -74,7 +75,8 @@ public boolean isBreedingItem(ItemStack par1ItemStack) { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); } } diff --git a/src/main/java/twilightforest/entity/passive/EntityTFQuestRam.java b/src/main/java/twilightforest/entity/passive/EntityTFQuestRam.java index 282b79b751..66604ac5e4 100644 --- a/src/main/java/twilightforest/entity/passive/EntityTFQuestRam.java +++ b/src/main/java/twilightforest/entity/passive/EntityTFQuestRam.java @@ -134,6 +134,9 @@ private void rewardQuest() { func_145778_a(Item.getItemFromBlock(Blocks.lapis_block), 1, 1.0F); func_145778_a(TFItems.crumbleHorn, 1, 1.0F); + // trophy + entityDropItem(new ItemStack(TFItems.trophy, 1, 8), 0); + rewardNearbyPlayers(this.worldObj, this.posX, this.posY, this.posZ); } @@ -348,6 +351,13 @@ protected String getLivingSound() { return "mob.sheep.say"; } + /** + * Basically a public getter for living sounds + */ + public String getTrophySound() { + return this.getLivingSound(); + } + /** * Returns the sound this mob makes when it is hurt. */ diff --git a/src/main/java/twilightforest/entity/passive/EntityTFSquirrel.java b/src/main/java/twilightforest/entity/passive/EntityTFSquirrel.java index 1984b0cba7..cc9d3b6638 100644 --- a/src/main/java/twilightforest/entity/passive/EntityTFSquirrel.java +++ b/src/main/java/twilightforest/entity/passive/EntityTFSquirrel.java @@ -17,6 +17,7 @@ import net.minecraft.world.World; import twilightforest.TFAchievementPage; +import twilightforest.TwilightForestMod; public class EntityTFSquirrel extends EntityCreature implements IAnimals { @@ -109,7 +110,8 @@ protected boolean canDespawn() { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); } } diff --git a/src/main/java/twilightforest/entity/passive/EntityTFTinyBird.java b/src/main/java/twilightforest/entity/passive/EntityTFTinyBird.java index 6918a560b3..a4cdff6988 100644 --- a/src/main/java/twilightforest/entity/passive/EntityTFTinyBird.java +++ b/src/main/java/twilightforest/entity/passive/EntityTFTinyBird.java @@ -192,7 +192,8 @@ public float getBlockPathWeight(int par1, int par2, int par3) { @Override public void onDeath(DamageSource par1DamageSource) { super.onDeath(par1DamageSource); - if (par1DamageSource.getEntity() instanceof EntityPlayer) { + if (par1DamageSource.getEntity() instanceof EntityPlayer + && ((EntityPlayer) par1DamageSource.getEntity()).dimension == TwilightForestMod.dimensionID) { ((EntityPlayer) par1DamageSource.getEntity()).triggerAchievement(TFAchievementPage.twilightHunter); } } diff --git a/src/main/java/twilightforest/integration/TFBaublesIntegration.java b/src/main/java/twilightforest/integration/TFBaublesIntegration.java index 3a5b92aa75..686e49c867 100644 --- a/src/main/java/twilightforest/integration/TFBaublesIntegration.java +++ b/src/main/java/twilightforest/integration/TFBaublesIntegration.java @@ -1,15 +1,55 @@ package twilightforest.integration; +import java.io.File; +import java.util.HashMap; + import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import baubles.common.container.InventoryBaubles; import baubles.common.lib.PlayerHandler; +import twilightforest.TFEventListener; import twilightforest.TwilightForestMod; public class TFBaublesIntegration { + public static HashMap playerBaublesMap = new HashMap<>(); + + public static void clearPlayerMap(EntityPlayer player) { + if (TwilightForestMod.areBaublesLoaded) { + playerBaublesMap.remove(player.getCommandSenderName()); + } + } + + public static InventoryBaubles getPlayerKeepBaubles(EntityPlayer player) { + if (!playerBaublesMap.containsKey(player.getCommandSenderName())) { + InventoryBaubles inventory = new InventoryBaubles(player); + playerBaublesMap.put(player.getCommandSenderName(), inventory); + } + return playerBaublesMap.get(player.getCommandSenderName()); + } + + public static void setPlayerKeepBaubles(EntityPlayer player, InventoryBaubles inventory) { + playerBaublesMap.put(player.getCommandSenderName(), inventory); + } + + public static void loadPlayerKeepBaubles(EntityPlayer player, NBTTagCompound data) { + if (TwilightForestMod.areBaublesLoaded) { + InventoryBaubles keepBaubles = new InventoryBaubles(player); + keepBaubles.readNBT(data); + playerBaublesMap.put(player.getCommandSenderName(), keepBaubles); + } + } + + public static void savePlayerKeepBaubles(EntityPlayer player, NBTTagCompound data) { + if (TwilightForestMod.areBaublesLoaded) { + InventoryBaubles inventory = getPlayerKeepBaubles(player); + inventory.saveNBT(data); + } + } + public static Boolean consumeBaublesItem(EntityPlayer player, Item item) { if (TwilightForestMod.areBaublesLoaded) { InventoryBaubles inventoryBaubles = PlayerHandler.getPlayerBaubles(player); @@ -42,4 +82,21 @@ public static ItemStack[] keepAllBaubles(EntityPlayer player) { return baublesInventory; } + public static void restoreBaubles(EntityPlayer player, ItemStack[] baublesInventory) { + if (TwilightForestMod.areBaublesLoaded && baublesInventory != null) { + InventoryBaubles inventoryBaubles = PlayerHandler.getPlayerBaubles(player); + for (int i = 0; i < inventoryBaubles.getSizeInventory(); i++) { + if (baublesInventory[i] != null) inventoryBaubles.setInventorySlotContents(i, baublesInventory[i]); + } + } + } + + public static void playerSaveDo(EntityPlayer player, File directory) { + if (TwilightForestMod.areBaublesLoaded) PlayerHandler.savePlayerBaubles( + player, + TFEventListener.getPlayerFile(TFEventListener.fileName, directory, player.getCommandSenderName()), + TFEventListener + .getPlayerFile(TFEventListener.fileNameBackup, directory, player.getCommandSenderName())); + } + } diff --git a/src/main/java/twilightforest/integration/TFThaumcraftIntegration.java b/src/main/java/twilightforest/integration/TFThaumcraftIntegration.java index 3aed2eedd7..2ccb4d5243 100644 --- a/src/main/java/twilightforest/integration/TFThaumcraftIntegration.java +++ b/src/main/java/twilightforest/integration/TFThaumcraftIntegration.java @@ -232,6 +232,7 @@ public static void registerThaumcraftIntegration() { // blocks registerTCObjectTag(TFBlocks.firefly, -1, (new AspectList()).add(Aspect.FLIGHT, 1).add(Aspect.LIGHT, 2)); + registerTCObjectTag(TFItems.critter, 0, (new AspectList()).add(Aspect.FLIGHT, 1).add(Aspect.LIGHT, 2)); registerTCObjectTag(TFBlocks.leaves, -1, (new AspectList()).add(Aspect.PLANT, 2)); registerTCObjectTag( TFBlocks.mazestone, @@ -241,6 +242,7 @@ public static void registerThaumcraftIntegration() { registerTCObjectTag(TFBlocks.hedge, 1, (new AspectList()).add(Aspect.PLANT, 3).add(Aspect.DARKNESS, 1)); registerTCObjectTag(TFBlocks.root, -1, (new AspectList()).add(Aspect.TREE, 2)); registerTCObjectTag(TFBlocks.cicada, -1, (new AspectList()).add(Aspect.SENSES, 2)); + registerTCObjectTag(TFItems.critter, 1, (new AspectList()).add(Aspect.SENSES, 2)); registerTCObjectTag( TFBlocks.uncraftingTable, -1, @@ -346,6 +348,7 @@ public static void registerThaumcraftIntegration() { registerTCObjectTag(TFBlocks.plant, 14, (new AspectList()).add(Aspect.PLANT, 2)); registerTCObjectTag(TFBlocks.sapling, -1, (new AspectList()).add(Aspect.PLANT, 4).add(Aspect.TREE, 2)); registerTCObjectTag(TFBlocks.moonworm, -1, (new AspectList()).add(Aspect.DARKNESS, 2).add(Aspect.LIGHT, 2)); + registerTCObjectTag(TFItems.critter, 2, (new AspectList()).add(Aspect.DARKNESS, 2).add(Aspect.LIGHT, 2)); registerTCObjectTag( TFBlocks.shield, -1, diff --git a/src/main/java/twilightforest/integration/TFTinkerConstructIntegration.java b/src/main/java/twilightforest/integration/TFTinkerConstructIntegration.java index a604173315..23ede9ea0c 100644 --- a/src/main/java/twilightforest/integration/TFTinkerConstructIntegration.java +++ b/src/main/java/twilightforest/integration/TFTinkerConstructIntegration.java @@ -338,6 +338,34 @@ public static void registerTinkersConstructIntegration(FMLPostInitializationEven } } + // Fiery armor casting + if (!TwilightForestMod.isGTNHLoaded) { + tableCasting.addCastingRecipe( + new ItemStack(TFItems.fieryHelm), + new FluidStack(fieryEssenceFluid, TConstruct.ingotLiquidValue * 5), + new ItemStack(Items.iron_helmet, 1, 0), + true, + 50); + tableCasting.addCastingRecipe( + new ItemStack(TFItems.fieryPlate), + new FluidStack(fieryEssenceFluid, TConstruct.ingotLiquidValue * 8), + new ItemStack(Items.iron_chestplate, 1, 0), + true, + 50); + tableCasting.addCastingRecipe( + new ItemStack(TFItems.fieryLegs), + new FluidStack(fieryEssenceFluid, TConstruct.ingotLiquidValue * 7), + new ItemStack(Items.iron_leggings, 1, 0), + true, + 50); + tableCasting.addCastingRecipe( + new ItemStack(TFItems.fieryBoots), + new FluidStack(fieryEssenceFluid, TConstruct.ingotLiquidValue * 4), + new ItemStack(Items.iron_boots, 1, 0), + true, + 50); + } + // Fluids registry fluids[0] = fieryEssenceFluid; fluids[1] = moltenFieryMetalFluid; diff --git a/src/main/java/twilightforest/item/ItemBlockTFCompressed.java b/src/main/java/twilightforest/item/ItemBlockTFCompressed.java new file mode 100644 index 0000000000..801cd8b3d6 --- /dev/null +++ b/src/main/java/twilightforest/item/ItemBlockTFCompressed.java @@ -0,0 +1,32 @@ +package twilightforest.item; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemBlockTFCompressed extends ItemBlock { + + public ItemBlockTFCompressed(Block block) { + super(block); + hasSubtypes = true; + } + + /** + * allows items to add custom lines of information to the mouseover description + */ + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, + boolean par4) { + super.addInformation(par1ItemStack, par2EntityPlayer, par3List, par4); + par3List.add(StatCollector.translateToLocal("itemBlock.compressed.tooltip")); + } + +} diff --git a/src/main/java/twilightforest/item/ItemBlockTFCritter.java b/src/main/java/twilightforest/item/ItemBlockTFCritter.java new file mode 100644 index 0000000000..cefc9bb6a4 --- /dev/null +++ b/src/main/java/twilightforest/item/ItemBlockTFCritter.java @@ -0,0 +1,29 @@ +package twilightforest.item; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemBlockTFCritter extends ItemBlock { + + public ItemBlockTFCritter(Block block) { + super(block); + } + + /** + * allows items to add custom lines of information to the mouseover description + */ + @SideOnly(Side.CLIENT) + @Override + public void addInformation(ItemStack itemStack, EntityPlayer player, List list, boolean par4) { + list.add(EnumChatFormatting.ITALIC + StatCollector.translateToLocal("item.outdated.tooltip")); + } +} diff --git a/src/main/java/twilightforest/item/ItemTFChainBlock.java b/src/main/java/twilightforest/item/ItemTFChainBlock.java index 7c240611f0..1fe0844ef7 100644 --- a/src/main/java/twilightforest/item/ItemTFChainBlock.java +++ b/src/main/java/twilightforest/item/ItemTFChainBlock.java @@ -26,6 +26,8 @@ public class ItemTFChainBlock extends ItemTool { // which items have launched which blocks? private HashMap launchedBlocksMap = new HashMap<>(); + private IIcon ring; + protected ItemTFChainBlock() { super(6, TFItems.TOOL_KNIGHTLY, Sets.newHashSet(Blocks.stone)); this.maxStackSize = 1; @@ -127,6 +129,7 @@ public void setLaunchedBlock(ItemStack stack, EntityTFChainBlock launchedCube) { public void registerIcons(IIconRegister par1IconRegister) { this.itemIcon = par1IconRegister .registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); + this.ring = par1IconRegister.registerIcon(TwilightForestMod.ID + ":" + "chainBlockRing"); } /** @@ -145,7 +148,7 @@ public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemS if (this.doesChainHaveBlock(stack)) { return this.itemIcon; } else { - return TFItems.knightmetalRing.getIconIndex(stack); + return this.ring; } } diff --git a/src/main/java/twilightforest/item/ItemTFCritter.java b/src/main/java/twilightforest/item/ItemTFCritter.java new file mode 100644 index 0000000000..b93a192eb4 --- /dev/null +++ b/src/main/java/twilightforest/item/ItemTFCritter.java @@ -0,0 +1,176 @@ +package twilightforest.item; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.client.model.ModelBiped; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemArmor; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import twilightforest.TwilightForestMod; +import twilightforest.block.BlockTFCritter; +import twilightforest.block.BlockTFFirefly; +import twilightforest.block.TFBlocks; + +public class ItemTFCritter extends ItemArmor { + + private static final String[] critterTypes = new String[] { "firefly", "cicada", "moonworm" }; + private static final Block[] critterBlocks = new Block[] { TFBlocks.firefly, TFBlocks.cicada, TFBlocks.moonworm }; + public static final String[] critterTextures = new String[] { "firefly-tiny", "cicada-model", "moonworm" }; + public IIcon[] critterIcons; + + public ItemTFCritter() { + super(TFItems.ARMOR_DECORATIVE, 0, 0); + this.setCreativeTab(TFItems.creativeTab); + this.setMaxDamage(0); + this.setHasSubtypes(true); + this.maxStackSize = 64; + } + + /** + * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) + */ + public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List) { + for (int j = 0; j < critterTypes.length; ++j) { + par3List.add(new ItemStack(par1, 1, j)); + } + } + + /** + * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return + * True if something happen and false if it don't. This is for ITEMS, not BLOCKS + */ + public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int direction, + float par8, float par9, float par10) { + if (!world.getBlock(x, y, z).getMaterial().isSolid()) { + return false; + } else { + switch (direction) { + default: + case 0: + --y; + break; + case 1: + ++y; + break; + case 2: + --z; + break; + case 3: + ++z; + break; + case 4: + --x; + break; + case 5: + ++x; + break; + } + + if (!player.canPlayerEdit(x, y, z, direction, itemStack)) { + return false; + } else { + BlockTFCritter block = new BlockTFFirefly(); + if (!block.canPlaceBlockAt(world, x, y, z)) { + return false; + } else { + if (world.setBlock( + x, + y, + z, + critterBlocks[itemStack.getItemDamage() % critterTypes.length], + 6 - direction, + 3)) { + world.playSound(x, y, z, "mob.slime.big", 0.25F, 0.6F, true); + --itemStack.stackSize; + return true; + } + return false; + } + } + } + } + + /** + * Returns the unlocalized name of this item. This version accepts an ItemStack so different stacks can have + * different names based on their damage or NBT. + */ + public String getUnlocalizedName(ItemStack par1ItemStack) { + return critterBlocks[par1ItemStack.getItemDamage() % critterTypes.length].getUnlocalizedName(); + } + + /** + * Properly register icon source + */ + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister par1IconRegister) { + this.critterIcons = new IIcon[critterTypes.length]; + + for (int i = 0; i < critterTypes.length; ++i) { + this.critterIcons[i] = critterBlocks[i].getIcon(3, 0); + } + } + + /** + * Gets an icon index based on an item's damage value + */ + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int par1) { + if (par1 < 0 || par1 >= critterTypes.length) { + par1 = 0; + } + + return this.critterIcons[par1]; + } + + /** + * Returns 0 for /terrain.png, 1 for /gui/items.png + */ + @Override + @SideOnly(Side.CLIENT) + public int getSpriteNumber() { + return 0; // Since we're using a block texture, not an item one + } + + /** + * Called by RenderBiped and RenderPlayer to determine the armor texture that should be use for the currently + * equiped item. This will only be called on instances of ItemArmor. + * + * Returning null from this function will use the default value. + * + * @param stack ItemStack for the equpt armor + * @param entity The entity wearing the armor + * @param slot The slot the armor is in + * @param type The subtype, can be null or "overlay" + * @return Path of texture to bind, or null to use default + */ + @Override + public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type) { + return TwilightForestMod.MODEL_DIR + critterTextures[stack.getItemDamage()] + ".png"; + } + + /** + * Override this method to have an item handle its own armor rendering. + * + * @param entityLiving The entity wearing the armor + * @param itemStack The itemStack to render the model of + * @param armorSlot 0=head, 1=torso, 2=legs, 3=feet + * + * @return A ModelBiped to render instead of the default + */ + @SideOnly(Side.CLIENT) + public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, int armorSlot) { + return TwilightForestMod.proxy.getCritterArmorModel(itemStack.getItemDamage()); + } +} diff --git a/src/main/java/twilightforest/item/ItemTFCrumbleHorn.java b/src/main/java/twilightforest/item/ItemTFCrumbleHorn.java index e13aceff5f..9067ea5e16 100644 --- a/src/main/java/twilightforest/item/ItemTFCrumbleHorn.java +++ b/src/main/java/twilightforest/item/ItemTFCrumbleHorn.java @@ -135,14 +135,20 @@ private int crumbleBlock(World world, EntityPlayer player, int dx, int dy, int d if (currentID != Blocks.air) { int currentMeta = world.getBlockMetadata(dx, dy, dz); - if (currentID == Blocks.stone && world.rand.nextInt(CHANCE_CRUMBLE) == 0) { - world.setBlock(dx, dy, dz, Blocks.cobblestone, 0, 3); + if (currentID == Blocks.stonebrick && currentMeta == 0 && world.rand.nextInt(CHANCE_CRUMBLE) == 0) { + world.setBlock(dx, dy, dz, Blocks.stonebrick, 2, 3); world.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); cost++; } - if (currentID == Blocks.stonebrick && currentMeta == 0 && world.rand.nextInt(CHANCE_CRUMBLE) == 0) { - world.setBlock(dx, dy, dz, Blocks.stonebrick, 2, 3); + if (currentID == Blocks.monster_egg && currentMeta == 0 && world.rand.nextInt(CHANCE_CRUMBLE) == 0) { + world.setBlock(dx, dy, dz, Blocks.monster_egg, 1, 3); + world.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); + cost++; + } + + if (currentID == Blocks.monster_egg && currentMeta == 2 && world.rand.nextInt(CHANCE_CRUMBLE) == 0) { + world.setBlock(dx, dy, dz, Blocks.monster_egg, 4, 3); world.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); cost++; } @@ -153,13 +159,132 @@ private int crumbleBlock(World world, EntityPlayer player, int dx, int dy, int d cost++; } - if (currentID == Blocks.cobblestone && world.rand.nextInt(CHANCE_CRUMBLE) == 0) { + if (currentID == TFBlocks.underBrick && currentMeta == 0 && world.rand.nextInt(CHANCE_CRUMBLE) == 0) { + world.setBlock(dx, dy, dz, TFBlocks.underBrick, 2, 3); + world.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); + cost++; + } + + if (currentID == TFBlocks.towerWood && currentMeta == 0 && world.rand.nextInt(CHANCE_CRUMBLE) == 0) { + world.setBlock(dx, dy, dz, TFBlocks.towerWood, 2, 3); + world.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); + cost++; + } + + if (currentID == TFBlocks.deadrock && currentMeta == 0 && world.rand.nextInt(CHANCE_CRUMBLE) == 0) { + world.setBlock(dx, dy, dz, TFBlocks.deadrock, 2, 3); + world.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); + cost++; + } + + if (currentID == TFBlocks.castleBlock && currentMeta == 0 && world.rand.nextInt(CHANCE_CRUMBLE) == 0) { + world.setBlock(dx, dy, dz, TFBlocks.castleBlock, 2, 3); + world.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); + cost++; + } + + if (currentID == TFBlocks.nagastonePillar && world.rand.nextInt(CHANCE_CRUMBLE) == 0) { + world.setBlock(dx, dy, dz, TFBlocks.nagastonePillarWeathered, currentMeta, 3); + world.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); + cost++; + } + + if (currentID == TFBlocks.nagastoneEtched && currentMeta == 0 && world.rand.nextInt(CHANCE_CRUMBLE) == 0) { + world.setBlockMetadataWithNotify(dx, dy, dz, 2, 3); + world.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); + cost++; + } + + if (currentID == TFBlocks.nagastoneStairsLeft && world.rand.nextInt(CHANCE_CRUMBLE) == 0) { + world.setBlock(dx, dy, dz, TFBlocks.nagastoneStairsWeatheredLeft, currentMeta, 3); + world.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); + cost++; + } + + if (currentID == TFBlocks.nagastoneStairsRight && world.rand.nextInt(CHANCE_CRUMBLE) == 0) { + world.setBlock(dx, dy, dz, TFBlocks.nagastoneStairsWeatheredRight, currentMeta, 3); + world.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); + cost++; + } + + if (currentID == Blocks.stone && world.rand.nextInt(CHANCE_CRUMBLE) == 0) { + world.setBlock(dx, dy, dz, Blocks.cobblestone, 0, 3); + world.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); + cost++; + } + + if (currentID == Blocks.ice && world.rand.nextInt(CHANCE_CRUMBLE) == 0) { + world.setBlock(dx, dy, dz, Blocks.water, 0, 1); + world.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); + cost++; + } + + if ((currentID == Blocks.cobblestone || currentID == Blocks.stone_stairs + || (currentID == Blocks.double_stone_slab && currentMeta == 3)) + && world.rand.nextInt(CHANCE_CRUMBLE) == 0) { world.setBlock(dx, dy, dz, Blocks.gravel, 0, 3); world.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); cost++; } - if (currentID == Blocks.gravel || currentID == Blocks.dirt) { + if (currentID == Blocks.stone_slab && (currentMeta == 0 || currentMeta == 8) + && world.rand.nextInt(CHANCE_CRUMBLE) == 0) { + world.setBlockMetadataWithNotify(dx, dy, dz, currentMeta + 3, 3); + world.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); + cost++; + } + + if (currentID == Blocks.double_stone_slab && currentMeta == 0 && world.rand.nextInt(CHANCE_CRUMBLE) == 0) { + world.setBlockMetadataWithNotify(dx, dy, dz, 3, 3); + world.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); + cost++; + } + + if (currentID == Blocks.stone_slab && (currentMeta == 1 || currentMeta == 9) + && world.rand.nextInt(CHANCE_CRUMBLE) == 0) { + if (world.rand.nextBoolean()) world.setBlock(dx, dy, dz, Blocks.sand, 0, 3); + else world.setBlockToAir(dx, dy, dz); + world.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); + cost++; + } + + if (currentID == Blocks.stone_slab && (currentMeta == 3 || currentMeta == 11) + && world.rand.nextInt(CHANCE_CRUMBLE) == 0) { + if (world.rand.nextBoolean()) world.setBlock(dx, dy, dz, Blocks.gravel, 0, 3); + else world.setBlockToAir(dx, dy, dz); + world.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); + cost++; + } + + if (((currentID == Blocks.sandstone && currentMeta == 0) || currentID == Blocks.sandstone_stairs + || (currentID == Blocks.double_stone_slab && currentMeta == 1)) + && world.rand.nextInt(CHANCE_CRUMBLE) == 0) { + world.setBlock(dx, dy, dz, Blocks.sand, 0, 3); + world.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); + cost++; + } + + if (currentID == Blocks.sandstone && currentMeta > 0 && world.rand.nextInt(CHANCE_CRUMBLE) == 0) { + world.setBlock(dx, dy, dz, Blocks.sandstone, 0, 3); + world.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); + cost++; + } + + if ((currentID == Blocks.grass || currentID == Blocks.mycelium + || (currentID == Blocks.dirt && currentMeta == 2)) && world.rand.nextInt(CHANCE_CRUMBLE) == 0) { + world.setBlock(dx, dy, dz, Blocks.dirt, 0, 3); + world.playAuxSFX(2001, dx, dy, dz, Block.getIdFromBlock(currentID) + (currentMeta << 12)); + cost++; + } + + if (currentID == Blocks.gravel || (currentID == Blocks.dirt && currentMeta != 2) + || currentID == Blocks.sand + || currentID == Blocks.clay + || currentID == Blocks.glass + || currentID == Blocks.glass_pane + || currentID == Blocks.stained_glass + || currentID == Blocks.stained_glass_pane + || currentID == Blocks.glowstone) { if (currentID.canHarvestBlock(player, currentMeta) && world.rand.nextInt(CHANCE_HARVEST) == 0) { world.setBlock(dx, dy, dz, Blocks.air, 0, 3); currentID.harvestBlock(world, player, dx, dy, dz, currentMeta); diff --git a/src/main/java/twilightforest/item/ItemTFKnightlyArmor.java b/src/main/java/twilightforest/item/ItemTFKnightlyArmor.java index 8918616e66..fef68a41aa 100644 --- a/src/main/java/twilightforest/item/ItemTFKnightlyArmor.java +++ b/src/main/java/twilightforest/item/ItemTFKnightlyArmor.java @@ -33,11 +33,11 @@ public EnumRarity getRarity(ItemStack par1ItemStack) { /** * Called by RenderBiped and RenderPlayer to determine the armor texture that should be use for the currently - * equiped item. This will only be called on instances of ItemArmor. + * equipped item. This will only be called on instances of ItemArmor. * * Returning null from this function will use the default value. * - * @param stack ItemStack for the equpt armor + * @param stack ItemStack for the equipped armor * @param entity The entity wearing the armor * @param slot The slot the armor is in * @param layer The render layer, either 1 or 2, 2 is only used for CLOTH armor by default diff --git a/src/main/java/twilightforest/item/ItemTFPhantomArmor.java b/src/main/java/twilightforest/item/ItemTFPhantomArmor.java index 594efbaf3d..896731a2f0 100644 --- a/src/main/java/twilightforest/item/ItemTFPhantomArmor.java +++ b/src/main/java/twilightforest/item/ItemTFPhantomArmor.java @@ -7,10 +7,12 @@ import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -78,6 +80,17 @@ public void registerIcons(IIconRegister par1IconRegister) { .registerIcon(TwilightForestMod.ID + ":" + this.getUnlocalizedName().substring(5)); } + /** + * allows items to add custom lines of information to the mouseover description + */ + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, + boolean par4) { + super.addInformation(par1ItemStack, par2EntityPlayer, par3List, par4); + par3List.add(StatCollector.translateToLocal(getUnlocalizedName() + ".tooltip")); + } + /** * Override this method to have an item handle its own armor rendering. * diff --git a/src/main/java/twilightforest/item/ItemTFTrophy.java b/src/main/java/twilightforest/item/ItemTFTrophy.java index be09034d1b..245a0f6172 100644 --- a/src/main/java/twilightforest/item/ItemTFTrophy.java +++ b/src/main/java/twilightforest/item/ItemTFTrophy.java @@ -2,11 +2,15 @@ import java.util.List; +import net.minecraft.client.model.ModelBiped; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; +import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -20,18 +24,23 @@ import twilightforest.TwilightForestMod; import twilightforest.block.TFBlocks; -public class ItemTFTrophy extends ItemTF { +public class ItemTFTrophy extends ItemArmor { - private static final String[] trophyTypes = new String[] { "hydra", "naga", "lich", "ur-ghast", "snowQueen" }; + private static final String[] trophyTypes = new String[] { "hydra", "naga", "lich", "ur-ghast", "snowQueen", + "minoshroom", "knightPhantom", "alphaYeti", "questingRam" }; public static final String[] trophyTextures = new String[] { "hydraTrophy", "nagaTrophy", "lichTrophy", - "urGhastTrophy", "snowQueenTrophy" }; + "urGhastTrophy", "snowQueenTrophy", "minoshroomTrophy", "knightPhantomTrophy", "alphaYetiTrophy", + "questingRamTrophy" }; + private static final String[] armorTextures = new String[] { "hydra4", "nagahead", "twilightlich64", "towerboss", + "snowqueen", "minoshroomtaur", "phantomtrophy", "yetialpha", "questram" }; public IIcon[] trophyIcons; public ItemTFTrophy() { - super(); + super(TFItems.ARMOR_DECORATIVE, 0, 0); this.setCreativeTab(TFItems.creativeTab); this.setMaxDamage(0); this.setHasSubtypes(true); + this.maxStackSize = 64; } /** @@ -163,4 +172,35 @@ public IIcon getIconFromDamage(int par1) { return this.trophyIcons[par1]; } + + /** + * Called by RenderBiped and RenderPlayer to determine the armor texture that should be use for the currently + * equiped item. This will only be called on instances of ItemArmor. + * + * Returning null from this function will use the default value. + * + * @param stack ItemStack for the equpt armor + * @param entity The entity wearing the armor + * @param slot The slot the armor is in + * @param type The subtype, can be null or "overlay" + * @return Path of texture to bind, or null to use default + */ + @Override + public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type) { + return TwilightForestMod.MODEL_DIR + armorTextures[stack.getItemDamage()] + ".png"; + } + + /** + * Override this method to have an item handle its own armor rendering. + * + * @param entityLiving The entity wearing the armor + * @param itemStack The itemStack to render the model of + * @param armorSlot 0=head, 1=torso, 2=legs, 3=feet + * + * @return A ModelBiped to render instead of the default + */ + @SideOnly(Side.CLIENT) + public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, int armorSlot) { + return TwilightForestMod.proxy.getTrophyArmorModel(itemStack.getItemDamage()); + } } diff --git a/src/main/java/twilightforest/item/TFItems.java b/src/main/java/twilightforest/item/TFItems.java index fe9e2ffc68..58091501b1 100644 --- a/src/main/java/twilightforest/item/TFItems.java +++ b/src/main/java/twilightforest/item/TFItems.java @@ -26,6 +26,8 @@ public class TFItems { .addArmorMaterial("YETI", 20, new int[] { 4, 7, 6, 3 }, 15); public static ItemArmor.ArmorMaterial ARMOR_ARCTIC = EnumHelper .addArmorMaterial("ARCTIC", 10, new int[] { 2, 7, 5, 2 }, 8); + public static ItemArmor.ArmorMaterial ARMOR_DECORATIVE = EnumHelper + .addArmorMaterial("DECORATIVE", 0, new int[] { 0, 0, 0, 0 }, 0); public static Item.ToolMaterial TOOL_IRONWOOD = EnumHelper.addToolMaterial("IRONWOOD", 2, 512, 6.5F, 2, 25); public static Item.ToolMaterial TOOL_FIERY = EnumHelper.addToolMaterial("FIERY", 4, 1024, 9F, 4, 10); @@ -68,6 +70,7 @@ public class TFItems { public static Item hydraChop; public static Item fieryBlood; public static Item trophy; + public static Item critter; public static Item fieryIngot; public static Item fieryHelm; public static Item fieryPlate; @@ -232,6 +235,7 @@ public static void registerItems() { .setUnlocalizedName("hydraChop"); fieryBlood = new ItemTF().makeRare().setUnlocalizedName("fieryBlood"); trophy = new ItemTFTrophy().setUnlocalizedName("trophy"); + critter = new ItemTFCritter().setUnlocalizedName("critter"); fieryIngot = new ItemTF().makeRare().setUnlocalizedName("fieryIngot"); fieryHelm = new ItemTFFieryArmor(ARMOR_FIERY, fieryRenderID, 0).setUnlocalizedName("fieryHelm") .setMaxStackSize(1); @@ -374,6 +378,7 @@ public static void registerItems() { registerTFItem(hydraChop, "Hydra Chop"); registerTFItem(fieryBlood, "Fiery Blood"); registerTFItem(trophy, "Hydra Trophy"); + registerTFItem(critter, "Firefly"); registerTFItem(fieryIngot, "Fiery Ingot"); registerTFItem(fieryHelm, "Fiery Helm"); registerTFItem(fieryPlate, "Fiery Plate"); diff --git a/src/main/java/twilightforest/item/TFRecipes.java b/src/main/java/twilightforest/item/TFRecipes.java index b984079a9e..b1e581cd3d 100644 --- a/src/main/java/twilightforest/item/TFRecipes.java +++ b/src/main/java/twilightforest/item/TFRecipes.java @@ -2,6 +2,7 @@ import static net.minecraftforge.oredict.RecipeSorter.Category.SHAPELESS; +import net.minecraft.block.Block; import net.minecraft.enchantment.Enchantment; import net.minecraft.init.Blocks; import net.minecraft.init.Items; @@ -40,6 +41,16 @@ public static void registerRecipes() { OreDictionary.registerOre("ingotSteeleaf", new ItemStack(TFItems.steeleafIngot)); OreDictionary.registerOre("oreKnightmetal", new ItemStack(TFItems.shardCluster)); OreDictionary.registerOre("ingotKnightmetal", new ItemStack(TFItems.knightMetal)); + OreDictionary.registerOre("fieryEssence", new ItemStack(TFItems.fieryBlood)); + OreDictionary.registerOre("fieryEssence", new ItemStack(TFItems.fieryTears)); + + // in order for all critters recipes to work + OreDictionary.registerOre("firefly", new ItemStack(TFBlocks.firefly, 1, OreDictionary.WILDCARD_VALUE)); + OreDictionary.registerOre("firefly", new ItemStack(TFItems.critter, 1, 0)); + OreDictionary.registerOre("cicada", new ItemStack(TFBlocks.cicada, 1, OreDictionary.WILDCARD_VALUE)); + OreDictionary.registerOre("cicada", new ItemStack(TFItems.critter, 1, 1)); + OreDictionary.registerOre("moonworm", new ItemStack(TFBlocks.moonworm, 1, OreDictionary.WILDCARD_VALUE)); + OreDictionary.registerOre("moonworm", new ItemStack(TFItems.critter, 1, 2)); // nagastone stuff OreDictionary.registerOre( @@ -110,12 +121,28 @@ public static void registerRecipes() { new ItemStack(TFBlocks.woodenStairsDarkwood, 8, 0), new ItemStack(TFBlocks.woodenStairsTime, 8, 0), new ItemStack(TFBlocks.woodenStairsTrans, 8, 0), new ItemStack(TFBlocks.woodenStairsMine, 8, 0), new ItemStack(TFBlocks.woodenStairsSort, 8, 0) }; + Block[] chests = new Block[] { TFBlocks.chestTwilight, TFBlocks.chestCanopy, TFBlocks.chestMangrove, + TFBlocks.chestDarkwood, TFBlocks.chestTime, TFBlocks.chestTrans, TFBlocks.chestMine, + TFBlocks.chestSort }; + Block[] trappedChests = new Block[] { TFBlocks.trappedChestTwilight, TFBlocks.trappedChestCanopy, + TFBlocks.trappedChestMangrove, TFBlocks.trappedChestDarkwood, TFBlocks.trappedChestTime, + TFBlocks.trappedChestTrans, TFBlocks.trappedChestMine, TFBlocks.trappedChestSort }; for (int i = 0; i < doors.length; i++) { - GameRegistry.addRecipe( - new ItemStack(doors[i], 1, 0), - new Object[] { "##", "##", "##", '#', new ItemStack(TFBlocks.planks, 1, i) }); - GameRegistry - .addRecipe(trapdoors[i], new Object[] { "###", "###", '#', new ItemStack(TFBlocks.planks, 1, i) }); + if (!TwilightForestMod.isGTNHLoaded) { + GameRegistry.addRecipe( + new ItemStack(doors[i], 1, 0), + new Object[] { "##", "##", "##", '#', new ItemStack(TFBlocks.planks, 1, i) }); + GameRegistry.addRecipe( + trapdoors[i], + new Object[] { "###", "###", '#', new ItemStack(TFBlocks.planks, 1, i) }); + GameRegistry.addRecipe( + new ItemStack(chests[i], 2), + new Object[] { "###", "#0#", "###", '#', new ItemStack(TFBlocks.planks, 1, i), '0', + new ItemStack(Blocks.chest) }); + GameRegistry.addShapelessRecipe( + new ItemStack(trappedChests[i]), + new Object[] { new ItemStack(chests[i]), new ItemStack(Blocks.tripwire_hook) }); + } GameRegistry.addRecipe( stairs[i], new Object[] { "# ", "## ", "###", '#', new ItemStack(TFBlocks.planks, 1, i) }); @@ -124,6 +151,10 @@ public static void registerRecipes() { new Object[] { "###", '#', new ItemStack(TFBlocks.planks, 1, i) }); } + // Dyes from TF plants + GameRegistry.addShapelessRecipe(new ItemStack(Items.dye, 2, 13), new Object[] { TFBlocks.hugeWaterLily }); + GameRegistry.addShapelessRecipe(new ItemStack(Items.dye, 2, 1), new Object[] { TFBlocks.thornRose }); + GameRegistry.addRecipe( new ItemStack(TFBlocks.nagastoneStairsLeft, 8, 0), new Object[] { "# ", "## ", "###", '#', new ItemStack(TFBlocks.nagastoneEtched, 1, 0) }); @@ -182,9 +213,10 @@ public static void registerRecipes() { 3, new Object[] { "###", "# #", "# #", '#', TFItems.nagaScale }); - GameRegistry.addShapelessRecipe( - new ItemStack(TFBlocks.fireflyJar, 1, 0), - new Object[] { TFBlocks.firefly, Items.glass_bottle }); + GameRegistry.addRecipe( + new ShapelessOreRecipe( + new ItemStack(TFBlocks.fireflyJar, 1, 0), + new Object[] { "firefly", Items.glass_bottle })); GameRegistry.addShapelessRecipe( new ItemStack(TFItems.scepterTwilight), @@ -310,12 +342,10 @@ public static void registerRecipes() { GameRegistry.addSmelting(TFItems.venisonRaw, new ItemStack(TFItems.venisonCooked), 0.3F); - GameRegistry.addShapelessRecipe( - new ItemStack(TFItems.fieryIngot), - new Object[] { TFItems.fieryBlood, Items.iron_ingot }); - GameRegistry.addShapelessRecipe( - new ItemStack(TFItems.fieryIngot), - new Object[] { TFItems.fieryTears, Items.iron_ingot }); + GameRegistry.addRecipe( + new ShapelessOreRecipe( + new ItemStack(TFItems.fieryIngot), + new Object[] { "fieryEssence", Items.iron_ingot })); GameRegistry .addRecipe(new ItemStack(TFItems.fieryHelm), new Object[] { "###", "# #", '#', TFItems.fieryIngot }); GameRegistry.addRecipe( @@ -326,6 +356,32 @@ public static void registerRecipes() { new Object[] { "###", "# #", "# #", '#', TFItems.fieryIngot }); GameRegistry .addRecipe(new ItemStack(TFItems.fieryBoots), new Object[] { "# #", "# #", '#', TFItems.fieryIngot }); + + // Direct Fiery armor crafting + if (!TwilightForestMod.isGTNHLoaded) { + GameRegistry.addRecipe( + new ShapelessOreRecipe( + new ItemStack(TFItems.fieryHelm), + new Object[] { new ItemStack(Items.iron_helmet, 1, 0), "fieryEssence", "fieryEssence", + "fieryEssence", "fieryEssence", "fieryEssence" })); + GameRegistry.addRecipe( + new ShapelessOreRecipe( + new ItemStack(TFItems.fieryPlate), + new Object[] { new ItemStack(Items.iron_chestplate, 1, 0), "fieryEssence", "fieryEssence", + "fieryEssence", "fieryEssence", "fieryEssence", "fieryEssence", "fieryEssence", + "fieryEssence" })); + GameRegistry.addRecipe( + new ShapelessOreRecipe( + new ItemStack(TFItems.fieryLegs), + new Object[] { new ItemStack(Items.iron_leggings, 1, 0), "fieryEssence", "fieryEssence", + "fieryEssence", "fieryEssence", "fieryEssence", "fieryEssence", "fieryEssence" })); + GameRegistry.addRecipe( + new ShapelessOreRecipe( + new ItemStack(TFItems.fieryBoots), + new Object[] { new ItemStack(Items.iron_boots, 1, 0), "fieryEssence", "fieryEssence", + "fieryEssence", "fieryEssence" })); + } + addEnchantedRecipe( TFItems.fierySword, Enchantment.fireAspect, diff --git a/src/main/java/twilightforest/structures/courtyard/ComponentTFNagaCourtyardRotatedAbstract.java b/src/main/java/twilightforest/structures/courtyard/ComponentTFNagaCourtyardRotatedAbstract.java index 02767a7e57..6c911d12d1 100644 --- a/src/main/java/twilightforest/structures/courtyard/ComponentTFNagaCourtyardRotatedAbstract.java +++ b/src/main/java/twilightforest/structures/courtyard/ComponentTFNagaCourtyardRotatedAbstract.java @@ -23,15 +23,15 @@ public class ComponentTFNagaCourtyardRotatedAbstract extends StructureTFComponen protected int rotatedStairs6; protected int rotatedStairs7; - protected ForgeDirection EtchedNagastoneNorth; - protected ForgeDirection EtchedNagastoneSouth; - protected ForgeDirection EtchedNagastoneWest; - protected ForgeDirection EtchedNagastoneEast; - - protected Yaw NagastoneNorth; - protected Yaw NagastoneSouth; - protected Yaw NagastoneWest; - protected Yaw NagastoneEast; + protected ForgeDirection EtchedNagastoneNorth = ForgeDirection.NORTH; + protected ForgeDirection EtchedNagastoneSouth = ForgeDirection.SOUTH; + protected ForgeDirection EtchedNagastoneWest = ForgeDirection.WEST; + protected ForgeDirection EtchedNagastoneEast = ForgeDirection.EAST; + + protected Yaw NagastoneNorth = Yaw.NORTH; + protected Yaw NagastoneSouth = Yaw.SOUTH; + protected Yaw NagastoneWest = Yaw.WEST; + protected Yaw NagastoneEast = Yaw.EAST; public ComponentTFNagaCourtyardRotatedAbstract() { super(); diff --git a/src/main/java/twilightforest/structures/courtyard/ComponentTFNagaCourtyardTerraceDuct.java b/src/main/java/twilightforest/structures/courtyard/ComponentTFNagaCourtyardTerraceDuct.java index f33f90f134..2431dd7922 100644 --- a/src/main/java/twilightforest/structures/courtyard/ComponentTFNagaCourtyardTerraceDuct.java +++ b/src/main/java/twilightforest/structures/courtyard/ComponentTFNagaCourtyardTerraceDuct.java @@ -3,6 +3,8 @@ import java.util.List; import java.util.Random; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; import net.minecraft.init.Blocks; import net.minecraft.world.World; import net.minecraft.world.gen.structure.StructureBoundingBox; @@ -220,9 +222,44 @@ public boolean addComponentParts(World world, Random random, StructureBoundingBo TFBlocks.nagastonePillar, horizontalColumnsOrient4, true); - this.fillWithBlocks(world, structureBoundingBox, 7, 0, 7, 16, 0, 9, Blocks.water, Blocks.water, true); - this.fillWithBlocks(world, structureBoundingBox, 7, 0, 7, 9, 0, 16, Blocks.water, Blocks.water, true); - + this.fillWithBlocksAndUpdate(world, structureBoundingBox, 7, 0, 7, 16, 0, 9, Blocks.water, Blocks.water, false); + this.fillWithBlocksAndUpdate(world, structureBoundingBox, 7, 0, 7, 9, 0, 16, Blocks.water, Blocks.water, false); return true; } + + /** + * arguments: (World worldObj, StructureBoundingBox structBB, int minX, int minY, int minZ, int maxX, int maxY, int + * maxZ, int placeBlock, int replaceBlock, boolean alwaysreplace) + */ + protected void fillWithBlocksAndUpdate(World world, StructureBoundingBox sbb, int minX, int minY, int minZ, + int maxX, int maxY, int maxZ, Block placeBlock, Block replaceBlock, boolean alwaysReplace) { + for (int k1 = minY; k1 <= maxY; ++k1) { + for (int l1 = minX; l1 <= maxX; ++l1) { + for (int i2 = minZ; i2 <= maxZ; ++i2) { + if (!alwaysReplace + || this.getBlockAtCurrentPosition(world, l1, k1, i2, sbb).getMaterial() != Material.air) { + if (k1 != minY && k1 != maxY && l1 != minX && l1 != maxX && i2 != minZ && i2 != maxZ) { + this.placeBlockAtCurrentPositionWithUpdate(world, replaceBlock, 0, l1, k1, i2, sbb); + } else { + this.placeBlockAtCurrentPositionWithUpdate(world, placeBlock, 0, l1, k1, i2, sbb); + } + } + } + } + } + } + + /** + * current Position depends on currently set Coordinates mode, is computed here + */ + protected void placeBlockAtCurrentPositionWithUpdate(World world, Block block, int meta, int x, int y, int z, + StructureBoundingBox sbb) { + int i1 = this.getXWithOffset(x, z); + int j1 = this.getYWithOffset(y); + int k1 = this.getZWithOffset(x, z); + + if (sbb.isVecInside(i1, j1, k1)) { + world.setBlock(i1, j1, k1, block, meta, 1); + } + } } diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFAlphaYetiSpawner.java b/src/main/java/twilightforest/tileentity/TileEntityTFAlphaYetiSpawner.java new file mode 100644 index 0000000000..9b0ecf4168 --- /dev/null +++ b/src/main/java/twilightforest/tileentity/TileEntityTFAlphaYetiSpawner.java @@ -0,0 +1,20 @@ +package twilightforest.tileentity; + +import net.minecraft.entity.player.EntityPlayer; + +import twilightforest.entity.TFCreatures; + +public class TileEntityTFAlphaYetiSpawner extends TileEntityTFBossSpawner { + + public TileEntityTFAlphaYetiSpawner() { + this.mobID = TFCreatures.getSpawnerNameFor("Yeti Boss"); + } + + @Override + public boolean anyPlayerInRange() { + EntityPlayer closestPlayer = worldObj.getClosestPlayer(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, 30D); + + return closestPlayer != null && closestPlayer.posY > yCoord - 4; + } + +} diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFChest.java b/src/main/java/twilightforest/tileentity/TileEntityTFChest.java new file mode 100644 index 0000000000..321b7791f1 --- /dev/null +++ b/src/main/java/twilightforest/tileentity/TileEntityTFChest.java @@ -0,0 +1,117 @@ +package twilightforest.tileentity; + +import net.minecraft.block.Block; +import net.minecraft.tileentity.TileEntityChest; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import twilightforest.block.BlockTFChest; +import twilightforest.block.BlockTFChest.WoodType; + +public class TileEntityTFChest extends TileEntityChest { + + public WoodType cachedMaterial = WoodType.NULL; + + public TileEntityTFChest() { + super(); + } + + @SideOnly(Side.CLIENT) + public TileEntityTFChest(WoodType material) { + super(); + this.cachedMaterial = material; + } + + /** + * Performs the check for adjacent chests to determine if this chest is double or not. + */ + @Override + public void checkForAdjacentChests() { + if (!this.adjacentChestChecked) { + this.adjacentChestChecked = true; + this.adjacentChestZNeg = null; + this.adjacentChestXPos = null; + this.adjacentChestXNeg = null; + this.adjacentChestZPos = null; + + if (this.func_145977_a(this.xCoord - 1, this.yCoord, this.zCoord)) { + this.adjacentChestXNeg = (TileEntityTFChest) this.worldObj + .getTileEntity(this.xCoord - 1, this.yCoord, this.zCoord); + } + + if (this.func_145977_a(this.xCoord + 1, this.yCoord, this.zCoord)) { + this.adjacentChestXPos = (TileEntityTFChest) this.worldObj + .getTileEntity(this.xCoord + 1, this.yCoord, this.zCoord); + } + + if (this.func_145977_a(this.xCoord, this.yCoord, this.zCoord - 1)) { + this.adjacentChestZNeg = (TileEntityTFChest) this.worldObj + .getTileEntity(this.xCoord, this.yCoord, this.zCoord - 1); + } + + if (this.func_145977_a(this.xCoord, this.yCoord, this.zCoord + 1)) { + this.adjacentChestZPos = (TileEntityTFChest) this.worldObj + .getTileEntity(this.xCoord, this.yCoord, this.zCoord + 1); + } + + if (this.adjacentChestZNeg instanceof TileEntityTFChest) { + ((TileEntityTFChest) this.adjacentChestZNeg).func_145978_a(this, 0); + } + + if (this.adjacentChestZPos instanceof TileEntityTFChest) { + ((TileEntityTFChest) this.adjacentChestZPos).func_145978_a(this, 2); + } + + if (this.adjacentChestXPos instanceof TileEntityTFChest) { + ((TileEntityTFChest) this.adjacentChestXPos).func_145978_a(this, 1); + } + + if (this.adjacentChestXNeg instanceof TileEntityTFChest) { + ((TileEntityTFChest) this.adjacentChestXNeg).func_145978_a(this, 3); + } + } + } + + private boolean func_145977_a(int p_145977_1_, int p_145977_2_, int p_145977_3_) { + if (this.worldObj == null) { + return false; + } else { + Block block = this.worldObj.getBlock(p_145977_1_, p_145977_2_, p_145977_3_); + Block thisBlock = this.getBlockType(); + return block instanceof BlockTFChest && thisBlock instanceof BlockTFChest + && ((BlockTFChest) block).getWoodType() == ((BlockTFChest) thisBlock).getWoodType(); + } + } + + private void func_145978_a(TileEntityTFChest p_145978_1_, int p_145978_2_) { + if (p_145978_1_.isInvalid()) { + this.adjacentChestChecked = false; + } else if (this.adjacentChestChecked) { + switch (p_145978_2_) { + case 0: + if (this.adjacentChestZPos != p_145978_1_) { + this.adjacentChestChecked = false; + } + + break; + case 1: + if (this.adjacentChestXNeg != p_145978_1_) { + this.adjacentChestChecked = false; + } + + break; + case 2: + if (this.adjacentChestZNeg != p_145978_1_) { + this.adjacentChestChecked = false; + } + + break; + case 3: + if (this.adjacentChestXPos != p_145978_1_) { + this.adjacentChestChecked = false; + } + } + } + } + +} diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFCicada.java b/src/main/java/twilightforest/tileentity/TileEntityTFCicada.java index 1169933354..39b5684446 100644 --- a/src/main/java/twilightforest/tileentity/TileEntityTFCicada.java +++ b/src/main/java/twilightforest/tileentity/TileEntityTFCicada.java @@ -1,5 +1,8 @@ package twilightforest.tileentity; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.util.ResourceLocation; + import twilightforest.TwilightForestMod; public class TileEntityTFCicada extends TileEntityTFCritter { @@ -90,14 +93,14 @@ public void doSingAnimation() { } public void playSong() { - if (!TwilightForestMod.silentCicadas) { - worldObj.playSoundEffect( - xCoord, - yCoord, - zCoord, - TwilightForestMod.ID + ":mob.cicada", - 1.0f, - (worldObj.rand.nextFloat() - worldObj.rand.nextFloat()) * 0.2F + 1.0F); + if (!TwilightForestMod.silentCicadas && worldObj.isRemote) { + ChunkCoordinates chunkcoordinates = new ChunkCoordinates(xCoord, yCoord, zCoord); + if (!TwilightForestMod.proxy.checkForSound(chunkcoordinates)) { + TwilightForestMod.proxy.playSound( + worldObj, + chunkcoordinates, + new ResourceLocation(TwilightForestMod.ID + ":mob.cicada")); + } } } } diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFHydraSpawner.java b/src/main/java/twilightforest/tileentity/TileEntityTFHydraSpawner.java index 07d85c8a80..0d37071e5c 100644 --- a/src/main/java/twilightforest/tileentity/TileEntityTFHydraSpawner.java +++ b/src/main/java/twilightforest/tileentity/TileEntityTFHydraSpawner.java @@ -2,8 +2,10 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityList; +import net.minecraft.entity.EntityLiving; import twilightforest.entity.TFCreatures; +import twilightforest.entity.boss.EntityTFHydra; public class TileEntityTFHydraSpawner extends TileEntityTFBossSpawner { @@ -21,4 +23,14 @@ public Entity getDisplayEntity() { return this.displayCreature; } + + /** + * Any post-creation initialization goes here + */ + @Override + protected void initializeCreature(EntityLiving myCreature) { + if (myCreature instanceof EntityTFHydra) { + ((EntityTFHydra) myCreature).setHomeArea(xCoord, yCoord, zCoord, 46); + } + } } diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFKnightPhantomsSpawner.java b/src/main/java/twilightforest/tileentity/TileEntityTFKnightPhantomsSpawner.java index ff6d36957c..915086e90a 100644 --- a/src/main/java/twilightforest/tileentity/TileEntityTFKnightPhantomsSpawner.java +++ b/src/main/java/twilightforest/tileentity/TileEntityTFKnightPhantomsSpawner.java @@ -8,6 +8,8 @@ public class TileEntityTFKnightPhantomsSpawner extends TileEntityTFBossSpawner { + public int knightsCount = 6; + public TileEntityTFKnightPhantomsSpawner() { this.mobID = TFCreatures.getSpawnerNameFor("Knight Phantom"); } @@ -24,7 +26,7 @@ public boolean anyPlayerInRange() { */ protected void spawnMyBoss() { - for (int i = 0; i < 6; i++) { + for (int i = 0; i < knightsCount; i++) { // spawn creature EntityLiving myCreature = makeMyCreature(); diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFMinoshroomSpawner.java b/src/main/java/twilightforest/tileentity/TileEntityTFMinoshroomSpawner.java new file mode 100644 index 0000000000..d434b5bff9 --- /dev/null +++ b/src/main/java/twilightforest/tileentity/TileEntityTFMinoshroomSpawner.java @@ -0,0 +1,20 @@ +package twilightforest.tileentity; + +import net.minecraft.entity.player.EntityPlayer; + +import twilightforest.entity.TFCreatures; + +public class TileEntityTFMinoshroomSpawner extends TileEntityTFBossSpawner { + + public TileEntityTFMinoshroomSpawner() { + this.mobID = TFCreatures.getSpawnerNameFor("Minoshroom"); + } + + @Override + public boolean anyPlayerInRange() { + EntityPlayer closestPlayer = worldObj.getClosestPlayer(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D, 15D); + + return closestPlayer != null && closestPlayer.posY > yCoord - 4; + } + +} diff --git a/src/main/java/twilightforest/tileentity/TileEntityTFTowerBossSpawner.java b/src/main/java/twilightforest/tileentity/TileEntityTFTowerBossSpawner.java index f29fcc1db0..776d7a4542 100644 --- a/src/main/java/twilightforest/tileentity/TileEntityTFTowerBossSpawner.java +++ b/src/main/java/twilightforest/tileentity/TileEntityTFTowerBossSpawner.java @@ -4,6 +4,7 @@ import net.minecraft.entity.player.EntityPlayer; import twilightforest.entity.TFCreatures; +import twilightforest.entity.boss.EntityTFUrGhast; public class TileEntityTFTowerBossSpawner extends TileEntityTFBossSpawner { @@ -34,4 +35,14 @@ protected void spawnMyBoss() { worldObj.spawnEntityInWorld(myCreature); } + /** + * Any post-creation initialization goes here + */ + @Override + protected void initializeCreature(EntityLiving myCreature) { + if (myCreature instanceof EntityTFUrGhast) { + ((EntityTFUrGhast) myCreature).setHomeArea(xCoord, yCoord, zCoord, 46); + } + } + } diff --git a/src/main/resources/META-INF/twilightforest_at.cfg b/src/main/resources/META-INF/twilightforest_at.cfg index b69250e4d1..6529f5b709 100644 --- a/src/main/resources/META-INF/twilightforest_at.cfg +++ b/src/main/resources/META-INF/twilightforest_at.cfg @@ -2,5 +2,8 @@ public net.minecraft.entity.EntityLivingBase field_110153_bc #lastDamage public net.minecraft.util.EntityDamageSource field_76386_o #damageSourceEntity public net.minecraft.util.EntityDamageSourceIndirect field_76387_p #indirectEntity +public net.minecraft.entity.ai.EntityAINearestAttackableTarget field_75309_a #targetEntity +public net.minecraft.entity.Entity field_70146_Z #rand +public net.minecraft.client.renderer.RenderGlobal field_147593_P #mapSoundPositions public net.minecraft.block.BlockStairs field_150149_b public net.minecraft.block.BlockStairs field_150151_M diff --git a/src/main/resources/assets/twilightforest/lang/en_US.lang b/src/main/resources/assets/twilightforest/lang/en_US.lang index a938e48f5f..c6e1facd4f 100644 --- a/src/main/resources/assets/twilightforest/lang/en_US.lang +++ b/src/main/resources/assets/twilightforest/lang/en_US.lang @@ -43,6 +43,22 @@ tile.TFTrapDoorTime.0.name=Timewood Trapdoor tile.TFTrapDoorTrans.0.name=Transwood Trapdoor tile.TFTrapDoorMine.0.name=Minewood Trapdoor tile.TFTrapDoorSort.0.name=Sortingwood Trapdoor +tile.TFChestTwilight.0.name=Twilight Oak Chest +tile.TFChestCanopy.0.name=Canopy Tree Chest +tile.TFChestMangrove.0.name=Mangrove Chest +tile.TFChestDarkwood.0.name=Darkwood Chest +tile.TFChestTime.0.name=Timewood Chest +tile.TFChestTrans.0.name=Transwood Chest +tile.TFChestMine.0.name=Minewood Chest +tile.TFChestSort.0.name=Sortingwood Chest +tile.TFChestTrapTwilight.0.name=Trapped Twilight Oak Chest +tile.TFChestTrapCanopy.0.name=Trapped Canopy Tree Chest +tile.TFChestTrapMangrove.0.name=Trapped Mangrove Chest +tile.TFChestTrapDarkwood.0.name=Trapped Darkwood Chest +tile.TFChestTrapTime.0.name=Trapped Timewood Chest +tile.TFChestTrapTrans.0.name=Trapped Transwood Chest +tile.TFChestTrapMine.0.name=Trapped Minewood Chest +tile.TFChestTrapSort.0.name=Trapped Sortingwood Chest tile.TFLeaves.0.name=Twilight Oak Leaves tile.TFLeaves.1.name=Canopy Tree Leaves tile.TFLeaves.2.name=Mangrove Leaves @@ -67,9 +83,9 @@ tile.TFBossSpawner.1.name=Lich Spawner tile.TFBossSpawner.2.name=Hydra Spawner tile.TFBossSpawner.3.name=Ur-ghast Spawner tile.TFBossSpawner.4.name=Knight Phantoms Spawner -tile.twilightforest.BossSpawner.5.name=Snow Queen Spawner -tile.twilightforest.BossSpawner.6.name=Minoshroom Spawner -tile.twilightforest.BossSpawner.7.name=Alpha Yeti Spawner +tile.TFBossSpawner.5.name=Snow Queen Spawner +tile.TFBossSpawner.6.name=Minoshroom Spawner +tile.TFBossSpawner.7.name=Alpha Yeti Spawner tile.TFFireflyJar.name=Firefly Jar tile.TFPlant.3.name=Moss Patch tile.TFPlant.4.name=Mayapple @@ -376,6 +392,10 @@ item.trophy.naga.name=Naga Trophy item.trophy.lich.name=Lich Trophy item.trophy.ur-ghast.name=Ur-ghast Trophy item.trophy.snowQueen.name=Snow Queen Trophy +item.trophy.minoshroom.name=Minoshroom Trophy +item.trophy.knightPhantom.name=Knight Phantom Trophy +item.trophy.questingRam.name=Questing Ram Trophy +item.trophy.alphaYeti.name=Alpha Yeti Trophy item.adherentFragment.name=Cloth Of The Adherent item.harbingerFragment.name=Fragment Of The Harbinger item.experiment115.name=Experiment 115 @@ -442,11 +462,14 @@ item.yetiHelm.tooltip=Chills attackers item.yetiPlate.tooltip=Chills attackers item.yetiLegs.tooltip=Chills attackers item.yetiBoots.tooltip=Chills attackers +item.phantomHelm.tooltip=Even the death won't do you part +item.phantomPlate.tooltip=Even the death won't do you part item.wand.tooltip=%n charges left item.fieryBlood.tooltip=Can be poured into Tinkers Construct tanks item.fieryTears.tooltip=Can be poured into Tinkers Construct tanks item.charm.tooltip=Can be equipped into any Baubles slot -item.nagastone.outdatedTooltip=Outdated, place and break to update +item.outdated.tooltip=Outdated, place and break to update +itemBlock.compressed.tooltip=Usable for Beacon bases tooltip.tf.adherent=An Adherent, but to whom? tooltip.tf.harbinger=A Harbinger, but of what? @@ -583,6 +606,7 @@ achievement.twilightProgressCastle=So Castle Very Wow achievement.twilightProgressCastle.desc=What could even be in that castle?!? chat.tf.wrongportalitem=Hm, what do you expect to happen? Try to use %s. +chat.tf.pedestalunworthy=You are unworthy. progressionBook.author=A Forgotten Explorer progressionBook.default.title=Notes on the Unexplained diff --git a/src/main/resources/assets/twilightforest/lang/ru_RU.lang b/src/main/resources/assets/twilightforest/lang/ru_RU.lang index 3122f5eb2c..ac90302557 100644 --- a/src/main/resources/assets/twilightforest/lang/ru_RU.lang +++ b/src/main/resources/assets/twilightforest/lang/ru_RU.lang @@ -43,6 +43,22 @@ tile.TFTrapDoorTime.0.name=Люк из дерева времени tile.TFTrapDoorTrans.0.name=Люк из дерева трансформации tile.TFTrapDoorMine.0.name=Люк из дерева шахтёра tile.TFTrapDoorSort.0.name=Люк из дерева сортировки +tile.TFChestTwilight.0.name=Сундук из сумеречного дуба +tile.TFChestCanopy.0.name=Сундук из сумеречной сосны +tile.TFChestMangrove.0.name=Мангровый сундук +tile.TFChestDarkwood.0.name=Сундук из тёмного дерева +tile.TFChestTime.0.name=Сундук из дерева времени +tile.TFChestTrans.0.name=Сундук из дерева трансформации +tile.TFChestMine.0.name=Сундук из дерева шахтёра +tile.TFChestSort.0.name=Сундук из дерева сортировки +tile.TFChestTrapTwilight.0.name=Сундук-ловушка из сумеречного дуба +tile.TFChestTrapCanopy.0.name=Сундук-ловушка из сумеречной сосны +tile.TFChestTrapMangrove.0.name=Мангровый сундук-ловушка +tile.TFChestTrapDarkwood.0.name=Сундук-ловушка из тёмного дерева +tile.TFChestTrapTime.0.name=Сундук-ловушка из дерева времени +tile.TFChestTrapTrans.0.name=Сундук-ловушка из дерева трансформации +tile.TFChestTrapMine.0.name=Сундук-ловушка из дерева шахтёра +tile.TFChestTrapSort.0.name=Сундук-ловушка из дерева сортировки tile.TFLeaves.0.name=Листва сумеречного дуба tile.TFLeaves.1.name=Листва сумеречной сосны tile.TFLeaves.2.name=Мангровая листва @@ -62,14 +78,14 @@ tile.TFMazestone.8.name=Лабиринтовый потолок tile.TFHedge.0.name=Живая изгородь tile.TFHedge.1.name=Листва тёмного дерева tile.TFHedge.2.name=Живая изгородь -tile.TFBossSpawner.0.name=Спаунер Наги -tile.TFBossSpawner.1.name=Спаунер Лича -tile.TFBossSpawner.2.name=Спаунер Гидры -tile.TFBossSpawner.3.name=Спаунер Тёмного гаста -tile.TFBossSpawner.4.name=Спаунер рыцарей-фантомов -tile.twilightforest.BossSpawner.5.name=Спаунер Снежной королевы -tile.twilightforest.BossSpawner.6.name=Спаунер Грибного кентавра -tile.twilightforest.BossSpawner.7.name=Спаунер Альфа-йети +tile.TFBossSpawner.0.name=Призыватель Наги +tile.TFBossSpawner.1.name=Призыватель Лича +tile.TFBossSpawner.2.name=Призыватель Гидры +tile.TFBossSpawner.3.name=Призыватель Тёмного гаста +tile.TFBossSpawner.4.name=Призыватель рыцарей-фантомов +tile.TFBossSpawner.5.name=Призыватель Снежной королевы +tile.TFBossSpawner.6.name=Призыватель Грибного кентавра +tile.TFBossSpawner.7.name=Призыватель Альфа-йети tile.TFFireflyJar.name=Банка со светлячком tile.TFPlant.3.name=Мшистый покров tile.TFPlant.4.name=Дикая мандрагора @@ -321,6 +337,10 @@ item.trophy.naga.name=Трофей Наги item.trophy.lich.name=Трофей Сумеречного лича item.trophy.ur-ghast.name=Трофей Тёмного гаста item.trophy.snowQueen.name=Трофей Снежной королевы +item.trophy.minoshroom.name=Трофей Грибного кентавра +item.trophy.knightPhantom.name=Трофей Рыцаря-фантома +item.trophy.questingRam.name=Трофей Цветного барана +item.trophy.alphaYeti.name=Трофей Альфа-йети item.adherentFragment.name=Ткань Последователя item.harbingerFragment.name=Фрагмент Предвестинка item.experiment115.name=Эксперимент 115 @@ -386,11 +406,14 @@ item.yetiHelm.tooltip=Остужает атакующих item.yetiPlate.tooltip=Остужает атакующих item.yetiLegs.tooltip=Остужает атакующих item.yetiBoots.tooltip=Остужает атакующих +item.phantomHelm.tooltip=Даже смерть не разлучит вас +item.phantomPlate.tooltip=Даже смерть не разлучит вас item.wand.tooltip=Осталось %n зарядов item.fieryBlood.tooltip=Может быть налита в цистерны Tinkers Construct item.fieryTears.tooltip=Могут быть налиты в цистерны Tinkers Construct item.charm.tooltip=Можно надеть в слот для кольца, амулета или пояса -item.nagastone.outdatedTooltip=Устаревшая версия блока, установите и сломайте чтобы обновить +item.outdated.tooltip=Устаревшая версия блока, установите и сломайте чтобы обновить +itemBlock.compressed.tooltip=Подходит для основы маяка tooltip.tf.adherent=Последователь, но чей? tooltip.tf.harbinger=Предвестник, но чего? @@ -527,6 +550,7 @@ achievement.twilightProgressCastle=§1So castle §cVery wow achievement.twilightProgressCastle.desc=Что же может быть в этом замке?!? chat.tf.wrongportalitem=Хмм, чего это ты ожидал? Попробуй лучше %s. +chat.tf.pedestalunworthy=Ты недостоин. progressionBook.author=Забытый исследователь progressionBook.default.title=Заметки о необъяснимом diff --git a/src/main/resources/assets/twilightforest/sounds.json b/src/main/resources/assets/twilightforest/sounds.json index 99e3187038..ce54687581 100644 --- a/src/main/resources/assets/twilightforest/sounds.json +++ b/src/main/resources/assets/twilightforest/sounds.json @@ -219,6 +219,60 @@ "mob/ice/death0", "mob/ice/death1" ] + }, + "mob.yeti.hurt": { + "category": "hostile", + "sounds": [ + "mob/yeti/hurt1", + "mob/yeti/hurt2", + "mob/yeti/hurt3" + ] + }, + "mob.yeti.death": { + "category": "hostile", + "sounds": [ + "mob/yeti/death" + ] + }, + "mob.yeti.growl": { + "category": "hostile", + "sounds": [ + "mob/yeti/growl1", + "mob/yeti/growl2", + "mob/yeti/growl3" + ] + }, + "mob.yeti.roar": { + "category": "hostile", + "sounds": [ + "mob/yeti/roar" + ] + }, + "mob.yeti.alert": { + "category": "hostile", + "sounds": [ + "mob/yeti/alert" + ] + }, + "mob.yeti.grab": { + "category": "hostile", + "sounds": [ + "mob/yeti/grab" + ] + }, + "mob.yeti.throw": { + "category": "hostile", + "sounds": [ + "mob/yeti/throw" + ] + }, + "mob.yeti.pant": { + "category": "hostile", + "sounds": [ + "mob/yeti/pant1", + "mob/yeti/pant2", + "mob/yeti/pant" + ] }, "random.slider": { "category": "block", diff --git a/src/main/resources/assets/twilightforest/sounds/mob/yeti/alert.ogg b/src/main/resources/assets/twilightforest/sounds/mob/yeti/alert.ogg new file mode 100644 index 0000000000000000000000000000000000000000..73b0410cf289b7bfd28c85be683164ee536231e9 GIT binary patch literal 12194 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 Q>&rC2;qO%%!275CALqIV5dZ)H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/sounds/mob/yeti/death.ogg b/src/main/resources/assets/twilightforest/sounds/mob/yeti/death.ogg new file mode 100644 index 0000000000000000000000000000000000000000..31909af08c5820cff959eec7b137d7674d5b2047 GIT binary patch literal 43874 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/sounds/mob/yeti/grab.ogg b/src/main/resources/assets/twilightforest/sounds/mob/yeti/grab.ogg new file mode 100644 index 0000000000000000000000000000000000000000..9985479e40c8875a964883bdeec812d092cc12fb GIT binary patch literal 12573 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/sounds/mob/yeti/growl1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/yeti/growl1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..20c5d4e6d8621de0bf27571a643d5fba8c694ef0 GIT binary patch literal 28167 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/sounds/mob/yeti/growl2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/yeti/growl2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c1520c1aa95ef4dde1e7bb7306630c0b593cae91 GIT binary patch literal 34212 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 BaB~0v literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/sounds/mob/yeti/growl3.ogg b/src/main/resources/assets/twilightforest/sounds/mob/yeti/growl3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d8e7c2a8c0e96959fa6ab0c03f6b4ceabf3e5184 GIT binary patch literal 36225 zcmag`1yo%z(=ZBeq`14g9o*gB-QC@_h2oUr?(P()IJ8J{cXvv$Vl6HO{zLn`@_+ZP z@9ve8m7PgulCey(11dH)8UQ5lpGV8#UqNZ6&Ip18!rR5&+|J{*3PQ5_KTUif{ubIG zR9<`j_w(BG6>_ZZeupOT^8fdYK>b6+0EX+@x!N+TxZ999+L>$rMNcM2#?H#d&dScp zK}M(IE30e$i9{aSR*r1A_wp+V%P@%D!n%!ejc5eS4RxkDcP8#5MK9sDzf(oqcxo?r0*|hBy8QFg&=s1bL z3zj8lG;^RJb2`goQVuDr^k3;6MmB6s#VoiE{~!lt5Z?^k&TcjfwqivW+*fZpYyVR_ z7Pu6dl1FNbZ?n+HUa-y_kXI7C|GW0%Xovi zA!Pn>Fy>g~W#q{up7AKj1#H8h5|Y?BY59s!RdsyYQqPdTGbaOpFtoo~{9oB$RsN^N zB}q~AqjZhq>|>0tS#{qe|8adEngkLXSc@6Cz*-#Jyr1V$%O~ql+PtXGP@1AH4=Vj< zQDC8xStf|V;Quv}@C^4+P&wEt{*qJmqgtRoZbiAGP z(!JJNKNu~0Z7un4EybGPhX0?6_1~5QfQ=^XuT7?y$FL3Mger@}{}b?kS&kdlP$JPt zB9%e|mC`KZ#096yCFcyLlp3d!2DZ@*w$~hvl?J!b9GBIcmeqo{)k=$%L94%B%YO{! zpV@3JdHpZTc{LFVzPMf4BJVLsZ@`d%m{MBUT61YiTFp*VoK`EE zS{pc83oTY_H~~6oURxYWdf?YZFw|=)&EI6v$tdGLsFbk&qT<$CYT;7z)Kb&3($mz^ z^S08v)zVq?R{%pblvc2{v|6-QuAQ{f{C7OHjC8D4ZngAq0t}Wu?A-Y8;JspATJQox z%@(c9TD`XD?6U0ai#}Cm(N$JfRJJ%(*47vl9aa`qjyBj-)>e-;)K%3w9)qE^pDG&| zD=QhR8mb>F8IM~&Rd&>jHq>X=RvovTBla;Kceqy8)>bu~yh1x_jtAY2J6PYBfyT zBRyQ_EuJ`orP!j%pB?mLU0_0N>w_*tUs#EZ*0{ld+=d!Ne~aN;_$i0ALAOW#-5ams zIwbg^c(86jyy^z#sAwTM17r{{1OP*RfTe*(KS1V*rv8(xM3W7M+(TJ@fG9;(-kv;V zo_>%_Gfr+eCmBQD7L+op4qI5ND(_I3vZ(IxxoqD2l&l0t-i|3{R^Ps2a9%$K-2#pM zpu}=g4!*SM6#zzcP*8#*E?-)Lr6A9wJq}jn;#o1-iV_SBxr$~ms?ri11$nj>ECXk@ zMIvyI5)1=5&>)tE6VqT8~ z+>GPk%(hP;Z&&k5ykY>yAP!7i!-1=8(f$=+;3Tw|Yyj_b_m5FH5rr1G3bkoA*~e9Jy}h^{ZcL zD1cW8kNEa$ZLrq~f&xT?;H?T?UC681ibbeT%Gsg0kMqΠwfsR=6vQgFss2VsO;W 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≥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 U4h{|u4h{|u4h{|u4h{|u4gw2OVE_OC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/sounds/mob/yeti/hurt1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/yeti/hurt1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4e80d4d7ffdc85d6c908f5ad622a39edd974fcb4 GIT binary patch literal 12528 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 lHk1%rT)N0SNqefiyJO=Q9xn@u1g7c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/sounds/mob/yeti/hurt3.ogg b/src/main/resources/assets/twilightforest/sounds/mob/yeti/hurt3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..172daaa76e74edc1b82ce4937e3b9fc075d77187 GIT binary patch literal 12431 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 F{tu>pd6fVF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/sounds/mob/yeti/pant1.ogg b/src/main/resources/assets/twilightforest/sounds/mob/yeti/pant1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b237634c524e09cfb44f7cf684f54c161879f735 GIT binary patch literal 10560 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/sounds/mob/yeti/pant2.ogg b/src/main/resources/assets/twilightforest/sounds/mob/yeti/pant2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..35a33ef314cc1dcf3ba75ea9b4e07077ab517ec5 GIT binary patch literal 15430 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 D=^Q$f literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/sounds/mob/yeti/pant3.ogg b/src/main/resources/assets/twilightforest/sounds/mob/yeti/pant3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a3724a0a4f8cc5f8a5350aa6c3ba930fc583df22 GIT binary patch literal 9717 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

iKIDj&SAk7pnK2&5N{+n1+K`4q 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

pQ#)+>V1Xf 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 fJ^p+ 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 RWfU|yh|BSGJ+wG{-Jce)IWPbK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/mining.png b/src/main/resources/assets/twilightforest/textures/model/chest/mining.png new file mode 100644 index 0000000000000000000000000000000000000000..9cbeed2b7a258b0392608200618f2076a6f54b4a GIT binary patch literal 5143 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 kc;!N~! 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/normal.xcf b/src/main/resources/assets/twilightforest/textures/model/chest/normal.xcf new file mode 100644 index 0000000000000000000000000000000000000000..90853955594743c6c66658f44d3e48f5c57dfc0c GIT binary patch literal 40623 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/sort_double.png b/src/main/resources/assets/twilightforest/textures/model/chest/sort_double.png new file mode 100644 index 0000000000000000000000000000000000000000..794afefde0bc50f45ab103b40574de036919baae GIT binary patch literal 5333 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 EKZjnDL;wH) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/time_double.png b/src/main/resources/assets/twilightforest/textures/model/chest/time_double.png new file mode 100644 index 0000000000000000000000000000000000000000..76c4e3b51a05577a6d41c7b438214f180702d9ab GIT binary patch literal 5750 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 XEcTA8W>)ae2g2LK&%JPI*p`0*-FDv0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/trans.png b/src/main/resources/assets/twilightforest/textures/model/chest/trans.png new file mode 100644 index 0000000000000000000000000000000000000000..88ac50d6c64a02ad06743093113e793ef3bf2170 GIT binary patch literal 5214 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/twilight_double.png b/src/main/resources/assets/twilightforest/textures/model/chest/twilight_double.png new file mode 100644 index 0000000000000000000000000000000000000000..11f201c76d04e75a002862e933688fc32689b56d GIT binary patch literal 5523 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

|0*yg@ zp$rd4eM}amni!w5bwd3IA5K#SUyT^h?}H2+UEm}{eIA7$`BDv?|Kss-AO4RkfY3h{ z`7VBc(Dj3^?_%J)jDJ+u54ygKf$uW@QCh0~>8boc3f>T``3Yvz`mLV=P1FPdvW zM90${pY7&%4KF7K_U6}aoXFf(m`Yza0kcVX3H5bc1TVFn3%7K)zLqY`a?hTbh03zI zW@qbdYP-+#@B`}|Mmrjl)D~LW5*=qdXknWM-V8dI+ifX0`$Xpf)-=bV)N$<1;O&ho z-c>#ieNVoCjGb%`nGThSs5G=MEv=^8P|Pr`=gdt|IXKKty|AwCz?mPFThT3hCF&|JWJ!(+~cNias2zI583^4 z^v$q)iUw|$!h=9pXjgSVGq^ga>D_+JiL(=z+vj#VfU!_xUSXzo%vh^>*U)RoiL^WE zXN~QxJkmRbngwkIf6m8lUTgFhjlb<&A`#US&L}t5m zH0znIQ_`LmZ3xLmp;EMi(t=$>Dvz#dy@bz^Gp&A5JUwro3Np>*ZU z;WIPqDp!YgJp8*x+^d$u&5#+~IC2_2bH=Sd@<|e9_Ld3m_$-qv2^;42`xL`y`N+iw z|7_;A^L9&z@T^ZN{ue!$F7Yk6H+OKn0Ygk~!mwY6hVq=qZ| zI*7@0(t2iVtu)=?=efORvw9VJ;{Lyi7}7JL*66qw@QP{O(v_K1i}c%gENT@ohTu;-$Nqyz36ZX^Y=|JonP|Bee_SwM-wG z<1apn#$LE`EF|g7Hl^PAzNb&Ldz<9wK9CJv1WcTvq?EVU^@6QkcElqHScUooSu zD$w&Obc5KX=6&(2@S5w6y?NFKmLjlwP-X4M9u`h3vhlChre~bqk(D3i_QyiDd3XJA z!d;)}$v5pLYVy7fp|RJ!YoBY>QCH}?o!gVu;v2VA(1+R?4_&Oz(hbqEVJ+Fq5APAe zYMbH42Qro@(&rx3UbhumcYyz!!grZr>z)`vb$<(2cXjE{#+R439@IVnTi=4?9weIT z7urN%3QSV0){Rg29MPVL5I=jpu+zKu!cjB(bS=#j#mfmUCJm<=*;k>DGjm-h!^fj# zO{Z>81i3|YLLTtzS0uhLM@7?C5og%@Ok2V|xpt}l{d1G`&4ud)q2_-#dZRN8^Dad# zTD#ykL*IFUWjVvodzuU4o6cV6kA=W&UTh6A*|>4$oGbP|sV}kAz_(6q1+ksKqi&B< zf{QCI-(->8*Fi@2q;BcA6uHy5p?y46)W_;DH6dQ%3471I)4HkM=> z>*~=l zmkTpbR6R+J^^i3C`caB2e$E;@zojw9==Re{1<kKM&fv2giN=LnU#N(dlY8tPN+T?LlmSrAuSY2LaWC+CYcdyaCQQr_zkxO6AIv2Mx zLUBbIbAUK-B9rTsw^ZQ#Ye;>0fr9{dGlBDedsjQSsx>uMv7rl0zLI8qnip5ZD2W zLm`1>Rdxrrzqm8gB4ZnnFuJevhIuFa#G0tto0WSEYReL+>pixFOOx&mZe!?qAD7G zt2$&qE&r5vcK>rx2g8C>BU1EH{D#jLC{71RDu?wA-;WqWmxgINwmlXtFzt;zW#DqQ ydwj!|p1d2WH`id^y{0M*jV({wPZ-oCs@-@{RdT6gr8fAL3-NMaPOEYYOZhk0aCa5} literal 0 HcmV?d00001

NJ~d*GFUVAPaAYa4*r0E-AOn57u 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 OzyJUM007Y3P{jtXEBCzs literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/sounds/mob/yeti/throw.ogg b/src/main/resources/assets/twilightforest/sounds/mob/yeti/throw.ogg new file mode 100644 index 0000000000000000000000000000000000000000..50f6e96409d58581b80d23641c328217d59239af GIT binary patch literal 13152 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/textures/blocks/fiery_block_inner.png b/src/main/resources/assets/twilightforest/textures/blocks/fiery_block_inner.png new file mode 100644 index 0000000000000000000000000000000000000000..f4a333d34ce4e76011be1f105a9317efcafc3343 GIT binary patch literal 4476 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/textures/blocks/fiery_block_inner_cross.png b/src/main/resources/assets/twilightforest/textures/blocks/fiery_block_inner_cross.png new file mode 100644 index 0000000000000000000000000000000000000000..a8bce7f9e930d12277f6d1d3e74669f1b7186e5f GIT binary patch literal 933 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 Z{2x)G+0QH7z#9Mn002ovPDHLkV1n+khQR;; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/textures/blocks/fiery_pattern.png b/src/main/resources/assets/twilightforest/textures/blocks/fiery_pattern.png new file mode 100644 index 0000000000000000000000000000000000000000..78a8dcebd74bdf127ccbc88e24a98b30f34a733a GIT binary patch literal 4629 zcmeHKdsGu=79V-W2tKN=sGuPzqBxn!gD{yT3KAY!jHEyn>T@zPfsrH=lYs=SmBOw? zXcdd@E{cy@+hrw|g1gnqX@&Yg?NO;{eRVNf>x&lTpsro3?l%DuPJ7NC&)NP*&Pisz z``!Dy_x`?n@5#4LKQAdzI6(+OP@pzhlLnq6`LDna{7&wEMu11-%8X1djc|ypHrB|P zXc1RnrA4%pF+z~@vRS`yxOb@F=UZdcUS9Ri;QhH3Z9AKh(km|Wv=zaV#*fOWz2$8Q z+2k{Y{U~8{-{YZ`xDyhP3|i%pY>! zKYo8d5>{IFShIL?YxUf)k0N$6`tKH2AN{m_+{3kzGlz4pENp(dF8XTQ#wQ`+%d3L6 zRYv)_-}E_f(A{)y;@hWPr)96F&%AMU`@F`9-)zkqA>AHV3_(MRnfQ3UHa`A&E+B)d z)f?5xhhu|}E=~VXJl0oUf>G7;^6SLwKP*l7M1NVh7ys*`|M=#4BkS(E zue)lBYea%K3$fp0(+?)EdzK=E4KY|pbHl0)4UWPVm-N)#b>3SnTPvwKC&$g--4al|I?64xBL zb)+JEarvW-?WN6Z)mM^XG3g3>rOL1|bB3et>`|9t`H|Kmqh4#BzV!Gim#yu(>-=5U z>eQ!ST3=my+P3Xx(0iF0A(O1vCykA|SaNnxg&{Ql@zBZ7s@qd5QbHGueJ8m4Vxixq z2gT2tIxTzCOea%>(+b7+uCAH|sqQYneh}<{|{`ogYBp89|k3t&w$d()Xl|7)+`|?)<8>~W-F*U2#T5Qv=U@4 z&4~^tVP6Q z5(YMpQ;Wr5U-UdavsI_-gSXgwSpa+>PQr>vB`9JxBmFJxTtYqo=?&;tE$kVfLy2$b;CG+_3v>LUT_m5L7$xyiG)j(r%3YDs0 zGFpzp3MCZ{6AC3*l2THtQc7uAG|>-AYq4{Lg`{~X04`wwj#6q+8E7R9M=L0*7lI(9 zaI{Q@(h8$WVU$PpgGjY8pehMd|EPE<3P44xD7k@*lEG3HM#2h8rh-*6sSH+-20F@! zVoC~AdY~v0Ph@Ro0vsn}CbDV7YRUF&@Py-WdaYV4lb|modK1AJfdS|N#zL_U`-`m% z#!RPk1ka~58db?vm=aYgWvEPny-=D@+w7ngc~mJXk@p0_9}EuC0n`$Fr2+tt1;_@E zx6uU0+A>(yq!#l*iFnJtZ5?PRir@$h!O;K|IKxpnj>-PuXDP;5 z@V~VA_7TPO9C|Wi2mT8@qMn{gr&si>dX^@}(@Y|fr!8=T>`B2+}uD5CeMrVrG2!>jPxdp@Dt;CwlT;r_=xc+^cyk2u15w& z7np=d-zem&& zF2Vn{x7SEa65v~*2UqE%T1{LA_LaFJuIyaw$Uhw#KO=W4a=(>w9f?);gzYQ8&PGYZn?3A0)Y1vjRi zLqxT)k;mJhK>d&ng@L(G?M3aOi6w1~yUI7;X(zt^>Fo#V?(5X|qbKh4W(5Ye}Bw+n~Me3eYa4#A4|XM5itlVN_KJ@#<4kB<-Gtdo)>lu6G`I@7YNdO^ zQ+yQry;{6NcPu$lnbqwZ+oUS-m+QwY%JsQYD;U=)!ma=MVOQ$MWkEr)!Z3z4rHF6b z5)}Ae3q4nR?MimZVUt@S2yj14Z23{pl^otMX7{eT?e(AD_-tDp(j*PKnCEk$;>6IV z2d-mXhXrahvvWgg%RkGfO%DI0y)i_vcm#3!-OPxU?y1&crxr&1``(kX6J0msZd;lH zkA-y`avOp>(=}1=z7{cY*k-{2??;3&f8T+qs%4w&XD!}x!n<>5SB`5%6S#RtSgT&y ochB7A|MM~^>)Xnl_@`cr(i`@D(-Bz%&KS}r%+q{4XIasI0d1D8^8f$< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/textures/gui/mapicons.png b/src/main/resources/assets/twilightforest/textures/gui/mapicons.png index 8cffc74e7f201f2e241680677573aa7c9c1851d8..bad28d60cd4f95cdd938c7dbf41e389b1f0b77c3 100644 GIT binary patch literal 5351 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 e-uzOX_odw%uZ}z0sh{Lc_p5)YyS;0Sr~x; delta 1217 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/textures/items/chainBlockRing.png b/src/main/resources/assets/twilightforest/textures/items/chainBlockRing.png new file mode 100644 index 0000000000000000000000000000000000000000..33f09f796983b3fce0ad8f40aa71629ee5deb13c GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?b1=7YwM!r7Y5c1*onR9_c z%q2m7!9e;~*^zrd%GA@vF{C0cSwUXIF;h*Ibp=Dn3D#2yg@r*(#xXsy3yhldd=ieT o>75g3+t97(V!e1HLkAPX)sw6(bLIwm0S#dAboFyt=akR{0RICjssI20 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/textures/items/knightPhantomTrophy.png b/src/main/resources/assets/twilightforest/textures/items/knightPhantomTrophy.png new file mode 100644 index 0000000000000000000000000000000000000000..a6203c28edaef652a335426d21adc0817aa3ad03 GIT binary patch literal 4491 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 delta 136 zcmdm{ID>J5L_G^L0|Ud`yN`l^6n}tEh%1mbHZt<{@rIBOzt5Zt6k;w3@(Tvizsio> z15&1*E{-7;amfnu8jhK2s;ny*LQb%rN+>K0Vls~DiCtjSr00`xR88-kK--3HMHlPE e8yPy77_OdVZJ9GS&ncS6 diff --git a/src/main/resources/assets/twilightforest/textures/items/minoshroomTrophy.png b/src/main/resources/assets/twilightforest/textures/items/minoshroomTrophy.png new file mode 100644 index 0000000000000000000000000000000000000000..29662700ce23903cba23ac5b7f0bf657f463f884 GIT binary patch literal 4430 zcmeHKeNYtV8DFpjL`D zHKui6%1mbiy%&DQXyC}ppG92z#r&vG$~HP$ZuPAz>Y8y!zsA^gxa^z8kB>h0 zM!2>+EuX6GgW_hb{auCo)q8s!Nt>rA&pT&5{kO3CdTUNzOy{ayRS*=imNghMOa{YH zEFglNrPaE$Q%N%$U(ZUuSegHFY~i_#UHA4#s{UA+d?=$WvX0pCT3?v?`L|-Hr#2kv z>^y6|($JWf6P}}wegYNxJeflEw5Qu+mz)lGzTV>h?w9^<=nr|!2iIaISuS9gHXPgW z#lgzbgVE6`(QD$Wcl;?{u`w@Db?}Ye-jeCJ@~(G%KhyB*272YWTO=vbMI4K9#qN;pFDLbywnu$l{Y1IW`m?~oyY`wt-9+SH#*u++S~g3Az!EWeOpt+hoI(sEU2wq^KS@>b4f{>vog|v z%L9rIf)W-6JS62{1lY>hS+`Eoef*>ZW@()yM`cFM9s^Urrj>Y^tdevKRpOwuv}9po zWI})d04_!#;egBO=81q#62v9ISQN`7a8N~X=p?!34A{VV8CWS*N>L;^!1^#rVkDg4 zrENr}F=Y?}%yg0hLGTbVncwf1`V~^nYnREjTCEJlWEh434TLXt3uFLs^Rq>W0SqI< zQ(o31u$&tfF-a>|Baw#fvxn!d)cp=#bKn5N9 zK?~jjT2z+F@LZ9XVv>D~TbMl>f~JP;Jw;w;FdUkaF;2z>RC%zge9V@qCUeHHg-C&& zb$NnTfb21v0&5!~Ym9H=N-&(!jsWvv+%eiiu?Llbmf1`gIjTr>&t%j|#Qh1Hqga{< z4k=8-pri&vXpM?Olq8BGR;AnqMx+L(DNI3WY@?t|ZeAeW6eB_ba48FLYzmyxShZRN zM^#otNi!5ek`#rgR91@8Dp4znQ==djds$GGq;s@aA`}gv=mA6c@nE+$JLMLy*k6vt78N-4+GN=%N8C}lHV9@L_UDo3RXb#O&Y3<1Ic)RJPQ z0)U_#L_-+73@LD43&%Ni645DGv>aYGgNC9>fi#i=13*zsNuU^ksVv~FzzG%p5~?B4 zQTiOs+KT^|w%9&!!a&l~SRU+O925=oR2EY>FdLXU*K<^fQKpcpbpnU+B164_v|GV#P1iZ(&^UwkA4 z6-FH~z-~YWjxKN#%7%}^LB4>mKjv>R4?pG>Fg&rzxcHr*Yl5zEF)%LWiRzl5Yg`PB zOL?NY{%>?ej$Eb~H~0tS2Un$D{a1D1n)QtJl~iN!!Ua7x94`Z-$)2=49)hOCh))Rg z&dxX>3>Qr1TC0atd}IG*WaJ9^6l99+WIB?(#xNlLF$oj4=!K+&57^2=Js?Sc{{%E z#0$_)etP*SbWY_S(}gRaex)tvpLHNt+a}j*%eQ)S!!|X2bpGt@g7cGSrL|l(tS&A; z?07YHj%iVAQ5=g71E>dSoPB;E}QU2=x0K~If&;S4c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/textures/items/questingRamTrophy.png b/src/main/resources/assets/twilightforest/textures/items/questingRamTrophy.png new file mode 100644 index 0000000000000000000000000000000000000000..1828ce902d2412aec0607d84ae99eee9617fbe1c GIT binary patch literal 4545 zcmeHKdr%YS7GIz|eGF9;YN;;4XX_@LWb>2=n1JMBFoP+A+RA2k6ISygS&{%gDq?wx z7i<+@Eoxh>mSTG=T4@!p^@4339|*KsD%Zypr{$v6Dpl0`ZFo;RbH|z6|Hw?T-=4?s zJLh-K`6geHHfjEtph-ax1dUNAsFJ}mnEeL$f!`^2pW@(ApQB4>?YhMHPxH$$f)BP+^U@0MG9@++n; zMyf;5gw647g?W45ogAAqC2+x~mzws)rszw4`EX0+yIJ{hfpwp(dj4WAR(tru)O)`r z7DnCvF5|W$e@Os8+ecaT=tvb--O4lhf22Kv?d&*qf8pz$Ik~m2%8qmrJ-2L?*W~F% zkJQJ~YGV(rON;$D!r=eAYhTelzvj?1zxdAmX%OU#S>T*TGshIH7 z%NNC6C{CXflG&);^~)Yk+55$DhqRZ2s^yi-9{Oq~RfL4jKY6&ly+Pl6@^so_|HZMv zJy538mduood%87b$yaXM51U*MCcC8r9 zRaG^4G|4eKaCSsdh^le_-n^G*tLWwge)$KFj~1-GbZ1}Vw9N;-aw6DEg zxAY%U#m(uy*J8R#%xg=1R@cQG#IIa!sBM#b^_;7JyX8*n_WB=Y+}c<+QRe;Tk#!|M zmrd{T+BzquTfKGknerZNgZ_DU^j_=NJ|~x^r=RVt{&G{3Kb-g)auxC~s8$bJC!N{WH? zl##Y5I9+uoI515rIEzIZRAW<88FWI9om!NWq$6@x5;Bq#JvS)IEe8N*ios#G*<^9Z z-3pEeR}R*!n8$%VCd^6&Csm_`l~y|iV_b}jB5`ioDd5Zvf}`xDL7uFN?}Gqu3Qh*Y z*yKE(%jM#_gj}oL$m7doG9D`62?PkRKpfc?26rPCMS(wP75F|0+Z_BcqJn4`Gk1|naVCn$7@`r6XU#-y&c(4>0X|v7a1;`#|$cAFF^?rB_;GjAQswb(3QApXjCi|3817BnS{Uy3ZO^xypi5wkbZzX9%_W!bG z#|Mt;EqVg&0Q+ZqM7=Y$h|27J>wPuRo?(Jv&sfNDqBjKx?xaXhoB*p=MP%R>BL&Wn zzJ~3W(|^(o6ebXmB9Ragi7^tvaFj&!VzCgxFjOocg_w+>ddV9=cUTRK3%66TM!+NB z3N)yPD|lvKsb&q2#+5;_bpVthr~nzHOv>T)CCg(^jQ(t+cz@s{%40C(hyi}RGH`T( zlaM!X6!!52V*M*WeRcRNw}9c1O`eJ05xPd`dL{;*$#|r@M(BDb2A;`yq`UrabOjAw zrYH;e2jl`*rLV%Nx!{`Rr%#-(ff=p`p&ET2z{EcgsLG&5o;Qxr34`ztfO z3-(831mw*O-;<$Uk(1>YWPtMS^>;tbF76<>?Ed-M2j|6Tj)hSG<+>#|Oz zYLqJHi-3sWdGP@+sO{r#{mM}bA|uD&`|WT`t*N#qEaOpq=N*1P>A4#1?6+j!Z@PZJ zJFI=1X}5lNs;}+e_dgRx)h(!rZfv;_HYLZmspm$-jvI_?*G~F#p{|NNHAJ-_@6|M2$bMq{1tKMDMN z)wbkW{`GBVC*)q)(fH2TaYgI5&&o+$A6;1zuYpdX3GX#+`B%q{nH_!y4pfzJiYr__ z4-YU8Ue}yspFDVAJ0qA F`!A}#f~x=k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/textures/items/trophyTemplate.xcf b/src/main/resources/assets/twilightforest/textures/items/trophyTemplate.xcf new file mode 100644 index 0000000000000000000000000000000000000000..11403156f6dfc862ca90508742da78385c2a8e92 GIT binary patch literal 7707 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/canopy.png b/src/main/resources/assets/twilightforest/textures/model/chest/canopy.png new file mode 100644 index 0000000000000000000000000000000000000000..73870e9a2d1db79af05d281dece5110b0660ef40 GIT binary patch literal 5226 zcmeHKc~leU79T)C*|n%Bf-zVGC1kQe5)+gqK+w>LsGtZ;k_n8Gg(Q$bv8YfLTa};0DN|mR3bH3W#W{qD3l#f`ZHY5)kpU=e*-Num3q`GRyt${oQ+i_ulVh z()mID7N!$SAqcYI2KWYp`z+mWgfX}t#NzIPTXj-Ms45syh-5szf=8Lp7Kf zf;5d1ev?Hd&iqYu#zyFbk$B=3{sBAH8;9HJTlP5tmPH1EqeU*+%dU*t zG;Q02i5phCGdMd~lOw#7Yu6Od3Lv>I-rvyoLo##tuT)JfC%}VvxX1hD$h}sRCshd@ zR~4V($4_>eK4n}?cVX6{%(ih_hiCk6k!#wY6XtlfkDp!fvU@n!>Cg4lEJl+dYu7NT zTy$)sAC+3-1Rw2nqF*YTVLxJ~w|kg2Z@IP@f(+6yA0Ix~$LB*rAdTGRo7n-CvnEzY z)@N`IS|(V>UE&X~aGUmf=)uroX8Q`S9ZbEvFY?;n$=tX&n{YGB?_3wyhv&w}%f}3> zu(FOenaUaG@;rsRo3q~J;#-aSSzM2$b@u#%?3K3pOEWhIRaJ+7H~;B!4&-GXWw@tm z4tqz~uNRcb&6O8#opHX}>Dklzc%iA2Q8GSm{gc(4vtFz-*pu9z^vc7oE>*2nTaA}& zdbPRjSgkB~wxt=15-Y0jszL-uZ&WMB6(8F@`l_|R&HSH|C$}EEkhrdRQDJd6`?Z6JX~x{k|JXJgyxT%hcB{ddgpnfT|4q#it&+>jb++lk36|DRmr7M@F|P%a5Xj2 z>eL;B)p@GRn)=Z5Y5iUbjH~|`s zN!j>kXUgz6OvJ`7r14;$+y{-p0+JNyyriHIVbU@oLxi8{Y0A^ zQpuS_qFSwXQ&ZezifAHLYQk)JG z5y;|IY&;&U<37YEk@I+i@KWUf3xE%z29XmeCSkiD)b;0jf&imGp^Ae=d(dXrZGZ8k5NNR)FkJ zG*y`RBUzusrd!dcGc*ujK8X8?_J`c{%0P?9WBSU3@w)K1zHGeCKT{+VVj`ygk>mlB zDDGr2K`f?F2voWVCNQWZ8i7P(&_#3#1Eso)hd^DXOfNo{jVHUoA0_-)L?s3W zUr?=smxFAWJ_;03$rK?nSu7i`3ks*R99-ssff6Aq#1~Pa02C%unJ_r%A!G`Z zL}HTZ(_s%LJVak6!o-RHOItTSI97kr1284tu z8cK7A#r+i=L|4khDm9`&y`lk+fGg0TdaiKJ1Eq5LG#Ygbs;dK_i~xgkkTM3IIFKw+ zw_|+BmPPy;8r-m7l`%WJO=9UZ@R$YzBu_Te!tN5g|5$H z;Iov!bk`TUK8u0RQvT9i|2Mi!KYmQ1Qt%H*4L+6FRqj86&n#oXY=2*f22ml3IhHWmLNtx-VOM2M?zYRh z&N;pnso}S6*IsD&!N+nsUuBoEGocN6f3tVt%kz~|wv97v(`GzpzeR{&rTLveg3}g< zn9ExTwPR_~H)_<}7k_NN|8vjsH?I_i{>krSk`|xW`lXK2Cgu7hUX65`N;eD`M{b=M z=pw&TQBe`tcCGPUNZ|atzoigsZdXiqY)u>o)j&0L=R(V^sBv8Ev+B6;JGHkeY&-f` zOTK#W7voCxF#qtBlMv)QHV-Wry|yzxbBBGT_UT;P0}m5NK@#fq8^18N%QJU)*PsoL zI&b+E?dsAh0ji&^(^nCf7uOudI~NxCWsZkyHW#$@WQ)qSi8Eg37*?<9RAq|W9QN(y zuaUjFxU_siL9j{o!9K6fnF(1!-K&)&2$uW<@ zCh>0>-F}<*G$b$wuX);7huM`h?ZDmy=9qymsemSiU*3##uroPnMBN({#z6NRdqTI5oz~f!|}ntwh%fRQbz^9_SjSW)t#~wt4F=Yoj;hD)1)wDw`*naD$kCH zcPBL3{VQI3%f@V&vN}1D-38@q{jG&_uQH ze{A+Fzy6+>X8(Ld+T1DWu8JqYgxwozraY?N{@AQY>G&e@T}#xgzaQoAO(z*-O`@h9 Un6b4JY#9)j6XbiuJ8IQ`0X#lA_yA zx=|ErB2*~Ssa@DzrFQA2T)LibQ0Y1QIp^tl&i=1?)|$1}`~BYE`@X;L{l1yC*4t~g zp3Wp42!ixD9PuJ|OP8LQ{H!m|njk99TBEGS%B;9Y6wzG6S%l|b6i}$R0QhS8NZ3`QSD@06V#IK zc1SuPG-Y!Z1)*Kfz|vl)#;lky0a#^P>&I zFcxm(tzIQ^_PDLb)P0PJei6~DZ?I$G{vF8^b}!$y$?HN*V8X&@@otdws9^Q{3-j37 ziyNxsE8DB0|Gy=$uv+gM%bys%kw>BhcI zPfyfKcFxt;Wl@FvmhKC1$nonnvhl?y_Kdx1Fxzlp!AjH46IF_J#Y>8cd)WQDE+a+L zt0Q+5cm!*6_F`wbPcia?P3IK4r>~`T)v-TJ%b4j#$PP3j$!vCO8f8Afd``X7zN6-e z72V1Z6T3|Ko;T`o`^Y7Ft)CoEb=}auo2YrDB;(u-jYp0g30iV-45>^nFff{?7+uz; zwmJ{Jw9)v|d|%67l6$G|_OnQ+?wg|1l_z^6-a-7|3p*y?y=yRmxS;1uU3qGI<;S@F z?RQ3(bji+N+<0RT=)5Qa=rDiJc}$)}M1c8{5QGpTl7iNQAlA$nDa>1epx6*3Odw|C zUX-81VFi3Pj%({l@|3zD;R26X8R8r3<;RO%!DH}oGaYqUF-$-pLQohRBNB?`%osLq zfR_pGRc0a%I{-mfuyOvL-dGoj48hU}Gy)0l79)tF;2d?ZEEzwP>Er4?L;;@IxNsDe zGKs|K=x9PTl^~IY5y=b&gGizfDHJ?F;N=Q23di8Z@@XoHK@L|$&XWnGs6ZmdsyN{g zNhHd~;lMcdOMW7$r{`CCv3y7cpa(GqmJ-PX5>X@~4)>6wZc%__D51agko$p!O7ubG zl1Ld3af?F4=(OP!eBM`oX{1azP!69*M1+V4K;eT-i8Pd?sJQ6Y!Y>w^TZn z#0aI*@d%A%tC-V_J zAEuM>G&&^&&#(m)_9Qw&C6oAkI}&3U#eA6nbR{eto|TG<52z>%5{*QmQSi2KC<( zG!!_1H6Rf4CDHP4Lw*7g;)}v6J;`)3#nzr~PqC-k+mcA+Z=gkpOb&Wc#Y!d-sCEM* zs)=EOa)7k3s#5{MfE`rBbde!2Dv|j~BtkY$l@wOx`E}S6EGRyV!mcoi08&shlLQWX zKMEP>$)woLAkmqmVR#8&5UTiJXw~w;vIZyJLm&t76$7ThHRX#$3_cA$3Izj;35y+A z7EG8oSb`jmLihuD017Dvd#>A|xsv0ZQU&wqzO}hIuqR z54I&Ep$tBm!9%`hmrFv?Xjq0ghXEadR-i!#w8B~rO_kO6_~>v%H4i{CJP90MC9}s7 zhl(Ytc8o98vWWko2WtQ@Y>NSYgEp{rft`@}bt@dwOSS3zgP);!_y;2Z>YqV=NZ+4w z{gms66!;akc3LHgCIQ>{*NkPnO)l;i1!d90zOPceQwVY?p$jeNv$b@q$7-4)Q7 z@xayK6QyNWneB4ztCTS(78NT^dX9P2tIskvC}qD?4^(XJ$hLo}xuzahl$PdXlM+7e zc!s&jb*DJ5fq?~y5$kU9) zM&)pJ&GGZm7umE7vQ-z@{#1 z)b3-eXYF@3Y?@wkLvgCoaC><0uAD-ji>sE7TfNn8heVPh0~s9lzG5HC-eeV@T{pfi zA|o?8`@{L(?zyg+;ZlNuTk)~BaeeYXGJIky89|h!k$c)KOV^qjb|<&VjGtbM_S9Q{ z?0|9bxN55c=5GfttKC-a>4awIJXdcpGqSMO>*zmsW@T{m!<^pRW0Jdj%ny1lizcXV zZxT*U$^FAUW0+$?OGly2X!A{Z67-4CBtGD@LeRoa%@=3m!gR$J4en4s> z3>fFPuj$Y`r`%VE3m{YdR)-g^W5cuNahDRuTivuVs>zg`Vm18L`}F0~j_3uZ;cEFY zXPp-vR}T@sb+U+_dUdp@r>57SxxWurhF^UxWbMCJ1}%(T`pasr)lI_Yf+zM_596DE z%XM_)Pi5&8lMcKw^StJtsZbAN&8SIl!i1UR+gGI?+@HK>=nIMnyG5y0xp#F ze*QUSFiF{OcEa3`|DwfOZ8TKtyQ{Xluut+2b_m<3FZ&vUlY+h=jNp&scvT|N2Uy}ENpUfGONgGNAHF1HVjx>M<=m4e3E zZ*$*cf~}ahpy#yHq&3IlhV)uKLPsu65aV-1;v3lIg*1n1^i+SJJZP zK0c&FpIX^65=w*DJnxVsMSgzQc-6ar15eq-|3GoZpDo`;rykC>snvp@2u6y{=9_{M zqyw^!{6-;VY@9=9V}j+?+()+p&W7NXtemr-96OyKIkGxW25_n+N17OSmR?>lb9AUe z7Ti(Ka^@*==d0hGzIPkxw&wF9+Z91Y;e4n@xP8RYcd~7->~hTF0(~c8*;%ClRXxq= z?wZ~U$Rm=P8_@%^cI6o_G{%(PQ5g?!?U(K zXv3)B^Ny9GXT{)7sgqUd#E*M)YDsa=zf>WilWFbowB_1`)o0L!C8C$@zgAo+O^bj1 zP`!H7W#+OiyPVdPJgL$z;xUr9bSLgje3Rfmm)qvJp~Gy&g=6Gxn~PpYE?Cw%P07uh zc@`g9_f~JxlkU8PiTCfhtzn*tES;Y-IPPRPdt-dNeM2_6{_$Vo`>x-L-1_qNmZK|P zGxIbYwc;k!mlWEjPjASSnzQ;GUCvFNmOec#*Z_BNRV|bGz^Fc4O}O>wy4PnPmsc7a zC-&H{BzUpWauffXbuSyWUbN42F$}79cz*ZKO5evhR`<`1gXr7uYgELIx)XM=z?a_Q zUefyLX?_JUaccYnRAWMhpOxTAFE21qEC0T*>#qrBAPV$P2tXV+FV`cpf>ZttEs(Ie literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/darkwood.png b/src/main/resources/assets/twilightforest/textures/model/chest/darkwood.png new file mode 100644 index 0000000000000000000000000000000000000000..0a9ab920efd0e55860322ad1db1774d28e063dcc GIT binary patch literal 5020 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 HkeKrq(<5fW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/darkwood_double.png b/src/main/resources/assets/twilightforest/textures/model/chest/darkwood_double.png new file mode 100644 index 0000000000000000000000000000000000000000..1807938c78c131ff57f2c04bb64d2011298134dc GIT binary patch literal 5411 zcmeHLX;c$g7Ot=hh#RyVl{N&mMM+ZG$TEaQ7Ks|60RV_CkdTB;QBky2#JvFp zL~MmYXu*Y`>?k0jA}WpAQCt8;S~1<&f`H4s1XP^qGjlv=`ky&fc~$q_`@MU=d*3~I z+3vY?;dsMoh7bge=eWCgfiV%>js|+*`{u0;8^CaJjgOz)3yH-_q~Z`^1d5f%OHeEt zCk%n0IHkyQrAZyuc(}znM#ufaGe!w|GxB6-i{k-hK^kmnVzOB|@G{R=f9>q?){T>o zYL|pPO2$@fXWjXSh263L3*{RGWA+VL5!T5louAN}w0DxUBm2(ww}?Ci;LcK#3%h$Cy=UbcIk zY>9V5#P2w>;>4ML z_Mnlou4r~$bjDHl;BlN|*adDDWh{)vQZWQAH+CBLL?DjqDVv>Yax@n#sH8}hyKz+ z<^wh=(F>J{qosV*H3p58TaASf@ITs1qNNd8iG*ALQ%S|j5At0SX5fX|LC6S?;2{qv?Cr=I= zM<&3ZB%Tq7JOmhkJs^w}h+}1+rhJ4V)LV|I`6SUvWEz7(rje;MIt-5lu0dRmN@buH z)u<$xK(W=Bs}sWl;Q(q8b)^CTjT}V7a+acqTrBkwizC=LH3U{|`Ei;HHk1I7BQA&> z1)wmQ%7Veg@F9~}G&+j{&xh$Oc#OVSAPkBBU)t*JgS8t;y1P&Y){obSM)s698a47Z z@){x3Y$hyLvn^N%eEqrno@9pgi^cEtbS!%m|xro{le5gBM*pc4{5w!%@q)J^Aa{EX(|Z(IRD ze_iB@`29-PSGvB4fiF`2T3ui1`XUCtNcn4Z{om*^{B)Q?Bf&4ASa4K&P~~j{j#+xV z#S2{^8bpOC#&Aw6kc^YK`^zB6q)vTf8pZhnAk>$0xUTw7bqq|HSY{I29D;PNa$KBz z;*`AsHQ}A^rtd2A%{LnEw8SP&nCvweY704^e%O;Lx~ka@g&=Uy$ef!D&oG(f zIw`NU2Qqs-G$@@CM^M)D%CsQ4<-o85Q9H{rD>E~*xvoz8Vkha_nKLoa*|TRehlhtR zPyaR$1|X#yv_s78_9{9R*Q>)X?>F3&zA}0zzlptA*Ij>$tg^Z~ub1`Eq%P?FwKJT2 z$cJhrjLpg-ZK2b~?hEUDXCJ1_I^}+M zav$Xdyz`$Xax;%*mGzSh_P4HhlB!xQZSle!Qv?MCStb8e5;#@b=Nn!d?Rmh3nb=g( zc5qJ3IFHi0G`+bD)!c(uf`klb~G>6Jy&=ey{b9V{Ci(uX$GJTRcDD`vnRI5}rP;c3{fY_<&{dYj zGlu&N(g+yo>6GaiwDMj) zw|~JNt>?yXB$zj>zVPm=EsIalJzmWSTK`93r|A*>gM%^NWyc_9{@t=X`ElXzKIsld z{Hv@zYj>F^yiF)O;`vm5@~!C&Orm(^!e5nFp}cb!(_JRq>QL0a5lwGUb@X;*D%16L z6Ldr7qlXGYLjUD^oS2?*htmW<10nUYS+?Rs| z!No-ZcZb5Ov?N%kG&5{%t8u**)iW>AQZMp27aqm~uVA zgjHPw4Q-i(&L#_5tME`y)zF?sOR4BtaqsJ#a+}*XcDr0r#{2rFcgxbM3)aUjDGMAp zJM~+~6&vk>Ik%bFhjQPG7#8z8n@qzka{{eumd$5Q*^T-3%1s6Pu~HdS$WAPGyPUbK zkk^**tLdBk%I%GYgNmMMn52tMs#bdH-L3Cd^kBMJiWStAjYMOI?Z<1aJBm>v25B literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/twilightforest/textures/model/chest/double.xcf b/src/main/resources/assets/twilightforest/textures/model/chest/double.xcf new file mode 100644 index 0000000000000000000000000000000000000000..a9e7f7445063dd1e8954a6c83e1c08b1e573b59a GIT binary patch literal 60985 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