From 8b46b2b687a955966afbe33d0a705877c196d5dd Mon Sep 17 00:00:00 2001 From: Halbear Date: Wed, 29 Apr 2026 22:28:28 +0100 Subject: [PATCH] initial commit --- .classpath | 425 +++ .gitignore | 10 + .project | 17 + build.gradle | 79 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59536 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 172 ++ gradlew.bat | 84 + hem_custom/mixin/CameraMixins.java | 30 + .../vehicles/VehicleCameraSettings.java | 85 + src/main/java/studio/halbear/hem/HemMod.java | 103 + .../studio/halbear/hem/HemModElements.java | 132 + .../studio/halbear/hem/HemModVariables.java | 450 +++ .../halbear/hem/block/AntHillBlock.java | 120 + .../studio/halbear/hem/block/AntsBlock.java | 191 ++ .../hem/block/BloomedBulbFlowerBlock.java | 144 + .../hem/block/BloomedMuncherBlock.java | 405 +++ .../hem/block/BlueleafBlossomerBlock.java | 157 + .../hem/block/BlueleafBrownCapBlock.java | 161 + .../hem/block/BlueleafButterSlumpBlock.java | 159 + .../hem/block/BlueleafCabbageFlowerBlock.java | 155 + .../hem/block/BlueleafCobblestoneBlock.java | 130 + .../block/BlueleafCobblestoneSlabBlock.java | 55 + .../block/BlueleafCobblestoneStairsBlock.java | 56 + .../block/BlueleafCobblestoneWallBlock.java | 207 ++ .../hem/block/BlueleafDeadLogBlock.java | 108 + .../hem/block/BlueleafDirtBlockBlock.java | 146 + .../block/BlueleafDirtGrassBlockBlock.java | 67 + .../block/BlueleafFluorescentLeavesBlock.java | 147 + .../halbear/hem/block/BlueleafGrassBlock.java | 174 ++ .../hem/block/BlueleafGrassBlockBlock.java | 74 + .../hem/block/BlueleafGravelMudBlock.java | 76 + .../hem/block/BlueleafGreenCapBlock.java | 161 + .../hem/block/BlueleafLavenderBlock.java | 203 ++ .../hem/block/BlueleafLeavesBlock.java | 115 + .../hem/block/BlueleafLilyPadBlock.java | 153 + .../halbear/hem/block/BlueleafLogBlock.java | 97 + .../hem/block/BlueleafLushLeavesBlock.java | 115 + .../block/BlueleafMatureBlossomerBlock.java | 157 + .../BlueleafMatureCabbageFlowerBlock.java | 155 + .../halbear/hem/block/BlueleafMudBlock.java | 147 + .../hem/block/BlueleafRedCapBlock.java | 161 + .../hem/block/BlueleafRedwoodLeavesBlock.java | 116 + .../hem/block/BlueleafRedwoodLogBlock.java | 97 + .../hem/block/BlueleafSeaGrassBlock.java | 148 + .../halbear/hem/block/BlueleafStoneBlock.java | 60 + .../hem/block/BlueleafStoneGravelBlock.java | 131 + .../hem/block/BlueleafStoneSlabBlock.java | 55 + .../hem/block/BlueleafStoneStairBlock.java | 56 + .../hem/block/BlueleafStoneWallBlock.java | 213 ++ .../BlueleafTallBloomingFlowerBlock.java | 149 + .../hem/block/BlueleafTallGrassBlock.java | 160 + .../hem/block/BlueleafTallSproutBlock.java | 150 + .../halbear/hem/block/BlueleafWheatBlock.java | 174 ++ .../halbear/hem/block/BlueleafWoodBlock.java | 97 + .../halbear/hem/block/BulbFlowerBlock.java | 212 ++ .../block/DanglingFluorescentLeavesBlock.java | 198 ++ .../halbear/hem/block/FallenLeavesBlock.java | 154 + .../halbear/hem/block/GiantLilyPadBlock.java | 173 ++ .../halbear/hem/block/MuncherBlock.java | 410 +++ .../halbear/hem/block/MuncherSproutBlock.java | 241 ++ .../halbear/hem/entity/AirboatEntity.java | 226 ++ ...DormantAgedEmberleafMilitaryBotEntity.java | 200 ++ .../DormantEmberleafMilitaryBotEntity.java | 200 ++ .../entity/EmberleafMilitaryBotEntity.java | 206 ++ ...EmberleafMilitaryRobotLowerHalfEntity.java | 176 ++ ...EmberleafMilitaryRobotUpperHalfEntity.java | 190 ++ .../halbear/hem/entity/FluffaloEntity.java | 195 ++ .../hem/entity/FluffaloShavedEntity.java | 189 ++ .../hem/entity/GiantButterflyEntity.java | 236 ++ .../entity/GiantButterflyWalkingEntity.java | 192 ++ .../halbear/hem/entity/GoldFishEntity.java | 242 ++ .../hem/entity/HotAirBalloonEntity.java | 219 ++ .../hem/entity/LadyBugInFlightEntity.java | 185 ++ .../halbear/hem/entity/LadybugEntity.java | 173 ++ .../halbear/hem/entity/TigerFishEntity.java | 274 ++ .../hem/entity/renderer/AirboatRenderer.java | 2675 +++++++++++++++++ ...rmantAgedEmberleafMilitaryBotRenderer.java | 151 + .../DormantEmberleafMilitaryBotRenderer.java | 128 + .../EmberleafMilitaryBotRenderer.java | 131 + ...berleafMilitaryRobotLowerHalfRenderer.java | 114 + ...berleafMilitaryRobotUpperHalfRenderer.java | 104 + .../hem/entity/renderer/FluffaloRenderer.java | 152 + .../renderer/FluffaloShavedRenderer.java | 163 + .../renderer/GiantButterflyRenderer.java | 201 ++ .../GiantButterflyWalkingRenderer.java | 237 ++ .../hem/entity/renderer/GoldFishRenderer.java | 129 + .../renderer/HotAirBalloonRenderer.java | 1114 +++++++ .../renderer/LadyBugInFlightRenderer.java | 155 + .../hem/entity/renderer/LadybugRenderer.java | 153 + .../entity/renderer/TigerFishRenderer.java | 152 + .../halbear/hem/gui/AirboatGasCelViewGui.java | 415 +++ .../hem/gui/AirboatGasCelViewGuiWindow.java | 165 + .../hem/gui/overlay/AltimeterOverlay.java | 106 + .../hem/gui/overlay/GooedOverlayOverlay.java | 224 ++ .../gui/overlay/HotAirBalloonUIOverlay.java | 52 + .../hem/gui/overlay/OdometerOverlay.java | 105 + .../hem/gui/overlay/PressureGaugeOverlay.java | 79 + .../hem/gui/overlay/SpeedGaugeOverlay.java | 78 + .../gui/overlay/TemperatureGaugeOverlay.java | 79 + .../studio/halbear/hem/item/BlueleafItem.java | 46 + .../hem/item/ButterflySpawnEggItem.java | 77 + .../halbear/hem/item/FluffaloTuftItem.java | 44 + .../hem/item/GasCanister612litreItem.java | 87 + .../halbear/hem/item/GoldFishItemItem.java | 68 + .../hem/item/HotAirBalloonItemItem.java | 76 + .../halbear/hem/item/LadybugSpawnEggItem.java | 77 + .../halbear/hem/item/TigerFishItemItem.java | 68 + .../hem/itemgroup/BlueleafTabItemGroup.java | 36 + .../HalsExplorationModTechItemGroup.java | 36 + .../keybind/OpenGasCellViewKeyBinding.java | 110 + .../keybind/VehicleAccelerateKeyBinding.java | 116 + .../keybind/VehicleBackwardKeyBinding.java | 116 + .../keybind/VehicleDecelerateKeyBinding.java | 116 + .../hem/keybind/VehicleForwardKeyBinding.java | 116 + .../VehicleIncreasePressureKeyBinding.java | 116 + .../VehicleReleasePressureKeyBinding.java | 116 + .../keybind/VehicleStrafeLeftKeyBinding.java | 116 + .../keybind/VehicleStrafeRightKeyBinding.java | 116 + .../keybind/VehicleTurnLeftKeyBinding.java | 116 + .../keybind/VehicleTurnRightKeyBinding.java | 116 + .../hem/particle/BlueLeavesParticle.java | 98 + .../particle/BlueleafAmbienceParticle.java | 90 + .../FluorescentLeavesParticlesParticle.java | 105 + .../particle/LavenderParticlesParticle.java | 78 + .../particle/LilyPadParticlesParticle.java | 83 + .../hem/particle/RobotDamageParticle.java | 98 + .../SevereDamageParticlesParticle.java | 85 + .../halbear/hem/potion/GooedPotionEffect.java | 99 + .../AirboatOnEntityTickUpdateProcedure.java | 202 ++ .../AirboatOnInitialEntitySpawnProcedure.java | 44 + .../AirboatRightClickedOnEntityProcedure.java | 84 + ...OnStructureInstanceGeneratedProcedure.java | 294 ++ .../AntHillUpdateTickProcedure.java | 93 + .../procedures/AntsBlockAddedProcedure.java | 45 + .../AntsEntityWalksOnTheBlockProcedure.java | 110 + .../BloomedBulbFlowerUpdateTickProcedure.java | 58 + ...cherEntityCollidesInTheBlockProcedure.java | 212 ++ .../BloomedMuncherUpdateTickProcedure.java | 205 ++ ...vesParticleSpawningConditionProcedure.java | 24 + .../BlueleafLavenderConditionProcedure.java | 27 + ...erMobplayerCollidesWithPlantProcedure.java | 71 + .../BlueleafLavenderUpdateTickProcedure.java | 42 + ...dditionalGenerationConditionProcedure.java | 27 + .../BlueleavesCollideProcedure.java | 21 + ...dditionalGenerationConditionProcedure.java | 45 + .../BulbFlowerPlantRightClickedProcedure.java | 74 + .../BulbFlowerUpdateTickProcedure.java | 91 + .../ButterflySpawnEggUseOnBlockProcedure.java | 92 + .../procedures/CancelFallDamageProcedure.java | 94 + ...BlockValidPlacementConditionProcedure.java | 43 + ...tLeavesNeighbourBlockChangesProcedure.java | 47 + ...aryBotEntityShakingConditionProcedure.java | 53 + ...ilitaryBotOnEntityTickUpdateProcedure.java | 134 + .../DrivingVehicleCheckProcedure.java | 148 + ...berleafMilitaryBotEntityDiesProcedure.java | 78 + ...rleafMilitaryBotEntityIsHurtProcedure.java | 42 + ...ilitaryBotOnEntityTickUpdateProcedure.java | 97 + ...tLowerHalfOnEntityTickUpdateProcedure.java | 71 + ...owerHalfOnInitialEntitySpawnProcedure.java | 22 + ...avesEntityCollidesInTheBlockProcedure.java | 55 + ...FluffaloRightClickedOnEntityProcedure.java | 107 + ...ShavedEntityShakingConditionProcedure.java | 10 + ...faloShavedOnEntityTickUpdateProcedure.java | 67 + ...loShavedOnInitialEntitySpawnProcedure.java | 20 + ...ionalParticleExpiryConditionProcedure.java | 59 + ...r612litreItemInInventoryTickProcedure.java | 39 + ...612litreItemIsCraftedsmeltedProcedure.java | 21 + .../hem/procedures/GettingEatenProcedure.java | 133 + ...tButterflyOnEntityTickUpdateProcedure.java | 190 ++ ...turalEntitySpawningConditionProcedure.java | 55 + ...flyWalkingOnEntityTickUpdateProcedure.java | 110 + ...yPadEntityCollidesInTheBlockProcedure.java | 67 + .../GooedActiveTickConditionProcedure.java | 23 + .../GooedEffectStartedappliedProcedure.java | 10 + .../GooedOnEffectActiveTickProcedure.java | 147 + ...dOverlayDisplayOverlayIngameProcedure.java | 38 + ...lloonItemRightclickedOnBlockProcedure.java | 63 + ...AirBalloonOnEntityTickUpdateProcedure.java | 176 ++ ...rBalloonOnInitialEntitySpawnProcedure.java | 38 + ...rBalloonRightClickedOnEntityProcedure.java | 49 + ...lloonUIDisplayOverlayIngame2Procedure.java | 25 + ...alloonUIDisplayOverlayIngameProcedure.java | 24 + ...ugInFlightOnEntityTickUpdateProcedure.java | 100 + .../LadybugOnEntityTickUpdateProcedure.java | 94 + ...gSpawnEggRightclickedOnBlockProcedure.java | 92 + ...dditionalGenerationConditionProcedure.java | 53 + ...uncherBlockDestroyedByPlayerProcedure.java | 392 +++ ...dditionalGenerationConditionProcedure.java | 43 + ...OnStructureInstanceGeneratedProcedure.java | 45 + .../MuncherPlantAddedProcedure.java | 81 + ...dditionalGenerationConditionProcedure.java | 47 + ...proutClientDisplayRandomTickProcedure.java | 99 + .../MuncherUpdateTickProcedure.java | 539 ++++ ...OpenGasCellViewOnKeyReleasedProcedure.java | 87 + ...dditionalGenerationConditionProcedure.java | 46 + .../procedures/SpeedCalculationProcedure.java | 165 + ...erFishEntityShakingConditionProcedure.java | 23 + .../TigerFishOnEntityTickUpdateProcedure.java | 55 + ...ehicleAccelerateOnKeyPressedProcedure.java | 29 + ...hicleAccelerateOnKeyReleasedProcedure.java | 27 + .../VehicleBackwardOnKeyPressedProcedure.java | 29 + ...VehicleBackwardOnKeyReleasedProcedure.java | 27 + ...ehicleDecelerateOnKeyPressedProcedure.java | 29 + ...hicleDecelerateOnKeyReleasedProcedure.java | 27 + .../VehicleForwardOnKeyPressedProcedure.java | 29 + .../VehicleForwardOnKeyReleasedProcedure.java | 27 + ...IncreasePressureOnKeyPressedProcedure.java | 29 + ...ncreasePressureOnKeyReleasedProcedure.java | 27 + ...eReleasePressureOnKeyPressedProcedure.java | 29 + ...ReleasePressureOnKeyReleasedProcedure.java | 27 + ...ehicleStrafeLeftOnKeyPressedProcedure.java | 29 + ...hicleStrafeLeftOnKeyReleasedProcedure.java | 27 + ...hicleStrafeRightOnKeyPressedProcedure.java | 29 + ...icleStrafeRightOnKeyReleasedProcedure.java | 27 + .../VehicleTurnLeftOnKeyPressedProcedure.java | 29 + ...VehicleTurnLeftOnKeyReleasedProcedure.java | 27 + ...VehicleTurnRightOnKeyPressedProcedure.java | 29 + ...ehicleTurnRightOnKeyReleasedProcedure.java | 27 + .../hem/procedures/VehicleYawProcedure.java | 68 + ...dditionalGenerationConditionProcedure.java | 40 + ...OnStructureInstanceGeneratedProcedure.java | 228 ++ .../hem/world/biome/BlueleafPlainsBiome.java | 166 + .../world/biome/BlueleafWheatFieldsBiome.java | 161 + .../biome/HeightendBlueleafPlainsBiome.java | 166 + .../world/biome/LushBlueleafMarshBiome.java | 167 + .../world/biome/LushBlueleafPlainsBiome.java | 166 + .../world/dimension/BlueleafDimension.java | 634 ++++ .../structure/AntHillSpawnStructure.java | 113 + .../world/structure/Boulder1Structure.java | 131 + .../world/structure/Boulder2Structure.java | 131 + .../world/structure/Boulder3Structure.java | 110 + .../world/structure/Boulder4Structure.java | 122 + .../hem/world/structure/Bush1Structure.java | 107 + .../hem/world/structure/Bush2Structure.java | 110 + .../structure/FloatingIsland5x5Structure.java | 110 + .../Floatingisland15x15Structure.java | 110 + .../Floatingislandflipped11x11Structure.java | 110 + .../Islandfragments5x5Structure.java | 110 + .../LilyPadExtraGenerationStructure.java | 106 + .../structure/LilyPadGenerationStructure.java | 108 + .../world/structure/LushTree1Structure.java | 118 + .../SeaGrassGenerationStructure.java | 121 + .../SmallLilyPadGenerationStructure.java | 108 + .../world/structure/SwampTree2Structure.java | 113 + .../SwampTreeGenerationStructure.java | 106 + .../structure/Swampstructure5x5Structure.java | 106 + .../world/structure/Tree11x11Structure.java | 110 + .../world/structure/Tree15x15Structure.java | 110 + .../hem/world/structure/Wall1Structure.java | 120 + .../hem/world/structure/Wall2Structure.java | 120 + .../hem/world/structure/Wall3Structure.java | 120 + .../hem/world/structure/Wall4Structure.java | 120 + .../hem/world/structure/Wall5Structure.java | 120 + .../WaterLoggedLeavesGenerationStructure.java | 108 + .../WaterloggedLeaves3x3Structure.java | 106 + .../hem_custom/mixin/CameraMixins.java | 30 + .../vehicles/VehicleCameraSettings.java | 85 + src/main/resources/META-INF/mods.toml | 26 + .../assets/hem/blockstates/ant_hill.json | 7 + .../assets/hem/blockstates/ants.json | 19 + .../hem/blockstates/bloomed_bulb_flower.json | 7 + .../hem/blockstates/bloomed_muncher.json | 19 + .../hem/blockstates/blueleaf_blossomer.json | 7 + .../hem/blockstates/blueleaf_brown_cap.json | 7 + .../blockstates/blueleaf_butter_slump.json | 7 + .../blockstates/blueleaf_cabbage_flower.json | 7 + .../hem/blockstates/blueleaf_cobblestone.json | 7 + .../blueleaf_cobblestone_slab.json | 13 + .../blueleaf_cobblestone_stairs.json | 209 ++ .../blueleaf_cobblestone_wall.json | 90 + .../hem/blockstates/blueleaf_dead_log.json | 16 + .../hem/blockstates/blueleaf_dirt_block.json | 11 + .../blueleaf_dirt_grass_block.json | 20 + .../blueleaf_fluorescent_leaves.json | 7 + .../hem/blockstates/blueleaf_grass.json | 20 + .../hem/blockstates/blueleaf_grass_block.json | 21 + .../hem/blockstates/blueleaf_gravel_mud.json | 14 + .../hem/blockstates/blueleaf_green_cap.json | 7 + .../hem/blockstates/blueleaf_lavender.json | 7 + .../hem/blockstates/blueleaf_leaves.json | 14 + .../hem/blockstates/blueleaf_lily_pad.json | 19 + .../assets/hem/blockstates/blueleaf_log.json | 16 + .../hem/blockstates/blueleaf_lush_leaves.json | 7 + .../blueleaf_mature_blossomer.json | 7 + .../blueleaf_mature_cabbage_flower.json | 7 + .../assets/hem/blockstates/blueleaf_mud.json | 14 + .../hem/blockstates/blueleaf_portal.json | 10 + .../hem/blockstates/blueleaf_red_cap.json | 7 + .../blockstates/blueleaf_redwood_leaves.json | 7 + .../hem/blockstates/blueleaf_redwood_log.json | 16 + .../hem/blockstates/blueleaf_sea_grass.json | 7 + .../hem/blockstates/blueleaf_stone.json | 7 + .../blockstates/blueleaf_stone_gravel.json | 7 + .../hem/blockstates/blueleaf_stone_slab.json | 13 + .../hem/blockstates/blueleaf_stone_stair.json | 209 ++ .../hem/blockstates/blueleaf_stone_wall.json | 90 + .../blueleaf_tall_blooming_flower.json | 10 + .../hem/blockstates/blueleaf_tall_grass.json | 10 + .../hem/blockstates/blueleaf_tall_sprout.json | 10 + .../hem/blockstates/blueleaf_wheat.json | 7 + .../assets/hem/blockstates/blueleaf_wood.json | 16 + .../assets/hem/blockstates/bulb_flower.json | 7 + .../dangling_fluorescent_leaves.json | 7 + .../assets/hem/blockstates/fallen_leaves.json | 7 + .../hem/blockstates/giant_lily_pad.json | 34 + .../assets/hem/blockstates/muncher.json | 19 + .../hem/blockstates/muncher_sprout.json | 7 + src/main/resources/assets/hem/lang/en_us.json | 106 + .../assets/hem/models/block/ant_hill.json | 8 + .../assets/hem/models/block/ants.json | 8 + .../hem/models/block/bloomed_bulb_flower.json | 8 + .../hem/models/block/bloomed_muncher.json | 8 + .../hem/models/block/blueleaf_blossomer.json | 7 + .../hem/models/block/blueleaf_brown_cap.json | 7 + .../models/block/blueleaf_butter_slump.json | 7 + .../models/block/blueleaf_cabbage_flower.json | 7 + .../models/block/blueleaf_cobblestone.json | 12 + .../block/blueleaf_cobblestone_slab.json | 8 + .../block/blueleaf_cobblestone_slab_full.json | 8 + .../block/blueleaf_cobblestone_slab_top.json | 8 + .../block/blueleaf_cobblestone_stairs.json | 8 + .../blueleaf_cobblestone_stairs_inner.json | 8 + .../blueleaf_cobblestone_stairs_outer.json | 8 + .../block/blueleaf_cobblestone_wall.json | 7 + .../blueleaf_cobblestone_wall_inventory.json | 7 + .../block/blueleaf_cobblestone_wall_post.json | 7 + .../blueleaf_cobblestone_wall_side_tall.json | 7 + .../hem/models/block/blueleaf_dead_log.json | 12 + .../hem/models/block/blueleaf_dirt_block.json | 12 + .../block/blueleaf_dirt_coarse_block.json | 12 + .../block/blueleaf_dirt_grass_block.json | 12 + .../block/blueleaf_fluorescent_leaves.json | 9 + .../hem/models/block/blueleaf_grass.json | 7 + .../models/block/blueleaf_grass_block.json | 12 + .../block/blueleaf_grass_gravel_mud.json | 12 + .../models/block/blueleaf_grass_medium.json | 7 + .../models/block/blueleaf_grass_short.json | 7 + .../block/blueleaf_grass_stone_mud.json | 12 + .../block/blueleaf_grass_super_short.json | 7 + .../hem/models/block/blueleaf_grass_tall.json | 7 + .../hem/models/block/blueleaf_gravel_mud.json | 12 + .../hem/models/block/blueleaf_green_cap.json | 7 + .../hem/models/block/blueleaf_lavender.json | 9 + .../hem/models/block/blueleaf_leaves.json | 12 + .../models/block/blueleaf_leaves_dense.json | 12 + .../models/block/blueleaf_leaves_sparse.json | 12 + .../hem/models/block/blueleaf_lily_pad.json | 8 + .../assets/hem/models/block/blueleaf_log.json | 12 + .../models/block/blueleaf_lush_leaves.json | 12 + .../block/blueleaf_lush_leaves_dark.json | 7 + .../block/blueleaf_lush_leaves_scarse.json | 7 + .../block/blueleaf_mature_blossomer.json | 7 + .../block/blueleaf_mature_cabbage_flower.json | 7 + .../assets/hem/models/block/blueleaf_mud.json | 7 + .../hem/models/block/blueleaf_portal_ew.json | 40 + .../hem/models/block/blueleaf_portal_ns.json | 40 + .../hem/models/block/blueleaf_red_cap.json | 7 + .../models/block/blueleaf_redwood_leaves.json | 7 + .../models/block/blueleaf_redwood_log.json | 12 + .../hem/models/block/blueleaf_sea_grass.json | 7 + .../hem/models/block/blueleaf_stone.json | 12 + .../models/block/blueleaf_stone_gravel.json | 12 + .../hem/models/block/blueleaf_stone_mud.json | 12 + .../hem/models/block/blueleaf_stone_slab.json | 8 + .../block/blueleaf_stone_slab_full.json | 8 + .../models/block/blueleaf_stone_slab_top.json | 8 + .../models/block/blueleaf_stone_stair.json | 8 + .../block/blueleaf_stone_stair_inner.json | 8 + .../block/blueleaf_stone_stair_outer.json | 8 + .../hem/models/block/blueleaf_stone_wall.json | 7 + .../block/blueleaf_stone_wall_inventory.json | 7 + .../block/blueleaf_stone_wall_post.json | 7 + .../block/blueleaf_stone_wall_side_tall.json | 7 + .../hem/models/block/blueleaf_stony_mud.json | 7 + .../block/blueleaf_tall_blooming_flower.json | 7 + .../blueleaf_tall_blooming_flower_bottom.json | 7 + .../hem/models/block/blueleaf_tall_grass.json | 7 + .../block/blueleaf_tall_grass_bottom.json | 7 + .../models/block/blueleaf_tall_sprout.json | 7 + .../block/blueleaf_tall_sprout_bottom.json | 7 + .../hem/models/block/blueleaf_wheat.json | 9 + .../models/block/blueleaf_wheat_bottom.json | 7 + .../hem/models/block/blueleaf_wood.json | 12 + .../assets/hem/models/block/bulb_flower.json | 8 + .../hem/models/block/bulb_flower_bottom.json | 7 + .../block/dangling_fluorescent_leaves.json | 7 + .../hem/models/block/fallen_leaves.json | 8 + .../hem/models/block/giant_lily_pad.json | 8 + .../block/giant_lily_pad_flowerless.json | 8 + .../grass/blueleaf_dirt_grass_alternate.json | 12 + .../grass/blueleaf_dirt_grass_bright.json | 12 + .../grass/blueleaf_dirt_grass_flower.json | 12 + .../grass/blueleaf_dirt_grass_flowers.json | 12 + .../grass/blueleaf_grass_block_alternate.json | 12 + .../grass/blueleaf_grass_block_bright.json | 12 + .../grass/blueleaf_grass_block_flower.json | 12 + .../grass/blueleaf_grass_block_flowers.json | 12 + .../assets/hem/models/block/muncher.json | 8 + .../hem/models/block/muncher_sprout.json | 7 + .../assets/hem/models/custom/anthill.json | 338 +++ .../assets/hem/models/custom/ants.json | 161 + .../hem/models/custom/blueleaflilypad.json | 79 + .../assets/hem/models/custom/bulbflower.json | 425 +++ .../hem/models/custom/bulbflowerclosed.json | 168 ++ .../hem/models/custom/canister612l.json | 719 +++++ .../hem/models/custom/chomperclosed.json | 168 ++ .../hem/models/custom/giantlilypad.json | 728 +++++ .../models/custom/giantlilypadnoflower.json | 266 ++ .../assets/hem/models/custom/lavender.json | 168 ++ .../assets/hem/models/custom/leafpile.json | 99 + .../models/custom/leafpilewaterlogged.json | 82 + .../assets/hem/models/custom/leaves.json | 283 ++ .../assets/hem/models/custom/openmuncher.json | 653 ++++ .../hem/models/custom/shadedcrossmodel.json | 162 + .../assets/hem/models/custom/wheat.json | 168 ++ .../hem/models/item/airboat_spawn_egg.json | 3 + .../assets/hem/models/item/ant_hill.json | 22 + .../assets/hem/models/item/ants.json | 6 + .../hem/models/item/bloomed_bulb_flower.json | 22 + .../hem/models/item/bloomed_muncher.json | 22 + .../assets/hem/models/item/blueleaf.json | 6 + .../hem/models/item/blueleaf_blossomer.json | 6 + .../hem/models/item/blueleaf_brown_cap.json | 6 + .../models/item/blueleaf_butter_slump.json | 6 + .../models/item/blueleaf_cabbage_flower.json | 6 + .../hem/models/item/blueleaf_cobblestone.json | 22 + .../item/blueleaf_cobblestone_slab.json | 22 + .../item/blueleaf_cobblestone_stairs.json | 22 + .../item/blueleaf_cobblestone_wall.json | 3 + .../hem/models/item/blueleaf_dead_log.json | 22 + .../hem/models/item/blueleaf_dirt_block.json | 22 + .../item/blueleaf_dirt_grass_block.json | 22 + .../item/blueleaf_fluorescent_leaves.json | 22 + .../hem/models/item/blueleaf_grass.json | 6 + .../hem/models/item/blueleaf_grass_block.json | 22 + .../hem/models/item/blueleaf_gravel_mud.json | 22 + .../hem/models/item/blueleaf_green_cap.json | 6 + .../hem/models/item/blueleaf_lavender.json | 6 + .../hem/models/item/blueleaf_leaves.json | 22 + .../hem/models/item/blueleaf_lily_pad.json | 6 + .../assets/hem/models/item/blueleaf_log.json | 22 + .../hem/models/item/blueleaf_lush_leaves.json | 22 + .../item/blueleaf_mature_blossomer.json | 6 + .../item/blueleaf_mature_cabbage_flower.json | 6 + .../assets/hem/models/item/blueleaf_mud.json | 22 + .../hem/models/item/blueleaf_red_cap.json | 6 + .../models/item/blueleaf_redwood_leaves.json | 22 + .../hem/models/item/blueleaf_redwood_log.json | 22 + .../hem/models/item/blueleaf_sea_grass.json | 22 + .../hem/models/item/blueleaf_stone.json | 22 + .../models/item/blueleaf_stone_gravel.json | 22 + .../hem/models/item/blueleaf_stone_slab.json | 22 + .../hem/models/item/blueleaf_stone_stair.json | 22 + .../hem/models/item/blueleaf_stone_wall.json | 3 + .../item/blueleaf_tall_blooming_flower.json | 6 + .../hem/models/item/blueleaf_tall_grass.json | 6 + .../hem/models/item/blueleaf_tall_sprout.json | 6 + .../hem/models/item/blueleaf_wheat.json | 6 + .../assets/hem/models/item/blueleaf_wood.json | 22 + .../assets/hem/models/item/bulb_flower.json | 6 + .../hem/models/item/butterfly_spawn_egg.json | 6 + .../item/dangling_fluorescent_leaves.json | 6 + ...aged_emberleaf_military_bot_spawn_egg.json | 3 + ...mant_emberleaf_military_bot_spawn_egg.json | 3 + .../emberleaf_military_bot_spawn_egg.json | 3 + ...f_military_robot_lower_half_spawn_egg.json | 3 + ...f_military_robot_upper_half_spawn_egg.json | 3 + .../assets/hem/models/item/fallen_leaves.json | 6 + .../hem/models/item/fluffalo_spawn_egg.json | 3 + .../assets/hem/models/item/fluffalo_tuft.json | 6 + .../models/item/gas_canister_612litre.json | 7 + .../hem/models/item/giant_lily_pad.json | 22 + .../hem/models/item/gold_fish_item.json | 6 + .../hem/models/item/gold_fish_spawn_egg.json | 3 + .../hem/models/item/hot_air_balloon_item.json | 6 + .../hem/models/item/ladybug_spawn_egg.json | 6 + .../assets/hem/models/item/muncher.json | 6 + .../hem/models/item/muncher_sprout.json | 6 + .../hem/models/item/tiger_fish_item.json | 6 + .../hem/models/item/tiger_fish_spawn_egg.json | 3 + .../assets/hem/particles/blue_leaves.json | 8 + .../hem/particles/blueleaf_ambience.json | 8 + .../fluorescent_leaves_particles.json | 12 + .../hem/particles/lavender_particles.json | 9 + .../hem/particles/lily_pad_particles.json | 8 + .../assets/hem/particles/robot_damage.json | 12 + .../particles/severe_damage_particles.json | 8 + .../hem/textures/blocks/612lcanister.png | Bin 0 -> 1576 bytes .../assets/hem/textures/blocks/anthill.png | Bin 0 -> 585 bytes .../assets/hem/textures/blocks/ants-sheet.png | Bin 0 -> 605 bytes .../hem/textures/blocks/ants-sheet.png.mcmeta | 26 + .../blocks/blueleafbloomingflower.png | Bin 0 -> 573 bytes .../blocks/blueleafbloomingflowerbottom.png | Bin 0 -> 466 bytes .../hem/textures/blocks/blueleafblossomer.png | Bin 0 -> 198 bytes .../hem/textures/blocks/blueleafbrowncap.png | Bin 0 -> 322 bytes .../textures/blocks/blueleafbutterslump.png | Bin 0 -> 355 bytes .../textures/blocks/blueleafdeadlogside.png | Bin 0 -> 392 bytes .../blocks/blueleafdeadlogsidecracked.png | Bin 0 -> 398 bytes .../textures/blocks/blueleafdeadlogtop.png | Bin 0 -> 278 bytes .../textures/blocks/blueleafdefaultleaves.png | Bin 0 -> 268 bytes .../blocks/blueleafdefaultleavesdense.png | Bin 0 -> 571 bytes .../blocks/blueleafdefaultleavessparse.png | Bin 0 -> 418 bytes .../hem/textures/blocks/blueleafdirt.png | Bin 0 -> 378 bytes .../textures/blocks/blueleafdirtcoarse.png | Bin 0 -> 561 bytes .../blocks/blueleafearlybulbflowerbottom.png | Bin 0 -> 485 bytes .../blocks/blueleafearlybulbflowertop.png | Bin 0 -> 272 bytes .../textures/blocks/blueleafgrasscurly.png | Bin 0 -> 256 bytes .../textures/blocks/blueleafgrassmedium.png | Bin 0 -> 282 bytes .../textures/blocks/blueleafgrassshort.png | Bin 0 -> 200 bytes .../textures/blocks/blueleafgrasssidedirt.png | Bin 0 -> 655 bytes .../blocks/blueleafgrasssidestone.png | Bin 0 -> 688 bytes .../blocks/blueleafgrasssupershort.png | Bin 0 -> 152 bytes .../hem/textures/blocks/blueleafgrasstall.png | Bin 0 -> 338 bytes .../hem/textures/blocks/blueleafgrasstop.png | Bin 0 -> 381 bytes .../blocks/blueleafgrasstopalternate.png | Bin 0 -> 485 bytes .../blocks/blueleafgrasstopbright.png | Bin 0 -> 358 bytes .../blocks/blueleafgrasstopflower.png | Bin 0 -> 658 bytes .../blocks/blueleafgrasstopflowers.png | Bin 0 -> 537 bytes .../hem/textures/blocks/blueleafgreencap.png | Bin 0 -> 387 bytes .../hem/textures/blocks/blueleafleaves.png | Bin 0 -> 331 bytes .../textures/blocks/blueleafleavesdark.png | Bin 0 -> 337 bytes .../hem/textures/blocks/blueleafleavesfir.png | Bin 0 -> 542 bytes .../textures/blocks/blueleafleavesscarse.png | Bin 0 -> 270 bytes .../hem/textures/blocks/blueleaflogside.png | Bin 0 -> 388 bytes .../hem/textures/blocks/blueleaflogtop.png | Bin 0 -> 486 bytes .../textures/blocks/blueleaflushleaves.png | Bin 0 -> 594 bytes .../blocks/blueleafmatureblossomer.png | Bin 0 -> 274 bytes .../blocks/blueleafmaturecabbageflower.png | Bin 0 -> 407 bytes .../textures/blocks/blueleafmuncherclosed.png | Bin 0 -> 798 bytes .../hem/textures/blocks/blueleafredcap.png | Bin 0 -> 424 bytes .../blocks/blueleafredwoodlogside.png | Bin 0 -> 320 bytes .../textures/blocks/blueleafredwoodlogtop.png | Bin 0 -> 457 bytes .../textures/blocks/blueleafrottenlogside.png | Bin 0 -> 384 bytes .../textures/blocks/blueleafrottenlogtop.png | Bin 0 -> 275 bytes .../hem/textures/blocks/blueleafseagrass.png | Bin 0 -> 826 bytes .../blocks/blueleafseagrass.png.mcmeta | 14 + .../textures/blocks/blueleafsproutbottom.png | Bin 0 -> 347 bytes .../hem/textures/blocks/blueleafsprouttop.png | Bin 0 -> 334 bytes .../hem/textures/blocks/blueleafstone.png | Bin 0 -> 445 bytes .../textures/blocks/blueleafstonecobble.png | Bin 0 -> 560 bytes .../textures/blocks/blueleafstonegemore.png | Bin 0 -> 684 bytes .../textures/blocks/blueleafstonegravel.png | Bin 0 -> 573 bytes .../blocks/blueleafstonemineralore.png | Bin 0 -> 688 bytes .../blocks/blueleaftallgrassbottom.png | Bin 0 -> 348 bytes .../textures/blocks/blueleaftallgrasstop.png | Bin 0 -> 371 bytes .../blocks/blueleafyoungcabbageflowerr.png | Bin 0 -> 408 bytes .../assets/hem/textures/blocks/bulbflower.png | Bin 0 -> 2425 bytes .../hem/textures/blocks/bulbflowerclose.png | Bin 0 -> 629 bytes .../blocks/danglingfluorescentleaves.png | Bin 0 -> 392 bytes .../hem/textures/blocks/giantlilypad.png | Bin 0 -> 2694 bytes .../hem/textures/blocks/grassycobble.png | Bin 0 -> 725 bytes .../hem/textures/blocks/grassycobbleside.png | Bin 0 -> 710 bytes .../hem/textures/blocks/lavenderblueleaf.png | Bin 0 -> 689 bytes .../blocks/lavenderblueleafbottom.png | Bin 0 -> 432 bytes .../textures/blocks/lavenderblueleaftop.png | Bin 0 -> 375 bytes .../assets/hem/textures/blocks/leaves.png | Bin 0 -> 434 bytes .../hem/textures/blocks/leavesoverhang.png | Bin 0 -> 573 bytes .../assets/hem/textures/blocks/lilypad.png | Bin 0 -> 459 bytes .../assets/hem/textures/blocks/mud.png | Bin 0 -> 367 bytes .../hem/textures/blocks/muddygravelside.png | Bin 0 -> 681 bytes .../hem/textures/blocks/munchersprout.png | Bin 0 -> 540 bytes .../hem/textures/blocks/openmuncher.png | Bin 0 -> 1451 bytes .../hem/textures/blocks/pebblygrass.png | Bin 0 -> 615 bytes .../assets/hem/textures/blocks/stonymud.png | Bin 0 -> 515 bytes .../assets/hem/textures/blocks/wheat.png | Bin 0 -> 700 bytes .../hem/textures/blocks/wheetbottom.png | Bin 0 -> 241 bytes .../assets/hem/textures/blocks/wheettop.png | Bin 0 -> 272 bytes .../assets/hem/textures/entities/airboat.png | Bin 0 -> 23283 bytes .../entities/emberleafmilitaryrobot.png | Bin 0 -> 4040 bytes .../entities/emberleafmilitaryrobotaged.png | Bin 0 -> 5404 bytes .../entities/emberleafmilitaryrobotawake.png | Bin 0 -> 4182 bytes .../emberleafmilitaryrobotdestroyed.png | Bin 0 -> 4426 bytes .../assets/hem/textures/entities/fluffalo.png | Bin 0 -> 9888 bytes .../hem/textures/entities/giantbutterfly.png | Bin 0 -> 6182 bytes .../assets/hem/textures/entities/goldfish.png | Bin 0 -> 550 bytes .../hem/textures/entities/hotairballoon.png | Bin 0 -> 5239 bytes .../assets/hem/textures/entities/ladybug.png | Bin 0 -> 544 bytes .../hem/textures/entities/tigerfish.png | Bin 0 -> 3201 bytes .../textures/entities/tigerfishglowlayer.png | Bin 0 -> 1392 bytes .../hem/textures/items/612lcanister.png | Bin 0 -> 1576 bytes .../assets/hem/textures/items/ant.png | Bin 0 -> 314 bytes .../items/blueleafdefaultleavessparse.png | Bin 0 -> 418 bytes .../items/blueleafearlybulbflowertop.png | Bin 0 -> 272 bytes .../hem/textures/items/blueleafgrasstall.png | Bin 0 -> 338 bytes .../assets/hem/textures/items/butterfly.png | Bin 0 -> 286 bytes .../assets/hem/textures/items/chompertop.png | Bin 0 -> 491 bytes .../items/danglingfluorescentleaves.png | Bin 0 -> 392 bytes .../hem/textures/items/fluffalotuft.png | Bin 0 -> 376 bytes .../assets/hem/textures/items/goldfish.png | Bin 0 -> 377 bytes .../hem/textures/items/hotairballoonitem.png | Bin 0 -> 310 bytes .../assets/hem/textures/items/ladybird.png | Bin 0 -> 235 bytes .../textures/items/lavenderblueleaftop.png | Bin 0 -> 375 bytes .../assets/hem/textures/items/lilypad.png | Bin 0 -> 459 bytes .../assets/hem/textures/items/tigerfish.png | Bin 0 -> 438 bytes .../assets/hem/textures/items/wheat.png | Bin 0 -> 440 bytes .../assets/hem/textures/items/wheettop.png | Bin 0 -> 437 bytes .../resources/assets/hem/textures/logo.png | Bin 0 -> 26868 bytes .../assets/hem/textures/mob_effect/gooed.png | Bin 0 -> 275 bytes .../hem/textures/particle/ambientparticle.png | Bin 0 -> 245 bytes .../hem/textures/particle/blue_leaves_1.png | Bin 0 -> 116 bytes .../hem/textures/particle/blue_leaves_2.png | Bin 0 -> 109 bytes .../hem/textures/particle/blue_leaves_3.png | Bin 0 -> 112 bytes .../hem/textures/particle/blue_leaves_4.png | Bin 0 -> 104 bytes .../hem/textures/particle/blue_leaves_5.png | Bin 0 -> 114 bytes .../hem/textures/particle/blue_leaves_6.png | Bin 0 -> 120 bytes .../hem/textures/particle/blue_leaves_7.png | Bin 0 -> 139 bytes .../hem/textures/particle/blue_leaves_8.png | Bin 0 -> 114 bytes .../textures/particle/blueleaf_ambience_1.png | Bin 0 -> 118 bytes .../textures/particle/blueleaf_ambience_2.png | Bin 0 -> 110 bytes .../textures/particle/blueleaf_ambience_3.png | Bin 0 -> 97 bytes .../textures/particle/blueleaf_ambience_4.png | Bin 0 -> 91 bytes .../hem/textures/particle/blueleaves.png | Bin 0 -> 283 bytes .../textures/particle/damageparticlesheet.png | Bin 0 -> 356 bytes .../fluorescent_leaves_particles_1.png | Bin 0 -> 118 bytes .../fluorescent_leaves_particles_2.png | Bin 0 -> 132 bytes .../fluorescent_leaves_particles_3.png | Bin 0 -> 124 bytes .../fluorescent_leaves_particles_4.png | Bin 0 -> 113 bytes .../fluorescent_leaves_particles_5.png | Bin 0 -> 114 bytes .../fluorescent_leaves_particles_6.png | Bin 0 -> 120 bytes .../fluorescent_leaves_particles_7.png | Bin 0 -> 139 bytes .../fluorescent_leaves_particles_8.png | Bin 0 -> 114 bytes .../textures/particle/fluorescentleafs.png | Bin 0 -> 482 bytes .../particle/lavender_particles_1.png | Bin 0 -> 96 bytes .../particle/lavender_particles_2.png | Bin 0 -> 82 bytes .../particle/lavender_particles_3.png | Bin 0 -> 82 bytes .../particle/lavender_particles_4.png | Bin 0 -> 82 bytes .../particle/lavender_particles_5.png | Bin 0 -> 96 bytes .../particle/lavender_particles_6.png | Bin 0 -> 101 bytes .../particle/lavenderblueleafparticles.png | Bin 0 -> 151 bytes .../particle/lily_pad_particles_1.png | Bin 0 -> 168 bytes .../particle/lily_pad_particles_2.png | Bin 0 -> 110 bytes .../particle/lily_pad_particles_3.png | Bin 0 -> 138 bytes .../particle/lily_pad_particles_4.png | Bin 0 -> 94 bytes .../textures/particle/lilypadparticles.png | Bin 0 -> 354 bytes .../hem/textures/particle/robot_damage_1.png | Bin 0 -> 149 bytes .../hem/textures/particle/robot_damage_2.png | Bin 0 -> 190 bytes .../hem/textures/particle/robot_damage_3.png | Bin 0 -> 129 bytes .../hem/textures/particle/robot_damage_4.png | Bin 0 -> 112 bytes .../hem/textures/particle/robot_damage_5.png | Bin 0 -> 117 bytes .../hem/textures/particle/robot_damage_6.png | Bin 0 -> 102 bytes .../hem/textures/particle/robot_damage_7.png | Bin 0 -> 128 bytes .../hem/textures/particle/robot_damage_8.png | Bin 0 -> 199 bytes .../particle/robotdamageparticles.png | Bin 0 -> 829 bytes .../particle/severe_damage_particles_1.png | Bin 0 -> 125 bytes .../particle/severe_damage_particles_2.png | Bin 0 -> 126 bytes .../particle/severe_damage_particles_3.png | Bin 0 -> 130 bytes .../particle/severe_damage_particles_4.png | Bin 0 -> 147 bytes .../textures/screens/airboat_gas_cel_view.png | Bin 0 -> 1646 bytes .../hem/textures/screens/airshipheliumui.png | Bin 0 -> 6040 bytes .../assets/hem/textures/screens/altimeter.png | Bin 0 -> 1166 bytes .../assets/hem/textures/screens/gooed.png | Bin 0 -> 420 bytes .../assets/hem/textures/screens/gooed1.png | Bin 0 -> 228 bytes .../assets/hem/textures/screens/gooed2.png | Bin 0 -> 266 bytes .../assets/hem/textures/screens/gooed3.png | Bin 0 -> 475 bytes .../textures/screens/heliumfilluibottom.png | Bin 0 -> 137 bytes .../textures/screens/heliumfilluiprogress.png | Bin 0 -> 104 bytes .../hem/textures/screens/heliumfilluitop.png | Bin 0 -> 136 bytes .../screens/hotairballoonpressureguage0.png | Bin 0 -> 2236 bytes .../screens/hotairballoonpressureguage1.png | Bin 0 -> 2250 bytes .../screens/hotairballoonpressureguage10.png | Bin 0 -> 2229 bytes .../screens/hotairballoonpressureguage11.png | Bin 0 -> 2233 bytes .../screens/hotairballoonpressureguage12.png | Bin 0 -> 2222 bytes .../screens/hotairballoonpressureguage13.png | Bin 0 -> 2230 bytes .../screens/hotairballoonpressureguage14.png | Bin 0 -> 2240 bytes .../screens/hotairballoonpressureguage15.png | Bin 0 -> 2234 bytes .../screens/hotairballoonpressureguage16.png | Bin 0 -> 2226 bytes .../screens/hotairballoonpressureguage17.png | Bin 0 -> 2231 bytes .../screens/hotairballoonpressureguage18.png | Bin 0 -> 2237 bytes .../screens/hotairballoonpressureguage19.png | Bin 0 -> 2228 bytes .../screens/hotairballoonpressureguage2.png | Bin 0 -> 2250 bytes .../screens/hotairballoonpressureguage20.png | Bin 0 -> 2224 bytes .../screens/hotairballoonpressureguage21.png | Bin 0 -> 2232 bytes .../screens/hotairballoonpressureguage22.png | Bin 0 -> 2234 bytes .../screens/hotairballoonpressureguage23.png | Bin 0 -> 2218 bytes .../screens/hotairballoonpressureguage24.png | Bin 0 -> 2209 bytes .../screens/hotairballoonpressureguage25.png | Bin 0 -> 2219 bytes .../screens/hotairballoonpressureguage26.png | Bin 0 -> 2233 bytes .../screens/hotairballoonpressureguage27.png | Bin 0 -> 2224 bytes .../screens/hotairballoonpressureguage28.png | Bin 0 -> 2217 bytes .../screens/hotairballoonpressureguage29.png | Bin 0 -> 2235 bytes .../screens/hotairballoonpressureguage3.png | Bin 0 -> 2238 bytes .../screens/hotairballoonpressureguage30.png | Bin 0 -> 2241 bytes .../screens/hotairballoonpressureguage31.png | Bin 0 -> 2242 bytes .../screens/hotairballoonpressureguage4.png | Bin 0 -> 2224 bytes .../screens/hotairballoonpressureguage5.png | Bin 0 -> 2232 bytes .../screens/hotairballoonpressureguage6.png | Bin 0 -> 2229 bytes .../screens/hotairballoonpressureguage7.png | Bin 0 -> 2216 bytes .../screens/hotairballoonpressureguage8.png | Bin 0 -> 2209 bytes .../screens/hotairballoonpressureguage9.png | Bin 0 -> 2215 bytes .../assets/hem/textures/screens/odometer.png | Bin 0 -> 1187 bytes .../hem/textures/screens/odometernumber0.png | Bin 0 -> 301 bytes .../hem/textures/screens/odometernumber1.png | Bin 0 -> 231 bytes .../hem/textures/screens/odometernumber2.png | Bin 0 -> 296 bytes .../hem/textures/screens/odometernumber3.png | Bin 0 -> 302 bytes .../hem/textures/screens/odometernumber4.png | Bin 0 -> 272 bytes .../hem/textures/screens/odometernumber5.png | Bin 0 -> 301 bytes .../hem/textures/screens/odometernumber6.png | Bin 0 -> 315 bytes .../hem/textures/screens/odometernumber7.png | Bin 0 -> 262 bytes .../hem/textures/screens/odometernumber8.png | Bin 0 -> 317 bytes .../hem/textures/screens/odometernumber9.png | Bin 0 -> 301 bytes .../screens/odometernumberdecimal0.png | Bin 0 -> 298 bytes .../screens/odometernumberdecimal1.png | Bin 0 -> 228 bytes .../screens/odometernumberdecimal2.png | Bin 0 -> 292 bytes .../screens/odometernumberdecimal3.png | Bin 0 -> 298 bytes .../screens/odometernumberdecimal4.png | Bin 0 -> 269 bytes .../screens/odometernumberdecimal5.png | Bin 0 -> 298 bytes .../screens/odometernumberdecimal6.png | Bin 0 -> 312 bytes .../screens/odometernumberdecimal7.png | Bin 0 -> 260 bytes .../screens/odometernumberdecimal8.png | Bin 0 -> 313 bytes .../screens/odometernumberdecimal9.png | Bin 0 -> 298 bytes .../assets/hem/textures/screens/pipe.png | Bin 0 -> 1061 bytes .../hem/textures/screens/speedgauge0.png | Bin 0 -> 2126 bytes .../hem/textures/screens/speedgauge1.png | Bin 0 -> 2121 bytes .../hem/textures/screens/speedgauge10.png | Bin 0 -> 2115 bytes .../hem/textures/screens/speedgauge11.png | Bin 0 -> 2118 bytes .../hem/textures/screens/speedgauge12.png | Bin 0 -> 2116 bytes .../hem/textures/screens/speedgauge13.png | Bin 0 -> 2130 bytes .../hem/textures/screens/speedgauge14.png | Bin 0 -> 2139 bytes .../hem/textures/screens/speedgauge15.png | Bin 0 -> 2135 bytes .../hem/textures/screens/speedgauge16.png | Bin 0 -> 2122 bytes .../hem/textures/screens/speedgauge17.png | Bin 0 -> 2136 bytes .../hem/textures/screens/speedgauge18.png | Bin 0 -> 2134 bytes .../hem/textures/screens/speedgauge19.png | Bin 0 -> 2124 bytes .../hem/textures/screens/speedgauge2.png | Bin 0 -> 2119 bytes .../hem/textures/screens/speedgauge20.png | Bin 0 -> 2108 bytes .../hem/textures/screens/speedgauge21.png | Bin 0 -> 2106 bytes .../hem/textures/screens/speedgauge22.png | Bin 0 -> 2115 bytes .../hem/textures/screens/speedgauge23.png | Bin 0 -> 2104 bytes .../hem/textures/screens/speedgauge24.png | Bin 0 -> 2101 bytes .../hem/textures/screens/speedgauge25.png | Bin 0 -> 2105 bytes .../hem/textures/screens/speedgauge26.png | Bin 0 -> 2110 bytes .../hem/textures/screens/speedgauge27.png | Bin 0 -> 2101 bytes .../hem/textures/screens/speedgauge28.png | Bin 0 -> 2106 bytes .../hem/textures/screens/speedgauge29.png | Bin 0 -> 2125 bytes .../hem/textures/screens/speedgauge3.png | Bin 0 -> 2110 bytes .../hem/textures/screens/speedgauge30.png | Bin 0 -> 2124 bytes .../hem/textures/screens/speedgauge31.png | Bin 0 -> 2126 bytes .../hem/textures/screens/speedgauge4.png | Bin 0 -> 2113 bytes .../hem/textures/screens/speedgauge5.png | Bin 0 -> 2122 bytes .../hem/textures/screens/speedgauge6.png | Bin 0 -> 2117 bytes .../hem/textures/screens/speedgauge7.png | Bin 0 -> 2105 bytes .../hem/textures/screens/speedgauge8.png | Bin 0 -> 2097 bytes .../hem/textures/screens/speedgauge9.png | Bin 0 -> 2102 bytes .../hem/textures/screens/tempgauge0.png | Bin 0 -> 2225 bytes .../hem/textures/screens/tempgauge1.png | Bin 0 -> 2234 bytes .../hem/textures/screens/tempgauge10.png | Bin 0 -> 2214 bytes .../hem/textures/screens/tempgauge11.png | Bin 0 -> 2226 bytes .../hem/textures/screens/tempgauge12.png | Bin 0 -> 2215 bytes .../hem/textures/screens/tempgauge13.png | Bin 0 -> 2218 bytes .../hem/textures/screens/tempgauge14.png | Bin 0 -> 2222 bytes .../hem/textures/screens/tempgauge15.png | Bin 0 -> 2216 bytes .../hem/textures/screens/tempgauge16.png | Bin 0 -> 2216 bytes .../hem/textures/screens/tempgauge17.png | Bin 0 -> 2220 bytes .../hem/textures/screens/tempgauge18.png | Bin 0 -> 2221 bytes .../hem/textures/screens/tempgauge19.png | Bin 0 -> 2215 bytes .../hem/textures/screens/tempgauge2.png | Bin 0 -> 2233 bytes .../hem/textures/screens/tempgauge20.png | Bin 0 -> 2215 bytes .../hem/textures/screens/tempgauge21.png | Bin 0 -> 2223 bytes .../hem/textures/screens/tempgauge22.png | Bin 0 -> 2224 bytes .../hem/textures/screens/tempgauge23.png | Bin 0 -> 2205 bytes .../hem/textures/screens/tempgauge24.png | Bin 0 -> 2199 bytes .../hem/textures/screens/tempgauge25.png | Bin 0 -> 2208 bytes .../hem/textures/screens/tempgauge26.png | Bin 0 -> 2225 bytes .../hem/textures/screens/tempgauge27.png | Bin 0 -> 2214 bytes .../hem/textures/screens/tempgauge28.png | Bin 0 -> 2206 bytes .../hem/textures/screens/tempgauge29.png | Bin 0 -> 2226 bytes .../hem/textures/screens/tempgauge3.png | Bin 0 -> 2228 bytes .../hem/textures/screens/tempgauge30.png | Bin 0 -> 2229 bytes .../hem/textures/screens/tempgauge31.png | Bin 0 -> 2232 bytes .../hem/textures/screens/tempgauge4.png | Bin 0 -> 2216 bytes .../hem/textures/screens/tempgauge5.png | Bin 0 -> 2220 bytes .../hem/textures/screens/tempgauge6.png | Bin 0 -> 2218 bytes .../hem/textures/screens/tempgauge7.png | Bin 0 -> 2204 bytes .../hem/textures/screens/tempgauge8.png | Bin 0 -> 2203 bytes .../hem/textures/screens/tempgauge9.png | Bin 0 -> 2206 bytes .../hem/textures/screens/transparentgreen.png | Bin 0 -> 70 bytes .../data/forge/tags/blocks/solid_block.json | 383 +++ .../entity_types/vehicle_driver_seat.json | 7 + .../data/forge/tags/items/hem_fossilfuel.json | 41 + .../data/hem/dimension/blueleaf.json | 229 ++ .../data/hem/dimension_type/blueleaf.json | 17 + .../data/hem/recipes/craft_blue_cobble.json | 21 + .../data/hem/recipes/smelt_blue_cobble.json | 12 + .../11x11floatingislandundertree.nbt | Bin 0 -> 6151 bytes .../data/hem/structures/11x11generaltree.nbt | Bin 0 -> 5633 bytes .../hem/structures/11x17x11chunkmunch.nbt | Bin 0 -> 4681 bytes .../data/hem/structures/15x15_4swamptree.nbt | Bin 0 -> 14859 bytes .../data/hem/structures/15x15_4swamptree2.nbt | Bin 0 -> 14820 bytes .../structures/15x15generalfloatingisland.nbt | Bin 0 -> 15153 bytes .../data/hem/structures/15x15generaltree.nbt | Bin 0 -> 15017 bytes .../data/hem/structures/15x15lushtree.nbt | Bin 0 -> 14871 bytes .../data/hem/structures/5x5floatingisland.nbt | Bin 0 -> 1205 bytes .../structures/5x5floatingislandfragments.nbt | Bin 0 -> 994 bytes .../data/hem/structures/5x5lushshrub.nbt | Bin 0 -> 665 bytes .../data/hem/structures/5x5neatlushtree.nbt | Bin 0 -> 909 bytes .../data/hem/structures/5x5swampstructure.nbt | Bin 0 -> 908 bytes .../resources/data/hem/structures/anthill.nbt | Bin 0 -> 124 bytes .../data/hem/structures/boulder1.nbt | Bin 0 -> 572 bytes .../data/hem/structures/boulder2.nbt | Bin 0 -> 503 bytes .../data/hem/structures/boulder3.nbt | Bin 0 -> 1692 bytes .../data/hem/structures/boulder4.nbt | Bin 0 -> 621 bytes .../resources/data/hem/structures/bush1.nbt | Bin 0 -> 632 bytes .../resources/data/hem/structures/bush2.nbt | Bin 0 -> 262 bytes .../data/hem/structures/giantlilypad.nbt | Bin 0 -> 148 bytes .../resources/data/hem/structures/lilypad.nbt | Bin 0 -> 150 bytes .../data/hem/structures/muncherclosed.nbt | Bin 0 -> 178 bytes .../data/hem/structures/muncheropen.nbt | Bin 0 -> 185 bytes .../data/hem/structures/seagrass.nbt | Bin 0 -> 152 bytes .../resources/data/hem/structures/wall1.nbt | Bin 0 -> 212 bytes .../resources/data/hem/structures/wall2.nbt | Bin 0 -> 142 bytes .../resources/data/hem/structures/wall3.nbt | Bin 0 -> 157 bytes .../resources/data/hem/structures/wall4.nbt | Bin 0 -> 218 bytes .../resources/data/hem/structures/wall5.nbt | Bin 0 -> 191 bytes .../data/hem/structures/waterloggedgrass.nbt | Bin 0 -> 157 bytes .../hem/structures/waterloggedleaves3x3.nbt | Bin 0 -> 204 bytes .../entity_types/hem_altitude_vehicles.json | 6 + .../tags/entity_types/hem_heat_vehicles.json | 7 + .../entity_types/hem_odometer_vehicles.json | 6 + .../entity_types/hem_pressure_vehicles.json | 7 + .../tags/entity_types/hem_speed_vehicles.json | 6 + .../tags/items/stone_tool_materials.json | 6 + src/main/resources/hem.mixin.json | 12 + src/main/resources/logo.png | Bin 0 -> 26868 bytes src/main/resources/pack.mcmeta | 6 + 825 files changed, 41807 insertions(+) create mode 100644 .classpath create mode 100644 .gitignore create mode 100644 .project create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 hem_custom/mixin/CameraMixins.java create mode 100644 hem_custom/vehicles/VehicleCameraSettings.java create mode 100644 src/main/java/studio/halbear/hem/HemMod.java create mode 100644 src/main/java/studio/halbear/hem/HemModElements.java create mode 100644 src/main/java/studio/halbear/hem/HemModVariables.java create mode 100644 src/main/java/studio/halbear/hem/block/AntHillBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/AntsBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BloomedBulbFlowerBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BloomedMuncherBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafBlossomerBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafBrownCapBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafButterSlumpBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafCabbageFlowerBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafCobblestoneBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafCobblestoneSlabBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafCobblestoneStairsBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafCobblestoneWallBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafDeadLogBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafDirtBlockBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafDirtGrassBlockBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafFluorescentLeavesBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafGrassBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafGrassBlockBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafGravelMudBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafGreenCapBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafLavenderBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafLeavesBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafLilyPadBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafLogBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafLushLeavesBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafMatureBlossomerBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafMatureCabbageFlowerBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafMudBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafRedCapBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafRedwoodLeavesBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafRedwoodLogBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafSeaGrassBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafStoneBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafStoneGravelBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafStoneSlabBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafStoneStairBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafStoneWallBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafTallBloomingFlowerBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafTallGrassBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafTallSproutBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafWheatBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BlueleafWoodBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/BulbFlowerBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/DanglingFluorescentLeavesBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/FallenLeavesBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/GiantLilyPadBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/MuncherBlock.java create mode 100644 src/main/java/studio/halbear/hem/block/MuncherSproutBlock.java create mode 100644 src/main/java/studio/halbear/hem/entity/AirboatEntity.java create mode 100644 src/main/java/studio/halbear/hem/entity/DormantAgedEmberleafMilitaryBotEntity.java create mode 100644 src/main/java/studio/halbear/hem/entity/DormantEmberleafMilitaryBotEntity.java create mode 100644 src/main/java/studio/halbear/hem/entity/EmberleafMilitaryBotEntity.java create mode 100644 src/main/java/studio/halbear/hem/entity/EmberleafMilitaryRobotLowerHalfEntity.java create mode 100644 src/main/java/studio/halbear/hem/entity/EmberleafMilitaryRobotUpperHalfEntity.java create mode 100644 src/main/java/studio/halbear/hem/entity/FluffaloEntity.java create mode 100644 src/main/java/studio/halbear/hem/entity/FluffaloShavedEntity.java create mode 100644 src/main/java/studio/halbear/hem/entity/GiantButterflyEntity.java create mode 100644 src/main/java/studio/halbear/hem/entity/GiantButterflyWalkingEntity.java create mode 100644 src/main/java/studio/halbear/hem/entity/GoldFishEntity.java create mode 100644 src/main/java/studio/halbear/hem/entity/HotAirBalloonEntity.java create mode 100644 src/main/java/studio/halbear/hem/entity/LadyBugInFlightEntity.java create mode 100644 src/main/java/studio/halbear/hem/entity/LadybugEntity.java create mode 100644 src/main/java/studio/halbear/hem/entity/TigerFishEntity.java create mode 100644 src/main/java/studio/halbear/hem/entity/renderer/AirboatRenderer.java create mode 100644 src/main/java/studio/halbear/hem/entity/renderer/DormantAgedEmberleafMilitaryBotRenderer.java create mode 100644 src/main/java/studio/halbear/hem/entity/renderer/DormantEmberleafMilitaryBotRenderer.java create mode 100644 src/main/java/studio/halbear/hem/entity/renderer/EmberleafMilitaryBotRenderer.java create mode 100644 src/main/java/studio/halbear/hem/entity/renderer/EmberleafMilitaryRobotLowerHalfRenderer.java create mode 100644 src/main/java/studio/halbear/hem/entity/renderer/EmberleafMilitaryRobotUpperHalfRenderer.java create mode 100644 src/main/java/studio/halbear/hem/entity/renderer/FluffaloRenderer.java create mode 100644 src/main/java/studio/halbear/hem/entity/renderer/FluffaloShavedRenderer.java create mode 100644 src/main/java/studio/halbear/hem/entity/renderer/GiantButterflyRenderer.java create mode 100644 src/main/java/studio/halbear/hem/entity/renderer/GiantButterflyWalkingRenderer.java create mode 100644 src/main/java/studio/halbear/hem/entity/renderer/GoldFishRenderer.java create mode 100644 src/main/java/studio/halbear/hem/entity/renderer/HotAirBalloonRenderer.java create mode 100644 src/main/java/studio/halbear/hem/entity/renderer/LadyBugInFlightRenderer.java create mode 100644 src/main/java/studio/halbear/hem/entity/renderer/LadybugRenderer.java create mode 100644 src/main/java/studio/halbear/hem/entity/renderer/TigerFishRenderer.java create mode 100644 src/main/java/studio/halbear/hem/gui/AirboatGasCelViewGui.java create mode 100644 src/main/java/studio/halbear/hem/gui/AirboatGasCelViewGuiWindow.java create mode 100644 src/main/java/studio/halbear/hem/gui/overlay/AltimeterOverlay.java create mode 100644 src/main/java/studio/halbear/hem/gui/overlay/GooedOverlayOverlay.java create mode 100644 src/main/java/studio/halbear/hem/gui/overlay/HotAirBalloonUIOverlay.java create mode 100644 src/main/java/studio/halbear/hem/gui/overlay/OdometerOverlay.java create mode 100644 src/main/java/studio/halbear/hem/gui/overlay/PressureGaugeOverlay.java create mode 100644 src/main/java/studio/halbear/hem/gui/overlay/SpeedGaugeOverlay.java create mode 100644 src/main/java/studio/halbear/hem/gui/overlay/TemperatureGaugeOverlay.java create mode 100644 src/main/java/studio/halbear/hem/item/BlueleafItem.java create mode 100644 src/main/java/studio/halbear/hem/item/ButterflySpawnEggItem.java create mode 100644 src/main/java/studio/halbear/hem/item/FluffaloTuftItem.java create mode 100644 src/main/java/studio/halbear/hem/item/GasCanister612litreItem.java create mode 100644 src/main/java/studio/halbear/hem/item/GoldFishItemItem.java create mode 100644 src/main/java/studio/halbear/hem/item/HotAirBalloonItemItem.java create mode 100644 src/main/java/studio/halbear/hem/item/LadybugSpawnEggItem.java create mode 100644 src/main/java/studio/halbear/hem/item/TigerFishItemItem.java create mode 100644 src/main/java/studio/halbear/hem/itemgroup/BlueleafTabItemGroup.java create mode 100644 src/main/java/studio/halbear/hem/itemgroup/HalsExplorationModTechItemGroup.java create mode 100644 src/main/java/studio/halbear/hem/keybind/OpenGasCellViewKeyBinding.java create mode 100644 src/main/java/studio/halbear/hem/keybind/VehicleAccelerateKeyBinding.java create mode 100644 src/main/java/studio/halbear/hem/keybind/VehicleBackwardKeyBinding.java create mode 100644 src/main/java/studio/halbear/hem/keybind/VehicleDecelerateKeyBinding.java create mode 100644 src/main/java/studio/halbear/hem/keybind/VehicleForwardKeyBinding.java create mode 100644 src/main/java/studio/halbear/hem/keybind/VehicleIncreasePressureKeyBinding.java create mode 100644 src/main/java/studio/halbear/hem/keybind/VehicleReleasePressureKeyBinding.java create mode 100644 src/main/java/studio/halbear/hem/keybind/VehicleStrafeLeftKeyBinding.java create mode 100644 src/main/java/studio/halbear/hem/keybind/VehicleStrafeRightKeyBinding.java create mode 100644 src/main/java/studio/halbear/hem/keybind/VehicleTurnLeftKeyBinding.java create mode 100644 src/main/java/studio/halbear/hem/keybind/VehicleTurnRightKeyBinding.java create mode 100644 src/main/java/studio/halbear/hem/particle/BlueLeavesParticle.java create mode 100644 src/main/java/studio/halbear/hem/particle/BlueleafAmbienceParticle.java create mode 100644 src/main/java/studio/halbear/hem/particle/FluorescentLeavesParticlesParticle.java create mode 100644 src/main/java/studio/halbear/hem/particle/LavenderParticlesParticle.java create mode 100644 src/main/java/studio/halbear/hem/particle/LilyPadParticlesParticle.java create mode 100644 src/main/java/studio/halbear/hem/particle/RobotDamageParticle.java create mode 100644 src/main/java/studio/halbear/hem/particle/SevereDamageParticlesParticle.java create mode 100644 src/main/java/studio/halbear/hem/potion/GooedPotionEffect.java create mode 100644 src/main/java/studio/halbear/hem/procedures/AirboatOnEntityTickUpdateProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/AirboatOnInitialEntitySpawnProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/AirboatRightClickedOnEntityProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/AntHillSpawnOnStructureInstanceGeneratedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/AntHillUpdateTickProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/AntsBlockAddedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/AntsEntityWalksOnTheBlockProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/BloomedBulbFlowerUpdateTickProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/BloomedMuncherEntityCollidesInTheBlockProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/BloomedMuncherUpdateTickProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/BlueleafFluorescentLeavesParticleSpawningConditionProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/BlueleafLavenderConditionProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/BlueleafLavenderMobplayerCollidesWithPlantProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/BlueleafLavenderUpdateTickProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/BlueleafWheatAdditionalGenerationConditionProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/BlueleavesCollideProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/Boulder4AdditionalGenerationConditionProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/BulbFlowerPlantRightClickedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/BulbFlowerUpdateTickProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/ButterflySpawnEggUseOnBlockProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/CancelFallDamageProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/DanglingFluorescentLeavesBlockValidPlacementConditionProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/DanglingFluorescentLeavesNeighbourBlockChangesProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/DormantAgedEmberleafMilitaryBotEntityShakingConditionProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/DormantAgedEmberleafMilitaryBotOnEntityTickUpdateProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/DrivingVehicleCheckProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/EmberleafMilitaryBotEntityDiesProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/EmberleafMilitaryBotEntityIsHurtProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/EmberleafMilitaryBotOnEntityTickUpdateProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/EmberleafMilitaryRobotLowerHalfOnEntityTickUpdateProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/EmberleafMilitaryRobotLowerHalfOnInitialEntitySpawnProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/FallenLeavesEntityCollidesInTheBlockProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/FluffaloRightClickedOnEntityProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/FluffaloShavedEntityShakingConditionProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/FluffaloShavedOnEntityTickUpdateProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/FluffaloShavedOnInitialEntitySpawnProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/FluorescentLeavesParticlesAdditionalParticleExpiryConditionProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/GasCanister612litreItemInInventoryTickProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/GasCanister612litreItemIsCraftedsmeltedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/GettingEatenProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/GiantButterflyOnEntityTickUpdateProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/GiantButterflyWalkingNaturalEntitySpawningConditionProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/GiantButterflyWalkingOnEntityTickUpdateProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/GiantLilyPadEntityCollidesInTheBlockProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/GooedActiveTickConditionProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/GooedEffectStartedappliedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/GooedOnEffectActiveTickProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/GooedOverlayDisplayOverlayIngameProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/HotAirBalloonItemRightclickedOnBlockProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/HotAirBalloonOnEntityTickUpdateProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/HotAirBalloonOnInitialEntitySpawnProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/HotAirBalloonRightClickedOnEntityProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/HotAirBalloonUIDisplayOverlayIngame2Procedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/HotAirBalloonUIDisplayOverlayIngameProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/LadyBugInFlightOnEntityTickUpdateProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/LadybugOnEntityTickUpdateProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/LadybugSpawnEggRightclickedOnBlockProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/LushTree1AdditionalGenerationConditionProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/MuncherBlockDestroyedByPlayerProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/MuncherGenerationAdditionalGenerationConditionProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/MuncherGenerationOnStructureInstanceGeneratedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/MuncherPlantAddedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/MuncherSproutAdditionalGenerationConditionProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/MuncherSproutClientDisplayRandomTickProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/MuncherUpdateTickProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/OpenGasCellViewOnKeyReleasedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/SeaGrassGenerationAdditionalGenerationConditionProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/SpeedCalculationProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/TigerFishEntityShakingConditionProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/TigerFishOnEntityTickUpdateProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/VehicleAccelerateOnKeyPressedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/VehicleAccelerateOnKeyReleasedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/VehicleBackwardOnKeyPressedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/VehicleBackwardOnKeyReleasedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/VehicleDecelerateOnKeyPressedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/VehicleDecelerateOnKeyReleasedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/VehicleForwardOnKeyPressedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/VehicleForwardOnKeyReleasedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/VehicleIncreasePressureOnKeyPressedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/VehicleIncreasePressureOnKeyReleasedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/VehicleReleasePressureOnKeyPressedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/VehicleReleasePressureOnKeyReleasedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/VehicleStrafeLeftOnKeyPressedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/VehicleStrafeLeftOnKeyReleasedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/VehicleStrafeRightOnKeyPressedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/VehicleStrafeRightOnKeyReleasedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/VehicleTurnLeftOnKeyPressedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/VehicleTurnLeftOnKeyReleasedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/VehicleTurnRightOnKeyPressedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/VehicleTurnRightOnKeyReleasedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/VehicleYawProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/Wall1AdditionalGenerationConditionProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/Wall1OnStructureInstanceGeneratedProcedure.java create mode 100644 src/main/java/studio/halbear/hem/world/biome/BlueleafPlainsBiome.java create mode 100644 src/main/java/studio/halbear/hem/world/biome/BlueleafWheatFieldsBiome.java create mode 100644 src/main/java/studio/halbear/hem/world/biome/HeightendBlueleafPlainsBiome.java create mode 100644 src/main/java/studio/halbear/hem/world/biome/LushBlueleafMarshBiome.java create mode 100644 src/main/java/studio/halbear/hem/world/biome/LushBlueleafPlainsBiome.java create mode 100644 src/main/java/studio/halbear/hem/world/dimension/BlueleafDimension.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/AntHillSpawnStructure.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/Boulder1Structure.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/Boulder2Structure.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/Boulder3Structure.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/Boulder4Structure.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/Bush1Structure.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/Bush2Structure.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/FloatingIsland5x5Structure.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/Floatingisland15x15Structure.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/Floatingislandflipped11x11Structure.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/Islandfragments5x5Structure.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/LilyPadExtraGenerationStructure.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/LilyPadGenerationStructure.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/LushTree1Structure.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/SeaGrassGenerationStructure.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/SmallLilyPadGenerationStructure.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/SwampTree2Structure.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/SwampTreeGenerationStructure.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/Swampstructure5x5Structure.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/Tree11x11Structure.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/Tree15x15Structure.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/Wall1Structure.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/Wall2Structure.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/Wall3Structure.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/Wall4Structure.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/Wall5Structure.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/WaterLoggedLeavesGenerationStructure.java create mode 100644 src/main/java/studio/halbear/hem/world/structure/WaterloggedLeaves3x3Structure.java create mode 100644 src/main/java/studio/halbear/hem_custom/mixin/CameraMixins.java create mode 100644 src/main/java/studio/halbear/hem_custom/vehicles/VehicleCameraSettings.java create mode 100644 src/main/resources/META-INF/mods.toml create mode 100644 src/main/resources/assets/hem/blockstates/ant_hill.json create mode 100644 src/main/resources/assets/hem/blockstates/ants.json create mode 100644 src/main/resources/assets/hem/blockstates/bloomed_bulb_flower.json create mode 100644 src/main/resources/assets/hem/blockstates/bloomed_muncher.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_blossomer.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_brown_cap.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_butter_slump.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_cabbage_flower.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_cobblestone.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_cobblestone_slab.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_cobblestone_stairs.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_cobblestone_wall.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_dead_log.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_dirt_block.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_dirt_grass_block.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_fluorescent_leaves.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_grass.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_grass_block.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_gravel_mud.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_green_cap.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_lavender.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_leaves.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_lily_pad.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_log.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_lush_leaves.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_mature_blossomer.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_mature_cabbage_flower.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_mud.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_portal.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_red_cap.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_redwood_leaves.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_redwood_log.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_sea_grass.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_stone.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_stone_gravel.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_stone_slab.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_stone_stair.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_stone_wall.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_tall_blooming_flower.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_tall_grass.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_tall_sprout.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_wheat.json create mode 100644 src/main/resources/assets/hem/blockstates/blueleaf_wood.json create mode 100644 src/main/resources/assets/hem/blockstates/bulb_flower.json create mode 100644 src/main/resources/assets/hem/blockstates/dangling_fluorescent_leaves.json create mode 100644 src/main/resources/assets/hem/blockstates/fallen_leaves.json create mode 100644 src/main/resources/assets/hem/blockstates/giant_lily_pad.json create mode 100644 src/main/resources/assets/hem/blockstates/muncher.json create mode 100644 src/main/resources/assets/hem/blockstates/muncher_sprout.json create mode 100644 src/main/resources/assets/hem/lang/en_us.json create mode 100644 src/main/resources/assets/hem/models/block/ant_hill.json create mode 100644 src/main/resources/assets/hem/models/block/ants.json create mode 100644 src/main/resources/assets/hem/models/block/bloomed_bulb_flower.json create mode 100644 src/main/resources/assets/hem/models/block/bloomed_muncher.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_blossomer.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_brown_cap.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_butter_slump.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_cabbage_flower.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_cobblestone.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_cobblestone_slab.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_cobblestone_slab_full.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_cobblestone_slab_top.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_cobblestone_stairs.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_cobblestone_stairs_inner.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_cobblestone_stairs_outer.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_cobblestone_wall.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_cobblestone_wall_inventory.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_cobblestone_wall_post.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_cobblestone_wall_side_tall.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_dead_log.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_dirt_block.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_dirt_coarse_block.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_dirt_grass_block.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_fluorescent_leaves.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_grass.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_grass_block.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_grass_gravel_mud.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_grass_medium.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_grass_short.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_grass_stone_mud.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_grass_super_short.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_grass_tall.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_gravel_mud.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_green_cap.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_lavender.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_leaves.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_leaves_dense.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_leaves_sparse.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_lily_pad.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_log.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_lush_leaves.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_lush_leaves_dark.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_lush_leaves_scarse.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_mature_blossomer.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_mature_cabbage_flower.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_mud.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_portal_ew.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_portal_ns.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_red_cap.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_redwood_leaves.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_redwood_log.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_sea_grass.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_stone.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_stone_gravel.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_stone_mud.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_stone_slab.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_stone_slab_full.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_stone_slab_top.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_stone_stair.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_stone_stair_inner.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_stone_stair_outer.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_stone_wall.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_stone_wall_inventory.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_stone_wall_post.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_stone_wall_side_tall.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_stony_mud.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_tall_blooming_flower.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_tall_blooming_flower_bottom.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_tall_grass.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_tall_grass_bottom.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_tall_sprout.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_tall_sprout_bottom.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_wheat.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_wheat_bottom.json create mode 100644 src/main/resources/assets/hem/models/block/blueleaf_wood.json create mode 100644 src/main/resources/assets/hem/models/block/bulb_flower.json create mode 100644 src/main/resources/assets/hem/models/block/bulb_flower_bottom.json create mode 100644 src/main/resources/assets/hem/models/block/dangling_fluorescent_leaves.json create mode 100644 src/main/resources/assets/hem/models/block/fallen_leaves.json create mode 100644 src/main/resources/assets/hem/models/block/giant_lily_pad.json create mode 100644 src/main/resources/assets/hem/models/block/giant_lily_pad_flowerless.json create mode 100644 src/main/resources/assets/hem/models/block/grass/blueleaf_dirt_grass_alternate.json create mode 100644 src/main/resources/assets/hem/models/block/grass/blueleaf_dirt_grass_bright.json create mode 100644 src/main/resources/assets/hem/models/block/grass/blueleaf_dirt_grass_flower.json create mode 100644 src/main/resources/assets/hem/models/block/grass/blueleaf_dirt_grass_flowers.json create mode 100644 src/main/resources/assets/hem/models/block/grass/blueleaf_grass_block_alternate.json create mode 100644 src/main/resources/assets/hem/models/block/grass/blueleaf_grass_block_bright.json create mode 100644 src/main/resources/assets/hem/models/block/grass/blueleaf_grass_block_flower.json create mode 100644 src/main/resources/assets/hem/models/block/grass/blueleaf_grass_block_flowers.json create mode 100644 src/main/resources/assets/hem/models/block/muncher.json create mode 100644 src/main/resources/assets/hem/models/block/muncher_sprout.json create mode 100644 src/main/resources/assets/hem/models/custom/anthill.json create mode 100644 src/main/resources/assets/hem/models/custom/ants.json create mode 100644 src/main/resources/assets/hem/models/custom/blueleaflilypad.json create mode 100644 src/main/resources/assets/hem/models/custom/bulbflower.json create mode 100644 src/main/resources/assets/hem/models/custom/bulbflowerclosed.json create mode 100644 src/main/resources/assets/hem/models/custom/canister612l.json create mode 100644 src/main/resources/assets/hem/models/custom/chomperclosed.json create mode 100644 src/main/resources/assets/hem/models/custom/giantlilypad.json create mode 100644 src/main/resources/assets/hem/models/custom/giantlilypadnoflower.json create mode 100644 src/main/resources/assets/hem/models/custom/lavender.json create mode 100644 src/main/resources/assets/hem/models/custom/leafpile.json create mode 100644 src/main/resources/assets/hem/models/custom/leafpilewaterlogged.json create mode 100644 src/main/resources/assets/hem/models/custom/leaves.json create mode 100644 src/main/resources/assets/hem/models/custom/openmuncher.json create mode 100644 src/main/resources/assets/hem/models/custom/shadedcrossmodel.json create mode 100644 src/main/resources/assets/hem/models/custom/wheat.json create mode 100644 src/main/resources/assets/hem/models/item/airboat_spawn_egg.json create mode 100644 src/main/resources/assets/hem/models/item/ant_hill.json create mode 100644 src/main/resources/assets/hem/models/item/ants.json create mode 100644 src/main/resources/assets/hem/models/item/bloomed_bulb_flower.json create mode 100644 src/main/resources/assets/hem/models/item/bloomed_muncher.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_blossomer.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_brown_cap.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_butter_slump.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_cabbage_flower.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_cobblestone.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_cobblestone_slab.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_cobblestone_stairs.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_cobblestone_wall.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_dead_log.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_dirt_block.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_dirt_grass_block.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_fluorescent_leaves.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_grass.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_grass_block.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_gravel_mud.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_green_cap.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_lavender.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_leaves.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_lily_pad.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_log.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_lush_leaves.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_mature_blossomer.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_mature_cabbage_flower.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_mud.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_red_cap.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_redwood_leaves.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_redwood_log.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_sea_grass.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_stone.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_stone_gravel.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_stone_slab.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_stone_stair.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_stone_wall.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_tall_blooming_flower.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_tall_grass.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_tall_sprout.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_wheat.json create mode 100644 src/main/resources/assets/hem/models/item/blueleaf_wood.json create mode 100644 src/main/resources/assets/hem/models/item/bulb_flower.json create mode 100644 src/main/resources/assets/hem/models/item/butterfly_spawn_egg.json create mode 100644 src/main/resources/assets/hem/models/item/dangling_fluorescent_leaves.json create mode 100644 src/main/resources/assets/hem/models/item/dormant_aged_emberleaf_military_bot_spawn_egg.json create mode 100644 src/main/resources/assets/hem/models/item/dormant_emberleaf_military_bot_spawn_egg.json create mode 100644 src/main/resources/assets/hem/models/item/emberleaf_military_bot_spawn_egg.json create mode 100644 src/main/resources/assets/hem/models/item/emberleaf_military_robot_lower_half_spawn_egg.json create mode 100644 src/main/resources/assets/hem/models/item/emberleaf_military_robot_upper_half_spawn_egg.json create mode 100644 src/main/resources/assets/hem/models/item/fallen_leaves.json create mode 100644 src/main/resources/assets/hem/models/item/fluffalo_spawn_egg.json create mode 100644 src/main/resources/assets/hem/models/item/fluffalo_tuft.json create mode 100644 src/main/resources/assets/hem/models/item/gas_canister_612litre.json create mode 100644 src/main/resources/assets/hem/models/item/giant_lily_pad.json create mode 100644 src/main/resources/assets/hem/models/item/gold_fish_item.json create mode 100644 src/main/resources/assets/hem/models/item/gold_fish_spawn_egg.json create mode 100644 src/main/resources/assets/hem/models/item/hot_air_balloon_item.json create mode 100644 src/main/resources/assets/hem/models/item/ladybug_spawn_egg.json create mode 100644 src/main/resources/assets/hem/models/item/muncher.json create mode 100644 src/main/resources/assets/hem/models/item/muncher_sprout.json create mode 100644 src/main/resources/assets/hem/models/item/tiger_fish_item.json create mode 100644 src/main/resources/assets/hem/models/item/tiger_fish_spawn_egg.json create mode 100644 src/main/resources/assets/hem/particles/blue_leaves.json create mode 100644 src/main/resources/assets/hem/particles/blueleaf_ambience.json create mode 100644 src/main/resources/assets/hem/particles/fluorescent_leaves_particles.json create mode 100644 src/main/resources/assets/hem/particles/lavender_particles.json create mode 100644 src/main/resources/assets/hem/particles/lily_pad_particles.json create mode 100644 src/main/resources/assets/hem/particles/robot_damage.json create mode 100644 src/main/resources/assets/hem/particles/severe_damage_particles.json create mode 100644 src/main/resources/assets/hem/textures/blocks/612lcanister.png create mode 100644 src/main/resources/assets/hem/textures/blocks/anthill.png create mode 100644 src/main/resources/assets/hem/textures/blocks/ants-sheet.png create mode 100644 src/main/resources/assets/hem/textures/blocks/ants-sheet.png.mcmeta create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafbloomingflower.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafbloomingflowerbottom.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafblossomer.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafbrowncap.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafbutterslump.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafdeadlogside.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafdeadlogsidecracked.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafdeadlogtop.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafdefaultleaves.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafdefaultleavesdense.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafdefaultleavessparse.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafdirt.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafdirtcoarse.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafearlybulbflowerbottom.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafearlybulbflowertop.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafgrasscurly.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafgrassmedium.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafgrassshort.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafgrasssidedirt.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafgrasssidestone.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafgrasssupershort.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafgrasstall.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafgrasstop.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafgrasstopalternate.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafgrasstopbright.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafgrasstopflower.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafgrasstopflowers.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafgreencap.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafleaves.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafleavesdark.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafleavesfir.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafleavesscarse.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleaflogside.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleaflogtop.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleaflushleaves.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafmatureblossomer.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafmaturecabbageflower.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafmuncherclosed.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafredcap.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafredwoodlogside.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafredwoodlogtop.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafrottenlogside.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafrottenlogtop.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafseagrass.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafseagrass.png.mcmeta create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafsproutbottom.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafsprouttop.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafstone.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafstonecobble.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafstonegemore.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafstonegravel.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafstonemineralore.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleaftallgrassbottom.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleaftallgrasstop.png create mode 100644 src/main/resources/assets/hem/textures/blocks/blueleafyoungcabbageflowerr.png create mode 100644 src/main/resources/assets/hem/textures/blocks/bulbflower.png create mode 100644 src/main/resources/assets/hem/textures/blocks/bulbflowerclose.png create mode 100644 src/main/resources/assets/hem/textures/blocks/danglingfluorescentleaves.png create mode 100644 src/main/resources/assets/hem/textures/blocks/giantlilypad.png create mode 100644 src/main/resources/assets/hem/textures/blocks/grassycobble.png create mode 100644 src/main/resources/assets/hem/textures/blocks/grassycobbleside.png create mode 100644 src/main/resources/assets/hem/textures/blocks/lavenderblueleaf.png create mode 100644 src/main/resources/assets/hem/textures/blocks/lavenderblueleafbottom.png create mode 100644 src/main/resources/assets/hem/textures/blocks/lavenderblueleaftop.png create mode 100644 src/main/resources/assets/hem/textures/blocks/leaves.png create mode 100644 src/main/resources/assets/hem/textures/blocks/leavesoverhang.png create mode 100644 src/main/resources/assets/hem/textures/blocks/lilypad.png create mode 100644 src/main/resources/assets/hem/textures/blocks/mud.png create mode 100644 src/main/resources/assets/hem/textures/blocks/muddygravelside.png create mode 100644 src/main/resources/assets/hem/textures/blocks/munchersprout.png create mode 100644 src/main/resources/assets/hem/textures/blocks/openmuncher.png create mode 100644 src/main/resources/assets/hem/textures/blocks/pebblygrass.png create mode 100644 src/main/resources/assets/hem/textures/blocks/stonymud.png create mode 100644 src/main/resources/assets/hem/textures/blocks/wheat.png create mode 100644 src/main/resources/assets/hem/textures/blocks/wheetbottom.png create mode 100644 src/main/resources/assets/hem/textures/blocks/wheettop.png create mode 100644 src/main/resources/assets/hem/textures/entities/airboat.png create mode 100644 src/main/resources/assets/hem/textures/entities/emberleafmilitaryrobot.png create mode 100644 src/main/resources/assets/hem/textures/entities/emberleafmilitaryrobotaged.png create mode 100644 src/main/resources/assets/hem/textures/entities/emberleafmilitaryrobotawake.png create mode 100644 src/main/resources/assets/hem/textures/entities/emberleafmilitaryrobotdestroyed.png create mode 100644 src/main/resources/assets/hem/textures/entities/fluffalo.png create mode 100644 src/main/resources/assets/hem/textures/entities/giantbutterfly.png create mode 100644 src/main/resources/assets/hem/textures/entities/goldfish.png create mode 100644 src/main/resources/assets/hem/textures/entities/hotairballoon.png create mode 100644 src/main/resources/assets/hem/textures/entities/ladybug.png create mode 100644 src/main/resources/assets/hem/textures/entities/tigerfish.png create mode 100644 src/main/resources/assets/hem/textures/entities/tigerfishglowlayer.png create mode 100644 src/main/resources/assets/hem/textures/items/612lcanister.png create mode 100644 src/main/resources/assets/hem/textures/items/ant.png create mode 100644 src/main/resources/assets/hem/textures/items/blueleafdefaultleavessparse.png create mode 100644 src/main/resources/assets/hem/textures/items/blueleafearlybulbflowertop.png create mode 100644 src/main/resources/assets/hem/textures/items/blueleafgrasstall.png create mode 100644 src/main/resources/assets/hem/textures/items/butterfly.png create mode 100644 src/main/resources/assets/hem/textures/items/chompertop.png create mode 100644 src/main/resources/assets/hem/textures/items/danglingfluorescentleaves.png create mode 100644 src/main/resources/assets/hem/textures/items/fluffalotuft.png create mode 100644 src/main/resources/assets/hem/textures/items/goldfish.png create mode 100644 src/main/resources/assets/hem/textures/items/hotairballoonitem.png create mode 100644 src/main/resources/assets/hem/textures/items/ladybird.png create mode 100644 src/main/resources/assets/hem/textures/items/lavenderblueleaftop.png create mode 100644 src/main/resources/assets/hem/textures/items/lilypad.png create mode 100644 src/main/resources/assets/hem/textures/items/tigerfish.png create mode 100644 src/main/resources/assets/hem/textures/items/wheat.png create mode 100644 src/main/resources/assets/hem/textures/items/wheettop.png create mode 100644 src/main/resources/assets/hem/textures/logo.png create mode 100644 src/main/resources/assets/hem/textures/mob_effect/gooed.png create mode 100644 src/main/resources/assets/hem/textures/particle/ambientparticle.png create mode 100644 src/main/resources/assets/hem/textures/particle/blue_leaves_1.png create mode 100644 src/main/resources/assets/hem/textures/particle/blue_leaves_2.png create mode 100644 src/main/resources/assets/hem/textures/particle/blue_leaves_3.png create mode 100644 src/main/resources/assets/hem/textures/particle/blue_leaves_4.png create mode 100644 src/main/resources/assets/hem/textures/particle/blue_leaves_5.png create mode 100644 src/main/resources/assets/hem/textures/particle/blue_leaves_6.png create mode 100644 src/main/resources/assets/hem/textures/particle/blue_leaves_7.png create mode 100644 src/main/resources/assets/hem/textures/particle/blue_leaves_8.png create mode 100644 src/main/resources/assets/hem/textures/particle/blueleaf_ambience_1.png create mode 100644 src/main/resources/assets/hem/textures/particle/blueleaf_ambience_2.png create mode 100644 src/main/resources/assets/hem/textures/particle/blueleaf_ambience_3.png create mode 100644 src/main/resources/assets/hem/textures/particle/blueleaf_ambience_4.png create mode 100644 src/main/resources/assets/hem/textures/particle/blueleaves.png create mode 100644 src/main/resources/assets/hem/textures/particle/damageparticlesheet.png create mode 100644 src/main/resources/assets/hem/textures/particle/fluorescent_leaves_particles_1.png create mode 100644 src/main/resources/assets/hem/textures/particle/fluorescent_leaves_particles_2.png create mode 100644 src/main/resources/assets/hem/textures/particle/fluorescent_leaves_particles_3.png create mode 100644 src/main/resources/assets/hem/textures/particle/fluorescent_leaves_particles_4.png create mode 100644 src/main/resources/assets/hem/textures/particle/fluorescent_leaves_particles_5.png create mode 100644 src/main/resources/assets/hem/textures/particle/fluorescent_leaves_particles_6.png create mode 100644 src/main/resources/assets/hem/textures/particle/fluorescent_leaves_particles_7.png create mode 100644 src/main/resources/assets/hem/textures/particle/fluorescent_leaves_particles_8.png create mode 100644 src/main/resources/assets/hem/textures/particle/fluorescentleafs.png create mode 100644 src/main/resources/assets/hem/textures/particle/lavender_particles_1.png create mode 100644 src/main/resources/assets/hem/textures/particle/lavender_particles_2.png create mode 100644 src/main/resources/assets/hem/textures/particle/lavender_particles_3.png create mode 100644 src/main/resources/assets/hem/textures/particle/lavender_particles_4.png create mode 100644 src/main/resources/assets/hem/textures/particle/lavender_particles_5.png create mode 100644 src/main/resources/assets/hem/textures/particle/lavender_particles_6.png create mode 100644 src/main/resources/assets/hem/textures/particle/lavenderblueleafparticles.png create mode 100644 src/main/resources/assets/hem/textures/particle/lily_pad_particles_1.png create mode 100644 src/main/resources/assets/hem/textures/particle/lily_pad_particles_2.png create mode 100644 src/main/resources/assets/hem/textures/particle/lily_pad_particles_3.png create mode 100644 src/main/resources/assets/hem/textures/particle/lily_pad_particles_4.png create mode 100644 src/main/resources/assets/hem/textures/particle/lilypadparticles.png create mode 100644 src/main/resources/assets/hem/textures/particle/robot_damage_1.png create mode 100644 src/main/resources/assets/hem/textures/particle/robot_damage_2.png create mode 100644 src/main/resources/assets/hem/textures/particle/robot_damage_3.png create mode 100644 src/main/resources/assets/hem/textures/particle/robot_damage_4.png create mode 100644 src/main/resources/assets/hem/textures/particle/robot_damage_5.png create mode 100644 src/main/resources/assets/hem/textures/particle/robot_damage_6.png create mode 100644 src/main/resources/assets/hem/textures/particle/robot_damage_7.png create mode 100644 src/main/resources/assets/hem/textures/particle/robot_damage_8.png create mode 100644 src/main/resources/assets/hem/textures/particle/robotdamageparticles.png create mode 100644 src/main/resources/assets/hem/textures/particle/severe_damage_particles_1.png create mode 100644 src/main/resources/assets/hem/textures/particle/severe_damage_particles_2.png create mode 100644 src/main/resources/assets/hem/textures/particle/severe_damage_particles_3.png create mode 100644 src/main/resources/assets/hem/textures/particle/severe_damage_particles_4.png create mode 100644 src/main/resources/assets/hem/textures/screens/airboat_gas_cel_view.png create mode 100644 src/main/resources/assets/hem/textures/screens/airshipheliumui.png create mode 100644 src/main/resources/assets/hem/textures/screens/altimeter.png create mode 100644 src/main/resources/assets/hem/textures/screens/gooed.png create mode 100644 src/main/resources/assets/hem/textures/screens/gooed1.png create mode 100644 src/main/resources/assets/hem/textures/screens/gooed2.png create mode 100644 src/main/resources/assets/hem/textures/screens/gooed3.png create mode 100644 src/main/resources/assets/hem/textures/screens/heliumfilluibottom.png create mode 100644 src/main/resources/assets/hem/textures/screens/heliumfilluiprogress.png create mode 100644 src/main/resources/assets/hem/textures/screens/heliumfilluitop.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage0.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage1.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage10.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage11.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage12.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage13.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage14.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage15.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage16.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage17.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage18.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage19.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage2.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage20.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage21.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage22.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage23.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage24.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage25.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage26.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage27.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage28.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage29.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage3.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage30.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage31.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage4.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage5.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage6.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage7.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage8.png create mode 100644 src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage9.png create mode 100644 src/main/resources/assets/hem/textures/screens/odometer.png create mode 100644 src/main/resources/assets/hem/textures/screens/odometernumber0.png create mode 100644 src/main/resources/assets/hem/textures/screens/odometernumber1.png create mode 100644 src/main/resources/assets/hem/textures/screens/odometernumber2.png create mode 100644 src/main/resources/assets/hem/textures/screens/odometernumber3.png create mode 100644 src/main/resources/assets/hem/textures/screens/odometernumber4.png create mode 100644 src/main/resources/assets/hem/textures/screens/odometernumber5.png create mode 100644 src/main/resources/assets/hem/textures/screens/odometernumber6.png create mode 100644 src/main/resources/assets/hem/textures/screens/odometernumber7.png create mode 100644 src/main/resources/assets/hem/textures/screens/odometernumber8.png create mode 100644 src/main/resources/assets/hem/textures/screens/odometernumber9.png create mode 100644 src/main/resources/assets/hem/textures/screens/odometernumberdecimal0.png create mode 100644 src/main/resources/assets/hem/textures/screens/odometernumberdecimal1.png create mode 100644 src/main/resources/assets/hem/textures/screens/odometernumberdecimal2.png create mode 100644 src/main/resources/assets/hem/textures/screens/odometernumberdecimal3.png create mode 100644 src/main/resources/assets/hem/textures/screens/odometernumberdecimal4.png create mode 100644 src/main/resources/assets/hem/textures/screens/odometernumberdecimal5.png create mode 100644 src/main/resources/assets/hem/textures/screens/odometernumberdecimal6.png create mode 100644 src/main/resources/assets/hem/textures/screens/odometernumberdecimal7.png create mode 100644 src/main/resources/assets/hem/textures/screens/odometernumberdecimal8.png create mode 100644 src/main/resources/assets/hem/textures/screens/odometernumberdecimal9.png create mode 100644 src/main/resources/assets/hem/textures/screens/pipe.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge0.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge1.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge10.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge11.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge12.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge13.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge14.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge15.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge16.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge17.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge18.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge19.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge2.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge20.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge21.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge22.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge23.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge24.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge25.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge26.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge27.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge28.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge29.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge3.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge30.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge31.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge4.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge5.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge6.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge7.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge8.png create mode 100644 src/main/resources/assets/hem/textures/screens/speedgauge9.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge0.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge1.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge10.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge11.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge12.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge13.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge14.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge15.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge16.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge17.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge18.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge19.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge2.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge20.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge21.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge22.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge23.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge24.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge25.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge26.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge27.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge28.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge29.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge3.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge30.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge31.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge4.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge5.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge6.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge7.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge8.png create mode 100644 src/main/resources/assets/hem/textures/screens/tempgauge9.png create mode 100644 src/main/resources/assets/hem/textures/screens/transparentgreen.png create mode 100644 src/main/resources/data/forge/tags/blocks/solid_block.json create mode 100644 src/main/resources/data/forge/tags/entity_types/vehicle_driver_seat.json create mode 100644 src/main/resources/data/forge/tags/items/hem_fossilfuel.json create mode 100644 src/main/resources/data/hem/dimension/blueleaf.json create mode 100644 src/main/resources/data/hem/dimension_type/blueleaf.json create mode 100644 src/main/resources/data/hem/recipes/craft_blue_cobble.json create mode 100644 src/main/resources/data/hem/recipes/smelt_blue_cobble.json create mode 100644 src/main/resources/data/hem/structures/11x11floatingislandundertree.nbt create mode 100644 src/main/resources/data/hem/structures/11x11generaltree.nbt create mode 100644 src/main/resources/data/hem/structures/11x17x11chunkmunch.nbt create mode 100644 src/main/resources/data/hem/structures/15x15_4swamptree.nbt create mode 100644 src/main/resources/data/hem/structures/15x15_4swamptree2.nbt create mode 100644 src/main/resources/data/hem/structures/15x15generalfloatingisland.nbt create mode 100644 src/main/resources/data/hem/structures/15x15generaltree.nbt create mode 100644 src/main/resources/data/hem/structures/15x15lushtree.nbt create mode 100644 src/main/resources/data/hem/structures/5x5floatingisland.nbt create mode 100644 src/main/resources/data/hem/structures/5x5floatingislandfragments.nbt create mode 100644 src/main/resources/data/hem/structures/5x5lushshrub.nbt create mode 100644 src/main/resources/data/hem/structures/5x5neatlushtree.nbt create mode 100644 src/main/resources/data/hem/structures/5x5swampstructure.nbt create mode 100644 src/main/resources/data/hem/structures/anthill.nbt create mode 100644 src/main/resources/data/hem/structures/boulder1.nbt create mode 100644 src/main/resources/data/hem/structures/boulder2.nbt create mode 100644 src/main/resources/data/hem/structures/boulder3.nbt create mode 100644 src/main/resources/data/hem/structures/boulder4.nbt create mode 100644 src/main/resources/data/hem/structures/bush1.nbt create mode 100644 src/main/resources/data/hem/structures/bush2.nbt create mode 100644 src/main/resources/data/hem/structures/giantlilypad.nbt create mode 100644 src/main/resources/data/hem/structures/lilypad.nbt create mode 100644 src/main/resources/data/hem/structures/muncherclosed.nbt create mode 100644 src/main/resources/data/hem/structures/muncheropen.nbt create mode 100644 src/main/resources/data/hem/structures/seagrass.nbt create mode 100644 src/main/resources/data/hem/structures/wall1.nbt create mode 100644 src/main/resources/data/hem/structures/wall2.nbt create mode 100644 src/main/resources/data/hem/structures/wall3.nbt create mode 100644 src/main/resources/data/hem/structures/wall4.nbt create mode 100644 src/main/resources/data/hem/structures/wall5.nbt create mode 100644 src/main/resources/data/hem/structures/waterloggedgrass.nbt create mode 100644 src/main/resources/data/hem/structures/waterloggedleaves3x3.nbt create mode 100644 src/main/resources/data/hem/tags/entity_types/hem_altitude_vehicles.json create mode 100644 src/main/resources/data/hem/tags/entity_types/hem_heat_vehicles.json create mode 100644 src/main/resources/data/hem/tags/entity_types/hem_odometer_vehicles.json create mode 100644 src/main/resources/data/hem/tags/entity_types/hem_pressure_vehicles.json create mode 100644 src/main/resources/data/hem/tags/entity_types/hem_speed_vehicles.json create mode 100644 src/main/resources/data/minecraft/tags/items/stone_tool_materials.json create mode 100644 src/main/resources/hem.mixin.json create mode 100644 src/main/resources/logo.png create mode 100644 src/main/resources/pack.mcmeta diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..d73085d --- /dev/null +++ b/.classpath @@ -0,0 +1,425 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5daf14c --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +/run/ +/models/ +/elements/ +/build/ +/.settings/ +/.mcreator/ +/.idea/ +/.gradle/ +/hem.mcreator +/mcreator.gradle diff --git a/.project b/.project new file mode 100644 index 0000000..12d808a --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + 1.16.5 + + + + org.eclipse.jdt.core.javanature + + + + org.eclipse.jdt.core.javabuilder + + + + + + diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..1b9fa83 --- /dev/null +++ b/build.gradle @@ -0,0 +1,79 @@ +buildscript { + repositories { + maven { url = 'https://maven.minecraftforge.net' } + maven { url = 'https://repo.spongepowered.org/maven' } + mavenCentral() + } + dependencies { + classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true + classpath 'org.spongepowered:mixingradle:0.7.+' + } +} +apply plugin: 'net.minecraftforge.gradle' +apply plugin: 'org.spongepowered.mixin' +apply plugin: 'eclipse' + +version = '1.0' +group = 'studio.halbear.hem' +archivesBaseName = 'hem' + +java.toolchain.languageVersion = JavaLanguageVersion.of(8) + +minecraft { + mappings channel: 'snapshot', version: '20201028-1.16.3' + + runs { + client { + workingDirectory project.file('run') + arg "-mixin.config=hem.mixin.json" + + property 'forge.logging.markers', 'REGISTRIES' + property 'forge.logging.console.level', 'debug' + + jvmArgs = [ + "--add-exports=java.base/sun.security.util=ALL-UNNAMED", + "--add-opens=java.base/java.util.jar=ALL-UNNAMED" + ] + + mods { + hem { + source sourceSets.main + } + } + } + + server { + workingDirectory project.file('run') + + property 'forge.logging.markers', 'REGISTRIES' + property 'forge.logging.console.level', 'debug' + + jvmArgs = [ + "--add-exports=java.base/sun.security.util=ALL-UNNAMED", + "--add-opens=java.base/java.util.jar=ALL-UNNAMED" + ] + + mods { + hem { + source sourceSets.main + } + } + } + } +} +tasks.named('jar', Jar).configure { + manifest { + attributes([ + 'TweakClass' : 'org.spongepowered.asm.launch.MixinTweaker', + 'TweakOrder' : 0, + 'MixinConfigs' : 'hem.mixin.json' + ]) + } + rename 'mixin.refmap.json', 'hem.mixin-refmap.json' +} +dependencies { + minecraft 'net.minecraftforge:forge:1.16.5-36.2.26' +} + +apply from: 'mcreator.gradle' + diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7454180f2ae8848c63b8b4dea2cb829da983f2fa GIT binary patch literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..ffed3a2 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..cccdd3d --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..f955316 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/hem_custom/mixin/CameraMixins.java b/hem_custom/mixin/CameraMixins.java new file mode 100644 index 0000000..9aea019 --- /dev/null +++ b/hem_custom/mixin/CameraMixins.java @@ -0,0 +1,30 @@ +package studio.halbear.hem_custom.mixin; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ActiveRenderInfo; +import net.minecraft.client.settings.PointOfView; +import net.minecraft.entity.Entity; +import net.minecraft.util.math.vector.Vector3f; +import net.minecraft.world.IBlockReader; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import static studio.halbear.hem_custom.vehicles.VehicleCameraSettings.GetCameraOffsets; + +@Mixin(ActiveRenderInfo.class) +public abstract class CameraMixins { + + @Inject(method = "update", at = @At(value = "TAIL"),cancellable = true) + private void update(IBlockReader currentRenderedLevel, Entity entity, boolean isDetached, boolean isMirrored, float partialTicks, CallbackInfo ci){ + + if(entity.isPassenger() && Minecraft.getInstance().gameSettings.getPointOfView() != PointOfView.FIRST_PERSON && entity.getRidingEntity().getClass().getName().contains("studio.halbear.hem.entity")){ + Vector3f Position = GetCameraOffsets(); + this.movePosition(-this.calcCameraDistance(Position.getZ()), Position.getY(), Position.getX()); + } + } + @Shadow protected abstract void movePosition(double p_216782_1_, double p_216782_3_, double p_216782_5_); + @Shadow protected abstract double calcCameraDistance(double p_216779_1_); +} diff --git a/hem_custom/vehicles/VehicleCameraSettings.java b/hem_custom/vehicles/VehicleCameraSettings.java new file mode 100644 index 0000000..4b246dc --- /dev/null +++ b/hem_custom/vehicles/VehicleCameraSettings.java @@ -0,0 +1,85 @@ +package studio.halbear.hem_custom.vehicles; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.settings.PointOfView; +import net.minecraft.util.math.vector.Vector3f; +import net.minecraftforge.client.event.EntityViewRenderEvent; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +@Mod.EventBusSubscriber +public class VehicleCameraSettings { + private static Vector3f CamOffset = new Vector3f(0.0f, 0.0f, 0.0f); + private static Vector3f CamTransformations = new Vector3f(0.0f, 0.0f, 0.0f); + private static float CamFOV = 0.0f; + private static float CamFOVExternal = 0.0f; + private static String CurrentEntity = ""; + private static boolean HemVehicle = false; + + public static Vector3f GetCameraOffsets(){ + return CamOffset; + } + + @SubscribeEvent + public static void PlayerTickEvent(TickEvent.PlayerTickEvent event) { + Minecraft minecraftInstance = Minecraft.getInstance(); + if (minecraftInstance.player != null && minecraftInstance.player.isPassenger() && minecraftInstance.player.getRidingEntity() != null + && CurrentEntity != minecraftInstance.player.getRidingEntity().getClass().getName()) { + CurrentEntity = minecraftInstance.player.getRidingEntity().getClass().getName(); + HemVehicle = CurrentEntity.contains("studio.halbear.hem.entity"); + switch (CurrentEntity) { + case "studio.halbear.hem.entity.HotAirBalloonEntity$CustomEntity" : //yeah i hardcoded ts + CamOffset = new Vector3f(0.0f, 1.0f, 4.0f); + CamTransformations = new Vector3f(0.0f, 0.0f, 0.0f); + CamFOV = 70.0f; + CamFOVExternal = 80.0f; + break; + case "studio.halbear.hem.entity.AirboatEntity$CustomEntity" : + CamOffset = new Vector3f(0.0f, 4.0f, 16.0f); + CamTransformations = new Vector3f(0.0f, 0.0f, 0.0f); + CamFOV = 70.0f; + CamFOVExternal = 65.0f; + break; + } + } + if (minecraftInstance.player != null && (!minecraftInstance.player.isPassenger() || !HemVehicle) + && (CamFOVExternal != (float) Minecraft.getInstance().gameSettings.fov + || CamFOV != (float) Minecraft.getInstance().gameSettings.fov || CamOffset.getX() != 0 || CamOffset.getY() != 0 + || CamOffset.getZ() != 0 || CamTransformations.getX() != 0 || CamTransformations.getY() != 0 + || CamTransformations.getZ() != 0)) { + CamOffset = new Vector3f(0.0f, 0.0f, 0.0f);// reset if the players not riding an entity and if any the values aren't 0 + CamTransformations = new Vector3f(0.0f, 0.0f, 0.0f); + CamFOV = (float) Minecraft.getInstance().gameSettings.fov; + CamFOVExternal = (float) Minecraft.getInstance().gameSettings.fov; + if (!minecraftInstance.player.isPassenger()) + CurrentEntity = ""; + } + } + + @SubscribeEvent + public static void onCameraSetup(EntityViewRenderEvent.CameraSetup event) { // sets the Yaw, Roll, and Pitch for the camera, ONLY if its a HEM vehcile as to avoid unnecessary ticks + if (HemVehicle) { + event.setRoll(event.getRoll() + CamTransformations.getX()); + event.setYaw(event.getYaw() + CamTransformations.getY()); + event.setPitch(event.getPitch() + CamTransformations.getZ()); + } + } + + @SubscribeEvent + public static void onCameraSetup(EntityViewRenderEvent.FOVModifier event) { // sets the FOV + if (HemVehicle) { + Minecraft minecraftInstance = Minecraft.getInstance(); + if (minecraftInstance.player != null && minecraftInstance.gameRenderer != null) { + PointOfView Cam = minecraftInstance.gameSettings.getPointOfView(); + if (Cam == PointOfView.FIRST_PERSON) { + event.setFOV(CamFOV); + } else { + event.setFOV(CamFOVExternal); + } + } + } else if (event.getFOV() != Minecraft.getInstance().gameSettings.fov) { + event.setFOV(Minecraft.getInstance().gameSettings.fov); + } + } +} diff --git a/src/main/java/studio/halbear/hem/HemMod.java b/src/main/java/studio/halbear/hem/HemMod.java new file mode 100644 index 0000000..ba68604 --- /dev/null +++ b/src/main/java/studio/halbear/hem/HemMod.java @@ -0,0 +1,103 @@ +/* + * MCreator note: + * + * If you lock base mod element files, you can edit this file and the proxy files + * and they won't get overwritten. If you change your mod package or modid, you + * need to apply these changes to this file MANUALLY. + * + * Settings in @Mod annotation WON'T be changed in case of the base mod element + * files lock too, so you need to set them manually here in such case. + * + * Keep the HemModElements object in this class and all calls to this object + * INTACT in order to preserve functionality of mod elements generated by MCreator. + * + * If you do not lock base mod element files in Workspace settings, this file + * will be REGENERATED on each build. + * + */ +package studio.halbear.hem; + +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.LogManager; + +import net.minecraftforge.fml.network.simple.SimpleChannel; +import net.minecraftforge.fml.network.NetworkRegistry; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.server.FMLServerStartingEvent; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.MinecraftForge; + +import net.minecraft.util.ResourceLocation; +import net.minecraft.item.Item; +import net.minecraft.entity.EntityType; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.block.Block; + +import java.util.function.Supplier; + +@Mod("hem") +public class HemMod { + public static final Logger LOGGER = LogManager.getLogger(HemMod.class); + private static final String PROTOCOL_VERSION = "1"; + public static final SimpleChannel PACKET_HANDLER = NetworkRegistry.newSimpleChannel(new ResourceLocation("hem", "hem"), () -> PROTOCOL_VERSION, + PROTOCOL_VERSION::equals, PROTOCOL_VERSION::equals); + public HemModElements elements; + + public HemMod() { + elements = new HemModElements(); + FMLJavaModLoadingContext.get().getModEventBus().register(this); + FMLJavaModLoadingContext.get().getModEventBus().addListener(this::init); + FMLJavaModLoadingContext.get().getModEventBus().addListener(this::clientLoad); + MinecraftForge.EVENT_BUS.register(new HemModFMLBusEvents(this)); + } + + private void init(FMLCommonSetupEvent event) { + elements.getElements().forEach(element -> element.init(event)); + } + + public void clientLoad(FMLClientSetupEvent event) { + elements.getElements().forEach(element -> element.clientLoad(event)); + } + + @SubscribeEvent + public void registerBlocks(RegistryEvent.Register event) { + event.getRegistry().registerAll(elements.getBlocks().stream().map(Supplier::get).toArray(Block[]::new)); + } + + @SubscribeEvent + public void registerItems(RegistryEvent.Register event) { + event.getRegistry().registerAll(elements.getItems().stream().map(Supplier::get).toArray(Item[]::new)); + } + + @SubscribeEvent + public void registerEntities(RegistryEvent.Register> event) { + event.getRegistry().registerAll(elements.getEntities().stream().map(Supplier::get).toArray(EntityType[]::new)); + } + + @SubscribeEvent + public void registerEnchantments(RegistryEvent.Register event) { + event.getRegistry().registerAll(elements.getEnchantments().stream().map(Supplier::get).toArray(Enchantment[]::new)); + } + + @SubscribeEvent + public void registerSounds(RegistryEvent.Register event) { + elements.registerSounds(event); + } + + private static class HemModFMLBusEvents { + private final HemMod parent; + + HemModFMLBusEvents(HemMod parent) { + this.parent = parent; + } + + @SubscribeEvent + public void serverLoad(FMLServerStartingEvent event) { + this.parent.elements.getElements().forEach(element -> element.serverLoad(event)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/HemModElements.java b/src/main/java/studio/halbear/hem/HemModElements.java new file mode 100644 index 0000000..104bee3 --- /dev/null +++ b/src/main/java/studio/halbear/hem/HemModElements.java @@ -0,0 +1,132 @@ +/* + * MCreator note: + * + * This file is autogenerated to connect all MCreator mod elements together. + * + */ +package studio.halbear.hem; + +import net.minecraftforge.forgespi.language.ModFileScanData; +import net.minecraftforge.fml.network.NetworkEvent; +import net.minecraftforge.fml.event.server.FMLServerStartingEvent; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.util.ResourceLocation; +import net.minecraft.tags.Tag; +import net.minecraft.network.PacketBuffer; +import net.minecraft.item.Item; +import net.minecraft.entity.EntityType; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.block.Block; + +import java.util.function.Supplier; +import java.util.function.Function; +import java.util.function.BiConsumer; +import java.util.Set; +import java.util.Map; +import java.util.List; +import java.util.HashMap; +import java.util.Collections; +import java.util.ArrayList; + +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Retention; + +public class HemModElements { + public final List elements = new ArrayList<>(); + public final List> blocks = new ArrayList<>(); + public final List> items = new ArrayList<>(); + public final List>> entities = new ArrayList<>(); + public final List> enchantments = new ArrayList<>(); + public static Map sounds = new HashMap<>(); + + public HemModElements() { + try { + ModFileScanData modFileInfo = ModList.get().getModFileById("hem").getFile().getScanResult(); + Set annotations = modFileInfo.getAnnotations(); + for (ModFileScanData.AnnotationData annotationData : annotations) { + if (annotationData.getAnnotationType().getClassName().equals(ModElement.Tag.class.getName())) { + Class clazz = Class.forName(annotationData.getClassType().getClassName()); + if (clazz.getSuperclass() == HemModElements.ModElement.class) + elements.add((HemModElements.ModElement) clazz.getConstructor(this.getClass()).newInstance(this)); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + Collections.sort(elements); + elements.forEach(HemModElements.ModElement::initElements); + MinecraftForge.EVENT_BUS.register(new HemModVariables(this)); + } + + public void registerSounds(RegistryEvent.Register event) { + for (Map.Entry sound : sounds.entrySet()) + event.getRegistry().register(sound.getValue().setRegistryName(sound.getKey())); + } + + private int messageID = 0; + + public void addNetworkMessage(Class messageType, BiConsumer encoder, Function decoder, + BiConsumer> messageConsumer) { + HemMod.PACKET_HANDLER.registerMessage(messageID, messageType, encoder, decoder, messageConsumer); + messageID++; + } + + public List getElements() { + return elements; + } + + public List> getBlocks() { + return blocks; + } + + public List> getItems() { + return items; + } + + public List>> getEntities() { + return entities; + } + + public List> getEnchantments() { + return enchantments; + } + + public static class ModElement implements Comparable { + @Retention(RetentionPolicy.RUNTIME) + public @interface Tag { + } + + protected final HemModElements elements; + protected final int sortid; + + public ModElement(HemModElements elements, int sortid) { + this.elements = elements; + this.sortid = sortid; + } + + public void initElements() { + } + + public void init(FMLCommonSetupEvent event) { + } + + public void serverLoad(FMLServerStartingEvent event) { + } + + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + } + + @Override + public int compareTo(ModElement other) { + return this.sortid - other.sortid; + } + } +} diff --git a/src/main/java/studio/halbear/hem/HemModVariables.java b/src/main/java/studio/halbear/hem/HemModVariables.java new file mode 100644 index 0000000..dd6e6d4 --- /dev/null +++ b/src/main/java/studio/halbear/hem/HemModVariables.java @@ -0,0 +1,450 @@ +package studio.halbear.hem; + +import net.minecraftforge.fml.network.PacketDistributor; +import net.minecraftforge.fml.network.NetworkEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.event.AttachCapabilitiesEvent; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.capabilities.ICapabilitySerializable; +import net.minecraftforge.common.capabilities.CapabilityManager; +import net.minecraftforge.common.capabilities.CapabilityInject; +import net.minecraftforge.common.capabilities.Capability; + +import net.minecraft.world.storage.WorldSavedData; +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.world.IServerWorld; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Direction; +import net.minecraft.network.PacketBuffer; +import net.minecraft.nbt.INBT; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.Entity; +import net.minecraft.client.Minecraft; + +import java.util.function.Supplier; + +public class HemModVariables { + public HemModVariables(HemModElements elements) { + elements.addNetworkMessage(WorldSavedDataSyncMessage.class, WorldSavedDataSyncMessage::buffer, WorldSavedDataSyncMessage::new, + WorldSavedDataSyncMessage::handler); + elements.addNetworkMessage(PlayerVariablesSyncMessage.class, PlayerVariablesSyncMessage::buffer, PlayerVariablesSyncMessage::new, + PlayerVariablesSyncMessage::handler); + FMLJavaModLoadingContext.get().getModEventBus().addListener(this::init); + } + + private void init(FMLCommonSetupEvent event) { + CapabilityManager.INSTANCE.register(PlayerVariables.class, new PlayerVariablesStorage(), PlayerVariables::new); + } + + @SubscribeEvent + public void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) { + if (!event.getPlayer().world.isRemote()) { + WorldSavedData mapdata = MapVariables.get(event.getPlayer().world); + WorldSavedData worlddata = WorldVariables.get(event.getPlayer().world); + if (mapdata != null) + HemMod.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) event.getPlayer()), + new WorldSavedDataSyncMessage(0, mapdata)); + if (worlddata != null) + HemMod.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) event.getPlayer()), + new WorldSavedDataSyncMessage(1, worlddata)); + } + } + + @SubscribeEvent + public void onPlayerChangedDimension(PlayerEvent.PlayerChangedDimensionEvent event) { + if (!event.getPlayer().world.isRemote()) { + WorldSavedData worlddata = WorldVariables.get(event.getPlayer().world); + if (worlddata != null) + HemMod.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) event.getPlayer()), + new WorldSavedDataSyncMessage(1, worlddata)); + } + } + + public static class WorldVariables extends WorldSavedData { + public static final String DATA_NAME = "hem_worldvars"; + public boolean EmberleafMilitaryDefeated = false; + public double VehicleID = 0; + + public WorldVariables() { + super(DATA_NAME); + } + + public WorldVariables(String s) { + super(s); + } + + @Override + public void read(CompoundNBT nbt) { + EmberleafMilitaryDefeated = nbt.getBoolean("EmberleafMilitaryDefeated"); + VehicleID = nbt.getDouble("VehicleID"); + } + + @Override + public CompoundNBT write(CompoundNBT nbt) { + nbt.putBoolean("EmberleafMilitaryDefeated", EmberleafMilitaryDefeated); + nbt.putDouble("VehicleID", VehicleID); + return nbt; + } + + public void syncData(IWorld world) { + this.markDirty(); + if (world instanceof World && !world.isRemote()) + HemMod.PACKET_HANDLER.send(PacketDistributor.DIMENSION.with(((World) world)::getDimensionKey), + new WorldSavedDataSyncMessage(1, this)); + } + + static WorldVariables clientSide = new WorldVariables(); + + public static WorldVariables get(IWorld world) { + if (world instanceof ServerWorld) { + return ((ServerWorld) world).getSavedData().getOrCreate(WorldVariables::new, DATA_NAME); + } else { + return clientSide; + } + } + } + + public static class MapVariables extends WorldSavedData { + public static final String DATA_NAME = "hem_mapvars"; + + public MapVariables() { + super(DATA_NAME); + } + + public MapVariables(String s) { + super(s); + } + + @Override + public void read(CompoundNBT nbt) { + } + + @Override + public CompoundNBT write(CompoundNBT nbt) { + return nbt; + } + + public void syncData(IWorld world) { + this.markDirty(); + if (world instanceof World && !world.isRemote()) + HemMod.PACKET_HANDLER.send(PacketDistributor.ALL.noArg(), new WorldSavedDataSyncMessage(0, this)); + } + + static MapVariables clientSide = new MapVariables(); + + public static MapVariables get(IWorld world) { + if (world instanceof IServerWorld) { + return ((IServerWorld) world).getWorld().getServer().getWorld(World.OVERWORLD).getSavedData().getOrCreate(MapVariables::new, + DATA_NAME); + } else { + return clientSide; + } + } + } + + public static class WorldSavedDataSyncMessage { + public int type; + public WorldSavedData data; + + public WorldSavedDataSyncMessage(PacketBuffer buffer) { + this.type = buffer.readInt(); + this.data = this.type == 0 ? new MapVariables() : new WorldVariables(); + this.data.read(buffer.readCompoundTag()); + } + + public WorldSavedDataSyncMessage(int type, WorldSavedData data) { + this.type = type; + this.data = data; + } + + public static void buffer(WorldSavedDataSyncMessage message, PacketBuffer buffer) { + buffer.writeInt(message.type); + buffer.writeCompoundTag(message.data.write(new CompoundNBT())); + } + + public static void handler(WorldSavedDataSyncMessage message, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + if (!context.getDirection().getReceptionSide().isServer()) { + if (message.type == 0) + MapVariables.clientSide = (MapVariables) message.data; + else + WorldVariables.clientSide = (WorldVariables) message.data; + } + }); + context.setPacketHandled(true); + } + } + + @CapabilityInject(PlayerVariables.class) + public static Capability PLAYER_VARIABLES_CAPABILITY = null; + + @SubscribeEvent + public void onAttachCapabilities(AttachCapabilitiesEvent event) { + if (event.getObject() instanceof PlayerEntity && !(event.getObject() instanceof FakePlayer)) + event.addCapability(new ResourceLocation("hem", "player_variables"), new PlayerVariablesProvider()); + } + + private static class PlayerVariablesProvider implements ICapabilitySerializable { + private final LazyOptional instance = LazyOptional.of(PLAYER_VARIABLES_CAPABILITY::getDefaultInstance); + + @Override + public LazyOptional getCapability(Capability cap, Direction side) { + return cap == PLAYER_VARIABLES_CAPABILITY ? instance.cast() : LazyOptional.empty(); + } + + @Override + public INBT serializeNBT() { + return PLAYER_VARIABLES_CAPABILITY.getStorage().writeNBT(PLAYER_VARIABLES_CAPABILITY, this.instance.orElseThrow(RuntimeException::new), + null); + } + + @Override + public void deserializeNBT(INBT nbt) { + PLAYER_VARIABLES_CAPABILITY.getStorage().readNBT(PLAYER_VARIABLES_CAPABILITY, this.instance.orElseThrow(RuntimeException::new), null, + nbt); + } + } + + private static class PlayerVariablesStorage implements Capability.IStorage { + @Override + public INBT writeNBT(Capability capability, PlayerVariables instance, Direction side) { + CompoundNBT nbt = new CompoundNBT(); + nbt.putDouble("BodyTemperature", instance.BodyTemperature); + nbt.putBoolean("DisableClientSideBlocks", instance.DisableClientSideBlocks); + nbt.putBoolean("Eaten", instance.Eaten); + nbt.putDouble("Fuel", instance.Fuel); + nbt.putDouble("GoalMPH", instance.GoalMPH); + nbt.putDouble("GooCooldown", instance.GooCooldown); + nbt.putDouble("Heat", instance.Heat); + nbt.putDouble("LastPlantTrapX", instance.LastPlantTrapX); + nbt.putDouble("LastPlantTrapY", instance.LastPlantTrapY); + nbt.putDouble("LastPlantTrapZ", instance.LastPlantTrapZ); + nbt.putDouble("LastPosX", instance.LastPosX); + nbt.putDouble("LastPosZ", instance.LastPosZ); + nbt.putDouble("MPH", instance.MPH); + nbt.putBoolean("PilotingVehicle", instance.PilotingVehicle); + nbt.putDouble("PilotingVehicleID", instance.PilotingVehicleID); + nbt.putDouble("PSI", instance.PSI); + nbt.putDouble("Speed", instance.Speed); + nbt.putBoolean("VehicleAccelerate", instance.VehicleAccelerate); + nbt.putBoolean("VehicleBackward", instance.VehicleBackward); + nbt.putBoolean("VehicleDecelerate", instance.VehicleDecelerate); + nbt.putBoolean("VehicleForward", instance.VehicleForward); + nbt.putBoolean("VehicleIncreasePressure", instance.VehicleIncreasePressure); + nbt.putDouble("VehicleOdometer", instance.VehicleOdometer); + nbt.putDouble("VehicleOdometerMetres", instance.VehicleOdometerMetres); + nbt.putBoolean("VehicleReleasePressure", instance.VehicleReleasePressure); + nbt.putBoolean("VehicleStrafeLeft", instance.VehicleStrafeLeft); + nbt.putBoolean("VehicleStrafeRight", instance.VehicleStrafeRight); + nbt.putBoolean("VehicleTurnLeft", instance.VehicleTurnLeft); + nbt.putBoolean("VehicleTurnRight", instance.VehicleTurnRight); + nbt.putDouble("VehicleYaw", instance.VehicleYaw); + nbt.putDouble("Altimeter", instance.Altimeter); + return nbt; + } + + @Override + public void readNBT(Capability capability, PlayerVariables instance, Direction side, INBT inbt) { + CompoundNBT nbt = (CompoundNBT) inbt; + instance.BodyTemperature = nbt.getDouble("BodyTemperature"); + instance.DisableClientSideBlocks = nbt.getBoolean("DisableClientSideBlocks"); + instance.Eaten = nbt.getBoolean("Eaten"); + instance.Fuel = nbt.getDouble("Fuel"); + instance.GoalMPH = nbt.getDouble("GoalMPH"); + instance.GooCooldown = nbt.getDouble("GooCooldown"); + instance.Heat = nbt.getDouble("Heat"); + instance.LastPlantTrapX = nbt.getDouble("LastPlantTrapX"); + instance.LastPlantTrapY = nbt.getDouble("LastPlantTrapY"); + instance.LastPlantTrapZ = nbt.getDouble("LastPlantTrapZ"); + instance.LastPosX = nbt.getDouble("LastPosX"); + instance.LastPosZ = nbt.getDouble("LastPosZ"); + instance.MPH = nbt.getDouble("MPH"); + instance.PilotingVehicle = nbt.getBoolean("PilotingVehicle"); + instance.PilotingVehicleID = nbt.getDouble("PilotingVehicleID"); + instance.PSI = nbt.getDouble("PSI"); + instance.Speed = nbt.getDouble("Speed"); + instance.VehicleAccelerate = nbt.getBoolean("VehicleAccelerate"); + instance.VehicleBackward = nbt.getBoolean("VehicleBackward"); + instance.VehicleDecelerate = nbt.getBoolean("VehicleDecelerate"); + instance.VehicleForward = nbt.getBoolean("VehicleForward"); + instance.VehicleIncreasePressure = nbt.getBoolean("VehicleIncreasePressure"); + instance.VehicleOdometer = nbt.getDouble("VehicleOdometer"); + instance.VehicleOdometerMetres = nbt.getDouble("VehicleOdometerMetres"); + instance.VehicleReleasePressure = nbt.getBoolean("VehicleReleasePressure"); + instance.VehicleStrafeLeft = nbt.getBoolean("VehicleStrafeLeft"); + instance.VehicleStrafeRight = nbt.getBoolean("VehicleStrafeRight"); + instance.VehicleTurnLeft = nbt.getBoolean("VehicleTurnLeft"); + instance.VehicleTurnRight = nbt.getBoolean("VehicleTurnRight"); + instance.VehicleYaw = nbt.getDouble("VehicleYaw"); + instance.Altimeter = nbt.getDouble("Altimeter"); + } + } + + public static class PlayerVariables { + public double BodyTemperature = 37.0; + public boolean DisableClientSideBlocks = false; + public boolean Eaten = false; + public double Fuel = 0; + public double GoalMPH = 0; + public double GooCooldown = 0; + public double Heat = 0; + public double LastPlantTrapX = 0; + public double LastPlantTrapY = 0; + public double LastPlantTrapZ = 0; + public double LastPosX = 0; + public double LastPosZ = 0; + public double MPH = 0; + public boolean PilotingVehicle = false; + public double PilotingVehicleID = 0; + public double PSI = 0; + public double Speed = 0; + public boolean VehicleAccelerate = false; + public boolean VehicleBackward = false; + public boolean VehicleDecelerate = false; + public boolean VehicleForward = false; + public boolean VehicleIncreasePressure = false; + public double VehicleOdometer = 0; + public double VehicleOdometerMetres = 0; + public boolean VehicleReleasePressure = false; + public boolean VehicleStrafeLeft = false; + public boolean VehicleStrafeRight = false; + public boolean VehicleTurnLeft = false; + public boolean VehicleTurnRight = false; + public double VehicleYaw = 0; + public double Altimeter = 0; + + public void syncPlayerVariables(Entity entity) { + if (entity instanceof ServerPlayerEntity) + HemMod.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) entity), new PlayerVariablesSyncMessage(this)); + } + } + + @SubscribeEvent + public void onPlayerLoggedInSyncPlayerVariables(PlayerEvent.PlayerLoggedInEvent event) { + if (!event.getPlayer().world.isRemote()) + ((PlayerVariables) event.getPlayer().getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables())) + .syncPlayerVariables(event.getPlayer()); + } + + @SubscribeEvent + public void onPlayerRespawnedSyncPlayerVariables(PlayerEvent.PlayerRespawnEvent event) { + if (!event.getPlayer().world.isRemote()) + ((PlayerVariables) event.getPlayer().getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables())) + .syncPlayerVariables(event.getPlayer()); + } + + @SubscribeEvent + public void onPlayerChangedDimensionSyncPlayerVariables(PlayerEvent.PlayerChangedDimensionEvent event) { + if (!event.getPlayer().world.isRemote()) + ((PlayerVariables) event.getPlayer().getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables())) + .syncPlayerVariables(event.getPlayer()); + } + + @SubscribeEvent + public void clonePlayer(PlayerEvent.Clone event) { + PlayerVariables original = ((PlayerVariables) event.getOriginal().getCapability(PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new PlayerVariables())); + PlayerVariables clone = ((PlayerVariables) event.getEntity().getCapability(PLAYER_VARIABLES_CAPABILITY, null).orElse(new PlayerVariables())); + clone.BodyTemperature = original.BodyTemperature; + clone.DisableClientSideBlocks = original.DisableClientSideBlocks; + clone.Eaten = original.Eaten; + clone.Fuel = original.Fuel; + clone.GoalMPH = original.GoalMPH; + clone.GooCooldown = original.GooCooldown; + clone.Heat = original.Heat; + clone.LastPlantTrapX = original.LastPlantTrapX; + clone.LastPlantTrapY = original.LastPlantTrapY; + clone.LastPlantTrapZ = original.LastPlantTrapZ; + clone.LastPosX = original.LastPosX; + clone.LastPosZ = original.LastPosZ; + clone.MPH = original.MPH; + clone.PilotingVehicle = original.PilotingVehicle; + clone.PilotingVehicleID = original.PilotingVehicleID; + clone.PSI = original.PSI; + clone.Speed = original.Speed; + clone.VehicleAccelerate = original.VehicleAccelerate; + clone.VehicleBackward = original.VehicleBackward; + clone.VehicleDecelerate = original.VehicleDecelerate; + clone.VehicleForward = original.VehicleForward; + clone.VehicleIncreasePressure = original.VehicleIncreasePressure; + clone.VehicleOdometer = original.VehicleOdometer; + clone.VehicleOdometerMetres = original.VehicleOdometerMetres; + clone.VehicleReleasePressure = original.VehicleReleasePressure; + clone.VehicleStrafeLeft = original.VehicleStrafeLeft; + clone.VehicleStrafeRight = original.VehicleStrafeRight; + clone.VehicleTurnLeft = original.VehicleTurnLeft; + clone.VehicleTurnRight = original.VehicleTurnRight; + clone.VehicleYaw = original.VehicleYaw; + clone.Altimeter = original.Altimeter; + if (!event.isWasDeath()) { + } + } + + public static class PlayerVariablesSyncMessage { + public PlayerVariables data; + + public PlayerVariablesSyncMessage(PacketBuffer buffer) { + this.data = new PlayerVariables(); + new PlayerVariablesStorage().readNBT(null, this.data, null, buffer.readCompoundTag()); + } + + public PlayerVariablesSyncMessage(PlayerVariables data) { + this.data = data; + } + + public static void buffer(PlayerVariablesSyncMessage message, PacketBuffer buffer) { + buffer.writeCompoundTag((CompoundNBT) new PlayerVariablesStorage().writeNBT(null, message.data, null)); + } + + public static void handler(PlayerVariablesSyncMessage message, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + if (!context.getDirection().getReceptionSide().isServer()) { + PlayerVariables variables = ((PlayerVariables) Minecraft.getInstance().player.getCapability(PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new PlayerVariables())); + variables.BodyTemperature = message.data.BodyTemperature; + variables.DisableClientSideBlocks = message.data.DisableClientSideBlocks; + variables.Eaten = message.data.Eaten; + variables.Fuel = message.data.Fuel; + variables.GoalMPH = message.data.GoalMPH; + variables.GooCooldown = message.data.GooCooldown; + variables.Heat = message.data.Heat; + variables.LastPlantTrapX = message.data.LastPlantTrapX; + variables.LastPlantTrapY = message.data.LastPlantTrapY; + variables.LastPlantTrapZ = message.data.LastPlantTrapZ; + variables.LastPosX = message.data.LastPosX; + variables.LastPosZ = message.data.LastPosZ; + variables.MPH = message.data.MPH; + variables.PilotingVehicle = message.data.PilotingVehicle; + variables.PilotingVehicleID = message.data.PilotingVehicleID; + variables.PSI = message.data.PSI; + variables.Speed = message.data.Speed; + variables.VehicleAccelerate = message.data.VehicleAccelerate; + variables.VehicleBackward = message.data.VehicleBackward; + variables.VehicleDecelerate = message.data.VehicleDecelerate; + variables.VehicleForward = message.data.VehicleForward; + variables.VehicleIncreasePressure = message.data.VehicleIncreasePressure; + variables.VehicleOdometer = message.data.VehicleOdometer; + variables.VehicleOdometerMetres = message.data.VehicleOdometerMetres; + variables.VehicleReleasePressure = message.data.VehicleReleasePressure; + variables.VehicleStrafeLeft = message.data.VehicleStrafeLeft; + variables.VehicleStrafeRight = message.data.VehicleStrafeRight; + variables.VehicleTurnLeft = message.data.VehicleTurnLeft; + variables.VehicleTurnRight = message.data.VehicleTurnRight; + variables.VehicleYaw = message.data.VehicleYaw; + variables.Altimeter = message.data.Altimeter; + } + }); + context.setPacketHandled(true); + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/AntHillBlock.java b/src/main/java/studio/halbear/hem/block/AntHillBlock.java new file mode 100644 index 0000000..4cc6364 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/AntHillBlock.java @@ -0,0 +1,120 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.procedures.AntHillUpdateTickProcedure; +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.common.ToolType; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.math.shapes.VoxelShapes; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.BlockPos; +import net.minecraft.pathfinding.PathNodeType; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItem; +import net.minecraft.entity.MobEntity; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.stream.Stream; +import java.util.Random; +import java.util.Map; +import java.util.List; +import java.util.HashMap; +import java.util.Collections; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class AntHillBlock extends HemModElements.ModElement { + @ObjectHolder("hem:ant_hill") + public static final Block block = null; + + public AntHillBlock(HemModElements instance) { + super(instance, 34); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutout()); + } + + public static class CustomBlock extends Block { + public CustomBlock() { + super(Block.Properties.create(Material.EARTH).sound(SoundType.GROUND).hardnessAndResistance(1f, 10f).setLightLevel(s -> 0).harvestLevel(1) + .harvestTool(ToolType.SHOVEL).setRequiresTool().notSolid().tickRandomly().setOpaque((bs, br, bp) -> false)); + setRegistryName("ant_hill"); + } + + @Override + public boolean propagatesSkylightDown(BlockState state, IBlockReader reader, BlockPos pos) { + return true; + } + + @Override + public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) { + return 0; + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext context) { + Vector3d offset = state.getOffset(world, pos); + return VoxelShapes.or(makeCuboidShape(2, 0, 2, 14, 5, 14)) + + .withOffset(offset.x, offset.y, offset.z); + } + + @Override + public PathNodeType getAiPathNodeType(BlockState state, IBlockReader world, BlockPos pos, MobEntity entity) { + return PathNodeType.WALKABLE; + } + + @Override + public Block.OffsetType getOffsetType() { + return Block.OffsetType.XZ; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(AntsBlock.block, (int) (2))); + } + + @Override + public void tick(BlockState blockstate, ServerWorld world, BlockPos pos, Random random) { + super.tick(blockstate, world, pos, random); + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + + AntHillUpdateTickProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/AntsBlock.java b/src/main/java/studio/halbear/hem/block/AntsBlock.java new file mode 100644 index 0000000..f3e735c --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/AntsBlock.java @@ -0,0 +1,191 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.procedures.AntsEntityWalksOnTheBlockProcedure; +import studio.halbear.hem.procedures.AntsBlockAddedProcedure; +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.common.ToolType; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.math.shapes.VoxelShapes; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.Mirror; +import net.minecraft.util.Direction; +import net.minecraft.state.StateContainer; +import net.minecraft.state.DirectionProperty; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.BlockItem; +import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.block.material.PushReaction; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.HorizontalBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.List; +import java.util.HashMap; +import java.util.Collections; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class AntsBlock extends HemModElements.ModElement { + @ObjectHolder("hem:ants") + public static final Block block = null; + + public AntsBlock(HemModElements instance) { + super(instance, 35); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutoutMipped()); + } + + public static class CustomBlock extends Block { + public static final DirectionProperty FACING = HorizontalBlock.HORIZONTAL_FACING; + + public CustomBlock() { + super(Block.Properties.create(Material.PLANTS).sound(SoundType.BASALT).hardnessAndResistance(0.1f, 0f).setLightLevel(s -> 0) + .harvestLevel(1).harvestTool(ToolType.SHOVEL).speedFactor(0.8f).jumpFactor(0.9f).notSolid().setOpaque((bs, br, bp) -> false)); + this.setDefaultState(this.stateContainer.getBaseState().with(FACING, Direction.NORTH)); + setRegistryName("ants"); + } + + @Override + public boolean propagatesSkylightDown(BlockState state, IBlockReader reader, BlockPos pos) { + return true; + } + + @Override + public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) { + return 0; + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext context) { + Vector3d offset = state.getOffset(world, pos); + switch ((Direction) state.get(FACING)) { + case SOUTH : + default : + return VoxelShapes.or(makeCuboidShape(16, 0, 16, 0, 1, 0)) + + .withOffset(offset.x, offset.y, offset.z); + case NORTH : + return VoxelShapes.or(makeCuboidShape(0, 0, 0, 16, 1, 16)) + + .withOffset(offset.x, offset.y, offset.z); + case EAST : + return VoxelShapes.or(makeCuboidShape(16, 0, 0, 0, 1, 16)) + + .withOffset(offset.x, offset.y, offset.z); + case WEST : + return VoxelShapes.or(makeCuboidShape(0, 0, 16, 16, 1, 0)) + + .withOffset(offset.x, offset.y, offset.z); + } + } + + @Override + protected void fillStateContainer(StateContainer.Builder builder) { + builder.add(FACING); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + return this.getDefaultState().with(FACING, context.getPlacementHorizontalFacing().getOpposite()); + } + + public BlockState rotate(BlockState state, Rotation rot) { + return state.with(FACING, rot.rotate(state.get(FACING))); + } + + public BlockState mirror(BlockState state, Mirror mirrorIn) { + return state.rotate(mirrorIn.toRotation(state.get(FACING))); + } + + @Override + public boolean isReplaceable(BlockState state, BlockItemUseContext context) { + return context.getItem().getItem() != this.asItem(); + } + + @Override + public PushReaction getPushReaction(BlockState state) { + return PushReaction.DESTROY; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 0)); + } + + @Override + public void onBlockAdded(BlockState blockstate, World world, BlockPos pos, BlockState oldState, boolean moving) { + super.onBlockAdded(blockstate, world, pos, oldState, moving); + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + + AntsBlockAddedProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + + @Override + public void onEntityCollision(BlockState blockstate, World world, BlockPos pos, Entity entity) { + super.onEntityCollision(blockstate, world, pos, entity); + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + + AntsEntityWalksOnTheBlockProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + + @Override + public void onEntityWalk(World world, BlockPos pos, Entity entity) { + super.onEntityWalk(world, pos, entity); + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + BlockState blockstate = world.getBlockState(pos); + + AntsEntityWalksOnTheBlockProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BloomedBulbFlowerBlock.java b/src/main/java/studio/halbear/hem/block/BloomedBulbFlowerBlock.java new file mode 100644 index 0000000..6c069ba --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BloomedBulbFlowerBlock.java @@ -0,0 +1,144 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.procedures.BulbFlowerPlantRightClickedProcedure; +import studio.halbear.hem.procedures.BloomedBulbFlowerUpdateTickProcedure; +import studio.halbear.hem.particle.LilyPadParticlesParticle; +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.common.ToolType; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.World; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.math.shapes.VoxelShapes; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.BlockPos; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItem; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.Minecraft; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.stream.Stream; +import java.util.Random; +import java.util.Map; +import java.util.List; +import java.util.HashMap; +import java.util.Collections; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class BloomedBulbFlowerBlock extends HemModElements.ModElement { + @ObjectHolder("hem:bloomed_bulb_flower") + public static final Block block = null; + + public BloomedBulbFlowerBlock(HemModElements instance) { + super(instance, 39); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutout()); + } + + public static class CustomBlock extends Block { + public CustomBlock() { + super(Block.Properties.create(Material.PLANTS).sound(SoundType.PLANT).hardnessAndResistance(1f, 1f).setLightLevel(s -> 0).harvestLevel(1) + .harvestTool(ToolType.HOE).doesNotBlockMovement().notSolid().tickRandomly().setOpaque((bs, br, bp) -> false)); + setRegistryName("bloomed_bulb_flower"); + } + + @Override + public boolean propagatesSkylightDown(BlockState state, IBlockReader reader, BlockPos pos) { + return true; + } + + @Override + public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) { + return 0; + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext context) { + Vector3d offset = state.getOffset(world, pos); + return VoxelShapes.or(makeCuboidShape(-5, 0, -5, 21, 3, 21)) + + .withOffset(offset.x, offset.y, offset.z); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + + @Override + public void tick(BlockState blockstate, ServerWorld world, BlockPos pos, Random random) { + super.tick(blockstate, world, pos, random); + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + + BloomedBulbFlowerUpdateTickProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + + @OnlyIn(Dist.CLIENT) + @Override + public void animateTick(BlockState blockstate, World world, BlockPos pos, Random random) { + super.animateTick(blockstate, world, pos, random); + PlayerEntity entity = Minecraft.getInstance().player; + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + if (true) + for (int l = 0; l < 1; ++l) { + double d0 = (x + 0.5) + (random.nextFloat() - 0.5) * 0.1D * 20; + double d1 = ((y + 0.7) + (random.nextFloat() - 0.5) * 0.1D) + 0.5; + double d2 = (z + 0.5) + (random.nextFloat() - 0.5) * 0.1D * 20; + world.addParticle(LilyPadParticlesParticle.particle, d0, d1, d2, 0, 0, 0); + } + } + + @Override + public void onEntityCollision(BlockState blockstate, World world, BlockPos pos, Entity entity) { + super.onEntityCollision(blockstate, world, pos, entity); + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + + BulbFlowerPlantRightClickedProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BloomedMuncherBlock.java b/src/main/java/studio/halbear/hem/block/BloomedMuncherBlock.java new file mode 100644 index 0000000..6b01e87 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BloomedMuncherBlock.java @@ -0,0 +1,405 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.procedures.BloomedMuncherUpdateTickProcedure; +import studio.halbear.hem.procedures.BloomedMuncherEntityCollidesInTheBlockProcedure; +import studio.halbear.hem.particle.LilyPadParticlesParticle; +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.items.wrapper.SidedInvWrapper; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.ToolType; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.World; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.math.shapes.VoxelShapes; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.NonNullList; +import net.minecraft.util.Mirror; +import net.minecraft.util.Direction; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.LockableLootTileEntity; +import net.minecraft.state.StateContainer; +import net.minecraft.state.DirectionProperty; +import net.minecraft.network.play.server.SUpdateTileEntityPacket; +import net.minecraft.network.NetworkManager; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.BlockItem; +import net.minecraft.inventory.container.INamedContainerProvider; +import net.minecraft.inventory.container.Container; +import net.minecraft.inventory.container.ChestContainer; +import net.minecraft.inventory.ItemStackHelper; +import net.minecraft.inventory.InventoryHelper; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.Minecraft; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.HorizontalBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import javax.annotation.Nullable; + +import java.util.stream.Stream; +import java.util.stream.IntStream; +import java.util.Random; +import java.util.Map; +import java.util.List; +import java.util.HashMap; +import java.util.Collections; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class BloomedMuncherBlock extends HemModElements.ModElement { + @ObjectHolder("hem:bloomed_muncher") + public static final Block block = null; + @ObjectHolder("hem:bloomed_muncher") + public static final TileEntityType tileEntityType = null; + + public BloomedMuncherBlock(HemModElements instance) { + super(instance, 31); + FMLJavaModLoadingContext.get().getModEventBus().register(new TileEntityRegisterHandler()); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + private static class TileEntityRegisterHandler { + @SubscribeEvent + public void registerTileEntity(RegistryEvent.Register> event) { + event.getRegistry().register(TileEntityType.Builder.create(CustomTileEntity::new, block).build(null).setRegistryName("bloomed_muncher")); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutoutMipped()); + } + + public static class CustomBlock extends Block { + public static final DirectionProperty FACING = HorizontalBlock.HORIZONTAL_FACING; + + public CustomBlock() { + super(Block.Properties.create(Material.PLANTS).sound(SoundType.PLANT).hardnessAndResistance(1f, 1f).setLightLevel(s -> 0).harvestLevel(1) + .harvestTool(ToolType.HOE).doesNotBlockMovement().notSolid().setOpaque((bs, br, bp) -> false)); + this.setDefaultState(this.stateContainer.getBaseState().with(FACING, Direction.NORTH)); + setRegistryName("bloomed_muncher"); + } + + @Override + public boolean propagatesSkylightDown(BlockState state, IBlockReader reader, BlockPos pos) { + return true; + } + + @Override + public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) { + return 0; + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext context) { + Vector3d offset = state.getOffset(world, pos); + switch ((Direction) state.get(FACING)) { + case SOUTH : + default : + return VoxelShapes.or(makeCuboidShape(21, 0, 21, -5, 3, -5)) + + .withOffset(offset.x, offset.y, offset.z); + case NORTH : + return VoxelShapes.or(makeCuboidShape(-5, 0, -5, 21, 3, 21)) + + .withOffset(offset.x, offset.y, offset.z); + case EAST : + return VoxelShapes.or(makeCuboidShape(21, 0, -5, -5, 3, 21)) + + .withOffset(offset.x, offset.y, offset.z); + case WEST : + return VoxelShapes.or(makeCuboidShape(-5, 0, 21, 21, 3, -5)) + + .withOffset(offset.x, offset.y, offset.z); + } + } + + @Override + protected void fillStateContainer(StateContainer.Builder builder) { + builder.add(FACING); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + return this.getDefaultState().with(FACING, context.getPlacementHorizontalFacing().getOpposite()); + } + + public BlockState rotate(BlockState state, Rotation rot) { + return state.with(FACING, rot.rotate(state.get(FACING))); + } + + public BlockState mirror(BlockState state, Mirror mirrorIn) { + return state.rotate(mirrorIn.toRotation(state.get(FACING))); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + + @Override + public void onBlockAdded(BlockState blockstate, World world, BlockPos pos, BlockState oldState, boolean moving) { + super.onBlockAdded(blockstate, world, pos, oldState, moving); + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + world.getPendingBlockTicks().scheduleTick(pos, this, 1); + } + + @Override + public void tick(BlockState blockstate, ServerWorld world, BlockPos pos, Random random) { + super.tick(blockstate, world, pos, random); + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + + BloomedMuncherUpdateTickProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + world.getPendingBlockTicks().scheduleTick(pos, this, 1); + } + + @OnlyIn(Dist.CLIENT) + @Override + public void animateTick(BlockState blockstate, World world, BlockPos pos, Random random) { + super.animateTick(blockstate, world, pos, random); + PlayerEntity entity = Minecraft.getInstance().player; + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + if (true) + for (int l = 0; l < 1; ++l) { + double d0 = (x + 0.5) + (random.nextFloat() - 0.5) * 0.1D * 20; + double d1 = ((y + 0.7) + (random.nextFloat() - 0.5) * 0.1D) + 0.5; + double d2 = (z + 0.5) + (random.nextFloat() - 0.5) * 0.1D * 20; + world.addParticle(LilyPadParticlesParticle.particle, d0, d1, d2, 0, 0, 0); + } + } + + @Override + public void onEntityCollision(BlockState blockstate, World world, BlockPos pos, Entity entity) { + super.onEntityCollision(blockstate, world, pos, entity); + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + + BloomedMuncherEntityCollidesInTheBlockProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + + @Override + public INamedContainerProvider getContainer(BlockState state, World worldIn, BlockPos pos) { + TileEntity tileEntity = worldIn.getTileEntity(pos); + return tileEntity instanceof INamedContainerProvider ? (INamedContainerProvider) tileEntity : null; + } + + @Override + public boolean hasTileEntity(BlockState state) { + return true; + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return new CustomTileEntity(); + } + + @Override + public boolean eventReceived(BlockState state, World world, BlockPos pos, int eventID, int eventParam) { + super.eventReceived(state, world, pos, eventID, eventParam); + TileEntity tileentity = world.getTileEntity(pos); + return tileentity == null ? false : tileentity.receiveClientEvent(eventID, eventParam); + } + + @Override + public void onReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean isMoving) { + if (state.getBlock() != newState.getBlock()) { + TileEntity tileentity = world.getTileEntity(pos); + if (tileentity instanceof CustomTileEntity) { + InventoryHelper.dropInventoryItems(world, pos, (CustomTileEntity) tileentity); + world.updateComparatorOutputLevel(pos, this); + } + + super.onReplaced(state, world, pos, newState, isMoving); + } + } + + @Override + public boolean hasComparatorInputOverride(BlockState state) { + return true; + } + + @Override + public int getComparatorInputOverride(BlockState blockState, World world, BlockPos pos) { + TileEntity tileentity = world.getTileEntity(pos); + if (tileentity instanceof CustomTileEntity) + return Container.calcRedstoneFromInventory((CustomTileEntity) tileentity); + else + return 0; + } + } + + public static class CustomTileEntity extends LockableLootTileEntity implements ISidedInventory { + private NonNullList stacks = NonNullList.withSize(0, ItemStack.EMPTY); + + protected CustomTileEntity() { + super(tileEntityType); + } + + @Override + public void read(BlockState blockState, CompoundNBT compound) { + super.read(blockState, compound); + if (!this.checkLootAndRead(compound)) { + this.stacks = NonNullList.withSize(this.getSizeInventory(), ItemStack.EMPTY); + } + ItemStackHelper.loadAllItems(compound, this.stacks); + } + + @Override + public CompoundNBT write(CompoundNBT compound) { + super.write(compound); + if (!this.checkLootAndWrite(compound)) { + ItemStackHelper.saveAllItems(compound, this.stacks); + } + return compound; + } + + @Override + public SUpdateTileEntityPacket getUpdatePacket() { + return new SUpdateTileEntityPacket(this.pos, 0, this.getUpdateTag()); + } + + @Override + public CompoundNBT getUpdateTag() { + return this.write(new CompoundNBT()); + } + + @Override + public void onDataPacket(NetworkManager net, SUpdateTileEntityPacket pkt) { + this.read(this.getBlockState(), pkt.getNbtCompound()); + } + + @Override + public int getSizeInventory() { + return stacks.size(); + } + + @Override + public boolean isEmpty() { + for (ItemStack itemstack : this.stacks) + if (!itemstack.isEmpty()) + return false; + return true; + } + + @Override + public ITextComponent getDefaultName() { + return new StringTextComponent("bloomed_muncher"); + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public Container createMenu(int id, PlayerInventory player) { + return ChestContainer.createGeneric9X3(id, player, this); + } + + @Override + public ITextComponent getDisplayName() { + return new StringTextComponent("Bloomed Muncher 'Flower'"); + } + + @Override + protected NonNullList getItems() { + return this.stacks; + } + + @Override + protected void setItems(NonNullList stacks) { + this.stacks = stacks; + } + + @Override + public boolean isItemValidForSlot(int index, ItemStack stack) { + return true; + } + + @Override + public int[] getSlotsForFace(Direction side) { + return IntStream.range(0, this.getSizeInventory()).toArray(); + } + + @Override + public boolean canInsertItem(int index, ItemStack stack, @Nullable Direction direction) { + return this.isItemValidForSlot(index, stack); + } + + @Override + public boolean canExtractItem(int index, ItemStack stack, Direction direction) { + return true; + } + + private final LazyOptional[] handlers = SidedInvWrapper.create(this, Direction.values()); + + @Override + public LazyOptional getCapability(Capability capability, @Nullable Direction facing) { + if (!this.removed && facing != null && capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + return handlers[facing.ordinal()].cast(); + return super.getCapability(capability, facing); + } + + @Override + public void remove() { + super.remove(); + for (LazyOptional handler : handlers) + handler.invalidate(); + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafBlossomerBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafBlossomerBlock.java new file mode 100644 index 0000000..12b1518 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafBlossomerBlock.java @@ -0,0 +1,157 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.PlantType; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.gen.feature.Features; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.DefaultFlowersFeature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.BlockClusterFeatureConfig; +import net.minecraft.world.gen.blockstateprovider.SimpleBlockStateProvider; +import net.minecraft.world.gen.blockplacer.SimpleBlockPlacer; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Direction; +import net.minecraft.potion.Effects; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItem; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.FlowerBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.Random; +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafBlossomerBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_blossomer") + public static final Block block = null; + + public BlueleafBlossomerBlock(HemModElements instance) { + super(instance, 30); + MinecraftForge.EVENT_BUS.register(this); + FMLJavaModLoadingContext.get().getModEventBus().register(new FeatureRegisterHandler()); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new BlockCustomFlower()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutout()); + } + + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + private static class FeatureRegisterHandler { + @SubscribeEvent + public void registerFeature(RegistryEvent.Register> event) { + feature = new DefaultFlowersFeature(BlockClusterFeatureConfig.field_236587_a_) { + @Override + public BlockState getFlowerToPlace(Random random, BlockPos bp, BlockClusterFeatureConfig fc) { + return block.getDefaultState(); + } + + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, BlockClusterFeatureConfig config) { + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + return super.generate(world, generator, random, pos, config); + } + }; + configuredFeature = feature + .withConfiguration( + (new BlockClusterFeatureConfig.Builder(new SimpleBlockStateProvider(block.getDefaultState()), new SimpleBlockPlacer())) + .tries(64).build()) + .withPlacement(Features.Placements.VEGETATION_PLACEMENT).withPlacement(Features.Placements.HEIGHTMAP_PLACEMENT).func_242731_b(5); + event.getRegistry().register(feature.setRegistryName("blueleaf_blossomer")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:blueleaf_blossomer"), configuredFeature); + } + } + + @SubscribeEvent + public void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.VEGETAL_DECORATION).add(() -> configuredFeature); + } + + public static class BlockCustomFlower extends FlowerBlock { + public BlockCustomFlower() { + super(Effects.JUMP_BOOST, 100, Block.Properties.create(Material.PLANTS).doesNotBlockMovement().sound(SoundType.PLANT) + .hardnessAndResistance(0f, 0f).setLightLevel(s -> 0)); + setRegistryName("blueleaf_blossomer"); + } + + @Override + public int getStewEffectDuration() { + return 100; + } + + @Override + public int getFlammability(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 100; + } + + @Override + public int getFireSpreadSpeed(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 60; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + + @Override + public PlantType getPlantType(IBlockReader world, BlockPos pos) { + return PlantType.PLAINS; + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafBrownCapBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafBrownCapBlock.java new file mode 100644 index 0000000..77c302e --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafBrownCapBlock.java @@ -0,0 +1,161 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.PlantType; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.gen.feature.Features; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.DefaultFlowersFeature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.BlockClusterFeatureConfig; +import net.minecraft.world.gen.blockstateprovider.SimpleBlockStateProvider; +import net.minecraft.world.gen.blockplacer.SimpleBlockPlacer; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Direction; +import net.minecraft.potion.Effects; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItem; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.FlowerBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.Random; +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafBrownCapBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_brown_cap") + public static final Block block = null; + + public BlueleafBrownCapBlock(HemModElements instance) { + super(instance, 50); + MinecraftForge.EVENT_BUS.register(this); + FMLJavaModLoadingContext.get().getModEventBus().register(new FeatureRegisterHandler()); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new BlockCustomFlower()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutout()); + } + + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + private static class FeatureRegisterHandler { + @SubscribeEvent + public void registerFeature(RegistryEvent.Register> event) { + feature = new DefaultFlowersFeature(BlockClusterFeatureConfig.field_236587_a_) { + @Override + public BlockState getFlowerToPlace(Random random, BlockPos bp, BlockClusterFeatureConfig fc) { + return block.getDefaultState(); + } + + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, BlockClusterFeatureConfig config) { + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + return super.generate(world, generator, random, pos, config); + } + }; + configuredFeature = feature + .withConfiguration( + (new BlockClusterFeatureConfig.Builder(new SimpleBlockStateProvider(block.getDefaultState()), new SimpleBlockPlacer())) + .tries(16).build()) + .withPlacement(Features.Placements.VEGETATION_PLACEMENT).withPlacement(Features.Placements.HEIGHTMAP_PLACEMENT).func_242731_b(5); + event.getRegistry().register(feature.setRegistryName("blueleaf_brown_cap")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:blueleaf_brown_cap"), configuredFeature); + } + } + + @SubscribeEvent + public void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:heightend_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.VEGETAL_DECORATION).add(() -> configuredFeature); + } + + public static class BlockCustomFlower extends FlowerBlock { + public BlockCustomFlower() { + super(Effects.REGENERATION, 100, Block.Properties.create(Material.PLANTS).doesNotBlockMovement().sound(SoundType.PLANT) + .hardnessAndResistance(0f, 0f).setLightLevel(s -> 0)); + setRegistryName("blueleaf_brown_cap"); + } + + @Override + public int getStewEffectDuration() { + return 100; + } + + @Override + public int getFlammability(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 100; + } + + @Override + public int getFireSpreadSpeed(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 60; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + + @Override + public PlantType getPlantType(IBlockReader world, BlockPos pos) { + return PlantType.PLAINS; + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafButterSlumpBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafButterSlumpBlock.java new file mode 100644 index 0000000..4e4ef99 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafButterSlumpBlock.java @@ -0,0 +1,159 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.PlantType; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.gen.feature.Features; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.DefaultFlowersFeature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.BlockClusterFeatureConfig; +import net.minecraft.world.gen.blockstateprovider.SimpleBlockStateProvider; +import net.minecraft.world.gen.blockplacer.SimpleBlockPlacer; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Direction; +import net.minecraft.potion.Effects; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItem; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.FlowerBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.Random; +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafButterSlumpBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_butter_slump") + public static final Block block = null; + + public BlueleafButterSlumpBlock(HemModElements instance) { + super(instance, 49); + MinecraftForge.EVENT_BUS.register(this); + FMLJavaModLoadingContext.get().getModEventBus().register(new FeatureRegisterHandler()); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new BlockCustomFlower()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutout()); + } + + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + private static class FeatureRegisterHandler { + @SubscribeEvent + public void registerFeature(RegistryEvent.Register> event) { + feature = new DefaultFlowersFeature(BlockClusterFeatureConfig.field_236587_a_) { + @Override + public BlockState getFlowerToPlace(Random random, BlockPos bp, BlockClusterFeatureConfig fc) { + return block.getDefaultState(); + } + + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, BlockClusterFeatureConfig config) { + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + return super.generate(world, generator, random, pos, config); + } + }; + configuredFeature = feature + .withConfiguration( + (new BlockClusterFeatureConfig.Builder(new SimpleBlockStateProvider(block.getDefaultState()), new SimpleBlockPlacer())) + .tries(64).build()) + .withPlacement(Features.Placements.VEGETATION_PLACEMENT).withPlacement(Features.Placements.HEIGHTMAP_PLACEMENT).func_242731_b(5); + event.getRegistry().register(feature.setRegistryName("blueleaf_butter_slump")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:blueleaf_butter_slump"), configuredFeature); + } + } + + @SubscribeEvent + public void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:heightend_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.VEGETAL_DECORATION).add(() -> configuredFeature); + } + + public static class BlockCustomFlower extends FlowerBlock { + public BlockCustomFlower() { + super(Effects.JUMP_BOOST, 100, Block.Properties.create(Material.PLANTS).doesNotBlockMovement().sound(SoundType.PLANT) + .hardnessAndResistance(0f, 0f).setLightLevel(s -> 0)); + setRegistryName("blueleaf_butter_slump"); + } + + @Override + public int getStewEffectDuration() { + return 100; + } + + @Override + public int getFlammability(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 100; + } + + @Override + public int getFireSpreadSpeed(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 60; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + + @Override + public PlantType getPlantType(IBlockReader world, BlockPos pos) { + return PlantType.PLAINS; + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafCabbageFlowerBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafCabbageFlowerBlock.java new file mode 100644 index 0000000..2af1b71 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafCabbageFlowerBlock.java @@ -0,0 +1,155 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.PlantType; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.gen.feature.Features; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.DefaultFlowersFeature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.BlockClusterFeatureConfig; +import net.minecraft.world.gen.blockstateprovider.SimpleBlockStateProvider; +import net.minecraft.world.gen.blockplacer.SimpleBlockPlacer; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Direction; +import net.minecraft.potion.Effects; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItem; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.FlowerBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.Random; +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafCabbageFlowerBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_cabbage_flower") + public static final Block block = null; + + public BlueleafCabbageFlowerBlock(HemModElements instance) { + super(instance, 46); + MinecraftForge.EVENT_BUS.register(this); + FMLJavaModLoadingContext.get().getModEventBus().register(new FeatureRegisterHandler()); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new BlockCustomFlower()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutout()); + } + + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + private static class FeatureRegisterHandler { + @SubscribeEvent + public void registerFeature(RegistryEvent.Register> event) { + feature = new DefaultFlowersFeature(BlockClusterFeatureConfig.field_236587_a_) { + @Override + public BlockState getFlowerToPlace(Random random, BlockPos bp, BlockClusterFeatureConfig fc) { + return block.getDefaultState(); + } + + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, BlockClusterFeatureConfig config) { + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + return super.generate(world, generator, random, pos, config); + } + }; + configuredFeature = feature + .withConfiguration( + (new BlockClusterFeatureConfig.Builder(new SimpleBlockStateProvider(block.getDefaultState()), new SimpleBlockPlacer())) + .tries(64).build()) + .withPlacement(Features.Placements.VEGETATION_PLACEMENT).withPlacement(Features.Placements.HEIGHTMAP_PLACEMENT).func_242731_b(5); + event.getRegistry().register(feature.setRegistryName("blueleaf_cabbage_flower")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:blueleaf_cabbage_flower"), configuredFeature); + } + } + + @SubscribeEvent + public void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.VEGETAL_DECORATION).add(() -> configuredFeature); + } + + public static class BlockCustomFlower extends FlowerBlock { + public BlockCustomFlower() { + super(Effects.RESISTANCE, 100, Block.Properties.create(Material.PLANTS).doesNotBlockMovement().sound(SoundType.PLANT) + .hardnessAndResistance(0f, 0f).setLightLevel(s -> 0)); + setRegistryName("blueleaf_cabbage_flower"); + } + + @Override + public int getStewEffectDuration() { + return 100; + } + + @Override + public int getFlammability(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 100; + } + + @Override + public int getFireSpreadSpeed(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 60; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + + @Override + public PlantType getPlantType(IBlockReader world, BlockPos pos) { + return PlantType.PLAINS; + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafCobblestoneBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafCobblestoneBlock.java new file mode 100644 index 0000000..4446060 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafCobblestoneBlock.java @@ -0,0 +1,130 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.ToolType; +import net.minecraftforge.common.MinecraftForge; + +import net.minecraft.world.gen.feature.template.RuleTest; +import net.minecraft.world.gen.feature.template.IRuleTestType; +import net.minecraft.world.gen.feature.OreFeatureConfig; +import net.minecraft.world.gen.feature.OreFeature; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItem; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.Random; +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafCobblestoneBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_cobblestone") + public static final Block block = null; + + public BlueleafCobblestoneBlock(HemModElements instance) { + super(instance, 10); + MinecraftForge.EVENT_BUS.register(this); + FMLJavaModLoadingContext.get().getModEventBus().register(new FeatureRegisterHandler()); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + public static class CustomBlock extends Block { + public CustomBlock() { + super(Block.Properties.create(Material.ROCK).sound(SoundType.STONE).hardnessAndResistance(0.75f, 10f).setLightLevel(s -> 0) + .harvestLevel(1).harvestTool(ToolType.PICKAXE).setRequiresTool()); + setRegistryName("blueleaf_cobblestone"); + } + + @Override + public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) { + return 15; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + } + + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + private static IRuleTestType CUSTOM_MATCH = null; + + private static class CustomRuleTest extends RuleTest { + static final CustomRuleTest INSTANCE = new CustomRuleTest(); + static final com.mojang.serialization.Codec codec = com.mojang.serialization.Codec.unit(() -> INSTANCE); + + public boolean test(BlockState blockAt, Random random) { + boolean blockCriteria = false; + if (blockAt.getBlock() == BlueleafStoneBlock.block) + blockCriteria = true; + return blockCriteria; + } + + protected IRuleTestType getType() { + return CUSTOM_MATCH; + } + } + + private static class FeatureRegisterHandler { + @SubscribeEvent + public void registerFeature(RegistryEvent.Register> event) { + CUSTOM_MATCH = Registry.register(Registry.RULE_TEST, new ResourceLocation("hem:blueleaf_cobblestone_match"), () -> CustomRuleTest.codec); + feature = new OreFeature(OreFeatureConfig.CODEC) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random rand, BlockPos pos, OreFeatureConfig config) { + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + return super.generate(world, generator, rand, pos, config); + } + }; + configuredFeature = feature.withConfiguration(new OreFeatureConfig(CustomRuleTest.INSTANCE, block.getDefaultState(), 26)).range(256) + .square().func_242731_b(24); + event.getRegistry().register(feature.setRegistryName("blueleaf_cobblestone")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:blueleaf_cobblestone"), configuredFeature); + } + } + + @SubscribeEvent + public void addFeatureToBiomes(BiomeLoadingEvent event) { + event.getGeneration().getFeatures(GenerationStage.Decoration.UNDERGROUND_ORES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafCobblestoneSlabBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafCobblestoneSlabBlock.java new file mode 100644 index 0000000..e348152 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafCobblestoneSlabBlock.java @@ -0,0 +1,55 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.common.ToolType; + +import net.minecraft.state.properties.SlabType; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItem; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.SlabBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafCobblestoneSlabBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_cobblestone_slab") + public static final Block block = null; + + public BlueleafCobblestoneSlabBlock(HemModElements instance) { + super(instance, 12); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + public static class CustomBlock extends SlabBlock { + public CustomBlock() { + super(Block.Properties.create(Material.ROCK).sound(SoundType.STONE).hardnessAndResistance(0.75f, 10f).setLightLevel(s -> 0) + .harvestLevel(1).harvestTool(ToolType.PICKAXE).setRequiresTool()); + setRegistryName("blueleaf_cobblestone_slab"); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, state.get(TYPE) == SlabType.DOUBLE ? 2 : 1)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafCobblestoneStairsBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafCobblestoneStairsBlock.java new file mode 100644 index 0000000..693f82e --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafCobblestoneStairsBlock.java @@ -0,0 +1,56 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.common.ToolType; + +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItem; +import net.minecraft.block.material.Material; +import net.minecraft.block.StairsBlock; +import net.minecraft.block.SoundType; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafCobblestoneStairsBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_cobblestone_stairs") + public static final Block block = null; + + public BlueleafCobblestoneStairsBlock(HemModElements instance) { + super(instance, 11); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + public static class CustomBlock extends StairsBlock { + public CustomBlock() { + super(() -> new Block(Block.Properties.create(Material.ROCK).sound(SoundType.STONE).hardnessAndResistance(0.75f, 10f) + .setLightLevel(s -> 0).harvestLevel(1).harvestTool(ToolType.PICKAXE).setRequiresTool()).getDefaultState(), + Block.Properties.create(Material.ROCK).sound(SoundType.STONE).hardnessAndResistance(0.75f, 10f).setLightLevel(s -> 0) + .harvestLevel(1).harvestTool(ToolType.PICKAXE).setRequiresTool()); + setRegistryName("blueleaf_cobblestone_stairs"); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafCobblestoneWallBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafCobblestoneWallBlock.java new file mode 100644 index 0000000..034a174 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafCobblestoneWallBlock.java @@ -0,0 +1,207 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.common.ToolType; + +import net.minecraft.world.IWorldReader; +import net.minecraft.world.IWorld; +import net.minecraft.util.math.shapes.VoxelShapes; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.IBooleanFunction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Direction; +import net.minecraft.tags.BlockTags; +import net.minecraft.state.Property; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.BlockItem; +import net.minecraft.fluid.Fluids; +import net.minecraft.fluid.FluidState; +import net.minecraft.block.material.Material; +import net.minecraft.block.WallHeight; +import net.minecraft.block.WallBlock; +import net.minecraft.block.SoundType; +import net.minecraft.block.FenceGateBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafCobblestoneWallBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_cobblestone_wall") + public static final Block block = null; + + public BlueleafCobblestoneWallBlock(HemModElements instance) { + super(instance, 13); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + public static class CustomBlock extends WallBlock { + public CustomBlock() { + super(Block.Properties.create(Material.ROCK).sound(SoundType.STONE).hardnessAndResistance(0.75f, 10f).setLightLevel(s -> 0) + .harvestLevel(1).harvestTool(ToolType.PICKAXE).setRequiresTool()); + setRegistryName("blueleaf_cobblestone_wall"); + } + + private static final VoxelShape CENTER_POLE_SHAPE = Block.makeCuboidShape(7.0D, 0.0D, 7.0D, 9.0D, 16.0D, 9.0D); + private static final VoxelShape WALL_CONNECTION_NORTH_SIDE_SHAPE = Block.makeCuboidShape(7.0D, 0.0D, 0.0D, 9.0D, 16.0D, 9.0D); + private static final VoxelShape WALL_CONNECTION_SOUTH_SIDE_SHAPE = Block.makeCuboidShape(7.0D, 0.0D, 7.0D, 9.0D, 16.0D, 16.0D); + private static final VoxelShape WALL_CONNECTION_WEST_SIDE_SHAPE = Block.makeCuboidShape(0.0D, 0.0D, 7.0D, 9.0D, 16.0D, 9.0D); + private static final VoxelShape WALL_CONNECTION_EAST_SIDE_SHAPE = Block.makeCuboidShape(7.0D, 0.0D, 7.0D, 16.0D, 16.0D, 9.0D); + + private boolean shouldConnect(BlockState state, boolean checkattach, Direction face) { + boolean flag = state.getBlock() instanceof WallBlock + || state.getBlock() instanceof FenceGateBlock && FenceGateBlock.isParallel(state, face); + return !cannotAttach(state.getBlock()) && checkattach || flag; + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + IWorldReader iworldreader = context.getWorld(); + BlockPos blockpos = context.getPos(); + FluidState fluidstate = context.getWorld().getFluidState(context.getPos()); + BlockPos blockpos1 = blockpos.north(); + BlockPos blockpos2 = blockpos.east(); + BlockPos blockpos3 = blockpos.south(); + BlockPos blockpos4 = blockpos.west(); + BlockPos blockpos5 = blockpos.up(); + BlockState blockstate = iworldreader.getBlockState(blockpos1); + BlockState blockstate1 = iworldreader.getBlockState(blockpos2); + BlockState blockstate2 = iworldreader.getBlockState(blockpos3); + BlockState blockstate3 = iworldreader.getBlockState(blockpos4); + BlockState blockstate4 = iworldreader.getBlockState(blockpos5); + boolean flag = this.shouldConnect(blockstate, blockstate.isSolidSide(iworldreader, blockpos1, Direction.SOUTH), Direction.SOUTH); + boolean flag1 = this.shouldConnect(blockstate1, blockstate1.isSolidSide(iworldreader, blockpos2, Direction.WEST), Direction.WEST); + boolean flag2 = this.shouldConnect(blockstate2, blockstate2.isSolidSide(iworldreader, blockpos3, Direction.NORTH), Direction.NORTH); + boolean flag3 = this.shouldConnect(blockstate3, blockstate3.isSolidSide(iworldreader, blockpos4, Direction.EAST), Direction.EAST); + BlockState blockstate5 = this.getDefaultState().with(WATERLOGGED, Boolean.valueOf(fluidstate.getFluid() == Fluids.WATER)); + return this.func_235626_a_(iworldreader, blockstate5, blockpos5, blockstate4, flag, flag1, flag2, flag3); + } + + @Override /** + * Update the provided state given the provided neighbor facing and neighbor state, returning a new state. For example, fences make their connections to the passed in state if possible, and wet concrete powder immediately returns its solidified counterpart. Note that this method should ideally consider only the specific face passed in. + */ + public BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn, BlockPos currentPos, + BlockPos facingPos) { + if (stateIn.get(WATERLOGGED)) { + worldIn.getPendingFluidTicks().scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickRate(worldIn)); + } + if (facing == Direction.DOWN) { + return super.updatePostPlacement(stateIn, facing, facingState, worldIn, currentPos, facingPos); + } else { + return facing == Direction.UP + ? this.func_235625_a_(worldIn, stateIn, facingPos, facingState) + : this.func_235627_a_(worldIn, currentPos, stateIn, facingPos, facingState, facing); + } + } + + private BlockState func_235625_a_(IWorldReader reader, BlockState state1, BlockPos pos, BlockState state2) { + boolean flag = hasHeightForProperty(state1, WALL_HEIGHT_NORTH); + boolean flag1 = hasHeightForProperty(state1, WALL_HEIGHT_EAST); + boolean flag2 = hasHeightForProperty(state1, WALL_HEIGHT_SOUTH); + boolean flag3 = hasHeightForProperty(state1, WALL_HEIGHT_WEST); + return this.func_235626_a_(reader, state1, pos, state2, flag, flag1, flag2, flag3); + } + + private BlockState func_235627_a_(IWorldReader reader, BlockPos p_235627_2_, BlockState p_235627_3_, BlockPos p_235627_4_, + BlockState p_235627_5_, Direction directionIn) { + Direction direction = directionIn.getOpposite(); + boolean flag = directionIn == Direction.NORTH + ? this.shouldConnect(p_235627_5_, p_235627_5_.isSolidSide(reader, p_235627_4_, direction), direction) + : hasHeightForProperty(p_235627_3_, WALL_HEIGHT_NORTH); + boolean flag1 = directionIn == Direction.EAST + ? this.shouldConnect(p_235627_5_, p_235627_5_.isSolidSide(reader, p_235627_4_, direction), direction) + : hasHeightForProperty(p_235627_3_, WALL_HEIGHT_EAST); + boolean flag2 = directionIn == Direction.SOUTH + ? this.shouldConnect(p_235627_5_, p_235627_5_.isSolidSide(reader, p_235627_4_, direction), direction) + : hasHeightForProperty(p_235627_3_, WALL_HEIGHT_SOUTH); + boolean flag3 = directionIn == Direction.WEST + ? this.shouldConnect(p_235627_5_, p_235627_5_.isSolidSide(reader, p_235627_4_, direction), direction) + : hasHeightForProperty(p_235627_3_, WALL_HEIGHT_WEST); + BlockPos blockpos = p_235627_2_.up(); + BlockState blockstate = reader.getBlockState(blockpos); + return this.func_235626_a_(reader, p_235627_3_, blockpos, blockstate, flag, flag1, flag2, flag3); + } + + private BlockState func_235626_a_(IWorldReader reader, BlockState state, BlockPos pos, BlockState collisionState, boolean connectedSouth, + boolean connectedWest, boolean connectedNorth, boolean connectedEast) { + VoxelShape voxelshape = collisionState.getCollisionShape(reader, pos).project(Direction.DOWN); + BlockState blockstate = this.func_235630_a_(state, connectedSouth, connectedWest, connectedNorth, connectedEast, voxelshape); + return blockstate.with(UP, Boolean.valueOf(this.func_235628_a_(blockstate, collisionState, voxelshape))); + } + + private BlockState func_235630_a_(BlockState state, boolean connectedSouth, boolean connectedWest, boolean connectedNorth, + boolean connectedEast, VoxelShape shape) { + return state.with(WALL_HEIGHT_NORTH, this.func_235633_a_(connectedSouth, shape, WALL_CONNECTION_NORTH_SIDE_SHAPE)) + .with(WALL_HEIGHT_EAST, this.func_235633_a_(connectedWest, shape, WALL_CONNECTION_EAST_SIDE_SHAPE)) + .with(WALL_HEIGHT_SOUTH, this.func_235633_a_(connectedNorth, shape, WALL_CONNECTION_SOUTH_SIDE_SHAPE)) + .with(WALL_HEIGHT_WEST, this.func_235633_a_(connectedEast, shape, WALL_CONNECTION_WEST_SIDE_SHAPE)); + } + + private WallHeight func_235633_a_(boolean p_235633_1_, VoxelShape p_235633_2_, VoxelShape p_235633_3_) { + if (p_235633_1_) { + return compareShapes(p_235633_2_, p_235633_3_) ? WallHeight.TALL : WallHeight.LOW; + } else { + return WallHeight.NONE; + } + } + + private boolean func_235628_a_(BlockState p_235628_1_, BlockState p_235628_2_, VoxelShape shape) { + boolean flag = p_235628_2_.getBlock() instanceof WallBlock && p_235628_2_.get(UP); + if (flag) { + return true; + } else { + WallHeight wallheight = p_235628_1_.get(WALL_HEIGHT_NORTH); + WallHeight wallheight1 = p_235628_1_.get(WALL_HEIGHT_SOUTH); + WallHeight wallheight2 = p_235628_1_.get(WALL_HEIGHT_EAST); + WallHeight wallheight3 = p_235628_1_.get(WALL_HEIGHT_WEST); + boolean flag1 = wallheight1 == WallHeight.NONE; + boolean flag2 = wallheight3 == WallHeight.NONE; + boolean flag3 = wallheight2 == WallHeight.NONE; + boolean flag4 = wallheight == WallHeight.NONE; + boolean flag5 = flag4 && flag1 && flag2 && flag3 || flag4 != flag1 || flag2 != flag3; + if (flag5) { + return true; + } else { + boolean flag6 = wallheight == WallHeight.TALL && wallheight1 == WallHeight.TALL + || wallheight2 == WallHeight.TALL && wallheight3 == WallHeight.TALL; + if (flag6) { + return false; + } else { + return p_235628_2_.getBlock().isIn(BlockTags.WALL_POST_OVERRIDE) || compareShapes(shape, CENTER_POLE_SHAPE); + } + } + } + } + + private static boolean hasHeightForProperty(BlockState state, Property heightProperty) { + return state.get(heightProperty) != WallHeight.NONE; + } + + private static boolean compareShapes(VoxelShape shape1, VoxelShape shape2) { + return !VoxelShapes.compare(shape2, shape1, IBooleanFunction.ONLY_FIRST); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafDeadLogBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafDeadLogBlock.java new file mode 100644 index 0000000..03991d7 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafDeadLogBlock.java @@ -0,0 +1,108 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.common.ToolType; +import net.minecraftforge.common.IPlantable; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.IBlockReader; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.Direction; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.state.StateContainer; +import net.minecraft.state.EnumProperty; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.BlockItem; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafDeadLogBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_dead_log") + public static final Block block = null; + + public BlueleafDeadLogBlock(HemModElements instance) { + super(instance, 17); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutoutMipped()); + } + + public static class CustomBlock extends Block { + public static final EnumProperty AXIS = BlockStateProperties.AXIS; + + public CustomBlock() { + super(Block.Properties.create(Material.WOOD).sound(SoundType.WOOD).hardnessAndResistance(0.5f, 10f).setLightLevel(s -> 0).harvestLevel(1) + .harvestTool(ToolType.AXE).speedFactor(0.8f).notSolid().setOpaque((bs, br, bp) -> false)); + this.setDefaultState(this.stateContainer.getBaseState().with(AXIS, Direction.Axis.Y)); + setRegistryName("blueleaf_dead_log"); + } + + @Override + public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) { + return 15; + } + + @Override + protected void fillStateContainer(StateContainer.Builder builder) { + builder.add(AXIS); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + return this.getDefaultState().with(AXIS, context.getFace().getAxis()); + } + + @Override + public BlockState rotate(BlockState state, Rotation rot) { + if (rot == Rotation.CLOCKWISE_90 || rot == Rotation.COUNTERCLOCKWISE_90) { + if ((Direction.Axis) state.get(AXIS) == Direction.Axis.X) { + return state.with(AXIS, Direction.Axis.Z); + } else if ((Direction.Axis) state.get(AXIS) == Direction.Axis.Z) { + return state.with(AXIS, Direction.Axis.X); + } + } + return state; + } + + @Override + public boolean canSustainPlant(BlockState state, IBlockReader world, BlockPos pos, Direction direction, IPlantable plantable) { + return true; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafDirtBlockBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafDirtBlockBlock.java new file mode 100644 index 0000000..31bc565 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafDirtBlockBlock.java @@ -0,0 +1,146 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.ToolType; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.IPlantable; + +import net.minecraft.world.gen.feature.template.RuleTest; +import net.minecraft.world.gen.feature.template.IRuleTestType; +import net.minecraft.world.gen.feature.OreFeatureConfig; +import net.minecraft.world.gen.feature.OreFeature; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Direction; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItem; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.Random; +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafDirtBlockBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_dirt_block") + public static final Block block = null; + + public BlueleafDirtBlockBlock(HemModElements instance) { + super(instance, 2); + MinecraftForge.EVENT_BUS.register(this); + FMLJavaModLoadingContext.get().getModEventBus().register(new FeatureRegisterHandler()); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + public static class CustomBlock extends Block { + public CustomBlock() { + super(Block.Properties.create(Material.EARTH).sound(SoundType.GROUND).hardnessAndResistance(0.5f, 3f).setLightLevel(s -> 0) + .harvestLevel(1).harvestTool(ToolType.SHOVEL)); + setRegistryName("blueleaf_dirt_block"); + } + + @Override + public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) { + return 15; + } + + @Override + public boolean canSustainPlant(BlockState state, IBlockReader world, BlockPos pos, Direction direction, IPlantable plantable) { + return true; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + } + + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + private static IRuleTestType CUSTOM_MATCH = null; + + private static class CustomRuleTest extends RuleTest { + static final CustomRuleTest INSTANCE = new CustomRuleTest(); + static final com.mojang.serialization.Codec codec = com.mojang.serialization.Codec.unit(() -> INSTANCE); + + public boolean test(BlockState blockAt, Random random) { + boolean blockCriteria = false; + if (blockAt.getBlock() == BlueleafGravelMudBlock.block) + blockCriteria = true; + if (blockAt.getBlock() == BlueleafMudBlock.block) + blockCriteria = true; + if (blockAt.getBlock() == BlueleafStoneGravelBlock.block) + blockCriteria = true; + return blockCriteria; + } + + protected IRuleTestType getType() { + return CUSTOM_MATCH; + } + } + + private static class FeatureRegisterHandler { + @SubscribeEvent + public void registerFeature(RegistryEvent.Register> event) { + CUSTOM_MATCH = Registry.register(Registry.RULE_TEST, new ResourceLocation("hem:blueleaf_dirt_block_match"), () -> CustomRuleTest.codec); + feature = new OreFeature(OreFeatureConfig.CODEC) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random rand, BlockPos pos, OreFeatureConfig config) { + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + return super.generate(world, generator, rand, pos, config); + } + }; + configuredFeature = feature.withConfiguration(new OreFeatureConfig(CustomRuleTest.INSTANCE, block.getDefaultState(), 31)).range(256) + .square().func_242731_b(31); + event.getRegistry().register(feature.setRegistryName("blueleaf_dirt_block")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:blueleaf_dirt_block"), configuredFeature); + } + } + + @SubscribeEvent + public void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.UNDERGROUND_ORES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafDirtGrassBlockBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafDirtGrassBlockBlock.java new file mode 100644 index 0000000..0f6737c --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafDirtGrassBlockBlock.java @@ -0,0 +1,67 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.common.ToolType; +import net.minecraftforge.common.IPlantable; + +import net.minecraft.world.IBlockReader; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Direction; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItem; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafDirtGrassBlockBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_dirt_grass_block") + public static final Block block = null; + + public BlueleafDirtGrassBlockBlock(HemModElements instance) { + super(instance, 2); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + public static class CustomBlock extends Block { + public CustomBlock() { + super(Block.Properties.create(Material.ORGANIC).sound(SoundType.PLANT).hardnessAndResistance(0.5f, 3f).setLightLevel(s -> 0) + .harvestLevel(1).harvestTool(ToolType.SHOVEL)); + setRegistryName("blueleaf_dirt_grass_block"); + } + + @Override + public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) { + return 15; + } + + @Override + public boolean canSustainPlant(BlockState state, IBlockReader world, BlockPos pos, Direction direction, IPlantable plantable) { + return true; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(BlueleafDirtBlockBlock.block)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafFluorescentLeavesBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafFluorescentLeavesBlock.java new file mode 100644 index 0000000..e80e776 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafFluorescentLeavesBlock.java @@ -0,0 +1,147 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.procedures.BlueleafFluorescentLeavesParticleSpawningConditionProcedure; +import studio.halbear.hem.particle.FluorescentLeavesParticlesParticle; +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.common.ToolType; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Direction; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.state.StateContainer; +import net.minecraft.state.BooleanProperty; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.BlockItem; +import net.minecraft.fluid.Fluids; +import net.minecraft.fluid.FluidState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.Minecraft; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.IWaterLoggable; +import net.minecraft.block.Blocks; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.stream.Stream; +import java.util.Random; +import java.util.Map; +import java.util.List; +import java.util.HashMap; +import java.util.Collections; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class BlueleafFluorescentLeavesBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_fluorescent_leaves") + public static final Block block = null; + + public BlueleafFluorescentLeavesBlock(HemModElements instance) { + super(instance, 19); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutoutMipped()); + } + + public static class CustomBlock extends Block implements IWaterLoggable { + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + + public CustomBlock() { + super(Block.Properties.create(Material.LEAVES).sound(SoundType.PLANT).hardnessAndResistance(0.3f, 1f).setLightLevel(s -> 7) + .harvestLevel(1).harvestTool(ToolType.HOE).slipperiness(0.7999999999999999f).speedFactor(0.6f).jumpFactor(0.6f).notSolid() + .setNeedsPostProcessing((bs, br, bp) -> true).setEmmisiveRendering((bs, br, bp) -> true).setOpaque((bs, br, bp) -> false)); + this.setDefaultState(this.stateContainer.getBaseState().with(WATERLOGGED, false)); + setRegistryName("blueleaf_fluorescent_leaves"); + } + + @Override + public boolean propagatesSkylightDown(BlockState state, IBlockReader reader, BlockPos pos) { + return state.getFluidState().isEmpty(); + } + + @Override + public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) { + return 0; + } + + @Override + protected void fillStateContainer(StateContainer.Builder builder) { + builder.add(WATERLOGGED); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + boolean flag = context.getWorld().getFluidState(context.getPos()).getFluid() == Fluids.WATER; + return this.getDefaultState().with(WATERLOGGED, flag); + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.get(WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) : super.getFluidState(state); + } + + @Override + public BlockState updatePostPlacement(BlockState state, Direction facing, BlockState facingState, IWorld world, BlockPos currentPos, + BlockPos facingPos) { + if (state.get(WATERLOGGED)) { + world.getPendingFluidTicks().scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + } + return super.updatePostPlacement(state, facing, facingState, world, currentPos, facingPos); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(Blocks.CAVE_AIR)); + } + + @OnlyIn(Dist.CLIENT) + @Override + public void animateTick(BlockState blockstate, World world, BlockPos pos, Random random) { + super.animateTick(blockstate, world, pos, random); + PlayerEntity entity = Minecraft.getInstance().player; + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + if (BlueleafFluorescentLeavesParticleSpawningConditionProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("world", world)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll))) + for (int l = 0; l < 1; ++l) { + double d0 = (x + random.nextFloat()); + double d1 = (y + random.nextFloat()); + double d2 = (z + random.nextFloat()); + int i1 = random.nextInt(2) * 2 - 1; + double d3 = (random.nextFloat() - 0.5D) * 1D; + double d4 = (random.nextFloat() - 0.5D) * 1D; + double d5 = (random.nextFloat() - 0.5D) * 1D; + world.addParticle(FluorescentLeavesParticlesParticle.particle, d0, d1, d2, d3, d4, d5); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafGrassBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafGrassBlock.java new file mode 100644 index 0000000..7e77f3f --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafGrassBlock.java @@ -0,0 +1,174 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.PlantType; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.NoiseDependant; +import net.minecraft.world.gen.feature.RandomPatchFeature; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.BlockClusterFeatureConfig; +import net.minecraft.world.gen.blockstateprovider.SimpleBlockStateProvider; +import net.minecraft.world.gen.blockplacer.SimpleBlockPlacer; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.math.shapes.VoxelShapes; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Direction; +import net.minecraft.potion.Effects; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.BlockItem; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.FlowerBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.Random; +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafGrassBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_grass") + public static final Block block = null; + + public BlueleafGrassBlock(HemModElements instance) { + super(instance, 19); + MinecraftForge.EVENT_BUS.register(this); + FMLJavaModLoadingContext.get().getModEventBus().register(new FeatureRegisterHandler()); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new BlockCustomFlower()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutout()); + } + + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + private static class FeatureRegisterHandler { + @SubscribeEvent + public void registerFeature(RegistryEvent.Register> event) { + feature = new RandomPatchFeature(BlockClusterFeatureConfig.field_236587_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, BlockClusterFeatureConfig config) { + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + return super.generate(world, generator, random, pos, config); + } + }; + configuredFeature = feature.withConfiguration( + (new BlockClusterFeatureConfig.Builder(new SimpleBlockStateProvider(block.getDefaultState()), new SimpleBlockPlacer())).tries(32) + .build()) + .withPlacement(Placement.COUNT_NOISE.configure(new NoiseDependant(-0.8, 0, 40))); + event.getRegistry().register(feature.setRegistryName("blueleaf_grass")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:blueleaf_grass"), configuredFeature); + } + } + + @SubscribeEvent + public void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:heightend_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.VEGETAL_DECORATION).add(() -> configuredFeature); + } + + public static class BlockCustomFlower extends FlowerBlock { + public BlockCustomFlower() { + super(Effects.HASTE, 100, Block.Properties.create(Material.PLANTS).doesNotBlockMovement().sound(SoundType.PLANT) + .hardnessAndResistance(0f, 0f).setLightLevel(s -> 0)); + setRegistryName("blueleaf_grass"); + } + + @Override + public int getStewEffectDuration() { + return 100; + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext context) { + Vector3d offset = state.getOffset(world, pos); + return VoxelShapes.or(makeCuboidShape(0, 0, 0, 16, 16, 16)) + + .withOffset(offset.x, offset.y, offset.z); + } + + @Override + public boolean isReplaceable(BlockState state, BlockItemUseContext useContext) { + return useContext.getItem().getItem() != this.asItem(); + } + + @Override + public int getFlammability(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 100; + } + + @Override + public int getFireSpreadSpeed(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 60; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + + @Override + public PlantType getPlantType(IBlockReader world, BlockPos pos) { + return PlantType.PLAINS; + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafGrassBlockBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafGrassBlockBlock.java new file mode 100644 index 0000000..8cf74ff --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafGrassBlockBlock.java @@ -0,0 +1,74 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.common.util.ForgeSoundType; +import net.minecraftforge.common.ToolType; +import net.minecraftforge.common.IPlantable; + +import net.minecraft.world.IBlockReader; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.SoundEvent; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Direction; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItem; +import net.minecraft.block.material.Material; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafGrassBlockBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_grass_block") + public static final Block block = null; + + public BlueleafGrassBlockBlock(HemModElements instance) { + super(instance, 4); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + public static class CustomBlock extends Block { + public CustomBlock() { + super(Block.Properties.create(Material.ORGANIC) + .sound(new ForgeSoundType(1.0f, 1.0f, () -> new SoundEvent(new ResourceLocation("block.stone.break")), + () -> new SoundEvent(new ResourceLocation("block.grass.step")), + () -> new SoundEvent(new ResourceLocation("block.stone.place")), + () -> new SoundEvent(new ResourceLocation("block.stone.hit")), + () -> new SoundEvent(new ResourceLocation("block.grass.fall")))) + .hardnessAndResistance(1f, 10f).setLightLevel(s -> 0).harvestLevel(1).harvestTool(ToolType.PICKAXE).setRequiresTool()); + setRegistryName("blueleaf_grass_block"); + } + + @Override + public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) { + return 15; + } + + @Override + public boolean canSustainPlant(BlockState state, IBlockReader world, BlockPos pos, Direction direction, IPlantable plantable) { + return true; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(BlueleafStoneBlock.block)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafGravelMudBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafGravelMudBlock.java new file mode 100644 index 0000000..2ef9712 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafGravelMudBlock.java @@ -0,0 +1,76 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.common.util.ForgeSoundType; +import net.minecraftforge.common.ToolType; +import net.minecraftforge.common.IPlantable; + +import net.minecraft.world.IBlockReader; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.SoundEvent; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Direction; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItem; +import net.minecraft.block.material.Material; +import net.minecraft.block.FallingBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafGravelMudBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_gravel_mud") + public static final Block block = null; + + public BlueleafGravelMudBlock(HemModElements instance) { + super(instance, 129); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + public static class CustomBlock extends FallingBlock { + public CustomBlock() { + super(Block.Properties.create(Material.EARTH) + .sound(new ForgeSoundType(1.0f, 1.0f, () -> new SoundEvent(new ResourceLocation("block.soul_soil.break")), + () -> new SoundEvent(new ResourceLocation("block.gravel.step")), + () -> new SoundEvent(new ResourceLocation("block.soul_soil.place")), + () -> new SoundEvent(new ResourceLocation("block.soul_soil.hit")), + () -> new SoundEvent(new ResourceLocation("block.gravel.fall")))) + .hardnessAndResistance(0.35f, 3.5f).setLightLevel(s -> 0).harvestLevel(1).harvestTool(ToolType.SHOVEL) + .slipperiness(0.7999999999999999f)); + setRegistryName("blueleaf_gravel_mud"); + } + + @Override + public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) { + return 15; + } + + @Override + public boolean canSustainPlant(BlockState state, IBlockReader world, BlockPos pos, Direction direction, IPlantable plantable) { + return true; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafGreenCapBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafGreenCapBlock.java new file mode 100644 index 0000000..d84df98 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafGreenCapBlock.java @@ -0,0 +1,161 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.PlantType; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.gen.feature.Features; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.DefaultFlowersFeature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.BlockClusterFeatureConfig; +import net.minecraft.world.gen.blockstateprovider.SimpleBlockStateProvider; +import net.minecraft.world.gen.blockplacer.SimpleBlockPlacer; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Direction; +import net.minecraft.potion.Effects; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItem; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.FlowerBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.Random; +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafGreenCapBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_green_cap") + public static final Block block = null; + + public BlueleafGreenCapBlock(HemModElements instance) { + super(instance, 47); + MinecraftForge.EVENT_BUS.register(this); + FMLJavaModLoadingContext.get().getModEventBus().register(new FeatureRegisterHandler()); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new BlockCustomFlower()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutout()); + } + + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + private static class FeatureRegisterHandler { + @SubscribeEvent + public void registerFeature(RegistryEvent.Register> event) { + feature = new DefaultFlowersFeature(BlockClusterFeatureConfig.field_236587_a_) { + @Override + public BlockState getFlowerToPlace(Random random, BlockPos bp, BlockClusterFeatureConfig fc) { + return block.getDefaultState(); + } + + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, BlockClusterFeatureConfig config) { + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + return super.generate(world, generator, random, pos, config); + } + }; + configuredFeature = feature + .withConfiguration( + (new BlockClusterFeatureConfig.Builder(new SimpleBlockStateProvider(block.getDefaultState()), new SimpleBlockPlacer())) + .tries(16).build()) + .withPlacement(Features.Placements.VEGETATION_PLACEMENT).withPlacement(Features.Placements.HEIGHTMAP_PLACEMENT).func_242731_b(5); + event.getRegistry().register(feature.setRegistryName("blueleaf_green_cap")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:blueleaf_green_cap"), configuredFeature); + } + } + + @SubscribeEvent + public void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:heightend_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.VEGETAL_DECORATION).add(() -> configuredFeature); + } + + public static class BlockCustomFlower extends FlowerBlock { + public BlockCustomFlower() { + super(Effects.RESISTANCE, 100, Block.Properties.create(Material.PLANTS).doesNotBlockMovement().sound(SoundType.PLANT) + .hardnessAndResistance(0f, 0f).setLightLevel(s -> 0)); + setRegistryName("blueleaf_green_cap"); + } + + @Override + public int getStewEffectDuration() { + return 100; + } + + @Override + public int getFlammability(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 100; + } + + @Override + public int getFireSpreadSpeed(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 60; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + + @Override + public PlantType getPlantType(IBlockReader world, BlockPos pos) { + return PlantType.PLAINS; + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafLavenderBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafLavenderBlock.java new file mode 100644 index 0000000..b243f84 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafLavenderBlock.java @@ -0,0 +1,203 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.procedures.BlueleafLavenderUpdateTickProcedure; +import studio.halbear.hem.procedures.BlueleafLavenderMobplayerCollidesWithPlantProcedure; +import studio.halbear.hem.procedures.BlueleafLavenderConditionProcedure; +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.PlantType; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.NoiseDependant; +import net.minecraft.world.gen.feature.RandomPatchFeature; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.BlockClusterFeatureConfig; +import net.minecraft.world.gen.blockstateprovider.SimpleBlockStateProvider; +import net.minecraft.world.gen.blockplacer.SimpleBlockPlacer; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.math.shapes.VoxelShapes; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Direction; +import net.minecraft.potion.Effects; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItem; +import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.FlowerBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.stream.Stream; +import java.util.Random; +import java.util.Map; +import java.util.List; +import java.util.HashMap; +import java.util.Collections; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class BlueleafLavenderBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_lavender") + public static final Block block = null; + + public BlueleafLavenderBlock(HemModElements instance) { + super(instance, 41); + MinecraftForge.EVENT_BUS.register(this); + FMLJavaModLoadingContext.get().getModEventBus().register(new FeatureRegisterHandler()); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new BlockCustomFlower()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutout()); + } + + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + private static class FeatureRegisterHandler { + @SubscribeEvent + public void registerFeature(RegistryEvent.Register> event) { + feature = new RandomPatchFeature(BlockClusterFeatureConfig.field_236587_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, BlockClusterFeatureConfig config) { + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + if (!BlueleafLavenderConditionProcedure + .executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll))) + return false; + return super.generate(world, generator, random, pos, config); + } + }; + configuredFeature = feature.withConfiguration( + (new BlockClusterFeatureConfig.Builder(new SimpleBlockStateProvider(block.getDefaultState()), new SimpleBlockPlacer())).tries(256) + .build()) + .withPlacement(Placement.COUNT_NOISE.configure(new NoiseDependant(-0.8, 0, 40))); + event.getRegistry().register(feature.setRegistryName("blueleaf_lavender")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:blueleaf_lavender"), configuredFeature); + } + } + + @SubscribeEvent + public void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:blueleaf_hayfever_fields").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.VEGETAL_DECORATION).add(() -> configuredFeature); + } + + public static class BlockCustomFlower extends FlowerBlock { + public BlockCustomFlower() { + super(Effects.REGENERATION, 100, Block.Properties.create(Material.PLANTS).tickRandomly().doesNotBlockMovement().sound(SoundType.PLANT) + .hardnessAndResistance(0f, 0f).setLightLevel(s -> 0)); + setRegistryName("blueleaf_lavender"); + } + + @Override + public int getStewEffectDuration() { + return 100; + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext context) { + Vector3d offset = state.getOffset(world, pos); + return VoxelShapes.or(makeCuboidShape(0, 0, 0, 16, 32, 16)) + + .withOffset(offset.x, offset.y, offset.z); + } + + @Override + public int getFlammability(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 100; + } + + @Override + public int getFireSpreadSpeed(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 60; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + + @Override + public PlantType getPlantType(IBlockReader world, BlockPos pos) { + return PlantType.PLAINS; + } + + @Override + public void tick(BlockState blockstate, ServerWorld world, BlockPos pos, Random random) { + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + + BlueleafLavenderUpdateTickProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + + @Override + public void onEntityCollision(BlockState blockstate, World world, BlockPos pos, Entity entity) { + super.onEntityCollision(blockstate, world, pos, entity); + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + + BlueleafLavenderMobplayerCollidesWithPlantProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafLeavesBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafLeavesBlock.java new file mode 100644 index 0000000..b47b111 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafLeavesBlock.java @@ -0,0 +1,115 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.common.ToolType; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.IWorld; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Direction; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.state.StateContainer; +import net.minecraft.state.BooleanProperty; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.BlockItem; +import net.minecraft.fluid.Fluids; +import net.minecraft.fluid.FluidState; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.IWaterLoggable; +import net.minecraft.block.Blocks; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafLeavesBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_leaves") + public static final Block block = null; + + public BlueleafLeavesBlock(HemModElements instance) { + super(instance, 120); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutoutMipped()); + } + + public static class CustomBlock extends Block implements IWaterLoggable { + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + + public CustomBlock() { + super(Block.Properties.create(Material.LEAVES).sound(SoundType.PLANT).hardnessAndResistance(0.3f, 1f).setLightLevel(s -> 0) + .harvestLevel(1).harvestTool(ToolType.HOE).slipperiness(0.7000000000000001f).speedFactor(0.7000000000000001f).jumpFactor(0.9f) + .notSolid().setOpaque((bs, br, bp) -> false)); + this.setDefaultState(this.stateContainer.getBaseState().with(WATERLOGGED, false)); + setRegistryName("blueleaf_leaves"); + } + + @Override + public boolean propagatesSkylightDown(BlockState state, IBlockReader reader, BlockPos pos) { + return state.getFluidState().isEmpty(); + } + + @Override + public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) { + return 0; + } + + @Override + protected void fillStateContainer(StateContainer.Builder builder) { + builder.add(WATERLOGGED); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + boolean flag = context.getWorld().getFluidState(context.getPos()).getFluid() == Fluids.WATER; + return this.getDefaultState().with(WATERLOGGED, flag); + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.get(WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) : super.getFluidState(state); + } + + @Override + public BlockState updatePostPlacement(BlockState state, Direction facing, BlockState facingState, IWorld world, BlockPos currentPos, + BlockPos facingPos) { + if (state.get(WATERLOGGED)) { + world.getPendingFluidTicks().scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + } + return super.updatePostPlacement(state, facing, facingState, world, currentPos, facingPos); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(Blocks.CAVE_AIR)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafLilyPadBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafLilyPadBlock.java new file mode 100644 index 0000000..b5dc546 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafLilyPadBlock.java @@ -0,0 +1,153 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.procedures.GiantLilyPadEntityCollidesInTheBlockProcedure; +import studio.halbear.hem.particle.LilyPadParticlesParticle; +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.common.ToolType; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.math.shapes.VoxelShapes; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.Mirror; +import net.minecraft.util.Direction; +import net.minecraft.state.StateContainer; +import net.minecraft.state.DirectionProperty; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.BlockItem; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.Minecraft; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.HorizontalBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.stream.Stream; +import java.util.Random; +import java.util.Map; +import java.util.List; +import java.util.HashMap; +import java.util.Collections; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class BlueleafLilyPadBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_lily_pad") + public static final Block block = null; + + public BlueleafLilyPadBlock(HemModElements instance) { + super(instance, 157); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutoutMipped()); + } + + public static class CustomBlock extends Block { + public static final DirectionProperty FACING = HorizontalBlock.HORIZONTAL_FACING; + + public CustomBlock() { + super(Block.Properties.create(Material.PLANTS).sound(SoundType.LILY_PADS).hardnessAndResistance(0.1f, 0f).setLightLevel(s -> 1) + .harvestLevel(1).harvestTool(ToolType.HOE).slipperiness(1f).jumpFactor(1.5f).notSolid().setOpaque((bs, br, bp) -> false)); + this.setDefaultState(this.stateContainer.getBaseState().with(FACING, Direction.NORTH)); + setRegistryName("blueleaf_lily_pad"); + } + + @Override + public boolean propagatesSkylightDown(BlockState state, IBlockReader reader, BlockPos pos) { + return true; + } + + @Override + public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) { + return 0; + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext context) { + return VoxelShapes.empty(); + } + + @Override + protected void fillStateContainer(StateContainer.Builder builder) { + builder.add(FACING); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + return this.getDefaultState().with(FACING, context.getPlacementHorizontalFacing().getOpposite()); + } + + public BlockState rotate(BlockState state, Rotation rot) { + return state.with(FACING, rot.rotate(state.get(FACING))); + } + + public BlockState mirror(BlockState state, Mirror mirrorIn) { + return state.rotate(mirrorIn.toRotation(state.get(FACING))); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + + @OnlyIn(Dist.CLIENT) + @Override + public void animateTick(BlockState blockstate, World world, BlockPos pos, Random random) { + super.animateTick(blockstate, world, pos, random); + PlayerEntity entity = Minecraft.getInstance().player; + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + if (true) + for (int l = 0; l < 1; ++l) { + double d0 = (double) ((float) x + 0.5) + (double) (random.nextFloat() - 0.5) * 0.4D; + double d1 = ((double) ((float) y + 0.7) + (double) (random.nextFloat() - 0.5) * 0.4D) + 0.5; + double d2 = (double) ((float) z + 0.5) + (double) (random.nextFloat() - 0.5) * 0.4D; + world.addParticle(LilyPadParticlesParticle.particle, d0, d1, d2, 0, 0, 0); + } + } + + @Override + public void onEntityCollision(BlockState blockstate, World world, BlockPos pos, Entity entity) { + super.onEntityCollision(blockstate, world, pos, entity); + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + + GiantLilyPadEntityCollidesInTheBlockProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafLogBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafLogBlock.java new file mode 100644 index 0000000..c39b34f --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafLogBlock.java @@ -0,0 +1,97 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.common.ToolType; +import net.minecraftforge.common.IPlantable; + +import net.minecraft.world.IBlockReader; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.Direction; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.state.StateContainer; +import net.minecraft.state.EnumProperty; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.BlockItem; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafLogBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_log") + public static final Block block = null; + + public BlueleafLogBlock(HemModElements instance) { + super(instance, 15); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + public static class CustomBlock extends Block { + public static final EnumProperty AXIS = BlockStateProperties.AXIS; + + public CustomBlock() { + super(Block.Properties.create(Material.WOOD).sound(SoundType.WOOD).hardnessAndResistance(0.5f, 10f).setLightLevel(s -> 0).harvestLevel(1) + .harvestTool(ToolType.AXE)); + this.setDefaultState(this.stateContainer.getBaseState().with(AXIS, Direction.Axis.Y)); + setRegistryName("blueleaf_log"); + } + + @Override + public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) { + return 15; + } + + @Override + protected void fillStateContainer(StateContainer.Builder builder) { + builder.add(AXIS); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + return this.getDefaultState().with(AXIS, context.getFace().getAxis()); + } + + @Override + public BlockState rotate(BlockState state, Rotation rot) { + if (rot == Rotation.CLOCKWISE_90 || rot == Rotation.COUNTERCLOCKWISE_90) { + if ((Direction.Axis) state.get(AXIS) == Direction.Axis.X) { + return state.with(AXIS, Direction.Axis.Z); + } else if ((Direction.Axis) state.get(AXIS) == Direction.Axis.Z) { + return state.with(AXIS, Direction.Axis.X); + } + } + return state; + } + + @Override + public boolean canSustainPlant(BlockState state, IBlockReader world, BlockPos pos, Direction direction, IPlantable plantable) { + return true; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafLushLeavesBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafLushLeavesBlock.java new file mode 100644 index 0000000..0ebd0e1 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafLushLeavesBlock.java @@ -0,0 +1,115 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.common.ToolType; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.IWorld; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Direction; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.state.StateContainer; +import net.minecraft.state.BooleanProperty; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.BlockItem; +import net.minecraft.fluid.Fluids; +import net.minecraft.fluid.FluidState; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.IWaterLoggable; +import net.minecraft.block.Blocks; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafLushLeavesBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_lush_leaves") + public static final Block block = null; + + public BlueleafLushLeavesBlock(HemModElements instance) { + super(instance, 20); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutoutMipped()); + } + + public static class CustomBlock extends Block implements IWaterLoggable { + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + + public CustomBlock() { + super(Block.Properties.create(Material.LEAVES).sound(SoundType.PLANT).hardnessAndResistance(0.3f, 1f).setLightLevel(s -> 0) + .harvestLevel(1).harvestTool(ToolType.HOE).slipperiness(0.7000000000000001f).speedFactor(0.7000000000000001f).jumpFactor(0.9f) + .notSolid().setOpaque((bs, br, bp) -> false)); + this.setDefaultState(this.stateContainer.getBaseState().with(WATERLOGGED, false)); + setRegistryName("blueleaf_lush_leaves"); + } + + @Override + public boolean propagatesSkylightDown(BlockState state, IBlockReader reader, BlockPos pos) { + return state.getFluidState().isEmpty(); + } + + @Override + public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) { + return 0; + } + + @Override + protected void fillStateContainer(StateContainer.Builder builder) { + builder.add(WATERLOGGED); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + boolean flag = context.getWorld().getFluidState(context.getPos()).getFluid() == Fluids.WATER; + return this.getDefaultState().with(WATERLOGGED, flag); + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.get(WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) : super.getFluidState(state); + } + + @Override + public BlockState updatePostPlacement(BlockState state, Direction facing, BlockState facingState, IWorld world, BlockPos currentPos, + BlockPos facingPos) { + if (state.get(WATERLOGGED)) { + world.getPendingFluidTicks().scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + } + return super.updatePostPlacement(state, facing, facingState, world, currentPos, facingPos); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(Blocks.CAVE_AIR)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafMatureBlossomerBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafMatureBlossomerBlock.java new file mode 100644 index 0000000..36b5d58 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafMatureBlossomerBlock.java @@ -0,0 +1,157 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.PlantType; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.gen.feature.Features; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.DefaultFlowersFeature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.BlockClusterFeatureConfig; +import net.minecraft.world.gen.blockstateprovider.SimpleBlockStateProvider; +import net.minecraft.world.gen.blockplacer.SimpleBlockPlacer; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Direction; +import net.minecraft.potion.Effects; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItem; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.FlowerBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.Random; +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafMatureBlossomerBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_mature_blossomer") + public static final Block block = null; + + public BlueleafMatureBlossomerBlock(HemModElements instance) { + super(instance, 29); + MinecraftForge.EVENT_BUS.register(this); + FMLJavaModLoadingContext.get().getModEventBus().register(new FeatureRegisterHandler()); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new BlockCustomFlower()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutout()); + } + + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + private static class FeatureRegisterHandler { + @SubscribeEvent + public void registerFeature(RegistryEvent.Register> event) { + feature = new DefaultFlowersFeature(BlockClusterFeatureConfig.field_236587_a_) { + @Override + public BlockState getFlowerToPlace(Random random, BlockPos bp, BlockClusterFeatureConfig fc) { + return block.getDefaultState(); + } + + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, BlockClusterFeatureConfig config) { + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + return super.generate(world, generator, random, pos, config); + } + }; + configuredFeature = feature + .withConfiguration( + (new BlockClusterFeatureConfig.Builder(new SimpleBlockStateProvider(block.getDefaultState()), new SimpleBlockPlacer())) + .tries(64).build()) + .withPlacement(Features.Placements.VEGETATION_PLACEMENT).withPlacement(Features.Placements.HEIGHTMAP_PLACEMENT).func_242731_b(3); + event.getRegistry().register(feature.setRegistryName("blueleaf_mature_blossomer")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:blueleaf_mature_blossomer"), configuredFeature); + } + } + + @SubscribeEvent + public void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.VEGETAL_DECORATION).add(() -> configuredFeature); + } + + public static class BlockCustomFlower extends FlowerBlock { + public BlockCustomFlower() { + super(Effects.JUMP_BOOST, 100, Block.Properties.create(Material.PLANTS).doesNotBlockMovement().sound(SoundType.PLANT) + .hardnessAndResistance(0f, 0f).setLightLevel(s -> 0)); + setRegistryName("blueleaf_mature_blossomer"); + } + + @Override + public int getStewEffectDuration() { + return 100; + } + + @Override + public int getFlammability(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 100; + } + + @Override + public int getFireSpreadSpeed(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 60; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + + @Override + public PlantType getPlantType(IBlockReader world, BlockPos pos) { + return PlantType.PLAINS; + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafMatureCabbageFlowerBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafMatureCabbageFlowerBlock.java new file mode 100644 index 0000000..579a499 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafMatureCabbageFlowerBlock.java @@ -0,0 +1,155 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.PlantType; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.gen.feature.Features; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.DefaultFlowersFeature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.BlockClusterFeatureConfig; +import net.minecraft.world.gen.blockstateprovider.SimpleBlockStateProvider; +import net.minecraft.world.gen.blockplacer.SimpleBlockPlacer; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Direction; +import net.minecraft.potion.Effects; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItem; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.FlowerBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.Random; +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafMatureCabbageFlowerBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_mature_cabbage_flower") + public static final Block block = null; + + public BlueleafMatureCabbageFlowerBlock(HemModElements instance) { + super(instance, 48); + MinecraftForge.EVENT_BUS.register(this); + FMLJavaModLoadingContext.get().getModEventBus().register(new FeatureRegisterHandler()); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new BlockCustomFlower()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutout()); + } + + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + private static class FeatureRegisterHandler { + @SubscribeEvent + public void registerFeature(RegistryEvent.Register> event) { + feature = new DefaultFlowersFeature(BlockClusterFeatureConfig.field_236587_a_) { + @Override + public BlockState getFlowerToPlace(Random random, BlockPos bp, BlockClusterFeatureConfig fc) { + return block.getDefaultState(); + } + + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, BlockClusterFeatureConfig config) { + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + return super.generate(world, generator, random, pos, config); + } + }; + configuredFeature = feature + .withConfiguration( + (new BlockClusterFeatureConfig.Builder(new SimpleBlockStateProvider(block.getDefaultState()), new SimpleBlockPlacer())) + .tries(64).build()) + .withPlacement(Features.Placements.VEGETATION_PLACEMENT).withPlacement(Features.Placements.HEIGHTMAP_PLACEMENT).func_242731_b(5); + event.getRegistry().register(feature.setRegistryName("blueleaf_mature_cabbage_flower")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:blueleaf_mature_cabbage_flower"), configuredFeature); + } + } + + @SubscribeEvent + public void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.VEGETAL_DECORATION).add(() -> configuredFeature); + } + + public static class BlockCustomFlower extends FlowerBlock { + public BlockCustomFlower() { + super(Effects.WATER_BREATHING, 100, Block.Properties.create(Material.PLANTS).doesNotBlockMovement().sound(SoundType.PLANT) + .hardnessAndResistance(0f, 0f).setLightLevel(s -> 0)); + setRegistryName("blueleaf_mature_cabbage_flower"); + } + + @Override + public int getStewEffectDuration() { + return 100; + } + + @Override + public int getFlammability(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 100; + } + + @Override + public int getFireSpreadSpeed(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 60; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + + @Override + public PlantType getPlantType(IBlockReader world, BlockPos pos) { + return PlantType.PLAINS; + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafMudBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafMudBlock.java new file mode 100644 index 0000000..4ce212b --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafMudBlock.java @@ -0,0 +1,147 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.ToolType; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.IPlantable; + +import net.minecraft.world.gen.feature.template.RuleTest; +import net.minecraft.world.gen.feature.template.IRuleTestType; +import net.minecraft.world.gen.feature.OreFeatureConfig; +import net.minecraft.world.gen.feature.OreFeature; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Direction; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItem; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.FallingBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.Random; +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafMudBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_mud") + public static final Block block = null; + + public BlueleafMudBlock(HemModElements instance) { + super(instance, 130); + MinecraftForge.EVENT_BUS.register(this); + FMLJavaModLoadingContext.get().getModEventBus().register(new FeatureRegisterHandler()); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + public static class CustomBlock extends FallingBlock { + public CustomBlock() { + super(Block.Properties.create(Material.EARTH).sound(SoundType.SOUL_SOIL).hardnessAndResistance(0.35f, 3.5f).setLightLevel(s -> 0) + .harvestLevel(1).harvestTool(ToolType.SHOVEL).slipperiness(0.7999999999999999f)); + setRegistryName("blueleaf_mud"); + } + + @Override + public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) { + return 15; + } + + @Override + public boolean canSustainPlant(BlockState state, IBlockReader world, BlockPos pos, Direction direction, IPlantable plantable) { + return true; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + } + + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + private static IRuleTestType CUSTOM_MATCH = null; + + private static class CustomRuleTest extends RuleTest { + static final CustomRuleTest INSTANCE = new CustomRuleTest(); + static final com.mojang.serialization.Codec codec = com.mojang.serialization.Codec.unit(() -> INSTANCE); + + public boolean test(BlockState blockAt, Random random) { + boolean blockCriteria = false; + if (blockAt.getBlock() == BlueleafGravelMudBlock.block) + blockCriteria = true; + if (blockAt.getBlock() == BlueleafStoneGravelBlock.block) + blockCriteria = true; + if (blockAt.getBlock() == BlueleafMudBlock.block) + blockCriteria = true; + return blockCriteria; + } + + protected IRuleTestType getType() { + return CUSTOM_MATCH; + } + } + + private static class FeatureRegisterHandler { + @SubscribeEvent + public void registerFeature(RegistryEvent.Register> event) { + CUSTOM_MATCH = Registry.register(Registry.RULE_TEST, new ResourceLocation("hem:blueleaf_mud_match"), () -> CustomRuleTest.codec); + feature = new OreFeature(OreFeatureConfig.CODEC) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random rand, BlockPos pos, OreFeatureConfig config) { + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + return super.generate(world, generator, rand, pos, config); + } + }; + configuredFeature = feature.withConfiguration(new OreFeatureConfig(CustomRuleTest.INSTANCE, block.getDefaultState(), 31)).range(256) + .square().func_242731_b(31); + event.getRegistry().register(feature.setRegistryName("blueleaf_mud")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:blueleaf_mud"), configuredFeature); + } + } + + @SubscribeEvent + public void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.UNDERGROUND_ORES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafRedCapBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafRedCapBlock.java new file mode 100644 index 0000000..8c6ba47 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafRedCapBlock.java @@ -0,0 +1,161 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.PlantType; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.gen.feature.Features; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.DefaultFlowersFeature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.BlockClusterFeatureConfig; +import net.minecraft.world.gen.blockstateprovider.SimpleBlockStateProvider; +import net.minecraft.world.gen.blockplacer.SimpleBlockPlacer; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Direction; +import net.minecraft.potion.Effects; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItem; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.FlowerBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.Random; +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafRedCapBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_red_cap") + public static final Block block = null; + + public BlueleafRedCapBlock(HemModElements instance) { + super(instance, 32); + MinecraftForge.EVENT_BUS.register(this); + FMLJavaModLoadingContext.get().getModEventBus().register(new FeatureRegisterHandler()); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new BlockCustomFlower()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutout()); + } + + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + private static class FeatureRegisterHandler { + @SubscribeEvent + public void registerFeature(RegistryEvent.Register> event) { + feature = new DefaultFlowersFeature(BlockClusterFeatureConfig.field_236587_a_) { + @Override + public BlockState getFlowerToPlace(Random random, BlockPos bp, BlockClusterFeatureConfig fc) { + return block.getDefaultState(); + } + + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, BlockClusterFeatureConfig config) { + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + return super.generate(world, generator, random, pos, config); + } + }; + configuredFeature = feature + .withConfiguration( + (new BlockClusterFeatureConfig.Builder(new SimpleBlockStateProvider(block.getDefaultState()), new SimpleBlockPlacer())) + .tries(16).build()) + .withPlacement(Features.Placements.VEGETATION_PLACEMENT).withPlacement(Features.Placements.HEIGHTMAP_PLACEMENT).func_242731_b(5); + event.getRegistry().register(feature.setRegistryName("blueleaf_red_cap")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:blueleaf_red_cap"), configuredFeature); + } + } + + @SubscribeEvent + public void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:heightend_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.VEGETAL_DECORATION).add(() -> configuredFeature); + } + + public static class BlockCustomFlower extends FlowerBlock { + public BlockCustomFlower() { + super(Effects.INSTANT_DAMAGE, 100, Block.Properties.create(Material.PLANTS).doesNotBlockMovement().sound(SoundType.PLANT) + .hardnessAndResistance(0f, 0f).setLightLevel(s -> 0)); + setRegistryName("blueleaf_red_cap"); + } + + @Override + public int getStewEffectDuration() { + return 100; + } + + @Override + public int getFlammability(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 100; + } + + @Override + public int getFireSpreadSpeed(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 60; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + + @Override + public PlantType getPlantType(IBlockReader world, BlockPos pos) { + return PlantType.PLAINS; + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafRedwoodLeavesBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafRedwoodLeavesBlock.java new file mode 100644 index 0000000..3118a06 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafRedwoodLeavesBlock.java @@ -0,0 +1,116 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.common.ToolType; +import net.minecraftforge.common.IPlantable; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.IWorld; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Direction; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.state.StateContainer; +import net.minecraft.state.BooleanProperty; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.BlockItem; +import net.minecraft.fluid.Fluids; +import net.minecraft.fluid.FluidState; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.IWaterLoggable; +import net.minecraft.block.Blocks; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafRedwoodLeavesBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_redwood_leaves") + public static final Block block = null; + + public BlueleafRedwoodLeavesBlock(HemModElements instance) { + super(instance, 21); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutoutMipped()); + } + + public static class CustomBlock extends Block implements IWaterLoggable { + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + + public CustomBlock() { + super(Block.Properties.create(Material.LEAVES).sound(SoundType.PLANT).hardnessAndResistance(0.3f, 1f).setLightLevel(s -> 0) + .harvestLevel(1).harvestTool(ToolType.HOE).slipperiness(0.7000000000000001f).speedFactor(0.7999999999999999f).notSolid() + .setOpaque((bs, br, bp) -> false)); + this.setDefaultState(this.stateContainer.getBaseState().with(WATERLOGGED, false)); + setRegistryName("blueleaf_redwood_leaves"); + } + + @Override + public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) { + return 1; + } + + @Override + protected void fillStateContainer(StateContainer.Builder builder) { + builder.add(WATERLOGGED); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + boolean flag = context.getWorld().getFluidState(context.getPos()).getFluid() == Fluids.WATER; + return this.getDefaultState().with(WATERLOGGED, flag); + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.get(WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) : super.getFluidState(state); + } + + @Override + public BlockState updatePostPlacement(BlockState state, Direction facing, BlockState facingState, IWorld world, BlockPos currentPos, + BlockPos facingPos) { + if (state.get(WATERLOGGED)) { + world.getPendingFluidTicks().scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + } + return super.updatePostPlacement(state, facing, facingState, world, currentPos, facingPos); + } + + @Override + public boolean canSustainPlant(BlockState state, IBlockReader world, BlockPos pos, Direction direction, IPlantable plantable) { + return true; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(Blocks.CAVE_AIR)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafRedwoodLogBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafRedwoodLogBlock.java new file mode 100644 index 0000000..341c6f6 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafRedwoodLogBlock.java @@ -0,0 +1,97 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.common.ToolType; +import net.minecraftforge.common.IPlantable; + +import net.minecraft.world.IBlockReader; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.Direction; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.state.StateContainer; +import net.minecraft.state.EnumProperty; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.BlockItem; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafRedwoodLogBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_redwood_log") + public static final Block block = null; + + public BlueleafRedwoodLogBlock(HemModElements instance) { + super(instance, 18); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + public static class CustomBlock extends Block { + public static final EnumProperty AXIS = BlockStateProperties.AXIS; + + public CustomBlock() { + super(Block.Properties.create(Material.WOOD).sound(SoundType.WOOD).hardnessAndResistance(0.5f, 10f).setLightLevel(s -> 0).harvestLevel(1) + .harvestTool(ToolType.AXE)); + this.setDefaultState(this.stateContainer.getBaseState().with(AXIS, Direction.Axis.Y)); + setRegistryName("blueleaf_redwood_log"); + } + + @Override + public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) { + return 15; + } + + @Override + protected void fillStateContainer(StateContainer.Builder builder) { + builder.add(AXIS); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + return this.getDefaultState().with(AXIS, context.getFace().getAxis()); + } + + @Override + public BlockState rotate(BlockState state, Rotation rot) { + if (rot == Rotation.CLOCKWISE_90 || rot == Rotation.COUNTERCLOCKWISE_90) { + if ((Direction.Axis) state.get(AXIS) == Direction.Axis.X) { + return state.with(AXIS, Direction.Axis.Z); + } else if ((Direction.Axis) state.get(AXIS) == Direction.Axis.Z) { + return state.with(AXIS, Direction.Axis.X); + } + } + return state; + } + + @Override + public boolean canSustainPlant(BlockState state, IBlockReader world, BlockPos pos, Direction direction, IPlantable plantable) { + return true; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafSeaGrassBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafSeaGrassBlock.java new file mode 100644 index 0000000..252cd50 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafSeaGrassBlock.java @@ -0,0 +1,148 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Direction; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.state.StateContainer; +import net.minecraft.state.BooleanProperty; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.BlockItem; +import net.minecraft.fluid.Fluids; +import net.minecraft.fluid.FluidState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.Minecraft; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.IWaterLoggable; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.Random; +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafSeaGrassBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_sea_grass") + public static final Block block = null; + + public BlueleafSeaGrassBlock(HemModElements instance) { + super(instance, 52); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutoutMipped()); + } + + public static class CustomBlock extends Block implements IWaterLoggable { + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + + public CustomBlock() { + super(Block.Properties.create(Material.LEAVES).sound(SoundType.PLANT).hardnessAndResistance(0.1f, 0f).setLightLevel(s -> 1) + .doesNotBlockMovement().notSolid().setOpaque((bs, br, bp) -> false)); + this.setDefaultState(this.stateContainer.getBaseState().with(WATERLOGGED, false)); + setRegistryName("blueleaf_sea_grass"); + } + + @Override + public boolean propagatesSkylightDown(BlockState state, IBlockReader reader, BlockPos pos) { + return state.getFluidState().isEmpty(); + } + + @Override + public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) { + return 0; + } + + @Override + protected void fillStateContainer(StateContainer.Builder builder) { + builder.add(WATERLOGGED); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + boolean flag = context.getWorld().getFluidState(context.getPos()).getFluid() == Fluids.WATER; + return this.getDefaultState().with(WATERLOGGED, flag); + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.get(WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) : super.getFluidState(state); + } + + @Override + public BlockState updatePostPlacement(BlockState state, Direction facing, BlockState facingState, IWorld world, BlockPos currentPos, + BlockPos facingPos) { + if (state.get(WATERLOGGED)) { + world.getPendingFluidTicks().scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + } + return super.updatePostPlacement(state, facing, facingState, world, currentPos, facingPos); + } + + @Override + public boolean isReplaceable(BlockState state, BlockItemUseContext context) { + return context.getItem().getItem() != this.asItem(); + } + + @Override + public Block.OffsetType getOffsetType() { + return Block.OffsetType.XZ; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + + @OnlyIn(Dist.CLIENT) + @Override + public void animateTick(BlockState blockstate, World world, BlockPos pos, Random random) { + super.animateTick(blockstate, world, pos, random); + PlayerEntity entity = Minecraft.getInstance().player; + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + if (true) + for (int l = 0; l < 1; ++l) { + double d0 = (x + random.nextFloat()); + double d1 = (y + random.nextFloat()); + double d2 = (z + random.nextFloat()); + int i1 = random.nextInt(2) * 2 - 1; + double d3 = (random.nextFloat() - 0.5D) * 0.5D; + double d4 = (random.nextFloat() - 0.5D) * 0.5D; + double d5 = (random.nextFloat() - 0.5D) * 0.5D; + world.addParticle(ParticleTypes.BUBBLE, d0, d1, d2, d3, d4, d5); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafStoneBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafStoneBlock.java new file mode 100644 index 0000000..f60cfcb --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafStoneBlock.java @@ -0,0 +1,60 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.common.ToolType; + +import net.minecraft.world.IBlockReader; +import net.minecraft.util.math.BlockPos; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItem; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafStoneBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_stone") + public static final Block block = null; + + public BlueleafStoneBlock(HemModElements instance) { + super(instance, 4); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + public static class CustomBlock extends Block { + public CustomBlock() { + super(Block.Properties.create(Material.ROCK).sound(SoundType.STONE).hardnessAndResistance(1f, 10f).setLightLevel(s -> 0).harvestLevel(1) + .harvestTool(ToolType.PICKAXE).setRequiresTool()); + setRegistryName("blueleaf_stone"); + } + + @Override + public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) { + return 15; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(BlueleafCobblestoneBlock.block)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafStoneGravelBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafStoneGravelBlock.java new file mode 100644 index 0000000..fe0257b --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafStoneGravelBlock.java @@ -0,0 +1,131 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.ToolType; +import net.minecraftforge.common.MinecraftForge; + +import net.minecraft.world.gen.feature.template.RuleTest; +import net.minecraft.world.gen.feature.template.IRuleTestType; +import net.minecraft.world.gen.feature.OreFeatureConfig; +import net.minecraft.world.gen.feature.OreFeature; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItem; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.FallingBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.Random; +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafStoneGravelBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_stone_gravel") + public static final Block block = null; + + public BlueleafStoneGravelBlock(HemModElements instance) { + super(instance, 14); + MinecraftForge.EVENT_BUS.register(this); + FMLJavaModLoadingContext.get().getModEventBus().register(new FeatureRegisterHandler()); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + public static class CustomBlock extends FallingBlock { + public CustomBlock() { + super(Block.Properties.create(Material.ROCK).sound(SoundType.GROUND).hardnessAndResistance(0.35f, 3.5f).setLightLevel(s -> 0) + .harvestLevel(1).harvestTool(ToolType.SHOVEL).slipperiness(0.7999999999999999f)); + setRegistryName("blueleaf_stone_gravel"); + } + + @Override + public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) { + return 15; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + } + + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + private static IRuleTestType CUSTOM_MATCH = null; + + private static class CustomRuleTest extends RuleTest { + static final CustomRuleTest INSTANCE = new CustomRuleTest(); + static final com.mojang.serialization.Codec codec = com.mojang.serialization.Codec.unit(() -> INSTANCE); + + public boolean test(BlockState blockAt, Random random) { + boolean blockCriteria = false; + if (blockAt.getBlock() == BlueleafStoneBlock.block) + blockCriteria = true; + return blockCriteria; + } + + protected IRuleTestType getType() { + return CUSTOM_MATCH; + } + } + + private static class FeatureRegisterHandler { + @SubscribeEvent + public void registerFeature(RegistryEvent.Register> event) { + CUSTOM_MATCH = Registry.register(Registry.RULE_TEST, new ResourceLocation("hem:blueleaf_stone_gravel_match"), () -> CustomRuleTest.codec); + feature = new OreFeature(OreFeatureConfig.CODEC) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random rand, BlockPos pos, OreFeatureConfig config) { + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + return super.generate(world, generator, rand, pos, config); + } + }; + configuredFeature = feature.withConfiguration(new OreFeatureConfig(CustomRuleTest.INSTANCE, block.getDefaultState(), 30)).range(256) + .square().func_242731_b(30); + event.getRegistry().register(feature.setRegistryName("blueleaf_stone_gravel")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:blueleaf_stone_gravel"), configuredFeature); + } + } + + @SubscribeEvent + public void addFeatureToBiomes(BiomeLoadingEvent event) { + event.getGeneration().getFeatures(GenerationStage.Decoration.UNDERGROUND_ORES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafStoneSlabBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafStoneSlabBlock.java new file mode 100644 index 0000000..8352f44 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafStoneSlabBlock.java @@ -0,0 +1,55 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.common.ToolType; + +import net.minecraft.state.properties.SlabType; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItem; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.SlabBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafStoneSlabBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_stone_slab") + public static final Block block = null; + + public BlueleafStoneSlabBlock(HemModElements instance) { + super(instance, 6); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + public static class CustomBlock extends SlabBlock { + public CustomBlock() { + super(Block.Properties.create(Material.ROCK).sound(SoundType.STONE).hardnessAndResistance(1f, 10f).setLightLevel(s -> 0).harvestLevel(1) + .harvestTool(ToolType.PICKAXE).setRequiresTool()); + setRegistryName("blueleaf_stone_slab"); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, state.get(TYPE) == SlabType.DOUBLE ? 2 : 1)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafStoneStairBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafStoneStairBlock.java new file mode 100644 index 0000000..76f729b --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafStoneStairBlock.java @@ -0,0 +1,56 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.common.ToolType; + +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItem; +import net.minecraft.block.material.Material; +import net.minecraft.block.StairsBlock; +import net.minecraft.block.SoundType; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafStoneStairBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_stone_stair") + public static final Block block = null; + + public BlueleafStoneStairBlock(HemModElements instance) { + super(instance, 5); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + public static class CustomBlock extends StairsBlock { + public CustomBlock() { + super(() -> new Block(Block.Properties.create(Material.ROCK).sound(SoundType.STONE).hardnessAndResistance(1f, 10f).setLightLevel(s -> 0) + .harvestLevel(1).harvestTool(ToolType.PICKAXE).setRequiresTool()).getDefaultState(), + Block.Properties.create(Material.ROCK).sound(SoundType.STONE).hardnessAndResistance(1f, 10f).setLightLevel(s -> 0).harvestLevel(1) + .harvestTool(ToolType.PICKAXE).setRequiresTool()); + setRegistryName("blueleaf_stone_stair"); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafStoneWallBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafStoneWallBlock.java new file mode 100644 index 0000000..5106ea2 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafStoneWallBlock.java @@ -0,0 +1,213 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.common.ToolType; + +import net.minecraft.world.IWorldReader; +import net.minecraft.world.IWorld; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.math.shapes.VoxelShapes; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.IBooleanFunction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Direction; +import net.minecraft.tags.BlockTags; +import net.minecraft.state.Property; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.BlockItem; +import net.minecraft.fluid.Fluids; +import net.minecraft.fluid.FluidState; +import net.minecraft.block.material.Material; +import net.minecraft.block.WallHeight; +import net.minecraft.block.WallBlock; +import net.minecraft.block.SoundType; +import net.minecraft.block.FenceGateBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafStoneWallBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_stone_wall") + public static final Block block = null; + + public BlueleafStoneWallBlock(HemModElements instance) { + super(instance, 7); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + public static class CustomBlock extends WallBlock { + public CustomBlock() { + super(Block.Properties.create(Material.ROCK).sound(SoundType.STONE).hardnessAndResistance(1f, 10f).setLightLevel(s -> 0).harvestLevel(1) + .harvestTool(ToolType.PICKAXE).setRequiresTool()); + setRegistryName("blueleaf_stone_wall"); + } + + private static final VoxelShape CENTER_POLE_SHAPE = Block.makeCuboidShape(7.0D, 0.0D, 7.0D, 9.0D, 16.0D, 9.0D); + private static final VoxelShape WALL_CONNECTION_NORTH_SIDE_SHAPE = Block.makeCuboidShape(7.0D, 0.0D, 0.0D, 9.0D, 16.0D, 9.0D); + private static final VoxelShape WALL_CONNECTION_SOUTH_SIDE_SHAPE = Block.makeCuboidShape(7.0D, 0.0D, 7.0D, 9.0D, 16.0D, 16.0D); + private static final VoxelShape WALL_CONNECTION_WEST_SIDE_SHAPE = Block.makeCuboidShape(0.0D, 0.0D, 7.0D, 9.0D, 16.0D, 9.0D); + private static final VoxelShape WALL_CONNECTION_EAST_SIDE_SHAPE = Block.makeCuboidShape(7.0D, 0.0D, 7.0D, 16.0D, 16.0D, 9.0D); + + private boolean shouldConnect(BlockState state, boolean checkattach, Direction face) { + boolean flag = state.getBlock() instanceof WallBlock + || state.getBlock() instanceof FenceGateBlock && FenceGateBlock.isParallel(state, face); + return !cannotAttach(state.getBlock()) && checkattach || flag; + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + IWorldReader iworldreader = context.getWorld(); + BlockPos blockpos = context.getPos(); + FluidState fluidstate = context.getWorld().getFluidState(context.getPos()); + BlockPos blockpos1 = blockpos.north(); + BlockPos blockpos2 = blockpos.east(); + BlockPos blockpos3 = blockpos.south(); + BlockPos blockpos4 = blockpos.west(); + BlockPos blockpos5 = blockpos.up(); + BlockState blockstate = iworldreader.getBlockState(blockpos1); + BlockState blockstate1 = iworldreader.getBlockState(blockpos2); + BlockState blockstate2 = iworldreader.getBlockState(blockpos3); + BlockState blockstate3 = iworldreader.getBlockState(blockpos4); + BlockState blockstate4 = iworldreader.getBlockState(blockpos5); + boolean flag = this.shouldConnect(blockstate, blockstate.isSolidSide(iworldreader, blockpos1, Direction.SOUTH), Direction.SOUTH); + boolean flag1 = this.shouldConnect(blockstate1, blockstate1.isSolidSide(iworldreader, blockpos2, Direction.WEST), Direction.WEST); + boolean flag2 = this.shouldConnect(blockstate2, blockstate2.isSolidSide(iworldreader, blockpos3, Direction.NORTH), Direction.NORTH); + boolean flag3 = this.shouldConnect(blockstate3, blockstate3.isSolidSide(iworldreader, blockpos4, Direction.EAST), Direction.EAST); + BlockState blockstate5 = this.getDefaultState().with(WATERLOGGED, Boolean.valueOf(fluidstate.getFluid() == Fluids.WATER)); + return this.func_235626_a_(iworldreader, blockstate5, blockpos5, blockstate4, flag, flag1, flag2, flag3); + } + + @Override /** + * Update the provided state given the provided neighbor facing and neighbor state, returning a new state. For example, fences make their connections to the passed in state if possible, and wet concrete powder immediately returns its solidified counterpart. Note that this method should ideally consider only the specific face passed in. + */ + public BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn, BlockPos currentPos, + BlockPos facingPos) { + if (stateIn.get(WATERLOGGED)) { + worldIn.getPendingFluidTicks().scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickRate(worldIn)); + } + if (facing == Direction.DOWN) { + return super.updatePostPlacement(stateIn, facing, facingState, worldIn, currentPos, facingPos); + } else { + return facing == Direction.UP + ? this.func_235625_a_(worldIn, stateIn, facingPos, facingState) + : this.func_235627_a_(worldIn, currentPos, stateIn, facingPos, facingState, facing); + } + } + + private BlockState func_235625_a_(IWorldReader reader, BlockState state1, BlockPos pos, BlockState state2) { + boolean flag = hasHeightForProperty(state1, WALL_HEIGHT_NORTH); + boolean flag1 = hasHeightForProperty(state1, WALL_HEIGHT_EAST); + boolean flag2 = hasHeightForProperty(state1, WALL_HEIGHT_SOUTH); + boolean flag3 = hasHeightForProperty(state1, WALL_HEIGHT_WEST); + return this.func_235626_a_(reader, state1, pos, state2, flag, flag1, flag2, flag3); + } + + private BlockState func_235627_a_(IWorldReader reader, BlockPos p_235627_2_, BlockState p_235627_3_, BlockPos p_235627_4_, + BlockState p_235627_5_, Direction directionIn) { + Direction direction = directionIn.getOpposite(); + boolean flag = directionIn == Direction.NORTH + ? this.shouldConnect(p_235627_5_, p_235627_5_.isSolidSide(reader, p_235627_4_, direction), direction) + : hasHeightForProperty(p_235627_3_, WALL_HEIGHT_NORTH); + boolean flag1 = directionIn == Direction.EAST + ? this.shouldConnect(p_235627_5_, p_235627_5_.isSolidSide(reader, p_235627_4_, direction), direction) + : hasHeightForProperty(p_235627_3_, WALL_HEIGHT_EAST); + boolean flag2 = directionIn == Direction.SOUTH + ? this.shouldConnect(p_235627_5_, p_235627_5_.isSolidSide(reader, p_235627_4_, direction), direction) + : hasHeightForProperty(p_235627_3_, WALL_HEIGHT_SOUTH); + boolean flag3 = directionIn == Direction.WEST + ? this.shouldConnect(p_235627_5_, p_235627_5_.isSolidSide(reader, p_235627_4_, direction), direction) + : hasHeightForProperty(p_235627_3_, WALL_HEIGHT_WEST); + BlockPos blockpos = p_235627_2_.up(); + BlockState blockstate = reader.getBlockState(blockpos); + return this.func_235626_a_(reader, p_235627_3_, blockpos, blockstate, flag, flag1, flag2, flag3); + } + + private BlockState func_235626_a_(IWorldReader reader, BlockState state, BlockPos pos, BlockState collisionState, boolean connectedSouth, + boolean connectedWest, boolean connectedNorth, boolean connectedEast) { + VoxelShape voxelshape = collisionState.getCollisionShape(reader, pos).project(Direction.DOWN); + BlockState blockstate = this.func_235630_a_(state, connectedSouth, connectedWest, connectedNorth, connectedEast, voxelshape); + return blockstate.with(UP, Boolean.valueOf(this.func_235628_a_(blockstate, collisionState, voxelshape))); + } + + private BlockState func_235630_a_(BlockState state, boolean connectedSouth, boolean connectedWest, boolean connectedNorth, + boolean connectedEast, VoxelShape shape) { + return state.with(WALL_HEIGHT_NORTH, this.func_235633_a_(connectedSouth, shape, WALL_CONNECTION_NORTH_SIDE_SHAPE)) + .with(WALL_HEIGHT_EAST, this.func_235633_a_(connectedWest, shape, WALL_CONNECTION_EAST_SIDE_SHAPE)) + .with(WALL_HEIGHT_SOUTH, this.func_235633_a_(connectedNorth, shape, WALL_CONNECTION_SOUTH_SIDE_SHAPE)) + .with(WALL_HEIGHT_WEST, this.func_235633_a_(connectedEast, shape, WALL_CONNECTION_WEST_SIDE_SHAPE)); + } + + private WallHeight func_235633_a_(boolean p_235633_1_, VoxelShape p_235633_2_, VoxelShape p_235633_3_) { + if (p_235633_1_) { + return compareShapes(p_235633_2_, p_235633_3_) ? WallHeight.TALL : WallHeight.LOW; + } else { + return WallHeight.NONE; + } + } + + private boolean func_235628_a_(BlockState p_235628_1_, BlockState p_235628_2_, VoxelShape shape) { + boolean flag = p_235628_2_.getBlock() instanceof WallBlock && p_235628_2_.get(UP); + if (flag) { + return true; + } else { + WallHeight wallheight = p_235628_1_.get(WALL_HEIGHT_NORTH); + WallHeight wallheight1 = p_235628_1_.get(WALL_HEIGHT_SOUTH); + WallHeight wallheight2 = p_235628_1_.get(WALL_HEIGHT_EAST); + WallHeight wallheight3 = p_235628_1_.get(WALL_HEIGHT_WEST); + boolean flag1 = wallheight1 == WallHeight.NONE; + boolean flag2 = wallheight3 == WallHeight.NONE; + boolean flag3 = wallheight2 == WallHeight.NONE; + boolean flag4 = wallheight == WallHeight.NONE; + boolean flag5 = flag4 && flag1 && flag2 && flag3 || flag4 != flag1 || flag2 != flag3; + if (flag5) { + return true; + } else { + boolean flag6 = wallheight == WallHeight.TALL && wallheight1 == WallHeight.TALL + || wallheight2 == WallHeight.TALL && wallheight3 == WallHeight.TALL; + if (flag6) { + return false; + } else { + return p_235628_2_.getBlock().isIn(BlockTags.WALL_POST_OVERRIDE) || compareShapes(shape, CENTER_POLE_SHAPE); + } + } + } + } + + private static boolean hasHeightForProperty(BlockState state, Property heightProperty) { + return state.get(heightProperty) != WallHeight.NONE; + } + + private static boolean compareShapes(VoxelShape shape1, VoxelShape shape2) { + return !VoxelShapes.compare(shape2, shape1, IBooleanFunction.ONLY_FIRST); + } + + @Override + public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) { + return 15; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafTallBloomingFlowerBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafTallBloomingFlowerBlock.java new file mode 100644 index 0000000..d5ac144 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafTallBloomingFlowerBlock.java @@ -0,0 +1,149 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.PlantType; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.gen.feature.RandomPatchFeature; +import net.minecraft.world.gen.feature.Features; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.BlockClusterFeatureConfig; +import net.minecraft.world.gen.blockstateprovider.SimpleBlockStateProvider; +import net.minecraft.world.gen.blockplacer.DoublePlantBlockPlacer; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Direction; +import net.minecraft.state.properties.DoubleBlockHalf; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.loot.LootContext; +import net.minecraft.item.TallBlockItem; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.DoublePlantBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.Random; +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafTallBloomingFlowerBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_tall_blooming_flower") + public static final Block block = null; + + public BlueleafTallBloomingFlowerBlock(HemModElements instance) { + super(instance, 28); + MinecraftForge.EVENT_BUS.register(this); + FMLJavaModLoadingContext.get().getModEventBus().register(new FeatureRegisterHandler()); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new BlockCustomFlower()); + elements.items + .add(() -> new TallBlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutout()); + } + + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + private static class FeatureRegisterHandler { + @SubscribeEvent + public void registerFeature(RegistryEvent.Register> event) { + feature = new RandomPatchFeature(BlockClusterFeatureConfig.field_236587_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, BlockClusterFeatureConfig config) { + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + return super.generate(world, generator, random, pos, config); + } + }; + configuredFeature = feature.withConfiguration( + (new BlockClusterFeatureConfig.Builder(new SimpleBlockStateProvider(block.getDefaultState()), new DoublePlantBlockPlacer())) + .tries(8).func_227317_b_().build()) + .withPlacement(Features.Placements.VEGETATION_PLACEMENT).withPlacement(Features.Placements.HEIGHTMAP_PLACEMENT).func_242731_b(12); + event.getRegistry().register(feature.setRegistryName("blueleaf_tall_blooming_flower")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:blueleaf_tall_blooming_flower"), configuredFeature); + } + } + + @SubscribeEvent + public void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.VEGETAL_DECORATION).add(() -> configuredFeature); + } + + public static class BlockCustomFlower extends DoublePlantBlock { + public BlockCustomFlower() { + super(Block.Properties.create(Material.PLANTS).doesNotBlockMovement().sound(SoundType.PLANT).hardnessAndResistance(0f, 0f) + .setLightLevel(s -> 0)); + setRegistryName("blueleaf_tall_blooming_flower"); + } + + @Override + public int getFlammability(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 100; + } + + @Override + public int getFireSpreadSpeed(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 60; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + if (state.get(BlockStateProperties.DOUBLE_BLOCK_HALF) != DoubleBlockHalf.LOWER) + return Collections.emptyList(); + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + + @Override + public PlantType getPlantType(IBlockReader world, BlockPos pos) { + return PlantType.PLAINS; + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafTallGrassBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafTallGrassBlock.java new file mode 100644 index 0000000..d99bb76 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafTallGrassBlock.java @@ -0,0 +1,160 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.PlantType; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.NoiseDependant; +import net.minecraft.world.gen.feature.RandomPatchFeature; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.BlockClusterFeatureConfig; +import net.minecraft.world.gen.blockstateprovider.SimpleBlockStateProvider; +import net.minecraft.world.gen.blockplacer.DoublePlantBlockPlacer; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Direction; +import net.minecraft.state.properties.DoubleBlockHalf; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.loot.LootContext; +import net.minecraft.item.TallBlockItem; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.DoublePlantBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.Random; +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafTallGrassBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_tall_grass") + public static final Block block = null; + + public BlueleafTallGrassBlock(HemModElements instance) { + super(instance, 26); + MinecraftForge.EVENT_BUS.register(this); + FMLJavaModLoadingContext.get().getModEventBus().register(new FeatureRegisterHandler()); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new BlockCustomFlower()); + elements.items + .add(() -> new TallBlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutout()); + } + + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + private static class FeatureRegisterHandler { + @SubscribeEvent + public void registerFeature(RegistryEvent.Register> event) { + feature = new RandomPatchFeature(BlockClusterFeatureConfig.field_236587_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, BlockClusterFeatureConfig config) { + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + return super.generate(world, generator, random, pos, config); + } + }; + configuredFeature = feature.withConfiguration( + (new BlockClusterFeatureConfig.Builder(new SimpleBlockStateProvider(block.getDefaultState()), new DoublePlantBlockPlacer())) + .tries(12).build()) + .withPlacement(Placement.COUNT_NOISE.configure(new NoiseDependant(-0.8, 0, 15))); + event.getRegistry().register(feature.setRegistryName("blueleaf_tall_grass")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:blueleaf_tall_grass"), configuredFeature); + } + } + + @SubscribeEvent + public void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:heightend_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.VEGETAL_DECORATION).add(() -> configuredFeature); + } + + public static class BlockCustomFlower extends DoublePlantBlock { + public BlockCustomFlower() { + super(Block.Properties.create(Material.PLANTS).doesNotBlockMovement().sound(SoundType.PLANT).hardnessAndResistance(0f, 0f) + .setLightLevel(s -> 0)); + setRegistryName("blueleaf_tall_grass"); + } + + @Override + public boolean isReplaceable(BlockState state, BlockItemUseContext useContext) { + return useContext.getItem().getItem() != this.asItem(); + } + + @Override + public int getFlammability(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 100; + } + + @Override + public int getFireSpreadSpeed(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 60; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + if (state.get(BlockStateProperties.DOUBLE_BLOCK_HALF) != DoubleBlockHalf.LOWER) + return Collections.emptyList(); + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + + @Override + public PlantType getPlantType(IBlockReader world, BlockPos pos) { + return PlantType.PLAINS; + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafTallSproutBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafTallSproutBlock.java new file mode 100644 index 0000000..45dbf4b --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafTallSproutBlock.java @@ -0,0 +1,150 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.PlantType; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.NoiseDependant; +import net.minecraft.world.gen.feature.RandomPatchFeature; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.BlockClusterFeatureConfig; +import net.minecraft.world.gen.blockstateprovider.SimpleBlockStateProvider; +import net.minecraft.world.gen.blockplacer.DoublePlantBlockPlacer; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Direction; +import net.minecraft.state.properties.DoubleBlockHalf; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.loot.LootContext; +import net.minecraft.item.TallBlockItem; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.DoublePlantBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.Random; +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafTallSproutBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_tall_sprout") + public static final Block block = null; + + public BlueleafTallSproutBlock(HemModElements instance) { + super(instance, 27); + MinecraftForge.EVENT_BUS.register(this); + FMLJavaModLoadingContext.get().getModEventBus().register(new FeatureRegisterHandler()); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new BlockCustomFlower()); + elements.items + .add(() -> new TallBlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutout()); + } + + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + private static class FeatureRegisterHandler { + @SubscribeEvent + public void registerFeature(RegistryEvent.Register> event) { + feature = new RandomPatchFeature(BlockClusterFeatureConfig.field_236587_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, BlockClusterFeatureConfig config) { + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + return super.generate(world, generator, random, pos, config); + } + }; + configuredFeature = feature.withConfiguration( + (new BlockClusterFeatureConfig.Builder(new SimpleBlockStateProvider(block.getDefaultState()), new DoublePlantBlockPlacer())) + .tries(12).build()) + .withPlacement(Placement.COUNT_NOISE.configure(new NoiseDependant(-0.8, 0, 15))); + event.getRegistry().register(feature.setRegistryName("blueleaf_tall_sprout")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:blueleaf_tall_sprout"), configuredFeature); + } + } + + @SubscribeEvent + public void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.VEGETAL_DECORATION).add(() -> configuredFeature); + } + + public static class BlockCustomFlower extends DoublePlantBlock { + public BlockCustomFlower() { + super(Block.Properties.create(Material.PLANTS).doesNotBlockMovement().sound(SoundType.PLANT).hardnessAndResistance(0f, 0f) + .setLightLevel(s -> 0)); + setRegistryName("blueleaf_tall_sprout"); + } + + @Override + public int getFlammability(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 100; + } + + @Override + public int getFireSpreadSpeed(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 60; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + if (state.get(BlockStateProperties.DOUBLE_BLOCK_HALF) != DoubleBlockHalf.LOWER) + return Collections.emptyList(); + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + + @Override + public PlantType getPlantType(IBlockReader world, BlockPos pos) { + return PlantType.PLAINS; + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafWheatBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafWheatBlock.java new file mode 100644 index 0000000..ac5ae8e --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafWheatBlock.java @@ -0,0 +1,174 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.procedures.BlueleafWheatAdditionalGenerationConditionProcedure; +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.PlantType; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.NoiseDependant; +import net.minecraft.world.gen.feature.RandomPatchFeature; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.BlockClusterFeatureConfig; +import net.minecraft.world.gen.blockstateprovider.SimpleBlockStateProvider; +import net.minecraft.world.gen.blockplacer.SimpleBlockPlacer; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.math.shapes.VoxelShapes; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Direction; +import net.minecraft.potion.Effects; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItem; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.FlowerBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.stream.Stream; +import java.util.Random; +import java.util.Map; +import java.util.List; +import java.util.HashMap; +import java.util.Collections; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class BlueleafWheatBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_wheat") + public static final Block block = null; + + public BlueleafWheatBlock(HemModElements instance) { + super(instance, 42); + MinecraftForge.EVENT_BUS.register(this); + FMLJavaModLoadingContext.get().getModEventBus().register(new FeatureRegisterHandler()); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new BlockCustomFlower()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutout()); + } + + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + private static class FeatureRegisterHandler { + @SubscribeEvent + public void registerFeature(RegistryEvent.Register> event) { + feature = new RandomPatchFeature(BlockClusterFeatureConfig.field_236587_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, BlockClusterFeatureConfig config) { + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + if (!BlueleafWheatAdditionalGenerationConditionProcedure + .executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll))) + return false; + return super.generate(world, generator, random, pos, config); + } + }; + configuredFeature = feature.withConfiguration( + (new BlockClusterFeatureConfig.Builder(new SimpleBlockStateProvider(block.getDefaultState()), new SimpleBlockPlacer())).tries(256) + .build()) + .withPlacement(Placement.COUNT_NOISE.configure(new NoiseDependant(-0.8, 0, 40))); + event.getRegistry().register(feature.setRegistryName("blueleaf_wheat")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:blueleaf_wheat"), configuredFeature); + } + } + + @SubscribeEvent + public void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:blueleaf_hayfever_fields").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.VEGETAL_DECORATION).add(() -> configuredFeature); + } + + public static class BlockCustomFlower extends FlowerBlock { + public BlockCustomFlower() { + super(Effects.REGENERATION, 100, Block.Properties.create(Material.PLANTS).doesNotBlockMovement().sound(SoundType.PLANT) + .hardnessAndResistance(0f, 0f).setLightLevel(s -> 0)); + setRegistryName("blueleaf_wheat"); + } + + @Override + public int getStewEffectDuration() { + return 100; + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext context) { + Vector3d offset = state.getOffset(world, pos); + return VoxelShapes.or(makeCuboidShape(0, 0, 0, 16, 32, 16)) + + .withOffset(offset.x, offset.y, offset.z); + } + + @Override + public int getFlammability(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 100; + } + + @Override + public int getFireSpreadSpeed(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 60; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + + @Override + public PlantType getPlantType(IBlockReader world, BlockPos pos) { + return PlantType.PLAINS; + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BlueleafWoodBlock.java b/src/main/java/studio/halbear/hem/block/BlueleafWoodBlock.java new file mode 100644 index 0000000..5421d11 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BlueleafWoodBlock.java @@ -0,0 +1,97 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.common.ToolType; +import net.minecraftforge.common.IPlantable; + +import net.minecraft.world.IBlockReader; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.Direction; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.state.StateContainer; +import net.minecraft.state.EnumProperty; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.BlockItem; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.List; +import java.util.Collections; + +@HemModElements.ModElement.Tag +public class BlueleafWoodBlock extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_wood") + public static final Block block = null; + + public BlueleafWoodBlock(HemModElements instance) { + super(instance, 16); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + public static class CustomBlock extends Block { + public static final EnumProperty AXIS = BlockStateProperties.AXIS; + + public CustomBlock() { + super(Block.Properties.create(Material.WOOD).sound(SoundType.WOOD).hardnessAndResistance(0.5f, 10f).setLightLevel(s -> 0).harvestLevel(1) + .harvestTool(ToolType.AXE)); + this.setDefaultState(this.stateContainer.getBaseState().with(AXIS, Direction.Axis.Y)); + setRegistryName("blueleaf_wood"); + } + + @Override + public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) { + return 15; + } + + @Override + protected void fillStateContainer(StateContainer.Builder builder) { + builder.add(AXIS); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + return this.getDefaultState().with(AXIS, context.getFace().getAxis()); + } + + @Override + public BlockState rotate(BlockState state, Rotation rot) { + if (rot == Rotation.CLOCKWISE_90 || rot == Rotation.COUNTERCLOCKWISE_90) { + if ((Direction.Axis) state.get(AXIS) == Direction.Axis.X) { + return state.with(AXIS, Direction.Axis.Z); + } else if ((Direction.Axis) state.get(AXIS) == Direction.Axis.Z) { + return state.with(AXIS, Direction.Axis.X); + } + } + return state; + } + + @Override + public boolean canSustainPlant(BlockState state, IBlockReader world, BlockPos pos, Direction direction, IPlantable plantable) { + return true; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(BlueleafLogBlock.block)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/BulbFlowerBlock.java b/src/main/java/studio/halbear/hem/block/BulbFlowerBlock.java new file mode 100644 index 0000000..bfe8910 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/BulbFlowerBlock.java @@ -0,0 +1,212 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.procedures.BulbFlowerUpdateTickProcedure; +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.PlantType; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.gen.feature.Features; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.DefaultFlowersFeature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.BlockClusterFeatureConfig; +import net.minecraft.world.gen.blockstateprovider.SimpleBlockStateProvider; +import net.minecraft.world.gen.blockplacer.SimpleBlockPlacer; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.math.shapes.VoxelShapes; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Hand; +import net.minecraft.util.Direction; +import net.minecraft.util.ActionResultType; +import net.minecraft.potion.Effects; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItem; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.FlowerBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.stream.Stream; +import java.util.Random; +import java.util.Map; +import java.util.List; +import java.util.HashMap; +import java.util.Collections; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class BulbFlowerBlock extends HemModElements.ModElement { + @ObjectHolder("hem:bulb_flower") + public static final Block block = null; + + public BulbFlowerBlock(HemModElements instance) { + super(instance, 40); + MinecraftForge.EVENT_BUS.register(this); + FMLJavaModLoadingContext.get().getModEventBus().register(new FeatureRegisterHandler()); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new BlockCustomFlower()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutout()); + } + + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + private static class FeatureRegisterHandler { + @SubscribeEvent + public void registerFeature(RegistryEvent.Register> event) { + feature = new DefaultFlowersFeature(BlockClusterFeatureConfig.field_236587_a_) { + @Override + public BlockState getFlowerToPlace(Random random, BlockPos bp, BlockClusterFeatureConfig fc) { + return block.getDefaultState(); + } + + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, BlockClusterFeatureConfig config) { + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + return super.generate(world, generator, random, pos, config); + } + }; + configuredFeature = feature + .withConfiguration( + (new BlockClusterFeatureConfig.Builder(new SimpleBlockStateProvider(block.getDefaultState()), new SimpleBlockPlacer())) + .tries(7).build()) + .withPlacement(Features.Placements.VEGETATION_PLACEMENT).withPlacement(Features.Placements.HEIGHTMAP_PLACEMENT).func_242731_b(15); + event.getRegistry().register(feature.setRegistryName("bulb_flower")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:bulb_flower"), configuredFeature); + } + } + + @SubscribeEvent + public void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:heightend_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.VEGETAL_DECORATION).add(() -> configuredFeature); + } + + public static class BlockCustomFlower extends FlowerBlock { + public BlockCustomFlower() { + super(Effects.HASTE, 100, Block.Properties.create(Material.PLANTS).tickRandomly().doesNotBlockMovement().sound(SoundType.PLANT) + .hardnessAndResistance(0f, 0f).speedFactor(0.5f).setLightLevel(s -> 1)); + setRegistryName("bulb_flower"); + } + + @Override + public int getStewEffectDuration() { + return 100; + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext context) { + Vector3d offset = state.getOffset(world, pos); + return VoxelShapes.or(makeCuboidShape(0, 0, 0, 16, 32, 16)) + + .withOffset(offset.x, offset.y, offset.z); + } + + @Override + public int getFlammability(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 100; + } + + @Override + public int getFireSpreadSpeed(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 60; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + + @Override + public PlantType getPlantType(IBlockReader world, BlockPos pos) { + return PlantType.PLAINS; + } + + @Override + public void tick(BlockState blockstate, ServerWorld world, BlockPos pos, Random random) { + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + + BulbFlowerUpdateTickProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + + @Override + public ActionResultType onBlockActivated(BlockState blockstate, World world, BlockPos pos, PlayerEntity entity, Hand hand, + BlockRayTraceResult hit) { + super.onBlockActivated(blockstate, world, pos, entity, hand, hit); + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + double hitX = hit.getHitVec().x; + double hitY = hit.getHitVec().y; + double hitZ = hit.getHitVec().z; + Direction direction = hit.getFace(); + + BulbFlowerUpdateTickProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + return ActionResultType.SUCCESS; + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/DanglingFluorescentLeavesBlock.java b/src/main/java/studio/halbear/hem/block/DanglingFluorescentLeavesBlock.java new file mode 100644 index 0000000..3c39876 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/DanglingFluorescentLeavesBlock.java @@ -0,0 +1,198 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.procedures.DanglingFluorescentLeavesNeighbourBlockChangesProcedure; +import studio.halbear.hem.procedures.DanglingFluorescentLeavesBlockValidPlacementConditionProcedure; +import studio.halbear.hem.particle.FluorescentLeavesParticlesParticle; +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.world.IWorldReader; +import net.minecraft.world.IWorld; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.math.shapes.VoxelShapes; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Direction; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.state.StateContainer; +import net.minecraft.state.BooleanProperty; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.BlockItem; +import net.minecraft.fluid.Fluids; +import net.minecraft.fluid.FluidState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.Minecraft; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.IWaterLoggable; +import net.minecraft.block.Blocks; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.stream.Stream; +import java.util.Random; +import java.util.Map; +import java.util.List; +import java.util.HashMap; +import java.util.Collections; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class DanglingFluorescentLeavesBlock extends HemModElements.ModElement { + @ObjectHolder("hem:dangling_fluorescent_leaves") + public static final Block block = null; + + public DanglingFluorescentLeavesBlock(HemModElements instance) { + super(instance, 23); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutout()); + } + + public static class CustomBlock extends Block implements IWaterLoggable { + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + + public CustomBlock() { + super(Block.Properties.create(Material.ROCK).sound(SoundType.GROUND).hardnessAndResistance(1f, 10f).setLightLevel(s -> 10) + .doesNotBlockMovement().notSolid().tickRandomly().setNeedsPostProcessing((bs, br, bp) -> true) + .setEmmisiveRendering((bs, br, bp) -> true).setOpaque((bs, br, bp) -> false)); + this.setDefaultState(this.stateContainer.getBaseState().with(WATERLOGGED, false)); + setRegistryName("dangling_fluorescent_leaves"); + } + + @Override + public boolean propagatesSkylightDown(BlockState state, IBlockReader reader, BlockPos pos) { + return state.getFluidState().isEmpty(); + } + + @Override + public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) { + return 0; + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext context) { + Vector3d offset = state.getOffset(world, pos); + return VoxelShapes.or(makeCuboidShape(2, 0, 2, 14, 16, 14)) + + .withOffset(offset.x, offset.y, offset.z); + } + + @Override + protected void fillStateContainer(StateContainer.Builder builder) { + builder.add(WATERLOGGED); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + boolean flag = context.getWorld().getFluidState(context.getPos()).getFluid() == Fluids.WATER; + return this.getDefaultState().with(WATERLOGGED, flag); + } + + @Override + public boolean isValidPosition(BlockState blockstate, IWorldReader worldIn, BlockPos pos) { + if (worldIn instanceof IWorld) { + IWorld world = (IWorld) worldIn; + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + return DanglingFluorescentLeavesBlockValidPlacementConditionProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), + new AbstractMap.SimpleEntry<>("y", y), new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + return super.isValidPosition(blockstate, worldIn, pos); + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.get(WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) : super.getFluidState(state); + } + + @Override + public BlockState updatePostPlacement(BlockState state, Direction facing, BlockState facingState, IWorld world, BlockPos currentPos, + BlockPos facingPos) { + if (state.get(WATERLOGGED)) { + world.getPendingFluidTicks().scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + } + return !state.isValidPosition(world, currentPos) + ? Blocks.AIR.getDefaultState() + : super.updatePostPlacement(state, facing, facingState, world, currentPos, facingPos); + } + + @Override + public boolean isLadder(BlockState state, IWorldReader world, BlockPos pos, LivingEntity entity) { + return true; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + + @Override + public void neighborChanged(BlockState blockstate, World world, BlockPos pos, Block neighborBlock, BlockPos fromPos, boolean moving) { + super.neighborChanged(blockstate, world, pos, neighborBlock, fromPos, moving); + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + if (world.getRedstonePowerFromNeighbors(new BlockPos(x, y, z)) > 0) { + } else { + } + + DanglingFluorescentLeavesNeighbourBlockChangesProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + + @OnlyIn(Dist.CLIENT) + @Override + public void animateTick(BlockState blockstate, World world, BlockPos pos, Random random) { + super.animateTick(blockstate, world, pos, random); + PlayerEntity entity = Minecraft.getInstance().player; + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + if (true) + for (int l = 0; l < 1; ++l) { + double d0 = (x + random.nextFloat()); + double d1 = (y + random.nextFloat()); + double d2 = (z + random.nextFloat()); + int i1 = random.nextInt(2) * 2 - 1; + double d3 = (random.nextFloat() - 0.5D) * 0.5D; + double d4 = (random.nextFloat() - 0.5D) * 0.5D; + double d5 = (random.nextFloat() - 0.5D) * 0.5D; + world.addParticle(FluorescentLeavesParticlesParticle.particle, d0, d1, d2, d3, d4, d5); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/FallenLeavesBlock.java b/src/main/java/studio/halbear/hem/block/FallenLeavesBlock.java new file mode 100644 index 0000000..54e9405 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/FallenLeavesBlock.java @@ -0,0 +1,154 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.procedures.FallenLeavesEntityCollidesInTheBlockProcedure; +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.math.shapes.VoxelShapes; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Direction; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.state.StateContainer; +import net.minecraft.state.BooleanProperty; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.BlockItem; +import net.minecraft.fluid.Fluids; +import net.minecraft.fluid.FluidState; +import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.IWaterLoggable; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.List; +import java.util.HashMap; +import java.util.Collections; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class FallenLeavesBlock extends HemModElements.ModElement { + @ObjectHolder("hem:fallen_leaves") + public static final Block block = null; + + public FallenLeavesBlock(HemModElements instance) { + super(instance, 24); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutoutMipped()); + } + + public static class CustomBlock extends Block implements IWaterLoggable { + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + + public CustomBlock() { + super(Block.Properties.create(Material.LEAVES).sound(SoundType.PLANT).hardnessAndResistance(1f, 10f).setLightLevel(s -> 0) + .doesNotBlockMovement().slipperiness(0.7999999999999999f).notSolid().tickRandomly().setOpaque((bs, br, bp) -> false)); + this.setDefaultState(this.stateContainer.getBaseState().with(WATERLOGGED, false)); + setRegistryName("fallen_leaves"); + } + + @OnlyIn(Dist.CLIENT) + public boolean isSideInvisible(BlockState state, BlockState adjacentBlockState, Direction side) { + return adjacentBlockState.getBlock() == this ? true : super.isSideInvisible(state, adjacentBlockState, side); + } + + @Override + public boolean propagatesSkylightDown(BlockState state, IBlockReader reader, BlockPos pos) { + return state.getFluidState().isEmpty(); + } + + @Override + public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) { + return 0; + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext context) { + Vector3d offset = state.getOffset(world, pos); + return VoxelShapes.or(makeCuboidShape(0, 0, 0, 16, 1, 16)) + + .withOffset(offset.x, offset.y, offset.z); + } + + @Override + protected void fillStateContainer(StateContainer.Builder builder) { + builder.add(WATERLOGGED); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + boolean flag = context.getWorld().getFluidState(context.getPos()).getFluid() == Fluids.WATER; + return this.getDefaultState().with(WATERLOGGED, flag); + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.get(WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) : super.getFluidState(state); + } + + @Override + public BlockState updatePostPlacement(BlockState state, Direction facing, BlockState facingState, IWorld world, BlockPos currentPos, + BlockPos facingPos) { + if (state.get(WATERLOGGED)) { + world.getPendingFluidTicks().scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + } + return super.updatePostPlacement(state, facing, facingState, world, currentPos, facingPos); + } + + @Override + public boolean isReplaceable(BlockState state, BlockItemUseContext context) { + return context.getItem().getItem() != this.asItem(); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + + @Override + public void onEntityCollision(BlockState blockstate, World world, BlockPos pos, Entity entity) { + super.onEntityCollision(blockstate, world, pos, entity); + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + + FallenLeavesEntityCollidesInTheBlockProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/GiantLilyPadBlock.java b/src/main/java/studio/halbear/hem/block/GiantLilyPadBlock.java new file mode 100644 index 0000000..97205b7 --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/GiantLilyPadBlock.java @@ -0,0 +1,173 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.procedures.GiantLilyPadEntityCollidesInTheBlockProcedure; +import studio.halbear.hem.particle.LilyPadParticlesParticle; +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.common.ToolType; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.math.shapes.VoxelShapes; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.Mirror; +import net.minecraft.util.Direction; +import net.minecraft.state.StateContainer; +import net.minecraft.state.DirectionProperty; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.BlockItem; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.Minecraft; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.HorizontalBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.stream.Stream; +import java.util.Random; +import java.util.Map; +import java.util.List; +import java.util.HashMap; +import java.util.Collections; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class GiantLilyPadBlock extends HemModElements.ModElement { + @ObjectHolder("hem:giant_lily_pad") + public static final Block block = null; + + public GiantLilyPadBlock(HemModElements instance) { + super(instance, 38); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutoutMipped()); + } + + public static class CustomBlock extends Block { + public static final DirectionProperty FACING = HorizontalBlock.HORIZONTAL_FACING; + + public CustomBlock() { + super(Block.Properties.create(Material.PLANTS).sound(SoundType.LILY_PADS).hardnessAndResistance(0.1f, 0f).setLightLevel(s -> 1) + .harvestLevel(1).harvestTool(ToolType.HOE).slipperiness(1f).jumpFactor(1.5f).notSolid().setOpaque((bs, br, bp) -> false)); + this.setDefaultState(this.stateContainer.getBaseState().with(FACING, Direction.NORTH)); + setRegistryName("giant_lily_pad"); + } + + @Override + public boolean propagatesSkylightDown(BlockState state, IBlockReader reader, BlockPos pos) { + return true; + } + + @Override + public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) { + return 0; + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext context) { + Vector3d offset = state.getOffset(world, pos); + switch ((Direction) state.get(FACING)) { + case SOUTH : + default : + return VoxelShapes.or(makeCuboidShape(22, 0, 22, -6, 1, -6)) + + .withOffset(offset.x, offset.y, offset.z); + case NORTH : + return VoxelShapes.or(makeCuboidShape(-6, 0, -6, 22, 1, 22)) + + .withOffset(offset.x, offset.y, offset.z); + case EAST : + return VoxelShapes.or(makeCuboidShape(22, 0, -6, -6, 1, 22)) + + .withOffset(offset.x, offset.y, offset.z); + case WEST : + return VoxelShapes.or(makeCuboidShape(-6, 0, 22, 22, 1, -6)) + + .withOffset(offset.x, offset.y, offset.z); + } + } + + @Override + protected void fillStateContainer(StateContainer.Builder builder) { + builder.add(FACING); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + return this.getDefaultState().with(FACING, context.getPlacementHorizontalFacing().getOpposite()); + } + + public BlockState rotate(BlockState state, Rotation rot) { + return state.with(FACING, rot.rotate(state.get(FACING))); + } + + public BlockState mirror(BlockState state, Mirror mirrorIn) { + return state.rotate(mirrorIn.toRotation(state.get(FACING))); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + + @OnlyIn(Dist.CLIENT) + @Override + public void animateTick(BlockState blockstate, World world, BlockPos pos, Random random) { + super.animateTick(blockstate, world, pos, random); + PlayerEntity entity = Minecraft.getInstance().player; + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + if (true) + for (int l = 0; l < 1; ++l) { + double d0 = (double) ((float) x + 0.5) + (double) (random.nextFloat() - 0.5) * 0.4D; + double d1 = ((double) ((float) y + 0.7) + (double) (random.nextFloat() - 0.5) * 0.4D) + 0.5; + double d2 = (double) ((float) z + 0.5) + (double) (random.nextFloat() - 0.5) * 0.4D; + world.addParticle(LilyPadParticlesParticle.particle, d0, d1, d2, 0, 0, 0); + } + } + + @Override + public void onEntityCollision(BlockState blockstate, World world, BlockPos pos, Entity entity) { + super.onEntityCollision(blockstate, world, pos, entity); + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + + GiantLilyPadEntityCollidesInTheBlockProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/MuncherBlock.java b/src/main/java/studio/halbear/hem/block/MuncherBlock.java new file mode 100644 index 0000000..0623bef --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/MuncherBlock.java @@ -0,0 +1,410 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.procedures.MuncherUpdateTickProcedure; +import studio.halbear.hem.procedures.MuncherPlantAddedProcedure; +import studio.halbear.hem.procedures.MuncherBlockDestroyedByPlayerProcedure; +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.items.wrapper.SidedInvWrapper; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.ToolType; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.World; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.math.shapes.VoxelShapes; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.NonNullList; +import net.minecraft.util.Mirror; +import net.minecraft.util.Hand; +import net.minecraft.util.Direction; +import net.minecraft.util.ActionResultType; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.LockableLootTileEntity; +import net.minecraft.state.StateContainer; +import net.minecraft.state.DirectionProperty; +import net.minecraft.network.play.server.SUpdateTileEntityPacket; +import net.minecraft.network.NetworkManager; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.BlockItem; +import net.minecraft.inventory.container.INamedContainerProvider; +import net.minecraft.inventory.container.Container; +import net.minecraft.inventory.container.ChestContainer; +import net.minecraft.inventory.ItemStackHelper; +import net.minecraft.inventory.InventoryHelper; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.fluid.FluidState; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.HorizontalBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import javax.annotation.Nullable; + +import java.util.stream.Stream; +import java.util.stream.IntStream; +import java.util.Random; +import java.util.Map; +import java.util.List; +import java.util.HashMap; +import java.util.Collections; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class MuncherBlock extends HemModElements.ModElement { + @ObjectHolder("hem:muncher") + public static final Block block = null; + @ObjectHolder("hem:muncher") + public static final TileEntityType tileEntityType = null; + + public MuncherBlock(HemModElements instance) { + super(instance, 33); + FMLJavaModLoadingContext.get().getModEventBus().register(new TileEntityRegisterHandler()); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomBlock()); + elements.items + .add(() -> new BlockItem(block, new Item.Properties().group(BlueleafTabItemGroup.tab)).setRegistryName(block.getRegistryName())); + } + + private static class TileEntityRegisterHandler { + @SubscribeEvent + public void registerTileEntity(RegistryEvent.Register> event) { + event.getRegistry().register(TileEntityType.Builder.create(CustomTileEntity::new, block).build(null).setRegistryName("muncher")); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutoutMipped()); + } + + public static class CustomBlock extends Block { + public static final DirectionProperty FACING = HorizontalBlock.HORIZONTAL_FACING; + + public CustomBlock() { + super(Block.Properties.create(Material.PLANTS).sound(SoundType.PLANT).hardnessAndResistance(1f, 1f).setLightLevel(s -> 0).harvestLevel(1) + .harvestTool(ToolType.HOE).doesNotBlockMovement().notSolid().setOpaque((bs, br, bp) -> false)); + this.setDefaultState(this.stateContainer.getBaseState().with(FACING, Direction.NORTH)); + setRegistryName("muncher"); + } + + @Override + public boolean propagatesSkylightDown(BlockState state, IBlockReader reader, BlockPos pos) { + return true; + } + + @Override + public int getOpacity(BlockState state, IBlockReader worldIn, BlockPos pos) { + return 0; + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext context) { + Vector3d offset = state.getOffset(world, pos); + switch ((Direction) state.get(FACING)) { + case SOUTH : + default : + return VoxelShapes.or(makeCuboidShape(16, 0, 16, 0, 32, 0)) + + .withOffset(offset.x, offset.y, offset.z); + case NORTH : + return VoxelShapes.or(makeCuboidShape(0, 0, 0, 16, 32, 16)) + + .withOffset(offset.x, offset.y, offset.z); + case EAST : + return VoxelShapes.or(makeCuboidShape(16, 0, 0, 0, 32, 16)) + + .withOffset(offset.x, offset.y, offset.z); + case WEST : + return VoxelShapes.or(makeCuboidShape(0, 0, 16, 16, 32, 0)) + + .withOffset(offset.x, offset.y, offset.z); + } + } + + @Override + protected void fillStateContainer(StateContainer.Builder builder) { + builder.add(FACING); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + return this.getDefaultState().with(FACING, context.getPlacementHorizontalFacing().getOpposite()); + } + + public BlockState rotate(BlockState state, Rotation rot) { + return state.with(FACING, rot.rotate(state.get(FACING))); + } + + public BlockState mirror(BlockState state, Mirror mirrorIn) { + return state.rotate(mirrorIn.toRotation(state.get(FACING))); + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(this, 1)); + } + + @Override + public void onBlockAdded(BlockState blockstate, World world, BlockPos pos, BlockState oldState, boolean moving) { + super.onBlockAdded(blockstate, world, pos, oldState, moving); + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + world.getPendingBlockTicks().scheduleTick(pos, this, 2); + } + + @Override + public void tick(BlockState blockstate, ServerWorld world, BlockPos pos, Random random) { + super.tick(blockstate, world, pos, random); + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + + MuncherUpdateTickProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + world.getPendingBlockTicks().scheduleTick(pos, this, 2); + } + + @Override + public boolean removedByPlayer(BlockState blockstate, World world, BlockPos pos, PlayerEntity entity, boolean willHarvest, FluidState fluid) { + boolean retval = super.removedByPlayer(blockstate, world, pos, entity, willHarvest, fluid); + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + + MuncherBlockDestroyedByPlayerProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + return retval; + } + + @Override + public ActionResultType onBlockActivated(BlockState blockstate, World world, BlockPos pos, PlayerEntity entity, Hand hand, + BlockRayTraceResult hit) { + super.onBlockActivated(blockstate, world, pos, entity, hand, hit); + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + double hitX = hit.getHitVec().x; + double hitY = hit.getHitVec().y; + double hitZ = hit.getHitVec().z; + Direction direction = hit.getFace(); + + MuncherPlantAddedProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + return ActionResultType.SUCCESS; + } + + @Override + public INamedContainerProvider getContainer(BlockState state, World worldIn, BlockPos pos) { + TileEntity tileEntity = worldIn.getTileEntity(pos); + return tileEntity instanceof INamedContainerProvider ? (INamedContainerProvider) tileEntity : null; + } + + @Override + public boolean hasTileEntity(BlockState state) { + return true; + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return new CustomTileEntity(); + } + + @Override + public boolean eventReceived(BlockState state, World world, BlockPos pos, int eventID, int eventParam) { + super.eventReceived(state, world, pos, eventID, eventParam); + TileEntity tileentity = world.getTileEntity(pos); + return tileentity == null ? false : tileentity.receiveClientEvent(eventID, eventParam); + } + + @Override + public void onReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean isMoving) { + if (state.getBlock() != newState.getBlock()) { + TileEntity tileentity = world.getTileEntity(pos); + if (tileentity instanceof CustomTileEntity) { + InventoryHelper.dropInventoryItems(world, pos, (CustomTileEntity) tileentity); + world.updateComparatorOutputLevel(pos, this); + } + + super.onReplaced(state, world, pos, newState, isMoving); + } + } + + @Override + public boolean hasComparatorInputOverride(BlockState state) { + return true; + } + + @Override + public int getComparatorInputOverride(BlockState blockState, World world, BlockPos pos) { + TileEntity tileentity = world.getTileEntity(pos); + if (tileentity instanceof CustomTileEntity) + return Container.calcRedstoneFromInventory((CustomTileEntity) tileentity); + else + return 0; + } + } + + public static class CustomTileEntity extends LockableLootTileEntity implements ISidedInventory { + private NonNullList stacks = NonNullList.withSize(0, ItemStack.EMPTY); + + protected CustomTileEntity() { + super(tileEntityType); + } + + @Override + public void read(BlockState blockState, CompoundNBT compound) { + super.read(blockState, compound); + if (!this.checkLootAndRead(compound)) { + this.stacks = NonNullList.withSize(this.getSizeInventory(), ItemStack.EMPTY); + } + ItemStackHelper.loadAllItems(compound, this.stacks); + } + + @Override + public CompoundNBT write(CompoundNBT compound) { + super.write(compound); + if (!this.checkLootAndWrite(compound)) { + ItemStackHelper.saveAllItems(compound, this.stacks); + } + return compound; + } + + @Override + public SUpdateTileEntityPacket getUpdatePacket() { + return new SUpdateTileEntityPacket(this.pos, 0, this.getUpdateTag()); + } + + @Override + public CompoundNBT getUpdateTag() { + return this.write(new CompoundNBT()); + } + + @Override + public void onDataPacket(NetworkManager net, SUpdateTileEntityPacket pkt) { + this.read(this.getBlockState(), pkt.getNbtCompound()); + } + + @Override + public int getSizeInventory() { + return stacks.size(); + } + + @Override + public boolean isEmpty() { + for (ItemStack itemstack : this.stacks) + if (!itemstack.isEmpty()) + return false; + return true; + } + + @Override + public ITextComponent getDefaultName() { + return new StringTextComponent("muncher"); + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public Container createMenu(int id, PlayerInventory player) { + return ChestContainer.createGeneric9X3(id, player, this); + } + + @Override + public ITextComponent getDisplayName() { + return new StringTextComponent("Muncher 'Flower'"); + } + + @Override + protected NonNullList getItems() { + return this.stacks; + } + + @Override + protected void setItems(NonNullList stacks) { + this.stacks = stacks; + } + + @Override + public boolean isItemValidForSlot(int index, ItemStack stack) { + return true; + } + + @Override + public int[] getSlotsForFace(Direction side) { + return IntStream.range(0, this.getSizeInventory()).toArray(); + } + + @Override + public boolean canInsertItem(int index, ItemStack stack, @Nullable Direction direction) { + return this.isItemValidForSlot(index, stack); + } + + @Override + public boolean canExtractItem(int index, ItemStack stack, Direction direction) { + return true; + } + + private final LazyOptional[] handlers = SidedInvWrapper.create(this, Direction.values()); + + @Override + public LazyOptional getCapability(Capability capability, @Nullable Direction facing) { + if (!this.removed && facing != null && capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + return handlers[facing.ordinal()].cast(); + return super.getCapability(capability, facing); + } + + @Override + public void remove() { + super.remove(); + for (LazyOptional handler : handlers) + handler.invalidate(); + } + } +} diff --git a/src/main/java/studio/halbear/hem/block/MuncherSproutBlock.java b/src/main/java/studio/halbear/hem/block/MuncherSproutBlock.java new file mode 100644 index 0000000..b9c1eff --- /dev/null +++ b/src/main/java/studio/halbear/hem/block/MuncherSproutBlock.java @@ -0,0 +1,241 @@ + +package studio.halbear.hem.block; + +import studio.halbear.hem.procedures.MuncherSproutClientDisplayRandomTickProcedure; +import studio.halbear.hem.procedures.MuncherSproutAdditionalGenerationConditionProcedure; +import studio.halbear.hem.procedures.MuncherGenerationOnStructureInstanceGeneratedProcedure; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.PlantType; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.gen.feature.Features; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.DefaultFlowersFeature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.BlockClusterFeatureConfig; +import net.minecraft.world.gen.blockstateprovider.SimpleBlockStateProvider; +import net.minecraft.world.gen.blockplacer.SimpleBlockPlacer; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.world.IBlockReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.math.shapes.VoxelShapes; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Direction; +import net.minecraft.potion.Effects; +import net.minecraft.loot.LootContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.BlockItem; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.Minecraft; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.FlowerBlock; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.stream.Stream; +import java.util.Random; +import java.util.Map; +import java.util.List; +import java.util.HashMap; +import java.util.Collections; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class MuncherSproutBlock extends HemModElements.ModElement { + @ObjectHolder("hem:muncher_sprout") + public static final Block block = null; + + public MuncherSproutBlock(HemModElements instance) { + super(instance, 105); + MinecraftForge.EVENT_BUS.register(this); + FMLJavaModLoadingContext.get().getModEventBus().register(new FeatureRegisterHandler()); + } + + @Override + public void initElements() { + elements.blocks.add(() -> new BlockCustomFlower()); + elements.items.add(() -> new BlockItem(block, new Item.Properties().group(null)).setRegistryName(block.getRegistryName())); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(block, RenderType.getCutout()); + } + + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + private static class FeatureRegisterHandler { + @SubscribeEvent + public void registerFeature(RegistryEvent.Register> event) { + feature = new DefaultFlowersFeature(BlockClusterFeatureConfig.field_236587_a_) { + @Override + public BlockState getFlowerToPlace(Random random, BlockPos bp, BlockClusterFeatureConfig fc) { + return block.getDefaultState(); + } + + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, BlockClusterFeatureConfig config) { + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + if (!MuncherSproutAdditionalGenerationConditionProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), + new AbstractMap.SimpleEntry<>("y", y), new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll))) + return false; + return super.generate(world, generator, random, pos, config); + } + }; + configuredFeature = feature + .withConfiguration( + (new BlockClusterFeatureConfig.Builder(new SimpleBlockStateProvider(block.getDefaultState()), new SimpleBlockPlacer())) + .tries(5).build()) + .withPlacement(Features.Placements.VEGETATION_PLACEMENT).withPlacement(Features.Placements.HEIGHTMAP_PLACEMENT).func_242731_b(10); + event.getRegistry().register(feature.setRegistryName("muncher_sprout")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:muncher_sprout"), configuredFeature); + } + } + + @SubscribeEvent + public void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.VEGETAL_DECORATION).add(() -> configuredFeature); + } + + public static class BlockCustomFlower extends FlowerBlock { + public BlockCustomFlower() { + super(Effects.NAUSEA, 100, Block.Properties.create(Material.PLANTS).tickRandomly().doesNotBlockMovement().sound(SoundType.PLANT) + .hardnessAndResistance(0f, 0f).setLightLevel(s -> 0)); + setRegistryName("muncher_sprout"); + } + + @Override + public int getStewEffectDuration() { + return 100; + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext context) { + Vector3d offset = state.getOffset(world, pos); + return VoxelShapes.or(makeCuboidShape(0, 0, 0, 16, 16, 16)) + + .withOffset(offset.x, offset.y, offset.z); + } + + @Override + public int getFlammability(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 100; + } + + @Override + public int getFireSpreadSpeed(BlockState state, IBlockReader world, BlockPos pos, Direction face) { + return 60; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + List dropsOriginal = super.getDrops(state, builder); + if (!dropsOriginal.isEmpty()) + return dropsOriginal; + return Collections.singletonList(new ItemStack(MuncherBlock.block)); + } + + @Override + public PlantType getPlantType(IBlockReader world, BlockPos pos) { + return PlantType.PLAINS; + } + + @Override + public void onBlockAdded(BlockState blockstate, World world, BlockPos pos, BlockState oldState, boolean moving) { + super.onBlockAdded(blockstate, world, pos, oldState, moving); + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + + MuncherGenerationOnStructureInstanceGeneratedProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + + @Override + public void tick(BlockState blockstate, ServerWorld world, BlockPos pos, Random random) { + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + + MuncherGenerationOnStructureInstanceGeneratedProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + + @OnlyIn(Dist.CLIENT) + @Override + public void animateTick(BlockState blockstate, World world, BlockPos pos, Random random) { + super.animateTick(blockstate, world, pos, random); + PlayerEntity entity = Minecraft.getInstance().player; + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + + MuncherSproutClientDisplayRandomTickProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + + @Override + public void onEntityCollision(BlockState blockstate, World world, BlockPos pos, Entity entity) { + super.onEntityCollision(blockstate, world, pos, entity); + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + + MuncherGenerationOnStructureInstanceGeneratedProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/entity/AirboatEntity.java b/src/main/java/studio/halbear/hem/entity/AirboatEntity.java new file mode 100644 index 0000000..ef68243 --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/AirboatEntity.java @@ -0,0 +1,226 @@ + +package studio.halbear.hem.entity; + +import studio.halbear.hem.procedures.AirboatRightClickedOnEntityProcedure; +import studio.halbear.hem.procedures.AirboatOnInitialEntitySpawnProcedure; +import studio.halbear.hem.procedures.AirboatOnEntityTickUpdateProcedure; +import studio.halbear.hem.entity.renderer.AirboatRenderer; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.fml.network.NetworkHooks; +import net.minecraftforge.fml.network.FMLPlayMessages; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.entity.EntityAttributeCreationEvent; + +import net.minecraft.world.World; +import net.minecraft.world.IServerWorld; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Hand; +import net.minecraft.util.DamageSource; +import net.minecraft.util.ActionResultType; +import net.minecraft.pathfinding.FlyingPathNavigator; +import net.minecraft.network.IPacket; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.item.SpawnEggItem; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.Item; +import net.minecraft.entity.projectile.PotionEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.ai.controller.FlyingMovementController; +import net.minecraft.entity.ai.attributes.Attributes; +import net.minecraft.entity.ai.attributes.AttributeModifierMap; +import net.minecraft.entity.SpawnReason; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.ILivingEntityData; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.EntityClassification; +import net.minecraft.entity.Entity; +import net.minecraft.entity.CreatureEntity; +import net.minecraft.entity.CreatureAttribute; +import net.minecraft.entity.AreaEffectCloudEntity; +import net.minecraft.block.BlockState; + +import javax.annotation.Nullable; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class AirboatEntity extends HemModElements.ModElement { + public static EntityType entity = (EntityType.Builder.create(CustomEntity::new, EntityClassification.MONSTER) + .setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(3).setCustomClientFactory(CustomEntity::new).size(5f, 9f)) + .build("airboat").setRegistryName("airboat"); + + public AirboatEntity(HemModElements instance) { + super(instance, 292); + FMLJavaModLoadingContext.get().getModEventBus().register(new AirboatRenderer.ModelRegisterHandler()); + FMLJavaModLoadingContext.get().getModEventBus().register(new EntityAttributesRegisterHandler()); + } + + @Override + public void initElements() { + elements.entities.add(() -> entity); + elements.items.add(() -> new SpawnEggItem(entity, -1, -1, new Item.Properties().group(ItemGroup.MISC)).setRegistryName("airboat_spawn_egg")); + } + + @Override + public void init(FMLCommonSetupEvent event) { + } + + private static class EntityAttributesRegisterHandler { + @SubscribeEvent + public void onEntityAttributeCreation(EntityAttributeCreationEvent event) { + AttributeModifierMap.MutableAttribute ammma = MobEntity.func_233666_p_(); + ammma = ammma.createMutableAttribute(Attributes.MOVEMENT_SPEED, 0.3); + ammma = ammma.createMutableAttribute(Attributes.MAX_HEALTH, 100); + ammma = ammma.createMutableAttribute(Attributes.ARMOR, 0); + ammma = ammma.createMutableAttribute(Attributes.ATTACK_DAMAGE, 3); + ammma = ammma.createMutableAttribute(Attributes.FOLLOW_RANGE, 16); + ammma = ammma.createMutableAttribute(Attributes.FLYING_SPEED, 0.3); + event.put(entity, ammma.create()); + } + } + + public static class CustomEntity extends CreatureEntity { + public CustomEntity(FMLPlayMessages.SpawnEntity packet, World world) { + this(entity, world); + } + + public CustomEntity(EntityType type, World world) { + super(type, world); + experienceValue = 0; + setNoAI(false); + enablePersistence(); + this.moveController = new FlyingMovementController(this, 10, true); + this.navigator = new FlyingPathNavigator(this, this.world); + } + + @Override + public IPacket createSpawnPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + + @Override + protected void registerGoals() { + super.registerGoals(); + + } + + @Override + public CreatureAttribute getCreatureAttribute() { + return CreatureAttribute.UNDEFINED; + } + + @Override + public boolean canDespawn(double distanceToClosestPlayer) { + return false; + } + + @Override + public double getMountedYOffset() { + return super.getMountedYOffset() + -7.2; + } + + @Override + public net.minecraft.util.SoundEvent getHurtSound(DamageSource ds) { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.generic.hurt")); + } + + @Override + public net.minecraft.util.SoundEvent getDeathSound() { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.generic.death")); + } + + @Override + public boolean onLivingFall(float l, float d) { + return false; + } + + @Override + public boolean attackEntityFrom(DamageSource source, float amount) { + if (source.getImmediateSource() instanceof PotionEntity || source.getImmediateSource() instanceof AreaEffectCloudEntity) + return false; + if (source == DamageSource.FALL) + return false; + if (source == DamageSource.CACTUS) + return false; + if (source == DamageSource.DROWN) + return false; + if (source == DamageSource.DRAGON_BREATH) + return false; + if (source == DamageSource.WITHER) + return false; + if (source.getDamageType().equals("witherSkull")) + return false; + return super.attackEntityFrom(source, amount); + } + + @Override + public ILivingEntityData onInitialSpawn(IServerWorld world, DifficultyInstance difficulty, SpawnReason reason, + @Nullable ILivingEntityData livingdata, @Nullable CompoundNBT tag) { + ILivingEntityData retval = super.onInitialSpawn(world, difficulty, reason, livingdata, tag); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + + AirboatOnInitialEntitySpawnProcedure + .executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + return retval; + } + + @Override + public ActionResultType func_230254_b_(PlayerEntity sourceentity, Hand hand) { + ItemStack itemstack = sourceentity.getHeldItem(hand); + ActionResultType retval = ActionResultType.func_233537_a_(this.world.isRemote()); + super.func_230254_b_(sourceentity, hand); + sourceentity.startRiding(this); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + + AirboatRightClickedOnEntityProcedure.executeProcedure( + Stream.of(new AbstractMap.SimpleEntry<>("entity", entity), new AbstractMap.SimpleEntry<>("sourceentity", sourceentity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + return retval; + } + + @Override + public void baseTick() { + super.baseTick(); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + + AirboatOnEntityTickUpdateProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + + @Override + protected void updateFallState(double y, boolean onGroundIn, BlockState state, BlockPos pos) { + } + + @Override + public void setNoGravity(boolean ignored) { + super.setNoGravity(true); + } + + public void livingTick() { + super.livingTick(); + this.setNoGravity(true); + } + } +} diff --git a/src/main/java/studio/halbear/hem/entity/DormantAgedEmberleafMilitaryBotEntity.java b/src/main/java/studio/halbear/hem/entity/DormantAgedEmberleafMilitaryBotEntity.java new file mode 100644 index 0000000..f01135f --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/DormantAgedEmberleafMilitaryBotEntity.java @@ -0,0 +1,200 @@ + +package studio.halbear.hem.entity; + +import studio.halbear.hem.procedures.EmberleafMilitaryBotEntityIsHurtProcedure; +import studio.halbear.hem.procedures.EmberleafMilitaryBotEntityDiesProcedure; +import studio.halbear.hem.procedures.DormantAgedEmberleafMilitaryBotOnEntityTickUpdateProcedure; +import studio.halbear.hem.entity.renderer.DormantAgedEmberleafMilitaryBotRenderer; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.fml.network.NetworkHooks; +import net.minecraftforge.fml.network.FMLPlayMessages; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.entity.EntityAttributeCreationEvent; +import net.minecraftforge.common.MinecraftForge; + +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.biome.MobSpawnInfo; +import net.minecraft.world.World; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.DamageSource; +import net.minecraft.network.IPacket; +import net.minecraft.item.SpawnEggItem; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.Item; +import net.minecraft.entity.projectile.PotionEntity; +import net.minecraft.entity.monster.MonsterEntity; +import net.minecraft.entity.ai.attributes.Attributes; +import net.minecraft.entity.ai.attributes.AttributeModifierMap; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.EntitySpawnPlacementRegistry; +import net.minecraft.entity.EntityClassification; +import net.minecraft.entity.Entity; +import net.minecraft.entity.CreatureAttribute; +import net.minecraft.entity.AreaEffectCloudEntity; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class DormantAgedEmberleafMilitaryBotEntity extends HemModElements.ModElement { + public static EntityType entity = (EntityType.Builder.create(CustomEntity::new, EntityClassification.AMBIENT) + .setShouldReceiveVelocityUpdates(true).setTrackingRange(128).setUpdateInterval(3).setCustomClientFactory(CustomEntity::new).immuneToFire() + .size(1f, 3f)).build("dormant_aged_emberleaf_military_bot").setRegistryName("dormant_aged_emberleaf_military_bot"); + + public DormantAgedEmberleafMilitaryBotEntity(HemModElements instance) { + super(instance, 58); + FMLJavaModLoadingContext.get().getModEventBus().register(new DormantAgedEmberleafMilitaryBotRenderer.ModelRegisterHandler()); + FMLJavaModLoadingContext.get().getModEventBus().register(new EntityAttributesRegisterHandler()); + MinecraftForge.EVENT_BUS.register(this); + } + + @Override + public void initElements() { + elements.entities.add(() -> entity); + elements.items.add(() -> new SpawnEggItem(entity, -1, -1, new Item.Properties().group(ItemGroup.MISC)) + .setRegistryName("dormant_aged_emberleaf_military_bot_spawn_egg")); + } + + @SubscribeEvent + public void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:blueleaf_hayfever_fields").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:heightend_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getSpawns().getSpawner(EntityClassification.AMBIENT).add(new MobSpawnInfo.Spawners(entity, 3, 1, 1)); + } + + @Override + public void init(FMLCommonSetupEvent event) { + EntitySpawnPlacementRegistry.register(entity, EntitySpawnPlacementRegistry.PlacementType.NO_RESTRICTIONS, + Heightmap.Type.MOTION_BLOCKING_NO_LEAVES, MobEntity::canSpawnOn); + } + + private static class EntityAttributesRegisterHandler { + @SubscribeEvent + public void onEntityAttributeCreation(EntityAttributeCreationEvent event) { + AttributeModifierMap.MutableAttribute ammma = MobEntity.func_233666_p_(); + ammma = ammma.createMutableAttribute(Attributes.MOVEMENT_SPEED, 0.3); + ammma = ammma.createMutableAttribute(Attributes.MAX_HEALTH, 40); + ammma = ammma.createMutableAttribute(Attributes.ARMOR, 0); + ammma = ammma.createMutableAttribute(Attributes.ATTACK_DAMAGE, 6); + ammma = ammma.createMutableAttribute(Attributes.FOLLOW_RANGE, 32); + ammma = ammma.createMutableAttribute(Attributes.KNOCKBACK_RESISTANCE, 5); + ammma = ammma.createMutableAttribute(Attributes.ATTACK_KNOCKBACK, 1.5); + event.put(entity, ammma.create()); + } + } + + public static class CustomEntity extends MonsterEntity { + public CustomEntity(FMLPlayMessages.SpawnEntity packet, World world) { + this(entity, world); + } + + public CustomEntity(EntityType type, World world) { + super(type, world); + experienceValue = 10; + setNoAI(false); + } + + @Override + public IPacket createSpawnPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + + @Override + protected void registerGoals() { + super.registerGoals(); + + } + + @Override + public CreatureAttribute getCreatureAttribute() { + return CreatureAttribute.UNDEFINED; + } + + @Override + public net.minecraft.util.SoundEvent getHurtSound(DamageSource ds) { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("block.anvil.land")); + } + + @Override + public net.minecraft.util.SoundEvent getDeathSound() { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.firework_rocket.large_blast")); + } + + @Override + public boolean attackEntityFrom(DamageSource source, float amount) { + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + Entity sourceentity = source.getTrueSource(); + + EmberleafMilitaryBotEntityIsHurtProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + if (source.getImmediateSource() instanceof PotionEntity || source.getImmediateSource() instanceof AreaEffectCloudEntity) + return false; + if (source == DamageSource.FALL) + return false; + if (source == DamageSource.CACTUS) + return false; + if (source == DamageSource.LIGHTNING_BOLT) + return false; + if (source == DamageSource.DRAGON_BREATH) + return false; + if (source == DamageSource.WITHER) + return false; + if (source.getDamageType().equals("witherSkull")) + return false; + return super.attackEntityFrom(source, amount); + } + + @Override + public void onDeath(DamageSource source) { + super.onDeath(source); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity sourceentity = source.getTrueSource(); + Entity entity = this; + + EmberleafMilitaryBotEntityDiesProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + + @Override + public void baseTick() { + super.baseTick(); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + + DormantAgedEmberleafMilitaryBotOnEntityTickUpdateProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/entity/DormantEmberleafMilitaryBotEntity.java b/src/main/java/studio/halbear/hem/entity/DormantEmberleafMilitaryBotEntity.java new file mode 100644 index 0000000..636575d --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/DormantEmberleafMilitaryBotEntity.java @@ -0,0 +1,200 @@ + +package studio.halbear.hem.entity; + +import studio.halbear.hem.procedures.EmberleafMilitaryBotEntityIsHurtProcedure; +import studio.halbear.hem.procedures.EmberleafMilitaryBotEntityDiesProcedure; +import studio.halbear.hem.procedures.DormantAgedEmberleafMilitaryBotOnEntityTickUpdateProcedure; +import studio.halbear.hem.entity.renderer.DormantEmberleafMilitaryBotRenderer; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.fml.network.NetworkHooks; +import net.minecraftforge.fml.network.FMLPlayMessages; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.entity.EntityAttributeCreationEvent; +import net.minecraftforge.common.MinecraftForge; + +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.biome.MobSpawnInfo; +import net.minecraft.world.World; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.DamageSource; +import net.minecraft.network.IPacket; +import net.minecraft.item.SpawnEggItem; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.Item; +import net.minecraft.entity.projectile.PotionEntity; +import net.minecraft.entity.monster.MonsterEntity; +import net.minecraft.entity.ai.attributes.Attributes; +import net.minecraft.entity.ai.attributes.AttributeModifierMap; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.EntitySpawnPlacementRegistry; +import net.minecraft.entity.EntityClassification; +import net.minecraft.entity.Entity; +import net.minecraft.entity.CreatureAttribute; +import net.minecraft.entity.AreaEffectCloudEntity; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class DormantEmberleafMilitaryBotEntity extends HemModElements.ModElement { + public static EntityType entity = (EntityType.Builder.create(CustomEntity::new, EntityClassification.AMBIENT) + .setShouldReceiveVelocityUpdates(true).setTrackingRange(128).setUpdateInterval(3).setCustomClientFactory(CustomEntity::new).immuneToFire() + .size(1f, 3f)).build("dormant_emberleaf_military_bot").setRegistryName("dormant_emberleaf_military_bot"); + + public DormantEmberleafMilitaryBotEntity(HemModElements instance) { + super(instance, 59); + FMLJavaModLoadingContext.get().getModEventBus().register(new DormantEmberleafMilitaryBotRenderer.ModelRegisterHandler()); + FMLJavaModLoadingContext.get().getModEventBus().register(new EntityAttributesRegisterHandler()); + MinecraftForge.EVENT_BUS.register(this); + } + + @Override + public void initElements() { + elements.entities.add(() -> entity); + elements.items.add(() -> new SpawnEggItem(entity, -1, -1, new Item.Properties().group(ItemGroup.MISC)) + .setRegistryName("dormant_emberleaf_military_bot_spawn_egg")); + } + + @SubscribeEvent + public void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:blueleaf_hayfever_fields").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:heightend_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getSpawns().getSpawner(EntityClassification.AMBIENT).add(new MobSpawnInfo.Spawners(entity, 3, 1, 1)); + } + + @Override + public void init(FMLCommonSetupEvent event) { + EntitySpawnPlacementRegistry.register(entity, EntitySpawnPlacementRegistry.PlacementType.NO_RESTRICTIONS, + Heightmap.Type.MOTION_BLOCKING_NO_LEAVES, MobEntity::canSpawnOn); + } + + private static class EntityAttributesRegisterHandler { + @SubscribeEvent + public void onEntityAttributeCreation(EntityAttributeCreationEvent event) { + AttributeModifierMap.MutableAttribute ammma = MobEntity.func_233666_p_(); + ammma = ammma.createMutableAttribute(Attributes.MOVEMENT_SPEED, 0.3); + ammma = ammma.createMutableAttribute(Attributes.MAX_HEALTH, 40); + ammma = ammma.createMutableAttribute(Attributes.ARMOR, 0); + ammma = ammma.createMutableAttribute(Attributes.ATTACK_DAMAGE, 6); + ammma = ammma.createMutableAttribute(Attributes.FOLLOW_RANGE, 32); + ammma = ammma.createMutableAttribute(Attributes.KNOCKBACK_RESISTANCE, 5); + ammma = ammma.createMutableAttribute(Attributes.ATTACK_KNOCKBACK, 1.5); + event.put(entity, ammma.create()); + } + } + + public static class CustomEntity extends MonsterEntity { + public CustomEntity(FMLPlayMessages.SpawnEntity packet, World world) { + this(entity, world); + } + + public CustomEntity(EntityType type, World world) { + super(type, world); + experienceValue = 10; + setNoAI(false); + } + + @Override + public IPacket createSpawnPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + + @Override + protected void registerGoals() { + super.registerGoals(); + + } + + @Override + public CreatureAttribute getCreatureAttribute() { + return CreatureAttribute.UNDEFINED; + } + + @Override + public net.minecraft.util.SoundEvent getHurtSound(DamageSource ds) { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("block.anvil.land")); + } + + @Override + public net.minecraft.util.SoundEvent getDeathSound() { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.firework_rocket.large_blast")); + } + + @Override + public boolean attackEntityFrom(DamageSource source, float amount) { + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + Entity sourceentity = source.getTrueSource(); + + EmberleafMilitaryBotEntityIsHurtProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + if (source.getImmediateSource() instanceof PotionEntity || source.getImmediateSource() instanceof AreaEffectCloudEntity) + return false; + if (source == DamageSource.FALL) + return false; + if (source == DamageSource.CACTUS) + return false; + if (source == DamageSource.LIGHTNING_BOLT) + return false; + if (source == DamageSource.DRAGON_BREATH) + return false; + if (source == DamageSource.WITHER) + return false; + if (source.getDamageType().equals("witherSkull")) + return false; + return super.attackEntityFrom(source, amount); + } + + @Override + public void onDeath(DamageSource source) { + super.onDeath(source); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity sourceentity = source.getTrueSource(); + Entity entity = this; + + EmberleafMilitaryBotEntityDiesProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + + @Override + public void baseTick() { + super.baseTick(); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + + DormantAgedEmberleafMilitaryBotOnEntityTickUpdateProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/entity/EmberleafMilitaryBotEntity.java b/src/main/java/studio/halbear/hem/entity/EmberleafMilitaryBotEntity.java new file mode 100644 index 0000000..3188004 --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/EmberleafMilitaryBotEntity.java @@ -0,0 +1,206 @@ + +package studio.halbear.hem.entity; + +import studio.halbear.hem.procedures.EmberleafMilitaryBotOnEntityTickUpdateProcedure; +import studio.halbear.hem.procedures.EmberleafMilitaryBotEntityIsHurtProcedure; +import studio.halbear.hem.procedures.EmberleafMilitaryBotEntityDiesProcedure; +import studio.halbear.hem.entity.renderer.EmberleafMilitaryBotRenderer; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.fml.network.NetworkHooks; +import net.minecraftforge.fml.network.FMLPlayMessages; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.entity.EntityAttributeCreationEvent; + +import net.minecraft.world.World; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.DamageSource; +import net.minecraft.network.IPacket; +import net.minecraft.item.SpawnEggItem; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.Item; +import net.minecraft.entity.projectile.PotionEntity; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.monster.MonsterEntity; +import net.minecraft.entity.ai.goal.RandomWalkingGoal; +import net.minecraft.entity.ai.goal.NearestAttackableTargetGoal; +import net.minecraft.entity.ai.goal.MeleeAttackGoal; +import net.minecraft.entity.ai.goal.LookRandomlyGoal; +import net.minecraft.entity.ai.goal.LookAtGoal; +import net.minecraft.entity.ai.goal.HurtByTargetGoal; +import net.minecraft.entity.ai.attributes.Attributes; +import net.minecraft.entity.ai.attributes.AttributeModifierMap; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.EntityClassification; +import net.minecraft.entity.Entity; +import net.minecraft.entity.CreatureAttribute; +import net.minecraft.entity.AreaEffectCloudEntity; +import net.minecraft.block.BlockState; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class EmberleafMilitaryBotEntity extends HemModElements.ModElement { + public static EntityType entity = (EntityType.Builder.create(CustomEntity::new, EntityClassification.AMBIENT) + .setShouldReceiveVelocityUpdates(true).setTrackingRange(128).setUpdateInterval(3).setCustomClientFactory(CustomEntity::new).immuneToFire() + .size(1f, 3f)).build("emberleaf_military_bot").setRegistryName("emberleaf_military_bot"); + + public EmberleafMilitaryBotEntity(HemModElements instance) { + super(instance, 60); + FMLJavaModLoadingContext.get().getModEventBus().register(new EmberleafMilitaryBotRenderer.ModelRegisterHandler()); + FMLJavaModLoadingContext.get().getModEventBus().register(new EntityAttributesRegisterHandler()); + } + + @Override + public void initElements() { + elements.entities.add(() -> entity); + elements.items.add(() -> new SpawnEggItem(entity, -1, -1, new Item.Properties().group(ItemGroup.MISC)) + .setRegistryName("emberleaf_military_bot_spawn_egg")); + } + + @Override + public void init(FMLCommonSetupEvent event) { + } + + private static class EntityAttributesRegisterHandler { + @SubscribeEvent + public void onEntityAttributeCreation(EntityAttributeCreationEvent event) { + AttributeModifierMap.MutableAttribute ammma = MobEntity.func_233666_p_(); + ammma = ammma.createMutableAttribute(Attributes.MOVEMENT_SPEED, 0.3); + ammma = ammma.createMutableAttribute(Attributes.MAX_HEALTH, 40); + ammma = ammma.createMutableAttribute(Attributes.ARMOR, 0); + ammma = ammma.createMutableAttribute(Attributes.ATTACK_DAMAGE, 6); + ammma = ammma.createMutableAttribute(Attributes.FOLLOW_RANGE, 32); + ammma = ammma.createMutableAttribute(Attributes.KNOCKBACK_RESISTANCE, 5); + ammma = ammma.createMutableAttribute(Attributes.ATTACK_KNOCKBACK, 1.5); + event.put(entity, ammma.create()); + } + } + + public static class CustomEntity extends MonsterEntity { + public CustomEntity(FMLPlayMessages.SpawnEntity packet, World world) { + this(entity, world); + } + + public CustomEntity(EntityType type, World world) { + super(type, world); + experienceValue = 10; + setNoAI(false); + } + + @Override + public IPacket createSpawnPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + + @Override + protected void registerGoals() { + super.registerGoals(); + this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.2, true) { + @Override + protected double getAttackReachSqr(LivingEntity entity) { + return (double) (4.0 + entity.getWidth() * entity.getWidth()); + } + }); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal(this, ServerPlayerEntity.class, false, false)); + this.targetSelector.addGoal(3, new NearestAttackableTargetGoal(this, PlayerEntity.class, false, false)); + this.targetSelector.addGoal(4, new HurtByTargetGoal(this).setCallsForHelp()); + this.goalSelector.addGoal(5, new RandomWalkingGoal(this, 0.8)); + this.goalSelector.addGoal(6, new LookAtGoal(this, ServerPlayerEntity.class, (float) 32)); + this.goalSelector.addGoal(7, new LookRandomlyGoal(this)); + } + + @Override + public CreatureAttribute getCreatureAttribute() { + return CreatureAttribute.UNDEFINED; + } + + @Override + public net.minecraft.util.SoundEvent getAmbientSound() { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("block.fire.extinguish")); + } + + @Override + public void playStepSound(BlockPos pos, BlockState blockIn) { + this.playSound((net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("block.anvil.step")), 0.15f, 1); + } + + @Override + public net.minecraft.util.SoundEvent getHurtSound(DamageSource ds) { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("block.anvil.land")); + } + + @Override + public net.minecraft.util.SoundEvent getDeathSound() { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.firework_rocket.large_blast")); + } + + @Override + public boolean attackEntityFrom(DamageSource source, float amount) { + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + Entity sourceentity = source.getTrueSource(); + + EmberleafMilitaryBotEntityIsHurtProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + if (source.getImmediateSource() instanceof PotionEntity || source.getImmediateSource() instanceof AreaEffectCloudEntity) + return false; + if (source == DamageSource.FALL) + return false; + if (source == DamageSource.CACTUS) + return false; + if (source == DamageSource.LIGHTNING_BOLT) + return false; + if (source == DamageSource.DRAGON_BREATH) + return false; + if (source == DamageSource.WITHER) + return false; + if (source.getDamageType().equals("witherSkull")) + return false; + return super.attackEntityFrom(source, amount); + } + + @Override + public void onDeath(DamageSource source) { + super.onDeath(source); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity sourceentity = source.getTrueSource(); + Entity entity = this; + + EmberleafMilitaryBotEntityDiesProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + + @Override + public void baseTick() { + super.baseTick(); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + + EmberleafMilitaryBotOnEntityTickUpdateProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/entity/EmberleafMilitaryRobotLowerHalfEntity.java b/src/main/java/studio/halbear/hem/entity/EmberleafMilitaryRobotLowerHalfEntity.java new file mode 100644 index 0000000..1b1da04 --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/EmberleafMilitaryRobotLowerHalfEntity.java @@ -0,0 +1,176 @@ + +package studio.halbear.hem.entity; + +import studio.halbear.hem.procedures.EmberleafMilitaryRobotLowerHalfOnInitialEntitySpawnProcedure; +import studio.halbear.hem.procedures.EmberleafMilitaryRobotLowerHalfOnEntityTickUpdateProcedure; +import studio.halbear.hem.entity.renderer.EmberleafMilitaryRobotLowerHalfRenderer; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.fml.network.NetworkHooks; +import net.minecraftforge.fml.network.FMLPlayMessages; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.entity.EntityAttributeCreationEvent; + +import net.minecraft.world.World; +import net.minecraft.world.IServerWorld; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.DamageSource; +import net.minecraft.network.IPacket; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.item.SpawnEggItem; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.Item; +import net.minecraft.entity.projectile.PotionEntity; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.ai.goal.WaterAvoidingRandomWalkingGoal; +import net.minecraft.entity.ai.goal.AvoidEntityGoal; +import net.minecraft.entity.ai.attributes.Attributes; +import net.minecraft.entity.ai.attributes.AttributeModifierMap; +import net.minecraft.entity.SpawnReason; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.ILivingEntityData; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.EntityClassification; +import net.minecraft.entity.Entity; +import net.minecraft.entity.CreatureEntity; +import net.minecraft.entity.CreatureAttribute; +import net.minecraft.entity.AreaEffectCloudEntity; + +import javax.annotation.Nullable; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class EmberleafMilitaryRobotLowerHalfEntity extends HemModElements.ModElement { + public static EntityType entity = (EntityType.Builder.create(CustomEntity::new, EntityClassification.MONSTER) + .setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(3).setCustomClientFactory(CustomEntity::new).immuneToFire() + .size(0.6f, 1.8f)).build("emberleaf_military_robot_lower_half").setRegistryName("emberleaf_military_robot_lower_half"); + + public EmberleafMilitaryRobotLowerHalfEntity(HemModElements instance) { + super(instance, 61); + FMLJavaModLoadingContext.get().getModEventBus().register(new EmberleafMilitaryRobotLowerHalfRenderer.ModelRegisterHandler()); + FMLJavaModLoadingContext.get().getModEventBus().register(new EntityAttributesRegisterHandler()); + } + + @Override + public void initElements() { + elements.entities.add(() -> entity); + elements.items.add(() -> new SpawnEggItem(entity, -1, -1, new Item.Properties().group(ItemGroup.MISC)) + .setRegistryName("emberleaf_military_robot_lower_half_spawn_egg")); + } + + @Override + public void init(FMLCommonSetupEvent event) { + } + + private static class EntityAttributesRegisterHandler { + @SubscribeEvent + public void onEntityAttributeCreation(EntityAttributeCreationEvent event) { + AttributeModifierMap.MutableAttribute ammma = MobEntity.func_233666_p_(); + ammma = ammma.createMutableAttribute(Attributes.MOVEMENT_SPEED, 0.4); + ammma = ammma.createMutableAttribute(Attributes.MAX_HEALTH, 10); + ammma = ammma.createMutableAttribute(Attributes.ARMOR, 0); + ammma = ammma.createMutableAttribute(Attributes.ATTACK_DAMAGE, 3); + ammma = ammma.createMutableAttribute(Attributes.FOLLOW_RANGE, 16); + event.put(entity, ammma.create()); + } + } + + public static class CustomEntity extends CreatureEntity { + public CustomEntity(FMLPlayMessages.SpawnEntity packet, World world) { + this(entity, world); + } + + public CustomEntity(EntityType type, World world) { + super(type, world); + experienceValue = 0; + setNoAI(false); + } + + @Override + public IPacket createSpawnPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + + @Override + protected void registerGoals() { + super.registerGoals(); + this.goalSelector.addGoal(1, new WaterAvoidingRandomWalkingGoal(this, 0.7)); + this.goalSelector.addGoal(2, new AvoidEntityGoal(this, ServerPlayerEntity.class, (float) 16, 1, 1.2)); + } + + @Override + public CreatureAttribute getCreatureAttribute() { + return CreatureAttribute.UNDEFINED; + } + + @Override + public net.minecraft.util.SoundEvent getAmbientSound() { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.firework_rocket.blast")); + } + + @Override + public net.minecraft.util.SoundEvent getHurtSound(DamageSource ds) { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("block.anvil.land")); + } + + @Override + public net.minecraft.util.SoundEvent getDeathSound() { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.generic.explode")); + } + + @Override + public boolean attackEntityFrom(DamageSource source, float amount) { + if (source.getImmediateSource() instanceof PotionEntity || source.getImmediateSource() instanceof AreaEffectCloudEntity) + return false; + if (source == DamageSource.FALL) + return false; + if (source == DamageSource.CACTUS) + return false; + if (source == DamageSource.LIGHTNING_BOLT) + return false; + if (source == DamageSource.DRAGON_BREATH) + return false; + if (source == DamageSource.WITHER) + return false; + if (source.getDamageType().equals("witherSkull")) + return false; + return super.attackEntityFrom(source, amount); + } + + @Override + public ILivingEntityData onInitialSpawn(IServerWorld world, DifficultyInstance difficulty, SpawnReason reason, + @Nullable ILivingEntityData livingdata, @Nullable CompoundNBT tag) { + ILivingEntityData retval = super.onInitialSpawn(world, difficulty, reason, livingdata, tag); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + + EmberleafMilitaryRobotLowerHalfOnInitialEntitySpawnProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + return retval; + } + + @Override + public void baseTick() { + super.baseTick(); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + + EmberleafMilitaryRobotLowerHalfOnEntityTickUpdateProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/entity/EmberleafMilitaryRobotUpperHalfEntity.java b/src/main/java/studio/halbear/hem/entity/EmberleafMilitaryRobotUpperHalfEntity.java new file mode 100644 index 0000000..9279a90 --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/EmberleafMilitaryRobotUpperHalfEntity.java @@ -0,0 +1,190 @@ + +package studio.halbear.hem.entity; + +import studio.halbear.hem.procedures.EmberleafMilitaryRobotLowerHalfOnInitialEntitySpawnProcedure; +import studio.halbear.hem.procedures.EmberleafMilitaryRobotLowerHalfOnEntityTickUpdateProcedure; +import studio.halbear.hem.entity.renderer.EmberleafMilitaryRobotUpperHalfRenderer; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.fml.network.NetworkHooks; +import net.minecraftforge.fml.network.FMLPlayMessages; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.entity.EntityAttributeCreationEvent; + +import net.minecraft.world.World; +import net.minecraft.world.IServerWorld; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.DamageSource; +import net.minecraft.network.IPacket; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.item.SpawnEggItem; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.Item; +import net.minecraft.entity.projectile.PotionEntity; +import net.minecraft.entity.projectile.AbstractArrowEntity; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.ai.goal.WaterAvoidingRandomWalkingGoal; +import net.minecraft.entity.ai.goal.AvoidEntityGoal; +import net.minecraft.entity.ai.attributes.Attributes; +import net.minecraft.entity.ai.attributes.AttributeModifierMap; +import net.minecraft.entity.SpawnReason; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.ILivingEntityData; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.EntityClassification; +import net.minecraft.entity.Entity; +import net.minecraft.entity.CreatureEntity; +import net.minecraft.entity.CreatureAttribute; +import net.minecraft.entity.AreaEffectCloudEntity; + +import javax.annotation.Nullable; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class EmberleafMilitaryRobotUpperHalfEntity extends HemModElements.ModElement { + public static EntityType entity = (EntityType.Builder.create(CustomEntity::new, EntityClassification.MONSTER) + .setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(3).setCustomClientFactory(CustomEntity::new).immuneToFire() + .size(1.2f, 1.5f)).build("emberleaf_military_robot_upper_half").setRegistryName("emberleaf_military_robot_upper_half"); + + public EmberleafMilitaryRobotUpperHalfEntity(HemModElements instance) { + super(instance, 62); + FMLJavaModLoadingContext.get().getModEventBus().register(new EmberleafMilitaryRobotUpperHalfRenderer.ModelRegisterHandler()); + FMLJavaModLoadingContext.get().getModEventBus().register(new EntityAttributesRegisterHandler()); + } + + @Override + public void initElements() { + elements.entities.add(() -> entity); + elements.items.add(() -> new SpawnEggItem(entity, -1, -1, new Item.Properties().group(ItemGroup.MISC)) + .setRegistryName("emberleaf_military_robot_upper_half_spawn_egg")); + } + + @Override + public void init(FMLCommonSetupEvent event) { + } + + private static class EntityAttributesRegisterHandler { + @SubscribeEvent + public void onEntityAttributeCreation(EntityAttributeCreationEvent event) { + AttributeModifierMap.MutableAttribute ammma = MobEntity.func_233666_p_(); + ammma = ammma.createMutableAttribute(Attributes.MOVEMENT_SPEED, 0.4); + ammma = ammma.createMutableAttribute(Attributes.MAX_HEALTH, 10); + ammma = ammma.createMutableAttribute(Attributes.ARMOR, 0); + ammma = ammma.createMutableAttribute(Attributes.ATTACK_DAMAGE, 3); + ammma = ammma.createMutableAttribute(Attributes.FOLLOW_RANGE, 16); + event.put(entity, ammma.create()); + } + } + + public static class CustomEntity extends CreatureEntity { + public CustomEntity(FMLPlayMessages.SpawnEntity packet, World world) { + this(entity, world); + } + + public CustomEntity(EntityType type, World world) { + super(type, world); + experienceValue = 0; + setNoAI(false); + } + + @Override + public IPacket createSpawnPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + + @Override + protected void registerGoals() { + super.registerGoals(); + this.goalSelector.addGoal(1, new WaterAvoidingRandomWalkingGoal(this, 0.7)); + this.goalSelector.addGoal(2, new AvoidEntityGoal(this, ServerPlayerEntity.class, (float) 16, 1, 1.2)); + } + + @Override + public CreatureAttribute getCreatureAttribute() { + return CreatureAttribute.UNDEFINED; + } + + @Override + public net.minecraft.util.SoundEvent getAmbientSound() { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.firework_rocket.blast")); + } + + @Override + public net.minecraft.util.SoundEvent getHurtSound(DamageSource ds) { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("block.anvil.land")); + } + + @Override + public net.minecraft.util.SoundEvent getDeathSound() { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.generic.explode")); + } + + @Override + public boolean attackEntityFrom(DamageSource source, float amount) { + if (source.getImmediateSource() instanceof AbstractArrowEntity) + return false; + if (source.getImmediateSource() instanceof PlayerEntity) + return false; + if (source.getImmediateSource() instanceof PotionEntity || source.getImmediateSource() instanceof AreaEffectCloudEntity) + return false; + if (source == DamageSource.FALL) + return false; + if (source == DamageSource.CACTUS) + return false; + if (source == DamageSource.DROWN) + return false; + if (source == DamageSource.LIGHTNING_BOLT) + return false; + if (source.isExplosion()) + return false; + if (source.getDamageType().equals("trident")) + return false; + if (source == DamageSource.ANVIL) + return false; + if (source == DamageSource.DRAGON_BREATH) + return false; + if (source == DamageSource.WITHER) + return false; + if (source.getDamageType().equals("witherSkull")) + return false; + return super.attackEntityFrom(source, amount); + } + + @Override + public ILivingEntityData onInitialSpawn(IServerWorld world, DifficultyInstance difficulty, SpawnReason reason, + @Nullable ILivingEntityData livingdata, @Nullable CompoundNBT tag) { + ILivingEntityData retval = super.onInitialSpawn(world, difficulty, reason, livingdata, tag); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + + EmberleafMilitaryRobotLowerHalfOnInitialEntitySpawnProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + return retval; + } + + @Override + public void baseTick() { + super.baseTick(); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + + EmberleafMilitaryRobotLowerHalfOnEntityTickUpdateProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/entity/FluffaloEntity.java b/src/main/java/studio/halbear/hem/entity/FluffaloEntity.java new file mode 100644 index 0000000..ce46b07 --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/FluffaloEntity.java @@ -0,0 +1,195 @@ + +package studio.halbear.hem.entity; + +import studio.halbear.hem.procedures.FluffaloRightClickedOnEntityProcedure; +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.entity.renderer.FluffaloRenderer; +import studio.halbear.hem.block.BlueleafWheatBlock; +import studio.halbear.hem.block.BlueleafLavenderBlock; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.fml.network.NetworkHooks; +import net.minecraftforge.fml.network.FMLPlayMessages; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.entity.EntityAttributeCreationEvent; +import net.minecraftforge.common.MinecraftForge; + +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.biome.MobSpawnInfo; +import net.minecraft.world.World; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Hand; +import net.minecraft.util.DamageSource; +import net.minecraft.util.ActionResultType; +import net.minecraft.network.IPacket; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.item.SpawnEggItem; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.entity.projectile.AbstractArrowEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.monster.MonsterEntity; +import net.minecraft.entity.ai.goal.TemptGoal; +import net.minecraft.entity.ai.goal.SwimGoal; +import net.minecraft.entity.ai.goal.RandomWalkingGoal; +import net.minecraft.entity.ai.goal.MeleeAttackGoal; +import net.minecraft.entity.ai.goal.LookRandomlyGoal; +import net.minecraft.entity.ai.goal.HurtByTargetGoal; +import net.minecraft.entity.ai.attributes.Attributes; +import net.minecraft.entity.ai.attributes.AttributeModifierMap; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.EntitySpawnPlacementRegistry; +import net.minecraft.entity.EntityClassification; +import net.minecraft.entity.Entity; +import net.minecraft.entity.CreatureAttribute; +import net.minecraft.block.material.Material; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class FluffaloEntity extends HemModElements.ModElement { + public static EntityType entity = (EntityType.Builder.create(CustomEntity::new, EntityClassification.CREATURE) + .setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(3).setCustomClientFactory(CustomEntity::new).size(2f, 2f)) + .build("fluffalo").setRegistryName("fluffalo"); + + public FluffaloEntity(HemModElements instance) { + super(instance, 162); + FMLJavaModLoadingContext.get().getModEventBus().register(new FluffaloRenderer.ModelRegisterHandler()); + FMLJavaModLoadingContext.get().getModEventBus().register(new EntityAttributesRegisterHandler()); + MinecraftForge.EVENT_BUS.register(this); + } + + @Override + public void initElements() { + elements.entities.add(() -> entity); + elements.items.add(() -> new SpawnEggItem(entity, -10079488, -3381760, new Item.Properties().group(BlueleafTabItemGroup.tab)) + .setRegistryName("fluffalo_spawn_egg")); + } + + @SubscribeEvent + public void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:blueleaf_hayfever_fields").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:heightend_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getSpawns().getSpawner(EntityClassification.CREATURE).add(new MobSpawnInfo.Spawners(entity, 10, 1, 3)); + } + + @Override + public void init(FMLCommonSetupEvent event) { + EntitySpawnPlacementRegistry.register(entity, EntitySpawnPlacementRegistry.PlacementType.ON_GROUND, Heightmap.Type.MOTION_BLOCKING_NO_LEAVES, + (entityType, world, reason, pos, + random) -> (world.getBlockState(pos.down()).getMaterial() == Material.ORGANIC && world.getLightSubtracted(pos, 0) > 8)); + } + + private static class EntityAttributesRegisterHandler { + @SubscribeEvent + public void onEntityAttributeCreation(EntityAttributeCreationEvent event) { + AttributeModifierMap.MutableAttribute ammma = MobEntity.func_233666_p_(); + ammma = ammma.createMutableAttribute(Attributes.MOVEMENT_SPEED, 0.35); + ammma = ammma.createMutableAttribute(Attributes.MAX_HEALTH, 50); + ammma = ammma.createMutableAttribute(Attributes.ARMOR, 0); + ammma = ammma.createMutableAttribute(Attributes.ATTACK_DAMAGE, 3); + ammma = ammma.createMutableAttribute(Attributes.FOLLOW_RANGE, 16); + event.put(entity, ammma.create()); + } + } + + public static class CustomEntity extends MonsterEntity { + public CustomEntity(FMLPlayMessages.SpawnEntity packet, World world) { + this(entity, world); + } + + public CustomEntity(EntityType type, World world) { + super(type, world); + experienceValue = 5; + setNoAI(false); + } + + @Override + public IPacket createSpawnPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + + @Override + protected void registerGoals() { + super.registerGoals(); + this.goalSelector.addGoal(1, new RandomWalkingGoal(this, 0.5)); + this.goalSelector.addGoal(2, new TemptGoal(this, 0.4, Ingredient.fromItems(BlueleafLavenderBlock.block.asItem()), false)); + this.goalSelector.addGoal(3, new TemptGoal(this, 0.4, Ingredient.fromItems(BlueleafWheatBlock.block.asItem()), false)); + this.targetSelector.addGoal(4, new HurtByTargetGoal(this).setCallsForHelp()); + this.goalSelector.addGoal(5, new MeleeAttackGoal(this, 1, false) { + @Override + protected double getAttackReachSqr(LivingEntity entity) { + return (double) (4.0 + entity.getWidth() * entity.getWidth()); + } + }); + this.goalSelector.addGoal(7, new LookRandomlyGoal(this)); + this.goalSelector.addGoal(8, new SwimGoal(this)); + } + + @Override + public CreatureAttribute getCreatureAttribute() { + return CreatureAttribute.UNDEFINED; + } + + @Override + public net.minecraft.util.SoundEvent getAmbientSound() { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.cow.ambient")); + } + + @Override + public net.minecraft.util.SoundEvent getHurtSound(DamageSource ds) { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.cow.hurt")); + } + + @Override + public net.minecraft.util.SoundEvent getDeathSound() { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.cow.death")); + } + + @Override + public boolean attackEntityFrom(DamageSource source, float amount) { + if (source.getImmediateSource() instanceof AbstractArrowEntity) + return false; + if (source == DamageSource.FALL) + return false; + if (source == DamageSource.CACTUS) + return false; + if (source == DamageSource.ANVIL) + return false; + return super.attackEntityFrom(source, amount); + } + + @Override + public ActionResultType func_230254_b_(PlayerEntity sourceentity, Hand hand) { + ItemStack itemstack = sourceentity.getHeldItem(hand); + ActionResultType retval = ActionResultType.func_233537_a_(this.world.isRemote()); + super.func_230254_b_(sourceentity, hand); + sourceentity.startRiding(this); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + + FluffaloRightClickedOnEntityProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity), + new AbstractMap.SimpleEntry<>("sourceentity", sourceentity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + return retval; + } + } +} diff --git a/src/main/java/studio/halbear/hem/entity/FluffaloShavedEntity.java b/src/main/java/studio/halbear/hem/entity/FluffaloShavedEntity.java new file mode 100644 index 0000000..8f6066c --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/FluffaloShavedEntity.java @@ -0,0 +1,189 @@ + +package studio.halbear.hem.entity; + +import studio.halbear.hem.procedures.FluffaloShavedOnInitialEntitySpawnProcedure; +import studio.halbear.hem.procedures.FluffaloShavedOnEntityTickUpdateProcedure; +import studio.halbear.hem.entity.renderer.FluffaloShavedRenderer; +import studio.halbear.hem.block.BlueleafWheatBlock; +import studio.halbear.hem.block.BlueleafLavenderBlock; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.fml.network.NetworkHooks; +import net.minecraftforge.fml.network.FMLPlayMessages; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.entity.EntityAttributeCreationEvent; + +import net.minecraft.world.World; +import net.minecraft.world.IServerWorld; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Hand; +import net.minecraft.util.DamageSource; +import net.minecraft.util.ActionResultType; +import net.minecraft.network.IPacket; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.item.ItemStack; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.monster.MonsterEntity; +import net.minecraft.entity.ai.goal.TemptGoal; +import net.minecraft.entity.ai.goal.SwimGoal; +import net.minecraft.entity.ai.goal.RandomWalkingGoal; +import net.minecraft.entity.ai.goal.MeleeAttackGoal; +import net.minecraft.entity.ai.goal.LookRandomlyGoal; +import net.minecraft.entity.ai.goal.HurtByTargetGoal; +import net.minecraft.entity.ai.attributes.Attributes; +import net.minecraft.entity.ai.attributes.AttributeModifierMap; +import net.minecraft.entity.SpawnReason; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.ILivingEntityData; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.EntityClassification; +import net.minecraft.entity.Entity; +import net.minecraft.entity.CreatureAttribute; + +import javax.annotation.Nullable; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class FluffaloShavedEntity extends HemModElements.ModElement { + public static EntityType entity = (EntityType.Builder.create(CustomEntity::new, EntityClassification.CREATURE) + .setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(3).setCustomClientFactory(CustomEntity::new).size(2f, 2f)) + .build("fluffalo_shaved").setRegistryName("fluffalo_shaved"); + + public FluffaloShavedEntity(HemModElements instance) { + super(instance, 268); + FMLJavaModLoadingContext.get().getModEventBus().register(new FluffaloShavedRenderer.ModelRegisterHandler()); + FMLJavaModLoadingContext.get().getModEventBus().register(new EntityAttributesRegisterHandler()); + } + + @Override + public void initElements() { + elements.entities.add(() -> entity); + } + + @Override + public void init(FMLCommonSetupEvent event) { + } + + private static class EntityAttributesRegisterHandler { + @SubscribeEvent + public void onEntityAttributeCreation(EntityAttributeCreationEvent event) { + AttributeModifierMap.MutableAttribute ammma = MobEntity.func_233666_p_(); + ammma = ammma.createMutableAttribute(Attributes.MOVEMENT_SPEED, 0.35); + ammma = ammma.createMutableAttribute(Attributes.MAX_HEALTH, 25); + ammma = ammma.createMutableAttribute(Attributes.ARMOR, 0); + ammma = ammma.createMutableAttribute(Attributes.ATTACK_DAMAGE, 0); + ammma = ammma.createMutableAttribute(Attributes.FOLLOW_RANGE, 16); + event.put(entity, ammma.create()); + } + } + + public static class CustomEntity extends MonsterEntity { + public CustomEntity(FMLPlayMessages.SpawnEntity packet, World world) { + this(entity, world); + } + + public CustomEntity(EntityType type, World world) { + super(type, world); + experienceValue = 5; + setNoAI(false); + } + + @Override + public IPacket createSpawnPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + + @Override + protected void registerGoals() { + super.registerGoals(); + this.goalSelector.addGoal(1, new RandomWalkingGoal(this, 0.5)); + this.goalSelector.addGoal(2, new TemptGoal(this, 0.4, Ingredient.fromItems(BlueleafLavenderBlock.block.asItem()), false)); + this.goalSelector.addGoal(3, new TemptGoal(this, 0.4, Ingredient.fromItems(BlueleafWheatBlock.block.asItem()), false)); + this.targetSelector.addGoal(4, new HurtByTargetGoal(this).setCallsForHelp()); + this.goalSelector.addGoal(5, new MeleeAttackGoal(this, 1, false) { + @Override + protected double getAttackReachSqr(LivingEntity entity) { + return (double) (4.0 + entity.getWidth() * entity.getWidth()); + } + }); + this.goalSelector.addGoal(7, new LookRandomlyGoal(this)); + this.goalSelector.addGoal(8, new SwimGoal(this)); + } + + @Override + public CreatureAttribute getCreatureAttribute() { + return CreatureAttribute.UNDEFINED; + } + + @Override + public net.minecraft.util.SoundEvent getAmbientSound() { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.cow.ambient")); + } + + @Override + public net.minecraft.util.SoundEvent getHurtSound(DamageSource ds) { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.cow.hurt")); + } + + @Override + public net.minecraft.util.SoundEvent getDeathSound() { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.cow.death")); + } + + @Override + public boolean attackEntityFrom(DamageSource source, float amount) { + if (source == DamageSource.FALL) + return false; + if (source == DamageSource.ANVIL) + return false; + return super.attackEntityFrom(source, amount); + } + + @Override + public ILivingEntityData onInitialSpawn(IServerWorld world, DifficultyInstance difficulty, SpawnReason reason, + @Nullable ILivingEntityData livingdata, @Nullable CompoundNBT tag) { + ILivingEntityData retval = super.onInitialSpawn(world, difficulty, reason, livingdata, tag); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + + FluffaloShavedOnInitialEntitySpawnProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + return retval; + } + + @Override + public ActionResultType func_230254_b_(PlayerEntity sourceentity, Hand hand) { + ItemStack itemstack = sourceentity.getHeldItem(hand); + ActionResultType retval = ActionResultType.func_233537_a_(this.world.isRemote()); + super.func_230254_b_(sourceentity, hand); + sourceentity.startRiding(this); + return retval; + } + + @Override + public void baseTick() { + super.baseTick(); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + + FluffaloShavedOnEntityTickUpdateProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/entity/GiantButterflyEntity.java b/src/main/java/studio/halbear/hem/entity/GiantButterflyEntity.java new file mode 100644 index 0000000..7756689 --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/GiantButterflyEntity.java @@ -0,0 +1,236 @@ + +package studio.halbear.hem.entity; + +import studio.halbear.hem.procedures.GiantButterflyOnEntityTickUpdateProcedure; +import studio.halbear.hem.entity.renderer.GiantButterflyRenderer; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.fml.network.NetworkHooks; +import net.minecraftforge.fml.network.FMLPlayMessages; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.entity.EntityAttributeCreationEvent; + +import net.minecraft.world.World; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Hand; +import net.minecraft.util.DamageSource; +import net.minecraft.util.ActionResultType; +import net.minecraft.pathfinding.FlyingPathNavigator; +import net.minecraft.network.IPacket; +import net.minecraft.item.ItemStack; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.ai.goal.SwimGoal; +import net.minecraft.entity.ai.goal.RandomWalkingGoal; +import net.minecraft.entity.ai.goal.NearestAttackableTargetGoal; +import net.minecraft.entity.ai.goal.LookRandomlyGoal; +import net.minecraft.entity.ai.goal.HurtByTargetGoal; +import net.minecraft.entity.ai.goal.Goal; +import net.minecraft.entity.ai.controller.FlyingMovementController; +import net.minecraft.entity.ai.attributes.Attributes; +import net.minecraft.entity.ai.attributes.AttributeModifierMap; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.EntityClassification; +import net.minecraft.entity.Entity; +import net.minecraft.entity.CreatureEntity; +import net.minecraft.entity.CreatureAttribute; +import net.minecraft.block.BlockState; + +import java.util.stream.Stream; +import java.util.Random; +import java.util.Map; +import java.util.HashMap; +import java.util.EnumSet; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class GiantButterflyEntity extends HemModElements.ModElement { + public static EntityType entity = (EntityType.Builder.create(CustomEntity::new, EntityClassification.CREATURE) + .setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(3).setCustomClientFactory(CustomEntity::new).size(1f, 1f)) + .build("giant_butterfly").setRegistryName("giant_butterfly"); + + public GiantButterflyEntity(HemModElements instance) { + super(instance, 44); + FMLJavaModLoadingContext.get().getModEventBus().register(new GiantButterflyRenderer.ModelRegisterHandler()); + FMLJavaModLoadingContext.get().getModEventBus().register(new EntityAttributesRegisterHandler()); + } + + @Override + public void initElements() { + elements.entities.add(() -> entity); + } + + @Override + public void init(FMLCommonSetupEvent event) { + } + + private static class EntityAttributesRegisterHandler { + @SubscribeEvent + public void onEntityAttributeCreation(EntityAttributeCreationEvent event) { + AttributeModifierMap.MutableAttribute ammma = MobEntity.func_233666_p_(); + ammma = ammma.createMutableAttribute(Attributes.MOVEMENT_SPEED, 0.4); + ammma = ammma.createMutableAttribute(Attributes.MAX_HEALTH, 35); + ammma = ammma.createMutableAttribute(Attributes.ARMOR, 0); + ammma = ammma.createMutableAttribute(Attributes.ATTACK_DAMAGE, 4); + ammma = ammma.createMutableAttribute(Attributes.FOLLOW_RANGE, 16); + ammma = ammma.createMutableAttribute(Attributes.FLYING_SPEED, 0.4); + event.put(entity, ammma.create()); + } + } + + public static class CustomEntity extends CreatureEntity { + public CustomEntity(FMLPlayMessages.SpawnEntity packet, World world) { + this(entity, world); + } + + public CustomEntity(EntityType type, World world) { + super(type, world); + experienceValue = 1; + setNoAI(false); + this.moveController = new FlyingMovementController(this, 10, true); + this.navigator = new FlyingPathNavigator(this, this.world); + } + + @Override + public IPacket createSpawnPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + + @Override + protected void registerGoals() { + super.registerGoals(); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setCallsForHelp()); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal(this, LadyBugInFlightEntity.CustomEntity.class, false, false)); + this.goalSelector.addGoal(3, new Goal() { + { + this.setMutexFlags(EnumSet.of(Goal.Flag.MOVE)); + } + + public boolean shouldExecute() { + if (CustomEntity.this.getAttackTarget() != null && !CustomEntity.this.getMoveHelper().isUpdating()) { + return true; + } else { + return false; + } + } + + @Override + public boolean shouldContinueExecuting() { + return CustomEntity.this.getMoveHelper().isUpdating() && CustomEntity.this.getAttackTarget() != null + && CustomEntity.this.getAttackTarget().isAlive(); + } + + @Override + public void startExecuting() { + LivingEntity livingentity = CustomEntity.this.getAttackTarget(); + Vector3d vec3d = livingentity.getEyePosition(1); + CustomEntity.this.moveController.setMoveTo(vec3d.x, vec3d.y, vec3d.z, 1); + } + + @Override + public void tick() { + LivingEntity livingentity = CustomEntity.this.getAttackTarget(); + if (CustomEntity.this.getBoundingBox().intersects(livingentity.getBoundingBox())) { + CustomEntity.this.attackEntityAsMob(livingentity); + } else { + double d0 = CustomEntity.this.getDistanceSq(livingentity); + if (d0 < 16) { + Vector3d vec3d = livingentity.getEyePosition(1); + CustomEntity.this.moveController.setMoveTo(vec3d.x, vec3d.y, vec3d.z, 1); + } + } + } + }); + this.goalSelector.addGoal(4, new RandomWalkingGoal(this, 1, 20) { + @Override + protected Vector3d getPosition() { + Random random = CustomEntity.this.getRNG(); + double dir_x = CustomEntity.this.getPosX() + ((random.nextFloat() * 2 - 1) * 16); + double dir_y = CustomEntity.this.getPosY() + ((random.nextFloat() * 2 - 1) * 16); + double dir_z = CustomEntity.this.getPosZ() + ((random.nextFloat() * 2 - 1) * 16); + return new Vector3d(dir_x, dir_y, dir_z); + } + }); + this.goalSelector.addGoal(5, new LookRandomlyGoal(this)); + this.goalSelector.addGoal(6, new SwimGoal(this)); + } + + @Override + public CreatureAttribute getCreatureAttribute() { + return CreatureAttribute.UNDEFINED; + } + + @Override + public net.minecraft.util.SoundEvent getHurtSound(DamageSource ds) { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.generic.hurt")); + } + + @Override + public net.minecraft.util.SoundEvent getDeathSound() { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.generic.death")); + } + + @Override + public boolean onLivingFall(float l, float d) { + return false; + } + + @Override + public boolean attackEntityFrom(DamageSource source, float amount) { + if (source == DamageSource.FALL) + return false; + if (source == DamageSource.LIGHTNING_BOLT) + return false; + if (source == DamageSource.DRAGON_BREATH) + return false; + if (source == DamageSource.WITHER) + return false; + if (source.getDamageType().equals("witherSkull")) + return false; + return super.attackEntityFrom(source, amount); + } + + @Override + public ActionResultType func_230254_b_(PlayerEntity sourceentity, Hand hand) { + ItemStack itemstack = sourceentity.getHeldItem(hand); + ActionResultType retval = ActionResultType.func_233537_a_(this.world.isRemote()); + super.func_230254_b_(sourceentity, hand); + sourceentity.startRiding(this); + return retval; + } + + @Override + public void baseTick() { + super.baseTick(); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + + GiantButterflyOnEntityTickUpdateProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + + @Override + protected void updateFallState(double y, boolean onGroundIn, BlockState state, BlockPos pos) { + } + + @Override + public void setNoGravity(boolean ignored) { + super.setNoGravity(true); + } + + public void livingTick() { + super.livingTick(); + this.setNoGravity(true); + } + } +} diff --git a/src/main/java/studio/halbear/hem/entity/GiantButterflyWalkingEntity.java b/src/main/java/studio/halbear/hem/entity/GiantButterflyWalkingEntity.java new file mode 100644 index 0000000..12e0bcd --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/GiantButterflyWalkingEntity.java @@ -0,0 +1,192 @@ + +package studio.halbear.hem.entity; + +import studio.halbear.hem.procedures.GiantButterflyWalkingOnEntityTickUpdateProcedure; +import studio.halbear.hem.procedures.GiantButterflyWalkingNaturalEntitySpawningConditionProcedure; +import studio.halbear.hem.entity.renderer.GiantButterflyWalkingRenderer; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.fml.network.NetworkHooks; +import net.minecraftforge.fml.network.FMLPlayMessages; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.entity.EntityAttributeCreationEvent; +import net.minecraftforge.common.MinecraftForge; + +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.biome.MobSpawnInfo; +import net.minecraft.world.World; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Hand; +import net.minecraft.util.DamageSource; +import net.minecraft.util.ActionResultType; +import net.minecraft.network.IPacket; +import net.minecraft.item.ItemStack; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.ai.goal.SwimGoal; +import net.minecraft.entity.ai.goal.RandomWalkingGoal; +import net.minecraft.entity.ai.goal.LookRandomlyGoal; +import net.minecraft.entity.ai.goal.LookAtGoal; +import net.minecraft.entity.ai.goal.HurtByTargetGoal; +import net.minecraft.entity.ai.goal.FollowMobGoal; +import net.minecraft.entity.ai.goal.AvoidEntityGoal; +import net.minecraft.entity.ai.attributes.Attributes; +import net.minecraft.entity.ai.attributes.AttributeModifierMap; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.EntitySpawnPlacementRegistry; +import net.minecraft.entity.EntityClassification; +import net.minecraft.entity.Entity; +import net.minecraft.entity.CreatureEntity; +import net.minecraft.entity.CreatureAttribute; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class GiantButterflyWalkingEntity extends HemModElements.ModElement { + public static EntityType entity = (EntityType.Builder.create(CustomEntity::new, EntityClassification.CREATURE) + .setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(3).setCustomClientFactory(CustomEntity::new) + .size(1f, 1.2000000000000002f)).build("giant_butterfly_walking").setRegistryName("giant_butterfly_walking"); + + public GiantButterflyWalkingEntity(HemModElements instance) { + super(instance, 45); + FMLJavaModLoadingContext.get().getModEventBus().register(new GiantButterflyWalkingRenderer.ModelRegisterHandler()); + FMLJavaModLoadingContext.get().getModEventBus().register(new EntityAttributesRegisterHandler()); + MinecraftForge.EVENT_BUS.register(this); + } + + @Override + public void initElements() { + elements.entities.add(() -> entity); + } + + @SubscribeEvent + public void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:blueleaf_hayfever_fields").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getSpawns().getSpawner(EntityClassification.CREATURE).add(new MobSpawnInfo.Spawners(entity, 5, 1, 2)); + } + + @Override + public void init(FMLCommonSetupEvent event) { + EntitySpawnPlacementRegistry.register(entity, EntitySpawnPlacementRegistry.PlacementType.ON_GROUND, Heightmap.Type.MOTION_BLOCKING_NO_LEAVES, + (entityType, world, reason, pos, random) -> { + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + return GiantButterflyWalkingNaturalEntitySpawningConditionProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), + new AbstractMap.SimpleEntry<>("y", y), new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + }); + } + + private static class EntityAttributesRegisterHandler { + @SubscribeEvent + public void onEntityAttributeCreation(EntityAttributeCreationEvent event) { + AttributeModifierMap.MutableAttribute ammma = MobEntity.func_233666_p_(); + ammma = ammma.createMutableAttribute(Attributes.MOVEMENT_SPEED, 0.2); + ammma = ammma.createMutableAttribute(Attributes.MAX_HEALTH, 35); + ammma = ammma.createMutableAttribute(Attributes.ARMOR, 0); + ammma = ammma.createMutableAttribute(Attributes.ATTACK_DAMAGE, 4); + ammma = ammma.createMutableAttribute(Attributes.FOLLOW_RANGE, 16); + event.put(entity, ammma.create()); + } + } + + public static class CustomEntity extends CreatureEntity { + public CustomEntity(FMLPlayMessages.SpawnEntity packet, World world) { + this(entity, world); + } + + public CustomEntity(EntityType type, World world) { + super(type, world); + experienceValue = 1; + setNoAI(false); + } + + @Override + public IPacket createSpawnPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + + @Override + protected void registerGoals() { + super.registerGoals(); + this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setCallsForHelp()); + this.goalSelector.addGoal(2, new AvoidEntityGoal(this, ServerPlayerEntity.class, (float) 6, 1, 1)); + this.goalSelector.addGoal(3, new FollowMobGoal(this, (float) 1, 10, 5)); + this.goalSelector.addGoal(4, new LookAtGoal(this, LadybugEntity.CustomEntity.class, (float) 6)); + this.goalSelector.addGoal(5, new RandomWalkingGoal(this, 1)); + this.goalSelector.addGoal(6, new LookRandomlyGoal(this)); + this.goalSelector.addGoal(7, new SwimGoal(this)); + } + + @Override + public CreatureAttribute getCreatureAttribute() { + return CreatureAttribute.UNDEFINED; + } + + @Override + public net.minecraft.util.SoundEvent getHurtSound(DamageSource ds) { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.generic.hurt")); + } + + @Override + public net.minecraft.util.SoundEvent getDeathSound() { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.generic.death")); + } + + @Override + public boolean attackEntityFrom(DamageSource source, float amount) { + if (source == DamageSource.FALL) + return false; + if (source == DamageSource.LIGHTNING_BOLT) + return false; + if (source == DamageSource.DRAGON_BREATH) + return false; + if (source == DamageSource.WITHER) + return false; + if (source.getDamageType().equals("witherSkull")) + return false; + return super.attackEntityFrom(source, amount); + } + + @Override + public ActionResultType func_230254_b_(PlayerEntity sourceentity, Hand hand) { + ItemStack itemstack = sourceentity.getHeldItem(hand); + ActionResultType retval = ActionResultType.func_233537_a_(this.world.isRemote()); + super.func_230254_b_(sourceentity, hand); + sourceentity.startRiding(this); + return retval; + } + + @Override + public void baseTick() { + super.baseTick(); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + + GiantButterflyWalkingOnEntityTickUpdateProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/entity/GoldFishEntity.java b/src/main/java/studio/halbear/hem/entity/GoldFishEntity.java new file mode 100644 index 0000000..1ad8b2f --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/GoldFishEntity.java @@ -0,0 +1,242 @@ + +package studio.halbear.hem.entity; + +import studio.halbear.hem.procedures.TigerFishOnEntityTickUpdateProcedure; +import studio.halbear.hem.item.TigerFishItemItem; +import studio.halbear.hem.entity.renderer.GoldFishRenderer; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.fml.network.NetworkHooks; +import net.minecraftforge.fml.network.FMLPlayMessages; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.entity.EntityAttributeCreationEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.ForgeMod; + +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.biome.MobSpawnInfo; +import net.minecraft.world.World; +import net.minecraft.world.IWorldReader; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.DamageSource; +import net.minecraft.pathfinding.SwimmerPathNavigator; +import net.minecraft.pathfinding.PathNodeType; +import net.minecraft.network.IPacket; +import net.minecraft.item.SpawnEggItem; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.Item; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.passive.SquidEntity; +import net.minecraft.entity.ai.goal.RandomSwimmingGoal; +import net.minecraft.entity.ai.goal.AvoidEntityGoal; +import net.minecraft.entity.ai.controller.MovementController; +import net.minecraft.entity.ai.attributes.Attributes; +import net.minecraft.entity.ai.attributes.AttributeModifierMap; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.EntitySpawnPlacementRegistry; +import net.minecraft.entity.EntityClassification; +import net.minecraft.entity.Entity; +import net.minecraft.entity.CreatureEntity; +import net.minecraft.entity.CreatureAttribute; +import net.minecraft.block.BlockState; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class GoldFishEntity extends HemModElements.ModElement { + public static EntityType entity = (EntityType.Builder.create(CustomEntity::new, EntityClassification.WATER_CREATURE) + .setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(3).setCustomClientFactory(CustomEntity::new) + .size(0.3f, 0.4f)).build("gold_fish").setRegistryName("gold_fish"); + + public GoldFishEntity(HemModElements instance) { + super(instance, 132); + FMLJavaModLoadingContext.get().getModEventBus().register(new GoldFishRenderer.ModelRegisterHandler()); + FMLJavaModLoadingContext.get().getModEventBus().register(new EntityAttributesRegisterHandler()); + MinecraftForge.EVENT_BUS.register(this); + } + + @Override + public void initElements() { + elements.entities.add(() -> entity); + elements.items + .add(() -> new SpawnEggItem(entity, -1, -1, new Item.Properties().group(ItemGroup.MISC)).setRegistryName("gold_fish_spawn_egg")); + } + + @SubscribeEvent + public void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getSpawns().getSpawner(EntityClassification.WATER_CREATURE).add(new MobSpawnInfo.Spawners(entity, 15, 1, 4)); + } + + @Override + public void init(FMLCommonSetupEvent event) { + EntitySpawnPlacementRegistry.register(entity, EntitySpawnPlacementRegistry.PlacementType.IN_WATER, Heightmap.Type.MOTION_BLOCKING_NO_LEAVES, + SquidEntity::func_223365_b); + } + + private static class EntityAttributesRegisterHandler { + @SubscribeEvent + public void onEntityAttributeCreation(EntityAttributeCreationEvent event) { + AttributeModifierMap.MutableAttribute ammma = MobEntity.func_233666_p_(); + ammma = ammma.createMutableAttribute(Attributes.MOVEMENT_SPEED, 0.3); + ammma = ammma.createMutableAttribute(Attributes.MAX_HEALTH, 10); + ammma = ammma.createMutableAttribute(Attributes.ARMOR, 3); + ammma = ammma.createMutableAttribute(Attributes.ATTACK_DAMAGE, 0); + ammma = ammma.createMutableAttribute(Attributes.FOLLOW_RANGE, 16); + ammma = ammma.createMutableAttribute(Attributes.KNOCKBACK_RESISTANCE, 0.5); + ammma = ammma.createMutableAttribute(ForgeMod.SWIM_SPEED.get(), 0.7); + event.put(entity, ammma.create()); + } + } + + public static class CustomEntity extends CreatureEntity { + public CustomEntity(FMLPlayMessages.SpawnEntity packet, World world) { + this(entity, world); + } + + public CustomEntity(EntityType type, World world) { + super(type, world); + experienceValue = 0; + setNoAI(false); + this.setPathPriority(PathNodeType.WATER, 0); + this.moveController = new MovementController(this) { + @Override + public void tick() { + if (CustomEntity.this.isInWater()) + CustomEntity.this.setMotion(CustomEntity.this.getMotion().add(0, 0.005, 0)); + if (this.action == MovementController.Action.MOVE_TO && !CustomEntity.this.getNavigator().noPath()) { + double dx = this.posX - CustomEntity.this.getPosX(); + double dy = this.posY - CustomEntity.this.getPosY(); + double dz = this.posZ - CustomEntity.this.getPosZ(); + float f = (float) (MathHelper.atan2(dz, dx) * (double) (180 / Math.PI)) - 90; + float f1 = (float) (this.speed * CustomEntity.this.getAttribute(Attributes.MOVEMENT_SPEED).getValue()); + CustomEntity.this.rotationYaw = this.limitAngle(CustomEntity.this.rotationYaw, f, 10); + CustomEntity.this.renderYawOffset = CustomEntity.this.rotationYaw; + CustomEntity.this.rotationYawHead = CustomEntity.this.rotationYaw; + if (CustomEntity.this.isInWater()) { + CustomEntity.this.setAIMoveSpeed((float) CustomEntity.this.getAttribute(Attributes.MOVEMENT_SPEED).getValue()); + float f2 = -(float) (MathHelper.atan2(dy, MathHelper.sqrt(dx * dx + dz * dz)) * (180F / Math.PI)); + f2 = MathHelper.clamp(MathHelper.wrapDegrees(f2), -85, 85); + CustomEntity.this.rotationPitch = this.limitAngle(CustomEntity.this.rotationPitch, f2, 5); + float f3 = MathHelper.cos(CustomEntity.this.rotationPitch * (float) (Math.PI / 180.0)); + CustomEntity.this.setMoveForward(f3 * f1); + CustomEntity.this.setMoveVertical((float) (f1 * dy)); + } else { + CustomEntity.this.setAIMoveSpeed(f1 * 0.05F); + } + } else { + CustomEntity.this.setAIMoveSpeed(0); + CustomEntity.this.setMoveVertical(0); + CustomEntity.this.setMoveForward(0); + } + } + }; + this.navigator = new SwimmerPathNavigator(this, this.world); + } + + @Override + public IPacket createSpawnPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + + @Override + protected void registerGoals() { + super.registerGoals(); + this.goalSelector.addGoal(1, new RandomSwimmingGoal(this, 12, 40)); + this.goalSelector.addGoal(2, new AvoidEntityGoal(this, ServerPlayerEntity.class, (float) 6, 16, 12)); + this.goalSelector.addGoal(3, new AvoidEntityGoal(this, TigerFishEntity.CustomEntity.class, (float) 6, 12, 12)); + } + + @Override + public CreatureAttribute getCreatureAttribute() { + return CreatureAttribute.WATER; + } + + protected void dropSpecialItems(DamageSource source, int looting, boolean recentlyHitIn) { + super.dropSpecialItems(source, looting, recentlyHitIn); + this.entityDropItem(new ItemStack(TigerFishItemItem.block)); + } + + @Override + public net.minecraft.util.SoundEvent getAmbientSound() { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("block.bubble_column.bubble_pop")); + } + + @Override + public void playStepSound(BlockPos pos, BlockState blockIn) { + this.playSound((net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS + .getValue(new ResourceLocation("ambient.underwater.loop.additions.ultra_rare")), 0.15f, 1); + } + + @Override + public net.minecraft.util.SoundEvent getHurtSound(DamageSource ds) { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.generic.hurt")); + } + + @Override + public net.minecraft.util.SoundEvent getDeathSound() { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.generic.death")); + } + + @Override + public boolean attackEntityFrom(DamageSource source, float amount) { + if (source == DamageSource.FALL) + return false; + if (source == DamageSource.CACTUS) + return false; + if (source == DamageSource.DROWN) + return false; + if (source == DamageSource.LIGHTNING_BOLT) + return false; + if (source == DamageSource.DRAGON_BREATH) + return false; + return super.attackEntityFrom(source, amount); + } + + @Override + public void baseTick() { + super.baseTick(); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + + TigerFishOnEntityTickUpdateProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + + @Override + public boolean canBreatheUnderwater() { + return true; + } + + @Override + public boolean isNotColliding(IWorldReader world) { + return world.checkNoEntityCollision(this); + } + + @Override + public boolean isPushedByWater() { + return false; + } + } +} diff --git a/src/main/java/studio/halbear/hem/entity/HotAirBalloonEntity.java b/src/main/java/studio/halbear/hem/entity/HotAirBalloonEntity.java new file mode 100644 index 0000000..c0b0f7e --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/HotAirBalloonEntity.java @@ -0,0 +1,219 @@ + +package studio.halbear.hem.entity; + +import studio.halbear.hem.procedures.HotAirBalloonRightClickedOnEntityProcedure; +import studio.halbear.hem.procedures.HotAirBalloonOnInitialEntitySpawnProcedure; +import studio.halbear.hem.procedures.HotAirBalloonOnEntityTickUpdateProcedure; +import studio.halbear.hem.entity.renderer.HotAirBalloonRenderer; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.fml.network.NetworkHooks; +import net.minecraftforge.fml.network.FMLPlayMessages; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.entity.EntityAttributeCreationEvent; + +import net.minecraft.world.World; +import net.minecraft.world.IServerWorld; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Hand; +import net.minecraft.util.DamageSource; +import net.minecraft.util.ActionResultType; +import net.minecraft.pathfinding.FlyingPathNavigator; +import net.minecraft.network.IPacket; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.item.ItemStack; +import net.minecraft.entity.projectile.PotionEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.ai.goal.SwimGoal; +import net.minecraft.entity.ai.controller.FlyingMovementController; +import net.minecraft.entity.ai.attributes.Attributes; +import net.minecraft.entity.ai.attributes.AttributeModifierMap; +import net.minecraft.entity.SpawnReason; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.ILivingEntityData; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.EntityClassification; +import net.minecraft.entity.Entity; +import net.minecraft.entity.CreatureEntity; +import net.minecraft.entity.CreatureAttribute; +import net.minecraft.entity.AreaEffectCloudEntity; +import net.minecraft.block.BlockState; + +import javax.annotation.Nullable; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class HotAirBalloonEntity extends HemModElements.ModElement { + public static EntityType entity = (EntityType.Builder.create(CustomEntity::new, EntityClassification.MONSTER) + .setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(3).setCustomClientFactory(CustomEntity::new).size(3f, 8f)) + .build("hot_air_balloon").setRegistryName("hot_air_balloon"); + + public HotAirBalloonEntity(HemModElements instance) { + super(instance, 163); + FMLJavaModLoadingContext.get().getModEventBus().register(new HotAirBalloonRenderer.ModelRegisterHandler()); + FMLJavaModLoadingContext.get().getModEventBus().register(new EntityAttributesRegisterHandler()); + } + + @Override + public void initElements() { + elements.entities.add(() -> entity); + } + + @Override + public void init(FMLCommonSetupEvent event) { + } + + private static class EntityAttributesRegisterHandler { + @SubscribeEvent + public void onEntityAttributeCreation(EntityAttributeCreationEvent event) { + AttributeModifierMap.MutableAttribute ammma = MobEntity.func_233666_p_(); + ammma = ammma.createMutableAttribute(Attributes.MOVEMENT_SPEED, 0.3); + ammma = ammma.createMutableAttribute(Attributes.MAX_HEALTH, 10); + ammma = ammma.createMutableAttribute(Attributes.ARMOR, 0); + ammma = ammma.createMutableAttribute(Attributes.ATTACK_DAMAGE, 3); + ammma = ammma.createMutableAttribute(Attributes.FOLLOW_RANGE, 16); + ammma = ammma.createMutableAttribute(Attributes.FLYING_SPEED, 0.3); + event.put(entity, ammma.create()); + } + } + + public static class CustomEntity extends CreatureEntity { + public CustomEntity(FMLPlayMessages.SpawnEntity packet, World world) { + this(entity, world); + } + + public CustomEntity(EntityType type, World world) { + super(type, world); + experienceValue = 0; + setNoAI(false); + enablePersistence(); + this.moveController = new FlyingMovementController(this, 10, true); + this.navigator = new FlyingPathNavigator(this, this.world); + } + + @Override + public IPacket createSpawnPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + + @Override + protected void registerGoals() { + super.registerGoals(); + this.goalSelector.addGoal(1, new SwimGoal(this)); + } + + @Override + public CreatureAttribute getCreatureAttribute() { + return CreatureAttribute.UNDEFINED; + } + + @Override + public boolean canDespawn(double distanceToClosestPlayer) { + return false; + } + + @Override + public double getMountedYOffset() { + return super.getMountedYOffset() + -5.8; + } + + @Override + public net.minecraft.util.SoundEvent getHurtSound(DamageSource ds) { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.generic.hurt")); + } + + @Override + public net.minecraft.util.SoundEvent getDeathSound() { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.generic.death")); + } + + @Override + public boolean onLivingFall(float l, float d) { + return false; + } + + @Override + public boolean attackEntityFrom(DamageSource source, float amount) { + if (source.getImmediateSource() instanceof PotionEntity || source.getImmediateSource() instanceof AreaEffectCloudEntity) + return false; + if (source == DamageSource.DROWN) + return false; + if (source == DamageSource.DRAGON_BREATH) + return false; + if (source == DamageSource.WITHER) + return false; + if (source.getDamageType().equals("witherSkull")) + return false; + return super.attackEntityFrom(source, amount); + } + + @Override + public ILivingEntityData onInitialSpawn(IServerWorld world, DifficultyInstance difficulty, SpawnReason reason, + @Nullable ILivingEntityData livingdata, @Nullable CompoundNBT tag) { + ILivingEntityData retval = super.onInitialSpawn(world, difficulty, reason, livingdata, tag); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + + HotAirBalloonOnInitialEntitySpawnProcedure + .executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + return retval; + } + + @Override + public ActionResultType func_230254_b_(PlayerEntity sourceentity, Hand hand) { + ItemStack itemstack = sourceentity.getHeldItem(hand); + ActionResultType retval = ActionResultType.func_233537_a_(this.world.isRemote()); + super.func_230254_b_(sourceentity, hand); + sourceentity.startRiding(this); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + + HotAirBalloonRightClickedOnEntityProcedure.executeProcedure( + Stream.of(new AbstractMap.SimpleEntry<>("entity", entity), new AbstractMap.SimpleEntry<>("sourceentity", sourceentity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + return retval; + } + + @Override + public void baseTick() { + super.baseTick(); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + + HotAirBalloonOnEntityTickUpdateProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + + @Override + protected void updateFallState(double y, boolean onGroundIn, BlockState state, BlockPos pos) { + } + + @Override + public void setNoGravity(boolean ignored) { + super.setNoGravity(true); + } + + public void livingTick() { + super.livingTick(); + this.setNoGravity(true); + } + } +} diff --git a/src/main/java/studio/halbear/hem/entity/LadyBugInFlightEntity.java b/src/main/java/studio/halbear/hem/entity/LadyBugInFlightEntity.java new file mode 100644 index 0000000..ae363f7 --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/LadyBugInFlightEntity.java @@ -0,0 +1,185 @@ + +package studio.halbear.hem.entity; + +import studio.halbear.hem.procedures.LadyBugInFlightOnEntityTickUpdateProcedure; +import studio.halbear.hem.entity.renderer.LadyBugInFlightRenderer; +import studio.halbear.hem.block.BlueleafWheatBlock; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.fml.network.NetworkHooks; +import net.minecraftforge.fml.network.FMLPlayMessages; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.entity.EntityAttributeCreationEvent; + +import net.minecraft.world.World; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.DamageSource; +import net.minecraft.pathfinding.FlyingPathNavigator; +import net.minecraft.network.IPacket; +import net.minecraft.entity.projectile.PotionEntity; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.ai.goal.SwimGoal; +import net.minecraft.entity.ai.goal.RandomWalkingGoal; +import net.minecraft.entity.ai.goal.LookRandomlyGoal; +import net.minecraft.entity.ai.goal.BreakBlockGoal; +import net.minecraft.entity.ai.goal.AvoidEntityGoal; +import net.minecraft.entity.ai.controller.FlyingMovementController; +import net.minecraft.entity.ai.attributes.Attributes; +import net.minecraft.entity.ai.attributes.AttributeModifierMap; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.EntityClassification; +import net.minecraft.entity.Entity; +import net.minecraft.entity.CreatureEntity; +import net.minecraft.entity.CreatureAttribute; +import net.minecraft.entity.AreaEffectCloudEntity; +import net.minecraft.block.BlockState; + +import java.util.stream.Stream; +import java.util.Random; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class LadyBugInFlightEntity extends HemModElements.ModElement { + public static EntityType entity = (EntityType.Builder.create(CustomEntity::new, EntityClassification.AMBIENT) + .setShouldReceiveVelocityUpdates(true).setTrackingRange(32).setUpdateInterval(3).setCustomClientFactory(CustomEntity::new) + .size(0.4f, 0.3f)).build("lady_bug_in_flight").setRegistryName("lady_bug_in_flight"); + + public LadyBugInFlightEntity(HemModElements instance) { + super(instance, 38); + FMLJavaModLoadingContext.get().getModEventBus().register(new LadyBugInFlightRenderer.ModelRegisterHandler()); + FMLJavaModLoadingContext.get().getModEventBus().register(new EntityAttributesRegisterHandler()); + } + + @Override + public void initElements() { + elements.entities.add(() -> entity); + } + + @Override + public void init(FMLCommonSetupEvent event) { + } + + private static class EntityAttributesRegisterHandler { + @SubscribeEvent + public void onEntityAttributeCreation(EntityAttributeCreationEvent event) { + AttributeModifierMap.MutableAttribute ammma = MobEntity.func_233666_p_(); + ammma = ammma.createMutableAttribute(Attributes.MOVEMENT_SPEED, 0.5); + ammma = ammma.createMutableAttribute(Attributes.MAX_HEALTH, 2); + ammma = ammma.createMutableAttribute(Attributes.ARMOR, 1); + ammma = ammma.createMutableAttribute(Attributes.ATTACK_DAMAGE, 0); + ammma = ammma.createMutableAttribute(Attributes.FOLLOW_RANGE, 8); + ammma = ammma.createMutableAttribute(Attributes.KNOCKBACK_RESISTANCE, 5); + ammma = ammma.createMutableAttribute(Attributes.FLYING_SPEED, 0.5); + event.put(entity, ammma.create()); + } + } + + public static class CustomEntity extends CreatureEntity { + public CustomEntity(FMLPlayMessages.SpawnEntity packet, World world) { + this(entity, world); + } + + public CustomEntity(EntityType type, World world) { + super(type, world); + experienceValue = 0; + setNoAI(false); + this.moveController = new FlyingMovementController(this, 10, true); + this.navigator = new FlyingPathNavigator(this, this.world); + } + + @Override + public IPacket createSpawnPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + + @Override + protected void registerGoals() { + super.registerGoals(); + this.goalSelector.addGoal(1, new AvoidEntityGoal(this, GiantButterflyEntity.CustomEntity.class, (float) 6, 1.3, 1)); + this.goalSelector.addGoal(2, new AvoidEntityGoal(this, ServerPlayerEntity.class, (float) 6, 1, 0.6)); + this.goalSelector.addGoal(3, new RandomWalkingGoal(this, 0.8, 20) { + @Override + protected Vector3d getPosition() { + Random random = CustomEntity.this.getRNG(); + double dir_x = CustomEntity.this.getPosX() + ((random.nextFloat() * 2 - 1) * 16); + double dir_y = CustomEntity.this.getPosY() + ((random.nextFloat() * 2 - 1) * 16); + double dir_z = CustomEntity.this.getPosZ() + ((random.nextFloat() * 2 - 1) * 16); + return new Vector3d(dir_x, dir_y, dir_z); + } + }); + this.goalSelector.addGoal(4, new BreakBlockGoal(BlueleafWheatBlock.block, this, 1, (int) 3)); + this.goalSelector.addGoal(5, new LookRandomlyGoal(this)); + this.goalSelector.addGoal(6, new SwimGoal(this)); + } + + @Override + public CreatureAttribute getCreatureAttribute() { + return CreatureAttribute.UNDEFINED; + } + + @Override + public net.minecraft.util.SoundEvent getAmbientSound() { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.bee.pollinate")); + } + + @Override + public net.minecraft.util.SoundEvent getHurtSound(DamageSource ds) { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.bee.hurt")); + } + + @Override + public net.minecraft.util.SoundEvent getDeathSound() { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.bee.death")); + } + + @Override + public boolean onLivingFall(float l, float d) { + return false; + } + + @Override + public boolean attackEntityFrom(DamageSource source, float amount) { + if (source.getImmediateSource() instanceof PotionEntity || source.getImmediateSource() instanceof AreaEffectCloudEntity) + return false; + if (source == DamageSource.FALL) + return false; + return super.attackEntityFrom(source, amount); + } + + @Override + public void baseTick() { + super.baseTick(); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + + LadyBugInFlightOnEntityTickUpdateProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + + @Override + protected void updateFallState(double y, boolean onGroundIn, BlockState state, BlockPos pos) { + } + + @Override + public void setNoGravity(boolean ignored) { + super.setNoGravity(true); + } + + public void livingTick() { + super.livingTick(); + this.setNoGravity(true); + } + } +} diff --git a/src/main/java/studio/halbear/hem/entity/LadybugEntity.java b/src/main/java/studio/halbear/hem/entity/LadybugEntity.java new file mode 100644 index 0000000..9ec8595 --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/LadybugEntity.java @@ -0,0 +1,173 @@ + +package studio.halbear.hem.entity; + +import studio.halbear.hem.procedures.LadybugOnEntityTickUpdateProcedure; +import studio.halbear.hem.entity.renderer.LadybugRenderer; +import studio.halbear.hem.block.AntsBlock; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.fml.network.NetworkHooks; +import net.minecraftforge.fml.network.FMLPlayMessages; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.entity.EntityAttributeCreationEvent; +import net.minecraftforge.common.MinecraftForge; + +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.biome.MobSpawnInfo; +import net.minecraft.world.World; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.DamageSource; +import net.minecraft.network.IPacket; +import net.minecraft.entity.projectile.PotionEntity; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.ai.goal.WaterAvoidingRandomWalkingGoal; +import net.minecraft.entity.ai.goal.SwimGoal; +import net.minecraft.entity.ai.goal.RandomWalkingGoal; +import net.minecraft.entity.ai.goal.LookRandomlyGoal; +import net.minecraft.entity.ai.goal.BreakBlockGoal; +import net.minecraft.entity.ai.goal.AvoidEntityGoal; +import net.minecraft.entity.ai.attributes.Attributes; +import net.minecraft.entity.ai.attributes.AttributeModifierMap; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.EntitySpawnPlacementRegistry; +import net.minecraft.entity.EntityClassification; +import net.minecraft.entity.Entity; +import net.minecraft.entity.CreatureEntity; +import net.minecraft.entity.CreatureAttribute; +import net.minecraft.entity.AreaEffectCloudEntity; +import net.minecraft.block.material.Material; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class LadybugEntity extends HemModElements.ModElement { + public static EntityType entity = (EntityType.Builder.create(CustomEntity::new, EntityClassification.CREATURE) + .setShouldReceiveVelocityUpdates(true).setTrackingRange(32).setUpdateInterval(3).setCustomClientFactory(CustomEntity::new) + .size(0.4f, 0.3f)).build("ladybug").setRegistryName("ladybug"); + + public LadybugEntity(HemModElements instance) { + super(instance, 37); + FMLJavaModLoadingContext.get().getModEventBus().register(new LadybugRenderer.ModelRegisterHandler()); + FMLJavaModLoadingContext.get().getModEventBus().register(new EntityAttributesRegisterHandler()); + MinecraftForge.EVENT_BUS.register(this); + } + + @Override + public void initElements() { + elements.entities.add(() -> entity); + } + + @SubscribeEvent + public void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:blueleaf_hayfever_fields").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getSpawns().getSpawner(EntityClassification.CREATURE).add(new MobSpawnInfo.Spawners(entity, 20, 1, 3)); + } + + @Override + public void init(FMLCommonSetupEvent event) { + EntitySpawnPlacementRegistry.register(entity, EntitySpawnPlacementRegistry.PlacementType.ON_GROUND, Heightmap.Type.MOTION_BLOCKING_NO_LEAVES, + (entityType, world, reason, pos, + random) -> (world.getBlockState(pos.down()).getMaterial() == Material.ORGANIC && world.getLightSubtracted(pos, 0) > 8)); + } + + private static class EntityAttributesRegisterHandler { + @SubscribeEvent + public void onEntityAttributeCreation(EntityAttributeCreationEvent event) { + AttributeModifierMap.MutableAttribute ammma = MobEntity.func_233666_p_(); + ammma = ammma.createMutableAttribute(Attributes.MOVEMENT_SPEED, 0.4); + ammma = ammma.createMutableAttribute(Attributes.MAX_HEALTH, 2); + ammma = ammma.createMutableAttribute(Attributes.ARMOR, 1); + ammma = ammma.createMutableAttribute(Attributes.ATTACK_DAMAGE, 0); + ammma = ammma.createMutableAttribute(Attributes.FOLLOW_RANGE, 8); + ammma = ammma.createMutableAttribute(Attributes.KNOCKBACK_RESISTANCE, 5); + event.put(entity, ammma.create()); + } + } + + public static class CustomEntity extends CreatureEntity { + public CustomEntity(FMLPlayMessages.SpawnEntity packet, World world) { + this(entity, world); + } + + public CustomEntity(EntityType type, World world) { + super(type, world); + experienceValue = 0; + setNoAI(false); + } + + @Override + public IPacket createSpawnPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + + @Override + protected void registerGoals() { + super.registerGoals(); + this.goalSelector.addGoal(1, new AvoidEntityGoal(this, ServerPlayerEntity.class, (float) 6, 1, 0.6)); + this.goalSelector.addGoal(2, new BreakBlockGoal(AntsBlock.block, this, 1, (int) 3)); + this.goalSelector.addGoal(3, new WaterAvoidingRandomWalkingGoal(this, 0.4)); + this.goalSelector.addGoal(4, new RandomWalkingGoal(this, 0.4)); + this.goalSelector.addGoal(5, new LookRandomlyGoal(this)); + this.goalSelector.addGoal(6, new SwimGoal(this)); + } + + @Override + public CreatureAttribute getCreatureAttribute() { + return CreatureAttribute.UNDEFINED; + } + + @Override + public net.minecraft.util.SoundEvent getAmbientSound() { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.bee.pollinate")); + } + + @Override + public net.minecraft.util.SoundEvent getHurtSound(DamageSource ds) { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.bee.hurt")); + } + + @Override + public net.minecraft.util.SoundEvent getDeathSound() { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.bee.death")); + } + + @Override + public boolean attackEntityFrom(DamageSource source, float amount) { + if (source.getImmediateSource() instanceof PotionEntity || source.getImmediateSource() instanceof AreaEffectCloudEntity) + return false; + if (source == DamageSource.FALL) + return false; + return super.attackEntityFrom(source, amount); + } + + @Override + public void baseTick() { + super.baseTick(); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + + LadybugOnEntityTickUpdateProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/entity/TigerFishEntity.java b/src/main/java/studio/halbear/hem/entity/TigerFishEntity.java new file mode 100644 index 0000000..eb40e16 --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/TigerFishEntity.java @@ -0,0 +1,274 @@ + +package studio.halbear.hem.entity; + +import studio.halbear.hem.procedures.TigerFishOnEntityTickUpdateProcedure; +import studio.halbear.hem.item.TigerFishItemItem; +import studio.halbear.hem.entity.renderer.TigerFishRenderer; +import studio.halbear.hem.block.GiantLilyPadBlock; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.fml.network.NetworkHooks; +import net.minecraftforge.fml.network.FMLPlayMessages; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.entity.EntityAttributeCreationEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.ForgeMod; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.biome.MobSpawnInfo; +import net.minecraft.world.World; +import net.minecraft.world.IWorldReader; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.DamageSource; +import net.minecraft.pathfinding.SwimmerPathNavigator; +import net.minecraft.pathfinding.PathNodeType; +import net.minecraft.network.IPacket; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.item.SpawnEggItem; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.Item; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.passive.SquidEntity; +import net.minecraft.entity.passive.AnimalEntity; +import net.minecraft.entity.ai.goal.TemptGoal; +import net.minecraft.entity.ai.goal.RestrictSunGoal; +import net.minecraft.entity.ai.goal.RandomSwimmingGoal; +import net.minecraft.entity.ai.goal.NearestAttackableTargetGoal; +import net.minecraft.entity.ai.goal.HurtByTargetGoal; +import net.minecraft.entity.ai.goal.BreedGoal; +import net.minecraft.entity.ai.goal.AvoidEntityGoal; +import net.minecraft.entity.ai.controller.MovementController; +import net.minecraft.entity.ai.attributes.Attributes; +import net.minecraft.entity.ai.attributes.AttributeModifierMap; +import net.minecraft.entity.SpawnReason; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.ILivingEntityData; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.EntitySpawnPlacementRegistry; +import net.minecraft.entity.EntityClassification; +import net.minecraft.entity.Entity; +import net.minecraft.entity.CreatureAttribute; +import net.minecraft.entity.AgeableEntity; +import net.minecraft.block.BlockState; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class TigerFishEntity extends HemModElements.ModElement { + public static EntityType entity = (EntityType.Builder.create(CustomEntity::new, EntityClassification.WATER_CREATURE) + .setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(3).setCustomClientFactory(CustomEntity::new).size(1f, 0.4f)) + .build("tiger_fish").setRegistryName("tiger_fish"); + + public TigerFishEntity(HemModElements instance) { + super(instance, 122); + FMLJavaModLoadingContext.get().getModEventBus().register(new TigerFishRenderer.ModelRegisterHandler()); + FMLJavaModLoadingContext.get().getModEventBus().register(new EntityAttributesRegisterHandler()); + MinecraftForge.EVENT_BUS.register(this); + } + + @Override + public void initElements() { + elements.entities.add(() -> entity); + elements.items + .add(() -> new SpawnEggItem(entity, -1, -1, new Item.Properties().group(ItemGroup.MISC)).setRegistryName("tiger_fish_spawn_egg")); + } + + @SubscribeEvent + public void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getSpawns().getSpawner(EntityClassification.WATER_CREATURE).add(new MobSpawnInfo.Spawners(entity, 15, 1, 4)); + } + + @Override + public void init(FMLCommonSetupEvent event) { + EntitySpawnPlacementRegistry.register(entity, EntitySpawnPlacementRegistry.PlacementType.IN_WATER, Heightmap.Type.MOTION_BLOCKING_NO_LEAVES, + SquidEntity::func_223365_b); + } + + private static class EntityAttributesRegisterHandler { + @SubscribeEvent + public void onEntityAttributeCreation(EntityAttributeCreationEvent event) { + AttributeModifierMap.MutableAttribute ammma = MobEntity.func_233666_p_(); + ammma = ammma.createMutableAttribute(Attributes.MOVEMENT_SPEED, 0.3); + ammma = ammma.createMutableAttribute(Attributes.MAX_HEALTH, 20); + ammma = ammma.createMutableAttribute(Attributes.ARMOR, 3); + ammma = ammma.createMutableAttribute(Attributes.ATTACK_DAMAGE, 6); + ammma = ammma.createMutableAttribute(Attributes.FOLLOW_RANGE, 16); + ammma = ammma.createMutableAttribute(Attributes.KNOCKBACK_RESISTANCE, 0.5); + ammma = ammma.createMutableAttribute(Attributes.ATTACK_KNOCKBACK, 0.3); + ammma = ammma.createMutableAttribute(ForgeMod.SWIM_SPEED.get(), 0.5); + event.put(entity, ammma.create()); + } + } + + public static class CustomEntity extends AnimalEntity { + public CustomEntity(FMLPlayMessages.SpawnEntity packet, World world) { + this(entity, world); + } + + public CustomEntity(EntityType type, World world) { + super(type, world); + experienceValue = 0; + setNoAI(false); + this.setPathPriority(PathNodeType.WATER, 0); + this.moveController = new MovementController(this) { + @Override + public void tick() { + if (CustomEntity.this.isInWater()) + CustomEntity.this.setMotion(CustomEntity.this.getMotion().add(0, 0.005, 0)); + if (this.action == MovementController.Action.MOVE_TO && !CustomEntity.this.getNavigator().noPath()) { + double dx = this.posX - CustomEntity.this.getPosX(); + double dy = this.posY - CustomEntity.this.getPosY(); + double dz = this.posZ - CustomEntity.this.getPosZ(); + float f = (float) (MathHelper.atan2(dz, dx) * (double) (180 / Math.PI)) - 90; + float f1 = (float) (this.speed * CustomEntity.this.getAttribute(Attributes.MOVEMENT_SPEED).getValue()); + CustomEntity.this.rotationYaw = this.limitAngle(CustomEntity.this.rotationYaw, f, 10); + CustomEntity.this.renderYawOffset = CustomEntity.this.rotationYaw; + CustomEntity.this.rotationYawHead = CustomEntity.this.rotationYaw; + if (CustomEntity.this.isInWater()) { + CustomEntity.this.setAIMoveSpeed((float) CustomEntity.this.getAttribute(Attributes.MOVEMENT_SPEED).getValue()); + float f2 = -(float) (MathHelper.atan2(dy, MathHelper.sqrt(dx * dx + dz * dz)) * (180F / Math.PI)); + f2 = MathHelper.clamp(MathHelper.wrapDegrees(f2), -85, 85); + CustomEntity.this.rotationPitch = this.limitAngle(CustomEntity.this.rotationPitch, f2, 5); + float f3 = MathHelper.cos(CustomEntity.this.rotationPitch * (float) (Math.PI / 180.0)); + CustomEntity.this.setMoveForward(f3 * f1); + CustomEntity.this.setMoveVertical((float) (f1 * dy)); + } else { + CustomEntity.this.setAIMoveSpeed(f1 * 0.05F); + } + } else { + CustomEntity.this.setAIMoveSpeed(0); + CustomEntity.this.setMoveVertical(0); + CustomEntity.this.setMoveForward(0); + } + } + }; + this.navigator = new SwimmerPathNavigator(this, this.world); + } + + @Override + public IPacket createSpawnPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + + @Override + protected void registerGoals() { + super.registerGoals(); + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal(this, GoldFishEntity.CustomEntity.class, false, true)); + this.goalSelector.addGoal(2, new TemptGoal(this, 8, Ingredient.fromItems(GiantLilyPadBlock.block.asItem()), true)); + this.goalSelector.addGoal(3, new AvoidEntityGoal(this, ServerPlayerEntity.class, (float) 6, 8, 8)); + this.goalSelector.addGoal(4, new RandomSwimmingGoal(this, 8, 40)); + this.goalSelector.addGoal(5, new RestrictSunGoal(this)); + this.goalSelector.addGoal(6, new BreedGoal(this, 1)); + this.targetSelector.addGoal(7, new HurtByTargetGoal(this).setCallsForHelp()); + } + + @Override + public CreatureAttribute getCreatureAttribute() { + return CreatureAttribute.WATER; + } + + protected void dropSpecialItems(DamageSource source, int looting, boolean recentlyHitIn) { + super.dropSpecialItems(source, looting, recentlyHitIn); + this.entityDropItem(new ItemStack(TigerFishItemItem.block)); + } + + @Override + public net.minecraft.util.SoundEvent getAmbientSound() { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("block.bubble_column.bubble_pop")); + } + + @Override + public void playStepSound(BlockPos pos, BlockState blockIn) { + this.playSound((net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS + .getValue(new ResourceLocation("ambient.underwater.loop.additions.ultra_rare")), 0.15f, 1); + } + + @Override + public net.minecraft.util.SoundEvent getHurtSound(DamageSource ds) { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.generic.hurt")); + } + + @Override + public net.minecraft.util.SoundEvent getDeathSound() { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.generic.death")); + } + + @Override + public boolean attackEntityFrom(DamageSource source, float amount) { + if (source == DamageSource.FALL) + return false; + if (source == DamageSource.CACTUS) + return false; + if (source == DamageSource.DROWN) + return false; + if (source == DamageSource.LIGHTNING_BOLT) + return false; + if (source == DamageSource.DRAGON_BREATH) + return false; + return super.attackEntityFrom(source, amount); + } + + @Override + public void baseTick() { + super.baseTick(); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + + TigerFishOnEntityTickUpdateProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + + @Override + public AgeableEntity func_241840_a(ServerWorld serverWorld, AgeableEntity ageable) { + CustomEntity retval = (CustomEntity) entity.create(serverWorld); + retval.onInitialSpawn(serverWorld, serverWorld.getDifficultyForLocation(new BlockPos(retval.getPosition())), SpawnReason.BREEDING, + (ILivingEntityData) null, (CompoundNBT) null); + return retval; + } + + @Override + public boolean isBreedingItem(ItemStack stack) { + if (stack == null) + return false; + if (GiantLilyPadBlock.block.asItem() == stack.getItem()) + return true; + return false; + } + + @Override + public boolean canBreatheUnderwater() { + return true; + } + + @Override + public boolean isNotColliding(IWorldReader world) { + return world.checkNoEntityCollision(this); + } + + @Override + public boolean isPushedByWater() { + return false; + } + } +} diff --git a/src/main/java/studio/halbear/hem/entity/renderer/AirboatRenderer.java b/src/main/java/studio/halbear/hem/entity/renderer/AirboatRenderer.java new file mode 100644 index 0000000..3682040 --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/renderer/AirboatRenderer.java @@ -0,0 +1,2675 @@ + +package studio.halbear.hem.entity.renderer; + +import studio.halbear.hem.entity.AirboatEntity; + +import net.minecraftforge.fml.client.registry.RenderingRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.util.ResourceLocation; +import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.model.ModelRenderer; +import net.minecraft.client.renderer.entity.model.EntityModel; +import net.minecraft.client.renderer.entity.MobRenderer; + +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.mojang.blaze3d.matrix.MatrixStack; + +@OnlyIn(Dist.CLIENT) +public class AirboatRenderer { + public static class ModelRegisterHandler { + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public void registerModels(ModelRegistryEvent event) { + RenderingRegistry.registerEntityRenderingHandler(AirboatEntity.entity, renderManager -> { + return new MobRenderer(renderManager, new ModelAirboat(), 5f) { + + @Override + public ResourceLocation getEntityTexture(Entity entity) { + return new ResourceLocation("hem:textures/entities/airboat.png"); + } + }; + }); + } + } + + // Made with Blockbench 5.0.7 + // Exported for Minecraft version 1.15 - 1.16 with MCP mappings + // Paste this class into your mod and generate all required imports + public static class ModelAirboat extends EntityModel { + private final ModelRenderer bone; + private final ModelRenderer cube_r1; + private final ModelRenderer cube_r2; + private final ModelRenderer cube_r3; + private final ModelRenderer cube_r4; + private final ModelRenderer cube_r5; + private final ModelRenderer cube_r6; + private final ModelRenderer cube_r7; + private final ModelRenderer cube_r8; + private final ModelRenderer cube_r9; + private final ModelRenderer cube_r10; + private final ModelRenderer cube_r11; + private final ModelRenderer cube_r12; + private final ModelRenderer cube_r13; + private final ModelRenderer cube_r14; + private final ModelRenderer cube_r15; + private final ModelRenderer cube_r16; + private final ModelRenderer bone5; + private final ModelRenderer cube_r17; + private final ModelRenderer cube_r18; + private final ModelRenderer cube_r19; + private final ModelRenderer cube_r20; + private final ModelRenderer cube_r21; + private final ModelRenderer cube_r22; + private final ModelRenderer cube_r23; + private final ModelRenderer cube_r24; + private final ModelRenderer cube_r25; + private final ModelRenderer cube_r26; + private final ModelRenderer cube_r27; + private final ModelRenderer cube_r28; + private final ModelRenderer cube_r29; + private final ModelRenderer cube_r30; + private final ModelRenderer cube_r31; + private final ModelRenderer cube_r32; + private final ModelRenderer bone6; + private final ModelRenderer cube_r33; + private final ModelRenderer cube_r34; + private final ModelRenderer cube_r35; + private final ModelRenderer cube_r36; + private final ModelRenderer cube_r37; + private final ModelRenderer cube_r38; + private final ModelRenderer cube_r39; + private final ModelRenderer cube_r40; + private final ModelRenderer cube_r41; + private final ModelRenderer cube_r42; + private final ModelRenderer cube_r43; + private final ModelRenderer cube_r44; + private final ModelRenderer cube_r45; + private final ModelRenderer cube_r46; + private final ModelRenderer cube_r47; + private final ModelRenderer cube_r48; + private final ModelRenderer bone7; + private final ModelRenderer cube_r49; + private final ModelRenderer cube_r50; + private final ModelRenderer cube_r51; + private final ModelRenderer cube_r52; + private final ModelRenderer cube_r53; + private final ModelRenderer cube_r54; + private final ModelRenderer cube_r55; + private final ModelRenderer cube_r56; + private final ModelRenderer cube_r57; + private final ModelRenderer cube_r58; + private final ModelRenderer cube_r59; + private final ModelRenderer cube_r60; + private final ModelRenderer cube_r61; + private final ModelRenderer cube_r62; + private final ModelRenderer cube_r63; + private final ModelRenderer cube_r64; + private final ModelRenderer bone8; + private final ModelRenderer cube_r65; + private final ModelRenderer cube_r66; + private final ModelRenderer cube_r67; + private final ModelRenderer cube_r68; + private final ModelRenderer cube_r69; + private final ModelRenderer cube_r70; + private final ModelRenderer cube_r71; + private final ModelRenderer cube_r72; + private final ModelRenderer cube_r73; + private final ModelRenderer cube_r74; + private final ModelRenderer cube_r75; + private final ModelRenderer cube_r76; + private final ModelRenderer cube_r77; + private final ModelRenderer cube_r78; + private final ModelRenderer cube_r79; + private final ModelRenderer cube_r80; + private final ModelRenderer bone9; + private final ModelRenderer cube_r81; + private final ModelRenderer cube_r82; + private final ModelRenderer cube_r83; + private final ModelRenderer cube_r84; + private final ModelRenderer cube_r85; + private final ModelRenderer cube_r86; + private final ModelRenderer cube_r87; + private final ModelRenderer cube_r88; + private final ModelRenderer cube_r89; + private final ModelRenderer cube_r90; + private final ModelRenderer cube_r91; + private final ModelRenderer cube_r92; + private final ModelRenderer cube_r93; + private final ModelRenderer cube_r94; + private final ModelRenderer cube_r95; + private final ModelRenderer cube_r96; + private final ModelRenderer bone10; + private final ModelRenderer cube_r97; + private final ModelRenderer cube_r98; + private final ModelRenderer cube_r99; + private final ModelRenderer cube_r100; + private final ModelRenderer cube_r101; + private final ModelRenderer cube_r102; + private final ModelRenderer cube_r103; + private final ModelRenderer cube_r104; + private final ModelRenderer cube_r105; + private final ModelRenderer cube_r106; + private final ModelRenderer cube_r107; + private final ModelRenderer cube_r108; + private final ModelRenderer cube_r109; + private final ModelRenderer cube_r110; + private final ModelRenderer cube_r111; + private final ModelRenderer cube_r112; + private final ModelRenderer bone11; + private final ModelRenderer cube_r113; + private final ModelRenderer cube_r114; + private final ModelRenderer cube_r115; + private final ModelRenderer cube_r116; + private final ModelRenderer cube_r117; + private final ModelRenderer cube_r118; + private final ModelRenderer cube_r119; + private final ModelRenderer cube_r120; + private final ModelRenderer cube_r121; + private final ModelRenderer cube_r122; + private final ModelRenderer cube_r123; + private final ModelRenderer cube_r124; + private final ModelRenderer cube_r125; + private final ModelRenderer cube_r126; + private final ModelRenderer cube_r127; + private final ModelRenderer cube_r128; + private final ModelRenderer TailFin; + private final ModelRenderer cube_r129; + private final ModelRenderer cube_r130; + private final ModelRenderer cube_r131; + private final ModelRenderer cube_r132; + private final ModelRenderer cube_r133; + private final ModelRenderer cube_r134; + private final ModelRenderer cube_r135; + private final ModelRenderer TailFin4; + private final ModelRenderer cube_r136; + private final ModelRenderer cube_r137; + private final ModelRenderer cube_r138; + private final ModelRenderer cube_r139; + private final ModelRenderer cube_r140; + private final ModelRenderer cube_r141; + private final ModelRenderer cube_r142; + private final ModelRenderer TailFin2; + private final ModelRenderer cube_r143; + private final ModelRenderer cube_r144; + private final ModelRenderer cube_r145; + private final ModelRenderer cube_r146; + private final ModelRenderer cube_r147; + private final ModelRenderer cube_r148; + private final ModelRenderer cube_r149; + private final ModelRenderer cube_r150; + private final ModelRenderer TailFin3; + private final ModelRenderer cube_r151; + private final ModelRenderer cube_r152; + private final ModelRenderer cube_r153; + private final ModelRenderer cube_r154; + private final ModelRenderer cube_r155; + private final ModelRenderer cube_r156; + private final ModelRenderer cube_r157; + private final ModelRenderer cube_r158; + private final ModelRenderer bone2; + private final ModelRenderer bone31; + private final ModelRenderer bone35; + private final ModelRenderer cube_r159; + private final ModelRenderer bone36; + private final ModelRenderer cube_r160; + private final ModelRenderer cube_r161; + private final ModelRenderer cube_r162; + private final ModelRenderer bone37; + private final ModelRenderer cube_r163; + private final ModelRenderer bone23; + private final ModelRenderer bone24; + private final ModelRenderer cube_r164; + private final ModelRenderer bone78; + private final ModelRenderer cube_r165; + private final ModelRenderer cube_r166; + private final ModelRenderer cube_r167; + private final ModelRenderer bone79; + private final ModelRenderer cube_r168; + private final ModelRenderer bone14; + private final ModelRenderer bone15; + private final ModelRenderer cube_r169; + private final ModelRenderer bone16; + private final ModelRenderer cube_r170; + private final ModelRenderer cube_r171; + private final ModelRenderer cube_r172; + private final ModelRenderer bone22; + private final ModelRenderer cube_r173; + private final ModelRenderer bone70; + private final ModelRenderer bone71; + private final ModelRenderer bone77; + private final ModelRenderer cube_r174; + private final ModelRenderer bone80; + private final ModelRenderer cube_r175; + private final ModelRenderer cube_r176; + private final ModelRenderer cube_r177; + private final ModelRenderer bone81; + private final ModelRenderer cube_r178; + private final ModelRenderer bone82; + private final ModelRenderer bone83; + private final ModelRenderer cube_r179; + private final ModelRenderer bone84; + private final ModelRenderer cube_r180; + private final ModelRenderer cube_r181; + private final ModelRenderer cube_r182; + private final ModelRenderer bone85; + private final ModelRenderer cube_r183; + private final ModelRenderer bone86; + private final ModelRenderer bone87; + private final ModelRenderer cube_r184; + private final ModelRenderer bone88; + private final ModelRenderer cube_r185; + private final ModelRenderer cube_r186; + private final ModelRenderer cube_r187; + private final ModelRenderer bone89; + private final ModelRenderer cube_r188; + private final ModelRenderer bone55; + private final ModelRenderer bone56; + private final ModelRenderer bone57; + private final ModelRenderer cube_r189; + private final ModelRenderer bone58; + private final ModelRenderer cube_r190; + private final ModelRenderer cube_r191; + private final ModelRenderer cube_r192; + private final ModelRenderer bone59; + private final ModelRenderer cube_r193; + private final ModelRenderer bone60; + private final ModelRenderer bone61; + private final ModelRenderer cube_r194; + private final ModelRenderer bone62; + private final ModelRenderer cube_r195; + private final ModelRenderer cube_r196; + private final ModelRenderer cube_r197; + private final ModelRenderer bone63; + private final ModelRenderer cube_r198; + private final ModelRenderer bone64; + private final ModelRenderer bone65; + private final ModelRenderer cube_r199; + private final ModelRenderer bone66; + private final ModelRenderer cube_r200; + private final ModelRenderer cube_r201; + private final ModelRenderer cube_r202; + private final ModelRenderer bone69; + private final ModelRenderer cube_r203; + private final ModelRenderer bone20; + private final ModelRenderer bone33; + private final ModelRenderer bone34; + private final ModelRenderer cube_r204; + private final ModelRenderer bone38; + private final ModelRenderer cube_r205; + private final ModelRenderer cube_r206; + private final ModelRenderer cube_r207; + private final ModelRenderer bone39; + private final ModelRenderer cube_r208; + private final ModelRenderer bone52; + private final ModelRenderer cube_r209; + private final ModelRenderer bone51; + private final ModelRenderer cube_r210; + private final ModelRenderer cube_r211; + private final ModelRenderer cube_r212; + private final ModelRenderer bone50; + private final ModelRenderer cube_r213; + private final ModelRenderer bone28; + private final ModelRenderer cube_r214; + private final ModelRenderer bone29; + private final ModelRenderer cube_r215; + private final ModelRenderer cube_r216; + private final ModelRenderer cube_r217; + private final ModelRenderer bone30; + private final ModelRenderer cube_r218; + private final ModelRenderer bone27; + private final ModelRenderer cube_r219; + private final ModelRenderer bone44; + private final ModelRenderer cube_r220; + private final ModelRenderer cube_r221; + private final ModelRenderer cube_r222; + private final ModelRenderer bone67; + private final ModelRenderer cube_r223; + private final ModelRenderer bone68; + private final ModelRenderer cube_r224; + private final ModelRenderer bone49; + private final ModelRenderer bone17; + private final ModelRenderer bone18; + private final ModelRenderer bone21; + private final ModelRenderer cube_r225; + private final ModelRenderer bone25; + private final ModelRenderer cube_r226; + private final ModelRenderer cube_r227; + private final ModelRenderer cube_r228; + private final ModelRenderer bone26; + private final ModelRenderer cube_r229; + private final ModelRenderer bone32; + private final ModelRenderer cube_r230; + private final ModelRenderer bone40; + private final ModelRenderer cube_r231; + private final ModelRenderer cube_r232; + private final ModelRenderer cube_r233; + private final ModelRenderer bone41; + private final ModelRenderer cube_r234; + private final ModelRenderer bone42; + private final ModelRenderer cube_r235; + private final ModelRenderer bone43; + private final ModelRenderer cube_r236; + private final ModelRenderer cube_r237; + private final ModelRenderer cube_r238; + private final ModelRenderer bone45; + private final ModelRenderer cube_r239; + private final ModelRenderer bone46; + private final ModelRenderer cube_r240; + private final ModelRenderer bone47; + private final ModelRenderer cube_r241; + private final ModelRenderer cube_r242; + private final ModelRenderer cube_r243; + private final ModelRenderer bone48; + private final ModelRenderer cube_r244; + private final ModelRenderer bone53; + private final ModelRenderer bone54; + private final ModelRenderer bone3; + private final ModelRenderer cube_r245; + private final ModelRenderer cube_r246; + private final ModelRenderer cube_r247; + private final ModelRenderer cube_r248; + private final ModelRenderer cube_r249; + private final ModelRenderer cube_r250; + private final ModelRenderer cube_r251; + private final ModelRenderer cube_r252; + private final ModelRenderer cube_r253; + private final ModelRenderer bone12; + private final ModelRenderer cube_r254; + private final ModelRenderer cube_r255; + private final ModelRenderer cube_r256; + private final ModelRenderer cube_r257; + private final ModelRenderer cube_r258; + private final ModelRenderer cube_r259; + private final ModelRenderer cube_r260; + private final ModelRenderer bone13; + private final ModelRenderer cube_r261; + private final ModelRenderer cube_r262; + private final ModelRenderer cube_r263; + private final ModelRenderer cube_r264; + private final ModelRenderer cube_r265; + private final ModelRenderer cube_r266; + private final ModelRenderer cube_r267; + private final ModelRenderer bone19; + private final ModelRenderer cube_r268; + private final ModelRenderer cube_r269; + private final ModelRenderer cube_r270; + private final ModelRenderer cube_r271; + private final ModelRenderer cube_r272; + private final ModelRenderer cube_r273; + private final ModelRenderer cube_r274; + private final ModelRenderer bone4; + private final ModelRenderer cube_r275; + private final ModelRenderer cube_r276; + private final ModelRenderer Engine; + private final ModelRenderer cube_r277; + private final ModelRenderer Propeller; + private final ModelRenderer cube_r278; + private final ModelRenderer Engine2; + private final ModelRenderer cube_r279; + private final ModelRenderer Propeller2; + private final ModelRenderer cube_r280; + private final ModelRenderer SteeringWheel; + private final ModelRenderer bb_main; + private final ModelRenderer cube_r281; + private final ModelRenderer cube_r282; + private final ModelRenderer cube_r283; + private final ModelRenderer cube_r284; + private final ModelRenderer cube_r285; + private final ModelRenderer cube_r286; + private final ModelRenderer cube_r287; + private final ModelRenderer cube_r288; + private final ModelRenderer cube_r289; + private final ModelRenderer cube_r290; + private final ModelRenderer cube_r291; + private final ModelRenderer cube_r292; + private final ModelRenderer cube_r293; + private final ModelRenderer cube_r294; + private final ModelRenderer cube_r295; + private final ModelRenderer cube_r296; + private final ModelRenderer cube_r297; + private final ModelRenderer cube_r298; + private final ModelRenderer cube_r299; + private final ModelRenderer cube_r300; + private final ModelRenderer cube_r301; + private final ModelRenderer cube_r302; + private final ModelRenderer cube_r303; + private final ModelRenderer cube_r304; + private final ModelRenderer cube_r305; + private final ModelRenderer cube_r306; + private final ModelRenderer cube_r307; + private final ModelRenderer cube_r308; + private final ModelRenderer cube_r309; + private final ModelRenderer cube_r310; + private final ModelRenderer cube_r311; + private final ModelRenderer cube_r312; + private final ModelRenderer cube_r313; + private final ModelRenderer cube_r314; + private final ModelRenderer cube_r315; + private final ModelRenderer cube_r316; + private final ModelRenderer cube_r317; + private final ModelRenderer cube_r318; + private final ModelRenderer cube_r319; + private final ModelRenderer cube_r320; + private final ModelRenderer cube_r321; + private final ModelRenderer cube_r322; + private final ModelRenderer cube_r323; + private final ModelRenderer cube_r324; + private final ModelRenderer cube_r325; + private final ModelRenderer cube_r326; + private final ModelRenderer cube_r327; + private final ModelRenderer cube_r328; + private final ModelRenderer cube_r329; + private final ModelRenderer cube_r330; + private final ModelRenderer cube_r331; + private final ModelRenderer cube_r332; + private final ModelRenderer cube_r333; + private final ModelRenderer cube_r334; + private final ModelRenderer cube_r335; + private final ModelRenderer cube_r336; + private final ModelRenderer cube_r337; + private final ModelRenderer cube_r338; + private final ModelRenderer cube_r339; + private final ModelRenderer cube_r340; + private final ModelRenderer cube_r341; + private final ModelRenderer cube_r342; + private final ModelRenderer cube_r343; + private final ModelRenderer cube_r344; + private final ModelRenderer cube_r345; + private final ModelRenderer cube_r346; + private final ModelRenderer cube_r347; + private final ModelRenderer cube_r348; + private final ModelRenderer cube_r349; + private final ModelRenderer cube_r350; + private final ModelRenderer cube_r351; + + public ModelAirboat() { + textureWidth = 1024; + textureHeight = 1024; + bone = new ModelRenderer(this); + bone.setRotationPoint(0.0F, -55.0F, 3.4526F); + setRotationAngle(bone, -1.5708F, 0.0F, 1.5708F); + cube_r1 = new ModelRenderer(this); + cube_r1.setRotationPoint(6.8889F, 121.1344F, 2.6991F); + bone.addChild(cube_r1); + setRotationAngle(cube_r1, -1.0472F, 1.1781F, 0.0F); + cube_r1.setTextureOffset(367, 938).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 9.0F, 2.0F, 0.0F, false); + cube_r2 = new ModelRenderer(this); + cube_r2.setRotationPoint(24.5989F, 103.5691F, 10.0349F); + bone.addChild(cube_r2); + setRotationAngle(cube_r2, -0.829F, 1.1781F, 0.0F); + cube_r2.setTextureOffset(453, 925).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 26.0F, 2.0F, 0.0F, false); + cube_r3 = new ModelRenderer(this); + cube_r3.setRotationPoint(33.5341F, 88.388F, 13.736F); + bone.addChild(cube_r3); + setRotationAngle(cube_r3, -0.5672F, 1.1781F, 0.0F); + cube_r3.setTextureOffset(745, 870).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 18.0F, 2.0F, 0.0F, false); + cube_r4 = new ModelRenderer(this); + cube_r4.setRotationPoint(39.9239F, 66.4526F, 16.3827F); + bone.addChild(cube_r4); + setRotationAngle(cube_r4, -0.3054F, 1.1781F, 0.0F); + cube_r4.setTextureOffset(324, 711).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 23.0F, 2.0F, 0.0F, false); + cube_r5 = new ModelRenderer(this); + cube_r5.setRotationPoint(20.9799F, -162.2966F, 8.5358F); + bone.addChild(cube_r5); + setRotationAngle(cube_r5, 0.3927F, 1.1781F, 0.0F); + cube_r5.setTextureOffset(406, 883).addBox(-1.0F, -57.0F, -2.0F, 2.0F, 57.0F, 2.0F, 0.0F, false); + cube_r6 = new ModelRenderer(this); + cube_r6.setRotationPoint(33.6532F, -111.1026F, 13.7853F); + bone.addChild(cube_r6); + setRotationAngle(cube_r6, 0.2618F, 1.1781F, 0.0F); + cube_r6.setTextureOffset(307, 891).addBox(-1.0F, -53.0F, -2.0F, 2.0F, 53.0F, 2.0F, 0.0F, false); + cube_r7 = new ModelRenderer(this); + cube_r7.setRotationPoint(39.9239F, -59.5474F, 16.3827F); + bone.addChild(cube_r7); + setRotationAngle(cube_r7, 0.1309F, 1.1781F, 0.0F); + cube_r7.setTextureOffset(316, 891).addBox(-1.0F, -52.0F, -2.0F, 2.0F, 52.0F, 2.0F, 0.0F, false); + cube_r8 = new ModelRenderer(this); + cube_r8.setRotationPoint(0.0F, 3.4526F, 0.0F); + bone.addChild(cube_r8); + setRotationAngle(cube_r8, 0.0F, 1.1781F, 0.0F); + cube_r8.setTextureOffset(677, 870).addBox(-0.8574F, -63.0F, 41.1542F, 2.0F, 126.0F, 2.0F, 0.0F, false); + cube_r9 = new ModelRenderer(this); + cube_r9.setRotationPoint(0.0F, -135.8772F, 0.0F); + bone.addChild(cube_r9); + setRotationAngle(cube_r9, 3.1416F, 0.0F, 3.0194F); + cube_r9.setTextureOffset(555, 828).addBox(-29.407F, 29.5137F, -16.0F, 0.0F, 51.0F, 32.0F, 0.0F, false); + cube_r10 = new ModelRenderer(this); + cube_r10.setRotationPoint(0.0F, -135.8772F, 0.0F); + bone.addChild(cube_r10); + setRotationAngle(cube_r10, 3.1416F, 0.0F, 2.9016F); + cube_r10.setTextureOffset(620, 870).addBox(-25.7342F, -20.2344F, -14.0F, 0.0F, 53.0F, 28.0F, 0.0F, false); + cube_r11 = new ModelRenderer(this); + cube_r11.setRotationPoint(0.0F, -135.8772F, 0.0F); + bone.addChild(cube_r11); + setRotationAngle(cube_r11, 3.1416F, 0.0F, 2.7794F); + cube_r11.setTextureOffset(697, 870).addBox(-28.0084F, -70.9474F, -9.0F, 0.0F, 54.0F, 18.0F, 0.0F, false); + cube_r12 = new ModelRenderer(this); + cube_r12.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone.addChild(cube_r12); + setRotationAngle(cube_r12, -3.1416F, 0.0F, -2.8362F); + cube_r12.setTextureOffset(326, 883).addBox(-27.3317F, -43.0098F, -16.0F, 0.0F, 22.0F, 32.0F, 0.0F, false); + cube_r13 = new ModelRenderer(this); + cube_r13.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone.addChild(cube_r13); + setRotationAngle(cube_r13, 3.1416F, 0.0F, -2.618F); + cube_r13.setTextureOffset(0, 902).addBox(-22.1365F, -26.4274F, -13.0F, 0.0F, 17.0F, 26.0F, 0.0F, false); + cube_r14 = new ModelRenderer(this); + cube_r14.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone.addChild(cube_r14); + setRotationAngle(cube_r14, 3.1416F, 0.0F, -2.3562F); + cube_r14.setTextureOffset(812, 894).addBox(-18.9422F, -14.8355F, -10.0F, 0.0F, 24.0F, 20.0F, 0.0F, false); + cube_r15 = new ModelRenderer(this); + cube_r15.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone.addChild(cube_r15); + setRotationAngle(cube_r15, 3.1416F, 0.0F, -2.2253F); + cube_r15.setTextureOffset(358, 938).addBox(-19.9764F, 6.6136F, -2.0F, 0.0F, 8.0F, 4.0F, 0.0F, false); + cube_r16 = new ModelRenderer(this); + cube_r16.setRotationPoint(39.0F, 4.4526F, 0.0F); + bone.addChild(cube_r16); + setRotationAngle(cube_r16, 0.0F, 3.1416F, 0.0F); + cube_r16.setTextureOffset(133, 773).addBox(0.0F, -64.0F, -16.0F, 0.0F, 126.0F, 32.0F, 0.0F, false); + bone5 = new ModelRenderer(this); + bone5.setRotationPoint(0.0F, -55.0F, 3.4526F); + setRotationAngle(bone5, -1.5708F, 0.0F, 0.7854F); + cube_r17 = new ModelRenderer(this); + cube_r17.setRotationPoint(6.8889F, 121.1344F, 2.6991F); + bone5.addChild(cube_r17); + setRotationAngle(cube_r17, -1.0472F, 1.1781F, 0.0F); + cube_r17.setTextureOffset(367, 938).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 9.0F, 2.0F, 0.0F, false); + cube_r18 = new ModelRenderer(this); + cube_r18.setRotationPoint(24.5989F, 103.5691F, 10.0349F); + bone5.addChild(cube_r18); + setRotationAngle(cube_r18, -0.829F, 1.1781F, 0.0F); + cube_r18.setTextureOffset(453, 925).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 26.0F, 2.0F, 0.0F, false); + cube_r19 = new ModelRenderer(this); + cube_r19.setRotationPoint(33.5341F, 88.388F, 13.736F); + bone5.addChild(cube_r19); + setRotationAngle(cube_r19, -0.5672F, 1.1781F, 0.0F); + cube_r19.setTextureOffset(745, 870).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 18.0F, 2.0F, 0.0F, false); + cube_r20 = new ModelRenderer(this); + cube_r20.setRotationPoint(39.9239F, 66.4526F, 16.3827F); + bone5.addChild(cube_r20); + setRotationAngle(cube_r20, -0.3054F, 1.1781F, 0.0F); + cube_r20.setTextureOffset(324, 711).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 23.0F, 2.0F, 0.0F, false); + cube_r21 = new ModelRenderer(this); + cube_r21.setRotationPoint(20.9799F, -162.2966F, 8.5358F); + bone5.addChild(cube_r21); + setRotationAngle(cube_r21, 0.3927F, 1.1781F, 0.0F); + cube_r21.setTextureOffset(406, 883).addBox(-1.0F, -57.0F, -2.0F, 2.0F, 57.0F, 2.0F, 0.0F, false); + cube_r22 = new ModelRenderer(this); + cube_r22.setRotationPoint(33.6532F, -111.1026F, 13.7853F); + bone5.addChild(cube_r22); + setRotationAngle(cube_r22, 0.2618F, 1.1781F, 0.0F); + cube_r22.setTextureOffset(307, 891).addBox(-1.0F, -53.0F, -2.0F, 2.0F, 53.0F, 2.0F, 0.0F, false); + cube_r23 = new ModelRenderer(this); + cube_r23.setRotationPoint(39.9239F, -59.5474F, 16.3827F); + bone5.addChild(cube_r23); + setRotationAngle(cube_r23, 0.1309F, 1.1781F, 0.0F); + cube_r23.setTextureOffset(316, 891).addBox(-1.0F, -52.0F, -2.0F, 2.0F, 52.0F, 2.0F, 0.0F, false); + cube_r24 = new ModelRenderer(this); + cube_r24.setRotationPoint(0.0F, 3.4526F, 0.0F); + bone5.addChild(cube_r24); + setRotationAngle(cube_r24, 0.0F, 1.1781F, 0.0F); + cube_r24.setTextureOffset(677, 870).addBox(-0.8574F, -63.0F, 41.1542F, 2.0F, 126.0F, 2.0F, 0.0F, false); + cube_r25 = new ModelRenderer(this); + cube_r25.setRotationPoint(0.0F, -135.8772F, 0.0F); + bone5.addChild(cube_r25); + setRotationAngle(cube_r25, 3.1416F, 0.0F, 3.0194F); + cube_r25.setTextureOffset(555, 828).addBox(-29.407F, 29.5137F, -16.0F, 0.0F, 51.0F, 32.0F, 0.0F, false); + cube_r26 = new ModelRenderer(this); + cube_r26.setRotationPoint(0.0F, -135.8772F, 0.0F); + bone5.addChild(cube_r26); + setRotationAngle(cube_r26, 3.1416F, 0.0F, 2.9016F); + cube_r26.setTextureOffset(620, 870).addBox(-25.7342F, -20.2344F, -14.0F, 0.0F, 53.0F, 28.0F, 0.0F, false); + cube_r27 = new ModelRenderer(this); + cube_r27.setRotationPoint(0.0F, -135.8772F, 0.0F); + bone5.addChild(cube_r27); + setRotationAngle(cube_r27, 3.1416F, 0.0F, 2.7794F); + cube_r27.setTextureOffset(697, 870).addBox(-28.0084F, -70.9474F, -9.0F, 0.0F, 54.0F, 18.0F, 0.0F, false); + cube_r28 = new ModelRenderer(this); + cube_r28.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone5.addChild(cube_r28); + setRotationAngle(cube_r28, -3.1416F, 0.0F, -2.8362F); + cube_r28.setTextureOffset(326, 883).addBox(-27.3317F, -43.0098F, -16.0F, 0.0F, 22.0F, 32.0F, 0.0F, false); + cube_r29 = new ModelRenderer(this); + cube_r29.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone5.addChild(cube_r29); + setRotationAngle(cube_r29, 3.1416F, 0.0F, -2.618F); + cube_r29.setTextureOffset(0, 902).addBox(-22.1365F, -26.4274F, -13.0F, 0.0F, 17.0F, 26.0F, 0.0F, false); + cube_r30 = new ModelRenderer(this); + cube_r30.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone5.addChild(cube_r30); + setRotationAngle(cube_r30, 3.1416F, 0.0F, -2.3562F); + cube_r30.setTextureOffset(812, 894).addBox(-18.9422F, -14.8355F, -10.0F, 0.0F, 24.0F, 20.0F, 0.0F, false); + cube_r31 = new ModelRenderer(this); + cube_r31.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone5.addChild(cube_r31); + setRotationAngle(cube_r31, 3.1416F, 0.0F, -2.2253F); + cube_r31.setTextureOffset(358, 938).addBox(-19.9764F, 6.6136F, -2.0F, 0.0F, 8.0F, 4.0F, 0.0F, false); + cube_r32 = new ModelRenderer(this); + cube_r32.setRotationPoint(39.0F, 4.4526F, 0.0F); + bone5.addChild(cube_r32); + setRotationAngle(cube_r32, 0.0F, 3.1416F, 0.0F); + cube_r32.setTextureOffset(133, 773).addBox(0.0F, -64.0F, -16.0F, 0.0F, 126.0F, 32.0F, 0.0F, false); + bone6 = new ModelRenderer(this); + bone6.setRotationPoint(0.0F, -55.0F, 3.4526F); + setRotationAngle(bone6, -1.5708F, 0.0F, 0.0F); + cube_r33 = new ModelRenderer(this); + cube_r33.setRotationPoint(6.8889F, 121.1344F, 2.6991F); + bone6.addChild(cube_r33); + setRotationAngle(cube_r33, -1.0472F, 1.1781F, 0.0F); + cube_r33.setTextureOffset(367, 938).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 9.0F, 2.0F, 0.0F, false); + cube_r34 = new ModelRenderer(this); + cube_r34.setRotationPoint(24.5989F, 103.5691F, 10.0349F); + bone6.addChild(cube_r34); + setRotationAngle(cube_r34, -0.829F, 1.1781F, 0.0F); + cube_r34.setTextureOffset(453, 925).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 26.0F, 2.0F, 0.0F, false); + cube_r35 = new ModelRenderer(this); + cube_r35.setRotationPoint(33.5341F, 88.388F, 13.736F); + bone6.addChild(cube_r35); + setRotationAngle(cube_r35, -0.5672F, 1.1781F, 0.0F); + cube_r35.setTextureOffset(745, 870).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 18.0F, 2.0F, 0.0F, false); + cube_r36 = new ModelRenderer(this); + cube_r36.setRotationPoint(39.9239F, 66.4526F, 16.3827F); + bone6.addChild(cube_r36); + setRotationAngle(cube_r36, -0.3054F, 1.1781F, 0.0F); + cube_r36.setTextureOffset(324, 711).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 23.0F, 2.0F, 0.0F, false); + cube_r37 = new ModelRenderer(this); + cube_r37.setRotationPoint(20.9799F, -162.2966F, 8.5358F); + bone6.addChild(cube_r37); + setRotationAngle(cube_r37, 0.3927F, 1.1781F, 0.0F); + cube_r37.setTextureOffset(406, 883).addBox(-1.0F, -57.0F, -2.0F, 2.0F, 57.0F, 2.0F, 0.0F, false); + cube_r38 = new ModelRenderer(this); + cube_r38.setRotationPoint(33.6532F, -111.1026F, 13.7853F); + bone6.addChild(cube_r38); + setRotationAngle(cube_r38, 0.2618F, 1.1781F, 0.0F); + cube_r38.setTextureOffset(307, 891).addBox(-1.0F, -53.0F, -2.0F, 2.0F, 53.0F, 2.0F, 0.0F, false); + cube_r39 = new ModelRenderer(this); + cube_r39.setRotationPoint(39.9239F, -59.5474F, 16.3827F); + bone6.addChild(cube_r39); + setRotationAngle(cube_r39, 0.1309F, 1.1781F, 0.0F); + cube_r39.setTextureOffset(316, 891).addBox(-1.0F, -52.0F, -2.0F, 2.0F, 52.0F, 2.0F, 0.0F, false); + cube_r40 = new ModelRenderer(this); + cube_r40.setRotationPoint(0.0F, 3.4526F, 0.0F); + bone6.addChild(cube_r40); + setRotationAngle(cube_r40, 0.0F, 1.1781F, 0.0F); + cube_r40.setTextureOffset(677, 870).addBox(-0.8574F, -63.0F, 41.1542F, 2.0F, 126.0F, 2.0F, 0.0F, false); + cube_r41 = new ModelRenderer(this); + cube_r41.setRotationPoint(0.0F, -135.8772F, 0.0F); + bone6.addChild(cube_r41); + setRotationAngle(cube_r41, 3.1416F, 0.0F, 3.0194F); + cube_r41.setTextureOffset(555, 828).addBox(-29.407F, 29.5137F, -16.0F, 0.0F, 51.0F, 32.0F, 0.0F, false); + cube_r42 = new ModelRenderer(this); + cube_r42.setRotationPoint(0.0F, -135.8772F, 0.0F); + bone6.addChild(cube_r42); + setRotationAngle(cube_r42, 3.1416F, 0.0F, 2.9016F); + cube_r42.setTextureOffset(620, 870).addBox(-25.7342F, -20.2344F, -14.0F, 0.0F, 53.0F, 28.0F, 0.0F, false); + cube_r43 = new ModelRenderer(this); + cube_r43.setRotationPoint(0.0F, -135.8772F, 0.0F); + bone6.addChild(cube_r43); + setRotationAngle(cube_r43, 3.1416F, 0.0F, 2.7794F); + cube_r43.setTextureOffset(697, 870).addBox(-28.0084F, -70.9474F, -9.0F, 0.0F, 54.0F, 18.0F, 0.0F, false); + cube_r44 = new ModelRenderer(this); + cube_r44.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone6.addChild(cube_r44); + setRotationAngle(cube_r44, -3.1416F, 0.0F, -2.8362F); + cube_r44.setTextureOffset(326, 883).addBox(-27.3317F, -43.0098F, -16.0F, 0.0F, 22.0F, 32.0F, 0.0F, false); + cube_r45 = new ModelRenderer(this); + cube_r45.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone6.addChild(cube_r45); + setRotationAngle(cube_r45, 3.1416F, 0.0F, -2.618F); + cube_r45.setTextureOffset(0, 902).addBox(-22.1365F, -26.4274F, -13.0F, 0.0F, 17.0F, 26.0F, 0.0F, false); + cube_r46 = new ModelRenderer(this); + cube_r46.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone6.addChild(cube_r46); + setRotationAngle(cube_r46, 3.1416F, 0.0F, -2.3562F); + cube_r46.setTextureOffset(812, 894).addBox(-18.9422F, -14.8355F, -10.0F, 0.0F, 24.0F, 20.0F, 0.0F, false); + cube_r47 = new ModelRenderer(this); + cube_r47.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone6.addChild(cube_r47); + setRotationAngle(cube_r47, 3.1416F, 0.0F, -2.2253F); + cube_r47.setTextureOffset(358, 938).addBox(-19.9764F, 6.6136F, -2.0F, 0.0F, 8.0F, 4.0F, 0.0F, false); + cube_r48 = new ModelRenderer(this); + cube_r48.setRotationPoint(39.0F, 4.4526F, 0.0F); + bone6.addChild(cube_r48); + setRotationAngle(cube_r48, 0.0F, 3.1416F, 0.0F); + cube_r48.setTextureOffset(133, 773).addBox(0.0F, -64.0F, -16.0F, 0.0F, 126.0F, 32.0F, 0.0F, false); + bone7 = new ModelRenderer(this); + bone7.setRotationPoint(0.0F, -55.0F, 3.4526F); + setRotationAngle(bone7, -1.5708F, 0.0F, -0.7854F); + cube_r49 = new ModelRenderer(this); + cube_r49.setRotationPoint(6.8889F, 121.1344F, 2.6991F); + bone7.addChild(cube_r49); + setRotationAngle(cube_r49, -1.0472F, 1.1781F, 0.0F); + cube_r49.setTextureOffset(367, 938).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 9.0F, 2.0F, 0.0F, false); + cube_r50 = new ModelRenderer(this); + cube_r50.setRotationPoint(24.5989F, 103.5691F, 10.0349F); + bone7.addChild(cube_r50); + setRotationAngle(cube_r50, -0.829F, 1.1781F, 0.0F); + cube_r50.setTextureOffset(453, 925).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 26.0F, 2.0F, 0.0F, false); + cube_r51 = new ModelRenderer(this); + cube_r51.setRotationPoint(33.5341F, 88.388F, 13.736F); + bone7.addChild(cube_r51); + setRotationAngle(cube_r51, -0.5672F, 1.1781F, 0.0F); + cube_r51.setTextureOffset(745, 870).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 18.0F, 2.0F, 0.0F, false); + cube_r52 = new ModelRenderer(this); + cube_r52.setRotationPoint(39.9239F, 66.4526F, 16.3827F); + bone7.addChild(cube_r52); + setRotationAngle(cube_r52, -0.3054F, 1.1781F, 0.0F); + cube_r52.setTextureOffset(324, 711).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 23.0F, 2.0F, 0.0F, false); + cube_r53 = new ModelRenderer(this); + cube_r53.setRotationPoint(20.9799F, -162.2966F, 8.5358F); + bone7.addChild(cube_r53); + setRotationAngle(cube_r53, 0.3927F, 1.1781F, 0.0F); + cube_r53.setTextureOffset(406, 883).addBox(-1.0F, -57.0F, -2.0F, 2.0F, 57.0F, 2.0F, 0.0F, false); + cube_r54 = new ModelRenderer(this); + cube_r54.setRotationPoint(33.6532F, -111.1026F, 13.7853F); + bone7.addChild(cube_r54); + setRotationAngle(cube_r54, 0.2618F, 1.1781F, 0.0F); + cube_r54.setTextureOffset(307, 891).addBox(-1.0F, -53.0F, -2.0F, 2.0F, 53.0F, 2.0F, 0.0F, false); + cube_r55 = new ModelRenderer(this); + cube_r55.setRotationPoint(39.9239F, -59.5474F, 16.3827F); + bone7.addChild(cube_r55); + setRotationAngle(cube_r55, 0.1309F, 1.1781F, 0.0F); + cube_r55.setTextureOffset(316, 891).addBox(-1.0F, -52.0F, -2.0F, 2.0F, 52.0F, 2.0F, 0.0F, false); + cube_r56 = new ModelRenderer(this); + cube_r56.setRotationPoint(0.0F, 3.4526F, 0.0F); + bone7.addChild(cube_r56); + setRotationAngle(cube_r56, 0.0F, 1.1781F, 0.0F); + cube_r56.setTextureOffset(677, 870).addBox(-0.8574F, -63.0F, 41.1542F, 2.0F, 126.0F, 2.0F, 0.0F, false); + cube_r57 = new ModelRenderer(this); + cube_r57.setRotationPoint(0.0F, -135.8772F, 0.0F); + bone7.addChild(cube_r57); + setRotationAngle(cube_r57, 3.1416F, 0.0F, 3.0194F); + cube_r57.setTextureOffset(555, 828).addBox(-29.407F, 29.5137F, -16.0F, 0.0F, 51.0F, 32.0F, 0.0F, false); + cube_r58 = new ModelRenderer(this); + cube_r58.setRotationPoint(0.0F, -135.8772F, 0.0F); + bone7.addChild(cube_r58); + setRotationAngle(cube_r58, 3.1416F, 0.0F, 2.9016F); + cube_r58.setTextureOffset(620, 870).addBox(-25.7342F, -20.2344F, -14.0F, 0.0F, 53.0F, 28.0F, 0.0F, false); + cube_r59 = new ModelRenderer(this); + cube_r59.setRotationPoint(0.0F, -135.8772F, 0.0F); + bone7.addChild(cube_r59); + setRotationAngle(cube_r59, 3.1416F, 0.0F, 2.7794F); + cube_r59.setTextureOffset(697, 870).addBox(-28.0084F, -70.9474F, -9.0F, 0.0F, 54.0F, 18.0F, 0.0F, false); + cube_r60 = new ModelRenderer(this); + cube_r60.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone7.addChild(cube_r60); + setRotationAngle(cube_r60, -3.1416F, 0.0F, -2.8362F); + cube_r60.setTextureOffset(326, 883).addBox(-27.3317F, -43.0098F, -16.0F, 0.0F, 22.0F, 32.0F, 0.0F, false); + cube_r61 = new ModelRenderer(this); + cube_r61.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone7.addChild(cube_r61); + setRotationAngle(cube_r61, 3.1416F, 0.0F, -2.618F); + cube_r61.setTextureOffset(0, 902).addBox(-22.1365F, -26.4274F, -13.0F, 0.0F, 17.0F, 26.0F, 0.0F, false); + cube_r62 = new ModelRenderer(this); + cube_r62.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone7.addChild(cube_r62); + setRotationAngle(cube_r62, 3.1416F, 0.0F, -2.3562F); + cube_r62.setTextureOffset(812, 894).addBox(-18.9422F, -14.8355F, -10.0F, 0.0F, 24.0F, 20.0F, 0.0F, false); + cube_r63 = new ModelRenderer(this); + cube_r63.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone7.addChild(cube_r63); + setRotationAngle(cube_r63, 3.1416F, 0.0F, -2.2253F); + cube_r63.setTextureOffset(358, 938).addBox(-19.9764F, 6.6136F, -2.0F, 0.0F, 8.0F, 4.0F, 0.0F, false); + cube_r64 = new ModelRenderer(this); + cube_r64.setRotationPoint(39.0F, 4.4526F, 0.0F); + bone7.addChild(cube_r64); + setRotationAngle(cube_r64, 0.0F, 3.1416F, 0.0F); + cube_r64.setTextureOffset(133, 773).addBox(0.0F, -64.0F, -16.0F, 0.0F, 126.0F, 32.0F, 0.0F, false); + bone8 = new ModelRenderer(this); + bone8.setRotationPoint(0.0F, -55.0F, 3.4526F); + setRotationAngle(bone8, -1.5708F, 0.0F, -1.5708F); + cube_r65 = new ModelRenderer(this); + cube_r65.setRotationPoint(6.8889F, 121.1344F, 2.6991F); + bone8.addChild(cube_r65); + setRotationAngle(cube_r65, -1.0472F, 1.1781F, 0.0F); + cube_r65.setTextureOffset(367, 938).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 9.0F, 2.0F, 0.0F, false); + cube_r66 = new ModelRenderer(this); + cube_r66.setRotationPoint(24.5989F, 103.5691F, 10.0349F); + bone8.addChild(cube_r66); + setRotationAngle(cube_r66, -0.829F, 1.1781F, 0.0F); + cube_r66.setTextureOffset(453, 925).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 26.0F, 2.0F, 0.0F, false); + cube_r67 = new ModelRenderer(this); + cube_r67.setRotationPoint(33.5341F, 88.388F, 13.736F); + bone8.addChild(cube_r67); + setRotationAngle(cube_r67, -0.5672F, 1.1781F, 0.0F); + cube_r67.setTextureOffset(745, 870).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 18.0F, 2.0F, 0.0F, false); + cube_r68 = new ModelRenderer(this); + cube_r68.setRotationPoint(39.9239F, 66.4526F, 16.3827F); + bone8.addChild(cube_r68); + setRotationAngle(cube_r68, -0.3054F, 1.1781F, 0.0F); + cube_r68.setTextureOffset(324, 711).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 23.0F, 2.0F, 0.0F, false); + cube_r69 = new ModelRenderer(this); + cube_r69.setRotationPoint(20.9799F, -162.2966F, 8.5358F); + bone8.addChild(cube_r69); + setRotationAngle(cube_r69, 0.3927F, 1.1781F, 0.0F); + cube_r69.setTextureOffset(406, 883).addBox(-1.0F, -57.0F, -2.0F, 2.0F, 57.0F, 2.0F, 0.0F, false); + cube_r70 = new ModelRenderer(this); + cube_r70.setRotationPoint(33.6532F, -111.1026F, 13.7853F); + bone8.addChild(cube_r70); + setRotationAngle(cube_r70, 0.2618F, 1.1781F, 0.0F); + cube_r70.setTextureOffset(307, 891).addBox(-1.0F, -53.0F, -2.0F, 2.0F, 53.0F, 2.0F, 0.0F, false); + cube_r71 = new ModelRenderer(this); + cube_r71.setRotationPoint(39.9239F, -59.5474F, 16.3827F); + bone8.addChild(cube_r71); + setRotationAngle(cube_r71, 0.1309F, 1.1781F, 0.0F); + cube_r71.setTextureOffset(316, 891).addBox(-1.0F, -52.0F, -2.0F, 2.0F, 52.0F, 2.0F, 0.0F, false); + cube_r72 = new ModelRenderer(this); + cube_r72.setRotationPoint(0.0F, 3.4526F, 0.0F); + bone8.addChild(cube_r72); + setRotationAngle(cube_r72, 0.0F, 1.1781F, 0.0F); + cube_r72.setTextureOffset(677, 870).addBox(-0.8574F, -63.0F, 41.1542F, 2.0F, 126.0F, 2.0F, 0.0F, false); + cube_r73 = new ModelRenderer(this); + cube_r73.setRotationPoint(0.0F, -135.8772F, 0.0F); + bone8.addChild(cube_r73); + setRotationAngle(cube_r73, 3.1416F, 0.0F, 3.0194F); + cube_r73.setTextureOffset(555, 828).addBox(-29.407F, 29.5137F, -16.0F, 0.0F, 51.0F, 32.0F, 0.0F, false); + cube_r74 = new ModelRenderer(this); + cube_r74.setRotationPoint(0.0F, -135.8772F, 0.0F); + bone8.addChild(cube_r74); + setRotationAngle(cube_r74, 3.1416F, 0.0F, 2.9016F); + cube_r74.setTextureOffset(620, 870).addBox(-25.7342F, -20.2344F, -14.0F, 0.0F, 53.0F, 28.0F, 0.0F, false); + cube_r75 = new ModelRenderer(this); + cube_r75.setRotationPoint(0.0F, -135.8772F, 0.0F); + bone8.addChild(cube_r75); + setRotationAngle(cube_r75, 3.1416F, 0.0F, 2.7794F); + cube_r75.setTextureOffset(697, 870).addBox(-28.0084F, -70.9474F, -9.0F, 0.0F, 54.0F, 18.0F, 0.0F, false); + cube_r76 = new ModelRenderer(this); + cube_r76.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone8.addChild(cube_r76); + setRotationAngle(cube_r76, -3.1416F, 0.0F, -2.8362F); + cube_r76.setTextureOffset(326, 883).addBox(-27.3317F, -43.0098F, -16.0F, 0.0F, 22.0F, 32.0F, 0.0F, false); + cube_r77 = new ModelRenderer(this); + cube_r77.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone8.addChild(cube_r77); + setRotationAngle(cube_r77, 3.1416F, 0.0F, -2.618F); + cube_r77.setTextureOffset(0, 902).addBox(-22.1365F, -26.4274F, -13.0F, 0.0F, 17.0F, 26.0F, 0.0F, false); + cube_r78 = new ModelRenderer(this); + cube_r78.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone8.addChild(cube_r78); + setRotationAngle(cube_r78, 3.1416F, 0.0F, -2.3562F); + cube_r78.setTextureOffset(812, 894).addBox(-18.9422F, -14.8355F, -10.0F, 0.0F, 24.0F, 20.0F, 0.0F, false); + cube_r79 = new ModelRenderer(this); + cube_r79.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone8.addChild(cube_r79); + setRotationAngle(cube_r79, 3.1416F, 0.0F, -2.2253F); + cube_r79.setTextureOffset(358, 938).addBox(-19.9764F, 6.6136F, -2.0F, 0.0F, 8.0F, 4.0F, 0.0F, false); + cube_r80 = new ModelRenderer(this); + cube_r80.setRotationPoint(39.0F, 4.4526F, 0.0F); + bone8.addChild(cube_r80); + setRotationAngle(cube_r80, 0.0F, 3.1416F, 0.0F); + cube_r80.setTextureOffset(133, 773).addBox(0.0F, -64.0F, -16.0F, 0.0F, 126.0F, 32.0F, 0.0F, false); + bone9 = new ModelRenderer(this); + bone9.setRotationPoint(0.0F, -55.0F, 3.4526F); + setRotationAngle(bone9, -1.5708F, 0.0F, -2.3562F); + cube_r81 = new ModelRenderer(this); + cube_r81.setRotationPoint(6.8889F, 121.1344F, 2.6991F); + bone9.addChild(cube_r81); + setRotationAngle(cube_r81, -1.0472F, 1.1781F, 0.0F); + cube_r81.setTextureOffset(367, 938).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 9.0F, 2.0F, 0.0F, false); + cube_r82 = new ModelRenderer(this); + cube_r82.setRotationPoint(24.5989F, 103.5691F, 10.0349F); + bone9.addChild(cube_r82); + setRotationAngle(cube_r82, -0.829F, 1.1781F, 0.0F); + cube_r82.setTextureOffset(453, 925).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 26.0F, 2.0F, 0.0F, false); + cube_r83 = new ModelRenderer(this); + cube_r83.setRotationPoint(33.5341F, 88.388F, 13.736F); + bone9.addChild(cube_r83); + setRotationAngle(cube_r83, -0.5672F, 1.1781F, 0.0F); + cube_r83.setTextureOffset(745, 870).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 18.0F, 2.0F, 0.0F, false); + cube_r84 = new ModelRenderer(this); + cube_r84.setRotationPoint(39.9239F, 66.4526F, 16.3827F); + bone9.addChild(cube_r84); + setRotationAngle(cube_r84, -0.3054F, 1.1781F, 0.0F); + cube_r84.setTextureOffset(324, 711).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 23.0F, 2.0F, 0.0F, false); + cube_r85 = new ModelRenderer(this); + cube_r85.setRotationPoint(20.9799F, -162.2966F, 8.5358F); + bone9.addChild(cube_r85); + setRotationAngle(cube_r85, 0.3927F, 1.1781F, 0.0F); + cube_r85.setTextureOffset(406, 883).addBox(-1.0F, -57.0F, -2.0F, 2.0F, 57.0F, 2.0F, 0.0F, false); + cube_r86 = new ModelRenderer(this); + cube_r86.setRotationPoint(33.6532F, -111.1026F, 13.7853F); + bone9.addChild(cube_r86); + setRotationAngle(cube_r86, 0.2618F, 1.1781F, 0.0F); + cube_r86.setTextureOffset(307, 891).addBox(-1.0F, -53.0F, -2.0F, 2.0F, 53.0F, 2.0F, 0.0F, false); + cube_r87 = new ModelRenderer(this); + cube_r87.setRotationPoint(39.9239F, -59.5474F, 16.3827F); + bone9.addChild(cube_r87); + setRotationAngle(cube_r87, 0.1309F, 1.1781F, 0.0F); + cube_r87.setTextureOffset(316, 891).addBox(-1.0F, -52.0F, -2.0F, 2.0F, 52.0F, 2.0F, 0.0F, false); + cube_r88 = new ModelRenderer(this); + cube_r88.setRotationPoint(0.0F, 3.4526F, 0.0F); + bone9.addChild(cube_r88); + setRotationAngle(cube_r88, 0.0F, 1.1781F, 0.0F); + cube_r88.setTextureOffset(677, 870).addBox(-0.8574F, -63.0F, 41.1542F, 2.0F, 126.0F, 2.0F, 0.0F, false); + cube_r89 = new ModelRenderer(this); + cube_r89.setRotationPoint(0.0F, -135.8772F, 0.0F); + bone9.addChild(cube_r89); + setRotationAngle(cube_r89, 3.1416F, 0.0F, 3.0194F); + cube_r89.setTextureOffset(555, 828).addBox(-29.407F, 29.5137F, -16.0F, 0.0F, 51.0F, 32.0F, 0.0F, false); + cube_r90 = new ModelRenderer(this); + cube_r90.setRotationPoint(0.0F, -135.8772F, 0.0F); + bone9.addChild(cube_r90); + setRotationAngle(cube_r90, 3.1416F, 0.0F, 2.9016F); + cube_r90.setTextureOffset(620, 870).addBox(-25.7342F, -20.2344F, -14.0F, 0.0F, 53.0F, 28.0F, 0.0F, false); + cube_r91 = new ModelRenderer(this); + cube_r91.setRotationPoint(0.0F, -135.8772F, 0.0F); + bone9.addChild(cube_r91); + setRotationAngle(cube_r91, 3.1416F, 0.0F, 2.7794F); + cube_r91.setTextureOffset(697, 870).addBox(-28.0084F, -70.9474F, -9.0F, 0.0F, 54.0F, 18.0F, 0.0F, false); + cube_r92 = new ModelRenderer(this); + cube_r92.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone9.addChild(cube_r92); + setRotationAngle(cube_r92, -3.1416F, 0.0F, -2.8362F); + cube_r92.setTextureOffset(326, 883).addBox(-27.3317F, -43.0098F, -16.0F, 0.0F, 22.0F, 32.0F, 0.0F, false); + cube_r93 = new ModelRenderer(this); + cube_r93.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone9.addChild(cube_r93); + setRotationAngle(cube_r93, 3.1416F, 0.0F, -2.618F); + cube_r93.setTextureOffset(0, 902).addBox(-22.1365F, -26.4274F, -13.0F, 0.0F, 17.0F, 26.0F, 0.0F, false); + cube_r94 = new ModelRenderer(this); + cube_r94.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone9.addChild(cube_r94); + setRotationAngle(cube_r94, 3.1416F, 0.0F, -2.3562F); + cube_r94.setTextureOffset(812, 894).addBox(-18.9422F, -14.8355F, -10.0F, 0.0F, 24.0F, 20.0F, 0.0F, false); + cube_r95 = new ModelRenderer(this); + cube_r95.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone9.addChild(cube_r95); + setRotationAngle(cube_r95, 3.1416F, 0.0F, -2.2253F); + cube_r95.setTextureOffset(358, 938).addBox(-19.9764F, 6.6136F, -2.0F, 0.0F, 8.0F, 4.0F, 0.0F, false); + cube_r96 = new ModelRenderer(this); + cube_r96.setRotationPoint(39.0F, 4.4526F, 0.0F); + bone9.addChild(cube_r96); + setRotationAngle(cube_r96, 0.0F, 3.1416F, 0.0F); + cube_r96.setTextureOffset(133, 773).addBox(0.0F, -64.0F, -16.0F, 0.0F, 126.0F, 32.0F, 0.0F, false); + bone10 = new ModelRenderer(this); + bone10.setRotationPoint(0.0F, -55.0F, 3.4526F); + setRotationAngle(bone10, -1.5708F, 0.0F, -3.1416F); + cube_r97 = new ModelRenderer(this); + cube_r97.setRotationPoint(6.8889F, 121.1344F, 2.6991F); + bone10.addChild(cube_r97); + setRotationAngle(cube_r97, -1.0472F, 1.1781F, 0.0F); + cube_r97.setTextureOffset(367, 938).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 9.0F, 2.0F, 0.0F, false); + cube_r98 = new ModelRenderer(this); + cube_r98.setRotationPoint(24.5989F, 103.5691F, 10.0349F); + bone10.addChild(cube_r98); + setRotationAngle(cube_r98, -0.829F, 1.1781F, 0.0F); + cube_r98.setTextureOffset(453, 925).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 26.0F, 2.0F, 0.0F, false); + cube_r99 = new ModelRenderer(this); + cube_r99.setRotationPoint(33.5341F, 88.388F, 13.736F); + bone10.addChild(cube_r99); + setRotationAngle(cube_r99, -0.5672F, 1.1781F, 0.0F); + cube_r99.setTextureOffset(745, 870).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 18.0F, 2.0F, 0.0F, false); + cube_r100 = new ModelRenderer(this); + cube_r100.setRotationPoint(39.9239F, 66.4526F, 16.3827F); + bone10.addChild(cube_r100); + setRotationAngle(cube_r100, -0.3054F, 1.1781F, 0.0F); + cube_r100.setTextureOffset(324, 711).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 23.0F, 2.0F, 0.0F, false); + cube_r101 = new ModelRenderer(this); + cube_r101.setRotationPoint(20.9799F, -162.2966F, 8.5358F); + bone10.addChild(cube_r101); + setRotationAngle(cube_r101, 0.3927F, 1.1781F, 0.0F); + cube_r101.setTextureOffset(406, 883).addBox(-1.0F, -57.0F, -2.0F, 2.0F, 57.0F, 2.0F, 0.0F, false); + cube_r102 = new ModelRenderer(this); + cube_r102.setRotationPoint(33.6532F, -111.1026F, 13.7853F); + bone10.addChild(cube_r102); + setRotationAngle(cube_r102, 0.2618F, 1.1781F, 0.0F); + cube_r102.setTextureOffset(307, 891).addBox(-1.0F, -53.0F, -2.0F, 2.0F, 53.0F, 2.0F, 0.0F, false); + cube_r103 = new ModelRenderer(this); + cube_r103.setRotationPoint(39.9239F, -59.5474F, 16.3827F); + bone10.addChild(cube_r103); + setRotationAngle(cube_r103, 0.1309F, 1.1781F, 0.0F); + cube_r103.setTextureOffset(316, 891).addBox(-1.0F, -52.0F, -2.0F, 2.0F, 52.0F, 2.0F, 0.0F, false); + cube_r104 = new ModelRenderer(this); + cube_r104.setRotationPoint(0.0F, 3.4526F, 0.0F); + bone10.addChild(cube_r104); + setRotationAngle(cube_r104, 0.0F, 1.1781F, 0.0F); + cube_r104.setTextureOffset(677, 870).addBox(-0.8574F, -63.0F, 41.1542F, 2.0F, 126.0F, 2.0F, 0.0F, false); + cube_r105 = new ModelRenderer(this); + cube_r105.setRotationPoint(0.0F, -135.8772F, 0.0F); + bone10.addChild(cube_r105); + setRotationAngle(cube_r105, 3.1416F, 0.0F, 3.0194F); + cube_r105.setTextureOffset(555, 828).addBox(-29.407F, 29.5137F, -16.0F, 0.0F, 51.0F, 32.0F, 0.0F, false); + cube_r106 = new ModelRenderer(this); + cube_r106.setRotationPoint(0.0F, -135.8772F, 0.0F); + bone10.addChild(cube_r106); + setRotationAngle(cube_r106, 3.1416F, 0.0F, 2.9016F); + cube_r106.setTextureOffset(620, 870).addBox(-25.7342F, -20.2344F, -14.0F, 0.0F, 53.0F, 28.0F, 0.0F, false); + cube_r107 = new ModelRenderer(this); + cube_r107.setRotationPoint(0.0F, -135.8772F, 0.0F); + bone10.addChild(cube_r107); + setRotationAngle(cube_r107, 3.1416F, 0.0F, 2.7794F); + cube_r107.setTextureOffset(697, 870).addBox(-28.0084F, -70.9474F, -9.0F, 0.0F, 54.0F, 18.0F, 0.0F, false); + cube_r108 = new ModelRenderer(this); + cube_r108.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone10.addChild(cube_r108); + setRotationAngle(cube_r108, -3.1416F, 0.0F, -2.8362F); + cube_r108.setTextureOffset(326, 883).addBox(-27.3317F, -43.0098F, -16.0F, 0.0F, 22.0F, 32.0F, 0.0F, false); + cube_r109 = new ModelRenderer(this); + cube_r109.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone10.addChild(cube_r109); + setRotationAngle(cube_r109, 3.1416F, 0.0F, -2.618F); + cube_r109.setTextureOffset(0, 902).addBox(-22.1365F, -26.4274F, -13.0F, 0.0F, 17.0F, 26.0F, 0.0F, false); + cube_r110 = new ModelRenderer(this); + cube_r110.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone10.addChild(cube_r110); + setRotationAngle(cube_r110, 3.1416F, 0.0F, -2.3562F); + cube_r110.setTextureOffset(812, 894).addBox(-18.9422F, -14.8355F, -10.0F, 0.0F, 24.0F, 20.0F, 0.0F, false); + cube_r111 = new ModelRenderer(this); + cube_r111.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone10.addChild(cube_r111); + setRotationAngle(cube_r111, 3.1416F, 0.0F, -2.2253F); + cube_r111.setTextureOffset(358, 938).addBox(-19.9764F, 6.6136F, -2.0F, 0.0F, 8.0F, 4.0F, 0.0F, false); + cube_r112 = new ModelRenderer(this); + cube_r112.setRotationPoint(39.0F, 4.4526F, 0.0F); + bone10.addChild(cube_r112); + setRotationAngle(cube_r112, 0.0F, 3.1416F, 0.0F); + cube_r112.setTextureOffset(133, 773).addBox(0.0F, -64.0F, -16.0F, 0.0F, 126.0F, 32.0F, 0.0F, false); + bone11 = new ModelRenderer(this); + bone11.setRotationPoint(0.0F, -55.0F, 3.4526F); + setRotationAngle(bone11, -1.5708F, 0.0F, 2.3562F); + cube_r113 = new ModelRenderer(this); + cube_r113.setRotationPoint(6.8889F, 121.1344F, 2.6991F); + bone11.addChild(cube_r113); + setRotationAngle(cube_r113, -1.0472F, 1.1781F, 0.0F); + cube_r113.setTextureOffset(367, 938).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 9.0F, 2.0F, 0.0F, false); + cube_r114 = new ModelRenderer(this); + cube_r114.setRotationPoint(24.5989F, 103.5691F, 10.0349F); + bone11.addChild(cube_r114); + setRotationAngle(cube_r114, -0.829F, 1.1781F, 0.0F); + cube_r114.setTextureOffset(453, 925).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 26.0F, 2.0F, 0.0F, false); + cube_r115 = new ModelRenderer(this); + cube_r115.setRotationPoint(33.5341F, 88.388F, 13.736F); + bone11.addChild(cube_r115); + setRotationAngle(cube_r115, -0.5672F, 1.1781F, 0.0F); + cube_r115.setTextureOffset(745, 870).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 18.0F, 2.0F, 0.0F, false); + cube_r116 = new ModelRenderer(this); + cube_r116.setRotationPoint(39.9239F, 66.4526F, 16.3827F); + bone11.addChild(cube_r116); + setRotationAngle(cube_r116, -0.3054F, 1.1781F, 0.0F); + cube_r116.setTextureOffset(324, 711).addBox(-1.0F, 0.0F, -2.0F, 2.0F, 23.0F, 2.0F, 0.0F, false); + cube_r117 = new ModelRenderer(this); + cube_r117.setRotationPoint(20.9799F, -162.2966F, 8.5358F); + bone11.addChild(cube_r117); + setRotationAngle(cube_r117, 0.3927F, 1.1781F, 0.0F); + cube_r117.setTextureOffset(406, 883).addBox(-1.0F, -57.0F, -2.0F, 2.0F, 57.0F, 2.0F, 0.0F, false); + cube_r118 = new ModelRenderer(this); + cube_r118.setRotationPoint(33.6532F, -111.1026F, 13.7853F); + bone11.addChild(cube_r118); + setRotationAngle(cube_r118, 0.2618F, 1.1781F, 0.0F); + cube_r118.setTextureOffset(307, 891).addBox(-1.0F, -53.0F, -2.0F, 2.0F, 53.0F, 2.0F, 0.0F, false); + cube_r119 = new ModelRenderer(this); + cube_r119.setRotationPoint(39.9239F, -59.5474F, 16.3827F); + bone11.addChild(cube_r119); + setRotationAngle(cube_r119, 0.1309F, 1.1781F, 0.0F); + cube_r119.setTextureOffset(316, 891).addBox(-1.0F, -52.0F, -2.0F, 2.0F, 52.0F, 2.0F, 0.0F, false); + cube_r120 = new ModelRenderer(this); + cube_r120.setRotationPoint(0.0F, 3.4526F, 0.0F); + bone11.addChild(cube_r120); + setRotationAngle(cube_r120, 0.0F, 1.1781F, 0.0F); + cube_r120.setTextureOffset(677, 870).addBox(-0.8574F, -63.0F, 41.1542F, 2.0F, 126.0F, 2.0F, 0.0F, false); + cube_r121 = new ModelRenderer(this); + cube_r121.setRotationPoint(0.0F, -135.8772F, 0.0F); + bone11.addChild(cube_r121); + setRotationAngle(cube_r121, 3.1416F, 0.0F, 3.0194F); + cube_r121.setTextureOffset(555, 828).addBox(-29.407F, 29.5137F, -16.0F, 0.0F, 51.0F, 32.0F, 0.0F, false); + cube_r122 = new ModelRenderer(this); + cube_r122.setRotationPoint(0.0F, -135.8772F, 0.0F); + bone11.addChild(cube_r122); + setRotationAngle(cube_r122, 3.1416F, 0.0F, 2.9016F); + cube_r122.setTextureOffset(620, 870).addBox(-25.7342F, -20.2344F, -14.0F, 0.0F, 53.0F, 28.0F, 0.0F, false); + cube_r123 = new ModelRenderer(this); + cube_r123.setRotationPoint(0.0F, -135.8772F, 0.0F); + bone11.addChild(cube_r123); + setRotationAngle(cube_r123, 3.1416F, 0.0F, 2.7794F); + cube_r123.setTextureOffset(697, 870).addBox(-28.0084F, -70.9474F, -9.0F, 0.0F, 54.0F, 18.0F, 0.0F, false); + cube_r124 = new ModelRenderer(this); + cube_r124.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone11.addChild(cube_r124); + setRotationAngle(cube_r124, -3.1416F, 0.0F, -2.8362F); + cube_r124.setTextureOffset(326, 883).addBox(-27.3317F, -43.0098F, -16.0F, 0.0F, 22.0F, 32.0F, 0.0F, false); + cube_r125 = new ModelRenderer(this); + cube_r125.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone11.addChild(cube_r125); + setRotationAngle(cube_r125, 3.1416F, 0.0F, -2.618F); + cube_r125.setTextureOffset(0, 902).addBox(-22.1365F, -26.4274F, -13.0F, 0.0F, 17.0F, 26.0F, 0.0F, false); + cube_r126 = new ModelRenderer(this); + cube_r126.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone11.addChild(cube_r126); + setRotationAngle(cube_r126, 3.1416F, 0.0F, -2.3562F); + cube_r126.setTextureOffset(812, 894).addBox(-18.9422F, -14.8355F, -10.0F, 0.0F, 24.0F, 20.0F, 0.0F, false); + cube_r127 = new ModelRenderer(this); + cube_r127.setRotationPoint(0.0F, 99.2529F, 0.0F); + bone11.addChild(cube_r127); + setRotationAngle(cube_r127, 3.1416F, 0.0F, -2.2253F); + cube_r127.setTextureOffset(358, 938).addBox(-19.9764F, 6.6136F, -2.0F, 0.0F, 8.0F, 4.0F, 0.0F, false); + cube_r128 = new ModelRenderer(this); + cube_r128.setRotationPoint(39.0F, 4.4526F, 0.0F); + bone11.addChild(cube_r128); + setRotationAngle(cube_r128, 0.0F, 3.1416F, 0.0F); + cube_r128.setTextureOffset(133, 773).addBox(0.0F, -64.0F, -16.0F, 0.0F, 126.0F, 32.0F, 0.0F, false); + TailFin = new ModelRenderer(this); + TailFin.setRotationPoint(0.0F, -104.5815F, 120.9657F); + cube_r129 = new ModelRenderer(this); + cube_r129.setRotationPoint(0.0F, -45.5826F, 91.2868F); + TailFin.addChild(cube_r129); + setRotationAngle(cube_r129, -1.789F, 0.0F, 0.0F); + cube_r129.setTextureOffset(102, 902).addBox(-2.0F, -44.0F, 0.0F, 4.0F, 44.0F, 3.0F, 0.0F, false); + cube_r130 = new ModelRenderer(this); + cube_r130.setRotationPoint(0.0F, -23.7554F, 16.6337F); + TailFin.addChild(cube_r130); + setRotationAngle(cube_r130, -1.0036F, 0.0F, 0.0F); + cube_r130.setTextureOffset(117, 902).addBox(-2.0F, -33.0F, 0.0F, 4.0F, 33.0F, 3.0F, 0.0F, false); + cube_r131 = new ModelRenderer(this); + cube_r131.setRotationPoint(0.0F, -41.4863F, 44.4656F); + TailFin.addChild(cube_r131); + setRotationAngle(cube_r131, -1.4835F, 0.0F, 0.0F); + cube_r131.setTextureOffset(292, 891).addBox(-2.0F, -47.0F, 0.0F, 4.0F, 47.0F, 3.0F, 0.0F, false); + cube_r132 = new ModelRenderer(this); + cube_r132.setRotationPoint(0.0F, -39.0F, 41.0F); + TailFin.addChild(cube_r132); + setRotationAngle(cube_r132, -1.8326F, 0.0F, 0.0F); + cube_r132.setTextureOffset(734, 870).addBox(-1.0F, -91.0F, 0.0F, 2.0F, 91.0F, 3.0F, 0.0F, false); + cube_r132.setTextureOffset(642, 607).addBox(-0.5F, -90.0F, -22.0F, 1.0F, 120.0F, 73.0F, 0.0F, false); + cube_r133 = new ModelRenderer(this); + cube_r133.setRotationPoint(0.0F, -20.0F, 16.0F); + TailFin.addChild(cube_r133); + setRotationAngle(cube_r133, -1.8326F, 0.0F, 0.0F); + cube_r133.setTextureOffset(686, 870).addBox(-1.0F, -111.0F, 0.0F, 2.0F, 111.0F, 3.0F, 0.0F, false); + cube_r134 = new ModelRenderer(this); + cube_r134.setRotationPoint(0.0F, 0.0F, 0.0F); + TailFin.addChild(cube_r134); + setRotationAngle(cube_r134, -1.8326F, 0.0F, 0.0F); + cube_r134.setTextureOffset(924, 604).addBox(-3.0F, -5.0F, -1.0F, 6.0F, 7.0F, 11.0F, 0.0F, false); + cube_r134.setTextureOffset(855, 845).addBox(-2.0F, -121.0F, 0.0F, 4.0F, 121.0F, 3.0F, 0.0F, false); + cube_r135 = new ModelRenderer(this); + cube_r135.setRotationPoint(0.0F, 0.0F, 0.0F); + TailFin.addChild(cube_r135); + setRotationAngle(cube_r135, -0.6109F, 0.0F, 0.0F); + cube_r135.setTextureOffset(589, 912).addBox(-2.0F, -29.0F, 0.0F, 4.0F, 29.0F, 3.0F, 0.0F, false); + TailFin4 = new ModelRenderer(this); + TailFin4.setRotationPoint(0.0F, -55.0F, 176.4869F); + setRotationAngle(TailFin4, 0.0F, 0.0F, -1.5708F); + cube_r136 = new ModelRenderer(this); + cube_r136.setRotationPoint(0.0F, -95.1641F, 35.7656F); + TailFin4.addChild(cube_r136); + setRotationAngle(cube_r136, -1.789F, 0.0F, 0.0F); + cube_r136.setTextureOffset(102, 902).addBox(-2.0F, -44.0F, 0.0F, 4.0F, 44.0F, 3.0F, 0.0F, false); + cube_r137 = new ModelRenderer(this); + cube_r137.setRotationPoint(0.0F, -73.3369F, -38.8874F); + TailFin4.addChild(cube_r137); + setRotationAngle(cube_r137, -1.0036F, 0.0F, 0.0F); + cube_r137.setTextureOffset(117, 902).addBox(-2.0F, -33.0F, 0.0F, 4.0F, 33.0F, 3.0F, 0.0F, false); + cube_r138 = new ModelRenderer(this); + cube_r138.setRotationPoint(0.0F, -91.0678F, -11.0555F); + TailFin4.addChild(cube_r138); + setRotationAngle(cube_r138, -1.4835F, 0.0F, 0.0F); + cube_r138.setTextureOffset(292, 891).addBox(-2.0F, -47.0F, 0.0F, 4.0F, 47.0F, 3.0F, 0.0F, false); + cube_r139 = new ModelRenderer(this); + cube_r139.setRotationPoint(0.0F, -88.5815F, -14.5211F); + TailFin4.addChild(cube_r139); + setRotationAngle(cube_r139, -1.8326F, 0.0F, 0.0F); + cube_r139.setTextureOffset(734, 870).addBox(-1.0F, -91.0F, 0.0F, 2.0F, 91.0F, 3.0F, 0.0F, false); + cube_r139.setTextureOffset(642, 607).addBox(-0.5F, -90.0F, -22.0F, 1.0F, 120.0F, 73.0F, 0.0F, false); + cube_r140 = new ModelRenderer(this); + cube_r140.setRotationPoint(0.0F, -69.5815F, -39.5211F); + TailFin4.addChild(cube_r140); + setRotationAngle(cube_r140, -1.8326F, 0.0F, 0.0F); + cube_r140.setTextureOffset(686, 870).addBox(-1.0F, -111.0F, 0.0F, 2.0F, 111.0F, 3.0F, 0.0F, false); + cube_r141 = new ModelRenderer(this); + cube_r141.setRotationPoint(0.0F, -49.5815F, -55.5211F); + TailFin4.addChild(cube_r141); + setRotationAngle(cube_r141, -1.8326F, 0.0F, 0.0F); + cube_r141.setTextureOffset(924, 604).addBox(-3.0F, -5.0F, -1.0F, 6.0F, 7.0F, 11.0F, 0.0F, false); + cube_r141.setTextureOffset(855, 845).addBox(-2.0F, -121.0F, 0.0F, 4.0F, 121.0F, 3.0F, 0.0F, false); + cube_r142 = new ModelRenderer(this); + cube_r142.setRotationPoint(0.0F, -49.5815F, -55.5211F); + TailFin4.addChild(cube_r142); + setRotationAngle(cube_r142, -0.6109F, 0.0F, 0.0F); + cube_r142.setTextureOffset(589, 912).addBox(-2.0F, -29.0F, 0.0F, 4.0F, 29.0F, 3.0F, 0.0F, false); + TailFin2 = new ModelRenderer(this); + TailFin2.setRotationPoint(0.0F, -5.4185F, 120.9657F); + cube_r143 = new ModelRenderer(this); + cube_r143.setRotationPoint(0.0F, 45.5826F, 91.2868F); + TailFin2.addChild(cube_r143); + setRotationAngle(cube_r143, 1.789F, 0.0F, 0.0F); + cube_r143.setTextureOffset(102, 902).addBox(-2.0F, 0.0F, 0.0F, 4.0F, 44.0F, 3.0F, 0.0F, false); + cube_r144 = new ModelRenderer(this); + cube_r144.setRotationPoint(0.0F, 23.7554F, 16.6337F); + TailFin2.addChild(cube_r144); + setRotationAngle(cube_r144, 1.0036F, 0.0F, 0.0F); + cube_r144.setTextureOffset(117, 902).addBox(-2.0F, 0.0F, 0.0F, 4.0F, 33.0F, 3.0F, 0.0F, false); + cube_r145 = new ModelRenderer(this); + cube_r145.setRotationPoint(0.0F, 41.4863F, 44.4656F); + TailFin2.addChild(cube_r145); + setRotationAngle(cube_r145, 1.4835F, 0.0F, 0.0F); + cube_r145.setTextureOffset(292, 891).addBox(-2.0F, 0.0F, 0.0F, 4.0F, 47.0F, 3.0F, 0.0F, false); + cube_r146 = new ModelRenderer(this); + cube_r146.setRotationPoint(0.0F, 39.0F, 41.0F); + TailFin2.addChild(cube_r146); + setRotationAngle(cube_r146, 1.8326F, 0.0F, 0.0F); + cube_r146.setTextureOffset(734, 870).addBox(-1.0F, 0.0F, 0.0F, 2.0F, 91.0F, 3.0F, 0.0F, false); + cube_r147 = new ModelRenderer(this); + cube_r147.setRotationPoint(0.0F, 17.2295F, 66.2249F); + TailFin2.addChild(cube_r147); + setRotationAngle(cube_r147, -1.8326F, 0.0F, 3.1416F); + cube_r147.setTextureOffset(642, 607).addBox(-0.5F, -60.0F, -36.5F, 1.0F, 120.0F, 73.0F, 0.0F, false); + cube_r148 = new ModelRenderer(this); + cube_r148.setRotationPoint(0.0F, 20.0F, 16.0F); + TailFin2.addChild(cube_r148); + setRotationAngle(cube_r148, 1.8326F, 0.0F, 0.0F); + cube_r148.setTextureOffset(686, 870).addBox(-1.0F, 0.0F, 0.0F, 2.0F, 111.0F, 3.0F, 0.0F, false); + cube_r149 = new ModelRenderer(this); + cube_r149.setRotationPoint(0.0F, 0.0F, 0.0F); + TailFin2.addChild(cube_r149); + setRotationAngle(cube_r149, 1.8326F, 0.0F, 0.0F); + cube_r149.setTextureOffset(924, 604).addBox(-3.0F, -2.0F, -1.0F, 6.0F, 7.0F, 11.0F, 0.0F, false); + cube_r149.setTextureOffset(855, 845).addBox(-2.0F, 0.0F, 0.0F, 4.0F, 121.0F, 3.0F, 0.0F, false); + cube_r150 = new ModelRenderer(this); + cube_r150.setRotationPoint(0.0F, 0.0F, 0.0F); + TailFin2.addChild(cube_r150); + setRotationAngle(cube_r150, 0.6109F, 0.0F, 0.0F); + cube_r150.setTextureOffset(589, 912).addBox(-2.0F, 0.0F, 0.0F, 4.0F, 29.0F, 3.0F, 0.0F, false); + TailFin3 = new ModelRenderer(this); + TailFin3.setRotationPoint(0.0F, -55.0F, 176.4869F); + setRotationAngle(TailFin3, 0.0F, 0.0F, -1.5708F); + cube_r151 = new ModelRenderer(this); + cube_r151.setRotationPoint(0.0F, 95.1641F, 35.7656F); + TailFin3.addChild(cube_r151); + setRotationAngle(cube_r151, 1.789F, 0.0F, 0.0F); + cube_r151.setTextureOffset(102, 902).addBox(-2.0F, 0.0F, 0.0F, 4.0F, 44.0F, 3.0F, 0.0F, false); + cube_r152 = new ModelRenderer(this); + cube_r152.setRotationPoint(0.0F, 73.3369F, -38.8874F); + TailFin3.addChild(cube_r152); + setRotationAngle(cube_r152, 1.0036F, 0.0F, 0.0F); + cube_r152.setTextureOffset(117, 902).addBox(-2.0F, 0.0F, 0.0F, 4.0F, 33.0F, 3.0F, 0.0F, false); + cube_r153 = new ModelRenderer(this); + cube_r153.setRotationPoint(0.0F, 91.0678F, -11.0555F); + TailFin3.addChild(cube_r153); + setRotationAngle(cube_r153, 1.4835F, 0.0F, 0.0F); + cube_r153.setTextureOffset(292, 891).addBox(-2.0F, 0.0F, 0.0F, 4.0F, 47.0F, 3.0F, 0.0F, false); + cube_r154 = new ModelRenderer(this); + cube_r154.setRotationPoint(0.0F, 88.5815F, -14.5211F); + TailFin3.addChild(cube_r154); + setRotationAngle(cube_r154, 1.8326F, 0.0F, 0.0F); + cube_r154.setTextureOffset(734, 870).addBox(-1.0F, 0.0F, 0.0F, 2.0F, 91.0F, 3.0F, 0.0F, false); + cube_r155 = new ModelRenderer(this); + cube_r155.setRotationPoint(0.0F, 66.811F, 10.7038F); + TailFin3.addChild(cube_r155); + setRotationAngle(cube_r155, -1.8326F, 0.0F, 3.1416F); + cube_r155.setTextureOffset(642, 607).addBox(-0.5F, -60.0F, -36.5F, 1.0F, 120.0F, 73.0F, 0.0F, false); + cube_r156 = new ModelRenderer(this); + cube_r156.setRotationPoint(0.0F, 69.5815F, -39.5211F); + TailFin3.addChild(cube_r156); + setRotationAngle(cube_r156, 1.8326F, 0.0F, 0.0F); + cube_r156.setTextureOffset(686, 870).addBox(-1.0F, 0.0F, 0.0F, 2.0F, 111.0F, 3.0F, 0.0F, false); + cube_r157 = new ModelRenderer(this); + cube_r157.setRotationPoint(0.0F, 49.5815F, -55.5211F); + TailFin3.addChild(cube_r157); + setRotationAngle(cube_r157, 1.8326F, 0.0F, 0.0F); + cube_r157.setTextureOffset(924, 604).addBox(-3.0F, -2.0F, -1.0F, 6.0F, 7.0F, 11.0F, 0.0F, false); + cube_r157.setTextureOffset(855, 845).addBox(-2.0F, 0.0F, 0.0F, 4.0F, 121.0F, 3.0F, 0.0F, false); + cube_r158 = new ModelRenderer(this); + cube_r158.setRotationPoint(0.0F, 49.5815F, -55.5211F); + TailFin3.addChild(cube_r158); + setRotationAngle(cube_r158, 0.6109F, 0.0F, 0.0F); + cube_r158.setTextureOffset(589, 912).addBox(-2.0F, 0.0F, 0.0F, 4.0F, 29.0F, 3.0F, 0.0F, false); + bone2 = new ModelRenderer(this); + bone2.setRotationPoint(0.0F, -55.0F, 2.5F); + setRotationAngle(bone2, 0.0F, 0.0F, -1.5708F); + bone31 = new ModelRenderer(this); + bone31.setRotationPoint(0.0F, 0.0F, 104.5F); + bone2.addChild(bone31); + bone35 = new ModelRenderer(this); + bone35.setRotationPoint(0.0F, 0.0F, 0.0F); + bone31.addChild(bone35); + setRotationAngle(bone35, 0.0F, 0.0F, -3.1416F); + cube_r159 = new ModelRenderer(this); + cube_r159.setRotationPoint(2.0F, -51.1078F, -104.6065F); + bone35.addChild(cube_r159); + setRotationAngle(cube_r159, -1.5708F, 0.0F, 0.3491F); + cube_r159.setTextureOffset(924, 364).addBox(0.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone36 = new ModelRenderer(this); + bone36.setRotationPoint(0.0F, 0.0F, 0.0F); + bone35.addChild(bone36); + setRotationAngle(bone36, 0.0F, 0.0F, 1.5708F); + cube_r160 = new ModelRenderer(this); + cube_r160.setRotationPoint(-43.4213F, -19.5186F, -104.6065F); + bone36.addChild(cube_r160); + setRotationAngle(cube_r160, -1.5708F, 0.0F, -0.9119F); + cube_r160.setTextureOffset(132, 932).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + cube_r161 = new ModelRenderer(this); + cube_r161.setRotationPoint(-20.7938F, -44.2674F, -104.6065F); + bone36.addChild(cube_r161); + setRotationAngle(cube_r161, -1.5708F, 0.0F, -0.7854F); + cube_r161.setTextureOffset(251, 727).addBox(-33.0F, -2.0F, 0.0F, 33.0F, 4.0F, 3.0F, 0.0F, false); + cube_r162 = new ModelRenderer(this); + cube_r162.setRotationPoint(-2.0F, -51.1078F, -104.6065F); + bone36.addChild(cube_r162); + setRotationAngle(cube_r162, -1.5708F, 0.0F, -0.3491F); + cube_r162.setTextureOffset(924, 372).addBox(-20.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone37 = new ModelRenderer(this); + bone37.setRotationPoint(0.0F, 0.0F, 0.0F); + bone36.addChild(bone37); + setRotationAngle(bone37, 0.0F, 0.0F, -1.5708F); + cube_r163 = new ModelRenderer(this); + cube_r163.setRotationPoint(43.4213F, -19.5186F, -104.6065F); + bone37.addChild(cube_r163); + setRotationAngle(cube_r163, -1.5708F, 0.0F, 0.9119F); + cube_r163.setTextureOffset(132, 932).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + bone23 = new ModelRenderer(this); + bone23.setRotationPoint(0.0F, 0.0F, 44.5F); + bone2.addChild(bone23); + bone24 = new ModelRenderer(this); + bone24.setRotationPoint(0.0F, 0.0F, 2.0F); + bone23.addChild(bone24); + setRotationAngle(bone24, 0.0F, 0.0F, -3.1416F); + cube_r164 = new ModelRenderer(this); + cube_r164.setRotationPoint(2.0F, -51.1078F, -104.6065F); + bone24.addChild(cube_r164); + setRotationAngle(cube_r164, -1.5708F, 0.0F, 0.3491F); + cube_r164.setTextureOffset(924, 364).addBox(0.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone78 = new ModelRenderer(this); + bone78.setRotationPoint(0.0F, 0.0F, 0.0F); + bone24.addChild(bone78); + setRotationAngle(bone78, 0.0F, 0.0F, 1.5708F); + cube_r165 = new ModelRenderer(this); + cube_r165.setRotationPoint(-43.4213F, -19.5186F, -104.6065F); + bone78.addChild(cube_r165); + setRotationAngle(cube_r165, -1.5708F, 0.0F, -0.9119F); + cube_r165.setTextureOffset(132, 932).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + cube_r166 = new ModelRenderer(this); + cube_r166.setRotationPoint(-20.7938F, -44.2674F, -104.6065F); + bone78.addChild(cube_r166); + setRotationAngle(cube_r166, -1.5708F, 0.0F, -0.7854F); + cube_r166.setTextureOffset(251, 727).addBox(-33.0F, -2.0F, 0.0F, 33.0F, 4.0F, 3.0F, 0.0F, false); + cube_r167 = new ModelRenderer(this); + cube_r167.setRotationPoint(-2.0F, -51.1078F, -104.6065F); + bone78.addChild(cube_r167); + setRotationAngle(cube_r167, -1.5708F, 0.0F, -0.3491F); + cube_r167.setTextureOffset(924, 372).addBox(-20.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone79 = new ModelRenderer(this); + bone79.setRotationPoint(0.0F, 0.0F, 0.0F); + bone78.addChild(bone79); + setRotationAngle(bone79, 0.0F, 0.0F, -1.5708F); + cube_r168 = new ModelRenderer(this); + cube_r168.setRotationPoint(43.4213F, -19.5186F, -104.6065F); + bone79.addChild(cube_r168); + setRotationAngle(cube_r168, -1.5708F, 0.0F, 0.9119F); + cube_r168.setTextureOffset(132, 932).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + bone14 = new ModelRenderer(this); + bone14.setRotationPoint(0.0F, 0.0F, 164.5F); + bone2.addChild(bone14); + bone15 = new ModelRenderer(this); + bone15.setRotationPoint(0.0F, 0.0F, -2.0F); + bone14.addChild(bone15); + setRotationAngle(bone15, 0.0F, 0.0F, -3.1416F); + cube_r169 = new ModelRenderer(this); + cube_r169.setRotationPoint(2.0F, -51.1078F, -104.6065F); + bone15.addChild(cube_r169); + setRotationAngle(cube_r169, -1.5708F, 0.0F, 0.3491F); + cube_r169.setTextureOffset(924, 364).addBox(0.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone16 = new ModelRenderer(this); + bone16.setRotationPoint(0.0F, 0.0F, 0.0F); + bone15.addChild(bone16); + setRotationAngle(bone16, 0.0F, 0.0F, 1.5708F); + cube_r170 = new ModelRenderer(this); + cube_r170.setRotationPoint(-43.4213F, -19.5186F, -104.6065F); + bone16.addChild(cube_r170); + setRotationAngle(cube_r170, -1.5708F, 0.0F, -0.9119F); + cube_r170.setTextureOffset(132, 932).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + cube_r171 = new ModelRenderer(this); + cube_r171.setRotationPoint(-20.7938F, -44.2674F, -104.6065F); + bone16.addChild(cube_r171); + setRotationAngle(cube_r171, -1.5708F, 0.0F, -0.7854F); + cube_r171.setTextureOffset(251, 727).addBox(-33.0F, -2.0F, 0.0F, 33.0F, 4.0F, 3.0F, 0.0F, false); + cube_r172 = new ModelRenderer(this); + cube_r172.setRotationPoint(-2.0F, -51.1078F, -104.6065F); + bone16.addChild(cube_r172); + setRotationAngle(cube_r172, -1.5708F, 0.0F, -0.3491F); + cube_r172.setTextureOffset(924, 372).addBox(-20.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone22 = new ModelRenderer(this); + bone22.setRotationPoint(0.0F, 0.0F, 0.0F); + bone16.addChild(bone22); + setRotationAngle(bone22, 0.0F, 0.0F, -1.5708F); + cube_r173 = new ModelRenderer(this); + cube_r173.setRotationPoint(43.4213F, -19.5186F, -104.6065F); + bone22.addChild(cube_r173); + setRotationAngle(cube_r173, -1.5708F, 0.0F, 0.9119F); + cube_r173.setTextureOffset(132, 932).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + bone70 = new ModelRenderer(this); + bone70.setRotationPoint(0.0F, -55.0F, 2.25F); + setRotationAngle(bone70, 3.1416F, 0.0F, -1.5708F); + bone71 = new ModelRenderer(this); + bone71.setRotationPoint(0.0F, 0.0F, 104.5F); + bone70.addChild(bone71); + bone77 = new ModelRenderer(this); + bone77.setRotationPoint(0.0F, 0.0F, 0.0F); + bone71.addChild(bone77); + setRotationAngle(bone77, 0.0F, 0.0F, -3.1416F); + cube_r174 = new ModelRenderer(this); + cube_r174.setRotationPoint(2.0F, -51.1078F, -104.6065F); + bone77.addChild(cube_r174); + setRotationAngle(cube_r174, -1.5708F, 0.0F, 0.3491F); + cube_r174.setTextureOffset(924, 364).addBox(0.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone80 = new ModelRenderer(this); + bone80.setRotationPoint(0.0F, 0.0F, 0.0F); + bone77.addChild(bone80); + setRotationAngle(bone80, 0.0F, 0.0F, 1.5708F); + cube_r175 = new ModelRenderer(this); + cube_r175.setRotationPoint(-43.4213F, -19.5186F, -104.6065F); + bone80.addChild(cube_r175); + setRotationAngle(cube_r175, -1.5708F, 0.0F, -0.9119F); + cube_r175.setTextureOffset(132, 932).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + cube_r176 = new ModelRenderer(this); + cube_r176.setRotationPoint(-20.7938F, -44.2674F, -104.6065F); + bone80.addChild(cube_r176); + setRotationAngle(cube_r176, -1.5708F, 0.0F, -0.7854F); + cube_r176.setTextureOffset(251, 727).addBox(-33.0F, -2.0F, 0.0F, 33.0F, 4.0F, 3.0F, 0.0F, false); + cube_r177 = new ModelRenderer(this); + cube_r177.setRotationPoint(-2.0F, -51.1078F, -104.6065F); + bone80.addChild(cube_r177); + setRotationAngle(cube_r177, -1.5708F, 0.0F, -0.3491F); + cube_r177.setTextureOffset(924, 372).addBox(-20.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone81 = new ModelRenderer(this); + bone81.setRotationPoint(0.0F, 0.0F, 0.0F); + bone80.addChild(bone81); + setRotationAngle(bone81, 0.0F, 0.0F, -1.5708F); + cube_r178 = new ModelRenderer(this); + cube_r178.setRotationPoint(43.4213F, -19.5186F, -104.6065F); + bone81.addChild(cube_r178); + setRotationAngle(cube_r178, -1.5708F, 0.0F, 0.9119F); + cube_r178.setTextureOffset(132, 932).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + bone82 = new ModelRenderer(this); + bone82.setRotationPoint(0.0F, 0.0F, 44.5F); + bone70.addChild(bone82); + bone83 = new ModelRenderer(this); + bone83.setRotationPoint(0.0F, 0.0F, 2.0F); + bone82.addChild(bone83); + setRotationAngle(bone83, 0.0F, 0.0F, -3.1416F); + cube_r179 = new ModelRenderer(this); + cube_r179.setRotationPoint(2.0F, -51.1078F, -104.6065F); + bone83.addChild(cube_r179); + setRotationAngle(cube_r179, -1.5708F, 0.0F, 0.3491F); + cube_r179.setTextureOffset(924, 364).addBox(0.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone84 = new ModelRenderer(this); + bone84.setRotationPoint(0.0F, 0.0F, 0.0F); + bone83.addChild(bone84); + setRotationAngle(bone84, 0.0F, 0.0F, 1.5708F); + cube_r180 = new ModelRenderer(this); + cube_r180.setRotationPoint(-43.4213F, -19.5186F, -104.6065F); + bone84.addChild(cube_r180); + setRotationAngle(cube_r180, -1.5708F, 0.0F, -0.9119F); + cube_r180.setTextureOffset(132, 932).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + cube_r181 = new ModelRenderer(this); + cube_r181.setRotationPoint(-20.7938F, -44.2674F, -104.6065F); + bone84.addChild(cube_r181); + setRotationAngle(cube_r181, -1.5708F, 0.0F, -0.7854F); + cube_r181.setTextureOffset(251, 727).addBox(-33.0F, -2.0F, 0.0F, 33.0F, 4.0F, 3.0F, 0.0F, false); + cube_r182 = new ModelRenderer(this); + cube_r182.setRotationPoint(-2.0F, -51.1078F, -104.6065F); + bone84.addChild(cube_r182); + setRotationAngle(cube_r182, -1.5708F, 0.0F, -0.3491F); + cube_r182.setTextureOffset(924, 372).addBox(-20.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone85 = new ModelRenderer(this); + bone85.setRotationPoint(0.0F, 0.0F, 0.0F); + bone84.addChild(bone85); + setRotationAngle(bone85, 0.0F, 0.0F, -1.5708F); + cube_r183 = new ModelRenderer(this); + cube_r183.setRotationPoint(43.4213F, -19.5186F, -104.6065F); + bone85.addChild(cube_r183); + setRotationAngle(cube_r183, -1.5708F, 0.0F, 0.9119F); + cube_r183.setTextureOffset(132, 932).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + bone86 = new ModelRenderer(this); + bone86.setRotationPoint(0.0F, 0.0F, 164.5F); + bone70.addChild(bone86); + bone87 = new ModelRenderer(this); + bone87.setRotationPoint(0.0F, 0.0F, -2.0F); + bone86.addChild(bone87); + setRotationAngle(bone87, 0.0F, 0.0F, -3.1416F); + cube_r184 = new ModelRenderer(this); + cube_r184.setRotationPoint(2.0F, -51.1078F, -104.6065F); + bone87.addChild(cube_r184); + setRotationAngle(cube_r184, -1.5708F, 0.0F, 0.3491F); + cube_r184.setTextureOffset(924, 364).addBox(0.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone88 = new ModelRenderer(this); + bone88.setRotationPoint(0.0F, 0.0F, 0.0F); + bone87.addChild(bone88); + setRotationAngle(bone88, 0.0F, 0.0F, 1.5708F); + cube_r185 = new ModelRenderer(this); + cube_r185.setRotationPoint(-43.4213F, -19.5186F, -104.6065F); + bone88.addChild(cube_r185); + setRotationAngle(cube_r185, -1.5708F, 0.0F, -0.9119F); + cube_r185.setTextureOffset(132, 932).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + cube_r186 = new ModelRenderer(this); + cube_r186.setRotationPoint(-20.7938F, -44.2674F, -104.6065F); + bone88.addChild(cube_r186); + setRotationAngle(cube_r186, -1.5708F, 0.0F, -0.7854F); + cube_r186.setTextureOffset(251, 727).addBox(-33.0F, -2.0F, 0.0F, 33.0F, 4.0F, 3.0F, 0.0F, false); + cube_r187 = new ModelRenderer(this); + cube_r187.setRotationPoint(-2.0F, -51.1078F, -104.6065F); + bone88.addChild(cube_r187); + setRotationAngle(cube_r187, -1.5708F, 0.0F, -0.3491F); + cube_r187.setTextureOffset(924, 372).addBox(-20.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone89 = new ModelRenderer(this); + bone89.setRotationPoint(0.0F, 0.0F, 0.0F); + bone88.addChild(bone89); + setRotationAngle(bone89, 0.0F, 0.0F, -1.5708F); + cube_r188 = new ModelRenderer(this); + cube_r188.setRotationPoint(43.4213F, -19.5186F, -104.6065F); + bone89.addChild(cube_r188); + setRotationAngle(cube_r188, -1.5708F, 0.0F, 0.9119F); + cube_r188.setTextureOffset(132, 932).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + bone55 = new ModelRenderer(this); + bone55.setRotationPoint(0.0F, -55.0F, 107.0F); + setRotationAngle(bone55, 0.0F, 0.0F, -1.5708F); + bone56 = new ModelRenderer(this); + bone56.setRotationPoint(0.0F, 0.0F, 0.0F); + bone55.addChild(bone56); + bone57 = new ModelRenderer(this); + bone57.setRotationPoint(0.0F, 0.0F, 0.0F); + bone56.addChild(bone57); + setRotationAngle(bone57, 0.0F, 0.0F, -3.1416F); + cube_r189 = new ModelRenderer(this); + cube_r189.setRotationPoint(2.0F, -51.1078F, -104.6065F); + bone57.addChild(cube_r189); + setRotationAngle(cube_r189, -1.5708F, 0.0F, 0.3491F); + cube_r189.setTextureOffset(924, 364).addBox(0.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone58 = new ModelRenderer(this); + bone58.setRotationPoint(0.0F, 0.0F, 0.0F); + bone57.addChild(bone58); + setRotationAngle(bone58, 0.0F, 0.0F, 1.5708F); + cube_r190 = new ModelRenderer(this); + cube_r190.setRotationPoint(-43.4213F, -19.5186F, -104.6065F); + bone58.addChild(cube_r190); + setRotationAngle(cube_r190, -1.5708F, 0.0F, -0.9119F); + cube_r190.setTextureOffset(132, 932).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + cube_r191 = new ModelRenderer(this); + cube_r191.setRotationPoint(-20.7938F, -44.2674F, -104.6065F); + bone58.addChild(cube_r191); + setRotationAngle(cube_r191, -1.5708F, 0.0F, -0.7854F); + cube_r191.setTextureOffset(251, 727).addBox(-33.0F, -2.0F, 0.0F, 33.0F, 4.0F, 3.0F, 0.0F, false); + cube_r192 = new ModelRenderer(this); + cube_r192.setRotationPoint(-2.0F, -51.1078F, -104.6065F); + bone58.addChild(cube_r192); + setRotationAngle(cube_r192, -1.5708F, 0.0F, -0.3491F); + cube_r192.setTextureOffset(924, 372).addBox(-20.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone59 = new ModelRenderer(this); + bone59.setRotationPoint(0.0F, 0.0F, 0.0F); + bone58.addChild(bone59); + setRotationAngle(bone59, 0.0F, 0.0F, -1.5708F); + cube_r193 = new ModelRenderer(this); + cube_r193.setRotationPoint(43.4213F, -19.5186F, -104.6065F); + bone59.addChild(cube_r193); + setRotationAngle(cube_r193, -1.5708F, 0.0F, 0.9119F); + cube_r193.setTextureOffset(132, 932).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + bone60 = new ModelRenderer(this); + bone60.setRotationPoint(0.0F, 0.0F, -60.0F); + bone55.addChild(bone60); + bone61 = new ModelRenderer(this); + bone61.setRotationPoint(0.0F, 0.0F, 2.0F); + bone60.addChild(bone61); + setRotationAngle(bone61, 0.0F, 0.0F, -3.1416F); + cube_r194 = new ModelRenderer(this); + cube_r194.setRotationPoint(2.0F, -51.1078F, -104.6065F); + bone61.addChild(cube_r194); + setRotationAngle(cube_r194, -1.5708F, 0.0F, 0.3491F); + cube_r194.setTextureOffset(924, 364).addBox(0.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone62 = new ModelRenderer(this); + bone62.setRotationPoint(0.0F, 0.0F, 0.0F); + bone61.addChild(bone62); + setRotationAngle(bone62, 0.0F, 0.0F, 1.5708F); + cube_r195 = new ModelRenderer(this); + cube_r195.setRotationPoint(-43.4213F, -19.5186F, -104.6065F); + bone62.addChild(cube_r195); + setRotationAngle(cube_r195, -1.5708F, 0.0F, -0.9119F); + cube_r195.setTextureOffset(132, 932).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + cube_r196 = new ModelRenderer(this); + cube_r196.setRotationPoint(-20.7938F, -44.2674F, -104.6065F); + bone62.addChild(cube_r196); + setRotationAngle(cube_r196, -1.5708F, 0.0F, -0.7854F); + cube_r196.setTextureOffset(251, 727).addBox(-33.0F, -2.0F, 0.0F, 33.0F, 4.0F, 3.0F, 0.0F, false); + cube_r197 = new ModelRenderer(this); + cube_r197.setRotationPoint(-2.0F, -51.1078F, -104.6065F); + bone62.addChild(cube_r197); + setRotationAngle(cube_r197, -1.5708F, 0.0F, -0.3491F); + cube_r197.setTextureOffset(924, 372).addBox(-20.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone63 = new ModelRenderer(this); + bone63.setRotationPoint(0.0F, 0.0F, 0.0F); + bone62.addChild(bone63); + setRotationAngle(bone63, 0.0F, 0.0F, -1.5708F); + cube_r198 = new ModelRenderer(this); + cube_r198.setRotationPoint(43.4213F, -19.5186F, -104.6065F); + bone63.addChild(cube_r198); + setRotationAngle(cube_r198, -1.5708F, 0.0F, 0.9119F); + cube_r198.setTextureOffset(132, 932).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + bone64 = new ModelRenderer(this); + bone64.setRotationPoint(0.0F, 0.0F, 60.0F); + bone55.addChild(bone64); + bone65 = new ModelRenderer(this); + bone65.setRotationPoint(0.0F, 0.0F, -2.0F); + bone64.addChild(bone65); + setRotationAngle(bone65, 0.0F, 0.0F, -3.1416F); + cube_r199 = new ModelRenderer(this); + cube_r199.setRotationPoint(2.0F, -51.1078F, -104.6065F); + bone65.addChild(cube_r199); + setRotationAngle(cube_r199, -1.5708F, 0.0F, 0.3491F); + cube_r199.setTextureOffset(924, 364).addBox(0.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone66 = new ModelRenderer(this); + bone66.setRotationPoint(0.0F, 0.0F, 0.0F); + bone65.addChild(bone66); + setRotationAngle(bone66, 0.0F, 0.0F, 1.5708F); + cube_r200 = new ModelRenderer(this); + cube_r200.setRotationPoint(-43.4213F, -19.5186F, -104.6065F); + bone66.addChild(cube_r200); + setRotationAngle(cube_r200, -1.5708F, 0.0F, -0.9119F); + cube_r200.setTextureOffset(132, 932).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + cube_r201 = new ModelRenderer(this); + cube_r201.setRotationPoint(-20.7938F, -44.2674F, -104.6065F); + bone66.addChild(cube_r201); + setRotationAngle(cube_r201, -1.5708F, 0.0F, -0.7854F); + cube_r201.setTextureOffset(251, 727).addBox(-33.0F, -2.0F, 0.0F, 33.0F, 4.0F, 3.0F, 0.0F, false); + cube_r202 = new ModelRenderer(this); + cube_r202.setRotationPoint(-2.0F, -51.1078F, -104.6065F); + bone66.addChild(cube_r202); + setRotationAngle(cube_r202, -1.5708F, 0.0F, -0.3491F); + cube_r202.setTextureOffset(924, 372).addBox(-20.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone69 = new ModelRenderer(this); + bone69.setRotationPoint(0.0F, 0.0F, 0.0F); + bone66.addChild(bone69); + setRotationAngle(bone69, 0.0F, 0.0F, -1.5708F); + cube_r203 = new ModelRenderer(this); + cube_r203.setRotationPoint(43.4213F, -19.5186F, -104.6065F); + bone69.addChild(cube_r203); + setRotationAngle(cube_r203, -1.5708F, 0.0F, 0.9119F); + cube_r203.setTextureOffset(132, 932).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + bone20 = new ModelRenderer(this); + bone20.setRotationPoint(0.0F, -55.0F, 49.5F); + setRotationAngle(bone20, 0.0F, 0.0F, -3.1416F); + bone33 = new ModelRenderer(this); + bone33.setRotationPoint(0.0F, 0.0F, 57.5F); + bone20.addChild(bone33); + bone34 = new ModelRenderer(this); + bone34.setRotationPoint(-3.628F, 15.426F, -34.8688F); + bone33.addChild(bone34); + setRotationAngle(bone34, 0.0F, 0.0F, -3.1416F); + cube_r204 = new ModelRenderer(this); + cube_r204.setRotationPoint(-1.628F, -35.6818F, -69.7377F); + bone34.addChild(cube_r204); + setRotationAngle(cube_r204, -1.5708F, 0.0F, 0.3491F); + cube_r204.setTextureOffset(924, 364).addBox(0.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone38 = new ModelRenderer(this); + bone38.setRotationPoint(-3.628F, 15.426F, 34.8688F); + bone34.addChild(bone38); + setRotationAngle(bone38, 0.0F, 0.0F, 1.5708F); + cube_r205 = new ModelRenderer(this); + cube_r205.setRotationPoint(-43.4213F, -19.5186F, -104.6065F); + bone38.addChild(cube_r205); + setRotationAngle(cube_r205, -1.5708F, 0.0F, -0.9119F); + cube_r205.setTextureOffset(230, 931).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + cube_r206 = new ModelRenderer(this); + cube_r206.setRotationPoint(-20.7938F, -44.2674F, -104.6065F); + bone38.addChild(cube_r206); + setRotationAngle(cube_r206, -1.5708F, 0.0F, -0.7854F); + cube_r206.setTextureOffset(251, 727).addBox(-33.0F, -2.0F, 0.0F, 33.0F, 4.0F, 3.0F, 0.0F, false); + cube_r207 = new ModelRenderer(this); + cube_r207.setRotationPoint(-2.0F, -51.1078F, -104.6065F); + bone38.addChild(cube_r207); + setRotationAngle(cube_r207, -1.5708F, 0.0F, -0.3491F); + cube_r207.setTextureOffset(924, 372).addBox(-20.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone39 = new ModelRenderer(this); + bone39.setRotationPoint(0.0F, 0.0F, 0.0F); + bone38.addChild(bone39); + setRotationAngle(bone39, 0.0F, 0.0F, -1.5708F); + cube_r208 = new ModelRenderer(this); + cube_r208.setRotationPoint(43.4213F, -19.5186F, -104.6065F); + bone39.addChild(cube_r208); + setRotationAngle(cube_r208, -1.5708F, 0.0F, 0.9119F); + cube_r208.setTextureOffset(230, 931).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + bone52 = new ModelRenderer(this); + bone52.setRotationPoint(0.0F, 0.0F, 0.0F); + bone38.addChild(bone52); + setRotationAngle(bone52, 0.0F, 0.0F, -1.5708F); + cube_r209 = new ModelRenderer(this); + cube_r209.setRotationPoint(43.4213F, -19.5186F, -104.6065F); + bone52.addChild(cube_r209); + setRotationAngle(cube_r209, -1.5708F, 0.0F, 0.9119F); + cube_r209.setTextureOffset(230, 931).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + bone51 = new ModelRenderer(this); + bone51.setRotationPoint(-3.628F, 15.426F, 34.8688F); + bone34.addChild(bone51); + setRotationAngle(bone51, 0.0F, 0.0F, 1.5708F); + cube_r210 = new ModelRenderer(this); + cube_r210.setRotationPoint(-43.4213F, -19.5186F, -104.6065F); + bone51.addChild(cube_r210); + setRotationAngle(cube_r210, -1.5708F, 0.0F, -0.9119F); + cube_r210.setTextureOffset(230, 931).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + cube_r211 = new ModelRenderer(this); + cube_r211.setRotationPoint(-20.7938F, -44.2674F, -104.6065F); + bone51.addChild(cube_r211); + setRotationAngle(cube_r211, -1.5708F, 0.0F, -0.7854F); + cube_r211.setTextureOffset(251, 727).addBox(-33.0F, -2.0F, 0.0F, 33.0F, 4.0F, 3.0F, 0.0F, false); + cube_r212 = new ModelRenderer(this); + cube_r212.setRotationPoint(-2.0F, -51.1078F, -104.6065F); + bone51.addChild(cube_r212); + setRotationAngle(cube_r212, -1.5708F, 0.0F, -0.3491F); + cube_r212.setTextureOffset(924, 372).addBox(-20.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone50 = new ModelRenderer(this); + bone50.setRotationPoint(-3.628F, 15.426F, -34.8688F); + bone33.addChild(bone50); + setRotationAngle(bone50, 0.0F, 0.0F, -3.1416F); + cube_r213 = new ModelRenderer(this); + cube_r213.setRotationPoint(-1.628F, -35.6818F, -69.7377F); + bone50.addChild(cube_r213); + setRotationAngle(cube_r213, -1.5708F, 0.0F, 0.3491F); + cube_r213.setTextureOffset(924, 364).addBox(0.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone28 = new ModelRenderer(this); + bone28.setRotationPoint(-3.628F, 15.426F, 23.1312F); + bone33.addChild(bone28); + setRotationAngle(bone28, 0.0F, 0.0F, -3.1416F); + cube_r214 = new ModelRenderer(this); + cube_r214.setRotationPoint(-1.628F, -35.6818F, -69.7377F); + bone28.addChild(cube_r214); + setRotationAngle(cube_r214, -1.5708F, 0.0F, 0.3491F); + cube_r214.setTextureOffset(924, 364).addBox(0.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone29 = new ModelRenderer(this); + bone29.setRotationPoint(-3.628F, 15.426F, 34.8688F); + bone28.addChild(bone29); + setRotationAngle(bone29, 0.0F, 0.0F, 1.5708F); + cube_r215 = new ModelRenderer(this); + cube_r215.setRotationPoint(-43.4213F, -19.5186F, -104.6065F); + bone29.addChild(cube_r215); + setRotationAngle(cube_r215, -1.5708F, 0.0F, -0.9119F); + cube_r215.setTextureOffset(230, 931).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + cube_r216 = new ModelRenderer(this); + cube_r216.setRotationPoint(-20.7938F, -44.2674F, -104.6065F); + bone29.addChild(cube_r216); + setRotationAngle(cube_r216, -1.5708F, 0.0F, -0.7854F); + cube_r216.setTextureOffset(251, 727).addBox(-33.0F, -2.0F, 0.0F, 33.0F, 4.0F, 3.0F, 0.0F, false); + cube_r217 = new ModelRenderer(this); + cube_r217.setRotationPoint(-2.0F, -51.1078F, -104.6065F); + bone29.addChild(cube_r217); + setRotationAngle(cube_r217, -1.5708F, 0.0F, -0.3491F); + cube_r217.setTextureOffset(924, 372).addBox(-20.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone30 = new ModelRenderer(this); + bone30.setRotationPoint(0.0F, 0.0F, 0.0F); + bone29.addChild(bone30); + setRotationAngle(bone30, 0.0F, 0.0F, -1.5708F); + cube_r218 = new ModelRenderer(this); + cube_r218.setRotationPoint(43.4213F, -19.5186F, -104.6065F); + bone30.addChild(cube_r218); + setRotationAngle(cube_r218, -1.5708F, 0.0F, 0.9119F); + cube_r218.setTextureOffset(230, 931).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + bone27 = new ModelRenderer(this); + bone27.setRotationPoint(-3.628F, 15.426F, -92.8688F); + bone33.addChild(bone27); + setRotationAngle(bone27, 0.0F, 0.0F, -3.1416F); + cube_r219 = new ModelRenderer(this); + cube_r219.setRotationPoint(-1.628F, -35.6818F, -69.7377F); + bone27.addChild(cube_r219); + setRotationAngle(cube_r219, -1.5708F, 0.0F, 0.3491F); + cube_r219.setTextureOffset(924, 364).addBox(0.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone44 = new ModelRenderer(this); + bone44.setRotationPoint(-3.628F, 15.426F, 34.8688F); + bone27.addChild(bone44); + setRotationAngle(bone44, 0.0F, 0.0F, 1.5708F); + cube_r220 = new ModelRenderer(this); + cube_r220.setRotationPoint(-43.4213F, -19.5186F, -104.6065F); + bone44.addChild(cube_r220); + setRotationAngle(cube_r220, -1.5708F, 0.0F, -0.9119F); + cube_r220.setTextureOffset(230, 931).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + cube_r221 = new ModelRenderer(this); + cube_r221.setRotationPoint(-20.7938F, -44.2674F, -104.6065F); + bone44.addChild(cube_r221); + setRotationAngle(cube_r221, -1.5708F, 0.0F, -0.7854F); + cube_r221.setTextureOffset(251, 727).addBox(-33.0F, -2.0F, 0.0F, 33.0F, 4.0F, 3.0F, 0.0F, false); + cube_r222 = new ModelRenderer(this); + cube_r222.setRotationPoint(-2.0F, -51.1078F, -104.6065F); + bone44.addChild(cube_r222); + setRotationAngle(cube_r222, -1.5708F, 0.0F, -0.3491F); + cube_r222.setTextureOffset(924, 372).addBox(-20.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone67 = new ModelRenderer(this); + bone67.setRotationPoint(0.0F, 0.0F, 0.0F); + bone44.addChild(bone67); + setRotationAngle(bone67, 0.0F, 0.0F, -1.5708F); + cube_r223 = new ModelRenderer(this); + cube_r223.setRotationPoint(43.4213F, -19.5186F, -104.6065F); + bone67.addChild(cube_r223); + setRotationAngle(cube_r223, -1.5708F, 0.0F, 0.9119F); + cube_r223.setTextureOffset(230, 931).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + bone68 = new ModelRenderer(this); + bone68.setRotationPoint(-3.628F, 15.426F, 34.8688F); + bone27.addChild(bone68); + setRotationAngle(bone68, 0.0F, 0.0F, -3.1416F); + cube_r224 = new ModelRenderer(this); + cube_r224.setRotationPoint(2.0F, -51.1078F, -104.6065F); + bone68.addChild(cube_r224); + setRotationAngle(cube_r224, -1.5708F, 0.0F, 0.3491F); + cube_r224.setTextureOffset(924, 364).addBox(0.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone49 = new ModelRenderer(this); + bone49.setRotationPoint(0.0F, 0.0F, 57.5F); + bone20.addChild(bone49); + bone17 = new ModelRenderer(this); + bone17.setRotationPoint(0.0F, -55.0F, -44.25F); + setRotationAngle(bone17, 3.1416F, 0.0F, 0.0F); + bone18 = new ModelRenderer(this); + bone18.setRotationPoint(0.0F, 0.0F, 58.0F); + bone17.addChild(bone18); + bone21 = new ModelRenderer(this); + bone21.setRotationPoint(-3.628F, 15.426F, -34.8688F); + bone18.addChild(bone21); + setRotationAngle(bone21, 0.0F, 0.0F, -3.1416F); + cube_r225 = new ModelRenderer(this); + cube_r225.setRotationPoint(-1.628F, -35.6818F, -69.7377F); + bone21.addChild(cube_r225); + setRotationAngle(cube_r225, -1.5708F, 0.0F, 0.3491F); + cube_r225.setTextureOffset(924, 364).addBox(0.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone25 = new ModelRenderer(this); + bone25.setRotationPoint(-3.628F, 15.426F, 34.8688F); + bone21.addChild(bone25); + setRotationAngle(bone25, 0.0F, 0.0F, 1.5708F); + cube_r226 = new ModelRenderer(this); + cube_r226.setRotationPoint(-43.4213F, -19.5186F, -104.6065F); + bone25.addChild(cube_r226); + setRotationAngle(cube_r226, -1.5708F, 0.0F, -0.9119F); + cube_r226.setTextureOffset(230, 931).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + cube_r227 = new ModelRenderer(this); + cube_r227.setRotationPoint(-20.7938F, -44.2674F, -104.6065F); + bone25.addChild(cube_r227); + setRotationAngle(cube_r227, -1.5708F, 0.0F, -0.7854F); + cube_r227.setTextureOffset(251, 727).addBox(-33.0F, -2.0F, 0.0F, 33.0F, 4.0F, 3.0F, 0.0F, false); + cube_r228 = new ModelRenderer(this); + cube_r228.setRotationPoint(-2.0F, -51.1078F, -104.6065F); + bone25.addChild(cube_r228); + setRotationAngle(cube_r228, -1.5708F, 0.0F, -0.3491F); + cube_r228.setTextureOffset(924, 372).addBox(-20.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone26 = new ModelRenderer(this); + bone26.setRotationPoint(0.0F, 0.0F, 0.0F); + bone25.addChild(bone26); + setRotationAngle(bone26, 0.0F, 0.0F, -1.5708F); + cube_r229 = new ModelRenderer(this); + cube_r229.setRotationPoint(43.4213F, -19.5186F, -104.6065F); + bone26.addChild(cube_r229); + setRotationAngle(cube_r229, -1.5708F, 0.0F, 0.9119F); + cube_r229.setTextureOffset(230, 931).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + bone32 = new ModelRenderer(this); + bone32.setRotationPoint(0.0F, 0.0F, 0.0F); + bone25.addChild(bone32); + setRotationAngle(bone32, 0.0F, 0.0F, -1.5708F); + cube_r230 = new ModelRenderer(this); + cube_r230.setRotationPoint(43.4213F, -19.5186F, -104.6065F); + bone32.addChild(cube_r230); + setRotationAngle(cube_r230, -1.5708F, 0.0F, 0.9119F); + cube_r230.setTextureOffset(230, 931).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + bone40 = new ModelRenderer(this); + bone40.setRotationPoint(-3.628F, 15.426F, 34.8688F); + bone21.addChild(bone40); + setRotationAngle(bone40, 0.0F, 0.0F, 1.5708F); + cube_r231 = new ModelRenderer(this); + cube_r231.setRotationPoint(-43.4213F, -19.5186F, -104.6065F); + bone40.addChild(cube_r231); + setRotationAngle(cube_r231, -1.5708F, 0.0F, -0.9119F); + cube_r231.setTextureOffset(230, 931).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + cube_r232 = new ModelRenderer(this); + cube_r232.setRotationPoint(-20.7938F, -44.2674F, -104.6065F); + bone40.addChild(cube_r232); + setRotationAngle(cube_r232, -1.5708F, 0.0F, -0.7854F); + cube_r232.setTextureOffset(251, 727).addBox(-33.0F, -2.0F, 0.0F, 33.0F, 4.0F, 3.0F, 0.0F, false); + cube_r233 = new ModelRenderer(this); + cube_r233.setRotationPoint(-2.0F, -51.1078F, -104.6065F); + bone40.addChild(cube_r233); + setRotationAngle(cube_r233, -1.5708F, 0.0F, -0.3491F); + cube_r233.setTextureOffset(924, 372).addBox(-20.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone41 = new ModelRenderer(this); + bone41.setRotationPoint(-3.628F, 15.426F, -34.8688F); + bone18.addChild(bone41); + setRotationAngle(bone41, 0.0F, 0.0F, -3.1416F); + cube_r234 = new ModelRenderer(this); + cube_r234.setRotationPoint(-1.628F, -35.6818F, -69.7377F); + bone41.addChild(cube_r234); + setRotationAngle(cube_r234, -1.5708F, 0.0F, 0.3491F); + cube_r234.setTextureOffset(924, 364).addBox(0.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone42 = new ModelRenderer(this); + bone42.setRotationPoint(-3.628F, 15.426F, 23.1312F); + bone18.addChild(bone42); + setRotationAngle(bone42, 0.0F, 0.0F, -3.1416F); + cube_r235 = new ModelRenderer(this); + cube_r235.setRotationPoint(-1.628F, -35.6818F, -69.7377F); + bone42.addChild(cube_r235); + setRotationAngle(cube_r235, -1.5708F, 0.0F, 0.3491F); + cube_r235.setTextureOffset(924, 364).addBox(0.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone43 = new ModelRenderer(this); + bone43.setRotationPoint(-3.628F, 15.426F, 34.8688F); + bone42.addChild(bone43); + setRotationAngle(bone43, 0.0F, 0.0F, 1.5708F); + cube_r236 = new ModelRenderer(this); + cube_r236.setRotationPoint(-43.4213F, -19.5186F, -104.6065F); + bone43.addChild(cube_r236); + setRotationAngle(cube_r236, -1.5708F, 0.0F, -0.9119F); + cube_r236.setTextureOffset(230, 931).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + cube_r237 = new ModelRenderer(this); + cube_r237.setRotationPoint(-20.7938F, -44.2674F, -104.6065F); + bone43.addChild(cube_r237); + setRotationAngle(cube_r237, -1.5708F, 0.0F, -0.7854F); + cube_r237.setTextureOffset(251, 727).addBox(-33.0F, -2.0F, 0.0F, 33.0F, 4.0F, 3.0F, 0.0F, false); + cube_r238 = new ModelRenderer(this); + cube_r238.setRotationPoint(-2.0F, -51.1078F, -104.6065F); + bone43.addChild(cube_r238); + setRotationAngle(cube_r238, -1.5708F, 0.0F, -0.3491F); + cube_r238.setTextureOffset(924, 372).addBox(-20.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone45 = new ModelRenderer(this); + bone45.setRotationPoint(0.0F, 0.0F, 0.0F); + bone43.addChild(bone45); + setRotationAngle(bone45, 0.0F, 0.0F, -1.5708F); + cube_r239 = new ModelRenderer(this); + cube_r239.setRotationPoint(43.4213F, -19.5186F, -104.6065F); + bone45.addChild(cube_r239); + setRotationAngle(cube_r239, -1.5708F, 0.0F, 0.9119F); + cube_r239.setTextureOffset(230, 931).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + bone46 = new ModelRenderer(this); + bone46.setRotationPoint(-3.628F, 15.426F, -92.8688F); + bone18.addChild(bone46); + setRotationAngle(bone46, 0.0F, 0.0F, -3.1416F); + cube_r240 = new ModelRenderer(this); + cube_r240.setRotationPoint(-1.628F, -35.6818F, -69.7377F); + bone46.addChild(cube_r240); + setRotationAngle(cube_r240, -1.5708F, 0.0F, 0.3491F); + cube_r240.setTextureOffset(924, 364).addBox(0.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone47 = new ModelRenderer(this); + bone47.setRotationPoint(-3.628F, 15.426F, 34.8688F); + bone46.addChild(bone47); + setRotationAngle(bone47, 0.0F, 0.0F, 1.5708F); + cube_r241 = new ModelRenderer(this); + cube_r241.setRotationPoint(-43.4213F, -19.5186F, -104.6065F); + bone47.addChild(cube_r241); + setRotationAngle(cube_r241, -1.5708F, 0.0F, -0.9119F); + cube_r241.setTextureOffset(230, 931).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + cube_r242 = new ModelRenderer(this); + cube_r242.setRotationPoint(-20.7938F, -44.2674F, -104.6065F); + bone47.addChild(cube_r242); + setRotationAngle(cube_r242, -1.5708F, 0.0F, -0.7854F); + cube_r242.setTextureOffset(251, 727).addBox(-33.0F, -2.0F, 0.0F, 33.0F, 4.0F, 3.0F, 0.0F, false); + cube_r243 = new ModelRenderer(this); + cube_r243.setRotationPoint(-2.0F, -51.1078F, -104.6065F); + bone47.addChild(cube_r243); + setRotationAngle(cube_r243, -1.5708F, 0.0F, -0.3491F); + cube_r243.setTextureOffset(924, 372).addBox(-20.0F, -2.0F, 0.0F, 20.0F, 4.0F, 3.0F, 0.0F, false); + bone48 = new ModelRenderer(this); + bone48.setRotationPoint(0.0F, 0.0F, 0.0F); + bone47.addChild(bone48); + setRotationAngle(bone48, 0.0F, 0.0F, -1.5708F); + cube_r244 = new ModelRenderer(this); + cube_r244.setRotationPoint(43.4213F, -19.5186F, -104.6065F); + bone48.addChild(cube_r244); + setRotationAngle(cube_r244, -1.5708F, 0.0F, 0.9119F); + cube_r244.setTextureOffset(230, 931).addBox(-1.5F, -2.0F, -0.5F, 3.0F, 4.0F, 7.0F, 1.0F, false); + bone53 = new ModelRenderer(this); + bone53.setRotationPoint(-3.628F, 15.426F, 34.8688F); + bone46.addChild(bone53); + setRotationAngle(bone53, 0.0F, 0.0F, -3.1416F); + bone54 = new ModelRenderer(this); + bone54.setRotationPoint(0.0F, 0.0F, 58.0F); + bone17.addChild(bone54); + bone3 = new ModelRenderer(this); + bone3.setRotationPoint(0.0F, -55.0F, 49.5F); + setRotationAngle(bone3, 0.0F, 0.0F, -3.1416F); + cube_r245 = new ModelRenderer(this); + cube_r245.setRotationPoint(2.0F, -51.1078F, -85.6065F); + bone3.addChild(cube_r245); + setRotationAngle(cube_r245, -1.5708F, 0.0F, -1.4835F); + cube_r245.setTextureOffset(215, 834).addBox(-3.0F, -20.5F, 0.0F, 3.0F, 4.0F, 52.0F, 0.0F, true); + cube_r245.setTextureOffset(215, 834).addBox(-3.0F, -2.5F, 0.0F, 3.0F, 4.0F, 52.0F, 0.0F, true); + cube_r246 = new ModelRenderer(this); + cube_r246.setRotationPoint(-2.0F, -51.1078F, -85.6065F); + bone3.addChild(cube_r246); + setRotationAngle(cube_r246, -1.5708F, 0.0F, 1.4835F); + cube_r246.setTextureOffset(215, 834).addBox(0.0F, -20.5F, 0.0F, 3.0F, 4.0F, 52.0F, 0.0F, false); + cube_r246.setTextureOffset(215, 834).addBox(0.0F, -2.5F, 0.0F, 3.0F, 4.0F, 52.0F, 0.0F, false); + cube_r247 = new ModelRenderer(this); + cube_r247.setRotationPoint(0.0F, -4.0F, -190.5F); + bone3.addChild(cube_r247); + setRotationAngle(cube_r247, -0.8727F, 0.0F, 0.0F); + cube_r247.setTextureOffset(215, 773).addBox(-2.0F, -53.0F, 0.0F, 4.0F, 53.0F, 3.0F, 0.0F, false); + cube_r248 = new ModelRenderer(this); + cube_r248.setRotationPoint(0.0F, -38.0677F, -149.8996F); + bone3.addChild(cube_r248); + setRotationAngle(cube_r248, -1.1781F, 0.0F, 0.0F); + cube_r248.setTextureOffset(604, 912).addBox(-2.0F, -25.0F, 0.0F, 4.0F, 25.0F, 3.0F, 0.0F, false); + cube_r249 = new ModelRenderer(this); + cube_r249.setRotationPoint(0.0F, -47.6348F, -126.8027F); + bone3.addChild(cube_r249); + setRotationAngle(cube_r249, -1.3963F, 0.0F, 0.0F); + cube_r249.setTextureOffset(438, 925).addBox(-2.0F, -20.0F, 0.0F, 4.0F, 20.0F, 3.0F, 0.0F, false); + cube_r250 = new ModelRenderer(this); + cube_r250.setRotationPoint(0.0F, -51.1078F, -107.1065F); + bone3.addChild(cube_r250); + setRotationAngle(cube_r250, -1.5708F, 0.0F, 0.0F); + cube_r250.setTextureOffset(821, 522).addBox(-3.0F, -78.0F, -32.0F, 6.0F, 6.0F, 55.0F, 0.0F, false); + cube_r250.setTextureOffset(423, 834).addBox(-2.0F, -123.0F, 0.0F, 4.0F, 123.0F, 3.0F, 0.0F, false); + cube_r251 = new ModelRenderer(this); + cube_r251.setRotationPoint(0.0F, -51.1078F, 15.8935F); + bone3.addChild(cube_r251); + setRotationAngle(cube_r251, -1.7017F, 0.0F, 0.0F); + cube_r251.setTextureOffset(230, 773).addBox(-2.0F, -50.0F, 0.0F, 4.0F, 50.0F, 3.0F, 0.0F, false); + cube_r252 = new ModelRenderer(this); + cube_r252.setRotationPoint(0.0F, -44.5815F, 65.4657F); + bone3.addChild(cube_r252); + setRotationAngle(cube_r252, -1.8326F, 0.0F, 0.0F); + cube_r252.setTextureOffset(391, 883).addBox(-2.0F, -68.0F, 0.0F, 4.0F, 68.0F, 3.0F, 0.0F, false); + cube_r253 = new ModelRenderer(this); + cube_r253.setRotationPoint(0.0F, -26.9818F, 131.1487F); + bone3.addChild(cube_r253); + setRotationAngle(cube_r253, -2.0508F, 0.0F, 0.0F); + cube_r253.setTextureOffset(621, 737).addBox(-2.0F, -54.0F, 0.0F, 4.0F, 54.0F, 3.0F, 0.0F, false); + bone12 = new ModelRenderer(this); + bone12.setRotationPoint(0.0F, -55.0F, 49.5F); + setRotationAngle(bone12, 0.0F, 0.0F, 1.5708F); + cube_r254 = new ModelRenderer(this); + cube_r254.setRotationPoint(0.0F, -4.0F, -190.5F); + bone12.addChild(cube_r254); + setRotationAngle(cube_r254, -0.8727F, 0.0F, 0.0F); + cube_r254.setTextureOffset(215, 773).addBox(-2.0F, -53.0F, 0.0F, 4.0F, 53.0F, 3.0F, 0.0F, false); + cube_r255 = new ModelRenderer(this); + cube_r255.setRotationPoint(0.0F, -38.0677F, -149.8996F); + bone12.addChild(cube_r255); + setRotationAngle(cube_r255, -1.1781F, 0.0F, 0.0F); + cube_r255.setTextureOffset(604, 912).addBox(-2.0F, -25.0F, 0.0F, 4.0F, 25.0F, 3.0F, 0.0F, false); + cube_r256 = new ModelRenderer(this); + cube_r256.setRotationPoint(0.0F, -47.6348F, -126.8027F); + bone12.addChild(cube_r256); + setRotationAngle(cube_r256, -1.3963F, 0.0F, 0.0F); + cube_r256.setTextureOffset(438, 925).addBox(-2.0F, -20.0F, 0.0F, 4.0F, 20.0F, 3.0F, 0.0F, false); + cube_r257 = new ModelRenderer(this); + cube_r257.setRotationPoint(0.0F, -51.1078F, -107.1065F); + bone12.addChild(cube_r257); + setRotationAngle(cube_r257, -1.5708F, 0.0F, 0.0F); + cube_r257.setTextureOffset(423, 834).addBox(-2.0F, -123.0F, 0.0F, 4.0F, 123.0F, 3.0F, 0.0F, false); + cube_r258 = new ModelRenderer(this); + cube_r258.setRotationPoint(0.0F, -51.1078F, 15.8935F); + bone12.addChild(cube_r258); + setRotationAngle(cube_r258, -1.7017F, 0.0F, 0.0F); + cube_r258.setTextureOffset(230, 773).addBox(-2.0F, -50.0F, 0.0F, 4.0F, 50.0F, 3.0F, 0.0F, false); + cube_r259 = new ModelRenderer(this); + cube_r259.setRotationPoint(0.0F, -44.5815F, 65.4657F); + bone12.addChild(cube_r259); + setRotationAngle(cube_r259, -1.8326F, 0.0F, 0.0F); + cube_r259.setTextureOffset(391, 883).addBox(-2.0F, -68.0F, 0.0F, 4.0F, 68.0F, 3.0F, 0.0F, false); + cube_r260 = new ModelRenderer(this); + cube_r260.setRotationPoint(0.0F, -26.9818F, 131.1487F); + bone12.addChild(cube_r260); + setRotationAngle(cube_r260, -2.0508F, 0.0F, 0.0F); + cube_r260.setTextureOffset(621, 737).addBox(-2.0F, -54.0F, 0.0F, 4.0F, 54.0F, 3.0F, 0.0F, false); + bone13 = new ModelRenderer(this); + bone13.setRotationPoint(0.0F, -55.0F, 49.5F); + cube_r261 = new ModelRenderer(this); + cube_r261.setRotationPoint(0.0F, -4.0F, -190.5F); + bone13.addChild(cube_r261); + setRotationAngle(cube_r261, -0.8727F, 0.0F, 0.0F); + cube_r261.setTextureOffset(215, 773).addBox(-2.0F, -53.0F, 0.0F, 4.0F, 53.0F, 3.0F, 0.0F, false); + cube_r262 = new ModelRenderer(this); + cube_r262.setRotationPoint(0.0F, -38.0677F, -149.8996F); + bone13.addChild(cube_r262); + setRotationAngle(cube_r262, -1.1781F, 0.0F, 0.0F); + cube_r262.setTextureOffset(604, 912).addBox(-2.0F, -25.0F, 0.0F, 4.0F, 25.0F, 3.0F, 0.0F, false); + cube_r263 = new ModelRenderer(this); + cube_r263.setRotationPoint(0.0F, -47.6348F, -126.8027F); + bone13.addChild(cube_r263); + setRotationAngle(cube_r263, -1.3963F, 0.0F, 0.0F); + cube_r263.setTextureOffset(438, 925).addBox(-2.0F, -20.0F, 0.0F, 4.0F, 20.0F, 3.0F, 0.0F, false); + cube_r264 = new ModelRenderer(this); + cube_r264.setRotationPoint(0.0F, -51.1078F, -107.1065F); + bone13.addChild(cube_r264); + setRotationAngle(cube_r264, -1.5708F, 0.0F, 0.0F); + cube_r264.setTextureOffset(423, 834).addBox(-2.0F, -123.0F, 0.0F, 4.0F, 123.0F, 3.0F, 0.0F, false); + cube_r265 = new ModelRenderer(this); + cube_r265.setRotationPoint(0.0F, -51.1078F, 15.8935F); + bone13.addChild(cube_r265); + setRotationAngle(cube_r265, -1.7017F, 0.0F, 0.0F); + cube_r265.setTextureOffset(230, 773).addBox(-2.0F, -50.0F, 0.0F, 4.0F, 50.0F, 3.0F, 0.0F, false); + cube_r266 = new ModelRenderer(this); + cube_r266.setRotationPoint(0.0F, -44.5815F, 65.4657F); + bone13.addChild(cube_r266); + setRotationAngle(cube_r266, -1.8326F, 0.0F, 0.0F); + cube_r266.setTextureOffset(391, 883).addBox(-2.0F, -68.0F, 0.0F, 4.0F, 68.0F, 3.0F, 0.0F, false); + cube_r267 = new ModelRenderer(this); + cube_r267.setRotationPoint(0.0F, -26.9818F, 131.1487F); + bone13.addChild(cube_r267); + setRotationAngle(cube_r267, -2.0508F, 0.0F, 0.0F); + cube_r267.setTextureOffset(621, 737).addBox(-2.0F, -54.0F, 0.0F, 4.0F, 54.0F, 3.0F, 0.0F, false); + bone19 = new ModelRenderer(this); + bone19.setRotationPoint(0.0F, -55.0F, 49.5F); + setRotationAngle(bone19, 0.0F, 0.0F, -1.5708F); + cube_r268 = new ModelRenderer(this); + cube_r268.setRotationPoint(0.0F, -4.0F, -190.5F); + bone19.addChild(cube_r268); + setRotationAngle(cube_r268, -0.8727F, 0.0F, 0.0F); + cube_r268.setTextureOffset(215, 773).addBox(-2.0F, -53.0F, 0.0F, 4.0F, 53.0F, 3.0F, 0.0F, false); + cube_r269 = new ModelRenderer(this); + cube_r269.setRotationPoint(0.0F, -38.0677F, -149.8996F); + bone19.addChild(cube_r269); + setRotationAngle(cube_r269, -1.1781F, 0.0F, 0.0F); + cube_r269.setTextureOffset(604, 912).addBox(-2.0F, -25.0F, 0.0F, 4.0F, 25.0F, 3.0F, 0.0F, false); + cube_r270 = new ModelRenderer(this); + cube_r270.setRotationPoint(0.0F, -47.6348F, -126.8027F); + bone19.addChild(cube_r270); + setRotationAngle(cube_r270, -1.3963F, 0.0F, 0.0F); + cube_r270.setTextureOffset(438, 925).addBox(-2.0F, -20.0F, 0.0F, 4.0F, 20.0F, 3.0F, 0.0F, false); + cube_r271 = new ModelRenderer(this); + cube_r271.setRotationPoint(0.0F, -51.1078F, -107.1065F); + bone19.addChild(cube_r271); + setRotationAngle(cube_r271, -1.5708F, 0.0F, 0.0F); + cube_r271.setTextureOffset(423, 834).addBox(-2.0F, -123.0F, 0.0F, 4.0F, 123.0F, 3.0F, 0.0F, false); + cube_r272 = new ModelRenderer(this); + cube_r272.setRotationPoint(0.0F, -51.1078F, 15.8935F); + bone19.addChild(cube_r272); + setRotationAngle(cube_r272, -1.7017F, 0.0F, 0.0F); + cube_r272.setTextureOffset(230, 773).addBox(-2.0F, -50.0F, 0.0F, 4.0F, 50.0F, 3.0F, 0.0F, false); + cube_r273 = new ModelRenderer(this); + cube_r273.setRotationPoint(0.0F, -44.5815F, 65.4657F); + bone19.addChild(cube_r273); + setRotationAngle(cube_r273, -1.8326F, 0.0F, 0.0F); + cube_r273.setTextureOffset(391, 883).addBox(-2.0F, -68.0F, 0.0F, 4.0F, 68.0F, 3.0F, 0.0F, false); + cube_r274 = new ModelRenderer(this); + cube_r274.setRotationPoint(0.0F, -26.9818F, 131.1487F); + bone19.addChild(cube_r274); + setRotationAngle(cube_r274, -2.0508F, 0.0F, 0.0F); + cube_r274.setTextureOffset(621, 737).addBox(-2.0F, -54.0F, 0.0F, 4.0F, 54.0F, 3.0F, 0.0F, false); + bone4 = new ModelRenderer(this); + bone4.setRotationPoint(0.0F, -55.0F, 49.5F); + setRotationAngle(bone4, 0.0F, 0.0F, 1.5708F); + cube_r275 = new ModelRenderer(this); + cube_r275.setRotationPoint(-2.0F, 51.1078F, -85.1065F); + bone4.addChild(cube_r275); + setRotationAngle(cube_r275, 1.5708F, 0.0F, -1.3963F); + cube_r275.setTextureOffset(215, 891).addBox(0.0F, 16.0F, -35.0F, 3.0F, 4.0F, 35.0F, 0.0F, false); + cube_r275.setTextureOffset(215, 891).addBox(0.0F, -2.0F, -35.0F, 3.0F, 4.0F, 35.0F, 0.0F, false); + cube_r276 = new ModelRenderer(this); + cube_r276.setRotationPoint(-2.0F, -51.1078F, -85.1065F); + bone4.addChild(cube_r276); + setRotationAngle(cube_r276, -1.5708F, 0.0F, 1.3963F); + cube_r276.setTextureOffset(215, 891).addBox(0.0F, -20.0F, -35.0F, 3.0F, 4.0F, 35.0F, 0.0F, false); + cube_r276.setTextureOffset(215, 891).addBox(0.0F, -2.0F, -35.0F, 3.0F, 4.0F, 35.0F, 0.0F, false); + Engine = new ModelRenderer(this); + Engine.setRotationPoint(51.0F, -17.0F, -41.5F); + cube_r277 = new ModelRenderer(this); + cube_r277.setRotationPoint(0.0F, 0.0F, 14.5F); + Engine.addChild(cube_r277); + setRotationAngle(cube_r277, 0.0F, 0.0F, 0.4363F); + cube_r277.setTextureOffset(53, 902).addBox(-9.0F, -9.0F, -18.0F, 18.0F, 18.0F, 6.0F, 0.0F, false); + cube_r277.setTextureOffset(758, 845).addBox(-8.0F, -8.0F, -16.0F, 16.0F, 16.0F, 32.0F, 0.5F, false); + cube_r277.setTextureOffset(326, 834).addBox(-8.0F, -8.0F, -16.0F, 16.0F, 16.0F, 32.0F, 0.0F, false); + Propeller = new ModelRenderer(this); + Propeller.setRotationPoint(0.0F, 0.0F, -3.75F); + Engine.addChild(Propeller); + cube_r278 = new ModelRenderer(this); + cube_r278.setRotationPoint(0.0F, 0.0F, 1.75F); + Propeller.addChild(cube_r278); + setRotationAngle(cube_r278, 0.0F, 0.0F, 0.4363F); + cube_r278.setTextureOffset(924, 623).addBox(-2.0F, -2.0F, -6.5F, 4.0F, 4.0F, 13.0F, 0.0F, false); + cube_r278.setTextureOffset(870, 891).addBox(-18.0F, -18.0F, -3.5F, 36.0F, 36.0F, 0.0F, 0.0F, false); + Engine2 = new ModelRenderer(this); + Engine2.setRotationPoint(-51.0F, -17.0F, -41.5F); + cube_r279 = new ModelRenderer(this); + cube_r279.setRotationPoint(0.0F, 0.0F, 14.5F); + Engine2.addChild(cube_r279); + setRotationAngle(cube_r279, 0.0F, 0.0F, -0.4363F); + cube_r279.setTextureOffset(53, 902).addBox(-9.0F, -9.0F, -18.0F, 18.0F, 18.0F, 6.0F, 0.0F, true); + cube_r279.setTextureOffset(758, 845).addBox(-8.0F, -8.0F, -16.0F, 16.0F, 16.0F, 32.0F, 0.5F, true); + cube_r279.setTextureOffset(326, 834).addBox(-8.0F, -8.0F, -16.0F, 16.0F, 16.0F, 32.0F, 0.0F, true); + Propeller2 = new ModelRenderer(this); + Propeller2.setRotationPoint(0.0F, 0.0F, -3.75F); + Engine2.addChild(Propeller2); + cube_r280 = new ModelRenderer(this); + cube_r280.setRotationPoint(0.0F, 0.0F, 3.75F); + Propeller2.addChild(cube_r280); + setRotationAngle(cube_r280, 0.0F, 0.0F, -0.4363F); + cube_r280.setTextureOffset(870, 891).addBox(-18.0F, -18.0F, -5.5F, 36.0F, 36.0F, 0.0F, 0.0F, true); + cube_r280.setTextureOffset(924, 623).addBox(-2.0F, -2.0F, -8.5F, 4.0F, 4.0F, 13.0F, 0.0F, true); + SteeringWheel = new ModelRenderer(this); + SteeringWheel.setRotationPoint(0.0F, 19.0F, -17.5F); + SteeringWheel.setTextureOffset(924, 675).addBox(-7.0F, -7.0F, 0.0F, 14.0F, 14.0F, 0.0F, 0.0F, false); + bb_main = new ModelRenderer(this); + bb_main.setRotationPoint(0.0F, 24.0F, 0.0F); + bb_main.setTextureOffset(903, 584).addBox(-5.0F, -84.0F, -123.0F, 10.0F, 10.0F, 9.0F, 0.0F, false); + bb_main.setTextureOffset(462, 925).addBox(-4.0F, -83.0F, -141.0F, 8.0F, 8.0F, 4.0F, 0.0F, false); + bb_main.setTextureOffset(487, 925).addBox(-4.0F, -83.0F, 225.0F, 8.0F, 8.0F, 4.0F, 0.0F, false); + bb_main.setTextureOffset(821, 460).addBox(-1.0F, -140.0F, 4.0F, 2.0F, 2.0F, 59.0F, 0.0F, false); + bb_main.setTextureOffset(745, 894).addBox(-1.0F, -158.0F, 4.0F, 2.0F, 2.0F, 31.0F, 0.0F, false); + bb_main.setTextureOffset(791, 0).addBox(-38.0F, -117.0F, -99.0F, 76.0F, 76.0F, 0.0F, 0.0F, false); + bb_main.setTextureOffset(870, 845).addBox(-23.0F, -102.0F, 190.0F, 46.0F, 45.0F, 0.0F, 0.0F, false); + bb_main.setTextureOffset(251, 737).addBox(-48.0F, -127.0F, 102.0F, 96.0F, 96.0F, 0.0F, 0.0F, false); + bb_main.setTextureOffset(335, 607).addBox(-12.0F, 4.0F, -65.0F, 24.0F, 0.0F, 129.0F, 0.0F, false); + bb_main.setTextureOffset(791, 702).addBox(12.0F, 3.0F, -33.0F, 2.0F, 3.0F, 66.0F, 0.0F, false); + bb_main.setTextureOffset(621, 801).addBox(12.0F, -4.0F, -33.0F, 2.0F, 2.0F, 66.0F, 0.0F, false); + bb_main.setTextureOffset(444, 737).addBox(-1.0F, 16.0F, -43.0F, 2.0F, 4.0F, 86.0F, 0.0F, false); + bb_main.setTextureOffset(349, 938).addBox(-1.0F, -6.0F, -20.0F, 2.0F, 11.0F, 2.0F, 0.0F, false); + bb_main.setTextureOffset(791, 388).addBox(-1.0F, -6.0F, -18.0F, 2.0F, 2.0F, 1.0F, 0.0F, false); + bb_main.setTextureOffset(515, 885).addBox(9.0F, -12.0F, -28.5F, 0.0F, 18.0F, 18.0F, 0.0F, false); + bb_main.setTextureOffset(552, 912).addBox(-9.0F, -12.0F, -28.5F, 0.0F, 18.0F, 18.0F, 0.0F, false); + bb_main.setTextureOffset(791, 154).addBox(-38.0F, -41.0F, -55.0F, 76.0F, 76.0F, 0.0F, 0.0F, false); + bb_main.setTextureOffset(791, 231).addBox(-38.0F, -41.0F, 62.0F, 76.0F, 76.0F, 0.0F, 0.0F, false); + bb_main.setTextureOffset(791, 702).addBox(-14.0F, 3.0F, -33.0F, 2.0F, 3.0F, 66.0F, 0.0F, true); + bb_main.setTextureOffset(621, 801).addBox(-14.0F, -4.0F, -33.0F, 2.0F, 2.0F, 66.0F, 0.0F, true); + bb_main.setTextureOffset(791, 0).addBox(-38.0F, -117.0F, 140.0F, 76.0F, 76.0F, 0.0F, 0.0F, false); + bb_main.setTextureOffset(0, 0).addBox(-53.0F, -132.0F, -26.0F, 106.0F, 106.0F, 0.0F, 0.0F, false); + bb_main.setTextureOffset(0, 0).addBox(-53.0F, -132.0F, 32.0F, 106.0F, 106.0F, 0.0F, 0.0F, false); + cube_r281 = new ModelRenderer(this); + cube_r281.setRotationPoint(-7.5355F, -16.4182F, 0.0F); + bb_main.addChild(cube_r281); + setRotationAngle(cube_r281, -3.1416F, 0.0F, -2.6616F); + cube_r281.setTextureOffset(791, 607).addBox(0.0F, -14.0F, -33.0F, 0.0F, 28.0F, 66.0F, 0.0F, true); + cube_r282 = new ModelRenderer(this); + cube_r282.setRotationPoint(-28.3142F, -31.4973F, 0.0F); + bb_main.addChild(cube_r282); + setRotationAngle(cube_r282, -3.1416F, 0.0F, 2.6616F); + cube_r282.setTextureOffset(0, 773).addBox(0.0F, -31.0F, -33.0F, 0.0F, 62.0F, 66.0F, 0.0F, true); + cube_r283 = new ModelRenderer(this); + cube_r283.setRotationPoint(-13.0F, 0.5F, 0.0F); + bb_main.addChild(cube_r283); + setRotationAngle(cube_r283, 0.0F, 0.0F, 3.1416F); + cube_r283.setTextureOffset(821, 388).addBox(0.0F, -2.5F, -33.0F, 0.0F, 5.0F, 66.0F, 0.0F, true); + cube_r284 = new ModelRenderer(this); + cube_r284.setRotationPoint(-12.3559F, 0.5F, -37.8267F); + bb_main.addChild(cube_r284); + setRotationAngle(cube_r284, 0.0F, 0.1309F, 3.1416F); + cube_r284.setTextureOffset(78, 927).addBox(0.0F, -2.5F, -5.0F, 0.0F, 5.0F, 10.0F, 0.0F, true); + cube_r285 = new ModelRenderer(this); + cube_r285.setRotationPoint(-4.6215F, 0.5F, -56.5455F); + bb_main.addChild(cube_r285); + setRotationAngle(cube_r285, 0.0F, 0.5672F, -3.1416F); + cube_r285.setTextureOffset(515, 922).addBox(0.0F, -2.5F, -9.0F, 0.0F, 5.0F, 18.0F, 0.0F, true); + cube_r286 = new ModelRenderer(this); + cube_r286.setRotationPoint(-10.558F, 0.5F, -45.8614F); + bb_main.addChild(cube_r286); + setRotationAngle(cube_r286, 0.0F, 0.3491F, 3.1416F); + cube_r286.setTextureOffset(325, 938).addBox(0.0F, -2.5F, -3.5F, 0.0F, 5.0F, 7.0F, 0.0F, true); + cube_r287 = new ModelRenderer(this); + cube_r287.setRotationPoint(-12.3559F, 0.5F, 37.8267F); + bb_main.addChild(cube_r287); + setRotationAngle(cube_r287, 0.0F, -0.1309F, 3.1416F); + cube_r287.setTextureOffset(78, 927).addBox(0.0F, -2.5F, -5.0F, 0.0F, 5.0F, 10.0F, 0.0F, true); + cube_r288 = new ModelRenderer(this); + cube_r288.setRotationPoint(-10.558F, 0.5F, 45.8614F); + bb_main.addChild(cube_r288); + setRotationAngle(cube_r288, 0.0F, -0.3491F, 3.1416F); + cube_r288.setTextureOffset(325, 943).addBox(0.0F, -2.5F, -3.5F, 0.0F, 5.0F, 7.0F, 0.0F, true); + cube_r289 = new ModelRenderer(this); + cube_r289.setRotationPoint(-4.6215F, 0.5F, 56.5455F); + bb_main.addChild(cube_r289); + setRotationAngle(cube_r289, 0.0F, -0.5672F, 3.1416F); + cube_r289.setTextureOffset(515, 927).addBox(0.0F, -2.5F, -9.0F, 0.0F, 5.0F, 18.0F, 0.0F, true); + cube_r290 = new ModelRenderer(this); + cube_r290.setRotationPoint(-10.3006F, -2.5F, 49.4923F); + bb_main.addChild(cube_r290); + setRotationAngle(cube_r290, 0.0F, 0.5672F, 0.0F); + cube_r290.setTextureOffset(862, 584).addBox(0.0F, -1.5F, 0.0F, 2.0F, 2.0F, 18.0F, 0.0F, true); + cube_r290.setTextureOffset(821, 584).addBox(0.0F, 5.5F, 0.0F, 2.0F, 3.0F, 18.0F, 0.0F, true); + cube_r291 = new ModelRenderer(this); + cube_r291.setRotationPoint(-12.6947F, -2.5F, 42.9145F); + bb_main.addChild(cube_r291); + setRotationAngle(cube_r291, 0.0F, 0.3491F, 0.0F); + cube_r291.setTextureOffset(172, 932).addBox(0.0F, -1.5F, 0.0F, 2.0F, 2.0F, 7.0F, 0.0F, true); + cube_r291.setTextureOffset(272, 931).addBox(0.0F, 5.5F, 0.0F, 2.0F, 3.0F, 7.0F, 0.0F, true); + cube_r292 = new ModelRenderer(this); + cube_r292.setRotationPoint(-14.0F, -2.5F, 33.0F); + bb_main.addChild(cube_r292); + setRotationAngle(cube_r292, 0.0F, 0.1309F, 0.0F); + cube_r292.setTextureOffset(53, 927).addBox(0.0F, -1.5F, 0.0F, 2.0F, 2.0F, 10.0F, 0.0F, true); + cube_r292.setTextureOffset(924, 829).addBox(0.0F, 5.5F, 0.0F, 2.0F, 3.0F, 10.0F, 0.0F, true); + cube_r293 = new ModelRenderer(this); + cube_r293.setRotationPoint(-14.0F, -2.5F, -33.0F); + bb_main.addChild(cube_r293); + setRotationAngle(cube_r293, 0.0F, -0.1309F, 0.0F); + cube_r293.setTextureOffset(53, 927).addBox(0.0F, -1.5F, -10.0F, 2.0F, 2.0F, 10.0F, 0.0F, true); + cube_r293.setTextureOffset(924, 829).addBox(0.0F, 5.5F, -10.0F, 2.0F, 3.0F, 10.0F, 0.0F, true); + cube_r294 = new ModelRenderer(this); + cube_r294.setRotationPoint(-12.6947F, -2.5F, -42.9145F); + bb_main.addChild(cube_r294); + setRotationAngle(cube_r294, 0.0F, -0.3491F, 0.0F); + cube_r294.setTextureOffset(172, 932).addBox(0.0F, -1.5F, -7.0F, 2.0F, 2.0F, 7.0F, 0.0F, true); + cube_r294.setTextureOffset(272, 931).addBox(0.0F, 5.5F, -7.0F, 2.0F, 3.0F, 7.0F, 0.0F, true); + cube_r295 = new ModelRenderer(this); + cube_r295.setRotationPoint(-10.3006F, -2.5F, -49.4923F); + bb_main.addChild(cube_r295); + setRotationAngle(cube_r295, 0.0F, -0.5672F, 0.0F); + cube_r295.setTextureOffset(862, 584).addBox(0.0F, -1.5F, -18.0F, 2.0F, 2.0F, 18.0F, 0.0F, true); + cube_r295.setTextureOffset(821, 584).addBox(0.0F, 5.5F, -18.0F, 2.0F, 3.0F, 18.0F, 0.0F, true); + cube_r296 = new ModelRenderer(this); + cube_r296.setRotationPoint(-4.2544F, 6.642F, 56.3345F); + bb_main.addChild(cube_r296); + setRotationAngle(cube_r296, 0.0892F, -0.4798F, 2.701F); + cube_r296.setTextureOffset(924, 303).addBox(0.0F, -2.5F, -9.0F, 0.0F, 5.0F, 18.0F, 0.0F, true); + cube_r297 = new ModelRenderer(this); + cube_r297.setRotationPoint(0.0F, 12.0912F, 0.0F); + bb_main.addChild(cube_r297); + setRotationAngle(cube_r297, -2.8379F, -0.4002F, 2.246F); + cube_r297.setTextureOffset(758, 801).addBox(21.4806F, -19.9108F, -54.4612F, 0.0F, 9.0F, 15.0F, 0.0F, true); + cube_r298 = new ModelRenderer(this); + cube_r298.setRotationPoint(-3.9541F, 14.2522F, 44.4667F); + bb_main.addChild(cube_r298); + setRotationAngle(cube_r298, 0.1326F, -0.3053F, 2.261F); + cube_r298.setTextureOffset(198, 928).addBox(0.0F, -6.0F, -3.5F, 0.0F, 12.0F, 7.0F, 0.0F, true); + cube_r299 = new ModelRenderer(this); + cube_r299.setRotationPoint(-9.5826F, 7.7165F, 45.2119F); + bb_main.addChild(cube_r299); + setRotationAngle(cube_r299, 0.0F, -0.3491F, 2.7053F); + cube_r299.setTextureOffset(796, 934).addBox(0.0F, -3.0F, -3.5F, 0.0F, 6.0F, 7.0F, 0.0F, true); + cube_r300 = new ModelRenderer(this); + cube_r300.setRotationPoint(-4.986F, 15.317F, 37.1762F); + bb_main.addChild(cube_r300); + setRotationAngle(cube_r300, 0.0436F, -0.1309F, 2.2689F); + cube_r300.setTextureOffset(924, 806).addBox(0.0F, -6.5F, -4.5F, 0.0F, 13.0F, 9.0F, 0.0F, true); + cube_r301 = new ModelRenderer(this); + cube_r301.setRotationPoint(-11.1998F, 8.4707F, 37.4615F); + bb_main.addChild(cube_r301); + setRotationAngle(cube_r301, 0.0F, -0.1309F, 2.7053F); + cube_r301.setTextureOffset(928, 741).addBox(0.0F, -3.0F, -4.5F, 0.0F, 6.0F, 9.0F, 0.0F, true); + cube_r302 = new ModelRenderer(this); + cube_r302.setRotationPoint(-11.7322F, 8.7189F, 0.0F); + bb_main.addChild(cube_r302); + setRotationAngle(cube_r302, 0.0F, -3.1416F, -0.4363F); + cube_r302.setTextureOffset(791, 772).addBox(0.0F, -3.0F, -33.0F, 0.0F, 6.0F, 66.0F, 0.0F, true); + cube_r303 = new ModelRenderer(this); + cube_r303.setRotationPoint(-5.485F, 15.616F, 0.0F); + bb_main.addChild(cube_r303); + setRotationAngle(cube_r303, 0.0F, -3.1416F, -0.8727F); + cube_r303.setTextureOffset(791, 308).addBox(0.0F, -6.5F, -33.0F, 0.0F, 13.0F, 66.0F, 0.0F, true); + cube_r304 = new ModelRenderer(this); + cube_r304.setRotationPoint(-11.1998F, 8.4707F, -37.4615F); + bb_main.addChild(cube_r304); + setRotationAngle(cube_r304, 0.0F, 0.1309F, 2.7053F); + cube_r304.setTextureOffset(928, 741).addBox(0.0F, -3.0F, -4.5F, 0.0F, 6.0F, 9.0F, 0.0F, true); + cube_r305 = new ModelRenderer(this); + cube_r305.setRotationPoint(-4.986F, 15.317F, -37.1762F); + bb_main.addChild(cube_r305); + setRotationAngle(cube_r305, -0.0436F, 0.1309F, 2.2689F); + cube_r305.setTextureOffset(924, 806).addBox(0.0F, -6.5F, -4.5F, 0.0F, 13.0F, 9.0F, 0.0F, true); + cube_r306 = new ModelRenderer(this); + cube_r306.setRotationPoint(-0.8502F, 12.0912F, -53.8845F); + bb_main.addChild(cube_r306); + setRotationAngle(cube_r306, 2.8379F, 0.4002F, 2.246F); + cube_r306.setTextureOffset(758, 792).addBox(0.0F, -4.5F, -7.5F, 0.0F, 9.0F, 15.0F, 0.0F, true); + cube_r307 = new ModelRenderer(this); + cube_r307.setRotationPoint(-3.9541F, 14.2522F, -44.4667F); + bb_main.addChild(cube_r307); + setRotationAngle(cube_r307, -0.1326F, 0.3053F, 2.261F); + cube_r307.setTextureOffset(198, 928).addBox(0.0F, -6.0F, -3.5F, 0.0F, 12.0F, 7.0F, 0.0F, true); + cube_r308 = new ModelRenderer(this); + cube_r308.setRotationPoint(-9.5826F, 7.7165F, -45.2119F); + bb_main.addChild(cube_r308); + setRotationAngle(cube_r308, 0.0F, 0.3491F, 2.7053F); + cube_r308.setTextureOffset(796, 928).addBox(0.0F, -3.0F, -3.5F, 0.0F, 6.0F, 7.0F, 0.0F, true); + cube_r309 = new ModelRenderer(this); + cube_r309.setRotationPoint(-4.2544F, 6.642F, -56.3345F); + bb_main.addChild(cube_r309); + setRotationAngle(cube_r309, -0.0892F, 0.4798F, 2.701F); + cube_r309.setTextureOffset(924, 308).addBox(0.0F, -2.5F, -9.0F, 0.0F, 5.0F, 18.0F, 0.0F, true); + cube_r310 = new ModelRenderer(this); + cube_r310.setRotationPoint(4.2544F, 6.642F, 56.3345F); + bb_main.addChild(cube_r310); + setRotationAngle(cube_r310, 0.0892F, 0.4798F, -2.701F); + cube_r310.setTextureOffset(924, 303).addBox(0.0F, -2.5F, -9.0F, 0.0F, 5.0F, 18.0F, 0.0F, false); + cube_r311 = new ModelRenderer(this); + cube_r311.setRotationPoint(4.6215F, 0.5F, 56.5455F); + bb_main.addChild(cube_r311); + setRotationAngle(cube_r311, 0.0F, 0.5672F, -3.1416F); + cube_r311.setTextureOffset(515, 927).addBox(0.0F, -2.5F, -9.0F, 0.0F, 5.0F, 18.0F, 0.0F, false); + cube_r312 = new ModelRenderer(this); + cube_r312.setRotationPoint(11.7322F, 8.7189F, 0.0F); + bb_main.addChild(cube_r312); + setRotationAngle(cube_r312, 0.0F, 3.1416F, 0.4363F); + cube_r312.setTextureOffset(791, 772).addBox(0.0F, -3.0F, -33.0F, 0.0F, 6.0F, 66.0F, 0.0F, false); + cube_r313 = new ModelRenderer(this); + cube_r313.setRotationPoint(5.485F, 15.616F, 0.0F); + bb_main.addChild(cube_r313); + setRotationAngle(cube_r313, 0.0F, 3.1416F, 0.8727F); + cube_r313.setTextureOffset(791, 308).addBox(0.0F, -6.5F, -33.0F, 0.0F, 13.0F, 66.0F, 0.0F, false); + cube_r314 = new ModelRenderer(this); + cube_r314.setRotationPoint(14.0F, 4.5F, 33.0F); + bb_main.addChild(cube_r314); + setRotationAngle(cube_r314, 0.0F, -0.1309F, 0.0F); + cube_r314.setTextureOffset(924, 829).addBox(-2.0F, -1.5F, 0.0F, 2.0F, 3.0F, 10.0F, 0.0F, false); + cube_r314.setTextureOffset(53, 927).addBox(-2.0F, -8.5F, 0.0F, 2.0F, 2.0F, 10.0F, 0.0F, false); + cube_r315 = new ModelRenderer(this); + cube_r315.setRotationPoint(12.6947F, 4.5F, 42.9145F); + bb_main.addChild(cube_r315); + setRotationAngle(cube_r315, 0.0F, -0.3491F, 0.0F); + cube_r315.setTextureOffset(272, 931).addBox(-2.0F, -1.5F, 0.0F, 2.0F, 3.0F, 7.0F, 0.0F, false); + cube_r315.setTextureOffset(172, 932).addBox(-2.0F, -8.5F, 0.0F, 2.0F, 2.0F, 7.0F, 0.0F, false); + cube_r316 = new ModelRenderer(this); + cube_r316.setRotationPoint(10.3006F, 4.5F, 49.4923F); + bb_main.addChild(cube_r316); + setRotationAngle(cube_r316, 0.0F, -0.5672F, 0.0F); + cube_r316.setTextureOffset(821, 584).addBox(-2.0F, -1.5F, 0.0F, 2.0F, 3.0F, 18.0F, 0.0F, false); + cube_r316.setTextureOffset(862, 584).addBox(-2.0F, -8.5F, 0.0F, 2.0F, 2.0F, 18.0F, 0.0F, false); + cube_r317 = new ModelRenderer(this); + cube_r317.setRotationPoint(0.0F, 20.0F, 43.0F); + bb_main.addChild(cube_r317); + setRotationAngle(cube_r317, 0.3054F, 0.0F, 0.0F); + cube_r317.setTextureOffset(928, 757).addBox(-1.0F, -4.0F, 0.0F, 2.0F, 4.0F, 8.0F, 0.0F, false); + cube_r318 = new ModelRenderer(this); + cube_r318.setRotationPoint(0.0F, 17.5943F, 50.6297F); + bb_main.addChild(cube_r318); + setRotationAngle(cube_r318, 0.5236F, 0.0F, 0.0F); + cube_r318.setTextureOffset(757, 846).addBox(-1.0F, -4.0F, 0.0F, 2.0F, 4.0F, 14.0F, 0.0F, false); + cube_r319 = new ModelRenderer(this); + cube_r319.setRotationPoint(0.0F, 10.5944F, 62.7541F); + bb_main.addChild(cube_r319); + setRotationAngle(cube_r319, 1.1345F, 0.0F, 0.0F); + cube_r319.setTextureOffset(153, 932).addBox(-1.0F, -3.0F, 0.0F, 2.0F, 3.0F, 7.0F, 0.0F, false); + cube_r320 = new ModelRenderer(this); + cube_r320.setRotationPoint(0.0F, 4.2502F, 65.7124F); + bb_main.addChild(cube_r320); + setRotationAngle(cube_r320, 1.5708F, 0.0F, 0.0F); + cube_r320.setTextureOffset(928, 729).addBox(-1.0F, -2.0F, 0.0F, 2.0F, 2.0F, 9.0F, 0.0F, false); + cube_r321 = new ModelRenderer(this); + cube_r321.setRotationPoint(11.1998F, 8.4707F, 37.4615F); + bb_main.addChild(cube_r321); + setRotationAngle(cube_r321, 0.0F, 0.1309F, -2.7053F); + cube_r321.setTextureOffset(928, 741).addBox(0.0F, -3.0F, -4.5F, 0.0F, 6.0F, 9.0F, 0.0F, false); + cube_r322 = new ModelRenderer(this); + cube_r322.setRotationPoint(9.5826F, 7.7165F, 45.2119F); + bb_main.addChild(cube_r322); + setRotationAngle(cube_r322, 0.0F, 0.3491F, -2.7053F); + cube_r322.setTextureOffset(796, 934).addBox(0.0F, -3.0F, -3.5F, 0.0F, 6.0F, 7.0F, 0.0F, false); + cube_r323 = new ModelRenderer(this); + cube_r323.setRotationPoint(4.986F, 15.317F, 37.1762F); + bb_main.addChild(cube_r323); + setRotationAngle(cube_r323, 0.0436F, 0.1309F, -2.2689F); + cube_r323.setTextureOffset(924, 806).addBox(0.0F, -6.5F, -4.5F, 0.0F, 13.0F, 9.0F, 0.0F, false); + cube_r324 = new ModelRenderer(this); + cube_r324.setRotationPoint(3.9541F, 14.2522F, 44.4667F); + bb_main.addChild(cube_r324); + setRotationAngle(cube_r324, 0.1326F, 0.3053F, -2.261F); + cube_r324.setTextureOffset(198, 928).addBox(0.0F, -6.0F, -3.5F, 0.0F, 12.0F, 7.0F, 0.0F, false); + cube_r325 = new ModelRenderer(this); + cube_r325.setRotationPoint(0.0F, 12.0912F, 0.0F); + bb_main.addChild(cube_r325); + setRotationAngle(cube_r325, -2.8379F, 0.4002F, -2.246F); + cube_r325.setTextureOffset(758, 801).addBox(-21.4806F, -19.9108F, -54.4612F, 0.0F, 9.0F, 15.0F, 0.0F, false); + cube_r326 = new ModelRenderer(this); + cube_r326.setRotationPoint(12.3559F, 0.5F, 37.8267F); + bb_main.addChild(cube_r326); + setRotationAngle(cube_r326, 0.0F, 0.1309F, -3.1416F); + cube_r326.setTextureOffset(78, 927).addBox(0.0F, -2.5F, -5.0F, 0.0F, 5.0F, 10.0F, 0.0F, false); + cube_r327 = new ModelRenderer(this); + cube_r327.setRotationPoint(10.558F, 0.5F, 45.8614F); + bb_main.addChild(cube_r327); + setRotationAngle(cube_r327, 0.0F, 0.3491F, -3.1416F); + cube_r327.setTextureOffset(325, 943).addBox(0.0F, -2.5F, -3.5F, 0.0F, 5.0F, 7.0F, 0.0F, false); + cube_r328 = new ModelRenderer(this); + cube_r328.setRotationPoint(0.0F, -4.7498F, 65.7124F); + bb_main.addChild(cube_r328); + setRotationAngle(cube_r328, 0.5672F, 0.0F, 0.0F); + cube_r328.setTextureOffset(0, 711).addBox(-32.0F, 0.0F, 0.0F, 64.0F, 0.0F, 61.0F, 0.0F, false); + cube_r329 = new ModelRenderer(this); + cube_r329.setRotationPoint(0.0F, -4.7498F, -65.7124F); + bb_main.addChild(cube_r329); + setRotationAngle(cube_r329, -0.7854F, 0.0F, 0.0F); + cube_r329.setTextureOffset(0, 607).addBox(-32.0F, 0.0F, -103.0F, 64.0F, 0.0F, 103.0F, 0.0F, false); + cube_r330 = new ModelRenderer(this); + cube_r330.setRotationPoint(28.3142F, -31.4973F, 0.0F); + bb_main.addChild(cube_r330); + setRotationAngle(cube_r330, -3.1416F, 0.0F, -2.6616F); + cube_r330.setTextureOffset(0, 773).addBox(0.0F, -31.0F, -33.0F, 0.0F, 62.0F, 66.0F, 0.0F, false); + cube_r331 = new ModelRenderer(this); + cube_r331.setRotationPoint(7.5355F, -16.4182F, 0.0F); + bb_main.addChild(cube_r331); + setRotationAngle(cube_r331, -3.1416F, 0.0F, 2.6616F); + cube_r331.setTextureOffset(791, 607).addBox(0.0F, -14.0F, -33.0F, 0.0F, 28.0F, 66.0F, 0.0F, false); + cube_r332 = new ModelRenderer(this); + cube_r332.setRotationPoint(10.558F, 0.5F, -45.8614F); + bb_main.addChild(cube_r332); + setRotationAngle(cube_r332, 0.0F, -0.3491F, -3.1416F); + cube_r332.setTextureOffset(325, 938).addBox(0.0F, -2.5F, -3.5F, 0.0F, 5.0F, 7.0F, 0.0F, false); + cube_r333 = new ModelRenderer(this); + cube_r333.setRotationPoint(13.0F, 0.5F, 0.0F); + bb_main.addChild(cube_r333); + setRotationAngle(cube_r333, 0.0F, 0.0F, -3.1416F); + cube_r333.setTextureOffset(821, 388).addBox(0.0F, -2.5F, -33.0F, 0.0F, 5.0F, 66.0F, 0.0F, false); + cube_r334 = new ModelRenderer(this); + cube_r334.setRotationPoint(12.3559F, 0.5F, -37.8267F); + bb_main.addChild(cube_r334); + setRotationAngle(cube_r334, 0.0F, -0.1309F, -3.1416F); + cube_r334.setTextureOffset(78, 927).addBox(0.0F, -2.5F, -5.0F, 0.0F, 5.0F, 10.0F, 0.0F, false); + cube_r335 = new ModelRenderer(this); + cube_r335.setRotationPoint(4.6215F, 0.5F, -56.5455F); + bb_main.addChild(cube_r335); + setRotationAngle(cube_r335, 0.0F, -0.5672F, 3.1416F); + cube_r335.setTextureOffset(515, 922).addBox(0.0F, -2.5F, -9.0F, 0.0F, 5.0F, 18.0F, 0.0F, false); + cube_r336 = new ModelRenderer(this); + cube_r336.setRotationPoint(0.8502F, 12.0912F, -53.8845F); + bb_main.addChild(cube_r336); + setRotationAngle(cube_r336, 2.8379F, -0.4002F, -2.246F); + cube_r336.setTextureOffset(758, 792).addBox(0.0F, -4.5F, -7.5F, 0.0F, 9.0F, 15.0F, 0.0F, false); + cube_r337 = new ModelRenderer(this); + cube_r337.setRotationPoint(3.9541F, 14.2522F, -44.4667F); + bb_main.addChild(cube_r337); + setRotationAngle(cube_r337, -0.1326F, -0.3053F, -2.261F); + cube_r337.setTextureOffset(198, 928).addBox(0.0F, -6.0F, -3.5F, 0.0F, 12.0F, 7.0F, 0.0F, false); + cube_r338 = new ModelRenderer(this); + cube_r338.setRotationPoint(4.986F, 15.317F, -37.1762F); + bb_main.addChild(cube_r338); + setRotationAngle(cube_r338, -0.0436F, -0.1309F, -2.2689F); + cube_r338.setTextureOffset(924, 806).addBox(0.0F, -6.5F, -4.5F, 0.0F, 13.0F, 9.0F, 0.0F, false); + cube_r339 = new ModelRenderer(this); + cube_r339.setRotationPoint(4.2544F, 6.642F, -56.3345F); + bb_main.addChild(cube_r339); + setRotationAngle(cube_r339, -0.0892F, -0.4798F, -2.701F); + cube_r339.setTextureOffset(924, 308).addBox(0.0F, -2.5F, -9.0F, 0.0F, 5.0F, 18.0F, 0.0F, false); + cube_r340 = new ModelRenderer(this); + cube_r340.setRotationPoint(9.5826F, 7.7165F, -45.2119F); + bb_main.addChild(cube_r340); + setRotationAngle(cube_r340, 0.0F, -0.3491F, -2.7053F); + cube_r340.setTextureOffset(796, 928).addBox(0.0F, -3.0F, -3.5F, 0.0F, 6.0F, 7.0F, 0.0F, false); + cube_r341 = new ModelRenderer(this); + cube_r341.setRotationPoint(11.1998F, 8.4707F, -37.4615F); + bb_main.addChild(cube_r341); + setRotationAngle(cube_r341, 0.0F, -0.1309F, -2.7053F); + cube_r341.setTextureOffset(928, 741).addBox(0.0F, -3.0F, -4.5F, 0.0F, 6.0F, 9.0F, 0.0F, false); + cube_r342 = new ModelRenderer(this); + cube_r342.setRotationPoint(14.0F, -2.5F, -33.0F); + bb_main.addChild(cube_r342); + setRotationAngle(cube_r342, 0.0F, 0.1309F, 0.0F); + cube_r342.setTextureOffset(53, 927).addBox(-2.0F, -1.5F, -10.0F, 2.0F, 2.0F, 10.0F, 0.0F, false); + cube_r342.setTextureOffset(924, 829).addBox(-2.0F, 5.5F, -10.0F, 2.0F, 3.0F, 10.0F, 0.0F, false); + cube_r343 = new ModelRenderer(this); + cube_r343.setRotationPoint(10.3006F, -2.5F, -49.4923F); + bb_main.addChild(cube_r343); + setRotationAngle(cube_r343, 0.0F, 0.5672F, 0.0F); + cube_r343.setTextureOffset(862, 584).addBox(-2.0F, -1.5F, -18.0F, 2.0F, 2.0F, 18.0F, 0.0F, false); + cube_r343.setTextureOffset(821, 584).addBox(-2.0F, 5.5F, -18.0F, 2.0F, 3.0F, 18.0F, 0.0F, false); + cube_r344 = new ModelRenderer(this); + cube_r344.setRotationPoint(12.6947F, -2.5F, -42.9145F); + bb_main.addChild(cube_r344); + setRotationAngle(cube_r344, 0.0F, 0.3491F, 0.0F); + cube_r344.setTextureOffset(172, 932).addBox(-2.0F, -1.5F, -7.0F, 2.0F, 2.0F, 7.0F, 0.0F, false); + cube_r344.setTextureOffset(272, 931).addBox(-2.0F, 5.5F, -7.0F, 2.0F, 3.0F, 7.0F, 0.0F, false); + cube_r345 = new ModelRenderer(this); + cube_r345.setRotationPoint(0.0F, 4.2502F, -65.7124F); + bb_main.addChild(cube_r345); + setRotationAngle(cube_r345, -1.5708F, 0.0F, 0.0F); + cube_r345.setTextureOffset(928, 729).addBox(-1.0F, -2.0F, -9.0F, 2.0F, 2.0F, 9.0F, 0.0F, false); + cube_r346 = new ModelRenderer(this); + cube_r346.setRotationPoint(0.0F, 10.5944F, -62.7541F); + bb_main.addChild(cube_r346); + setRotationAngle(cube_r346, -1.1345F, 0.0F, 0.0F); + cube_r346.setTextureOffset(153, 932).addBox(-1.0F, -3.0F, -7.0F, 2.0F, 3.0F, 7.0F, 0.0F, false); + cube_r347 = new ModelRenderer(this); + cube_r347.setRotationPoint(0.0F, 17.5943F, -50.6297F); + bb_main.addChild(cube_r347); + setRotationAngle(cube_r347, -0.5236F, 0.0F, 0.0F); + cube_r347.setTextureOffset(758, 826).addBox(-1.0F, -4.0F, -14.0F, 2.0F, 4.0F, 14.0F, 0.0F, false); + cube_r348 = new ModelRenderer(this); + cube_r348.setRotationPoint(0.0F, 20.0F, -43.0F); + bb_main.addChild(cube_r348); + setRotationAngle(cube_r348, -0.3054F, 0.0F, 0.0F); + cube_r348.setTextureOffset(928, 757).addBox(-1.0F, -4.0F, -8.0F, 2.0F, 4.0F, 8.0F, 0.0F, false); + cube_r349 = new ModelRenderer(this); + cube_r349.setRotationPoint(0.0F, -88.0F, 104.0F); + bb_main.addChild(cube_r349); + setRotationAngle(cube_r349, 0.0F, -1.5708F, 0.0F); + cube_r349.setTextureOffset(924, 380).addBox(-101.0F, -107.0F, 0.0F, 21.0F, 7.0F, 0.0F, 0.0F, false); + cube_r349.setTextureOffset(0, 396).addBox(-259.0F, -98.0F, 0.0F, 410.0F, 210.0F, 0.0F, 0.0F, false); + cube_r350 = new ModelRenderer(this); + cube_r350.setRotationPoint(0.0F, -106.0F, 2.0F); + bb_main.addChild(cube_r350); + setRotationAngle(cube_r350, 0.0F, -0.7854F, 0.0F); + cube_r350.setTextureOffset(340, 938).addBox(-1.0F, -90.0F, -1.0F, 2.0F, 15.0F, 2.0F, 0.0F, false); + cube_r350.setTextureOffset(198, 773).addBox(-2.0F, -75.0F, -2.0F, 4.0F, 150.0F, 4.0F, 0.0F, false); + cube_r351 = new ModelRenderer(this); + cube_r351.setRotationPoint(0.0F, -79.0F, 49.5F); + bb_main.addChild(cube_r351); + setRotationAngle(cube_r351, 0.0F, 0.0F, 0.7854F); + cube_r351.setTextureOffset(0, 0).addBox(-2.0F, -2.0F, -199.5F, 4.0F, 4.0F, 391.0F, 0.0F, false); + } + + @Override + public void render(MatrixStack matrixStack, IVertexBuilder buffer, int packedLight, int packedOverlay, float red, float green, float blue, + float alpha) { + bone.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bone5.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bone6.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bone7.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bone8.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bone9.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bone10.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bone11.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + TailFin.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + TailFin4.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + TailFin2.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + TailFin3.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bone2.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bone70.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bone55.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bone20.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bone17.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bone3.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bone12.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bone13.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bone19.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bone4.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + Engine.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + Engine2.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + SteeringWheel.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bb_main.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } + + public void setRotationAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } + + public void setRotationAngles(Entity e, float f, float f1, float f2, float f3, float f4) { + this.Propeller2.rotateAngleZ = f2; + this.Propeller.rotateAngleZ = f2; + } + } + +} diff --git a/src/main/java/studio/halbear/hem/entity/renderer/DormantAgedEmberleafMilitaryBotRenderer.java b/src/main/java/studio/halbear/hem/entity/renderer/DormantAgedEmberleafMilitaryBotRenderer.java new file mode 100644 index 0000000..0cf2e2e --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/renderer/DormantAgedEmberleafMilitaryBotRenderer.java @@ -0,0 +1,151 @@ + +package studio.halbear.hem.entity.renderer; + +import studio.halbear.hem.procedures.DormantAgedEmberleafMilitaryBotEntityShakingConditionProcedure; +import studio.halbear.hem.entity.DormantAgedEmberleafMilitaryBotEntity; + +import net.minecraftforge.fml.client.registry.RenderingRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.util.ResourceLocation; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.model.ModelRenderer; +import net.minecraft.client.renderer.entity.model.EntityModel; +import net.minecraft.client.renderer.entity.MobRenderer; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.mojang.blaze3d.matrix.MatrixStack; + +@OnlyIn(Dist.CLIENT) +public class DormantAgedEmberleafMilitaryBotRenderer { + public static class ModelRegisterHandler { + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public void registerModels(ModelRegistryEvent event) { + RenderingRegistry.registerEntityRenderingHandler(DormantAgedEmberleafMilitaryBotEntity.entity, renderManager -> { + return new MobRenderer(renderManager, new ModelEmberleafMilitaryBotAgedDormant(), 0.5f) { + + @Override + public ResourceLocation getEntityTexture(Entity entity) { + return new ResourceLocation("hem:textures/entities/emberleafmilitaryrobotaged.png"); + } + + @Override + protected boolean func_230495_a_(LivingEntity _ent) { + Entity entity = _ent; + World world = entity.world; + double x = entity.getPosX(); + double y = entity.getPosY(); + double z = entity.getPosZ(); + return DormantAgedEmberleafMilitaryBotEntityShakingConditionProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), + new AbstractMap.SimpleEntry<>("y", y), new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + }; + }); + } + } + + // Made with Blockbench 4.12.5 + // Exported for Minecraft version 1.15 - 1.16 with MCP mappings + // Paste this class into your mod and generate all required imports + public static class ModelEmberleafMilitaryBotAgedDormant extends EntityModel { + private final ModelRenderer bone; + private final ModelRenderer cube_r1; + private final ModelRenderer LeftLeg; + private final ModelRenderer RightLeg; + private final ModelRenderer UpperBody; + private final ModelRenderer leftArm; + private final ModelRenderer rightArm; + private final ModelRenderer HeadX; + private final ModelRenderer cube_r2; + + public ModelEmberleafMilitaryBotAgedDormant() { + textureWidth = 128; + textureHeight = 128; + bone = new ModelRenderer(this); + bone.setRotationPoint(0.0F, 24.25F, 0.0F); + setRotationAngle(bone, 0.0F, 0.0F, 0.0436F); + bone.setTextureOffset(17, 75).addBox(-4.0F, -28.0F, -2.0F, 8.0F, 6.0F, 4.0F, 0.0F, false); + bone.setTextureOffset(76, 0).addBox(-2.0F, -22.0F, -2.0F, 4.0F, 5.0F, 4.0F, 0.0F, false); + cube_r1 = new ModelRenderer(this); + cube_r1.setRotationPoint(0.0F, -31.0F, 0.0F); + bone.addChild(cube_r1); + setRotationAngle(cube_r1, 0.0F, 0.0F, -3.1416F); + cube_r1.setTextureOffset(17, 76).addBox(-4.0F, -3.0F, -2.0F, 8.0F, 3.0F, 4.0F, 0.0F, false); + LeftLeg = new ModelRenderer(this); + LeftLeg.setRotationPoint(-1.75F, -19.25F, 0.0F); + bone.addChild(LeftLeg); + LeftLeg.setTextureOffset(24, 47).addBox(-5.25F, -2.75F, -3.0F, 6.0F, 22.0F, 6.0F, -0.25F, false); + LeftLeg.setTextureOffset(0, 75).addBox(-4.25F, -1.75F, -2.0F, 4.0F, 21.0F, 4.0F, 0.25F, false); + RightLeg = new ModelRenderer(this); + RightLeg.setRotationPoint(1.75F, -19.25F, 0.0F); + bone.addChild(RightLeg); + setRotationAngle(RightLeg, 0.0F, 0.0F, -0.0873F); + RightLeg.setTextureOffset(24, 47).addBox(-0.75F, -2.75F, -3.0F, 6.0F, 22.0F, 6.0F, -0.25F, true); + RightLeg.setTextureOffset(0, 75).addBox(0.25F, -1.75F, -2.0F, 4.0F, 21.0F, 4.0F, 0.25F, true); + UpperBody = new ModelRenderer(this); + UpperBody.setRotationPoint(0.0F, -29.5F, 0.0F); + bone.addChild(UpperBody); + setRotationAngle(UpperBody, 0.5672F, 0.0F, 0.0F); + UpperBody.setTextureOffset(48, 90).addBox(-11.5F, -7.6F, -2.0F, 3.0F, 4.0F, 4.0F, 0.0F, false); + UpperBody.setTextureOffset(48, 90).addBox(8.5F, -7.6F, -2.0F, 3.0F, 4.0F, 4.0F, 0.0F, true); + UpperBody.setTextureOffset(68, 38).addBox(4.0F, -10.5F, -4.0F, 9.0F, 3.0F, 8.0F, 0.0F, false); + UpperBody.setTextureOffset(0, 111).addBox(-8.0F, -9.5F, -3.0F, 16.0F, 11.0F, 6.0F, 0.25F, false); + UpperBody.setTextureOffset(0, 0).addBox(-8.0F, -9.5F, -3.0F, 16.0F, 11.0F, 6.0F, 0.0F, false); + UpperBody.setTextureOffset(56, 27).addBox(-13.0F, -10.5F, -4.0F, 9.0F, 3.0F, 8.0F, 0.0F, false); + UpperBody.setTextureOffset(44, 0).addBox(-1.5F, -16.5F, -1.5F, 3.0F, 7.0F, 3.0F, 0.0F, false); + leftArm = new ModelRenderer(this); + leftArm.setRotationPoint(-10.0F, -7.5F, 0.0F); + UpperBody.addChild(leftArm); + setRotationAngle(leftArm, -0.5655F, -0.0468F, -0.0737F); + leftArm.setTextureOffset(0, 17).addBox(-3.0F, 0.0F, -4.0F, 6.0F, 22.0F, 8.0F, -0.25F, false); + leftArm.setTextureOffset(48, 47).addBox(-2.0F, 0.0F, -3.0F, 4.0F, 21.0F, 6.0F, -0.24F, false); + leftArm.setTextureOffset(28, 20).addBox(-2.0F, 0.0F, -3.0F, 4.0F, 21.0F, 6.0F, 0.0F, false); + rightArm = new ModelRenderer(this); + rightArm.setRotationPoint(10.0F, -7.5F, 0.0F); + UpperBody.addChild(rightArm); + setRotationAngle(rightArm, -0.6091F, -0.05F, -0.0715F); + rightArm.setTextureOffset(28, 20).addBox(-2.0F, 0.0F, -3.0F, 4.0F, 21.0F, 6.0F, 0.0F, true); + rightArm.setTextureOffset(48, 47).addBox(-2.0F, 0.0F, -3.0F, 4.0F, 21.0F, 6.0F, -0.24F, true); + rightArm.setTextureOffset(0, 17).addBox(-3.0F, 0.0F, -4.0F, 6.0F, 22.0F, 8.0F, -0.25F, true); + HeadX = new ModelRenderer(this); + HeadX.setRotationPoint(0.0F, -13.0F, 0.0F); + UpperBody.addChild(HeadX); + setRotationAngle(HeadX, 0.0F, 0.1309F, 0.0F); + cube_r2 = new ModelRenderer(this); + cube_r2.setRotationPoint(0.0F, 0.0F, 0.0F); + HeadX.addChild(cube_r2); + setRotationAngle(cube_r2, 0.0F, -0.7854F, 0.0F); + cube_r2.setTextureOffset(68, 49).addBox(-3.5F, -6.5F, -3.5F, 7.0F, 8.0F, 7.0F, 0.0F, false); + cube_r2.setTextureOffset(68, 64).addBox(-3.5F, -6.5F, -3.5F, 7.0F, 8.0F, 7.0F, 0.25F, false); + } + + @Override + public void render(MatrixStack matrixStack, IVertexBuilder buffer, int packedLight, int packedOverlay, float red, float green, float blue, + float alpha) { + bone.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } + + public void setRotationAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } + + public void setRotationAngles(Entity e, float f, float f1, float f2, float f3, float f4) { + } + } + +} diff --git a/src/main/java/studio/halbear/hem/entity/renderer/DormantEmberleafMilitaryBotRenderer.java b/src/main/java/studio/halbear/hem/entity/renderer/DormantEmberleafMilitaryBotRenderer.java new file mode 100644 index 0000000..9fc4fa2 --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/renderer/DormantEmberleafMilitaryBotRenderer.java @@ -0,0 +1,128 @@ + +package studio.halbear.hem.entity.renderer; + +import studio.halbear.hem.entity.DormantEmberleafMilitaryBotEntity; + +import net.minecraftforge.fml.client.registry.RenderingRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.util.ResourceLocation; +import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.model.ModelRenderer; +import net.minecraft.client.renderer.entity.model.EntityModel; +import net.minecraft.client.renderer.entity.MobRenderer; + +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.mojang.blaze3d.matrix.MatrixStack; + +@OnlyIn(Dist.CLIENT) +public class DormantEmberleafMilitaryBotRenderer { + public static class ModelRegisterHandler { + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public void registerModels(ModelRegistryEvent event) { + RenderingRegistry.registerEntityRenderingHandler(DormantEmberleafMilitaryBotEntity.entity, renderManager -> { + return new MobRenderer(renderManager, new ModelEmberleafMilitaryBotDormant(), 0.5f) { + + @Override + public ResourceLocation getEntityTexture(Entity entity) { + return new ResourceLocation("hem:textures/entities/emberleafmilitaryrobot.png"); + } + }; + }); + } + } + + // Made with Blockbench 4.12.5 + // Exported for Minecraft version 1.15 - 1.16 with MCP mappings + // Paste this class into your mod and generate all required imports + public static class ModelEmberleafMilitaryBotDormant extends EntityModel { + private final ModelRenderer LeftLeg; + private final ModelRenderer RightLeg; + private final ModelRenderer UpperBody; + private final ModelRenderer leftArm; + private final ModelRenderer rightArm; + private final ModelRenderer HeadX; + private final ModelRenderer cube_r1; + private final ModelRenderer bb_main; + private final ModelRenderer UpperAbdomine_r1; + + public ModelEmberleafMilitaryBotDormant() { + textureWidth = 128; + textureHeight = 128; + LeftLeg = new ModelRenderer(this); + LeftLeg.setRotationPoint(-1.75F, 5.0F, 0.0F); + LeftLeg.setTextureOffset(24, 47).addBox(-5.25F, -2.75F, -3.0F, 6.0F, 22.0F, 6.0F, -0.25F, false); + LeftLeg.setTextureOffset(0, 75).addBox(-4.25F, -1.75F, -2.0F, 4.0F, 21.0F, 4.0F, 0.25F, false); + RightLeg = new ModelRenderer(this); + RightLeg.setRotationPoint(1.75F, 5.0F, 0.0F); + RightLeg.setTextureOffset(24, 47).addBox(-0.75F, -2.75F, -3.0F, 6.0F, 22.0F, 6.0F, -0.25F, true); + RightLeg.setTextureOffset(0, 75).addBox(0.25F, -1.75F, -2.0F, 4.0F, 21.0F, 4.0F, 0.25F, true); + UpperBody = new ModelRenderer(this); + UpperBody.setRotationPoint(0.0F, -5.25F, 0.0F); + setRotationAngle(UpperBody, -0.7854F, 0.0F, 0.0F); + UpperBody.setTextureOffset(48, 90).addBox(-11.5F, -7.6F, -2.0F, 3.0F, 4.0F, 4.0F, 0.0F, false); + UpperBody.setTextureOffset(48, 90).addBox(8.5F, -7.6F, -2.0F, 3.0F, 4.0F, 4.0F, 0.0F, true); + UpperBody.setTextureOffset(68, 38).addBox(4.0F, -10.5F, -4.0F, 9.0F, 3.0F, 8.0F, 0.0F, false); + UpperBody.setTextureOffset(0, 111).addBox(-8.0F, -9.5F, -3.0F, 16.0F, 11.0F, 6.0F, 0.25F, false); + UpperBody.setTextureOffset(0, 0).addBox(-8.0F, -9.5F, -3.0F, 16.0F, 11.0F, 6.0F, 0.0F, false); + UpperBody.setTextureOffset(56, 27).addBox(-13.0F, -10.5F, -4.0F, 9.0F, 3.0F, 8.0F, 0.0F, false); + UpperBody.setTextureOffset(44, 0).addBox(-1.5F, -16.5F, -1.5F, 3.0F, 7.0F, 3.0F, 0.0F, false); + leftArm = new ModelRenderer(this); + leftArm.setRotationPoint(-10.0F, -7.5F, 0.0F); + UpperBody.addChild(leftArm); + setRotationAngle(leftArm, 0.8727F, 0.0F, 0.0F); + leftArm.setTextureOffset(0, 17).addBox(-3.0F, 0.0F, -4.0F, 6.0F, 22.0F, 8.0F, -0.25F, false); + leftArm.setTextureOffset(48, 47).addBox(-2.0F, 0.0F, -3.0F, 4.0F, 21.0F, 6.0F, -0.24F, false); + leftArm.setTextureOffset(28, 20).addBox(-2.0F, 0.0F, -3.0F, 4.0F, 21.0F, 6.0F, 0.0F, false); + rightArm = new ModelRenderer(this); + rightArm.setRotationPoint(10.0F, -7.5F, 0.0F); + UpperBody.addChild(rightArm); + setRotationAngle(rightArm, 0.8727F, 0.0F, 0.0F); + rightArm.setTextureOffset(28, 20).addBox(-2.0F, 0.0F, -3.0F, 4.0F, 21.0F, 6.0F, 0.0F, true); + rightArm.setTextureOffset(48, 47).addBox(-2.0F, 0.0F, -3.0F, 4.0F, 21.0F, 6.0F, -0.24F, true); + rightArm.setTextureOffset(0, 17).addBox(-3.0F, 0.0F, -4.0F, 6.0F, 22.0F, 8.0F, -0.25F, true); + HeadX = new ModelRenderer(this); + HeadX.setRotationPoint(0.0F, -13.0F, 0.0F); + UpperBody.addChild(HeadX); + setRotationAngle(HeadX, 0.0F, -0.3491F, 0.0F); + cube_r1 = new ModelRenderer(this); + cube_r1.setRotationPoint(0.0F, 0.0F, 0.0F); + HeadX.addChild(cube_r1); + setRotationAngle(cube_r1, 0.0F, -0.7854F, 0.0F); + cube_r1.setTextureOffset(68, 49).addBox(-3.5F, -6.5F, -3.5F, 7.0F, 8.0F, 7.0F, 0.0F, false); + cube_r1.setTextureOffset(68, 64).addBox(-3.5F, -6.5F, -3.5F, 7.0F, 8.0F, 7.0F, 0.25F, false); + bb_main = new ModelRenderer(this); + bb_main.setRotationPoint(0.0F, 24.0F, 0.0F); + bb_main.setTextureOffset(17, 75).addBox(-4.0F, -27.75F, -2.0F, 8.0F, 6.0F, 4.0F, 0.0F, false); + bb_main.setTextureOffset(76, 0).addBox(-2.0F, -21.75F, -2.0F, 4.0F, 5.0F, 4.0F, 0.0F, false); + UpperAbdomine_r1 = new ModelRenderer(this); + UpperAbdomine_r1.setRotationPoint(0.0F, -30.75F, 0.0F); + bb_main.addChild(UpperAbdomine_r1); + setRotationAngle(UpperAbdomine_r1, 0.0F, 0.0F, -3.1416F); + UpperAbdomine_r1.setTextureOffset(17, 76).addBox(-4.0F, -3.0F, -2.0F, 8.0F, 3.0F, 4.0F, 0.0F, false); + } + + @Override + public void render(MatrixStack matrixStack, IVertexBuilder buffer, int packedLight, int packedOverlay, float red, float green, float blue, + float alpha) { + LeftLeg.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + RightLeg.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + UpperBody.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bb_main.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } + + public void setRotationAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } + + public void setRotationAngles(Entity e, float f, float f1, float f2, float f3, float f4) { + } + } + +} diff --git a/src/main/java/studio/halbear/hem/entity/renderer/EmberleafMilitaryBotRenderer.java b/src/main/java/studio/halbear/hem/entity/renderer/EmberleafMilitaryBotRenderer.java new file mode 100644 index 0000000..7f93975 --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/renderer/EmberleafMilitaryBotRenderer.java @@ -0,0 +1,131 @@ + +package studio.halbear.hem.entity.renderer; + +import studio.halbear.hem.entity.EmberleafMilitaryBotEntity; + +import net.minecraftforge.fml.client.registry.RenderingRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.model.ModelRenderer; +import net.minecraft.client.renderer.entity.model.EntityModel; +import net.minecraft.client.renderer.entity.MobRenderer; + +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.mojang.blaze3d.matrix.MatrixStack; + +@OnlyIn(Dist.CLIENT) +public class EmberleafMilitaryBotRenderer { + public static class ModelRegisterHandler { + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public void registerModels(ModelRegistryEvent event) { + RenderingRegistry.registerEntityRenderingHandler(EmberleafMilitaryBotEntity.entity, renderManager -> { + return new MobRenderer(renderManager, new ModelEmberleafMilitaryBot(), 0.5f) { + + @Override + public ResourceLocation getEntityTexture(Entity entity) { + return new ResourceLocation("hem:textures/entities/emberleafmilitaryrobotawake.png"); + } + }; + }); + } + } + + // Made with Blockbench 4.12.5 + // Exported for Minecraft version 1.15 - 1.16 with MCP mappings + // Paste this class into your mod and generate all required imports + public static class ModelEmberleafMilitaryBot extends EntityModel { + private final ModelRenderer LeftLeg; + private final ModelRenderer RightLeg; + private final ModelRenderer UpperBody; + private final ModelRenderer leftArm; + private final ModelRenderer rightArm; + private final ModelRenderer HeadX; + private final ModelRenderer cube_r1; + private final ModelRenderer bb_main; + private final ModelRenderer cube_r2; + + public ModelEmberleafMilitaryBot() { + textureWidth = 128; + textureHeight = 128; + LeftLeg = new ModelRenderer(this); + LeftLeg.setRotationPoint(-1.75F, 5.0F, 0.0F); + LeftLeg.setTextureOffset(24, 47).addBox(-5.25F, -2.75F, -3.0F, 6.0F, 22.0F, 6.0F, -0.25F, false); + LeftLeg.setTextureOffset(0, 75).addBox(-4.25F, -1.75F, -2.0F, 4.0F, 21.0F, 4.0F, 0.25F, false); + RightLeg = new ModelRenderer(this); + RightLeg.setRotationPoint(1.75F, 5.0F, 0.0F); + RightLeg.setTextureOffset(24, 47).addBox(-0.75F, -2.75F, -3.0F, 6.0F, 22.0F, 6.0F, -0.25F, true); + RightLeg.setTextureOffset(0, 75).addBox(0.25F, -1.75F, -2.0F, 4.0F, 21.0F, 4.0F, 0.25F, true); + UpperBody = new ModelRenderer(this); + UpperBody.setRotationPoint(0.0F, -5.25F, 0.0F); + UpperBody.setTextureOffset(48, 90).addBox(-11.5F, -7.6F, -2.0F, 3.0F, 4.0F, 4.0F, 0.0F, false); + UpperBody.setTextureOffset(48, 90).addBox(8.5F, -7.6F, -2.0F, 3.0F, 4.0F, 4.0F, 0.0F, true); + UpperBody.setTextureOffset(68, 38).addBox(4.0F, -10.5F, -4.0F, 9.0F, 3.0F, 8.0F, 0.0F, false); + UpperBody.setTextureOffset(0, 111).addBox(-8.0F, -9.5F, -3.0F, 16.0F, 11.0F, 6.0F, 0.25F, false); + UpperBody.setTextureOffset(0, 0).addBox(-8.0F, -9.5F, -3.0F, 16.0F, 11.0F, 6.0F, 0.0F, false); + UpperBody.setTextureOffset(56, 27).addBox(-13.0F, -10.5F, -4.0F, 9.0F, 3.0F, 8.0F, 0.0F, false); + UpperBody.setTextureOffset(44, 0).addBox(-1.5F, -16.5F, -1.5F, 3.0F, 7.0F, 3.0F, 0.0F, false); + leftArm = new ModelRenderer(this); + leftArm.setRotationPoint(-10.0F, -7.5F, 0.0F); + UpperBody.addChild(leftArm); + leftArm.setTextureOffset(0, 17).addBox(-3.0F, 0.0F, -4.0F, 6.0F, 22.0F, 8.0F, -0.25F, false); + leftArm.setTextureOffset(48, 47).addBox(-2.0F, 0.0F, -3.0F, 4.0F, 21.0F, 6.0F, -0.24F, false); + leftArm.setTextureOffset(28, 20).addBox(-2.0F, 0.0F, -3.0F, 4.0F, 21.0F, 6.0F, 0.0F, false); + rightArm = new ModelRenderer(this); + rightArm.setRotationPoint(10.0F, -7.5F, 0.0F); + UpperBody.addChild(rightArm); + rightArm.setTextureOffset(28, 20).addBox(-2.0F, 0.0F, -3.0F, 4.0F, 21.0F, 6.0F, 0.0F, true); + rightArm.setTextureOffset(48, 47).addBox(-2.0F, 0.0F, -3.0F, 4.0F, 21.0F, 6.0F, -0.24F, true); + rightArm.setTextureOffset(0, 17).addBox(-3.0F, 0.0F, -4.0F, 6.0F, 22.0F, 8.0F, -0.25F, true); + HeadX = new ModelRenderer(this); + HeadX.setRotationPoint(0.0F, -13.0F, 0.0F); + UpperBody.addChild(HeadX); + cube_r1 = new ModelRenderer(this); + cube_r1.setRotationPoint(0.0F, 0.0F, 0.0F); + HeadX.addChild(cube_r1); + setRotationAngle(cube_r1, 0.0F, -0.7854F, 0.0F); + cube_r1.setTextureOffset(68, 49).addBox(-3.5F, -6.5F, -3.5F, 7.0F, 8.0F, 7.0F, 0.0F, false); + cube_r1.setTextureOffset(68, 64).addBox(-3.5F, -6.5F, -3.5F, 7.0F, 8.0F, 7.0F, 0.25F, false); + bb_main = new ModelRenderer(this); + bb_main.setRotationPoint(0.0F, 24.0F, 0.0F); + bb_main.setTextureOffset(17, 75).addBox(-4.0F, -27.75F, -2.0F, 8.0F, 6.0F, 4.0F, 0.0F, false); + bb_main.setTextureOffset(76, 0).addBox(-2.0F, -21.75F, -2.0F, 4.0F, 5.0F, 4.0F, 0.0F, false); + cube_r2 = new ModelRenderer(this); + cube_r2.setRotationPoint(0.0F, -30.75F, 0.0F); + bb_main.addChild(cube_r2); + setRotationAngle(cube_r2, 0.0F, 0.0F, -3.1416F); + cube_r2.setTextureOffset(17, 76).addBox(-4.0F, -3.0F, -2.0F, 8.0F, 3.0F, 4.0F, 0.0F, false); + } + + @Override + public void render(MatrixStack matrixStack, IVertexBuilder buffer, int packedLight, int packedOverlay, float red, float green, float blue, + float alpha) { + LeftLeg.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + RightLeg.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + UpperBody.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bb_main.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } + + public void setRotationAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } + + public void setRotationAngles(Entity e, float f, float f1, float f2, float f3, float f4) { + this.LeftLeg.rotateAngleX = MathHelper.cos(f * 1.0F) * -1.0F * f1; + this.UpperBody.rotateAngleX = f4 / (180F / (float) Math.PI); + this.RightLeg.rotateAngleX = MathHelper.cos(f * 1.0F) * 1.0F * f1; + this.rightArm.rotateAngleX = MathHelper.cos(f * 0.6662F + (float) Math.PI) * f1; + this.leftArm.rotateAngleX = MathHelper.cos(f * 0.6662F) * f1; + this.HeadX.rotateAngleY = f3 / (180F / (float) Math.PI); + } + } + +} diff --git a/src/main/java/studio/halbear/hem/entity/renderer/EmberleafMilitaryRobotLowerHalfRenderer.java b/src/main/java/studio/halbear/hem/entity/renderer/EmberleafMilitaryRobotLowerHalfRenderer.java new file mode 100644 index 0000000..8bae446 --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/renderer/EmberleafMilitaryRobotLowerHalfRenderer.java @@ -0,0 +1,114 @@ + +package studio.halbear.hem.entity.renderer; + +import studio.halbear.hem.entity.EmberleafMilitaryRobotLowerHalfEntity; + +import net.minecraftforge.fml.client.registry.RenderingRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.model.ModelRenderer; +import net.minecraft.client.renderer.entity.model.EntityModel; +import net.minecraft.client.renderer.entity.MobRenderer; + +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.mojang.blaze3d.matrix.MatrixStack; + +@OnlyIn(Dist.CLIENT) +public class EmberleafMilitaryRobotLowerHalfRenderer { + public static class ModelRegisterHandler { + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public void registerModels(ModelRegistryEvent event) { + RenderingRegistry.registerEntityRenderingHandler(EmberleafMilitaryRobotLowerHalfEntity.entity, renderManager -> { + return new MobRenderer(renderManager, new ModelEmberleafMilitaryBotLowerHalf(), 0.5f) { + + @Override + public ResourceLocation getEntityTexture(Entity entity) { + return new ResourceLocation("hem:textures/entities/emberleafmilitaryrobotdestroyed.png"); + } + }; + }); + } + } + + // Made with Blockbench 4.12.5 + // Exported for Minecraft version 1.15 - 1.16 with MCP mappings + // Paste this class into your mod and generate all required imports + public static class ModelEmberleafMilitaryBotLowerHalf extends EntityModel { + private final ModelRenderer LeftLeg; + private final ModelRenderer RightLeg; + private final ModelRenderer UpperHalf; + private final ModelRenderer cube_r1; + private final ModelRenderer cube_r2; + private final ModelRenderer Spine; + private final ModelRenderer cube_r3; + private final ModelRenderer bb_main; + + public ModelEmberleafMilitaryBotLowerHalf() { + textureWidth = 128; + textureHeight = 128; + LeftLeg = new ModelRenderer(this); + LeftLeg.setRotationPoint(-1.75F, 5.0F, 0.0F); + LeftLeg.setTextureOffset(24, 47).addBox(-5.25F, -2.75F, -3.0F, 6.0F, 22.0F, 6.0F, -0.25F, false); + LeftLeg.setTextureOffset(0, 75).addBox(-4.25F, -1.75F, -2.0F, 4.0F, 21.0F, 4.0F, 0.25F, false); + RightLeg = new ModelRenderer(this); + RightLeg.setRotationPoint(1.75F, 5.0F, 0.0F); + RightLeg.setTextureOffset(24, 47).addBox(-0.75F, -2.75F, -3.0F, 6.0F, 22.0F, 6.0F, -0.25F, true); + RightLeg.setTextureOffset(0, 75).addBox(0.25F, -1.75F, -2.0F, 4.0F, 21.0F, 4.0F, 0.25F, true); + UpperHalf = new ModelRenderer(this); + UpperHalf.setRotationPoint(0.025F, 2.2F, 2.025F); + setRotationAngle(UpperHalf, 0.0F, 0.0F, 0.0873F); + UpperHalf.setTextureOffset(61, 14).addBox(-2.025F, -16.2F, -2.025F, 4.0F, 9.0F, 0.0F, 0.0F, false); + cube_r1 = new ModelRenderer(this); + cube_r1.setRotationPoint(0.0F, -5.6F, -4.55F); + UpperHalf.addChild(cube_r1); + setRotationAngle(cube_r1, 0.2182F, 0.0F, -3.1416F); + cube_r1.setTextureOffset(17, 76).addBox(-4.0F, 0.0F, 0.0F, 8.0F, 3.0F, 4.0F, 0.0F, false); + cube_r2 = new ModelRenderer(this); + cube_r2.setRotationPoint(-0.025F, 0.05F, -0.025F); + UpperHalf.addChild(cube_r2); + setRotationAngle(cube_r2, 0.0873F, 0.0F, 0.0F); + cube_r2.setTextureOffset(17, 75).addBox(-4.0F, -6.0F, -4.0F, 8.0F, 6.0F, 4.0F, 0.0F, false); + Spine = new ModelRenderer(this); + Spine.setRotationPoint(-0.025F, -15.7F, -1.9375F); + UpperHalf.addChild(Spine); + setRotationAngle(Spine, 0.0F, 0.0F, 0.1309F); + cube_r3 = new ModelRenderer(this); + cube_r3.setRotationPoint(0.0F, 0.0F, 0.0F); + Spine.addChild(cube_r3); + setRotationAngle(cube_r3, 0.0F, 0.0F, 2.0071F); + cube_r3.setTextureOffset(61, 14).addBox(-2.0305F, -7.8824F, 0.0F, 4.0F, 9.0F, 0.0F, 0.0F, false); + bb_main = new ModelRenderer(this); + bb_main.setRotationPoint(0.0F, 24.0F, 0.0F); + bb_main.setTextureOffset(76, 0).addBox(-2.0F, -21.75F, -2.0F, 4.0F, 5.0F, 4.0F, 0.0F, false); + } + + @Override + public void render(MatrixStack matrixStack, IVertexBuilder buffer, int packedLight, int packedOverlay, float red, float green, float blue, + float alpha) { + LeftLeg.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + RightLeg.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + UpperHalf.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bb_main.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } + + public void setRotationAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } + + public void setRotationAngles(Entity e, float f, float f1, float f2, float f3, float f4) { + this.LeftLeg.rotateAngleX = MathHelper.cos(f * 1.0F) * -1.0F * f1; + this.RightLeg.rotateAngleX = MathHelper.cos(f * 1.0F) * 1.0F * f1; + this.Spine.rotateAngleZ = MathHelper.cos(f * 0.6662F + (float) Math.PI) * f1; + } + } + +} diff --git a/src/main/java/studio/halbear/hem/entity/renderer/EmberleafMilitaryRobotUpperHalfRenderer.java b/src/main/java/studio/halbear/hem/entity/renderer/EmberleafMilitaryRobotUpperHalfRenderer.java new file mode 100644 index 0000000..c3b2714 --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/renderer/EmberleafMilitaryRobotUpperHalfRenderer.java @@ -0,0 +1,104 @@ + +package studio.halbear.hem.entity.renderer; + +import studio.halbear.hem.entity.EmberleafMilitaryRobotUpperHalfEntity; + +import net.minecraftforge.fml.client.registry.RenderingRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.model.ModelRenderer; +import net.minecraft.client.renderer.entity.model.EntityModel; +import net.minecraft.client.renderer.entity.MobRenderer; + +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.mojang.blaze3d.matrix.MatrixStack; + +@OnlyIn(Dist.CLIENT) +public class EmberleafMilitaryRobotUpperHalfRenderer { + public static class ModelRegisterHandler { + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public void registerModels(ModelRegistryEvent event) { + RenderingRegistry.registerEntityRenderingHandler(EmberleafMilitaryRobotUpperHalfEntity.entity, renderManager -> { + return new MobRenderer(renderManager, new ModelEmberleafMilitaryBotUpperHalf(), 0.5f) { + + @Override + public ResourceLocation getEntityTexture(Entity entity) { + return new ResourceLocation("hem:textures/entities/emberleafmilitaryrobotdestroyed.png"); + } + }; + }); + } + } + + // Made with Blockbench 4.12.5 + // Exported for Minecraft version 1.15 - 1.16 with MCP mappings + // Paste this class into your mod and generate all required imports + public static class ModelEmberleafMilitaryBotUpperHalf extends EntityModel { + private final ModelRenderer UpperBody; + private final ModelRenderer leftArm; + private final ModelRenderer rightArm; + private final ModelRenderer HeadX; + private final ModelRenderer cube_r1; + + public ModelEmberleafMilitaryBotUpperHalf() { + textureWidth = 128; + textureHeight = 128; + UpperBody = new ModelRenderer(this); + UpperBody.setRotationPoint(0.0F, 9.75F, 0.0F); + UpperBody.setTextureOffset(48, 90).addBox(-11.5F, -7.6F, -2.0F, 3.0F, 4.0F, 4.0F, 0.0F, false); + UpperBody.setTextureOffset(48, 90).addBox(8.5F, -7.6F, -2.0F, 3.0F, 4.0F, 4.0F, 0.0F, true); + UpperBody.setTextureOffset(68, 38).addBox(4.0F, -10.5F, -4.0F, 9.0F, 3.0F, 8.0F, 0.0F, false); + UpperBody.setTextureOffset(0, 111).addBox(-8.0F, -9.5F, -3.0F, 16.0F, 11.0F, 6.0F, 0.25F, false); + UpperBody.setTextureOffset(0, 0).addBox(-8.0F, -9.5F, -3.0F, 16.0F, 11.0F, 6.0F, 0.0F, false); + UpperBody.setTextureOffset(56, 27).addBox(-13.0F, -10.5F, -4.0F, 9.0F, 3.0F, 8.0F, 0.0F, false); + UpperBody.setTextureOffset(44, 0).addBox(-1.5F, -16.5F, -1.5F, 3.0F, 7.0F, 3.0F, 0.0F, false); + leftArm = new ModelRenderer(this); + leftArm.setRotationPoint(-10.0F, -7.5F, 0.0F); + UpperBody.addChild(leftArm); + leftArm.setTextureOffset(0, 17).addBox(-3.0F, 0.0F, -4.0F, 6.0F, 22.0F, 8.0F, -0.25F, false); + leftArm.setTextureOffset(48, 47).addBox(-2.0F, 0.0F, -3.0F, 4.0F, 21.0F, 6.0F, -0.24F, false); + leftArm.setTextureOffset(28, 20).addBox(-2.0F, 0.0F, -3.0F, 4.0F, 21.0F, 6.0F, 0.0F, false); + rightArm = new ModelRenderer(this); + rightArm.setRotationPoint(10.0F, -7.5F, 0.0F); + UpperBody.addChild(rightArm); + rightArm.setTextureOffset(28, 20).addBox(-2.0F, 0.0F, -3.0F, 4.0F, 21.0F, 6.0F, 0.0F, true); + rightArm.setTextureOffset(48, 47).addBox(-2.0F, 0.0F, -3.0F, 4.0F, 21.0F, 6.0F, -0.24F, true); + rightArm.setTextureOffset(0, 17).addBox(-3.0F, 0.0F, -4.0F, 6.0F, 22.0F, 8.0F, -0.25F, true); + HeadX = new ModelRenderer(this); + HeadX.setRotationPoint(0.0F, -13.0F, 0.0F); + UpperBody.addChild(HeadX); + cube_r1 = new ModelRenderer(this); + cube_r1.setRotationPoint(0.0F, 0.0F, 0.0F); + HeadX.addChild(cube_r1); + setRotationAngle(cube_r1, 0.0F, -0.7854F, 0.0F); + cube_r1.setTextureOffset(68, 49).addBox(-3.5F, -6.5F, -3.5F, 7.0F, 8.0F, 7.0F, 0.0F, false); + cube_r1.setTextureOffset(68, 64).addBox(-3.5F, -6.5F, -3.5F, 7.0F, 8.0F, 7.0F, 0.25F, false); + } + + @Override + public void render(MatrixStack matrixStack, IVertexBuilder buffer, int packedLight, int packedOverlay, float red, float green, float blue, + float alpha) { + UpperBody.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } + + public void setRotationAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } + + public void setRotationAngles(Entity e, float f, float f1, float f2, float f3, float f4) { + this.rightArm.rotateAngleX = MathHelper.cos(f * 1.0F) * 1.0F * f1; + this.leftArm.rotateAngleX = MathHelper.cos(f * 1.0F) * -1.0F * f1; + this.HeadX.rotateAngleY = MathHelper.cos(f * 0.6662F + (float) Math.PI) * f1; + } + } + +} diff --git a/src/main/java/studio/halbear/hem/entity/renderer/FluffaloRenderer.java b/src/main/java/studio/halbear/hem/entity/renderer/FluffaloRenderer.java new file mode 100644 index 0000000..fefd277 --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/renderer/FluffaloRenderer.java @@ -0,0 +1,152 @@ + +package studio.halbear.hem.entity.renderer; + +import studio.halbear.hem.entity.FluffaloEntity; + +import net.minecraftforge.fml.client.registry.RenderingRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.model.ModelRenderer; +import net.minecraft.client.renderer.entity.model.EntityModel; +import net.minecraft.client.renderer.entity.MobRenderer; + +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.mojang.blaze3d.matrix.MatrixStack; + +@OnlyIn(Dist.CLIENT) +public class FluffaloRenderer { + public static class ModelRegisterHandler { + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public void registerModels(ModelRegistryEvent event) { + RenderingRegistry.registerEntityRenderingHandler(FluffaloEntity.entity, renderManager -> { + return new MobRenderer(renderManager, new ModelFluffalo(), 1.5f) { + + @Override + public ResourceLocation getEntityTexture(Entity entity) { + return new ResourceLocation("hem:textures/entities/fluffalo.png"); + } + }; + }); + } + } + + // Made with Blockbench 5.0.3 + // Exported for Minecraft version 1.15 - 1.16 with MCP mappings + // Paste this class into your mod and generate all required imports + public static class ModelFluffalo extends EntityModel { + private final ModelRenderer Body; + private final ModelRenderer Tail2; + private final ModelRenderer Tail; + private final ModelRenderer cube_r1; + private final ModelRenderer Head; + private final ModelRenderer horn; + private final ModelRenderer cube_r2; + private final ModelRenderer LeftFoot1; + private final ModelRenderer RightFoot1; + private final ModelRenderer LeftFoot2; + private final ModelRenderer RightFoot2; + private final ModelRenderer LeftFoot3; + private final ModelRenderer RightFoot3; + + public ModelFluffalo() { + textureWidth = 256; + textureHeight = 256; + Body = new ModelRenderer(this); + Body.setRotationPoint(-0.5F, 11.0F, -3.25F); + Body.setTextureOffset(0, 0).addBox(-11.5F, -15.0F, -14.75F, 24.0F, 21.0F, 36.0F, 0.0F, false); + Body.setTextureOffset(0, 114).addBox(-11.5F, 6.0F, -14.75F, 24.0F, 7.0F, 36.0F, 0.0F, false); + Body.setTextureOffset(120, 0).addBox(0.5F, -22.0F, -21.75F, 0.0F, 16.0F, 47.0F, 0.0F, false); + Tail2 = new ModelRenderer(this); + Tail2.setRotationPoint(0.5F, -7.0F, 21.75F); + Body.addChild(Tail2); + Tail = new ModelRenderer(this); + Tail.setRotationPoint(0.0F, 0.0F, 0.0F); + Tail2.addChild(Tail); + cube_r1 = new ModelRenderer(this); + cube_r1.setRotationPoint(0.0F, 0.0F, 0.0F); + Tail.addChild(cube_r1); + setRotationAngle(cube_r1, 0.0873F, 0.0F, 0.0F); + cube_r1.setTextureOffset(148, 131).addBox(-3.0F, -2.0F, 0.0F, 6.0F, 21.0F, 0.0F, 0.0F, false); + Head = new ModelRenderer(this); + Head.setRotationPoint(0.0F, -2.0F, -15.0F); + Body.addChild(Head); + Head.setTextureOffset(120, 83).addBox(-5.5F, -6.0F, -8.75F, 11.0F, 11.0F, 9.0F, 0.25F, false); + Head.setTextureOffset(148, 152).addBox(-3.5F, -1.0F, -10.75F, 7.0F, 6.0F, 2.0F, 0.0F, false); + Head.setTextureOffset(120, 103).addBox(-5.5F, 5.5F, -8.75F, 11.0F, 8.0F, 9.0F, 0.25F, false); + Head.setTextureOffset(120, 63).addBox(-5.5F, -6.0F, -8.75F, 11.0F, 11.0F, 9.0F, 0.0F, false); + horn = new ModelRenderer(this); + horn.setRotationPoint(0.0F, 2.0F, -11.0F); + Head.addChild(horn); + cube_r2 = new ModelRenderer(this); + cube_r2.setRotationPoint(0.0F, 0.0F, 0.0F); + horn.addChild(cube_r2); + setRotationAngle(cube_r2, -0.4363F, 0.0F, 0.0F); + cube_r2.setTextureOffset(120, 120).addBox(-8.5F, -2.0F, 0.0F, 17.0F, 11.0F, 0.0F, 0.0F, false); + LeftFoot1 = new ModelRenderer(this); + LeftFoot1.setRotationPoint(7.0F, 17.0F, -12.0F); + LeftFoot1.setTextureOffset(120, 131).addBox(-4.0F, 0.0F, -4.0F, 7.0F, 7.0F, 7.0F, 0.0F, false); + LeftFoot1.setTextureOffset(120, 145).addBox(-4.0F, 0.0F, -4.0F, 7.0F, 7.0F, 7.0F, 0.25F, false); + RightFoot1 = new ModelRenderer(this); + RightFoot1.setRotationPoint(-7.0F, 17.0F, -12.0F); + RightFoot1.setTextureOffset(120, 131).addBox(-3.0F, 0.0F, -4.0F, 7.0F, 7.0F, 7.0F, 0.0F, true); + RightFoot1.setTextureOffset(120, 145).addBox(-3.0F, 0.0F, -4.0F, 7.0F, 7.0F, 7.0F, 0.25F, true); + LeftFoot2 = new ModelRenderer(this); + LeftFoot2.setRotationPoint(7.0F, 17.0F, 0.0F); + LeftFoot2.setTextureOffset(120, 131).addBox(-4.0F, 0.0F, -4.0F, 7.0F, 7.0F, 7.0F, 0.0F, false); + LeftFoot2.setTextureOffset(120, 145).addBox(-4.0F, 0.0F, -4.0F, 7.0F, 7.0F, 7.0F, 0.25F, false); + RightFoot2 = new ModelRenderer(this); + RightFoot2.setRotationPoint(-7.0F, 17.0F, 0.0F); + RightFoot2.setTextureOffset(120, 131).addBox(-3.0F, 0.0F, -4.0F, 7.0F, 7.0F, 7.0F, 0.0F, true); + RightFoot2.setTextureOffset(120, 145).addBox(-3.0F, 0.0F, -4.0F, 7.0F, 7.0F, 7.0F, 0.25F, true); + LeftFoot3 = new ModelRenderer(this); + LeftFoot3.setRotationPoint(7.0F, 17.0F, 11.0F); + LeftFoot3.setTextureOffset(120, 131).addBox(-4.0F, 0.0F, -3.0F, 7.0F, 7.0F, 7.0F, 0.0F, false); + LeftFoot3.setTextureOffset(120, 145).addBox(-4.0F, 0.0F, -3.0F, 7.0F, 7.0F, 7.0F, 0.25F, false); + RightFoot3 = new ModelRenderer(this); + RightFoot3.setRotationPoint(-7.0F, 17.0F, 12.0F); + RightFoot3.setTextureOffset(120, 131).addBox(-3.0F, 0.0F, -4.0F, 7.0F, 7.0F, 7.0F, 0.0F, true); + RightFoot3.setTextureOffset(120, 145).addBox(-3.0F, 0.0F, -4.0F, 7.0F, 7.0F, 7.0F, 0.25F, true); + } + + @Override + public void render(MatrixStack matrixStack, IVertexBuilder buffer, int packedLight, int packedOverlay, float red, float green, float blue, + float alpha) { + Body.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + LeftFoot1.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + RightFoot1.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + LeftFoot2.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + RightFoot2.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + LeftFoot3.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + RightFoot3.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } + + public void setRotationAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } + + public void setRotationAngles(Entity e, float f, float f1, float f2, float f3, float f4) { + this.Head.rotateAngleY = f3 / (180F / (float) Math.PI); + this.Head.rotateAngleX = f4 / (180F / (float) Math.PI); + this.Tail2.rotateAngleZ = MathHelper.cos(f * 0.6662F + (float) Math.PI) * f1; + this.RightFoot3.rotateAngleX = MathHelper.cos(f * 1.0F) * 1.0F * f1; + this.RightFoot2.rotateAngleX = MathHelper.cos(f * 1.0F) * -1.0F * f1; + this.horn.rotateAngleX = MathHelper.cos(f * 0.6662F + (float) Math.PI) * f1; + this.Tail.rotateAngleZ = MathHelper.cos(f * 0.6662F + (float) Math.PI) * f1; + this.Body.rotateAngleZ = MathHelper.cos(f * 0.6662F) * f1; + this.LeftFoot3.rotateAngleX = MathHelper.cos(f * 1.0F) * -1.0F * f1; + this.RightFoot1.rotateAngleX = MathHelper.cos(f * 1.0F) * 1.0F * f1; + this.LeftFoot2.rotateAngleX = MathHelper.cos(f * 1.0F) * 1.0F * f1; + this.LeftFoot1.rotateAngleX = MathHelper.cos(f * 1.0F) * -1.0F * f1; + } + } + +} diff --git a/src/main/java/studio/halbear/hem/entity/renderer/FluffaloShavedRenderer.java b/src/main/java/studio/halbear/hem/entity/renderer/FluffaloShavedRenderer.java new file mode 100644 index 0000000..ad9ae03 --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/renderer/FluffaloShavedRenderer.java @@ -0,0 +1,163 @@ + +package studio.halbear.hem.entity.renderer; + +import studio.halbear.hem.procedures.FluffaloShavedEntityShakingConditionProcedure; +import studio.halbear.hem.entity.FluffaloShavedEntity; + +import net.minecraftforge.fml.client.registry.RenderingRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.model.ModelRenderer; +import net.minecraft.client.renderer.entity.model.EntityModel; +import net.minecraft.client.renderer.entity.MobRenderer; + +import java.util.Collections; + +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.mojang.blaze3d.matrix.MatrixStack; + +@OnlyIn(Dist.CLIENT) +public class FluffaloShavedRenderer { + public static class ModelRegisterHandler { + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public void registerModels(ModelRegistryEvent event) { + RenderingRegistry.registerEntityRenderingHandler(FluffaloShavedEntity.entity, renderManager -> { + return new MobRenderer(renderManager, new ModelFluffaloShaved(), 1.5f) { + + @Override + public ResourceLocation getEntityTexture(Entity entity) { + return new ResourceLocation("hem:textures/entities/fluffalo.png"); + } + + @Override + protected boolean func_230495_a_(LivingEntity _ent) { + Entity entity = _ent; + World world = entity.world; + double x = entity.getPosX(); + double y = entity.getPosY(); + double z = entity.getPosZ(); + return FluffaloShavedEntityShakingConditionProcedure.executeProcedure(Collections.emptyMap()); + } + }; + }); + } + } + + // Made with Blockbench 5.0.3 + // Exported for Minecraft version 1.15 - 1.16 with MCP mappings + // Paste this class into your mod and generate all required imports + public static class ModelFluffaloShaved extends EntityModel { + private final ModelRenderer Body; + private final ModelRenderer Tail2; + private final ModelRenderer Tail; + private final ModelRenderer cube_r1; + private final ModelRenderer Head; + private final ModelRenderer horn; + private final ModelRenderer cube_r2; + private final ModelRenderer LeftFoot1; + private final ModelRenderer RightFoot1; + private final ModelRenderer LeftFoot2; + private final ModelRenderer RightFoot2; + private final ModelRenderer LeftFoot3; + private final ModelRenderer RightFoot3; + + public ModelFluffaloShaved() { + textureWidth = 256; + textureHeight = 256; + Body = new ModelRenderer(this); + Body.setRotationPoint(-0.5F, 12.0F, -3.25F); + Body.setTextureOffset(0, 199).addBox(-11.5F, -14.0F, -15.75F, 24.0F, 21.0F, 36.0F, -0.5F, false); + Tail2 = new ModelRenderer(this); + Tail2.setRotationPoint(0.5F, -7.0F, 21.75F); + Body.addChild(Tail2); + Tail = new ModelRenderer(this); + Tail.setRotationPoint(0.0F, 0.0F, 0.0F); + Tail2.addChild(Tail); + cube_r1 = new ModelRenderer(this); + cube_r1.setRotationPoint(0.0F, 0.0F, -2.0F); + Tail.addChild(cube_r1); + setRotationAngle(cube_r1, 0.0873F, 0.0F, 0.0F); + cube_r1.setTextureOffset(148, 131).addBox(-3.0F, -2.0F, 0.0F, 6.0F, 21.0F, 0.0F, 0.0F, false); + Head = new ModelRenderer(this); + Head.setRotationPoint(0.0F, -2.0F, -15.0F); + Body.addChild(Head); + Head.setTextureOffset(148, 160).addBox(-3.5F, -1.0F, -10.75F, 7.0F, 6.0F, 2.0F, 0.0F, false); + Head.setTextureOffset(120, 63).addBox(-5.5F, -6.0F, -8.75F, 11.0F, 11.0F, 9.0F, 0.0F, false); + horn = new ModelRenderer(this); + horn.setRotationPoint(0.0F, 2.0F, -11.0F); + Head.addChild(horn); + cube_r2 = new ModelRenderer(this); + cube_r2.setRotationPoint(0.0F, 0.0F, 0.0F); + horn.addChild(cube_r2); + setRotationAngle(cube_r2, -0.4363F, 0.0F, 0.0F); + cube_r2.setTextureOffset(120, 120).addBox(-8.5F, -2.0F, 0.0F, 17.0F, 11.0F, 0.0F, 0.0F, false); + LeftFoot1 = new ModelRenderer(this); + LeftFoot1.setRotationPoint(7.0F, 17.0F, -12.0F); + LeftFoot1.setTextureOffset(120, 131).addBox(-4.0F, 0.0F, -4.0F, 7.0F, 7.0F, 7.0F, 0.0F, false); + LeftFoot1.setTextureOffset(120, 145).addBox(-4.0F, 0.0F, -4.0F, 7.0F, 7.0F, 7.0F, 0.25F, false); + RightFoot1 = new ModelRenderer(this); + RightFoot1.setRotationPoint(-7.0F, 17.0F, -12.0F); + RightFoot1.setTextureOffset(120, 131).addBox(-3.0F, 0.0F, -4.0F, 7.0F, 7.0F, 7.0F, 0.0F, true); + RightFoot1.setTextureOffset(120, 145).addBox(-3.0F, 0.0F, -4.0F, 7.0F, 7.0F, 7.0F, 0.25F, true); + LeftFoot2 = new ModelRenderer(this); + LeftFoot2.setRotationPoint(7.0F, 17.0F, 0.0F); + LeftFoot2.setTextureOffset(120, 131).addBox(-4.0F, 0.0F, -4.0F, 7.0F, 7.0F, 7.0F, 0.0F, false); + LeftFoot2.setTextureOffset(120, 145).addBox(-4.0F, 0.0F, -4.0F, 7.0F, 7.0F, 7.0F, 0.25F, false); + RightFoot2 = new ModelRenderer(this); + RightFoot2.setRotationPoint(-7.0F, 17.0F, 0.0F); + RightFoot2.setTextureOffset(120, 131).addBox(-3.0F, 0.0F, -4.0F, 7.0F, 7.0F, 7.0F, 0.0F, true); + RightFoot2.setTextureOffset(120, 145).addBox(-3.0F, 0.0F, -4.0F, 7.0F, 7.0F, 7.0F, 0.25F, true); + LeftFoot3 = new ModelRenderer(this); + LeftFoot3.setRotationPoint(7.0F, 17.0F, 11.0F); + LeftFoot3.setTextureOffset(120, 131).addBox(-4.0F, 0.0F, -3.0F, 7.0F, 7.0F, 7.0F, 0.0F, false); + LeftFoot3.setTextureOffset(120, 145).addBox(-4.0F, 0.0F, -3.0F, 7.0F, 7.0F, 7.0F, 0.25F, false); + RightFoot3 = new ModelRenderer(this); + RightFoot3.setRotationPoint(-7.0F, 17.0F, 12.0F); + RightFoot3.setTextureOffset(120, 131).addBox(-3.0F, 0.0F, -4.0F, 7.0F, 7.0F, 7.0F, 0.0F, true); + RightFoot3.setTextureOffset(120, 145).addBox(-3.0F, 0.0F, -4.0F, 7.0F, 7.0F, 7.0F, 0.25F, true); + } + + @Override + public void render(MatrixStack matrixStack, IVertexBuilder buffer, int packedLight, int packedOverlay, float red, float green, float blue, + float alpha) { + Body.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + LeftFoot1.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + RightFoot1.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + LeftFoot2.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + RightFoot2.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + LeftFoot3.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + RightFoot3.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } + + public void setRotationAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } + + public void setRotationAngles(Entity e, float f, float f1, float f2, float f3, float f4) { + this.Head.rotateAngleY = f3 / (180F / (float) Math.PI); + this.Head.rotateAngleX = f4 / (180F / (float) Math.PI); + this.Tail2.rotateAngleZ = MathHelper.cos(f * 1.0F) * -1.0F * f1; + this.RightFoot3.rotateAngleX = MathHelper.cos(f * 1.0F) * 1.0F * f1; + this.RightFoot2.rotateAngleX = MathHelper.cos(f * 1.0F) * -1.0F * f1; + this.horn.rotateAngleX = MathHelper.cos(f * 0.6662F + (float) Math.PI) * f1; + this.Tail.rotateAngleZ = MathHelper.cos(f * 1.0F) * -1.0F * f1; + this.Body.rotateAngleZ = MathHelper.cos(f * 1.0F) * 1.0F * f1; + this.LeftFoot3.rotateAngleX = MathHelper.cos(f * 1.0F) * -1.0F * f1; + this.RightFoot1.rotateAngleX = MathHelper.cos(f * 1.0F) * 1.0F * f1; + this.LeftFoot2.rotateAngleX = MathHelper.cos(f * 1.0F) * 1.0F * f1; + this.LeftFoot1.rotateAngleX = MathHelper.cos(f * 1.0F) * -1.0F * f1; + } + } + +} diff --git a/src/main/java/studio/halbear/hem/entity/renderer/GiantButterflyRenderer.java b/src/main/java/studio/halbear/hem/entity/renderer/GiantButterflyRenderer.java new file mode 100644 index 0000000..51a260f --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/renderer/GiantButterflyRenderer.java @@ -0,0 +1,201 @@ + +package studio.halbear.hem.entity.renderer; + +import studio.halbear.hem.entity.GiantButterflyEntity; + +import net.minecraftforge.fml.client.registry.RenderingRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.model.ModelRenderer; +import net.minecraft.client.renderer.entity.model.EntityModel; +import net.minecraft.client.renderer.entity.MobRenderer; + +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.mojang.blaze3d.matrix.MatrixStack; + +@OnlyIn(Dist.CLIENT) +public class GiantButterflyRenderer { + public static class ModelRegisterHandler { + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public void registerModels(ModelRegistryEvent event) { + RenderingRegistry.registerEntityRenderingHandler(GiantButterflyEntity.entity, renderManager -> { + return new MobRenderer(renderManager, new ModelGiantButterfly(), 0.5f) { + + @Override + public ResourceLocation getEntityTexture(Entity entity) { + return new ResourceLocation("hem:textures/entities/giantbutterfly.png"); + } + }; + }); + } + } + + // Made with Blockbench 4.12.4 + // Exported for Minecraft version 1.15 - 1.16 with MCP mappings + // Paste this class into your mod and generate all required imports + public static class ModelGiantButterfly extends EntityModel { + private final ModelRenderer Head; + private final ModelRenderer antenna2; + private final ModelRenderer antenna_r1; + private final ModelRenderer antenna; + private final ModelRenderer antenna_r2; + private final ModelRenderer Body; + private final ModelRenderer cube_r1; + private final ModelRenderer cube_r2; + private final ModelRenderer RightLowerWingOuter1; + private final ModelRenderer RightLowerWing; + private final ModelRenderer RightLowerWing_r1; + private final ModelRenderer RightUpperWingOuter1; + private final ModelRenderer RightUpperWIng; + private final ModelRenderer RightUpperWIng_r1; + private final ModelRenderer LeftUpperWIngouter1; + private final ModelRenderer LeftUpperWIng; + private final ModelRenderer LeftUpperWIng_r1; + private final ModelRenderer LeftLowerWIngouter1; + private final ModelRenderer LeftLowerWing; + private final ModelRenderer LeftLowerWing_r1; + private final ModelRenderer RightLegs; + private final ModelRenderer cube_r3; + private final ModelRenderer LeftLegs; + private final ModelRenderer cube_r4; + + public ModelGiantButterfly() { + textureWidth = 256; + textureHeight = 256; + Head = new ModelRenderer(this); + Head.setRotationPoint(0.0F, 8.0F, -5.0F); + Head.setTextureOffset(138, 135).addBox(-4.0F, -4.0F, -9.0F, 8.0F, 9.0F, 9.0F, 0.0F, false); + Head.setTextureOffset(0, 142).addBox(0.0F, -2.0F, -16.0F, 0.0F, 18.0F, 10.0F, 0.0F, false); + antenna2 = new ModelRenderer(this); + antenna2.setRotationPoint(2.0F, -4.0F, -4.0F); + Head.addChild(antenna2); + antenna_r1 = new ModelRenderer(this); + antenna_r1.setRotationPoint(0.0F, 0.0F, 0.0F); + antenna2.addChild(antenna_r1); + setRotationAngle(antenna_r1, 1.5708F, 1.1345F, 1.9635F); + antenna_r1.setTextureOffset(91, 135).addBox(0.0F, -18.0F, -3.0F, 0.0F, 22.0F, 12.0F, 0.0F, false); + antenna = new ModelRenderer(this); + antenna.setRotationPoint(-2.0F, -4.0F, -4.0F); + Head.addChild(antenna); + antenna_r2 = new ModelRenderer(this); + antenna_r2.setRotationPoint(0.0F, 0.0F, 0.0F); + antenna.addChild(antenna_r2); + setRotationAngle(antenna_r2, 1.5708F, -1.1345F, -1.9635F); + antenna_r2.setTextureOffset(114, 135).addBox(0.0F, -18.0F, -3.0F, 0.0F, 22.0F, 12.0F, 0.0F, false); + Body = new ModelRenderer(this); + Body.setRotationPoint(0.0F, 8.0F, -5.0F); + setRotationAngle(Body, -0.3927F, 0.0F, 0.0F); + cube_r1 = new ModelRenderer(this); + cube_r1.setRotationPoint(0.0F, 19.363F, 26.4211F); + Body.addChild(cube_r1); + setRotationAngle(cube_r1, 0.7854F, 0.0F, 0.0F); + cube_r1.setTextureOffset(54, 135).addBox(-4.0F, -21.0F, -5.0F, 8.0F, 21.0F, 10.0F, 0.0F, false); + cube_r2 = new ModelRenderer(this); + cube_r2.setRotationPoint(0.0F, 4.563F, 14.5211F); + Body.addChild(cube_r2); + setRotationAngle(cube_r2, 1.3963F, 0.0F, 0.0F); + cube_r2.setTextureOffset(0, 111).addBox(-6.0F, -16.0F, -9.0F, 12.0F, 16.0F, 15.0F, 0.0F, false); + RightLowerWingOuter1 = new ModelRenderer(this); + RightLowerWingOuter1.setRotationPoint(-6.05F, -2.037F, 10.7711F); + Body.addChild(RightLowerWingOuter1); + RightLowerWing = new ModelRenderer(this); + RightLowerWing.setRotationPoint(0.0F, 0.0F, 0.0F); + RightLowerWingOuter1.addChild(RightLowerWing); + RightLowerWing_r1 = new ModelRenderer(this); + RightLowerWing_r1.setRotationPoint(0.0F, 0.0F, 0.0F); + RightLowerWing.addChild(RightLowerWing_r1); + setRotationAngle(RightLowerWing_r1, 1.4319F, -0.2446F, -0.7479F); + RightLowerWing_r1.setTextureOffset(97, 3).addBox(-0.1134F, -15.1127F, -2.2365F, 0.0F, 59.0F, 46.0F, 0.0F, true); + RightUpperWingOuter1 = new ModelRenderer(this); + RightUpperWingOuter1.setRotationPoint(-6.0F, -2.637F, 8.5211F); + Body.addChild(RightUpperWingOuter1); + RightUpperWIng = new ModelRenderer(this); + RightUpperWIng.setRotationPoint(0.0F, 0.0F, 0.0F); + RightUpperWingOuter1.addChild(RightUpperWIng); + RightUpperWIng_r1 = new ModelRenderer(this); + RightUpperWIng_r1.setRotationPoint(0.0F, 0.0F, 0.0F); + RightUpperWIng.addChild(RightUpperWIng_r1); + setRotationAngle(RightUpperWIng_r1, 1.44F, -0.0768F, -0.7941F); + RightUpperWIng_r1.setTextureOffset(2, 2).addBox(0.0F, -23.8409F, -2.0487F, 0.0F, 63.0F, 46.0F, 0.0F, true); + LeftUpperWIngouter1 = new ModelRenderer(this); + LeftUpperWIngouter1.setRotationPoint(6.0F, -2.637F, 8.5211F); + Body.addChild(LeftUpperWIngouter1); + LeftUpperWIng = new ModelRenderer(this); + LeftUpperWIng.setRotationPoint(0.0F, 0.0F, 0.0F); + LeftUpperWIngouter1.addChild(LeftUpperWIng); + LeftUpperWIng_r1 = new ModelRenderer(this); + LeftUpperWIng_r1.setRotationPoint(0.0F, 0.0F, 0.0F); + LeftUpperWIng.addChild(LeftUpperWIng_r1); + setRotationAngle(LeftUpperWIng_r1, 1.44F, 0.0768F, 0.7941F); + LeftUpperWIng_r1.setTextureOffset(2, 2).addBox(0.0F, -23.8409F, -2.0487F, 0.0F, 63.0F, 46.0F, 0.0F, false); + LeftLowerWIngouter1 = new ModelRenderer(this); + LeftLowerWIngouter1.setRotationPoint(6.0F, -2.0F, 10.0F); + Body.addChild(LeftLowerWIngouter1); + LeftLowerWing = new ModelRenderer(this); + LeftLowerWing.setRotationPoint(0.05F, -0.037F, 0.7711F); + LeftLowerWIngouter1.addChild(LeftLowerWing); + LeftLowerWing_r1 = new ModelRenderer(this); + LeftLowerWing_r1.setRotationPoint(0.0F, 0.0F, 0.0F); + LeftLowerWing.addChild(LeftLowerWing_r1); + setRotationAngle(LeftLowerWing_r1, 1.4319F, 0.2446F, 0.7479F); + LeftLowerWing_r1.setTextureOffset(97, 3).addBox(0.1134F, -15.1127F, -2.2365F, 0.0F, 59.0F, 46.0F, 0.0F, false); + RightLegs = new ModelRenderer(this); + RightLegs.setRotationPoint(-6.0F, 7.063F, 5.5211F); + Body.addChild(RightLegs); + cube_r3 = new ModelRenderer(this); + cube_r3.setRotationPoint(0.0F, 0.0F, 0.0F); + RightLegs.addChild(cube_r3); + setRotationAngle(cube_r3, 1.4829F, -0.151F, -1.0405F); + cube_r3.setTextureOffset(98, 111).addBox(-22.0F, -11.5709F, 0.0248F, 22.0F, 24.0F, 0.0F, 0.0F, false); + LeftLegs = new ModelRenderer(this); + LeftLegs.setRotationPoint(6.0F, 7.063F, 5.5211F); + Body.addChild(LeftLegs); + cube_r4 = new ModelRenderer(this); + cube_r4.setRotationPoint(0.0F, 0.0F, 0.0F); + LeftLegs.addChild(cube_r4); + setRotationAngle(cube_r4, 1.4829F, 0.151F, 1.0405F); + cube_r4.setTextureOffset(98, 111).addBox(0.0F, -11.5709F, 0.0248F, 22.0F, 24.0F, 0.0F, 0.0F, true); + } + + @Override + public void render(MatrixStack matrixStack, IVertexBuilder buffer, int packedLight, int packedOverlay, float red, float green, float blue, + float alpha) { + Head.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + Body.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } + + public void setRotationAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } + + public void setRotationAngles(Entity e, float f, float f1, float f2, float f3, float f4) { + this.antenna.rotateAngleX = MathHelper.cos(f * 0.6662F + (float) Math.PI) * f1; + this.LeftLowerWIngouter1.rotateAngleZ = MathHelper.cos(f * 1.0F) * -1.0F * f1; + this.RightUpperWIng.rotateAngleZ = MathHelper.cos(f * 1.0F) * 1.0F * f1; + this.LeftLowerWing.rotateAngleZ = MathHelper.cos(f * 1.0F) * -1.0F * f1; + this.Head.rotateAngleY = f3 / (180F / (float) Math.PI); + this.Head.rotateAngleX = f4 / (180F / (float) Math.PI); + this.RightLowerWing.rotateAngleZ = MathHelper.cos(f * 1.0F) * 1.0F * f1; + this.LeftUpperWIng_r1.rotateAngleY = MathHelper.cos(f * 1.0F) * -1.0F * f1; + this.LeftUpperWIngouter1.rotateAngleZ = MathHelper.cos(f * 1.0F) * -1.0F * f1; + this.RightLegs.rotateAngleY = MathHelper.cos(f * 1.0F) * -1.0F * f1; + this.LeftUpperWIng.rotateAngleZ = MathHelper.cos(f * 1.0F) * -1.0F * f1; + this.RightLowerWingOuter1.rotateAngleZ = MathHelper.cos(f * 1.0F) * 1.0F * f1; + this.RightUpperWingOuter1.rotateAngleZ = MathHelper.cos(f * 1.0F) * 1.0F * f1; + this.LeftLegs.rotateAngleY = MathHelper.cos(f * 1.0F) * 1.0F * f1; + this.RightUpperWIng_r1.rotateAngleY = MathHelper.cos(f * 1.0F) * 1.0F * f1; + this.antenna2.rotateAngleX = MathHelper.cos(f * 0.6662F + (float) Math.PI) * f1; + this.Body.rotateAngleX = MathHelper.cos(f * 0.6662F) * f1; + } + } + +} diff --git a/src/main/java/studio/halbear/hem/entity/renderer/GiantButterflyWalkingRenderer.java b/src/main/java/studio/halbear/hem/entity/renderer/GiantButterflyWalkingRenderer.java new file mode 100644 index 0000000..0492bf1 --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/renderer/GiantButterflyWalkingRenderer.java @@ -0,0 +1,237 @@ + +package studio.halbear.hem.entity.renderer; + +import studio.halbear.hem.entity.GiantButterflyWalkingEntity; + +import net.minecraftforge.fml.client.registry.RenderingRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.model.ModelRenderer; +import net.minecraft.client.renderer.entity.model.EntityModel; +import net.minecraft.client.renderer.entity.MobRenderer; + +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.mojang.blaze3d.matrix.MatrixStack; + +@OnlyIn(Dist.CLIENT) +public class GiantButterflyWalkingRenderer { + public static class ModelRegisterHandler { + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public void registerModels(ModelRegistryEvent event) { + RenderingRegistry.registerEntityRenderingHandler(GiantButterflyWalkingEntity.entity, renderManager -> { + return new MobRenderer(renderManager, new ModelGiantButterflyWalking(), 0.5f) { + + @Override + public ResourceLocation getEntityTexture(Entity entity) { + return new ResourceLocation("hem:textures/entities/giantbutterfly.png"); + } + }; + }); + } + } + + // Made with Blockbench 4.12.4 + // Exported for Minecraft version 1.15 - 1.16 with MCP mappings + // Paste this class into your mod and generate all required imports + public static class ModelGiantButterflyWalking extends EntityModel { + private final ModelRenderer Head; + private final ModelRenderer antenna2; + private final ModelRenderer antenna_r1; + private final ModelRenderer antenna; + private final ModelRenderer antenna_r2; + private final ModelRenderer Body; + private final ModelRenderer cube_r1; + private final ModelRenderer LeftUpperWIngouter1; + private final ModelRenderer LeftUpperWIng; + private final ModelRenderer LeftUpperWIng_r1; + private final ModelRenderer RightUpperWIngouter1; + private final ModelRenderer RightUpperWIng; + private final ModelRenderer RightUpperWIng_r1; + private final ModelRenderer LeftLowerWIngouter1; + private final ModelRenderer LeftLowerWing; + private final ModelRenderer LeftLowerWing_r1; + private final ModelRenderer RightLowerWIngouter1; + private final ModelRenderer RightLowerWing; + private final ModelRenderer RightLowerWing_r1; + private final ModelRenderer RightLegs; + private final ModelRenderer cube_r2; + private final ModelRenderer cube_r3; + private final ModelRenderer LeftLegs; + private final ModelRenderer cube_r4; + private final ModelRenderer cube_r5; + private final ModelRenderer RightLegs2; + private final ModelRenderer cube_r6; + private final ModelRenderer LeftLegs2; + private final ModelRenderer cube_r7; + private final ModelRenderer butt; + private final ModelRenderer cube_r8; + + public ModelGiantButterflyWalking() { + textureWidth = 256; + textureHeight = 256; + Head = new ModelRenderer(this); + Head.setRotationPoint(0.0F, 8.0F, -5.0F); + Head.setTextureOffset(138, 135).addBox(-4.0F, -4.0F, -9.0F, 8.0F, 9.0F, 9.0F, 0.0F, false); + Head.setTextureOffset(0, 142).addBox(0.0F, -2.0F, -16.0F, 0.0F, 18.0F, 10.0F, 0.0F, false); + antenna2 = new ModelRenderer(this); + antenna2.setRotationPoint(2.0F, -4.0F, -4.0F); + Head.addChild(antenna2); + antenna_r1 = new ModelRenderer(this); + antenna_r1.setRotationPoint(0.0F, 0.0F, 0.0F); + antenna2.addChild(antenna_r1); + setRotationAngle(antenna_r1, 1.5708F, 1.1345F, 1.9635F); + antenna_r1.setTextureOffset(91, 135).addBox(0.0F, -18.0F, -3.0F, 0.0F, 22.0F, 12.0F, 0.0F, false); + antenna = new ModelRenderer(this); + antenna.setRotationPoint(-2.0F, -4.0F, -4.0F); + Head.addChild(antenna); + antenna_r2 = new ModelRenderer(this); + antenna_r2.setRotationPoint(0.0F, 0.0F, 0.0F); + antenna.addChild(antenna_r2); + setRotationAngle(antenna_r2, 1.5708F, -1.1345F, -1.9635F); + antenna_r2.setTextureOffset(114, 135).addBox(0.0F, -18.0F, -3.0F, 0.0F, 22.0F, 12.0F, 0.0F, false); + Body = new ModelRenderer(this); + Body.setRotationPoint(0.0F, 8.0F, -5.0F); + cube_r1 = new ModelRenderer(this); + cube_r1.setRotationPoint(0.0F, 4.563F, 14.5211F); + Body.addChild(cube_r1); + setRotationAngle(cube_r1, 1.3963F, 0.0F, 0.0F); + cube_r1.setTextureOffset(0, 111).addBox(-6.0F, -16.0F, -9.0F, 12.0F, 16.0F, 15.0F, 0.0F, false); + LeftUpperWIngouter1 = new ModelRenderer(this); + LeftUpperWIngouter1.setRotationPoint(6.0F, -2.637F, 8.5211F); + Body.addChild(LeftUpperWIngouter1); + setRotationAngle(LeftUpperWIngouter1, 0.0F, 0.0F, -0.6109F); + LeftUpperWIng = new ModelRenderer(this); + LeftUpperWIng.setRotationPoint(0.0F, 0.0F, 0.0F); + LeftUpperWIngouter1.addChild(LeftUpperWIng); + LeftUpperWIng_r1 = new ModelRenderer(this); + LeftUpperWIng_r1.setRotationPoint(0.0F, 0.0F, 0.0F); + LeftUpperWIng.addChild(LeftUpperWIng_r1); + setRotationAngle(LeftUpperWIng_r1, 1.44F, 0.0768F, 0.7941F); + LeftUpperWIng_r1.setTextureOffset(2, 2).addBox(0.0F, -23.8409F, -2.0487F, 0.0F, 63.0F, 46.0F, 0.0F, false); + RightUpperWIngouter1 = new ModelRenderer(this); + RightUpperWIngouter1.setRotationPoint(-6.0F, -2.637F, 8.5211F); + Body.addChild(RightUpperWIngouter1); + setRotationAngle(RightUpperWIngouter1, 0.0F, 0.0F, 0.6109F); + RightUpperWIng = new ModelRenderer(this); + RightUpperWIng.setRotationPoint(0.0F, 0.0F, 0.0F); + RightUpperWIngouter1.addChild(RightUpperWIng); + RightUpperWIng_r1 = new ModelRenderer(this); + RightUpperWIng_r1.setRotationPoint(0.0F, 0.0F, 0.0F); + RightUpperWIng.addChild(RightUpperWIng_r1); + setRotationAngle(RightUpperWIng_r1, 1.44F, -0.0768F, -0.7941F); + RightUpperWIng_r1.setTextureOffset(2, 2).addBox(0.0F, -23.8409F, -2.0487F, 0.0F, 63.0F, 46.0F, 0.0F, true); + LeftLowerWIngouter1 = new ModelRenderer(this); + LeftLowerWIngouter1.setRotationPoint(6.0F, -2.0F, 8.0F); + Body.addChild(LeftLowerWIngouter1); + setRotationAngle(LeftLowerWIngouter1, 0.0F, -0.2618F, -0.7854F); + LeftLowerWing = new ModelRenderer(this); + LeftLowerWing.setRotationPoint(0.05F, -0.037F, 2.7711F); + LeftLowerWIngouter1.addChild(LeftLowerWing); + LeftLowerWing_r1 = new ModelRenderer(this); + LeftLowerWing_r1.setRotationPoint(0.0F, 0.0F, 0.0F); + LeftLowerWing.addChild(LeftLowerWing_r1); + setRotationAngle(LeftLowerWing_r1, 1.4319F, 0.2446F, 0.7479F); + LeftLowerWing_r1.setTextureOffset(97, 3).addBox(0.1134F, -15.1127F, -2.2365F, 0.0F, 59.0F, 46.0F, 0.0F, false); + RightLowerWIngouter1 = new ModelRenderer(this); + RightLowerWIngouter1.setRotationPoint(-6.0F, -2.0F, 8.0F); + Body.addChild(RightLowerWIngouter1); + setRotationAngle(RightLowerWIngouter1, 0.0F, 0.2618F, 0.7854F); + RightLowerWing = new ModelRenderer(this); + RightLowerWing.setRotationPoint(-0.05F, -0.037F, 2.7711F); + RightLowerWIngouter1.addChild(RightLowerWing); + RightLowerWing_r1 = new ModelRenderer(this); + RightLowerWing_r1.setRotationPoint(0.0F, 0.0F, 0.0F); + RightLowerWing.addChild(RightLowerWing_r1); + setRotationAngle(RightLowerWing_r1, 1.4319F, -0.2446F, -0.7479F); + RightLowerWing_r1.setTextureOffset(97, 3).addBox(-0.1134F, -15.1127F, -2.2365F, 0.0F, 59.0F, 46.0F, 0.0F, true); + RightLegs = new ModelRenderer(this); + RightLegs.setRotationPoint(-6.0F, 3.063F, 7.5211F); + Body.addChild(RightLegs); + setRotationAngle(RightLegs, 0.0F, 0.0F, 0.3491F); + cube_r2 = new ModelRenderer(this); + cube_r2.setRotationPoint(0.0F, -0.063F, -3.5211F); + RightLegs.addChild(cube_r2); + setRotationAngle(cube_r2, 1.5708F, 0.0873F, -1.0472F); + cube_r2.setTextureOffset(139, 237).addBox(-22.0F, 3.0F, 0.0F, 22.0F, 10.0F, 0.0F, 0.0F, false); + cube_r3 = new ModelRenderer(this); + cube_r3.setRotationPoint(0.0F, -0.063F, -2.0211F); + RightLegs.addChild(cube_r3); + setRotationAngle(cube_r3, 1.5708F, -0.0873F, -1.0472F); + cube_r3.setTextureOffset(141, 187).addBox(-22.0F, -9.0F, 0.0F, 22.0F, 10.0F, 0.0F, 0.0F, false); + LeftLegs = new ModelRenderer(this); + LeftLegs.setRotationPoint(6.0F, 3.063F, 7.5211F); + Body.addChild(LeftLegs); + setRotationAngle(LeftLegs, 0.0F, 0.0F, -0.3491F); + cube_r4 = new ModelRenderer(this); + cube_r4.setRotationPoint(0.0F, -0.063F, -3.5211F); + LeftLegs.addChild(cube_r4); + setRotationAngle(cube_r4, 1.5708F, -0.0873F, 1.0472F); + cube_r4.setTextureOffset(139, 237).addBox(0.0F, 3.0F, 0.0F, 22.0F, 10.0F, 0.0F, 0.0F, true); + cube_r5 = new ModelRenderer(this); + cube_r5.setRotationPoint(0.0F, -0.063F, -2.0211F); + LeftLegs.addChild(cube_r5); + setRotationAngle(cube_r5, 1.5708F, 0.0873F, 1.0472F); + cube_r5.setTextureOffset(141, 187).addBox(0.0F, -9.0F, 0.0F, 22.0F, 10.0F, 0.0F, 0.0F, true); + RightLegs2 = new ModelRenderer(this); + RightLegs2.setRotationPoint(-6.0F, 3.063F, 5.5211F); + Body.addChild(RightLegs2); + setRotationAngle(RightLegs2, 0.0F, 0.0F, 0.3491F); + cube_r6 = new ModelRenderer(this); + cube_r6.setRotationPoint(0.0F, -0.063F, 0.4789F); + RightLegs2.addChild(cube_r6); + setRotationAngle(cube_r6, 1.4835F, 0.0F, -1.0472F); + cube_r6.setTextureOffset(139, 218).addBox(-22.0F, -4.0F, 0.0F, 22.0F, 10.0F, 0.0F, 0.0F, false); + LeftLegs2 = new ModelRenderer(this); + LeftLegs2.setRotationPoint(6.0F, 3.063F, 5.5211F); + Body.addChild(LeftLegs2); + setRotationAngle(LeftLegs2, 0.0F, 0.0F, -0.3491F); + cube_r7 = new ModelRenderer(this); + cube_r7.setRotationPoint(0.0F, -0.063F, 0.4789F); + LeftLegs2.addChild(cube_r7); + setRotationAngle(cube_r7, 1.4835F, 0.0F, 1.0472F); + cube_r7.setTextureOffset(139, 218).addBox(0.0F, -4.0F, 0.0F, 22.0F, 10.0F, 0.0F, 0.0F, true); + butt = new ModelRenderer(this); + butt.setRotationPoint(0.0F, 5.863F, 13.1711F); + Body.addChild(butt); + setRotationAngle(butt, -0.0436F, 0.0F, 0.0F); + cube_r8 = new ModelRenderer(this); + cube_r8.setRotationPoint(0.0F, -4.5F, 0.25F); + butt.addChild(cube_r8); + setRotationAngle(cube_r8, 1.2654F, 0.0F, 0.0F); + cube_r8.setTextureOffset(54, 135).addBox(-4.0F, 0.2132F, -9.2426F, 8.0F, 21.0F, 10.0F, 0.0F, false); + } + + @Override + public void render(MatrixStack matrixStack, IVertexBuilder buffer, int packedLight, int packedOverlay, float red, float green, float blue, + float alpha) { + Head.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + Body.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } + + public void setRotationAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } + + public void setRotationAngles(Entity e, float f, float f1, float f2, float f3, float f4) { + this.antenna.rotateAngleX = MathHelper.cos(f * 0.6662F + (float) Math.PI) * f1; + this.RightLegs2.rotateAngleZ = MathHelper.cos(f * 1.0F) * -1.0F * f1; + this.Head.rotateAngleY = f3 / (180F / (float) Math.PI); + this.Head.rotateAngleX = f4 / (180F / (float) Math.PI); + this.RightLegs.rotateAngleZ = MathHelper.cos(f * 1.0F) * 1.0F * f1; + this.LeftLegs.rotateAngleZ = MathHelper.cos(f * 1.0F) * -1.0F * f1; + this.LeftLegs2.rotateAngleZ = MathHelper.cos(f * 1.0F) * 1.0F * f1; + this.antenna2.rotateAngleX = MathHelper.cos(f * 0.6662F + (float) Math.PI) * f1; + this.butt.rotateAngleX = MathHelper.cos(f * 1.0F) * -1.0F * f1; + } + } + +} diff --git a/src/main/java/studio/halbear/hem/entity/renderer/GoldFishRenderer.java b/src/main/java/studio/halbear/hem/entity/renderer/GoldFishRenderer.java new file mode 100644 index 0000000..c3f1d50 --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/renderer/GoldFishRenderer.java @@ -0,0 +1,129 @@ + +package studio.halbear.hem.entity.renderer; + +import studio.halbear.hem.procedures.TigerFishEntityShakingConditionProcedure; +import studio.halbear.hem.entity.GoldFishEntity; + +import net.minecraftforge.fml.client.registry.RenderingRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.model.ModelRenderer; +import net.minecraft.client.renderer.entity.model.EntityModel; +import net.minecraft.client.renderer.entity.MobRenderer; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.mojang.blaze3d.matrix.MatrixStack; + +@OnlyIn(Dist.CLIENT) +public class GoldFishRenderer { + public static class ModelRegisterHandler { + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public void registerModels(ModelRegistryEvent event) { + RenderingRegistry.registerEntityRenderingHandler(GoldFishEntity.entity, renderManager -> { + return new MobRenderer(renderManager, new Modelgoldfish(), 0.2f) { + + @Override + public ResourceLocation getEntityTexture(Entity entity) { + return new ResourceLocation("hem:textures/entities/goldfish.png"); + } + + @Override + protected boolean func_230495_a_(LivingEntity _ent) { + Entity entity = _ent; + World world = entity.world; + double x = entity.getPosX(); + double y = entity.getPosY(); + double z = entity.getPosZ(); + return TigerFishEntityShakingConditionProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + }; + }); + } + } + + // Made with Blockbench 4.12.4 + // Exported for Minecraft version 1.15 - 1.16 with MCP mappings + // Paste this class into your mod and generate all required imports + public static class Modelgoldfish extends EntityModel { + private final ModelRenderer Head; + private final ModelRenderer Body; + private final ModelRenderer LeftFin; + private final ModelRenderer LeftFin_r1; + private final ModelRenderer RightFin; + private final ModelRenderer RightFin_r1; + private final ModelRenderer TailFin2; + private final ModelRenderer TailFin; + + public Modelgoldfish() { + textureWidth = 64; + textureHeight = 64; + Head = new ModelRenderer(this); + Head.setRotationPoint(0.0F, 21.0F, -1.0F); + Body = new ModelRenderer(this); + Body.setRotationPoint(0.0F, 1.0F, 4.0F); + Head.addChild(Body); + Body.setTextureOffset(24, 19).addBox(-1.0F, -2.0F, -6.0F, 2.0F, 4.0F, 6.0F, 0.0F, false); + Body.setTextureOffset(0, 0).addBox(0.0F, -5.0F, -9.0F, 0.0F, 10.0F, 9.0F, 0.0F, false); + LeftFin = new ModelRenderer(this); + LeftFin.setRotationPoint(1.0F, 0.0F, -3.0F); + Body.addChild(LeftFin); + LeftFin_r1 = new ModelRenderer(this); + LeftFin_r1.setRotationPoint(0.0F, 0.0F, 0.0F); + LeftFin.addChild(LeftFin_r1); + setRotationAngle(LeftFin_r1, 0.0F, 0.0F, 0.5236F); + LeftFin_r1.setTextureOffset(0, 19).addBox(0.0F, 0.0F, -3.0F, 6.0F, 0.0F, 6.0F, 0.0F, false); + RightFin = new ModelRenderer(this); + RightFin.setRotationPoint(-1.0F, 0.0F, -3.0F); + Body.addChild(RightFin); + RightFin_r1 = new ModelRenderer(this); + RightFin_r1.setRotationPoint(0.0F, 0.0F, 0.0F); + RightFin.addChild(RightFin_r1); + setRotationAngle(RightFin_r1, 0.0F, 0.0F, -0.5236F); + RightFin_r1.setTextureOffset(0, 19).addBox(-6.0F, 0.0F, -3.0F, 6.0F, 0.0F, 6.0F, 0.0F, true); + TailFin2 = new ModelRenderer(this); + TailFin2.setRotationPoint(0.0F, 0.0F, 0.0F); + Body.addChild(TailFin2); + TailFin = new ModelRenderer(this); + TailFin.setRotationPoint(0.0F, 0.0F, 0.0F); + TailFin2.addChild(TailFin); + TailFin.setTextureOffset(18, 0).addBox(0.0F, -5.0F, 0.0F, 0.0F, 10.0F, 9.0F, 0.0F, false); + } + + @Override + public void render(MatrixStack matrixStack, IVertexBuilder buffer, int packedLight, int packedOverlay, float red, float green, float blue, + float alpha) { + Head.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } + + public void setRotationAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } + + public void setRotationAngles(Entity e, float f, float f1, float f2, float f3, float f4) { + this.TailFin.rotateAngleY = MathHelper.cos(f * 1.0F) * -1.0F * f1; + this.Head.rotateAngleX = f4 / (180F / (float) Math.PI); + this.LeftFin.rotateAngleZ = MathHelper.cos(f * 0.6662F + (float) Math.PI) * f1; + this.TailFin2.rotateAngleY = MathHelper.cos(f * 1.0F) * -1.0F * f1; + this.Body.rotateAngleY = MathHelper.cos(f * 1.0F) * 1.0F * f1; + this.RightFin.rotateAngleZ = MathHelper.cos(f * 0.6662F) * f1; + } + } + +} diff --git a/src/main/java/studio/halbear/hem/entity/renderer/HotAirBalloonRenderer.java b/src/main/java/studio/halbear/hem/entity/renderer/HotAirBalloonRenderer.java new file mode 100644 index 0000000..7f0175f --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/renderer/HotAirBalloonRenderer.java @@ -0,0 +1,1114 @@ + +package studio.halbear.hem.entity.renderer; + +import studio.halbear.hem.entity.HotAirBalloonEntity; + +import net.minecraftforge.fml.client.registry.RenderingRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.util.ResourceLocation; +import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.model.ModelRenderer; +import net.minecraft.client.renderer.entity.model.EntityModel; +import net.minecraft.client.renderer.entity.MobRenderer; + +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.mojang.blaze3d.matrix.MatrixStack; + +@OnlyIn(Dist.CLIENT) +public class HotAirBalloonRenderer { + public static class ModelRegisterHandler { + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public void registerModels(ModelRegistryEvent event) { + RenderingRegistry.registerEntityRenderingHandler(HotAirBalloonEntity.entity, renderManager -> { + return new MobRenderer(renderManager, new ModelHotAirBalloon(), 0.5f) { + + @Override + public ResourceLocation getEntityTexture(Entity entity) { + return new ResourceLocation("hem:textures/entities/hotairballoon.png"); + } + }; + }); + } + } + + // Made with Blockbench 5.0.3 + // Exported for Minecraft version 1.15 - 1.16 with MCP mappings + // Paste this class into your mod and generate all required imports + public static class ModelHotAirBalloon extends EntityModel { + private final ModelRenderer Balloonstrip; + private final ModelRenderer cube_r1; + private final ModelRenderer cube_r2; + private final ModelRenderer bone8; + private final ModelRenderer cube_r3; + private final ModelRenderer cube_r4; + private final ModelRenderer bone16; + private final ModelRenderer cube_r5; + private final ModelRenderer cube_r6; + private final ModelRenderer bone18; + private final ModelRenderer cube_r7; + private final ModelRenderer cube_r8; + private final ModelRenderer cube_r9; + private final ModelRenderer cube_r10; + private final ModelRenderer cube_r11; + private final ModelRenderer Balloonstrip11; + private final ModelRenderer cube_r12; + private final ModelRenderer cube_r13; + private final ModelRenderer bone45; + private final ModelRenderer cube_r14; + private final ModelRenderer cube_r15; + private final ModelRenderer bone46; + private final ModelRenderer cube_r16; + private final ModelRenderer cube_r17; + private final ModelRenderer bone47; + private final ModelRenderer cube_r18; + private final ModelRenderer cube_r19; + private final ModelRenderer cube_r20; + private final ModelRenderer cube_r21; + private final ModelRenderer cube_r22; + private final ModelRenderer Balloonstrip12; + private final ModelRenderer cube_r23; + private final ModelRenderer cube_r24; + private final ModelRenderer bone48; + private final ModelRenderer cube_r25; + private final ModelRenderer cube_r26; + private final ModelRenderer bone49; + private final ModelRenderer cube_r27; + private final ModelRenderer cube_r28; + private final ModelRenderer bone50; + private final ModelRenderer cube_r29; + private final ModelRenderer cube_r30; + private final ModelRenderer cube_r31; + private final ModelRenderer cube_r32; + private final ModelRenderer cube_r33; + private final ModelRenderer Balloonstrip10; + private final ModelRenderer cube_r34; + private final ModelRenderer cube_r35; + private final ModelRenderer bone42; + private final ModelRenderer cube_r36; + private final ModelRenderer cube_r37; + private final ModelRenderer bone43; + private final ModelRenderer cube_r38; + private final ModelRenderer cube_r39; + private final ModelRenderer bone44; + private final ModelRenderer cube_r40; + private final ModelRenderer cube_r41; + private final ModelRenderer cube_r42; + private final ModelRenderer cube_r43; + private final ModelRenderer cube_r44; + private final ModelRenderer Balloonstrip2; + private final ModelRenderer cube_r45; + private final ModelRenderer cube_r46; + private final ModelRenderer bone2; + private final ModelRenderer cube_r47; + private final ModelRenderer cube_r48; + private final ModelRenderer bone27; + private final ModelRenderer cube_r49; + private final ModelRenderer cube_r50; + private final ModelRenderer bone28; + private final ModelRenderer cube_r51; + private final ModelRenderer cube_r52; + private final ModelRenderer cube_r53; + private final ModelRenderer cube_r54; + private final ModelRenderer cube_r55; + private final ModelRenderer Balloonstrip9; + private final ModelRenderer cube_r56; + private final ModelRenderer cube_r57; + private final ModelRenderer bone39; + private final ModelRenderer cube_r58; + private final ModelRenderer cube_r59; + private final ModelRenderer bone40; + private final ModelRenderer cube_r60; + private final ModelRenderer cube_r61; + private final ModelRenderer bone41; + private final ModelRenderer cube_r62; + private final ModelRenderer cube_r63; + private final ModelRenderer cube_r64; + private final ModelRenderer cube_r65; + private final ModelRenderer cube_r66; + private final ModelRenderer Balloonstrip7; + private final ModelRenderer cube_r67; + private final ModelRenderer cube_r68; + private final ModelRenderer bone30; + private final ModelRenderer cube_r69; + private final ModelRenderer cube_r70; + private final ModelRenderer bone31; + private final ModelRenderer cube_r71; + private final ModelRenderer cube_r72; + private final ModelRenderer bone35; + private final ModelRenderer cube_r73; + private final ModelRenderer cube_r74; + private final ModelRenderer cube_r75; + private final ModelRenderer cube_r76; + private final ModelRenderer cube_r77; + private final ModelRenderer Balloonstrip8; + private final ModelRenderer cube_r78; + private final ModelRenderer cube_r79; + private final ModelRenderer bone36; + private final ModelRenderer cube_r80; + private final ModelRenderer cube_r81; + private final ModelRenderer bone37; + private final ModelRenderer cube_r82; + private final ModelRenderer cube_r83; + private final ModelRenderer bone38; + private final ModelRenderer cube_r84; + private final ModelRenderer cube_r85; + private final ModelRenderer cube_r86; + private final ModelRenderer cube_r87; + private final ModelRenderer cube_r88; + private final ModelRenderer Engine; + private final ModelRenderer bone34; + private final ModelRenderer cube_r89; + private final ModelRenderer bone32; + private final ModelRenderer cube_r90; + private final ModelRenderer cube_r91; + private final ModelRenderer bone33; + private final ModelRenderer cube_r92; + private final ModelRenderer cube_r93; + private final ModelRenderer bone60; + private final ModelRenderer cube_r94; + private final ModelRenderer bone61; + private final ModelRenderer cube_r95; + private final ModelRenderer cube_r96; + private final ModelRenderer bone62; + private final ModelRenderer cube_r97; + private final ModelRenderer cube_r98; + private final ModelRenderer bone; + private final ModelRenderer cube_r99; + private final ModelRenderer cube_r100; + private final ModelRenderer cube_r101; + private final ModelRenderer bone29; + private final ModelRenderer cube_r102; + private final ModelRenderer cube_r103; + private final ModelRenderer bone25; + private final ModelRenderer cube_r104; + private final ModelRenderer cube_r105; + private final ModelRenderer bone51; + private final ModelRenderer cube_r106; + private final ModelRenderer cube_r107; + private final ModelRenderer cube_r108; + private final ModelRenderer bone52; + private final ModelRenderer cube_r109; + private final ModelRenderer cube_r110; + private final ModelRenderer bone53; + private final ModelRenderer cube_r111; + private final ModelRenderer cube_r112; + private final ModelRenderer bone54; + private final ModelRenderer cube_r113; + private final ModelRenderer cube_r114; + private final ModelRenderer cube_r115; + private final ModelRenderer bone55; + private final ModelRenderer cube_r116; + private final ModelRenderer cube_r117; + private final ModelRenderer bone56; + private final ModelRenderer cube_r118; + private final ModelRenderer cube_r119; + private final ModelRenderer bone57; + private final ModelRenderer cube_r120; + private final ModelRenderer cube_r121; + private final ModelRenderer cube_r122; + private final ModelRenderer bone58; + private final ModelRenderer cube_r123; + private final ModelRenderer cube_r124; + private final ModelRenderer bone59; + private final ModelRenderer cube_r125; + private final ModelRenderer cube_r126; + private final ModelRenderer bone26; + private final ModelRenderer cube_r127; + private final ModelRenderer cube_r128; + private final ModelRenderer bb_main; + + public ModelHotAirBalloon() { + textureWidth = 256; + textureHeight = 256; + Balloonstrip = new ModelRenderer(this); + Balloonstrip.setRotationPoint(0.0F, -91.4305F, 0.0F); + cube_r1 = new ModelRenderer(this); + cube_r1.setRotationPoint(0.0F, -0.5695F, 0.0F); + Balloonstrip.addChild(cube_r1); + setRotationAngle(cube_r1, 0.0F, 0.7854F, 0.0F); + cube_r1.setTextureOffset(143, 98).addBox(-3.5F, -9.0F, -8.5F, 7.0F, 1.0F, 1.0F, 0.0F, false); + cube_r1.setTextureOffset(143, 95).addBox(-3.5F, 65.0F, -9.0F, 7.0F, 1.0F, 1.0F, 0.0F, false); + cube_r2 = new ModelRenderer(this); + cube_r2.setRotationPoint(0.0F, 32.4305F, 0.0F); + Balloonstrip.addChild(cube_r2); + setRotationAngle(cube_r2, 0.0F, -0.7854F, 0.0F); + cube_r2.setTextureOffset(53, 65).addBox(-26.75F, -19.0F, -11.0F, 0.0F, 20.0F, 22.0F, 0.0F, false); + bone8 = new ModelRenderer(this); + bone8.setRotationPoint(0.0F, 0.0F, 0.0F); + Balloonstrip.addChild(bone8); + setRotationAngle(bone8, 0.0F, 0.7854F, 0.0F); + cube_r3 = new ModelRenderer(this); + cube_r3.setRotationPoint(0.0F, 13.4305F, -27.0F); + bone8.addChild(cube_r3); + setRotationAngle(cube_r3, -1.5708F, -1.1345F, 1.5708F); + cube_r3.setTextureOffset(98, 65).addBox(0.25F, -18.0F, -11.0F, 0.0F, 18.0F, 22.0F, 0.0F, false); + cube_r4 = new ModelRenderer(this); + cube_r4.setRotationPoint(0.0F, -2.757F, -19.1661F); + bone8.addChild(cube_r4); + setRotationAngle(cube_r4, -1.5708F, -0.5236F, 1.5708F); + cube_r4.setTextureOffset(0, 131).addBox(-0.0087F, -13.0183F, -8.0F, 0.0F, 13.0F, 16.0F, 0.0F, false); + bone16 = new ModelRenderer(this); + bone16.setRotationPoint(0.0F, 56.2431F, 0.0F); + Balloonstrip.addChild(bone16); + setRotationAngle(bone16, 0.0F, 0.7854F, 0.0F); + cube_r5 = new ModelRenderer(this); + cube_r5.setRotationPoint(0.0F, -16.8126F, -27.0F); + bone16.addChild(cube_r5); + setRotationAngle(cube_r5, 1.5708F, -1.2217F, -1.5708F); + cube_r5.setTextureOffset(0, 66).addBox(2.3021F, -5.6382F, -11.0F, 0.0F, 18.0F, 22.0F, 0.0F, false); + cube_r6 = new ModelRenderer(this); + cube_r6.setRotationPoint(0.0F, 0.0F, -20.6161F); + bone16.addChild(cube_r6); + setRotationAngle(cube_r6, 1.5708F, -0.8727F, -1.5708F); + cube_r6.setTextureOffset(47, 108).addBox(3.848F, -4.5779F, -8.0F, 0.0F, 19.0F, 16.0F, 0.0F, false); + bone18 = new ModelRenderer(this); + bone18.setRotationPoint(0.0F, 1.9065F, 0.0F); + Balloonstrip.addChild(bone18); + setRotationAngle(bone18, 0.0F, 0.7854F, 0.0F); + cube_r7 = new ModelRenderer(this); + cube_r7.setRotationPoint(-3.5F, 68.0241F, -8.5F); + bone18.addChild(cube_r7); + setRotationAngle(cube_r7, 0.7148F, 0.4053F, 0.0127F); + cube_r7.setTextureOffset(45, 66).addBox(-0.5584F, -24.2922F, 2.7582F, 1.0F, 21.0F, 1.0F, 0.0F, false); + cube_r8 = new ModelRenderer(this); + cube_r8.setRotationPoint(-8.7131F, 52.8042F, -21.201F); + bone18.addChild(cube_r8); + setRotationAngle(cube_r8, 0.3622F, 0.4084F, 0.0038F); + cube_r8.setTextureOffset(33, 131).addBox(-0.5577F, -22.6869F, 1.7572F, 1.0F, 18.0F, 1.0F, 0.0F, false); + cube_r9 = new ModelRenderer(this); + cube_r9.setRotationPoint(-11.1221F, 35.9524F, -27.0955F); + bone18.addChild(cube_r9); + setRotationAngle(cube_r9, 0.0F, 0.4084F, 0.0038F); + cube_r9.setTextureOffset(89, 0).addBox(-0.6286F, -24.9941F, -0.0064F, 1.0F, 20.0F, 1.0F, 0.0F, false); + cube_r10 = new ModelRenderer(this); + cube_r10.setRotationPoint(-11.1221F, 15.9524F, -27.0955F); + bone18.addChild(cube_r10); + setRotationAngle(cube_r10, -0.48F, 0.4084F, 0.0038F); + cube_r10.setTextureOffset(94, 0).addBox(-0.6286F, -22.4256F, -2.3143F, 1.0F, 18.0F, 1.0F, 0.0F, false); + cube_r11 = new ModelRenderer(this); + cube_r11.setRotationPoint(-7.7729F, 0.0F, -19.4636F); + bone18.addChild(cube_r11); + setRotationAngle(cube_r11, -1.0997F, 0.3705F, -0.0196F); + cube_r11.setTextureOffset(143, 64).addBox(-0.5062F, -16.2961F, -4.4365F, 1.0F, 14.0F, 1.0F, 0.0F, false); + Balloonstrip11 = new ModelRenderer(this); + Balloonstrip11.setRotationPoint(0.0F, -91.4305F, 0.0F); + setRotationAngle(Balloonstrip11, 0.0F, 1.5708F, 0.0F); + cube_r12 = new ModelRenderer(this); + cube_r12.setRotationPoint(0.0F, -0.5695F, 0.0F); + Balloonstrip11.addChild(cube_r12); + setRotationAngle(cube_r12, 0.0F, 0.7854F, 0.0F); + cube_r12.setTextureOffset(143, 98).addBox(-3.5F, -9.0F, -8.5F, 7.0F, 1.0F, 1.0F, 0.0F, false); + cube_r12.setTextureOffset(80, 129).addBox(-3.5F, 65.0F, -9.0F, 7.0F, 1.0F, 1.0F, 0.0F, false); + cube_r13 = new ModelRenderer(this); + cube_r13.setRotationPoint(0.0F, 32.4305F, 0.0F); + Balloonstrip11.addChild(cube_r13); + setRotationAngle(cube_r13, 0.0F, -0.7854F, 0.0F); + cube_r13.setTextureOffset(53, 65).addBox(-26.75F, -19.0F, -11.0F, 0.0F, 20.0F, 22.0F, 0.0F, false); + bone45 = new ModelRenderer(this); + bone45.setRotationPoint(0.0F, 0.0F, 0.0F); + Balloonstrip11.addChild(bone45); + setRotationAngle(bone45, 0.0F, 0.7854F, 0.0F); + cube_r14 = new ModelRenderer(this); + cube_r14.setRotationPoint(0.0F, 13.4305F, -27.0F); + bone45.addChild(cube_r14); + setRotationAngle(cube_r14, -1.5708F, -1.1345F, 1.5708F); + cube_r14.setTextureOffset(98, 65).addBox(0.25F, -18.0F, -11.0F, 0.0F, 18.0F, 22.0F, 0.0F, false); + cube_r15 = new ModelRenderer(this); + cube_r15.setRotationPoint(0.0F, -2.757F, -19.1661F); + bone45.addChild(cube_r15); + setRotationAngle(cube_r15, -1.5708F, -0.5236F, 1.5708F); + cube_r15.setTextureOffset(0, 131).addBox(-0.0087F, -13.0183F, -8.0F, 0.0F, 13.0F, 16.0F, 0.0F, false); + bone46 = new ModelRenderer(this); + bone46.setRotationPoint(0.0F, 56.2431F, 0.0F); + Balloonstrip11.addChild(bone46); + setRotationAngle(bone46, 0.0F, 0.7854F, 0.0F); + cube_r16 = new ModelRenderer(this); + cube_r16.setRotationPoint(0.0F, -16.8126F, -27.0F); + bone46.addChild(cube_r16); + setRotationAngle(cube_r16, 1.5708F, -1.2217F, -1.5708F); + cube_r16.setTextureOffset(0, 66).addBox(2.3021F, -5.6382F, -11.0F, 0.0F, 18.0F, 22.0F, 0.0F, false); + cube_r17 = new ModelRenderer(this); + cube_r17.setRotationPoint(0.0F, 0.0F, -20.6161F); + bone46.addChild(cube_r17); + setRotationAngle(cube_r17, 1.5708F, -0.8727F, -1.5708F); + cube_r17.setTextureOffset(47, 108).addBox(3.848F, -4.5779F, -8.0F, 0.0F, 19.0F, 16.0F, 0.0F, false); + bone47 = new ModelRenderer(this); + bone47.setRotationPoint(0.0F, 1.9065F, 0.0F); + Balloonstrip11.addChild(bone47); + setRotationAngle(bone47, 0.0F, 0.7854F, 0.0F); + cube_r18 = new ModelRenderer(this); + cube_r18.setRotationPoint(-3.5F, 68.0241F, -8.5F); + bone47.addChild(cube_r18); + setRotationAngle(cube_r18, 0.7148F, 0.4053F, 0.0127F); + cube_r18.setTextureOffset(45, 66).addBox(-0.5584F, -24.2922F, 2.7582F, 1.0F, 21.0F, 1.0F, 0.0F, false); + cube_r19 = new ModelRenderer(this); + cube_r19.setRotationPoint(-8.7131F, 52.8042F, -21.201F); + bone47.addChild(cube_r19); + setRotationAngle(cube_r19, 0.3622F, 0.4084F, 0.0038F); + cube_r19.setTextureOffset(33, 131).addBox(-0.5577F, -22.6869F, 1.7572F, 1.0F, 18.0F, 1.0F, 0.0F, false); + cube_r20 = new ModelRenderer(this); + cube_r20.setRotationPoint(-11.1221F, 35.9524F, -27.0955F); + bone47.addChild(cube_r20); + setRotationAngle(cube_r20, 0.0F, 0.4084F, 0.0038F); + cube_r20.setTextureOffset(89, 0).addBox(-0.6286F, -24.9941F, -0.0064F, 1.0F, 20.0F, 1.0F, 0.0F, false); + cube_r21 = new ModelRenderer(this); + cube_r21.setRotationPoint(-11.1221F, 15.9524F, -27.0955F); + bone47.addChild(cube_r21); + setRotationAngle(cube_r21, -0.48F, 0.4084F, 0.0038F); + cube_r21.setTextureOffset(94, 0).addBox(-0.6286F, -22.4256F, -2.3143F, 1.0F, 18.0F, 1.0F, 0.0F, false); + cube_r22 = new ModelRenderer(this); + cube_r22.setRotationPoint(-7.7729F, 0.0F, -19.4636F); + bone47.addChild(cube_r22); + setRotationAngle(cube_r22, -1.0997F, 0.3705F, -0.0196F); + cube_r22.setTextureOffset(143, 64).addBox(-0.5062F, -16.2961F, -4.4365F, 1.0F, 14.0F, 1.0F, 0.0F, false); + Balloonstrip12 = new ModelRenderer(this); + Balloonstrip12.setRotationPoint(0.0F, -91.4305F, 0.0F); + setRotationAngle(Balloonstrip12, 0.0F, 0.7854F, 0.0F); + cube_r23 = new ModelRenderer(this); + cube_r23.setRotationPoint(0.0F, -0.5695F, 0.0F); + Balloonstrip12.addChild(cube_r23); + setRotationAngle(cube_r23, 0.0F, 0.7854F, 0.0F); + cube_r23.setTextureOffset(143, 98).addBox(-3.5F, -9.0F, -8.5F, 7.0F, 1.0F, 1.0F, 0.0F, false); + cube_r23.setTextureOffset(80, 129).addBox(-3.5F, 65.0F, -9.0F, 7.0F, 1.0F, 1.0F, 0.0F, false); + cube_r24 = new ModelRenderer(this); + cube_r24.setRotationPoint(0.0F, 32.4305F, 0.0F); + Balloonstrip12.addChild(cube_r24); + setRotationAngle(cube_r24, 0.0F, -0.7854F, 0.0F); + cube_r24.setTextureOffset(53, 65).addBox(-26.75F, -19.0F, -11.0F, 0.0F, 20.0F, 22.0F, 0.0F, false); + bone48 = new ModelRenderer(this); + bone48.setRotationPoint(0.0F, 0.0F, 0.0F); + Balloonstrip12.addChild(bone48); + setRotationAngle(bone48, 0.0F, 0.7854F, 0.0F); + cube_r25 = new ModelRenderer(this); + cube_r25.setRotationPoint(0.0F, 13.4305F, -27.0F); + bone48.addChild(cube_r25); + setRotationAngle(cube_r25, -1.5708F, -1.1345F, 1.5708F); + cube_r25.setTextureOffset(98, 65).addBox(0.25F, -18.0F, -11.0F, 0.0F, 18.0F, 22.0F, 0.0F, false); + cube_r26 = new ModelRenderer(this); + cube_r26.setRotationPoint(0.0F, -2.757F, -19.1661F); + bone48.addChild(cube_r26); + setRotationAngle(cube_r26, -1.5708F, -0.5236F, 1.5708F); + cube_r26.setTextureOffset(0, 131).addBox(-0.0087F, -13.0183F, -8.0F, 0.0F, 13.0F, 16.0F, 0.0F, false); + bone49 = new ModelRenderer(this); + bone49.setRotationPoint(0.0F, 56.2431F, 0.0F); + Balloonstrip12.addChild(bone49); + setRotationAngle(bone49, 0.0F, 0.7854F, 0.0F); + cube_r27 = new ModelRenderer(this); + cube_r27.setRotationPoint(0.0F, -16.8126F, -27.0F); + bone49.addChild(cube_r27); + setRotationAngle(cube_r27, 1.5708F, -1.2217F, -1.5708F); + cube_r27.setTextureOffset(0, 66).addBox(2.3021F, -5.6382F, -11.0F, 0.0F, 18.0F, 22.0F, 0.0F, false); + cube_r28 = new ModelRenderer(this); + cube_r28.setRotationPoint(0.0F, 0.0F, -20.6161F); + bone49.addChild(cube_r28); + setRotationAngle(cube_r28, 1.5708F, -0.8727F, -1.5708F); + cube_r28.setTextureOffset(47, 108).addBox(3.848F, -4.5779F, -8.0F, 0.0F, 19.0F, 16.0F, 0.0F, false); + bone50 = new ModelRenderer(this); + bone50.setRotationPoint(0.0F, 1.9065F, 0.0F); + Balloonstrip12.addChild(bone50); + setRotationAngle(bone50, 0.0F, 0.7854F, 0.0F); + cube_r29 = new ModelRenderer(this); + cube_r29.setRotationPoint(-3.5F, 68.0241F, -8.5F); + bone50.addChild(cube_r29); + setRotationAngle(cube_r29, 0.7148F, 0.4053F, 0.0127F); + cube_r29.setTextureOffset(45, 66).addBox(-0.5584F, -24.2922F, 2.7582F, 1.0F, 21.0F, 1.0F, 0.0F, false); + cube_r30 = new ModelRenderer(this); + cube_r30.setRotationPoint(-8.7131F, 52.8042F, -21.201F); + bone50.addChild(cube_r30); + setRotationAngle(cube_r30, 0.3622F, 0.4084F, 0.0038F); + cube_r30.setTextureOffset(33, 131).addBox(-0.5577F, -22.6869F, 1.7572F, 1.0F, 18.0F, 1.0F, 0.0F, false); + cube_r31 = new ModelRenderer(this); + cube_r31.setRotationPoint(-11.1221F, 35.9524F, -27.0955F); + bone50.addChild(cube_r31); + setRotationAngle(cube_r31, 0.0F, 0.4084F, 0.0038F); + cube_r31.setTextureOffset(89, 0).addBox(-0.6286F, -24.9941F, -0.0064F, 1.0F, 20.0F, 1.0F, 0.0F, false); + cube_r32 = new ModelRenderer(this); + cube_r32.setRotationPoint(-11.1221F, 15.9524F, -27.0955F); + bone50.addChild(cube_r32); + setRotationAngle(cube_r32, -0.48F, 0.4084F, 0.0038F); + cube_r32.setTextureOffset(94, 0).addBox(-0.6286F, -22.4256F, -2.3143F, 1.0F, 18.0F, 1.0F, 0.0F, false); + cube_r33 = new ModelRenderer(this); + cube_r33.setRotationPoint(-7.7729F, 0.0F, -19.4636F); + bone50.addChild(cube_r33); + setRotationAngle(cube_r33, -1.0997F, 0.3705F, -0.0196F); + cube_r33.setTextureOffset(143, 64).addBox(-0.5062F, -16.2961F, -4.4365F, 1.0F, 14.0F, 1.0F, 0.0F, false); + Balloonstrip10 = new ModelRenderer(this); + Balloonstrip10.setRotationPoint(0.0F, -91.4305F, 0.0F); + setRotationAngle(Balloonstrip10, 0.0F, -2.3562F, 0.0F); + cube_r34 = new ModelRenderer(this); + cube_r34.setRotationPoint(0.0F, -0.5695F, 0.0F); + Balloonstrip10.addChild(cube_r34); + setRotationAngle(cube_r34, 0.0F, 0.7854F, 0.0F); + cube_r34.setTextureOffset(143, 98).addBox(-3.5F, -9.0F, -8.5F, 7.0F, 1.0F, 1.0F, 0.0F, false); + cube_r34.setTextureOffset(80, 129).addBox(-3.5F, 65.0F, -9.0F, 7.0F, 1.0F, 1.0F, 0.0F, false); + cube_r35 = new ModelRenderer(this); + cube_r35.setRotationPoint(0.0F, 32.4305F, 0.0F); + Balloonstrip10.addChild(cube_r35); + setRotationAngle(cube_r35, 0.0F, -0.7854F, 0.0F); + cube_r35.setTextureOffset(53, 65).addBox(-26.75F, -19.0F, -11.0F, 0.0F, 20.0F, 22.0F, 0.0F, false); + bone42 = new ModelRenderer(this); + bone42.setRotationPoint(0.0F, 0.0F, 0.0F); + Balloonstrip10.addChild(bone42); + setRotationAngle(bone42, 0.0F, 0.7854F, 0.0F); + cube_r36 = new ModelRenderer(this); + cube_r36.setRotationPoint(0.0F, 13.4305F, -27.0F); + bone42.addChild(cube_r36); + setRotationAngle(cube_r36, -1.5708F, -1.1345F, 1.5708F); + cube_r36.setTextureOffset(98, 65).addBox(0.25F, -18.0F, -11.0F, 0.0F, 18.0F, 22.0F, 0.0F, false); + cube_r37 = new ModelRenderer(this); + cube_r37.setRotationPoint(0.0F, -2.757F, -19.1661F); + bone42.addChild(cube_r37); + setRotationAngle(cube_r37, -1.5708F, -0.5236F, 1.5708F); + cube_r37.setTextureOffset(0, 131).addBox(-0.0087F, -13.0183F, -8.0F, 0.0F, 13.0F, 16.0F, 0.0F, false); + bone43 = new ModelRenderer(this); + bone43.setRotationPoint(0.0F, 56.2431F, 0.0F); + Balloonstrip10.addChild(bone43); + setRotationAngle(bone43, 0.0F, 0.7854F, 0.0F); + cube_r38 = new ModelRenderer(this); + cube_r38.setRotationPoint(0.0F, -16.8126F, -27.0F); + bone43.addChild(cube_r38); + setRotationAngle(cube_r38, 1.5708F, -1.2217F, -1.5708F); + cube_r38.setTextureOffset(0, 66).addBox(2.3021F, -5.6382F, -11.0F, 0.0F, 18.0F, 22.0F, 0.0F, false); + cube_r39 = new ModelRenderer(this); + cube_r39.setRotationPoint(0.0F, 0.0F, -20.6161F); + bone43.addChild(cube_r39); + setRotationAngle(cube_r39, 1.5708F, -0.8727F, -1.5708F); + cube_r39.setTextureOffset(47, 108).addBox(3.848F, -4.5779F, -8.0F, 0.0F, 19.0F, 16.0F, 0.0F, false); + bone44 = new ModelRenderer(this); + bone44.setRotationPoint(0.0F, 1.9065F, 0.0F); + Balloonstrip10.addChild(bone44); + setRotationAngle(bone44, 0.0F, 0.7854F, 0.0F); + cube_r40 = new ModelRenderer(this); + cube_r40.setRotationPoint(-3.5F, 68.0241F, -8.5F); + bone44.addChild(cube_r40); + setRotationAngle(cube_r40, 0.7148F, 0.4053F, 0.0127F); + cube_r40.setTextureOffset(45, 66).addBox(-0.5584F, -24.2922F, 2.7582F, 1.0F, 21.0F, 1.0F, 0.0F, false); + cube_r41 = new ModelRenderer(this); + cube_r41.setRotationPoint(-8.7131F, 52.8042F, -21.201F); + bone44.addChild(cube_r41); + setRotationAngle(cube_r41, 0.3622F, 0.4084F, 0.0038F); + cube_r41.setTextureOffset(33, 131).addBox(-0.5577F, -22.6869F, 1.7572F, 1.0F, 18.0F, 1.0F, 0.0F, false); + cube_r42 = new ModelRenderer(this); + cube_r42.setRotationPoint(-11.1221F, 35.9524F, -27.0955F); + bone44.addChild(cube_r42); + setRotationAngle(cube_r42, 0.0F, 0.4084F, 0.0038F); + cube_r42.setTextureOffset(89, 0).addBox(-0.6286F, -24.9941F, -0.0064F, 1.0F, 20.0F, 1.0F, 0.0F, false); + cube_r43 = new ModelRenderer(this); + cube_r43.setRotationPoint(-11.1221F, 15.9524F, -27.0955F); + bone44.addChild(cube_r43); + setRotationAngle(cube_r43, -0.48F, 0.4084F, 0.0038F); + cube_r43.setTextureOffset(94, 0).addBox(-0.6286F, -22.4256F, -2.3143F, 1.0F, 18.0F, 1.0F, 0.0F, false); + cube_r44 = new ModelRenderer(this); + cube_r44.setRotationPoint(-7.7729F, 0.0F, -19.4636F); + bone44.addChild(cube_r44); + setRotationAngle(cube_r44, -1.0997F, 0.3705F, -0.0196F); + cube_r44.setTextureOffset(143, 64).addBox(-0.5062F, -16.2961F, -4.4365F, 1.0F, 14.0F, 1.0F, 0.0F, false); + Balloonstrip2 = new ModelRenderer(this); + Balloonstrip2.setRotationPoint(0.0F, -91.4305F, 0.0F); + setRotationAngle(Balloonstrip2, 0.0F, -0.7854F, 0.0F); + cube_r45 = new ModelRenderer(this); + cube_r45.setRotationPoint(0.0F, -0.5695F, 0.0F); + Balloonstrip2.addChild(cube_r45); + setRotationAngle(cube_r45, 0.0F, 0.7854F, 0.0F); + cube_r45.setTextureOffset(143, 98).addBox(-3.5F, -9.0F, -8.5F, 7.0F, 1.0F, 1.0F, 0.0F, false); + cube_r45.setTextureOffset(80, 129).addBox(-3.5F, 65.0F, -9.0F, 7.0F, 1.0F, 1.0F, 0.0F, false); + cube_r46 = new ModelRenderer(this); + cube_r46.setRotationPoint(0.0F, 32.4305F, 0.0F); + Balloonstrip2.addChild(cube_r46); + setRotationAngle(cube_r46, 0.0F, -0.7854F, 0.0F); + cube_r46.setTextureOffset(53, 65).addBox(-26.75F, -19.0F, -11.0F, 0.0F, 20.0F, 22.0F, 0.0F, false); + bone2 = new ModelRenderer(this); + bone2.setRotationPoint(0.0F, 0.0F, 0.0F); + Balloonstrip2.addChild(bone2); + setRotationAngle(bone2, 0.0F, 0.7854F, 0.0F); + cube_r47 = new ModelRenderer(this); + cube_r47.setRotationPoint(0.0F, 13.4305F, -27.0F); + bone2.addChild(cube_r47); + setRotationAngle(cube_r47, -1.5708F, -1.1345F, 1.5708F); + cube_r47.setTextureOffset(98, 65).addBox(0.25F, -18.0F, -11.0F, 0.0F, 18.0F, 22.0F, 0.0F, false); + cube_r48 = new ModelRenderer(this); + cube_r48.setRotationPoint(0.0F, -2.757F, -19.1661F); + bone2.addChild(cube_r48); + setRotationAngle(cube_r48, -1.5708F, -0.5236F, 1.5708F); + cube_r48.setTextureOffset(0, 131).addBox(-0.0087F, -13.0183F, -8.0F, 0.0F, 13.0F, 16.0F, 0.0F, false); + bone27 = new ModelRenderer(this); + bone27.setRotationPoint(0.0F, 56.2431F, 0.0F); + Balloonstrip2.addChild(bone27); + setRotationAngle(bone27, 0.0F, 0.7854F, 0.0F); + cube_r49 = new ModelRenderer(this); + cube_r49.setRotationPoint(0.0F, -16.8126F, -27.0F); + bone27.addChild(cube_r49); + setRotationAngle(cube_r49, 1.5708F, -1.2217F, -1.5708F); + cube_r49.setTextureOffset(0, 66).addBox(2.3021F, -5.6382F, -11.0F, 0.0F, 18.0F, 22.0F, 0.0F, false); + cube_r50 = new ModelRenderer(this); + cube_r50.setRotationPoint(0.0F, 0.0F, -20.6161F); + bone27.addChild(cube_r50); + setRotationAngle(cube_r50, 1.5708F, -0.8727F, -1.5708F); + cube_r50.setTextureOffset(47, 108).addBox(3.848F, -4.5779F, -8.0F, 0.0F, 19.0F, 16.0F, 0.0F, false); + bone28 = new ModelRenderer(this); + bone28.setRotationPoint(0.0F, 1.9065F, 0.0F); + Balloonstrip2.addChild(bone28); + setRotationAngle(bone28, 0.0F, 0.7854F, 0.0F); + cube_r51 = new ModelRenderer(this); + cube_r51.setRotationPoint(-3.5F, 68.0241F, -8.5F); + bone28.addChild(cube_r51); + setRotationAngle(cube_r51, 0.7148F, 0.4053F, 0.0127F); + cube_r51.setTextureOffset(45, 66).addBox(-0.5584F, -24.2922F, 2.7582F, 1.0F, 21.0F, 1.0F, 0.0F, false); + cube_r52 = new ModelRenderer(this); + cube_r52.setRotationPoint(-8.7131F, 52.8042F, -21.201F); + bone28.addChild(cube_r52); + setRotationAngle(cube_r52, 0.3622F, 0.4084F, 0.0038F); + cube_r52.setTextureOffset(33, 131).addBox(-0.5577F, -22.6869F, 1.7572F, 1.0F, 18.0F, 1.0F, 0.0F, false); + cube_r53 = new ModelRenderer(this); + cube_r53.setRotationPoint(-11.1221F, 35.9524F, -27.0955F); + bone28.addChild(cube_r53); + setRotationAngle(cube_r53, 0.0F, 0.4084F, 0.0038F); + cube_r53.setTextureOffset(89, 0).addBox(-0.6286F, -24.9941F, -0.0064F, 1.0F, 20.0F, 1.0F, 0.0F, false); + cube_r54 = new ModelRenderer(this); + cube_r54.setRotationPoint(-11.1221F, 15.9524F, -27.0955F); + bone28.addChild(cube_r54); + setRotationAngle(cube_r54, -0.48F, 0.4084F, 0.0038F); + cube_r54.setTextureOffset(94, 0).addBox(-0.6286F, -22.4256F, -2.3143F, 1.0F, 18.0F, 1.0F, 0.0F, false); + cube_r55 = new ModelRenderer(this); + cube_r55.setRotationPoint(-7.7729F, 0.0F, -19.4636F); + bone28.addChild(cube_r55); + setRotationAngle(cube_r55, -1.0997F, 0.3705F, -0.0196F); + cube_r55.setTextureOffset(143, 64).addBox(-0.5062F, -16.2961F, -4.4365F, 1.0F, 14.0F, 1.0F, 0.0F, false); + Balloonstrip9 = new ModelRenderer(this); + Balloonstrip9.setRotationPoint(0.0F, -91.4305F, 0.0F); + setRotationAngle(Balloonstrip9, 0.0F, 3.1416F, 0.0F); + cube_r56 = new ModelRenderer(this); + cube_r56.setRotationPoint(0.0F, -0.5695F, 0.0F); + Balloonstrip9.addChild(cube_r56); + setRotationAngle(cube_r56, 0.0F, 0.7854F, 0.0F); + cube_r56.setTextureOffset(143, 98).addBox(-3.5F, -9.0F, -8.5F, 7.0F, 1.0F, 1.0F, 0.0F, false); + cube_r56.setTextureOffset(80, 129).addBox(-3.5F, 65.0F, -9.0F, 7.0F, 1.0F, 1.0F, 0.0F, false); + cube_r57 = new ModelRenderer(this); + cube_r57.setRotationPoint(0.0F, 32.4305F, 0.0F); + Balloonstrip9.addChild(cube_r57); + setRotationAngle(cube_r57, 0.0F, -0.7854F, 0.0F); + cube_r57.setTextureOffset(53, 65).addBox(-26.75F, -19.0F, -11.0F, 0.0F, 20.0F, 22.0F, 0.0F, false); + bone39 = new ModelRenderer(this); + bone39.setRotationPoint(0.0F, 0.0F, 0.0F); + Balloonstrip9.addChild(bone39); + setRotationAngle(bone39, 0.0F, 0.7854F, 0.0F); + cube_r58 = new ModelRenderer(this); + cube_r58.setRotationPoint(0.0F, 13.4305F, -27.0F); + bone39.addChild(cube_r58); + setRotationAngle(cube_r58, -1.5708F, -1.1345F, 1.5708F); + cube_r58.setTextureOffset(98, 65).addBox(0.25F, -18.0F, -11.0F, 0.0F, 18.0F, 22.0F, 0.0F, false); + cube_r59 = new ModelRenderer(this); + cube_r59.setRotationPoint(0.0F, -2.757F, -19.1661F); + bone39.addChild(cube_r59); + setRotationAngle(cube_r59, -1.5708F, -0.5236F, 1.5708F); + cube_r59.setTextureOffset(0, 131).addBox(-0.0087F, -13.0183F, -8.0F, 0.0F, 13.0F, 16.0F, 0.0F, false); + bone40 = new ModelRenderer(this); + bone40.setRotationPoint(0.0F, 56.2431F, 0.0F); + Balloonstrip9.addChild(bone40); + setRotationAngle(bone40, 0.0F, 0.7854F, 0.0F); + cube_r60 = new ModelRenderer(this); + cube_r60.setRotationPoint(0.0F, -16.8126F, -27.0F); + bone40.addChild(cube_r60); + setRotationAngle(cube_r60, 1.5708F, -1.2217F, -1.5708F); + cube_r60.setTextureOffset(0, 66).addBox(2.3021F, -5.6382F, -11.0F, 0.0F, 18.0F, 22.0F, 0.0F, false); + cube_r61 = new ModelRenderer(this); + cube_r61.setRotationPoint(0.0F, 0.0F, -20.6161F); + bone40.addChild(cube_r61); + setRotationAngle(cube_r61, 1.5708F, -0.8727F, -1.5708F); + cube_r61.setTextureOffset(47, 108).addBox(3.848F, -4.5779F, -8.0F, 0.0F, 19.0F, 16.0F, 0.0F, false); + bone41 = new ModelRenderer(this); + bone41.setRotationPoint(0.0F, 1.9065F, 0.0F); + Balloonstrip9.addChild(bone41); + setRotationAngle(bone41, 0.0F, 0.7854F, 0.0F); + cube_r62 = new ModelRenderer(this); + cube_r62.setRotationPoint(-3.5F, 68.0241F, -8.5F); + bone41.addChild(cube_r62); + setRotationAngle(cube_r62, 0.7148F, 0.4053F, 0.0127F); + cube_r62.setTextureOffset(45, 66).addBox(-0.5584F, -24.2922F, 2.7582F, 1.0F, 21.0F, 1.0F, 0.0F, false); + cube_r63 = new ModelRenderer(this); + cube_r63.setRotationPoint(-8.7131F, 52.8042F, -21.201F); + bone41.addChild(cube_r63); + setRotationAngle(cube_r63, 0.3622F, 0.4084F, 0.0038F); + cube_r63.setTextureOffset(33, 131).addBox(-0.5577F, -22.6869F, 1.7572F, 1.0F, 18.0F, 1.0F, 0.0F, false); + cube_r64 = new ModelRenderer(this); + cube_r64.setRotationPoint(-11.1221F, 35.9524F, -27.0955F); + bone41.addChild(cube_r64); + setRotationAngle(cube_r64, 0.0F, 0.4084F, 0.0038F); + cube_r64.setTextureOffset(89, 0).addBox(-0.6286F, -24.9941F, -0.0064F, 1.0F, 20.0F, 1.0F, 0.0F, false); + cube_r65 = new ModelRenderer(this); + cube_r65.setRotationPoint(-11.1221F, 15.9524F, -27.0955F); + bone41.addChild(cube_r65); + setRotationAngle(cube_r65, -0.48F, 0.4084F, 0.0038F); + cube_r65.setTextureOffset(94, 0).addBox(-0.6286F, -22.4256F, -2.3143F, 1.0F, 18.0F, 1.0F, 0.0F, false); + cube_r66 = new ModelRenderer(this); + cube_r66.setRotationPoint(-7.7729F, 0.0F, -19.4636F); + bone41.addChild(cube_r66); + setRotationAngle(cube_r66, -1.0997F, 0.3705F, -0.0196F); + cube_r66.setTextureOffset(143, 64).addBox(-0.5062F, -16.2961F, -4.4365F, 1.0F, 14.0F, 1.0F, 0.0F, false); + Balloonstrip7 = new ModelRenderer(this); + Balloonstrip7.setRotationPoint(0.0F, -91.4305F, 0.0F); + setRotationAngle(Balloonstrip7, 0.0F, -1.5708F, 0.0F); + cube_r67 = new ModelRenderer(this); + cube_r67.setRotationPoint(0.0F, -0.5695F, 0.0F); + Balloonstrip7.addChild(cube_r67); + setRotationAngle(cube_r67, 0.0F, 0.7854F, 0.0F); + cube_r67.setTextureOffset(143, 98).addBox(-3.5F, -9.0F, -8.5F, 7.0F, 1.0F, 1.0F, 0.0F, false); + cube_r67.setTextureOffset(80, 129).addBox(-3.5F, 65.0F, -9.0F, 7.0F, 1.0F, 1.0F, 0.0F, false); + cube_r68 = new ModelRenderer(this); + cube_r68.setRotationPoint(0.0F, 32.4305F, 0.0F); + Balloonstrip7.addChild(cube_r68); + setRotationAngle(cube_r68, 0.0F, -0.7854F, 0.0F); + cube_r68.setTextureOffset(53, 65).addBox(-26.75F, -19.0F, -11.0F, 0.0F, 20.0F, 22.0F, 0.0F, false); + bone30 = new ModelRenderer(this); + bone30.setRotationPoint(0.0F, 0.0F, 0.0F); + Balloonstrip7.addChild(bone30); + setRotationAngle(bone30, 0.0F, 0.7854F, 0.0F); + cube_r69 = new ModelRenderer(this); + cube_r69.setRotationPoint(0.0F, 13.4305F, -27.0F); + bone30.addChild(cube_r69); + setRotationAngle(cube_r69, -1.5708F, -1.1345F, 1.5708F); + cube_r69.setTextureOffset(98, 65).addBox(0.25F, -18.0F, -11.0F, 0.0F, 18.0F, 22.0F, 0.0F, false); + cube_r70 = new ModelRenderer(this); + cube_r70.setRotationPoint(0.0F, -2.757F, -19.1661F); + bone30.addChild(cube_r70); + setRotationAngle(cube_r70, -1.5708F, -0.5236F, 1.5708F); + cube_r70.setTextureOffset(0, 131).addBox(-0.0087F, -13.0183F, -8.0F, 0.0F, 13.0F, 16.0F, 0.0F, false); + bone31 = new ModelRenderer(this); + bone31.setRotationPoint(0.0F, 56.2431F, 0.0F); + Balloonstrip7.addChild(bone31); + setRotationAngle(bone31, 0.0F, 0.7854F, 0.0F); + cube_r71 = new ModelRenderer(this); + cube_r71.setRotationPoint(0.0F, -16.8126F, -27.0F); + bone31.addChild(cube_r71); + setRotationAngle(cube_r71, 1.5708F, -1.2217F, -1.5708F); + cube_r71.setTextureOffset(0, 66).addBox(2.3021F, -5.6382F, -11.0F, 0.0F, 18.0F, 22.0F, 0.0F, false); + cube_r72 = new ModelRenderer(this); + cube_r72.setRotationPoint(0.0F, 0.0F, -20.6161F); + bone31.addChild(cube_r72); + setRotationAngle(cube_r72, 1.5708F, -0.8727F, -1.5708F); + cube_r72.setTextureOffset(47, 108).addBox(3.848F, -4.5779F, -8.0F, 0.0F, 19.0F, 16.0F, 0.0F, false); + bone35 = new ModelRenderer(this); + bone35.setRotationPoint(0.0F, 1.9065F, 0.0F); + Balloonstrip7.addChild(bone35); + setRotationAngle(bone35, 0.0F, 0.7854F, 0.0F); + cube_r73 = new ModelRenderer(this); + cube_r73.setRotationPoint(-3.5F, 68.0241F, -8.5F); + bone35.addChild(cube_r73); + setRotationAngle(cube_r73, 0.7148F, 0.4053F, 0.0127F); + cube_r73.setTextureOffset(45, 66).addBox(-0.5584F, -24.2922F, 2.7582F, 1.0F, 21.0F, 1.0F, 0.0F, false); + cube_r74 = new ModelRenderer(this); + cube_r74.setRotationPoint(-8.7131F, 52.8042F, -21.201F); + bone35.addChild(cube_r74); + setRotationAngle(cube_r74, 0.3622F, 0.4084F, 0.0038F); + cube_r74.setTextureOffset(33, 131).addBox(-0.5577F, -22.6869F, 1.7572F, 1.0F, 18.0F, 1.0F, 0.0F, false); + cube_r75 = new ModelRenderer(this); + cube_r75.setRotationPoint(-11.1221F, 35.9524F, -27.0955F); + bone35.addChild(cube_r75); + setRotationAngle(cube_r75, 0.0F, 0.4084F, 0.0038F); + cube_r75.setTextureOffset(89, 0).addBox(-0.6286F, -24.9941F, -0.0064F, 1.0F, 20.0F, 1.0F, 0.0F, false); + cube_r76 = new ModelRenderer(this); + cube_r76.setRotationPoint(-11.1221F, 15.9524F, -27.0955F); + bone35.addChild(cube_r76); + setRotationAngle(cube_r76, -0.48F, 0.4084F, 0.0038F); + cube_r76.setTextureOffset(94, 0).addBox(-0.6286F, -22.4256F, -2.3143F, 1.0F, 18.0F, 1.0F, 0.0F, false); + cube_r77 = new ModelRenderer(this); + cube_r77.setRotationPoint(-7.7729F, 0.0F, -19.4636F); + bone35.addChild(cube_r77); + setRotationAngle(cube_r77, -1.0997F, 0.3705F, -0.0196F); + cube_r77.setTextureOffset(143, 64).addBox(-0.5062F, -16.2961F, -4.4365F, 1.0F, 14.0F, 1.0F, 0.0F, false); + Balloonstrip8 = new ModelRenderer(this); + Balloonstrip8.setRotationPoint(0.0F, -91.4305F, 0.0F); + setRotationAngle(Balloonstrip8, 0.0F, 2.3562F, 0.0F); + cube_r78 = new ModelRenderer(this); + cube_r78.setRotationPoint(0.0F, -0.5695F, 0.0F); + Balloonstrip8.addChild(cube_r78); + setRotationAngle(cube_r78, 0.0F, 0.7854F, 0.0F); + cube_r78.setTextureOffset(143, 98).addBox(-3.5F, -9.0F, -8.5F, 7.0F, 1.0F, 1.0F, 0.0F, false); + cube_r78.setTextureOffset(80, 129).addBox(-3.5F, 65.0F, -9.0F, 7.0F, 1.0F, 1.0F, 0.0F, false); + cube_r79 = new ModelRenderer(this); + cube_r79.setRotationPoint(0.0F, 32.4305F, 0.0F); + Balloonstrip8.addChild(cube_r79); + setRotationAngle(cube_r79, 0.0F, -0.7854F, 0.0F); + cube_r79.setTextureOffset(53, 65).addBox(-26.75F, -19.0F, -11.0F, 0.0F, 20.0F, 22.0F, 0.0F, false); + bone36 = new ModelRenderer(this); + bone36.setRotationPoint(0.0F, 0.0F, 0.0F); + Balloonstrip8.addChild(bone36); + setRotationAngle(bone36, 0.0F, 0.7854F, 0.0F); + cube_r80 = new ModelRenderer(this); + cube_r80.setRotationPoint(0.0F, 13.4305F, -27.0F); + bone36.addChild(cube_r80); + setRotationAngle(cube_r80, -1.5708F, -1.1345F, 1.5708F); + cube_r80.setTextureOffset(98, 65).addBox(0.25F, -18.0F, -11.0F, 0.0F, 18.0F, 22.0F, 0.0F, false); + cube_r81 = new ModelRenderer(this); + cube_r81.setRotationPoint(0.0F, -2.757F, -19.1661F); + bone36.addChild(cube_r81); + setRotationAngle(cube_r81, -1.5708F, -0.5236F, 1.5708F); + cube_r81.setTextureOffset(0, 131).addBox(-0.0087F, -13.0183F, -8.0F, 0.0F, 13.0F, 16.0F, 0.0F, false); + bone37 = new ModelRenderer(this); + bone37.setRotationPoint(0.0F, 56.2431F, 0.0F); + Balloonstrip8.addChild(bone37); + setRotationAngle(bone37, 0.0F, 0.7854F, 0.0F); + cube_r82 = new ModelRenderer(this); + cube_r82.setRotationPoint(0.0F, -16.8126F, -27.0F); + bone37.addChild(cube_r82); + setRotationAngle(cube_r82, 1.5708F, -1.2217F, -1.5708F); + cube_r82.setTextureOffset(0, 66).addBox(2.3021F, -5.6382F, -11.0F, 0.0F, 18.0F, 22.0F, 0.0F, false); + cube_r83 = new ModelRenderer(this); + cube_r83.setRotationPoint(0.0F, 0.0F, -20.6161F); + bone37.addChild(cube_r83); + setRotationAngle(cube_r83, 1.5708F, -0.8727F, -1.5708F); + cube_r83.setTextureOffset(47, 108).addBox(3.848F, -4.5779F, -8.0F, 0.0F, 19.0F, 16.0F, 0.0F, false); + bone38 = new ModelRenderer(this); + bone38.setRotationPoint(0.0F, 1.9065F, 0.0F); + Balloonstrip8.addChild(bone38); + setRotationAngle(bone38, 0.0F, 0.7854F, 0.0F); + cube_r84 = new ModelRenderer(this); + cube_r84.setRotationPoint(-3.5F, 68.0241F, -8.5F); + bone38.addChild(cube_r84); + setRotationAngle(cube_r84, 0.7148F, 0.4053F, 0.0127F); + cube_r84.setTextureOffset(45, 66).addBox(-0.5584F, -24.2922F, 2.7582F, 1.0F, 21.0F, 1.0F, 0.0F, false); + cube_r85 = new ModelRenderer(this); + cube_r85.setRotationPoint(-8.7131F, 52.8042F, -21.201F); + bone38.addChild(cube_r85); + setRotationAngle(cube_r85, 0.3622F, 0.4084F, 0.0038F); + cube_r85.setTextureOffset(33, 131).addBox(-0.5577F, -22.6869F, 1.7572F, 1.0F, 18.0F, 1.0F, 0.0F, false); + cube_r86 = new ModelRenderer(this); + cube_r86.setRotationPoint(-11.1221F, 35.9524F, -27.0955F); + bone38.addChild(cube_r86); + setRotationAngle(cube_r86, 0.0F, 0.4084F, 0.0038F); + cube_r86.setTextureOffset(89, 0).addBox(-0.6286F, -24.9941F, -0.0064F, 1.0F, 20.0F, 1.0F, 0.0F, false); + cube_r87 = new ModelRenderer(this); + cube_r87.setRotationPoint(-11.1221F, 15.9524F, -27.0955F); + bone38.addChild(cube_r87); + setRotationAngle(cube_r87, -0.48F, 0.4084F, 0.0038F); + cube_r87.setTextureOffset(94, 0).addBox(-0.6286F, -22.4256F, -2.3143F, 1.0F, 18.0F, 1.0F, 0.0F, false); + cube_r88 = new ModelRenderer(this); + cube_r88.setRotationPoint(-7.7729F, 0.0F, -19.4636F); + bone38.addChild(cube_r88); + setRotationAngle(cube_r88, -1.0997F, 0.3705F, -0.0196F); + cube_r88.setTextureOffset(143, 64).addBox(-0.5062F, -16.2961F, -4.4365F, 1.0F, 14.0F, 1.0F, 0.0F, false); + Engine = new ModelRenderer(this); + Engine.setRotationPoint(0.0F, -6.0F, 0.0F); + Engine.setTextureOffset(38, 131).addBox(-2.0F, -3.0F, -2.0F, 0.0F, 8.0F, 4.0F, 0.0F, false); + Engine.setTextureOffset(80, 108).addBox(-2.0F, -16.75F, -2.0F, 4.0F, 4.0F, 4.0F, 0.0F, false); + Engine.setTextureOffset(80, 133).addBox(-3.0F, -13.0F, -3.0F, 6.0F, 10.0F, 6.0F, 0.0F, false); + bone34 = new ModelRenderer(this); + bone34.setRotationPoint(0.0667F, 17.5F, 0.0F); + setRotationAngle(bone34, 0.0F, 1.5708F, 0.0F); + cube_r89 = new ModelRenderer(this); + cube_r89.setRotationPoint(0.3333F, 5.5F, 0.0F); + bone34.addChild(cube_r89); + setRotationAngle(cube_r89, 0.0F, 1.5708F, 0.0F); + cube_r89.setTextureOffset(0, 24).addBox(13.0F, -15.0F, -13.0F, 0.0F, 15.0F, 26.0F, 0.0F, false); + bone32 = new ModelRenderer(this); + bone32.setRotationPoint(-3.1667F, 0.5F, -15.5F); + bone34.addChild(bone32); + setRotationAngle(bone32, -0.4305F, 0.0735F, 0.1585F); + cube_r90 = new ModelRenderer(this); + cube_r90.setRotationPoint(0.0F, -6.0F, 0.0F); + bone32.addChild(cube_r90); + setRotationAngle(cube_r90, 0.0F, 1.5708F, 0.0F); + cube_r90.setTextureOffset(143, 101).addBox(-1.5F, 2.0F, -1.5F, 3.0F, 1.0F, 3.0F, 0.0F, false); + cube_r90.setTextureOffset(105, 133).addBox(-2.5F, 3.0F, -2.5F, 5.0F, 5.0F, 5.0F, 0.0F, false); + cube_r91 = new ModelRenderer(this); + cube_r91.setRotationPoint(-0.5F, -7.0F, -0.5F); + bone32.addChild(cube_r91); + setRotationAngle(cube_r91, 0.0F, 1.5708F, 0.0F); + cube_r91.setTextureOffset(80, 117).addBox(-2.5F, 2.0F, -1.5F, 4.0F, 1.0F, 4.0F, 0.0F, false); + bone33 = new ModelRenderer(this); + bone33.setRotationPoint(2.8333F, 1.5F, -15.5F); + bone34.addChild(bone33); + setRotationAngle(bone33, -0.4185F, -0.1274F, -0.2783F); + cube_r92 = new ModelRenderer(this); + cube_r92.setRotationPoint(0.0F, -6.0F, 0.0F); + bone33.addChild(cube_r92); + setRotationAngle(cube_r92, 0.0F, 1.5708F, 0.0F); + cube_r92.setTextureOffset(43, 144).addBox(-1.5F, 2.0F, -1.5F, 3.0F, 1.0F, 3.0F, 0.0F, false); + cube_r92.setTextureOffset(126, 133).addBox(-2.5F, 3.0F, -2.5F, 5.0F, 5.0F, 5.0F, 0.0F, false); + cube_r93 = new ModelRenderer(this); + cube_r93.setRotationPoint(-0.5F, -7.0F, -0.5F); + bone33.addChild(cube_r93); + setRotationAngle(cube_r93, 0.0F, 1.5708F, 0.0F); + cube_r93.setTextureOffset(80, 123).addBox(-2.5F, 2.0F, -1.5F, 4.0F, 1.0F, 4.0F, 0.0F, false); + bone60 = new ModelRenderer(this); + bone60.setRotationPoint(-0.0667F, 17.5F, 0.0F); + setRotationAngle(bone60, 0.0F, -1.5708F, 0.0F); + cube_r94 = new ModelRenderer(this); + cube_r94.setRotationPoint(-0.3333F, 5.5F, 0.0F); + bone60.addChild(cube_r94); + setRotationAngle(cube_r94, 0.0F, -1.5708F, 0.0F); + cube_r94.setTextureOffset(0, 24).addBox(-13.0F, -15.0F, -13.0F, 0.0F, 15.0F, 26.0F, 0.0F, true); + bone61 = new ModelRenderer(this); + bone61.setRotationPoint(3.1667F, 0.5F, -15.5F); + bone60.addChild(bone61); + setRotationAngle(bone61, -0.4305F, -0.0735F, -0.1585F); + cube_r95 = new ModelRenderer(this); + cube_r95.setRotationPoint(0.0F, -6.0F, 0.0F); + bone61.addChild(cube_r95); + setRotationAngle(cube_r95, 0.0F, -1.5708F, 0.0F); + cube_r95.setTextureOffset(143, 101).addBox(-1.5F, 2.0F, -1.5F, 3.0F, 1.0F, 3.0F, 0.0F, true); + cube_r95.setTextureOffset(105, 133).addBox(-2.5F, 3.0F, -2.5F, 5.0F, 5.0F, 5.0F, 0.0F, true); + cube_r96 = new ModelRenderer(this); + cube_r96.setRotationPoint(0.5F, -7.0F, -0.5F); + bone61.addChild(cube_r96); + setRotationAngle(cube_r96, 0.0F, -1.5708F, 0.0F); + cube_r96.setTextureOffset(80, 117).addBox(-1.5F, 2.0F, -1.5F, 4.0F, 1.0F, 4.0F, 0.0F, true); + bone62 = new ModelRenderer(this); + bone62.setRotationPoint(-2.8333F, 1.5F, -15.5F); + bone60.addChild(bone62); + setRotationAngle(bone62, -0.4185F, 0.1274F, 0.2783F); + cube_r97 = new ModelRenderer(this); + cube_r97.setRotationPoint(0.0F, -6.0F, 0.0F); + bone62.addChild(cube_r97); + setRotationAngle(cube_r97, 0.0F, -1.5708F, 0.0F); + cube_r97.setTextureOffset(43, 144).addBox(-1.5F, 2.0F, -1.5F, 3.0F, 1.0F, 3.0F, 0.0F, true); + cube_r97.setTextureOffset(126, 133).addBox(-2.5F, 3.0F, -2.5F, 5.0F, 5.0F, 5.0F, 0.0F, true); + cube_r98 = new ModelRenderer(this); + cube_r98.setRotationPoint(0.5F, -7.0F, -0.5F); + bone62.addChild(cube_r98); + setRotationAngle(cube_r98, 0.0F, -1.5708F, 0.0F); + cube_r98.setTextureOffset(80, 123).addBox(-1.5F, 2.0F, -1.5F, 4.0F, 1.0F, 4.0F, 0.0F, true); + bone = new ModelRenderer(this); + bone.setRotationPoint(0.0F, -17.0F, 0.0F); + bone.setTextureOffset(53, 24).addBox(-12.0F, 24.0F, -11.0F, 1.0F, 17.0F, 23.0F, 0.0F, false); + cube_r99 = new ModelRenderer(this); + cube_r99.setRotationPoint(-22.0F, 33.0F, -23.0F); + bone.addChild(cube_r99); + setRotationAngle(cube_r99, 0.0F, -1.5708F, 0.0F); + cube_r99.setTextureOffset(45, 89).addBox(11.0F, -30.0F, -11.0F, 1.0F, 15.0F, 1.0F, 0.0F, false); + cube_r100 = new ModelRenderer(this); + cube_r100.setRotationPoint(-22.5F, 19.0F, -22.5F); + bone.addChild(cube_r100); + setRotationAngle(cube_r100, 0.0F, -1.5708F, 0.0F); + cube_r100.setTextureOffset(65, 144).addBox(10.0F, -19.0F, -12.0F, 2.0F, 4.0F, 2.0F, 0.0F, false); + cube_r100.setTextureOffset(56, 144).addBox(10.0F, -1.0F, -12.0F, 2.0F, 4.0F, 2.0F, 0.0F, false); + cube_r101 = new ModelRenderer(this); + cube_r101.setRotationPoint(0.0F, 40.0F, 0.0F); + bone.addChild(cube_r101); + setRotationAngle(cube_r101, 0.0F, 3.1416F, 0.0F); + cube_r101.setTextureOffset(98, 106).addBox(10.0F, -18.0F, -13.0F, 3.0F, 3.0F, 23.0F, 0.0F, false); + bone29 = new ModelRenderer(this); + bone29.setRotationPoint(0.0F, 0.0F, 0.0F); + bone.addChild(bone29); + setRotationAngle(bone29, 0.0F, -1.5708F, 0.0F); + cube_r102 = new ModelRenderer(this); + cube_r102.setRotationPoint(-11.5F, 0.0F, 11.5F); + bone29.addChild(cube_r102); + setRotationAngle(cube_r102, 1.0021F, -0.7255F, -0.4941F); + cube_r102.setTextureOffset(38, 144).addBox(-0.5F, -13.0F, -0.5F, 1.0F, 13.0F, 1.0F, 0.0F, false); + cube_r103 = new ModelRenderer(this); + cube_r103.setRotationPoint(-11.5F, 0.0F, 11.5F); + bone29.addChild(cube_r103); + setRotationAngle(cube_r103, 0.2707F, -0.5082F, 0.5615F); + cube_r103.setTextureOffset(143, 80).addBox(-0.5F, -13.0F, -0.5F, 1.0F, 13.0F, 1.0F, 0.0F, false); + bone25 = new ModelRenderer(this); + bone25.setRotationPoint(0.0F, 0.5F, -9.5F); + bone.addChild(bone25); + cube_r104 = new ModelRenderer(this); + cube_r104.setRotationPoint(1.0F, 32.5F, -13.5F); + bone25.addChild(cube_r104); + setRotationAngle(cube_r104, 0.0F, -1.5708F, 0.0F); + cube_r104.setTextureOffset(102, 40).addBox(11.0F, -33.0F, -10.0F, 1.0F, 1.0F, 22.0F, 0.0F, false); + cube_r105 = new ModelRenderer(this); + cube_r105.setRotationPoint(1.0F, 32.5F, -14.0F); + bone25.addChild(cube_r105); + setRotationAngle(cube_r105, 0.0F, -1.5708F, 0.0F); + cube_r105.setTextureOffset(102, 0).addBox(12.0F, -32.0F, -10.0F, 0.0F, 17.0F, 22.0F, 0.0F, false); + bone51 = new ModelRenderer(this); + bone51.setRotationPoint(0.0F, -17.0F, 0.0F); + setRotationAngle(bone51, 0.0F, -1.5708F, 0.0F); + bone51.setTextureOffset(53, 24).addBox(-12.0F, 24.0F, -11.0F, 1.0F, 17.0F, 23.0F, 0.0F, false); + cube_r106 = new ModelRenderer(this); + cube_r106.setRotationPoint(-22.0F, 33.0F, -23.0F); + bone51.addChild(cube_r106); + setRotationAngle(cube_r106, 0.0F, -1.5708F, 0.0F); + cube_r106.setTextureOffset(45, 89).addBox(11.0F, -30.0F, -11.0F, 1.0F, 15.0F, 1.0F, 0.0F, false); + cube_r107 = new ModelRenderer(this); + cube_r107.setRotationPoint(-22.5F, 19.0F, -22.5F); + bone51.addChild(cube_r107); + setRotationAngle(cube_r107, 0.0F, -1.5708F, 0.0F); + cube_r107.setTextureOffset(65, 144).addBox(10.0F, -19.0F, -12.0F, 2.0F, 4.0F, 2.0F, 0.0F, false); + cube_r107.setTextureOffset(56, 144).addBox(10.0F, -1.0F, -12.0F, 2.0F, 4.0F, 2.0F, 0.0F, false); + cube_r108 = new ModelRenderer(this); + cube_r108.setRotationPoint(0.0F, 40.0F, 0.0F); + bone51.addChild(cube_r108); + setRotationAngle(cube_r108, 0.0F, 3.1416F, 0.0F); + cube_r108.setTextureOffset(98, 106).addBox(10.0F, -18.0F, -13.0F, 3.0F, 3.0F, 23.0F, 0.0F, false); + bone52 = new ModelRenderer(this); + bone52.setRotationPoint(0.0F, 0.0F, 0.0F); + bone51.addChild(bone52); + setRotationAngle(bone52, 0.0F, -1.5708F, 0.0F); + cube_r109 = new ModelRenderer(this); + cube_r109.setRotationPoint(-11.5F, 0.0F, 11.5F); + bone52.addChild(cube_r109); + setRotationAngle(cube_r109, 1.0021F, -0.7255F, -0.4941F); + cube_r109.setTextureOffset(38, 144).addBox(-0.5F, -13.0F, -0.5F, 1.0F, 13.0F, 1.0F, 0.0F, false); + cube_r110 = new ModelRenderer(this); + cube_r110.setRotationPoint(-11.5F, 0.0F, 11.5F); + bone52.addChild(cube_r110); + setRotationAngle(cube_r110, 0.2707F, -0.5082F, 0.5615F); + cube_r110.setTextureOffset(143, 80).addBox(-0.5F, -13.0F, -0.5F, 1.0F, 13.0F, 1.0F, 0.0F, false); + bone53 = new ModelRenderer(this); + bone53.setRotationPoint(0.0F, 0.5F, -9.5F); + bone51.addChild(bone53); + cube_r111 = new ModelRenderer(this); + cube_r111.setRotationPoint(1.0F, 32.5F, -13.5F); + bone53.addChild(cube_r111); + setRotationAngle(cube_r111, 0.0F, -1.5708F, 0.0F); + cube_r111.setTextureOffset(102, 40).addBox(11.0F, -33.0F, -10.0F, 1.0F, 1.0F, 22.0F, 0.0F, false); + cube_r112 = new ModelRenderer(this); + cube_r112.setRotationPoint(1.0F, 32.5F, -14.0F); + bone53.addChild(cube_r112); + setRotationAngle(cube_r112, 0.0F, -1.5708F, 0.0F); + cube_r112.setTextureOffset(102, 0).addBox(12.0F, -32.0F, -10.0F, 0.0F, 17.0F, 22.0F, 0.0F, false); + bone54 = new ModelRenderer(this); + bone54.setRotationPoint(0.0F, -17.0F, 0.0F); + setRotationAngle(bone54, 0.0F, 3.1416F, 0.0F); + bone54.setTextureOffset(53, 24).addBox(-12.0F, 24.0F, -11.0F, 1.0F, 17.0F, 23.0F, 0.0F, false); + cube_r113 = new ModelRenderer(this); + cube_r113.setRotationPoint(-22.0F, 33.0F, -23.0F); + bone54.addChild(cube_r113); + setRotationAngle(cube_r113, 0.0F, -1.5708F, 0.0F); + cube_r113.setTextureOffset(45, 89).addBox(11.0F, -30.0F, -11.0F, 1.0F, 15.0F, 1.0F, 0.0F, false); + cube_r114 = new ModelRenderer(this); + cube_r114.setRotationPoint(-22.5F, 19.0F, -22.5F); + bone54.addChild(cube_r114); + setRotationAngle(cube_r114, 0.0F, -1.5708F, 0.0F); + cube_r114.setTextureOffset(65, 144).addBox(10.0F, -19.0F, -12.0F, 2.0F, 4.0F, 2.0F, 0.0F, false); + cube_r114.setTextureOffset(56, 144).addBox(10.0F, -1.0F, -12.0F, 2.0F, 4.0F, 2.0F, 0.0F, false); + cube_r115 = new ModelRenderer(this); + cube_r115.setRotationPoint(0.0F, 40.0F, 0.0F); + bone54.addChild(cube_r115); + setRotationAngle(cube_r115, 0.0F, 3.1416F, 0.0F); + cube_r115.setTextureOffset(98, 106).addBox(10.0F, -18.0F, -13.0F, 3.0F, 3.0F, 23.0F, 0.0F, false); + bone55 = new ModelRenderer(this); + bone55.setRotationPoint(0.0F, 0.0F, 0.0F); + bone54.addChild(bone55); + setRotationAngle(bone55, 0.0F, -1.5708F, 0.0F); + cube_r116 = new ModelRenderer(this); + cube_r116.setRotationPoint(-11.5F, 0.0F, 11.5F); + bone55.addChild(cube_r116); + setRotationAngle(cube_r116, 1.0021F, -0.7255F, -0.4941F); + cube_r116.setTextureOffset(38, 144).addBox(-0.5F, -13.0F, -0.5F, 1.0F, 13.0F, 1.0F, 0.0F, false); + cube_r117 = new ModelRenderer(this); + cube_r117.setRotationPoint(-11.5F, 0.0F, 11.5F); + bone55.addChild(cube_r117); + setRotationAngle(cube_r117, 0.2707F, -0.5082F, 0.5615F); + cube_r117.setTextureOffset(143, 80).addBox(-0.5F, -13.0F, -0.5F, 1.0F, 13.0F, 1.0F, 0.0F, false); + bone56 = new ModelRenderer(this); + bone56.setRotationPoint(0.0F, 0.5F, -9.5F); + bone54.addChild(bone56); + cube_r118 = new ModelRenderer(this); + cube_r118.setRotationPoint(1.0F, 32.5F, -13.5F); + bone56.addChild(cube_r118); + setRotationAngle(cube_r118, 0.0F, -1.5708F, 0.0F); + cube_r118.setTextureOffset(102, 40).addBox(11.0F, -33.0F, -10.0F, 1.0F, 1.0F, 22.0F, 0.0F, false); + cube_r119 = new ModelRenderer(this); + cube_r119.setRotationPoint(1.0F, 32.5F, -14.0F); + bone56.addChild(cube_r119); + setRotationAngle(cube_r119, 0.0F, -1.5708F, 0.0F); + cube_r119.setTextureOffset(102, 0).addBox(12.0F, -32.0F, -10.0F, 0.0F, 17.0F, 22.0F, 0.0F, false); + bone57 = new ModelRenderer(this); + bone57.setRotationPoint(0.0F, -17.0F, 0.0F); + setRotationAngle(bone57, 0.0F, 1.5708F, 0.0F); + bone57.setTextureOffset(53, 24).addBox(-12.0F, 24.0F, -11.0F, 1.0F, 17.0F, 23.0F, 0.0F, false); + cube_r120 = new ModelRenderer(this); + cube_r120.setRotationPoint(-22.0F, 33.0F, -23.0F); + bone57.addChild(cube_r120); + setRotationAngle(cube_r120, 0.0F, -1.5708F, 0.0F); + cube_r120.setTextureOffset(45, 89).addBox(11.0F, -30.0F, -11.0F, 1.0F, 15.0F, 1.0F, 0.0F, false); + cube_r121 = new ModelRenderer(this); + cube_r121.setRotationPoint(-22.5F, 19.0F, -22.5F); + bone57.addChild(cube_r121); + setRotationAngle(cube_r121, 0.0F, -1.5708F, 0.0F); + cube_r121.setTextureOffset(65, 144).addBox(10.0F, -19.0F, -12.0F, 2.0F, 4.0F, 2.0F, 0.0F, false); + cube_r121.setTextureOffset(56, 144).addBox(10.0F, -1.0F, -12.0F, 2.0F, 4.0F, 2.0F, 0.0F, false); + cube_r122 = new ModelRenderer(this); + cube_r122.setRotationPoint(0.0F, 40.0F, 0.0F); + bone57.addChild(cube_r122); + setRotationAngle(cube_r122, 0.0F, 3.1416F, 0.0F); + cube_r122.setTextureOffset(98, 106).addBox(10.0F, -18.0F, -13.0F, 3.0F, 3.0F, 23.0F, 0.0F, false); + bone58 = new ModelRenderer(this); + bone58.setRotationPoint(0.0F, 0.0F, 0.0F); + bone57.addChild(bone58); + setRotationAngle(bone58, 0.0F, -1.5708F, 0.0F); + cube_r123 = new ModelRenderer(this); + cube_r123.setRotationPoint(-11.5F, 0.0F, 11.5F); + bone58.addChild(cube_r123); + setRotationAngle(cube_r123, 1.0021F, -0.7255F, -0.4941F); + cube_r123.setTextureOffset(38, 144).addBox(-0.5F, -13.0F, -0.5F, 1.0F, 13.0F, 1.0F, 0.0F, false); + cube_r124 = new ModelRenderer(this); + cube_r124.setRotationPoint(-11.5F, 0.0F, 11.5F); + bone58.addChild(cube_r124); + setRotationAngle(cube_r124, 0.2707F, -0.5082F, 0.5615F); + cube_r124.setTextureOffset(143, 80).addBox(-0.5F, -13.0F, -0.5F, 1.0F, 13.0F, 1.0F, 0.0F, false); + bone59 = new ModelRenderer(this); + bone59.setRotationPoint(0.0F, 0.5F, -9.5F); + bone57.addChild(bone59); + cube_r125 = new ModelRenderer(this); + cube_r125.setRotationPoint(1.0F, 32.5F, -13.5F); + bone59.addChild(cube_r125); + setRotationAngle(cube_r125, 0.0F, -1.5708F, 0.0F); + cube_r125.setTextureOffset(102, 40).addBox(11.0F, -33.0F, -10.0F, 1.0F, 1.0F, 22.0F, 0.0F, false); + cube_r126 = new ModelRenderer(this); + cube_r126.setRotationPoint(1.0F, 32.5F, -14.0F); + bone59.addChild(cube_r126); + setRotationAngle(cube_r126, 0.0F, -1.5708F, 0.0F); + cube_r126.setTextureOffset(102, 0).addBox(12.0F, -32.0F, -10.0F, 0.0F, 17.0F, 22.0F, 0.0F, false); + bone26 = new ModelRenderer(this); + bone26.setRotationPoint(0.0F, -16.5F, 0.0F); + setRotationAngle(bone26, 0.0F, -1.5708F, 0.0F); + cube_r127 = new ModelRenderer(this); + cube_r127.setRotationPoint(0.0F, 0.0F, 0.0F); + bone26.addChild(cube_r127); + setRotationAngle(cube_r127, 0.0F, -1.5708F, 0.0F); + cube_r127.setTextureOffset(0, 107).addBox(-0.5F, -0.5F, -11.0F, 1.0F, 1.0F, 22.0F, 0.0F, false); + cube_r128 = new ModelRenderer(this); + cube_r128.setRotationPoint(0.0F, 0.0F, -9.5F); + bone26.addChild(cube_r128); + setRotationAngle(cube_r128, 0.0F, 3.1416F, 0.0F); + cube_r128.setTextureOffset(0, 107).addBox(-0.5F, -0.5F, -20.5F, 1.0F, 1.0F, 22.0F, 0.0F, false); + bb_main = new ModelRenderer(this); + bb_main.setRotationPoint(0.0F, 24.0F, 0.0F); + bb_main.setTextureOffset(0, 0).addBox(-11.0F, -1.0F, -11.0F, 22.0F, 1.0F, 22.0F, 0.0F, false); + bb_main.setTextureOffset(39, 69).addBox(-8.0F, -124.75F, -8.0F, 16.0F, 0.0F, 16.0F, 0.0F, false); + } + + @Override + public void render(MatrixStack matrixStack, IVertexBuilder buffer, int packedLight, int packedOverlay, float red, float green, float blue, + float alpha) { + Balloonstrip.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + Balloonstrip11.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + Balloonstrip12.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + Balloonstrip10.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + Balloonstrip2.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + Balloonstrip9.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + Balloonstrip7.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + Balloonstrip8.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + Engine.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bone34.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bone60.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bone.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bone51.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bone54.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bone57.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bone26.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bb_main.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } + + public void setRotationAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } + + public void setRotationAngles(Entity e, float f, float f1, float f2, float f3, float f4) { + } + } + +} diff --git a/src/main/java/studio/halbear/hem/entity/renderer/LadyBugInFlightRenderer.java b/src/main/java/studio/halbear/hem/entity/renderer/LadyBugInFlightRenderer.java new file mode 100644 index 0000000..d54947b --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/renderer/LadyBugInFlightRenderer.java @@ -0,0 +1,155 @@ + +package studio.halbear.hem.entity.renderer; + +import studio.halbear.hem.entity.LadyBugInFlightEntity; + +import net.minecraftforge.fml.client.registry.RenderingRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.model.ModelRenderer; +import net.minecraft.client.renderer.entity.model.EntityModel; +import net.minecraft.client.renderer.entity.MobRenderer; + +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.mojang.blaze3d.matrix.MatrixStack; + +@OnlyIn(Dist.CLIENT) +public class LadyBugInFlightRenderer { + public static class ModelRegisterHandler { + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public void registerModels(ModelRegistryEvent event) { + RenderingRegistry.registerEntityRenderingHandler(LadyBugInFlightEntity.entity, renderManager -> { + return new MobRenderer(renderManager, new ModelLadyBirdInFlight(), 0.3f) { + + @Override + public ResourceLocation getEntityTexture(Entity entity) { + return new ResourceLocation("hem:textures/entities/ladybug.png"); + } + }; + }); + } + } + + // Made with Blockbench 4.12.4 + // Exported for Minecraft version 1.15 - 1.16 with MCP mappings + // Paste this class into your mod and generate all required imports + public static class ModelLadyBirdInFlight extends EntityModel { + private final ModelRenderer Body; + private final ModelRenderer RightLeg; + private final ModelRenderer cube_r1; + private final ModelRenderer LeftLeg; + private final ModelRenderer cube_r2; + private final ModelRenderer RightLeg2; + private final ModelRenderer cube_r3; + private final ModelRenderer LeftLeg2; + private final ModelRenderer cube_r4; + private final ModelRenderer rightwing; + private final ModelRenderer cube_r5; + private final ModelRenderer leftwing; + private final ModelRenderer cube_r6; + private final ModelRenderer head; + private final ModelRenderer cube_r7; + + public ModelLadyBirdInFlight() { + textureWidth = 32; + textureHeight = 32; + Body = new ModelRenderer(this); + Body.setRotationPoint(0.0F, 21.0F, -2.0F); + setRotationAngle(Body, -0.2182F, 0.0F, 0.0F); + Body.setTextureOffset(0, 0).addBox(-2.0F, 0.0F, 0.0F, 4.0F, 3.0F, 5.0F, 0.0F, false); + RightLeg = new ModelRenderer(this); + RightLeg.setRotationPoint(-2.0F, 2.25F, 2.5F); + Body.addChild(RightLeg); + cube_r1 = new ModelRenderer(this); + cube_r1.setRotationPoint(0.0F, 0.0F, -0.5F); + RightLeg.addChild(cube_r1); + setRotationAngle(cube_r1, 0.0F, 0.0F, -0.5236F); + cube_r1.setTextureOffset(19, 2).addBox(-2.0F, 0.0F, 2.0F, 2.0F, 0.0F, 1.0F, 0.0F, false); + cube_r1.setTextureOffset(19, 0).addBox(-2.0F, 0.0F, -2.0F, 2.0F, 0.0F, 1.0F, 0.0F, false); + LeftLeg = new ModelRenderer(this); + LeftLeg.setRotationPoint(2.0F, 2.25F, 2.5F); + Body.addChild(LeftLeg); + cube_r2 = new ModelRenderer(this); + cube_r2.setRotationPoint(0.0F, 0.0F, -0.5F); + LeftLeg.addChild(cube_r2); + setRotationAngle(cube_r2, 0.0F, 0.0F, 0.5236F); + cube_r2.setTextureOffset(22, 20).addBox(0.0F, 0.0F, 2.0F, 2.0F, 0.0F, 1.0F, 0.0F, false); + cube_r2.setTextureOffset(19, 6).addBox(0.0F, 0.0F, -2.0F, 2.0F, 0.0F, 1.0F, 0.0F, false); + RightLeg2 = new ModelRenderer(this); + RightLeg2.setRotationPoint(2.0F, 2.25F, 2.5F); + Body.addChild(RightLeg2); + cube_r3 = new ModelRenderer(this); + cube_r3.setRotationPoint(0.0F, 0.0F, -0.5F); + RightLeg2.addChild(cube_r3); + setRotationAngle(cube_r3, 0.0F, 0.0F, 0.5236F); + cube_r3.setTextureOffset(22, 18).addBox(0.0F, 0.0F, 0.0F, 2.0F, 0.0F, 1.0F, 0.0F, false); + LeftLeg2 = new ModelRenderer(this); + LeftLeg2.setRotationPoint(-2.0F, 2.25F, 2.5F); + Body.addChild(LeftLeg2); + cube_r4 = new ModelRenderer(this); + cube_r4.setRotationPoint(0.0F, 0.0F, -0.5F); + LeftLeg2.addChild(cube_r4); + setRotationAngle(cube_r4, 0.0F, 0.0F, -0.5236F); + cube_r4.setTextureOffset(19, 4).addBox(-2.0F, 0.0F, 0.0F, 2.0F, 0.0F, 1.0F, 0.0F, false); + rightwing = new ModelRenderer(this); + rightwing.setRotationPoint(-0.1F, 20.95F, -2.15F); + setRotationAngle(rightwing, 0.108F, -0.404F, 0.7438F); + cube_r5 = new ModelRenderer(this); + cube_r5.setRotationPoint(-2.101F, 0.2457F, -0.1112F); + rightwing.addChild(cube_r5); + setRotationAngle(cube_r5, 0.0451F, -0.1289F, -0.0229F); + cube_r5.setTextureOffset(0, 9).addBox(0.0F, 0.0F, 0.0F, 2.0F, 3.0F, 5.0F, 0.2F, false); + leftwing = new ModelRenderer(this); + leftwing.setRotationPoint(0.1F, 20.95F, -2.1F); + setRotationAngle(leftwing, 0.127F, 0.532F, -0.6743F); + cube_r6 = new ModelRenderer(this); + cube_r6.setRotationPoint(2.1007F, 0.243F, -0.164F); + leftwing.addChild(cube_r6); + setRotationAngle(cube_r6, 0.0451F, 0.1289F, 0.0229F); + cube_r6.setTextureOffset(15, 9).addBox(-2.0F, 0.0F, 0.0F, 2.0F, 3.0F, 5.0F, 0.2F, false); + head = new ModelRenderer(this); + head.setRotationPoint(0.0F, 22.5F, -2.25F); + head.setTextureOffset(13, 18).addBox(-1.0F, -1.0F, -2.0F, 2.0F, 2.0F, 2.0F, 0.0F, false); + cube_r7 = new ModelRenderer(this); + cube_r7.setRotationPoint(0.5F, -1.0F, -2.0F); + head.addChild(cube_r7); + setRotationAngle(cube_r7, 0.48F, 0.0F, 0.0F); + cube_r7.setTextureOffset(0, 18).addBox(-3.0F, -4.0F, 0.0F, 5.0F, 4.0F, 0.0F, 0.0F, false); + } + + @Override + public void render(MatrixStack matrixStack, IVertexBuilder buffer, int packedLight, int packedOverlay, float red, float green, float blue, + float alpha) { + Body.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + rightwing.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + leftwing.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + head.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } + + public void setRotationAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } + + public void setRotationAngles(Entity e, float f, float f1, float f2, float f3, float f4) { + this.LeftLeg.rotateAngleZ = MathHelper.cos(f * 1.0F) * -1.0F * f1; + this.RightLeg2.rotateAngleZ = MathHelper.cos(f * 1.0F) * 1.0F * f1; + this.LeftLeg2.rotateAngleZ = MathHelper.cos(f * 1.0F) * -1.0F * f1; + this.rightwing.rotateAngleY = MathHelper.cos(f * 1.0F) * -1.0F * f1; + this.leftwing.rotateAngleY = MathHelper.cos(f * 1.0F) * 1.0F * f1; + this.head.rotateAngleY = f3 / (180F / (float) Math.PI); + this.head.rotateAngleX = f4 / (180F / (float) Math.PI); + this.RightLeg.rotateAngleZ = MathHelper.cos(f * 1.0F) * 1.0F * f1; + this.Body.rotateAngleX = MathHelper.cos(f * 0.6662F + (float) Math.PI) * f1; + } + } + +} diff --git a/src/main/java/studio/halbear/hem/entity/renderer/LadybugRenderer.java b/src/main/java/studio/halbear/hem/entity/renderer/LadybugRenderer.java new file mode 100644 index 0000000..6117465 --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/renderer/LadybugRenderer.java @@ -0,0 +1,153 @@ + +package studio.halbear.hem.entity.renderer; + +import studio.halbear.hem.entity.LadybugEntity; + +import net.minecraftforge.fml.client.registry.RenderingRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.model.ModelRenderer; +import net.minecraft.client.renderer.entity.model.EntityModel; +import net.minecraft.client.renderer.entity.MobRenderer; + +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.mojang.blaze3d.matrix.MatrixStack; + +@OnlyIn(Dist.CLIENT) +public class LadybugRenderer { + public static class ModelRegisterHandler { + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public void registerModels(ModelRegistryEvent event) { + RenderingRegistry.registerEntityRenderingHandler(LadybugEntity.entity, renderManager -> { + return new MobRenderer(renderManager, new ModelLadyBird(), 0.3f) { + + @Override + public ResourceLocation getEntityTexture(Entity entity) { + return new ResourceLocation("hem:textures/entities/ladybug.png"); + } + }; + }); + } + } + + // Made with Blockbench 4.12.4 + // Exported for Minecraft version 1.15 - 1.16 with MCP mappings + // Paste this class into your mod and generate all required imports + public static class ModelLadyBird extends EntityModel { + private final ModelRenderer rightwing; + private final ModelRenderer cube_r1; + private final ModelRenderer leftwing; + private final ModelRenderer cube_r2; + private final ModelRenderer head; + private final ModelRenderer cube_r3; + private final ModelRenderer RightLeg; + private final ModelRenderer cube_r4; + private final ModelRenderer LeftLeg; + private final ModelRenderer cube_r5; + private final ModelRenderer RightLeg2; + private final ModelRenderer cube_r6; + private final ModelRenderer LeftLeg2; + private final ModelRenderer cube_r7; + private final ModelRenderer bb_main; + + public ModelLadyBird() { + textureWidth = 32; + textureHeight = 32; + rightwing = new ModelRenderer(this); + rightwing.setRotationPoint(-0.1F, 20.95F, -2.15F); + setRotationAngle(rightwing, -0.0366F, 0.0904F, 0.1661F); + cube_r1 = new ModelRenderer(this); + cube_r1.setRotationPoint(-2.101F, 0.2457F, -0.1112F); + rightwing.addChild(cube_r1); + setRotationAngle(cube_r1, 0.0451F, -0.1289F, -0.0229F); + cube_r1.setTextureOffset(0, 9).addBox(0.0F, 0.0F, 0.0F, 2.0F, 3.0F, 5.0F, 0.2F, false); + leftwing = new ModelRenderer(this); + leftwing.setRotationPoint(0.1F, 20.95F, -2.1F); + setRotationAngle(leftwing, -0.0513F, -0.0872F, -0.168F); + cube_r2 = new ModelRenderer(this); + cube_r2.setRotationPoint(2.1007F, 0.243F, -0.164F); + leftwing.addChild(cube_r2); + setRotationAngle(cube_r2, 0.0451F, 0.1289F, 0.0229F); + cube_r2.setTextureOffset(15, 9).addBox(-2.0F, 0.0F, 0.0F, 2.0F, 3.0F, 5.0F, 0.2F, false); + head = new ModelRenderer(this); + head.setRotationPoint(0.0F, 23.0F, -2.0F); + head.setTextureOffset(13, 18).addBox(-1.0F, -1.0F, -2.0F, 2.0F, 2.0F, 2.0F, 0.0F, false); + cube_r3 = new ModelRenderer(this); + cube_r3.setRotationPoint(0.5F, -1.0F, -2.0F); + head.addChild(cube_r3); + setRotationAngle(cube_r3, 0.48F, 0.0F, 0.0F); + cube_r3.setTextureOffset(0, 18).addBox(-3.0F, -4.0F, 0.0F, 5.0F, 4.0F, 0.0F, 0.0F, false); + RightLeg = new ModelRenderer(this); + RightLeg.setRotationPoint(-2.0F, 23.25F, 0.5F); + cube_r4 = new ModelRenderer(this); + cube_r4.setRotationPoint(0.0F, 0.0F, -0.5F); + RightLeg.addChild(cube_r4); + setRotationAngle(cube_r4, 0.0F, 0.0F, -0.5236F); + cube_r4.setTextureOffset(19, 2).addBox(-2.0F, 0.0F, 2.0F, 2.0F, 0.0F, 1.0F, 0.0F, false); + cube_r4.setTextureOffset(19, 0).addBox(-2.0F, 0.0F, -2.0F, 2.0F, 0.0F, 1.0F, 0.0F, false); + LeftLeg = new ModelRenderer(this); + LeftLeg.setRotationPoint(2.0F, 23.25F, 0.5F); + cube_r5 = new ModelRenderer(this); + cube_r5.setRotationPoint(0.0F, 0.0F, -0.5F); + LeftLeg.addChild(cube_r5); + setRotationAngle(cube_r5, 0.0F, 0.0F, 0.5236F); + cube_r5.setTextureOffset(22, 20).addBox(0.0F, 0.0F, 2.0F, 2.0F, 0.0F, 1.0F, 0.0F, false); + cube_r5.setTextureOffset(19, 6).addBox(0.0F, 0.0F, -2.0F, 2.0F, 0.0F, 1.0F, 0.0F, false); + RightLeg2 = new ModelRenderer(this); + RightLeg2.setRotationPoint(2.0F, 23.25F, 0.5F); + cube_r6 = new ModelRenderer(this); + cube_r6.setRotationPoint(0.0F, 0.0F, -0.5F); + RightLeg2.addChild(cube_r6); + setRotationAngle(cube_r6, 0.0F, 0.0F, 0.5236F); + cube_r6.setTextureOffset(22, 18).addBox(0.0F, 0.0F, 0.0F, 2.0F, 0.0F, 1.0F, 0.0F, false); + LeftLeg2 = new ModelRenderer(this); + LeftLeg2.setRotationPoint(-2.0F, 23.25F, 0.5F); + cube_r7 = new ModelRenderer(this); + cube_r7.setRotationPoint(0.0F, 0.0F, -0.5F); + LeftLeg2.addChild(cube_r7); + setRotationAngle(cube_r7, 0.0F, 0.0F, -0.5236F); + cube_r7.setTextureOffset(19, 4).addBox(-2.0F, 0.0F, 0.0F, 2.0F, 0.0F, 1.0F, 0.0F, false); + bb_main = new ModelRenderer(this); + bb_main.setRotationPoint(0.0F, 24.0F, 0.0F); + bb_main.setTextureOffset(0, 0).addBox(-2.0F, -3.0F, -2.0F, 4.0F, 3.0F, 5.0F, 0.0F, false); + } + + @Override + public void render(MatrixStack matrixStack, IVertexBuilder buffer, int packedLight, int packedOverlay, float red, float green, float blue, + float alpha) { + rightwing.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + leftwing.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + head.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + RightLeg.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + LeftLeg.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + RightLeg2.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + LeftLeg2.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + bb_main.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } + + public void setRotationAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } + + public void setRotationAngles(Entity e, float f, float f1, float f2, float f3, float f4) { + this.LeftLeg.rotateAngleZ = MathHelper.cos(f * 1.0F) * -1.0F * f1; + this.RightLeg2.rotateAngleZ = MathHelper.cos(f * 1.0F) * 1.0F * f1; + this.LeftLeg2.rotateAngleZ = MathHelper.cos(f * 1.0F) * -1.0F * f1; + this.rightwing.rotateAngleY = MathHelper.cos(f * 0.6662F + (float) Math.PI) * f1; + this.leftwing.rotateAngleY = MathHelper.cos(f * 0.6662F) * f1; + this.head.rotateAngleY = f3 / (180F / (float) Math.PI); + this.head.rotateAngleX = f4 / (180F / (float) Math.PI); + this.RightLeg.rotateAngleZ = MathHelper.cos(f * 1.0F) * 1.0F * f1; + } + } + +} diff --git a/src/main/java/studio/halbear/hem/entity/renderer/TigerFishRenderer.java b/src/main/java/studio/halbear/hem/entity/renderer/TigerFishRenderer.java new file mode 100644 index 0000000..efca295 --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/renderer/TigerFishRenderer.java @@ -0,0 +1,152 @@ + +package studio.halbear.hem.entity.renderer; + +import studio.halbear.hem.procedures.TigerFishEntityShakingConditionProcedure; +import studio.halbear.hem.entity.TigerFishEntity; + +import net.minecraftforge.fml.client.registry.RenderingRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.model.ModelRenderer; +import net.minecraft.client.renderer.entity.model.EntityModel; +import net.minecraft.client.renderer.entity.MobRenderer; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.mojang.blaze3d.matrix.MatrixStack; + +@OnlyIn(Dist.CLIENT) +public class TigerFishRenderer { + public static class ModelRegisterHandler { + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public void registerModels(ModelRegistryEvent event) { + RenderingRegistry.registerEntityRenderingHandler(TigerFishEntity.entity, renderManager -> { + return new MobRenderer(renderManager, new ModelTigerFish(), 0.5f) { + + @Override + public ResourceLocation getEntityTexture(Entity entity) { + return new ResourceLocation("hem:textures/entities/tigerfish.png"); + } + + @Override + protected boolean func_230495_a_(LivingEntity _ent) { + Entity entity = _ent; + World world = entity.world; + double x = entity.getPosX(); + double y = entity.getPosY(); + double z = entity.getPosZ(); + return TigerFishEntityShakingConditionProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + }; + }); + } + } + + // Made with Blockbench 4.12.4 + // Exported for Minecraft version 1.15 - 1.16 with MCP mappings + // Paste this class into your mod and generate all required imports + public static class ModelTigerFish extends EntityModel { + private final ModelRenderer OuterBody; + private final ModelRenderer Body; + private final ModelRenderer HeadY; + private final ModelRenderer leftWhisker; + private final ModelRenderer leftWhisker_r1; + private final ModelRenderer RightWhisker; + private final ModelRenderer RightWhisker_r1; + private final ModelRenderer RightFin; + private final ModelRenderer TailFin3; + private final ModelRenderer TailFin; + private final ModelRenderer TailFin2; + private final ModelRenderer leftFin; + + public ModelTigerFish() { + textureWidth = 128; + textureHeight = 128; + OuterBody = new ModelRenderer(this); + OuterBody.setRotationPoint(0.0F, 21.0F, 8.0F); + Body = new ModelRenderer(this); + Body.setRotationPoint(0.0F, 0.0F, 0.0F); + OuterBody.addChild(Body); + HeadY = new ModelRenderer(this); + HeadY.setRotationPoint(0.0F, 0.0F, -12.0F); + Body.addChild(HeadY); + HeadY.setTextureOffset(0, 0).addBox(-5.0F, -2.0F, -4.0F, 10.0F, 4.0F, 16.0F, 0.0F, false); + HeadY.setTextureOffset(0, 20).addBox(-5.0F, -2.0F, -4.0F, 10.0F, 4.0F, 16.0F, 0.2F, false); + HeadY.setTextureOffset(52, 16).addBox(0.0F, -7.0F, -4.0F, 0.0F, 11.0F, 16.0F, 0.0F, false); + leftWhisker = new ModelRenderer(this); + leftWhisker.setRotationPoint(2.0F, -1.0F, -4.05F); + HeadY.addChild(leftWhisker); + leftWhisker_r1 = new ModelRenderer(this); + leftWhisker_r1.setRotationPoint(0.0F, 0.0F, 0.0F); + leftWhisker.addChild(leftWhisker_r1); + setRotationAngle(leftWhisker_r1, 0.119F, 0.734F, 0.1767F); + leftWhisker_r1.setTextureOffset(0, 56).addBox(0.0F, -4.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F, false); + RightWhisker = new ModelRenderer(this); + RightWhisker.setRotationPoint(-2.0F, -1.0F, -4.05F); + HeadY.addChild(RightWhisker); + RightWhisker_r1 = new ModelRenderer(this); + RightWhisker_r1.setRotationPoint(0.0F, 0.0F, 0.0F); + RightWhisker.addChild(RightWhisker_r1); + setRotationAngle(RightWhisker_r1, 0.1578F, -0.7279F, -0.2348F); + RightWhisker_r1.setTextureOffset(16, 56).addBox(-8.0F, -4.0F, 0.0F, 8.0F, 7.0F, 0.0F, 0.0F, false); + RightFin = new ModelRenderer(this); + RightFin.setRotationPoint(-5.0F, 2.0F, 4.0F); + HeadY.addChild(RightFin); + RightFin.setTextureOffset(0, 40).addBox(-10.0F, 0.0F, -8.0F, 10.0F, 0.0F, 16.0F, 0.0F, false); + TailFin3 = new ModelRenderer(this); + TailFin3.setRotationPoint(0.0F, 0.0F, 12.0F); + HeadY.addChild(TailFin3); + TailFin = new ModelRenderer(this); + TailFin.setRotationPoint(0.0F, 0.0F, 0.0F); + TailFin3.addChild(TailFin); + TailFin2 = new ModelRenderer(this); + TailFin2.setRotationPoint(0.0F, 0.0F, 0.0F); + TailFin.addChild(TailFin2); + TailFin2.setTextureOffset(52, 43).addBox(0.0F, -7.0F, 0.0F, 0.0F, 11.0F, 16.0F, 0.0F, false); + leftFin = new ModelRenderer(this); + leftFin.setRotationPoint(5.0F, 2.0F, 4.0F); + HeadY.addChild(leftFin); + leftFin.setTextureOffset(0, 40).addBox(0.0F, 0.0F, -8.0F, 10.0F, 0.0F, 16.0F, 0.0F, true); + } + + @Override + public void render(MatrixStack matrixStack, IVertexBuilder buffer, int packedLight, int packedOverlay, float red, float green, float blue, + float alpha) { + OuterBody.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } + + public void setRotationAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } + + public void setRotationAngles(Entity e, float f, float f1, float f2, float f3, float f4) { + this.TailFin.rotateAngleY = MathHelper.cos(f * 1.0F) * -1.0F * f1; + this.leftWhisker.rotateAngleY = MathHelper.cos(f * 0.6662F + (float) Math.PI) * f1; + this.OuterBody.rotateAngleY = MathHelper.cos(f * 1.0F) * 1.0F * f1; + this.TailFin3.rotateAngleY = MathHelper.cos(f * 1.0F) * -1.0F * f1; + this.RightWhisker.rotateAngleY = MathHelper.cos(f * 0.6662F) * f1; + this.TailFin2.rotateAngleY = MathHelper.cos(f * 1.0F) * -1.0F * f1; + this.leftFin.rotateAngleZ = MathHelper.cos(f * 0.6662F + (float) Math.PI) * f1; + this.HeadY.rotateAngleX = f4 / (180F / (float) Math.PI); + this.Body.rotateAngleY = MathHelper.cos(f * 1.0F) * 1.0F * f1; + this.RightFin.rotateAngleZ = MathHelper.cos(f * 0.6662F) * f1; + } + } + +} diff --git a/src/main/java/studio/halbear/hem/gui/AirboatGasCelViewGui.java b/src/main/java/studio/halbear/hem/gui/AirboatGasCelViewGui.java new file mode 100644 index 0000000..d5dff72 --- /dev/null +++ b/src/main/java/studio/halbear/hem/gui/AirboatGasCelViewGui.java @@ -0,0 +1,415 @@ + +package studio.halbear.hem.gui; + +import studio.halbear.hem.item.GasCanister612litreItem; +import studio.halbear.hem.HemModElements; +import studio.halbear.hem.HemMod; + +import net.minecraftforge.items.SlotItemHandler; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.fml.network.NetworkEvent; +import net.minecraftforge.fml.network.IContainerFactory; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.DeferredWorkQueue; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.util.math.BlockPos; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.network.PacketBuffer; +import net.minecraft.item.ItemStack; +import net.minecraft.inventory.container.Slot; +import net.minecraft.inventory.container.ContainerType; +import net.minecraft.inventory.container.Container; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.Entity; +import net.minecraft.client.gui.ScreenManager; + +import java.util.function.Supplier; +import java.util.Map; +import java.util.HashMap; + +@HemModElements.ModElement.Tag +public class AirboatGasCelViewGui extends HemModElements.ModElement { + public static HashMap guistate = new HashMap(); + private static ContainerType containerType = null; + + public AirboatGasCelViewGui(HemModElements instance) { + super(instance, 309); + elements.addNetworkMessage(ButtonPressedMessage.class, ButtonPressedMessage::buffer, ButtonPressedMessage::new, + ButtonPressedMessage::handler); + elements.addNetworkMessage(GUISlotChangedMessage.class, GUISlotChangedMessage::buffer, GUISlotChangedMessage::new, + GUISlotChangedMessage::handler); + containerType = new ContainerType<>(new GuiContainerModFactory()); + FMLJavaModLoadingContext.get().getModEventBus().register(new ContainerRegisterHandler()); + } + + private static class ContainerRegisterHandler { + @SubscribeEvent + public void registerContainer(RegistryEvent.Register> event) { + event.getRegistry().register(containerType.setRegistryName("airboat_gas_cel_view")); + } + } + + @OnlyIn(Dist.CLIENT) + public void initElements() { + DeferredWorkQueue.runLater(() -> ScreenManager.registerFactory(containerType, AirboatGasCelViewGuiWindow::new)); + } + + public static class GuiContainerModFactory implements IContainerFactory { + public GuiContainerMod create(int id, PlayerInventory inv, PacketBuffer extraData) { + return new GuiContainerMod(id, inv, extraData); + } + } + + public static class GuiContainerMod extends Container implements Supplier> { + World world; + PlayerEntity entity; + int x, y, z; + private IItemHandler internal; + private Map customSlots = new HashMap<>(); + private boolean bound = false; + + public GuiContainerMod(int id, PlayerInventory inv, PacketBuffer extraData) { + super(containerType, id); + this.entity = inv.player; + this.world = inv.player.world; + this.internal = new ItemStackHandler(7); + BlockPos pos = null; + if (extraData != null) { + pos = extraData.readBlockPos(); + this.x = pos.getX(); + this.y = pos.getY(); + this.z = pos.getZ(); + } + if (pos != null) { + if (extraData.readableBytes() == 1) { // bound to item + byte hand = extraData.readByte(); + ItemStack itemstack; + if (hand == 0) + itemstack = this.entity.getHeldItemMainhand(); + else + itemstack = this.entity.getHeldItemOffhand(); + itemstack.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null).ifPresent(capability -> { + this.internal = capability; + this.bound = true; + }); + } else if (extraData.readableBytes() > 1) { + extraData.readByte(); // drop padding + Entity entity = world.getEntityByID(extraData.readVarInt()); + if (entity != null) + entity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null).ifPresent(capability -> { + this.internal = capability; + this.bound = true; + }); + } else { // might be bound to block + TileEntity ent = inv.player != null ? inv.player.world.getTileEntity(pos) : null; + if (ent != null) { + ent.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null).ifPresent(capability -> { + this.internal = capability; + this.bound = true; + }); + } + } + } + this.customSlots.put(0, this.addSlot(new SlotItemHandler(internal, 0, 261, 44) { + @Override + public boolean isItemValid(ItemStack stack) { + return (GasCanister612litreItem.block == stack.getItem()); + } + })); + this.customSlots.put(1, this.addSlot(new SlotItemHandler(internal, 1, 283, 44) { + @Override + public boolean isItemValid(ItemStack stack) { + return (GasCanister612litreItem.block == stack.getItem()); + } + })); + this.customSlots.put(2, this.addSlot(new SlotItemHandler(internal, 2, 305, 44) { + @Override + public boolean isItemValid(ItemStack stack) { + return (GasCanister612litreItem.block == stack.getItem()); + } + })); + this.customSlots.put(3, this.addSlot(new SlotItemHandler(internal, 3, 327, 44) { + @Override + public boolean isItemValid(ItemStack stack) { + return (GasCanister612litreItem.block == stack.getItem()); + } + })); + this.customSlots.put(4, this.addSlot(new SlotItemHandler(internal, 4, 349, 44) { + @Override + public boolean isItemValid(ItemStack stack) { + return (GasCanister612litreItem.block == stack.getItem()); + } + })); + this.customSlots.put(5, this.addSlot(new SlotItemHandler(internal, 5, 371, 44) { + })); + this.customSlots.put(6, this.addSlot(new SlotItemHandler(internal, 6, 393, 44) { + @Override + public boolean isItemValid(ItemStack stack) { + return (GasCanister612litreItem.block == stack.getItem()); + } + })); + int si; + int sj; + for (si = 0; si < 3; ++si) + for (sj = 0; sj < 9; ++sj) + this.addSlot(new Slot(inv, sj + (si + 1) * 9, 254 + 8 + sj * 18, 0 + 84 + si * 18)); + for (si = 0; si < 9; ++si) + this.addSlot(new Slot(inv, si, 254 + 8 + si * 18, 0 + 142)); + } + + public Map get() { + return customSlots; + } + + @Override + public boolean canInteractWith(PlayerEntity player) { + return true; + } + + @Override + public ItemStack transferStackInSlot(PlayerEntity playerIn, int index) { + ItemStack itemstack = ItemStack.EMPTY; + Slot slot = (Slot) this.inventorySlots.get(index); + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + if (index < 7) { + if (!this.mergeItemStack(itemstack1, 7, this.inventorySlots.size(), true)) { + return ItemStack.EMPTY; + } + slot.onSlotChange(itemstack1, itemstack); + } else if (!this.mergeItemStack(itemstack1, 0, 7, false)) { + if (index < 7 + 27) { + if (!this.mergeItemStack(itemstack1, 7 + 27, this.inventorySlots.size(), true)) { + return ItemStack.EMPTY; + } + } else { + if (!this.mergeItemStack(itemstack1, 7, 7 + 27, false)) { + return ItemStack.EMPTY; + } + } + return ItemStack.EMPTY; + } + if (itemstack1.getCount() == 0) { + slot.putStack(ItemStack.EMPTY); + } else { + slot.onSlotChanged(); + } + if (itemstack1.getCount() == itemstack.getCount()) { + return ItemStack.EMPTY; + } + slot.onTake(playerIn, itemstack1); + } + return itemstack; + } + + @Override /** + * Merges provided ItemStack with the first avaliable one in the container/player inventor between minIndex (included) and maxIndex (excluded). Args : stack, minIndex, maxIndex, negativDirection. /!\ the Container implementation do not check if the item is valid for the slot + */ + protected boolean mergeItemStack(ItemStack stack, int startIndex, int endIndex, boolean reverseDirection) { + boolean flag = false; + int i = startIndex; + if (reverseDirection) { + i = endIndex - 1; + } + if (stack.isStackable()) { + while (!stack.isEmpty()) { + if (reverseDirection) { + if (i < startIndex) { + break; + } + } else if (i >= endIndex) { + break; + } + Slot slot = this.inventorySlots.get(i); + ItemStack itemstack = slot.getStack(); + if (slot.isItemValid(itemstack) && !itemstack.isEmpty() && areItemsAndTagsEqual(stack, itemstack)) { + int j = itemstack.getCount() + stack.getCount(); + int maxSize = Math.min(slot.getSlotStackLimit(), stack.getMaxStackSize()); + if (j <= maxSize) { + stack.setCount(0); + itemstack.setCount(j); + slot.putStack(itemstack); + flag = true; + } else if (itemstack.getCount() < maxSize) { + stack.shrink(maxSize - itemstack.getCount()); + itemstack.setCount(maxSize); + slot.putStack(itemstack); + flag = true; + } + } + if (reverseDirection) { + --i; + } else { + ++i; + } + } + } + if (!stack.isEmpty()) { + if (reverseDirection) { + i = endIndex - 1; + } else { + i = startIndex; + } + while (true) { + if (reverseDirection) { + if (i < startIndex) { + break; + } + } else if (i >= endIndex) { + break; + } + Slot slot1 = this.inventorySlots.get(i); + ItemStack itemstack1 = slot1.getStack(); + if (itemstack1.isEmpty() && slot1.isItemValid(stack)) { + if (stack.getCount() > slot1.getSlotStackLimit()) { + slot1.putStack(stack.split(slot1.getSlotStackLimit())); + } else { + slot1.putStack(stack.split(stack.getCount())); + } + slot1.onSlotChanged(); + flag = true; + break; + } + if (reverseDirection) { + --i; + } else { + ++i; + } + } + } + return flag; + } + + @Override + public void onContainerClosed(PlayerEntity playerIn) { + super.onContainerClosed(playerIn); + if (!bound && (playerIn instanceof ServerPlayerEntity)) { + if (!playerIn.isAlive() || playerIn instanceof ServerPlayerEntity && ((ServerPlayerEntity) playerIn).hasDisconnected()) { + for (int j = 0; j < internal.getSlots(); ++j) { + playerIn.dropItem(internal.extractItem(j, internal.getStackInSlot(j).getCount(), false), false); + } + } else { + for (int i = 0; i < internal.getSlots(); ++i) { + playerIn.inventory.placeItemBackInInventory(playerIn.world, + internal.extractItem(i, internal.getStackInSlot(i).getCount(), false)); + } + } + } + } + + private void slotChanged(int slotid, int ctype, int meta) { + if (this.world != null && this.world.isRemote()) { + HemMod.PACKET_HANDLER.sendToServer(new GUISlotChangedMessage(slotid, x, y, z, ctype, meta)); + handleSlotAction(entity, slotid, ctype, meta, x, y, z); + } + } + } + + public static class ButtonPressedMessage { + int buttonID, x, y, z; + + public ButtonPressedMessage(PacketBuffer buffer) { + this.buttonID = buffer.readInt(); + this.x = buffer.readInt(); + this.y = buffer.readInt(); + this.z = buffer.readInt(); + } + + public ButtonPressedMessage(int buttonID, int x, int y, int z) { + this.buttonID = buttonID; + this.x = x; + this.y = y; + this.z = z; + } + + public static void buffer(ButtonPressedMessage message, PacketBuffer buffer) { + buffer.writeInt(message.buttonID); + buffer.writeInt(message.x); + buffer.writeInt(message.y); + buffer.writeInt(message.z); + } + + public static void handler(ButtonPressedMessage message, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + PlayerEntity entity = context.getSender(); + int buttonID = message.buttonID; + int x = message.x; + int y = message.y; + int z = message.z; + handleButtonAction(entity, buttonID, x, y, z); + }); + context.setPacketHandled(true); + } + } + + public static class GUISlotChangedMessage { + int slotID, x, y, z, changeType, meta; + + public GUISlotChangedMessage(int slotID, int x, int y, int z, int changeType, int meta) { + this.slotID = slotID; + this.x = x; + this.y = y; + this.z = z; + this.changeType = changeType; + this.meta = meta; + } + + public GUISlotChangedMessage(PacketBuffer buffer) { + this.slotID = buffer.readInt(); + this.x = buffer.readInt(); + this.y = buffer.readInt(); + this.z = buffer.readInt(); + this.changeType = buffer.readInt(); + this.meta = buffer.readInt(); + } + + public static void buffer(GUISlotChangedMessage message, PacketBuffer buffer) { + buffer.writeInt(message.slotID); + buffer.writeInt(message.x); + buffer.writeInt(message.y); + buffer.writeInt(message.z); + buffer.writeInt(message.changeType); + buffer.writeInt(message.meta); + } + + public static void handler(GUISlotChangedMessage message, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + PlayerEntity entity = context.getSender(); + int slotID = message.slotID; + int changeType = message.changeType; + int meta = message.meta; + int x = message.x; + int y = message.y; + int z = message.z; + handleSlotAction(entity, slotID, changeType, meta, x, y, z); + }); + context.setPacketHandled(true); + } + } + + static void handleButtonAction(PlayerEntity entity, int buttonID, int x, int y, int z) { + World world = entity.world; + // security measure to prevent arbitrary chunk generation + if (!world.isBlockLoaded(new BlockPos(x, y, z))) + return; + } + + private static void handleSlotAction(PlayerEntity entity, int slotID, int changeType, int meta, int x, int y, int z) { + World world = entity.world; + // security measure to prevent arbitrary chunk generation + if (!world.isBlockLoaded(new BlockPos(x, y, z))) + return; + } +} diff --git a/src/main/java/studio/halbear/hem/gui/AirboatGasCelViewGuiWindow.java b/src/main/java/studio/halbear/hem/gui/AirboatGasCelViewGuiWindow.java new file mode 100644 index 0000000..37c96b4 --- /dev/null +++ b/src/main/java/studio/halbear/hem/gui/AirboatGasCelViewGuiWindow.java @@ -0,0 +1,165 @@ + +package studio.halbear.hem.gui; + +import studio.halbear.hem.HemMod; + +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.ResourceLocation; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.client.gui.widget.button.Button; +import net.minecraft.client.gui.screen.inventory.ContainerScreen; +import net.minecraft.client.Minecraft; + +import java.util.HashMap; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.matrix.MatrixStack; + +@OnlyIn(Dist.CLIENT) +public class AirboatGasCelViewGuiWindow extends ContainerScreen { + private World world; + private int x, y, z; + private PlayerEntity entity; + private final static HashMap guistate = AirboatGasCelViewGui.guistate; + + public AirboatGasCelViewGuiWindow(AirboatGasCelViewGui.GuiContainerMod container, PlayerInventory inventory, ITextComponent text) { + super(container, inventory, text); + this.world = container.world; + this.x = container.x; + this.y = container.y; + this.z = container.z; + this.entity = container.entity; + this.xSize = 428; + this.ySize = 166; + } + + private static final ResourceLocation texture = new ResourceLocation("hem:textures/screens/airboat_gas_cel_view.png"); + + @Override + public void render(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { + this.renderBackground(ms); + super.render(ms, mouseX, mouseY, partialTicks); + this.renderHoveredTooltip(ms, mouseX, mouseY); + } + + @Override + protected void drawGuiContainerBackgroundLayer(MatrixStack ms, float partialTicks, int gx, int gy) { + RenderSystem.color4f(1, 1, 1, 1); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + Minecraft.getInstance().getTextureManager().bindTexture(texture); + int k = (this.width - this.xSize) / 2; + int l = (this.height - this.ySize) / 2; + this.blit(ms, k, l, 0, 0, this.xSize, this.ySize, this.xSize, this.ySize); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/airshipheliumui.png")); + this.blit(ms, this.guiLeft + 2, this.guiTop + 3, 0, 0, 256, 139, 256, 139); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/heliumfilluibottom.png")); + this.blit(ms, this.guiLeft + 61, this.guiTop + 96, 0, 0, 22, 5, 22, 5); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/heliumfilluiprogress.png")); + this.blit(ms, this.guiLeft + 61, this.guiTop + 90, 0, 0, 22, 6, 22, 6); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/heliumfilluitop.png")); + this.blit(ms, this.guiLeft + 61, this.guiTop + 85, 0, 0, 22, 5, 22, 5); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/heliumfilluibottom.png")); + this.blit(ms, this.guiLeft + 85, this.guiTop + 96, 0, 0, 22, 5, 22, 5); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/heliumfilluitop.png")); + this.blit(ms, this.guiLeft + 85, this.guiTop + 85, 0, 0, 22, 5, 22, 5); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/heliumfilluiprogress.png")); + this.blit(ms, this.guiLeft + 85, this.guiTop + 90, 0, 0, 22, 6, 22, 6); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/heliumfilluibottom.png")); + this.blit(ms, this.guiLeft + 37, this.guiTop + 92, 0, 0, 22, 5, 22, 5); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/heliumfilluitop.png")); + this.blit(ms, this.guiLeft + 37, this.guiTop + 81, 0, 0, 22, 5, 22, 5); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/heliumfilluiprogress.png")); + this.blit(ms, this.guiLeft + 37, this.guiTop + 86, 0, 0, 22, 6, 22, 6); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/heliumfilluibottom.png")); + this.blit(ms, this.guiLeft + 109, this.guiTop + 96, 0, 0, 22, 5, 22, 5); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/heliumfilluibottom.png")); + this.blit(ms, this.guiLeft + 133, this.guiTop + 96, 0, 0, 22, 5, 22, 5); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/heliumfilluibottom.png")); + this.blit(ms, this.guiLeft + 157, this.guiTop + 92, 0, 0, 22, 5, 22, 5); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/heliumfilluibottom.png")); + this.blit(ms, this.guiLeft + 181, this.guiTop + 86, 0, 0, 22, 5, 22, 5); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/heliumfilluiprogress.png")); + this.blit(ms, this.guiLeft + 109, this.guiTop + 90, 0, 0, 22, 6, 22, 6); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/heliumfilluiprogress.png")); + this.blit(ms, this.guiLeft + 133, this.guiTop + 90, 0, 0, 22, 6, 22, 6); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/heliumfilluiprogress.png")); + this.blit(ms, this.guiLeft + 157, this.guiTop + 86, 0, 0, 22, 6, 22, 6); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/heliumfilluiprogress.png")); + this.blit(ms, this.guiLeft + 181, this.guiTop + 80, 0, 0, 22, 6, 22, 6); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/heliumfilluitop.png")); + this.blit(ms, this.guiLeft + 109, this.guiTop + 85, 0, 0, 22, 5, 22, 5); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/heliumfilluitop.png")); + this.blit(ms, this.guiLeft + 133, this.guiTop + 85, 0, 0, 22, 5, 22, 5); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/heliumfilluitop.png")); + this.blit(ms, this.guiLeft + 157, this.guiTop + 81, 0, 0, 22, 5, 22, 5); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/heliumfilluitop.png")); + this.blit(ms, this.guiLeft + 181, this.guiTop + 75, 0, 0, 22, 5, 22, 5); + + RenderSystem.disableBlend(); + } + + @Override + public boolean keyPressed(int key, int b, int c) { + if (key == 256) { + this.minecraft.player.closeScreen(); + return true; + } + return super.keyPressed(key, b, c); + } + + @Override + public void tick() { + super.tick(); + } + + @Override + protected void drawGuiContainerForegroundLayer(MatrixStack ms, int mouseX, int mouseY) { + } + + @Override + public void onClose() { + super.onClose(); + Minecraft.getInstance().keyboardListener.enableRepeatEvents(false); + } + + @Override + public void init(Minecraft minecraft, int width, int height) { + super.init(minecraft, width, height); + minecraft.keyboardListener.enableRepeatEvents(true); + this.addButton(new Button(this.guiLeft + 260, this.guiTop + 62, 92, 20, new StringTextComponent("Fill Gas Cels"), e -> { + if (true) { + HemMod.PACKET_HANDLER.sendToServer(new AirboatGasCelViewGui.ButtonPressedMessage(0, x, y, z)); + AirboatGasCelViewGui.handleButtonAction(entity, 0, x, y, z); + } + })); + } +} diff --git a/src/main/java/studio/halbear/hem/gui/overlay/AltimeterOverlay.java b/src/main/java/studio/halbear/hem/gui/overlay/AltimeterOverlay.java new file mode 100644 index 0000000..1a582cb --- /dev/null +++ b/src/main/java/studio/halbear/hem/gui/overlay/AltimeterOverlay.java @@ -0,0 +1,106 @@ + +package studio.halbear.hem.gui.overlay; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; +import studio.halbear.hem.HemModVariables; + +import net.minecraft.world.World; +import net.minecraft.util.ResourceLocation; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.client.Minecraft; +import net.minecraft.tags.EntityTypeTags; + + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.platform.GlStateManager; + +@Mod.EventBusSubscriber +public class AltimeterOverlay { + static ResourceLocation[] AltimeterNumbers = new ResourceLocation[10]; + static ResourceLocation[] AltimeterNumbersDecimal = new ResourceLocation[10]; + static{ + for(int i = 0; i < 10; i++){ + AltimeterNumbers[i] = new ResourceLocation("hem:textures/screens/odometernumber"+i+ ".png"); + AltimeterNumbersDecimal[i] = new ResourceLocation("hem:textures/screens/odometernumberdecimal"+i+ ".png"); + } + } + @OnlyIn(Dist.CLIENT) + @SubscribeEvent(priority = EventPriority.NORMAL) + public static void eventHandler(RenderGameOverlayEvent.Post event) { + if (event.getType() == RenderGameOverlayEvent.ElementType.HELMET) { + int w = event.getWindow().getScaledWidth(); + int h = event.getWindow().getScaledHeight(); + int posX = w / 2; + int posY = h / 2; + World _world = null; + double _x = 0; + double _y = 0; + double _z = 0; + PlayerEntity entity = Minecraft.getInstance().player; + if (entity != null) { + _world = entity.world; + _x = entity.getPosX(); + _y = entity.getPosY(); + _z = entity.getPosZ(); + } + World world = _world; + double x = _x; + double y = _y; + double z = _z; + RenderSystem.disableDepthTest(); + RenderSystem.depthMask(false); + RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, + GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); + RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + RenderSystem.disableAlphaTest(); + if (entity.isPassenger() && EntityTypeTags.getCollection().getTagByID(new ResourceLocation("hem:hem_altitude_vehicles")) + .contains((entity.getRidingEntity()).getType())) { + String AltimeterValue = ""; + if((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new HemModVariables.PlayerVariables())).Altimeter < 9999.9){ + AltimeterValue = String.valueOf(Math.max(Math.round((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new HemModVariables.PlayerVariables())).Altimeter * 10.0),0)/10.0); + } else{ + AltimeterValue = "9999.9"; + } + AltimeterValue = AltimeterValue.replace(".", ""); + char[] OdemeterValues = AltimeterValue.toCharArray(); + int[] indexes = new int[5]; + for(int i = 5; i > 0; i--){ + if(i <= OdemeterValues.length){ + indexes[5 - i] = Integer.parseInt("" + OdemeterValues[OdemeterValues.length - i]); + } else{ + indexes[5 - i] = 0; + } + } + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/altimeter.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), w - (h/8)*6, h/12, 0, 0, (h/6)*2, h/6, (h/6)*2, h/6); + + Minecraft.getInstance().getTextureManager().bindTexture(AltimeterNumbers[indexes[0]]); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), w - (h/8)*6 + (h/6)*2*8/128, h/12 + (h/6)*19/64, 0, 0, (h/6)* 20/64, (h/6) * 37/64, (h/6)* 20/64, (h/6) * 37/64); + + Minecraft.getInstance().getTextureManager().bindTexture(AltimeterNumbers[indexes[1]]); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), w - (h/8)*6 + (h/6)*2*30/128, h/12 + (h/6)*19/64, 0, 0, (h/6)* 20/64, (h/6) * 37/64, (h/6)* 20/64, (h/6) * 37/64); + + Minecraft.getInstance().getTextureManager().bindTexture(AltimeterNumbers[indexes[2]]); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), w - (h/8)*6 + (h/6)*2*52/128, h/12 + (h/6)*19/64, 0, 0, (h/6)* 20/64, (h/6) * 37/64, (h/6)* 20/64, (h/6) * 37/64); + + Minecraft.getInstance().getTextureManager().bindTexture(AltimeterNumbers[indexes[3]]); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), w - (h/8)*6 + (h/6)*2*74/128, h/12 + (h/6)*19/64, 0, 0, (h/6)* 20/64, (h/6) * 37/64, (h/6)* 20/64, (h/6) * 37/64); + + Minecraft.getInstance().getTextureManager().bindTexture(AltimeterNumbersDecimal[indexes[4]]); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), w - (h/8)*6 + (h/6)*2*101/128,h/12 + (h/6)*19/64, 0, 0, (h/6)* 20/64, (h/6) * 37/64, (h/6)* 20/64, (h/6) * 37/64); + + + } + RenderSystem.depthMask(true); + RenderSystem.enableDepthTest(); + RenderSystem.enableAlphaTest(); + RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + } + } +} diff --git a/src/main/java/studio/halbear/hem/gui/overlay/GooedOverlayOverlay.java b/src/main/java/studio/halbear/hem/gui/overlay/GooedOverlayOverlay.java new file mode 100644 index 0000000..888908c --- /dev/null +++ b/src/main/java/studio/halbear/hem/gui/overlay/GooedOverlayOverlay.java @@ -0,0 +1,224 @@ + +package studio.halbear.hem.gui.overlay; + +import studio.halbear.hem.procedures.GooedOverlayDisplayOverlayIngameProcedure; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.util.ResourceLocation; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.client.Minecraft; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.platform.GlStateManager; + +@Mod.EventBusSubscriber +public class GooedOverlayOverlay { + @OnlyIn(Dist.CLIENT) + @SubscribeEvent(priority = EventPriority.HIGHEST) + public static void eventHandler(RenderGameOverlayEvent.Post event) { + if (event.getType() == RenderGameOverlayEvent.ElementType.HELMET) { + int w = event.getWindow().getScaledWidth(); + int h = event.getWindow().getScaledHeight(); + int posX = w / 2; + int posY = h / 2; + World _world = null; + double _x = 0; + double _y = 0; + double _z = 0; + PlayerEntity entity = Minecraft.getInstance().player; + if (entity != null) { + _world = entity.world; + _x = entity.getPosX(); + _y = entity.getPosY(); + _z = entity.getPosZ(); + } + World world = _world; + double x = _x; + double y = _y; + double z = _z; + RenderSystem.disableDepthTest(); + RenderSystem.depthMask(false); + RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, + GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); + RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + RenderSystem.disableAlphaTest(); + if (GooedOverlayDisplayOverlayIngameProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll))) { + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/transparentgreen.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), 0, 0, 0, 0, w, h, w, h); + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed1.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -110, posY + 20, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed2.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + 106, posY + -79, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed1.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -151, posY + -59, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed1.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + 118, posY + 65, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed2.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -162, posY + 61, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed2.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -35, posY + -61, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed1.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -189, posY + -92, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed2.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + 32, posY + 74, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed3.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -200, posY + 9, 0, 0, 32, 32, 32, 32); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed3.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + 124, posY + -34, 0, 0, 32, 32, 32, 32); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed3.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -80, posY + -81, 0, 0, 32, 32, 32, 32); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed1.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -29, posY + 77, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + 181, posY + -57, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -177, posY + -34, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + 15, posY + -102, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + 75, posY + 27, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -128, posY + 93, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -126, posY + -106, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + 157, posY + -89, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed1.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + 75, posY + -27, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed3.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + 65, posY + 80, 0, 0, 32, 32, 32, 32); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed3.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -227, posY + -135, 0, 0, 32, 32, 32, 32); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed1.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + 76, posY + -141, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed3.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + 211, posY + 78, 0, 0, 32, 32, 32, 32); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed3.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -259, posY + 85, 0, 0, 32, 32, 32, 32); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed3.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -100, posY + 112, 0, 0, 32, 32, 32, 32); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed2.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -115, posY + -137, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -22, posY + -131, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -254, posY + -65, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + 219, posY + 67, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -152, posY + 13, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + 31, posY + -46, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed3.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + 11, posY + 23, 0, 0, 32, 32, 32, 32); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed2.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -35, posY + 25, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed1.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -48, posY + -6, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed2.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -72, posY + 21, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed1.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -9, posY + 44, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed3.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -70, posY + 60, 0, 0, 32, 32, 32, 32); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -92, posY + 60, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + 61, posY + -86, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + 35, posY + 1, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed2.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -82, posY + -27, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed2.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -33, posY + -35, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed2.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + 5, posY + 3, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed1.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -82, posY + 3, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + 158, posY + 21, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed3.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + 191, posY + 46, 0, 0, 32, 32, 32, 32); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed1.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -121, posY + -26, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed3.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + -217, posY + 85, 0, 0, 32, 32, 32, 32); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + 182, posY + 96, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed2.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + 189, posY + -116, 0, 0, 16, 16, 16, 16); + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/gooed1.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), posX + 89, posY + -119, 0, 0, 16, 16, 16, 16); + + } + RenderSystem.depthMask(true); + RenderSystem.enableDepthTest(); + RenderSystem.enableAlphaTest(); + RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + } + } +} diff --git a/src/main/java/studio/halbear/hem/gui/overlay/HotAirBalloonUIOverlay.java b/src/main/java/studio/halbear/hem/gui/overlay/HotAirBalloonUIOverlay.java new file mode 100644 index 0000000..3f740be --- /dev/null +++ b/src/main/java/studio/halbear/hem/gui/overlay/HotAirBalloonUIOverlay.java @@ -0,0 +1,52 @@ + +package studio.halbear.hem.gui.overlay; + +import studio.halbear.hem.procedures.HotAirBalloonUIDisplayOverlayIngame2Procedure; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.client.Minecraft; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@Mod.EventBusSubscriber +public class HotAirBalloonUIOverlay { + @OnlyIn(Dist.CLIENT) + @SubscribeEvent(priority = EventPriority.HIGH) + public static void eventHandler(RenderGameOverlayEvent.Post event) { + if (event.getType() == RenderGameOverlayEvent.ElementType.HELMET) { + int w = event.getWindow().getScaledWidth(); + int h = event.getWindow().getScaledHeight(); + int posX = w / 2; + int posY = h / 2; + World _world = null; + double _x = 0; + double _y = 0; + double _z = 0; + PlayerEntity entity = Minecraft.getInstance().player; + if (entity != null) { + _world = entity.world; + _x = entity.getPosX(); + _y = entity.getPosY(); + _z = entity.getPosZ(); + } + World world = _world; + double x = _x; + double y = _y; + double z = _z; + if (HotAirBalloonUIDisplayOverlayIngame2Procedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll))) { + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/gui/overlay/OdometerOverlay.java b/src/main/java/studio/halbear/hem/gui/overlay/OdometerOverlay.java new file mode 100644 index 0000000..6b47224 --- /dev/null +++ b/src/main/java/studio/halbear/hem/gui/overlay/OdometerOverlay.java @@ -0,0 +1,105 @@ + +package studio.halbear.hem.gui.overlay; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; +import studio.halbear.hem.HemModVariables; +import net.minecraft.tags.EntityTypeTags; + + +import net.minecraft.world.World; +import net.minecraft.util.ResourceLocation; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.client.Minecraft; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.platform.GlStateManager; + +@Mod.EventBusSubscriber +public class OdometerOverlay { + static ResourceLocation[] OdometerNumbers = new ResourceLocation[10]; + static ResourceLocation[] OdometerNumbersDecimal = new ResourceLocation[10]; + static{ + for(int i = 0; i < 10; i++){ + OdometerNumbers[i] = new ResourceLocation("hem:textures/screens/odometernumber"+i+ ".png"); + OdometerNumbersDecimal[i] = new ResourceLocation("hem:textures/screens/odometernumberdecimal"+i+ ".png"); + } + } + @OnlyIn(Dist.CLIENT) + @SubscribeEvent(priority = EventPriority.NORMAL) + public static void eventHandler(RenderGameOverlayEvent.Post event) { + if (event.getType() == RenderGameOverlayEvent.ElementType.HELMET) { + int w = event.getWindow().getScaledWidth(); + int h = event.getWindow().getScaledHeight(); + int posX = w / 2; + int posY = h / 2; + World _world = null; + double _x = 0; + double _y = 0; + double _z = 0; + PlayerEntity entity = Minecraft.getInstance().player; + if (entity != null) { + _world = entity.world; + _x = entity.getPosX(); + _y = entity.getPosY(); + _z = entity.getPosZ(); + } + World world = _world; + double x = _x; + double y = _y; + double z = _z; + RenderSystem.disableDepthTest(); + RenderSystem.depthMask(false); + RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, + GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); + RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + RenderSystem.disableAlphaTest(); + if (entity.isPassenger() && EntityTypeTags.getCollection().getTagByID(new ResourceLocation("hem:hem_odometer_vehicles")) + .contains((entity.getRidingEntity()).getType())) { + String OdometerValue = ""; + if((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new HemModVariables.PlayerVariables())).VehicleOdometer < 9999.9){ + OdometerValue = String.valueOf(Math.round((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new HemModVariables.PlayerVariables())).VehicleOdometer * 10.0)/10.0); + } else{ + OdometerValue = "9999.9"; + } + OdometerValue = OdometerValue.replace(".", ""); + char[] OdemeterValues = OdometerValue.toCharArray(); + int[] indexes = new int[5]; + for(int i = 5; i > 0; i--){ + if(i <= OdemeterValues.length){ + indexes[5 - i] = Integer.parseInt("" + OdemeterValues[OdemeterValues.length - i]); + } else{ + indexes[5 - i] = 0; + } + } + + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/odometer.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), w - (h/8)*3, h/12, 0, 0, (h/6)*2, h/6, (h/6)*2, h/6); + + Minecraft.getInstance().getTextureManager().bindTexture(OdometerNumbers[indexes[0]]); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), w - (h/8)*3 + (h/6)*2*8/128, h/12 + (h/6)*19/64, 0, 0, (h/6)* 20/64, (h/6) * 37/64, (h/6)* 20/64, (h/6) * 37/64); + + Minecraft.getInstance().getTextureManager().bindTexture(OdometerNumbers[indexes[1]]); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), w - (h/8)*3 + (h/6)*2*30/128, h/12 + (h/6)*19/64, 0, 0, (h/6)* 20/64, (h/6) * 37/64, (h/6)* 20/64, (h/6) * 37/64); + + Minecraft.getInstance().getTextureManager().bindTexture(OdometerNumbers[indexes[2]]); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), w - (h/8)*3 + (h/6)*2*52/128, h/12 + (h/6)*19/64, 0, 0, (h/6)* 20/64, (h/6) * 37/64, (h/6)* 20/64, (h/6) * 37/64); + + Minecraft.getInstance().getTextureManager().bindTexture(OdometerNumbers[indexes[3]]); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), w - (h/8)*3 + (h/6)*2*74/128, h/12 + (h/6)*19/64, 0, 0, (h/6)* 20/64, (h/6) * 37/64, (h/6)* 20/64, (h/6) * 37/64); + + Minecraft.getInstance().getTextureManager().bindTexture(OdometerNumbersDecimal[indexes[4]]); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), w - (h/8)*3 + (h/6)*2*101/128,h/12 + (h/6)*19/64, 0, 0, (h/6)* 20/64, (h/6) * 37/64, (h/6)* 20/64, (h/6) * 37/64); + + } + RenderSystem.depthMask(true); + RenderSystem.enableDepthTest(); + RenderSystem.enableAlphaTest(); + RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + } + } +} diff --git a/src/main/java/studio/halbear/hem/gui/overlay/PressureGaugeOverlay.java b/src/main/java/studio/halbear/hem/gui/overlay/PressureGaugeOverlay.java new file mode 100644 index 0000000..1a17101 --- /dev/null +++ b/src/main/java/studio/halbear/hem/gui/overlay/PressureGaugeOverlay.java @@ -0,0 +1,79 @@ + +package studio.halbear.hem.gui.overlay; + +import studio.halbear.hem.HemModVariables; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.util.ResourceLocation; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.client.Minecraft; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; +import net.minecraft.tags.EntityTypeTags; + + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.platform.GlStateManager; + +@Mod.EventBusSubscriber +public class PressureGaugeOverlay { + static ResourceLocation[] GaugeTextures = new ResourceLocation[32]; + static{ + for(int i = 0; i < 32; i++){ + GaugeTextures[i] = new ResourceLocation("hem:textures/screens/hotairballoonpressureguage"+i+ ".png"); + } + } + @OnlyIn(Dist.CLIENT) + @SubscribeEvent(priority = EventPriority.HIGH) + public static void eventHandler(RenderGameOverlayEvent.Post event) { + if (event.getType() == RenderGameOverlayEvent.ElementType.HELMET) { + int w = event.getWindow().getScaledWidth(); + int h = event.getWindow().getScaledHeight(); + int posX = w / 2; + int posY = h / 2; + World _world = null; + double _x = 0; + double _y = 0; + double _z = 0; + PlayerEntity entity = Minecraft.getInstance().player; + if (entity != null) { + _world = entity.world; + _x = entity.getPosX(); + _y = entity.getPosY(); + _z = entity.getPosZ(); + } + World world = _world; + double x = _x; + double y = _y; + double z = _z; + RenderSystem.disableDepthTest(); + RenderSystem.depthMask(false); + RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, + GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); + RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + RenderSystem.disableAlphaTest(); + if (entity.isPassenger() && EntityTypeTags.getCollection().getTagByID(new ResourceLocation("hem:hem_pressure_vehicles")) + .contains((entity.getRidingEntity()).getType())) { + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/pipe.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), w/20 + h/6,h- (int)(h/5.5), 0, 0, h/6, (h/6)*4, h/6, (h/6)*4); + int Index = (int)Math.floor((Math.floor(32 * ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new HemModVariables.PlayerVariables())).PSI/50.0)) % 32.0)); + Minecraft.getInstance().getTextureManager() .bindTexture(GaugeTextures[Index]); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), w/20 + h/6,h- (int)(h/5.5), 0, 0, h/6, h/6, h/6, h/6); + } + RenderSystem.depthMask(true); + RenderSystem.enableDepthTest(); + RenderSystem.enableAlphaTest(); + RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + } + } +} diff --git a/src/main/java/studio/halbear/hem/gui/overlay/SpeedGaugeOverlay.java b/src/main/java/studio/halbear/hem/gui/overlay/SpeedGaugeOverlay.java new file mode 100644 index 0000000..bcee0be --- /dev/null +++ b/src/main/java/studio/halbear/hem/gui/overlay/SpeedGaugeOverlay.java @@ -0,0 +1,78 @@ + +package studio.halbear.hem.gui.overlay; + +import studio.halbear.hem.HemModVariables; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.util.ResourceLocation; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.client.Minecraft; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + import net.minecraft.tags.EntityTypeTags; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.platform.GlStateManager; + +@Mod.EventBusSubscriber +public class SpeedGaugeOverlay { + static ResourceLocation[] GaugeTextures = new ResourceLocation[32]; + static{ + for(int i = 0; i < 32; i++){ + GaugeTextures[i] = new ResourceLocation("hem:textures/screens/speedgauge"+i+ ".png"); + } + } + @OnlyIn(Dist.CLIENT) + @SubscribeEvent(priority = EventPriority.NORMAL) + public static void eventHandler(RenderGameOverlayEvent.Post event) { + if (event.getType() == RenderGameOverlayEvent.ElementType.HELMET) { + int w = event.getWindow().getScaledWidth(); + int h = event.getWindow().getScaledHeight(); + int posX = w / 2; + int posY = h / 2; + World _world = null; + double _x = 0; + double _y = 0; + double _z = 0; + PlayerEntity entity = Minecraft.getInstance().player; + if (entity != null) { + _world = entity.world; + _x = entity.getPosX(); + _y = entity.getPosY(); + _z = entity.getPosZ(); + } + World world = _world; + double x = _x; + double y = _y; + double z = _z; + RenderSystem.disableDepthTest(); + RenderSystem.depthMask(false); + RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, + GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); + RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + RenderSystem.disableAlphaTest(); + if (entity.isPassenger() && EntityTypeTags.getCollection().getTagByID(new ResourceLocation("hem:hem_speed_vehicles")) + .contains((entity.getRidingEntity()).getType())) { + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/pipe.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), w - (h/6)*3, h- (int)(h/5), 0, 0, h/6, (h/6)*4, h/6, (h/6)*4); + int Index = (int)Math.floor((Math.floor(32 * ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new HemModVariables.PlayerVariables())).MPH/80.0)) % 32.0)); + Minecraft.getInstance().getTextureManager().bindTexture(GaugeTextures[Index]); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), w - (h/6)*3, h- (int)(h/5), 0, 0, h/6, h/6, h/6, h/6); + } + RenderSystem.depthMask(true); + RenderSystem.enableDepthTest(); + RenderSystem.enableAlphaTest(); + RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + } + } +} diff --git a/src/main/java/studio/halbear/hem/gui/overlay/TemperatureGaugeOverlay.java b/src/main/java/studio/halbear/hem/gui/overlay/TemperatureGaugeOverlay.java new file mode 100644 index 0000000..35ff991 --- /dev/null +++ b/src/main/java/studio/halbear/hem/gui/overlay/TemperatureGaugeOverlay.java @@ -0,0 +1,79 @@ + +package studio.halbear.hem.gui.overlay; + +import studio.halbear.hem.HemModVariables; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.util.ResourceLocation; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.client.Minecraft; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; +import net.minecraft.tags.EntityTypeTags; + + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.platform.GlStateManager; + +@Mod.EventBusSubscriber +public class TemperatureGaugeOverlay { + static ResourceLocation[] GaugeTextures = new ResourceLocation[32]; + static{ + for(int i = 0; i < 32; i++){ + GaugeTextures[i] = new ResourceLocation("hem:textures/screens/tempgauge"+i+ ".png"); + } + } + @OnlyIn(Dist.CLIENT) + @SubscribeEvent(priority = EventPriority.HIGH) + public static void eventHandler(RenderGameOverlayEvent.Post event) { + if (event.getType() == RenderGameOverlayEvent.ElementType.HELMET) { + int w = event.getWindow().getScaledWidth(); + int h = event.getWindow().getScaledHeight(); + int posX = w / 2; + int posY = h / 2; + World _world = null; + double _x = 0; + double _y = 0; + double _z = 0; + PlayerEntity entity = Minecraft.getInstance().player; + if (entity != null) { + _world = entity.world; + _x = entity.getPosX(); + _y = entity.getPosY(); + _z = entity.getPosZ(); + } + World world = _world; + double x = _x; + double y = _y; + double z = _z; + RenderSystem.disableDepthTest(); + RenderSystem.depthMask(false); + RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, + GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); + RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + RenderSystem.disableAlphaTest(); + if (entity.isPassenger() && EntityTypeTags.getCollection().getTagByID(new ResourceLocation("hem:hem_heat_vehicles")) + .contains((entity.getRidingEntity()).getType())) { + Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("hem:textures/screens/pipe.png")); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), (int)(w/20) + (int)((h/6) *1.8),h- (int)(h/6.5), 0, 0, h/6, (h/6)*4, h/6, (h/6)*4); + int Index = (int)Math.max(Math.floor((Math.floor(32 * ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new HemModVariables.PlayerVariables())).Heat/160.0)) % 32.0)),0); + Minecraft.getInstance().getTextureManager().bindTexture(GaugeTextures[Index]); + Minecraft.getInstance().ingameGUI.blit(event.getMatrixStack(), (int)(w/20) + (int)((h/6) *1.8),h- (int)(h/3.5), 0, 0, h/6, h/6, h/6, h/6); + } + RenderSystem.depthMask(true); + RenderSystem.enableDepthTest(); + RenderSystem.enableAlphaTest(); + RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + } + } +} diff --git a/src/main/java/studio/halbear/hem/item/BlueleafItem.java b/src/main/java/studio/halbear/hem/item/BlueleafItem.java new file mode 100644 index 0000000..3780594 --- /dev/null +++ b/src/main/java/studio/halbear/hem/item/BlueleafItem.java @@ -0,0 +1,46 @@ + +package studio.halbear.hem.item; + +import studio.halbear.hem.world.dimension.BlueleafDimension; + +import net.minecraftforge.registries.ObjectHolder; + +import net.minecraft.world.World; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ActionResultType; +import net.minecraft.item.ItemUseContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.Item; +import net.minecraft.entity.player.PlayerEntity; + +public class BlueleafItem extends Item { + @ObjectHolder("hem:blueleaf") + public static final Item block = null; + + public BlueleafItem() { + super(new Item.Properties().group(ItemGroup.TOOLS).maxDamage(64)); + } + + @Override + public ActionResultType onItemUse(ItemUseContext context) { + PlayerEntity entity = context.getPlayer(); + BlockPos pos = context.getPos().offset(context.getFace()); + ItemStack itemstack = context.getItem(); + World world = context.getWorld(); + if (!entity.canPlayerEdit(pos, context.getFace(), itemstack)) { + return ActionResultType.FAIL; + } else { + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + boolean success = false; + if (world.isAirBlock(pos) && true) { + BlueleafDimension.portal.portalSpawn(world, pos); + itemstack.damageItem(1, entity, c -> c.sendBreakAnimation(context.getHand())); + success = true; + } + return success ? ActionResultType.SUCCESS : ActionResultType.FAIL; + } + } +} diff --git a/src/main/java/studio/halbear/hem/item/ButterflySpawnEggItem.java b/src/main/java/studio/halbear/hem/item/ButterflySpawnEggItem.java new file mode 100644 index 0000000..7a73eca --- /dev/null +++ b/src/main/java/studio/halbear/hem/item/ButterflySpawnEggItem.java @@ -0,0 +1,77 @@ + +package studio.halbear.hem.item; + +import studio.halbear.hem.procedures.ButterflySpawnEggUseOnBlockProcedure; +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; + +import net.minecraft.world.World; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Direction; +import net.minecraft.util.ActionResultType; +import net.minecraft.item.Rarity; +import net.minecraft.item.ItemUseContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.block.BlockState; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class ButterflySpawnEggItem extends HemModElements.ModElement { + @ObjectHolder("hem:butterfly_spawn_egg") + public static final Item block = null; + + public ButterflySpawnEggItem(HemModElements instance) { + super(instance, 43); + } + + @Override + public void initElements() { + elements.items.add(() -> new ItemCustom()); + } + + public static class ItemCustom extends Item { + public ItemCustom() { + super(new Item.Properties().group(BlueleafTabItemGroup.tab).maxStackSize(64).rarity(Rarity.COMMON)); + setRegistryName("butterfly_spawn_egg"); + } + + @Override + public int getItemEnchantability() { + return 0; + } + + @Override + public float getDestroySpeed(ItemStack par1ItemStack, BlockState par2Block) { + return 1F; + } + + @Override + public ActionResultType onItemUseFirst(ItemStack stack, ItemUseContext context) { + ActionResultType retval = super.onItemUseFirst(stack, context); + World world = context.getWorld(); + BlockPos pos = context.getPos(); + PlayerEntity entity = context.getPlayer(); + Direction direction = context.getFace(); + BlockState blockstate = world.getBlockState(pos); + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + ItemStack itemstack = context.getItem(); + + ButterflySpawnEggUseOnBlockProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity), + new AbstractMap.SimpleEntry<>("itemstack", itemstack)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + return retval; + } + } +} diff --git a/src/main/java/studio/halbear/hem/item/FluffaloTuftItem.java b/src/main/java/studio/halbear/hem/item/FluffaloTuftItem.java new file mode 100644 index 0000000..68e59c5 --- /dev/null +++ b/src/main/java/studio/halbear/hem/item/FluffaloTuftItem.java @@ -0,0 +1,44 @@ + +package studio.halbear.hem.item; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; + +import net.minecraft.item.Rarity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.block.BlockState; + +@HemModElements.ModElement.Tag +public class FluffaloTuftItem extends HemModElements.ModElement { + @ObjectHolder("hem:fluffalo_tuft") + public static final Item block = null; + + public FluffaloTuftItem(HemModElements instance) { + super(instance, 273); + } + + @Override + public void initElements() { + elements.items.add(() -> new ItemCustom()); + } + + public static class ItemCustom extends Item { + public ItemCustom() { + super(new Item.Properties().group(BlueleafTabItemGroup.tab).maxStackSize(64).rarity(Rarity.COMMON)); + setRegistryName("fluffalo_tuft"); + } + + @Override + public int getItemEnchantability() { + return 0; + } + + @Override + public float getDestroySpeed(ItemStack par1ItemStack, BlockState par2Block) { + return 1F; + } + } +} diff --git a/src/main/java/studio/halbear/hem/item/GasCanister612litreItem.java b/src/main/java/studio/halbear/hem/item/GasCanister612litreItem.java new file mode 100644 index 0000000..a0b6f85 --- /dev/null +++ b/src/main/java/studio/halbear/hem/item/GasCanister612litreItem.java @@ -0,0 +1,87 @@ + +package studio.halbear.hem.item; + +import studio.halbear.hem.procedures.GasCanister612litreItemIsCraftedsmeltedProcedure; +import studio.halbear.hem.procedures.GasCanister612litreItemInInventoryTickProcedure; +import studio.halbear.hem.itemgroup.HalsExplorationModTechItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; + +import net.minecraft.world.World; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.item.Rarity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.Entity; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.block.BlockState; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.List; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class GasCanister612litreItem extends HemModElements.ModElement { + @ObjectHolder("hem:gas_canister_612litre") + public static final Item block = null; + + public GasCanister612litreItem(HemModElements instance) { + super(instance, 308); + } + + @Override + public void initElements() { + elements.items.add(() -> new ItemCustom()); + } + + public static class ItemCustom extends Item { + public ItemCustom() { + super(new Item.Properties().group(HalsExplorationModTechItemGroup.tab).maxStackSize(64).rarity(Rarity.COMMON)); + setRegistryName("gas_canister_612litre"); + } + + @Override + public int getItemEnchantability() { + return 0; + } + + @Override + public float getDestroySpeed(ItemStack par1ItemStack, BlockState par2Block) { + return 1F; + } + + @Override + public void addInformation(ItemStack itemstack, World world, List list, ITooltipFlag flag) { + super.addInformation(itemstack, world, list, flag); + list.add(new StringTextComponent("612 Litres")); + } + + @Override + public void onCreated(ItemStack itemstack, World world, PlayerEntity entity) { + super.onCreated(itemstack, world, entity); + double x = entity.getPosX(); + double y = entity.getPosY(); + double z = entity.getPosZ(); + + GasCanister612litreItemIsCraftedsmeltedProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("itemstack", itemstack)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + + @Override + public void inventoryTick(ItemStack itemstack, World world, Entity entity, int slot, boolean selected) { + super.inventoryTick(itemstack, world, entity, slot, selected); + double x = entity.getPosX(); + double y = entity.getPosY(); + double z = entity.getPosZ(); + + GasCanister612litreItemInInventoryTickProcedure.executeProcedure( + Stream.of(new AbstractMap.SimpleEntry<>("entity", entity), new AbstractMap.SimpleEntry<>("itemstack", itemstack)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/item/GoldFishItemItem.java b/src/main/java/studio/halbear/hem/item/GoldFishItemItem.java new file mode 100644 index 0000000..27d2205 --- /dev/null +++ b/src/main/java/studio/halbear/hem/item/GoldFishItemItem.java @@ -0,0 +1,68 @@ + +package studio.halbear.hem.item; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; + +import net.minecraft.world.World; +import net.minecraft.item.Rarity; +import net.minecraft.item.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.Food; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.block.BlockState; + +@HemModElements.ModElement.Tag +public class GoldFishItemItem extends HemModElements.ModElement { + @ObjectHolder("hem:gold_fish_item") + public static final Item block = null; + + public GoldFishItemItem(HemModElements instance) { + super(instance, 54); + } + + @Override + public void initElements() { + elements.items.add(() -> new ItemCustom()); + } + + public static class ItemCustom extends Item { + public ItemCustom() { + super(new Item.Properties().group(BlueleafTabItemGroup.tab).maxStackSize(64).rarity(Rarity.COMMON) + .food((new Food.Builder()).hunger(1).saturation(0.3f) + + .meat().build())); + setRegistryName("gold_fish_item"); + } + + @Override + public int getItemEnchantability() { + return 0; + } + + @Override + public float getDestroySpeed(ItemStack par1ItemStack, BlockState par2Block) { + return 1F; + } + + @Override + public ItemStack onItemUseFinish(ItemStack itemstack, World world, LivingEntity entity) { + ItemStack retval = new ItemStack(Items.BONE); + super.onItemUseFinish(itemstack, world, entity); + if (itemstack.isEmpty()) { + return retval; + } else { + if (entity instanceof PlayerEntity) { + PlayerEntity player = (PlayerEntity) entity; + if (!player.isCreative() && !player.inventory.addItemStackToInventory(retval)) + player.dropItem(retval, false); + } + return itemstack; + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/item/HotAirBalloonItemItem.java b/src/main/java/studio/halbear/hem/item/HotAirBalloonItemItem.java new file mode 100644 index 0000000..503c64a --- /dev/null +++ b/src/main/java/studio/halbear/hem/item/HotAirBalloonItemItem.java @@ -0,0 +1,76 @@ + +package studio.halbear.hem.item; + +import studio.halbear.hem.procedures.HotAirBalloonItemRightclickedOnBlockProcedure; +import studio.halbear.hem.itemgroup.HalsExplorationModTechItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; + +import net.minecraft.world.World; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Direction; +import net.minecraft.util.ActionResultType; +import net.minecraft.item.Rarity; +import net.minecraft.item.ItemUseContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.block.BlockState; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class HotAirBalloonItemItem extends HemModElements.ModElement { + @ObjectHolder("hem:hot_air_balloon_item") + public static final Item block = null; + + public HotAirBalloonItemItem(HemModElements instance) { + super(instance, 277); + } + + @Override + public void initElements() { + elements.items.add(() -> new ItemCustom()); + } + + public static class ItemCustom extends Item { + public ItemCustom() { + super(new Item.Properties().group(HalsExplorationModTechItemGroup.tab).maxStackSize(1).rarity(Rarity.COMMON)); + setRegistryName("hot_air_balloon_item"); + } + + @Override + public int getItemEnchantability() { + return 0; + } + + @Override + public float getDestroySpeed(ItemStack par1ItemStack, BlockState par2Block) { + return 1F; + } + + @Override + public ActionResultType onItemUseFirst(ItemStack stack, ItemUseContext context) { + ActionResultType retval = super.onItemUseFirst(stack, context); + World world = context.getWorld(); + BlockPos pos = context.getPos(); + PlayerEntity entity = context.getPlayer(); + Direction direction = context.getFace(); + BlockState blockstate = world.getBlockState(pos); + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + ItemStack itemstack = context.getItem(); + + HotAirBalloonItemRightclickedOnBlockProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("itemstack", itemstack)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + return retval; + } + } +} diff --git a/src/main/java/studio/halbear/hem/item/LadybugSpawnEggItem.java b/src/main/java/studio/halbear/hem/item/LadybugSpawnEggItem.java new file mode 100644 index 0000000..53f7b55 --- /dev/null +++ b/src/main/java/studio/halbear/hem/item/LadybugSpawnEggItem.java @@ -0,0 +1,77 @@ + +package studio.halbear.hem.item; + +import studio.halbear.hem.procedures.LadybugSpawnEggRightclickedOnBlockProcedure; +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; + +import net.minecraft.world.World; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Direction; +import net.minecraft.util.ActionResultType; +import net.minecraft.item.Rarity; +import net.minecraft.item.ItemUseContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.block.BlockState; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class LadybugSpawnEggItem extends HemModElements.ModElement { + @ObjectHolder("hem:ladybug_spawn_egg") + public static final Item block = null; + + public LadybugSpawnEggItem(HemModElements instance) { + super(instance, 36); + } + + @Override + public void initElements() { + elements.items.add(() -> new ItemCustom()); + } + + public static class ItemCustom extends Item { + public ItemCustom() { + super(new Item.Properties().group(BlueleafTabItemGroup.tab).maxStackSize(64).rarity(Rarity.COMMON)); + setRegistryName("ladybug_spawn_egg"); + } + + @Override + public int getItemEnchantability() { + return 0; + } + + @Override + public float getDestroySpeed(ItemStack par1ItemStack, BlockState par2Block) { + return 1F; + } + + @Override + public ActionResultType onItemUseFirst(ItemStack stack, ItemUseContext context) { + ActionResultType retval = super.onItemUseFirst(stack, context); + World world = context.getWorld(); + BlockPos pos = context.getPos(); + PlayerEntity entity = context.getPlayer(); + Direction direction = context.getFace(); + BlockState blockstate = world.getBlockState(pos); + int x = pos.getX(); + int y = pos.getY(); + int z = pos.getZ(); + ItemStack itemstack = context.getItem(); + + LadybugSpawnEggRightclickedOnBlockProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity), + new AbstractMap.SimpleEntry<>("itemstack", itemstack)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + return retval; + } + } +} diff --git a/src/main/java/studio/halbear/hem/item/TigerFishItemItem.java b/src/main/java/studio/halbear/hem/item/TigerFishItemItem.java new file mode 100644 index 0000000..8381589 --- /dev/null +++ b/src/main/java/studio/halbear/hem/item/TigerFishItemItem.java @@ -0,0 +1,68 @@ + +package studio.halbear.hem.item; + +import studio.halbear.hem.itemgroup.BlueleafTabItemGroup; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; + +import net.minecraft.world.World; +import net.minecraft.item.Rarity; +import net.minecraft.item.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.item.Food; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.block.BlockState; + +@HemModElements.ModElement.Tag +public class TigerFishItemItem extends HemModElements.ModElement { + @ObjectHolder("hem:tiger_fish_item") + public static final Item block = null; + + public TigerFishItemItem(HemModElements instance) { + super(instance, 53); + } + + @Override + public void initElements() { + elements.items.add(() -> new ItemCustom()); + } + + public static class ItemCustom extends Item { + public ItemCustom() { + super(new Item.Properties().group(BlueleafTabItemGroup.tab).maxStackSize(64).rarity(Rarity.COMMON) + .food((new Food.Builder()).hunger(3).saturation(1.5f) + + .meat().build())); + setRegistryName("tiger_fish_item"); + } + + @Override + public int getItemEnchantability() { + return 0; + } + + @Override + public float getDestroySpeed(ItemStack par1ItemStack, BlockState par2Block) { + return 1F; + } + + @Override + public ItemStack onItemUseFinish(ItemStack itemstack, World world, LivingEntity entity) { + ItemStack retval = new ItemStack(Items.BONE); + super.onItemUseFinish(itemstack, world, entity); + if (itemstack.isEmpty()) { + return retval; + } else { + if (entity instanceof PlayerEntity) { + PlayerEntity player = (PlayerEntity) entity; + if (!player.isCreative() && !player.inventory.addItemStackToInventory(retval)) + player.dropItem(retval, false); + } + return itemstack; + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/itemgroup/BlueleafTabItemGroup.java b/src/main/java/studio/halbear/hem/itemgroup/BlueleafTabItemGroup.java new file mode 100644 index 0000000..a4422c0 --- /dev/null +++ b/src/main/java/studio/halbear/hem/itemgroup/BlueleafTabItemGroup.java @@ -0,0 +1,36 @@ + +package studio.halbear.hem.itemgroup; + +import studio.halbear.hem.block.BlueleafGrassBlockBlock; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemGroup; + +@HemModElements.ModElement.Tag +public class BlueleafTabItemGroup extends HemModElements.ModElement { + public BlueleafTabItemGroup(HemModElements instance) { + super(instance, 63); + } + + @Override + public void initElements() { + tab = new ItemGroup("tabblueleaf_tab") { + @OnlyIn(Dist.CLIENT) + @Override + public ItemStack createIcon() { + return new ItemStack(BlueleafGrassBlockBlock.block); + } + + @OnlyIn(Dist.CLIENT) + public boolean hasSearchBar() { + return false; + } + }; + } + + public static ItemGroup tab; +} diff --git a/src/main/java/studio/halbear/hem/itemgroup/HalsExplorationModTechItemGroup.java b/src/main/java/studio/halbear/hem/itemgroup/HalsExplorationModTechItemGroup.java new file mode 100644 index 0000000..3b9fe01 --- /dev/null +++ b/src/main/java/studio/halbear/hem/itemgroup/HalsExplorationModTechItemGroup.java @@ -0,0 +1,36 @@ + +package studio.halbear.hem.itemgroup; + +import studio.halbear.hem.item.HotAirBalloonItemItem; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemGroup; + +@HemModElements.ModElement.Tag +public class HalsExplorationModTechItemGroup extends HemModElements.ModElement { + public HalsExplorationModTechItemGroup(HemModElements instance) { + super(instance, 290); + } + + @Override + public void initElements() { + tab = new ItemGroup("tabhals_exploration_mod_tech") { + @OnlyIn(Dist.CLIENT) + @Override + public ItemStack createIcon() { + return new ItemStack(HotAirBalloonItemItem.block); + } + + @OnlyIn(Dist.CLIENT) + public boolean hasSearchBar() { + return false; + } + }; + } + + public static ItemGroup tab; +} diff --git a/src/main/java/studio/halbear/hem/keybind/OpenGasCellViewKeyBinding.java b/src/main/java/studio/halbear/hem/keybind/OpenGasCellViewKeyBinding.java new file mode 100644 index 0000000..1f3b8cd --- /dev/null +++ b/src/main/java/studio/halbear/hem/keybind/OpenGasCellViewKeyBinding.java @@ -0,0 +1,110 @@ + +package studio.halbear.hem.keybind; + +import studio.halbear.hem.procedures.OpenGasCellViewOnKeyReleasedProcedure; +import studio.halbear.hem.HemModElements; +import studio.halbear.hem.HemMod; + +import org.lwjgl.glfw.GLFW; + +import net.minecraftforge.fml.network.NetworkEvent; +import net.minecraftforge.fml.client.registry.ClientRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.client.event.InputEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.util.math.BlockPos; +import net.minecraft.network.PacketBuffer; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.client.Minecraft; + +import java.util.stream.Stream; +import java.util.function.Supplier; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class OpenGasCellViewKeyBinding extends HemModElements.ModElement { + @OnlyIn(Dist.CLIENT) + private KeyBinding keys; + private long lastpress = 0; + + public OpenGasCellViewKeyBinding(HemModElements instance) { + super(instance, 310); + elements.addNetworkMessage(KeyBindingPressedMessage.class, KeyBindingPressedMessage::buffer, KeyBindingPressedMessage::new, + KeyBindingPressedMessage::handler); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void initElements() { + keys = new KeyBinding("key.hem.open_gas_cell_view", GLFW.GLFW_KEY_O, "key.categories.hals_exploration_mod"); + ClientRegistry.registerKeyBinding(keys); + MinecraftForge.EVENT_BUS.register(this); + } + + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public void onKeyInput(InputEvent.KeyInputEvent event) { + if (Minecraft.getInstance().currentScreen == null) { + if (event.getKey() == keys.getKey().getKeyCode()) { + if (event.getAction() == GLFW.GLFW_PRESS) { + lastpress = System.currentTimeMillis(); + } else if (event.getAction() == GLFW.GLFW_RELEASE) { + int dt = (int) (System.currentTimeMillis() - lastpress); + HemMod.PACKET_HANDLER.sendToServer(new KeyBindingPressedMessage(1, dt)); + pressAction(Minecraft.getInstance().player, 1, dt); + } + } + } + } + + public static class KeyBindingPressedMessage { + int type, pressedms; + + public KeyBindingPressedMessage(int type, int pressedms) { + this.type = type; + this.pressedms = pressedms; + } + + public KeyBindingPressedMessage(PacketBuffer buffer) { + this.type = buffer.readInt(); + this.pressedms = buffer.readInt(); + } + + public static void buffer(KeyBindingPressedMessage message, PacketBuffer buffer) { + buffer.writeInt(message.type); + buffer.writeInt(message.pressedms); + } + + public static void handler(KeyBindingPressedMessage message, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + pressAction(context.getSender(), message.type, message.pressedms); + }); + context.setPacketHandled(true); + } + } + + private static void pressAction(PlayerEntity entity, int type, int pressedms) { + World world = entity.world; + double x = entity.getPosX(); + double y = entity.getPosY(); + double z = entity.getPosZ(); + // security measure to prevent arbitrary chunk generation + if (!world.isBlockLoaded(new BlockPos(x, y, z))) + return; + if (type == 1) { + + OpenGasCellViewOnKeyReleasedProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/keybind/VehicleAccelerateKeyBinding.java b/src/main/java/studio/halbear/hem/keybind/VehicleAccelerateKeyBinding.java new file mode 100644 index 0000000..d19e104 --- /dev/null +++ b/src/main/java/studio/halbear/hem/keybind/VehicleAccelerateKeyBinding.java @@ -0,0 +1,116 @@ + +package studio.halbear.hem.keybind; + +import studio.halbear.hem.procedures.VehicleAccelerateOnKeyReleasedProcedure; +import studio.halbear.hem.procedures.VehicleAccelerateOnKeyPressedProcedure; +import studio.halbear.hem.HemModElements; +import studio.halbear.hem.HemMod; + +import org.lwjgl.glfw.GLFW; + +import net.minecraftforge.fml.network.NetworkEvent; +import net.minecraftforge.fml.client.registry.ClientRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.client.event.InputEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.util.math.BlockPos; +import net.minecraft.network.PacketBuffer; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.client.Minecraft; + +import java.util.stream.Stream; +import java.util.function.Supplier; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class VehicleAccelerateKeyBinding extends HemModElements.ModElement { + @OnlyIn(Dist.CLIENT) + private KeyBinding keys; + private long lastpress = 0; + + public VehicleAccelerateKeyBinding(HemModElements instance) { + super(instance, 184); + elements.addNetworkMessage(KeyBindingPressedMessage.class, KeyBindingPressedMessage::buffer, KeyBindingPressedMessage::new, + KeyBindingPressedMessage::handler); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void initElements() { + keys = new KeyBinding("key.hem.vehicle_accelerate", GLFW.GLFW_KEY_W, "key.categories.hals_exploration_mod"); + ClientRegistry.registerKeyBinding(keys); + MinecraftForge.EVENT_BUS.register(this); + } + + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public void onKeyInput(InputEvent.KeyInputEvent event) { + if (Minecraft.getInstance().currentScreen == null) { + if (event.getKey() == keys.getKey().getKeyCode()) { + if (event.getAction() == GLFW.GLFW_PRESS) { + HemMod.PACKET_HANDLER.sendToServer(new KeyBindingPressedMessage(0, 0)); + pressAction(Minecraft.getInstance().player, 0, 0); + lastpress = System.currentTimeMillis(); + } else if (event.getAction() == GLFW.GLFW_RELEASE) { + int dt = (int) (System.currentTimeMillis() - lastpress); + HemMod.PACKET_HANDLER.sendToServer(new KeyBindingPressedMessage(1, dt)); + pressAction(Minecraft.getInstance().player, 1, dt); + } + } + } + } + + public static class KeyBindingPressedMessage { + int type, pressedms; + + public KeyBindingPressedMessage(int type, int pressedms) { + this.type = type; + this.pressedms = pressedms; + } + + public KeyBindingPressedMessage(PacketBuffer buffer) { + this.type = buffer.readInt(); + this.pressedms = buffer.readInt(); + } + + public static void buffer(KeyBindingPressedMessage message, PacketBuffer buffer) { + buffer.writeInt(message.type); + buffer.writeInt(message.pressedms); + } + + public static void handler(KeyBindingPressedMessage message, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + pressAction(context.getSender(), message.type, message.pressedms); + }); + context.setPacketHandled(true); + } + } + + private static void pressAction(PlayerEntity entity, int type, int pressedms) { + World world = entity.world; + double x = entity.getPosX(); + double y = entity.getPosY(); + double z = entity.getPosZ(); + // security measure to prevent arbitrary chunk generation + if (!world.isBlockLoaded(new BlockPos(x, y, z))) + return; + if (type == 0) { + + VehicleAccelerateOnKeyPressedProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)).collect(HashMap::new, + (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + if (type == 1) { + + VehicleAccelerateOnKeyReleasedProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)).collect(HashMap::new, + (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/keybind/VehicleBackwardKeyBinding.java b/src/main/java/studio/halbear/hem/keybind/VehicleBackwardKeyBinding.java new file mode 100644 index 0000000..8893c52 --- /dev/null +++ b/src/main/java/studio/halbear/hem/keybind/VehicleBackwardKeyBinding.java @@ -0,0 +1,116 @@ + +package studio.halbear.hem.keybind; + +import studio.halbear.hem.procedures.VehicleBackwardOnKeyReleasedProcedure; +import studio.halbear.hem.procedures.VehicleBackwardOnKeyPressedProcedure; +import studio.halbear.hem.HemModElements; +import studio.halbear.hem.HemMod; + +import org.lwjgl.glfw.GLFW; + +import net.minecraftforge.fml.network.NetworkEvent; +import net.minecraftforge.fml.client.registry.ClientRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.client.event.InputEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.util.math.BlockPos; +import net.minecraft.network.PacketBuffer; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.client.Minecraft; + +import java.util.stream.Stream; +import java.util.function.Supplier; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class VehicleBackwardKeyBinding extends HemModElements.ModElement { + @OnlyIn(Dist.CLIENT) + private KeyBinding keys; + private long lastpress = 0; + + public VehicleBackwardKeyBinding(HemModElements instance) { + super(instance, 179); + elements.addNetworkMessage(KeyBindingPressedMessage.class, KeyBindingPressedMessage::buffer, KeyBindingPressedMessage::new, + KeyBindingPressedMessage::handler); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void initElements() { + keys = new KeyBinding("key.hem.vehicle_backward", GLFW.GLFW_KEY_S, "key.categories.hals_exploration_mod"); + ClientRegistry.registerKeyBinding(keys); + MinecraftForge.EVENT_BUS.register(this); + } + + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public void onKeyInput(InputEvent.KeyInputEvent event) { + if (Minecraft.getInstance().currentScreen == null) { + if (event.getKey() == keys.getKey().getKeyCode()) { + if (event.getAction() == GLFW.GLFW_PRESS) { + HemMod.PACKET_HANDLER.sendToServer(new KeyBindingPressedMessage(0, 0)); + pressAction(Minecraft.getInstance().player, 0, 0); + lastpress = System.currentTimeMillis(); + } else if (event.getAction() == GLFW.GLFW_RELEASE) { + int dt = (int) (System.currentTimeMillis() - lastpress); + HemMod.PACKET_HANDLER.sendToServer(new KeyBindingPressedMessage(1, dt)); + pressAction(Minecraft.getInstance().player, 1, dt); + } + } + } + } + + public static class KeyBindingPressedMessage { + int type, pressedms; + + public KeyBindingPressedMessage(int type, int pressedms) { + this.type = type; + this.pressedms = pressedms; + } + + public KeyBindingPressedMessage(PacketBuffer buffer) { + this.type = buffer.readInt(); + this.pressedms = buffer.readInt(); + } + + public static void buffer(KeyBindingPressedMessage message, PacketBuffer buffer) { + buffer.writeInt(message.type); + buffer.writeInt(message.pressedms); + } + + public static void handler(KeyBindingPressedMessage message, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + pressAction(context.getSender(), message.type, message.pressedms); + }); + context.setPacketHandled(true); + } + } + + private static void pressAction(PlayerEntity entity, int type, int pressedms) { + World world = entity.world; + double x = entity.getPosX(); + double y = entity.getPosY(); + double z = entity.getPosZ(); + // security measure to prevent arbitrary chunk generation + if (!world.isBlockLoaded(new BlockPos(x, y, z))) + return; + if (type == 0) { + + VehicleBackwardOnKeyPressedProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)).collect(HashMap::new, + (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + if (type == 1) { + + VehicleBackwardOnKeyReleasedProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)).collect(HashMap::new, + (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/keybind/VehicleDecelerateKeyBinding.java b/src/main/java/studio/halbear/hem/keybind/VehicleDecelerateKeyBinding.java new file mode 100644 index 0000000..3ad676b --- /dev/null +++ b/src/main/java/studio/halbear/hem/keybind/VehicleDecelerateKeyBinding.java @@ -0,0 +1,116 @@ + +package studio.halbear.hem.keybind; + +import studio.halbear.hem.procedures.VehicleDecelerateOnKeyReleasedProcedure; +import studio.halbear.hem.procedures.VehicleDecelerateOnKeyPressedProcedure; +import studio.halbear.hem.HemModElements; +import studio.halbear.hem.HemMod; + +import org.lwjgl.glfw.GLFW; + +import net.minecraftforge.fml.network.NetworkEvent; +import net.minecraftforge.fml.client.registry.ClientRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.client.event.InputEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.util.math.BlockPos; +import net.minecraft.network.PacketBuffer; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.client.Minecraft; + +import java.util.stream.Stream; +import java.util.function.Supplier; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class VehicleDecelerateKeyBinding extends HemModElements.ModElement { + @OnlyIn(Dist.CLIENT) + private KeyBinding keys; + private long lastpress = 0; + + public VehicleDecelerateKeyBinding(HemModElements instance) { + super(instance, 185); + elements.addNetworkMessage(KeyBindingPressedMessage.class, KeyBindingPressedMessage::buffer, KeyBindingPressedMessage::new, + KeyBindingPressedMessage::handler); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void initElements() { + keys = new KeyBinding("key.hem.vehicle_decelerate", GLFW.GLFW_KEY_S, "key.categories.hals_exploration_mod"); + ClientRegistry.registerKeyBinding(keys); + MinecraftForge.EVENT_BUS.register(this); + } + + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public void onKeyInput(InputEvent.KeyInputEvent event) { + if (Minecraft.getInstance().currentScreen == null) { + if (event.getKey() == keys.getKey().getKeyCode()) { + if (event.getAction() == GLFW.GLFW_PRESS) { + HemMod.PACKET_HANDLER.sendToServer(new KeyBindingPressedMessage(0, 0)); + pressAction(Minecraft.getInstance().player, 0, 0); + lastpress = System.currentTimeMillis(); + } else if (event.getAction() == GLFW.GLFW_RELEASE) { + int dt = (int) (System.currentTimeMillis() - lastpress); + HemMod.PACKET_HANDLER.sendToServer(new KeyBindingPressedMessage(1, dt)); + pressAction(Minecraft.getInstance().player, 1, dt); + } + } + } + } + + public static class KeyBindingPressedMessage { + int type, pressedms; + + public KeyBindingPressedMessage(int type, int pressedms) { + this.type = type; + this.pressedms = pressedms; + } + + public KeyBindingPressedMessage(PacketBuffer buffer) { + this.type = buffer.readInt(); + this.pressedms = buffer.readInt(); + } + + public static void buffer(KeyBindingPressedMessage message, PacketBuffer buffer) { + buffer.writeInt(message.type); + buffer.writeInt(message.pressedms); + } + + public static void handler(KeyBindingPressedMessage message, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + pressAction(context.getSender(), message.type, message.pressedms); + }); + context.setPacketHandled(true); + } + } + + private static void pressAction(PlayerEntity entity, int type, int pressedms) { + World world = entity.world; + double x = entity.getPosX(); + double y = entity.getPosY(); + double z = entity.getPosZ(); + // security measure to prevent arbitrary chunk generation + if (!world.isBlockLoaded(new BlockPos(x, y, z))) + return; + if (type == 0) { + + VehicleDecelerateOnKeyPressedProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)).collect(HashMap::new, + (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + if (type == 1) { + + VehicleDecelerateOnKeyReleasedProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)).collect(HashMap::new, + (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/keybind/VehicleForwardKeyBinding.java b/src/main/java/studio/halbear/hem/keybind/VehicleForwardKeyBinding.java new file mode 100644 index 0000000..1355a5c --- /dev/null +++ b/src/main/java/studio/halbear/hem/keybind/VehicleForwardKeyBinding.java @@ -0,0 +1,116 @@ + +package studio.halbear.hem.keybind; + +import studio.halbear.hem.procedures.VehicleForwardOnKeyReleasedProcedure; +import studio.halbear.hem.procedures.VehicleForwardOnKeyPressedProcedure; +import studio.halbear.hem.HemModElements; +import studio.halbear.hem.HemMod; + +import org.lwjgl.glfw.GLFW; + +import net.minecraftforge.fml.network.NetworkEvent; +import net.minecraftforge.fml.client.registry.ClientRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.client.event.InputEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.util.math.BlockPos; +import net.minecraft.network.PacketBuffer; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.client.Minecraft; + +import java.util.stream.Stream; +import java.util.function.Supplier; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class VehicleForwardKeyBinding extends HemModElements.ModElement { + @OnlyIn(Dist.CLIENT) + private KeyBinding keys; + private long lastpress = 0; + + public VehicleForwardKeyBinding(HemModElements instance) { + super(instance, 169); + elements.addNetworkMessage(KeyBindingPressedMessage.class, KeyBindingPressedMessage::buffer, KeyBindingPressedMessage::new, + KeyBindingPressedMessage::handler); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void initElements() { + keys = new KeyBinding("key.hem.vehicle_forward", GLFW.GLFW_KEY_W, "key.categories.hals_exploration_mod"); + ClientRegistry.registerKeyBinding(keys); + MinecraftForge.EVENT_BUS.register(this); + } + + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public void onKeyInput(InputEvent.KeyInputEvent event) { + if (Minecraft.getInstance().currentScreen == null) { + if (event.getKey() == keys.getKey().getKeyCode()) { + if (event.getAction() == GLFW.GLFW_PRESS) { + HemMod.PACKET_HANDLER.sendToServer(new KeyBindingPressedMessage(0, 0)); + pressAction(Minecraft.getInstance().player, 0, 0); + lastpress = System.currentTimeMillis(); + } else if (event.getAction() == GLFW.GLFW_RELEASE) { + int dt = (int) (System.currentTimeMillis() - lastpress); + HemMod.PACKET_HANDLER.sendToServer(new KeyBindingPressedMessage(1, dt)); + pressAction(Minecraft.getInstance().player, 1, dt); + } + } + } + } + + public static class KeyBindingPressedMessage { + int type, pressedms; + + public KeyBindingPressedMessage(int type, int pressedms) { + this.type = type; + this.pressedms = pressedms; + } + + public KeyBindingPressedMessage(PacketBuffer buffer) { + this.type = buffer.readInt(); + this.pressedms = buffer.readInt(); + } + + public static void buffer(KeyBindingPressedMessage message, PacketBuffer buffer) { + buffer.writeInt(message.type); + buffer.writeInt(message.pressedms); + } + + public static void handler(KeyBindingPressedMessage message, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + pressAction(context.getSender(), message.type, message.pressedms); + }); + context.setPacketHandled(true); + } + } + + private static void pressAction(PlayerEntity entity, int type, int pressedms) { + World world = entity.world; + double x = entity.getPosX(); + double y = entity.getPosY(); + double z = entity.getPosZ(); + // security measure to prevent arbitrary chunk generation + if (!world.isBlockLoaded(new BlockPos(x, y, z))) + return; + if (type == 0) { + + VehicleForwardOnKeyPressedProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)).collect(HashMap::new, + (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + if (type == 1) { + + VehicleForwardOnKeyReleasedProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)).collect(HashMap::new, + (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/keybind/VehicleIncreasePressureKeyBinding.java b/src/main/java/studio/halbear/hem/keybind/VehicleIncreasePressureKeyBinding.java new file mode 100644 index 0000000..dd2939a --- /dev/null +++ b/src/main/java/studio/halbear/hem/keybind/VehicleIncreasePressureKeyBinding.java @@ -0,0 +1,116 @@ + +package studio.halbear.hem.keybind; + +import studio.halbear.hem.procedures.VehicleIncreasePressureOnKeyReleasedProcedure; +import studio.halbear.hem.procedures.VehicleIncreasePressureOnKeyPressedProcedure; +import studio.halbear.hem.HemModElements; +import studio.halbear.hem.HemMod; + +import org.lwjgl.glfw.GLFW; + +import net.minecraftforge.fml.network.NetworkEvent; +import net.minecraftforge.fml.client.registry.ClientRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.client.event.InputEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.util.math.BlockPos; +import net.minecraft.network.PacketBuffer; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.client.Minecraft; + +import java.util.stream.Stream; +import java.util.function.Supplier; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class VehicleIncreasePressureKeyBinding extends HemModElements.ModElement { + @OnlyIn(Dist.CLIENT) + private KeyBinding keys; + private long lastpress = 0; + + public VehicleIncreasePressureKeyBinding(HemModElements instance) { + super(instance, 186); + elements.addNetworkMessage(KeyBindingPressedMessage.class, KeyBindingPressedMessage::buffer, KeyBindingPressedMessage::new, + KeyBindingPressedMessage::handler); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void initElements() { + keys = new KeyBinding("key.hem.vehicle_increase_pressure", GLFW.GLFW_KEY_SPACE, "key.categories.hals_exploration_mod"); + ClientRegistry.registerKeyBinding(keys); + MinecraftForge.EVENT_BUS.register(this); + } + + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public void onKeyInput(InputEvent.KeyInputEvent event) { + if (Minecraft.getInstance().currentScreen == null) { + if (event.getKey() == keys.getKey().getKeyCode()) { + if (event.getAction() == GLFW.GLFW_PRESS) { + HemMod.PACKET_HANDLER.sendToServer(new KeyBindingPressedMessage(0, 0)); + pressAction(Minecraft.getInstance().player, 0, 0); + lastpress = System.currentTimeMillis(); + } else if (event.getAction() == GLFW.GLFW_RELEASE) { + int dt = (int) (System.currentTimeMillis() - lastpress); + HemMod.PACKET_HANDLER.sendToServer(new KeyBindingPressedMessage(1, dt)); + pressAction(Minecraft.getInstance().player, 1, dt); + } + } + } + } + + public static class KeyBindingPressedMessage { + int type, pressedms; + + public KeyBindingPressedMessage(int type, int pressedms) { + this.type = type; + this.pressedms = pressedms; + } + + public KeyBindingPressedMessage(PacketBuffer buffer) { + this.type = buffer.readInt(); + this.pressedms = buffer.readInt(); + } + + public static void buffer(KeyBindingPressedMessage message, PacketBuffer buffer) { + buffer.writeInt(message.type); + buffer.writeInt(message.pressedms); + } + + public static void handler(KeyBindingPressedMessage message, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + pressAction(context.getSender(), message.type, message.pressedms); + }); + context.setPacketHandled(true); + } + } + + private static void pressAction(PlayerEntity entity, int type, int pressedms) { + World world = entity.world; + double x = entity.getPosX(); + double y = entity.getPosY(); + double z = entity.getPosZ(); + // security measure to prevent arbitrary chunk generation + if (!world.isBlockLoaded(new BlockPos(x, y, z))) + return; + if (type == 0) { + + VehicleIncreasePressureOnKeyPressedProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + if (type == 1) { + + VehicleIncreasePressureOnKeyReleasedProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/keybind/VehicleReleasePressureKeyBinding.java b/src/main/java/studio/halbear/hem/keybind/VehicleReleasePressureKeyBinding.java new file mode 100644 index 0000000..c05e5c1 --- /dev/null +++ b/src/main/java/studio/halbear/hem/keybind/VehicleReleasePressureKeyBinding.java @@ -0,0 +1,116 @@ + +package studio.halbear.hem.keybind; + +import studio.halbear.hem.procedures.VehicleReleasePressureOnKeyReleasedProcedure; +import studio.halbear.hem.procedures.VehicleReleasePressureOnKeyPressedProcedure; +import studio.halbear.hem.HemModElements; +import studio.halbear.hem.HemMod; + +import org.lwjgl.glfw.GLFW; + +import net.minecraftforge.fml.network.NetworkEvent; +import net.minecraftforge.fml.client.registry.ClientRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.client.event.InputEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.util.math.BlockPos; +import net.minecraft.network.PacketBuffer; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.client.Minecraft; + +import java.util.stream.Stream; +import java.util.function.Supplier; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class VehicleReleasePressureKeyBinding extends HemModElements.ModElement { + @OnlyIn(Dist.CLIENT) + private KeyBinding keys; + private long lastpress = 0; + + public VehicleReleasePressureKeyBinding(HemModElements instance) { + super(instance, 187); + elements.addNetworkMessage(KeyBindingPressedMessage.class, KeyBindingPressedMessage::buffer, KeyBindingPressedMessage::new, + KeyBindingPressedMessage::handler); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void initElements() { + keys = new KeyBinding("key.hem.vehicle_release_pressure", GLFW.GLFW_KEY_LEFT_CONTROL, "key.categories.hals_exploration_mod"); + ClientRegistry.registerKeyBinding(keys); + MinecraftForge.EVENT_BUS.register(this); + } + + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public void onKeyInput(InputEvent.KeyInputEvent event) { + if (Minecraft.getInstance().currentScreen == null) { + if (event.getKey() == keys.getKey().getKeyCode()) { + if (event.getAction() == GLFW.GLFW_PRESS) { + HemMod.PACKET_HANDLER.sendToServer(new KeyBindingPressedMessage(0, 0)); + pressAction(Minecraft.getInstance().player, 0, 0); + lastpress = System.currentTimeMillis(); + } else if (event.getAction() == GLFW.GLFW_RELEASE) { + int dt = (int) (System.currentTimeMillis() - lastpress); + HemMod.PACKET_HANDLER.sendToServer(new KeyBindingPressedMessage(1, dt)); + pressAction(Minecraft.getInstance().player, 1, dt); + } + } + } + } + + public static class KeyBindingPressedMessage { + int type, pressedms; + + public KeyBindingPressedMessage(int type, int pressedms) { + this.type = type; + this.pressedms = pressedms; + } + + public KeyBindingPressedMessage(PacketBuffer buffer) { + this.type = buffer.readInt(); + this.pressedms = buffer.readInt(); + } + + public static void buffer(KeyBindingPressedMessage message, PacketBuffer buffer) { + buffer.writeInt(message.type); + buffer.writeInt(message.pressedms); + } + + public static void handler(KeyBindingPressedMessage message, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + pressAction(context.getSender(), message.type, message.pressedms); + }); + context.setPacketHandled(true); + } + } + + private static void pressAction(PlayerEntity entity, int type, int pressedms) { + World world = entity.world; + double x = entity.getPosX(); + double y = entity.getPosY(); + double z = entity.getPosZ(); + // security measure to prevent arbitrary chunk generation + if (!world.isBlockLoaded(new BlockPos(x, y, z))) + return; + if (type == 0) { + + VehicleReleasePressureOnKeyPressedProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + if (type == 1) { + + VehicleReleasePressureOnKeyReleasedProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/keybind/VehicleStrafeLeftKeyBinding.java b/src/main/java/studio/halbear/hem/keybind/VehicleStrafeLeftKeyBinding.java new file mode 100644 index 0000000..ae5f411 --- /dev/null +++ b/src/main/java/studio/halbear/hem/keybind/VehicleStrafeLeftKeyBinding.java @@ -0,0 +1,116 @@ + +package studio.halbear.hem.keybind; + +import studio.halbear.hem.procedures.VehicleStrafeLeftOnKeyReleasedProcedure; +import studio.halbear.hem.procedures.VehicleStrafeLeftOnKeyPressedProcedure; +import studio.halbear.hem.HemModElements; +import studio.halbear.hem.HemMod; + +import org.lwjgl.glfw.GLFW; + +import net.minecraftforge.fml.network.NetworkEvent; +import net.minecraftforge.fml.client.registry.ClientRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.client.event.InputEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.util.math.BlockPos; +import net.minecraft.network.PacketBuffer; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.client.Minecraft; + +import java.util.stream.Stream; +import java.util.function.Supplier; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class VehicleStrafeLeftKeyBinding extends HemModElements.ModElement { + @OnlyIn(Dist.CLIENT) + private KeyBinding keys; + private long lastpress = 0; + + public VehicleStrafeLeftKeyBinding(HemModElements instance) { + super(instance, 182); + elements.addNetworkMessage(KeyBindingPressedMessage.class, KeyBindingPressedMessage::buffer, KeyBindingPressedMessage::new, + KeyBindingPressedMessage::handler); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void initElements() { + keys = new KeyBinding("key.hem.vehicle_strafe_left", GLFW.GLFW_KEY_Z, "key.categories.hals_exploration_mod"); + ClientRegistry.registerKeyBinding(keys); + MinecraftForge.EVENT_BUS.register(this); + } + + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public void onKeyInput(InputEvent.KeyInputEvent event) { + if (Minecraft.getInstance().currentScreen == null) { + if (event.getKey() == keys.getKey().getKeyCode()) { + if (event.getAction() == GLFW.GLFW_PRESS) { + HemMod.PACKET_HANDLER.sendToServer(new KeyBindingPressedMessage(0, 0)); + pressAction(Minecraft.getInstance().player, 0, 0); + lastpress = System.currentTimeMillis(); + } else if (event.getAction() == GLFW.GLFW_RELEASE) { + int dt = (int) (System.currentTimeMillis() - lastpress); + HemMod.PACKET_HANDLER.sendToServer(new KeyBindingPressedMessage(1, dt)); + pressAction(Minecraft.getInstance().player, 1, dt); + } + } + } + } + + public static class KeyBindingPressedMessage { + int type, pressedms; + + public KeyBindingPressedMessage(int type, int pressedms) { + this.type = type; + this.pressedms = pressedms; + } + + public KeyBindingPressedMessage(PacketBuffer buffer) { + this.type = buffer.readInt(); + this.pressedms = buffer.readInt(); + } + + public static void buffer(KeyBindingPressedMessage message, PacketBuffer buffer) { + buffer.writeInt(message.type); + buffer.writeInt(message.pressedms); + } + + public static void handler(KeyBindingPressedMessage message, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + pressAction(context.getSender(), message.type, message.pressedms); + }); + context.setPacketHandled(true); + } + } + + private static void pressAction(PlayerEntity entity, int type, int pressedms) { + World world = entity.world; + double x = entity.getPosX(); + double y = entity.getPosY(); + double z = entity.getPosZ(); + // security measure to prevent arbitrary chunk generation + if (!world.isBlockLoaded(new BlockPos(x, y, z))) + return; + if (type == 0) { + + VehicleStrafeLeftOnKeyPressedProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)).collect(HashMap::new, + (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + if (type == 1) { + + VehicleStrafeLeftOnKeyReleasedProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)).collect(HashMap::new, + (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/keybind/VehicleStrafeRightKeyBinding.java b/src/main/java/studio/halbear/hem/keybind/VehicleStrafeRightKeyBinding.java new file mode 100644 index 0000000..2840414 --- /dev/null +++ b/src/main/java/studio/halbear/hem/keybind/VehicleStrafeRightKeyBinding.java @@ -0,0 +1,116 @@ + +package studio.halbear.hem.keybind; + +import studio.halbear.hem.procedures.VehicleStrafeRightOnKeyReleasedProcedure; +import studio.halbear.hem.procedures.VehicleStrafeRightOnKeyPressedProcedure; +import studio.halbear.hem.HemModElements; +import studio.halbear.hem.HemMod; + +import org.lwjgl.glfw.GLFW; + +import net.minecraftforge.fml.network.NetworkEvent; +import net.minecraftforge.fml.client.registry.ClientRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.client.event.InputEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.util.math.BlockPos; +import net.minecraft.network.PacketBuffer; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.client.Minecraft; + +import java.util.stream.Stream; +import java.util.function.Supplier; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class VehicleStrafeRightKeyBinding extends HemModElements.ModElement { + @OnlyIn(Dist.CLIENT) + private KeyBinding keys; + private long lastpress = 0; + + public VehicleStrafeRightKeyBinding(HemModElements instance) { + super(instance, 183); + elements.addNetworkMessage(KeyBindingPressedMessage.class, KeyBindingPressedMessage::buffer, KeyBindingPressedMessage::new, + KeyBindingPressedMessage::handler); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void initElements() { + keys = new KeyBinding("key.hem.vehicle_strafe_right", GLFW.GLFW_KEY_X, "key.categories.hals_exploration_mod"); + ClientRegistry.registerKeyBinding(keys); + MinecraftForge.EVENT_BUS.register(this); + } + + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public void onKeyInput(InputEvent.KeyInputEvent event) { + if (Minecraft.getInstance().currentScreen == null) { + if (event.getKey() == keys.getKey().getKeyCode()) { + if (event.getAction() == GLFW.GLFW_PRESS) { + HemMod.PACKET_HANDLER.sendToServer(new KeyBindingPressedMessage(0, 0)); + pressAction(Minecraft.getInstance().player, 0, 0); + lastpress = System.currentTimeMillis(); + } else if (event.getAction() == GLFW.GLFW_RELEASE) { + int dt = (int) (System.currentTimeMillis() - lastpress); + HemMod.PACKET_HANDLER.sendToServer(new KeyBindingPressedMessage(1, dt)); + pressAction(Minecraft.getInstance().player, 1, dt); + } + } + } + } + + public static class KeyBindingPressedMessage { + int type, pressedms; + + public KeyBindingPressedMessage(int type, int pressedms) { + this.type = type; + this.pressedms = pressedms; + } + + public KeyBindingPressedMessage(PacketBuffer buffer) { + this.type = buffer.readInt(); + this.pressedms = buffer.readInt(); + } + + public static void buffer(KeyBindingPressedMessage message, PacketBuffer buffer) { + buffer.writeInt(message.type); + buffer.writeInt(message.pressedms); + } + + public static void handler(KeyBindingPressedMessage message, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + pressAction(context.getSender(), message.type, message.pressedms); + }); + context.setPacketHandled(true); + } + } + + private static void pressAction(PlayerEntity entity, int type, int pressedms) { + World world = entity.world; + double x = entity.getPosX(); + double y = entity.getPosY(); + double z = entity.getPosZ(); + // security measure to prevent arbitrary chunk generation + if (!world.isBlockLoaded(new BlockPos(x, y, z))) + return; + if (type == 0) { + + VehicleStrafeRightOnKeyPressedProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)).collect(HashMap::new, + (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + if (type == 1) { + + VehicleStrafeRightOnKeyReleasedProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)).collect(HashMap::new, + (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/keybind/VehicleTurnLeftKeyBinding.java b/src/main/java/studio/halbear/hem/keybind/VehicleTurnLeftKeyBinding.java new file mode 100644 index 0000000..ea3b185 --- /dev/null +++ b/src/main/java/studio/halbear/hem/keybind/VehicleTurnLeftKeyBinding.java @@ -0,0 +1,116 @@ + +package studio.halbear.hem.keybind; + +import studio.halbear.hem.procedures.VehicleTurnLeftOnKeyReleasedProcedure; +import studio.halbear.hem.procedures.VehicleTurnLeftOnKeyPressedProcedure; +import studio.halbear.hem.HemModElements; +import studio.halbear.hem.HemMod; + +import org.lwjgl.glfw.GLFW; + +import net.minecraftforge.fml.network.NetworkEvent; +import net.minecraftforge.fml.client.registry.ClientRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.client.event.InputEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.util.math.BlockPos; +import net.minecraft.network.PacketBuffer; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.client.Minecraft; + +import java.util.stream.Stream; +import java.util.function.Supplier; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class VehicleTurnLeftKeyBinding extends HemModElements.ModElement { + @OnlyIn(Dist.CLIENT) + private KeyBinding keys; + private long lastpress = 0; + + public VehicleTurnLeftKeyBinding(HemModElements instance) { + super(instance, 180); + elements.addNetworkMessage(KeyBindingPressedMessage.class, KeyBindingPressedMessage::buffer, KeyBindingPressedMessage::new, + KeyBindingPressedMessage::handler); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void initElements() { + keys = new KeyBinding("key.hem.vehicle_turn_left", GLFW.GLFW_KEY_A, "key.categories.hals_exploration_mod"); + ClientRegistry.registerKeyBinding(keys); + MinecraftForge.EVENT_BUS.register(this); + } + + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public void onKeyInput(InputEvent.KeyInputEvent event) { + if (Minecraft.getInstance().currentScreen == null) { + if (event.getKey() == keys.getKey().getKeyCode()) { + if (event.getAction() == GLFW.GLFW_PRESS) { + HemMod.PACKET_HANDLER.sendToServer(new KeyBindingPressedMessage(0, 0)); + pressAction(Minecraft.getInstance().player, 0, 0); + lastpress = System.currentTimeMillis(); + } else if (event.getAction() == GLFW.GLFW_RELEASE) { + int dt = (int) (System.currentTimeMillis() - lastpress); + HemMod.PACKET_HANDLER.sendToServer(new KeyBindingPressedMessage(1, dt)); + pressAction(Minecraft.getInstance().player, 1, dt); + } + } + } + } + + public static class KeyBindingPressedMessage { + int type, pressedms; + + public KeyBindingPressedMessage(int type, int pressedms) { + this.type = type; + this.pressedms = pressedms; + } + + public KeyBindingPressedMessage(PacketBuffer buffer) { + this.type = buffer.readInt(); + this.pressedms = buffer.readInt(); + } + + public static void buffer(KeyBindingPressedMessage message, PacketBuffer buffer) { + buffer.writeInt(message.type); + buffer.writeInt(message.pressedms); + } + + public static void handler(KeyBindingPressedMessage message, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + pressAction(context.getSender(), message.type, message.pressedms); + }); + context.setPacketHandled(true); + } + } + + private static void pressAction(PlayerEntity entity, int type, int pressedms) { + World world = entity.world; + double x = entity.getPosX(); + double y = entity.getPosY(); + double z = entity.getPosZ(); + // security measure to prevent arbitrary chunk generation + if (!world.isBlockLoaded(new BlockPos(x, y, z))) + return; + if (type == 0) { + + VehicleTurnLeftOnKeyPressedProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)).collect(HashMap::new, + (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + if (type == 1) { + + VehicleTurnLeftOnKeyReleasedProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)).collect(HashMap::new, + (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/keybind/VehicleTurnRightKeyBinding.java b/src/main/java/studio/halbear/hem/keybind/VehicleTurnRightKeyBinding.java new file mode 100644 index 0000000..d3fccaa --- /dev/null +++ b/src/main/java/studio/halbear/hem/keybind/VehicleTurnRightKeyBinding.java @@ -0,0 +1,116 @@ + +package studio.halbear.hem.keybind; + +import studio.halbear.hem.procedures.VehicleTurnRightOnKeyReleasedProcedure; +import studio.halbear.hem.procedures.VehicleTurnRightOnKeyPressedProcedure; +import studio.halbear.hem.HemModElements; +import studio.halbear.hem.HemMod; + +import org.lwjgl.glfw.GLFW; + +import net.minecraftforge.fml.network.NetworkEvent; +import net.minecraftforge.fml.client.registry.ClientRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.client.event.InputEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.World; +import net.minecraft.util.math.BlockPos; +import net.minecraft.network.PacketBuffer; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.client.Minecraft; + +import java.util.stream.Stream; +import java.util.function.Supplier; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class VehicleTurnRightKeyBinding extends HemModElements.ModElement { + @OnlyIn(Dist.CLIENT) + private KeyBinding keys; + private long lastpress = 0; + + public VehicleTurnRightKeyBinding(HemModElements instance) { + super(instance, 181); + elements.addNetworkMessage(KeyBindingPressedMessage.class, KeyBindingPressedMessage::buffer, KeyBindingPressedMessage::new, + KeyBindingPressedMessage::handler); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void initElements() { + keys = new KeyBinding("key.hem.vehicle_turn_right", GLFW.GLFW_KEY_D, "key.categories.hals_exploration_mod"); + ClientRegistry.registerKeyBinding(keys); + MinecraftForge.EVENT_BUS.register(this); + } + + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public void onKeyInput(InputEvent.KeyInputEvent event) { + if (Minecraft.getInstance().currentScreen == null) { + if (event.getKey() == keys.getKey().getKeyCode()) { + if (event.getAction() == GLFW.GLFW_PRESS) { + HemMod.PACKET_HANDLER.sendToServer(new KeyBindingPressedMessage(0, 0)); + pressAction(Minecraft.getInstance().player, 0, 0); + lastpress = System.currentTimeMillis(); + } else if (event.getAction() == GLFW.GLFW_RELEASE) { + int dt = (int) (System.currentTimeMillis() - lastpress); + HemMod.PACKET_HANDLER.sendToServer(new KeyBindingPressedMessage(1, dt)); + pressAction(Minecraft.getInstance().player, 1, dt); + } + } + } + } + + public static class KeyBindingPressedMessage { + int type, pressedms; + + public KeyBindingPressedMessage(int type, int pressedms) { + this.type = type; + this.pressedms = pressedms; + } + + public KeyBindingPressedMessage(PacketBuffer buffer) { + this.type = buffer.readInt(); + this.pressedms = buffer.readInt(); + } + + public static void buffer(KeyBindingPressedMessage message, PacketBuffer buffer) { + buffer.writeInt(message.type); + buffer.writeInt(message.pressedms); + } + + public static void handler(KeyBindingPressedMessage message, Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + pressAction(context.getSender(), message.type, message.pressedms); + }); + context.setPacketHandled(true); + } + } + + private static void pressAction(PlayerEntity entity, int type, int pressedms) { + World world = entity.world; + double x = entity.getPosX(); + double y = entity.getPosY(); + double z = entity.getPosZ(); + // security measure to prevent arbitrary chunk generation + if (!world.isBlockLoaded(new BlockPos(x, y, z))) + return; + if (type == 0) { + + VehicleTurnRightOnKeyPressedProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)).collect(HashMap::new, + (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + if (type == 1) { + + VehicleTurnRightOnKeyReleasedProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)).collect(HashMap::new, + (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/particle/BlueLeavesParticle.java b/src/main/java/studio/halbear/hem/particle/BlueLeavesParticle.java new file mode 100644 index 0000000..6d4be09 --- /dev/null +++ b/src/main/java/studio/halbear/hem/particle/BlueLeavesParticle.java @@ -0,0 +1,98 @@ + +package studio.halbear.hem.particle; + +import studio.halbear.hem.procedures.BlueleavesCollideProcedure; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.client.event.ParticleFactoryRegisterEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.particles.ParticleType; +import net.minecraft.particles.BasicParticleType; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.client.particle.SpriteTexturedParticle; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.IParticleRenderType; +import net.minecraft.client.particle.IParticleFactory; +import net.minecraft.client.particle.IAnimatedSprite; +import net.minecraft.client.Minecraft; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) +public class BlueLeavesParticle { + public static final BasicParticleType particle = new BasicParticleType(false); + + @SubscribeEvent + public static void registerParticleType(RegistryEvent.Register> event) { + event.getRegistry().register(particle.setRegistryName("blue_leaves")); + } + + @OnlyIn(Dist.CLIENT) + @SubscribeEvent + public static void registerParticle(ParticleFactoryRegisterEvent event) { + Minecraft.getInstance().particles.registerFactory(particle, CustomParticleFactory::new); + } + + @OnlyIn(Dist.CLIENT) + private static class CustomParticle extends SpriteTexturedParticle { + private final IAnimatedSprite spriteSet; + private float angularVelocity; + private float angularAcceleration; + + protected CustomParticle(ClientWorld world, double x, double y, double z, double vx, double vy, double vz, IAnimatedSprite spriteSet) { + super(world, x, y, z); + this.spriteSet = spriteSet; + this.setSize((float) 0.2, (float) 0.2); + this.particleScale *= (float) 2; + this.maxAge = 9999; + this.particleGravity = (float) 0.3; + this.canCollide = true; + this.motionX = vx * 0.3; + this.motionY = vy * 0.3; + this.motionZ = vz * 0.3; + this.angularVelocity = (float) 0.4; + this.angularAcceleration = (float) -0.02; + this.selectSpriteRandomly(spriteSet); + } + + @Override + public IParticleRenderType getRenderType() { + return IParticleRenderType.PARTICLE_SHEET_OPAQUE; + } + + @Override + public void tick() { + super.tick(); + this.prevParticleAngle = this.particleAngle; + this.particleAngle += this.angularVelocity; + this.angularVelocity += this.angularAcceleration; + double x = this.posX; + double y = this.posY; + double z = this.posZ; + if (BlueleavesCollideProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("onGround", onGround)).collect(HashMap::new, + (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll))) + this.setExpired(); + } + } + + @OnlyIn(Dist.CLIENT) + private static class CustomParticleFactory implements IParticleFactory { + private final IAnimatedSprite spriteSet; + + public CustomParticleFactory(IAnimatedSprite spriteSet) { + this.spriteSet = spriteSet; + } + + public Particle makeParticle(BasicParticleType typeIn, ClientWorld worldIn, double x, double y, double z, double xSpeed, double ySpeed, + double zSpeed) { + return new CustomParticle(worldIn, x, y, z, xSpeed, ySpeed, zSpeed, this.spriteSet); + } + } +} diff --git a/src/main/java/studio/halbear/hem/particle/BlueleafAmbienceParticle.java b/src/main/java/studio/halbear/hem/particle/BlueleafAmbienceParticle.java new file mode 100644 index 0000000..bd59aaf --- /dev/null +++ b/src/main/java/studio/halbear/hem/particle/BlueleafAmbienceParticle.java @@ -0,0 +1,90 @@ + +package studio.halbear.hem.particle; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.client.event.ParticleFactoryRegisterEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.particles.ParticleType; +import net.minecraft.particles.BasicParticleType; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.client.particle.SpriteTexturedParticle; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.IParticleRenderType; +import net.minecraft.client.particle.IParticleFactory; +import net.minecraft.client.particle.IAnimatedSprite; +import net.minecraft.client.Minecraft; + +@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) +public class BlueleafAmbienceParticle { + public static final BasicParticleType particle = new BasicParticleType(false); + + @SubscribeEvent + public static void registerParticleType(RegistryEvent.Register> event) { + event.getRegistry().register(particle.setRegistryName("blueleaf_ambience")); + } + + @OnlyIn(Dist.CLIENT) + @SubscribeEvent + public static void registerParticle(ParticleFactoryRegisterEvent event) { + Minecraft.getInstance().particles.registerFactory(particle, CustomParticleFactory::new); + } + + @OnlyIn(Dist.CLIENT) + private static class CustomParticle extends SpriteTexturedParticle { + private final IAnimatedSprite spriteSet; + private float angularVelocity; + private float angularAcceleration; + + protected CustomParticle(ClientWorld world, double x, double y, double z, double vx, double vy, double vz, IAnimatedSprite spriteSet) { + super(world, x, y, z); + this.spriteSet = spriteSet; + this.setSize((float) 0.2, (float) 0.2); + this.particleScale *= (float) 1.5; + this.maxAge = (int) Math.max(1, 40 + (this.rand.nextInt(20) - 10)); + this.particleGravity = (float) -0.1; + this.canCollide = true; + this.motionX = vx * 0; + this.motionY = vy * 0; + this.motionZ = vz * 0; + this.angularVelocity = (float) 0.1; + this.angularAcceleration = (float) 0; + this.selectSpriteRandomly(spriteSet); + } + + @Override + public int getBrightnessForRender(float partialTick) { + return 15728880; + } + + @Override + public IParticleRenderType getRenderType() { + return IParticleRenderType.PARTICLE_SHEET_LIT; + } + + @Override + public void tick() { + super.tick(); + this.prevParticleAngle = this.particleAngle; + this.particleAngle += this.angularVelocity; + this.angularVelocity += this.angularAcceleration; + } + } + + @OnlyIn(Dist.CLIENT) + private static class CustomParticleFactory implements IParticleFactory { + private final IAnimatedSprite spriteSet; + + public CustomParticleFactory(IAnimatedSprite spriteSet) { + this.spriteSet = spriteSet; + } + + public Particle makeParticle(BasicParticleType typeIn, ClientWorld worldIn, double x, double y, double z, double xSpeed, double ySpeed, + double zSpeed) { + return new CustomParticle(worldIn, x, y, z, xSpeed, ySpeed, zSpeed, this.spriteSet); + } + } +} diff --git a/src/main/java/studio/halbear/hem/particle/FluorescentLeavesParticlesParticle.java b/src/main/java/studio/halbear/hem/particle/FluorescentLeavesParticlesParticle.java new file mode 100644 index 0000000..b2e72f5 --- /dev/null +++ b/src/main/java/studio/halbear/hem/particle/FluorescentLeavesParticlesParticle.java @@ -0,0 +1,105 @@ + +package studio.halbear.hem.particle; + +import studio.halbear.hem.procedures.FluorescentLeavesParticlesAdditionalParticleExpiryConditionProcedure; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.client.event.ParticleFactoryRegisterEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.particles.ParticleType; +import net.minecraft.particles.BasicParticleType; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.client.particle.SpriteTexturedParticle; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.IParticleRenderType; +import net.minecraft.client.particle.IParticleFactory; +import net.minecraft.client.particle.IAnimatedSprite; +import net.minecraft.client.Minecraft; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) +public class FluorescentLeavesParticlesParticle { + public static final BasicParticleType particle = new BasicParticleType(false); + + @SubscribeEvent + public static void registerParticleType(RegistryEvent.Register> event) { + event.getRegistry().register(particle.setRegistryName("fluorescent_leaves_particles")); + } + + @OnlyIn(Dist.CLIENT) + @SubscribeEvent + public static void registerParticle(ParticleFactoryRegisterEvent event) { + Minecraft.getInstance().particles.registerFactory(particle, CustomParticleFactory::new); + } + + @OnlyIn(Dist.CLIENT) + private static class CustomParticle extends SpriteTexturedParticle { + private final IAnimatedSprite spriteSet; + private float angularVelocity; + private float angularAcceleration; + + protected CustomParticle(ClientWorld world, double x, double y, double z, double vx, double vy, double vz, IAnimatedSprite spriteSet) { + super(world, x, y, z); + this.spriteSet = spriteSet; + this.setSize((float) 0.2, (float) 0.2); + this.particleScale *= (float) 2; + this.maxAge = 200; + this.particleGravity = (float) 0.1; + this.canCollide = true; + this.motionX = vx * 0.3; + this.motionY = vy * 0.3; + this.motionZ = vz * 0.3; + this.angularVelocity = (float) 0.3; + this.angularAcceleration = (float) -0.01; + this.selectSpriteRandomly(spriteSet); + } + + @Override + public int getBrightnessForRender(float partialTick) { + return 15728880; + } + + @Override + public IParticleRenderType getRenderType() { + return IParticleRenderType.PARTICLE_SHEET_LIT; + } + + @Override + public void tick() { + super.tick(); + this.prevParticleAngle = this.particleAngle; + this.particleAngle += this.angularVelocity; + this.angularVelocity += this.angularAcceleration; + double x = this.posX; + double y = this.posY; + double z = this.posZ; + if (FluorescentLeavesParticlesAdditionalParticleExpiryConditionProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("onGround", onGround)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll))) + this.setExpired(); + } + } + + @OnlyIn(Dist.CLIENT) + private static class CustomParticleFactory implements IParticleFactory { + private final IAnimatedSprite spriteSet; + + public CustomParticleFactory(IAnimatedSprite spriteSet) { + this.spriteSet = spriteSet; + } + + public Particle makeParticle(BasicParticleType typeIn, ClientWorld worldIn, double x, double y, double z, double xSpeed, double ySpeed, + double zSpeed) { + return new CustomParticle(worldIn, x, y, z, xSpeed, ySpeed, zSpeed, this.spriteSet); + } + } +} diff --git a/src/main/java/studio/halbear/hem/particle/LavenderParticlesParticle.java b/src/main/java/studio/halbear/hem/particle/LavenderParticlesParticle.java new file mode 100644 index 0000000..f2673ab --- /dev/null +++ b/src/main/java/studio/halbear/hem/particle/LavenderParticlesParticle.java @@ -0,0 +1,78 @@ + +package studio.halbear.hem.particle; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.client.event.ParticleFactoryRegisterEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.particles.ParticleType; +import net.minecraft.particles.BasicParticleType; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.client.particle.SpriteTexturedParticle; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.IParticleRenderType; +import net.minecraft.client.particle.IParticleFactory; +import net.minecraft.client.particle.IAnimatedSprite; +import net.minecraft.client.Minecraft; + +@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) +public class LavenderParticlesParticle { + public static final BasicParticleType particle = new BasicParticleType(false); + + @SubscribeEvent + public static void registerParticleType(RegistryEvent.Register> event) { + event.getRegistry().register(particle.setRegistryName("lavender_particles")); + } + + @OnlyIn(Dist.CLIENT) + @SubscribeEvent + public static void registerParticle(ParticleFactoryRegisterEvent event) { + Minecraft.getInstance().particles.registerFactory(particle, CustomParticleFactory::new); + } + + @OnlyIn(Dist.CLIENT) + private static class CustomParticle extends SpriteTexturedParticle { + private final IAnimatedSprite spriteSet; + + protected CustomParticle(ClientWorld world, double x, double y, double z, double vx, double vy, double vz, IAnimatedSprite spriteSet) { + super(world, x, y, z); + this.spriteSet = spriteSet; + this.setSize((float) 0.2, (float) 0.2); + this.particleScale *= (float) 2; + this.maxAge = (int) Math.max(1, 60 + (this.rand.nextInt(80) - 40)); + this.particleGravity = (float) -0.05; + this.canCollide = true; + this.motionX = vx * 0.2; + this.motionY = vy * 0.2; + this.motionZ = vz * 0.2; + this.selectSpriteRandomly(spriteSet); + } + + @Override + public IParticleRenderType getRenderType() { + return IParticleRenderType.PARTICLE_SHEET_OPAQUE; + } + + @Override + public void tick() { + super.tick(); + } + } + + @OnlyIn(Dist.CLIENT) + private static class CustomParticleFactory implements IParticleFactory { + private final IAnimatedSprite spriteSet; + + public CustomParticleFactory(IAnimatedSprite spriteSet) { + this.spriteSet = spriteSet; + } + + public Particle makeParticle(BasicParticleType typeIn, ClientWorld worldIn, double x, double y, double z, double xSpeed, double ySpeed, + double zSpeed) { + return new CustomParticle(worldIn, x, y, z, xSpeed, ySpeed, zSpeed, this.spriteSet); + } + } +} diff --git a/src/main/java/studio/halbear/hem/particle/LilyPadParticlesParticle.java b/src/main/java/studio/halbear/hem/particle/LilyPadParticlesParticle.java new file mode 100644 index 0000000..a61fe45 --- /dev/null +++ b/src/main/java/studio/halbear/hem/particle/LilyPadParticlesParticle.java @@ -0,0 +1,83 @@ + +package studio.halbear.hem.particle; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.client.event.ParticleFactoryRegisterEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.particles.ParticleType; +import net.minecraft.particles.BasicParticleType; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.client.particle.SpriteTexturedParticle; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.IParticleRenderType; +import net.minecraft.client.particle.IParticleFactory; +import net.minecraft.client.particle.IAnimatedSprite; +import net.minecraft.client.Minecraft; + +@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) +public class LilyPadParticlesParticle { + public static final BasicParticleType particle = new BasicParticleType(false); + + @SubscribeEvent + public static void registerParticleType(RegistryEvent.Register> event) { + event.getRegistry().register(particle.setRegistryName("lily_pad_particles")); + } + + @OnlyIn(Dist.CLIENT) + @SubscribeEvent + public static void registerParticle(ParticleFactoryRegisterEvent event) { + Minecraft.getInstance().particles.registerFactory(particle, CustomParticleFactory::new); + } + + @OnlyIn(Dist.CLIENT) + private static class CustomParticle extends SpriteTexturedParticle { + private final IAnimatedSprite spriteSet; + + protected CustomParticle(ClientWorld world, double x, double y, double z, double vx, double vy, double vz, IAnimatedSprite spriteSet) { + super(world, x, y, z); + this.spriteSet = spriteSet; + this.setSize((float) 0.2, (float) 0.2); + this.particleScale *= (float) 1.3; + this.maxAge = (int) Math.max(1, 20 + (this.rand.nextInt(40) - 20)); + this.particleGravity = (float) -0.2; + this.canCollide = true; + this.motionX = vx * 0.2; + this.motionY = vy * 0.2; + this.motionZ = vz * 0.2; + this.selectSpriteRandomly(spriteSet); + } + + @Override + public int getBrightnessForRender(float partialTick) { + return 15728880; + } + + @Override + public IParticleRenderType getRenderType() { + return IParticleRenderType.PARTICLE_SHEET_LIT; + } + + @Override + public void tick() { + super.tick(); + } + } + + @OnlyIn(Dist.CLIENT) + private static class CustomParticleFactory implements IParticleFactory { + private final IAnimatedSprite spriteSet; + + public CustomParticleFactory(IAnimatedSprite spriteSet) { + this.spriteSet = spriteSet; + } + + public Particle makeParticle(BasicParticleType typeIn, ClientWorld worldIn, double x, double y, double z, double xSpeed, double ySpeed, + double zSpeed) { + return new CustomParticle(worldIn, x, y, z, xSpeed, ySpeed, zSpeed, this.spriteSet); + } + } +} diff --git a/src/main/java/studio/halbear/hem/particle/RobotDamageParticle.java b/src/main/java/studio/halbear/hem/particle/RobotDamageParticle.java new file mode 100644 index 0000000..55d3b43 --- /dev/null +++ b/src/main/java/studio/halbear/hem/particle/RobotDamageParticle.java @@ -0,0 +1,98 @@ + +package studio.halbear.hem.particle; + +import studio.halbear.hem.procedures.BlueleavesCollideProcedure; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.client.event.ParticleFactoryRegisterEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.particles.ParticleType; +import net.minecraft.particles.BasicParticleType; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.client.particle.SpriteTexturedParticle; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.IParticleRenderType; +import net.minecraft.client.particle.IParticleFactory; +import net.minecraft.client.particle.IAnimatedSprite; +import net.minecraft.client.Minecraft; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) +public class RobotDamageParticle { + public static final BasicParticleType particle = new BasicParticleType(false); + + @SubscribeEvent + public static void registerParticleType(RegistryEvent.Register> event) { + event.getRegistry().register(particle.setRegistryName("robot_damage")); + } + + @OnlyIn(Dist.CLIENT) + @SubscribeEvent + public static void registerParticle(ParticleFactoryRegisterEvent event) { + Minecraft.getInstance().particles.registerFactory(particle, CustomParticleFactory::new); + } + + @OnlyIn(Dist.CLIENT) + private static class CustomParticle extends SpriteTexturedParticle { + private final IAnimatedSprite spriteSet; + private float angularVelocity; + private float angularAcceleration; + + protected CustomParticle(ClientWorld world, double x, double y, double z, double vx, double vy, double vz, IAnimatedSprite spriteSet) { + super(world, x, y, z); + this.spriteSet = spriteSet; + this.setSize((float) 0.2, (float) 0.2); + this.particleScale *= (float) 1; + this.maxAge = 1000; + this.particleGravity = (float) 0.6; + this.canCollide = true; + this.motionX = vx * 0.2; + this.motionY = vy * 0.2; + this.motionZ = vz * 0.2; + this.angularVelocity = (float) 0.3; + this.angularAcceleration = (float) 0; + this.selectSpriteRandomly(spriteSet); + } + + @Override + public IParticleRenderType getRenderType() { + return IParticleRenderType.PARTICLE_SHEET_OPAQUE; + } + + @Override + public void tick() { + super.tick(); + this.prevParticleAngle = this.particleAngle; + this.particleAngle += this.angularVelocity; + this.angularVelocity += this.angularAcceleration; + double x = this.posX; + double y = this.posY; + double z = this.posZ; + if (BlueleavesCollideProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("onGround", onGround)).collect(HashMap::new, + (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll))) + this.setExpired(); + } + } + + @OnlyIn(Dist.CLIENT) + private static class CustomParticleFactory implements IParticleFactory { + private final IAnimatedSprite spriteSet; + + public CustomParticleFactory(IAnimatedSprite spriteSet) { + this.spriteSet = spriteSet; + } + + public Particle makeParticle(BasicParticleType typeIn, ClientWorld worldIn, double x, double y, double z, double xSpeed, double ySpeed, + double zSpeed) { + return new CustomParticle(worldIn, x, y, z, xSpeed, ySpeed, zSpeed, this.spriteSet); + } + } +} diff --git a/src/main/java/studio/halbear/hem/particle/SevereDamageParticlesParticle.java b/src/main/java/studio/halbear/hem/particle/SevereDamageParticlesParticle.java new file mode 100644 index 0000000..0dfb9f5 --- /dev/null +++ b/src/main/java/studio/halbear/hem/particle/SevereDamageParticlesParticle.java @@ -0,0 +1,85 @@ + +package studio.halbear.hem.particle; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.client.event.ParticleFactoryRegisterEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.particles.ParticleType; +import net.minecraft.particles.BasicParticleType; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.client.particle.SpriteTexturedParticle; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.IParticleRenderType; +import net.minecraft.client.particle.IParticleFactory; +import net.minecraft.client.particle.IAnimatedSprite; +import net.minecraft.client.Minecraft; + +@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) +public class SevereDamageParticlesParticle { + public static final BasicParticleType particle = new BasicParticleType(false); + + @SubscribeEvent + public static void registerParticleType(RegistryEvent.Register> event) { + event.getRegistry().register(particle.setRegistryName("severe_damage_particles")); + } + + @OnlyIn(Dist.CLIENT) + @SubscribeEvent + public static void registerParticle(ParticleFactoryRegisterEvent event) { + Minecraft.getInstance().particles.registerFactory(particle, CustomParticleFactory::new); + } + + @OnlyIn(Dist.CLIENT) + private static class CustomParticle extends SpriteTexturedParticle { + private final IAnimatedSprite spriteSet; + private float angularVelocity; + private float angularAcceleration; + + protected CustomParticle(ClientWorld world, double x, double y, double z, double vx, double vy, double vz, IAnimatedSprite spriteSet) { + super(world, x, y, z); + this.spriteSet = spriteSet; + this.setSize((float) 0.2, (float) 0.2); + this.particleScale *= (float) 1.5; + this.maxAge = (int) Math.max(1, 35 + (this.rand.nextInt(40) - 20)); + this.particleGravity = (float) 0.4; + this.canCollide = true; + this.motionX = vx * 0.3; + this.motionY = vy * 0.3; + this.motionZ = vz * 0.3; + this.angularVelocity = (float) 0.1; + this.angularAcceleration = (float) 0; + this.selectSpriteRandomly(spriteSet); + } + + @Override + public IParticleRenderType getRenderType() { + return IParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; + } + + @Override + public void tick() { + super.tick(); + this.prevParticleAngle = this.particleAngle; + this.particleAngle += this.angularVelocity; + this.angularVelocity += this.angularAcceleration; + } + } + + @OnlyIn(Dist.CLIENT) + private static class CustomParticleFactory implements IParticleFactory { + private final IAnimatedSprite spriteSet; + + public CustomParticleFactory(IAnimatedSprite spriteSet) { + this.spriteSet = spriteSet; + } + + public Particle makeParticle(BasicParticleType typeIn, ClientWorld worldIn, double x, double y, double z, double xSpeed, double ySpeed, + double zSpeed) { + return new CustomParticle(worldIn, x, y, z, xSpeed, ySpeed, zSpeed, this.spriteSet); + } + } +} diff --git a/src/main/java/studio/halbear/hem/potion/GooedPotionEffect.java b/src/main/java/studio/halbear/hem/potion/GooedPotionEffect.java new file mode 100644 index 0000000..62c6a86 --- /dev/null +++ b/src/main/java/studio/halbear/hem/potion/GooedPotionEffect.java @@ -0,0 +1,99 @@ + +package studio.halbear.hem.potion; + +import studio.halbear.hem.procedures.GooedOnEffectActiveTickProcedure; +import studio.halbear.hem.procedures.GooedEffectStartedappliedProcedure; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.World; +import net.minecraft.potion.EffectType; +import net.minecraft.potion.EffectInstance; +import net.minecraft.potion.Effect; +import net.minecraft.entity.ai.attributes.AttributeModifierManager; +import net.minecraft.entity.LivingEntity; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.Collections; +import java.util.AbstractMap; + +@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) +public class GooedPotionEffect { + @ObjectHolder("hem:gooed") + public static final Effect potion = null; + + @SubscribeEvent + public static void registerEffect(RegistryEvent.Register event) { + event.getRegistry().register(new EffectCustom()); + } + + public static class EffectCustom extends Effect { + public EffectCustom() { + super(EffectType.HARMFUL, -12097002); + setRegistryName("gooed"); + } + + @Override + public String getName() { + return "effect.gooed"; + } + + @Override + public boolean isBeneficial() { + return false; + } + + @Override + public boolean isInstant() { + return false; + } + + @Override + public boolean shouldRenderInvText(EffectInstance effect) { + return true; + } + + @Override + public boolean shouldRender(EffectInstance effect) { + return true; + } + + @Override + public boolean shouldRenderHUD(EffectInstance effect) { + return true; + } + + @Override + public void applyAttributesModifiersToEntity(LivingEntity entity, AttributeModifierManager attributeMapIn, int amplifier) { + World world = entity.world; + double x = entity.getPosX(); + double y = entity.getPosY(); + double z = entity.getPosZ(); + + GooedEffectStartedappliedProcedure.executeProcedure(Collections.emptyMap()); + } + + @Override + public void performEffect(LivingEntity entity, int amplifier) { + World world = entity.world; + double x = entity.getPosX(); + double y = entity.getPosY(); + double z = entity.getPosZ(); + + GooedOnEffectActiveTickProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + + @Override + public boolean isReady(int duration, int amplifier) { + return true; + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/AirboatOnEntityTickUpdateProcedure.java b/src/main/java/studio/halbear/hem/procedures/AirboatOnEntityTickUpdateProcedure.java new file mode 100644 index 0000000..ee1db0c --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/AirboatOnEntityTickUpdateProcedure.java @@ -0,0 +1,202 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.world.IWorld; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.Entity; + +import java.util.stream.Collectors; +import java.util.function.Function; +import java.util.Map; +import java.util.List; +import java.util.Comparator; + +public class AirboatOnEntityTickUpdateProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure AirboatOnEntityTickUpdate!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure AirboatOnEntityTickUpdate!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure AirboatOnEntityTickUpdate!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure AirboatOnEntityTickUpdate!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure AirboatOnEntityTickUpdate!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + Entity entity = (Entity) dependencies.get("entity"); + double Dx = 0; + double Dy = 0; + double TPS = 0; + double Ylevel = 0; + double Iterations = 0; + if (entity.ticksExisted % 5 == 0) { + Dx = (entity.getPosX() - entity.getPersistentData().getDouble("lastPosX")); + Dy = (entity.getPosZ() - entity.getPersistentData().getDouble("lastPosY")); + entity.getPersistentData().putDouble("MetresTravelled", + (entity.getPersistentData().getDouble("MetresTravelled") + Math.abs(Dx) + Math.abs(Dy))); + entity.getPersistentData().putDouble("lastPosX", (entity.getPosX())); + entity.getPersistentData().putDouble("lastPosY", (entity.getPosZ())); + } + { + List _entfound = world + .getEntitiesWithinAABB(Entity.class, + new AxisAlignedBB(x - (9 / 2d), (y - 4) - (9 / 2d), z - (9 / 2d), x + (9 / 2d), (y - 4) + (9 / 2d), z + (9 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, (y - 4), z)).collect(Collectors.toList()); + for (Entity entityiterator : _entfound) { + if (entityiterator.isPassenger() && entityiterator instanceof ServerPlayerEntity) { + if ((entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).PilotingVehicleID == entity.getPersistentData().getDouble("ID")) { + { + double _setval = (entity.getPersistentData().getDouble("Pressure")); + entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.PSI = _setval; + capability.syncPlayerVariables(entityiterator); + }); + } + { + double _setval = (entity.getPersistentData().getDouble("Fuel")); + entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.Fuel = _setval; + capability.syncPlayerVariables(entityiterator); + }); + } + { + double _setval = (entity.getPersistentData().getDouble("Heat")); + entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.Heat = _setval; + capability.syncPlayerVariables(entityiterator); + }); + } + { + double _setval = (entity.getPersistentData().getDouble("MetresTravelled")); + entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleOdometerMetres = _setval; + capability.syncPlayerVariables(entityiterator); + }); + } + entity.rotationYaw = (float) (((entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).VehicleYaw)); + entity.setRenderYawOffset(entity.rotationYaw); + entity.prevRotationYaw = entity.rotationYaw; + if (entity instanceof LivingEntity) { + ((LivingEntity) entity).prevRenderYawOffset = entity.rotationYaw; + ((LivingEntity) entity).rotationYawHead = entity.rotationYaw; + ((LivingEntity) entity).prevRotationYawHead = entity.rotationYaw; + } + entity.rotationPitch = (float) ((entity.rotationPitch)); + entity.getPersistentData().putDouble("Yaw", ((entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).VehicleYaw)); + if ((entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).VehicleIncreasePressure) { + entity.getPersistentData().putBoolean("OpenFlame", (true)); + } else { + entity.getPersistentData().putBoolean("OpenFlame", (false)); + } + if ((entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).VehicleReleasePressure) { + entity.getPersistentData().putBoolean("ReleasePressure", (true)); + } else { + entity.getPersistentData().putBoolean("ReleasePressure", (false)); + } + if ((entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).VehicleForward) { + entity.getPersistentData().putDouble("XVel", (0.05 * entity.getLookVec().x)); + entity.getPersistentData().putDouble("YVel", (0.05 * entity.getLookVec().z)); + } + if ((entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).VehicleBackward) { + entity.getPersistentData().putDouble("YVel", ((-0.05) * entity.getLookVec().z)); + entity.getPersistentData().putDouble("XVel", ((-0.05) * entity.getLookVec().x)); + } + } + } + } + } + entity.getPersistentData().putDouble("Tick", (entity.getPersistentData().getDouble("Tick") - 1)); + if (entity.getMotion().getX() > 2) { + entity.getPersistentData().putDouble("XVel", (2 - entity.getMotion().getX())); + } + if (entity.getMotion().getX() < -2) { + entity.getPersistentData().putDouble("XVel", ((-2) - entity.getMotion().getX())); + } + if (entity.getMotion().getZ() > 2) { + entity.getPersistentData().putDouble("YVel", (2 - entity.getMotion().getZ())); + } + if (entity.getMotion().getZ() < -2) { + entity.getPersistentData().putDouble("YVel", ((-2) - entity.getMotion().getZ())); + } + if (entity.getPersistentData().getDouble("Heat") <= 10 && entity.getPersistentData().getDouble("Pressure") <= 10 + && entity.getMotion().getY() >= -0.5) { + entity.setMotion((entity.getMotion().getX() + entity.getPersistentData().getDouble("XVel")), (entity.getMotion().getY() - 0.05), + (entity.getMotion().getZ() + entity.getPersistentData().getDouble("YVel"))); + } else if (entity.getPersistentData().getDouble("Pressure") > 10) { + entity.setMotion((entity.getMotion().getX() + entity.getPersistentData().getDouble("XVel")), + (entity.getPersistentData().getDouble("Pressure") / 75), + (entity.getMotion().getZ() + entity.getPersistentData().getDouble("YVel"))); + } else if (entity.getPersistentData().getDouble("Pressure") < 10) { + entity.setMotion((entity.getMotion().getX() + entity.getPersistentData().getDouble("XVel")), (entity.getMotion().getY() - 0.05), + (entity.getMotion().getZ() + entity.getPersistentData().getDouble("YVel"))); + } else { + entity.setMotion((entity.getMotion().getX() + entity.getPersistentData().getDouble("XVel")), (entity.getMotion().getY()), + (entity.getMotion().getZ() + entity.getPersistentData().getDouble("YVel"))); + } + entity.getPersistentData().putDouble("YVel", 0); + entity.getPersistentData().putDouble("XVel", 0); + if (entity.getPersistentData().getDouble("Pressure") <= 35 && entity.getPersistentData().getBoolean("OpenFlame")) { + entity.getPersistentData().putDouble("Pressure", + (entity.getPersistentData().getDouble("Pressure") + entity.getPersistentData().getDouble("Heat") / 150)); + } + if (entity.getPersistentData().getBoolean("OpenFlame")) { + world.addParticle(ParticleTypes.LARGE_SMOKE, x, y, z, 0, (entity.getMotion().getY() + 0.2), 0); + } + if (entity.getPersistentData().getDouble("Tick") <= 0) { + entity.getPersistentData().putDouble("Tick", 20); + if (entity.getPersistentData().getBoolean("ReleasePressure")) { + entity.getPersistentData().putDouble("Pressure", Math.round(entity.getPersistentData().getDouble("Pressure") - 1)); + } + if (entity.getPersistentData().getDouble("Pressure") > 10 && entity.getPersistentData().getDouble("Heat") >= 10 + && !entity.getPersistentData().getBoolean("OpenFlame")) { + entity.getPersistentData().putDouble("Pressure", Math.round(entity.getPersistentData().getDouble("Pressure") - 1)); + } else if (entity.getPersistentData().getDouble("Pressure") < 10 && !entity.getPersistentData().getBoolean("ReleasePressure")) { + entity.getPersistentData().putDouble("Pressure", Math.round(entity.getPersistentData().getDouble("Pressure") + 1)); + } + if (entity.getPersistentData().getDouble("Fuel") > 0 && entity.getPersistentData().getDouble("Heat") < 150) { + entity.getPersistentData().putDouble("Heat", (entity.getPersistentData().getDouble("Heat") + 5)); + entity.getPersistentData().putDouble("Fuel", (entity.getPersistentData().getDouble("Fuel") - 1)); + } else if (entity.getPersistentData().getDouble("Fuel") > 0 && entity.getPersistentData().getDouble("Heat") > 0) { + entity.getPersistentData().putDouble("Fuel", (entity.getPersistentData().getDouble("Fuel") - 1)); + } else if (entity.getPersistentData().getDouble("Fuel") <= 0 && entity.getPersistentData().getDouble("Heat") > 0) { + entity.getPersistentData().putDouble("Heat", (entity.getPersistentData().getDouble("Heat") - 1)); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/AirboatOnInitialEntitySpawnProcedure.java b/src/main/java/studio/halbear/hem/procedures/AirboatOnInitialEntitySpawnProcedure.java new file mode 100644 index 0000000..011274e --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/AirboatOnInitialEntitySpawnProcedure.java @@ -0,0 +1,44 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.world.IWorld; +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class AirboatOnInitialEntitySpawnProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure AirboatOnInitialEntitySpawn!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure AirboatOnInitialEntitySpawn!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + Entity entity = (Entity) dependencies.get("entity"); + entity.getPersistentData().putDouble("Tick", 20); + entity.getPersistentData().putDouble("Helium", 100); + entity.getPersistentData().putDouble("Heat", 0); + entity.getPersistentData().putDouble("Fuel", 0); + entity.getPersistentData().putDouble("lastPosX", 0); + entity.getPersistentData().putDouble("lastPosZ", 0); + entity.getPersistentData().putDouble("MetresTravelled", 0); + entity.getPersistentData().putDouble("RPM", 0); + entity.getPersistentData().putDouble("Pressure", 10); + entity.getPersistentData().putBoolean("ReleasePressure", (false)); + entity.getPersistentData().putBoolean("OpenFlame", (false)); + entity.getPersistentData().putDouble("XVel", 0); + entity.getPersistentData().putDouble("YVel", 0); + entity.getPersistentData().putDouble("Yaw", (entity.rotationYaw)); + entity.getPersistentData().putDouble("ID", HemModVariables.WorldVariables.get(world).VehicleID); + HemModVariables.WorldVariables.get(world).VehicleID = (HemModVariables.WorldVariables.get(world).VehicleID + 1); + HemModVariables.WorldVariables.get(world).syncData(world); + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/AirboatRightClickedOnEntityProcedure.java b/src/main/java/studio/halbear/hem/procedures/AirboatRightClickedOnEntityProcedure.java new file mode 100644 index 0000000..17e2f82 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/AirboatRightClickedOnEntityProcedure.java @@ -0,0 +1,84 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.ResourceLocation; +import net.minecraft.tags.ItemTags; +import net.minecraft.item.ItemStack; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class AirboatRightClickedOnEntityProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure AirboatRightClickedOnEntity!"); + return; + } + if (dependencies.get("sourceentity") == null) { + if (!dependencies.containsKey("sourceentity")) + HemMod.LOGGER.warn("Failed to load dependency sourceentity for procedure AirboatRightClickedOnEntity!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + Entity sourceentity = (Entity) dependencies.get("sourceentity"); + if (ItemTags.getCollection().getTagByID(new ResourceLocation("forge:hem_fossilfuel")).contains( + ((sourceentity instanceof LivingEntity) ? ((LivingEntity) sourceentity).getHeldItemMainhand() : ItemStack.EMPTY).getItem())) { + (((sourceentity instanceof LivingEntity) ? ((LivingEntity) sourceentity).getHeldItemMainhand() : ItemStack.EMPTY)).shrink((int) 1); + entity.getPersistentData().putDouble("Fuel", (entity.getPersistentData().getDouble("Fuel") + 5)); + if (sourceentity instanceof PlayerEntity && !sourceentity.world.isRemote()) { + ((PlayerEntity) sourceentity).sendStatusMessage(new StringTextComponent("Vehicle Fueled"), (true)); + } + } + if (!sourceentity.isSneaking() && !entity.isBeingRidden() || sourceentity.isPassenger() && (sourceentity.getRidingEntity()) == entity) { + { + double _setval = (entity.getPersistentData().getDouble("ID")); + sourceentity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.PilotingVehicleID = _setval; + capability.syncPlayerVariables(sourceentity); + }); + } + { + double _setval = (entity.getPersistentData().getDouble("MetresTravelled")); + sourceentity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleOdometerMetres = _setval; + capability.syncPlayerVariables(sourceentity); + }); + } + { + double _setval = (entity.getPersistentData().getDouble("Fuel")); + sourceentity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.Fuel = _setval; + capability.syncPlayerVariables(sourceentity); + }); + } + { + double _setval = (entity.getPersistentData().getDouble("Pressure")); + sourceentity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.PSI = _setval; + capability.syncPlayerVariables(sourceentity); + }); + } + { + double _setval = (entity.getPersistentData().getDouble("Heat")); + sourceentity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.Heat = _setval; + capability.syncPlayerVariables(sourceentity); + }); + } + { + double _setval = (entity.getPersistentData().getDouble("Yaw")); + sourceentity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleYaw = _setval; + capability.syncPlayerVariables(sourceentity); + }); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/AntHillSpawnOnStructureInstanceGeneratedProcedure.java b/src/main/java/studio/halbear/hem/procedures/AntHillSpawnOnStructureInstanceGeneratedProcedure.java new file mode 100644 index 0000000..9e269d3 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/AntHillSpawnOnStructureInstanceGeneratedProcedure.java @@ -0,0 +1,294 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.block.BlueleafDirtBlockBlock; +import studio.halbear.hem.block.AntsBlock; +import studio.halbear.hem.block.AntHillBlock; +import studio.halbear.hem.HemMod; + +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.state.Property; +import net.minecraft.block.Blocks; +import net.minecraft.block.BlockState; + +import java.util.Random; +import java.util.Map; + +public class AntHillSpawnOnStructureInstanceGeneratedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure AntHillSpawnOnStructureInstanceGenerated!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure AntHillSpawnOnStructureInstanceGenerated!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure AntHillSpawnOnStructureInstanceGenerated!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure AntHillSpawnOnStructureInstanceGenerated!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + double Random = 0; + world.setBlockState(new BlockPos(x, y + 1, z), AntHillBlock.block.getDefaultState(), 3); + { + BlockPos _bp = new BlockPos(x, y, z); + BlockState _bs = BlueleafDirtBlockBlock.block.getDefaultState(); + BlockState _bso = world.getBlockState(_bp); + for (Map.Entry, Comparable> entry : _bso.getValues().entrySet()) { + Property _property = _bs.getBlock().getStateContainer().getProperty(entry.getKey().getName()); + if (_property != null && _bs.get(_property) != null) + try { + _bs = _bs.with(_property, (Comparable) entry.getValue()); + } catch (Exception e) { + } + } + world.setBlockState(_bp, _bs, 3); + } + if (Math.random() > 0.5 && BlockTags.getCollection().getTagByID(new ResourceLocation("forge:solid_block")) + .contains((world.getBlockState(new BlockPos(x + 1, y, z))).getBlock())) { + { + BlockPos _bp = new BlockPos(x + 1, y, z); + BlockState _bs = BlueleafDirtBlockBlock.block.getDefaultState(); + BlockState _bso = world.getBlockState(_bp); + for (Map.Entry, Comparable> entry : _bso.getValues().entrySet()) { + Property _property = _bs.getBlock().getStateContainer().getProperty(entry.getKey().getName()); + if (_property != null && _bs.get(_property) != null) + try { + _bs = _bs.with(_property, (Comparable) entry.getValue()); + } catch (Exception e) { + } + } + world.setBlockState(_bp, _bs, 3); + } + if (Math.random() > 0.5 && (world.getBlockState(new BlockPos(x + 1, y + 1, z))).getBlock() == Blocks.AIR) { + { + BlockPos _bp = new BlockPos(x + 1, y + 1, z); + BlockState _bs = AntsBlock.block.getDefaultState(); + BlockState _bso = world.getBlockState(_bp); + for (Map.Entry, Comparable> entry : _bso.getValues().entrySet()) { + Property _property = _bs.getBlock().getStateContainer().getProperty(entry.getKey().getName()); + if (_property != null && _bs.get(_property) != null) + try { + _bs = _bs.with(_property, (Comparable) entry.getValue()); + } catch (Exception e) { + } + } + world.setBlockState(_bp, _bs, 3); + } + } + } + if (Math.random() > 0.5 && BlockTags.getCollection().getTagByID(new ResourceLocation("forge:solid_block")) + .contains((world.getBlockState(new BlockPos(x - 1, y, z))).getBlock())) { + { + BlockPos _bp = new BlockPos(x - 1, y, z); + BlockState _bs = BlueleafDirtBlockBlock.block.getDefaultState(); + BlockState _bso = world.getBlockState(_bp); + for (Map.Entry, Comparable> entry : _bso.getValues().entrySet()) { + Property _property = _bs.getBlock().getStateContainer().getProperty(entry.getKey().getName()); + if (_property != null && _bs.get(_property) != null) + try { + _bs = _bs.with(_property, (Comparable) entry.getValue()); + } catch (Exception e) { + } + } + world.setBlockState(_bp, _bs, 3); + } + if (Math.random() > 0.5 && (world.getBlockState(new BlockPos(x - 1, y + 1, z))).getBlock() == Blocks.AIR) { + { + BlockPos _bp = new BlockPos(x - 1, y + 1, z); + BlockState _bs = AntsBlock.block.getDefaultState(); + BlockState _bso = world.getBlockState(_bp); + for (Map.Entry, Comparable> entry : _bso.getValues().entrySet()) { + Property _property = _bs.getBlock().getStateContainer().getProperty(entry.getKey().getName()); + if (_property != null && _bs.get(_property) != null) + try { + _bs = _bs.with(_property, (Comparable) entry.getValue()); + } catch (Exception e) { + } + } + world.setBlockState(_bp, _bs, 3); + } + } + } + if (Math.random() > 0.5 && BlockTags.getCollection().getTagByID(new ResourceLocation("forge:solid_block")) + .contains((world.getBlockState(new BlockPos(x + 1, y, z - 1))).getBlock())) { + { + BlockPos _bp = new BlockPos(x + 1, y, z - 1); + BlockState _bs = BlueleafDirtBlockBlock.block.getDefaultState(); + BlockState _bso = world.getBlockState(_bp); + for (Map.Entry, Comparable> entry : _bso.getValues().entrySet()) { + Property _property = _bs.getBlock().getStateContainer().getProperty(entry.getKey().getName()); + if (_property != null && _bs.get(_property) != null) + try { + _bs = _bs.with(_property, (Comparable) entry.getValue()); + } catch (Exception e) { + } + } + world.setBlockState(_bp, _bs, 3); + } + if (Math.random() > 0.5 && (world.getBlockState(new BlockPos(x + 1, y + 1, z - 1))).getBlock() == Blocks.AIR) { + { + BlockPos _bp = new BlockPos(x + 1, y + 1, z - 1); + BlockState _bs = AntsBlock.block.getDefaultState(); + BlockState _bso = world.getBlockState(_bp); + for (Map.Entry, Comparable> entry : _bso.getValues().entrySet()) { + Property _property = _bs.getBlock().getStateContainer().getProperty(entry.getKey().getName()); + if (_property != null && _bs.get(_property) != null) + try { + _bs = _bs.with(_property, (Comparable) entry.getValue()); + } catch (Exception e) { + } + } + world.setBlockState(_bp, _bs, 3); + } + } + } + if (Math.random() > 0.5 && BlockTags.getCollection().getTagByID(new ResourceLocation("forge:solid_block")) + .contains((world.getBlockState(new BlockPos(x + 1, y, z + 1))).getBlock())) { + { + BlockPos _bp = new BlockPos(x + 1, y, z + 1); + BlockState _bs = BlueleafDirtBlockBlock.block.getDefaultState(); + BlockState _bso = world.getBlockState(_bp); + for (Map.Entry, Comparable> entry : _bso.getValues().entrySet()) { + Property _property = _bs.getBlock().getStateContainer().getProperty(entry.getKey().getName()); + if (_property != null && _bs.get(_property) != null) + try { + _bs = _bs.with(_property, (Comparable) entry.getValue()); + } catch (Exception e) { + } + } + world.setBlockState(_bp, _bs, 3); + } + if (Math.random() > 0.5 && (world.getBlockState(new BlockPos(x + 1, y + 1, z + 1))).getBlock() == Blocks.AIR) { + { + BlockPos _bp = new BlockPos(x + 1, y + 1, z + 1); + BlockState _bs = AntsBlock.block.getDefaultState(); + BlockState _bso = world.getBlockState(_bp); + for (Map.Entry, Comparable> entry : _bso.getValues().entrySet()) { + Property _property = _bs.getBlock().getStateContainer().getProperty(entry.getKey().getName()); + if (_property != null && _bs.get(_property) != null) + try { + _bs = _bs.with(_property, (Comparable) entry.getValue()); + } catch (Exception e) { + } + } + world.setBlockState(_bp, _bs, 3); + } + } + } + if (Math.random() > 0.5 && BlockTags.getCollection().getTagByID(new ResourceLocation("forge:solid_block")) + .contains((world.getBlockState(new BlockPos(x - 1, y, z + 1))).getBlock())) { + { + BlockPos _bp = new BlockPos(x - 1, y, z + 1); + BlockState _bs = BlueleafDirtBlockBlock.block.getDefaultState(); + BlockState _bso = world.getBlockState(_bp); + for (Map.Entry, Comparable> entry : _bso.getValues().entrySet()) { + Property _property = _bs.getBlock().getStateContainer().getProperty(entry.getKey().getName()); + if (_property != null && _bs.get(_property) != null) + try { + _bs = _bs.with(_property, (Comparable) entry.getValue()); + } catch (Exception e) { + } + } + world.setBlockState(_bp, _bs, 3); + } + if (Math.random() > 0.5 && (world.getBlockState(new BlockPos(x - 1, y + 1, z + 1))).getBlock() == Blocks.AIR) { + { + BlockPos _bp = new BlockPos(x - 1, y + 1, z + 1); + BlockState _bs = AntsBlock.block.getDefaultState(); + BlockState _bso = world.getBlockState(_bp); + for (Map.Entry, Comparable> entry : _bso.getValues().entrySet()) { + Property _property = _bs.getBlock().getStateContainer().getProperty(entry.getKey().getName()); + if (_property != null && _bs.get(_property) != null) + try { + _bs = _bs.with(_property, (Comparable) entry.getValue()); + } catch (Exception e) { + } + } + world.setBlockState(_bp, _bs, 3); + } + } + } + if (Math.random() > 0.5 && BlockTags.getCollection().getTagByID(new ResourceLocation("forge:solid_block")) + .contains((world.getBlockState(new BlockPos(x, y, z + 1))).getBlock())) { + { + BlockPos _bp = new BlockPos(x, y, z + 1); + BlockState _bs = BlueleafDirtBlockBlock.block.getDefaultState(); + BlockState _bso = world.getBlockState(_bp); + for (Map.Entry, Comparable> entry : _bso.getValues().entrySet()) { + Property _property = _bs.getBlock().getStateContainer().getProperty(entry.getKey().getName()); + if (_property != null && _bs.get(_property) != null) + try { + _bs = _bs.with(_property, (Comparable) entry.getValue()); + } catch (Exception e) { + } + } + world.setBlockState(_bp, _bs, 3); + } + if (Math.random() > 0.5 && (world.getBlockState(new BlockPos(x, y + 1, z + 1))).getBlock() == Blocks.AIR) { + { + BlockPos _bp = new BlockPos(x, y + 1, z + 1); + BlockState _bs = AntsBlock.block.getDefaultState(); + BlockState _bso = world.getBlockState(_bp); + for (Map.Entry, Comparable> entry : _bso.getValues().entrySet()) { + Property _property = _bs.getBlock().getStateContainer().getProperty(entry.getKey().getName()); + if (_property != null && _bs.get(_property) != null) + try { + _bs = _bs.with(_property, (Comparable) entry.getValue()); + } catch (Exception e) { + } + } + world.setBlockState(_bp, _bs, 3); + } + } + } + if (Math.random() > 0.5 && BlockTags.getCollection().getTagByID(new ResourceLocation("forge:solid_block")) + .contains((world.getBlockState(new BlockPos(x, y, z - 1))).getBlock())) { + { + BlockPos _bp = new BlockPos(x, y, z - 1); + BlockState _bs = BlueleafDirtBlockBlock.block.getDefaultState(); + BlockState _bso = world.getBlockState(_bp); + for (Map.Entry, Comparable> entry : _bso.getValues().entrySet()) { + Property _property = _bs.getBlock().getStateContainer().getProperty(entry.getKey().getName()); + if (_property != null && _bs.get(_property) != null) + try { + _bs = _bs.with(_property, (Comparable) entry.getValue()); + } catch (Exception e) { + } + } + world.setBlockState(_bp, _bs, 3); + } + if (Math.random() > 0.5 && (world.getBlockState(new BlockPos(x, y + 1, z - 1))).getBlock() == Blocks.AIR) { + { + BlockPos _bp = new BlockPos(x, y + 1, z - 1); + BlockState _bs = AntsBlock.block.getDefaultState(); + BlockState _bso = world.getBlockState(_bp); + for (Map.Entry, Comparable> entry : _bso.getValues().entrySet()) { + Property _property = _bs.getBlock().getStateContainer().getProperty(entry.getKey().getName()); + if (_property != null && _bs.get(_property) != null) + try { + _bs = _bs.with(_property, (Comparable) entry.getValue()); + } catch (Exception e) { + } + } + world.setBlockState(_bp, _bs, 3); + } + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/AntHillUpdateTickProcedure.java b/src/main/java/studio/halbear/hem/procedures/AntHillUpdateTickProcedure.java new file mode 100644 index 0000000..d2b1e45 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/AntHillUpdateTickProcedure.java @@ -0,0 +1,93 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.block.AntsBlock; +import studio.halbear.hem.HemMod; + +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.block.Blocks; + +import java.util.Random; +import java.util.Map; + +public class AntHillUpdateTickProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure AntHillUpdateTick!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure AntHillUpdateTick!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure AntHillUpdateTick!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure AntHillUpdateTick!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + double Random = 0; + Random = Math.random(); + if (Random >= 0.1) { + if ((world.getBlockState(new BlockPos(x + 1, y, z))).getBlock() == Blocks.AIR) { + Random = Math.random(); + if (Random >= 0.75) { + world.setBlockState(new BlockPos(x + 1, y, z), AntsBlock.block.getDefaultState(), 3); + } + } + if ((world.getBlockState(new BlockPos(x - 1, y, z))).getBlock() == Blocks.AIR) { + Random = Math.random(); + if (Random >= 0.75) { + world.setBlockState(new BlockPos(x - 1, y, z), AntsBlock.block.getDefaultState(), 3); + } + } + if ((world.getBlockState(new BlockPos(x - 1, y, z - 1))).getBlock() == Blocks.AIR) { + Random = Math.random(); + if (Random >= 0.75) { + world.setBlockState(new BlockPos(x - 1, y, z - 1), AntsBlock.block.getDefaultState(), 3); + } + } + if ((world.getBlockState(new BlockPos(x + 1, y, z - 1))).getBlock() == Blocks.AIR) { + Random = Math.random(); + if (Random >= 0.75) { + world.setBlockState(new BlockPos(x + 1, y, z - 1), AntsBlock.block.getDefaultState(), 3); + } + } + if ((world.getBlockState(new BlockPos(x - 1, y, z + 1))).getBlock() == Blocks.AIR) { + Random = Math.random(); + if (Random >= 0.75) { + world.setBlockState(new BlockPos(x - 1, y, z + 1), AntsBlock.block.getDefaultState(), 3); + } + } + if ((world.getBlockState(new BlockPos(x + 1, y, z + 1))).getBlock() == Blocks.AIR) { + Random = Math.random(); + if (Random >= 0.75) { + world.setBlockState(new BlockPos(x + 1, y, z + 1), AntsBlock.block.getDefaultState(), 3); + } + } + if ((world.getBlockState(new BlockPos(x, y, z + 1))).getBlock() == Blocks.AIR) { + Random = Math.random(); + if (Random >= 0.75) { + world.setBlockState(new BlockPos(x, y, z + 1), AntsBlock.block.getDefaultState(), 3); + } + } + if ((world.getBlockState(new BlockPos(x, y, z - 1))).getBlock() == Blocks.AIR) { + Random = Math.random(); + if (Random >= 0.75) { + world.setBlockState(new BlockPos(x, y, z - 1), AntsBlock.block.getDefaultState(), 3); + } + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/AntsBlockAddedProcedure.java b/src/main/java/studio/halbear/hem/procedures/AntsBlockAddedProcedure.java new file mode 100644 index 0000000..d44e778 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/AntsBlockAddedProcedure.java @@ -0,0 +1,45 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemMod; + +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.block.Blocks; + +import java.util.Map; + +public class AntsBlockAddedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure AntsBlockAdded!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure AntsBlockAdded!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure AntsBlockAdded!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure AntsBlockAdded!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + if (!BlockTags.getCollection().getTagByID(new ResourceLocation("forge:solid_block")) + .contains((world.getBlockState(new BlockPos(x, y - 1, z))).getBlock())) { + world.setBlockState(new BlockPos(x, y, z), Blocks.AIR.getDefaultState(), 3); + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/AntsEntityWalksOnTheBlockProcedure.java b/src/main/java/studio/halbear/hem/procedures/AntsEntityWalksOnTheBlockProcedure.java new file mode 100644 index 0000000..dd4590c --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/AntsEntityWalksOnTheBlockProcedure.java @@ -0,0 +1,110 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.entity.LadybugEntity; +import studio.halbear.hem.block.AntsBlock; +import studio.halbear.hem.HemMod; + +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.common.MinecraftForge; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.ResourceLocation; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.entity.Entity; +import net.minecraft.block.Blocks; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.Map; + +public class AntsEntityWalksOnTheBlockProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure AntsEntityWalksOnTheBlock!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure AntsEntityWalksOnTheBlock!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure AntsEntityWalksOnTheBlock!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure AntsEntityWalksOnTheBlock!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure AntsEntityWalksOnTheBlock!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + Entity entity = (Entity) dependencies.get("entity"); + if (entity instanceof LadybugEntity.CustomEntity) { + if (world instanceof World && !world.isRemote()) { + ((World) world).playSound(null, new BlockPos(x, y, z), + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.generic.eat")), + SoundCategory.NEUTRAL, (float) 1, (float) 1); + } else { + ((World) world).playSound(x, y, z, + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.generic.eat")), + SoundCategory.NEUTRAL, (float) 1, (float) 1, false); + } + world.playEvent(2001, new BlockPos(x, y, z), Block.getStateId(AntsBlock.block.getDefaultState())); + new Object() { + private int ticks = 0; + private float waitTicks; + private IWorld world; + + public void start(IWorld world, int waitTicks) { + this.waitTicks = waitTicks; + MinecraftForge.EVENT_BUS.register(this); + this.world = world; + } + + @SubscribeEvent + public void tick(TickEvent.ServerTickEvent event) { + if (event.phase == TickEvent.Phase.END) { + this.ticks += 1; + if (this.ticks >= this.waitTicks) + run(); + } + } + + private void run() { + { + BlockPos _bp = new BlockPos(x, y, z); + BlockState _bs = Blocks.AIR.getDefaultState(); + world.setBlockState(_bp, _bs, 3); + } + MinecraftForge.EVENT_BUS.unregister(this); + } + }.start(world, (int) 10); + } else { + { + BlockPos _bp = new BlockPos(x, y, z); + BlockState _bs = Blocks.AIR.getDefaultState(); + world.setBlockState(_bp, _bs, 3); + } + if (world instanceof ServerWorld) { + ((ServerWorld) world).spawnParticle(ParticleTypes.POOF, x, y, z, (int) 3, 0, 0, 0, 0.05); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/BloomedBulbFlowerUpdateTickProcedure.java b/src/main/java/studio/halbear/hem/procedures/BloomedBulbFlowerUpdateTickProcedure.java new file mode 100644 index 0000000..c146788 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/BloomedBulbFlowerUpdateTickProcedure.java @@ -0,0 +1,58 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.block.BulbFlowerBlock; +import studio.halbear.hem.HemMod; + +import net.minecraftforge.registries.ForgeRegistries; + +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.ResourceLocation; +import net.minecraft.block.Blocks; + +import java.util.Map; + +public class BloomedBulbFlowerUpdateTickProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure BloomedBulbFlowerUpdateTick!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure BloomedBulbFlowerUpdateTick!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure BloomedBulbFlowerUpdateTick!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure BloomedBulbFlowerUpdateTick!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + if (!((world instanceof World) ? ((World) world).isDaytime() : false)) { + world.setBlockState(new BlockPos(x, y, z), Blocks.AIR.getDefaultState(), 3); + world.setBlockState(new BlockPos(x, y, z), BulbFlowerBlock.block.getDefaultState(), 3); + if (world instanceof World && !world.isRemote()) { + ((World) world).playSound(null, new BlockPos(x, y, z), + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("block.beehive.exit")), + SoundCategory.BLOCKS, (float) 1, (float) 1); + } else { + ((World) world).playSound(x, y, z, + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("block.beehive.exit")), + SoundCategory.BLOCKS, (float) 1, (float) 1, false); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/BloomedMuncherEntityCollidesInTheBlockProcedure.java b/src/main/java/studio/halbear/hem/procedures/BloomedMuncherEntityCollidesInTheBlockProcedure.java new file mode 100644 index 0000000..e3c7a85 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/BloomedMuncherEntityCollidesInTheBlockProcedure.java @@ -0,0 +1,212 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.particle.SevereDamageParticlesParticle; +import studio.halbear.hem.block.MuncherBlock; +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraftforge.registries.ForgeRegistries; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.ResourceLocation; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.state.Property; +import net.minecraft.potion.Effects; +import net.minecraft.potion.EffectInstance; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.item.ItemEntity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.Entity; +import net.minecraft.block.BlockState; + +import java.util.Map; +import java.util.Collections; + +public class BloomedMuncherEntityCollidesInTheBlockProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure BloomedMuncherEntityCollidesInTheBlock!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure BloomedMuncherEntityCollidesInTheBlock!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure BloomedMuncherEntityCollidesInTheBlock!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure BloomedMuncherEntityCollidesInTheBlock!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure BloomedMuncherEntityCollidesInTheBlock!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + Entity entity = (Entity) dependencies.get("entity"); + if (new Object() { + public boolean getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getBoolean(tag); + return false; + } + }.getValue(world, new BlockPos(x, y, z), "tickable") && (new Object() { + public boolean getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getBoolean(tag); + return false; + } + }.getValue(world, new BlockPos(x, y, z), "eating")) == false) { + if (entity instanceof ServerPlayerEntity || ((entity instanceof LivingEntity) ? ((LivingEntity) entity).getMaxHealth() : -1) < 50 + && !(entity instanceof ItemEntity) && !(entity instanceof ServerPlayerEntity)) { + if (!world.isRemote()) { + BlockPos _bp = new BlockPos(x, y, z); + TileEntity _tileEntity = world.getTileEntity(_bp); + BlockState _bs = world.getBlockState(_bp); + if (_tileEntity != null) + _tileEntity.getTileData().putBoolean("eating", (true)); + if (world instanceof World) + ((World) world).notifyBlockUpdate(_bp, _bs, _bs, 3); + } + if (!world.isRemote()) { + BlockPos _bp = new BlockPos(x, y, z); + TileEntity _tileEntity = world.getTileEntity(_bp); + BlockState _bs = world.getBlockState(_bp); + if (_tileEntity != null) + _tileEntity.getTileData().putDouble("bites", (5 + Math.round(5 * Math.random()))); + if (world instanceof World) + ((World) world).notifyBlockUpdate(_bp, _bs, _bs, 3); + } + if (!world.isRemote()) { + BlockPos _bp = new BlockPos(x, y, z); + TileEntity _tileEntity = world.getTileEntity(_bp); + BlockState _bs = world.getBlockState(_bp); + if (_tileEntity != null) + _tileEntity.getTileData().putDouble("cooldown", 0); + if (world instanceof World) + ((World) world).notifyBlockUpdate(_bp, _bs, _bs, 3); + } + if (!world.isRemote()) { + BlockPos _bp = new BlockPos(x, y, z); + TileEntity _tileEntity = world.getTileEntity(_bp); + BlockState _bs = world.getBlockState(_bp); + if (_tileEntity != null) + _tileEntity.getTileData().putDouble("maxcooldown", 20); + if (world instanceof World) + ((World) world).notifyBlockUpdate(_bp, _bs, _bs, 3); + } + if (!world.isRemote()) { + BlockPos _bp = new BlockPos(x, y, z); + TileEntity _tileEntity = world.getTileEntity(_bp); + BlockState _bs = world.getBlockState(_bp); + if (_tileEntity != null) + _tileEntity.getTileData().putString("victimuuid", (entity.getUniqueID().toString())); + if (world instanceof World) + ((World) world).notifyBlockUpdate(_bp, _bs, _bs, 3); + } + if (entity instanceof ServerPlayerEntity) { + { + boolean _setval = (true); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.Eaten = _setval; + capability.syncPlayerVariables(entity); + }); + } + { + double _setval = x; + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.LastPlantTrapX = _setval; + capability.syncPlayerVariables(entity); + }); + } + { + double _setval = z; + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.LastPlantTrapZ = _setval; + capability.syncPlayerVariables(entity); + }); + } + { + double _setval = y; + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.LastPlantTrapY = _setval; + capability.syncPlayerVariables(entity); + }); + } + } + entity.setMotion(0, 0.1, 0); + { + Entity _ent = entity; + _ent.setPositionAndUpdate((x + 0.5), y, (z + 0.5)); + if (_ent instanceof ServerPlayerEntity) { + ((ServerPlayerEntity) _ent).connection.setPlayerLocation((x + 0.5), y, (z + 0.5), _ent.rotationYaw, _ent.rotationPitch, + Collections.emptySet()); + } + } + if (entity instanceof LivingEntity) + ((LivingEntity) entity).addPotionEffect(new EffectInstance(Effects.INVISIBILITY, (int) 9999999, (int) 5, (false), (false))); + if (entity instanceof LivingEntity) + ((LivingEntity) entity).addPotionEffect(new EffectInstance(Effects.SLOWNESS, (int) 9999999, (int) 100, (false), (false))); + if (world instanceof World && !world.isRemote()) { + ((World) world).playSound(null, new BlockPos(x, y, z), + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.hoglin.angry")), + SoundCategory.HOSTILE, (float) 0.4, (float) 1); + } else { + ((World) world).playSound(x, y, z, + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.hoglin.angry")), + SoundCategory.HOSTILE, (float) 0.4, (float) 1, false); + } + if (world instanceof ServerWorld) { + ((ServerWorld) world).spawnParticle(SevereDamageParticlesParticle.particle, x, y, z, (int) 10, 0, 2, 0, 0.3); + } + { + BlockPos _bp = new BlockPos(x, y, z); + BlockState _bs = MuncherBlock.block.getDefaultState(); + BlockState _bso = world.getBlockState(_bp); + for (Map.Entry, Comparable> entry : _bso.getValues().entrySet()) { + Property _property = _bs.getBlock().getStateContainer().getProperty(entry.getKey().getName()); + if (_property != null && _bs.get(_property) != null) + try { + _bs = _bs.with(_property, (Comparable) entry.getValue()); + } catch (Exception e) { + } + } + TileEntity _te = world.getTileEntity(_bp); + CompoundNBT _bnbt = null; + if (_te != null) { + _bnbt = _te.write(new CompoundNBT()); + _te.remove(); + } + world.setBlockState(_bp, _bs, 3); + if (_bnbt != null) { + _te = world.getTileEntity(_bp); + if (_te != null) { + try { + _te.read(_bso, _bnbt); + } catch (Exception ignored) { + } + } + } + } + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/BloomedMuncherUpdateTickProcedure.java b/src/main/java/studio/halbear/hem/procedures/BloomedMuncherUpdateTickProcedure.java new file mode 100644 index 0000000..7699ed0 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/BloomedMuncherUpdateTickProcedure.java @@ -0,0 +1,205 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.block.MuncherBlock; +import studio.halbear.hem.HemMod; + +import net.minecraftforge.registries.ForgeRegistries; + +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.ResourceLocation; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.state.Property; +import net.minecraft.entity.projectile.ArrowEntity; +import net.minecraft.entity.item.ItemEntity; +import net.minecraft.entity.item.ArmorStandEntity; +import net.minecraft.entity.Entity; +import net.minecraft.entity.AreaEffectCloudEntity; +import net.minecraft.block.BlockState; + +import java.util.stream.Collectors; +import java.util.function.Function; +import java.util.Map; +import java.util.List; +import java.util.Comparator; + +public class BloomedMuncherUpdateTickProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure BloomedMuncherUpdateTick!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure BloomedMuncherUpdateTick!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure BloomedMuncherUpdateTick!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure BloomedMuncherUpdateTick!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + double entitiesInside = 0; + double entitiesNearby = 0; + if (new Object() { + public boolean getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getBoolean(tag); + return false; + } + }.getValue(world, new BlockPos(x, y, z), "eating")) { + if (new Object() { + public double getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getDouble(tag); + return -1; + } + }.getValue(world, new BlockPos(x, y, z), "cooldown") > 0) { + if (!world.isRemote()) { + BlockPos _bp = new BlockPos(x, y, z); + TileEntity _tileEntity = world.getTileEntity(_bp); + BlockState _bs = world.getBlockState(_bp); + if (_tileEntity != null) + _tileEntity.getTileData().putDouble("cooldown", ((new Object() { + public double getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getDouble(tag); + return -1; + } + }.getValue(world, new BlockPos(x, y, z), "cooldown")) - 1)); + if (world instanceof World) + ((World) world).notifyBlockUpdate(_bp, _bs, _bs, 3); + } + } else { + if (!world.isRemote()) { + BlockPos _bp = new BlockPos(x, y, z); + TileEntity _tileEntity = world.getTileEntity(_bp); + BlockState _bs = world.getBlockState(_bp); + if (_tileEntity != null) + _tileEntity.getTileData().putBoolean("eating", (false)); + if (world instanceof World) + ((World) world).notifyBlockUpdate(_bp, _bs, _bs, 3); + } + if (!world.isRemote()) { + BlockPos _bp = new BlockPos(x, y, z); + TileEntity _tileEntity = world.getTileEntity(_bp); + BlockState _bs = world.getBlockState(_bp); + if (_tileEntity != null) + _tileEntity.getTileData().putString("victimuuid", "nill"); + if (world instanceof World) + ((World) world).notifyBlockUpdate(_bp, _bs, _bs, 3); + } + } + } + if (!(new Object() { + public boolean getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getBoolean(tag); + return false; + } + }.getValue(world, new BlockPos(x, y, z), "eating"))) { + entitiesNearby = 0; + { + List _entfound = world + .getEntitiesWithinAABB(Entity.class, + new AxisAlignedBB(x - (6 / 2d), y - (6 / 2d), z - (6 / 2d), x + (6 / 2d), y + (6 / 2d), z + (6 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).collect(Collectors.toList()); + for (Entity entityiterator : _entfound) { + if (!(entityiterator instanceof ItemEntity) && !(entityiterator instanceof ArrowEntity) + && !(entityiterator instanceof AreaEffectCloudEntity) && !(entityiterator instanceof ArmorStandEntity)) { + entitiesNearby = (entitiesNearby + 1); + } + } + } + if (!((world instanceof World) ? ((World) world).isDaytime() : false) && entitiesNearby == 0) { + { + BlockPos _bp = new BlockPos(x, y, z); + BlockState _bs = MuncherBlock.block.getDefaultState(); + BlockState _bso = world.getBlockState(_bp); + for (Map.Entry, Comparable> entry : _bso.getValues().entrySet()) { + Property _property = _bs.getBlock().getStateContainer().getProperty(entry.getKey().getName()); + if (_property != null && _bs.get(_property) != null) + try { + _bs = _bs.with(_property, (Comparable) entry.getValue()); + } catch (Exception e) { + } + } + world.setBlockState(_bp, _bs, 3); + } + if (world instanceof World && !world.isRemote()) { + ((World) world).playSound(null, new BlockPos(x, y, z), + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("block.beehive.enter")), + SoundCategory.HOSTILE, (float) 1, (float) 1); + } else { + ((World) world).playSound(x, y, z, + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("block.beehive.enter")), + SoundCategory.HOSTILE, (float) 1, (float) 1, false); + } + } else if (Math.random() > 0.99 && entitiesNearby == 0) { + { + BlockPos _bp = new BlockPos(x, y, z); + BlockState _bs = MuncherBlock.block.getDefaultState(); + BlockState _bso = world.getBlockState(_bp); + for (Map.Entry, Comparable> entry : _bso.getValues().entrySet()) { + Property _property = _bs.getBlock().getStateContainer().getProperty(entry.getKey().getName()); + if (_property != null && _bs.get(_property) != null) + try { + _bs = _bs.with(_property, (Comparable) entry.getValue()); + } catch (Exception e) { + } + } + world.setBlockState(_bp, _bs, 3); + } + if (world instanceof World && !world.isRemote()) { + ((World) world).playSound(null, new BlockPos(x, y, z), + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("block.beehive.enter")), + SoundCategory.HOSTILE, (float) 1, (float) 1); + } else { + ((World) world).playSound(x, y, z, + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("block.beehive.enter")), + SoundCategory.HOSTILE, (float) 1, (float) 1, false); + } + } + } + if (!(new Object() { + public boolean getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getBoolean(tag); + return false; + } + }.getValue(world, new BlockPos(x, y, z), "tickable"))) { + if (!world.isRemote()) { + BlockPos _bp = new BlockPos(x, y, z); + TileEntity _tileEntity = world.getTileEntity(_bp); + BlockState _bs = world.getBlockState(_bp); + if (_tileEntity != null) + _tileEntity.getTileData().putBoolean("tickable", (true)); + if (world instanceof World) + ((World) world).notifyBlockUpdate(_bp, _bs, _bs, 3); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/BlueleafFluorescentLeavesParticleSpawningConditionProcedure.java b/src/main/java/studio/halbear/hem/procedures/BlueleafFluorescentLeavesParticleSpawningConditionProcedure.java new file mode 100644 index 0000000..11c1af6 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/BlueleafFluorescentLeavesParticleSpawningConditionProcedure.java @@ -0,0 +1,24 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemMod; + +import net.minecraft.world.World; +import net.minecraft.world.IWorld; + +import java.util.Map; + +public class BlueleafFluorescentLeavesParticleSpawningConditionProcedure { + + public static boolean executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure BlueleafFluorescentLeavesParticleSpawningCondition!"); + return false; + } + IWorld world = (IWorld) dependencies.get("world"); + if (!((world instanceof World) ? ((World) world).isDaytime() : false)) { + return true; + } + return false; + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/BlueleafLavenderConditionProcedure.java b/src/main/java/studio/halbear/hem/procedures/BlueleafLavenderConditionProcedure.java new file mode 100644 index 0000000..b689d83 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/BlueleafLavenderConditionProcedure.java @@ -0,0 +1,27 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemMod; + +import java.util.Map; + +public class BlueleafLavenderConditionProcedure { + + public static boolean executeProcedure(Map dependencies) { + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure BlueleafLavenderCondition!"); + return false; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure BlueleafLavenderCondition!"); + return false; + } + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + if (z < 0 || z <= 0 && x % 24 != 0 || z <= 16 && z > 0 && x % 24 == 0) { + return true; + } + return false; + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/BlueleafLavenderMobplayerCollidesWithPlantProcedure.java b/src/main/java/studio/halbear/hem/procedures/BlueleafLavenderMobplayerCollidesWithPlantProcedure.java new file mode 100644 index 0000000..01f32bb --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/BlueleafLavenderMobplayerCollidesWithPlantProcedure.java @@ -0,0 +1,71 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.particle.LavenderParticlesParticle; +import studio.halbear.hem.HemMod; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.IWorld; +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class BlueleafLavenderMobplayerCollidesWithPlantProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure BlueleafLavenderMobplayerCollidesWithPlant!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure BlueleafLavenderMobplayerCollidesWithPlant!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure BlueleafLavenderMobplayerCollidesWithPlant!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure BlueleafLavenderMobplayerCollidesWithPlant!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure BlueleafLavenderMobplayerCollidesWithPlant!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + Entity entity = (Entity) dependencies.get("entity"); + double zv = 0; + double xv = 0; + xv = (entity.getMotion().getX()); + zv = (entity.getMotion().getZ()); + if (entity.getMotion().getX() < 0) { + xv = (xv * (-1)); + } + if (entity.getMotion().getZ() < 0) { + zv = (zv * (-1)); + } + if (entity.isSprinting()) { + xv = 0.15; + zv = 0.15; + } + if (xv > 0.05 || zv > 0.05) { + if (world instanceof ServerWorld) { + ((ServerWorld) world).spawnParticle(LavenderParticlesParticle.particle, x, (y + 1), z, (int) Math.round(20 * (xv + zv)), 1, 0.5, 1, + 0.1); + } + } + if (entity.getMotion().getY() > 0.05) { + if (world instanceof ServerWorld) { + ((ServerWorld) world).spawnParticle(LavenderParticlesParticle.particle, x, (y + 1), z, (int) 20, 1, 0.5, 1, 0.3); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/BlueleafLavenderUpdateTickProcedure.java b/src/main/java/studio/halbear/hem/procedures/BlueleafLavenderUpdateTickProcedure.java new file mode 100644 index 0000000..263ef65 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/BlueleafLavenderUpdateTickProcedure.java @@ -0,0 +1,42 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.particle.LavenderParticlesParticle; +import studio.halbear.hem.HemMod; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.IWorld; + +import java.util.Map; + +public class BlueleafLavenderUpdateTickProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure BlueleafLavenderUpdateTick!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure BlueleafLavenderUpdateTick!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure BlueleafLavenderUpdateTick!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure BlueleafLavenderUpdateTick!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + if (world instanceof ServerWorld) { + ((ServerWorld) world).spawnParticle(LavenderParticlesParticle.particle, x, y, z, (int) 30, 3, 1, 3, 0.1); + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/BlueleafWheatAdditionalGenerationConditionProcedure.java b/src/main/java/studio/halbear/hem/procedures/BlueleafWheatAdditionalGenerationConditionProcedure.java new file mode 100644 index 0000000..1f509ff --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/BlueleafWheatAdditionalGenerationConditionProcedure.java @@ -0,0 +1,27 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemMod; + +import java.util.Map; + +public class BlueleafWheatAdditionalGenerationConditionProcedure { + + public static boolean executeProcedure(Map dependencies) { + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure BlueleafWheatAdditionalGenerationCondition!"); + return false; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure BlueleafWheatAdditionalGenerationCondition!"); + return false; + } + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + if (z > 16 || z < 16 && z >= 0 && x % 24 == 0 || z >= 16 && x % 24 != 0) { + return true; + } + return false; + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/BlueleavesCollideProcedure.java b/src/main/java/studio/halbear/hem/procedures/BlueleavesCollideProcedure.java new file mode 100644 index 0000000..d254744 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/BlueleavesCollideProcedure.java @@ -0,0 +1,21 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemMod; + +import java.util.Map; + +public class BlueleavesCollideProcedure { + + public static boolean executeProcedure(Map dependencies) { + if (dependencies.get("onGround") == null) { + if (!dependencies.containsKey("onGround")) + HemMod.LOGGER.warn("Failed to load dependency onGround for procedure BlueleavesCollide!"); + return false; + } + boolean onGround = (boolean) dependencies.get("onGround"); + if (onGround) { + return true; + } + return false; + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/Boulder4AdditionalGenerationConditionProcedure.java b/src/main/java/studio/halbear/hem/procedures/Boulder4AdditionalGenerationConditionProcedure.java new file mode 100644 index 0000000..05c38b4 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/Boulder4AdditionalGenerationConditionProcedure.java @@ -0,0 +1,45 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemMod; + +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.tags.BlockTags; + +import java.util.Map; + +public class Boulder4AdditionalGenerationConditionProcedure { + + public static boolean executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure Boulder4AdditionalGenerationCondition!"); + return false; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure Boulder4AdditionalGenerationCondition!"); + return false; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure Boulder4AdditionalGenerationCondition!"); + return false; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure Boulder4AdditionalGenerationCondition!"); + return false; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + if (BlockTags.getCollection().getTagByID(new ResourceLocation("forge:solid_block")) + .contains((world.getBlockState(new BlockPos(x, y - 1, z))).getBlock())) { + return true; + } + return false; + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/BulbFlowerPlantRightClickedProcedure.java b/src/main/java/studio/halbear/hem/procedures/BulbFlowerPlantRightClickedProcedure.java new file mode 100644 index 0000000..8839932 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/BulbFlowerPlantRightClickedProcedure.java @@ -0,0 +1,74 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.block.BulbFlowerBlock; +import studio.halbear.hem.HemMod; + +import net.minecraftforge.registries.ForgeRegistries; + +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.ResourceLocation; +import net.minecraft.entity.Entity; +import net.minecraft.block.Blocks; + +import java.util.Map; + +public class BulbFlowerPlantRightClickedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure BulbFlowerPlantRightClicked!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure BulbFlowerPlantRightClicked!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure BulbFlowerPlantRightClicked!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure BulbFlowerPlantRightClicked!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure BulbFlowerPlantRightClicked!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + Entity entity = (Entity) dependencies.get("entity"); + double Xv = 0; + double Zv = 0; + Xv = (entity.getMotion().getX()); + Zv = (entity.getMotion().getZ()); + if (Xv < 0) { + Xv = (Xv * (-1)); + } + if (Zv < 0) { + Zv = (Zv * (-1)); + } + world.setBlockState(new BlockPos(x, y, z), Blocks.AIR.getDefaultState(), 3); + world.setBlockState(new BlockPos(x, y, z), BulbFlowerBlock.block.getDefaultState(), 3); + if (world instanceof World && !world.isRemote()) { + ((World) world).playSound(null, new BlockPos(x, y, z), + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("block.beehive.exit")), + SoundCategory.BLOCKS, (float) 1, (float) 1); + } else { + ((World) world).playSound(x, y, z, + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("block.beehive.exit")), + SoundCategory.BLOCKS, (float) 1, (float) 1, false); + } + entity.setMotion((entity.getMotion().getX()), (0.2 + ((Zv + Xv) / 2) * 3), (entity.getLookVec().z)); + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/BulbFlowerUpdateTickProcedure.java b/src/main/java/studio/halbear/hem/procedures/BulbFlowerUpdateTickProcedure.java new file mode 100644 index 0000000..75b6316 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/BulbFlowerUpdateTickProcedure.java @@ -0,0 +1,91 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.particle.LilyPadParticlesParticle; +import studio.halbear.hem.block.BloomedBulbFlowerBlock; +import studio.halbear.hem.HemMod; + +import net.minecraftforge.registries.ForgeRegistries; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.ResourceLocation; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.Entity; +import net.minecraft.block.Blocks; + +import java.util.function.Function; +import java.util.Random; +import java.util.Map; +import java.util.Comparator; + +public class BulbFlowerUpdateTickProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure BulbFlowerUpdateTick!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure BulbFlowerUpdateTick!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure BulbFlowerUpdateTick!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure BulbFlowerUpdateTick!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + double Random = 0; + Random = Math.random(); + if (Random > 0.5 && !(((Entity) world + .getEntitiesWithinAABB(ServerPlayerEntity.class, + new AxisAlignedBB(x - (1.3 / 2d), y - (1.3 / 2d), z - (1.3 / 2d), x + (1.3 / 2d), y + (1.3 / 2d), z + (1.3 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).findFirst().orElse(null)) != null)) { + world.setBlockState(new BlockPos(x, y, z), Blocks.AIR.getDefaultState(), 3); + world.setBlockState(new BlockPos(x, y, z), BloomedBulbFlowerBlock.block.getDefaultState(), 3); + if (world instanceof World && !world.isRemote()) { + ((World) world).playSound(null, new BlockPos(x, y, z), + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("block.beehive.enter")), + SoundCategory.BLOCKS, (float) 1, (float) 1); + } else { + ((World) world).playSound(x, y, z, + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("block.beehive.enter")), + SoundCategory.BLOCKS, (float) 1, (float) 1, false); + } + if (world instanceof ServerWorld) { + ((ServerWorld) world).spawnParticle(LilyPadParticlesParticle.particle, x, y, z, (int) 10, 1, 0, 1, 0.1); + } + } else { + if (world instanceof World && !world.isRemote()) { + ((World) world).playSound(null, new BlockPos(x, y, z), + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.bee.pollinate")), + SoundCategory.BLOCKS, (float) 1, (float) 1); + } else { + ((World) world).playSound(x, y, z, + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.bee.pollinate")), + SoundCategory.BLOCKS, (float) 1, (float) 1, false); + } + if (world instanceof ServerWorld) { + ((ServerWorld) world).spawnParticle(LilyPadParticlesParticle.particle, x, y, z, (int) 3, 1, 0, 1, 0.1); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/ButterflySpawnEggUseOnBlockProcedure.java b/src/main/java/studio/halbear/hem/procedures/ButterflySpawnEggUseOnBlockProcedure.java new file mode 100644 index 0000000..8765fc2 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/ButterflySpawnEggUseOnBlockProcedure.java @@ -0,0 +1,92 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.entity.GiantButterflyWalkingEntity; +import studio.halbear.hem.HemMod; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.world.GameType; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.item.ItemStack; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.SpawnReason; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.ILivingEntityData; +import net.minecraft.entity.Entity; +import net.minecraft.client.network.play.NetworkPlayerInfo; +import net.minecraft.client.entity.player.AbstractClientPlayerEntity; +import net.minecraft.client.Minecraft; + +import java.util.Map; + +public class ButterflySpawnEggUseOnBlockProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure ButterflySpawnEggUseOnBlock!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure ButterflySpawnEggUseOnBlock!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure ButterflySpawnEggUseOnBlock!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure ButterflySpawnEggUseOnBlock!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure ButterflySpawnEggUseOnBlock!"); + return; + } + if (dependencies.get("itemstack") == null) { + if (!dependencies.containsKey("itemstack")) + HemMod.LOGGER.warn("Failed to load dependency itemstack for procedure ButterflySpawnEggUseOnBlock!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + Entity entity = (Entity) dependencies.get("entity"); + ItemStack itemstack = (ItemStack) dependencies.get("itemstack"); + if (!BlockTags.getCollection().getTagByID(new ResourceLocation("forge:solid_block")) + .contains((world.getBlockState(new BlockPos(x, y + 1, z))).getBlock())) { + if (world instanceof ServerWorld) { + Entity entityToSpawn = new GiantButterflyWalkingEntity.CustomEntity(GiantButterflyWalkingEntity.entity, (World) world); + entityToSpawn.setLocationAndAngles(x, (y + 1), z, world.getRandom().nextFloat() * 360F, 0); + if (entityToSpawn instanceof MobEntity) + ((MobEntity) entityToSpawn).onInitialSpawn((ServerWorld) world, world.getDifficultyForLocation(entityToSpawn.getPosition()), + SpawnReason.MOB_SUMMONED, (ILivingEntityData) null, (CompoundNBT) null); + world.addEntity(entityToSpawn); + } + if (!(new Object() { + public boolean checkGamemode(Entity _ent) { + if (_ent instanceof ServerPlayerEntity) { + return ((ServerPlayerEntity) _ent).interactionManager.getGameType() == GameType.CREATIVE; + } else if (_ent instanceof PlayerEntity && _ent.world.isRemote()) { + NetworkPlayerInfo _npi = Minecraft.getInstance().getConnection() + .getPlayerInfo(((AbstractClientPlayerEntity) _ent).getGameProfile().getId()); + return _npi != null && _npi.getGameType() == GameType.CREATIVE; + } + return false; + } + }.checkGamemode(entity))) { + (itemstack).shrink((int) 1); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/CancelFallDamageProcedure.java b/src/main/java/studio/halbear/hem/procedures/CancelFallDamageProcedure.java new file mode 100644 index 0000000..e889e71 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/CancelFallDamageProcedure.java @@ -0,0 +1,94 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.block.GiantLilyPadBlock; +import studio.halbear.hem.HemMod; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.event.entity.living.LivingFallEvent; + +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.entity.Entity; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +public class CancelFallDamageProcedure { + @Mod.EventBusSubscriber + private static class GlobalTrigger { + @SubscribeEvent + public static void onEntityFall(LivingFallEvent event) { + if (event != null && event.getEntity() != null) { + Entity entity = event.getEntity(); + double i = entity.getPosX(); + double j = entity.getPosY(); + double k = entity.getPosZ(); + double damagemultiplier = event.getDamageMultiplier(); + double distance = event.getDistance(); + World world = entity.world; + Map dependencies = new HashMap<>(); + dependencies.put("x", i); + dependencies.put("y", j); + dependencies.put("z", k); + dependencies.put("damagemultiplier", damagemultiplier); + dependencies.put("distance", distance); + dependencies.put("world", world); + dependencies.put("entity", entity); + dependencies.put("event", event); + executeProcedure(dependencies); + } + } + } + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure CancelFallDamage!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure CancelFallDamage!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure CancelFallDamage!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure CancelFallDamage!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure CancelFallDamage!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + Entity entity = (Entity) dependencies.get("entity"); + if ((world.getBlockState(new BlockPos(x, y, z))).getBlock() == GiantLilyPadBlock.block) { + if (dependencies.get("event") != null) { + Object _obj = dependencies.get("event"); + if (_obj instanceof Event) { + Event _evt = (Event) _obj; + if (_evt.isCancelable()) + _evt.setCanceled(true); + } + } + GiantLilyPadEntityCollidesInTheBlockProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("entity", entity), + new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/DanglingFluorescentLeavesBlockValidPlacementConditionProcedure.java b/src/main/java/studio/halbear/hem/procedures/DanglingFluorescentLeavesBlockValidPlacementConditionProcedure.java new file mode 100644 index 0000000..453401f --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/DanglingFluorescentLeavesBlockValidPlacementConditionProcedure.java @@ -0,0 +1,43 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemMod; + +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.block.Blocks; + +import java.util.Map; + +public class DanglingFluorescentLeavesBlockValidPlacementConditionProcedure { + + public static boolean executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure DanglingFluorescentLeavesBlockValidPlacementCondition!"); + return false; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure DanglingFluorescentLeavesBlockValidPlacementCondition!"); + return false; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure DanglingFluorescentLeavesBlockValidPlacementCondition!"); + return false; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure DanglingFluorescentLeavesBlockValidPlacementCondition!"); + return false; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + if ((world.getBlockState(new BlockPos(x, y + 1, z))).getBlock() == Blocks.AIR) { + return false; + } + return true; + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/DanglingFluorescentLeavesNeighbourBlockChangesProcedure.java b/src/main/java/studio/halbear/hem/procedures/DanglingFluorescentLeavesNeighbourBlockChangesProcedure.java new file mode 100644 index 0000000..2802abb --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/DanglingFluorescentLeavesNeighbourBlockChangesProcedure.java @@ -0,0 +1,47 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemMod; + +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.block.Blocks; +import net.minecraft.block.Block; + +import java.util.Map; + +public class DanglingFluorescentLeavesNeighbourBlockChangesProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure DanglingFluorescentLeavesNeighbourBlockChanges!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure DanglingFluorescentLeavesNeighbourBlockChanges!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure DanglingFluorescentLeavesNeighbourBlockChanges!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure DanglingFluorescentLeavesNeighbourBlockChanges!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + if ((world.getBlockState(new BlockPos(x, y + 1, z))).getBlock() == Blocks.AIR) { + if (world instanceof World) { + Block.spawnDrops(world.getBlockState(new BlockPos(x, y, z)), (World) world, new BlockPos(x, y, z)); + world.destroyBlock(new BlockPos(x, y, z), false); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/DormantAgedEmberleafMilitaryBotEntityShakingConditionProcedure.java b/src/main/java/studio/halbear/hem/procedures/DormantAgedEmberleafMilitaryBotEntityShakingConditionProcedure.java new file mode 100644 index 0000000..e24bcbc --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/DormantAgedEmberleafMilitaryBotEntityShakingConditionProcedure.java @@ -0,0 +1,53 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemMod; + +import net.minecraft.world.IWorld; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.Entity; + +import java.util.function.Function; +import java.util.Map; +import java.util.Comparator; + +public class DormantAgedEmberleafMilitaryBotEntityShakingConditionProcedure { + + public static boolean executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure DormantAgedEmberleafMilitaryBotEntityShakingCondition!"); + return false; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure DormantAgedEmberleafMilitaryBotEntityShakingCondition!"); + return false; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure DormantAgedEmberleafMilitaryBotEntityShakingCondition!"); + return false; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure DormantAgedEmberleafMilitaryBotEntityShakingCondition!"); + return false; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + if (((Entity) world + .getEntitiesWithinAABB(ServerPlayerEntity.class, + new AxisAlignedBB(x - (3 / 2d), y - (3 / 2d), z - (3 / 2d), x + (3 / 2d), y + (3 / 2d), z + (3 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).findFirst().orElse(null)) != null) { + return true; + } + return false; + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/DormantAgedEmberleafMilitaryBotOnEntityTickUpdateProcedure.java b/src/main/java/studio/halbear/hem/procedures/DormantAgedEmberleafMilitaryBotOnEntityTickUpdateProcedure.java new file mode 100644 index 0000000..28675b6 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/DormantAgedEmberleafMilitaryBotOnEntityTickUpdateProcedure.java @@ -0,0 +1,134 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.entity.EmberleafMilitaryBotEntity; +import studio.halbear.hem.entity.DormantAgedEmberleafMilitaryBotEntity; +import studio.halbear.hem.HemMod; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.SpawnReason; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.ILivingEntityData; +import net.minecraft.entity.Entity; + +import java.util.function.Function; +import java.util.Map; +import java.util.Comparator; + +public class DormantAgedEmberleafMilitaryBotOnEntityTickUpdateProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure DormantAgedEmberleafMilitaryBotOnEntityTickUpdate!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure DormantAgedEmberleafMilitaryBotOnEntityTickUpdate!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure DormantAgedEmberleafMilitaryBotOnEntityTickUpdate!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure DormantAgedEmberleafMilitaryBotOnEntityTickUpdate!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure DormantAgedEmberleafMilitaryBotOnEntityTickUpdate!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + Entity entity = (Entity) dependencies.get("entity"); + if (((Entity) world + .getEntitiesWithinAABB(ServerPlayerEntity.class, + new AxisAlignedBB(x - (3 / 2d), y - (3 / 2d), z - (3 / 2d), x + (3 / 2d), y + (3 / 2d), z + (3 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).findFirst().orElse(null)) != null) { + if (entity instanceof DormantAgedEmberleafMilitaryBotEntity.CustomEntity) { + if (Math.random() > 0.99) { + if (world instanceof ServerWorld) { + Entity entityToSpawn = new EmberleafMilitaryBotEntity.CustomEntity(EmberleafMilitaryBotEntity.entity, (World) world); + entityToSpawn.setLocationAndAngles(x, y, z, (float) (entity.rotationYaw), (float) 0); + entityToSpawn.setRenderYawOffset((float) (entity.rotationYaw)); + entityToSpawn.setRotationYawHead((float) (entity.rotationYaw)); + if (entityToSpawn instanceof MobEntity) + ((MobEntity) entityToSpawn).onInitialSpawn((ServerWorld) world, + world.getDifficultyForLocation(entityToSpawn.getPosition()), SpawnReason.MOB_SUMMONED, (ILivingEntityData) null, + (CompoundNBT) null); + world.addEntity(entityToSpawn); + } + if (((Entity) world.getEntitiesWithinAABB(EmberleafMilitaryBotEntity.CustomEntity.class, + new AxisAlignedBB(x - (0.5 / 2d), y - (0.5 / 2d), z - (0.5 / 2d), x + (0.5 / 2d), y + (0.5 / 2d), z + (0.5 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).findFirst().orElse(null)) instanceof LivingEntity) + ((LivingEntity) ((Entity) world + .getEntitiesWithinAABB(EmberleafMilitaryBotEntity.CustomEntity.class, new AxisAlignedBB(x - (0.5 / 2d), + y - (0.5 / 2d), z - (0.5 / 2d), x + (0.5 / 2d), y + (0.5 / 2d), z + (0.5 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).findFirst().orElse(null))) + .setHealth((float) ((entity instanceof LivingEntity) ? ((LivingEntity) entity).getHealth() : -1)); + if (!entity.world.isRemote()) + entity.remove(); + if (world instanceof ServerWorld) { + ((ServerWorld) world).spawnParticle(ParticleTypes.CLOUD, x, y, z, (int) 25, 1, 1, 1, 0.2); + } + } + } else { + if (world instanceof ServerWorld) { + Entity entityToSpawn = new EmberleafMilitaryBotEntity.CustomEntity(EmberleafMilitaryBotEntity.entity, (World) world); + entityToSpawn.setLocationAndAngles(x, y, z, (float) (entity.rotationYaw), (float) 0); + entityToSpawn.setRenderYawOffset((float) (entity.rotationYaw)); + entityToSpawn.setRotationYawHead((float) (entity.rotationYaw)); + if (entityToSpawn instanceof MobEntity) + ((MobEntity) entityToSpawn).onInitialSpawn((ServerWorld) world, world.getDifficultyForLocation(entityToSpawn.getPosition()), + SpawnReason.MOB_SUMMONED, (ILivingEntityData) null, (CompoundNBT) null); + world.addEntity(entityToSpawn); + } + if (((Entity) world.getEntitiesWithinAABB(EmberleafMilitaryBotEntity.CustomEntity.class, + new AxisAlignedBB(x - (0.5 / 2d), y - (0.5 / 2d), z - (0.5 / 2d), x + (0.5 / 2d), y + (0.5 / 2d), z + (0.5 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).findFirst().orElse(null)) instanceof LivingEntity) + ((LivingEntity) ((Entity) world.getEntitiesWithinAABB(EmberleafMilitaryBotEntity.CustomEntity.class, + new AxisAlignedBB(x - (0.5 / 2d), y - (0.5 / 2d), z - (0.5 / 2d), x + (0.5 / 2d), y + (0.5 / 2d), z + (0.5 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).findFirst().orElse(null))) + .setHealth((float) ((entity instanceof LivingEntity) ? ((LivingEntity) entity).getHealth() : -1)); + if (!entity.world.isRemote()) + entity.remove(); + if (world instanceof ServerWorld) { + ((ServerWorld) world).spawnParticle(ParticleTypes.CLOUD, x, y, z, (int) 25, 1, 1, 1, 0.2); + } + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/DrivingVehicleCheckProcedure.java b/src/main/java/studio/halbear/hem/procedures/DrivingVehicleCheckProcedure.java new file mode 100644 index 0000000..ae76553 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/DrivingVehicleCheckProcedure.java @@ -0,0 +1,148 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.TickEvent; + +import net.minecraft.world.World; +import net.minecraft.util.ResourceLocation; +import net.minecraft.tags.EntityTypeTags; +import net.minecraft.entity.Entity; + +import java.util.Map; +import java.util.HashMap; + +public class DrivingVehicleCheckProcedure { + @Mod.EventBusSubscriber + private static class GlobalTrigger { + @SubscribeEvent + public static void onPlayerTick(TickEvent.PlayerTickEvent event) { + if (event.phase == TickEvent.Phase.END) { + Entity entity = event.player; + World world = entity.world; + double i = entity.getPosX(); + double j = entity.getPosY(); + double k = entity.getPosZ(); + Map dependencies = new HashMap<>(); + dependencies.put("x", i); + dependencies.put("y", j); + dependencies.put("z", k); + dependencies.put("world", world); + dependencies.put("entity", entity); + dependencies.put("event", event); + executeProcedure(dependencies); + } + } + } + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure DrivingVehicleCheck!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + if ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new HemModVariables.PlayerVariables())).PilotingVehicle + && entity.isPassenger() && !EntityTypeTags.getCollection().getTagByID(new ResourceLocation("forge:vehicle_driver_seat")) + .contains((entity.getRidingEntity()).getType())) { + { + boolean _setval = (false); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.PilotingVehicle = _setval; + capability.syncPlayerVariables(entity); + }); + } + { + boolean _setval = (false); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleForward = _setval; + capability.syncPlayerVariables(entity); + }); + } + { + boolean _setval = (false); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleBackward = _setval; + capability.syncPlayerVariables(entity); + }); + } + { + boolean _setval = (false); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleTurnLeft = _setval; + capability.syncPlayerVariables(entity); + }); + } + { + boolean _setval = (false); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleTurnRight = _setval; + capability.syncPlayerVariables(entity); + }); + } + { + boolean _setval = (false); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleStrafeLeft = _setval; + capability.syncPlayerVariables(entity); + }); + } + { + boolean _setval = (false); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleStrafeRight = _setval; + capability.syncPlayerVariables(entity); + }); + } + { + boolean _setval = (false); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleAccelerate = _setval; + capability.syncPlayerVariables(entity); + }); + } + { + boolean _setval = (false); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleDecelerate = _setval; + capability.syncPlayerVariables(entity); + }); + } + { + boolean _setval = (false); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleIncreasePressure = _setval; + capability.syncPlayerVariables(entity); + }); + } + { + boolean _setval = (false); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleReleasePressure = _setval; + capability.syncPlayerVariables(entity); + }); + } + { + double _setval = (-1); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.PilotingVehicleID = _setval; + capability.syncPlayerVariables(entity); + }); + } + } else if (!(entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).PilotingVehicle && entity.isPassenger() + && EntityTypeTags.getCollection().getTagByID(new ResourceLocation("forge:vehicle_driver_seat")) + .contains((entity.getRidingEntity()).getType())) { + { + boolean _setval = (true); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.PilotingVehicle = _setval; + capability.syncPlayerVariables(entity); + }); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/EmberleafMilitaryBotEntityDiesProcedure.java b/src/main/java/studio/halbear/hem/procedures/EmberleafMilitaryBotEntityDiesProcedure.java new file mode 100644 index 0000000..b027e09 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/EmberleafMilitaryBotEntityDiesProcedure.java @@ -0,0 +1,78 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.entity.EmberleafMilitaryRobotUpperHalfEntity; +import studio.halbear.hem.entity.EmberleafMilitaryRobotLowerHalfEntity; +import studio.halbear.hem.HemMod; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.entity.SpawnReason; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.ILivingEntityData; +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class EmberleafMilitaryBotEntityDiesProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure EmberleafMilitaryBotEntityDies!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure EmberleafMilitaryBotEntityDies!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure EmberleafMilitaryBotEntityDies!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure EmberleafMilitaryBotEntityDies!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure EmberleafMilitaryBotEntityDies!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + Entity entity = (Entity) dependencies.get("entity"); + if (world instanceof ServerWorld) { + Entity entityToSpawn = new EmberleafMilitaryRobotLowerHalfEntity.CustomEntity(EmberleafMilitaryRobotLowerHalfEntity.entity, + (World) world); + entityToSpawn.setLocationAndAngles(x, y, z, (float) (entity.rotationYaw), (float) 0); + entityToSpawn.setRenderYawOffset((float) (entity.rotationYaw)); + entityToSpawn.setRotationYawHead((float) (entity.rotationYaw)); + entityToSpawn.setMotion(0, 0, 0); + if (entityToSpawn instanceof MobEntity) + ((MobEntity) entityToSpawn).onInitialSpawn((ServerWorld) world, world.getDifficultyForLocation(entityToSpawn.getPosition()), + SpawnReason.MOB_SUMMONED, (ILivingEntityData) null, (CompoundNBT) null); + world.addEntity(entityToSpawn); + } + if (world instanceof ServerWorld) { + Entity entityToSpawn = new EmberleafMilitaryRobotUpperHalfEntity.CustomEntity(EmberleafMilitaryRobotUpperHalfEntity.entity, + (World) world); + entityToSpawn.setLocationAndAngles(x, (y + 1), z, (float) (entity.rotationYaw), (float) 0); + entityToSpawn.setRenderYawOffset((float) (entity.rotationYaw)); + entityToSpawn.setRotationYawHead((float) (entity.rotationYaw)); + entityToSpawn.setMotion(0, 0.4, 0); + if (entityToSpawn instanceof MobEntity) + ((MobEntity) entityToSpawn).onInitialSpawn((ServerWorld) world, world.getDifficultyForLocation(entityToSpawn.getPosition()), + SpawnReason.MOB_SUMMONED, (ILivingEntityData) null, (CompoundNBT) null); + world.addEntity(entityToSpawn); + } + if (!entity.world.isRemote()) + entity.remove(); + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/EmberleafMilitaryBotEntityIsHurtProcedure.java b/src/main/java/studio/halbear/hem/procedures/EmberleafMilitaryBotEntityIsHurtProcedure.java new file mode 100644 index 0000000..b563ee6 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/EmberleafMilitaryBotEntityIsHurtProcedure.java @@ -0,0 +1,42 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.particle.RobotDamageParticle; +import studio.halbear.hem.HemMod; + +import net.minecraft.world.IWorld; + +import java.util.Map; + +public class EmberleafMilitaryBotEntityIsHurtProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure EmberleafMilitaryBotEntityIsHurt!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure EmberleafMilitaryBotEntityIsHurt!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure EmberleafMilitaryBotEntityIsHurt!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure EmberleafMilitaryBotEntityIsHurt!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + for (int index0 = 0; index0 < (int) (10); index0++) { + world.addParticle(RobotDamageParticle.particle, x, (y + 1 + Math.random()), z, (-0.5 + 1 * Math.random()), (0.3 + 1 * Math.random()), + (-0.5 + 1 * Math.random())); + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/EmberleafMilitaryBotOnEntityTickUpdateProcedure.java b/src/main/java/studio/halbear/hem/procedures/EmberleafMilitaryBotOnEntityTickUpdateProcedure.java new file mode 100644 index 0000000..e266a7e --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/EmberleafMilitaryBotOnEntityTickUpdateProcedure.java @@ -0,0 +1,97 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.entity.DormantEmberleafMilitaryBotEntity; +import studio.halbear.hem.HemMod; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.SpawnReason; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.ILivingEntityData; +import net.minecraft.entity.Entity; + +import java.util.function.Function; +import java.util.Map; +import java.util.Comparator; + +public class EmberleafMilitaryBotOnEntityTickUpdateProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure EmberleafMilitaryBotOnEntityTickUpdate!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure EmberleafMilitaryBotOnEntityTickUpdate!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure EmberleafMilitaryBotOnEntityTickUpdate!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure EmberleafMilitaryBotOnEntityTickUpdate!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure EmberleafMilitaryBotOnEntityTickUpdate!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + Entity entity = (Entity) dependencies.get("entity"); + if (((Entity) world + .getEntitiesWithinAABB(ServerPlayerEntity.class, + new AxisAlignedBB(x - (16 / 2d), y - (16 / 2d), z - (16 / 2d), x + (16 / 2d), y + (16 / 2d), z + (16 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).findFirst().orElse(null)) != null) { + entity.getPersistentData().putDouble("dormantTimer", 100); + } else if (entity.getPersistentData().getDouble("dormantTimer") == 0) { + if (world instanceof ServerWorld) { + Entity entityToSpawn = new DormantEmberleafMilitaryBotEntity.CustomEntity(DormantEmberleafMilitaryBotEntity.entity, (World) world); + entityToSpawn.setLocationAndAngles(x, y, z, (float) (entity.rotationYaw), (float) 0); + entityToSpawn.setRenderYawOffset((float) (entity.rotationYaw)); + entityToSpawn.setRotationYawHead((float) (entity.rotationYaw)); + if (entityToSpawn instanceof MobEntity) + ((MobEntity) entityToSpawn).onInitialSpawn((ServerWorld) world, world.getDifficultyForLocation(entityToSpawn.getPosition()), + SpawnReason.MOB_SUMMONED, (ILivingEntityData) null, (CompoundNBT) null); + world.addEntity(entityToSpawn); + } + if (((Entity) world + .getEntitiesWithinAABB(DormantEmberleafMilitaryBotEntity.CustomEntity.class, + new AxisAlignedBB(x - (0.5 / 2d), y - (0.5 / 2d), z - (0.5 / 2d), x + (0.5 / 2d), y + (0.5 / 2d), z + (0.5 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).findFirst().orElse(null)) instanceof LivingEntity) + ((LivingEntity) ((Entity) world.getEntitiesWithinAABB(DormantEmberleafMilitaryBotEntity.CustomEntity.class, + new AxisAlignedBB(x - (0.5 / 2d), y - (0.5 / 2d), z - (0.5 / 2d), x + (0.5 / 2d), y + (0.5 / 2d), z + (0.5 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).findFirst().orElse(null))) + .setHealth((float) ((entity instanceof LivingEntity) ? ((LivingEntity) entity).getHealth() : -1)); + if (!entity.world.isRemote()) + entity.remove(); + } else { + entity.getPersistentData().putDouble("dormantTimer", (entity.getPersistentData().getDouble("dormantTimer") - 1)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/EmberleafMilitaryRobotLowerHalfOnEntityTickUpdateProcedure.java b/src/main/java/studio/halbear/hem/procedures/EmberleafMilitaryRobotLowerHalfOnEntityTickUpdateProcedure.java new file mode 100644 index 0000000..71e8938 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/EmberleafMilitaryRobotLowerHalfOnEntityTickUpdateProcedure.java @@ -0,0 +1,71 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.particle.RobotDamageParticle; +import studio.halbear.hem.HemMod; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.world.Explosion; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class EmberleafMilitaryRobotLowerHalfOnEntityTickUpdateProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure EmberleafMilitaryRobotLowerHalfOnEntityTickUpdate!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure EmberleafMilitaryRobotLowerHalfOnEntityTickUpdate!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure EmberleafMilitaryRobotLowerHalfOnEntityTickUpdate!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure EmberleafMilitaryRobotLowerHalfOnEntityTickUpdate!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure EmberleafMilitaryRobotLowerHalfOnEntityTickUpdate!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + Entity entity = (Entity) dependencies.get("entity"); + if (world instanceof ServerWorld) { + ((ServerWorld) world).spawnParticle(RobotDamageParticle.particle, x, y, z, (int) 1, 0, 1, 0, 0.3); + } + if (entity.getPersistentData().getDouble("expirationtimer") <= 0) { + if (world instanceof ServerWorld) { + ((ServerWorld) world).spawnParticle(RobotDamageParticle.particle, x, y, z, (int) 25, 0, 1, 0, 0.3); + } + if (world instanceof ServerWorld) { + ((ServerWorld) world).spawnParticle(ParticleTypes.LARGE_SMOKE, x, y, z, (int) 25, 0, 1, 0, 0.3); + } + if (!entity.world.isRemote()) + entity.remove(); + if (world instanceof World && !((World) world).isRemote) { + ((World) world).createExplosion(null, (int) x, (int) y, (int) z, (float) 2, Explosion.Mode.BREAK); + } + } else { + entity.getPersistentData().putDouble("expirationtimer", (entity.getPersistentData().getDouble("expirationtimer") - 1)); + } + if (entity.getPersistentData().getDouble("expirationtimer") == 0 && !entity.getPersistentData().getBoolean("ticking")) { + entity.getPersistentData().putBoolean("ticking", (true)); + entity.getPersistentData().putDouble("expirationtimer", (60 + 200 * Math.random())); + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/EmberleafMilitaryRobotLowerHalfOnInitialEntitySpawnProcedure.java b/src/main/java/studio/halbear/hem/procedures/EmberleafMilitaryRobotLowerHalfOnInitialEntitySpawnProcedure.java new file mode 100644 index 0000000..d161187 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/EmberleafMilitaryRobotLowerHalfOnInitialEntitySpawnProcedure.java @@ -0,0 +1,22 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemMod; + +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class EmberleafMilitaryRobotLowerHalfOnInitialEntitySpawnProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure EmberleafMilitaryRobotLowerHalfOnInitialEntitySpawn!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + entity.getPersistentData().putDouble("expirationtimer", (60 + 200 * Math.random())); + entity.getPersistentData().putBoolean("ticking", (true)); + entity.setMotion((entity.getLookVec().x * 0.5), (entity.getMotion().getY()), (entity.getLookVec().z * 0.5)); + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/FallenLeavesEntityCollidesInTheBlockProcedure.java b/src/main/java/studio/halbear/hem/procedures/FallenLeavesEntityCollidesInTheBlockProcedure.java new file mode 100644 index 0000000..b5c1be0 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/FallenLeavesEntityCollidesInTheBlockProcedure.java @@ -0,0 +1,55 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.particle.BlueLeavesParticle; +import studio.halbear.hem.HemMod; + +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.entity.Entity; +import net.minecraft.block.Blocks; + +import java.util.Map; + +public class FallenLeavesEntityCollidesInTheBlockProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure FallenLeavesEntityCollidesInTheBlock!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure FallenLeavesEntityCollidesInTheBlock!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure FallenLeavesEntityCollidesInTheBlock!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure FallenLeavesEntityCollidesInTheBlock!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure FallenLeavesEntityCollidesInTheBlock!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + Entity entity = (Entity) dependencies.get("entity"); + if (entity.isSprinting()) { + world.setBlockState(new BlockPos(x, y, z), Blocks.AIR.getDefaultState(), 3); + for (int index0 = 0; index0 < (int) (20); index0++) { + world.addParticle(BlueLeavesParticle.particle, x, y, z, (-0.5 + 1 * Math.random()), 0.5, (-0.5 + 1 * Math.random())); + } + } else if (entity.getMotion().getZ() != 0 || entity.getMotion().getX() != 0) { + world.addParticle(BlueLeavesParticle.particle, x, y, z, (-0.3 + 0.6 * Math.random()), 0.3, (-0.3 + 0.6 * Math.random())); + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/FluffaloRightClickedOnEntityProcedure.java b/src/main/java/studio/halbear/hem/procedures/FluffaloRightClickedOnEntityProcedure.java new file mode 100644 index 0000000..866da34 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/FluffaloRightClickedOnEntityProcedure.java @@ -0,0 +1,107 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.item.FluffaloTuftItem; +import studio.halbear.hem.entity.FluffaloShavedEntity; +import studio.halbear.hem.HemMod; + +import net.minecraftforge.registries.ForgeRegistries; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.ResourceLocation; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.item.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.entity.item.ItemEntity; +import net.minecraft.entity.SpawnReason; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.ILivingEntityData; +import net.minecraft.entity.Entity; + +import java.util.Random; +import java.util.Map; + +public class FluffaloRightClickedOnEntityProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure FluffaloRightClickedOnEntity!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure FluffaloRightClickedOnEntity!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure FluffaloRightClickedOnEntity!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure FluffaloRightClickedOnEntity!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure FluffaloRightClickedOnEntity!"); + return; + } + if (dependencies.get("sourceentity") == null) { + if (!dependencies.containsKey("sourceentity")) + HemMod.LOGGER.warn("Failed to load dependency sourceentity for procedure FluffaloRightClickedOnEntity!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + Entity entity = (Entity) dependencies.get("entity"); + Entity sourceentity = (Entity) dependencies.get("sourceentity"); + if (((sourceentity instanceof LivingEntity) ? ((LivingEntity) sourceentity).getHeldItemMainhand() : ItemStack.EMPTY) + .getItem() == Items.SHEARS) { + if (world instanceof ServerWorld) { + Entity entityToSpawn = new FluffaloShavedEntity.CustomEntity(FluffaloShavedEntity.entity, (World) world); + entityToSpawn.setLocationAndAngles(x, y, z, (float) (entity.rotationYaw), (float) 0); + entityToSpawn.setRenderYawOffset((float) (entity.rotationYaw)); + entityToSpawn.setRotationYawHead((float) (entity.rotationYaw)); + entityToSpawn.setMotion((entity.getMotion().getX()), (entity.getMotion().getY()), (entity.getMotion().getZ())); + if (entityToSpawn instanceof MobEntity) + ((MobEntity) entityToSpawn).onInitialSpawn((ServerWorld) world, world.getDifficultyForLocation(entityToSpawn.getPosition()), + SpawnReason.MOB_SUMMONED, (ILivingEntityData) null, (CompoundNBT) null); + world.addEntity(entityToSpawn); + } + if (!entity.world.isRemote()) + entity.remove(); + { + ItemStack _ist = ((sourceentity instanceof LivingEntity) ? ((LivingEntity) sourceentity).getHeldItemMainhand() : ItemStack.EMPTY); + if (_ist.attemptDamageItem((int) 1, new Random(), null)) { + _ist.shrink(1); + _ist.setDamage(0); + } + } + if (world instanceof World && !world.isRemote()) { + ((World) world).playSound(null, new BlockPos(x, y, z), + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.sheep.shear")), + SoundCategory.PLAYERS, (float) 1, (float) 1); + } else { + ((World) world).playSound(x, y, z, + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.sheep.shear")), + SoundCategory.PLAYERS, (float) 1, (float) 1, false); + } + for (int index0 = 0; index0 < (int) (1 + Math.round(5 * Math.random())); index0++) { + if (world instanceof World && !world.isRemote()) { + ItemEntity entityToSpawn = new ItemEntity((World) world, x, y, z, new ItemStack(FluffaloTuftItem.block)); + entityToSpawn.setPickupDelay((int) 10); + world.addEntity(entityToSpawn); + } + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/FluffaloShavedEntityShakingConditionProcedure.java b/src/main/java/studio/halbear/hem/procedures/FluffaloShavedEntityShakingConditionProcedure.java new file mode 100644 index 0000000..aa8f964 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/FluffaloShavedEntityShakingConditionProcedure.java @@ -0,0 +1,10 @@ +package studio.halbear.hem.procedures; + +import java.util.Map; + +public class FluffaloShavedEntityShakingConditionProcedure { + + public static boolean executeProcedure(Map dependencies) { + return true; + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/FluffaloShavedOnEntityTickUpdateProcedure.java b/src/main/java/studio/halbear/hem/procedures/FluffaloShavedOnEntityTickUpdateProcedure.java new file mode 100644 index 0000000..eb10467 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/FluffaloShavedOnEntityTickUpdateProcedure.java @@ -0,0 +1,67 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.entity.FluffaloEntity; +import studio.halbear.hem.HemMod; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.entity.SpawnReason; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.ILivingEntityData; +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class FluffaloShavedOnEntityTickUpdateProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure FluffaloShavedOnEntityTickUpdate!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure FluffaloShavedOnEntityTickUpdate!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure FluffaloShavedOnEntityTickUpdate!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure FluffaloShavedOnEntityTickUpdate!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure FluffaloShavedOnEntityTickUpdate!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + Entity entity = (Entity) dependencies.get("entity"); + entity.getPersistentData().putDouble("GrowthTicks", (entity.getPersistentData().getDouble("GrowthTicks") - 1)); + if (entity.getPersistentData().getDouble("GrowthTicks") <= 0) { + if (world instanceof ServerWorld) { + Entity entityToSpawn = new FluffaloEntity.CustomEntity(FluffaloEntity.entity, (World) world); + entityToSpawn.setLocationAndAngles(x, y, z, (float) (entity.rotationYaw), (float) 0); + entityToSpawn.setRenderYawOffset((float) (entity.rotationYaw)); + entityToSpawn.setRotationYawHead((float) (entity.rotationYaw)); + entityToSpawn.setMotion((entity.getMotion().getX()), (entity.getMotion().getY()), (entity.getMotion().getZ())); + if (entityToSpawn instanceof MobEntity) + ((MobEntity) entityToSpawn).onInitialSpawn((ServerWorld) world, world.getDifficultyForLocation(entityToSpawn.getPosition()), + SpawnReason.MOB_SUMMONED, (ILivingEntityData) null, (CompoundNBT) null); + world.addEntity(entityToSpawn); + } + if (!entity.world.isRemote()) + entity.remove(); + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/FluffaloShavedOnInitialEntitySpawnProcedure.java b/src/main/java/studio/halbear/hem/procedures/FluffaloShavedOnInitialEntitySpawnProcedure.java new file mode 100644 index 0000000..ce9db7b --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/FluffaloShavedOnInitialEntitySpawnProcedure.java @@ -0,0 +1,20 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemMod; + +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class FluffaloShavedOnInitialEntitySpawnProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure FluffaloShavedOnInitialEntitySpawn!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + entity.getPersistentData().putDouble("GrowthTicks", (2000 + 2000 * Math.random())); + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/FluorescentLeavesParticlesAdditionalParticleExpiryConditionProcedure.java b/src/main/java/studio/halbear/hem/procedures/FluorescentLeavesParticlesAdditionalParticleExpiryConditionProcedure.java new file mode 100644 index 0000000..21aafc0 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/FluorescentLeavesParticlesAdditionalParticleExpiryConditionProcedure.java @@ -0,0 +1,59 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.block.FallenLeavesBlock; +import studio.halbear.hem.HemMod; + +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.block.Blocks; + +import java.util.Map; + +public class FluorescentLeavesParticlesAdditionalParticleExpiryConditionProcedure { + + public static boolean executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure FluorescentLeavesParticlesAdditionalParticleExpiryCondition!"); + return false; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure FluorescentLeavesParticlesAdditionalParticleExpiryCondition!"); + return false; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure FluorescentLeavesParticlesAdditionalParticleExpiryCondition!"); + return false; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure FluorescentLeavesParticlesAdditionalParticleExpiryCondition!"); + return false; + } + if (dependencies.get("onGround") == null) { + if (!dependencies.containsKey("onGround")) + HemMod.LOGGER.warn("Failed to load dependency onGround for procedure FluorescentLeavesParticlesAdditionalParticleExpiryCondition!"); + return false; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + boolean onGround = (boolean) dependencies.get("onGround"); + if (onGround) { + if (Math.random() > 0.7) { + if (BlockTags.getCollection().getTagByID(new ResourceLocation("forge:solid_block")) + .contains((world.getBlockState(new BlockPos(x, y - 1, z))).getBlock()) + && (world.getBlockState(new BlockPos(x, y, z))).getBlock() == Blocks.AIR) { + world.setBlockState(new BlockPos(x, y, z), FallenLeavesBlock.block.getDefaultState(), 3); + } + } + return true; + } + return false; + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/GasCanister612litreItemInInventoryTickProcedure.java b/src/main/java/studio/halbear/hem/procedures/GasCanister612litreItemInInventoryTickProcedure.java new file mode 100644 index 0000000..6e44eab --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/GasCanister612litreItemInInventoryTickProcedure.java @@ -0,0 +1,39 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemMod; + +import net.minecraft.item.ItemStack; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class GasCanister612litreItemInInventoryTickProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure GasCanister612litreItemInInventoryTick!"); + return; + } + if (dependencies.get("itemstack") == null) { + if (!dependencies.containsKey("itemstack")) + HemMod.LOGGER.warn("Failed to load dependency itemstack for procedure GasCanister612litreItemInInventoryTick!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + ItemStack itemstack = (ItemStack) dependencies.get("itemstack"); + double Force = 0; + double Weight = 0; + if (!itemstack.getOrCreateTag().getBoolean("Setup")) { + itemstack.getOrCreateTag().putBoolean("Setup", (true)); + itemstack.getOrCreateTag().putDouble("GasFilled", 612); + itemstack.getOrCreateTag().putString("Contents", "Helium"); + } + if ((itemstack.getOrCreateTag().getString("Contents")).equals("Helium")) { + Weight = (10000 * (110 + ((entity instanceof LivingEntity) ? ((LivingEntity) entity).getTotalArmorValue() : 0))); + Force = ((itemstack.getOrCreateTag().getDouble("GasFilled") * (itemstack).getCount()) / Weight); + entity.setMotion(entity.getMotion().getX(), entity.getMotion().getY() + Force, entity.getMotion().getZ()); + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/GasCanister612litreItemIsCraftedsmeltedProcedure.java b/src/main/java/studio/halbear/hem/procedures/GasCanister612litreItemIsCraftedsmeltedProcedure.java new file mode 100644 index 0000000..a579b7d --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/GasCanister612litreItemIsCraftedsmeltedProcedure.java @@ -0,0 +1,21 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemMod; + +import net.minecraft.item.ItemStack; + +import java.util.Map; + +public class GasCanister612litreItemIsCraftedsmeltedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("itemstack") == null) { + if (!dependencies.containsKey("itemstack")) + HemMod.LOGGER.warn("Failed to load dependency itemstack for procedure GasCanister612litreItemIsCraftedsmelted!"); + return; + } + ItemStack itemstack = (ItemStack) dependencies.get("itemstack"); + itemstack.getOrCreateTag().putDouble("GasFilled", 612); + itemstack.getOrCreateTag().putString("Contents", "Helium"); + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/GettingEatenProcedure.java b/src/main/java/studio/halbear/hem/procedures/GettingEatenProcedure.java new file mode 100644 index 0000000..ccc2897 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/GettingEatenProcedure.java @@ -0,0 +1,133 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.TickEvent; + +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.potion.Effects; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.Entity; + +import java.util.Map; +import java.util.HashMap; +import java.util.Collections; + +public class GettingEatenProcedure { + @Mod.EventBusSubscriber + private static class GlobalTrigger { + @SubscribeEvent + public static void onPlayerTick(TickEvent.PlayerTickEvent event) { + if (event.phase == TickEvent.Phase.END) { + Entity entity = event.player; + World world = entity.world; + double i = entity.getPosX(); + double j = entity.getPosY(); + double k = entity.getPosZ(); + Map dependencies = new HashMap<>(); + dependencies.put("x", i); + dependencies.put("y", j); + dependencies.put("z", k); + dependencies.put("world", world); + dependencies.put("entity", entity); + dependencies.put("event", event); + executeProcedure(dependencies); + } + } + } + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure GettingEaten!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure GettingEaten!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + Entity entity = (Entity) dependencies.get("entity"); + if ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new HemModVariables.PlayerVariables())).Eaten + && (entity.getMotion().getY() > 0.15 || entity.getMotion().getZ() != 0 || entity.getMotion().getX() != 0)) { + entity.setMotion(0, 0.01, 0); + { + Entity _ent = entity; + _ent.setPositionAndUpdate( + ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).LastPlantTrapX + 0.5), + ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).LastPlantTrapY), + ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).LastPlantTrapZ + 0.5)); + if (_ent instanceof ServerPlayerEntity) { + ((ServerPlayerEntity) _ent).connection.setPlayerLocation( + ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).LastPlantTrapX + 0.5), + ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).LastPlantTrapY), + ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).LastPlantTrapZ + 0.5), + _ent.rotationYaw, _ent.rotationPitch, Collections.emptySet()); + } + } + } + if ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new HemModVariables.PlayerVariables())).Eaten + && ((new Object() { + public boolean getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getBoolean(tag); + return false; + } + }.getValue(world, + new BlockPos( + (entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).LastPlantTrapX, + (entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).LastPlantTrapY, + (entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).LastPlantTrapZ), + "eating")) == false || !(new Object() { + public String getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getString(tag); + return ""; + } + }.getValue(world, + new BlockPos( + (entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).LastPlantTrapX, + (entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).LastPlantTrapY, + (entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).LastPlantTrapZ), + "victimuuid")).equals(entity.getUniqueID().toString()))) { + { + boolean _setval = (false); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.Eaten = _setval; + capability.syncPlayerVariables(entity); + }); + } + if (entity instanceof LivingEntity) { + ((LivingEntity) entity).removePotionEffect(Effects.SLOWNESS); + } + if (entity instanceof LivingEntity) { + ((LivingEntity) entity).removePotionEffect(Effects.MINING_FATIGUE); + } + if (entity instanceof LivingEntity) { + ((LivingEntity) entity).removePotionEffect(Effects.INVISIBILITY); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/GiantButterflyOnEntityTickUpdateProcedure.java b/src/main/java/studio/halbear/hem/procedures/GiantButterflyOnEntityTickUpdateProcedure.java new file mode 100644 index 0000000..50d3965 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/GiantButterflyOnEntityTickUpdateProcedure.java @@ -0,0 +1,190 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.entity.GiantButterflyWalkingEntity; +import studio.halbear.hem.HemMod; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.SpawnReason; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.ILivingEntityData; +import net.minecraft.entity.Entity; + +import java.util.stream.Collectors; +import java.util.function.Function; +import java.util.Random; +import java.util.Map; +import java.util.List; +import java.util.Comparator; + +public class GiantButterflyOnEntityTickUpdateProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure GiantButterflyOnEntityTickUpdate!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure GiantButterflyOnEntityTickUpdate!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure GiantButterflyOnEntityTickUpdate!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure GiantButterflyOnEntityTickUpdate!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure GiantButterflyOnEntityTickUpdate!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + Entity entity = (Entity) dependencies.get("entity"); + if (entity.getMotion().getY() > -0.15 && entity.getMotion().getX() < 0.015 && entity.getMotion().getZ() < 0.015 + && entity.getMotion().getX() > -0.015 && entity.getMotion().getZ() > -0.015) { + entity.setMotion((entity.getMotion().getX()), (entity.getMotion().getY() - 0.05), (entity.getMotion().getZ())); + } + if (BlockTags.getCollection().getTagByID(new ResourceLocation("forge:solid_block")) + .contains((world.getBlockState(new BlockPos(x, y - 0.2, z))).getBlock()) && entity.getMotion().getX() == 0 + && entity.getMotion().getZ() == 0) { + if (world instanceof ServerWorld) { + Entity entityToSpawn = new GiantButterflyWalkingEntity.CustomEntity(GiantButterflyWalkingEntity.entity, (World) world); + entityToSpawn.setLocationAndAngles(x, y, z, (float) (entity.rotationYaw), (float) (entity.rotationPitch)); + entityToSpawn.setRenderYawOffset((float) (entity.rotationYaw)); + entityToSpawn.setRotationYawHead((float) (entity.rotationYaw)); + entityToSpawn.setMotion((entity.getMotion().getX()), (entity.getMotion().getY()), (entity.getMotion().getZ())); + if (entityToSpawn instanceof MobEntity) + ((MobEntity) entityToSpawn).onInitialSpawn((ServerWorld) world, world.getDifficultyForLocation(entityToSpawn.getPosition()), + SpawnReason.MOB_SUMMONED, (ILivingEntityData) null, (CompoundNBT) null); + world.addEntity(entityToSpawn); + } + if (entity.isBeingRidden()) { + { + List _entfound = world + .getEntitiesWithinAABB(Entity.class, + new AxisAlignedBB(x - (2 / 2d), y - (2 / 2d), z - (2 / 2d), x + (2 / 2d), y + (2 / 2d), z + (2 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).collect(Collectors.toList()); + for (Entity entityiterator : _entfound) { + if (entityiterator instanceof ServerPlayerEntity && entityiterator.isPassenger() + && (entityiterator.getRidingEntity()) == entity) { + entityiterator + .startRiding(((Entity) world + .getEntitiesWithinAABB(GiantButterflyWalkingEntity.CustomEntity.class, new AxisAlignedBB(x - (2 / 2d), + y - (2 / 2d), z - (2 / 2d), x + (2 / 2d), y + (2 / 2d), z + (2 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator + .comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).findFirst().orElse(null))); + ((Entity) world.getEntitiesWithinAABB(GiantButterflyWalkingEntity.CustomEntity.class, + new AxisAlignedBB(x - (2 / 2d), y - (2 / 2d), z - (2 / 2d), x + (2 / 2d), y + (2 / 2d), z + (2 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).findFirst().orElse(null)).getPersistentData().putBoolean("DespawnImmune", (true)); + } + } + } + } + if (!entity.world.isRemote()) + entity.remove(); + } + if (entity.isBeingRidden()) { + if (entity.getPersistentData().getDouble("decisioncooldown") == 0) { + entity.getPersistentData().putDouble("decisioncooldown", (MathHelper.nextInt(new Random(), 30, 120))); + if (Math.random() >= 0.3) { + entity.getPersistentData().putBoolean("move", (true)); + } else { + entity.getPersistentData().putBoolean("move", (false)); + } + if (Math.random() >= 0.5) { + entity.getPersistentData().putDouble("goalyaw", (MathHelper.nextInt(new Random(), -360, 360))); + } + } + if (!world.isAirBlock(new BlockPos(x + entity.getLookVec().x, y, z + entity.getLookVec().z))) { + entity.rotationYaw = (float) ((entity.rotationYaw + 15)); + entity.setRenderYawOffset(entity.rotationYaw); + entity.prevRotationYaw = entity.rotationYaw; + if (entity instanceof LivingEntity) { + ((LivingEntity) entity).prevRenderYawOffset = entity.rotationYaw; + ((LivingEntity) entity).rotationYawHead = entity.rotationYaw; + ((LivingEntity) entity).prevRotationYawHead = entity.rotationYaw; + } + entity.rotationPitch = (float) ((entity.rotationPitch)); + } + if (entity.getPersistentData().getBoolean("move")) { + entity.setMotion((entity.getLookVec().x / 8), (entity.getMotion().getY()), (entity.getLookVec().z / 8)); + } + if (entity.getPersistentData().getDouble("goalyaw") != entity.rotationYaw) { + if (entity.getPersistentData().getDouble("goalyaw") > entity.rotationYaw + 11) { + entity.rotationYaw = (float) ((entity.rotationYaw + 10)); + entity.setRenderYawOffset(entity.rotationYaw); + entity.prevRotationYaw = entity.rotationYaw; + if (entity instanceof LivingEntity) { + ((LivingEntity) entity).prevRenderYawOffset = entity.rotationYaw; + ((LivingEntity) entity).rotationYawHead = entity.rotationYaw; + ((LivingEntity) entity).prevRotationYawHead = entity.rotationYaw; + } + entity.rotationPitch = (float) ((entity.rotationPitch)); + } else if (entity.getPersistentData().getDouble("goalyaw") > entity.rotationYaw) { + entity.rotationYaw = (float) ((entity.rotationYaw + 1)); + entity.setRenderYawOffset(entity.rotationYaw); + entity.prevRotationYaw = entity.rotationYaw; + if (entity instanceof LivingEntity) { + ((LivingEntity) entity).prevRenderYawOffset = entity.rotationYaw; + ((LivingEntity) entity).rotationYawHead = entity.rotationYaw; + ((LivingEntity) entity).prevRotationYawHead = entity.rotationYaw; + } + entity.rotationPitch = (float) ((entity.rotationPitch)); + } + if (entity.getPersistentData().getDouble("goalyaw") < entity.rotationYaw - 11) { + entity.rotationYaw = (float) ((entity.rotationYaw - 10)); + entity.setRenderYawOffset(entity.rotationYaw); + entity.prevRotationYaw = entity.rotationYaw; + if (entity instanceof LivingEntity) { + ((LivingEntity) entity).prevRenderYawOffset = entity.rotationYaw; + ((LivingEntity) entity).rotationYawHead = entity.rotationYaw; + ((LivingEntity) entity).prevRotationYawHead = entity.rotationYaw; + } + entity.rotationPitch = (float) ((entity.rotationPitch)); + } else if (entity.getPersistentData().getDouble("goalyaw") < entity.rotationYaw) { + entity.rotationYaw = (float) ((entity.rotationYaw - 1)); + entity.setRenderYawOffset(entity.rotationYaw); + entity.prevRotationYaw = entity.rotationYaw; + if (entity instanceof LivingEntity) { + ((LivingEntity) entity).prevRenderYawOffset = entity.rotationYaw; + ((LivingEntity) entity).rotationYawHead = entity.rotationYaw; + ((LivingEntity) entity).prevRotationYawHead = entity.rotationYaw; + } + entity.rotationPitch = (float) ((entity.rotationPitch)); + } + } + entity.getPersistentData().putDouble("decisioncooldown", (entity.getPersistentData().getDouble("decisioncooldown") - 1)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/GiantButterflyWalkingNaturalEntitySpawningConditionProcedure.java b/src/main/java/studio/halbear/hem/procedures/GiantButterflyWalkingNaturalEntitySpawningConditionProcedure.java new file mode 100644 index 0000000..239f287 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/GiantButterflyWalkingNaturalEntitySpawningConditionProcedure.java @@ -0,0 +1,55 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemMod; + +import net.minecraft.world.IWorld; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.tags.BlockTags; + +import java.util.Map; + +public class GiantButterflyWalkingNaturalEntitySpawningConditionProcedure { + + public static boolean executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure GiantButterflyWalkingNaturalEntitySpawningCondition!"); + return false; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure GiantButterflyWalkingNaturalEntitySpawningCondition!"); + return false; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure GiantButterflyWalkingNaturalEntitySpawningCondition!"); + return false; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure GiantButterflyWalkingNaturalEntitySpawningCondition!"); + return false; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + if (!(world.func_241828_r().getRegistry(Registry.BIOME_KEY).getKey(world.getBiome(new BlockPos(x, y, z))) != null + && world.func_241828_r().getRegistry(Registry.BIOME_KEY).getKey(world.getBiome(new BlockPos(x, y, z))) + .equals(new ResourceLocation("hem:blueleaf_hayfever_fields"))) + || world.func_241828_r().getRegistry(Registry.BIOME_KEY).getKey(world.getBiome(new BlockPos(x, y, z))) != null + && world.func_241828_r().getRegistry(Registry.BIOME_KEY).getKey(world.getBiome(new BlockPos(x, y, z))) + .equals(new ResourceLocation("hem:blueleaf_hayfever_fields")) + && z < 0) { + if (!BlockTags.getCollection().getTagByID(new ResourceLocation("forge:solid_block")) + .contains((world.getBlockState(new BlockPos(x, y + 1, z))).getBlock())) { + return true; + } + return false; + } + return false; + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/GiantButterflyWalkingOnEntityTickUpdateProcedure.java b/src/main/java/studio/halbear/hem/procedures/GiantButterflyWalkingOnEntityTickUpdateProcedure.java new file mode 100644 index 0000000..5086bc7 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/GiantButterflyWalkingOnEntityTickUpdateProcedure.java @@ -0,0 +1,110 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.entity.LadyBugInFlightEntity; +import studio.halbear.hem.entity.GiantButterflyEntity; +import studio.halbear.hem.HemMod; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.SpawnReason; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.ILivingEntityData; +import net.minecraft.entity.Entity; + +import java.util.stream.Collectors; +import java.util.function.Function; +import java.util.Map; +import java.util.List; +import java.util.Comparator; + +public class GiantButterflyWalkingOnEntityTickUpdateProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure GiantButterflyWalkingOnEntityTickUpdate!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure GiantButterflyWalkingOnEntityTickUpdate!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure GiantButterflyWalkingOnEntityTickUpdate!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure GiantButterflyWalkingOnEntityTickUpdate!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure GiantButterflyWalkingOnEntityTickUpdate!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + Entity entity = (Entity) dependencies.get("entity"); + double random = 0; + random = Math.random(); + if (random >= 0.3 && random <= 0.305 || ((Entity) world + .getEntitiesWithinAABB(LadyBugInFlightEntity.CustomEntity.class, + new AxisAlignedBB(x - (6 / 2d), y - (6 / 2d), z - (6 / 2d), x + (6 / 2d), y + (6 / 2d), z + (6 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).findFirst().orElse(null)) != null) { + if (world instanceof ServerWorld) { + Entity entityToSpawn = new GiantButterflyEntity.CustomEntity(GiantButterflyEntity.entity, (World) world); + entityToSpawn.setLocationAndAngles(x, (y + 0.5), z, (float) (entity.rotationYaw), (float) (entity.rotationPitch)); + entityToSpawn.setRenderYawOffset((float) (entity.rotationYaw)); + entityToSpawn.setRotationYawHead((float) (entity.rotationYaw)); + entityToSpawn.setMotion((entity.getMotion().getX() + entity.getLookVec().x * 0.25), 0.3, + (entity.getMotion().getZ() + entity.getLookVec().z * 0.25)); + if (entityToSpawn instanceof MobEntity) + ((MobEntity) entityToSpawn).onInitialSpawn((ServerWorld) world, world.getDifficultyForLocation(entityToSpawn.getPosition()), + SpawnReason.MOB_SUMMONED, (ILivingEntityData) null, (CompoundNBT) null); + world.addEntity(entityToSpawn); + } + if (entity.isBeingRidden()) { + { + List _entfound = world + .getEntitiesWithinAABB(Entity.class, + new AxisAlignedBB(x - (2 / 2d), y - (2 / 2d), z - (2 / 2d), x + (2 / 2d), y + (2 / 2d), z + (2 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).collect(Collectors.toList()); + for (Entity entityiterator : _entfound) { + if (entityiterator instanceof ServerPlayerEntity && entityiterator.isPassenger() + && (entityiterator.getRidingEntity()) == entity) { + entityiterator + .startRiding(((Entity) world + .getEntitiesWithinAABB(GiantButterflyEntity.CustomEntity.class, new AxisAlignedBB(x - (2 / 2d), + y - (2 / 2d), z - (2 / 2d), x + (2 / 2d), y + (2 / 2d), z + (2 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator + .comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).findFirst().orElse(null))); + } + } + } + } + if (!entity.world.isRemote()) + entity.remove(); + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/GiantLilyPadEntityCollidesInTheBlockProcedure.java b/src/main/java/studio/halbear/hem/procedures/GiantLilyPadEntityCollidesInTheBlockProcedure.java new file mode 100644 index 0000000..45063bc --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/GiantLilyPadEntityCollidesInTheBlockProcedure.java @@ -0,0 +1,67 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.particle.LilyPadParticlesParticle; +import studio.halbear.hem.HemMod; + +import net.minecraftforge.registries.ForgeRegistries; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.ResourceLocation; +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class GiantLilyPadEntityCollidesInTheBlockProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure GiantLilyPadEntityCollidesInTheBlock!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure GiantLilyPadEntityCollidesInTheBlock!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure GiantLilyPadEntityCollidesInTheBlock!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure GiantLilyPadEntityCollidesInTheBlock!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure GiantLilyPadEntityCollidesInTheBlock!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + Entity entity = (Entity) dependencies.get("entity"); + if (entity.getMotion().getY() < -0.25) { + entity.setMotion((entity.getMotion().getX()), (entity.getMotion().getY() * (-1)), (entity.getMotion().getZ())); + if (world instanceof World && !world.isRemote()) { + ((World) world).playSound(null, new BlockPos(x, y, z), + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.slime.jump")), + SoundCategory.BLOCKS, (float) 1, (float) 1); + } else { + ((World) world).playSound(x, y, z, + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.slime.jump")), + SoundCategory.BLOCKS, (float) 1, (float) 1, false); + } + if (world instanceof ServerWorld) { + ((ServerWorld) world).spawnParticle(LilyPadParticlesParticle.particle, x, y, z, (int) 10, 1, 0, 1, 0.5); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/GooedActiveTickConditionProcedure.java b/src/main/java/studio/halbear/hem/procedures/GooedActiveTickConditionProcedure.java new file mode 100644 index 0000000..bd2beb5 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/GooedActiveTickConditionProcedure.java @@ -0,0 +1,23 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemMod; + +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class GooedActiveTickConditionProcedure { + + public static boolean executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure GooedActiveTickCondition!"); + return false; + } + Entity entity = (Entity) dependencies.get("entity"); + if (entity.isInWaterRainOrBubbleColumn()) { + return false; + } + return true; + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/GooedEffectStartedappliedProcedure.java b/src/main/java/studio/halbear/hem/procedures/GooedEffectStartedappliedProcedure.java new file mode 100644 index 0000000..4b0b0e6 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/GooedEffectStartedappliedProcedure.java @@ -0,0 +1,10 @@ +package studio.halbear.hem.procedures; + +import java.util.Map; + +public class GooedEffectStartedappliedProcedure { + + public static void executeProcedure(Map dependencies) { + + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/GooedOnEffectActiveTickProcedure.java b/src/main/java/studio/halbear/hem/procedures/GooedOnEffectActiveTickProcedure.java new file mode 100644 index 0000000..33c2ad2 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/GooedOnEffectActiveTickProcedure.java @@ -0,0 +1,147 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.potion.GooedPotionEffect; +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraftforge.registries.ForgeRegistries; + +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.ResourceLocation; +import net.minecraft.potion.Effects; +import net.minecraft.potion.EffectInstance; +import net.minecraft.item.ItemStack; +import net.minecraft.entity.item.ItemEntity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.Entity; + +import java.util.Map; +import java.util.Collection; + +public class GooedOnEffectActiveTickProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure GooedOnEffectActiveTick!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure GooedOnEffectActiveTick!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure GooedOnEffectActiveTick!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure GooedOnEffectActiveTick!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure GooedOnEffectActiveTick!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + Entity entity = (Entity) dependencies.get("entity"); + ItemStack SpawnedGem = ItemStack.EMPTY; + if (Math.random() > 0.99) { + if (world instanceof World && !world.isRemote()) { + ((World) world).playSound(null, new BlockPos(x, y, z), + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.slime.squish")), + SoundCategory.PLAYERS, (float) 1, (float) 1); + } else { + ((World) world).playSound(x, y, z, + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.slime.squish")), + SoundCategory.PLAYERS, (float) 1, (float) 1, false); + } + } + if (entity.isInWaterRainOrBubbleColumn()) { + if (new Object() { + boolean check(Entity _entity) { + if (_entity instanceof LivingEntity) { + Collection effects = ((LivingEntity) _entity).getActivePotionEffects(); + for (EffectInstance effect : effects) { + if (effect.getPotion() == Effects.SLOWNESS) + return true; + } + } + return false; + } + }.check(entity) && new Object() { + boolean check(Entity _entity) { + if (_entity instanceof LivingEntity) { + Collection effects = ((LivingEntity) _entity).getActivePotionEffects(); + for (EffectInstance effect : effects) { + if (effect.getPotion() == GooedPotionEffect.potion) + return true; + } + } + return false; + } + }.check(entity)) { + if (entity instanceof LivingEntity) + ((LivingEntity) entity).addPotionEffect(new EffectInstance(GooedPotionEffect.potion, (int) (-1), (int) 1)); + if (entity instanceof LivingEntity) + ((LivingEntity) entity).addPotionEffect(new EffectInstance(Effects.SLOWNESS, (int) (-1), (int) 1)); + } + } else if ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).GooCooldown == 0) { + if (entity instanceof LivingEntity) + ((LivingEntity) entity).addPotionEffect(new EffectInstance(Effects.SLOWNESS, (int) 40, (int) 0)); + if (entity instanceof LivingEntity) + ((LivingEntity) entity).addPotionEffect(new EffectInstance(GooedPotionEffect.potion, (int) 40, (int) 0)); + if (!(((entity instanceof LivingEntity) ? ((LivingEntity) entity).getHeldItemMainhand() : ItemStack.EMPTY).getItem() == (ItemStack.EMPTY) + .getItem())) { + if (world instanceof World && !world.isRemote()) { + ((World) world).playSound(null, new BlockPos(x, y, z), + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("block.slime_block.fall")), + SoundCategory.PLAYERS, (float) 1, (float) 1); + } else { + ((World) world).playSound(x, y, z, + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("block.slime_block.fall")), + SoundCategory.PLAYERS, (float) 1, (float) 1, false); + } + SpawnedGem = (((entity instanceof LivingEntity) ? ((LivingEntity) entity).getHeldItemMainhand() : ItemStack.EMPTY).copy()); + ((SpawnedGem)).setCount((int) 1); + if (world instanceof World && !world.isRemote()) { + ItemEntity entityToSpawn = new ItemEntity((World) world, (x + entity.getLookVec().x), y, (z + entity.getLookVec().z), + (SpawnedGem)); + entityToSpawn.setPickupDelay((int) 10); + world.addEntity(entityToSpawn); + } + (((entity instanceof LivingEntity) ? ((LivingEntity) entity).getHeldItemMainhand() : ItemStack.EMPTY)).shrink((int) 1); + } + { + double _setval = (10 + Math.round(10 * Math.random())); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.GooCooldown = _setval; + capability.syncPlayerVariables(entity); + }); + } + } else { + if (entity instanceof LivingEntity) + ((LivingEntity) entity).addPotionEffect(new EffectInstance(Effects.SLOWNESS, (int) 40, (int) 0)); + if (entity instanceof LivingEntity) + ((LivingEntity) entity).addPotionEffect(new EffectInstance(GooedPotionEffect.potion, (int) 40, (int) 0)); + { + double _setval = ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).GooCooldown - 1); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.GooCooldown = _setval; + capability.syncPlayerVariables(entity); + }); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/GooedOverlayDisplayOverlayIngameProcedure.java b/src/main/java/studio/halbear/hem/procedures/GooedOverlayDisplayOverlayIngameProcedure.java new file mode 100644 index 0000000..b90fb7d --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/GooedOverlayDisplayOverlayIngameProcedure.java @@ -0,0 +1,38 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.potion.GooedPotionEffect; +import studio.halbear.hem.HemMod; + +import net.minecraft.potion.EffectInstance; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.Entity; + +import java.util.Map; +import java.util.Collection; + +public class GooedOverlayDisplayOverlayIngameProcedure { + + public static boolean executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure GooedOverlayDisplayOverlayIngame!"); + return false; + } + Entity entity = (Entity) dependencies.get("entity"); + if (new Object() { + boolean check(Entity _entity) { + if (_entity instanceof LivingEntity) { + Collection effects = ((LivingEntity) _entity).getActivePotionEffects(); + for (EffectInstance effect : effects) { + if (effect.getPotion() == GooedPotionEffect.potion) + return true; + } + } + return false; + } + }.check(entity)) { + return true; + } + return false; + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/HotAirBalloonItemRightclickedOnBlockProcedure.java b/src/main/java/studio/halbear/hem/procedures/HotAirBalloonItemRightclickedOnBlockProcedure.java new file mode 100644 index 0000000..8bfd0ec --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/HotAirBalloonItemRightclickedOnBlockProcedure.java @@ -0,0 +1,63 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.entity.HotAirBalloonEntity; +import studio.halbear.hem.HemMod; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.item.ItemStack; +import net.minecraft.entity.SpawnReason; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.ILivingEntityData; +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class HotAirBalloonItemRightclickedOnBlockProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure HotAirBalloonItemRightclickedOnBlock!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure HotAirBalloonItemRightclickedOnBlock!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure HotAirBalloonItemRightclickedOnBlock!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure HotAirBalloonItemRightclickedOnBlock!"); + return; + } + if (dependencies.get("itemstack") == null) { + if (!dependencies.containsKey("itemstack")) + HemMod.LOGGER.warn("Failed to load dependency itemstack for procedure HotAirBalloonItemRightclickedOnBlock!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + ItemStack itemstack = (ItemStack) dependencies.get("itemstack"); + if (world instanceof ServerWorld) { + Entity entityToSpawn = new HotAirBalloonEntity.CustomEntity(HotAirBalloonEntity.entity, (World) world); + entityToSpawn.setLocationAndAngles(x, (y + 1), z, (float) 0, (float) 0); + entityToSpawn.setRenderYawOffset((float) 0); + entityToSpawn.setRotationYawHead((float) 0); + if (entityToSpawn instanceof MobEntity) + ((MobEntity) entityToSpawn).onInitialSpawn((ServerWorld) world, world.getDifficultyForLocation(entityToSpawn.getPosition()), + SpawnReason.MOB_SUMMONED, (ILivingEntityData) null, (CompoundNBT) null); + world.addEntity(entityToSpawn); + } + (itemstack).shrink((int) 1); + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/HotAirBalloonOnEntityTickUpdateProcedure.java b/src/main/java/studio/halbear/hem/procedures/HotAirBalloonOnEntityTickUpdateProcedure.java new file mode 100644 index 0000000..c704b2b --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/HotAirBalloonOnEntityTickUpdateProcedure.java @@ -0,0 +1,176 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.world.IWorld; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.Entity; + +import java.util.stream.Collectors; +import java.util.function.Function; +import java.util.Map; +import java.util.List; +import java.util.Comparator; + +public class HotAirBalloonOnEntityTickUpdateProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure HotAirBalloonOnEntityTickUpdate!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure HotAirBalloonOnEntityTickUpdate!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure HotAirBalloonOnEntityTickUpdate!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure HotAirBalloonOnEntityTickUpdate!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure HotAirBalloonOnEntityTickUpdate!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + Entity entity = (Entity) dependencies.get("entity"); + boolean W = false; + boolean S = false; + boolean A = false; + boolean D = false; + Entity Player = null; + { + List _entfound = world + .getEntitiesWithinAABB(Entity.class, + new AxisAlignedBB(x - (9 / 2d), y - (9 / 2d), z - (9 / 2d), x + (9 / 2d), y + (9 / 2d), z + (9 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).collect(Collectors.toList()); + for (Entity entityiterator : _entfound) { + if (entityiterator.isPassenger() && entityiterator instanceof ServerPlayerEntity) { + if ((entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).PilotingVehicleID == entity.getPersistentData().getDouble("ID")) { + { + double _setval = (entity.getPersistentData().getDouble("Pressure")); + entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.PSI = _setval; + capability.syncPlayerVariables(entityiterator); + }); + } + { + double _setval = (entity.getPersistentData().getDouble("Fuel")); + entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.Fuel = _setval; + capability.syncPlayerVariables(entityiterator); + }); + } + { + double _setval = (entity.getPersistentData().getDouble("Heat")); + entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.Heat = _setval; + capability.syncPlayerVariables(entityiterator); + }); + } + entity.rotationYaw = (float) (((entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).VehicleYaw)); + entity.setRenderYawOffset(entity.rotationYaw); + entity.prevRotationYaw = entity.rotationYaw; + if (entity instanceof LivingEntity) { + ((LivingEntity) entity).prevRenderYawOffset = entity.rotationYaw; + ((LivingEntity) entity).rotationYawHead = entity.rotationYaw; + ((LivingEntity) entity).prevRotationYawHead = entity.rotationYaw; + } + entity.rotationPitch = (float) ((entity.rotationPitch)); + if ((entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).VehicleIncreasePressure) { + entity.getPersistentData().putBoolean("OpenFlame", (true)); + } else { + entity.getPersistentData().putBoolean("OpenFlame", (false)); + } + if ((entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).VehicleForward) { + entity.getPersistentData().putDouble("XVel", (0.025 * entity.getLookVec().x)); + entity.getPersistentData().putDouble("YVel", (0.025 * entity.getLookVec().z)); + } + if ((entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).VehicleBackward) { + entity.getPersistentData().putDouble("YVel", ((-0.025) * entity.getLookVec().z)); + entity.getPersistentData().putDouble("XVel", ((-0.025) * entity.getLookVec().x)); + } + } + } + } + } + entity.getPersistentData().putDouble("Tick", (entity.getPersistentData().getDouble("Tick") - 1)); + if (entity.getMotion().getX() > 0.35) { + entity.getPersistentData().putDouble("XVel", (0.35 - entity.getMotion().getX())); + } + if (entity.getMotion().getX() < -0.35) { + entity.getPersistentData().putDouble("XVel", ((-0.35) - entity.getMotion().getX())); + } + if (entity.getMotion().getZ() > 0.35) { + entity.getPersistentData().putDouble("YVel", (0.35 - entity.getMotion().getZ())); + } + if (entity.getMotion().getZ() < -0.35) { + entity.getPersistentData().putDouble("YVel", ((-0.35) - entity.getMotion().getZ())); + } + if (entity.getPersistentData().getDouble("Heat") <= 10 && entity.getPersistentData().getDouble("Pressure") <= 0 + && entity.getMotion().getY() >= -0.5) { + entity.setMotion((entity.getMotion().getX() + entity.getPersistentData().getDouble("XVel")), (entity.getMotion().getY() - 0.05), + (entity.getMotion().getZ() + entity.getPersistentData().getDouble("YVel"))); + } else if (entity.getPersistentData().getDouble("Pressure") > 0) { + entity.setMotion((entity.getMotion().getX() + entity.getPersistentData().getDouble("XVel")), + (entity.getPersistentData().getDouble("Pressure") / 75), + (entity.getMotion().getZ() + entity.getPersistentData().getDouble("YVel"))); + } else if (entity.getMotion().getY() >= -0.05) { + entity.setMotion((entity.getMotion().getX() + entity.getPersistentData().getDouble("XVel")), (entity.getMotion().getY() - 0.05), + (entity.getMotion().getZ() + entity.getPersistentData().getDouble("YVel"))); + } else { + entity.setMotion((entity.getMotion().getX() + entity.getPersistentData().getDouble("XVel")), (entity.getMotion().getY()), + (entity.getMotion().getZ() + entity.getPersistentData().getDouble("YVel"))); + } + entity.getPersistentData().putDouble("YVel", 0); + entity.getPersistentData().putDouble("XVel", 0); + if (entity.getPersistentData().getDouble("Pressure") <= 35 && entity.getPersistentData().getBoolean("OpenFlame")) { + entity.getPersistentData().putDouble("Pressure", + (entity.getPersistentData().getDouble("Pressure") + entity.getPersistentData().getDouble("Heat") / 150)); + } + if (entity.getPersistentData().getBoolean("OpenFlame")) { + world.addParticle(ParticleTypes.LARGE_SMOKE, x, y, z, 0, (entity.getMotion().getY() + 0.2), 0); + } + if (entity.getPersistentData().getDouble("Tick") <= 0) { + entity.getPersistentData().putDouble("Tick", 20); + if (entity.getPersistentData().getDouble("Pressure") > 0 && entity.getPersistentData().getDouble("Heat") >= 10 + && !entity.getPersistentData().getBoolean("OpenFlame")) { + entity.getPersistentData().putDouble("Pressure", Math.round(entity.getPersistentData().getDouble("Pressure") - 1)); + } else if (entity.getPersistentData().getDouble("Pressure") > 0 && entity.getPersistentData().getDouble("Heat") < 10) { + entity.getPersistentData().putDouble("Pressure", Math.round(entity.getPersistentData().getDouble("Pressure") - 5)); + } + if (entity.getPersistentData().getDouble("Fuel") > 0 && entity.getPersistentData().getDouble("Heat") < 150) { + entity.getPersistentData().putDouble("Heat", (entity.getPersistentData().getDouble("Heat") + 5)); + entity.getPersistentData().putDouble("Fuel", (entity.getPersistentData().getDouble("Fuel") - 1)); + } else if (entity.getPersistentData().getDouble("Fuel") > 0 && entity.getPersistentData().getDouble("Heat") > 0) { + entity.getPersistentData().putDouble("Fuel", (entity.getPersistentData().getDouble("Fuel") - 1)); + } else if (entity.getPersistentData().getDouble("Fuel") <= 0 && entity.getPersistentData().getDouble("Heat") > 0) { + entity.getPersistentData().putDouble("Heat", (entity.getPersistentData().getDouble("Heat") - 1)); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/HotAirBalloonOnInitialEntitySpawnProcedure.java b/src/main/java/studio/halbear/hem/procedures/HotAirBalloonOnInitialEntitySpawnProcedure.java new file mode 100644 index 0000000..45bda55 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/HotAirBalloonOnInitialEntitySpawnProcedure.java @@ -0,0 +1,38 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.world.IWorld; +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class HotAirBalloonOnInitialEntitySpawnProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure HotAirBalloonOnInitialEntitySpawn!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure HotAirBalloonOnInitialEntitySpawn!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + Entity entity = (Entity) dependencies.get("entity"); + entity.getPersistentData().putDouble("Tick", 20); + entity.getPersistentData().putDouble("Heat", 0); + entity.getPersistentData().putDouble("Fuel", 0); + entity.getPersistentData().putDouble("Pressure", 0); + entity.getPersistentData().putBoolean("OpenFlame", (false)); + entity.getPersistentData().putDouble("XVel", 0); + entity.getPersistentData().putDouble("YVel", 0); + entity.getPersistentData().putDouble("Yaw", (entity.rotationYaw)); + entity.getPersistentData().putDouble("ID", HemModVariables.WorldVariables.get(world).VehicleID); + HemModVariables.WorldVariables.get(world).VehicleID = (HemModVariables.WorldVariables.get(world).VehicleID + 1); + HemModVariables.WorldVariables.get(world).syncData(world); + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/HotAirBalloonRightClickedOnEntityProcedure.java b/src/main/java/studio/halbear/hem/procedures/HotAirBalloonRightClickedOnEntityProcedure.java new file mode 100644 index 0000000..633f97c --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/HotAirBalloonRightClickedOnEntityProcedure.java @@ -0,0 +1,49 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.ResourceLocation; +import net.minecraft.tags.ItemTags; +import net.minecraft.item.ItemStack; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class HotAirBalloonRightClickedOnEntityProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure HotAirBalloonRightClickedOnEntity!"); + return; + } + if (dependencies.get("sourceentity") == null) { + if (!dependencies.containsKey("sourceentity")) + HemMod.LOGGER.warn("Failed to load dependency sourceentity for procedure HotAirBalloonRightClickedOnEntity!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + Entity sourceentity = (Entity) dependencies.get("sourceentity"); + if (ItemTags.getCollection().getTagByID(new ResourceLocation("forge:hem_fossilfuel")).contains( + ((sourceentity instanceof LivingEntity) ? ((LivingEntity) sourceentity).getHeldItemMainhand() : ItemStack.EMPTY).getItem())) { + (((sourceentity instanceof LivingEntity) ? ((LivingEntity) sourceentity).getHeldItemMainhand() : ItemStack.EMPTY)).shrink((int) 1); + entity.getPersistentData().putDouble("Fuel", (entity.getPersistentData().getDouble("Fuel") + 5)); + if (sourceentity instanceof PlayerEntity && !sourceentity.world.isRemote()) { + ((PlayerEntity) sourceentity).sendStatusMessage(new StringTextComponent("Vehicle Fueled"), (true)); + } + } + if (!sourceentity.isSneaking() && !entity.isBeingRidden() || sourceentity.isPassenger() && (sourceentity.getRidingEntity()) == entity) { + { + double _setval = (entity.getPersistentData().getDouble("ID")); + sourceentity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.PilotingVehicleID = _setval; + capability.syncPlayerVariables(sourceentity); + }); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/HotAirBalloonUIDisplayOverlayIngame2Procedure.java b/src/main/java/studio/halbear/hem/procedures/HotAirBalloonUIDisplayOverlayIngame2Procedure.java new file mode 100644 index 0000000..b6e1dfb --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/HotAirBalloonUIDisplayOverlayIngame2Procedure.java @@ -0,0 +1,25 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemMod; + +import net.minecraft.util.ResourceLocation; +import net.minecraft.tags.EntityTypeTags; +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class HotAirBalloonUIDisplayOverlayIngame2Procedure { + + public static boolean executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure HotAirBalloonUIDisplayOverlayIngame2!"); + return false; + } + Entity entity = (Entity) dependencies.get("entity"); + if (EntityTypeTags.getCollection().getTagByID(new ResourceLocation("minecraft:skeletons")).contains(entity.getType())) { + return true; + } + return true; + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/HotAirBalloonUIDisplayOverlayIngameProcedure.java b/src/main/java/studio/halbear/hem/procedures/HotAirBalloonUIDisplayOverlayIngameProcedure.java new file mode 100644 index 0000000..d2ed05a --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/HotAirBalloonUIDisplayOverlayIngameProcedure.java @@ -0,0 +1,24 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.entity.HotAirBalloonEntity; +import studio.halbear.hem.HemMod; + +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class HotAirBalloonUIDisplayOverlayIngameProcedure { + + public static boolean executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure HotAirBalloonUIDisplayOverlayIngame!"); + return false; + } + Entity entity = (Entity) dependencies.get("entity"); + if (entity.isPassenger() && (entity.getRidingEntity()) instanceof HotAirBalloonEntity.CustomEntity) { + return true; + } + return false; + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/LadyBugInFlightOnEntityTickUpdateProcedure.java b/src/main/java/studio/halbear/hem/procedures/LadyBugInFlightOnEntityTickUpdateProcedure.java new file mode 100644 index 0000000..d4433d5 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/LadyBugInFlightOnEntityTickUpdateProcedure.java @@ -0,0 +1,100 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.entity.LadybugEntity; +import studio.halbear.hem.entity.GiantButterflyWalkingEntity; +import studio.halbear.hem.entity.GiantButterflyEntity; +import studio.halbear.hem.HemMod; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.SpawnReason; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.ILivingEntityData; +import net.minecraft.entity.Entity; + +import java.util.function.Function; +import java.util.Map; +import java.util.Comparator; + +public class LadyBugInFlightOnEntityTickUpdateProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure LadyBugInFlightOnEntityTickUpdate!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure LadyBugInFlightOnEntityTickUpdate!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure LadyBugInFlightOnEntityTickUpdate!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure LadyBugInFlightOnEntityTickUpdate!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure LadyBugInFlightOnEntityTickUpdate!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + Entity entity = (Entity) dependencies.get("entity"); + if (BlockTags.getCollection().getTagByID(new ResourceLocation("forge:solid_block")) + .contains((world.getBlockState(new BlockPos(x, y - 0.05, z))).getBlock()) + && !(((Entity) world + .getEntitiesWithinAABB(ServerPlayerEntity.class, + new AxisAlignedBB(x - (4 / 2d), y - (4 / 2d), z - (4 / 2d), x + (4 / 2d), y + (4 / 2d), z + (4 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).findFirst().orElse(null)) != null) + && !(((Entity) world + .getEntitiesWithinAABB(GiantButterflyWalkingEntity.CustomEntity.class, + new AxisAlignedBB(x - (4 / 2d), y - (4 / 2d), z - (4 / 2d), x + (4 / 2d), y + (4 / 2d), z + (4 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).findFirst().orElse(null)) != null) + && !(((Entity) world + .getEntitiesWithinAABB(GiantButterflyEntity.CustomEntity.class, + new AxisAlignedBB(x - (4 / 2d), y - (4 / 2d), z - (4 / 2d), x + (4 / 2d), y + (4 / 2d), z + (4 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).findFirst().orElse(null)) != null)) { + if (world instanceof ServerWorld) { + Entity entityToSpawn = new LadybugEntity.CustomEntity(LadybugEntity.entity, (World) world); + entityToSpawn.setLocationAndAngles(x, y, z, (float) (entity.rotationYaw), (float) 0); + entityToSpawn.setRenderYawOffset((float) (entity.rotationYaw)); + entityToSpawn.setRotationYawHead((float) (entity.rotationYaw)); + entityToSpawn.setMotion((entity.getMotion().getX()), (entity.getMotion().getY()), (entity.getMotion().getZ())); + if (entityToSpawn instanceof MobEntity) + ((MobEntity) entityToSpawn).onInitialSpawn((ServerWorld) world, world.getDifficultyForLocation(entityToSpawn.getPosition()), + SpawnReason.MOB_SUMMONED, (ILivingEntityData) null, (CompoundNBT) null); + world.addEntity(entityToSpawn); + } + if (!entity.world.isRemote()) + entity.remove(); + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/LadybugOnEntityTickUpdateProcedure.java b/src/main/java/studio/halbear/hem/procedures/LadybugOnEntityTickUpdateProcedure.java new file mode 100644 index 0000000..3b1e7fb --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/LadybugOnEntityTickUpdateProcedure.java @@ -0,0 +1,94 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.entity.LadyBugInFlightEntity; +import studio.halbear.hem.entity.GiantButterflyWalkingEntity; +import studio.halbear.hem.entity.GiantButterflyEntity; +import studio.halbear.hem.HemMod; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.SpawnReason; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.ILivingEntityData; +import net.minecraft.entity.Entity; + +import java.util.function.Function; +import java.util.Map; +import java.util.Comparator; + +public class LadybugOnEntityTickUpdateProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure LadybugOnEntityTickUpdate!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure LadybugOnEntityTickUpdate!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure LadybugOnEntityTickUpdate!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure LadybugOnEntityTickUpdate!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure LadybugOnEntityTickUpdate!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + Entity entity = (Entity) dependencies.get("entity"); + if (((Entity) world + .getEntitiesWithinAABB(ServerPlayerEntity.class, + new AxisAlignedBB(x - (4 / 2d), y - (4 / 2d), z - (4 / 2d), x + (4 / 2d), y + (4 / 2d), z + (4 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).findFirst().orElse(null)) != null || ((Entity) world + .getEntitiesWithinAABB(GiantButterflyWalkingEntity.CustomEntity.class, + new AxisAlignedBB(x - (4 / 2d), y - (4 / 2d), z - (4 / 2d), x + (4 / 2d), y + (4 / 2d), z + (4 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).findFirst().orElse(null)) != null + || ((Entity) world + .getEntitiesWithinAABB(GiantButterflyEntity.CustomEntity.class, + new AxisAlignedBB(x - (4 / 2d), y - (4 / 2d), z - (4 / 2d), x + (4 / 2d), y + (4 / 2d), z + (4 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).findFirst().orElse(null)) != null) { + if (world instanceof ServerWorld) { + Entity entityToSpawn = new LadyBugInFlightEntity.CustomEntity(LadyBugInFlightEntity.entity, (World) world); + entityToSpawn.setLocationAndAngles(x, y, z, (float) (entity.rotationYaw), (float) 0); + entityToSpawn.setRenderYawOffset((float) (entity.rotationYaw)); + entityToSpawn.setRotationYawHead((float) (entity.rotationYaw)); + entityToSpawn.setMotion((entity.getMotion().getX()), (entity.getMotion().getY()), (entity.getMotion().getZ())); + if (entityToSpawn instanceof MobEntity) + ((MobEntity) entityToSpawn).onInitialSpawn((ServerWorld) world, world.getDifficultyForLocation(entityToSpawn.getPosition()), + SpawnReason.MOB_SUMMONED, (ILivingEntityData) null, (CompoundNBT) null); + world.addEntity(entityToSpawn); + } + if (!entity.world.isRemote()) + entity.remove(); + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/LadybugSpawnEggRightclickedOnBlockProcedure.java b/src/main/java/studio/halbear/hem/procedures/LadybugSpawnEggRightclickedOnBlockProcedure.java new file mode 100644 index 0000000..74cdb7c --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/LadybugSpawnEggRightclickedOnBlockProcedure.java @@ -0,0 +1,92 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.entity.LadybugEntity; +import studio.halbear.hem.HemMod; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.world.GameType; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.item.ItemStack; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.SpawnReason; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.ILivingEntityData; +import net.minecraft.entity.Entity; +import net.minecraft.client.network.play.NetworkPlayerInfo; +import net.minecraft.client.entity.player.AbstractClientPlayerEntity; +import net.minecraft.client.Minecraft; + +import java.util.Map; + +public class LadybugSpawnEggRightclickedOnBlockProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure LadybugSpawnEggRightclickedOnBlock!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure LadybugSpawnEggRightclickedOnBlock!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure LadybugSpawnEggRightclickedOnBlock!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure LadybugSpawnEggRightclickedOnBlock!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure LadybugSpawnEggRightclickedOnBlock!"); + return; + } + if (dependencies.get("itemstack") == null) { + if (!dependencies.containsKey("itemstack")) + HemMod.LOGGER.warn("Failed to load dependency itemstack for procedure LadybugSpawnEggRightclickedOnBlock!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + Entity entity = (Entity) dependencies.get("entity"); + ItemStack itemstack = (ItemStack) dependencies.get("itemstack"); + if (!BlockTags.getCollection().getTagByID(new ResourceLocation("forge:solid_block")) + .contains((world.getBlockState(new BlockPos(x, y + 1, z))).getBlock())) { + if (world instanceof ServerWorld) { + Entity entityToSpawn = new LadybugEntity.CustomEntity(LadybugEntity.entity, (World) world); + entityToSpawn.setLocationAndAngles(x, (y + 1), z, world.getRandom().nextFloat() * 360F, 0); + if (entityToSpawn instanceof MobEntity) + ((MobEntity) entityToSpawn).onInitialSpawn((ServerWorld) world, world.getDifficultyForLocation(entityToSpawn.getPosition()), + SpawnReason.MOB_SUMMONED, (ILivingEntityData) null, (CompoundNBT) null); + world.addEntity(entityToSpawn); + } + if (!(new Object() { + public boolean checkGamemode(Entity _ent) { + if (_ent instanceof ServerPlayerEntity) { + return ((ServerPlayerEntity) _ent).interactionManager.getGameType() == GameType.CREATIVE; + } else if (_ent instanceof PlayerEntity && _ent.world.isRemote()) { + NetworkPlayerInfo _npi = Minecraft.getInstance().getConnection() + .getPlayerInfo(((AbstractClientPlayerEntity) _ent).getGameProfile().getId()); + return _npi != null && _npi.getGameType() == GameType.CREATIVE; + } + return false; + } + }.checkGamemode(entity))) { + (itemstack).shrink((int) 1); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/LushTree1AdditionalGenerationConditionProcedure.java b/src/main/java/studio/halbear/hem/procedures/LushTree1AdditionalGenerationConditionProcedure.java new file mode 100644 index 0000000..eaadd55 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/LushTree1AdditionalGenerationConditionProcedure.java @@ -0,0 +1,53 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemMod; + +import net.minecraft.world.IWorld; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.tags.BlockTags; + +import java.util.Map; + +public class LushTree1AdditionalGenerationConditionProcedure { + + public static boolean executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure LushTree1AdditionalGenerationCondition!"); + return false; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure LushTree1AdditionalGenerationCondition!"); + return false; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure LushTree1AdditionalGenerationCondition!"); + return false; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure LushTree1AdditionalGenerationCondition!"); + return false; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + if (BlockTags.getCollection().getTagByID(new ResourceLocation("forge:solid_block")) + .contains((world.getBlockState(new BlockPos(x, y, z))).getBlock()) + && (world.func_241828_r().getRegistry(Registry.BIOME_KEY).getKey(world.getBiome(new BlockPos(x, y, z))) != null + && world.func_241828_r().getRegistry(Registry.BIOME_KEY).getKey(world.getBiome(new BlockPos(x, y, z))) + .equals(new ResourceLocation("hem:blueleaf_hayfever_fields")) + && z < 0 + || !(world.func_241828_r().getRegistry(Registry.BIOME_KEY).getKey(world.getBiome(new BlockPos(x, y, z))) != null + && world.func_241828_r().getRegistry(Registry.BIOME_KEY).getKey(world.getBiome(new BlockPos(x, y, z))) + .equals(new ResourceLocation("hem:blueleaf_hayfever_fields"))))) { + return true; + } + return false; + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/MuncherBlockDestroyedByPlayerProcedure.java b/src/main/java/studio/halbear/hem/procedures/MuncherBlockDestroyedByPlayerProcedure.java new file mode 100644 index 0000000..8184a87 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/MuncherBlockDestroyedByPlayerProcedure.java @@ -0,0 +1,392 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.potion.GooedPotionEffect; +import studio.halbear.hem.block.MuncherBlock; +import studio.halbear.hem.block.BloomedMuncherBlock; +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.event.world.BlockEvent; + +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.DamageSource; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.state.Property; +import net.minecraft.potion.Effects; +import net.minecraft.potion.EffectInstance; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.Entity; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; + +import java.util.stream.Collectors; +import java.util.function.Function; +import java.util.Map; +import java.util.List; +import java.util.HashMap; +import java.util.Comparator; +import java.util.Collection; + +public class MuncherBlockDestroyedByPlayerProcedure { + @Mod.EventBusSubscriber + private static class GlobalTrigger { + @SubscribeEvent + public static void onBlockBreak(BlockEvent.BreakEvent event) { + Entity entity = event.getPlayer(); + IWorld world = event.getWorld(); + Map dependencies = new HashMap<>(); + dependencies.put("xpAmount", event.getExpToDrop()); + dependencies.put("x", event.getPos().getX()); + dependencies.put("y", event.getPos().getY()); + dependencies.put("z", event.getPos().getZ()); + dependencies.put("px", entity.getPosX()); + dependencies.put("py", entity.getPosY()); + dependencies.put("pz", entity.getPosZ()); + dependencies.put("world", world); + dependencies.put("entity", entity); + dependencies.put("blockstate", event.getState()); + dependencies.put("event", event); + executeProcedure(dependencies); + } + } + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure MuncherBlockDestroyedByPlayer!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure MuncherBlockDestroyedByPlayer!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure MuncherBlockDestroyedByPlayer!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure MuncherBlockDestroyedByPlayer!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure MuncherBlockDestroyedByPlayer!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + Entity entity = (Entity) dependencies.get("entity"); + double entitiesInside = 0; + double entitiesNearby = 0; + if ((world.getBlockState(new BlockPos(x, y, z))).getBlock() == MuncherBlock.block) { + if (dependencies.get("event") != null) { + Object _obj = dependencies.get("event"); + if (_obj instanceof Event) { + Event _evt = (Event) _obj; + if (_evt.isCancelable()) + _evt.setCanceled(true); + } + } + if (new Object() { + public boolean getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getBoolean(tag); + return false; + } + }.getValue(world, new BlockPos(x, y, z), "eating")) { + { + List _entfound = world + .getEntitiesWithinAABB(Entity.class, + new AxisAlignedBB(x - (6 / 2d), y - (6 / 2d), z - (6 / 2d), x + (6 / 2d), y + (6 / 2d), z + (6 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).collect(Collectors.toList()); + for (Entity entityiterator : _entfound) { + if ((entityiterator.getUniqueID().toString()).equals(new Object() { + public String getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getString(tag); + return ""; + } + }.getValue(world, new BlockPos(x, y, z), "victimuuid"))) { + if (entityiterator instanceof ServerPlayerEntity) { + if ((entity.getUniqueID().toString()).equals(new Object() { + public String getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getString(tag); + return ""; + } + }.getValue(world, new BlockPos(x, y, z), "victimuuid"))) { + if (entityiterator instanceof LivingEntity) { + ((LivingEntity) entityiterator).attackEntityFrom(new DamageSource("muncher").setDamageBypassesArmor(), + (float) (((entity instanceof LivingEntity) ? ((LivingEntity) entity).getHealth() : -1) - 1)); + } + } + } else { + if (Math.random() > 0.8) { + if (entityiterator instanceof LivingEntity) { + ((LivingEntity) entityiterator).attackEntityFrom(new DamageSource("muncher").setDamageBypassesArmor(), + (float) ((entityiterator instanceof LivingEntity) + ? ((LivingEntity) entityiterator).getMaxHealth() + : -1)); + } + } + } + if (entity instanceof LivingEntity) + ((LivingEntity) entity).addPotionEffect(new EffectInstance(GooedPotionEffect.potion, (int) 60, (int) 1)); + { + boolean _setval = (false); + entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.Eaten = _setval; + capability.syncPlayerVariables(entityiterator); + }); + } + if (entityiterator instanceof LivingEntity) { + ((LivingEntity) entityiterator).removePotionEffect(Effects.MINING_FATIGUE); + } + if (entityiterator instanceof LivingEntity) { + ((LivingEntity) entityiterator).removePotionEffect(Effects.SLOWNESS); + } + if (entityiterator instanceof LivingEntity) { + ((LivingEntity) entityiterator).removePotionEffect(Effects.INVISIBILITY); + } + } + } + } + if (world instanceof World && !world.isRemote()) { + ((World) world).playSound(null, new BlockPos(x, y, z), + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.player.burp")), + SoundCategory.HOSTILE, (float) 0.4, (float) 1); + } else { + ((World) world).playSound(x, y, z, + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.player.burp")), + SoundCategory.HOSTILE, (float) 0.4, (float) 1, false); + } + if (!world.isRemote()) { + BlockPos _bp = new BlockPos(x, y, z); + TileEntity _tileEntity = world.getTileEntity(_bp); + BlockState _bs = world.getBlockState(_bp); + if (_tileEntity != null) + _tileEntity.getTileData().putBoolean("eating", (true)); + if (world instanceof World) + ((World) world).notifyBlockUpdate(_bp, _bs, _bs, 3); + } + if (!world.isRemote()) { + BlockPos _bp = new BlockPos(x, y, z); + TileEntity _tileEntity = world.getTileEntity(_bp); + BlockState _bs = world.getBlockState(_bp); + if (_tileEntity != null) + _tileEntity.getTileData().putDouble("cooldown", 80); + if (world instanceof World) + ((World) world).notifyBlockUpdate(_bp, _bs, _bs, 3); + } + { + BlockPos _bp = new BlockPos(x, y, z); + BlockState _bs = BloomedMuncherBlock.block.getDefaultState(); + BlockState _bso = world.getBlockState(_bp); + for (Map.Entry, Comparable> entry : _bso.getValues().entrySet()) { + Property _property = _bs.getBlock().getStateContainer().getProperty(entry.getKey().getName()); + if (_property != null && _bs.get(_property) != null) + try { + _bs = _bs.with(_property, (Comparable) entry.getValue()); + } catch (Exception e) { + } + } + TileEntity _te = world.getTileEntity(_bp); + CompoundNBT _bnbt = null; + if (_te != null) { + _bnbt = _te.write(new CompoundNBT()); + _te.remove(); + } + world.setBlockState(_bp, _bs, 3); + if (_bnbt != null) { + _te = world.getTileEntity(_bp); + if (_te != null) { + try { + _te.read(_bso, _bnbt); + } catch (Exception ignored) { + } + } + } + } + } else { + entitiesInside = 0; + { + List _entfound = world.getEntitiesWithinAABB(Entity.class, + new AxisAlignedBB(x - (0.5 / 2d), y - (0.5 / 2d), z - (0.5 / 2d), x + (0.5 / 2d), y + (0.5 / 2d), z + (0.5 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).collect(Collectors.toList()); + for (Entity entityiterator : _entfound) { + if (entityiterator instanceof ServerPlayerEntity && new Object() { + boolean check(Entity _entity) { + if (_entity instanceof LivingEntity) { + Collection effects = ((LivingEntity) _entity).getActivePotionEffects(); + for (EffectInstance effect : effects) { + if (effect.getPotion() == Effects.INVISIBILITY) + return true; + } + } + return false; + } + }.check(entityiterator) || !(entityiterator instanceof ServerPlayerEntity) && new Object() { + boolean check(Entity _entity) { + if (_entity instanceof LivingEntity) { + Collection effects = ((LivingEntity) _entity).getActivePotionEffects(); + for (EffectInstance effect : effects) { + if (effect.getPotion() == Effects.INVISIBILITY) + return true; + } + } + return false; + } + }.check(entityiterator)) { + entitiesInside = 1; + if (entityiterator instanceof ServerPlayerEntity) { + if ((entity.getUniqueID().toString()).equals(entityiterator.getUniqueID().toString())) { + if (entityiterator instanceof LivingEntity) { + ((LivingEntity) entityiterator).attackEntityFrom(new DamageSource("muncher").setDamageBypassesArmor(), + (float) (((entity instanceof LivingEntity) ? ((LivingEntity) entity).getHealth() : -1) - 1)); + } + } + { + boolean _setval = (false); + entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.Eaten = _setval; + capability.syncPlayerVariables(entityiterator); + }); + } + } else { + if (Math.random() > 0.8) { + if (entityiterator instanceof LivingEntity) { + ((LivingEntity) entityiterator).attackEntityFrom(new DamageSource("muncher").setDamageBypassesArmor(), + (float) ((entityiterator instanceof LivingEntity) + ? ((LivingEntity) entityiterator).getMaxHealth() + : -1)); + } + } + } + if (entity instanceof LivingEntity) + ((LivingEntity) entity).addPotionEffect(new EffectInstance(GooedPotionEffect.potion, (int) 60, (int) 1)); + if (entityiterator instanceof LivingEntity) { + ((LivingEntity) entityiterator).removePotionEffect(Effects.MINING_FATIGUE); + } + if (entityiterator instanceof LivingEntity) { + ((LivingEntity) entityiterator).removePotionEffect(Effects.SLOWNESS); + } + if (entityiterator instanceof LivingEntity) { + ((LivingEntity) entityiterator).removePotionEffect(Effects.INVISIBILITY); + } + if (world instanceof World && !world.isRemote()) { + ((World) world) + .playSound(null, new BlockPos(x, y, z), + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS + .getValue(new ResourceLocation("entity.player.burp")), + SoundCategory.HOSTILE, (float) 0.4, (float) 1); + } else { + ((World) world).playSound(x, y, z, + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS + .getValue(new ResourceLocation("entity.player.burp")), + SoundCategory.HOSTILE, (float) 0.4, (float) 1, false); + } + if (!world.isRemote()) { + BlockPos _bp = new BlockPos(x, y, z); + TileEntity _tileEntity = world.getTileEntity(_bp); + BlockState _bs = world.getBlockState(_bp); + if (_tileEntity != null) + _tileEntity.getTileData().putBoolean("eating", (true)); + if (world instanceof World) + ((World) world).notifyBlockUpdate(_bp, _bs, _bs, 3); + } + if (!world.isRemote()) { + BlockPos _bp = new BlockPos(x, y, z); + TileEntity _tileEntity = world.getTileEntity(_bp); + BlockState _bs = world.getBlockState(_bp); + if (_tileEntity != null) + _tileEntity.getTileData().putDouble("cooldown", 80); + if (world instanceof World) + ((World) world).notifyBlockUpdate(_bp, _bs, _bs, 3); + } + { + BlockPos _bp = new BlockPos(x, y, z); + BlockState _bs = BloomedMuncherBlock.block.getDefaultState(); + BlockState _bso = world.getBlockState(_bp); + for (Map.Entry, Comparable> entry : _bso.getValues().entrySet()) { + Property _property = _bs.getBlock().getStateContainer().getProperty(entry.getKey().getName()); + if (_property != null && _bs.get(_property) != null) + try { + _bs = _bs.with(_property, (Comparable) entry.getValue()); + } catch (Exception e) { + } + } + TileEntity _te = world.getTileEntity(_bp); + CompoundNBT _bnbt = null; + if (_te != null) { + _bnbt = _te.write(new CompoundNBT()); + _te.remove(); + } + world.setBlockState(_bp, _bs, 3); + if (_bnbt != null) { + _te = world.getTileEntity(_bp); + if (_te != null) { + try { + _te.read(_bso, _bnbt); + } catch (Exception ignored) { + } + } + } + } + if (!world.isRemote()) { + BlockPos _bp = new BlockPos(x, y, z); + TileEntity _tileEntity = world.getTileEntity(_bp); + BlockState _bs = world.getBlockState(_bp); + if (_tileEntity != null) + _tileEntity.getTileData().putBoolean("eating", (true)); + if (world instanceof World) + ((World) world).notifyBlockUpdate(_bp, _bs, _bs, 3); + } + if (!world.isRemote()) { + BlockPos _bp = new BlockPos(x, y, z); + TileEntity _tileEntity = world.getTileEntity(_bp); + BlockState _bs = world.getBlockState(_bp); + if (_tileEntity != null) + _tileEntity.getTileData().putDouble("cooldown", 80); + if (world instanceof World) + ((World) world).notifyBlockUpdate(_bp, _bs, _bs, 3); + } + } + } + } + if (entitiesInside == 0) { + if (world instanceof World) { + Block.spawnDrops(world.getBlockState(new BlockPos(x, y, z)), (World) world, new BlockPos(x, y, z)); + world.destroyBlock(new BlockPos(x, y, z), false); + } + } + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/MuncherGenerationAdditionalGenerationConditionProcedure.java b/src/main/java/studio/halbear/hem/procedures/MuncherGenerationAdditionalGenerationConditionProcedure.java new file mode 100644 index 0000000..7a9f524 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/MuncherGenerationAdditionalGenerationConditionProcedure.java @@ -0,0 +1,43 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemMod; + +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.block.Blocks; + +import java.util.Map; + +public class MuncherGenerationAdditionalGenerationConditionProcedure { + + public static boolean executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure MuncherGenerationAdditionalGenerationCondition!"); + return false; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure MuncherGenerationAdditionalGenerationCondition!"); + return false; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure MuncherGenerationAdditionalGenerationCondition!"); + return false; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure MuncherGenerationAdditionalGenerationCondition!"); + return false; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + if (!((world.getBlockState(new BlockPos(x, y + 2, z))).getBlock() == Blocks.AIR)) { + return false; + } + return true; + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/MuncherGenerationOnStructureInstanceGeneratedProcedure.java b/src/main/java/studio/halbear/hem/procedures/MuncherGenerationOnStructureInstanceGeneratedProcedure.java new file mode 100644 index 0000000..fee321c --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/MuncherGenerationOnStructureInstanceGeneratedProcedure.java @@ -0,0 +1,45 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.block.MuncherBlock; +import studio.halbear.hem.HemMod; + +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.block.Blocks; + +import java.util.Map; + +public class MuncherGenerationOnStructureInstanceGeneratedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure MuncherGenerationOnStructureInstanceGenerated!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure MuncherGenerationOnStructureInstanceGenerated!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure MuncherGenerationOnStructureInstanceGenerated!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure MuncherGenerationOnStructureInstanceGenerated!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + world.setBlockState(new BlockPos(x, y, z), Blocks.AIR.getDefaultState(), 3); + world.setBlockState(new BlockPos(x, y, z), MuncherBlock.block.getDefaultState(), 3); + if (world instanceof World) + ((World) world).notifyNeighborsOfStateChange(new BlockPos(x, y, z), ((World) world).getBlockState(new BlockPos(x, y, z)).getBlock()); + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/MuncherPlantAddedProcedure.java b/src/main/java/studio/halbear/hem/procedures/MuncherPlantAddedProcedure.java new file mode 100644 index 0000000..886a0e4 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/MuncherPlantAddedProcedure.java @@ -0,0 +1,81 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.block.BloomedMuncherBlock; +import studio.halbear.hem.HemMod; + +import net.minecraftforge.registries.ForgeRegistries; + +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.ResourceLocation; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.state.Property; +import net.minecraft.block.BlockState; + +import java.util.Map; + +public class MuncherPlantAddedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure MuncherPlantAdded!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure MuncherPlantAdded!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure MuncherPlantAdded!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure MuncherPlantAdded!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + if ((new Object() { + public boolean getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getBoolean(tag); + return false; + } + }.getValue(world, new BlockPos(x, y, z), "eating")) == false) { + if ((world instanceof World) ? ((World) world).isDaytime() : false) { + { + BlockPos _bp = new BlockPos(x, y, z); + BlockState _bs = BloomedMuncherBlock.block.getDefaultState(); + BlockState _bso = world.getBlockState(_bp); + for (Map.Entry, Comparable> entry : _bso.getValues().entrySet()) { + Property _property = _bs.getBlock().getStateContainer().getProperty(entry.getKey().getName()); + if (_property != null && _bs.get(_property) != null) + try { + _bs = _bs.with(_property, (Comparable) entry.getValue()); + } catch (Exception e) { + } + } + world.setBlockState(_bp, _bs, 3); + } + if (world instanceof World && !world.isRemote()) { + ((World) world).playSound(null, new BlockPos(x, y, z), + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("block.beehive.exit")), + SoundCategory.HOSTILE, (float) 1, (float) 1); + } else { + ((World) world).playSound(x, y, z, + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("block.beehive.exit")), + SoundCategory.HOSTILE, (float) 1, (float) 1, false); + } + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/MuncherSproutAdditionalGenerationConditionProcedure.java b/src/main/java/studio/halbear/hem/procedures/MuncherSproutAdditionalGenerationConditionProcedure.java new file mode 100644 index 0000000..bf727de --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/MuncherSproutAdditionalGenerationConditionProcedure.java @@ -0,0 +1,47 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemMod; + +import net.minecraft.world.IWorld; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; + +import java.util.Map; + +public class MuncherSproutAdditionalGenerationConditionProcedure { + + public static boolean executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure MuncherSproutAdditionalGenerationCondition!"); + return false; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure MuncherSproutAdditionalGenerationCondition!"); + return false; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure MuncherSproutAdditionalGenerationCondition!"); + return false; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure MuncherSproutAdditionalGenerationCondition!"); + return false; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + if (!(world.func_241828_r().getRegistry(Registry.BIOME_KEY).getKey(world.getBiome(new BlockPos(x, y, z))) != null + && world.func_241828_r().getRegistry(Registry.BIOME_KEY).getKey(world.getBiome(new BlockPos(x, y, z))) + .equals(new ResourceLocation("hem:lush_blueleaf_marsh"))) + && Math.random() > 0.5) { + return false; + } + return true; + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/MuncherSproutClientDisplayRandomTickProcedure.java b/src/main/java/studio/halbear/hem/procedures/MuncherSproutClientDisplayRandomTickProcedure.java new file mode 100644 index 0000000..0fa2e53 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/MuncherSproutClientDisplayRandomTickProcedure.java @@ -0,0 +1,99 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.block.MuncherBlock; +import studio.halbear.hem.HemMod; + +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.common.MinecraftForge; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.block.Blocks; + +import java.util.Map; + +public class MuncherSproutClientDisplayRandomTickProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure MuncherSproutClientDisplayRandomTick!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure MuncherSproutClientDisplayRandomTick!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure MuncherSproutClientDisplayRandomTick!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure MuncherSproutClientDisplayRandomTick!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + if (world instanceof ServerWorld) { + IWorld _worldorig = world; + world = ((ServerWorld) world).getServer().getWorld(RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))); + if (world != null) { + new Object() { + private int ticks = 0; + private float waitTicks; + private IWorld world; + + public void start(IWorld world, int waitTicks) { + this.waitTicks = waitTicks; + MinecraftForge.EVENT_BUS.register(this); + this.world = world; + } + + @SubscribeEvent + public void tick(TickEvent.ServerTickEvent event) { + if (event.phase == TickEvent.Phase.END) { + this.ticks += 1; + if (this.ticks >= this.waitTicks) + run(); + } + } + + private void run() { + if (world instanceof World && !world.isRemote()) { + ((World) world) + .playSound(null, new BlockPos(x, y, z), + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS + .getValue(new ResourceLocation("block.beehive.enter")), + SoundCategory.NEUTRAL, (float) 1, (float) 1); + } else { + ((World) world).playSound(x, y, z, + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS + .getValue(new ResourceLocation("block.beehive.enter")), + SoundCategory.NEUTRAL, (float) 1, (float) 1, false); + } + world.setBlockState(new BlockPos(x, y, z), Blocks.AIR.getDefaultState(), 3); + world.setBlockState(new BlockPos(x, y, z), MuncherBlock.block.getDefaultState(), 3); + if (world instanceof World) + ((World) world).notifyNeighborsOfStateChange(new BlockPos(x, y, z), + ((World) world).getBlockState(new BlockPos(x, y, z)).getBlock()); + MinecraftForge.EVENT_BUS.unregister(this); + } + }.start(world, (int) 20); + } + world = _worldorig; + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/MuncherUpdateTickProcedure.java b/src/main/java/studio/halbear/hem/procedures/MuncherUpdateTickProcedure.java new file mode 100644 index 0000000..a036a8f --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/MuncherUpdateTickProcedure.java @@ -0,0 +1,539 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.particle.SevereDamageParticlesParticle; +import studio.halbear.hem.particle.LilyPadParticlesParticle; +import studio.halbear.hem.particle.BlueleafAmbienceParticle; +import studio.halbear.hem.block.BloomedMuncherBlock; +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraftforge.registries.ForgeRegistries; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.DamageSource; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.state.Property; +import net.minecraft.potion.Effects; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.Entity; +import net.minecraft.block.BlockState; + +import java.util.stream.Collectors; +import java.util.function.Function; +import java.util.Map; +import java.util.List; +import java.util.Comparator; +import java.util.Collections; +import java.util.ArrayList; + +public class MuncherUpdateTickProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure MuncherUpdateTick!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure MuncherUpdateTick!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure MuncherUpdateTick!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure MuncherUpdateTick!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + double entitiesNearby = 0; + double entitiesInside = 0; + if ((new Object() { + public boolean getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getBoolean(tag); + return false; + } + }.getValue(world, new BlockPos(x, y, z), "eating")) == true) { + entitiesInside = 0; + { + List _entfound = world + .getEntitiesWithinAABB(Entity.class, + new AxisAlignedBB(x - (4 / 2d), y - (4 / 2d), z - (4 / 2d), x + (4 / 2d), y + (4 / 2d), z + (4 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).collect(Collectors.toList()); + for (Entity entityiterator : _entfound) { + if ((entityiterator.getUniqueID().toString()).equals(new Object() { + public String getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getString(tag); + return ""; + } + }.getValue(world, new BlockPos(x, y, z), "victimuuid"))) { + entitiesInside = 1; + if (new Object() { + public double getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getDouble(tag); + return -1; + } + }.getValue(world, new BlockPos(x, y, z), "cooldown") > 0) { + if (!world.isRemote()) { + BlockPos _bp = new BlockPos(x, y, z); + TileEntity _tileEntity = world.getTileEntity(_bp); + BlockState _bs = world.getBlockState(_bp); + if (_tileEntity != null) + _tileEntity.getTileData().putDouble("cooldown", ((new Object() { + public double getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getDouble(tag); + return -1; + } + }.getValue(world, new BlockPos(x, y, z), "cooldown")) - 1)); + if (world instanceof World) + ((World) world).notifyBlockUpdate(_bp, _bs, _bs, 3); + } + } + if (new Object() { + public double getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getDouble(tag); + return -1; + } + }.getValue(world, new BlockPos(x, y, z), "bites") > 1 && new Object() { + public double getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getDouble(tag); + return -1; + } + }.getValue(world, new BlockPos(x, y, z), "cooldown") == 0) { + if (!world.isRemote()) { + BlockPos _bp = new BlockPos(x, y, z); + TileEntity _tileEntity = world.getTileEntity(_bp); + BlockState _bs = world.getBlockState(_bp); + if (_tileEntity != null) + _tileEntity.getTileData().putDouble("cooldown", Math.round((new Object() { + public double getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getDouble(tag); + return -1; + } + }.getValue(world, new BlockPos(x, y, z), "maxcooldown")) / (2 + 1.5 * Math.random()))); + if (world instanceof World) + ((World) world).notifyBlockUpdate(_bp, _bs, _bs, 3); + } + if (!world.isRemote()) { + BlockPos _bp = new BlockPos(x, y, z); + TileEntity _tileEntity = world.getTileEntity(_bp); + BlockState _bs = world.getBlockState(_bp); + if (_tileEntity != null) + _tileEntity.getTileData().putDouble("bites", ((new Object() { + public double getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getDouble(tag); + return -1; + } + }.getValue(world, new BlockPos(x, y, z), "bites")) - 1)); + if (world instanceof World) + ((World) world).notifyBlockUpdate(_bp, _bs, _bs, 3); + } + entityiterator.setMotion(0, 0.1, 0); + { + Entity _ent = entityiterator; + _ent.setPositionAndUpdate((x + 0.5), y, (z + 0.5)); + if (_ent instanceof ServerPlayerEntity) { + ((ServerPlayerEntity) _ent).connection.setPlayerLocation((x + 0.5), y, (z + 0.5), _ent.rotationYaw, + _ent.rotationPitch, Collections.emptySet()); + } + } + if (world instanceof ServerWorld) { + ((ServerWorld) world).spawnParticle(LilyPadParticlesParticle.particle, x, y, z, (int) 10, 1, 2, 1, 0.3); + } + if (world instanceof ServerWorld) { + ((ServerWorld) world).spawnParticle(SevereDamageParticlesParticle.particle, x, y, z, (int) 10, 1, 2, 1, 0.3); + } + if (world instanceof World && !world.isRemote()) { + ((World) world) + .playSound(null, new BlockPos(x, y, z), + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS + .getValue(new ResourceLocation("entity.generic.eat")), + SoundCategory.HOSTILE, (float) 0.4, (float) 1); + } else { + ((World) world).playSound(x, y, z, + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS + .getValue(new ResourceLocation("entity.generic.eat")), + SoundCategory.HOSTILE, (float) 0.4, (float) 1, false); + } + entityiterator.attackEntityFrom(DamageSource.CRAMMING, + (float) (((entityiterator instanceof LivingEntity) ? ((LivingEntity) entityiterator).getHealth() : -1) + / ((new Object() { + public double getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getDouble(tag); + return -1; + } + }.getValue(world, new BlockPos(x, y, z), "bites")) * 2))); + if (entityiterator instanceof ServerPlayerEntity) { + if (entityiterator instanceof PlayerEntity) + ((PlayerEntity) entityiterator).getFoodStats() + .setFoodLevel((int) (((entityiterator instanceof PlayerEntity) + ? ((PlayerEntity) entityiterator).getFoodStats().getFoodLevel() + : 0) + - ((entityiterator instanceof PlayerEntity) + ? ((PlayerEntity) entityiterator).getFoodStats().getFoodLevel() + : 0) / 10)); + } + } else if (new Object() { + public double getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getDouble(tag); + return -1; + } + }.getValue(world, new BlockPos(x, y, z), "bites") == 1 && new Object() { + public double getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getDouble(tag); + return -1; + } + }.getValue(world, new BlockPos(x, y, z), "cooldown") == 0) { + if (!world.isRemote()) { + BlockPos _bp = new BlockPos(x, y, z); + TileEntity _tileEntity = world.getTileEntity(_bp); + BlockState _bs = world.getBlockState(_bp); + if (_tileEntity != null) + _tileEntity.getTileData().putDouble("cooldown", 5); + if (world instanceof World) + ((World) world).notifyBlockUpdate(_bp, _bs, _bs, 3); + } + if (!world.isRemote()) { + BlockPos _bp = new BlockPos(x, y, z); + TileEntity _tileEntity = world.getTileEntity(_bp); + BlockState _bs = world.getBlockState(_bp); + if (_tileEntity != null) + _tileEntity.getTileData().putDouble("bites", 0); + if (world instanceof World) + ((World) world).notifyBlockUpdate(_bp, _bs, _bs, 3); + } + if (world instanceof World && !world.isRemote()) { + ((World) world) + .playSound(null, new BlockPos(x, y, z), + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS + .getValue(new ResourceLocation("entity.generic.eat")), + SoundCategory.HOSTILE, (float) 0.4, (float) 1); + } else { + ((World) world).playSound(x, y, z, + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS + .getValue(new ResourceLocation("entity.generic.eat")), + SoundCategory.HOSTILE, (float) 0.4, (float) 1, false); + } + if (entityiterator instanceof ServerPlayerEntity) { + entityiterator.attackEntityFrom(DamageSource.CRAMMING, + (float) ((((entityiterator instanceof LivingEntity) ? ((LivingEntity) entityiterator).getHealth() : -1) / 3) + * 2)); + } else { + entityiterator.attackEntityFrom(DamageSource.CRAMMING, + (float) ((entityiterator instanceof LivingEntity) ? ((LivingEntity) entityiterator).getMaxHealth() : -1)); + } + if (world instanceof ServerWorld) { + ((ServerWorld) world).spawnParticle(BlueleafAmbienceParticle.particle, x, y, z, (int) 10, 1, 2, 1, 0.3); + } + if (world instanceof ServerWorld) { + ((ServerWorld) world).spawnParticle(SevereDamageParticlesParticle.particle, x, y, z, (int) 20, 1, 2, 1, 0.3); + } + } else if (new Object() { + public double getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getDouble(tag); + return -1; + } + }.getValue(world, new BlockPos(x, y, z), "bites") == 0 && new Object() { + public double getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getDouble(tag); + return -1; + } + }.getValue(world, new BlockPos(x, y, z), "cooldown") == 0) { + if (world instanceof World && !world.isRemote()) { + ((World) world) + .playSound(null, new BlockPos(x, y, z), + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS + .getValue(new ResourceLocation("entity.player.burp")), + SoundCategory.HOSTILE, (float) 0.4, (float) 1); + } else { + ((World) world).playSound(x, y, z, + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS + .getValue(new ResourceLocation("entity.player.burp")), + SoundCategory.HOSTILE, (float) 0.4, (float) 1, false); + } + { + boolean _setval = (false); + entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.Eaten = _setval; + capability.syncPlayerVariables(entityiterator); + }); + } + if (entityiterator instanceof LivingEntity) { + ((LivingEntity) entityiterator).removePotionEffect(Effects.INVISIBILITY); + } + if (entityiterator instanceof LivingEntity) { + ((LivingEntity) entityiterator).removePotionEffect(Effects.SLOWNESS); + } + if (!world.isRemote()) { + BlockPos _bp = new BlockPos(x, y, z); + TileEntity _tileEntity = world.getTileEntity(_bp); + BlockState _bs = world.getBlockState(_bp); + if (_tileEntity != null) + _tileEntity.getTileData().putBoolean("eating", (true)); + if (world instanceof World) + ((World) world).notifyBlockUpdate(_bp, _bs, _bs, 3); + } + if (!world.isRemote()) { + BlockPos _bp = new BlockPos(x, y, z); + TileEntity _tileEntity = world.getTileEntity(_bp); + BlockState _bs = world.getBlockState(_bp); + if (_tileEntity != null) + _tileEntity.getTileData().putDouble("cooldown", 60); + if (world instanceof World) + ((World) world).notifyBlockUpdate(_bp, _bs, _bs, 3); + } + { + BlockPos _bp = new BlockPos(x, y, z); + BlockState _bs = BloomedMuncherBlock.block.getDefaultState(); + BlockState _bso = world.getBlockState(_bp); + for (Map.Entry, Comparable> entry : _bso.getValues().entrySet()) { + Property _property = _bs.getBlock().getStateContainer().getProperty(entry.getKey().getName()); + if (_property != null && _bs.get(_property) != null) + try { + _bs = _bs.with(_property, (Comparable) entry.getValue()); + } catch (Exception e) { + } + } + TileEntity _te = world.getTileEntity(_bp); + CompoundNBT _bnbt = null; + if (_te != null) { + _bnbt = _te.write(new CompoundNBT()); + _te.remove(); + } + world.setBlockState(_bp, _bs, 3); + if (_bnbt != null) { + _te = world.getTileEntity(_bp); + if (_te != null) { + try { + _te.read(_bso, _bnbt); + } catch (Exception ignored) { + } + } + } + } + } + } + } + } + if (entitiesInside == 0 || new Object() { + public double getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getDouble(tag); + return -1; + } + }.getValue(world, new BlockPos(x, y, z), "bites") == 0 && new Object() { + public double getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getDouble(tag); + return -1; + } + }.getValue(world, new BlockPos(x, y, z), "cooldown") == 0) { + if (entitiesInside == 0) { + { + List _players = new ArrayList<>(world.getPlayers()); + for (Entity entityiterator : _players) { + if ((entityiterator.getUniqueID().toString()).equals(new Object() { + public String getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getString(tag); + return ""; + } + }.getValue(world, new BlockPos(x, y, z), "victimuuid"))) { + { + boolean _setval = (false); + entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.Eaten = _setval; + capability.syncPlayerVariables(entityiterator); + }); + } + if (entityiterator instanceof LivingEntity) { + ((LivingEntity) entityiterator).removePotionEffect(Effects.INVISIBILITY); + } + if (entityiterator instanceof LivingEntity) { + ((LivingEntity) entityiterator).removePotionEffect(Effects.SLOWNESS); + } + } + } + } + } + if (world instanceof World && !world.isRemote()) { + ((World) world).playSound(null, new BlockPos(x, y, z), + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.player.burp")), + SoundCategory.HOSTILE, (float) 0.4, (float) 1); + } else { + ((World) world).playSound(x, y, z, + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.player.burp")), + SoundCategory.HOSTILE, (float) 0.4, (float) 1, false); + } + if (!world.isRemote()) { + BlockPos _bp = new BlockPos(x, y, z); + TileEntity _tileEntity = world.getTileEntity(_bp); + BlockState _bs = world.getBlockState(_bp); + if (_tileEntity != null) + _tileEntity.getTileData().putBoolean("eating", (true)); + if (world instanceof World) + ((World) world).notifyBlockUpdate(_bp, _bs, _bs, 3); + } + if (!world.isRemote()) { + BlockPos _bp = new BlockPos(x, y, z); + TileEntity _tileEntity = world.getTileEntity(_bp); + BlockState _bs = world.getBlockState(_bp); + if (_tileEntity != null) + _tileEntity.getTileData().putDouble("cooldown", 4); + if (world instanceof World) + ((World) world).notifyBlockUpdate(_bp, _bs, _bs, 3); + } + { + BlockPos _bp = new BlockPos(x, y, z); + BlockState _bs = BloomedMuncherBlock.block.getDefaultState(); + BlockState _bso = world.getBlockState(_bp); + for (Map.Entry, Comparable> entry : _bso.getValues().entrySet()) { + Property _property = _bs.getBlock().getStateContainer().getProperty(entry.getKey().getName()); + if (_property != null && _bs.get(_property) != null) + try { + _bs = _bs.with(_property, (Comparable) entry.getValue()); + } catch (Exception e) { + } + } + TileEntity _te = world.getTileEntity(_bp); + CompoundNBT _bnbt = null; + if (_te != null) { + _bnbt = _te.write(new CompoundNBT()); + _te.remove(); + } + world.setBlockState(_bp, _bs, 3); + if (_bnbt != null) { + _te = world.getTileEntity(_bp); + if (_te != null) { + try { + _te.read(_bso, _bnbt); + } catch (Exception ignored) { + } + } + } + } + } + } else if ((new Object() { + public boolean getValue(IWorld world, BlockPos pos, String tag) { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + return tileEntity.getTileData().getBoolean(tag); + return false; + } + }.getValue(world, new BlockPos(x, y, z), "eating")) == false) { + entitiesNearby = 0; + entitiesInside = 0; + { + List _entfound = world + .getEntitiesWithinAABB(Entity.class, + new AxisAlignedBB(x - (6 / 2d), y - (6 / 2d), z - (6 / 2d), x + (6 / 2d), y + (6 / 2d), z + (6 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).collect(Collectors.toList()); + for (Entity entityiterator : _entfound) { + entitiesNearby = (entitiesNearby + 1); + } + } + { + List _entfound = world + .getEntitiesWithinAABB(Entity.class, + new AxisAlignedBB(x - (2 / 2d), y - (2 / 2d), z - (2 / 2d), x + (2 / 2d), y + (2 / 2d), z + (2 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).collect(Collectors.toList()); + for (Entity entityiterator : _entfound) { + entitiesInside = (entitiesInside + 1); + } + } + if (((Entity) world + .getEntitiesWithinAABB(ServerPlayerEntity.class, + new AxisAlignedBB(x - (1.4 / 2d), y - (1.4 / 2d), z - (1.4 / 2d), x + (1.4 / 2d), y + (1.4 / 2d), z + (1.4 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).findFirst().orElse(null)) != null) { + entitiesNearby = 0; + entitiesInside = 1; + } + if (entitiesInside == 0 && entitiesNearby > 0) { + { + BlockPos _bp = new BlockPos(x, y, z); + BlockState _bs = BloomedMuncherBlock.block.getDefaultState(); + BlockState _bso = world.getBlockState(_bp); + for (Map.Entry, Comparable> entry : _bso.getValues().entrySet()) { + Property _property = _bs.getBlock().getStateContainer().getProperty(entry.getKey().getName()); + if (_property != null && _bs.get(_property) != null) + try { + _bs = _bs.with(_property, (Comparable) entry.getValue()); + } catch (Exception e) { + } + } + world.setBlockState(_bp, _bs, 3); + } + if (world instanceof World && !world.isRemote()) { + ((World) world).playSound(null, new BlockPos(x, y, z), + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("block.beehive.exit")), + SoundCategory.HOSTILE, (float) 1, (float) 1); + } else { + ((World) world).playSound(x, y, z, + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("block.beehive.exit")), + SoundCategory.HOSTILE, (float) 1, (float) 1, false); + } + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/OpenGasCellViewOnKeyReleasedProcedure.java b/src/main/java/studio/halbear/hem/procedures/OpenGasCellViewOnKeyReleasedProcedure.java new file mode 100644 index 0000000..19abd08 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/OpenGasCellViewOnKeyReleasedProcedure.java @@ -0,0 +1,87 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.gui.AirboatGasCelViewGui; +import studio.halbear.hem.entity.AirboatEntity; +import studio.halbear.hem.HemMod; + +import net.minecraftforge.fml.server.ServerLifecycleHooks; +import net.minecraftforge.fml.network.NetworkHooks; + +import net.minecraft.world.IWorld; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.ChatType; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Util; +import net.minecraft.server.MinecraftServer; +import net.minecraft.network.PacketBuffer; +import net.minecraft.inventory.container.INamedContainerProvider; +import net.minecraft.inventory.container.Container; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.Entity; + +import java.util.Map; + +import io.netty.buffer.Unpooled; + +public class OpenGasCellViewOnKeyReleasedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure OpenGasCellViewOnKeyReleased!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure OpenGasCellViewOnKeyReleased!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure OpenGasCellViewOnKeyReleased!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure OpenGasCellViewOnKeyReleased!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure OpenGasCellViewOnKeyReleased!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + Entity entity = (Entity) dependencies.get("entity"); + if (entity.isPassenger() && (entity.getRidingEntity()) instanceof AirboatEntity.CustomEntity) { + if (!world.isRemote()) { + MinecraftServer mcserv = ServerLifecycleHooks.getCurrentServer(); + if (mcserv != null) + mcserv.getPlayerList().func_232641_a_(new StringTextComponent("Message"), ChatType.SYSTEM, Util.DUMMY_UUID); + } + { + Entity _ent = entity; + if (_ent instanceof ServerPlayerEntity) { + BlockPos _bpos = new BlockPos(x, y, z); + NetworkHooks.openGui((ServerPlayerEntity) _ent, new INamedContainerProvider() { + @Override + public ITextComponent getDisplayName() { + return new StringTextComponent("AirboatGasCelView"); + } + + @Override + public Container createMenu(int id, PlayerInventory inventory, PlayerEntity player) { + return new AirboatGasCelViewGui.GuiContainerMod(id, inventory, new PacketBuffer(Unpooled.buffer()).writeBlockPos(_bpos)); + } + }, _bpos); + } + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/SeaGrassGenerationAdditionalGenerationConditionProcedure.java b/src/main/java/studio/halbear/hem/procedures/SeaGrassGenerationAdditionalGenerationConditionProcedure.java new file mode 100644 index 0000000..d57e139 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/SeaGrassGenerationAdditionalGenerationConditionProcedure.java @@ -0,0 +1,46 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemMod; + +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.block.FlowingFluidBlock; +import net.minecraft.block.Blocks; + +import java.util.Map; + +public class SeaGrassGenerationAdditionalGenerationConditionProcedure { + + public static boolean executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure SeaGrassGenerationAdditionalGenerationCondition!"); + return false; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure SeaGrassGenerationAdditionalGenerationCondition!"); + return false; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure SeaGrassGenerationAdditionalGenerationCondition!"); + return false; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure SeaGrassGenerationAdditionalGenerationCondition!"); + return false; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + if ((world.getBlockState(new BlockPos(x, y + 1, z))).getBlock() == Blocks.WATER + || (world.getBlockState(new BlockPos(x, y + 1, z))).getFluidState().isSource() + || (world.getBlockState(new BlockPos(x, y + 1, z))).getBlock() instanceof FlowingFluidBlock) { + return true; + } + return false; + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/SpeedCalculationProcedure.java b/src/main/java/studio/halbear/hem/procedures/SpeedCalculationProcedure.java new file mode 100644 index 0000000..3836a90 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/SpeedCalculationProcedure.java @@ -0,0 +1,165 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.TickEvent; + +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.entity.Entity; +import net.minecraft.block.Blocks; + +import java.util.Map; +import java.util.HashMap; + +public class SpeedCalculationProcedure { + @Mod.EventBusSubscriber + private static class GlobalTrigger { + @SubscribeEvent + public static void onPlayerTick(TickEvent.PlayerTickEvent event) { + if (event.phase == TickEvent.Phase.END) { + Entity entity = event.player; + World world = entity.world; + double i = entity.getPosX(); + double j = entity.getPosY(); + double k = entity.getPosZ(); + Map dependencies = new HashMap<>(); + dependencies.put("x", i); + dependencies.put("y", j); + dependencies.put("z", k); + dependencies.put("world", world); + dependencies.put("entity", entity); + dependencies.put("event", event); + executeProcedure(dependencies); + } + } + } + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure SpeedCalculation!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure SpeedCalculation!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure SpeedCalculation!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure SpeedCalculation!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + Entity entity = (Entity) dependencies.get("entity"); + double TPS = 0; + double Dx = 0; + double Dy = 0; + double Ylevel = 0; + double Iterations = 0; + if (entity.ticksExisted % 10 == 0) { + Ylevel = (entity.getPosY()); + Iterations = 0; + for (int index0 = 0; index0 < (int) (300); index0++) { + Iterations = (Iterations + 1); + Ylevel = (Ylevel - 1); + if (!((world.getBlockState(new BlockPos(x, Ylevel, z))).getBlock() == Blocks.AIR)) { + break; + } + } + if (Iterations >= 300) { + { + double _setval = 9999.9; + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.Altimeter = _setval; + capability.syncPlayerVariables(entity); + }); + } + } else { + { + double _setval = ((entity.getPosY() - Ylevel) * 3.28084); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.Altimeter = _setval; + capability.syncPlayerVariables(entity); + }); + } + } + } + if (entity.ticksExisted % 5 == 0) { + net.minecraft.server.MinecraftServer server = net.minecraftforge.fml.LogicalSidedProvider.INSTANCE + .get(net.minecraftforge.fml.LogicalSide.SERVER); + double meanTickTime = java.util.Arrays.stream(server.tickTimeArray).average().orElse(0.0) * 1.0E-6D; + Dx = (entity.getPosX() - (entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).LastPosX); + Dy = (entity.getPosZ() - (entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).LastPosZ); + { + double _setval = ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).VehicleOdometerMetres * 0.000621371); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleOdometer = _setval; + capability.syncPlayerVariables(entity); + }); + } + { + double _setval = (entity.getPosX()); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.LastPosX = _setval; + capability.syncPlayerVariables(entity); + }); + } + { + double _setval = (entity.getPosZ()); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.LastPosZ = _setval; + capability.syncPlayerVariables(entity); + }); + } + TPS = Math.min(20.0, 1000.0 / Math.max(1.0, meanTickTime));; + { + double _setval = Math.round(((Math.abs(Dx) + Math.abs(Dy)) / (20.0 / TPS)) * 4 * 2.23694); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.GoalMPH = _setval; + capability.syncPlayerVariables(entity); + }); + } + } + if ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new HemModVariables.PlayerVariables())).MPH != (entity + .getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new HemModVariables.PlayerVariables())).GoalMPH) { + if ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new HemModVariables.PlayerVariables())).MPH > (entity + .getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new HemModVariables.PlayerVariables())).GoalMPH) { + { + double _setval = ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).MPH - 1); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.MPH = _setval; + capability.syncPlayerVariables(entity); + }); + } + } else if ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).MPH < (entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).GoalMPH) { + { + double _setval = ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).MPH + 1); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.MPH = _setval; + capability.syncPlayerVariables(entity); + }); + } + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/TigerFishEntityShakingConditionProcedure.java b/src/main/java/studio/halbear/hem/procedures/TigerFishEntityShakingConditionProcedure.java new file mode 100644 index 0000000..9af54e2 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/TigerFishEntityShakingConditionProcedure.java @@ -0,0 +1,23 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemMod; + +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class TigerFishEntityShakingConditionProcedure { + + public static boolean executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure TigerFishEntityShakingCondition!"); + return false; + } + Entity entity = (Entity) dependencies.get("entity"); + if (entity.isInWaterRainOrBubbleColumn()) { + return false; + } + return true; + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/TigerFishOnEntityTickUpdateProcedure.java b/src/main/java/studio/halbear/hem/procedures/TigerFishOnEntityTickUpdateProcedure.java new file mode 100644 index 0000000..a0b0d39 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/TigerFishOnEntityTickUpdateProcedure.java @@ -0,0 +1,55 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemMod; + +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.IWorld; +import net.minecraft.util.DamageSource; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class TigerFishOnEntityTickUpdateProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure TigerFishOnEntityTickUpdate!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure TigerFishOnEntityTickUpdate!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure TigerFishOnEntityTickUpdate!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure TigerFishOnEntityTickUpdate!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure TigerFishOnEntityTickUpdate!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + Entity entity = (Entity) dependencies.get("entity"); + if (Math.random() > 0.975) { + if (world instanceof ServerWorld) { + ((ServerWorld) world).spawnParticle(ParticleTypes.BUBBLE, x, y, z, (int) 5, 0, 0.3, 0, 0.1); + } + if (!entity.isInWaterRainOrBubbleColumn()) { + entity.attackEntityFrom(DamageSource.GENERIC, (float) 3); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/VehicleAccelerateOnKeyPressedProcedure.java b/src/main/java/studio/halbear/hem/procedures/VehicleAccelerateOnKeyPressedProcedure.java new file mode 100644 index 0000000..8e7eed1 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/VehicleAccelerateOnKeyPressedProcedure.java @@ -0,0 +1,29 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class VehicleAccelerateOnKeyPressedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure VehicleAccelerateOnKeyPressed!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + if ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new HemModVariables.PlayerVariables())).PilotingVehicle) { + { + boolean _setval = (true); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleAccelerate = _setval; + capability.syncPlayerVariables(entity); + }); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/VehicleAccelerateOnKeyReleasedProcedure.java b/src/main/java/studio/halbear/hem/procedures/VehicleAccelerateOnKeyReleasedProcedure.java new file mode 100644 index 0000000..e320c4f --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/VehicleAccelerateOnKeyReleasedProcedure.java @@ -0,0 +1,27 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class VehicleAccelerateOnKeyReleasedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure VehicleAccelerateOnKeyReleased!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + { + boolean _setval = (false); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleAccelerate = _setval; + capability.syncPlayerVariables(entity); + }); + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/VehicleBackwardOnKeyPressedProcedure.java b/src/main/java/studio/halbear/hem/procedures/VehicleBackwardOnKeyPressedProcedure.java new file mode 100644 index 0000000..d8f4a54 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/VehicleBackwardOnKeyPressedProcedure.java @@ -0,0 +1,29 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class VehicleBackwardOnKeyPressedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure VehicleBackwardOnKeyPressed!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + if ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new HemModVariables.PlayerVariables())).PilotingVehicle) { + { + boolean _setval = (true); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleBackward = _setval; + capability.syncPlayerVariables(entity); + }); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/VehicleBackwardOnKeyReleasedProcedure.java b/src/main/java/studio/halbear/hem/procedures/VehicleBackwardOnKeyReleasedProcedure.java new file mode 100644 index 0000000..d99a875 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/VehicleBackwardOnKeyReleasedProcedure.java @@ -0,0 +1,27 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class VehicleBackwardOnKeyReleasedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure VehicleBackwardOnKeyReleased!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + { + boolean _setval = (false); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleBackward = _setval; + capability.syncPlayerVariables(entity); + }); + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/VehicleDecelerateOnKeyPressedProcedure.java b/src/main/java/studio/halbear/hem/procedures/VehicleDecelerateOnKeyPressedProcedure.java new file mode 100644 index 0000000..9b7c32e --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/VehicleDecelerateOnKeyPressedProcedure.java @@ -0,0 +1,29 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class VehicleDecelerateOnKeyPressedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure VehicleDecelerateOnKeyPressed!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + if ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new HemModVariables.PlayerVariables())).PilotingVehicle) { + { + boolean _setval = (true); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleDecelerate = _setval; + capability.syncPlayerVariables(entity); + }); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/VehicleDecelerateOnKeyReleasedProcedure.java b/src/main/java/studio/halbear/hem/procedures/VehicleDecelerateOnKeyReleasedProcedure.java new file mode 100644 index 0000000..6e05665 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/VehicleDecelerateOnKeyReleasedProcedure.java @@ -0,0 +1,27 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class VehicleDecelerateOnKeyReleasedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure VehicleDecelerateOnKeyReleased!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + { + boolean _setval = (false); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleDecelerate = _setval; + capability.syncPlayerVariables(entity); + }); + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/VehicleForwardOnKeyPressedProcedure.java b/src/main/java/studio/halbear/hem/procedures/VehicleForwardOnKeyPressedProcedure.java new file mode 100644 index 0000000..76c672f --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/VehicleForwardOnKeyPressedProcedure.java @@ -0,0 +1,29 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class VehicleForwardOnKeyPressedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure VehicleForwardOnKeyPressed!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + if ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new HemModVariables.PlayerVariables())).PilotingVehicle) { + { + boolean _setval = (true); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleForward = _setval; + capability.syncPlayerVariables(entity); + }); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/VehicleForwardOnKeyReleasedProcedure.java b/src/main/java/studio/halbear/hem/procedures/VehicleForwardOnKeyReleasedProcedure.java new file mode 100644 index 0000000..ae6fac0 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/VehicleForwardOnKeyReleasedProcedure.java @@ -0,0 +1,27 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class VehicleForwardOnKeyReleasedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure VehicleForwardOnKeyReleased!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + { + boolean _setval = (false); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleForward = _setval; + capability.syncPlayerVariables(entity); + }); + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/VehicleIncreasePressureOnKeyPressedProcedure.java b/src/main/java/studio/halbear/hem/procedures/VehicleIncreasePressureOnKeyPressedProcedure.java new file mode 100644 index 0000000..50f0258 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/VehicleIncreasePressureOnKeyPressedProcedure.java @@ -0,0 +1,29 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class VehicleIncreasePressureOnKeyPressedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure VehicleIncreasePressureOnKeyPressed!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + if ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new HemModVariables.PlayerVariables())).PilotingVehicle) { + { + boolean _setval = (true); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleIncreasePressure = _setval; + capability.syncPlayerVariables(entity); + }); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/VehicleIncreasePressureOnKeyReleasedProcedure.java b/src/main/java/studio/halbear/hem/procedures/VehicleIncreasePressureOnKeyReleasedProcedure.java new file mode 100644 index 0000000..9b79db4 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/VehicleIncreasePressureOnKeyReleasedProcedure.java @@ -0,0 +1,27 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class VehicleIncreasePressureOnKeyReleasedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure VehicleIncreasePressureOnKeyReleased!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + { + boolean _setval = (false); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleIncreasePressure = _setval; + capability.syncPlayerVariables(entity); + }); + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/VehicleReleasePressureOnKeyPressedProcedure.java b/src/main/java/studio/halbear/hem/procedures/VehicleReleasePressureOnKeyPressedProcedure.java new file mode 100644 index 0000000..fbcd9e9 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/VehicleReleasePressureOnKeyPressedProcedure.java @@ -0,0 +1,29 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class VehicleReleasePressureOnKeyPressedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure VehicleReleasePressureOnKeyPressed!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + if ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new HemModVariables.PlayerVariables())).PilotingVehicle) { + { + boolean _setval = (true); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleReleasePressure = _setval; + capability.syncPlayerVariables(entity); + }); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/VehicleReleasePressureOnKeyReleasedProcedure.java b/src/main/java/studio/halbear/hem/procedures/VehicleReleasePressureOnKeyReleasedProcedure.java new file mode 100644 index 0000000..532fad2 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/VehicleReleasePressureOnKeyReleasedProcedure.java @@ -0,0 +1,27 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class VehicleReleasePressureOnKeyReleasedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure VehicleReleasePressureOnKeyReleased!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + { + boolean _setval = (false); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleReleasePressure = _setval; + capability.syncPlayerVariables(entity); + }); + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/VehicleStrafeLeftOnKeyPressedProcedure.java b/src/main/java/studio/halbear/hem/procedures/VehicleStrafeLeftOnKeyPressedProcedure.java new file mode 100644 index 0000000..fcacc57 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/VehicleStrafeLeftOnKeyPressedProcedure.java @@ -0,0 +1,29 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class VehicleStrafeLeftOnKeyPressedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure VehicleStrafeLeftOnKeyPressed!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + if ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new HemModVariables.PlayerVariables())).PilotingVehicle) { + { + boolean _setval = (true); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleStrafeLeft = _setval; + capability.syncPlayerVariables(entity); + }); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/VehicleStrafeLeftOnKeyReleasedProcedure.java b/src/main/java/studio/halbear/hem/procedures/VehicleStrafeLeftOnKeyReleasedProcedure.java new file mode 100644 index 0000000..10d0c61 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/VehicleStrafeLeftOnKeyReleasedProcedure.java @@ -0,0 +1,27 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class VehicleStrafeLeftOnKeyReleasedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure VehicleStrafeLeftOnKeyReleased!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + { + boolean _setval = (false); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleStrafeLeft = _setval; + capability.syncPlayerVariables(entity); + }); + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/VehicleStrafeRightOnKeyPressedProcedure.java b/src/main/java/studio/halbear/hem/procedures/VehicleStrafeRightOnKeyPressedProcedure.java new file mode 100644 index 0000000..1249a60 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/VehicleStrafeRightOnKeyPressedProcedure.java @@ -0,0 +1,29 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class VehicleStrafeRightOnKeyPressedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure VehicleStrafeRightOnKeyPressed!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + if ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new HemModVariables.PlayerVariables())).PilotingVehicle) { + { + boolean _setval = (true); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleStrafeRight = _setval; + capability.syncPlayerVariables(entity); + }); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/VehicleStrafeRightOnKeyReleasedProcedure.java b/src/main/java/studio/halbear/hem/procedures/VehicleStrafeRightOnKeyReleasedProcedure.java new file mode 100644 index 0000000..b02925c --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/VehicleStrafeRightOnKeyReleasedProcedure.java @@ -0,0 +1,27 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class VehicleStrafeRightOnKeyReleasedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure VehicleStrafeRightOnKeyReleased!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + { + boolean _setval = (false); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleStrafeRight = _setval; + capability.syncPlayerVariables(entity); + }); + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/VehicleTurnLeftOnKeyPressedProcedure.java b/src/main/java/studio/halbear/hem/procedures/VehicleTurnLeftOnKeyPressedProcedure.java new file mode 100644 index 0000000..112f000 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/VehicleTurnLeftOnKeyPressedProcedure.java @@ -0,0 +1,29 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class VehicleTurnLeftOnKeyPressedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure VehicleTurnLeftOnKeyPressed!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + if ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new HemModVariables.PlayerVariables())).PilotingVehicle) { + { + boolean _setval = (true); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleTurnLeft = _setval; + capability.syncPlayerVariables(entity); + }); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/VehicleTurnLeftOnKeyReleasedProcedure.java b/src/main/java/studio/halbear/hem/procedures/VehicleTurnLeftOnKeyReleasedProcedure.java new file mode 100644 index 0000000..9888401 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/VehicleTurnLeftOnKeyReleasedProcedure.java @@ -0,0 +1,27 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class VehicleTurnLeftOnKeyReleasedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure VehicleTurnLeftOnKeyReleased!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + { + boolean _setval = (false); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleTurnLeft = _setval; + capability.syncPlayerVariables(entity); + }); + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/VehicleTurnRightOnKeyPressedProcedure.java b/src/main/java/studio/halbear/hem/procedures/VehicleTurnRightOnKeyPressedProcedure.java new file mode 100644 index 0000000..c2656c0 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/VehicleTurnRightOnKeyPressedProcedure.java @@ -0,0 +1,29 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class VehicleTurnRightOnKeyPressedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure VehicleTurnRightOnKeyPressed!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + if ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new HemModVariables.PlayerVariables())).PilotingVehicle) { + { + boolean _setval = (true); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleTurnRight = _setval; + capability.syncPlayerVariables(entity); + }); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/VehicleTurnRightOnKeyReleasedProcedure.java b/src/main/java/studio/halbear/hem/procedures/VehicleTurnRightOnKeyReleasedProcedure.java new file mode 100644 index 0000000..35dae81 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/VehicleTurnRightOnKeyReleasedProcedure.java @@ -0,0 +1,27 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class VehicleTurnRightOnKeyReleasedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure VehicleTurnRightOnKeyReleased!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + { + boolean _setval = (false); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleTurnRight = _setval; + capability.syncPlayerVariables(entity); + }); + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/VehicleYawProcedure.java b/src/main/java/studio/halbear/hem/procedures/VehicleYawProcedure.java new file mode 100644 index 0000000..9d22c75 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/VehicleYawProcedure.java @@ -0,0 +1,68 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.TickEvent; + +import net.minecraft.world.World; +import net.minecraft.entity.Entity; + +import java.util.Map; +import java.util.HashMap; + +public class VehicleYawProcedure { + @Mod.EventBusSubscriber + private static class GlobalTrigger { + @SubscribeEvent + public static void onPlayerTick(TickEvent.PlayerTickEvent event) { + if (event.phase == TickEvent.Phase.END) { + Entity entity = event.player; + World world = entity.world; + double i = entity.getPosX(); + double j = entity.getPosY(); + double k = entity.getPosZ(); + Map dependencies = new HashMap<>(); + dependencies.put("x", i); + dependencies.put("y", j); + dependencies.put("z", k); + dependencies.put("world", world); + dependencies.put("entity", entity); + dependencies.put("event", event); + executeProcedure(dependencies); + } + } + } + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure VehicleYaw!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + if ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new HemModVariables.PlayerVariables())).VehicleTurnLeft) { + { + double _setval = ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).VehicleYaw - 1); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleYaw = _setval; + capability.syncPlayerVariables(entity); + }); + } + } + if ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).VehicleTurnRight) { + { + double _setval = ((entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).VehicleYaw + 1); + entity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.VehicleYaw = _setval; + capability.syncPlayerVariables(entity); + }); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/Wall1AdditionalGenerationConditionProcedure.java b/src/main/java/studio/halbear/hem/procedures/Wall1AdditionalGenerationConditionProcedure.java new file mode 100644 index 0000000..7f5429c --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/Wall1AdditionalGenerationConditionProcedure.java @@ -0,0 +1,40 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.block.BlueleafWheatBlock; +import studio.halbear.hem.HemMod; + +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; + +import java.util.Map; + +public class Wall1AdditionalGenerationConditionProcedure { + + public static boolean executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure Wall1AdditionalGenerationCondition!"); + return false; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure Wall1AdditionalGenerationCondition!"); + return false; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure Wall1AdditionalGenerationCondition!"); + return false; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + if (((x - 8) % 16 == 0 || (z - 8) % 16 == 0) + && !((world.getBlockState(new BlockPos(x, world.getHeight(Heightmap.Type.MOTION_BLOCKING_NO_LEAVES, (int) x, (int) z), z))) + .getBlock() == BlueleafWheatBlock.block)) { + return true; + } + return false; + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/Wall1OnStructureInstanceGeneratedProcedure.java b/src/main/java/studio/halbear/hem/procedures/Wall1OnStructureInstanceGeneratedProcedure.java new file mode 100644 index 0000000..d5da52c --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/Wall1OnStructureInstanceGeneratedProcedure.java @@ -0,0 +1,228 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.block.BlueleafWheatBlock; +import studio.halbear.hem.block.BlueleafStoneGravelBlock; +import studio.halbear.hem.block.BlueleafLushLeavesBlock; +import studio.halbear.hem.block.BlueleafLavenderBlock; +import studio.halbear.hem.block.BlueleafFluorescentLeavesBlock; +import studio.halbear.hem.block.BlueleafDirtGrassBlockBlock; +import studio.halbear.hem.block.BlueleafDirtBlockBlock; +import studio.halbear.hem.block.BlueleafCobblestoneWallBlock; +import studio.halbear.hem.block.BlueleafCobblestoneStairsBlock; +import studio.halbear.hem.block.BlueleafCobblestoneSlabBlock; +import studio.halbear.hem.block.BlueleafCobblestoneBlock; +import studio.halbear.hem.HemMod; + +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.block.Blocks; + +import java.util.Random; +import java.util.Map; +import java.util.Iterator; + +public class Wall1OnStructureInstanceGeneratedProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure Wall1OnStructureInstanceGenerated!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure Wall1OnStructureInstanceGenerated!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure Wall1OnStructureInstanceGenerated!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure Wall1OnStructureInstanceGenerated!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + double Iterator = 0; + double Random = 0; + double IteratorY = 0; + double IteratorX = 0; + double IteratorZ = 0; + double Random2 = 0; + double posY = 0; + double PosX = 0; + double PosZ = 0; + double PosYSource = 0; + double length = 0; + double PreviousType = 0; + if (z < -16) { + world.setBlockState(new BlockPos(x, y + 1, z), Blocks.AIR.getDefaultState(), 3); + world.setBlockState(new BlockPos(x, y + 1, z), BlueleafLushLeavesBlock.block.getDefaultState(), 3); + world.setBlockState(new BlockPos(x, y, z), Blocks.AIR.getDefaultState(), 3); + world.setBlockState(new BlockPos(x, y, z), BlueleafLushLeavesBlock.block.getDefaultState(), 3); + } + Iterator = 0; + for (int index0 = 0; index0 < (int) (3); index0++) { + PreviousType = Random; + IteratorX = 0; + IteratorZ = 0; + IteratorY = 0; + Random = Math.round(2 * Math.random()); + length = (4 + Math.round(6 * Math.random())); + if (Random == 1) { + length = 16; + } + if (z < -16) { + length = 8; + if (Random != 1) { + Random = Math.round(2 * Math.random()); + } + } + while (length > 0) { + length = (length - 1); + if (Iterator == 0) { + IteratorX = (IteratorX - 1); + } + if (Iterator == 1) { + IteratorX = (IteratorX + 1); + if ((x - 8) % 16 != 0 && PreviousType == 1) { + Random = 0; + } + } + if (Iterator == 2) { + IteratorZ = (IteratorZ + 1); + } + if (Iterator == 3) { + IteratorZ = (IteratorZ - 1); + if ((z - 8) % 16 != 0 && PreviousType == 1) { + Random = 0; + } + } + if ((Iterator > 1 && (x - 8) % 16 == 0 || Iterator <= 1 && (z - 8) % 16 == 0) + && (!BlockTags.getCollection().getTagByID(new ResourceLocation("forge:solid_block")) + .contains((world.getBlockState(new BlockPos(x + IteratorX, + world.getHeight(Heightmap.Type.MOTION_BLOCKING_NO_LEAVES, (int) (x + IteratorX), (int) (z + IteratorZ)) + + IteratorY, + z + IteratorZ))).getBlock()) + || (Random == 1 || z + IteratorZ < 0) && !((world.getBlockState(new BlockPos(x + IteratorX, + world.getHeight(Heightmap.Type.MOTION_BLOCKING_NO_LEAVES, (int) (x + IteratorX), (int) (z + IteratorZ)) + + IteratorY, + z + IteratorZ))).getBlock() == BlueleafWheatBlock.block + && !((world.getBlockState(new BlockPos(x + IteratorX, + world.getHeight(Heightmap.Type.MOTION_BLOCKING_NO_LEAVES, (int) (x + IteratorX), + (int) (z + IteratorZ)) + IteratorY, + z + IteratorZ))).getBlock() == BlueleafLavenderBlock.block)))) { + posY = (world.getHeight(Heightmap.Type.MOTION_BLOCKING_NO_LEAVES, (int) (x + IteratorX), (int) (z + IteratorZ)) + IteratorY); + PosYSource = (world.getHeight(Heightmap.Type.MOTION_BLOCKING_NO_LEAVES, (int) (x + IteratorX), (int) (z + IteratorZ))); + PosX = (x + IteratorX); + PosZ = (z + IteratorZ); + Random2 = Math.random(); + if (!((world.getBlockState(new BlockPos(PosX, PosYSource, PosZ))).getBlock() == Blocks.WATER)) { + if (Random == 1 && ((x - 8) % 16 != 0 || (z - 8) % 16 != 0)) { + if ((world.getBlockState(new BlockPos(PosX, PosYSource - 1, PosZ))).getBlock() == BlueleafDirtBlockBlock.block) { + world.setBlockState(new BlockPos(PosX, PosYSource + 1, PosZ), Blocks.AIR.getDefaultState(), 3); + world.setBlockState(new BlockPos(PosX, PosYSource + 2, PosZ), Blocks.AIR.getDefaultState(), 3); + world.setBlockState(new BlockPos(PosX, PosYSource, PosZ), Blocks.AIR.getDefaultState(), 3); + if (PosZ < 8) { + world.setBlockState(new BlockPos(PosX, PosYSource, PosZ), BlueleafLavenderBlock.block.getDefaultState(), 3); + } else { + world.setBlockState(new BlockPos(PosX, PosYSource, PosZ), BlueleafWheatBlock.block.getDefaultState(), 3); + } + } else if ((world.getBlockState(new BlockPos(PosX, PosYSource - 2, PosZ))).getBlock() == BlueleafStoneGravelBlock.block) { + world.setBlockState(new BlockPos(PosX, PosYSource + 1, PosZ), Blocks.AIR.getDefaultState(), 3); + world.setBlockState(new BlockPos(PosX, PosYSource + 2, PosZ), Blocks.AIR.getDefaultState(), 3); + world.setBlockState(new BlockPos(PosX, PosYSource - 2, PosZ), Blocks.AIR.getDefaultState(), 3); + world.setBlockState(new BlockPos(PosX, PosYSource - 2, PosZ), BlueleafDirtBlockBlock.block.getDefaultState(), 3); + world.setBlockState(new BlockPos(PosX, PosYSource - 1, PosZ), Blocks.AIR.getDefaultState(), 3); + if (PosZ < 8) { + world.setBlockState(new BlockPos(PosX, PosYSource - 1, PosZ), BlueleafLavenderBlock.block.getDefaultState(), 3); + } else { + world.setBlockState(new BlockPos(PosX, PosYSource - 1, PosZ), BlueleafWheatBlock.block.getDefaultState(), 3); + } + } + } else if (Random == 1 && (x - 8) % 16 == 0 && (z - 8) % 16 == 0) { + length = 0; + } + if (!((world.getBlockState(new BlockPos(PosX, PosYSource, PosZ))).getBlock() == BlueleafWheatBlock.block) + && !((world.getBlockState(new BlockPos(PosX, PosYSource, PosZ))).getBlock() == BlueleafLavenderBlock.block) + && (world.getBlockState(new BlockPos(PosX, PosYSource - 1, PosZ))).getBlock() == BlueleafDirtBlockBlock.block) { + if (Random == 0) { + if (PosZ < -16) { + world.setBlockState(new BlockPos(PosX, posY, PosZ), Blocks.AIR.getDefaultState(), 3); + world.setBlockState(new BlockPos(PosX, posY, PosZ), BlueleafLushLeavesBlock.block.getDefaultState(), 3); + if (length > 1 && Math.random() > 0.3) { + world.setBlockState(new BlockPos(PosX, posY + 1, PosZ), Blocks.AIR.getDefaultState(), 3); + world.setBlockState(new BlockPos(PosX, posY + 1, PosZ), BlueleafLushLeavesBlock.block.getDefaultState(), 3); + } + } else { + world.setBlockState(new BlockPos(PosX, posY, PosZ), Blocks.AIR.getDefaultState(), 3); + world.setBlockState(new BlockPos(PosX, posY, PosZ), BlueleafCobblestoneBlock.block.getDefaultState(), 3); + if (Math.random() > 0.7) { + world.setBlockState(new BlockPos(PosX, posY, PosZ), Blocks.AIR.getDefaultState(), 3); + world.setBlockState(new BlockPos(PosX, posY, PosZ), BlueleafCobblestoneStairsBlock.block.getDefaultState(), + 3); + } + if (length > 1) { + world.setBlockState(new BlockPos(PosX, posY + 1, PosZ), Blocks.AIR.getDefaultState(), 3); + world.setBlockState(new BlockPos(PosX, posY + 1, PosZ), BlueleafCobblestoneSlabBlock.block.getDefaultState(), + 3); + if (Math.random() > 0.7) { + world.setBlockState(new BlockPos(PosX, posY + 1, PosZ), Blocks.AIR.getDefaultState(), 3); + world.setBlockState(new BlockPos(PosX, posY + 1, PosZ), + BlueleafCobblestoneWallBlock.block.getDefaultState(), 3); + } + } + } + if (Random == 2) { + if (PosZ < -16) { + world.setBlockState(new BlockPos(PosX, posY, PosZ), Blocks.AIR.getDefaultState(), 3); + world.setBlockState(new BlockPos(PosX, posY, PosZ), BlueleafFluorescentLeavesBlock.block.getDefaultState(), + 3); + if (length > 1 && Math.random() > 0.3) { + world.setBlockState(new BlockPos(PosX, posY + 1, PosZ), Blocks.AIR.getDefaultState(), 3); + world.setBlockState(new BlockPos(PosX, posY + 1, PosZ), + BlueleafFluorescentLeavesBlock.block.getDefaultState(), 3); + } + } else { + world.setBlockState(new BlockPos(PosX, posY, PosZ), Blocks.AIR.getDefaultState(), 3); + world.setBlockState(new BlockPos(PosX, posY, PosZ), BlueleafCobblestoneBlock.block.getDefaultState(), 3); + if (length > 1) { + world.setBlockState(new BlockPos(PosX, posY + 1, PosZ), Blocks.AIR.getDefaultState(), 3); + world.setBlockState(new BlockPos(PosX, posY + 1, PosZ), BlueleafCobblestoneBlock.block.getDefaultState(), + 3); + if (Math.random() > 0.5) { + world.setBlockState(new BlockPos(PosX, posY + 1, PosZ), Blocks.AIR.getDefaultState(), 3); + world.setBlockState(new BlockPos(PosX, posY + 1, PosZ), + BlueleafStoneGravelBlock.block.getDefaultState(), 3); + } + } + } + } + if (Random != 1) { + if (PosZ < 0) { + world.setBlockState(new BlockPos(PosX, PosYSource - 1, PosZ), Blocks.AIR.getDefaultState(), 3); + world.setBlockState(new BlockPos(PosX, PosYSource - 1, PosZ), + BlueleafDirtGrassBlockBlock.block.getDefaultState(), 3); + } else { + world.setBlockState(new BlockPos(PosX, PosYSource - 1, PosZ), Blocks.AIR.getDefaultState(), 3); + world.setBlockState(new BlockPos(PosX, PosYSource - 1, PosZ), + BlueleafCobblestoneBlock.block.getDefaultState(), 3); + } + } + } + } + } + } + } + Iterator = (Iterator + 1); + } + } +} diff --git a/src/main/java/studio/halbear/hem/world/biome/BlueleafPlainsBiome.java b/src/main/java/studio/halbear/hem/world/biome/BlueleafPlainsBiome.java new file mode 100644 index 0000000..7382d2b --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/biome/BlueleafPlainsBiome.java @@ -0,0 +1,166 @@ + +package studio.halbear.hem.world.biome; + +import studio.halbear.hem.particle.BlueleafAmbienceParticle; +import studio.halbear.hem.block.BlueleafStoneBlock; +import studio.halbear.hem.block.BlueleafGrassBlockBlock; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.BiomeDictionary; + +import net.minecraft.world.gen.treedecorator.TrunkVineTreeDecorator; +import net.minecraft.world.gen.treedecorator.TreeDecoratorType; +import net.minecraft.world.gen.treedecorator.LeaveVineTreeDecorator; +import net.minecraft.world.gen.treedecorator.CocoaTreeDecorator; +import net.minecraft.world.gen.surfacebuilders.SurfaceBuilderConfig; +import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.biome.ParticleEffectAmbience; +import net.minecraft.world.biome.MobSpawnInfo; +import net.minecraft.world.biome.DefaultBiomeFeatures; +import net.minecraft.world.biome.BiomeGenerationSettings; +import net.minecraft.world.biome.BiomeAmbience; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.IWorldWriter; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.MutableBoundingBox; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Direction; +import net.minecraft.state.BooleanProperty; +import net.minecraft.block.Blocks; +import net.minecraft.block.BlockState; + +import java.util.Set; +import java.util.Random; +import java.util.List; + +@HemModElements.ModElement.Tag +public class BlueleafPlainsBiome extends HemModElements.ModElement { + public static Biome biome; + + public BlueleafPlainsBiome(HemModElements instance) { + super(instance, 64); + FMLJavaModLoadingContext.get().getModEventBus().register(new BiomeRegisterHandler()); + } + + private static class BiomeRegisterHandler { + @SubscribeEvent + public void registerBiomes(RegistryEvent.Register event) { + if (biome == null) { + BiomeAmbience effects = new BiomeAmbience.Builder().setFogColor(12638463).setWaterColor(4159204).setWaterFogColor(329011) + .withSkyColor(7972607).withFoliageColor(-13382401).withGrassColor(-10040065) + .setParticle(new ParticleEffectAmbience(BlueleafAmbienceParticle.particle, 0.03f)).build(); + BiomeGenerationSettings.Builder biomeGenerationSettings = new BiomeGenerationSettings.Builder().withSurfaceBuilder( + SurfaceBuilder.DEFAULT.func_242929_a(new SurfaceBuilderConfig(BlueleafGrassBlockBlock.block.getDefaultState(), + BlueleafStoneBlock.block.getDefaultState(), Blocks.WATER.getDefaultState()))); + DefaultBiomeFeatures.withFossils(biomeGenerationSettings); + MobSpawnInfo.Builder mobSpawnInfo = new MobSpawnInfo.Builder().isValidSpawnBiomeForPlayer(); + biome = new Biome.Builder().precipitation(Biome.RainType.RAIN).category(Biome.Category.PLAINS).depth(0.5f).scale(0.1f) + .temperature(0.6f).downfall(0.6f).setEffects(effects).withMobSpawnSettings(mobSpawnInfo.copy()) + .withGenerationSettings(biomeGenerationSettings.build()).build(); + event.getRegistry().register(biome.setRegistryName("hem:blueleaf_plains")); + } + } + } + + @Override + public void init(FMLCommonSetupEvent event) { + BiomeDictionary.addTypes(RegistryKey.getOrCreateKey(Registry.BIOME_KEY, WorldGenRegistries.BIOME.getKey(biome)), BiomeDictionary.Type.PLAINS, + BiomeDictionary.Type.FOREST, BiomeDictionary.Type.HILLS, BiomeDictionary.Type.DRY); + } + + private static class CustomLeaveVineTreeDecorator extends LeaveVineTreeDecorator { + public static final CustomLeaveVineTreeDecorator instance = new CustomLeaveVineTreeDecorator(); + public static com.mojang.serialization.Codec codec; + public static TreeDecoratorType tdt; + static { + codec = com.mojang.serialization.Codec.unit(() -> instance); + tdt = new TreeDecoratorType(codec); + tdt.setRegistryName("blueleaf_plains_lvtd"); + ForgeRegistries.TREE_DECORATOR_TYPES.register(tdt); + } + + @Override + protected TreeDecoratorType func_230380_a_() { + return tdt; + } + + @Override + protected void func_227424_a_(IWorldWriter ww, BlockPos bp, BooleanProperty bpr, Set sbc, MutableBoundingBox mbb) { + this.func_227423_a_(ww, bp, Blocks.AIR.getDefaultState(), sbc, mbb); + } + } + + private static class CustomTrunkVineTreeDecorator extends TrunkVineTreeDecorator { + public static final CustomTrunkVineTreeDecorator instance = new CustomTrunkVineTreeDecorator(); + public static com.mojang.serialization.Codec codec; + public static TreeDecoratorType tdt; + static { + codec = com.mojang.serialization.Codec.unit(() -> instance); + tdt = new TreeDecoratorType(codec); + tdt.setRegistryName("blueleaf_plains_tvtd"); + ForgeRegistries.TREE_DECORATOR_TYPES.register(tdt); + } + + @Override + protected TreeDecoratorType func_230380_a_() { + return tdt; + } + + @Override + protected void func_227424_a_(IWorldWriter ww, BlockPos bp, BooleanProperty bpr, Set sbc, MutableBoundingBox mbb) { + this.func_227423_a_(ww, bp, Blocks.AIR.getDefaultState(), sbc, mbb); + } + } + + private static class CustomCocoaTreeDecorator extends CocoaTreeDecorator { + public static final CustomCocoaTreeDecorator instance = new CustomCocoaTreeDecorator(); + public static com.mojang.serialization.Codec codec; + public static TreeDecoratorType tdt; + static { + codec = com.mojang.serialization.Codec.unit(() -> instance); + tdt = new TreeDecoratorType(codec); + tdt.setRegistryName("blueleaf_plains_ctd"); + ForgeRegistries.TREE_DECORATOR_TYPES.register(tdt); + } + + public CustomCocoaTreeDecorator() { + super(0.2f); + } + + @Override + protected TreeDecoratorType func_230380_a_() { + return tdt; + } + + @Override + public void func_225576_a_(ISeedReader p_225576_1_, Random p_225576_2_, List p_225576_3_, List p_225576_4_, + Set p_225576_5_, MutableBoundingBox p_225576_6_) { + if (!(p_225576_2_.nextFloat() >= 0.2F)) { + int i = p_225576_3_.get(0).getY(); + p_225576_3_.stream().filter((p_236867_1_) -> { + return p_236867_1_.getY() - i <= 2; + }).forEach((p_242865_5_) -> { + for (Direction direction : Direction.Plane.HORIZONTAL) { + if (p_225576_2_.nextFloat() <= 0.25F) { + Direction direction1 = direction.getOpposite(); + BlockPos blockpos = p_242865_5_.add(direction1.getXOffset(), 0, direction1.getZOffset()); + if (Feature.isAirAt(p_225576_1_, blockpos)) { + BlockState blockstate = Blocks.AIR.getDefaultState(); + this.func_227423_a_(p_225576_1_, blockpos, blockstate, p_225576_5_, p_225576_6_); + } + } + } + }); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/world/biome/BlueleafWheatFieldsBiome.java b/src/main/java/studio/halbear/hem/world/biome/BlueleafWheatFieldsBiome.java new file mode 100644 index 0000000..eb8b841 --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/biome/BlueleafWheatFieldsBiome.java @@ -0,0 +1,161 @@ + +package studio.halbear.hem.world.biome; + +import studio.halbear.hem.block.BlueleafStoneGravelBlock; +import studio.halbear.hem.block.BlueleafDirtBlockBlock; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.BiomeDictionary; + +import net.minecraft.world.gen.treedecorator.TrunkVineTreeDecorator; +import net.minecraft.world.gen.treedecorator.TreeDecoratorType; +import net.minecraft.world.gen.treedecorator.LeaveVineTreeDecorator; +import net.minecraft.world.gen.treedecorator.CocoaTreeDecorator; +import net.minecraft.world.gen.surfacebuilders.SurfaceBuilderConfig; +import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.biome.MobSpawnInfo; +import net.minecraft.world.biome.BiomeGenerationSettings; +import net.minecraft.world.biome.BiomeAmbience; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.IWorldWriter; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.MutableBoundingBox; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Direction; +import net.minecraft.state.BooleanProperty; +import net.minecraft.block.Blocks; +import net.minecraft.block.BlockState; + +import java.util.Set; +import java.util.Random; +import java.util.List; + +@HemModElements.ModElement.Tag +public class BlueleafWheatFieldsBiome extends HemModElements.ModElement { + public static Biome biome; + + public BlueleafWheatFieldsBiome(HemModElements instance) { + super(instance, 84); + FMLJavaModLoadingContext.get().getModEventBus().register(new BiomeRegisterHandler()); + } + + private static class BiomeRegisterHandler { + @SubscribeEvent + public void registerBiomes(RegistryEvent.Register event) { + if (biome == null) { + BiomeAmbience effects = new BiomeAmbience.Builder().setFogColor(12638463).setWaterColor(-13382401).setWaterFogColor(329011) + .withSkyColor(7972607).withFoliageColor(-6697729).withGrassColor(-10053121).build(); + BiomeGenerationSettings.Builder biomeGenerationSettings = new BiomeGenerationSettings.Builder().withSurfaceBuilder( + SurfaceBuilder.DEFAULT.func_242929_a(new SurfaceBuilderConfig(BlueleafDirtBlockBlock.block.getDefaultState(), + BlueleafStoneGravelBlock.block.getDefaultState(), Blocks.WATER.getDefaultState()))); + MobSpawnInfo.Builder mobSpawnInfo = new MobSpawnInfo.Builder().isValidSpawnBiomeForPlayer(); + biome = new Biome.Builder().precipitation(Biome.RainType.RAIN).category(Biome.Category.FOREST).depth(0.1f).scale(0.1f) + .temperature(0.5f).downfall(0.5f).setEffects(effects).withMobSpawnSettings(mobSpawnInfo.copy()) + .withGenerationSettings(biomeGenerationSettings.build()).build(); + event.getRegistry().register(biome.setRegistryName("hem:blueleaf_hayfever_fields")); + } + } + } + + @Override + public void init(FMLCommonSetupEvent event) { + BiomeDictionary.addTypes(RegistryKey.getOrCreateKey(Registry.BIOME_KEY, WorldGenRegistries.BIOME.getKey(biome)), BiomeDictionary.Type.RARE, + BiomeDictionary.Type.SPARSE, BiomeDictionary.Type.DRY); + } + + private static class CustomLeaveVineTreeDecorator extends LeaveVineTreeDecorator { + public static final CustomLeaveVineTreeDecorator instance = new CustomLeaveVineTreeDecorator(); + public static com.mojang.serialization.Codec codec; + public static TreeDecoratorType tdt; + static { + codec = com.mojang.serialization.Codec.unit(() -> instance); + tdt = new TreeDecoratorType(codec); + tdt.setRegistryName("blueleaf_hayfever_fields_lvtd"); + ForgeRegistries.TREE_DECORATOR_TYPES.register(tdt); + } + + @Override + protected TreeDecoratorType func_230380_a_() { + return tdt; + } + + @Override + protected void func_227424_a_(IWorldWriter ww, BlockPos bp, BooleanProperty bpr, Set sbc, MutableBoundingBox mbb) { + this.func_227423_a_(ww, bp, Blocks.AIR.getDefaultState(), sbc, mbb); + } + } + + private static class CustomTrunkVineTreeDecorator extends TrunkVineTreeDecorator { + public static final CustomTrunkVineTreeDecorator instance = new CustomTrunkVineTreeDecorator(); + public static com.mojang.serialization.Codec codec; + public static TreeDecoratorType tdt; + static { + codec = com.mojang.serialization.Codec.unit(() -> instance); + tdt = new TreeDecoratorType(codec); + tdt.setRegistryName("blueleaf_hayfever_fields_tvtd"); + ForgeRegistries.TREE_DECORATOR_TYPES.register(tdt); + } + + @Override + protected TreeDecoratorType func_230380_a_() { + return tdt; + } + + @Override + protected void func_227424_a_(IWorldWriter ww, BlockPos bp, BooleanProperty bpr, Set sbc, MutableBoundingBox mbb) { + this.func_227423_a_(ww, bp, Blocks.AIR.getDefaultState(), sbc, mbb); + } + } + + private static class CustomCocoaTreeDecorator extends CocoaTreeDecorator { + public static final CustomCocoaTreeDecorator instance = new CustomCocoaTreeDecorator(); + public static com.mojang.serialization.Codec codec; + public static TreeDecoratorType tdt; + static { + codec = com.mojang.serialization.Codec.unit(() -> instance); + tdt = new TreeDecoratorType(codec); + tdt.setRegistryName("blueleaf_hayfever_fields_ctd"); + ForgeRegistries.TREE_DECORATOR_TYPES.register(tdt); + } + + public CustomCocoaTreeDecorator() { + super(0.2f); + } + + @Override + protected TreeDecoratorType func_230380_a_() { + return tdt; + } + + @Override + public void func_225576_a_(ISeedReader p_225576_1_, Random p_225576_2_, List p_225576_3_, List p_225576_4_, + Set p_225576_5_, MutableBoundingBox p_225576_6_) { + if (!(p_225576_2_.nextFloat() >= 0.2F)) { + int i = p_225576_3_.get(0).getY(); + p_225576_3_.stream().filter((p_236867_1_) -> { + return p_236867_1_.getY() - i <= 2; + }).forEach((p_242865_5_) -> { + for (Direction direction : Direction.Plane.HORIZONTAL) { + if (p_225576_2_.nextFloat() <= 0.25F) { + Direction direction1 = direction.getOpposite(); + BlockPos blockpos = p_242865_5_.add(direction1.getXOffset(), 0, direction1.getZOffset()); + if (Feature.isAirAt(p_225576_1_, blockpos)) { + BlockState blockstate = Blocks.AIR.getDefaultState(); + this.func_227423_a_(p_225576_1_, blockpos, blockstate, p_225576_5_, p_225576_6_); + } + } + } + }); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/world/biome/HeightendBlueleafPlainsBiome.java b/src/main/java/studio/halbear/hem/world/biome/HeightendBlueleafPlainsBiome.java new file mode 100644 index 0000000..1b3935a --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/biome/HeightendBlueleafPlainsBiome.java @@ -0,0 +1,166 @@ + +package studio.halbear.hem.world.biome; + +import studio.halbear.hem.particle.BlueleafAmbienceParticle; +import studio.halbear.hem.block.BlueleafStoneBlock; +import studio.halbear.hem.block.BlueleafGrassBlockBlock; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.BiomeDictionary; + +import net.minecraft.world.gen.treedecorator.TrunkVineTreeDecorator; +import net.minecraft.world.gen.treedecorator.TreeDecoratorType; +import net.minecraft.world.gen.treedecorator.LeaveVineTreeDecorator; +import net.minecraft.world.gen.treedecorator.CocoaTreeDecorator; +import net.minecraft.world.gen.surfacebuilders.SurfaceBuilderConfig; +import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.biome.ParticleEffectAmbience; +import net.minecraft.world.biome.MobSpawnInfo; +import net.minecraft.world.biome.DefaultBiomeFeatures; +import net.minecraft.world.biome.BiomeGenerationSettings; +import net.minecraft.world.biome.BiomeAmbience; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.IWorldWriter; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.MutableBoundingBox; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Direction; +import net.minecraft.state.BooleanProperty; +import net.minecraft.block.Blocks; +import net.minecraft.block.BlockState; + +import java.util.Set; +import java.util.Random; +import java.util.List; + +@HemModElements.ModElement.Tag +public class HeightendBlueleafPlainsBiome extends HemModElements.ModElement { + public static Biome biome; + + public HeightendBlueleafPlainsBiome(HemModElements instance) { + super(instance, 135); + FMLJavaModLoadingContext.get().getModEventBus().register(new BiomeRegisterHandler()); + } + + private static class BiomeRegisterHandler { + @SubscribeEvent + public void registerBiomes(RegistryEvent.Register event) { + if (biome == null) { + BiomeAmbience effects = new BiomeAmbience.Builder().setFogColor(12638463).setWaterColor(4159204).setWaterFogColor(329011) + .withSkyColor(7972607).withFoliageColor(-13382401).withGrassColor(-10040065) + .setParticle(new ParticleEffectAmbience(BlueleafAmbienceParticle.particle, 0.03f)).build(); + BiomeGenerationSettings.Builder biomeGenerationSettings = new BiomeGenerationSettings.Builder().withSurfaceBuilder( + SurfaceBuilder.DEFAULT.func_242929_a(new SurfaceBuilderConfig(BlueleafGrassBlockBlock.block.getDefaultState(), + BlueleafStoneBlock.block.getDefaultState(), Blocks.WATER.getDefaultState()))); + DefaultBiomeFeatures.withFossils(biomeGenerationSettings); + MobSpawnInfo.Builder mobSpawnInfo = new MobSpawnInfo.Builder().isValidSpawnBiomeForPlayer(); + biome = new Biome.Builder().precipitation(Biome.RainType.RAIN).category(Biome.Category.PLAINS).depth(1.3f).scale(0.2f) + .temperature(0.4f).downfall(0.5f).setEffects(effects).withMobSpawnSettings(mobSpawnInfo.copy()) + .withGenerationSettings(biomeGenerationSettings.build()).build(); + event.getRegistry().register(biome.setRegistryName("hem:heightend_blueleaf_plains")); + } + } + } + + @Override + public void init(FMLCommonSetupEvent event) { + BiomeDictionary.addTypes(RegistryKey.getOrCreateKey(Registry.BIOME_KEY, WorldGenRegistries.BIOME.getKey(biome)), BiomeDictionary.Type.PLAINS, + BiomeDictionary.Type.FOREST, BiomeDictionary.Type.HILLS, BiomeDictionary.Type.DRY); + } + + private static class CustomLeaveVineTreeDecorator extends LeaveVineTreeDecorator { + public static final CustomLeaveVineTreeDecorator instance = new CustomLeaveVineTreeDecorator(); + public static com.mojang.serialization.Codec codec; + public static TreeDecoratorType tdt; + static { + codec = com.mojang.serialization.Codec.unit(() -> instance); + tdt = new TreeDecoratorType(codec); + tdt.setRegistryName("heightend_blueleaf_plains_lvtd"); + ForgeRegistries.TREE_DECORATOR_TYPES.register(tdt); + } + + @Override + protected TreeDecoratorType func_230380_a_() { + return tdt; + } + + @Override + protected void func_227424_a_(IWorldWriter ww, BlockPos bp, BooleanProperty bpr, Set sbc, MutableBoundingBox mbb) { + this.func_227423_a_(ww, bp, Blocks.AIR.getDefaultState(), sbc, mbb); + } + } + + private static class CustomTrunkVineTreeDecorator extends TrunkVineTreeDecorator { + public static final CustomTrunkVineTreeDecorator instance = new CustomTrunkVineTreeDecorator(); + public static com.mojang.serialization.Codec codec; + public static TreeDecoratorType tdt; + static { + codec = com.mojang.serialization.Codec.unit(() -> instance); + tdt = new TreeDecoratorType(codec); + tdt.setRegistryName("heightend_blueleaf_plains_tvtd"); + ForgeRegistries.TREE_DECORATOR_TYPES.register(tdt); + } + + @Override + protected TreeDecoratorType func_230380_a_() { + return tdt; + } + + @Override + protected void func_227424_a_(IWorldWriter ww, BlockPos bp, BooleanProperty bpr, Set sbc, MutableBoundingBox mbb) { + this.func_227423_a_(ww, bp, Blocks.AIR.getDefaultState(), sbc, mbb); + } + } + + private static class CustomCocoaTreeDecorator extends CocoaTreeDecorator { + public static final CustomCocoaTreeDecorator instance = new CustomCocoaTreeDecorator(); + public static com.mojang.serialization.Codec codec; + public static TreeDecoratorType tdt; + static { + codec = com.mojang.serialization.Codec.unit(() -> instance); + tdt = new TreeDecoratorType(codec); + tdt.setRegistryName("heightend_blueleaf_plains_ctd"); + ForgeRegistries.TREE_DECORATOR_TYPES.register(tdt); + } + + public CustomCocoaTreeDecorator() { + super(0.2f); + } + + @Override + protected TreeDecoratorType func_230380_a_() { + return tdt; + } + + @Override + public void func_225576_a_(ISeedReader p_225576_1_, Random p_225576_2_, List p_225576_3_, List p_225576_4_, + Set p_225576_5_, MutableBoundingBox p_225576_6_) { + if (!(p_225576_2_.nextFloat() >= 0.2F)) { + int i = p_225576_3_.get(0).getY(); + p_225576_3_.stream().filter((p_236867_1_) -> { + return p_236867_1_.getY() - i <= 2; + }).forEach((p_242865_5_) -> { + for (Direction direction : Direction.Plane.HORIZONTAL) { + if (p_225576_2_.nextFloat() <= 0.25F) { + Direction direction1 = direction.getOpposite(); + BlockPos blockpos = p_242865_5_.add(direction1.getXOffset(), 0, direction1.getZOffset()); + if (Feature.isAirAt(p_225576_1_, blockpos)) { + BlockState blockstate = Blocks.AIR.getDefaultState(); + this.func_227423_a_(p_225576_1_, blockpos, blockstate, p_225576_5_, p_225576_6_); + } + } + } + }); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/world/biome/LushBlueleafMarshBiome.java b/src/main/java/studio/halbear/hem/world/biome/LushBlueleafMarshBiome.java new file mode 100644 index 0000000..b724bef --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/biome/LushBlueleafMarshBiome.java @@ -0,0 +1,167 @@ + +package studio.halbear.hem.world.biome; + +import studio.halbear.hem.particle.LilyPadParticlesParticle; +import studio.halbear.hem.block.BlueleafMudBlock; +import studio.halbear.hem.block.BlueleafGravelMudBlock; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.BiomeDictionary; + +import net.minecraft.world.gen.treedecorator.TrunkVineTreeDecorator; +import net.minecraft.world.gen.treedecorator.TreeDecoratorType; +import net.minecraft.world.gen.treedecorator.LeaveVineTreeDecorator; +import net.minecraft.world.gen.treedecorator.CocoaTreeDecorator; +import net.minecraft.world.gen.surfacebuilders.SurfaceBuilderConfig; +import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.biome.ParticleEffectAmbience; +import net.minecraft.world.biome.MobSpawnInfo; +import net.minecraft.world.biome.DefaultBiomeFeatures; +import net.minecraft.world.biome.BiomeGenerationSettings; +import net.minecraft.world.biome.BiomeAmbience; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.IWorldWriter; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.MutableBoundingBox; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Direction; +import net.minecraft.state.BooleanProperty; +import net.minecraft.block.Blocks; +import net.minecraft.block.BlockState; + +import java.util.Set; +import java.util.Random; +import java.util.List; + +@HemModElements.ModElement.Tag +public class LushBlueleafMarshBiome extends HemModElements.ModElement { + public static Biome biome; + + public LushBlueleafMarshBiome(HemModElements instance) { + super(instance, 133); + FMLJavaModLoadingContext.get().getModEventBus().register(new BiomeRegisterHandler()); + } + + private static class BiomeRegisterHandler { + @SubscribeEvent + public void registerBiomes(RegistryEvent.Register event) { + if (biome == null) { + BiomeAmbience effects = new BiomeAmbience.Builder().setFogColor(12638463).setWaterColor(-10053121).setWaterFogColor(329011) + .withSkyColor(7972607).withFoliageColor(-13382401).withGrassColor(-10040065) + .setParticle(new ParticleEffectAmbience(LilyPadParticlesParticle.particle, 0.01f)).build(); + BiomeGenerationSettings.Builder biomeGenerationSettings = new BiomeGenerationSettings.Builder().withSurfaceBuilder( + SurfaceBuilder.DEFAULT.func_242929_a(new SurfaceBuilderConfig(BlueleafGravelMudBlock.block.getDefaultState(), + BlueleafMudBlock.block.getDefaultState(), Blocks.WATER.getDefaultState()))); + DefaultBiomeFeatures.withFossils(biomeGenerationSettings); + MobSpawnInfo.Builder mobSpawnInfo = new MobSpawnInfo.Builder().isValidSpawnBiomeForPlayer(); + biome = new Biome.Builder().precipitation(Biome.RainType.RAIN).category(Biome.Category.PLAINS).depth(-0.2f).scale(0.6f) + .temperature(0.8f).downfall(0.7f).setEffects(effects).withMobSpawnSettings(mobSpawnInfo.copy()) + .withGenerationSettings(biomeGenerationSettings.build()).build(); + event.getRegistry().register(biome.setRegistryName("hem:lush_blueleaf_marsh")); + } + } + } + + @Override + public void init(FMLCommonSetupEvent event) { + BiomeDictionary.addTypes(RegistryKey.getOrCreateKey(Registry.BIOME_KEY, WorldGenRegistries.BIOME.getKey(biome)), BiomeDictionary.Type.PLAINS, + BiomeDictionary.Type.FOREST, BiomeDictionary.Type.HILLS, BiomeDictionary.Type.SWAMP, BiomeDictionary.Type.WET, + BiomeDictionary.Type.DENSE); + } + + private static class CustomLeaveVineTreeDecorator extends LeaveVineTreeDecorator { + public static final CustomLeaveVineTreeDecorator instance = new CustomLeaveVineTreeDecorator(); + public static com.mojang.serialization.Codec codec; + public static TreeDecoratorType tdt; + static { + codec = com.mojang.serialization.Codec.unit(() -> instance); + tdt = new TreeDecoratorType(codec); + tdt.setRegistryName("lush_blueleaf_marsh_lvtd"); + ForgeRegistries.TREE_DECORATOR_TYPES.register(tdt); + } + + @Override + protected TreeDecoratorType func_230380_a_() { + return tdt; + } + + @Override + protected void func_227424_a_(IWorldWriter ww, BlockPos bp, BooleanProperty bpr, Set sbc, MutableBoundingBox mbb) { + this.func_227423_a_(ww, bp, Blocks.AIR.getDefaultState(), sbc, mbb); + } + } + + private static class CustomTrunkVineTreeDecorator extends TrunkVineTreeDecorator { + public static final CustomTrunkVineTreeDecorator instance = new CustomTrunkVineTreeDecorator(); + public static com.mojang.serialization.Codec codec; + public static TreeDecoratorType tdt; + static { + codec = com.mojang.serialization.Codec.unit(() -> instance); + tdt = new TreeDecoratorType(codec); + tdt.setRegistryName("lush_blueleaf_marsh_tvtd"); + ForgeRegistries.TREE_DECORATOR_TYPES.register(tdt); + } + + @Override + protected TreeDecoratorType func_230380_a_() { + return tdt; + } + + @Override + protected void func_227424_a_(IWorldWriter ww, BlockPos bp, BooleanProperty bpr, Set sbc, MutableBoundingBox mbb) { + this.func_227423_a_(ww, bp, Blocks.AIR.getDefaultState(), sbc, mbb); + } + } + + private static class CustomCocoaTreeDecorator extends CocoaTreeDecorator { + public static final CustomCocoaTreeDecorator instance = new CustomCocoaTreeDecorator(); + public static com.mojang.serialization.Codec codec; + public static TreeDecoratorType tdt; + static { + codec = com.mojang.serialization.Codec.unit(() -> instance); + tdt = new TreeDecoratorType(codec); + tdt.setRegistryName("lush_blueleaf_marsh_ctd"); + ForgeRegistries.TREE_DECORATOR_TYPES.register(tdt); + } + + public CustomCocoaTreeDecorator() { + super(0.2f); + } + + @Override + protected TreeDecoratorType func_230380_a_() { + return tdt; + } + + @Override + public void func_225576_a_(ISeedReader p_225576_1_, Random p_225576_2_, List p_225576_3_, List p_225576_4_, + Set p_225576_5_, MutableBoundingBox p_225576_6_) { + if (!(p_225576_2_.nextFloat() >= 0.2F)) { + int i = p_225576_3_.get(0).getY(); + p_225576_3_.stream().filter((p_236867_1_) -> { + return p_236867_1_.getY() - i <= 2; + }).forEach((p_242865_5_) -> { + for (Direction direction : Direction.Plane.HORIZONTAL) { + if (p_225576_2_.nextFloat() <= 0.25F) { + Direction direction1 = direction.getOpposite(); + BlockPos blockpos = p_242865_5_.add(direction1.getXOffset(), 0, direction1.getZOffset()); + if (Feature.isAirAt(p_225576_1_, blockpos)) { + BlockState blockstate = Blocks.AIR.getDefaultState(); + this.func_227423_a_(p_225576_1_, blockpos, blockstate, p_225576_5_, p_225576_6_); + } + } + } + }); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/world/biome/LushBlueleafPlainsBiome.java b/src/main/java/studio/halbear/hem/world/biome/LushBlueleafPlainsBiome.java new file mode 100644 index 0000000..bf881c9 --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/biome/LushBlueleafPlainsBiome.java @@ -0,0 +1,166 @@ + +package studio.halbear.hem.world.biome; + +import studio.halbear.hem.particle.BlueleafAmbienceParticle; +import studio.halbear.hem.block.BlueleafDirtGrassBlockBlock; +import studio.halbear.hem.block.BlueleafDirtBlockBlock; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.BiomeDictionary; + +import net.minecraft.world.gen.treedecorator.TrunkVineTreeDecorator; +import net.minecraft.world.gen.treedecorator.TreeDecoratorType; +import net.minecraft.world.gen.treedecorator.LeaveVineTreeDecorator; +import net.minecraft.world.gen.treedecorator.CocoaTreeDecorator; +import net.minecraft.world.gen.surfacebuilders.SurfaceBuilderConfig; +import net.minecraft.world.gen.surfacebuilders.SurfaceBuilder; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.biome.ParticleEffectAmbience; +import net.minecraft.world.biome.MobSpawnInfo; +import net.minecraft.world.biome.DefaultBiomeFeatures; +import net.minecraft.world.biome.BiomeGenerationSettings; +import net.minecraft.world.biome.BiomeAmbience; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.IWorldWriter; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.MutableBoundingBox; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Direction; +import net.minecraft.state.BooleanProperty; +import net.minecraft.block.Blocks; +import net.minecraft.block.BlockState; + +import java.util.Set; +import java.util.Random; +import java.util.List; + +@HemModElements.ModElement.Tag +public class LushBlueleafPlainsBiome extends HemModElements.ModElement { + public static Biome biome; + + public LushBlueleafPlainsBiome(HemModElements instance) { + super(instance, 65); + FMLJavaModLoadingContext.get().getModEventBus().register(new BiomeRegisterHandler()); + } + + private static class BiomeRegisterHandler { + @SubscribeEvent + public void registerBiomes(RegistryEvent.Register event) { + if (biome == null) { + BiomeAmbience effects = new BiomeAmbience.Builder().setFogColor(12638463).setWaterColor(-10053121).setWaterFogColor(329011) + .withSkyColor(7972607).withFoliageColor(-13382401).withGrassColor(-10040065) + .setParticle(new ParticleEffectAmbience(BlueleafAmbienceParticle.particle, 0.03f)).build(); + BiomeGenerationSettings.Builder biomeGenerationSettings = new BiomeGenerationSettings.Builder().withSurfaceBuilder( + SurfaceBuilder.DEFAULT.func_242929_a(new SurfaceBuilderConfig(BlueleafDirtGrassBlockBlock.block.getDefaultState(), + BlueleafDirtBlockBlock.block.getDefaultState(), Blocks.WATER.getDefaultState()))); + DefaultBiomeFeatures.withFossils(biomeGenerationSettings); + MobSpawnInfo.Builder mobSpawnInfo = new MobSpawnInfo.Builder().isValidSpawnBiomeForPlayer(); + biome = new Biome.Builder().precipitation(Biome.RainType.RAIN).category(Biome.Category.PLAINS).depth(0.1f).scale(0.2f) + .temperature(0.75f).downfall(0.6f).setEffects(effects).withMobSpawnSettings(mobSpawnInfo.copy()) + .withGenerationSettings(biomeGenerationSettings.build()).build(); + event.getRegistry().register(biome.setRegistryName("hem:lush_blueleaf_plains")); + } + } + } + + @Override + public void init(FMLCommonSetupEvent event) { + BiomeDictionary.addTypes(RegistryKey.getOrCreateKey(Registry.BIOME_KEY, WorldGenRegistries.BIOME.getKey(biome)), BiomeDictionary.Type.PLAINS, + BiomeDictionary.Type.FOREST, BiomeDictionary.Type.HILLS, BiomeDictionary.Type.DENSE); + } + + private static class CustomLeaveVineTreeDecorator extends LeaveVineTreeDecorator { + public static final CustomLeaveVineTreeDecorator instance = new CustomLeaveVineTreeDecorator(); + public static com.mojang.serialization.Codec codec; + public static TreeDecoratorType tdt; + static { + codec = com.mojang.serialization.Codec.unit(() -> instance); + tdt = new TreeDecoratorType(codec); + tdt.setRegistryName("lush_blueleaf_plains_lvtd"); + ForgeRegistries.TREE_DECORATOR_TYPES.register(tdt); + } + + @Override + protected TreeDecoratorType func_230380_a_() { + return tdt; + } + + @Override + protected void func_227424_a_(IWorldWriter ww, BlockPos bp, BooleanProperty bpr, Set sbc, MutableBoundingBox mbb) { + this.func_227423_a_(ww, bp, Blocks.AIR.getDefaultState(), sbc, mbb); + } + } + + private static class CustomTrunkVineTreeDecorator extends TrunkVineTreeDecorator { + public static final CustomTrunkVineTreeDecorator instance = new CustomTrunkVineTreeDecorator(); + public static com.mojang.serialization.Codec codec; + public static TreeDecoratorType tdt; + static { + codec = com.mojang.serialization.Codec.unit(() -> instance); + tdt = new TreeDecoratorType(codec); + tdt.setRegistryName("lush_blueleaf_plains_tvtd"); + ForgeRegistries.TREE_DECORATOR_TYPES.register(tdt); + } + + @Override + protected TreeDecoratorType func_230380_a_() { + return tdt; + } + + @Override + protected void func_227424_a_(IWorldWriter ww, BlockPos bp, BooleanProperty bpr, Set sbc, MutableBoundingBox mbb) { + this.func_227423_a_(ww, bp, Blocks.AIR.getDefaultState(), sbc, mbb); + } + } + + private static class CustomCocoaTreeDecorator extends CocoaTreeDecorator { + public static final CustomCocoaTreeDecorator instance = new CustomCocoaTreeDecorator(); + public static com.mojang.serialization.Codec codec; + public static TreeDecoratorType tdt; + static { + codec = com.mojang.serialization.Codec.unit(() -> instance); + tdt = new TreeDecoratorType(codec); + tdt.setRegistryName("lush_blueleaf_plains_ctd"); + ForgeRegistries.TREE_DECORATOR_TYPES.register(tdt); + } + + public CustomCocoaTreeDecorator() { + super(0.2f); + } + + @Override + protected TreeDecoratorType func_230380_a_() { + return tdt; + } + + @Override + public void func_225576_a_(ISeedReader p_225576_1_, Random p_225576_2_, List p_225576_3_, List p_225576_4_, + Set p_225576_5_, MutableBoundingBox p_225576_6_) { + if (!(p_225576_2_.nextFloat() >= 0.2F)) { + int i = p_225576_3_.get(0).getY(); + p_225576_3_.stream().filter((p_236867_1_) -> { + return p_236867_1_.getY() - i <= 2; + }).forEach((p_242865_5_) -> { + for (Direction direction : Direction.Plane.HORIZONTAL) { + if (p_225576_2_.nextFloat() <= 0.25F) { + Direction direction1 = direction.getOpposite(); + BlockPos blockpos = p_242865_5_.add(direction1.getXOffset(), 0, direction1.getZOffset()); + if (Feature.isAirAt(p_225576_1_, blockpos)) { + BlockState blockstate = Blocks.AIR.getDefaultState(); + this.func_227423_a_(p_225576_1_, blockpos, blockstate, p_225576_5_, p_225576_6_); + } + } + } + }); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/world/dimension/BlueleafDimension.java b/src/main/java/studio/halbear/hem/world/dimension/BlueleafDimension.java new file mode 100644 index 0000000..0421190 --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/dimension/BlueleafDimension.java @@ -0,0 +1,634 @@ + +package studio.halbear.hem.world.dimension; + +import studio.halbear.hem.item.BlueleafItem; +import studio.halbear.hem.block.BlueleafStoneBlock; +import studio.halbear.hem.block.BlueleafDirtBlockBlock; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ObjectHolder; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.fml.common.ObfuscationReflectionHelper; +import net.minecraftforge.fml.DeferredWorkQueue; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.common.util.ITeleporter; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.world.server.TicketType; +import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.gen.carver.WorldCarver; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.border.WorldBorder; +import net.minecraft.world.World; +import net.minecraft.world.IWorld; +import net.minecraft.world.DimensionType; +import net.minecraft.village.PointOfInterestType; +import net.minecraft.village.PointOfInterestManager; +import net.minecraft.village.PointOfInterest; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.vector.Vector3i; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.TeleportationRepositioner; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Direction; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.entity.EntitySize; +import net.minecraft.entity.Entity; +import net.minecraft.client.world.DimensionRenderInfo; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.block.material.Material; +import net.minecraft.block.SoundType; +import net.minecraft.block.PortalInfo; +import net.minecraft.block.NetherPortalBlock; +import net.minecraft.block.Blocks; +import net.minecraft.block.BlockState; +import net.minecraft.block.Block; +import net.minecraft.block.AbstractBlock; + +import javax.annotation.Nullable; + +import java.util.function.Predicate; +import java.util.function.Function; +import java.util.Set; +import java.util.Random; +import java.util.Optional; +import java.util.HashSet; +import java.util.Comparator; + +import it.unimi.dsi.fastutil.objects.Object2ObjectMap; + +import com.google.common.collect.Sets; +import com.google.common.collect.ImmutableSet; + +@HemModElements.ModElement.Tag +public class BlueleafDimension extends HemModElements.ModElement { + @ObjectHolder("hem:blueleaf_portal") + public static final CustomPortalBlock portal = null; + + public BlueleafDimension(HemModElements instance) { + super(instance, 55); + FMLJavaModLoadingContext.get().getModEventBus().register(new POIRegisterHandler()); + } + + @Override + public void init(FMLCommonSetupEvent event) { + Set replaceableBlocks = new HashSet<>(); + replaceableBlocks.add(BlueleafStoneBlock.block); + replaceableBlocks.add(ForgeRegistries.BIOMES.getValue(new ResourceLocation("hem:blueleaf_plains")).getGenerationSettings().getSurfaceBuilder() + .get().getConfig().getTop().getBlock()); + replaceableBlocks.add(ForgeRegistries.BIOMES.getValue(new ResourceLocation("hem:blueleaf_plains")).getGenerationSettings().getSurfaceBuilder() + .get().getConfig().getUnder().getBlock()); + replaceableBlocks.add(ForgeRegistries.BIOMES.getValue(new ResourceLocation("hem:blueleaf_hayfever_fields")).getGenerationSettings() + .getSurfaceBuilder().get().getConfig().getTop().getBlock()); + replaceableBlocks.add(ForgeRegistries.BIOMES.getValue(new ResourceLocation("hem:blueleaf_hayfever_fields")).getGenerationSettings() + .getSurfaceBuilder().get().getConfig().getUnder().getBlock()); + replaceableBlocks.add(ForgeRegistries.BIOMES.getValue(new ResourceLocation("hem:heightend_blueleaf_plains")).getGenerationSettings() + .getSurfaceBuilder().get().getConfig().getTop().getBlock()); + replaceableBlocks.add(ForgeRegistries.BIOMES.getValue(new ResourceLocation("hem:heightend_blueleaf_plains")).getGenerationSettings() + .getSurfaceBuilder().get().getConfig().getUnder().getBlock()); + replaceableBlocks.add(ForgeRegistries.BIOMES.getValue(new ResourceLocation("hem:lush_blueleaf_plains")).getGenerationSettings() + .getSurfaceBuilder().get().getConfig().getTop().getBlock()); + replaceableBlocks.add(ForgeRegistries.BIOMES.getValue(new ResourceLocation("hem:lush_blueleaf_plains")).getGenerationSettings() + .getSurfaceBuilder().get().getConfig().getUnder().getBlock()); + replaceableBlocks.add(ForgeRegistries.BIOMES.getValue(new ResourceLocation("hem:lush_blueleaf_marsh")).getGenerationSettings() + .getSurfaceBuilder().get().getConfig().getTop().getBlock()); + replaceableBlocks.add(ForgeRegistries.BIOMES.getValue(new ResourceLocation("hem:lush_blueleaf_marsh")).getGenerationSettings() + .getSurfaceBuilder().get().getConfig().getUnder().getBlock()); + DeferredWorkQueue.runLater(() -> { + try { + ObfuscationReflectionHelper.setPrivateValue(WorldCarver.class, WorldCarver.CAVE, new ImmutableSet.Builder() + .addAll((Set) ObfuscationReflectionHelper.getPrivateValue(WorldCarver.class, WorldCarver.CAVE, "field_222718_j")) + .addAll(replaceableBlocks).build(), "field_222718_j"); + ObfuscationReflectionHelper.setPrivateValue(WorldCarver.class, WorldCarver.CANYON, new ImmutableSet.Builder() + .addAll((Set) ObfuscationReflectionHelper.getPrivateValue(WorldCarver.class, WorldCarver.CANYON, "field_222718_j")) + .addAll(replaceableBlocks).build(), "field_222718_j"); + } catch (Exception e) { + e.printStackTrace(); + } + }); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void clientLoad(FMLClientSetupEvent event) { + DimensionRenderInfo customEffect = new DimensionRenderInfo(128, true, DimensionRenderInfo.FogType.NORMAL, false, false) { + @Override + public Vector3d func_230494_a_(Vector3d color, float sunHeight) { + return color.mul(sunHeight * 0.94 + 0.06, sunHeight * 0.94 + 0.06, sunHeight * 0.91 + 0.09); + } + + @Override + public boolean func_230493_a_(int x, int y) { + return true; + } + }; + DeferredWorkQueue.runLater(() -> { + try { + Object2ObjectMap effectsRegistry = (Object2ObjectMap) ObfuscationReflectionHelper + .getPrivateValue(DimensionRenderInfo.class, null, "field_239208_a_"); + effectsRegistry.put(new ResourceLocation("hem:blueleaf"), customEffect); + } catch (Exception e) { + e.printStackTrace(); + } + }); + RenderTypeLookup.setRenderLayer(portal, RenderType.getTranslucent()); + } + + private static PointOfInterestType poi = null; + public static final TicketType CUSTOM_PORTAL = TicketType.create("blueleaf_portal", Vector3i::compareTo, 300); + + public static class POIRegisterHandler { + @SubscribeEvent + public void registerPointOfInterest(RegistryEvent.Register event) { + poi = new PointOfInterestType("blueleaf_portal", Sets.newHashSet(ImmutableSet.copyOf(portal.getStateContainer().getValidStates())), 0, 1) + .setRegistryName("blueleaf_portal"); + ForgeRegistries.POI_TYPES.register(poi); + } + } + + @Override + public void initElements() { + elements.blocks.add(() -> new CustomPortalBlock()); + elements.items.add(() -> new BlueleafItem().setRegistryName("blueleaf")); + } + + public static class CustomPortalBlock extends NetherPortalBlock { + public CustomPortalBlock() { + super(Block.Properties.create(Material.PORTAL).doesNotBlockMovement().tickRandomly().hardnessAndResistance(-1.0F).sound(SoundType.GLASS) + .setLightLevel(s -> 0).noDrops()); + setRegistryName("blueleaf_portal"); + } + + @Override + public void tick(BlockState blockstate, ServerWorld world, BlockPos pos, Random random) { + } + + @Override + public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + } + + public void portalSpawn(World world, BlockPos pos) { + Optional optional = CustomPortalSize.func_242964_a(world, pos, Direction.Axis.X); + if (optional.isPresent()) { + optional.get().placePortalBlocks(); + } + } + + @Override /** + * Update the provided state given the provided neighbor facing and neighbor state, returning a new state. For example, fences make their connections to the passed in state if possible, and wet concrete powder immediately returns its solidified counterpart. Note that this method should ideally consider only the specific face passed in. + */ + public BlockState updatePostPlacement(BlockState stateIn, Direction facing, BlockState facingState, IWorld worldIn, BlockPos currentPos, + BlockPos facingPos) { + Direction.Axis direction$axis = facing.getAxis(); + Direction.Axis direction$axis1 = stateIn.get(AXIS); + boolean flag = direction$axis1 != direction$axis && direction$axis.isHorizontal(); + return !flag && !facingState.isIn(this) && !(new CustomPortalSize(worldIn, currentPos, direction$axis1)).validatePortal() + ? Blocks.AIR.getDefaultState() + : super.updatePostPlacement(stateIn, facing, facingState, worldIn, currentPos, facingPos); + } + + @OnlyIn(Dist.CLIENT) + @Override + public void animateTick(BlockState state, World world, BlockPos pos, Random random) { + for (int i = 0; i < 4; i++) { + double px = pos.getX() + random.nextFloat(); + double py = pos.getY() + random.nextFloat(); + double pz = pos.getZ() + random.nextFloat(); + double vx = (random.nextFloat() - 0.5) / 2.; + double vy = (random.nextFloat() - 0.5) / 2.; + double vz = (random.nextFloat() - 0.5) / 2.; + int j = random.nextInt(4) - 1; + if (world.getBlockState(pos.west()).getBlock() != this && world.getBlockState(pos.east()).getBlock() != this) { + px = pos.getX() + 0.5 + 0.25 * j; + vx = random.nextFloat() * 2 * j; + } else { + pz = pos.getZ() + 0.5 + 0.25 * j; + vz = random.nextFloat() * 2 * j; + } + world.addParticle(ParticleTypes.NAUTILUS, px, py, pz, vx, vy, vz); + } + if (random.nextInt(110) == 0) + world.playSound(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, + (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation(("block.portal.ambient"))), + SoundCategory.BLOCKS, 0.5f, random.nextFloat() * 0.4F + 0.8F, false); + } + + @Override + public void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity) { + if (!entity.isPassenger() && !entity.isBeingRidden() && entity.isNonBoss() && !entity.world.isRemote && true) { + if (entity.func_242280_ah()) { + entity.func_242279_ag(); + } else if (entity.world.getDimensionKey() != RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) { + entity.func_242279_ag(); + teleportToDimension(entity, pos, RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))); + } else { + entity.func_242279_ag(); + teleportToDimension(entity, pos, World.OVERWORLD); + } + } + } + + private void teleportToDimension(Entity entity, BlockPos pos, RegistryKey destinationType) { + entity.changeDimension(entity.getServer().getWorld(destinationType), + new TeleporterDimensionMod(entity.getServer().getWorld(destinationType), pos)); + } + } + + public static class CustomPortalSize { + private static final AbstractBlock.IPositionPredicate POSITION_PREDICATE = (state, blockReader, pos) -> { + return state.getBlock() == BlueleafDirtBlockBlock.block; + }; + private final IWorld world; + private final Direction.Axis axis; + private final Direction rightDir; + private int portalBlockCount; + @Nullable + private BlockPos bottomLeft; + private int height; + private int width; + + public static Optional func_242964_a(IWorld world, BlockPos pos, Direction.Axis axis) { + return func_242965_a(world, pos, (size) -> { + return size.isValid() && size.portalBlockCount == 0; + }, axis); + } + + public static Optional func_242965_a(IWorld world, BlockPos pos, Predicate sizePredicate, + Direction.Axis axis) { + Optional optional = Optional.of(new CustomPortalSize(world, pos, axis)).filter(sizePredicate); + if (optional.isPresent()) { + return optional; + } else { + Direction.Axis direction$axis = axis == Direction.Axis.X ? Direction.Axis.Z : Direction.Axis.X; + return Optional.of(new CustomPortalSize(world, pos, direction$axis)).filter(sizePredicate); + } + } + + public CustomPortalSize(IWorld worldIn, BlockPos pos, Direction.Axis axisIn) { + this.world = worldIn; + this.axis = axisIn; + this.rightDir = axisIn == Direction.Axis.X ? Direction.WEST : Direction.SOUTH; + this.bottomLeft = this.func_242971_a(pos); + if (this.bottomLeft == null) { + this.bottomLeft = pos; + this.width = 1; + this.height = 1; + } else { + this.width = this.func_242974_d(); + if (this.width > 0) { + this.height = this.func_242975_e(); + } + } + } + + @Nullable + private BlockPos func_242971_a(BlockPos pos) { + for (int i = Math.max(0, pos.getY() - 21); pos.getY() > i && canConnect(this.world.getBlockState(pos.down())); pos = pos.down()) { + } + Direction direction = this.rightDir.getOpposite(); + int j = this.func_242972_a(pos, direction) - 1; + return j < 0 ? null : pos.offset(direction, j); + } + + private int func_242974_d() { + int i = this.func_242972_a(this.bottomLeft, this.rightDir); + return i >= 2 && i <= 21 ? i : 0; + } + + private int func_242972_a(BlockPos pos, Direction direction) { + BlockPos.Mutable blockpos$mutable = new BlockPos.Mutable(); + for (int i = 0; i <= 21; ++i) { + blockpos$mutable.setPos(pos).move(direction, i); + BlockState blockstate = this.world.getBlockState(blockpos$mutable); + if (!canConnect(blockstate)) { + if (POSITION_PREDICATE.test(blockstate, this.world, blockpos$mutable)) { + return i; + } + break; + } + BlockState blockstate1 = this.world.getBlockState(blockpos$mutable.move(Direction.DOWN)); + if (!POSITION_PREDICATE.test(blockstate1, this.world, blockpos$mutable)) { + break; + } + } + return 0; + } + + private int func_242975_e() { + BlockPos.Mutable blockpos$mutable = new BlockPos.Mutable(); + int i = this.func_242969_a(blockpos$mutable); + return i >= 3 && i <= 21 && this.func_242970_a(blockpos$mutable, i) ? i : 0; + } + + private boolean func_242970_a(BlockPos.Mutable mutablePos, int upDisplacement) { + for (int i = 0; i < this.width; ++i) { + BlockPos.Mutable blockpos$mutable = mutablePos.setPos(this.bottomLeft).move(Direction.UP, upDisplacement).move(this.rightDir, i); + if (!POSITION_PREDICATE.test(this.world.getBlockState(blockpos$mutable), this.world, blockpos$mutable)) { + return false; + } + } + return true; + } + + private int func_242969_a(BlockPos.Mutable mutablePos) { + for (int i = 0; i < 21; ++i) { + mutablePos.setPos(this.bottomLeft).move(Direction.UP, i).move(this.rightDir, -1); + if (!POSITION_PREDICATE.test(this.world.getBlockState(mutablePos), this.world, mutablePos)) { + return i; + } + mutablePos.setPos(this.bottomLeft).move(Direction.UP, i).move(this.rightDir, this.width); + if (!POSITION_PREDICATE.test(this.world.getBlockState(mutablePos), this.world, mutablePos)) { + return i; + } + for (int j = 0; j < this.width; ++j) { + mutablePos.setPos(this.bottomLeft).move(Direction.UP, i).move(this.rightDir, j); + BlockState blockstate = this.world.getBlockState(mutablePos); + if (!canConnect(blockstate)) { + return i; + } + if (blockstate.getBlock() == portal) { + ++this.portalBlockCount; + } + } + } + return 21; + } + + private static boolean canConnect(BlockState state) { + return state.isAir() || state.getBlock() == portal; + } + + public boolean isValid() { + return this.bottomLeft != null && this.width >= 2 && this.width <= 21 && this.height >= 3 && this.height <= 21; + } + + public void placePortalBlocks() { + BlockState blockstate = portal.getDefaultState().with(NetherPortalBlock.AXIS, this.axis); + BlockPos.getAllInBoxMutable(this.bottomLeft, this.bottomLeft.offset(Direction.UP, this.height - 1).offset(this.rightDir, this.width - 1)) + .forEach((pos) -> { + this.world.setBlockState(pos, blockstate, 18); + if (this.world instanceof ServerWorld) + ((ServerWorld) this.world).getPointOfInterestManager().add(pos, poi); + }); + } + + public boolean validatePortal() { + return this.isValid() && this.portalBlockCount == this.width * this.height; + } + + public static Vector3d func_242973_a(TeleportationRepositioner.Result result, Direction.Axis axis, Vector3d positionVector, EntitySize size) { + double d0 = (double) result.width - (double) size.width; + double d1 = (double) result.height - (double) size.height; + BlockPos blockpos = result.startPos; + double d2; + if (d0 > 0.0D) { + float f = (float) blockpos.func_243648_a(axis) + size.width / 2.0F; + d2 = MathHelper.clamp(MathHelper.func_233020_c_(positionVector.getCoordinate(axis) - (double) f, 0.0D, d0), 0.0D, 1.0D); + } else { + d2 = 0.5D; + } + double d4; + if (d1 > 0.0D) { + Direction.Axis direction$axis = Direction.Axis.Y; + d4 = MathHelper.clamp(MathHelper.func_233020_c_( + positionVector.getCoordinate(direction$axis) - (double) blockpos.func_243648_a(direction$axis), 0.0D, d1), 0.0D, 1.0D); + } else { + d4 = 0.0D; + } + Direction.Axis direction$axis1 = axis == Direction.Axis.X ? Direction.Axis.Z : Direction.Axis.X; + double d3 = positionVector.getCoordinate(direction$axis1) - ((double) blockpos.func_243648_a(direction$axis1) + 0.5D); + return new Vector3d(d2, d4, d3); + } + + public static PortalInfo func_242963_a(ServerWorld world, TeleportationRepositioner.Result result, Direction.Axis axis, Vector3d offsetVector, + EntitySize size, Vector3d motion, float rotationYaw, float rotationPitch) { + BlockPos blockpos = result.startPos; + BlockState blockstate = world.getBlockState(blockpos); + Direction.Axis direction$axis = blockstate.get(BlockStateProperties.HORIZONTAL_AXIS); + double d0 = (double) result.width; + double d1 = (double) result.height; + int i = axis == direction$axis ? 0 : 90; + Vector3d vector3d = axis == direction$axis ? motion : new Vector3d(motion.z, motion.y, -motion.x); + double d2 = (double) size.width / 2.0D + (d0 - (double) size.width) * offsetVector.getX(); + double d3 = (d1 - (double) size.height) * offsetVector.getY(); + double d4 = 0.5D + offsetVector.getZ(); + boolean flag = direction$axis == Direction.Axis.X; + Vector3d vector3d1 = new Vector3d((double) blockpos.getX() + (flag ? d2 : d4), (double) blockpos.getY() + d3, + (double) blockpos.getZ() + (flag ? d4 : d2)); + return new PortalInfo(vector3d1, vector3d, rotationYaw + (float) i, rotationPitch); + } + } + + public static class TeleporterDimensionMod implements ITeleporter { + private final ServerWorld world; + private final BlockPos entityEnterPos; + + public TeleporterDimensionMod(ServerWorld worldServer, BlockPos entityEnterPos) { + this.world = worldServer; + this.entityEnterPos = entityEnterPos; + } + + public Optional getExistingPortal(BlockPos pos, boolean isNether) { + PointOfInterestManager pointofinterestmanager = this.world.getPointOfInterestManager(); + int i = isNether ? 16 : 128; + pointofinterestmanager.ensureLoadedAndValid(this.world, pos, i); + Optional optional = pointofinterestmanager.getInSquare((poiType) -> { + return poiType == poi; + }, pos, i, PointOfInterestManager.Status.ANY).sorted(Comparator.comparingDouble((poi) -> { + return poi.getPos().distanceSq(pos); + }).thenComparingInt((poi) -> { + return poi.getPos().getY(); + })).filter((poi) -> { + return this.world.getBlockState(poi.getPos()).hasProperty(BlockStateProperties.HORIZONTAL_AXIS); + }).findFirst(); + return optional.map((poi) -> { + BlockPos blockpos = poi.getPos(); + this.world.getChunkProvider().registerTicket(CUSTOM_PORTAL, new ChunkPos(blockpos), 3, blockpos); + BlockState blockstate = this.world.getBlockState(blockpos); + return TeleportationRepositioner.findLargestRectangle(blockpos, blockstate.get(BlockStateProperties.HORIZONTAL_AXIS), 21, + Direction.Axis.Y, 21, (posIn) -> { + return this.world.getBlockState(posIn) == blockstate; + }); + }); + } + + public Optional makePortal(BlockPos pos, Direction.Axis axis) { + Direction direction = Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis); + double d0 = -1.0D; + BlockPos blockpos = null; + double d1 = -1.0D; + BlockPos blockpos1 = null; + WorldBorder worldborder = this.world.getWorldBorder(); + int i = this.world.func_234938_ad_() - 1; + BlockPos.Mutable blockpos$mutable = pos.toMutable(); + for (BlockPos.Mutable blockpos$mutable1 : BlockPos.func_243514_a(pos, 16, Direction.EAST, Direction.SOUTH)) { + int j = Math.min(i, this.world.getHeight(Heightmap.Type.MOTION_BLOCKING, blockpos$mutable1.getX(), blockpos$mutable1.getZ())); + int k = 1; + if (worldborder.contains(blockpos$mutable1) && worldborder.contains(blockpos$mutable1.move(direction, 1))) { + blockpos$mutable1.move(direction.getOpposite(), 1); + for (int l = j; l >= 0; --l) { + blockpos$mutable1.setY(l); + if (this.world.isAirBlock(blockpos$mutable1)) { + int i1; + for (i1 = l; l > 0 && this.world.isAirBlock(blockpos$mutable1.move(Direction.DOWN)); --l) { + } + if (l + 4 <= i) { + int j1 = i1 - l; + if (j1 <= 0 || j1 >= 3) { + blockpos$mutable1.setY(l); + if (this.checkRegionForPlacement(blockpos$mutable1, blockpos$mutable, direction, 0)) { + double d2 = pos.distanceSq(blockpos$mutable1); + if (this.checkRegionForPlacement(blockpos$mutable1, blockpos$mutable, direction, -1) + && this.checkRegionForPlacement(blockpos$mutable1, blockpos$mutable, direction, 1) + && (d0 == -1.0D || d0 > d2)) { + d0 = d2; + blockpos = blockpos$mutable1.toImmutable(); + } + if (d0 == -1.0D && (d1 == -1.0D || d1 > d2)) { + d1 = d2; + blockpos1 = blockpos$mutable1.toImmutable(); + } + } + } + } + } + } + } + } + if (d0 == -1.0D && d1 != -1.0D) { + blockpos = blockpos1; + d0 = d1; + } + if (d0 == -1.0D) { + blockpos = (new BlockPos(pos.getX(), MathHelper.clamp(pos.getY(), 70, this.world.func_234938_ad_() - 10), pos.getZ())).toImmutable(); + Direction direction1 = direction.rotateY(); + if (!worldborder.contains(blockpos)) { + return Optional.empty(); + } + for (int l1 = -1; l1 < 2; ++l1) { + for (int k2 = 0; k2 < 2; ++k2) { + for (int i3 = -1; i3 < 3; ++i3) { + BlockState blockstate1 = i3 < 0 ? BlueleafDirtBlockBlock.block.getDefaultState() : Blocks.AIR.getDefaultState(); + blockpos$mutable.setAndOffset(blockpos, k2 * direction.getXOffset() + l1 * direction1.getXOffset(), i3, + k2 * direction.getZOffset() + l1 * direction1.getZOffset()); + this.world.setBlockState(blockpos$mutable, blockstate1); + } + } + } + } + for (int k1 = -1; k1 < 3; ++k1) { + for (int i2 = -1; i2 < 4; ++i2) { + if (k1 == -1 || k1 == 2 || i2 == -1 || i2 == 3) { + blockpos$mutable.setAndOffset(blockpos, k1 * direction.getXOffset(), i2, k1 * direction.getZOffset()); + this.world.setBlockState(blockpos$mutable, BlueleafDirtBlockBlock.block.getDefaultState(), 3); + } + } + } + BlockState blockstate = portal.getDefaultState().with(NetherPortalBlock.AXIS, axis); + for (int j2 = 0; j2 < 2; ++j2) { + for (int l2 = 0; l2 < 3; ++l2) { + blockpos$mutable.setAndOffset(blockpos, j2 * direction.getXOffset(), l2, j2 * direction.getZOffset()); + this.world.setBlockState(blockpos$mutable, blockstate, 18); + this.world.getPointOfInterestManager().add(blockpos$mutable, poi); + } + } + return Optional.of(new TeleportationRepositioner.Result(blockpos.toImmutable(), 2, 3)); + } + + private boolean checkRegionForPlacement(BlockPos originalPos, BlockPos.Mutable offsetPos, Direction directionIn, int offsetScale) { + Direction direction = directionIn.rotateY(); + for (int i = -1; i < 3; ++i) { + for (int j = -1; j < 4; ++j) { + offsetPos.setAndOffset(originalPos, directionIn.getXOffset() * i + direction.getXOffset() * offsetScale, j, + directionIn.getZOffset() * i + direction.getZOffset() * offsetScale); + if (j < 0 && !this.world.getBlockState(offsetPos).getMaterial().isSolid()) { + return false; + } + if (j >= 0 && !this.world.isAirBlock(offsetPos)) { + return false; + } + } + } + return true; + } + + @Override + public Entity placeEntity(Entity entity, ServerWorld serverworld, ServerWorld server, float yaw, Function repositionEntity) { + PortalInfo portalinfo = getPortalInfo(entity, server); + if (entity instanceof ServerPlayerEntity) { + entity.setWorld(server); + server.addDuringPortalTeleport((ServerPlayerEntity) entity); + entity.rotationYaw = portalinfo.rotationYaw % 360.0F; + entity.rotationPitch = portalinfo.rotationPitch % 360.0F; + entity.moveForced(portalinfo.pos.x, portalinfo.pos.y, portalinfo.pos.z); + return entity; + } else { + Entity entityNew = entity.getType().create(server); + if (entityNew != null) { + entityNew.copyDataFromOld(entity); + entityNew.setLocationAndAngles(portalinfo.pos.x, portalinfo.pos.y, portalinfo.pos.z, portalinfo.rotationYaw, + entityNew.rotationPitch); + entityNew.setMotion(portalinfo.motion); + server.addFromAnotherDimension(entityNew); + } + return entityNew; + } + } + + private PortalInfo getPortalInfo(Entity entity, ServerWorld server) { + WorldBorder worldborder = server.getWorldBorder(); + double d0 = Math.max(-2.9999872E7D, worldborder.minX() + 16.); + double d1 = Math.max(-2.9999872E7D, worldborder.minZ() + 16.); + double d2 = Math.min(2.9999872E7D, worldborder.maxX() - 16.); + double d3 = Math.min(2.9999872E7D, worldborder.maxZ() - 16.); + double d4 = DimensionType.getCoordinateDifference(entity.world.getDimensionType(), server.getDimensionType()); + BlockPos blockpos1 = new BlockPos(MathHelper.clamp(entity.getPosX() * d4, d0, d2), entity.getPosY(), + MathHelper.clamp(entity.getPosZ() * d4, d1, d3)); + return this.getPortalRepositioner(entity, blockpos1).map(repositioner -> { + BlockState blockstate = entity.world.getBlockState(this.entityEnterPos); + Direction.Axis direction$axis; + Vector3d vector3d; + if (blockstate.hasProperty(BlockStateProperties.HORIZONTAL_AXIS)) { + direction$axis = blockstate.get(BlockStateProperties.HORIZONTAL_AXIS); + TeleportationRepositioner.Result teleportationrepositioner$result = TeleportationRepositioner.findLargestRectangle( + this.entityEnterPos, direction$axis, 21, Direction.Axis.Y, 21, pos -> entity.world.getBlockState(pos) == blockstate); + vector3d = CustomPortalSize.func_242973_a(teleportationrepositioner$result, direction$axis, entity.getPositionVec(), + entity.getSize(entity.getPose())); + } else { + direction$axis = Direction.Axis.X; + vector3d = new Vector3d(0.5, 0, 0); + } + return CustomPortalSize.func_242963_a(server, repositioner, direction$axis, vector3d, entity.getSize(entity.getPose()), + entity.getMotion(), entity.rotationYaw, entity.rotationPitch); + }).orElse(new PortalInfo(entity.getPositionVec(), Vector3d.ZERO, entity.rotationYaw, entity.rotationPitch)); + } + + protected Optional getPortalRepositioner(Entity entity, BlockPos pos) { + Optional optional = this.getExistingPortal(pos, false); + if (entity instanceof ServerPlayerEntity) { + if (optional.isPresent()) { + return optional; + } else { + Direction.Axis direction$axis = entity.world.getBlockState(this.entityEnterPos).func_235903_d_(NetherPortalBlock.AXIS) + .orElse(Direction.Axis.X); + return this.makePortal(pos, direction$axis); + } + } else { + return optional; + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/AntHillSpawnStructure.java b/src/main/java/studio/halbear/hem/world/structure/AntHillSpawnStructure.java new file mode 100644 index 0000000..1b08a6d --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/AntHillSpawnStructure.java @@ -0,0 +1,113 @@ + +package studio.halbear.hem.world.structure; + +import studio.halbear.hem.procedures.AntHillSpawnOnStructureInstanceGeneratedProcedure; +import studio.halbear.hem.block.BlueleafDirtGrassBlockBlock; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.BlockState; + +import java.util.stream.Stream; +import java.util.Random; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@Mod.EventBusSubscriber +public class AntHillSpawnStructure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 250000) { + int count = random.nextInt(4) + 1; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.OCEAN_FLOOR_WG, i, k); + j -= 1; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == BlueleafDirtGrassBlockBlock.block) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.values()[random.nextInt(3)]; + Mirror mirror = Mirror.values()[random.nextInt(2)]; + BlockPos spawnTo = new BlockPos(i + 0, j + 0, k + 0); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "anthill")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.AIR_AND_STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + + AntHillSpawnOnStructureInstanceGeneratedProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), + new AbstractMap.SimpleEntry<>("y", y), new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("ant_hill_spawn")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:ant_hill_spawn"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.SURFACE_STRUCTURES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/Boulder1Structure.java b/src/main/java/studio/halbear/hem/world/structure/Boulder1Structure.java new file mode 100644 index 0000000..17ccb36 --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/Boulder1Structure.java @@ -0,0 +1,131 @@ + +package studio.halbear.hem.world.structure; + +import studio.halbear.hem.procedures.Boulder4AdditionalGenerationConditionProcedure; +import studio.halbear.hem.block.BlueleafMudBlock; +import studio.halbear.hem.block.BlueleafGravelMudBlock; +import studio.halbear.hem.block.BlueleafGrassBlockBlock; +import studio.halbear.hem.block.BlueleafDirtGrassBlockBlock; +import studio.halbear.hem.block.BlueleafDirtBlockBlock; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.BlockState; + +import java.util.stream.Stream; +import java.util.Random; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@Mod.EventBusSubscriber +public class Boulder1Structure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 100000) { + int count = random.nextInt(3) + 1; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.OCEAN_FLOOR_WG, i, k); + j -= 1; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == BlueleafDirtGrassBlockBlock.block) + blockCriteria = true; + if (blockAt.getBlock() == BlueleafGrassBlockBlock.block) + blockCriteria = true; + if (blockAt.getBlock() == BlueleafDirtBlockBlock.block) + blockCriteria = true; + if (blockAt.getBlock() == BlueleafGravelMudBlock.block) + blockCriteria = true; + if (blockAt.getBlock() == BlueleafMudBlock.block) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.values()[random.nextInt(3)]; + Mirror mirror = Mirror.values()[random.nextInt(2)]; + BlockPos spawnTo = new BlockPos(i + -2, j + -1, k + -2); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + if (!Boulder4AdditionalGenerationConditionProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), + new AbstractMap.SimpleEntry<>("y", y), new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll))) + continue; + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "boulder1")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.AIR_AND_STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("boulder_1")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:boulder_1"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:heightend_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.SURFACE_STRUCTURES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/Boulder2Structure.java b/src/main/java/studio/halbear/hem/world/structure/Boulder2Structure.java new file mode 100644 index 0000000..776fc86 --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/Boulder2Structure.java @@ -0,0 +1,131 @@ + +package studio.halbear.hem.world.structure; + +import studio.halbear.hem.procedures.Boulder4AdditionalGenerationConditionProcedure; +import studio.halbear.hem.block.BlueleafMudBlock; +import studio.halbear.hem.block.BlueleafGravelMudBlock; +import studio.halbear.hem.block.BlueleafGrassBlockBlock; +import studio.halbear.hem.block.BlueleafDirtGrassBlockBlock; +import studio.halbear.hem.block.BlueleafDirtBlockBlock; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.BlockState; + +import java.util.stream.Stream; +import java.util.Random; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@Mod.EventBusSubscriber +public class Boulder2Structure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 40000) { + int count = random.nextInt(1) + 1; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.OCEAN_FLOOR_WG, i, k); + j -= 1; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == BlueleafDirtGrassBlockBlock.block) + blockCriteria = true; + if (blockAt.getBlock() == BlueleafGrassBlockBlock.block) + blockCriteria = true; + if (blockAt.getBlock() == BlueleafDirtBlockBlock.block) + blockCriteria = true; + if (blockAt.getBlock() == BlueleafGravelMudBlock.block) + blockCriteria = true; + if (blockAt.getBlock() == BlueleafMudBlock.block) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.values()[random.nextInt(3)]; + Mirror mirror = Mirror.values()[random.nextInt(2)]; + BlockPos spawnTo = new BlockPos(i + -2, j + -1, k + -2); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + if (!Boulder4AdditionalGenerationConditionProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), + new AbstractMap.SimpleEntry<>("y", y), new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll))) + continue; + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "boulder2")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.AIR_AND_STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("boulder_2")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:boulder_2"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:heightend_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.SURFACE_STRUCTURES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/Boulder3Structure.java b/src/main/java/studio/halbear/hem/world/structure/Boulder3Structure.java new file mode 100644 index 0000000..a3267c8 --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/Boulder3Structure.java @@ -0,0 +1,110 @@ + +package studio.halbear.hem.world.structure; + +import studio.halbear.hem.block.BlueleafGrassBlockBlock; +import studio.halbear.hem.block.BlueleafDirtGrassBlockBlock; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.BlockState; + +import java.util.Random; + +@Mod.EventBusSubscriber +public class Boulder3Structure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 100000) { + int count = random.nextInt(3) + 1; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.OCEAN_FLOOR_WG, i, k); + j -= 1; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == BlueleafDirtGrassBlockBlock.block) + blockCriteria = true; + if (blockAt.getBlock() == BlueleafGrassBlockBlock.block) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.NONE; + Mirror mirror = Mirror.NONE; + BlockPos spawnTo = new BlockPos(i + -3, j + -2, k + -3); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "boulder3")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.AIR_AND_STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("boulder_3")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:boulder_3"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:heightend_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.SURFACE_STRUCTURES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/Boulder4Structure.java b/src/main/java/studio/halbear/hem/world/structure/Boulder4Structure.java new file mode 100644 index 0000000..3ab0478 --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/Boulder4Structure.java @@ -0,0 +1,122 @@ + +package studio.halbear.hem.world.structure; + +import studio.halbear.hem.procedures.Boulder4AdditionalGenerationConditionProcedure; +import studio.halbear.hem.block.BlueleafGrassBlockBlock; +import studio.halbear.hem.block.BlueleafDirtGrassBlockBlock; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.BlockState; + +import java.util.stream.Stream; +import java.util.Random; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@Mod.EventBusSubscriber +public class Boulder4Structure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 100000) { + int count = random.nextInt(3) + 1; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.OCEAN_FLOOR_WG, i, k); + j -= 1; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == BlueleafDirtGrassBlockBlock.block) + blockCriteria = true; + if (blockAt.getBlock() == BlueleafGrassBlockBlock.block) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.values()[random.nextInt(3)]; + Mirror mirror = Mirror.values()[random.nextInt(2)]; + BlockPos spawnTo = new BlockPos(i + -2, j + -1, k + -2); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + if (!Boulder4AdditionalGenerationConditionProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), + new AbstractMap.SimpleEntry<>("y", y), new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll))) + continue; + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "boulder4")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.AIR_AND_STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("boulder_4")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:boulder_4"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:heightend_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.SURFACE_STRUCTURES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/Bush1Structure.java b/src/main/java/studio/halbear/hem/world/structure/Bush1Structure.java new file mode 100644 index 0000000..ecb06b2 --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/Bush1Structure.java @@ -0,0 +1,107 @@ + +package studio.halbear.hem.world.structure; + +import studio.halbear.hem.block.BlueleafDirtGrassBlockBlock; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.BlockState; + +import java.util.Random; + +@Mod.EventBusSubscriber +public class Bush1Structure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 100000) { + int count = random.nextInt(3) + 1; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.OCEAN_FLOOR_WG, i, k); + j -= 1; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == BlueleafDirtGrassBlockBlock.block) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.NONE; + Mirror mirror = Mirror.NONE; + BlockPos spawnTo = new BlockPos(i + -2, j + 1, k + -2); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "bush1")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.AIR_AND_STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("bush_1")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:bush_1"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.SURFACE_STRUCTURES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/Bush2Structure.java b/src/main/java/studio/halbear/hem/world/structure/Bush2Structure.java new file mode 100644 index 0000000..4dac467 --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/Bush2Structure.java @@ -0,0 +1,110 @@ + +package studio.halbear.hem.world.structure; + +import studio.halbear.hem.block.BlueleafGrassBlockBlock; +import studio.halbear.hem.block.BlueleafDirtGrassBlockBlock; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.BlockState; + +import java.util.Random; + +@Mod.EventBusSubscriber +public class Bush2Structure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 250000) { + int count = random.nextInt(6) + 1; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.OCEAN_FLOOR_WG, i, k); + j -= 1; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == BlueleafDirtGrassBlockBlock.block) + blockCriteria = true; + if (blockAt.getBlock() == BlueleafGrassBlockBlock.block) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.NONE; + Mirror mirror = Mirror.NONE; + BlockPos spawnTo = new BlockPos(i + -1, j + 1, k + -1); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "bush2")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.AIR_AND_STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("bush_2")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:bush_2"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.SURFACE_STRUCTURES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/FloatingIsland5x5Structure.java b/src/main/java/studio/halbear/hem/world/structure/FloatingIsland5x5Structure.java new file mode 100644 index 0000000..0638254 --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/FloatingIsland5x5Structure.java @@ -0,0 +1,110 @@ + +package studio.halbear.hem.world.structure; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.Blocks; +import net.minecraft.block.BlockState; + +import java.util.Random; + +@Mod.EventBusSubscriber +public class FloatingIsland5x5Structure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 50000) { + int count = random.nextInt(4) + 1; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.WORLD_SURFACE_WG, i, k); + j += random.nextInt(64) + 16; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == Blocks.AIR) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.NONE; + Mirror mirror = Mirror.NONE; + BlockPos spawnTo = new BlockPos(i + -2, j + 1, k + -2); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "5x5floatingisland")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.AIR_AND_STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("floating_island_5x_5")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:floating_island_5x_5"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:heightend_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:blueleaf_hayfever_fields").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.RAW_GENERATION).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/Floatingisland15x15Structure.java b/src/main/java/studio/halbear/hem/world/structure/Floatingisland15x15Structure.java new file mode 100644 index 0000000..0a749bd --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/Floatingisland15x15Structure.java @@ -0,0 +1,110 @@ + +package studio.halbear.hem.world.structure; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.Blocks; +import net.minecraft.block.BlockState; + +import java.util.Random; + +@Mod.EventBusSubscriber +public class Floatingisland15x15Structure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 50000) { + int count = random.nextInt(4) + 1; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.WORLD_SURFACE_WG, i, k); + j += random.nextInt(64) + 16; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == Blocks.AIR) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.NONE; + Mirror mirror = Mirror.NONE; + BlockPos spawnTo = new BlockPos(i + -7, j + 1, k + -7); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "15x15generalfloatingisland")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.AIR_AND_STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("floatingisland_15x_15")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:floatingisland_15x_15"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:heightend_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:blueleaf_hayfever_fields").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.RAW_GENERATION).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/Floatingislandflipped11x11Structure.java b/src/main/java/studio/halbear/hem/world/structure/Floatingislandflipped11x11Structure.java new file mode 100644 index 0000000..8a498bc --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/Floatingislandflipped11x11Structure.java @@ -0,0 +1,110 @@ + +package studio.halbear.hem.world.structure; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.Blocks; +import net.minecraft.block.BlockState; + +import java.util.Random; + +@Mod.EventBusSubscriber +public class Floatingislandflipped11x11Structure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 50000) { + int count = random.nextInt(4) + 1; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.WORLD_SURFACE_WG, i, k); + j += random.nextInt(64) + 16; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == Blocks.AIR) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.NONE; + Mirror mirror = Mirror.NONE; + BlockPos spawnTo = new BlockPos(i + -7, j + 1, k + -7); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "11x11floatingislandundertree")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.AIR_AND_STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("floatingislandflipped_11x_11")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:floatingislandflipped_11x_11"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:heightend_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:blueleaf_hayfever_fields").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.RAW_GENERATION).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/Islandfragments5x5Structure.java b/src/main/java/studio/halbear/hem/world/structure/Islandfragments5x5Structure.java new file mode 100644 index 0000000..553f2d7 --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/Islandfragments5x5Structure.java @@ -0,0 +1,110 @@ + +package studio.halbear.hem.world.structure; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.Blocks; +import net.minecraft.block.BlockState; + +import java.util.Random; + +@Mod.EventBusSubscriber +public class Islandfragments5x5Structure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 50000) { + int count = random.nextInt(4) + 1; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.WORLD_SURFACE_WG, i, k); + j += random.nextInt(64) + 16; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == Blocks.AIR) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.NONE; + Mirror mirror = Mirror.NONE; + BlockPos spawnTo = new BlockPos(i + -2, j + 1, k + -2); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "5x5floatingislandfragments")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.AIR_AND_STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("islandfragments_5x_5")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:islandfragments_5x_5"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:heightend_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:blueleaf_hayfever_fields").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.RAW_GENERATION).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/LilyPadExtraGenerationStructure.java b/src/main/java/studio/halbear/hem/world/structure/LilyPadExtraGenerationStructure.java new file mode 100644 index 0000000..b21fce9 --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/LilyPadExtraGenerationStructure.java @@ -0,0 +1,106 @@ + +package studio.halbear.hem.world.structure; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.Blocks; +import net.minecraft.block.BlockState; + +import java.util.Random; + +@Mod.EventBusSubscriber +public class LilyPadExtraGenerationStructure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 1000000) { + int count = random.nextInt(3) + 1; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.WORLD_SURFACE_WG, i, k); + j -= 1; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == Blocks.WATER) + blockCriteria = true; + if (blockAt.getBlock() == Blocks.BUBBLE_COLUMN) + blockCriteria = true; + if (blockAt.getBlock() == Blocks.WATER) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.values()[random.nextInt(3)]; + Mirror mirror = Mirror.values()[random.nextInt(2)]; + BlockPos spawnTo = new BlockPos(i + 0, j + 1, k + 0); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "giantlilypad")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.AIR_AND_STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("lily_pad_extra_generation")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:lily_pad_extra_generation"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.SURFACE_STRUCTURES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/LilyPadGenerationStructure.java b/src/main/java/studio/halbear/hem/world/structure/LilyPadGenerationStructure.java new file mode 100644 index 0000000..75686f1 --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/LilyPadGenerationStructure.java @@ -0,0 +1,108 @@ + +package studio.halbear.hem.world.structure; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.Blocks; +import net.minecraft.block.BlockState; + +import java.util.Random; + +@Mod.EventBusSubscriber +public class LilyPadGenerationStructure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 1000000) { + int count = random.nextInt(3) + 1; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.WORLD_SURFACE_WG, i, k); + j -= 1; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == Blocks.WATER) + blockCriteria = true; + if (blockAt.getBlock() == Blocks.BUBBLE_COLUMN) + blockCriteria = true; + if (blockAt.getBlock() == Blocks.WATER) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.values()[random.nextInt(3)]; + Mirror mirror = Mirror.values()[random.nextInt(2)]; + BlockPos spawnTo = new BlockPos(i + 0, j + 1, k + 0); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "giantlilypad")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.AIR_AND_STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("lily_pad_generation")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:lily_pad_generation"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.SURFACE_STRUCTURES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/LushTree1Structure.java b/src/main/java/studio/halbear/hem/world/structure/LushTree1Structure.java new file mode 100644 index 0000000..c84ee71 --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/LushTree1Structure.java @@ -0,0 +1,118 @@ + +package studio.halbear.hem.world.structure; + +import studio.halbear.hem.procedures.LushTree1AdditionalGenerationConditionProcedure; +import studio.halbear.hem.block.BlueleafDirtGrassBlockBlock; +import studio.halbear.hem.block.BlueleafDirtBlockBlock; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.BlockState; + +import java.util.stream.Stream; +import java.util.Random; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@Mod.EventBusSubscriber +public class LushTree1Structure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 100000) { + int count = random.nextInt(1) + 1; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.OCEAN_FLOOR_WG, i, k); + j -= 1; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == BlueleafDirtGrassBlockBlock.block) + blockCriteria = true; + if (blockAt.getBlock() == BlueleafDirtBlockBlock.block) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.NONE; + Mirror mirror = Mirror.NONE; + BlockPos spawnTo = new BlockPos(i + -7, j + 0, k + -7); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + if (!LushTree1AdditionalGenerationConditionProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), + new AbstractMap.SimpleEntry<>("y", y), new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll))) + continue; + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "15x15lushtree")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.AIR_AND_STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("lush_tree_1")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:lush_tree_1"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:blueleaf_hayfever_fields").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.SURFACE_STRUCTURES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/SeaGrassGenerationStructure.java b/src/main/java/studio/halbear/hem/world/structure/SeaGrassGenerationStructure.java new file mode 100644 index 0000000..f910ad6 --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/SeaGrassGenerationStructure.java @@ -0,0 +1,121 @@ + +package studio.halbear.hem.world.structure; + +import studio.halbear.hem.procedures.SeaGrassGenerationAdditionalGenerationConditionProcedure; +import studio.halbear.hem.block.BlueleafStoneGravelBlock; +import studio.halbear.hem.block.BlueleafMudBlock; +import studio.halbear.hem.block.BlueleafDirtBlockBlock; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.BlockState; + +import java.util.stream.Stream; +import java.util.Random; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@Mod.EventBusSubscriber +public class SeaGrassGenerationStructure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 1000000) { + int count = random.nextInt(16) + 1; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.OCEAN_FLOOR_WG, i, k); + j -= 1; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == BlueleafDirtBlockBlock.block) + blockCriteria = true; + if (blockAt.getBlock() == BlueleafStoneGravelBlock.block) + blockCriteria = true; + if (blockAt.getBlock() == BlueleafMudBlock.block) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.values()[random.nextInt(3)]; + Mirror mirror = Mirror.values()[random.nextInt(2)]; + BlockPos spawnTo = new BlockPos(i + 0, j + 1, k + 0); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + if (!SeaGrassGenerationAdditionalGenerationConditionProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), + new AbstractMap.SimpleEntry<>("y", y), new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll))) + continue; + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "seagrass")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.AIR_AND_STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("sea_grass_generation")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:sea_grass_generation"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.SURFACE_STRUCTURES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/SmallLilyPadGenerationStructure.java b/src/main/java/studio/halbear/hem/world/structure/SmallLilyPadGenerationStructure.java new file mode 100644 index 0000000..1395d9d --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/SmallLilyPadGenerationStructure.java @@ -0,0 +1,108 @@ + +package studio.halbear.hem.world.structure; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.Blocks; +import net.minecraft.block.BlockState; + +import java.util.Random; + +@Mod.EventBusSubscriber +public class SmallLilyPadGenerationStructure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 1000000) { + int count = random.nextInt(3) + 1; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.WORLD_SURFACE_WG, i, k); + j -= 1; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == Blocks.WATER) + blockCriteria = true; + if (blockAt.getBlock() == Blocks.BUBBLE_COLUMN) + blockCriteria = true; + if (blockAt.getBlock() == Blocks.WATER) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.values()[random.nextInt(3)]; + Mirror mirror = Mirror.values()[random.nextInt(2)]; + BlockPos spawnTo = new BlockPos(i + 0, j + 1, k + 0); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "lilypad")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.AIR_AND_STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("small_lily_pad_generation")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:small_lily_pad_generation"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.SURFACE_STRUCTURES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/SwampTree2Structure.java b/src/main/java/studio/halbear/hem/world/structure/SwampTree2Structure.java new file mode 100644 index 0000000..09311db --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/SwampTree2Structure.java @@ -0,0 +1,113 @@ + +package studio.halbear.hem.world.structure; + +import studio.halbear.hem.block.BlueleafMudBlock; +import studio.halbear.hem.block.BlueleafGravelMudBlock; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.Blocks; +import net.minecraft.block.BlockState; + +import java.util.Random; + +@Mod.EventBusSubscriber +public class SwampTree2Structure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 500000) { + int count = random.nextInt(1) + 1; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.WORLD_SURFACE_WG, i, k); + j -= 1; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == Blocks.WATER) + blockCriteria = true; + if (blockAt.getBlock() == Blocks.BUBBLE_COLUMN) + blockCriteria = true; + if (blockAt.getBlock() == Blocks.WATER) + blockCriteria = true; + if (blockAt.getBlock() == BlueleafGravelMudBlock.block) + blockCriteria = true; + if (blockAt.getBlock() == BlueleafMudBlock.block) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.NONE; + Mirror mirror = Mirror.NONE; + BlockPos spawnTo = new BlockPos(i + -7, j + -2, k + -7); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "15x15_4swamptree2")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.AIR_AND_STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("swamp_tree_2")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:swamp_tree_2"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.SURFACE_STRUCTURES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/SwampTreeGenerationStructure.java b/src/main/java/studio/halbear/hem/world/structure/SwampTreeGenerationStructure.java new file mode 100644 index 0000000..4a873b8 --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/SwampTreeGenerationStructure.java @@ -0,0 +1,106 @@ + +package studio.halbear.hem.world.structure; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.Blocks; +import net.minecraft.block.BlockState; + +import java.util.Random; + +@Mod.EventBusSubscriber +public class SwampTreeGenerationStructure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 500000) { + int count = random.nextInt(1) + 1; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.WORLD_SURFACE_WG, i, k); + j -= 1; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == Blocks.WATER) + blockCriteria = true; + if (blockAt.getBlock() == Blocks.BUBBLE_COLUMN) + blockCriteria = true; + if (blockAt.getBlock() == Blocks.WATER) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.NONE; + Mirror mirror = Mirror.NONE; + BlockPos spawnTo = new BlockPos(i + -7, j + -4, k + -7); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "15x15_4swamptree")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.AIR_AND_STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("swamp_tree_generation")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:swamp_tree_generation"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.SURFACE_STRUCTURES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/Swampstructure5x5Structure.java b/src/main/java/studio/halbear/hem/world/structure/Swampstructure5x5Structure.java new file mode 100644 index 0000000..b1258fe --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/Swampstructure5x5Structure.java @@ -0,0 +1,106 @@ + +package studio.halbear.hem.world.structure; + +import studio.halbear.hem.block.BlueleafMudBlock; +import studio.halbear.hem.block.BlueleafDirtBlockBlock; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.BlockState; + +import java.util.Random; + +@Mod.EventBusSubscriber +public class Swampstructure5x5Structure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 700000) { + int count = random.nextInt(1) + 1; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.OCEAN_FLOOR_WG, i, k); + j -= 1; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == BlueleafDirtBlockBlock.block) + blockCriteria = true; + if (blockAt.getBlock() == BlueleafMudBlock.block) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.NONE; + Mirror mirror = Mirror.NONE; + BlockPos spawnTo = new BlockPos(i + -2, j + 1, k + -2); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "5x5swampstructure")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.AIR_AND_STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("swampstructure_5x_5")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:swampstructure_5x_5"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.SURFACE_STRUCTURES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/Tree11x11Structure.java b/src/main/java/studio/halbear/hem/world/structure/Tree11x11Structure.java new file mode 100644 index 0000000..a052d72 --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/Tree11x11Structure.java @@ -0,0 +1,110 @@ + +package studio.halbear.hem.world.structure; + +import studio.halbear.hem.block.BlueleafGrassBlockBlock; +import studio.halbear.hem.block.BlueleafDirtGrassBlockBlock; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.BlockState; + +import java.util.Random; + +@Mod.EventBusSubscriber +public class Tree11x11Structure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 250000) { + int count = random.nextInt(1) + 1; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.OCEAN_FLOOR_WG, i, k); + j -= 1; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == BlueleafDirtGrassBlockBlock.block) + blockCriteria = true; + if (blockAt.getBlock() == BlueleafGrassBlockBlock.block) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.NONE; + Mirror mirror = Mirror.NONE; + BlockPos spawnTo = new BlockPos(i + -5, j + 1, k + -5); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "11x11generaltree")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.AIR_AND_STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("tree_11x_11")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:tree_11x_11"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:heightend_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.SURFACE_STRUCTURES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/Tree15x15Structure.java b/src/main/java/studio/halbear/hem/world/structure/Tree15x15Structure.java new file mode 100644 index 0000000..3e752ef --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/Tree15x15Structure.java @@ -0,0 +1,110 @@ + +package studio.halbear.hem.world.structure; + +import studio.halbear.hem.block.BlueleafGrassBlockBlock; +import studio.halbear.hem.block.BlueleafDirtGrassBlockBlock; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.BlockState; + +import java.util.Random; + +@Mod.EventBusSubscriber +public class Tree15x15Structure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 250000) { + int count = random.nextInt(1) + 1; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.OCEAN_FLOOR_WG, i, k); + j -= 1; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == BlueleafDirtGrassBlockBlock.block) + blockCriteria = true; + if (blockAt.getBlock() == BlueleafGrassBlockBlock.block) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.NONE; + Mirror mirror = Mirror.NONE; + BlockPos spawnTo = new BlockPos(i + -7, j + 1, k + -7); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "15x15generaltree")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.AIR_AND_STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("tree_15x_15")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:tree_15x_15"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:heightend_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.SURFACE_STRUCTURES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/Wall1Structure.java b/src/main/java/studio/halbear/hem/world/structure/Wall1Structure.java new file mode 100644 index 0000000..a637e45 --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/Wall1Structure.java @@ -0,0 +1,120 @@ + +package studio.halbear.hem.world.structure; + +import studio.halbear.hem.procedures.Wall1OnStructureInstanceGeneratedProcedure; +import studio.halbear.hem.procedures.Wall1AdditionalGenerationConditionProcedure; +import studio.halbear.hem.block.BlueleafDirtBlockBlock; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.BlockState; + +import java.util.stream.Stream; +import java.util.Random; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@Mod.EventBusSubscriber +public class Wall1Structure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 1000000) { + int count = random.nextInt(1) + 16; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.OCEAN_FLOOR_WG, i, k); + j -= 1; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == BlueleafDirtBlockBlock.block) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.NONE; + Mirror mirror = Mirror.NONE; + BlockPos spawnTo = new BlockPos(i + 0, j + 1, k + 0); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + if (!Wall1AdditionalGenerationConditionProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), + new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll))) + continue; + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "wall1")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, + new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + + Wall1OnStructureInstanceGeneratedProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), + new AbstractMap.SimpleEntry<>("y", y), new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("wall_1")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:wall_1"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:blueleaf_hayfever_fields").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.SURFACE_STRUCTURES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/Wall2Structure.java b/src/main/java/studio/halbear/hem/world/structure/Wall2Structure.java new file mode 100644 index 0000000..de02b18 --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/Wall2Structure.java @@ -0,0 +1,120 @@ + +package studio.halbear.hem.world.structure; + +import studio.halbear.hem.procedures.Wall1OnStructureInstanceGeneratedProcedure; +import studio.halbear.hem.procedures.Wall1AdditionalGenerationConditionProcedure; +import studio.halbear.hem.block.BlueleafDirtBlockBlock; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.BlockState; + +import java.util.stream.Stream; +import java.util.Random; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@Mod.EventBusSubscriber +public class Wall2Structure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 1000000) { + int count = random.nextInt(1) + 16; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.OCEAN_FLOOR_WG, i, k); + j -= 1; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == BlueleafDirtBlockBlock.block) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.NONE; + Mirror mirror = Mirror.NONE; + BlockPos spawnTo = new BlockPos(i + 0, j + 1, k + 0); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + if (!Wall1AdditionalGenerationConditionProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), + new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll))) + continue; + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "wall2")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, + new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + + Wall1OnStructureInstanceGeneratedProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), + new AbstractMap.SimpleEntry<>("y", y), new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("wall_2")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:wall_2"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:blueleaf_hayfever_fields").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.SURFACE_STRUCTURES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/Wall3Structure.java b/src/main/java/studio/halbear/hem/world/structure/Wall3Structure.java new file mode 100644 index 0000000..096909f --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/Wall3Structure.java @@ -0,0 +1,120 @@ + +package studio.halbear.hem.world.structure; + +import studio.halbear.hem.procedures.Wall1OnStructureInstanceGeneratedProcedure; +import studio.halbear.hem.procedures.Wall1AdditionalGenerationConditionProcedure; +import studio.halbear.hem.block.BlueleafDirtBlockBlock; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.BlockState; + +import java.util.stream.Stream; +import java.util.Random; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@Mod.EventBusSubscriber +public class Wall3Structure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 1000000) { + int count = random.nextInt(1) + 16; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.OCEAN_FLOOR_WG, i, k); + j -= 1; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == BlueleafDirtBlockBlock.block) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.NONE; + Mirror mirror = Mirror.NONE; + BlockPos spawnTo = new BlockPos(i + 0, j + 1, k + 0); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + if (!Wall1AdditionalGenerationConditionProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), + new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll))) + continue; + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "wall3")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, + new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + + Wall1OnStructureInstanceGeneratedProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), + new AbstractMap.SimpleEntry<>("y", y), new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("wall_3")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:wall_3"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:blueleaf_hayfever_fields").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.SURFACE_STRUCTURES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/Wall4Structure.java b/src/main/java/studio/halbear/hem/world/structure/Wall4Structure.java new file mode 100644 index 0000000..f4fd29d --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/Wall4Structure.java @@ -0,0 +1,120 @@ + +package studio.halbear.hem.world.structure; + +import studio.halbear.hem.procedures.Wall1OnStructureInstanceGeneratedProcedure; +import studio.halbear.hem.procedures.Wall1AdditionalGenerationConditionProcedure; +import studio.halbear.hem.block.BlueleafDirtBlockBlock; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.BlockState; + +import java.util.stream.Stream; +import java.util.Random; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@Mod.EventBusSubscriber +public class Wall4Structure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 1000000) { + int count = random.nextInt(1) + 16; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.OCEAN_FLOOR_WG, i, k); + j -= 1; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == BlueleafDirtBlockBlock.block) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.NONE; + Mirror mirror = Mirror.NONE; + BlockPos spawnTo = new BlockPos(i + 0, j + 1, k + 0); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + if (!Wall1AdditionalGenerationConditionProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), + new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll))) + continue; + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "wall4")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, + new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + + Wall1OnStructureInstanceGeneratedProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), + new AbstractMap.SimpleEntry<>("y", y), new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("wall_4")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:wall_4"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:blueleaf_hayfever_fields").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.SURFACE_STRUCTURES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/Wall5Structure.java b/src/main/java/studio/halbear/hem/world/structure/Wall5Structure.java new file mode 100644 index 0000000..65fc755 --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/Wall5Structure.java @@ -0,0 +1,120 @@ + +package studio.halbear.hem.world.structure; + +import studio.halbear.hem.procedures.Wall1OnStructureInstanceGeneratedProcedure; +import studio.halbear.hem.procedures.Wall1AdditionalGenerationConditionProcedure; +import studio.halbear.hem.block.BlueleafDirtBlockBlock; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.BlockState; + +import java.util.stream.Stream; +import java.util.Random; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@Mod.EventBusSubscriber +public class Wall5Structure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 1000000) { + int count = random.nextInt(1) + 16; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.OCEAN_FLOOR_WG, i, k); + j -= 1; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == BlueleafDirtBlockBlock.block) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.NONE; + Mirror mirror = Mirror.NONE; + BlockPos spawnTo = new BlockPos(i + 0, j + 1, k + 0); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + if (!Wall1AdditionalGenerationConditionProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), + new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll))) + continue; + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "wall5")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, + new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + + Wall1OnStructureInstanceGeneratedProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), + new AbstractMap.SimpleEntry<>("y", y), new AbstractMap.SimpleEntry<>("z", z)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("wall_5")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:wall_5"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:blueleaf_hayfever_fields").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.SURFACE_STRUCTURES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/WaterLoggedLeavesGenerationStructure.java b/src/main/java/studio/halbear/hem/world/structure/WaterLoggedLeavesGenerationStructure.java new file mode 100644 index 0000000..ce0d7b2 --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/WaterLoggedLeavesGenerationStructure.java @@ -0,0 +1,108 @@ + +package studio.halbear.hem.world.structure; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.Blocks; +import net.minecraft.block.BlockState; + +import java.util.Random; + +@Mod.EventBusSubscriber +public class WaterLoggedLeavesGenerationStructure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 1000000) { + int count = random.nextInt(16) + 1; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.WORLD_SURFACE_WG, i, k); + j -= 1; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == Blocks.WATER) + blockCriteria = true; + if (blockAt.getBlock() == Blocks.BUBBLE_COLUMN) + blockCriteria = true; + if (blockAt.getBlock() == Blocks.WATER) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.values()[random.nextInt(3)]; + Mirror mirror = Mirror.values()[random.nextInt(2)]; + BlockPos spawnTo = new BlockPos(i + 0, j + 0, k + 0); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "waterloggedgrass")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.AIR_AND_STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("water_logged_leaves_generation")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:water_logged_leaves_generation"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:lush_blueleaf_plains").equals(event.getName())) + biomeCriteria = true; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.SURFACE_STRUCTURES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem/world/structure/WaterloggedLeaves3x3Structure.java b/src/main/java/studio/halbear/hem/world/structure/WaterloggedLeaves3x3Structure.java new file mode 100644 index 0000000..1af96d4 --- /dev/null +++ b/src/main/java/studio/halbear/hem/world/structure/WaterloggedLeaves3x3Structure.java @@ -0,0 +1,106 @@ + +package studio.halbear.hem.world.structure; + +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.world.BiomeLoadingEvent; +import net.minecraftforge.event.RegistryEvent; + +import net.minecraft.world.gen.placement.Placement; +import net.minecraft.world.gen.placement.IPlacementConfig; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.BlockIgnoreStructureProcessor; +import net.minecraft.world.gen.feature.NoFeatureConfig; +import net.minecraft.world.gen.feature.IFeatureConfig; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.Heightmap; +import net.minecraft.world.gen.GenerationStage; +import net.minecraft.world.gen.ChunkGenerator; +import net.minecraft.world.World; +import net.minecraft.world.ISeedReader; +import net.minecraft.util.registry.WorldGenRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Rotation; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.Mirror; +import net.minecraft.block.Blocks; +import net.minecraft.block.BlockState; + +import java.util.Random; + +@Mod.EventBusSubscriber +public class WaterloggedLeaves3x3Structure { + private static Feature feature = null; + private static ConfiguredFeature configuredFeature = null; + + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + private static class FeatureRegisterHandler { + @SubscribeEvent + public static void registerFeature(RegistryEvent.Register> event) { + feature = new Feature(NoFeatureConfig.field_236558_a_) { + @Override + public boolean generate(ISeedReader world, ChunkGenerator generator, Random random, BlockPos pos, NoFeatureConfig config) { + int ci = (pos.getX() >> 4) << 4; + int ck = (pos.getZ() >> 4) << 4; + RegistryKey dimensionType = world.getWorld().getDimensionKey(); + boolean dimensionCriteria = false; + if (dimensionType == RegistryKey.getOrCreateKey(Registry.WORLD_KEY, new ResourceLocation("hem:blueleaf"))) + dimensionCriteria = true; + if (!dimensionCriteria) + return false; + if ((random.nextInt(1000000) + 1) <= 700000) { + int count = random.nextInt(16) + 1; + for (int a = 0; a < count; a++) { + int i = ci + random.nextInt(16); + int k = ck + random.nextInt(16); + int j = world.getHeight(Heightmap.Type.WORLD_SURFACE_WG, i, k); + j -= 1; + BlockState blockAt = world.getBlockState(new BlockPos(i, j, k)); + boolean blockCriteria = false; + if (blockAt.getBlock() == Blocks.WATER) + blockCriteria = true; + if (blockAt.getBlock() == Blocks.BUBBLE_COLUMN) + blockCriteria = true; + if (blockAt.getBlock() == Blocks.WATER) + blockCriteria = true; + if (!blockCriteria) + continue; + Rotation rotation = Rotation.values()[random.nextInt(3)]; + Mirror mirror = Mirror.values()[random.nextInt(2)]; + BlockPos spawnTo = new BlockPos(i + -1, j + 0, k + -1); + int x = spawnTo.getX(); + int y = spawnTo.getY(); + int z = spawnTo.getZ(); + Template template = world.getWorld().getStructureTemplateManager() + .getTemplateDefaulted(new ResourceLocation("hem", "waterloggedleaves3x3")); + if (template == null) + return false; + template.func_237144_a_(world, spawnTo, new PlacementSettings().setRotation(rotation).setRandom(random).setMirror(mirror) + .addProcessor(BlockIgnoreStructureProcessor.AIR_AND_STRUCTURE_BLOCK).setChunk(null).setIgnoreEntities(false), + random); + } + } + return true; + } + }; + configuredFeature = feature.withConfiguration(IFeatureConfig.NO_FEATURE_CONFIG) + .withPlacement(Placement.NOPE.configure(IPlacementConfig.NO_PLACEMENT_CONFIG)); + event.getRegistry().register(feature.setRegistryName("waterlogged_leaves_3x_3")); + Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation("hem:waterlogged_leaves_3x_3"), configuredFeature); + } + } + + @SubscribeEvent + public static void addFeatureToBiomes(BiomeLoadingEvent event) { + boolean biomeCriteria = false; + if (new ResourceLocation("hem:lush_blueleaf_marsh").equals(event.getName())) + biomeCriteria = true; + if (!biomeCriteria) + return; + event.getGeneration().getFeatures(GenerationStage.Decoration.SURFACE_STRUCTURES).add(() -> configuredFeature); + } +} diff --git a/src/main/java/studio/halbear/hem_custom/mixin/CameraMixins.java b/src/main/java/studio/halbear/hem_custom/mixin/CameraMixins.java new file mode 100644 index 0000000..9aea019 --- /dev/null +++ b/src/main/java/studio/halbear/hem_custom/mixin/CameraMixins.java @@ -0,0 +1,30 @@ +package studio.halbear.hem_custom.mixin; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ActiveRenderInfo; +import net.minecraft.client.settings.PointOfView; +import net.minecraft.entity.Entity; +import net.minecraft.util.math.vector.Vector3f; +import net.minecraft.world.IBlockReader; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import static studio.halbear.hem_custom.vehicles.VehicleCameraSettings.GetCameraOffsets; + +@Mixin(ActiveRenderInfo.class) +public abstract class CameraMixins { + + @Inject(method = "update", at = @At(value = "TAIL"),cancellable = true) + private void update(IBlockReader currentRenderedLevel, Entity entity, boolean isDetached, boolean isMirrored, float partialTicks, CallbackInfo ci){ + + if(entity.isPassenger() && Minecraft.getInstance().gameSettings.getPointOfView() != PointOfView.FIRST_PERSON && entity.getRidingEntity().getClass().getName().contains("studio.halbear.hem.entity")){ + Vector3f Position = GetCameraOffsets(); + this.movePosition(-this.calcCameraDistance(Position.getZ()), Position.getY(), Position.getX()); + } + } + @Shadow protected abstract void movePosition(double p_216782_1_, double p_216782_3_, double p_216782_5_); + @Shadow protected abstract double calcCameraDistance(double p_216779_1_); +} diff --git a/src/main/java/studio/halbear/hem_custom/vehicles/VehicleCameraSettings.java b/src/main/java/studio/halbear/hem_custom/vehicles/VehicleCameraSettings.java new file mode 100644 index 0000000..4b246dc --- /dev/null +++ b/src/main/java/studio/halbear/hem_custom/vehicles/VehicleCameraSettings.java @@ -0,0 +1,85 @@ +package studio.halbear.hem_custom.vehicles; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.settings.PointOfView; +import net.minecraft.util.math.vector.Vector3f; +import net.minecraftforge.client.event.EntityViewRenderEvent; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +@Mod.EventBusSubscriber +public class VehicleCameraSettings { + private static Vector3f CamOffset = new Vector3f(0.0f, 0.0f, 0.0f); + private static Vector3f CamTransformations = new Vector3f(0.0f, 0.0f, 0.0f); + private static float CamFOV = 0.0f; + private static float CamFOVExternal = 0.0f; + private static String CurrentEntity = ""; + private static boolean HemVehicle = false; + + public static Vector3f GetCameraOffsets(){ + return CamOffset; + } + + @SubscribeEvent + public static void PlayerTickEvent(TickEvent.PlayerTickEvent event) { + Minecraft minecraftInstance = Minecraft.getInstance(); + if (minecraftInstance.player != null && minecraftInstance.player.isPassenger() && minecraftInstance.player.getRidingEntity() != null + && CurrentEntity != minecraftInstance.player.getRidingEntity().getClass().getName()) { + CurrentEntity = minecraftInstance.player.getRidingEntity().getClass().getName(); + HemVehicle = CurrentEntity.contains("studio.halbear.hem.entity"); + switch (CurrentEntity) { + case "studio.halbear.hem.entity.HotAirBalloonEntity$CustomEntity" : //yeah i hardcoded ts + CamOffset = new Vector3f(0.0f, 1.0f, 4.0f); + CamTransformations = new Vector3f(0.0f, 0.0f, 0.0f); + CamFOV = 70.0f; + CamFOVExternal = 80.0f; + break; + case "studio.halbear.hem.entity.AirboatEntity$CustomEntity" : + CamOffset = new Vector3f(0.0f, 4.0f, 16.0f); + CamTransformations = new Vector3f(0.0f, 0.0f, 0.0f); + CamFOV = 70.0f; + CamFOVExternal = 65.0f; + break; + } + } + if (minecraftInstance.player != null && (!minecraftInstance.player.isPassenger() || !HemVehicle) + && (CamFOVExternal != (float) Minecraft.getInstance().gameSettings.fov + || CamFOV != (float) Minecraft.getInstance().gameSettings.fov || CamOffset.getX() != 0 || CamOffset.getY() != 0 + || CamOffset.getZ() != 0 || CamTransformations.getX() != 0 || CamTransformations.getY() != 0 + || CamTransformations.getZ() != 0)) { + CamOffset = new Vector3f(0.0f, 0.0f, 0.0f);// reset if the players not riding an entity and if any the values aren't 0 + CamTransformations = new Vector3f(0.0f, 0.0f, 0.0f); + CamFOV = (float) Minecraft.getInstance().gameSettings.fov; + CamFOVExternal = (float) Minecraft.getInstance().gameSettings.fov; + if (!minecraftInstance.player.isPassenger()) + CurrentEntity = ""; + } + } + + @SubscribeEvent + public static void onCameraSetup(EntityViewRenderEvent.CameraSetup event) { // sets the Yaw, Roll, and Pitch for the camera, ONLY if its a HEM vehcile as to avoid unnecessary ticks + if (HemVehicle) { + event.setRoll(event.getRoll() + CamTransformations.getX()); + event.setYaw(event.getYaw() + CamTransformations.getY()); + event.setPitch(event.getPitch() + CamTransformations.getZ()); + } + } + + @SubscribeEvent + public static void onCameraSetup(EntityViewRenderEvent.FOVModifier event) { // sets the FOV + if (HemVehicle) { + Minecraft minecraftInstance = Minecraft.getInstance(); + if (minecraftInstance.player != null && minecraftInstance.gameRenderer != null) { + PointOfView Cam = minecraftInstance.gameSettings.getPointOfView(); + if (Cam == PointOfView.FIRST_PERSON) { + event.setFOV(CamFOV); + } else { + event.setFOV(CamFOVExternal); + } + } + } else if (event.getFOV() != Minecraft.getInstance().gameSettings.fov) { + event.setFOV(Minecraft.getInstance().gameSettings.fov); + } + } +} diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml new file mode 100644 index 0000000..73853f1 --- /dev/null +++ b/src/main/resources/META-INF/mods.toml @@ -0,0 +1,26 @@ +modLoader="javafml" +loaderVersion="[36,)" +license="Academic Free License v3.0" + +[[mods]] +modId="hem" +version="1.0.0" +displayName="Hal's Exploration Mod" +credits="halbear1" +displayURL="https://halbear.net" +logoFile="logo.png" +authors="halbear1" +description=''' +A steampunk exploration mod that adds tech, vehicles, and dimensions +''' + +[[dependencies.hem]] + modId="minecraft" + mandatory=true + versionRange="[1.16.5]" + ordering="NONE" + side="BOTH" + + + + diff --git a/src/main/resources/assets/hem/blockstates/ant_hill.json b/src/main/resources/assets/hem/blockstates/ant_hill.json new file mode 100644 index 0000000..5353d5f --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/ant_hill.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hem:block/ant_hill" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/ants.json b/src/main/resources/assets/hem/blockstates/ants.json new file mode 100644 index 0000000..79b829d --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/ants.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "hem:block/ants" + }, + "facing=east": { + "model": "hem:block/ants", + "y": 90 + }, + "facing=south": { + "model": "hem:block/ants", + "y": 180 + }, + "facing=west": { + "model": "hem:block/ants", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/bloomed_bulb_flower.json b/src/main/resources/assets/hem/blockstates/bloomed_bulb_flower.json new file mode 100644 index 0000000..afc853b --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/bloomed_bulb_flower.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hem:block/bloomed_bulb_flower" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/bloomed_muncher.json b/src/main/resources/assets/hem/blockstates/bloomed_muncher.json new file mode 100644 index 0000000..22cde9d --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/bloomed_muncher.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "hem:block/bloomed_muncher" + }, + "facing=east": { + "model": "hem:block/bloomed_muncher", + "y": 90 + }, + "facing=south": { + "model": "hem:block/bloomed_muncher", + "y": 180 + }, + "facing=west": { + "model": "hem:block/bloomed_muncher", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_blossomer.json b/src/main/resources/assets/hem/blockstates/blueleaf_blossomer.json new file mode 100644 index 0000000..b35192f --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_blossomer.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hem:block/blueleaf_blossomer" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_brown_cap.json b/src/main/resources/assets/hem/blockstates/blueleaf_brown_cap.json new file mode 100644 index 0000000..272c41e --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_brown_cap.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hem:block/blueleaf_brown_cap" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_butter_slump.json b/src/main/resources/assets/hem/blockstates/blueleaf_butter_slump.json new file mode 100644 index 0000000..d120165 --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_butter_slump.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hem:block/blueleaf_butter_slump" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_cabbage_flower.json b/src/main/resources/assets/hem/blockstates/blueleaf_cabbage_flower.json new file mode 100644 index 0000000..c030bb1 --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_cabbage_flower.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hem:block/blueleaf_cabbage_flower" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_cobblestone.json b/src/main/resources/assets/hem/blockstates/blueleaf_cobblestone.json new file mode 100644 index 0000000..f34ae24 --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_cobblestone.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hem:block/blueleaf_cobblestone" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_cobblestone_slab.json b/src/main/resources/assets/hem/blockstates/blueleaf_cobblestone_slab.json new file mode 100644 index 0000000..5310812 --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_cobblestone_slab.json @@ -0,0 +1,13 @@ +{ + "variants": { + "type=bottom": { + "model": "hem:block/blueleaf_cobblestone_slab" + }, + "type=top": { + "model": "hem:block/blueleaf_cobblestone_slab_top" + }, + "type=double": { + "model": "hem:block/blueleaf_cobblestone_slab_full" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_cobblestone_stairs.json b/src/main/resources/assets/hem/blockstates/blueleaf_cobblestone_stairs.json new file mode 100644 index 0000000..48b01cc --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_cobblestone_stairs.json @@ -0,0 +1,209 @@ +{ + "variants": { + "facing=east,half=bottom,shape=straight": { + "model": "hem:block/blueleaf_cobblestone_stairs" + }, + "facing=west,half=bottom,shape=straight": { + "model": "hem:block/blueleaf_cobblestone_stairs", + "y": 180, + "uvlock": true + }, + "facing=south,half=bottom,shape=straight": { + "model": "hem:block/blueleaf_cobblestone_stairs", + "y": 90, + "uvlock": true + }, + "facing=north,half=bottom,shape=straight": { + "model": "hem:block/blueleaf_cobblestone_stairs", + "y": 270, + "uvlock": true + }, + "facing=east,half=bottom,shape=inner_right": { + "model": "hem:block/blueleaf_cobblestone_stairs_inner" + }, + "facing=west,half=bottom,shape=inner_right": { + "model": "hem:block/blueleaf_cobblestone_stairs_inner", + "y": 180, + "uvlock": true + }, + "facing=south,half=bottom,shape=inner_right": { + "model": "hem:block/blueleaf_cobblestone_stairs_inner", + "y": 90, + "uvlock": true + }, + "facing=north,half=bottom,shape=inner_right": { + "model": "hem:block/blueleaf_cobblestone_stairs_inner", + "y": 270, + "uvlock": true + }, + "facing=east,half=bottom,shape=inner_left": { + "model": "hem:block/blueleaf_cobblestone_stairs_inner", + "y": 270, + "uvlock": true + }, + "facing=west,half=bottom,shape=inner_left": { + "model": "hem:block/blueleaf_cobblestone_stairs_inner", + "y": 90, + "uvlock": true + }, + "facing=south,half=bottom,shape=inner_left": { + "model": "hem:block/blueleaf_cobblestone_stairs_inner" + }, + "facing=north,half=bottom,shape=inner_left": { + "model": "hem:block/blueleaf_cobblestone_stairs_inner", + "y": 180, + "uvlock": true + }, + "facing=east,half=top,shape=straight": { + "model": "hem:block/blueleaf_cobblestone_stairs", + "x": 180, + "uvlock": true + }, + "facing=west,half=top,shape=straight": { + "model": "hem:block/blueleaf_cobblestone_stairs", + "x": 180, + "y": 180, + "uvlock": true + }, + "facing=south,half=top,shape=straight": { + "model": "hem:block/blueleaf_cobblestone_stairs", + "x": 180, + "y": 90, + "uvlock": true + }, + "facing=north,half=top,shape=straight": { + "model": "hem:block/blueleaf_cobblestone_stairs", + "x": 180, + "y": 270, + "uvlock": true + }, + "facing=east,half=top,shape=outer_right": { + "model": "hem:block/blueleaf_cobblestone_stairs_outer", + "x": 180, + "y": 90, + "uvlock": true + }, + "facing=west,half=top,shape=outer_right": { + "model": "hem:block/blueleaf_cobblestone_stairs_outer", + "x": 180, + "y": 270, + "uvlock": true + }, + "facing=south,half=top,shape=outer_right": { + "model": "hem:block/blueleaf_cobblestone_stairs_outer", + "x": 180, + "y": 180, + "uvlock": true + }, + "facing=north,half=top,shape=outer_right": { + "model": "hem:block/blueleaf_cobblestone_stairs_outer", + "x": 180, + "uvlock": true + }, + "facing=east,half=top,shape=outer_left": { + "model": "hem:block/blueleaf_cobblestone_stairs_outer", + "x": 180, + "uvlock": true + }, + "facing=west,half=top,shape=outer_left": { + "model": "hem:block/blueleaf_cobblestone_stairs_outer", + "x": 180, + "y": 180, + "uvlock": true + }, + "facing=south,half=top,shape=outer_left": { + "model": "hem:block/blueleaf_cobblestone_stairs_outer", + "x": 180, + "y": 90, + "uvlock": true + }, + "facing=north,half=top,shape=outer_left": { + "model": "hem:block/blueleaf_cobblestone_stairs_outer", + "x": 180, + "y": 270, + "uvlock": true + }, + "facing=east,half=top,shape=inner_right": { + "model": "hem:block/blueleaf_cobblestone_stairs_inner", + "x": 180, + "y": 90, + "uvlock": true + }, + "facing=west,half=top,shape=inner_right": { + "model": "hem:block/blueleaf_cobblestone_stairs_inner", + "x": 180, + "y": 270, + "uvlock": true + }, + "facing=south,half=top,shape=inner_right": { + "model": "hem:block/blueleaf_cobblestone_stairs_inner", + "x": 180, + "y": 180, + "uvlock": true + }, + "facing=north,half=top,shape=inner_right": { + "model": "hem:block/blueleaf_cobblestone_stairs_inner", + "x": 180, + "uvlock": true + }, + "facing=east,half=top,shape=inner_left": { + "model": "hem:block/blueleaf_cobblestone_stairs_inner", + "x": 180, + "uvlock": true + }, + "facing=west,half=top,shape=inner_left": { + "model": "hem:block/blueleaf_cobblestone_stairs_inner", + "x": 180, + "y": 180, + "uvlock": true + }, + "facing=south,half=top,shape=inner_left": { + "model": "hem:block/blueleaf_cobblestone_stairs_inner", + "x": 180, + "y": 90, + "uvlock": true + }, + "facing=north,half=top,shape=inner_left": { + "model": "hem:block/blueleaf_cobblestone_stairs_inner", + "x": 180, + "y": 270, + "uvlock": true + }, + "facing=east,half=bottom,shape=outer_right": { + "model": "hem:block/blueleaf_cobblestone_stairs_outer" + }, + "facing=west,half=bottom,shape=outer_right": { + "model": "hem:block/blueleaf_cobblestone_stairs_outer", + "y": 180, + "uvlock": true + }, + "facing=south,half=bottom,shape=outer_right": { + "model": "hem:block/blueleaf_cobblestone_stairs_outer", + "y": 90, + "uvlock": true + }, + "facing=north,half=bottom,shape=outer_right": { + "model": "hem:block/blueleaf_cobblestone_stairs_outer", + "y": 270, + "uvlock": true + }, + "facing=east,half=bottom,shape=outer_left": { + "model": "hem:block/blueleaf_cobblestone_stairs_outer", + "y": 270, + "uvlock": true + }, + "facing=west,half=bottom,shape=outer_left": { + "model": "hem:block/blueleaf_cobblestone_stairs_outer", + "y": 90, + "uvlock": true + }, + "facing=south,half=bottom,shape=outer_left": { + "model": "hem:block/blueleaf_cobblestone_stairs_outer" + }, + "facing=north,half=bottom,shape=outer_left": { + "model": "hem:block/blueleaf_cobblestone_stairs_outer", + "y": 180, + "uvlock": true + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_cobblestone_wall.json b/src/main/resources/assets/hem/blockstates/blueleaf_cobblestone_wall.json new file mode 100644 index 0000000..3fb7db1 --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_cobblestone_wall.json @@ -0,0 +1,90 @@ +{ + "multipart": [ + { + "when": { + "up": "true" + }, + "apply": { + "model": "hem:block/blueleaf_cobblestone_wall_post" + } + }, + { + "when": { + "north": "low" + }, + "apply": { + "model": "hem:block/blueleaf_cobblestone_wall", + "uvlock": true + } + }, + { + "when": { + "east": "low" + }, + "apply": { + "model": "hem:block/blueleaf_cobblestone_wall", + "y": 90, + "uvlock": true + } + }, + { + "when": { + "south": "low" + }, + "apply": { + "model": "hem:block/blueleaf_cobblestone_wall", + "y": 180, + "uvlock": true + } + }, + { + "when": { + "west": "low" + }, + "apply": { + "model": "hem:block/blueleaf_cobblestone_wall", + "y": 270, + "uvlock": true + } + }, + { + "when": { + "north": "tall" + }, + "apply": { + "model": "hem:block/blueleaf_cobblestone_wall_side_tall", + "uvlock": true + } + }, + { + "when": { + "east": "tall" + }, + "apply": { + "model": "hem:block/blueleaf_cobblestone_wall_side_tall", + "y": 90, + "uvlock": true + } + }, + { + "when": { + "south": "tall" + }, + "apply": { + "model": "hem:block/blueleaf_cobblestone_wall_side_tall", + "y": 180, + "uvlock": true + } + }, + { + "when": { + "west": "tall" + }, + "apply": { + "model": "hem:block/blueleaf_cobblestone_wall_side_tall", + "y": 270, + "uvlock": true + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_dead_log.json b/src/main/resources/assets/hem/blockstates/blueleaf_dead_log.json new file mode 100644 index 0000000..214d50b --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_dead_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "hem:block/blueleaf_dead_log", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "hem:block/blueleaf_dead_log" + }, + "axis=z": { + "model": "hem:block/blueleaf_dead_log", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_dirt_block.json b/src/main/resources/assets/hem/blockstates/blueleaf_dirt_block.json new file mode 100644 index 0000000..9f91c5a --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_dirt_block.json @@ -0,0 +1,11 @@ +{ + "variants": { + "": [{ + "model": "hem:block/blueleaf_dirt_block", "weight": 5 + }, + { + "model": "hem:block/blueleaf_dirt_coarse_block", "weight": 1 + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_dirt_grass_block.json b/src/main/resources/assets/hem/blockstates/blueleaf_dirt_grass_block.json new file mode 100644 index 0000000..2d679e5 --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_dirt_grass_block.json @@ -0,0 +1,20 @@ +{ + "variants": { + "": [{ + "model": "hem:block/blueleaf_dirt_grass_block", "weight": 10 + }, + { + "model": "hem:block/grass/blueleaf_dirt_grass_alternate", "weight": 10 + }, + { + "model": "hem:block/grass/blueleaf_dirt_grass_bright", "weight": 10 + }, + { + "model": "hem:block/grass/blueleaf_dirt_grass_flower", "weight": 1 + }, + { + "model": "hem:block/grass/blueleaf_dirt_grass_flowers", "weight": 4 + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_fluorescent_leaves.json b/src/main/resources/assets/hem/blockstates/blueleaf_fluorescent_leaves.json new file mode 100644 index 0000000..877308e --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_fluorescent_leaves.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hem:block/blueleaf_fluorescent_leaves" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_grass.json b/src/main/resources/assets/hem/blockstates/blueleaf_grass.json new file mode 100644 index 0000000..2e02f35 --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_grass.json @@ -0,0 +1,20 @@ +{ + "variants": { + "": [{ + "model": "hem:block/blueleaf_grass" + }, + { + "model": "hem:block/blueleaf_grass_medium" + }, + { + "model": "hem:block/blueleaf_grass_short" + }, + { + "model": "hem:block/blueleaf_grass_super_short" + }, + { + "model": "hem:block/blueleaf_grass_tall" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_grass_block.json b/src/main/resources/assets/hem/blockstates/blueleaf_grass_block.json new file mode 100644 index 0000000..2d17b57 --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_grass_block.json @@ -0,0 +1,21 @@ +{ + "variants": { + "": [ + { + "model": "hem:block/blueleaf_grass_block", "weight": 10 + }, + { + "model": "hem:block/grass/blueleaf_grass_block_alternate", "weight": 10 + }, + { + "model": "hem:block/grass/blueleaf_grass_block_bright", "weight": 10 + }, + { + "model": "hem:block/grass/blueleaf_grass_block_flower", "weight": 1 + }, + { + "model": "hem:block/grass/blueleaf_grass_block_flowers", "weight": 2 + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_gravel_mud.json b/src/main/resources/assets/hem/blockstates/blueleaf_gravel_mud.json new file mode 100644 index 0000000..4e714dc --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_gravel_mud.json @@ -0,0 +1,14 @@ +{ + "variants": { + "": [{ + "model": "hem:block/blueleaf_gravel_mud", "weight": 5 + }, + { + "model": "hem:block/blueleaf_grass_stone_mud", "weight": 2 + }, + { + "model": "hem:block/blueleaf_stone_mud", "weight": 2 + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_green_cap.json b/src/main/resources/assets/hem/blockstates/blueleaf_green_cap.json new file mode 100644 index 0000000..89e4003 --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_green_cap.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hem:block/blueleaf_green_cap" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_lavender.json b/src/main/resources/assets/hem/blockstates/blueleaf_lavender.json new file mode 100644 index 0000000..0a425ed --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_lavender.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hem:block/blueleaf_lavender" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_leaves.json b/src/main/resources/assets/hem/blockstates/blueleaf_leaves.json new file mode 100644 index 0000000..9fd6092 --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_leaves.json @@ -0,0 +1,14 @@ +{ + "variants": { + "": [{ + "model": "hem:block/blueleaf_leaves" + }, + { + "model": "hem:block/blueleaf_leaves_dense" + }, + { + "model": "hem:block/blueleaf_leaves_sparse" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_lily_pad.json b/src/main/resources/assets/hem/blockstates/blueleaf_lily_pad.json new file mode 100644 index 0000000..b19b1a3 --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_lily_pad.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "hem:block/blueleaf_lily_pad" + }, + "facing=east": { + "model": "hem:block/blueleaf_lily_pad", + "y": 90 + }, + "facing=south": { + "model": "hem:block/blueleaf_lily_pad", + "y": 180 + }, + "facing=west": { + "model": "hem:block/blueleaf_lily_pad", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_log.json b/src/main/resources/assets/hem/blockstates/blueleaf_log.json new file mode 100644 index 0000000..2efa09b --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "hem:block/blueleaf_log", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "hem:block/blueleaf_log" + }, + "axis=z": { + "model": "hem:block/blueleaf_log", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_lush_leaves.json b/src/main/resources/assets/hem/blockstates/blueleaf_lush_leaves.json new file mode 100644 index 0000000..e5e0f7e --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_lush_leaves.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hem:block/blueleaf_lush_leaves" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_mature_blossomer.json b/src/main/resources/assets/hem/blockstates/blueleaf_mature_blossomer.json new file mode 100644 index 0000000..ea82672 --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_mature_blossomer.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hem:block/blueleaf_mature_blossomer" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_mature_cabbage_flower.json b/src/main/resources/assets/hem/blockstates/blueleaf_mature_cabbage_flower.json new file mode 100644 index 0000000..800faf6 --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_mature_cabbage_flower.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hem:block/blueleaf_mature_cabbage_flower" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_mud.json b/src/main/resources/assets/hem/blockstates/blueleaf_mud.json new file mode 100644 index 0000000..938e589 --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_mud.json @@ -0,0 +1,14 @@ +{ + "variants": { + "": [ + { + "model": "hem:block/blueleaf_mud", + "weight": 7 + }, + { + "model": "hem:block/blueleaf_stony_mud", + "weight": 3 + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_portal.json b/src/main/resources/assets/hem/blockstates/blueleaf_portal.json new file mode 100644 index 0000000..77f14a8 --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_portal.json @@ -0,0 +1,10 @@ +{ + "variants": { + "axis=z": { + "model": "hem:block/blueleaf_portal_ew" + }, + "axis=x": { + "model": "hem:block/blueleaf_portal_ns" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_red_cap.json b/src/main/resources/assets/hem/blockstates/blueleaf_red_cap.json new file mode 100644 index 0000000..036bb36 --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_red_cap.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hem:block/blueleaf_red_cap" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_redwood_leaves.json b/src/main/resources/assets/hem/blockstates/blueleaf_redwood_leaves.json new file mode 100644 index 0000000..7e0ebad --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_redwood_leaves.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hem:block/blueleaf_redwood_leaves" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_redwood_log.json b/src/main/resources/assets/hem/blockstates/blueleaf_redwood_log.json new file mode 100644 index 0000000..e127f78 --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_redwood_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "hem:block/blueleaf_redwood_log", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "hem:block/blueleaf_redwood_log" + }, + "axis=z": { + "model": "hem:block/blueleaf_redwood_log", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_sea_grass.json b/src/main/resources/assets/hem/blockstates/blueleaf_sea_grass.json new file mode 100644 index 0000000..3f17b38 --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_sea_grass.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hem:block/blueleaf_sea_grass" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_stone.json b/src/main/resources/assets/hem/blockstates/blueleaf_stone.json new file mode 100644 index 0000000..b2d6bbc --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_stone.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hem:block/blueleaf_stone" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_stone_gravel.json b/src/main/resources/assets/hem/blockstates/blueleaf_stone_gravel.json new file mode 100644 index 0000000..1fbabc0 --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_stone_gravel.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hem:block/blueleaf_stone_gravel" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_stone_slab.json b/src/main/resources/assets/hem/blockstates/blueleaf_stone_slab.json new file mode 100644 index 0000000..73e09f4 --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_stone_slab.json @@ -0,0 +1,13 @@ +{ + "variants": { + "type=bottom": { + "model": "hem:block/blueleaf_stone_slab" + }, + "type=top": { + "model": "hem:block/blueleaf_stone_slab_top" + }, + "type=double": { + "model": "hem:block/blueleaf_stone_slab_full" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_stone_stair.json b/src/main/resources/assets/hem/blockstates/blueleaf_stone_stair.json new file mode 100644 index 0000000..7dba37e --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_stone_stair.json @@ -0,0 +1,209 @@ +{ + "variants": { + "facing=east,half=bottom,shape=straight": { + "model": "hem:block/blueleaf_stone_stair" + }, + "facing=west,half=bottom,shape=straight": { + "model": "hem:block/blueleaf_stone_stair", + "y": 180, + "uvlock": true + }, + "facing=south,half=bottom,shape=straight": { + "model": "hem:block/blueleaf_stone_stair", + "y": 90, + "uvlock": true + }, + "facing=north,half=bottom,shape=straight": { + "model": "hem:block/blueleaf_stone_stair", + "y": 270, + "uvlock": true + }, + "facing=east,half=bottom,shape=inner_right": { + "model": "hem:block/blueleaf_stone_stair_inner" + }, + "facing=west,half=bottom,shape=inner_right": { + "model": "hem:block/blueleaf_stone_stair_inner", + "y": 180, + "uvlock": true + }, + "facing=south,half=bottom,shape=inner_right": { + "model": "hem:block/blueleaf_stone_stair_inner", + "y": 90, + "uvlock": true + }, + "facing=north,half=bottom,shape=inner_right": { + "model": "hem:block/blueleaf_stone_stair_inner", + "y": 270, + "uvlock": true + }, + "facing=east,half=bottom,shape=inner_left": { + "model": "hem:block/blueleaf_stone_stair_inner", + "y": 270, + "uvlock": true + }, + "facing=west,half=bottom,shape=inner_left": { + "model": "hem:block/blueleaf_stone_stair_inner", + "y": 90, + "uvlock": true + }, + "facing=south,half=bottom,shape=inner_left": { + "model": "hem:block/blueleaf_stone_stair_inner" + }, + "facing=north,half=bottom,shape=inner_left": { + "model": "hem:block/blueleaf_stone_stair_inner", + "y": 180, + "uvlock": true + }, + "facing=east,half=top,shape=straight": { + "model": "hem:block/blueleaf_stone_stair", + "x": 180, + "uvlock": true + }, + "facing=west,half=top,shape=straight": { + "model": "hem:block/blueleaf_stone_stair", + "x": 180, + "y": 180, + "uvlock": true + }, + "facing=south,half=top,shape=straight": { + "model": "hem:block/blueleaf_stone_stair", + "x": 180, + "y": 90, + "uvlock": true + }, + "facing=north,half=top,shape=straight": { + "model": "hem:block/blueleaf_stone_stair", + "x": 180, + "y": 270, + "uvlock": true + }, + "facing=east,half=top,shape=outer_right": { + "model": "hem:block/blueleaf_stone_stair_outer", + "x": 180, + "y": 90, + "uvlock": true + }, + "facing=west,half=top,shape=outer_right": { + "model": "hem:block/blueleaf_stone_stair_outer", + "x": 180, + "y": 270, + "uvlock": true + }, + "facing=south,half=top,shape=outer_right": { + "model": "hem:block/blueleaf_stone_stair_outer", + "x": 180, + "y": 180, + "uvlock": true + }, + "facing=north,half=top,shape=outer_right": { + "model": "hem:block/blueleaf_stone_stair_outer", + "x": 180, + "uvlock": true + }, + "facing=east,half=top,shape=outer_left": { + "model": "hem:block/blueleaf_stone_stair_outer", + "x": 180, + "uvlock": true + }, + "facing=west,half=top,shape=outer_left": { + "model": "hem:block/blueleaf_stone_stair_outer", + "x": 180, + "y": 180, + "uvlock": true + }, + "facing=south,half=top,shape=outer_left": { + "model": "hem:block/blueleaf_stone_stair_outer", + "x": 180, + "y": 90, + "uvlock": true + }, + "facing=north,half=top,shape=outer_left": { + "model": "hem:block/blueleaf_stone_stair_outer", + "x": 180, + "y": 270, + "uvlock": true + }, + "facing=east,half=top,shape=inner_right": { + "model": "hem:block/blueleaf_stone_stair_inner", + "x": 180, + "y": 90, + "uvlock": true + }, + "facing=west,half=top,shape=inner_right": { + "model": "hem:block/blueleaf_stone_stair_inner", + "x": 180, + "y": 270, + "uvlock": true + }, + "facing=south,half=top,shape=inner_right": { + "model": "hem:block/blueleaf_stone_stair_inner", + "x": 180, + "y": 180, + "uvlock": true + }, + "facing=north,half=top,shape=inner_right": { + "model": "hem:block/blueleaf_stone_stair_inner", + "x": 180, + "uvlock": true + }, + "facing=east,half=top,shape=inner_left": { + "model": "hem:block/blueleaf_stone_stair_inner", + "x": 180, + "uvlock": true + }, + "facing=west,half=top,shape=inner_left": { + "model": "hem:block/blueleaf_stone_stair_inner", + "x": 180, + "y": 180, + "uvlock": true + }, + "facing=south,half=top,shape=inner_left": { + "model": "hem:block/blueleaf_stone_stair_inner", + "x": 180, + "y": 90, + "uvlock": true + }, + "facing=north,half=top,shape=inner_left": { + "model": "hem:block/blueleaf_stone_stair_inner", + "x": 180, + "y": 270, + "uvlock": true + }, + "facing=east,half=bottom,shape=outer_right": { + "model": "hem:block/blueleaf_stone_stair_outer" + }, + "facing=west,half=bottom,shape=outer_right": { + "model": "hem:block/blueleaf_stone_stair_outer", + "y": 180, + "uvlock": true + }, + "facing=south,half=bottom,shape=outer_right": { + "model": "hem:block/blueleaf_stone_stair_outer", + "y": 90, + "uvlock": true + }, + "facing=north,half=bottom,shape=outer_right": { + "model": "hem:block/blueleaf_stone_stair_outer", + "y": 270, + "uvlock": true + }, + "facing=east,half=bottom,shape=outer_left": { + "model": "hem:block/blueleaf_stone_stair_outer", + "y": 270, + "uvlock": true + }, + "facing=west,half=bottom,shape=outer_left": { + "model": "hem:block/blueleaf_stone_stair_outer", + "y": 90, + "uvlock": true + }, + "facing=south,half=bottom,shape=outer_left": { + "model": "hem:block/blueleaf_stone_stair_outer" + }, + "facing=north,half=bottom,shape=outer_left": { + "model": "hem:block/blueleaf_stone_stair_outer", + "y": 180, + "uvlock": true + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_stone_wall.json b/src/main/resources/assets/hem/blockstates/blueleaf_stone_wall.json new file mode 100644 index 0000000..0144afc --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_stone_wall.json @@ -0,0 +1,90 @@ +{ + "multipart": [ + { + "when": { + "up": "true" + }, + "apply": { + "model": "hem:block/blueleaf_stone_wall_post" + } + }, + { + "when": { + "north": "low" + }, + "apply": { + "model": "hem:block/blueleaf_stone_wall", + "uvlock": true + } + }, + { + "when": { + "east": "low" + }, + "apply": { + "model": "hem:block/blueleaf_stone_wall", + "y": 90, + "uvlock": true + } + }, + { + "when": { + "south": "low" + }, + "apply": { + "model": "hem:block/blueleaf_stone_wall", + "y": 180, + "uvlock": true + } + }, + { + "when": { + "west": "low" + }, + "apply": { + "model": "hem:block/blueleaf_stone_wall", + "y": 270, + "uvlock": true + } + }, + { + "when": { + "north": "tall" + }, + "apply": { + "model": "hem:block/blueleaf_stone_wall_side_tall", + "uvlock": true + } + }, + { + "when": { + "east": "tall" + }, + "apply": { + "model": "hem:block/blueleaf_stone_wall_side_tall", + "y": 90, + "uvlock": true + } + }, + { + "when": { + "south": "tall" + }, + "apply": { + "model": "hem:block/blueleaf_stone_wall_side_tall", + "y": 180, + "uvlock": true + } + }, + { + "when": { + "west": "tall" + }, + "apply": { + "model": "hem:block/blueleaf_stone_wall_side_tall", + "y": 270, + "uvlock": true + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_tall_blooming_flower.json b/src/main/resources/assets/hem/blockstates/blueleaf_tall_blooming_flower.json new file mode 100644 index 0000000..269134d --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_tall_blooming_flower.json @@ -0,0 +1,10 @@ +{ + "variants": { + "half=upper": { + "model": "hem:block/blueleaf_tall_blooming_flower" + }, + "half=lower": { + "model": "hem:block/blueleaf_tall_blooming_flower_bottom" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_tall_grass.json b/src/main/resources/assets/hem/blockstates/blueleaf_tall_grass.json new file mode 100644 index 0000000..c48560c --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_tall_grass.json @@ -0,0 +1,10 @@ +{ + "variants": { + "half=upper": { + "model": "hem:block/blueleaf_tall_grass" + }, + "half=lower": { + "model": "hem:block/blueleaf_tall_grass_bottom" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_tall_sprout.json b/src/main/resources/assets/hem/blockstates/blueleaf_tall_sprout.json new file mode 100644 index 0000000..45c4683 --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_tall_sprout.json @@ -0,0 +1,10 @@ +{ + "variants": { + "half=upper": { + "model": "hem:block/blueleaf_tall_sprout" + }, + "half=lower": { + "model": "hem:block/blueleaf_tall_sprout_bottom" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_wheat.json b/src/main/resources/assets/hem/blockstates/blueleaf_wheat.json new file mode 100644 index 0000000..1ff17cd --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_wheat.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hem:block/blueleaf_wheat" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/blueleaf_wood.json b/src/main/resources/assets/hem/blockstates/blueleaf_wood.json new file mode 100644 index 0000000..440923b --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/blueleaf_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "hem:block/blueleaf_wood", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "hem:block/blueleaf_wood" + }, + "axis=z": { + "model": "hem:block/blueleaf_wood", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/bulb_flower.json b/src/main/resources/assets/hem/blockstates/bulb_flower.json new file mode 100644 index 0000000..c7ca606 --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/bulb_flower.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hem:block/bulb_flower" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/dangling_fluorescent_leaves.json b/src/main/resources/assets/hem/blockstates/dangling_fluorescent_leaves.json new file mode 100644 index 0000000..1ffbc0a --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/dangling_fluorescent_leaves.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hem:block/dangling_fluorescent_leaves" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/fallen_leaves.json b/src/main/resources/assets/hem/blockstates/fallen_leaves.json new file mode 100644 index 0000000..d58f683 --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/fallen_leaves.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hem:block/fallen_leaves" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/giant_lily_pad.json b/src/main/resources/assets/hem/blockstates/giant_lily_pad.json new file mode 100644 index 0000000..76b7ef5 --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/giant_lily_pad.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=north": [{ + "model": "hem:block/giant_lily_pad" + }, + { + "model": "hem:block/giant_lily_pad_flowerless" + }], + "facing=east": [{ + "model": "hem:block/giant_lily_pad", + "y": 90 + }, + { + "model": "hem:block/giant_lily_pad_flowerless", + "y": 90 + }], + "facing=south": [{ + "model": "hem:block/giant_lily_pad", + "y": 180 + }, + { + "model": "hem:block/giant_lily_pad_flowerless", + "y": 180 + }], + "facing=west": [{ + "model": "hem:block/giant_lily_pad", + "y": 270 + }, + { + "model": "hem:block/giant_lily_pad_flowerless", + "y": 270 + }] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/muncher.json b/src/main/resources/assets/hem/blockstates/muncher.json new file mode 100644 index 0000000..38c612e --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/muncher.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "hem:block/muncher" + }, + "facing=east": { + "model": "hem:block/muncher", + "y": 90 + }, + "facing=south": { + "model": "hem:block/muncher", + "y": 180 + }, + "facing=west": { + "model": "hem:block/muncher", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/blockstates/muncher_sprout.json b/src/main/resources/assets/hem/blockstates/muncher_sprout.json new file mode 100644 index 0000000..9ffb5cf --- /dev/null +++ b/src/main/resources/assets/hem/blockstates/muncher_sprout.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "hem:block/muncher_sprout" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/lang/en_us.json b/src/main/resources/assets/hem/lang/en_us.json new file mode 100644 index 0000000..12d236a --- /dev/null +++ b/src/main/resources/assets/hem/lang/en_us.json @@ -0,0 +1,106 @@ +{ + "entity.hem.giant_butterfly": "Giant Butterfly", + "block.hem.blueleaf_wheat": "Blueleaf Wheat", + "block.hem.blueleaf_tall_blooming_flower": "Blueleaf Tall Blooming Flower", + "item.hem.emberleaf_military_robot_upper_half_spawn_egg": "Emberleaf Military Robot Upper Half Spawn Egg", + "entity.hem.gold_fish": "Tiger Fish", + "biome.hem.blueleaf_hayfever_fields": "Blueleaf hayfever Fields", + "block.hem.ant_hill": "Ant Hill", + "key.hem.vehicle_strafe_left": "Strafe/Yaw Vehicle Left", + "block.hem.blueleaf_lily_pad": "Giant Lily Pad", + "item.hem.giant_butterfly_walking_spawn_egg": "Giant Butterfly Spawn Egg", + "entity.hem.giant_butterfly_walking": "Giant Butterfly", + "block.hem.blueleaf_green_cap": "Blueleaf Green Cap Mushroom", + "block.hem.bloomed_bulb_flower": "Bloomed Bulb Flower", + "item.hem.emberleaf_military_robot_lower_half_spawn_egg": "Emberleaf Military Robot Lower Half Spawn Egg", + "key.hem.vehicle_turn_left": "Turn/Roll Vehicle Left", + "entity.hem.fluffalo_shaved": "Fluffalo", + "block.hem.blueleaf_stone_wall": "Blueleaf Stone Wall", + "block.hem.blueleaf_blossomer": "Blueleaf Blossomer", + "entity.hem.emberleaf_military_robot_lower_half": "Emberleaf Military Robot Lower Half", + "biome.hem.heightend_blueleaf_plains": "Blueleaf Hilly Plains", + "entity.hem.dormant_emberleaf_military_bot": "Dormant Emberleaf Military Bot", + "block.hem.blueleaf_red_cap": "Blueleaf Red Cap Mushroom", + "block.hem.blueleaf_redwood_log": "Blueleaf Redwood Log", + "block.hem.blueleaf_cobblestone_stairs": "Blueleaf Cobblestone Stairs", + "block.hem.blueleaf_stone_slab": "Blueleaf Stone Slab", + "item.hem.tiger_fish_spawn_egg": "Tiger Fish Spawn Egg", + "block.hem.blueleaf_lavender": "Blueleaf Lavender", + "block.hem.blueleaf_stone_gravel": "Blueleaf Stone Gravel", + "key.hem.vehicle_turn_right": "Turn/Roll Vehicle Right", + "key.hem.vehicle_forward": "Vehicle Forward", + "item.hem.fluffalo_shaved_spawn_egg": "Fluffalo Spawn Egg", + "block.hem.blueleaf_mature_blossomer": "Blueleaf Blossomer", + "block.hem.blueleaf_cobblestone_slab": "Blueleaf Cobblestone Slab", + "block.hem.blueleaf_mud": "Blueleaf Mud", + "block.hem.blueleaf_grass": "Blueleaf Grass", + "item.hem.dormant_emberleaf_military_bot_spawn_egg": "Dormant Emberleaf Military Bot Spawn Egg", + "itemGroup.tabhals_exploration_mod_tech": "Hals Exploration Mod Tech", + "block.hem.muncher": "Muncher \u0027Flower\u0027", + "block.hem.blueleaf_dead_log": "Blueleaf Dead Log", + "key.hem.vehicle_accelerate": "Vehicle Accelerate", + "block.hem.blueleaf_redwood_leaves": "Blueleaf Redwood Leaves", + "item.hem.emberleaf_military_bot_spawn_egg": " Emberleaf Military Bot Spawn Egg", + "block.hem.ants": "Ants", + "block.hem.blueleaf_tall_grass": "Blueleaf Tall Grass", + "block.hem.muncher_sprout": "Muncher Sprout", + "entity.hem.tiger_fish": "Tiger Fish", + "biome.hem.lush_blueleaf_plains": "Blueleaf Lush Plains", + "item.hem.gas_canister_612litre": "Gas Canister", + "biome.hem.lush_blueleaf_marsh": "Blueleaf Lush Marsh", + "entity.hem.airboat": "Airboat", + "entity.hem.emberleaf_military_bot": " Emberleaf Military Bot", + "item.hem.butterfly_spawn_egg": "Butterfly", + "item.hem.tiger_fish_item": "Tiger Fish", + "block.hem.blueleaf_sea_grass": "Blueleaf Sea Grass", + "key.hem.vehicle_strafe_right": "Strafe/Yaw Vehicle Right", + "biome.hem.blueleaf_plains": "Blueleaf Plains", + "itemGroup.tabblueleaf_tab": "Hal\u0027s Exploration Mod Blueleaf", + "block.hem.blueleaf_leaves": "Blueleaf Leaves", + "entity.hem.emberleaf_military_robot_upper_half": "Emberleaf Military Robot Upper Half", + "block.hem.blueleaf_brown_cap": "Blueleaf Brown Cap Mushroom", + "block.hem.blueleaf_mature_cabbage_flower": "Blueleaf Mature Cabbage Flower", + "block.hem.blueleaf_cabbage_flower": "Blueleaf Cabbage Flower", + "item.hem.hot_air_balloon_item": "Hot Air Balloon", + "block.hem.bulb_flower": "Bulb Flower", + "block.hem.blueleaf_dirt_block": "Blueleaf Dirt Block", + "block.hem.fallen_leaves": "Fallen Leaves", + "block.hem.blueleaf_butter_slump": "Blueleaf Butter Slump", + "item.hem.dormant_aged_emberleaf_military_bot_spawn_egg": "Dormant Aged Emberleaf Military Bot Spawn Egg", + "item.hem.fluffalo_spawn_egg": "Fluffalo Spawn Egg", + "block.hem.blueleaf_dirt_grass_block": "Blueleaf Grassy Dirt Block", + "item.hem.lady_bug_in_flight_spawn_egg": "Ladybug Spawn Egg", + "item.hem.giant_butterfly_spawn_egg": "Giant Butterfly Spawn Egg", + "block.hem.blueleaf_stone": "Blueleaf Stone", + "block.hem.blueleaf_grass_block": "Blueleaf Grass Block", + "block.hem.blueleaf_tall_sprout": "Blueleaf Tall Sprout", + "block.hem.blueleaf_lush_leaves": "Blueleaf Lush Leaves", + "block.hem.blueleaf_fluorescent_leaves": "Blueleaf Fluorescent Leaves", + "block.hem.blueleaf_cobblestone_wall": "Blueleaf Cobblestone Wall", + "item.hem.gold_fish_spawn_egg": "Tiger Fish Spawn Egg", + "key.hem.vehicle_increase_pressure": "Increase Vehicle Pressure", + "block.hem.blueleaf_wood": "Blueleaf Wood", + "item.hem.blueleaf": "Blueleaf Portal Igniter", + "key.hem.vehicle_backward": "Vehicle Backward", + "block.hem.blueleaf_cobblestone": "Blueleaf Cobblestone", + "item.hem.hot_air_balloon_spawn_egg": "Hot Air Balloon Spawn Egg", + "entity.hem.hot_air_balloon": "Hot Air Balloon", + "key.hem.vehicle_decelerate": "Vehicle Decelerate", + "entity.hem.ladybug": "Ladybug", + "block.hem.bloomed_muncher": "Bloomed Muncher \u0027Flower\u0027", + "item.hem.ladybug_spawn_egg": "Ladybug", + "block.hem.blueleaf_log": "Blueleaf Log", + "item.hem.fluffalo_tuft": "Fluffalo Tuft", + "entity.hem.fluffalo": "Fluffalo", + "key.hem.vehicle_release_pressure": "Release Vehicle Pressure", + "block.hem.blueleaf_gravel_mud": "Blueleaf Gravel Topped Mud", + "block.hem.blueleaf_stone_stair": "Blueleaf Stone Stairs", + "entity.hem.dormant_aged_emberleaf_military_bot": "Dormant Aged Emberleaf Military Bot", + "item.hem.gold_fish_item": "Goldfish", + "item.hem.airboat_spawn_egg": "Airboat Spawn Egg", + "block.hem.giant_lily_pad": "Giant Lily Pad", + "block.hem.dangling_fluorescent_leaves": "Dangling Fluorescent Leaves", + "key.hem.open_gas_cell_view": "Open Gas Cell View", + "effect.gooed": "Gooed", + "entity.hem.lady_bug_in_flight": "Ladybug" +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/ant_hill.json b/src/main/resources/assets/hem/models/block/ant_hill.json new file mode 100644 index 0000000..ed39100 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/ant_hill.json @@ -0,0 +1,8 @@ +{ + "parent": "hem:custom/anthill", + "textures": { + "all": "hem:blocks/anthill", + "particle": "hem:blocks/anthill", + "0": "hem:blocks/anthill" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/ants.json b/src/main/resources/assets/hem/models/block/ants.json new file mode 100644 index 0000000..f9bc93d --- /dev/null +++ b/src/main/resources/assets/hem/models/block/ants.json @@ -0,0 +1,8 @@ +{ + "parent": "hem:custom/ants", + "textures": { + "all": "hem:blocks/ants-sheet", + "particle": "hem:blocks/ants-sheet", + "0": "hem:blocks/ants-sheet" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/bloomed_bulb_flower.json b/src/main/resources/assets/hem/models/block/bloomed_bulb_flower.json new file mode 100644 index 0000000..58adbcd --- /dev/null +++ b/src/main/resources/assets/hem/models/block/bloomed_bulb_flower.json @@ -0,0 +1,8 @@ +{ + "parent": "hem:custom/bulbflower", + "textures": { + "all": "hem:blocks/bulbflower", + "particle": "hem:blocks/blueleafleavesscarse", + "0": "hem:blocks/bulbflower" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/bloomed_muncher.json b/src/main/resources/assets/hem/models/block/bloomed_muncher.json new file mode 100644 index 0000000..49ca5e6 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/bloomed_muncher.json @@ -0,0 +1,8 @@ +{ + "parent": "hem:custom/openmuncher", + "textures": { + "all": "hem:blocks/openmuncher", + "particle": "hem:blocks/blueleafleavesscarse", + "0": "hem:blocks/openmuncher" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_blossomer.json b/src/main/resources/assets/hem/models/block/blueleaf_blossomer.json new file mode 100644 index 0000000..d0907e0 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_blossomer.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "hem:blocks/blueleafblossomer", + "particle": "hem:blocks/blueleafblossomer" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_brown_cap.json b/src/main/resources/assets/hem/models/block/blueleaf_brown_cap.json new file mode 100644 index 0000000..2fac57f --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_brown_cap.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "hem:blocks/blueleafbrowncap", + "particle": "hem:blocks/blueleafbrowncap" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_butter_slump.json b/src/main/resources/assets/hem/models/block/blueleaf_butter_slump.json new file mode 100644 index 0000000..1f71c2d --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_butter_slump.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "hem:blocks/blueleafbutterslump", + "particle": "hem:blocks/blueleafbutterslump" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_cabbage_flower.json b/src/main/resources/assets/hem/models/block/blueleaf_cabbage_flower.json new file mode 100644 index 0000000..a8764cf --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_cabbage_flower.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "hem:blocks/blueleafyoungcabbageflowerr", + "particle": "hem:blocks/blueleafyoungcabbageflowerr" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_cobblestone.json b/src/main/resources/assets/hem/models/block/blueleaf_cobblestone.json new file mode 100644 index 0000000..26cac81 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_cobblestone.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "hem:blocks/blueleafstonecobble", + "up": "hem:blocks/blueleafstonecobble", + "north": "hem:blocks/blueleafstonecobble", + "east": "hem:blocks/blueleafstonecobble", + "south": "hem:blocks/blueleafstonecobble", + "west": "hem:blocks/blueleafstonecobble", + "particle": "hem:blocks/blueleafstonecobble" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_slab.json b/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_slab.json new file mode 100644 index 0000000..177c9bd --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_slab.json @@ -0,0 +1,8 @@ +{ + "parent": "block/slab", + "textures": { + "bottom": "hem:blocks/blueleafstonecobble", + "top": "hem:blocks/blueleafstonecobble", + "side": "hem:blocks/blueleafstonecobble" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_slab_full.json b/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_slab_full.json new file mode 100644 index 0000000..6c4b467 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_slab_full.json @@ -0,0 +1,8 @@ +{ + "parent": "block/cube_bottom_top", + "textures": { + "bottom": "hem:blocks/blueleafstonecobble", + "top": "hem:blocks/blueleafstonecobble", + "side": "hem:blocks/blueleafstonecobble" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_slab_top.json b/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_slab_top.json new file mode 100644 index 0000000..7af8598 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_slab_top.json @@ -0,0 +1,8 @@ +{ + "parent": "block/slab_top", + "textures": { + "bottom": "hem:blocks/blueleafstonecobble", + "top": "hem:blocks/blueleafstonecobble", + "side": "hem:blocks/blueleafstonecobble" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_stairs.json b/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_stairs.json new file mode 100644 index 0000000..126f9bf --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "block/stairs", + "textures": { + "bottom": "hem:blocks/blueleafstonecobble", + "top": "hem:blocks/blueleafstonecobble", + "side": "hem:blocks/blueleafstonecobble" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_stairs_inner.json b/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_stairs_inner.json new file mode 100644 index 0000000..36efeb5 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "block/inner_stairs", + "textures": { + "bottom": "hem:blocks/blueleafstonecobble", + "top": "hem:blocks/blueleafstonecobble", + "side": "hem:blocks/blueleafstonecobble" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_stairs_outer.json b/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_stairs_outer.json new file mode 100644 index 0000000..72cdb92 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "block/outer_stairs", + "textures": { + "bottom": "hem:blocks/blueleafstonecobble", + "top": "hem:blocks/blueleafstonecobble", + "side": "hem:blocks/blueleafstonecobble" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_wall.json b/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_wall.json new file mode 100644 index 0000000..3556423 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_wall.json @@ -0,0 +1,7 @@ +{ + "parent": "block/template_wall_side", + "textures": { + "wall": "hem:blocks/blueleafstonecobble", + "particle": "hem:blocks/blueleafstonecobble" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_wall_inventory.json b/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_wall_inventory.json new file mode 100644 index 0000000..47c7604 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_wall_inventory.json @@ -0,0 +1,7 @@ +{ + "parent": "block/wall_inventory", + "textures": { + "wall": "hem:blocks/blueleafstonecobble", + "particle": "hem:blocks/blueleafstonecobble" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_wall_post.json b/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_wall_post.json new file mode 100644 index 0000000..134e482 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_wall_post.json @@ -0,0 +1,7 @@ +{ + "parent": "block/template_wall_post", + "textures": { + "wall": "hem:blocks/blueleafstonecobble", + "particle": "hem:blocks/blueleafstonecobble" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_wall_side_tall.json b/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_wall_side_tall.json new file mode 100644 index 0000000..01a055f --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_cobblestone_wall_side_tall.json @@ -0,0 +1,7 @@ +{ + "parent": "block/template_wall_side_tall", + "textures": { + "wall": "hem:blocks/blueleafstonecobble", + "particle": "hem:blocks/blueleafstonecobble" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_dead_log.json b/src/main/resources/assets/hem/models/block/blueleaf_dead_log.json new file mode 100644 index 0000000..2f8c58f --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_dead_log.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "hem:blocks/blueleafdeadlogtop", + "up": "hem:blocks/blueleafdeadlogtop", + "north": "hem:blocks/blueleafdeadlogside", + "east": "hem:blocks/blueleafdeadlogside", + "south": "hem:blocks/blueleafdeadlogside", + "west": "hem:blocks/blueleafdeadlogside", + "particle": "hem:blocks/blueleafdeadlogtop" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_dirt_block.json b/src/main/resources/assets/hem/models/block/blueleaf_dirt_block.json new file mode 100644 index 0000000..21a26bd --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_dirt_block.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "hem:blocks/blueleafdirt", + "up": "hem:blocks/blueleafdirt", + "north": "hem:blocks/blueleafdirt", + "east": "hem:blocks/blueleafdirt", + "south": "hem:blocks/blueleafdirt", + "west": "hem:blocks/blueleafdirt", + "particle": "hem:blocks/blueleafdirt" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_dirt_coarse_block.json b/src/main/resources/assets/hem/models/block/blueleaf_dirt_coarse_block.json new file mode 100644 index 0000000..33b9f17 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_dirt_coarse_block.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "hem:blocks/blueleafdirtcoarse", + "up": "hem:blocks/blueleafdirtcoarse", + "north": "hem:blocks/blueleafdirtcoarse", + "east": "hem:blocks/blueleafdirtcoarse", + "south": "hem:blocks/blueleafdirtcoarse", + "west": "hem:blocks/blueleafdirtcoarse", + "particle": "hem:blocks/blueleafdirtcoarse" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_dirt_grass_block.json b/src/main/resources/assets/hem/models/block/blueleaf_dirt_grass_block.json new file mode 100644 index 0000000..2e5fe7e --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_dirt_grass_block.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "hem:blocks/blueleafdirt", + "up": "hem:blocks/blueleafgrasstop", + "north": "hem:blocks/blueleafgrasssidedirt", + "east": "hem:blocks/blueleafgrasssidedirt", + "south": "hem:blocks/blueleafgrasssidedirt", + "west": "hem:blocks/blueleafgrasssidedirt", + "particle": "hem:blocks/blueleafdirt" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_fluorescent_leaves.json b/src/main/resources/assets/hem/models/block/blueleaf_fluorescent_leaves.json new file mode 100644 index 0000000..f8868f5 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_fluorescent_leaves.json @@ -0,0 +1,9 @@ +{ + "parent": "hem:custom/leaves", + "textures": { + "all": "hem:blocks/leaves", + "particle": "hem:blocks/leaves", + "0": "hem:blocks/leaves", + "1": "hem:blocks/leavesoverhang" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_grass.json b/src/main/resources/assets/hem/models/block/blueleaf_grass.json new file mode 100644 index 0000000..b9e69fe --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_grass.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "hem:blocks/blueleafgrasscurly", + "particle": "hem:blocks/blueleafgrasscurly" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_grass_block.json b/src/main/resources/assets/hem/models/block/blueleaf_grass_block.json new file mode 100644 index 0000000..54adfbb --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_grass_block.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "hem:blocks/blueleafstone", + "up": "hem:blocks/blueleafgrasstop", + "north": "hem:blocks/blueleafgrasssidestone", + "east": "hem:blocks/blueleafgrasssidestone", + "south": "hem:blocks/blueleafgrasssidestone", + "west": "hem:blocks/blueleafgrasssidestone", + "particle": "hem:blocks/blueleafstone" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_grass_gravel_mud.json b/src/main/resources/assets/hem/models/block/blueleaf_grass_gravel_mud.json new file mode 100644 index 0000000..2e56ace --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_grass_gravel_mud.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "hem:blocks/mud", + "up": "hem:blocks/pebblygrass", + "north": "hem:blocks/grassycobbleside", + "east": "hem:blocks/grassycobbleside", + "south": "hem:blocks/grassycobbleside", + "west": "hem:blocks/grassycobbleside", + "particle": "hem:blocks/mud" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_grass_medium.json b/src/main/resources/assets/hem/models/block/blueleaf_grass_medium.json new file mode 100644 index 0000000..569f7f9 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_grass_medium.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "hem:blocks/blueleafgrassmedium", + "particle": "hem:blocks/blueleafgrassmedium" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_grass_short.json b/src/main/resources/assets/hem/models/block/blueleaf_grass_short.json new file mode 100644 index 0000000..2df8099 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_grass_short.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "hem:blocks/blueleafgrassshort", + "particle": "hem:blocks/blueleafgrassshort" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_grass_stone_mud.json b/src/main/resources/assets/hem/models/block/blueleaf_grass_stone_mud.json new file mode 100644 index 0000000..6d79fd6 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_grass_stone_mud.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "hem:blocks/mud", + "up": "hem:blocks/grassycobble", + "north": "hem:blocks/grassycobbleside", + "east": "hem:blocks/grassycobbleside", + "south": "hem:blocks/grassycobbleside", + "west": "hem:blocks/grassycobbleside", + "particle": "hem:blocks/mud" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_grass_super_short.json b/src/main/resources/assets/hem/models/block/blueleaf_grass_super_short.json new file mode 100644 index 0000000..f07f731 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_grass_super_short.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "hem:blocks/blueleafgrasssupershort", + "particle": "hem:blocks/blueleafgrasssupershort" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_grass_tall.json b/src/main/resources/assets/hem/models/block/blueleaf_grass_tall.json new file mode 100644 index 0000000..d3864c3 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_grass_tall.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "hem:blocks/blueleafgrasstall", + "particle": "hem:blocks/blueleafgrasstall" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_gravel_mud.json b/src/main/resources/assets/hem/models/block/blueleaf_gravel_mud.json new file mode 100644 index 0000000..24818e1 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_gravel_mud.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "hem:blocks/mud", + "up": "hem:blocks/blueleafstonegravel", + "north": "hem:blocks/muddygravelside", + "east": "hem:blocks/muddygravelside", + "south": "hem:blocks/muddygravelside", + "west": "hem:blocks/muddygravelside", + "particle": "hem:blocks/mud" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_green_cap.json b/src/main/resources/assets/hem/models/block/blueleaf_green_cap.json new file mode 100644 index 0000000..744b0f5 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_green_cap.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "hem:blocks/blueleafgreencap", + "particle": "hem:blocks/blueleafgreencap" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_lavender.json b/src/main/resources/assets/hem/models/block/blueleaf_lavender.json new file mode 100644 index 0000000..5032519 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_lavender.json @@ -0,0 +1,9 @@ +{ + "parent": "hem:custom/lavender", + "textures": { + "all": "hem:blocks/lavenderblueleaf", + "particle": "hem:blocks/lavenderblueleaftop", + "0": "hem:blocks/lavenderblueleaf", + "missing": "hem:blocks/" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_leaves.json b/src/main/resources/assets/hem/models/block/blueleaf_leaves.json new file mode 100644 index 0000000..9d811e2 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_leaves.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "hem:blocks/blueleafdefaultleaves", + "up": "hem:blocks/blueleafdefaultleaves", + "north": "hem:blocks/blueleafdefaultleaves", + "east": "hem:blocks/blueleafdefaultleaves", + "south": "hem:blocks/blueleafdefaultleaves", + "west": "hem:blocks/blueleafdefaultleaves", + "particle": "hem:blocks/blueleafdefaultleaves" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_leaves_dense.json b/src/main/resources/assets/hem/models/block/blueleaf_leaves_dense.json new file mode 100644 index 0000000..dfe6264 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_leaves_dense.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "hem:blocks/blueleafdefaultleavesdense", + "up": "hem:blocks/blueleafdefaultleavesdense", + "north": "hem:blocks/blueleafdefaultleavesdense", + "east": "hem:blocks/blueleafdefaultleavesdense", + "south": "hem:blocks/blueleafdefaultleavesdense", + "west": "hem:blocks/blueleafdefaultleavesdense", + "particle": "hem:blocks/blueleafdefaultleavesdense" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_leaves_sparse.json b/src/main/resources/assets/hem/models/block/blueleaf_leaves_sparse.json new file mode 100644 index 0000000..46d81f4 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_leaves_sparse.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "hem:blocks/blueleafdefaultleavessparse", + "up": "hem:blocks/blueleafdefaultleavessparse", + "north": "hem:blocks/blueleafdefaultleavessparse", + "east": "hem:blocks/blueleafdefaultleavessparse", + "south": "hem:blocks/blueleafdefaultleavessparse", + "west": "hem:blocks/blueleafdefaultleavessparse", + "particle": "hem:blocks/blueleafdefaultleavessparse" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_lily_pad.json b/src/main/resources/assets/hem/models/block/blueleaf_lily_pad.json new file mode 100644 index 0000000..72957ee --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_lily_pad.json @@ -0,0 +1,8 @@ +{ + "parent": "hem:custom/blueleaflilypad", + "textures": { + "all": "hem:blocks/lilypad", + "particle": "hem:blocks/lilypad", + "0": "hem:blocks/lilypad" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_log.json b/src/main/resources/assets/hem/models/block/blueleaf_log.json new file mode 100644 index 0000000..ac5a8d1 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_log.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "hem:blocks/blueleaflogtop", + "up": "hem:blocks/blueleaflogtop", + "north": "hem:blocks/blueleaflogside", + "east": "hem:blocks/blueleaflogside", + "south": "hem:blocks/blueleaflogside", + "west": "hem:blocks/blueleaflogside", + "particle": "hem:blocks/blueleaflogtop" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_lush_leaves.json b/src/main/resources/assets/hem/models/block/blueleaf_lush_leaves.json new file mode 100644 index 0000000..c094e9a --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_lush_leaves.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "hem:blocks/blueleaflushleaves", + "up": "hem:blocks/blueleaflushleaves", + "north": "hem:blocks/blueleaflushleaves", + "east": "hem:blocks/blueleaflushleaves", + "south": "hem:blocks/blueleaflushleaves", + "west": "hem:blocks/blueleaflushleaves", + "particle": "hem:blocks/blueleaflushleaves" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_lush_leaves_dark.json b/src/main/resources/assets/hem/models/block/blueleaf_lush_leaves_dark.json new file mode 100644 index 0000000..2714f01 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_lush_leaves_dark.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "hem:blocks/blueleafleavesdark", + "particle": "hem:blocks/blueleafleavesdark" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_lush_leaves_scarse.json b/src/main/resources/assets/hem/models/block/blueleaf_lush_leaves_scarse.json new file mode 100644 index 0000000..c424ec6 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_lush_leaves_scarse.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "hem:blocks/blueleafleavesscarse", + "particle": "hem:blocks/blueleafleavesscarse" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_mature_blossomer.json b/src/main/resources/assets/hem/models/block/blueleaf_mature_blossomer.json new file mode 100644 index 0000000..b933d30 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_mature_blossomer.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "hem:blocks/blueleafmatureblossomer", + "particle": "hem:blocks/blueleafmatureblossomer" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_mature_cabbage_flower.json b/src/main/resources/assets/hem/models/block/blueleaf_mature_cabbage_flower.json new file mode 100644 index 0000000..9493769 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_mature_cabbage_flower.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "hem:blocks/blueleafmaturecabbageflower", + "particle": "hem:blocks/blueleafmaturecabbageflower" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_mud.json b/src/main/resources/assets/hem/models/block/blueleaf_mud.json new file mode 100644 index 0000000..b689f7c --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_mud.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "hem:blocks/mud", + "particle": "hem:blocks/mud" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_portal_ew.json b/src/main/resources/assets/hem/models/block/blueleaf_portal_ew.json new file mode 100644 index 0000000..fe9643c --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_portal_ew.json @@ -0,0 +1,40 @@ +{ + "textures": { + "particle": "hem:blocks/blueleafleavesscarse", + "portal": "hem:blocks/blueleafleavesscarse" + }, + "elements": [ + { + "from": [ + 6, + 0, + 0 + ], + "to": [ + 10, + 16, + 16 + ], + "faces": { + "east": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#portal" + }, + "west": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#portal" + } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_portal_ns.json b/src/main/resources/assets/hem/models/block/blueleaf_portal_ns.json new file mode 100644 index 0000000..1d28e0b --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_portal_ns.json @@ -0,0 +1,40 @@ +{ + "textures": { + "particle": "hem:blocks/blueleafleavesscarse", + "portal": "hem:blocks/blueleafleavesscarse" + }, + "elements": [ + { + "from": [ + 0, + 0, + 6 + ], + "to": [ + 16, + 16, + 10 + ], + "faces": { + "north": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#portal" + }, + "south": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#portal" + } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_red_cap.json b/src/main/resources/assets/hem/models/block/blueleaf_red_cap.json new file mode 100644 index 0000000..2b92ac8 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_red_cap.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "hem:blocks/blueleafredcap", + "particle": "hem:blocks/blueleafredcap" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_redwood_leaves.json b/src/main/resources/assets/hem/models/block/blueleaf_redwood_leaves.json new file mode 100644 index 0000000..8f35d87 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_redwood_leaves.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "hem:blocks/blueleafleavesfir", + "particle": "hem:blocks/blueleafleavesfir" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_redwood_log.json b/src/main/resources/assets/hem/models/block/blueleaf_redwood_log.json new file mode 100644 index 0000000..72e9022 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_redwood_log.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "hem:blocks/blueleafredwoodlogtop", + "up": "hem:blocks/blueleafredwoodlogtop", + "north": "hem:blocks/blueleafredwoodlogside", + "east": "hem:blocks/blueleafredwoodlogside", + "south": "hem:blocks/blueleafredwoodlogside", + "west": "hem:blocks/blueleafredwoodlogside", + "particle": "hem:blocks/blueleafredwoodlogtop" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_sea_grass.json b/src/main/resources/assets/hem/models/block/blueleaf_sea_grass.json new file mode 100644 index 0000000..abc8569 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_sea_grass.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "hem:blocks/blueleafseagrass", + "particle": "hem:blocks/blueleafseagrass" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_stone.json b/src/main/resources/assets/hem/models/block/blueleaf_stone.json new file mode 100644 index 0000000..bdcf09e --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_stone.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "hem:blocks/blueleafstone", + "up": "hem:blocks/blueleafstone", + "north": "hem:blocks/blueleafstone", + "east": "hem:blocks/blueleafstone", + "south": "hem:blocks/blueleafstone", + "west": "hem:blocks/blueleafstone", + "particle": "hem:blocks/blueleafstone" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_stone_gravel.json b/src/main/resources/assets/hem/models/block/blueleaf_stone_gravel.json new file mode 100644 index 0000000..03483f8 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_stone_gravel.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "hem:blocks/blueleafstonegravel", + "up": "hem:blocks/blueleafstonegravel", + "north": "hem:blocks/blueleafstonegravel", + "east": "hem:blocks/blueleafstonegravel", + "south": "hem:blocks/blueleafstonegravel", + "west": "hem:blocks/blueleafstonegravel", + "particle": "hem:blocks/blueleafstonegravel" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_stone_mud.json b/src/main/resources/assets/hem/models/block/blueleaf_stone_mud.json new file mode 100644 index 0000000..a24c230 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_stone_mud.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "hem:blocks/mud", + "up": "hem:blocks/blueleafstonecobble", + "north": "hem:blocks/muddygravelside", + "east": "hem:blocks/muddygravelside", + "south": "hem:blocks/muddygravelside", + "west": "hem:blocks/muddygravelside", + "particle": "hem:blocks/mud" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_stone_slab.json b/src/main/resources/assets/hem/models/block/blueleaf_stone_slab.json new file mode 100644 index 0000000..3cffc78 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_stone_slab.json @@ -0,0 +1,8 @@ +{ + "parent": "block/slab", + "textures": { + "bottom": "hem:blocks/blueleafstone", + "top": "hem:blocks/blueleafstone", + "side": "hem:blocks/blueleafstone" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_stone_slab_full.json b/src/main/resources/assets/hem/models/block/blueleaf_stone_slab_full.json new file mode 100644 index 0000000..7e47e34 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_stone_slab_full.json @@ -0,0 +1,8 @@ +{ + "parent": "block/cube_bottom_top", + "textures": { + "bottom": "hem:blocks/blueleafstone", + "top": "hem:blocks/blueleafstone", + "side": "hem:blocks/blueleafstone" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_stone_slab_top.json b/src/main/resources/assets/hem/models/block/blueleaf_stone_slab_top.json new file mode 100644 index 0000000..0abb1dc --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_stone_slab_top.json @@ -0,0 +1,8 @@ +{ + "parent": "block/slab_top", + "textures": { + "bottom": "hem:blocks/blueleafstone", + "top": "hem:blocks/blueleafstone", + "side": "hem:blocks/blueleafstone" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_stone_stair.json b/src/main/resources/assets/hem/models/block/blueleaf_stone_stair.json new file mode 100644 index 0000000..ea4a15b --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_stone_stair.json @@ -0,0 +1,8 @@ +{ + "parent": "block/stairs", + "textures": { + "bottom": "hem:blocks/blueleafstone", + "top": "hem:blocks/blueleafstone", + "side": "hem:blocks/blueleafstone" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_stone_stair_inner.json b/src/main/resources/assets/hem/models/block/blueleaf_stone_stair_inner.json new file mode 100644 index 0000000..5c540fe --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_stone_stair_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "block/inner_stairs", + "textures": { + "bottom": "hem:blocks/blueleafstone", + "top": "hem:blocks/blueleafstone", + "side": "hem:blocks/blueleafstone" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_stone_stair_outer.json b/src/main/resources/assets/hem/models/block/blueleaf_stone_stair_outer.json new file mode 100644 index 0000000..74fd91b --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_stone_stair_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "block/outer_stairs", + "textures": { + "bottom": "hem:blocks/blueleafstone", + "top": "hem:blocks/blueleafstone", + "side": "hem:blocks/blueleafstone" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_stone_wall.json b/src/main/resources/assets/hem/models/block/blueleaf_stone_wall.json new file mode 100644 index 0000000..915ea80 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_stone_wall.json @@ -0,0 +1,7 @@ +{ + "parent": "block/template_wall_side", + "textures": { + "wall": "hem:blocks/blueleafstone", + "particle": "hem:blocks/blueleafstone" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_stone_wall_inventory.json b/src/main/resources/assets/hem/models/block/blueleaf_stone_wall_inventory.json new file mode 100644 index 0000000..539f23d --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_stone_wall_inventory.json @@ -0,0 +1,7 @@ +{ + "parent": "block/wall_inventory", + "textures": { + "wall": "hem:blocks/blueleafstone", + "particle": "hem:blocks/blueleafstone" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_stone_wall_post.json b/src/main/resources/assets/hem/models/block/blueleaf_stone_wall_post.json new file mode 100644 index 0000000..807c119 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_stone_wall_post.json @@ -0,0 +1,7 @@ +{ + "parent": "block/template_wall_post", + "textures": { + "wall": "hem:blocks/blueleafstone", + "particle": "hem:blocks/blueleafstone" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_stone_wall_side_tall.json b/src/main/resources/assets/hem/models/block/blueleaf_stone_wall_side_tall.json new file mode 100644 index 0000000..b3c0e58 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_stone_wall_side_tall.json @@ -0,0 +1,7 @@ +{ + "parent": "block/template_wall_side_tall", + "textures": { + "wall": "hem:blocks/blueleafstone", + "particle": "hem:blocks/blueleafstone" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_stony_mud.json b/src/main/resources/assets/hem/models/block/blueleaf_stony_mud.json new file mode 100644 index 0000000..59c694b --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_stony_mud.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "hem:blocks/stonymud", + "particle": "hem:blocks/stonymud" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_tall_blooming_flower.json b/src/main/resources/assets/hem/models/block/blueleaf_tall_blooming_flower.json new file mode 100644 index 0000000..af7a9f9 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_tall_blooming_flower.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "hem:blocks/blueleafbloomingflower", + "particle": "hem:blocks/blueleafbloomingflower" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_tall_blooming_flower_bottom.json b/src/main/resources/assets/hem/models/block/blueleaf_tall_blooming_flower_bottom.json new file mode 100644 index 0000000..b7124e1 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_tall_blooming_flower_bottom.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "hem:blocks/blueleafbloomingflowerbottom", + "particle": "hem:blocks/blueleafbloomingflowerbottom" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_tall_grass.json b/src/main/resources/assets/hem/models/block/blueleaf_tall_grass.json new file mode 100644 index 0000000..9925ee7 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_tall_grass.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "hem:blocks/blueleaftallgrasstop", + "particle": "hem:blocks/blueleaftallgrasstop" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_tall_grass_bottom.json b/src/main/resources/assets/hem/models/block/blueleaf_tall_grass_bottom.json new file mode 100644 index 0000000..f24fa02 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_tall_grass_bottom.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "hem:blocks/blueleaftallgrassbottom", + "particle": "hem:blocks/blueleaftallgrassbottom" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_tall_sprout.json b/src/main/resources/assets/hem/models/block/blueleaf_tall_sprout.json new file mode 100644 index 0000000..2d09bf3 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_tall_sprout.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "hem:blocks/blueleafsprouttop", + "particle": "hem:blocks/blueleafsprouttop" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_tall_sprout_bottom.json b/src/main/resources/assets/hem/models/block/blueleaf_tall_sprout_bottom.json new file mode 100644 index 0000000..2f62a60 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_tall_sprout_bottom.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "hem:blocks/blueleafsproutbottom", + "particle": "hem:blocks/blueleafsproutbottom" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_wheat.json b/src/main/resources/assets/hem/models/block/blueleaf_wheat.json new file mode 100644 index 0000000..f5fcdc7 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_wheat.json @@ -0,0 +1,9 @@ +{ + "parent": "hem:custom/wheat", + "textures": { + "all": "hem:blocks/wheettop", + "particle": "hem:blocks/wheettop", + "0": "hem:blocks/wheat", + "missing": "hem:blocks/" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_wheat_bottom.json b/src/main/resources/assets/hem/models/block/blueleaf_wheat_bottom.json new file mode 100644 index 0000000..c7ed2d5 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_wheat_bottom.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "hem:blocks/wheetbottom", + "particle": "hem:blocks/wheetbottom" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/blueleaf_wood.json b/src/main/resources/assets/hem/models/block/blueleaf_wood.json new file mode 100644 index 0000000..b93d90b --- /dev/null +++ b/src/main/resources/assets/hem/models/block/blueleaf_wood.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "hem:blocks/blueleaflogside", + "up": "hem:blocks/blueleaflogside", + "north": "hem:blocks/blueleaflogside", + "east": "hem:blocks/blueleaflogside", + "south": "hem:blocks/blueleaflogside", + "west": "hem:blocks/blueleaflogside", + "particle": "hem:blocks/blueleaflogside" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/bulb_flower.json b/src/main/resources/assets/hem/models/block/bulb_flower.json new file mode 100644 index 0000000..69c38d8 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/bulb_flower.json @@ -0,0 +1,8 @@ +{ + "parent": "hem:custom/bulbflowerclosed", + "textures": { + "all": "hem:blocks/bulbflowerclose", + "particle": "hem:blocks/blueleafearlybulbflowerbottom", + "0": "hem:blocks/bulbflowerclose" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/bulb_flower_bottom.json b/src/main/resources/assets/hem/models/block/bulb_flower_bottom.json new file mode 100644 index 0000000..c3fc1b3 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/bulb_flower_bottom.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "hem:blocks/blueleafearlybulbflowerbottom", + "particle": "hem:blocks/blueleafearlybulbflowerbottom" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/dangling_fluorescent_leaves.json b/src/main/resources/assets/hem/models/block/dangling_fluorescent_leaves.json new file mode 100644 index 0000000..0050a30 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/dangling_fluorescent_leaves.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "hem:blocks/danglingfluorescentleaves", + "particle": "hem:blocks/danglingfluorescentleaves" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/fallen_leaves.json b/src/main/resources/assets/hem/models/block/fallen_leaves.json new file mode 100644 index 0000000..76b988a --- /dev/null +++ b/src/main/resources/assets/hem/models/block/fallen_leaves.json @@ -0,0 +1,8 @@ +{ + "parent": "hem:custom/leafpile", + "textures": { + "all": "hem:blocks/blueleafdefaultleavessparse", + "particle": "hem:blocks/blueleafdefaultleavessparse", + "1": "hem:blocks/blueleafdefaultleavessparse" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/giant_lily_pad.json b/src/main/resources/assets/hem/models/block/giant_lily_pad.json new file mode 100644 index 0000000..f0e21e8 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/giant_lily_pad.json @@ -0,0 +1,8 @@ +{ + "parent": "hem:custom/giantlilypad", + "textures": { + "all": "hem:blocks/giantlilypad", + "particle": "hem:blocks/giantlilypad", + "0": "hem:blocks/giantlilypad" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/giant_lily_pad_flowerless.json b/src/main/resources/assets/hem/models/block/giant_lily_pad_flowerless.json new file mode 100644 index 0000000..03b2c0c --- /dev/null +++ b/src/main/resources/assets/hem/models/block/giant_lily_pad_flowerless.json @@ -0,0 +1,8 @@ +{ + "parent": "hem:custom/giantlilypadnoflower", + "textures": { + "all": "hem:blocks/giantlilypad", + "particle": "hem:blocks/giantlilypad", + "0": "hem:blocks/giantlilypad" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/grass/blueleaf_dirt_grass_alternate.json b/src/main/resources/assets/hem/models/block/grass/blueleaf_dirt_grass_alternate.json new file mode 100644 index 0000000..7c4f7ef --- /dev/null +++ b/src/main/resources/assets/hem/models/block/grass/blueleaf_dirt_grass_alternate.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "hem:blocks/blueleafdirt", + "up": "hem:blocks/blueleafgrasstopalternate", + "north": "hem:blocks/blueleafgrasssidedirt", + "east": "hem:blocks/blueleafgrasssidedirt", + "south": "hem:blocks/blueleafgrasssidedirt", + "west": "hem:blocks/blueleafgrasssidedirt", + "particle": "hem:blocks/blueleafdirt" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/grass/blueleaf_dirt_grass_bright.json b/src/main/resources/assets/hem/models/block/grass/blueleaf_dirt_grass_bright.json new file mode 100644 index 0000000..71756fc --- /dev/null +++ b/src/main/resources/assets/hem/models/block/grass/blueleaf_dirt_grass_bright.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "hem:blocks/blueleafdirt", + "up": "hem:blocks/blueleafgrasstopbright", + "north": "hem:blocks/blueleafgrasssidedirt", + "east": "hem:blocks/blueleafgrasssidedirt", + "south": "hem:blocks/blueleafgrasssidedirt", + "west": "hem:blocks/blueleafgrasssidedirt", + "particle": "hem:blocks/blueleafdirt" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/grass/blueleaf_dirt_grass_flower.json b/src/main/resources/assets/hem/models/block/grass/blueleaf_dirt_grass_flower.json new file mode 100644 index 0000000..6dc1aaa --- /dev/null +++ b/src/main/resources/assets/hem/models/block/grass/blueleaf_dirt_grass_flower.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "hem:blocks/blueleafdirt", + "up": "hem:blocks/blueleafgrasstopflower", + "north": "hem:blocks/blueleafgrasssidedirt", + "east": "hem:blocks/blueleafgrasssidedirt", + "south": "hem:blocks/blueleafgrasssidedirt", + "west": "hem:blocks/blueleafgrasssidedirt", + "particle": "hem:blocks/blueleafdirt" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/grass/blueleaf_dirt_grass_flowers.json b/src/main/resources/assets/hem/models/block/grass/blueleaf_dirt_grass_flowers.json new file mode 100644 index 0000000..553e385 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/grass/blueleaf_dirt_grass_flowers.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "hem:blocks/blueleafdirt", + "up": "hem:blocks/blueleafgrasstopflowers", + "north": "hem:blocks/blueleafgrasssidedirt", + "east": "hem:blocks/blueleafgrasssidedirt", + "south": "hem:blocks/blueleafgrasssidedirt", + "west": "hem:blocks/blueleafgrasssidedirt", + "particle": "hem:blocks/blueleafdirt" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/grass/blueleaf_grass_block_alternate.json b/src/main/resources/assets/hem/models/block/grass/blueleaf_grass_block_alternate.json new file mode 100644 index 0000000..40394f5 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/grass/blueleaf_grass_block_alternate.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "hem:blocks/blueleafstone", + "up": "hem:blocks/blueleafgrasstopalternate", + "north": "hem:blocks/blueleafgrasssidestone", + "east": "hem:blocks/blueleafgrasssidestone", + "south": "hem:blocks/blueleafgrasssidestone", + "west": "hem:blocks/blueleafgrasssidestone", + "particle": "hem:blocks/blueleafstone" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/grass/blueleaf_grass_block_bright.json b/src/main/resources/assets/hem/models/block/grass/blueleaf_grass_block_bright.json new file mode 100644 index 0000000..4304902 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/grass/blueleaf_grass_block_bright.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "hem:blocks/blueleafstone", + "up": "hem:blocks/blueleafgrasstopbright", + "north": "hem:blocks/blueleafgrasssidestone", + "east": "hem:blocks/blueleafgrasssidestone", + "south": "hem:blocks/blueleafgrasssidestone", + "west": "hem:blocks/blueleafgrasssidestone", + "particle": "hem:blocks/blueleafstone" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/grass/blueleaf_grass_block_flower.json b/src/main/resources/assets/hem/models/block/grass/blueleaf_grass_block_flower.json new file mode 100644 index 0000000..d15a283 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/grass/blueleaf_grass_block_flower.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "hem:blocks/blueleafstone", + "up": "hem:blocks/blueleafgrasstopflower", + "north": "hem:blocks/blueleafgrasssidestone", + "east": "hem:blocks/blueleafgrasssidestone", + "south": "hem:blocks/blueleafgrasssidestone", + "west": "hem:blocks/blueleafgrasssidestone", + "particle": "hem:blocks/blueleafstone" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/grass/blueleaf_grass_block_flowers.json b/src/main/resources/assets/hem/models/block/grass/blueleaf_grass_block_flowers.json new file mode 100644 index 0000000..7797ce8 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/grass/blueleaf_grass_block_flowers.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "hem:blocks/blueleafstone", + "up": "hem:blocks/blueleafgrasstopflowers", + "north": "hem:blocks/blueleafgrasssidestone", + "east": "hem:blocks/blueleafgrasssidestone", + "south": "hem:blocks/blueleafgrasssidestone", + "west": "hem:blocks/blueleafgrasssidestone", + "particle": "hem:blocks/blueleafstone" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/muncher.json b/src/main/resources/assets/hem/models/block/muncher.json new file mode 100644 index 0000000..936292f --- /dev/null +++ b/src/main/resources/assets/hem/models/block/muncher.json @@ -0,0 +1,8 @@ +{ + "parent": "hem:custom/chomperclosed", + "textures": { + "all": "hem:blocks/blueleafmuncherclosed", + "particle": "hem:blocks/blueleafmuncherclosed", + "0": "hem:blocks/blueleafmuncherclosed" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/block/muncher_sprout.json b/src/main/resources/assets/hem/models/block/muncher_sprout.json new file mode 100644 index 0000000..7fae329 --- /dev/null +++ b/src/main/resources/assets/hem/models/block/muncher_sprout.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "hem:blocks/munchersprout", + "particle": "hem:blocks/munchersprout" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/custom/anthill.json b/src/main/resources/assets/hem/models/custom/anthill.json new file mode 100644 index 0000000..d39b258 --- /dev/null +++ b/src/main/resources/assets/hem/models/custom/anthill.json @@ -0,0 +1,338 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [ + 32, + 32 + ], + "elements": [ + { + "from": [ + 2, + 0, + 2 + ], + "to": [ + 14, + 5, + 14 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 2, + 0, + 1 + ] + }, + "faces": { + "north": { + "uv": [ + 6, + 0, + 12, + 2.5 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 6, + 2.5, + 12, + 5 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 6, + 5, + 12, + 7.5 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 6, + 7.5, + 12, + 10 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 6, + 6, + 0, + 0 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 6, + 0, + 0, + 6 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 12, + 0, + 1 + ], + "to": [ + 15, + 3, + 4 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 13, + 0, + 2 + ] + }, + "faces": { + "north": { + "uv": [ + 0, + 0, + 1.5, + 1.5 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 8, + 1, + 9.5, + 2.5 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 7, + 6, + 8.5, + 7.5 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 6, + 8.5, + 7.5, + 10 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 4.5, + 6.5, + 6, + 8 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 9, + 3.5, + 10.5, + 5 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 1, + 0, + 12 + ], + "to": [ + 4, + 3, + 15 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 2, + 0, + 13 + ] + }, + "faces": { + "north": { + "uv": [ + 0, + 0, + 1.5, + 1.5 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 8, + 1, + 9.5, + 2.5 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 7, + 6, + 8.5, + 7.5 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 7, + 8, + 8.5, + 9.5 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 8.5, + 8, + 10, + 9.5 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 9, + 3.5, + 10.5, + 5 + ], + "texture": "#0" + } + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [ + 0, + 2.5, + 0 + ], + "scale": [ + 0.4, + 0.4, + 0.4 + ] + }, + "thirdperson_lefthand": { + "translation": [ + 0, + 2.5, + 0 + ], + "scale": [ + 0.4, + 0.4, + 0.4 + ] + }, + "firstperson_righthand": { + "translation": [ + 0, + 5.25, + 0 + ], + "scale": [ + 0.65, + 0.75, + 0.4 + ] + }, + "firstperson_lefthand": { + "translation": [ + 0, + 5.25, + 0 + ], + "scale": [ + 0.65, + 0.75, + 0.4 + ] + }, + "ground": { + "translation": [ + 0, + 0.25, + 0 + ], + "scale": [ + 0.4, + 0.4, + 0.4 + ] + }, + "gui": { + "rotation": [ + 37, + 41, + 0 + ], + "translation": [ + 0, + 3.25, + 0 + ], + "scale": [ + 0.91, + 0.91, + 0.91 + ] + }, + "head": { + "translation": [ + 0, + 13, + 0 + ] + }, + "fixed": { + "rotation": [ + -90, + 0, + 0 + ], + "translation": [ + 0, + 0, + -6.25 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/custom/ants.json b/src/main/resources/assets/hem/models/custom/ants.json new file mode 100644 index 0000000..a6d869a --- /dev/null +++ b/src/main/resources/assets/hem/models/custom/ants.json @@ -0,0 +1,161 @@ +{ + "credit": "Made with Blockbench", + "elements": [ + { + "from": [ + 0, + 0.5, + 0 + ], + "to": [ + 16, + 0.5, + 16 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 0, + 0.5, + 0 + ] + }, + "faces": { + "north": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 0, + 1, + 0 + ], + "to": [ + 16, + 1, + 16 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 8, + 1, + 8 + ] + }, + "faces": { + "north": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "rotation": 90, + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "rotation": 270, + "texture": "#0" + } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/custom/blueleaflilypad.json b/src/main/resources/assets/hem/models/custom/blueleaflilypad.json new file mode 100644 index 0000000..901a369 --- /dev/null +++ b/src/main/resources/assets/hem/models/custom/blueleaflilypad.json @@ -0,0 +1,79 @@ +{ + "format_version": "1.9.0", + "credit": "Made with Blockbench", + "ambientocclusion": false, + "texture_size": [ + 16, + 17 + ], + "elements": [ + { + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 0.5, + 16 + ], + "faces": { + "north": { + "uv": [ + 0.032, + 0.03012, + 15.968, + 0.91106 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0.032, + 0.03012, + 15.968, + 0.91106 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0.032, + 0.03012, + 15.968, + 0.91106 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0.032, + 0.03012, + 15.968, + 0.91106 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0.032, + 1, + 15.968, + 15.96988 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0.032, + 16, + 16, + 0.91106 + ], + "texture": "#0" + } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/custom/bulbflower.json b/src/main/resources/assets/hem/models/custom/bulbflower.json new file mode 100644 index 0000000..e12ab06 --- /dev/null +++ b/src/main/resources/assets/hem/models/custom/bulbflower.json @@ -0,0 +1,425 @@ +{ + "credit": "Made with Blockbench", + "ambientocclusion": false, + "texture_size": [ + 64, + 64 + ], + "elements": [ + { + "from": [ + -5, + 2.1, + -5 + ], + "to": [ + 21, + 2.1, + 21 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 0, + 0.1, + 0 + ] + }, + "shade": false, + "faces": { + "north": { + "uv": [ + 0, + 0, + 6.5, + 0 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 6.5, + 0 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 6.5, + 0 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 6.5, + 0 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 6.5, + 6.5, + 0, + 0 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 6.5, + 0, + 0, + 6.5 + ], + "texture": "#0" + } + } + }, + { + "from": [ + -5.05, + 2.3, + -5.05 + ], + "to": [ + 21.05, + 2.4, + 21.05 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 0, + 0.35, + 0 + ] + }, + "shade": false, + "faces": { + "north": { + "uv": [ + 0, + 0, + 6.5, + 0 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 6.5, + 0 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 6.5, + 0 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 6.5, + 0 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 6.5, + 13, + 0, + 6.5 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 6.5, + 6.5, + 0, + 13 + ], + "texture": "#0" + } + } + }, + { + "from": [ + -5, + 1.5, + -5 + ], + "to": [ + 21, + 1.5, + 21 + ], + "rotation": { + "angle": 45, + "axis": "y", + "origin": [ + 8, + 1.5, + 8 + ] + }, + "shade": false, + "faces": { + "north": { + "uv": [ + 0, + 0, + 6.5, + 0 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 6.5, + 0 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 6.5, + 0 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 6.5, + 0 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 13, + 6.5, + 6.5, + 0 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 13, + 0, + 6.5, + 6.5 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 7, + 0, + 7 + ], + "to": [ + 9, + 2, + 9 + ], + "rotation": { + "angle": 45, + "axis": "y", + "origin": [ + 8, + 1, + 8 + ] + }, + "shade": false, + "faces": { + "north": { + "uv": [ + 0, + 13, + 0.5, + 13.5 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 13, + 0, + 13.5, + 0.5 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0.5, + 13, + 1, + 13.5 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 13, + 0.5, + 13.5, + 1 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 1.5, + 13.5, + 1, + 13 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 13.5, + 1, + 13, + 1.5 + ], + "texture": "#0" + } + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [ + 0, + 2, + 0 + ], + "scale": [ + 0.3, + 0.3, + 0.3 + ] + }, + "thirdperson_lefthand": { + "translation": [ + 0, + 2, + 0 + ], + "scale": [ + 0.3, + 0.3, + 0.3 + ] + }, + "firstperson_righthand": { + "rotation": [ + 58, + 21, + 28 + ], + "translation": [ + 0, + 3.5, + 0 + ], + "scale": [ + 0.4, + 0.4, + 0.35 + ] + }, + "firstperson_lefthand": { + "rotation": [ + 58, + 21, + 28 + ], + "translation": [ + 0, + 3.5, + 0 + ], + "scale": [ + 0.4, + 0.4, + 0.35 + ] + }, + "ground": { + "translation": [ + 0, + 1.25, + 1.75 + ], + "scale": [ + 0.4, + 0.4, + 0.4 + ] + }, + "gui": { + "rotation": [ + 90, + 0, + 0 + ], + "scale": [ + 0.4, + 0.4, + 0.4 + ] + }, + "head": { + "translation": [ + 0, + 13.25, + 0 + ] + }, + "fixed": { + "rotation": [ + -91, + 0, + 0 + ], + "translation": [ + 0, + 0, + -8.25 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/custom/bulbflowerclosed.json b/src/main/resources/assets/hem/models/custom/bulbflowerclosed.json new file mode 100644 index 0000000..e10c54c --- /dev/null +++ b/src/main/resources/assets/hem/models/custom/bulbflowerclosed.json @@ -0,0 +1,168 @@ +{ + "credit": "Made with Blockbench", + "ambientocclusion": false, + "texture_size": [ + 16, + 32 + ], + "elements": [ + { + "from": [ + 0, + 0, + 8 + ], + "to": [ + 16, + 32, + 8 + ], + "rotation": { + "angle": -45, + "axis": "y", + "origin": [ + 8, + 16, + 8 + ] + }, + "shade": false, + "faces": { + "north": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 0, + 16 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 0, + 16 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 8, + 0, + 0 + ], + "to": [ + 8, + 32, + 16 + ], + "rotation": { + "angle": -45, + "axis": "y", + "origin": [ + 8, + 16, + 8 + ] + }, + "shade": false, + "faces": { + "north": { + "uv": [ + 0, + 0, + 0, + 16 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 0, + 16 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "rotation": 90, + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "rotation": 270, + "texture": "#0" + } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/custom/canister612l.json b/src/main/resources/assets/hem/models/custom/canister612l.json new file mode 100644 index 0000000..210cfeb --- /dev/null +++ b/src/main/resources/assets/hem/models/custom/canister612l.json @@ -0,0 +1,719 @@ +{ + "format_version": "1.9.0", + "credit": "Made with Blockbench", + "texture_size": [ + 64, + 64 + ], + "elements": [ + { + "from": [ + 4.8, + -0.2, + 4.8 + ], + "to": [ + 11.2, + 17.2, + 11.2 + ], + "rotation": { + "angle": -45, + "axis": "y", + "origin": [ + 8, + 8, + 8 + ] + }, + "faces": { + "north": { + "uv": [ + 0, + 0, + 1.5, + 4.25 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 1.75, + 0, + 3.25, + 4.25 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 3.5, + 0, + 5, + 4.25 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 4.5, + 1.5, + 8.75 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 8.5, + 1.5, + 7, + 0 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 8.5, + 1.75, + 7, + 3.25 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 5, + 0, + 5 + ], + "to": [ + 11, + 17, + 11 + ], + "rotation": { + "angle": -45, + "axis": "y", + "origin": [ + 8, + 8, + 8 + ] + }, + "faces": { + "north": { + "uv": [ + 1.75, + 4.5, + 3.25, + 8.75 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 3.5, + 4.5, + 5, + 8.75 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 5.25, + 0, + 6.75, + 4.25 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 5.25, + 4.5, + 6.75, + 8.75 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 8.5, + 5, + 7, + 3.5 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 8.5, + 5.25, + 7, + 6.75 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 6, + 20, + 6 + ], + "to": [ + 10, + 21, + 10 + ], + "rotation": { + "angle": -45, + "axis": "y", + "origin": [ + 8, + 24, + 8 + ] + }, + "faces": { + "north": { + "uv": [ + 8.75, + 4, + 9.75, + 4.25 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 8.75, + 4.5, + 9.75, + 4.75 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 8.75, + 5, + 9.75, + 5.25 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 8.75, + 5.5, + 9.75, + 5.75 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 8, + 8, + 7, + 7 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 8, + 8.25, + 7, + 9.25 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 5.8, + 19.8, + 5.8 + ], + "to": [ + 10.2, + 21.2, + 10.2 + ], + "rotation": { + "angle": -45, + "axis": "y", + "origin": [ + 8, + 24, + 8 + ] + }, + "faces": { + "north": { + "uv": [ + 8.75, + 6, + 9.75, + 6.25 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 8.75, + 6.5, + 9.75, + 6.75 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 9, + 1, + 9.25 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 1.25, + 9, + 2.25, + 9.25 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 9.25, + 8, + 8.25, + 7 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 9.25, + 8.25, + 8.25, + 9.25 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 7, + 17, + 7 + ], + "to": [ + 9, + 20, + 9 + ], + "rotation": { + "angle": -45, + "axis": "y", + "origin": [ + 8, + 24, + 8 + ] + }, + "faces": { + "north": { + "uv": [ + 8.75, + 0, + 9.25, + 0.75 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 8.75, + 1, + 9.25, + 1.75 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 8.75, + 2, + 9.25, + 2.75 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 8.75, + 3, + 9.25, + 3.75 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 3, + 9.5, + 2.5, + 9 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 3.75, + 9, + 3.25, + 9.5 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 8.64645, + 18, + 4.89645 + ], + "to": [ + 9.64645, + 19, + 7.89645 + ], + "rotation": { + "angle": -45, + "axis": "y", + "origin": [ + 9.14645, + 18.5, + 6.89645 + ] + }, + "faces": { + "north": { + "uv": [ + 2, + 9.5, + 2.25, + 9.75 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 9.5, + 0.75, + 9.75 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 9.5, + 2, + 9.75, + 2.25 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 9.5, + 0, + 10.25, + 0.25 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 9.75, + 1.25, + 9.5, + 0.5 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 1.25, + 9.5, + 1, + 10.25 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 8.44645, + 17.8, + 4.69645 + ], + "to": [ + 9.84645, + 19.2, + 8.09645 + ], + "rotation": { + "angle": -45, + "axis": "y", + "origin": [ + 9.14645, + 18.5, + 6.89645 + ] + }, + "faces": { + "north": { + "uv": [ + 1.5, + 9.5, + 1.75, + 9.75 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 4, + 9, + 4.75, + 9.25 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 9.5, + 1.5, + 9.75, + 1.75 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 5, + 9, + 5.75, + 9.25 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 6.25, + 9.75, + 6, + 9 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 6.75, + 9, + 6.5, + 9.75 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 18.35, + 19.2, + 9.55 + ], + "to": [ + 16.95, + 17.8, + 6.15 + ], + "rotation": { + "angle": -45, + "axis": "y", + "origin": [ + 15.15, + 18.5, + -2.65 + ] + }, + "faces": { + "north": { + "uv": [ + 1.5, + 9.5, + 1.75, + 9.75 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 4, + 9, + 4.75, + 9.25 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 9.5, + 1.5, + 9.75, + 1.75 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 5, + 9, + 5.75, + 9.25 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 6.25, + 9.75, + 6, + 9 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 6.75, + 9, + 6.5, + 9.75 + ], + "texture": "#0" + } + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [ + 0, + -11.5, + -1 + ] + }, + "thirdperson_lefthand": { + "translation": [ + 0, + -12.25, + 0 + ] + }, + "firstperson_righthand": { + "rotation": [ + 17, + 163, + -21 + ], + "translation": [ + 1.5, + 1.75, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "firstperson_lefthand": { + "rotation": [ + -9, + 59, + 29 + ], + "translation": [ + 1.5, + 1.75, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "ground": { + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "gui": { + "rotation": [ + 24, + -180, + 22 + ], + "translation": [ + 0, + -1.5, + 0 + ], + "scale": [ + 0.7, + 0.7, + 0.7 + ] + }, + "head": { + "translation": [ + 0, + 14.25, + 0 + ] + }, + "fixed": { + "rotation": [ + 0, + 0, + 38 + ], + "translation": [ + 0, + -3.25, + 0 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/custom/chomperclosed.json b/src/main/resources/assets/hem/models/custom/chomperclosed.json new file mode 100644 index 0000000..f720b41 --- /dev/null +++ b/src/main/resources/assets/hem/models/custom/chomperclosed.json @@ -0,0 +1,168 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [ + 16, + 32 + ], + "ambientocclusion": false, + "elements": [ + { + "from": [ + 0, + 0, + 8 + ], + "to": [ + 16, + 32, + 8 + ], + "rotation": { + "angle": -45, + "axis": "y", + "origin": [ + 8, + 16, + 8 + ] + }, + "shade": false, + "faces": { + "north": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 0, + 16 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 0, + 16 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 8, + 0, + 0 + ], + "to": [ + 8, + 32, + 16 + ], + "rotation": { + "angle": -45, + "axis": "y", + "origin": [ + 8, + 16, + 8 + ] + }, + "shade": false, + "faces": { + "north": { + "uv": [ + 0, + 0, + 0, + 16 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 0, + 16 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "rotation": 90, + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "rotation": 270, + "texture": "#0" + } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/custom/giantlilypad.json b/src/main/resources/assets/hem/models/custom/giantlilypad.json new file mode 100644 index 0000000..e86f3d3 --- /dev/null +++ b/src/main/resources/assets/hem/models/custom/giantlilypad.json @@ -0,0 +1,728 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [ + 128, + 128 + ], + "elements": [ + { + "from": [ + -6, + 0.1, + -6 + ], + "to": [ + 22, + 0.1, + 22 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 0, + 0.1, + 0 + ] + }, + "faces": { + "north": { + "uv": [ + 5, + 2.625, + 8.5, + 2.625 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 6, + 5, + 9.5, + 5 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 6, + 5.125, + 9.5, + 5.125 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 6, + 5.25, + 9.5, + 5.25 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 3.5, + 3.5, + 0, + 0 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 3.5, + 0, + 0, + 3.5 + ], + "texture": "#0" + } + } + }, + { + "from": [ + -6, + 0.35, + -6 + ], + "to": [ + 22, + 0.35, + 22 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 0, + 0.35, + 0 + ] + }, + "faces": { + "north": { + "uv": [ + 5, + 2.625, + 8.5, + 2.625 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 6, + 5, + 9.5, + 5 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 6, + 5.125, + 9.5, + 5.125 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 6, + 5.25, + 9.5, + 5.25 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 3.5, + 7.125, + 0, + 3.625 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 3.5, + 3.625, + 0, + 7.125 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 4, + 0.5, + 4 + ], + "to": [ + 12, + 4.5, + 12 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 7, + 0.5, + 7 + ] + }, + "faces": { + "north": { + "uv": [ + 5, + 0.75, + 6, + 1.25 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 5, + 1.375, + 6, + 1.875 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 5, + 2, + 6, + 2.5 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 3.625, + 5, + 4.625, + 5.5 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 4.625, + 3.75, + 3.625, + 2.75 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 4.625, + 3.875, + 3.625, + 4.875 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 12, + 0.5, + 4 + ], + "to": [ + 4, + 4.5, + 12 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 15, + 0.5, + 7 + ] + }, + "faces": { + "north": { + "uv": [ + 5, + 0.75, + 6, + 1.25 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 5, + 1.375, + 6, + 1.875 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 5, + 2, + 6, + 2.5 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 3.625, + 5, + 4.625, + 5.5 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 4.625, + 3.75, + 3.625, + 2.75 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 4.625, + 3.875, + 3.625, + 4.875 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 3, + 0.2, + 3 + ], + "to": [ + 13, + 5.2, + 13 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 7, + 0.2, + 6 + ] + }, + "faces": { + "north": { + "uv": [ + 4.75, + 2.75, + 6, + 3.375 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 4.75, + 3.5, + 6, + 4.125 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 4.75, + 4.25, + 6, + 4.875 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 5, + 0, + 6.25, + 0.625 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 4.875, + 1.25, + 3.625, + 0 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 4.875, + 1.375, + 3.625, + 2.625 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 13, + 0.45, + 3 + ], + "to": [ + 3, + 5.45, + 13 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 17, + 0.45, + 6 + ] + }, + "faces": { + "north": { + "uv": [ + 4.75, + 2.75, + 6, + 3.375 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 4.75, + 3.5, + 6, + 4.125 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 4.75, + 4.25, + 6, + 4.875 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 5, + 0, + 6.25, + 0.625 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 4.875, + 1.25, + 3.625, + 0 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 4.875, + 1.375, + 3.625, + 2.625 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 6, + 0.8, + 6 + ], + "to": [ + 10, + 5.8, + 10 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 7, + -0.2, + 7 + ] + }, + "faces": { + "north": { + "uv": [ + 4.75, + 5, + 5.25, + 5.625 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 5.375, + 5, + 5.875, + 5.625 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 3.625, + 5.625, + 4.125, + 6.25 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 4.25, + 5.75, + 4.75, + 6.375 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 5.375, + 6.25, + 4.875, + 5.75 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 6, + 5.75, + 5.5, + 6.25 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 10, + 0.8, + 6 + ], + "to": [ + 6, + 5.8, + 10 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 11, + -0.2, + 7 + ] + }, + "faces": { + "north": { + "uv": [ + 4.75, + 5, + 5.25, + 5.625 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 5.375, + 5, + 5.875, + 5.625 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 3.625, + 5.625, + 4.125, + 6.25 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 4.25, + 5.75, + 4.75, + 6.375 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 5.375, + 6.25, + 4.875, + 5.75 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 6, + 5.75, + 5.5, + 6.25 + ], + "texture": "#0" + } + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [ + 0, + 3, + 0 + ], + "scale": [ + 0.3, + 0.3, + 0.3 + ] + }, + "thirdperson_lefthand": { + "translation": [ + 0, + 3, + 0 + ], + "scale": [ + 0.3, + 0.3, + 0.3 + ] + }, + "firstperson_righthand": { + "rotation": [ + 0, + 44, + 0 + ], + "translation": [ + -1, + 5.25, + 1.5 + ], + "scale": [ + 0.28, + 0.3, + 0.22 + ] + }, + "firstperson_lefthand": { + "rotation": [ + 0, + 36, + 0 + ], + "translation": [ + -0.75, + 5.25, + 1 + ], + "scale": [ + 0.24, + 0.3, + 0.19 + ] + }, + "ground": { + "scale": [ + 0.3, + 0.3, + 0.3 + ] + }, + "gui": { + "rotation": [ + 40, + 145, + 0 + ], + "translation": [ + 0, + 1.5, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "head": { + "translation": [ + 0, + 14.75, + 0 + ] + }, + "fixed": { + "rotation": [ + -90, + 0, + 0 + ], + "translation": [ + 0, + 0, + -9 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/custom/giantlilypadnoflower.json b/src/main/resources/assets/hem/models/custom/giantlilypadnoflower.json new file mode 100644 index 0000000..c483f8d --- /dev/null +++ b/src/main/resources/assets/hem/models/custom/giantlilypadnoflower.json @@ -0,0 +1,266 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [ + 128, + 128 + ], + "elements": [ + { + "from": [ + -6, + 0.1, + -6 + ], + "to": [ + 22, + 0.1, + 22 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 0, + 0.1, + 0 + ] + }, + "faces": { + "north": { + "uv": [ + 5, + 2.625, + 8.5, + 2.625 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 6, + 5, + 9.5, + 5 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 6, + 5.125, + 9.5, + 5.125 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 6, + 5.25, + 9.5, + 5.25 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 3.5, + 3.5, + 0, + 0 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 3.5, + 0, + 0, + 3.5 + ], + "texture": "#0" + } + } + }, + { + "from": [ + -6, + 0.35, + -6 + ], + "to": [ + 22, + 0.35, + 22 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 0, + 0.35, + 0 + ] + }, + "faces": { + "north": { + "uv": [ + 5, + 2.625, + 8.5, + 2.625 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 6, + 5, + 9.5, + 5 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 6, + 5.125, + 9.5, + 5.125 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 6, + 5.25, + 9.5, + 5.25 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 3.5, + 7.125, + 0, + 3.625 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 3.5, + 3.625, + 0, + 7.125 + ], + "texture": "#0" + } + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [ + 0, + 3, + 0 + ], + "scale": [ + 0.3, + 0.3, + 0.3 + ] + }, + "thirdperson_lefthand": { + "translation": [ + 0, + 3, + 0 + ], + "scale": [ + 0.3, + 0.3, + 0.3 + ] + }, + "firstperson_righthand": { + "rotation": [ + 0, + 44, + 0 + ], + "translation": [ + -1, + 5.25, + 1.5 + ], + "scale": [ + 0.28, + 0.3, + 0.22 + ] + }, + "firstperson_lefthand": { + "rotation": [ + 0, + 36, + 0 + ], + "translation": [ + -0.75, + 5.25, + 1 + ], + "scale": [ + 0.24, + 0.3, + 0.19 + ] + }, + "ground": { + "scale": [ + 0.3, + 0.3, + 0.3 + ] + }, + "gui": { + "rotation": [ + 40, + 145, + 0 + ], + "translation": [ + 0, + 1.5, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "head": { + "translation": [ + 0, + 14.75, + 0 + ] + }, + "fixed": { + "rotation": [ + -90, + 0, + 0 + ], + "translation": [ + 0, + 0, + -9 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/custom/lavender.json b/src/main/resources/assets/hem/models/custom/lavender.json new file mode 100644 index 0000000..e10c54c --- /dev/null +++ b/src/main/resources/assets/hem/models/custom/lavender.json @@ -0,0 +1,168 @@ +{ + "credit": "Made with Blockbench", + "ambientocclusion": false, + "texture_size": [ + 16, + 32 + ], + "elements": [ + { + "from": [ + 0, + 0, + 8 + ], + "to": [ + 16, + 32, + 8 + ], + "rotation": { + "angle": -45, + "axis": "y", + "origin": [ + 8, + 16, + 8 + ] + }, + "shade": false, + "faces": { + "north": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 0, + 16 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 0, + 16 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 8, + 0, + 0 + ], + "to": [ + 8, + 32, + 16 + ], + "rotation": { + "angle": -45, + "axis": "y", + "origin": [ + 8, + 16, + 8 + ] + }, + "shade": false, + "faces": { + "north": { + "uv": [ + 0, + 0, + 0, + 16 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 0, + 16 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "rotation": 90, + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "rotation": 270, + "texture": "#0" + } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/custom/leafpile.json b/src/main/resources/assets/hem/models/custom/leafpile.json new file mode 100644 index 0000000..97091ed --- /dev/null +++ b/src/main/resources/assets/hem/models/custom/leafpile.json @@ -0,0 +1,99 @@ +{ + "credit": "Made with Blockbench", + "elements": [ + { + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 1, + 16 + ], + "faces": { + "north": { + "uv": [ + 7.968, + 7.032, + 7.032, + 7.968 + ], + "texture": "#1" + }, + "east": { + "uv": [ + 7.032, + 7.032, + 7.968, + 7.968 + ], + "texture": "#1" + }, + "south": { + "uv": [ + 7.032, + 7.032, + 7.968, + 7.968 + ], + "texture": "#1" + }, + "west": { + "uv": [ + 7.032, + 7.032, + 7.968, + 7.968 + ], + "texture": "#1" + }, + "up": { + "uv": [ + 0.032, + 0.032, + 15.968, + 15.968 + ], + "texture": "#1" + }, + "down": { + "uv": [ + 0.032, + 0.032, + 15.968, + 15.968 + ], + "texture": "#1" + } + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [ + 0, + 2.25, + 0 + ], + "scale": [ + 0.3, + 0.3, + 0.3 + ] + }, + "thirdperson_lefthand": { + "translation": [ + 0, + 2.25, + 0 + ], + "scale": [ + 0.3, + 0.3, + 0.3 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/custom/leafpilewaterlogged.json b/src/main/resources/assets/hem/models/custom/leafpilewaterlogged.json new file mode 100644 index 0000000..706fab6 --- /dev/null +++ b/src/main/resources/assets/hem/models/custom/leafpilewaterlogged.json @@ -0,0 +1,82 @@ +{ + "credit": "Made with Blockbench", + "elements": [ + { + "from": [ + 0, + 15, + 0 + ], + "to": [ + 16, + 16, + 16 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 0, + 15, + 0 + ] + }, + "faces": { + "north": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "texture": "#1" + }, + "east": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "texture": "#1" + }, + "south": { + "uv": [ + 0, + 0, + 16, + 1 + ], + "texture": "#1" + }, + "west": { + "uv": [ + 0, + 3, + 16, + 4 + ], + "texture": "#1" + }, + "up": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#1" + }, + "down": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#1" + } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/custom/leaves.json b/src/main/resources/assets/hem/models/custom/leaves.json new file mode 100644 index 0000000..74a2877 --- /dev/null +++ b/src/main/resources/assets/hem/models/custom/leaves.json @@ -0,0 +1,283 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [ + 30, + 60 + ], + "elements": [ + { + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ], + "shade": true, + "faces": { + "north": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + } + } + }, + { + "from": [ + -8, + -5, + 8 + ], + "to": [ + 22, + 11, + 8 + ], + "rotation": { + "angle": 45, + "axis": "y", + "origin": [ + 7, + 11, + 8 + ] + }, + "shade": false, + "faces": { + "north": { + "uv": [ + 0, + 0, + 16, + 8 + ], + "texture": "#1" + }, + "east": { + "uv": [ + 0, + 0, + 0, + 8 + ], + "texture": "#1" + }, + "south": { + "uv": [ + 0, + 0, + 16, + 8 + ], + "texture": "#1" + }, + "west": { + "uv": [ + 0, + 0, + 0, + 8 + ], + "texture": "#1" + }, + "up": { + "uv": [ + 0, + 8, + 0, + 0 + ], + "texture": "#1" + }, + "down": { + "uv": [ + 0, + 0, + 0, + 8 + ], + "texture": "#1" + } + } + }, + { + "from": [ + -8, + -5, + 8 + ], + "to": [ + 22, + 11, + 8 + ], + "rotation": { + "angle": -45, + "axis": "y", + "origin": [ + 7, + 11, + 8 + ] + }, + "shade": false, + "faces": { + "north": { + "uv": [ + 0, + 8, + 16, + 16 + ], + "texture": "#1" + }, + "east": { + "uv": [ + 0, + 0, + 0, + 8 + ], + "texture": "#1" + }, + "south": { + "uv": [ + 0, + 8, + 16, + 16 + ], + "texture": "#1" + }, + "west": { + "uv": [ + 0, + 0, + 0, + 8 + ], + "texture": "#1" + }, + "up": { + "uv": [ + 16, + 0, + 0, + 0 + ], + "texture": "#1" + }, + "down": { + "uv": [ + 16, + 0, + 0, + 0 + ], + "texture": "#1" + } + } + } + ], + "display": { + "thirdperson_righthand": { + "scale": [ + 0.3, + 0.3, + 0.3 + ] + }, + "thirdperson_lefthand": { + "scale": [ + 0.3, + 0.3, + 0.3 + ] + }, + "firstperson_righthand": { + "scale": [ + 0.3, + 0.3, + 0.3 + ] + }, + "firstperson_lefthand": { + "scale": [ + 0.3, + 0.3, + 0.3 + ] + }, + "ground": { + "scale": [ + 0.3, + 0.3, + 0.3 + ] + }, + "gui": { + "rotation": [ + 32, + -45, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/custom/openmuncher.json b/src/main/resources/assets/hem/models/custom/openmuncher.json new file mode 100644 index 0000000..7eff905 --- /dev/null +++ b/src/main/resources/assets/hem/models/custom/openmuncher.json @@ -0,0 +1,653 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [ + 64, + 64 + ], + "elements": [ + { + "from": [ + 7, + 0, + 7 + ], + "to": [ + 9, + 3, + 9 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 7, + 0, + 7 + ] + }, + "faces": { + "north": { + "uv": [ + 15, + 2, + 15.5, + 2.75 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 15, + 2.75, + 15.5, + 3.5 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 3, + 15, + 3.5, + 15.75 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 3.5, + 15, + 4, + 15.75 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 15.5, + 4, + 15, + 3.5 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 4.5, + 15, + 4, + 15.5 + ], + "texture": "#0" + } + } + }, + { + "from": [ + 6, + 2.8, + 6 + ], + "to": [ + 10, + 4.8, + 10 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 7, + 2.8, + 7 + ] + }, + "faces": { + "north": { + "uv": [ + 1, + 15, + 2, + 15.5 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 15, + 1, + 16, + 1.5 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 15, + 1.5, + 16, + 2 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 2, + 15, + 3, + 15.5 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 1, + 16, + 0, + 15 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 16, + 0, + 15, + 1 + ], + "texture": "#0" + } + } + }, + { + "from": [ + -7, + 3.3, + -7 + ], + "to": [ + 23, + 3.3, + 23 + ], + "rotation": { + "angle": 45, + "axis": "y", + "origin": [ + 8, + 3.3, + 8 + ] + }, + "faces": { + "north": { + "uv": [ + 0, + 0, + 7.5, + 0 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 7.5, + 0 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 7.5, + 0 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 7.5, + 0 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 7.5, + 7.5, + 0, + 0 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 7.5, + 0, + 0, + 7.5 + ], + "texture": "#0" + } + } + }, + { + "from": [ + -7, + 4.05, + -7 + ], + "to": [ + 23, + 4.05, + 23 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 8, + 4.05, + 8 + ] + }, + "faces": { + "north": { + "uv": [ + 0, + 0, + 7.5, + 0 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 7.5, + 0 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 7.5, + 0 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 7.5, + 0 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 7.5, + 7.5, + 0, + 0 + ], + "rotation": 90, + "texture": "#0" + }, + "down": { + "uv": [ + 7.5, + 0, + 0, + 7.5 + ], + "rotation": 270, + "texture": "#0" + } + } + }, + { + "from": [ + -7, + 5.25, + -7 + ], + "to": [ + 23, + 5.25, + 23 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 7, + 5.25, + 7 + ] + }, + "faces": { + "north": { + "uv": [ + 0, + 0, + 7.5, + 0 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 7.5, + 0 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 7.5, + 0 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 7.5, + 0 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 15, + 15, + 7.5, + 7.5 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 15, + 7.5, + 7.5, + 15 + ], + "texture": "#0" + } + } + }, + { + "from": [ + -7, + 5.3, + -7 + ], + "to": [ + 23, + 5.3, + 23 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 7, + 5.3, + 7 + ] + }, + "faces": { + "north": { + "uv": [ + 0, + 0, + 7.5, + 0 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 7.5, + 0 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 7.5, + 0 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 7.5, + 0 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 15, + 15, + 7.5, + 7.5 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 15, + 7.5, + 7.5, + 15 + ], + "texture": "#0" + } + } + }, + { + "from": [ + -7, + 5, + -7 + ], + "to": [ + 23, + 5, + 23 + ], + "rotation": { + "angle": 0, + "axis": "y", + "origin": [ + 7, + 5, + 7 + ] + }, + "faces": { + "north": { + "uv": [ + 0, + 0, + 7.5, + 0 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 7.5, + 0 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 7.5, + 0 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 7.5, + 0 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 15, + 7.5, + 7.5, + 0 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 15, + 0, + 7.5, + 7.5 + ], + "texture": "#0" + } + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [ + 0, + 2, + 0 + ], + "scale": [ + 0.3, + 0.3, + 0.3 + ] + }, + "thirdperson_lefthand": { + "translation": [ + 0, + 2.25, + 0 + ], + "scale": [ + 0.3, + 0.3, + 0.3 + ] + }, + "firstperson_righthand": { + "rotation": [ + 57, + 0, + 0 + ], + "translation": [ + 0, + 4, + 0 + ], + "scale": [ + 0.3, + 0.3, + 0.3 + ] + }, + "firstperson_lefthand": { + "rotation": [ + 57, + 0, + 0 + ], + "translation": [ + 0, + 4, + 0 + ], + "scale": [ + 0.3, + 0.3, + 0.3 + ] + }, + "ground": { + "translation": [ + 0, + 0.75, + 0 + ], + "scale": [ + 0.3, + 0.3, + 0.3 + ] + }, + "gui": { + "rotation": [ + 46, + 0, + 0 + ], + "scale": [ + 0.4, + 0.4, + 0.4 + ] + }, + "head": { + "translation": [ + 0, + 11.75, + 0 + ] + }, + "fixed": { + "rotation": [ + -90, + 0, + 0 + ], + "translation": [ + 0, + 0, + -4.75 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/custom/shadedcrossmodel.json b/src/main/resources/assets/hem/models/custom/shadedcrossmodel.json new file mode 100644 index 0000000..399e3c0 --- /dev/null +++ b/src/main/resources/assets/hem/models/custom/shadedcrossmodel.json @@ -0,0 +1,162 @@ +{ + "credit": "Made with Blockbench", + "ambientocclusion": false, + "elements": [ + { + "from": [ + -2, + 0, + 8 + ], + "to": [ + 18, + 16, + 8 + ], + "rotation": { + "angle": -45, + "axis": "y", + "origin": [ + 8, + 0, + 8 + ] + }, + "faces": { + "north": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 0, + 16 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 0, + 16 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "rotation": 180, + "texture": "#0" + }, + "down": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "rotation": 180, + "texture": "#0" + } + } + }, + { + "from": [ + -2, + 0, + 8 + ], + "to": [ + 18, + 16, + 8 + ], + "rotation": { + "angle": 45, + "axis": "y", + "origin": [ + 8, + 0, + 8 + ] + }, + "faces": { + "north": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 0, + 16 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 0, + 16 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 16, + 0, + 0, + 0 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 16, + 0, + 0, + 0 + ], + "texture": "#0" + } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/custom/wheat.json b/src/main/resources/assets/hem/models/custom/wheat.json new file mode 100644 index 0000000..674672d --- /dev/null +++ b/src/main/resources/assets/hem/models/custom/wheat.json @@ -0,0 +1,168 @@ +{ + "credit": "Made with Blockbench", + "ambientocclusion": false, + "texture_size": [ + 16, + 32 + ], + "elements": [ + { + "from": [ + 0, + 0, + 8 + ], + "to": [ + 16, + 32, + 8 + ], + "rotation": { + "angle": -45, + "axis": "y", + "origin": [ + 8, + 16, + 8 + ] + }, + "shade": false, + "faces": { + "north": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 0, + 0, + 16 + ], + "texture": "#missing" + }, + "south": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 0, + 0, + 0, + 16 + ], + "texture": "#missing" + }, + "up": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "texture": "#missing" + }, + "down": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "texture": "#missing" + } + } + }, + { + "from": [ + 8, + 0, + 0 + ], + "to": [ + 8, + 32, + 16 + ], + "rotation": { + "angle": -45, + "axis": "y", + "origin": [ + 8, + 16, + 8 + ] + }, + "shade": false, + "faces": { + "north": { + "uv": [ + 0, + 0, + 0, + 16 + ], + "texture": "#missing" + }, + "east": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 0, + 0, + 0, + 16 + ], + "texture": "#missing" + }, + "west": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "rotation": 90, + "texture": "#missing" + }, + "down": { + "uv": [ + 0, + 0, + 16, + 0 + ], + "rotation": 270, + "texture": "#missing" + } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/airboat_spawn_egg.json b/src/main/resources/assets/hem/models/item/airboat_spawn_egg.json new file mode 100644 index 0000000..7a2c6da --- /dev/null +++ b/src/main/resources/assets/hem/models/item/airboat_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/ant_hill.json b/src/main/resources/assets/hem/models/item/ant_hill.json new file mode 100644 index 0000000..a9e21e0 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/ant_hill.json @@ -0,0 +1,22 @@ +{ + "parent": "hem:block/ant_hill", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/ants.json b/src/main/resources/assets/hem/models/item/ants.json new file mode 100644 index 0000000..c8c646d --- /dev/null +++ b/src/main/resources/assets/hem/models/item/ants.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:items/ant" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/bloomed_bulb_flower.json b/src/main/resources/assets/hem/models/item/bloomed_bulb_flower.json new file mode 100644 index 0000000..01cf403 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/bloomed_bulb_flower.json @@ -0,0 +1,22 @@ +{ + "parent": "hem:block/bloomed_bulb_flower", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/bloomed_muncher.json b/src/main/resources/assets/hem/models/item/bloomed_muncher.json new file mode 100644 index 0000000..1a1fdc1 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/bloomed_muncher.json @@ -0,0 +1,22 @@ +{ + "parent": "hem:block/bloomed_muncher", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf.json b/src/main/resources/assets/hem/models/item/blueleaf.json new file mode 100644 index 0000000..b7c85e8 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:items/blueleafgrasstall" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_blossomer.json b/src/main/resources/assets/hem/models/item/blueleaf_blossomer.json new file mode 100644 index 0000000..f414cef --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_blossomer.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:blocks/blueleafblossomer" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_brown_cap.json b/src/main/resources/assets/hem/models/item/blueleaf_brown_cap.json new file mode 100644 index 0000000..942b277 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_brown_cap.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:blocks/blueleafbrowncap" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_butter_slump.json b/src/main/resources/assets/hem/models/item/blueleaf_butter_slump.json new file mode 100644 index 0000000..87551ec --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_butter_slump.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:blocks/blueleafbutterslump" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_cabbage_flower.json b/src/main/resources/assets/hem/models/item/blueleaf_cabbage_flower.json new file mode 100644 index 0000000..924bc6d --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_cabbage_flower.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:blocks/blueleafyoungcabbageflowerr" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_cobblestone.json b/src/main/resources/assets/hem/models/item/blueleaf_cobblestone.json new file mode 100644 index 0000000..1cb4440 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_cobblestone.json @@ -0,0 +1,22 @@ +{ + "parent": "hem:block/blueleaf_cobblestone", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_cobblestone_slab.json b/src/main/resources/assets/hem/models/item/blueleaf_cobblestone_slab.json new file mode 100644 index 0000000..e6535a3 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_cobblestone_slab.json @@ -0,0 +1,22 @@ +{ + "parent": "hem:block/blueleaf_cobblestone_slab", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_cobblestone_stairs.json b/src/main/resources/assets/hem/models/item/blueleaf_cobblestone_stairs.json new file mode 100644 index 0000000..e7f2b1d --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_cobblestone_stairs.json @@ -0,0 +1,22 @@ +{ + "parent": "hem:block/blueleaf_cobblestone_stairs", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_cobblestone_wall.json b/src/main/resources/assets/hem/models/item/blueleaf_cobblestone_wall.json new file mode 100644 index 0000000..b0a0b29 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_cobblestone_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "hem:block/blueleaf_cobblestone_wall_inventory" +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_dead_log.json b/src/main/resources/assets/hem/models/item/blueleaf_dead_log.json new file mode 100644 index 0000000..68fb9b0 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_dead_log.json @@ -0,0 +1,22 @@ +{ + "parent": "hem:block/blueleaf_dead_log", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_dirt_block.json b/src/main/resources/assets/hem/models/item/blueleaf_dirt_block.json new file mode 100644 index 0000000..18ad2ea --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_dirt_block.json @@ -0,0 +1,22 @@ +{ + "parent": "hem:block/blueleaf_dirt_block", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_dirt_grass_block.json b/src/main/resources/assets/hem/models/item/blueleaf_dirt_grass_block.json new file mode 100644 index 0000000..930482e --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_dirt_grass_block.json @@ -0,0 +1,22 @@ +{ + "parent": "hem:block/blueleaf_dirt_grass_block", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_fluorescent_leaves.json b/src/main/resources/assets/hem/models/item/blueleaf_fluorescent_leaves.json new file mode 100644 index 0000000..63aa87d --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_fluorescent_leaves.json @@ -0,0 +1,22 @@ +{ + "parent": "hem:block/blueleaf_fluorescent_leaves", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_grass.json b/src/main/resources/assets/hem/models/item/blueleaf_grass.json new file mode 100644 index 0000000..b7c85e8 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_grass.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:items/blueleafgrasstall" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_grass_block.json b/src/main/resources/assets/hem/models/item/blueleaf_grass_block.json new file mode 100644 index 0000000..113637f --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_grass_block.json @@ -0,0 +1,22 @@ +{ + "parent": "hem:block/blueleaf_grass_block", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_gravel_mud.json b/src/main/resources/assets/hem/models/item/blueleaf_gravel_mud.json new file mode 100644 index 0000000..518f817 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_gravel_mud.json @@ -0,0 +1,22 @@ +{ + "parent": "hem:block/blueleaf_gravel_mud", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_green_cap.json b/src/main/resources/assets/hem/models/item/blueleaf_green_cap.json new file mode 100644 index 0000000..9ece656 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_green_cap.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:blocks/blueleafgreencap" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_lavender.json b/src/main/resources/assets/hem/models/item/blueleaf_lavender.json new file mode 100644 index 0000000..6d6d952 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_lavender.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:items/lavenderblueleaftop" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_leaves.json b/src/main/resources/assets/hem/models/item/blueleaf_leaves.json new file mode 100644 index 0000000..76c807d --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_leaves.json @@ -0,0 +1,22 @@ +{ + "parent": "hem:block/blueleaf_leaves", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_lily_pad.json b/src/main/resources/assets/hem/models/item/blueleaf_lily_pad.json new file mode 100644 index 0000000..fee0c97 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_lily_pad.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:items/lilypad" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_log.json b/src/main/resources/assets/hem/models/item/blueleaf_log.json new file mode 100644 index 0000000..82fb3c8 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_log.json @@ -0,0 +1,22 @@ +{ + "parent": "hem:block/blueleaf_log", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_lush_leaves.json b/src/main/resources/assets/hem/models/item/blueleaf_lush_leaves.json new file mode 100644 index 0000000..dcbaf3b --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_lush_leaves.json @@ -0,0 +1,22 @@ +{ + "parent": "hem:block/blueleaf_lush_leaves", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_mature_blossomer.json b/src/main/resources/assets/hem/models/item/blueleaf_mature_blossomer.json new file mode 100644 index 0000000..c1c44eb --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_mature_blossomer.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:blocks/blueleafmatureblossomer" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_mature_cabbage_flower.json b/src/main/resources/assets/hem/models/item/blueleaf_mature_cabbage_flower.json new file mode 100644 index 0000000..e6c7d81 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_mature_cabbage_flower.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:blocks/blueleafmaturecabbageflower" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_mud.json b/src/main/resources/assets/hem/models/item/blueleaf_mud.json new file mode 100644 index 0000000..519ddb6 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_mud.json @@ -0,0 +1,22 @@ +{ + "parent": "hem:block/blueleaf_mud", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_red_cap.json b/src/main/resources/assets/hem/models/item/blueleaf_red_cap.json new file mode 100644 index 0000000..f91fe01 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_red_cap.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:blocks/blueleafredcap" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_redwood_leaves.json b/src/main/resources/assets/hem/models/item/blueleaf_redwood_leaves.json new file mode 100644 index 0000000..d5cecac --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_redwood_leaves.json @@ -0,0 +1,22 @@ +{ + "parent": "hem:block/blueleaf_redwood_leaves", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_redwood_log.json b/src/main/resources/assets/hem/models/item/blueleaf_redwood_log.json new file mode 100644 index 0000000..01b14a5 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_redwood_log.json @@ -0,0 +1,22 @@ +{ + "parent": "hem:block/blueleaf_redwood_log", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_sea_grass.json b/src/main/resources/assets/hem/models/item/blueleaf_sea_grass.json new file mode 100644 index 0000000..292d887 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_sea_grass.json @@ -0,0 +1,22 @@ +{ + "parent": "hem:block/blueleaf_sea_grass", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_stone.json b/src/main/resources/assets/hem/models/item/blueleaf_stone.json new file mode 100644 index 0000000..5efe33a --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_stone.json @@ -0,0 +1,22 @@ +{ + "parent": "hem:block/blueleaf_stone", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_stone_gravel.json b/src/main/resources/assets/hem/models/item/blueleaf_stone_gravel.json new file mode 100644 index 0000000..88d8e46 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_stone_gravel.json @@ -0,0 +1,22 @@ +{ + "parent": "hem:block/blueleaf_stone_gravel", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_stone_slab.json b/src/main/resources/assets/hem/models/item/blueleaf_stone_slab.json new file mode 100644 index 0000000..4afe764 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_stone_slab.json @@ -0,0 +1,22 @@ +{ + "parent": "hem:block/blueleaf_stone_slab", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_stone_stair.json b/src/main/resources/assets/hem/models/item/blueleaf_stone_stair.json new file mode 100644 index 0000000..822ccb4 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_stone_stair.json @@ -0,0 +1,22 @@ +{ + "parent": "hem:block/blueleaf_stone_stair", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_stone_wall.json b/src/main/resources/assets/hem/models/item/blueleaf_stone_wall.json new file mode 100644 index 0000000..087a2a2 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_stone_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "hem:block/blueleaf_stone_wall_inventory" +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_tall_blooming_flower.json b/src/main/resources/assets/hem/models/item/blueleaf_tall_blooming_flower.json new file mode 100644 index 0000000..d077363 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_tall_blooming_flower.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:blocks/blueleafbloomingflower" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_tall_grass.json b/src/main/resources/assets/hem/models/item/blueleaf_tall_grass.json new file mode 100644 index 0000000..f22caea --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_tall_grass.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:blocks/blueleaftallgrasstop" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_tall_sprout.json b/src/main/resources/assets/hem/models/item/blueleaf_tall_sprout.json new file mode 100644 index 0000000..d00dc93 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_tall_sprout.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:blocks/blueleafsprouttop" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_wheat.json b/src/main/resources/assets/hem/models/item/blueleaf_wheat.json new file mode 100644 index 0000000..7d8ad10 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_wheat.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:items/wheat" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/blueleaf_wood.json b/src/main/resources/assets/hem/models/item/blueleaf_wood.json new file mode 100644 index 0000000..eefd552 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/blueleaf_wood.json @@ -0,0 +1,22 @@ +{ + "parent": "hem:block/blueleaf_wood", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/bulb_flower.json b/src/main/resources/assets/hem/models/item/bulb_flower.json new file mode 100644 index 0000000..6f9d4ab --- /dev/null +++ b/src/main/resources/assets/hem/models/item/bulb_flower.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:items/blueleafearlybulbflowertop" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/butterfly_spawn_egg.json b/src/main/resources/assets/hem/models/item/butterfly_spawn_egg.json new file mode 100644 index 0000000..dcc615b --- /dev/null +++ b/src/main/resources/assets/hem/models/item/butterfly_spawn_egg.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:items/butterfly" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/dangling_fluorescent_leaves.json b/src/main/resources/assets/hem/models/item/dangling_fluorescent_leaves.json new file mode 100644 index 0000000..2ea1279 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/dangling_fluorescent_leaves.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:items/danglingfluorescentleaves" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/dormant_aged_emberleaf_military_bot_spawn_egg.json b/src/main/resources/assets/hem/models/item/dormant_aged_emberleaf_military_bot_spawn_egg.json new file mode 100644 index 0000000..7a2c6da --- /dev/null +++ b/src/main/resources/assets/hem/models/item/dormant_aged_emberleaf_military_bot_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/dormant_emberleaf_military_bot_spawn_egg.json b/src/main/resources/assets/hem/models/item/dormant_emberleaf_military_bot_spawn_egg.json new file mode 100644 index 0000000..7a2c6da --- /dev/null +++ b/src/main/resources/assets/hem/models/item/dormant_emberleaf_military_bot_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/emberleaf_military_bot_spawn_egg.json b/src/main/resources/assets/hem/models/item/emberleaf_military_bot_spawn_egg.json new file mode 100644 index 0000000..7a2c6da --- /dev/null +++ b/src/main/resources/assets/hem/models/item/emberleaf_military_bot_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/emberleaf_military_robot_lower_half_spawn_egg.json b/src/main/resources/assets/hem/models/item/emberleaf_military_robot_lower_half_spawn_egg.json new file mode 100644 index 0000000..7a2c6da --- /dev/null +++ b/src/main/resources/assets/hem/models/item/emberleaf_military_robot_lower_half_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/emberleaf_military_robot_upper_half_spawn_egg.json b/src/main/resources/assets/hem/models/item/emberleaf_military_robot_upper_half_spawn_egg.json new file mode 100644 index 0000000..7a2c6da --- /dev/null +++ b/src/main/resources/assets/hem/models/item/emberleaf_military_robot_upper_half_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/fallen_leaves.json b/src/main/resources/assets/hem/models/item/fallen_leaves.json new file mode 100644 index 0000000..575e3ae --- /dev/null +++ b/src/main/resources/assets/hem/models/item/fallen_leaves.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:items/blueleafdefaultleavessparse" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/fluffalo_spawn_egg.json b/src/main/resources/assets/hem/models/item/fluffalo_spawn_egg.json new file mode 100644 index 0000000..7a2c6da --- /dev/null +++ b/src/main/resources/assets/hem/models/item/fluffalo_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/fluffalo_tuft.json b/src/main/resources/assets/hem/models/item/fluffalo_tuft.json new file mode 100644 index 0000000..1d3ded6 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/fluffalo_tuft.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:items/fluffalotuft" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/gas_canister_612litre.json b/src/main/resources/assets/hem/models/item/gas_canister_612litre.json new file mode 100644 index 0000000..5b21928 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/gas_canister_612litre.json @@ -0,0 +1,7 @@ +{ + "parent": "hem:custom/canister612l", + "textures": { + "0": "hem:blocks/612lcanister", + "particle": "hem:items/612lcanister" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/giant_lily_pad.json b/src/main/resources/assets/hem/models/item/giant_lily_pad.json new file mode 100644 index 0000000..a96084c --- /dev/null +++ b/src/main/resources/assets/hem/models/item/giant_lily_pad.json @@ -0,0 +1,22 @@ +{ + "parent": "hem:block/giant_lily_pad", + "display": { + "thirdperson": { + "rotation": [ + 10, + -45, + 170 + ], + "translation": [ + 0, + 1.5, + -2.75 + ], + "scale": [ + 0.375, + 0.375, + 0.375 + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/gold_fish_item.json b/src/main/resources/assets/hem/models/item/gold_fish_item.json new file mode 100644 index 0000000..1724e11 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/gold_fish_item.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:items/goldfish" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/gold_fish_spawn_egg.json b/src/main/resources/assets/hem/models/item/gold_fish_spawn_egg.json new file mode 100644 index 0000000..7a2c6da --- /dev/null +++ b/src/main/resources/assets/hem/models/item/gold_fish_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/hot_air_balloon_item.json b/src/main/resources/assets/hem/models/item/hot_air_balloon_item.json new file mode 100644 index 0000000..d973ece --- /dev/null +++ b/src/main/resources/assets/hem/models/item/hot_air_balloon_item.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:items/hotairballoonitem" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/ladybug_spawn_egg.json b/src/main/resources/assets/hem/models/item/ladybug_spawn_egg.json new file mode 100644 index 0000000..7403659 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/ladybug_spawn_egg.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:items/ladybird" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/muncher.json b/src/main/resources/assets/hem/models/item/muncher.json new file mode 100644 index 0000000..00eac14 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/muncher.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:items/chompertop" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/muncher_sprout.json b/src/main/resources/assets/hem/models/item/muncher_sprout.json new file mode 100644 index 0000000..b65dde3 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/muncher_sprout.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:blocks/munchersprout" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/tiger_fish_item.json b/src/main/resources/assets/hem/models/item/tiger_fish_item.json new file mode 100644 index 0000000..9721561 --- /dev/null +++ b/src/main/resources/assets/hem/models/item/tiger_fish_item.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "hem:items/tigerfish" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/models/item/tiger_fish_spawn_egg.json b/src/main/resources/assets/hem/models/item/tiger_fish_spawn_egg.json new file mode 100644 index 0000000..7a2c6da --- /dev/null +++ b/src/main/resources/assets/hem/models/item/tiger_fish_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/particles/blue_leaves.json b/src/main/resources/assets/hem/particles/blue_leaves.json new file mode 100644 index 0000000..9dfff49 --- /dev/null +++ b/src/main/resources/assets/hem/particles/blue_leaves.json @@ -0,0 +1,8 @@ +{ + "textures": [ + "hem:blue_leaves_1", + "hem:blue_leaves_2", + "hem:blue_leaves_3", + "hem:blue_leaves_4" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/particles/blueleaf_ambience.json b/src/main/resources/assets/hem/particles/blueleaf_ambience.json new file mode 100644 index 0000000..46bde0a --- /dev/null +++ b/src/main/resources/assets/hem/particles/blueleaf_ambience.json @@ -0,0 +1,8 @@ +{ + "textures": [ + "hem:blueleaf_ambience_1", + "hem:blueleaf_ambience_2", + "hem:blueleaf_ambience_3", + "hem:blueleaf_ambience_4" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/particles/fluorescent_leaves_particles.json b/src/main/resources/assets/hem/particles/fluorescent_leaves_particles.json new file mode 100644 index 0000000..337237a --- /dev/null +++ b/src/main/resources/assets/hem/particles/fluorescent_leaves_particles.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "hem:fluorescent_leaves_particles_1", + "hem:fluorescent_leaves_particles_2", + "hem:fluorescent_leaves_particles_3", + "hem:fluorescent_leaves_particles_4", + "hem:fluorescent_leaves_particles_5", + "hem:fluorescent_leaves_particles_6", + "hem:fluorescent_leaves_particles_7", + "hem:fluorescent_leaves_particles_8" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/particles/lavender_particles.json b/src/main/resources/assets/hem/particles/lavender_particles.json new file mode 100644 index 0000000..5e9644b --- /dev/null +++ b/src/main/resources/assets/hem/particles/lavender_particles.json @@ -0,0 +1,9 @@ +{ + "textures": [ + "hem:lavender_particles_1", + "hem:lavender_particles_2", + "hem:lavender_particles_3", + "hem:lavender_particles_4", + "hem:lavender_particles_5" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/particles/lily_pad_particles.json b/src/main/resources/assets/hem/particles/lily_pad_particles.json new file mode 100644 index 0000000..b1e13c2 --- /dev/null +++ b/src/main/resources/assets/hem/particles/lily_pad_particles.json @@ -0,0 +1,8 @@ +{ + "textures": [ + "hem:lily_pad_particles_1", + "hem:lily_pad_particles_2", + "hem:lily_pad_particles_3", + "hem:lily_pad_particles_4" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/particles/robot_damage.json b/src/main/resources/assets/hem/particles/robot_damage.json new file mode 100644 index 0000000..7f8927f --- /dev/null +++ b/src/main/resources/assets/hem/particles/robot_damage.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "hem:robot_damage_1", + "hem:robot_damage_2", + "hem:robot_damage_3", + "hem:robot_damage_4", + "hem:robot_damage_5", + "hem:robot_damage_6", + "hem:robot_damage_7", + "hem:robot_damage_8" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/particles/severe_damage_particles.json b/src/main/resources/assets/hem/particles/severe_damage_particles.json new file mode 100644 index 0000000..3608bd3 --- /dev/null +++ b/src/main/resources/assets/hem/particles/severe_damage_particles.json @@ -0,0 +1,8 @@ +{ + "textures": [ + "hem:severe_damage_particles_1", + "hem:severe_damage_particles_2", + "hem:severe_damage_particles_3", + "hem:severe_damage_particles_4" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/textures/blocks/612lcanister.png b/src/main/resources/assets/hem/textures/blocks/612lcanister.png new file mode 100644 index 0000000000000000000000000000000000000000..03debe0d585518d2b83c70634873c5acfe495689 GIT binary patch literal 1576 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/ants-sheet.png.mcmeta b/src/main/resources/assets/hem/textures/blocks/ants-sheet.png.mcmeta new file mode 100644 index 0000000..2910908 --- /dev/null +++ b/src/main/resources/assets/hem/textures/blocks/ants-sheet.png.mcmeta @@ -0,0 +1,26 @@ +{ + "animation": { + "frametime": 2, + "interpolate": false, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafbloomingflower.png b/src/main/resources/assets/hem/textures/blocks/blueleafbloomingflower.png new file mode 100644 index 0000000000000000000000000000000000000000..9586f06dc5695e63dcc7936aff272f2e67ea8c18 GIT binary patch literal 573 zcmV-D0>b@?P)Px$_en%SR5*==lCf(OVHn1LUx=f2ypuzuiwTyb370#p;NU?AX{iMK58NEGICLo; zN*yw|6dIv}xHws;LPCc?Gl&!}`DmMfv^Y2&T%;gv2M3kc;dhO->^W-o~R^((tRA$yy`X_a{n}n`up??uU>z|F^q(xbbsx{!Rv%lExPTc-9 zzD+brh{XMAtg1!16#KOZ{Ex5&S&evDvqFR-`xw+(CF*3ry4>(!2mDdR+ zKF7q1YE|MT18@ujZ+~B908W-|6@OyvWK{h8dnjTTa7;6`SO9+jI7j0q=Vozb00000 LNkvXXu0mjf9Y_7C literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafbloomingflowerbottom.png b/src/main/resources/assets/hem/textures/blocks/blueleafbloomingflowerbottom.png new file mode 100644 index 0000000000000000000000000000000000000000..27d0a5b974f081f7a340bfb8674358706605485d GIT binary patch literal 466 zcmV;@0WJQCP)Px$j7da6R5*>Lk}+@7P!xr~7Zo;!ZVukE#7iqs5~QjV87UHdzkr>=3qz#}S*>It zd0=5=XRDOO(5;zJCBjppu+Se6>W$XkU^oo6X_}-`fiu2$zkAPp=Ru{*<0Ap|hnWEK zI8uFASgSmal*f?@Yjv`94TqFuEBL-5T**kQ~;}Bb9sEE#=G}R)_ZrJl?AhNzP)|AY`IdyxM>M^ z9{tl(qs|5ZXL}t3AisGNdporg_h$vFnCIWZEbdlMo>$%AzU?ymJiAtB+KH2yowIY; zWm`YlKbRuFiT}vwhIn zfz1Ei{}p&HaU4=$zIgQki$bqL)a`t&8v+7h?`^#IFe)%yS~GDw>zdA#vkJWiXHys_ w<+`woNIQfrSjgPPyWoWA0ttppHB~i+Zs+Fa0NH*)pu-qEUHx3vIVCg!0D?G15C8xG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafbrowncap.png b/src/main/resources/assets/hem/textures/blocks/blueleafbrowncap.png new file mode 100644 index 0000000000000000000000000000000000000000..871f1d6d19a4770c2ca4f39e7bc66958304e3e62 GIT binary patch literal 322 zcmV-I0lof-P)Px#{7FPXR5*>*kTGk*Kp2Lf2ukf#T#_P+xKwa8o%|0S#ctvsXa|ulT}3+R;wWyq z`x`oGS0R%~pu{X)4GKA@#Is(H(9LH$?(TiQ_YSTeL$%qjmxWz40a&^|0Nu~E^6tf^ z9L`nC0Q{`hEL|Tj2pN8D45i?uRucC&sWX{fG?fy6cVM>qHex}unil|OHcce)f)H6K zKS`Fv4YrG^cx`nsvuS{{uor~!+TR@*Og^w4pHB@U-1)lz=)R4K8bu+1ey>f&s>EUC zC(0t3-@!yUqlR!sjSHDfN_Ti$c;L={(hkuIlAsl2tP1?`Cy5*Ex6c0>=%&gX0mP+V UobR_Y9smFU07*qoM6N<$f*;_AQ~&?~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafbutterslump.png b/src/main/resources/assets/hem/textures/blocks/blueleafbutterslump.png new file mode 100644 index 0000000000000000000000000000000000000000..3062646e03e258850288b01368d301b6e01edf85 GIT binary patch literal 355 zcmV-p0i6DcP)Px$9Z5t%R5*?8k+Dj{U=)SF_=ggbH6RiYG8BqS3#BgEoZUqT^bPt1jwRrG1bl() zPU%n);v$p`0VjnHE(yUl{0=3*X-O*X-sy7hIp>~xFZ_qr)yTt<6s}2?6#!U%(u!>@ z)?{J#0jSm~RaUf$=uJ|cTYjSD;YbR5pL~c>4w@5df_Z%l`uPsMeWQpT5U#m%)L2Ug z=uL*oQk4~qmva&~P=WyC<(y~k=uL(Q8@`@iepaZ~sRCPmqLpzV0rb-gC7j#@7+#{4 zu_=Y!S8j9w!&_*1Sjgs)>H{`K${2ZwZT-S#HQjTt{dlEXrx@O%^X;v%Sxu$hWDVmyXK2aNnG^g9_#NXPN*2002ovPDHLkV1nwb BoQ(hg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafdeadlogside.png b/src/main/resources/assets/hem/textures/blocks/blueleafdeadlogside.png new file mode 100644 index 0000000000000000000000000000000000000000..8e6613898c26ad2182e8685b63a95d8fe619ebfd GIT binary patch literal 392 zcmV;30eAk1P)Px$LPk254P$=>N>GK`={}RbfiW3&L4xN(%=2%xb-HUP7{>&8U9_H<(cV3;zY@()nk%)SLy zEr6??ryCQ;O;wU&v;-<@=L;(baNJa-&`zVamjm|6Q^8V3;zsdnio;jNhfa{V&wSDX|pD>Y=xWh($SLXdA-9?@RLtEVpW% mm9?dmRk1=K)yAJ#YX1QGTkfJ12>XNp0000Px$NJ&INR5*=&l0j<2Fc3w*CD%m7M$l3SG<4BLy6XjUjGj4%Xx1qRLIc94HY&2a zaK0=lZ3hh2c>d_k_!n=l&y#Ly*tUap9*n1Zo#b>Sp_>{2lDsg3gKayQ!2tmJ(L+~q z7BzM9PBCi%Kqw($28Z>k3P}>>LWUADPzeB7uc}ZO-x7;*QjSz23SCKHp@SJ5%y3T5 z+z+E9=Hu-RfExDGhQj^fSi~3XwwsCgVF&Ty{d7h@dh8F!A{Vn^Kl(75ZM&IZz8!dZ zxPxsw?6#XJ7m{EZrCUb$`1($kmka-ER8pv$8rJzM(O+Q(2PNd(fJpu56a2VYoL53Z zR}$9wd5KEM#KylZF+bC#!3X{5p@h7mh=bo_dkb6)L@XBa$;Grj;@_y78anfPKl&hy s3F%h;u`;$LH_PHM??uE~x>X5@9~X_@xyb_ML;wH)07*qoM6N<$f*7)`RR910 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafdeadlogtop.png b/src/main/resources/assets/hem/textures/blocks/blueleafdeadlogtop.png new file mode 100644 index 0000000000000000000000000000000000000000..946fb82a891e07ab4a9141db8c92ad0db44e0396 GIT binary patch literal 278 zcmV+x0qOpUP)Px#&`Cr=R5*>LlR*lEFbqY%t#oC{5rkQ}@&azX!Q8<6d4oBHt62$igwn1GrL!0! zMYKxitxEDq!%tF8Lm!QGFg}2k1OSk3z%hn%93v$`xRcWKrcq$I@I zn6BV47JD!+Yel;GO`#NH9kP3HS-^+?I=~$dauXsYe|vBw8oM^~LFJ0nTqzZ$XAJ;I cc4dFoUwXV+eaanzeEP zIel`HOB5NA0ocA`UECASi2SmQvn~!u#I(qC3Hn}m_x_ee$SzJkeY*lXG&5JE=p>dT zfY|pM|4r=(z))O+$%z?mDDC=n3XD7DB2L!}z?Y`8i#S1j|FkMXB(J7L?&=NIXN6My S`%={a0000{&La) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafdefaultleavesdense.png b/src/main/resources/assets/hem/textures/blocks/blueleafdefaultleavesdense.png new file mode 100644 index 0000000000000000000000000000000000000000..aaccc35ecd32db5461d1a66f198584de16216043 GIT binary patch literal 571 zcmV-B0>u4^P)Px$^+`lQR5*=Ylfi20P!NXy(Y!>+BH|{32pT~|A3?EjFBgK3U_rVQe1JlBMbJkm z2TB*W*hfeSg(QVi(2bZy$V({GMV!;r*`0G{{+apC3^gZf#>Ku~Zpl;3$|FL_JjDzE zpN|`yYc|+2v0rq_Q_PjtbOr!uO=nmhnCrbFs5x1)<45c%=8v~mE%xVbq=S<*21$k_ zjX_zC_F#n1#|=)yJ}AopKxbSYn4h0w>=#{f{D?cY3v&F3#ZiLAPQyMrwhL)Vg32vc zj35MCCfG9dLu)$2Y1oGmg!*oIC^%g6sQ`cxgxD{-Bp{PCh7p7~*K9a`!~pR86r*Fi zzrZ#pYc|Rk0`R_0)R=F%dQ5S?07Vc&U6P3CY1oH`k)$yIpkuqJ_X-imkJt#pa>e+1 zxuwQ@%WRpTEH7G69#O}3HL&|Sk*8S0y?K~vF6CbV05s-X#+7-BxiR0elv+N^P-%#} z)tDSV;>LWdAIt4Xh3&xzl;!$O#PpZQJd_8?2twRE%y4)wL>xcj{h~`!HCtxEz*Ef9 zlVlKhhj-xP?N$2-!0IstWjPGs$KiTt{@-m1LCb{fL-m*f#}wz9jooVeGoqB`zqTw% zWBmQ+>hGj1$8I&&yHoEK)sd{TY-N(hTBJO-;wMYi9*m$oqHlFHMSPx$TuDShR5*=wQ$22jPz?S|atXvh)dj}mfOm&VtdTfCCDxqcNl}&xj!;xZ zg0NId78C}=DJpk}Obwylu%G??*uYq3jKWyvFiP22<{&Aa>N=cDQ(`>C8Y1>wRCxw! zJLn<$t+C9|C~-X;G{qpUnd6#yiaCO$;PDX2OM}RhoTF(i{S{8fa?lt?DbGK@aB0e3 z-eR)_wH>NFgQFi?L!_lp+hKNZ@blv1wqKL>=z7=@d+rcvO1I?y(@&a#Mj1z3GuLPI zQkMP-!uZK7ZKT|T-i-csbO8XWJVSl{8!Go8b!&(;azEhGl%Tf5VzV7kTl%ZMK3?OK z&hf>G6vS2`f^{^xHfjzgUEll2DAJU9vuJY{RfgB5a?qKHt zaNDmbu9;8AvNtwJ3Kjs!9fVQJvwH&o`2Kh!?YJOXLlh(hi>Xrk1s2#e$g%4DH~;_u M07*qoM6N<$f{SpxDF6Tf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafdirt.png b/src/main/resources/assets/hem/textures/blocks/blueleafdirt.png new file mode 100644 index 0000000000000000000000000000000000000000..41ce6475511b6602a51d278f8725dd6a25db7e47 GIT binary patch literal 378 zcmV-=0fqjFP)Px$G)Y83R5*=wQ_E_EKoG19qKMAGGO&n;;2!e@x#vsr*Lz&qgNQH)xYkU+kM}2jmv(O!UsmBoc&Pq)Cjo%c}qx_J5j}T?e#*+R(ab zWo{xp^K1=0ARwu031l4Uih7*&z-%w`UzNq5iPY7FepT_PBf1+V45K7zbF|aj>iYG5 Y1CNc>D9vg-JOBUy07*qoM6N<$f_n(24gdfE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafdirtcoarse.png b/src/main/resources/assets/hem/textures/blocks/blueleafdirtcoarse.png new file mode 100644 index 0000000000000000000000000000000000000000..1026c228dcccec626deed4df30f983e8e0e05bf7 GIT binary patch literal 561 zcmV-10?z%3P)Px$>q$gGR5*=glTVA&Kp4hS*v>T3xnu(G^E@-ZdEcWqPaa>hUuH=#7)~hU zb!t@`fWdGAz{^*!X}6j@eg1-WtBEKYEQ1x=GFY(;RsaNH1VF87t9>D_(C_(xm--h)gCLABOX9%b?fZ9#qJiUjjAjd>cuf?q z5k&*P+hIDLt8^I{gb_#2&d;tl+Z~0xj^ld!L{g`?dvcF{&u6pU;nf?eMih-3h+e&s zBK_sl#}or8u*@=kx1)L@ir0rLNU?MN5P;Ea!DzNnNdWiH9s$s9HQ8);0Ax<@-2N~g zUy{oiWHgO9UZdX<%)XCtT#wI#3-Y>7Ue_63ej}I7P^;Sf{PmkZS64R-0ChikKh!0LrU_TSd zL^%&qlza^UEeIo3BuzHk9ggd%w14L$IlX@YWmEx_q`;|>00000NkvXXu0mjfAl>xw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafearlybulbflowerbottom.png b/src/main/resources/assets/hem/textures/blocks/blueleafearlybulbflowerbottom.png new file mode 100644 index 0000000000000000000000000000000000000000..b79f1b7bd355afe703f7ac176e8a02adecd7f026 GIT binary patch literal 485 zcmVPx$pGibPR5*==l0QphK@`P*6NR-1Vv)u?oZZGC_y+~?6Np7v{07!37F^gam4*8W z7A&K+SO}8xZ5fLo+jETINPofH$iZhp?j#b{s= z$R%YmpI(-L&1Ew#By^!invx!A;#5@E0TX*1D3%SKyexRW9x8pAX;zxlR>>aFYL>wk1YKD!_(cD bH~anrY?Q#e^Ja2f00000NkvXXu0mjf(6-qS literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafearlybulbflowertop.png b/src/main/resources/assets/hem/textures/blocks/blueleafearlybulbflowertop.png new file mode 100644 index 0000000000000000000000000000000000000000..f582e9ebb4b628912a90df87ca03f0c0f8f09ab3 GIT binary patch literal 272 zcmV+r0q_2aP)Px#%1J~)R5*?8kS!8|Kp2J}7-#eVBxj&mJpc#b033mA;shRnY~UCcY2LswLHoj{ zjRZ(*U{-#WYVa*P`+obqKMQ~SII7Ftti5rk#PfVJ!)1F~epLVFwSWqMc?fs9Tq=ho^by^;i>ABRLaCftip2^R+x_m_xEHvddUvS> z(Q~0B>?%$FVwNBYeFAUH*(x6sKr`-w~WJ3HLoRbS$6 zKRFKW63RAt;2h^y2Z+zlwO&7Kl|S8=>YOeh0wgCWftWM*J(&s+bS6RM6!H6JnUn&= zoCg7!&j-Qh2ID@vYUWGBPnSm@&3U_BAOKlj0$EKMJL~4N(jo%RlL^~&K&$#K%u7{a zDKd1W1bVZapU={B+!j7%y&a)4TCJt!%6Q|@nB!4iZ-U{qHl=+0000Px#)Ja4^R5*?8QoRv^Fckh?Hn8Ke0G6N=K+Oj3U_;>y6gJFa4KBbzi31SQu>rAw zfD*!ao~5sOcX{u9e;43izbQ8<)Hio=Cl&j2(Kg!z2y^>km`hbw3xFk)?+v}IOaR{l zvcRD?fU=rFw%82|)U&_vYI*j2n0I1VwTI_`|Sh8RS(#kZE5hCN< z@a-mrdR1mvSSzi>_D6alKurr4=2Gp?H$_d0xRa_EV(>O90f5KlNE&dG&N=EdBBlpA ghx_S3wk+1(pZd9KPm$Icx&QzG07*qoM6N<$g8!Lxj{pDw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafgrassshort.png b/src/main/resources/assets/hem/textures/blocks/blueleafgrassshort.png new file mode 100644 index 0000000000000000000000000000000000000000..f22861124d20975213fe3def952ad6b4cbeee498 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|nmk<`Lo9le z6C_v{H$*w?{rslB=!@(9ijVUPx%Nl8ROR5*=YlCe({aTLcty*79J3`w=sS}vs5mc)267`7%3c5qP=qk~CDMx03M zKj7HOggCg0!~|1TtP4Yj#)a6a;v|&eD2E5NM=5utoI|}|T3&K_zu&#@=lkBfT%`E< zN1*6B0Dqc4N!-1OqU&5)7AHqtZZA9lkoW8LsOHYT^``|>!6k$K1>MbU{Aq!ho?_6y zU@Ex8dcVQtObTG4-rd|riHQXM@i_oqt-;LFB3`Y*$x&D4m`LE&8u-WOg!;peTg)si zqC|@(!A_Htqb>l)U%pFG2m)wN9}(;{2_q&F9DdwF@oJ3;AX+p52zHu8izYFVV3;)s zb;EgMqNdE*>kPA_m&193*|lW==InLZJ)8hQy>o+@NHDv$%rI-92u+nE<-e8@nu^h0 zrERPbnkQ2_Uadj2XyVlx80}SrrjoChQ2>%Donh8MXez(bucb+79

&mXyEw>O{Mev6Y*+^-;dvsua{*8h?%(z`&Ng6=M%4%hy!LW1HiYdm)!4sz_Bgj zFaZlqC99{2ym|2?0NA%WWc4)TvAcI50W+7u>ABd>se}O(r{_u_JUcxXr{`kkGP0Y~ zb8*l5a(E{sDc9His^^jD`RJ002ovPDHLkV1l$4GY$X% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafgrasssidestone.png b/src/main/resources/assets/hem/textures/blocks/blueleafgrasssidestone.png new file mode 100644 index 0000000000000000000000000000000000000000..11adb0e62a4ef1b06bd68fe4bf86383b33307588 GIT binary patch literal 688 zcmV;h0#E&kP)Px%YDq*vR5*=olD$hCaTv!xxtu0fENSlQC6_cL9W0z#%up$`fj~tl**iNYAaoLh zgo5B7&|+toLMyHzlQ>8ag5+#Lg%&|78e=qx6!k7Ky$<0HQ~E5wm*;st-|z3mllfe; zg-8T|3u7NS^avpm;m_$Qtwx8(sYw8L{cqmu`~Bp7cTB=>_qe?_>8x+i9g~p8{M=rf z`0XC2AHUGkRDhv;XMF=flw`Wi8vv|w1#K>iRj$x#blg#tWUO+9Zu17GzP?&Qo6912 zGdlK;L95XLp!s#%Epi$Gd~aT2?-)2CN;37;5`tB(3^jN&Iso>Lfj6TgN;3UK9H*|I zj1T36;wlrR+gNv1i-^!fTiOUFJ8Z*5Hs-n+TXT&rpeL%56`rmFW}C>gOySrzpe>^r<8PB{%>$7kP0~r`>2042=VDu)F6rq_Z>ptbOOKeok0Z zNlZQiz;jsJv;ju^etM?K)n%Leaj?5bIy=MvqGy_j_tgVRkbn|&3$8BPOiWJDGfj7I z#P1)Pi;i+Y2@a_{AaQh*tIIZb-R|Huw9pX1b6DH79qRofv>VMKyTQ=73vs{!CCFc7 WTp?STxQ}N50000%l(Rv@q0hN zsaGqR{NJ{^?ct%?KB1lyZH5L01~&D451APgTe~DWM4f$#^*e literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafgrasstall.png b/src/main/resources/assets/hem/textures/blocks/blueleafgrasstall.png new file mode 100644 index 0000000000000000000000000000000000000000..b83ced787b0e16b5b41f83220e76033dc320da66 GIT binary patch literal 338 zcmV-Y0j>UtP)Px$3`s;mR5*>rQoVVDFc5vG4bt(k04Wn^0ppqtyh9p_%s`Qb9lSwm>;*8Cq(>4R z8|YH_J1j($A}OLq`tn5E?PZCe(iBDKyCIA2c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafgrasstop.png b/src/main/resources/assets/hem/textures/blocks/blueleafgrasstop.png new file mode 100644 index 0000000000000000000000000000000000000000..9392e5716059b1d5e58e9b71b5c25e8605c8001e GIT binary patch literal 381 zcmV-@0fPRCP)Px$H%UZ6R5*=oQ%j13Fc5uRj{6V{LM|Y<^9Ie_b5**9&^qURMA z>1>LayidK9m(Sbpa~mi4)?r_>R<1|BqjI%=Z-ySnvOr>d)ni!-(7t9o@?F8KBtMn~ zc8SCY0Pw9VKmZWBfXdan-`A`{Bof-80s&T)Et~};MhF0G<5bwPs&q%?(1ju+p$ZiV zu&Myi41GbmulW_CwL}0(B}OnK_Dm59eppKcra56phBv+PwE!T^Nl7Hl3BGj*U3l9! z!5UhO#of#G>-%X_U2i`H5id)O*v3f*OC9i#eO9hkP~~cEkJCyZgBBghf0AbCv9GzX zX|u6U>01Xm&%nF1xu@B bLKpA{%D?vO{|rJ;00000NkvXXu0mjftJb6( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafgrasstopalternate.png b/src/main/resources/assets/hem/textures/blocks/blueleafgrasstopalternate.png new file mode 100644 index 0000000000000000000000000000000000000000..86aad564eecbfa48bbb275312198a41d25b4020a GIT binary patch literal 485 zcmVPx$pGibPR5*=glfi1^Fc5~nD9+}R24N}(L|_l51aj*GEc6BTG5aLFx3|(zd@H80 ziVV!Mk4AU*kEeDU$rqM1OB~~#v7PAs_3fIzt})&Z8Q}VM ztwrrNa*TT|mMqQFVgO^j=i}*_d|}Uu0Nl!P%BFg5w~=-m>Fb(y8!_Hv`npyI`NA@` z6K&K~JGvM+Wz%l}$_C)$>6tWARDdo9nrg@4%ivZ{9_%XA5zP&QFj-s5ag<&%=8r|JLo>Fvqkofbp1K{WHU%WrOFgkQ+P8s7p zvP=MDI~f@Lb3+FB{_sLk&b3f1H?mQ(9I~=*<;Z5ex=@sJWhZmX7k02wJQWv25}*TX zs-04ox3CFh`iYW4xf6@CS+C7oqFUY(|GN-2K@rlp{E2z;c8vRBl|`GPT>J~6EGsXA bcPqzVE!QQzN{yqL00000NkvXXu0mjf6O-OW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafgrasstopbright.png b/src/main/resources/assets/hem/textures/blocks/blueleafgrasstopbright.png new file mode 100644 index 0000000000000000000000000000000000000000..1b09fe612b9e4f0c2420a6651f490e7c6bdae235 GIT binary patch literal 358 zcmV-s0h#`ZP)Px$AW1|)R5*=oQ$db{Fbo_b9)Kbwq&$HW(SD%nasSybaP13dIQ0oukt&oIggs=P zIxfBh#S?pGY?|x+b-cq9cIdEgv78+GzV~Cv`3W!*1fYO9jl9fYQJuBD}-1O6smsqV~whE)t}vO7j?-h_VFP zNqfPDX-}9*bGbc^v$4s7TxglUjcv~)$U?mzk%+JmiX1CgHkaGu`1y4RYksH=wL=Ha z>l}EDVa*y@r!;ZjB9=K%N{*7hTV5L08CF-o#<_~FHqZ_oT3MM*;_wp?@F}8A-nWRh zT&SJT)IT#n+m(Hb=ZmBlMt1G}`28>Fx$8&rWWN~y2WSiW&c@WVivR!s07*qoM6N<$ Eg41W6Qvd(} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafgrasstopflower.png b/src/main/resources/assets/hem/textures/blocks/blueleafgrasstopflower.png new file mode 100644 index 0000000000000000000000000000000000000000..eddf29cf18e58c8d755dbf3602d603efa4329e67 GIT binary patch literal 658 zcmV;D0&V??P)Px%Oi4sRR5*=olRsz^VHn1Lxn3I4_Hw=6_25ig8VRP9n9)I696DMMr$Rt*a_r({ zh0?7c9XknvbQL>VkWezXwS#RXnsl)7Fu7~`<=Q3W&pE{VNX2(~@B5DDeV^xj-Y>Se za}c%~0>joB%~AA4moYsq@6AGvf$O3;&M*U*g`5Pn8iKy)N^q1*D+LT&zXk?S6vyH7 zqD{G&2B2I_bF{t$fR(if)x_}J-lVirpw$ozT$ffupg0c7z;y}yD*joWck=@OtWMxp z>5DGST0lp5%x&yL@+JALl4K>>06ctuM*IAN`8&I`&o6ke{fp6viuA4&j@FkbtrUjz z9S5b=5R{8)lG9Us{kcqXdWtVEZqw<9bc6>$LbqhGz^}?#4O|zsFS=-E27u?^lI-4} zL^Cs_a+fq~HyEGLxvc-7`sOKtUqy?5p!fZRa`6?KnL)L(mee+;$64M3ud+v|Cg=!{ zj_{aF-Ia5?dFuq#&f%Zd0Z_e)hn2O!=9>RAvl`7Bj8EtsuI8EB*k@)o$=iF+FuN%p ze>??FQLL;bH5s;!R~hQ|Dju<3hr`u8v^P0kTcBABFw-eCGsBo32O##S^gA3~j?qG) zngHNbf08qZv_&08ZH>aP^=q&34-)G}${)1CWB>pF07*qoM6N<$f=BE=8vpPx$(@8`@R5*=YlfjA_K@f&NTV&T+6Psa&fgu+UB5VYiV{T3sd{MrOpZB41QGTHh78IuLXu4oogCb%jHydOSNC7_|Mhp}ef+)HEjPHnB};S70IN|% zce0>rYkGbg-f>D2Oc0#&DM_@r8bxGj&M`l*8bz?5v7Qb%<_85oB?;v)CJ3|}``I}I zy?G4H@j1UlmgYL002vwQ{|CqXKyM!7H0nxWHHtXqhkxCJ00XdFZUBfLmHwFx#iCB1^&bEmd1nI@dQ>+}OgmZ$Qr9ef$c* zuOH9aS*V!qWC6`F-N}M@7~=X?`3tDiZgG8ch100xH0m7l1MBGkfXdqsp9`gYwug^lZTkMt_R-=gCJXVt#S%++) zYHN5MPq!hw<*|50?i#h^3&?GF2f%td!1b+)=lT}WOT>14ixCePx$JxN4CR5*>Ll08VnP!vW_6oO>7k4Di+P&X$BCkJs63gQruLJ^m`WDr^*L#Z8# zKTuF8c9G&z>flmvSI6Se!6A!_4h`ubh&lx1IVF_-gvNf;<8tr0hs#qK5-YbZ0d%1P z&~`nFg$Jd#udlF|UX!{|(S^$Fw8rMf3Dvqe6f)^QK3*@R>wV^Rp<H^7t5@`)JuM0c_!a_em@Qjwsuyeh-vtn{cV<6p?I05?Rr5yliDVktpad=*HQu< zr&*Kxr)P+mMk!-(czzoU`9J`-^TYK~miX$f(su)=S(Bb)b8yoDK*TfvN*RM>w#rp1 z0l<8s5X|)*u^ZHz?!l2_mknu`4H?!m5s4TTpv^6g2N(qs3Q*%q;~V@N@Ycx5Q7l3Y h2K|LdfL@zH`2#QsZc)JP%_sl>002ovPDHLkV1f#cqU-Px$*hxe|R5*=glCf$kQ4of|v%8HDt(8;UTL>!%TciraLQ?1Y0LMpIurN=tZNOLX z0Tv%1&4SG~0U?dB7Ry?Rm_mevxy8-wU6WG{GiTnXf6Q5$wI;;m*Hd~05)>c zAI)VrS;%0v626{|Tpfo=E`&)gn$%{1!EE&-A0~NS?~mpZCb@W~tTe~vu&tW`+GB@} zoNUtA=%zX(xP1V?^NStj>(VHijhwtaKN^7dmnG%v(g65>rT{3QU+n(HHgcjews+Ndh4{r^sd;{}10cxOwJ=StVtWi`E7_#6@rxasG&bkc zzNY4B;d0n=KJ9B{Q&!l>i76}IUzPxT+}~j%C#qSP*3?~cOq_F|&Roi2Sd~@MbDYVB9vAufg=kH&r?~1Gc=DI4H*3=pO=V?+uhDk1$!xq2TaV)a$2T7~btpScj_J0GNYRZc9Y0oB&O{>$T gnOBXDMONGV7v*w7ZN8us`Tzg`07*qoM6N<$f+cMOmH+?% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafleavesscarse.png b/src/main/resources/assets/hem/textures/blocks/blueleafleavesscarse.png new file mode 100644 index 0000000000000000000000000000000000000000..9c32b0777dec8473157e7709e5bdb8b441bd59cb GIT binary patch literal 270 zcmV+p0rCEcP)C->&j98jR0{x@~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleaflogside.png b/src/main/resources/assets/hem/textures/blocks/blueleaflogside.png new file mode 100644 index 0000000000000000000000000000000000000000..2eca12f4b856606fec9e825c30c27e19e8b6ae44 GIT binary patch literal 388 zcmV-~0ek+5P)Px$K1oDDR5*=wQ$cFOFc6$dA{GP(`(S9mA@@KJ{(_&;TVL!q_~e5R1{;H7EZRdd z%1UkbBrV$Anc30X=f~x{sd9AVg6ZzTXzL=%m6=9UL)-HWR5t))JqF8NRM07ZSDDhl!52dHX?^Is?3pP id@Mf=EiBz?jm8h%66=uW*2~8L0000@P)Px$ph-kQR5*==lf7=+FcgKqScF0WiUlh#Nf97O5nx#`(GC)6#xT&k@#pfKd(Pp_kFOv9{;7NF;Y20{0Ba@LwFC8V!j?U= zdzlohl|;O}zVZFx3jkvu5XOf8)z}9-K0N~<>}Ij8-G$^f1Rz?b0350YfbKW~pmWW) z`_KIR^&8O~&xktL03Hi7uM@^TK*ff3-%%DN`6gr64ikg158NYVQ92gUGJS`hZ!**> zq1)E3N2IrbYY1cG8YdRUp;I*!+nRinIk0*-AwGS$n=hw;L9G(T9@>59kaez6s|4mf zs}aEB<@JrR4;)q7Xhqbyc4I}$)KRxOEt;btjEz&+mcO=$hpHirjdLfHf`!$82|tP07*qoM6N<$f}+jZNdN!< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleaflushleaves.png b/src/main/resources/assets/hem/textures/blocks/blueleaflushleaves.png new file mode 100644 index 0000000000000000000000000000000000000000..6d62be80c5041a8829a174d799acf42b3f834774 GIT binary patch literal 594 zcmV-Y0Px%3`s;mR5*=olfP>sQ4q&JZ;=gx3IT=9Zegid1jS%#C8^Hl+WP~p38b;GzS1I% zV3R-K+B9}2S}PGHg{-B;+g*qt+zH|mcvtMb&Bol6Gw;pJ_s0lMqO%LsVhP*ThJ2;S zxM_)Gy)_9`tqO}JjGLDDRNSsM0EFHF0MkzMa(69s-Fte*EEULCiqxuL=&A5NHS`Xs zTo(JL9DfFoGl^L$5PAo;s||}K7_CX5hL4iYE>OpP3UB11a#@^)6R%&sA1VN+;c(oi zFzqyHwg3>EgqAWXqxOULh~CWYw<8GU`=Qd9$4yHd_o-OM+i%5~ z&|g0{cq2E41&}KB<_hVfrF=NI#JXD-0Bc}7n7;Gz`+$8@X1m&OjKqpm&>RdOWlW%k z6M6?ayFfV&2h&c+W?OgbqBRMWq4hkC&Mr{i$i=kNG4uIKF@|(Gm@04NMkHPirs}v) zA*9cjA6MvO3fHgLU$6dqP};F6fPAGG;rd4mK)8OzEEPWZqtu%#A$`23=TF|CH3?MG geWx}~Hc7ty3xjGrj9T-(Z~y=R07*qoM6N<$f&*p~a{vGU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafmatureblossomer.png b/src/main/resources/assets/hem/textures/blocks/blueleafmatureblossomer.png new file mode 100644 index 0000000000000000000000000000000000000000..cff720eeec0dc8905ef7ad5c841aaa3961922ddb GIT binary patch literal 274 zcmV+t0qy>YP)tT0rML zASMdf2h%Zsz-ObPNWMOH;7{;$u@^k4FQEu#>~m28+c_{DVY?m`C;B32bOEHT`}J>n Y0oPx$QAtEWR5*>zlRZeoP!xr~6vzHh5(|=omMl7UaB~o6MYnD)8Cx7gDFMe~6~sZz zB6M+cE9lb6N$F7NBGe_Mg8`{Yi*4yvo>M}LO~B2&-gC~o=iK|?Uss`061r)KC`>G@ zp__(?rxPfuOq7TeMpjgrR3-_)cW;R6c+`s3U-%_}^Vd7!11}FwB)ioCHUa_H@vvJR zbkh)8KF2IpD%Y=s>v#Yts*LM+j0YpWtPeK#w@77@!35*M2!MDx0f3gz5u0tej)$Vk z#M23uwJaCgQ%>aqXmSz!W4MF*$o|^Fbg}+pTX^~A3a5WrXLL^lO*?Px%*hxe|R7i=nlTk=hQ5?p9_u3?w*i1^tg_@W&W<@ZVqEAIoNJzfqL!b~SMKCJ| zK`&th5o|;QQ6>oX67^hS3HcP5Pew4dhtPk!pyzV#&a7Vgzg+JBe&7H5 zzW+HF{%3s}xF9|aTo8Z47yu8>1|875Zv_C}-iac@XIM{7(-!XG;?pFNmSzBa^&Tcx zGX{V;7HSt0s~O|xP8q-fy;)jhJvB{W^agL17KyYpuSwr*YqW-mI~zxfJ1Hz_mH+r&VX#u)?&CK09-lduW2=Hmv}il zrS(mjy-=<=i%Q!imvY)J(H9$M@cK>dG|a({fV0t&x##r7#x<49W|8@Lf>*b0y8441 z0bvYw1VpQ+jzYOY(0hea~zbxjH%JQr8@)SCqX|sMVM1`$ni$a!9pXQ=OJA z+73{Sq23J@|IZH82rAh%pq2}@vPD}X0~`Q2zf=$aYb!Ybx?Wt<2CUs);3NnuVmZC{ z=UNTp{8B;W_J~F<4}h@zT$;Pe=gAM8zSYaZ@GI>*fEBSYg3;F^lf3M*7L2|Y!t!H9 zEOIM3hp6HtMk7jKXaA)5)!U7c%Tq0&;`jYfxBeA?O5nJru2#(^KxhA?s05B9EI-+M c;eBzx0p;~=C|qKaRR91007*qoM6N<$f_yG@DF6Tf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafredcap.png b/src/main/resources/assets/hem/textures/blocks/blueleafredcap.png new file mode 100644 index 0000000000000000000000000000000000000000..2d792d5ddd9d7e4b3344ae67887fae7eab42d483 GIT binary patch literal 424 zcmV;Z0ayNsP)Px$Vo5|nR5*>5l0QfSVHn1LC*fd2lXw?IB81XdXx!4!(k9##NHs)*5`lwrjgho8 z2+ajT)Febm;1Go96|Oe+hy0GF5E_E~8q~wf^Tc<#;r*W9_dL&iFlO3@A=`!_N9}#% z005>CjDmOqD!MLBAy_V*V+t|31JkkqcuHuX|6rR%Rx+;Ltc697iHD8xGsz{-g_e0M1s{$%e!7>-O62!lqSpU7D6f zx{&8ElOw5V0F+uS0Fs(UTvgd^G+6Tah=)R~RjY~(5cQ&*KDuJiIzX$p*ZSX{c=2=} zHIY&rc|^S^gR}DhoUCpEklESf@#d~uqGgf0zu@!Z1vQaUMwSTh`~EQW&j*D=9k@-i zuwg@DdzY?fr@R1xxv19~ydKhP=|K9`7=AV832?R5w;q^_+JGO?Px#`bk7VR5*=olChP;FbqS#`BEwas7sRtGQcfxyL$l--~sH~yy65sSP>iBFbR?X zm*3YbebuYjtI&_OVOhn5M2fU*?NnpqHU4aM2=3Pp2L$P01$990`Se(XQ z%}y_raAzY%BtU5VJ+mjf8>``?9;Y-=Y!f$Xvuo5y#}=~=o~UkaD~5e}whe;Ti2F_0 zbO79K)|h-wNd5rseuO@^ SI1o_)0000Px$gGod|R5*=wlR<9dFbqYX4FiS+2UVdg8m)qCa*Cc{4loCv-P|BR;a%k{B2+;F z8Qw&*sHobV8E!~g{Ga@^RQ=rV(+(JcJD+w-39(I8(F0OLj(2s<_;}Ee4_=?2c~YtX zjn*ahApmfV5rAJGAB>L&JNP6J@X=cSXWLAEa*o$b0?^!H1wJ|VPXZqTM{7A+yCP|p z;|f^v?LyMYIZn=TwDwD$5G>7TT{MdqkPm@NjD`6A{!VjCsT4|AAHr&h()qjHQlegN zS3r{c5DMAvx3|?);_FRSt@K_pSWL*Clp@Y^sgdtBz#)$(tOsiuoWp2c&IEA%)}ZM# zaH|y87%^HC=b3}G_z+eA)wW;LTFXZM!ZpS+x(|V_>xlD=(R#H!*~4mr`yzQUhH09Z zrm1uu7Lr8XB}NA4=;bN{49*q3s%`1It`Nt0=Eay2pS_3tsOo-kuLtK)ZOh;sXYVay00000NkvXXu0mjfsY%a3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafrottenlogside.png b/src/main/resources/assets/hem/textures/blocks/blueleafrottenlogside.png new file mode 100644 index 0000000000000000000000000000000000000000..e374a40f9a281f77fdc42fa4acd51308865ddf23 GIT binary patch literal 384 zcmV-`0e}99P)Px$I!Q!9R5*=wQ!#GCFbup(3WUUi4KAL7bjZ*@bnO3M;mM0&54Iu1LOZ0#P%g?z zCV0H#k$(I7xP434B26<=E@0eysd5rMq-z17%DZ9BNYjjA%>aO_2qXq&2VB8*6cPsmt1Ll{4aeH9g z9<@ooDDbhXho~)$0gcnZAulOWBcf z`FBKhXDK@xAD${Q0CVqj-u@SC;+QxZWc}bbNvJ~CC|wIV-23r(2gIwScU5-myl?zthuz_|dF=(onaBB-ntLqi2>ZBirHXy#kI5p= z_uZ0Zd-xSp85u${3wj>P9QW`HSQ;qxI_#pwS=RmW=iOCQ6Kf9q{v7)_v#z$pS9UuS zgGHAyP}{_9J5%337fF^qBAUo|@Y$V%KNuXR?u%t$XxaGg${J-4&yK~0a}Or(d3z9O zP-xZ6L$N)jC*B>*WR(B+njzfggm1@`m~RRGS4>NvG@laH+!>_hbzX{L!kbgy*3^qc WN4Bp$`#cKhF$PapKbLh*2~7a2C31%V literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafseagrass.png b/src/main/resources/assets/hem/textures/blocks/blueleafseagrass.png new file mode 100644 index 0000000000000000000000000000000000000000..36d78510b03f232ba579572b5b738e50107423d6 GIT binary patch literal 826 zcmV-A1I7G_P)N;To)8TC$vFLpn1G6OeS_V??zg^U5{sCJIU#;>xs`le*fWJ z`1JLC`c8hr+xK53=_bmNNoiCDuh~HFU%vhPxB=f(;_*?Q$CR7~0#!_$f^LHN&S2tw zNDKJ{3+Y*Myow~nbyW@n!3~J%JGZcHF%1y;fLpP^YLK}*M`HC#k{_I{7@>aky)&4V zPcUUY`gVh?Dzy)|7`O>fYtmIf@~w$a+L4Jq50AfOP#)tvFxi5`cWNTkA10kx$T=-! zo<0X#s`t`B0VtCC`)vZBQfgf}77BPep85Ho<5tjzJ60wurDQ~0Vv~(20WFxHBd6WW-F~&V4wZ= z^ppnKr^8J!S`4yJhp&hUEsms91Hr2pae}_r0!g<95Ij3^@^Djvo=m8?#Q;?EsA8po zf*dMh)fo|51O2AK|BQM*6RBT@m8);Xf(YMIZ|7DlNWi4^%^lGDk(kvzxjj4yR@ZxF zu-pMh4oi5+q`J~s^43J;oq^y66Nh`wz>^rV4|FoA3r6!$UIbe7q$kzRUXstv6vZnJ1>d#?d7(|7tk|efPv!GT^ZPsSw)$r z6-wf&t61jImFRQOcN&x?yFK?sDt;VUB`)MO|AiK+oMDpfPrV?aU`U&KNVjwFwlLZLdQtdx82IRhyM7*q=k>_}Es|7~8LFh>rvx---N z0Ez6IN<3!}X_8{WZ=}bU@(^bt)n@zwH>t$TDi7L(tOU4N->rdyY2e~p1CkkNt}Jx( zdBA(rw+vh?v|>v1A!X^pt%2T2a#J@>?ebU0`@A#w3+Z%ei(VMSHUIzs07*qoM6N<$ Ef`w^?Q~&?~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafseagrass.png.mcmeta b/src/main/resources/assets/hem/textures/blocks/blueleafseagrass.png.mcmeta new file mode 100644 index 0000000..34a3ec8 --- /dev/null +++ b/src/main/resources/assets/hem/textures/blocks/blueleafseagrass.png.mcmeta @@ -0,0 +1,14 @@ +{ + "animation": { + "frametime": 5, + "interpolate": false, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafsproutbottom.png b/src/main/resources/assets/hem/textures/blocks/blueleafsproutbottom.png new file mode 100644 index 0000000000000000000000000000000000000000..f2f1f9547f90f0d1322f0e0627356ace6480ffee GIT binary patch literal 347 zcmV-h0i^zkP)Px$6-h)vR5*>TQaf_OFcjS9$pz>v#S=>sJcOH(Lc}-X|cpdm;s(Dhnco?lSJ{79<-*O!%9}K{@ldmG0 zC7M4EnKOkmmO&V&%#Q-YK(>0Xwa|s*W=?e0wRF>c$;(U0y%HFV)|nNU4FSMz;?qN4 zalVQO0P-q{bJ)}UEt(OBamsDxZP?TlUzNi9;+bZN=2M|;anj8ndgN!I}XWbzy5$4l&E@&&>Nf_yVG9HIaK002ovPDHLkV1kSZkIDc5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafsprouttop.png b/src/main/resources/assets/hem/textures/blocks/blueleafsprouttop.png new file mode 100644 index 0000000000000000000000000000000000000000..bf2fb180c147a2fc112ed7429cbda831489c8544 GIT binary patch literal 334 zcmV-U0kQsxP)Px$2uVaiR5*>DQoFH(Fc92hTm;rQC-tWS91y(@Tn2$_AaxIJ!6CfZGYo{!xsk}| z06Bo;BO`g9FFa}YcJ~gjRNT}$Zfb3N=ki>SMcEO3MNpJLb+3@$B#xP##HnDtA*iR@ zg_R%;ee#3=0JKv6pMXg|sc;ei!0%~KX78Ad8(MuL2$Eb=rDot(N)!;w3Z{uO`0w&V z=x?Ky66&dkTvjG{w*`=m9~q2(wS)IQ;2A+0`ZNVU&WD+Q?yomv`^`cc`ozISSG5?w zCqy^QwFPr}bXA(CGkB=DsrAyi21%}2g-s1%vKmha?6zH4JS9l-0cfh4S>V+aWfvA7 g%Hw>X=^dE$0`P>P$qPA!-2eap07*qoM6N<$g0i)XrT_o{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafstone.png b/src/main/resources/assets/hem/textures/blocks/blueleafstone.png new file mode 100644 index 0000000000000000000000000000000000000000..ff758b1c6bbefa4d98f0793ceacce6983aabb69c GIT binary patch literal 445 zcmV;u0Yd(XP)Px$cS%G+R5*=olRaz0Fcd|Pi=%i6MmWJWfqpC<`j5MJ=pX10!S<6K8y?{95Z6G|j zYhtAU7*C6ikj^JQG0ik-roFf|B?ns*eZ0Q3UQH<)Rpz!R69df6F{Yd&bkkFE;MC9AfNq2iSlAc${gbi8hPR_S7_Px$>PbXFR5*=olRax2K@f(YoDMb7avX;~j^iMZM2Uq!ZceBWCLob2`A>$F`4LHz zDy2K4bSZ?~NR84Z#c`ZII1YK`Sg{RGA(eEe`9$0-}F84mgY zjJ|!xQHn71Y4|nVdX;>+W|6KKPv-=lYho5alI08secXB#fOe~i*dkq-%W<4iv_-n2 z)IB;n9lYrQu)F$wkoeC^hCCf5CeZ50p@3_Cc!*LXLlI4Wy3V?=RLptgmx6EEF z$#N=X+w7Ap#|k{xyk4w6p3VWNlx>q-Dcd+o0T6gDf#+iXuL?l#xJARSaWR>J)&Pds z$nW6RtDK*W_76xE*|%Fw11IWsOlL`!6LmWPPx%W=TXrR5*=Qld)?PQ2@q&Dam;V^*oYrhSO3aRMdbi4S}Xh2L(Z@C}fvH9h@sT z`44233<@PnK@jX9P8Hgv1VY+GY6AvhL)xQ;W(099DxCyGxNg1<*dGg z`wK|`9(`3XQzll?Vr$u>W1UKn6TX91)8gOrXUwd;!s~k&QznOn5{HEnTgx7si5|t3 zYiQ9302|3PUf(0Izx8G4gSwozw*CQQ%9Ne^z1x4y3H8c>Y@=5G$yzYYZa^W|6=dTX99s}l zRYIyd5|9t)yqZ?i;`@t?6v-P$lq>M=tjA`eN5qWDzlT)yg29jJ+f473*hr>X9D3{q z6uGwa)5rWO?u{VEjB$bb{`SzfGjLs2ox9Ab@?P)Px$_en%SR5*=YlQD1FKorM+aiSKx#Sx7lSg98l1_mZjMx;cMIv{mGVy@Ir(Wzgf zdp|&zs1p^V1q%!iAw^!U?HQvA$w)pkr9*U25Kn&h?(ToT|9kIb^!?k@bTS7Z%MJEx zH5)8eF#tEcYewS;-*b=l`JRgdaM!<;g`3_r07~hj7$6J-I^8ydVP9egV7uOs<%UkT z4ZvX7C(8|C7?9{xE(b_-%67ex`1Jj|>R0deEB2<~)Ny!Qe#8C!F90_Gw(L#8-#=@z z+^{zV=jUY}9v%VsooqM*Sgc}v&qXPH~FIQv{{ z-e?@rYBnVI`JO9`J5x}0OM+xKznlSSW#4n9zioMJQ`w4ix@|!@>;<0bNVL8L~Ll)00000 LNkvXXu0mjf+2;Yb literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafstonemineralore.png b/src/main/resources/assets/hem/textures/blocks/blueleafstonemineralore.png new file mode 100644 index 0000000000000000000000000000000000000000..af52cb0383b0ef5b2ebc5d86ec7beb73d3736e40 GIT binary patch literal 688 zcmV;h0#E&kP)Px%YDq*vR5*=olTB+HQ51$BC4OKrb{NeNj7h+1LAsGjA>E|7(p~Jj`>gUS@)No$ z^apg+U9eDS-86yFXlWav8o{rLOlD* znl3;~$kep(16&Ul#L2~5ksJtzg%VTKDduj4f|x9^o690834ERUXD^=Gg2ro%c;()s zKsZdh{+(iZZ&9{ar7_Nkdtdl!slW2XF=czWK$U31&6n4tct1>ZE zI=&YRK>g!;kCo8+Dy6*5hem{8D9COu%TnPI$ioK!gd$Nwk##19Dyl`L7>}Pl#nKJtvl-UdT(r^DbhN&T{pb~X_Xhj+ zH^XL!N$Mr!k3=PV>e^_yqjd^V%oY~eaC+58i{uW#@b4he+A0L*7IF;I7| z3&2`1NKBR%3aqh->$oV}NxIDzzQQ5a*c6F@a99l1)U=qImiRNjp^nJQZAy6?Q`3=@ zgczn($nsp+xV$%&{Px$7D+@wR5*=|lRa+2P!NP??Mr}s08;}(k7ckI7 zaynZI&vaZM@=~p}?}sScS)Tdc%sv|ckme-=z+!)8IFsfjFZNe{c|Wp#7Ek0F9?fAn zCICog2|8o&y_rxD;HIEUYrXG`>0v!UM4$5kX|cqVdAs=)gB5g&*Xcd9=#h2AT|Di$@ky^sv@JfZajfD$u9KO z1}hwvW1>ro(R#=30^1*(AGy&*Ac;a1_0p{bzt2yhK;Eejm+1D>r;17b0S}<5V*2`6 uQCv5@DXtq27y$q$LkL~EhpyBG0>B-pzN3FgC>JUK0000Px$ElET{R5*>TQZZ7)Fc4g2_<%bPd4O6V47KB$hMJxaxX2q+_yhF*0Yhm~XGTfd z^pUL2Kk!k6Q)I;+D7Z>Dv$wluMZ>jNrF;)+8-``(dK<*0N}V;iBfw?<6CG?=}iJb92@_<_UAn~hweleoWt|m5+Cn2U`0F>EAk)! zbSJ`bvl6^&o#mp`p6u41Zy=QkU@j($GfzL*RSI$bJS>$VVY}d{U7ywYR^K}<%51B> Rer5mw002ovPDHLkV1k&!p|b!0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/blueleafyoungcabbageflowerr.png b/src/main/resources/assets/hem/textures/blocks/blueleafyoungcabbageflowerr.png new file mode 100644 index 0000000000000000000000000000000000000000..f6b9fe5894c09b4ad7c685368254416e77d0a993 GIT binary patch literal 408 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 P00000NkvXXu0mjf{ud!? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/danglingfluorescentleaves.png b/src/main/resources/assets/hem/textures/blocks/danglingfluorescentleaves.png new file mode 100644 index 0000000000000000000000000000000000000000..416c02cd3967d4035230ddc4a20278cc85d895a7 GIT binary patch literal 392 zcmV;30eAk1P)Px$LP?fY6S1=g<426?7sl$@jMd06@OJae8@@Fslgw`{hvL zk_3S5SOfsXRXmvn*e{0y0KsNQj(h;XYCUfYouQpHOp-I$?5KPC+!WA*Cdp}%oJ!DJ zWLq#v&M>Q~Yb6P@nrX!=p@H35{m+bd;dQm1<9s|JdOcj(yg;`%ZU0Jlmld6X=C+6{ z26hscAr3tf|9Qi1sg_tB~ zT9JAi0pLLwA3x3e`O(9^(?uzYXdw|AlDH(>Kc$0HW&1w3@b!F{)pTCbv}y!&c$#+y m?wqQvu0>s<-f*Gc68QrGY7c6;x7`W=0000rc literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/giantlilypad.png b/src/main/resources/assets/hem/textures/blocks/giantlilypad.png new file mode 100644 index 0000000000000000000000000000000000000000..5e6e5377b1356e3f680394459bdcbb4e79fbbaef GIT binary patch literal 2694 zcmcIm`6Cnl8=oA_mOGOB$cImblAJAbAB8!Ga{G{C$Q5&JjuvGViyVhnKM~irdRkwcSAR4J&tOEP8>QK3x~dka zyN#%JpvvpEoana)?~a%I-(7T5vL|iGXZGYE*Tv`ev{#Ofu^5>sl^rY#>PonTY?Unw z;MtfQ3m`4t)1`_Y|G|GD>nnXCAeX*!+_FH&{1IMNIb`Vd@0;uE?{t&H%`V&NcOsV?<4^Lr0_sm*^E!zmJ#P?Q?(p249bVT8gQr>{z+k z=em2!CDA%XggiKsij#9@3T<PxGaHWl82zND$ooV5VLhCiC-a6*l`XpVD`q#&F@l2-nPGQ^ zDQ4EuJAAK`3GL-S-_W2C`LJWHp`{Bsyej2RgGbDmaCUI1>H4$(j0NsoY;<-0~& z40pFpcXdJYj8U(CRvMy2tT+_nVbf56!b@9kVgmC8^d#F}^L`z%Ma@ZH4)_*Uq~x1& zTQ}hcFKw8Y29v<=*kOA=L`u~xEU_0WcnIJM*tTCTqx&hdMD?6vHYd%V-JT%U#8UwH z|3eI1PINe06NakvDUQ8;;{y#f;)G=eN7wW#bqB3=YO(?>FW5{H)z5XJ?#K^bwBoLg zZo;CK3KJEs%tXJuJ7@fdU0h&uTj(=Y>Uu(+%wrRf0Dm2KFM-rfDo09t^WyImNK@ul z^F_3~Z=PRrj7eqzm`l>KSbZ!+y{0uHl$#mo8ztu7jfu@J6_PoDpzPtuj$L7k~>;K5-E?bx1V1YBxv6e-0`ovTRA*=P6(^ z&var?Uo05d-iXiiO}OXeUm6~!iAZFGTu)q@^i(C*k+Pk!@kVZII73S6#8fyurbsFC z4d;2}+-iQ_yt0kX`;S`wyvgqwP3WjwUy(XQ)>~#9GI-;YwzPf(0MJ)>0stIsmGeY% zbw@3FJ^B^O`d#ithT>Z^Oa);8u@SNRb{cm~oTTr=m8>(qtcn&$w5K4e3t|wRuyw_kwoXGV z7iEVfSRRr|o(-*w|Kj;ht&h;IX#72qZg7U^g1GVyrbaOrY3CHTI&qMvz0(Wpoi?5P*N+!fr! zY;r+h-5E_Uc z=)q-QtVCJWaco2p|LX=Xw}@EBEri`CVBUCZv5hUvgL=Vfq#^o+p=3gn!FlHj9lPLC z@`ijjTEesN!P>qzYp7sAzQ6Mjd95OrNCQ~MN)A|`i)1NI^JM#wt^a*o2YfwE&Y`Xe z`8cruI|QArc+woQkn=U@VQ0VdebsVx(rKa;cF*syHLOdnva=bDEW-wV&AnX#MKliN z*YpKtlQIk}gZ*VMwJq+lC0{A+W?nM++(K5}4G|J_$^Uog-&_j;W~Zu!8vPebhBgjpfsXXA(pF&!iYa?h<`9=%FKm6{}{KjfqHD zo-%^^(-pP4Gy$k0qhKHki>@?xJW+w;pzD1;XCH_lwbaFBrG_$K%~$gzQ;(_4 zN!Oqma>MKu4=2ZgvnWK<&&ZP7$2nUAdDG{GpCnn#>74l5_9JfpKWnOo#TzNE5_?DI z&9fk(__}+)U1woDeEX~4+`m`1Xg+#@Gtw1>zS3y3&(a68r-yj1tP|buQMl}W>jdqV z;R8yI`;NVl70vm9XwVO>e|olOpec}dMxa}BYM6eibKUMDjj^@O?(Na_-))x+mo)we=WCP;nf{kNY@Xp@wNdc-;2$EV22W zN0_%sfP`*@O<i1#kUn4s8j z>^@D#Et4Riw_sX-zWNja+1!2U4H_O<$Je;Yr z1eebCDvgOzjF~mGiDYq!0;yqy$nA#i29Cc|?r4xAn4OCbRO-3K{SQizDi#0$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/grassycobble.png b/src/main/resources/assets/hem/textures/blocks/grassycobble.png new file mode 100644 index 0000000000000000000000000000000000000000..7a6771fcbf716355f104c4f1da7d4a8073f03266 GIT binary patch literal 725 zcmV;`0xJE9P)Px%k4Z#9R5*=YlTS#KVI0RlzI&Spvu)13?hgYiR1{=_I4zA1lZYhfARdGy%N;!! zgoFf9bPx|7I?04W%0qdHFgzq8B4`q5f+a%>-fi!E=bAcA#pycCJ!rq<_xXK)&+qwu zzfaz~ffpH7)fg>pWl#wL(4&{p{(B6M$BDzKU@fte+=vs?bmkUUaNDfnOacViT4D#F z_js0E#WY=zRaN6`#WWp*ud?#lgYpXi9PIr)*ZAX?O6DkyL6QWP+CLz*e?aCajoDm? zG+Nq9Ow);Jx|lp#+KR{H#BH+@NhAe1l1MUL8^C0gi6oNDEv_IHm00LEG>Vl}Rbwxl z5Lm7`M^5ib0Jv>drfUPplFLOApw4UJcESmIk7sfCy!7a0?1dBLTkNn4eFZZ({7qTC zK8+!rM5A2&GAM4@3nzH){E5S<05GV8$hX)z+=}C09TIqQBhJk`%}7r(3yfEHVlv8@ zj52}r6b`3yPLo%cSIM{7X{f0ZPt6UHW13F8x`d~yoR|C8QLbEs`C&XBCoxSI!#XyX zQ2(>g;Z(9VZl_WNO?Lq}JlZExagEwk2vyaHMm8ApKO$rVQY463RzQQw8Wwu2IlqOa|+eETtc9uSrS~JeC@Usr|70giQ^CH*zyiDX-kX$Y%>btl#KMcS~aT_ux1kzI?BMrdZ;tG8=2)*(q z-wtJBnoiKw0>Gb*EpB`ZVlv7!=Mr~Xuit#YZL?D6^9t-A801OB#?)Vn00000NkvXX Hu0mjfEz?Ll literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/grassycobbleside.png b/src/main/resources/assets/hem/textures/blocks/grassycobbleside.png new file mode 100644 index 0000000000000000000000000000000000000000..5c607e4c9c1647369b63b864ae331e34014f0724 GIT binary patch literal 710 zcmV;%0y+JOP)Px%fJsC_R5*=Yl1)fdQ5c4wnLC_uhKj3W^P^3PkVLe|Br1PM3KykGgl!bUg|39C zm9&rw7bYz-S`-LTfo>XFM2TRELumtI4k5EBuxpp;&P>kC1!>HiW{dIOM&H%9INy8T z_c_Nla=(9TxU8A(A8+voycGNPlTH34p`}n&jqy`mWRg0Dl0#Iu>D`=RP^zQECzDC) zIEKrb$s~1DRl`(5O92oJ2FN6J9(cck7jC8wGbq(zC^_)S0N4QxCC6w*8>*_2&{9OA zF(T0z{c1JsO2{(o-JHQta`XiktW@?)QU{=23Gs}JM4~Y!JRMxV(8%Z|gLpbiBpM^3 zr5Kdz08mwpb|nOW1E7;Jg24cNEYME}lCn%9m;vDQ@uNI_{sI8QQ%zHPgg7wa$)B?u zO3v!8sv1q{5diDfNHhio3-fcc)@(6|r?aT4Mm(KmYPBBwr@Kt8))R@wn4g8$JvuB@&&$<`8e`yGS>F}ggrSa@}gb)-h4j_c!_pw_PEe=?(WTpkM)m9zaatT4A z@&^8;A@tlD08WQQ&BEZO-leK)I)wmv3J4tK|tL<2`u;0GANRZYO$f z-7>k_(n>HG0N~!kM-)m3fzu)7Ap)!!1^}|#iR^Y!2p6E^O52W#rX1$&YleZITW7b- zuJLphA;b<|hEc%4OkvKl+ljK0|E0BO8kqg~-eLo=x?R&&Q+Z&^jJ(^xl(M2DyInf~ s1FUas{%5dTg>@=QPx%Ye_^wR7i=PRlkeca1{T%aBvnJ9a`nmF2)gpol zaJs=i!RZjH;T&!&xEwcJy)9sL$SBks%IjcX@=c7k^ns{(pI`5N69r=Rd~?t7YsX6a zUt(fC-`umjj$slL0Kkj41pwrmW%?I00HF8<5h-@7dm^g4m}menZcSN;uD^RFRZ>C? z0P2G(xqb+!52`e7O#?S^KFy}^;%)KR4SSjZMMSDT2uH{_%cRD4eZaPya0lbol=V#L z;QGMABeX|mWDnx(JcPXfAR-&R0>y_D>m*1D5U)?5S{zjHj)bGCm XObg_ghTLf;00000NkvXXu0mjfAt^e+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/lavenderblueleafbottom.png b/src/main/resources/assets/hem/textures/blocks/lavenderblueleafbottom.png new file mode 100644 index 0000000000000000000000000000000000000000..c3ffa8062da70f19d89456f938cf43c4097d2a34 GIT binary patch literal 432 zcmV;h0Z;ykP)Px$YDq*vR5*==k-ts?K@i4&d!f*T(n2AuRtLR_J>-H76^}q-X9%J38E6RM0eA!| zVj^CkH=#$$Gba?5B-)s zjvK}(XwM+}*a#NyhG-qp9XArAc6A^&YXK6hR}aOD*3m}bh}B)Yt4Xwu00{g7y?Q9E zVPL%OxM9>JO$2BS1JkRA68Hsd)}m3A<2~L#i_Kcp#Lo#fYiU;pJDpXeU*&l250~KP z*D00b?!nW80)9^DjvL0Epj{n^%Td#Ibs#%iemeQ&E>qll#x&>l>ohU(T*vRL%bf+L z#Tv_vmsGJclge}@?&ya&#m;O8H)#UE>%;ZI2mqDoO5&Fo6EB(fYug9_CSD#D1Gr*< zjJhiLSCyJ0k^BYun>>^9wuuKYDW98TVt{$SW=y<1+JwqPx$F-b&0R5*>DQ7e*zKoEV6Ne+ODz!8<=1~{nNVjYJ-A#wzcfI#ICD=~x14N_6W zjTnVok*HolH8UZzsjcm*G1J}e*TAZ7r!%kr-c|75MQ`0sXO{PF#;X7T9_9`Jh^v(T zLIwb|{t%EulfQtt>_QR%Kwm4CMLo^WS3ZRS02EzLda?sWms4M>g-w_@yDc8(j%#Ck zfeZ?WRMA-rag~xQUr#_=4mN|nRvd+vK~KPF2*;^414^2)a1N$Ar zwE*DBhR#qA-Aa~;I|-sD)qMpt=T0|S(Xcktt?>-mw6cgegNH3 V?v&UePImwR002ovPDHLkV1nE{livUU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/leaves.png b/src/main/resources/assets/hem/textures/blocks/leaves.png new file mode 100644 index 0000000000000000000000000000000000000000..411673b7374dca402fe647a9c9e64229859cc28f GIT binary patch literal 434 zcmV;j0ZsmiP)Px$Y)M2xR5*=wlf8|?KoEuBSQptMqyY#_gb+gR!H$p+EnEvHZ2?HMKyVEpBu91+ z79fiV2W$flEjyhH%q(kenas2E^X7YiaDQQ?nemJyZ#mpwILX^VUTJ1|vvXenP*xq3 zW{yU{dQ6n$EkAB|05bqUS~DNc9Uiwkrt=x9XLB@iY)tZ&0YEmT^=orl^FOs-76-K1 zF7deCQC1zYI3NI+&im~}0~199>?TC=EwyGEK7=TA*18&PfbY=klVLwdgA^#uoYq4Z z!u^G9*OI(tPif}U@oI)GLLcHx(ew}j;B>rVI-g;)T^bHq9FSL5ooN7oXw(A~sE2cJ zu{7)^M4|=&NTk?Am1Zuh-gj~2d*x$2CQ57OpWmx->1BfjFpC3{t+usk&0I9EbL3pS z|7=}DZIFZdPt;vaF55j9b)|X0#CAvWqJUh$B(gZ5ByV{U`sQxQ$sfy16C35hRv@z9 cbBoZ&AIpSloF>jlMgRZ+07*qoM6N<$f^CkqC;$Ke literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/leavesoverhang.png b/src/main/resources/assets/hem/textures/blocks/leavesoverhang.png new file mode 100644 index 0000000000000000000000000000000000000000..12ed0df108b26c08d8867e6bcab2aa66845e3705 GIT binary patch literal 573 zcmV-D0>b@?P)tVht&5m)7G1{5~OyO|>%^z}z30m9##U?%igva{9?} zTzdg4X;*4x^QuP&^1(WbRX_#eeaF9o_Z_3H0 zLeRK;T^khJnwP265#c=-Im$=&vhdz?4)b1BDrnt6^sH8;E9+@(*fU!A9{ zLe?DKpga^@VhYk+c21pS98OTbQ$H`@{+%NDl1wU8EvSv zNWtMwo+K&kb~&B-6H3EO0?1f31r^z}8-}lm*%{}I-S76Fc1uBjby6zd-Px$g-Jv~R5*>LQ!h`$KotMAD^0FRxhw>Sn8r*_U}lDxN6oRXFg^u*1?Euoh+!}l zNKCO4%>>KRymefYYnMYTce}2Gknqg)?)Cltyt@bdGaP$!HytPdm?dkxKfL`Z=h{C+ zafv7{v79S(Cp~q@7R4nfW3`-X7fTWl=?VZq8LP2BJrhK_f+PXTm{H^&vH(Dp7my^- z8TXZab}U@&OOgNpc;Sw@Tx@F6b?&_5K$1Wdm$;h_l-r&3lr7f=5$Ot@abHOiQ2Ewa zv(?lrRC$3aFW~b4PS~oQ+j{^;v3q@a+K_+j+Y1?d9>7*JOV&FDJ`Z58B3;4f0lbjm z=IX@cBnczGTx>uY+gs2Hn|ULVZ7?# z?E;iB1OD~#2`6kJxH!Z7@zwEcG?i~rp{QMxBnF@Fd*FmEcp)>E%ur|*x*xjJy1?$y zXvlGY`{LlIY1DRXkYmLSfJ2~JvaSskZx@X*{|1xg@AaPx$DM>^@R5*=&lfi1mAP_}QjVK8`URGI@uDa+C^#8x7&{awx;-IvPIL6r54oIA! zCwJ~lp59+yzP%k7o#Ro=lLuhkBlF~0_gL}(fDsV@Lif~I_gF8rKmZZJ0BnT@FgiyN zxvUnZka-#p1pv-Dwmno?eL0UH8df*AX*?h$?|lg(HE$tCYl$gyn?^*W=4}ajS#$Nm zw1&i#apj2^{c-BShrKbGT&)IYOF4Ws@bif zrj@qL_j<|O0dI$kI*pieEyeW4Xn*yPx5LGk)~`z&gGd3KlSVVLe}$!)zJ5p!RfnRr zd|5p?R?|j>oEQBska}|~PyicKW_Px%V@X6oR5*=glHW^HVHn3hJLh!PIXXQuovvI-NT6g$5||JPT@@7}byHW764hOQ z!JwO~_so6?#WXE4`=zF&oKWAP;SZ%qQQ z_BlaozC1KI7zS8c`9v@fM3y9C@g(V7k@``U4qZc*B-(v#$dbg@ZIkiQVfy=eNau>k zcBv4~S{bHp-(_xL9?vPAWMZ9}Cy%&vWrUUJ2I*W8qg^K!PXbUss&a7fi=XyyB!Gu^ z?hy(FdG-7mk?1PricQWcP|6n>9~~x{SSJ=wl1!|->~jnA4TRo~w(#YlVLCf~n5Ko{ z53u#)JIZOF+qIa_Qp{%o*fmq6c2f*=8+_T^L~$xQcO<$Bz|!&}02^x&S1?Ugc{wwU zXd>K-8k0H$fV`;pl%v6(HP*g~MGDgmPtfO5qq5?#fs$c$Z`;Hi$Llce^_08CuF?%L~B zWB`61V|vCe^w*t{TMM{$?v*ig&DF*!a#*eX)1Wm@;tX^fICeV^okD*Bdnq8ePca4l P00000NkvXXu0mjfTU9uE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/munchersprout.png b/src/main/resources/assets/hem/textures/blocks/munchersprout.png new file mode 100644 index 0000000000000000000000000000000000000000..27a7ac80210708c2b03927f32de116a78c25c492 GIT binary patch literal 540 zcmV+%0^|LOP)Px$)=5M`R5*>TlR--xK^TUgxQPZ9itApCOHoLnQ+x3s9zBQ%y%YqY^yCjHw58Cq z_TWJ%LNWabh1QEudazLN(m)6;v`}Ra3cJEKOCcr*3o*+wJtRBLWF@EWY4~Qo=X>U5 z2mZsC8@0K$Af&J@YK=ckju&|K!@cqR*l^+Q?sp0BY`!err~|;{c!72|?m?e^k|QB2 z$DzzuYiunD8O901EHZz~MA#N#ob>EYcGRE@WaT)NK|NsOVjnl^Aj~4dws>^=IRL^e z((c9pNZQN#SbSA53d$hYT!Yl&dHd{!i^bgdx*|^vT;Qqt6 zQbB@xKrU#g5QS}N6Hl+AjGbnZraiO1$kFD3w)tWCHO`WAV`Dm0nWP10$)VkiaholK zZKM&g}l*P%%C%MdZ(gru`XjdFObF_ItGB>LSo6=I7ne|0}KB!=Lz7`(9 zuX``a1q}?(*Xnry!}Ce{px=kzkWPuDUk~af)tJo9Vt78+m*<>)-BXWIdzIS-~OqtbE>+h_wL@@+%mp@_3!Z2Pk#)LUi>pWdim~HIHtmn z555?FefagU{QcdxlV=o;@4+`e{5E)L9pPw{Ee@_BY*Bz?y3ZMm= zcqWd|%|KEVKxuzA0RkfCX)FR1f+AD`%rYtwFA#^92t&o{v${7_O%i-7hwD{K@^#CVyA$6=}8W z6`2KMf|k;j+A7tSP`x6)l>QVUBQv~zI}spC2oObmBrQRGi^ZDqlfFz44l@H(JOf+^ zrM-^|EUgv|b$UlYto zA^I%7_i2k@q(~ymf*>EnB?7a6VsMRa0b2TN3s{|`vqF0r7$HWALNpPc&&gA~ECXbl ze$2qTfFFKqh1s%{36+Bt`MBWB&I7yjFatd5-bOzrC?k*P`*z5-MiW4G3L)IdjCdn& zr#+v#MspssqE7&eIA47t=FcqZE`;02_FYAqZK_w#Y_5yy?ew8x7I_d-JIPF<{j&HJ zI6i$n!JT!7qeOp3m`~ZF7!>8hstLl$YVSM2nE>N>ogI1$=qbC^oghnLeX1i_5~m2| z2cg4lak^>(kGd0gB255`rVHTx*<7{zx)rjI#J*)H2Ip@=_5sKsjIa z42-mI5$^4H_WUoPL`(fKf-?a`FiBxyB7n_}GCM36>_TAzM5TCU1qYpK}S3$^^(RO;M+fE|9!C zuC(qUFJuBV`=iYs0b)gw}xCm)2@2qz}uYXYdg zJ2*KP;FAKk1p9Z7U8gz^uTwwSojUKLICo?#5h(Ii;2ebSG<2f-#fD?fh1;}!GIXN5 z2pkhw`k!9aCqaFSam+=r)uC(;XKhQ^y5_CIqrb&5eL>20!6VNMyQ=#G9b?L7;J3r< z7c%l|wm&);DfVaJx5MlwxJK_f9|eq1Z>03?Fxwqj2FNzYUJR9km6O>8CuBD)eN*Zjq(%(%xP|HLtoYUNtf@pJavzzC|)2GQoBQ ze~)JZ>=I5`cLlcl_}zj6WS6GhiQ#*?62P}b_BPoKDgl@UyM_}!D|!E6V{g$99-^+V z)M@w5faKOn`}vIh;9*w+u%BqZ`WS!t!Tvjktpe-~{{eoI1QO$DH$wmb002ovPDHLk FV1oD>qh$a9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/pebblygrass.png b/src/main/resources/assets/hem/textures/blocks/pebblygrass.png new file mode 100644 index 0000000000000000000000000000000000000000..ba9c079648c8cfdca7df6448c3bfda0458c07717 GIT binary patch literal 615 zcmV-t0+{`YP)Px%AxT6*R5*=olTB+AK^Vt>-A%xh5+~a%ODE<~L;@Bqxp`BQiyxtQ@&oiE1gg-R z2QT7954{LI=+#@>v&9uSP4lyv@`9h&t-;(d0zf6GuPVtIg7eS zIG!LLC|34faM)bO7DWIiYK$$4Ow^eA&L$N{0FcCre!IimgSVe&fGJ*GuHz3Ac5go6 zYUn09yoakyg8<8t(o6#IhY7XC3ayhZQ+TzBEsD4emuV0HU`>MnOG<1}B#9MKn&A%< zqBNtvvx(ygY*EDVL~am(B_$R>)I9>A-|leOTqjC1gAp+N0Jsg;+ySh3pm024$g)L| zA8XI(w>!8E*F3B?Z=3u5gV)3Z#WV;gOw<@Wa+BhL!fm){ex^ZSFfVOyP+P9^`1BqA zL4v(@WAgM%d4<{8l;4vvjwi_c5%>0A(fqp4@%39+QZgHjC@oxL`P(N(zs@MnmnhGd zu%a}>@kDOjyWN-67ApWe`uOIOaVa@I{cec%hY8kUb3KQ1X?ufec>#ZznEag&&#|N= z>K@T=cZ^z5nw=ZTlG04khN_kqs4Z5EskD?~FURkMlD9tG7RsJ@T;|bF+9w_Ad4Wf&$thq^I#UEusI8x)0>D>ST002ovPDHLkV1gY@ B8%F>D literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/stonymud.png b/src/main/resources/assets/hem/textures/blocks/stonymud.png new file mode 100644 index 0000000000000000000000000000000000000000..ba322fa7fb1838d664b71a32fcb4140e6d81ee18 GIT binary patch literal 515 zcmV+e0{s1nP)Px$y-7qtR5*=ol0j<|K^TUgY?fJepg5&LsBJJ5^yVpeXrL(cA}Bo+i%5TfcqoD= z|BxregLn-j1d_i|7{Y=yWJ@5+e(VwtW~RGKUKobmW!`ZDOU^C8Hw% z(sho}5$QVLK4$;~A_73x*qzdK?hjQBuijlCBD8L}wht68UN_~h9OtWB^sVZK-rxH#SJAzwd#B3)-SBe$H%bT(nWSn}h~ z@Ba*{f3h}VaC(M_kQXJHh(G93MPZxiY(lSNn9e4I0Q1EXw@+si07L{4*wgV&6M$aF z5Ii=Ie5}!Uh%^AM)){$Gk{2a^(|i9uNmmaQjE)(NhyLU1SLZ0D{BovBDOOuPZp5v@ z^QW6Cbq6pC+w@-!I6Bzp`>&tgKtxbV`5HlWOh!i-9RrXTB}WJQbi0Rq`*P#CxIHh* z`V@AV%oj_nO#ryQd|#{R6gs+@NbSlxRVSpjRUI!8>I^awKPsamZtqe62B&9!yso>0 z+3KGhZ(QW2fz$0>iqUZmu;Wy_iB(nW^g3p1`T*D&{R0PF>>bol|E>T4002ovPDHLk FV1luF;06Ey literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/blocks/wheat.png b/src/main/resources/assets/hem/textures/blocks/wheat.png new file mode 100644 index 0000000000000000000000000000000000000000..7309c78018eac8c9fb58ef03374b0d1d898ee714 GIT binary patch literal 700 zcmV;t0z>_YP)Px%c1c7*R7i=PQ!#7XP!Rr}5ovH-CzUd|#;7HffWg6arC@l-N-%5MlA zOnyTKVbAq{P~XeblWdpXqId7^zWctrC*VJ9 zba}|>9GjOQpUM1gN1P)8panB!z^vaT2Rf`7z`kn{B+d+Eg znCXTABe@tTzB$|Dea}OB=a>P2ZWuuZx?!O2c>*l=q9}$+ce-JS&XlXk3@E{NT8tJhe7XV;8E(YIzPC9e~^r?t^0bn~W9%UYighBfnGN3Hcc3jww zi$Xq!R@LG$0I(_zW;?Esv2y<&3i%uWppegjV$|r4q4ExF$HnKXmPnwkR;9t#9{dO} zx|*p`X zSXusWp#-B_U8lC@is+9$d}r3KIDLhS;Xl`beNQfz-Df2DnyCI0!R!%#Q;ozXdn57AD=&IuoU_4&gXNQ z<`2BC+vL3f6?BQ8r$yBZP=Sk4cbOKrz{RNDG=K|_{XDaa{Xl@a-`YtQb{S|Lpzbj6 zYhDL%2)^%T>AW6Q3GikO&2RhL;1J9N+S8@#S5yGzbw=g^)#!c@AU>BVyllq#4MrUj zaEW|a4)U9ZeOwH<%mED4(9eO`=K!}I~@ W5qZdzX0Gc10000C`Yu;32zQtEa4AXK({QCP-f6$|F(SOcHS%zJXKh$$KS@hwa@Rq=Xj}-Rf^ftGN znJbC!QRdsSi>92MYxnUCKH|icgPY$f4V->b|Mv8s*DPk2`;VHf#!x^Hrl-?fxvd7WN|V*3%A@raJd1SGO(0m{4gfgK@gO8? zrN?W3hGsjr$pCM|-wGI9>^WrK)2nOr!;L$*K8OpoM_GEbc^|J}GkoHLL&@9HKyvAJ zChv!FUZTa$&nthAUkS|6v`301losf2l&4jhPuKSDeD&?N-5=7vxn6*v6EU^=00YQ&ZSBIP%3Jby2rAm#V7byG zeO$5^3*iLLx<$JI&Kg87JQ#r6X}U*Gh0vr6g+T*j=6fKlzh$n{6Dp}@kjnvTNF;r< z%Lt)B5&f^{9)Uc+C>ULOLl8V-dzeY0g=HOOoVdAx$NF**m-ucepfI1lQyNwfZdPam zE>4!hA_mx$^^PJZJ1~UE@0n#g*>}IlnQ|jXTRN=^ARp0ezPo74OT2M8^Y+wK{;Smh zW!PcI?p}}iOKSU`V{q-Kyti|W@sFiv&USLcfoV3{xfuD1ZqrL$L9i)^JO4|JtZkGD zUkO^@`9V&%R^Dw%T)U+}KEyUKp!dNV0F)k}PjKiKVKZ(DY2EL!smmK;4J^Lpgik5U zzGTNIJM+1{cA>4vg3|8VI0o{ukiiKG_NJ94UJg|EdV{tEhvd;GS#Z(}(-eM4H4T+$ zYHz-va{)?ShzwXjUSvPUkmZ_Oq^2N;5N`5z0Q1o4m`*uBE{eG4;3{+d$iuI%UZ65W z&@`5=cNa54Q$f2&V`Siyrf}O*t6LtSHe^uy>W;}U?)f77;uVY#yr zzGv&{A^>OF@qRaXSJKT!5nO1s?xsB#=hkF4H&(SI4&T4U;Qhm@f(*Hs_ zf>B6QC1Jx!BUuN5nmWObeFvrccV84Fk>Q?*7m8Fr)d!%z=dhnP>`DH+UA$%7XE>T* zts%a$!MRYt0-ErV$BVUh17mm7-Q;ZN8n?V!GPtzDnU`?Y-`x^8myL4GkOAVfid#k;Kpi=FtQvHqqozs`mI?2Fq`Bo}y%dy~^% zYbR_s_X)8LnZaHF7^iIJoxZl0vZ{>BGwI{%&vtQm5g;R#wXGcY?BwQT=-ywUD_PA5 z1MDhXn-s;H^Vy7~t|m98Csg2ud`yl7Q0rtJjn(IcOE0ug8SyI>psC2o-M8EZES0NL z{QK-pO07VvEIQ6!q`X3zrfuc zpUJ%Zq1w>Qmut-E36v8w6?GmE&mXcArxPDe`UC+0EXImZdISYZxoKdGW2|uu<$ABC zKq0Ub=NC?bA0w|QDI=n_7y|m$E1F~ zBIw}EaPHq2r!7c`Owq^M$2##9j0agWAwv`x+bVO|2xD66=ZdB8l2=30xSUDEJ``a4IVD8@)c_bp36po|zasrcD z5?|weHLnL&{;Adw28lh;A&!M2{ za4ZD!6Wv1Q4G;hQUIg-E-9k-!k4Rlw_jj{pi?d-frJ6r5xVE*QL~gbR9+v_J+|Hp$0FqU zN`MnqwqRN7WM2qFY}$wc_iqyq)qEyJjWDU-dkTfTt7bNkZ*SYCcET1Z9)*&F{5H-F zL{A)^p-vyI(SF|*Ps;lk(?b!7DUU&@0I{gCHGRRFBQ!zcOTyRW*B4A6px zFYiP`Cd@I9s!*v7>(LPiz9ZT~v_-C%vuIhv*WPqYTpI2Ch8AhM+f0fvMa!H1f^Qow zz_tQZ5~%51euJ++E@+IhHpD*qPtBGB2uIPm2{B3^d8@aeRUb4SsDK2%oIB`8T&|W6 zX6zJUT!{l+>9!`6b{hIsY-g*TcCeg

Q1EOub*#SV>Yph-zg5XDX5twz1G<{mr^d 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 Uw$yGG-P$v!j-CCc%)%q)4-l~5;{X5v literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/entities/emberleafmilitaryrobot.png b/src/main/resources/assets/hem/textures/entities/emberleafmilitaryrobot.png new file mode 100644 index 0000000000000000000000000000000000000000..20d60a2cce6a38f92b293056be0bccabc4b11de9 GIT binary patch literal 4040 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 uZVzFO^<%>2>-)O;8>2I&-# zhTr=B`<`>}oqNx@XFks}GtbO?CSFHNh3EnO0{{Ss)Kr!9FcSXn#)Dv<-7?mL7=h)Z zr=kGV{DN)+0Oh2blDt8{yM1$KH>e8iE@)cl<1_Jh>QYL{>ATKm_&5V~-FqkZrGx z%!NhP6ygdl$bKtT z-ouk-Ea2wu$vbhsnDHRd$iiy#68ccP5aHeCvaYmF`Cg&aL(;ehc*C*B2fZmz|8l>9 zk2EjeY`qL@xBbiN27H~@B0M?oSCH%8bnPy4WqSb0;Q26yftbv!RsolQz7b#NGnE*o zH3Cw*iL2Fbp6!|3k<)mFVgp+<=p^X_KA{dbW-iW_nPtCedrh4b4A9GSSE^?ONIU-M znk}4O_5bFzPGMK;Ct1ku;PZHgM!I+<5K!E*gxX6RyjjW`q%!I}Lk2{?!-2na7e1+7 zI<6f9h22vY+dQO9%$s4}o75zwJ_N~WU6=K&bc8)GC`y`fyEJXY_ofDP6qdauSNx_0 z=m_l%_TRMpRtlIHMeRk*xWx>2TunL7GSM;dY|%B<`2_dT(+6tv@TeArpWCQ0RX82h z%7km6(;WnU-%HbTCtVE506s=EgmdluGNK997=dvEqMw8y2)ZG) zm$FjHbe0JDNJp~RsIGe_dw;F)QUn0L-5=Wna-NqRS9XJi19?e^Nvw3@!< znJbVi_F<--&dBlcvd28PPB`254VE|Caj*U<*VR__u+`nbHyMI&>=zZ>v5FbMwy-V43**EU{D*_e?ORjMmJMV(-9V zXT;2XO{VdjMM^RPgXp~^Lrq+a_>Zn=i9Tl^{Abl7mZ7ze16j>(Ef4iFUjGW!O!{+Y zn<4`SF1E%;#^xvD_&ny}PRrJfbEFhDcuEw1I)**QL+V}rf_CudF>yP#TQ{hYImcav z1uVNe<8o5{-Ct*i!qkjQA`M_8i1XrwwXRq3j5iUlb;oD0fpL8b{<7?4k3)k10u#&` zq3sC77GQylS@lfv@Zj}Pd);+;`o?6FO40H$0P~Cmz;d+hlLWA5meZXYAm`>qmUf8; z6!$Nbii=rYQPS*%@=LZ`J-nlV&ij1tYCrEhB6|H)&20e{>8Tu^G6O%|oO9<0x#`v1 zn?*$~NVgwXEvZ7v>T z^O|_vkl)@INa)|D&;HZLN^5wF`B;pq{y9#&{+oY^haejOuwX7}cmI7!_DvsSsOrI; zbifF&+3f-kfLsi2w`Xa1r8%l=dW11@-F*ZjjxGv7Qg3pdR5&=+XPPRz={o1}m1Y0F zl`}v({*`I-EbMd7!eZ2`P1@wYTOdq7rVa@Rq)jeY{-;rijbOTcH0h~jXcXccw)Vmf zYsKzCe*mF+d|N4*ZzkoQmpinIecv3L*;+w z<>P0+ARDBwsK*wXv5SSVP_UTldVI_tNVUq>1vwIlR;Ek3j3;#Ih1(cv!iDoSNprI8 zUj_%ef$AS2-67e}`d=bXq@tY&m)iZsKtA%quOY$`^!2{}_-0X9TCv!#^n7SH4x^q( zC11X#EVTfP+#vspVrMjtj|^LauH=ArQ)YZwt1ALz|3X!C<}y|jppqZp(RW1 zIZ6t@Df)bYm}F=(Dw5?u?aS`R*l#!4kC7i5Z&TMAH3mA>LBZ$>FCAVzCZ$O(OQ*`biW>gxlzJ*2d33*gt2(8mQ`K?j-Xi zPK0?>L_JWa4gxR>F+DN2 zkbCk2qNel3Q0D;w&p8YM(|^hfMCX-fwex#6AZ?nvGc~M5>0-w@aEid#RS`_5wDQbc z$bH{VyLuMEg6Q`8i$zdgm-2>a>ZpIi!o6II%}`{IPD5Bi(DPm#z`49Uf9SRFGnSro zJY2=svtPFMwlHM_oYML)X_09oOJ?@dKW4o+maHJTOL*&#rIA* zb8O@J<1o2)m8b>EONDeP(qNmWPDF$^q9=oHRHw`S2I5yJy8Z^PgnaB==qeE zojz3tW|zO*IBV>crLgXpg&_!(dfnkUVK4}6&}ELN$EbS%@BOGZkI@6tk0~M$wKgbO z!r3IHff?{)v)tu#`}(=|hlMp$3R;5C1u6r@F`E}u2?;_`Lx=t|k3RCTb8~K-W9vX2 zpXRu4kUVV8RKF;g4HTUx;`*ylF5!aK*2y4w`65*u8wQVm`P+1}@ez_)LH-8Y1=}Rz z6Wqu1yLraa*HulqG7-R<`FfKAm*kVI2~Q7?k<$XMGt09aAI+@inlJ2mqE2ll@-u?m z$R`mHPF!B|hZt}DT$D$-V(L9*{u{ULLL8T&Br`9pPv_gSz6WePQvw8E_s%5m@&_Wz zUE$=+MLT%fnvgl;;7&(vr zVA_>1#J**W_@tvxALW>r>2AfLZ&Gb*h&N600}@L5DT@tc$g?pn0~YxnVJepTS7?I# z1PdCfg&Ig~9-SjmySo_$&}`{j2?Ue5j|^LZsK&cq_j zH$Os{0Y~Qbvt2&l&nCR_LTJ6U&q?GPyI~ymL6V_V6u__tbK0n7xUWfa5*yRzYErG0 z_H_r2yxh|5`9|oP_Y}zvc86Uz8EIM$x1u8`>Z=< zoi}hxB17(9l#TIG(nTq#f$UJcX*p!nHkhuAET2TtIF2gh#Cy`RrqV&H0-LdxAi11_ zmQYXTqZM7~;;*f0yHuZ+E^ztZ{?2uoM17^J z@vTMvPGilFCmjup&|SNXa6Yn%5l<^)V9%D=?z#wZZxG|v_aF1fNSAt0Us@8@5{mH- z;raY1SsF3Ae7B;OF6fwD1vg|=|EF;Xe~997PCB%|ctQ;R4kQ*CK`LdD^X+|JVa6`j z+V@X>EXzNQ0nTt~YhF#G#3IL$D)T5`F5?uVD<8clQ7$IlmRF1}XN~8N5P0;aOyH3*!l>$cH4pDNj{edl z7ksIOj`Yw!ogovJ8kip2>AbBN#$XWbkhS>vg;6`7`s2tCewLz-cs>aPtOhv@)-&5{ z-~Aq?R~hY8xl>&%dY|{>=kTjIz6ZH^kkv$#kbf`(dn9zdj>!e$;-l)1Xdhb{fcST)Dgd%FI zJZZ0Bd=qcn`~cmc)E1XI0XmTf!@u<4$kn3^pKOI++~W3Va%8Y3AA0Bw?CU-VV*duT z`(=C!OEuTwg+6DS@;(edB7=}H0zgP79%$iP6O&Z2xR@kUdd@T!8?>1kR}L9v8czVX zDXZ2SmA&0>ZZQ4NHBuw5Y%P^qxlX>E{u14nLZ%kmBhLo zmG3;8Nv9nPueml~h?-pXFE-U5wsCyXodu|_jZ;vjycy5Lmsl<%1FoSP^kzzYv(%SY zoW4ZJ%!hPL=KdPLz{EgM3oPD+>4U+kw~e%xa3%Xr2aOz|cGr*_J#&utL;N5<_!FaF zz2&ZC>1=U3xHOITo3eCBlJm0x#yX0MU&||q>z)YgV5(DsBD1vGC(77x@~A|J~`Pmz72iI0DSw4v$LK4H5E68qVudvsB~?OB2xk#{oDGV>`$36=xi zvrx;+wRBhK!Ga`noq~6|+*|%e-9Z$fVet?c5(neo(}d+n=ASGxXL3t<79Wk>KhsIarpRH$Ln-fr{Z^_pJ??Jjh=BD9 zmEU#3%}%U>tCbwaDiGXWmrdf;X%4_d;ak&y!t=6CMZS#=9Xe3?_FhS*+p~Pw>I5Ax zlZfS^CWz$4d(@cJPeH? zm4~ha7+U>bh=_rmj7BwDx5G>~%lEiB`2&r%w+n)le&*K{!Dm+Bq%*Kh+GE%U{kBwk zeu}Rn_}DhNa2#+Lkfi;AIZiZKpJKut1xfo61J}xVx*|ly9N?4AOBd;6!fcj2+FC!N zBn?gD<~)*F5*^N(rDHZhA^h%yb?a9Gvt&t1)}mjKHZ$Ncq@plwXIVC>NgOs1!21TG z)syhk+QjUA;Z_qJ3%#Meo-i%u@A~HUSLH9;=b9FE$cd0;*(}~fn5l_3RI7jtP6pE! zGF-L0Wnyc~oG8*hrl!qa`vdEp2YWoiuR?>P#@;#{I%sHXGH1m_xHe_3lKD9mvxBVs zggf^$uh1teq=d@-mP>mJZ;f*^KH7qGu`2DLkPI9QnKh<=kD+GP{3fX{eqi`@1F#JH zN@}@mW&FfhPk@2&0ux`l3}Pc^ZOzp<1o&{vblT=rAeEPfjKj)PwZz&)$u1^2QWNb=Njwe>MHrYZQD9FyRuF4&_Y9o@% z9xf?uAB^Ezc?W*eX>WZ7a6ax>!Q2s16>DoVkBq&gIr^baPYaDNo5o|C|9I+Od&eaC zW@vL5MUrzcl;PHj=CKvoE^yU)9=Xxd2(vmjC5xGYhl3QyMB&L-F*R7C;=V+6o%IL8 zfZCnXIkStjwzkN>ulJP{B5evP)z%Bn@SwqQBljP!0kPLty-~pj zeVFOVoGpcG?&92bcWF1V+=JOschI993vAMVH6F@J%%S;i_CJ3d0hrg@zm+34(0)<_IQ zHQ>v2TpXXb-WJb})RE~5fsS^U!qg}2KVQ!WpGCjZ?;&L)rN=KYVH-UxNrS=U9-Y$lkVH%&)}`{2={1G9@CPSDd|g``YsRPZa)| zGs)6%1(T(sVvMY`}*c{0Gx!W^Jbz9j1ZgB*-6>TV5b^?>#n1ZB~Bcy&oQC+zF^X*HWrcu!{U2P^L6i literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/entities/emberleafmilitaryrobotawake.png b/src/main/resources/assets/hem/textures/entities/emberleafmilitaryrobotawake.png new file mode 100644 index 0000000000000000000000000000000000000000..2c9da3baf6f5acd4c9cff16c207c90a9f42ca6a0 GIT binary patch literal 4182 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 WY;bH$t>Zol05v5o#VUELu>S#EW(Y|D literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/entities/emberleafmilitaryrobotdestroyed.png b/src/main/resources/assets/hem/textures/entities/emberleafmilitaryrobotdestroyed.png new file mode 100644 index 0000000000000000000000000000000000000000..744b67e46ee9bd4c439a70ee917c2dd03bf87d3b GIT binary patch literal 4426 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/entities/giantbutterfly.png b/src/main/resources/assets/hem/textures/entities/giantbutterfly.png new file mode 100644 index 0000000000000000000000000000000000000000..4c8028bbc7eb20683d96d1f0261a67e0a33089e3 GIT binary patch literal 6182 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 ZJH;9KP2*&_z#spB_AR}ecnzD-{{W&b|0w_f literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/entities/goldfish.png b/src/main/resources/assets/hem/textures/entities/goldfish.png new file mode 100644 index 0000000000000000000000000000000000000000..f0ca5a597e274f770383f12cdd10be6dccd14832 GIT binary patch literal 550 zcmV+>0@?kEP)Px$;7LS5RCt{2*RgKfFc1dd-$EdJ5i)aYcV>yfA$$A~Spo!|yJXA*^fdxx(L*$I zI|yE4X3t0%)pNUGqI8o0L3U z37QJ6_i;c2;bN0p3lt8MPv1rrh@_LzAOQF`5H1E_j9HL;LZLJQ0L$AM=7&#MKE@Uf zn4Z<63&26ji-pq2@^%IQ&lVr|mpbL`lE}0ZE{*7~_gcBNm>)iME`E&Z5B&@16ClMT zH48q%;(H^j#hbHfG_*)ceO)b-!ljWPUp@~OtZd(hy71O}qz-~sjN83pATI_WlqObo zx^WjS>5cP~3$)&EH_V~DoB{RbF!~5ftNnS6+}go2V6RY`-d<>Qqa5`fFg>d$z18l8 z8$|{rtpvO1TVif4v_;{7rUD9w`Dq*r4$^f_-!(+<1xhH5=w702asCU;w(0c};2C&}rH*NDZF1Ur?_IJ;DFMIcZB-V(Jxt(@-KLhIS&#=aygNTTT oh=_=Yh=_=Yh=_=Yh=|_eH|cx-$dERcVgLXD07*qoM6N<$g5Xs6i2wiq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/entities/hotairballoon.png b/src/main/resources/assets/hem/textures/entities/hotairballoon.png new file mode 100644 index 0000000000000000000000000000000000000000..065076154d35b738bd934ae5138fc6417a112d70 GIT binary patch literal 5239 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

(!q=Z683KjYD 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/items/612lcanister.png b/src/main/resources/assets/hem/textures/items/612lcanister.png new file mode 100644 index 0000000000000000000000000000000000000000..03debe0d585518d2b83c70634873c5acfe495689 GIT binary patch literal 1576 zcmV+@2G{wCP)Lg2Y1{aS`3EK!(-bEV8(o?5VTAV!qyQduyh*XQ#V&hY9@m``7=g$5&O~)O1%S zH0^(X?fDYP4XWl>dMf}<4-@5+r!O@(v{RbVii_RQ9v@Zq}zWLyV z7`%JrU`)9vBnxow{<{L;8wefb_07)yZ9uvm6aV$h8wUI~*-9o@8yzu#`VTzwP5_=i zdLp1)6p{t#=K!@@&2=|Adc6S@L}S8C91Z;N@nM4o*C=}DWvpZY2!fpvhqk@=Wa9Lr zIpt1Zw*mf}_w2?L4z~bIkdf;38%%l;diBwthAhHux7LIEo`@3H?fYIfXb9}OoB@=} zfLj0=sMY#QXktYZn>dzE7~Rt(CZ|- zEu1fSCXPNbvcmwlXq*86tt^Cc=;?`wCbpYT2P*Y_-~C#XiPKhd&H#X37F-7C;4~)) zUDh05H&9ojTV3&S1^_9SVMBtHuc)c1KivtA#^6|dSjw7Z^TW}!k9PRA4}T|o^xWRiPKuU@xjrueE2(ow?f_yIWPenjru$Tlzs+WxN^74faYAo05SlLfUuO& z0URyMhrbhQ%P&ftCE|ypQRW$-=re$EG{U#vdMTKkoHiP0RKjWTJ|0;cymI!eLu9QxEPeI*sksH9 zLq3lHF5t7tXA~X4(ePs_qXRfvmQTJasV5MPU9Thq2!xjt08fJeL0YGb4&Z5^1FbJE zF0Q&I!jDFs$X1vE1dxUtPJBiIe$lXK8fa2S>!M+wJ@iQM*rWHm>o*o0j)t$&4B+B} zR3;D&CL-ld+~*e!tK0G7;{){~TTuouc>>^#(6VDL zu%332ttbPsf-lQY2E4a-Zw%mNjO)Gz(>q_rz`ijeYlG*`pLd9C$tJ<)V??2uXkp zD4biJ@4i1}G|;Gn^#LF4(?AEiw{0_f9v?S558PznXpvp{yhnD0<0~4;jS#mw+y|`p zW~W8y}!=eToR`;?k0tJ2_>hKmEzT8AGSN=J+;> zto9){Jlq1Y`#|6NWHs)^|K-d~5LxR0r;o_4qGLgaN`5uXhjXo!N)EG zcv0i5x8JTeLcUuaG&;xnkmZwuk9wL@t^)2!keeP22}FNSYmQ%+HP7 zoZzsO0UYh?=7ku*AA0)57{Iy9$I5-aSkco~4nEpwPPqz%kzM=r71^~~r{InpJLB%| zxY4DKSkcp#gDwLvF#zaa9e*i8LhZ!(vJDPVs!wkr~VuMzHm;r;f zqj~2u%z(TrHfZ&S88B!&ns+|K49L4;gI0f-0b6}XHyZy{00030{|@Zu*8l(j21!Ig aR09C-i`u;#87##B0000Px#^hrcPR5*>@ld%fIFc60Sh@*(TItg~L2*C_)SxWaVK7jZPzMs2vaaRPXLj^ah zZ*Wd0F_x;h`7eQ7{xA0*3GknqL^1yivD$nDY55yjk}?2LNZ$j+oFysyF&Y8x;Vemc zKAZ7!G3Pq74^nP{LPB{uBN`46P!Gl72nq?Se67T|*>6=Xz?apA!vS_>q1?!|0ILnJ^0fkh;&4Pf9--guAfO(yBxSdQ zwr`Z2RvVUiNGJVn=jE~|fIlE<-;E<{qofnbYPDgj4a+Px$TuDShR5*=wQ$22jPz?S|atXvh)dj}mfOm&VtdTfCCDxqcNl}&xj!;xZ zg0NId78C}=DJpk}Obwylu%G??*uYq3jKWyvFiP22<{&Aa>N=cDQ(`>C8Y1>wRCxw! zJLn<$t+C9|C~-X;G{qpUnd6#yiaCO$;PDX2OM}RhoTF(i{S{8fa?lt?DbGK@aB0e3 z-eR)_wH>NFgQFi?L!_lp+hKNZ@blv1wqKL>=z7=@d+rcvO1I?y(@&a#Mj1z3GuLPI zQkMP-!uZK7ZKT|T-i-csbO8XWJVSl{8!Go8b!&(;azEhGl%Tf5VzV7kTl%ZMK3?OK z&hf>G6vS2`f^{^xHfjzgUEll2DAJU9vuJY{RfgB5a?qKHt zaNDmbu9;8AvNtwJ3Kjs!9fVQJvwH&o`2Kh!?YJOXLlh(hi>Xrk1s2#e$g%4DH~;_u M07*qoM6N<$f{SpxDF6Tf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/items/blueleafearlybulbflowertop.png b/src/main/resources/assets/hem/textures/items/blueleafearlybulbflowertop.png new file mode 100644 index 0000000000000000000000000000000000000000..f582e9ebb4b628912a90df87ca03f0c0f8f09ab3 GIT binary patch literal 272 zcmV+r0q_2aP)Px#%1J~)R5*?8kS!8|Kp2J}7-#eVBxj&mJpc#b033mA;shRnY~UCcY2LswLHoj{ zjRZ(*U{-#WYVa*P`+obqKMQ~SII7Ftti5rk#PfVJ!)1F~epLVFwSWqMc?fs9Tq=ho^by^;i>ABRLaCftip2^R+x_m_xEHvddUvS> z(Q~0B>?%$FVwNBYeFAUH*(x6sKUtP)Px$3`s;mR5*>rQoVVDFc5vG4bt(k04Wn^0ppqtyh9p_%s`Qb9lSwm>;*8Cq(>4R z8|YH_J1j($A}OLq`tn5E?PZCe(iBDKyCIA2c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/items/butterfly.png b/src/main/resources/assets/hem/textures/items/butterfly.png new file mode 100644 index 0000000000000000000000000000000000000000..9a0bc36dca4c5d12b5305264f0a16c80af702265 GIT binary patch literal 286 zcmV+(0pb3MP)Px$rAb6VR5*>bkxwWzVI0RlGn!3}*0P7?qS@HmCP{5M>{%(N*J*E*B2pwyF5;$0 zTx_cpH}2kgUk6uiT&8u9EeAtw%VaL5X&iW-X3TQ)y*%~n`+L5Be(;;P9vcp>$A*KS zI10e(U|y2`-`fEETbw5-3{b0-$rg%?Z0|CZNdu5dXslgT6##X?><`52OvqO z=V#O^WsK<=PS4L6%A`ppG`YNB_67jzj&-X5h!>!zGliMd$rg&#DrEp{&qs)a`KlO% zW32S|MRJ-+o&AY%nsL=I@%hbTeQP6DlrcTS)Zx+hB?5>{w&zpX-IUhDIJmisml(EW zdp>|%&K8PTjw?U7X*jVMkq7{Pdb*ohwH%k@gT2^X71?dimql5Q8&S3#m(k@VN|Up( zYpA81Asd}KJYsZtDW+1bH~71`#mU@kWM0Y{fl|sDL6_Eo?fK;OR`Tf%NidT-mg92q z@I)%1arsyWpuJ5;?5JH@3ji;#AC@m3o~YIvO?wc_u?~PpL17ooAk<%8-H#8%`S`rC hfaSOmH(%8O-T|6@u%R#CMv?#k002ovPDHLkV1j~e;ZOho literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/items/danglingfluorescentleaves.png b/src/main/resources/assets/hem/textures/items/danglingfluorescentleaves.png new file mode 100644 index 0000000000000000000000000000000000000000..416c02cd3967d4035230ddc4a20278cc85d895a7 GIT binary patch literal 392 zcmV;30eAk1P)Px$LP?fY6S1=g<426?7sl$@jMd06@OJae8@@Fslgw`{hvL zk_3S5SOfsXRXmvn*e{0y0KsNQj(h;XYCUfYouQpHOp-I$?5KPC+!WA*Cdp}%oJ!DJ zWLq#v&M>Q~Yb6P@nrX!=p@H35{m+bd;dQm1<9s|JdOcj(yg;`%ZU0Jlmld6X=C+6{ z26hscAr3tf|9Qi1sg_tB~ zT9JAi0pLLwA3x3e`O(9^(?uzYXdw|AlDH(>Kc$0HW&1w3@b!F{)pTCbv}y!&c$#+y m?wqQvu0>s<-f*Gc68QrGY7c6;x7`W=0000rc literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/items/fluffalotuft.png b/src/main/resources/assets/hem/textures/items/fluffalotuft.png new file mode 100644 index 0000000000000000000000000000000000000000..20f189aac376d89dec5e9676885beb70be201650 GIT binary patch literal 376 zcmV-;0f+vHP)sCj5vd`wufUvn18aL~TWvG}Bd(R2%}t znlQ0^m!nWou~Xb}&wKCpzzr+U((ab~J>d2EaTNB(4mXQgchDZo_14L=w2MQ(7aE5? z%k|a)aIV2+-4cgBi8}Lf{4xLI(5I|hR>jT%aP6v_#jFD;>z4U+0>D9gRJvh4oebb! z1F2TlEtPI~nBD=9sIv)@U>VOi$g{MobOUe|PSlx1{k7U3Pi7=nptsL&2QYA1w+0sA zpgrEdG?5BSKu_Y!(|s4I0Nc9Al$RqF3?0Y_Hhk$q8i^->Rk3s2JWIP(v2&zWS-0$u zC*(}_m2R*lOAF7gV}ILX0VGVCjyf2F<+AKWwlsIg0_0+(0xI1M;LEmy*RO^C%lZWb W=gJXon_Ol90000Px$Gf6~2R5*?8k+EvRP!xv0cvU3DMFOtP5D*u$xaj0AbQTJI5l5H4N47qMlZ9f3 zx&%vxxCVk0Bq3<7*Fn5Z+743a)_*x%e*Sa6a}NCLDrJj-$`%9llV=nkiRUVSoBKDT z7#5ZTfQ$ng!{<__QVg5p3H5$YH%dHL$uLF60WuB{mZQBALE^cp-tQsf003b*WKS>D zMlCMCSKD0x^2leuTxrV61$n<*QADlWHUQW!SI9UZk9_jTXL$FDIi6^e>ILPv$&hw{ z4AV1(Z6d=|S2)wnr#14(FYjPC>!{kORSF;GTZC;QEC*qmdNg61$T;A*$vzu2r)%Rd z-%{`QbhtTP8!}9(w!3;X02!v*|8~>etfO|bPHD@D=PLE_s1ENB>gxrrR^qw85C6GN XgSD6NR_Yu?00000NkvXXu0mjf@~5M% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/items/hotairballoonitem.png b/src/main/resources/assets/hem/textures/items/hotairballoonitem.png new file mode 100644 index 0000000000000000000000000000000000000000..c16732f4b660db0a405dcccf7d1a3d3ae03fd493 GIT binary patch literal 310 zcmV-60m=S}P)3-r5QRUFNWjKMQYi|8;5BOH53shg3D^hng9Q5n8#^ltlR6+8n-hcsWv>d?qzQy8 zHiay>=WIM*H4N{~yqVc8;J~Qs>!-&e0AIf;^Uts#@vf55=3N6+YE>(rsF-7TU@(5M zG+tJm6&f7F0}a2$Dwt}~fe|MvzUpqUUcS-rTb2_~WC}=BEar0;aKT!LYYel%tbNge zA-gR9>wt?hnvR$8%`+PEJrG~lDwt~15pZ^Q765o24t1&`0E)FHv&BN>KDY{`D#EMx z&hcrRXBr!$uCJvy3(?kVzoP-#+Z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/items/lavenderblueleaftop.png b/src/main/resources/assets/hem/textures/items/lavenderblueleaftop.png new file mode 100644 index 0000000000000000000000000000000000000000..c721df0d0c6a4964d9d145ce9d257910fc06fd97 GIT binary patch literal 375 zcmV--0f_#IP)Px$F-b&0R5*>DQ7e*zKoEV6Ne+ODz!8<=1~{nNVjYJ-A#wzcfI#ICD=~x14N_6W zjTnVok*HolH8UZzsjcm*G1J}e*TAZ7r!%kr-c|75MQ`0sXO{PF#;X7T9_9`Jh^v(T zLIwb|{t%EulfQtt>_QR%Kwm4CMLo^WS3ZRS02EzLda?sWms4M>g-w_@yDc8(j%#Ck zfeZ?WRMA-rag~xQUr#_=4mN|nRvd+vK~KPF2*;^414^2)a1N$Ar zwE*DBhR#qA-Aa~;I|-sD)qMpt=T0|S(Xcktt?>-mw6cgegNH3 V?v&UePImwR002ovPDHLkV1nE{livUU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/items/lilypad.png b/src/main/resources/assets/hem/textures/items/lilypad.png new file mode 100644 index 0000000000000000000000000000000000000000..ee1a8bc87fdd168955835bb5f8eac57e31c15bb4 GIT binary patch literal 459 zcmV;+0W|)JP)Px$g-Jv~R5*>LQ!h`$KotMAD^0FRxhw>Sn8r*_U}lDxN6oRXFg^u*1?Euoh+!}l zNKCO4%>>KRymefYYnMYTce}2Gknqg)?)Cltyt@bdGaP$!HytPdm?dkxKfL`Z=h{C+ zafv7{v79S(Cp~q@7R4nfW3`-X7fTWl=?VZq8LP2BJrhK_f+PXTm{H^&vH(Dp7my^- z8TXZab}U@&OOgNpc;Sw@Tx@F6b?&_5K$1Wdm$;h_l-r&3lr7f=5$Ot@abHOiQ2Ewa zv(?lrRC$3aFW~b4PS~oQ+j{^;v3q@a+K_+j+Y1?d9>7*JOV&FDJ`Z58B3;4f0lbjm z=IX@cBnczGTx>uY+gs2Hn|ULVZ7?# z?E;iB1OD~#2`6kJxH!Z7@zwEcG?i~rp{QMxBnF@Fd*FmEcp)>E%ur|*x*xjJy1?$y zXvlGY`{LlIY1DRXkYmLSfJ2~JvaSskZx@X*{|1xg@AaPx$a7jc#R5*?8l0k3NKoEsL2eww~G1~>=E=o{xu$%(~4n?X25)%K6|JYMYkz9#H zPSfD7v@T68v7BN;%MakdJB{?_&Ag`>_>X8?OlRY;OProuM1NJ>LvJg7|6zz|g=j@y zm~NmQ*^s6Z(o}*S+3;Y%bT$s66_=|U?4jUYOSSamg~5(&I6Af@T1d2TbZj3uji$44 z$O}WY^mx}IS}`v@+Qa~eRshUP&u}6Dc-M9@d#>J)4fe5zzscc5aP@|~FnHJU=5>ZP zapy1!FUg+1V>%m$9>C@5hV!!;S8oulx((T2AJK{z*&d=5Z(kiCTJfW~X0=`d@F)s= zzPh^Ox$X1hU=QzFT)jb?n7IF#YSCbxC4BvIP5U#VS~Pt8G$8Ibd|%%Z*^v#~Z1d6s zFq{bU($hFkqJ>>vo48wWdU6p(0BI^A(b9=`UF3xU;QXv+QLag}P<^YqAL)uTl>q$F gaR2VR!hZ+90J%<>LJu_>uK)l507*qoM6N<$g12_YPyhe` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/items/wheat.png b/src/main/resources/assets/hem/textures/items/wheat.png new file mode 100644 index 0000000000000000000000000000000000000000..d9194d0b9f95df6e35f4741b89e9634b66a93d8c GIT binary patch literal 440 zcmV;p0Z0CcP)Px$a!Eu%R5*>DQol>XKp1^j3KeNf%njBe2o9YhrK5IoH8@Cd?O)O<^sne5bnn05 zR@@?mh>)oVM=yg{N-X$e@Eq)&mzXMeOWv37eeZkkIN%>=Jsm2IOMek;tWTQ61{Vt0 z1RDduV$xUjMr*r3o?v5L|LUOLXrbC2koe|O6*)+g7+W2zr$eO&mQohx2Y_mKKnex& z>iIe!FC(CvX%ZtE`AVj*Kl0jxsct?y)p7n8nPN{MD~OaQ>8 zH0!{n6iX?Mn0I<%E>-_?DK(olw`@Dm1jYqi`jvnFa0dY3$y4U59h7w*#svU?ae>wI z+h#+Yv9E`8Z3Gw>I66Eqgw^95wxAu6aRJ5!I&BZp$X6u*@Pm*rE=&xkRzauj0RTE} z54xupeLKv(1I7jJXOSW3t$q-aPx$Z%IT!R5*>DQp-xiKomVw3ROv(gyMs&3bwc?{(!5xPNleT*?vrZp&uaFFDP{F zC!{M~h)Ah0AVZwaB>38li!#F`rV7p`=jNV!?m5E%|2XMvq%^MmMX<3xncxOj3fKf2 z1HkfTpjI@eSl7QgaJ>Mn;gmdFU#Kbvnc&#!Af1hr9(YaD%KQM(8cs>2Kv}(9 zm*W)#bTbnii%DOl^5aKdJJMp(R|Nqsa%6&|J)V=mbI@w;6o!{K1I0y-_IOSJAn=@` zgTQmZMQ+5p-D7j9`d{EVX0ztjZ3mh_nMB}i@~>9U0Du?%UifMUb)APY2>_r>Vx4`O z4Yqwfq-!HUnMAnXG=z1=U<=w2DU+Z~qSpzrnDkW*0HQb{lt~lAcN^$+LI6Oo6GHd& zBHLl%9Z)85_ec#vZ;j%FoE+5(j_#i}E{#AGC*=IpM-(UI^6U_lNgV9HnSs5lThsU5 f27I@Hb^e8KC;#vSFxB#700000NkvXXu0mjfT2sJm literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/logo.png b/src/main/resources/assets/hem/textures/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d4f136c3475a75a49849581179848badb7eda2c1 GIT binary patch literal 26868 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 HB{Ts502v_G literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/particle/blue_leaves_3.png b/src/main/resources/assets/hem/textures/particle/blue_leaves_3.png new file mode 100644 index 0000000000000000000000000000000000000000..7e2bc5015906ddda80ff31eb394ccab5ae5d137f GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*1S2@fUCDp{RM6l)JQTKxzSQt(z%YF>;xa1Dh%HZkh=d#Wzp$Pzo CP#^*T literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/particle/blue_leaves_5.png b/src/main/resources/assets/hem/textures/particle/blue_leaves_5.png new file mode 100644 index 0000000000000000000000000000000000000000..33072f0f8e8f2117621c7bf2258a0fecf3e6ee39 GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`mYyz-Ar*1S2@CTmf5q?p z{HDI7uqom2>;L}~XE~bevWa83%yB66`@hM{B-tF=CakR#xgg2Fz*esG-)Bk#GtdwQ MPgg&ebxsLQ0CLGD3;+NC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/particle/blue_leaves_6.png b/src/main/resources/assets/hem/textures/particle/blue_leaves_6.png new file mode 100644 index 0000000000000000000000000000000000000000..78bc3be51dd282c0754f4d64328cbaef64516326 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`_MR?|Ar*1S2@4e4tLk0$p1QnTQ T3Gak}MlpE0`njxgN@xNAPwXcg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/particle/blue_leaves_7.png b/src/main/resources/assets/hem/textures/particle/blue_leaves_7.png new file mode 100644 index 0000000000000000000000000000000000000000..41f9fe9166bc812071efaf9dea1b5f1b0b880f26 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`L7py-Ar*1S2@j9<@f{(tdk z2UFbb{r}XXi?8nepKw;e`NC6%r?deiZ7BDHvmmozg)@r%uAgEKtmWj MUHx3vIVCg!01LV$AOHXW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/particle/blueleaf_ambience_1.png b/src/main/resources/assets/hem/textures/particle/blueleaf_ambience_1.png new file mode 100644 index 0000000000000000000000000000000000000000..85b283b0477175572b07414802d25bdc6db61681 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ww^AIAr*1S2@7B3fzfrAV?#=MKhq}$hF$4aU+v~} RyaXD=;OXk;vd$@?2>=yMC@BB{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/particle/blueleaf_ambience_2.png b/src/main/resources/assets/hem/textures/particle/blueleaf_ambience_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a52dc17ea5f6d8adcb52f63bdf51aa6176748d50 GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rk*a2Ar*1S2@(z!O%91sVeGj2{^oZrF$Qvb1w<02;vH>FVdQ I&MBb@0Cj;OxBvhE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/particle/blueleaf_ambience_3.png b/src/main/resources/assets/hem/textures/particle/blueleaf_ambience_3.png new file mode 100644 index 0000000000000000000000000000000000000000..61b237e7ebeae7a50c1745462406d7d7eaecd4c1 GIT binary patch literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`8lEnWAr*1S2@$}j^lj5RzK-CPMu6{1-oD!MPx#)k#D_R9J=Wm%RV5RS6hfiYZ_UA<1%t$2g_;COoYjXBo8%|DF|Yk>0J(20pU_-oJB{ h+7k5!)~MtB6;C#6R*ELekr@C0002ovPDHLkV1lDxZ0P_1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/particle/damageparticlesheet.png b/src/main/resources/assets/hem/textures/particle/damageparticlesheet.png new file mode 100644 index 0000000000000000000000000000000000000000..f90419cf8b506acb8db904afab06998e4d936a56 GIT binary patch literal 356 zcmV-q0h|7bP)Px$9!W$&R9J=WR=3!Lyh94wOq4D&r1M0yF1$lThgbsA_$3597%PfW zaE&GK-#;(z9-!k-p``Tj+H0PZwL>IIN}nSn4BQ4~G|piZ0?+q5`|pJdHqJFwoFxg* z-P8m6xw&y29UMwR0sv9kJaQ9@1jadR)}ALIl2Ros!DE`d0bq6#t{2q`#{J73C2J@E zFbVFD?^==Rmj1V^SbDmq}*c)MOf6Iw~hY9h-_~ zQ3`x&Dum4$!y%Lg_6?W*L4UV-HX=8)ffiW zB%Lheg1PKT59s`h*2ALpK$%I_%?KNK+7r5&)bRl$hNCC62T1S$0000CTmf62%8 zXatnL|6e~L?d!SC2~x3g`V5(DnJkF{(y{Xt8g6<`OA}y_Y|t~~%HUvNzN9+y@bp$I Ppg|0tu6{1-oD!M<3Me7% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/particle/fluorescent_leaves_particles_2.png b/src/main/resources/assets/hem/textures/particle/fluorescent_leaves_particles_2.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed29d08b94f9f0e12152620395acc9e0383feb3 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-kvUwAr*1S2@}|G&6< zB9B8`MehG!`(NFw|HQ+b$tKBUlyErPh=(!LrHu82z@!-FAf95@O^zzkO*sM`ZsE=X e6H-5OurNfNh;YB*_z-9+1B0ilpUXO@geCx*b0~HI literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/particle/fluorescent_leaves_particles_3.png b/src/main/resources/assets/hem/textures/particle/fluorescent_leaves_particles_3.png new file mode 100644 index 0000000000000000000000000000000000000000..501c0ecc7ea01ea0a8974ffec6989b02d399bb37 GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&YmugAr*1S2@YyvB3MV_Mq!xA6z198Gq~Tx58{RI)M9L79Q!O1S(dZ}CJCTmf5q?p z{HDI7uqom2>;L}~XE~bevWa83%yB66`@hM{B-tF=CakR#xgg2Fz*esG-)Bk#GtdwQ MPgg&ebxsLQ0CLGD3;+NC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/particle/fluorescent_leaves_particles_6.png b/src/main/resources/assets/hem/textures/particle/fluorescent_leaves_particles_6.png new file mode 100644 index 0000000000000000000000000000000000000000..78bc3be51dd282c0754f4d64328cbaef64516326 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`_MR?|Ar*1S2@4e4tLk0$p1QnTQ T3Gak}MlpE0`njxgN@xNAPwXcg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/particle/fluorescent_leaves_particles_7.png b/src/main/resources/assets/hem/textures/particle/fluorescent_leaves_particles_7.png new file mode 100644 index 0000000000000000000000000000000000000000..41f9fe9166bc812071efaf9dea1b5f1b0b880f26 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`L7py-Ar*1S2@j9<@f{(tdk z2UFbb{r}XXi?8nepKw;e`NC6%r?deiZ7BDHvmmozg)@r%uAgEKtmWj MUHx3vIVCg!01LV$AOHXW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/particle/fluorescentleafs.png b/src/main/resources/assets/hem/textures/particle/fluorescentleafs.png new file mode 100644 index 0000000000000000000000000000000000000000..25499e2ab665a7f62939760702bdcdc272ee0ea6 GIT binary patch literal 482 zcmV<80UiE{P)Px$oJmAMRA_WKCJ zBx1{EX8JR&iMG}8l0^_l7t!~J*{oN9ML3IHQ6h*Ve7@ZO+HV!W*-&jKE6NqYuXxF1 zto=dOv=te|k=w~x)1EAOfi;8m{^xJ05{&}g)V<1>P1QLN+MOtq$Lk4AYoe?n(NM%- zzB4!nvzd5TBs%?pq9`Xu^#?pZkop7To0kItV6mM0y`e|V4-{oO^j*3|x{Y?Ygr+Ar*1S2@sPZ ei1aX(FfdGA&dfiVPcH|kh{4m<&t;ucLK6U)-V&w& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/particle/lavender_particles_4.png b/src/main/resources/assets/hem/textures/particle/lavender_particles_4.png new file mode 100644 index 0000000000000000000000000000000000000000..57c9aff835862347d7381849f98aec1b5280c078 GIT binary patch literal 82 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lAbP(Ar*1S2@Ygr+Ar*1S2@lra;yhg(Ln`8u6C_v<%ift+`s4rN zwafo6?iS`>oVcx}0 x2|y)`>y1kcp0iH+c^EkK*lTWUND2>HA}PzjVBuEst7X&e R4M3|IJYD@<);T3K0RXB8Ja+&9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/particle/lily_pad_particles_2.png b/src/main/resources/assets/hem/textures/particle/lily_pad_particles_2.png new file mode 100644 index 0000000000000000000000000000000000000000..514ecab508ea43b8099cd6469e5e536304a11517 GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rk*a2Ar*1S2@+c#d_Vi+|BIv$ z=KuC3mkt!%n$g8lC$n|YTGlO$Cj8}n91mRm|3#7t zV;2uY=D%9wfA*1W2TcC|zu-AbQK9w3tVD@44o|j;Pnl920woSGxXyB9n9ZmVzOY-6 lcfw)T*uD&hiD|PK7@nqQHEStkyaO7};OXk;vd$@?2>?0vEoJ}! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/particle/lily_pad_particles_4.png b/src/main/resources/assets/hem/textures/particle/lily_pad_particles_4.png new file mode 100644 index 0000000000000000000000000000000000000000..86b72fd9656ba637e20a04ed21e18bcdda68dc32 GIT binary patch literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`s-7;6Ar*1S2@iUmb~)t%H86O(`njxgN@xNA8PXYo literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/particle/lilypadparticles.png b/src/main/resources/assets/hem/textures/particle/lilypadparticles.png new file mode 100644 index 0000000000000000000000000000000000000000..46e4921108bca76c64c2677bcae15ed8380c5de3 GIT binary patch literal 354 zcmV-o0iFJdP)Px$97#k$R9J=Wm%j>vP!z_$yh2f{;oRWj5Y6@~flDvbOEmc^Ha7**&>S@gVF)It zr9`9dpX^GJzfsQj-Fv*}c&@-FNkfma$R`zzQ5JW{bC|XZ6_dh%Sq_jN05(K^+&&Ga z(~@tTMLwmWr<6i7@OEWDkXssh#4P8fNk_CYvmBVVi_3n4{J2GLx~gcn1^|!*6Jn!2 z^4%GO*;*L?v<8x3B6l)b3!o-q(gq0~w-#w+%#7nQKs<$|94_qY$_Il4-le^ZRHAAUED+?gd}b-cOqO|Kd>& zrWtAiyobDZ&pucq;VaUhd9JrlCEmE>-HFpmXIT|o6?isDE|FAWTa;KcLn5x>P0frn x3HeY}Ifl)hI%f@z8mLcB<=~mHG?RsiVfE~YBvljrJwSUHJYD@<);T3K0Ra8DFUbG^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/particle/robot_damage_2.png b/src/main/resources/assets/hem/textures/particle/robot_damage_2.png new file mode 100644 index 0000000000000000000000000000000000000000..80c96ae02fbb4a529fd5fd87ea63c3287fc44e4d GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar*0VCtT!gFc5IwoxrY< zr|?4PABW$A{e2H}bTwVpEj;vcd1JsWwf7m$KlZOnKEGk!?vgz3d2Jz#^A$AKevaV1 zq0MnfL(qX^&CPWj0UVCA@{df2&HQsx*+Kp0q}QB0n-?%dRfq2IFucbwtz`XPH?up; p8T+(bcXWs8eDbV%KdHQmvBu_vx$cVm+du~~c)I$ztaD0e0s!$bNu&S( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/particle/robot_damage_3.png b/src/main/resources/assets/hem/textures/particle/robot_damage_3.png new file mode 100644 index 0000000000000000000000000000000000000000..a4d14dc99cee06116483f8737d4ae1a5e5afd402 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9-c0aAr*1S2@Z5N+*GKpj!V>|JQ cOOb)$-)cpzMOWkx0L^6ZboFyt=akR{0O!CczW@LL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/particle/robot_damage_4.png b/src/main/resources/assets/hem/textures/particle/robot_damage_4.png new file mode 100644 index 0000000000000000000000000000000000000000..bb09c958ad3c7432392757e2963a9e31ffd957f3 GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar*1S2@-J!e4KyVb1d#Y z%wT6}abPJ&nuT8FA_mu4?0f=mb8@&QGV{&032ab0ySTxEfkAVEM5FVfg~3207(8A5 KT-G@yGywqoh92(# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/particle/robot_damage_5.png b/src/main/resources/assets/hem/textures/particle/robot_damage_5.png new file mode 100644 index 0000000000000000000000000000000000000000..8217ad84309a2043526a075956ca725695d3b148 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Hl8kyAr*1S2@F PG>5^{)z4*}Q$iB}!KxvY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/particle/robot_damage_6.png b/src/main/resources/assets/hem/textures/particle/robot_damage_6.png new file mode 100644 index 0000000000000000000000000000000000000000..7d7b0242e2f25e904e5264c44413a1c3b5020c6a GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`x}GkMAr*1S2@B`2XTj z4>sA#$S2ZFm-cMg{nI|O?SRSqSR>&)4$n9y%{ED=ZQ2QK6LPG18cYtFC~fX!Qqh$A a#lXPLYR#?Q{$mBuNCr<=KbLh*2~7b04kr=- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/particle/robot_damage_8.png b/src/main/resources/assets/hem/textures/particle/robot_damage_8.png new file mode 100644 index 0000000000000000000000000000000000000000..25b3c2c4b5fd4d385eccef2ffa85a6796a50219c GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`eV#6kAr*0FCtl=iFyL{y>;0#k zwUF6y`Um#{zULvI3ZF{)|5B|eSd#m0(w5v=>kHnzewidHly|!1n3cq9h0kIp=O2Gq z(4`S|V$D01Zkq*xny0>}-xE8;Go{im z;yW}~-DM4Zx_IKB-rd3p6Mdeoo?vkN|3fDK8!QhOzX?+Zx{Sfo)z4*}Q$iB}hk#V3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/particle/robotdamageparticles.png b/src/main/resources/assets/hem/textures/particle/robotdamageparticles.png new file mode 100644 index 0000000000000000000000000000000000000000..99e3c7fc68e50f34faca22b9069ff5ba0ac85c76 GIT binary patch literal 829 zcmV-D1H$}?P)Px%_en%SRA_EG zVDMavtl0_$LzkA4F3r%;r4%Au8B^I%(vs~ugeOjSPm+Iuo1hQOMfSZ<-#guVr@RL| zYzzl|kv8X1oDq#~ryUvR0!==tA1`n0cG|+REs>_c;EX?gxkAy*q1o*jj%|riFhkMI z0RWoap1~2Z@*Ud}4uL}iOV0JMx>5vPK;cr38ZM| zB0itGXIetlzTmPDXQ;WrP5$-!CeAJ$C-q~I<-`YtTDiKR$2rfPV>42%TorjUkJm@9 zG!mJZ4U)?KfdGIfJKM;cc}#;TF1~$b=duc}uD^$quf3nkxc~q+e{Un>!l>*Y2y$mF z*xY`&N2rynB59$x-y-`UZnw$CD?N#O`WVw>8}dYT5mn=)MNU+3PZuvkhDEk78ys}7 z0>Ctw0ttbny=>RYRdIKe-5I7GYZ}4I=b?Hzyf!Z2WTLX{^^`s(F zTc^J%20YKloAY<@JRi+&&yd%JRp55oLXAGPzD{ida*b60DgH^Snh#h7aVp~O4s|0r zwk7I~mQgAdP&9Mehm2*l>^^9Adj_|4$vCxfEBmO9{~!JVYarx;=l7?~00000NkvXX Hu0mjf^_79$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/particle/severe_damage_particles_1.png b/src/main/resources/assets/hem/textures/particle/severe_damage_particles_1.png new file mode 100644 index 0000000000000000000000000000000000000000..a46a8b3bb99805ab9c386c5e4d0d6db3884377c8 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`E}kxqAr*1S2@1XdZ*7tDnm{r-UW|KjI}V literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/particle/severe_damage_particles_2.png b/src/main/resources/assets/hem/textures/particle/severe_damage_particles_2.png new file mode 100644 index 0000000000000000000000000000000000000000..0cf441dd76a718432ce78d8b48c5117ec885056c GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`uAVNAAr*1S2@ z((I?Y^uLH?z=8!Ilhf=Og&v3Ln`9l-VMx(2^U}q zc<-hCan+L2%4p8q%PNxlvn~Yl&&>8a_;aF9ZS1ZVof-M}|DB9y_>fe0I$lXhY5lZY z>dC4~O8WEV?d$%eZ>jsO#;~X9{r&y_uPjbo!%*SL#@(PSp~KLZuz|s%=^)bsj=?9; z;GLhJAOG#+$A#a0^LM}c%hSvnvx@oizkmN!!?(Mvzqgx5tl(uNyVu}jt+dO@SFWme zeZSu3TU{HCLsy}yy88E~{{H^^`^wtq-JE~t^81SkjDfN}-@kv?U-{zXmor*_<#@#e za%E*~XU>aUdVldjrbTO;7pq@3Uj3!oB*I}!X~CD2sh*emOJrm#vhJ!YwO{DkIy?Ui;mfSzV&p-TjxPhrRrsv7sU3^#j^lvck>=7^2T! z%!GLEZ_A(1+4F6F|JZ8%g2}%pPOh&KZ2rysm>xRl6EJaM6CyuvyP$3HmouQ8g<3Gj z#r0p^&;I&(hHafNL)=ja^B*(AkNviNq09F(GOT};{*Ud?1VgW5i`f?f>k$S|S3j3^ HP6!O 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 G)c*mQD`Bw! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/altimeter.png b/src/main/resources/assets/hem/textures/screens/altimeter.png new file mode 100644 index 0000000000000000000000000000000000000000..e37caa7675c7a1fd99368e70f7434b17cbfe91df GIT binary patch literal 1166 zcmV;91abR`P)Px(NJ&INRCt{2oj*?-F%-ZbQRY$vs@jUALP1f7PF9m*Dn!c{TdPrkxM7nUr_$unwfJv~JDX`1D z9gWFuLM{-zFBhCRC-TD;D9cGpE6c*hyxLmRy5@GL8-0(vJ4&XF-ae6I0I&%Hait4` z&|%{8*X+{2&920}4%0ea6MsHta8U+Z;l|Nt*$heGlh1_E~fg~= z1CUd}uit)5D5wfNebEITHA6eYP#KMEdUChtzz6Gx-P4=fG?jvIaQ)ot3~_6;qcMs z={s+XYgu2veUJ7tuLUsELFSo2W;(E%3Dmi%EchCehn}|%_5gu{Jpda(U|5X;T)U}- zn)?S%^T@O8dF$X&K;Uo;5I9y(1m*d#LLPaSP2VD9u?Gkot9bwp0?V1V4)y?ngJS?T zfWVmOcL7ZK$^29>G2po<97=VZRjy)90Gl5}|SPi5+fa@PA=AC!h^esY`JPi!I77!k| zo_Q1yD7+dNIJ_DdC~`gb`UCa=p+Uv~JP8yg%|`vd0pOtl69&Eh0II$I04kLV=>g=I z3o+9HZtT@&qYfvh=ZS8hZ2yMAn1MZgwbviOpX^L~y)61M7Lu<*43*~#PvY|cMQ=e<`PBEWj&)l>-p55Tqx$>! gUVq?U8^$~T0KmDMS51V2)&Kwi07*qoM6N<$f?)P2RsaA1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/gooed.png b/src/main/resources/assets/hem/textures/screens/gooed.png new file mode 100644 index 0000000000000000000000000000000000000000..c077d0dd925892862a9506187cc265db2fedd07e GIT binary patch literal 420 zcmV;V0bBlwP)Px$UP(kjR5*>LQ?Y6SK@fd=$RUfx70cnVe;|TzD8f}%;fmPXUUyA?z{0}fen1N$ zNLtH48cB7HLLdYJAs>*&U}cdaT(c=;mfiJIgiLiabMxNJn^{a}BZYsM2LM@~{0YP) z^`g+PO}IXNXL+K`8czz2x&-+q2z5#|dW1S7u*0#ke3JwKymrvE62y{?2fu<+4FEJK zQKy9z9EY&dpi$^U3XUY*Fx^3tZdkt))H1o?FK=IXD31Vu#qvt&4k#FRTYB#8(<`Ll z=Pr&Fq~N$&J!mA~5>%2x<6#>u)q&5|sH$g=D4vKlnp5IS;40rz&BhYL-fD{~-2F1K&^n<$@_q`PB z9RPrt!Rc(Iu9G%CPv2+5sKNZf5f3T_>gW&7zk*fq08!BfwHlNqRNQtSbaWS@DDzWx8XI-W-@iiyWjP+H<+_TfiN znSy$3Ai&AUw}vaRv1i_b2W%{^ISD2gg%UP=ifFw2ZIu=Kq(u_UK<#dIaSJ3F820?r V%b)Y#`#sR544$rjF6*2UngE7pQz`%e literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/gooed2.png b/src/main/resources/assets/hem/textures/screens/gooed2.png new file mode 100644 index 0000000000000000000000000000000000000000..2e053c23718785a303a5c020b3d2e555f2f62445 GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|j(EB_hFJ6_ zCrGds7*uxMt}psxcu?Ye{NE&xGaG*SuSzUnRyle@0tAGN*ZlMDE=bfkl4>Dr#Gb}s zW>A03(2WfU_={^roFA}xbQc(UbZvxSj)DY)9yco+o_%~t5zI3)0z#iVgmoR|WY~4a@Wa;h^(TP-VeoYIb6Mw<&;$VW#bMI` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/gooed3.png b/src/main/resources/assets/hem/textures/screens/gooed3.png new file mode 100644 index 0000000000000000000000000000000000000000..503c357b861b810b39fdfa04ae7b8c386f46d5ce GIT binary patch literal 475 zcmV<10VMv3P)d0xGB{yGOv&$2LVvz~@E? ztlP6&B8uqf)z(;6oC29-cc@T6^=^*{_&UyOh8OYU%mmoy5^-|z4H=f8fEVRl@6#N= z4Z{Mwhg$_Uor1%;doRv4>dOQqQTy>Kf(s}>35Tf7b?VcbL}n2&K|efRn8gV6hc#Q{ z>sBRV(BWQ?Fak0-=crBY5;4J#U&-s3cl&sCNy4(EFu6-;f_Ca)FDSStp_zbckz0gM z?1i@^R7V>kvj{G70Rl(hkzH@X1@!Q@Ab~Bo%WL;TAEcH9$1<>A`|C|!8j?`fK+J4h zAEK^jz=IMlLNHTMx R&XoWF002ovPDHLkV1lM^(0u>^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/heliumfilluibottom.png b/src/main/resources/assets/hem/textures/screens/heliumfilluibottom.png new file mode 100644 index 0000000000000000000000000000000000000000..8c17cb33dd9270948b63382b2aeebecf558d4d14 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^VnEEw!3HE9zsc|cDaPU;cPEB*=VV?2InJIgjv*3L z*Pc1Z$)Lc)a?mzMRdvaKE}es6D*Koi>t|KJJE)mdKI;Vst0BK_>Q~&?~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/heliumfilluiprogress.png b/src/main/resources/assets/hem/textures/screens/heliumfilluiprogress.png new file mode 100644 index 0000000000000000000000000000000000000000..467808a2d6ca2f296d3c63edd1b8866067af7473 GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^VnEEs!3HFcC*>^wQjEnx?oJHr&dIz4a+Ew>978lF zCja>l1jgn6i~@vbtS~S(2)yc|VvuFN=k~$v&{>ntDc>UFFKR@11Mgfa#(Vr>IqX3HlL6g5B1WQOk4P( g%{b_CK+0jp?hne#oEWCn0!?G^boFyt=akR{0Gb>xg#Z8m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage0.png b/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage0.png new file mode 100644 index 0000000000000000000000000000000000000000..8ba1b645243b1056db2766a4d18f9446ebcc26cf GIT binary patch literal 2236 zcmV;t2t)UYP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2vJEyK~#8N)tbqY zR7Dhqc@l%bjiGxthARgUl))ibJI?|_GYbxYfH;OrpTV6g7rp^6VE6>Ce1h_RS@~D} zefs1bs=K=BjQIPn%zHEQd?&NIyYkk7-7J6nc5XIC_4fT=BG@n2-&p8pbS>)jBJTb5 z#_2`BI^6y!3K}`^7;yBHbag2ovrhBql|E>+3ixKdHv6%Yc1E3c@5>Z$-8-ZVyy(hO zy0?b0H-!K)Xau-|lpg;1d(nUY{=M)c&pf-Sj=0x<2RL{X_tkKAuPCq#+Q9`Jp&eEU z=#$2C@E@wa`RwT8dJS*Ag^5z|y2V)$2X_GzT?zQ-;a}->oNKtoFYuRN-J-Q8A;LR2 zBFLx=%GI|6l$4kp%?C6)0RQ^amuBCuGYJeF!38hamOOaDL}jqN?sMh_dZ9~m?RXLd z@8A(W1}6xIlAeCzsfDt7?C0afd5EE`eh2>5C-|x2JC+0n%D^37iosnQYzNCGKXJ+M|f#W5@NgR?&>d}BHxYbPpp71v@szG z4zCX=w8bEC6R)n+A0Wj>+Y;$z6Uw&UkX#`dspMpVK{x6~ABM z?{AzKPC`jQ13n8v69dC*ckY`CIV8=ARCo7rrFjxg%cdu0(>w86waio zJGfl;xf7h6wmz4#>zX@yCK#@>13LKY9~_?DYbAk3C4fT+>e+w@2qu-XdMkMMsq#6p zI^#;J<0T0d9#OB@%QD{q-DmBpxcWdvmts4U%4w57`Pk!|M0=~v`?Y+mSWLjLl_VVB zx&wgqW2Xo&4Z&v6xFkS-?QQW|R2AvlM0msAJL)z_xJD30qM<=0)T_}vPRr#qmW zuG9o%&{Aw?0=Xv7Jc7A&-CgbSvGRTrOoG4qp6viK0lW?wscRsIi*@(bq)~kdK)NoE zw^lBVnRFG!aot@W3)f>k3O2yM?UHc$-4~WSK=3+aXK-L8Iy0yy zrLK0``n;u~e)w3$*jfTu@OVi8Ka>DYR;lwD+Z88~sAm&Rk>=pF#>+gD$HINM-b(il z9a_AWU@P$F!VX~Nf!7Yu$}@>vllYE^LAtl(_j!^%2~$NZIQ<2Vqq7GO7C+rNz=FS| z1n^^drhck4X4_kn;1buiqnH4nPu>#OV=TBx=%Ht$}MJ+4;_VY#5D}LPp zc8=P*WEu+(^zAdpa(D`>&U1F)@iA`${|7{hLAz%fvjfy$ z^GVdzKZExK+^X;!Z#5D?qu|RqdZ(czD4^()2OnK(CBW~O;`sCfRvwcO;qeQt1W>pD zINz|qsr!Uc1VoV0x#r%dRsxWZqxo>|2Qs>^JR$)sBC8HKqF!;g7A}_6zfhAEc#e|! zk^yZ5hk(~>1)X^&y;YDB;Qat;!Dq>!KXt)t#qpKkDXjR-4qEVfm_U%*S$UKtfY%zQ z54I)7@YM%gS}6e(k|6lv^&pWzBYgBewRV66P%8Rdc)nqw(^UVR zFjYf40I;zVxZrnW@N%BFGl7DhnhcU4QK!EISZl>y{+`#0?>M{)N#L6ng6DJ< zr#-?=mBXV9))lwBpw|Yk!oY&(%LbgS@yMBWl)<$GsQ)E#0hz75gQNIWY|r%8u~ACNTl74BS^-T06Xo0`UZJ&cc!LhPh zabJ14?yX_$eNjLTjd%v9r!h!p@_s^FPHLpO(yqATj}&+;3J{S9p!rl*yjwlMSw+Bc zpo@2)xK`WYeat$|{wN+e(y9x*wd%279d7@Z2-Z@)eHY4s1OEdv49BbRX%~M00000< KMNUMnLSTZf=|A`Y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage1.png b/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage1.png new file mode 100644 index 0000000000000000000000000000000000000000..c85046cc88b3c9b197bbc405e90351e835989d6d GIT binary patch literal 2250 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 D6jLWa literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage11.png b/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage11.png new file mode 100644 index 0000000000000000000000000000000000000000..12cf4b137e1f5fca277f36fab69bd542e9922a53 GIT binary patch literal 2233 zcmV;q2uAmbP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2u?{vK~#8N)tbqY zR7Dhqc@l%bjiGxthARgUl))ibJI?|_GYbxYfH;OrpTV6g7rp^6VE6>Ce1h_RS@~D} zefs1bs=K=BjQIQS%$qm!d?&NIy7Jb6-7J6nc5XICwfp`r5$u=iZ!GjPx)$|%5q*EX zae8rI9d3UV1&thd3^@8py1JB)S*LmQN*^>@1$?t!oBh~HJEKm!_hkyW`VJ`rFS@dn z`qnV^rVu~|jR04W(!)Q0FZ%D_zZZVwnP)fE5q|4{YKXGa&;Yk2D|Oq7DxEzXKKxC@x*O29u4|4OgpT*EbffxrCf7Og!A5#GTO zK}KazuD%_hq{QTCKA_nF_}8DlH2Z#?NnqdzE_lJVFFn)S}3c>`+U4O4>6S0@4&zM1V2@L$CAK68MwnsF}MuI9bm4@TaeMC zh=somz@rCM+fG7(H*mrG#8H_YS(z#JeiXOz`yKvz=MmOe|%*1By5GB z|4Yhb{Nci-7>ox`TXaBUKV0o`Jb9lKQ%OPxf3t(fA6z`SS`wBCSpK`J1o(ssE`x0; zuDI7DbactviA8l{oWq|i{$1xJrDBaMbND5AgqOx7A-1dTuKVRv-&|Ha~)l28)RflHo% z3|flq1ny#D+7%3KICWi@OR-<(W99e3B>1bHQ?K~_2|yVvgGT2X!Mi+&>{_c0mvn#T zQGVUUir=m9c)A11=}JvN1}(*QCXj3L2u6DZbLqOf+T~;A_en4b{_1+2MAtg>XaDyv#FsEcC-Q?!7~YHqC=zEAZ#S4q)Yh*ACFiGl^W2_>PD{y0@h33d$3$ z>r+K6IQI)2M`sTnEPlFkfCYa^3E;=_O#M`8%(k~C!6mM3M-GpCK6y)AkFnrNtP&t8 z0l?om_wwx0JGKLKoU9$dU`j%CO)i&WJu2QOclfFDaU=n2<>L+j9Fc^Q0Dky+I`!7z zvA$i!dE8s_eo=zY3H2O(?4&KV?suQ6Y#gbz@;C`# zQOnA|{d^JiieGntoujX72ecsYma_htwAwBuK|A2~*<%GB-?Re&2AmzB1dN$9Q!8lq zRpsNj9JaLs00w@eYEuFzH0UXc9wNkvR#gn%eMsIv(^z<*Z=X4q!&6vwp0fjwk9isR zKOj;J+I>~&e$6LQ*FQcPyeHsRh2MCqkpLP6U(V4x4JAPVMVCDI=tJ`UQXF6Z@yTNn zB0PSfl>iDC0OuPPICY;eihu|*I@jD+m5-zOaIJWBUwK3VSVUGGa74Z0ZY^9atAC*; zp*}=V08t7kdJNuuto%NS@qyKfNB1NwUi%%iR{qwRqwUpKAql{9j?OnNS}y~FBOtlt z!LKUa@ADzSX~mTc)m=(}R{mD^4mSu-p_87VAiiWkTMQ;s4BmaL{5}crxWawDeC;1C z@Vvd_qY^-wC*gR3=Nui^PVgY7euQhgT^{sPG&m^Cbh? z2o3?S-xYM`nIbfGzYmZWe3lH7Kwa=!aeO6s3M+oIgBH9VCJ^LyRvu*uz%@=EY)d4; zS08X`r36q&g5ZnSgG2(2@X`C^3824rfCNx037G@#@LG9%Wq6fE5;}OkVWHDh|C=yX zLpuPlu@bo8cVy*b0aoyGp0_iBf}WZTpe5?uF9FtCahJd5wc|riI`+UBzjS za8u>*D1&vyEidS`!K*N^;Q6uvXKOrirX6K)EdlE9BrYJcm3MFyU+-&$S7F70FY4e) z0#98LlTXW zq*{Hz_0$#V*h%u80VLi^fZvAzmmD5(y@s8|;u9Pzs}=W^ zm#c3LWABRsa%jXeI6aL)I+OPk+Hz7O)s=R|6@R3_V^M&JL;%gFvf|z90nRD{jsso1 z1I4x44)0^uY4%6)z>!v6;H_1U_toL{e~Dl%)$Y4c4jlL&uJ^a|okmpp00000NkvXX Hu0mjf+owFx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage12.png b/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage12.png new file mode 100644 index 0000000000000000000000000000000000000000..48bf738e7e65bea74f659cad1df32d74665793e7 GIT binary patch literal 2222 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage13.png b/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage13.png new file mode 100644 index 0000000000000000000000000000000000000000..223a00cc9172226da3da39d0c2238912ed5311db GIT binary patch literal 2230 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage16.png b/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage16.png new file mode 100644 index 0000000000000000000000000000000000000000..c5c460d87140bdd6ba0ebf9bfbdc20f800e1bc98 GIT binary patch literal 2226 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 LNkvXXu0mjfjBh?$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage19.png b/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage19.png new file mode 100644 index 0000000000000000000000000000000000000000..73189958d2011838d46e95f02707b9700899148a GIT binary patch literal 2228 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 IM6N<$f=JUtbpQYW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage23.png b/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage23.png new file mode 100644 index 0000000000000000000000000000000000000000..f7600fb94f35e01a558cc6ba0c915eb116c3a048 GIT binary patch literal 2218 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 sF7Vc>$NTDV`@cl6mTLE1C(^b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage24.png b/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage24.png new file mode 100644 index 0000000000000000000000000000000000000000..3cb4a03ab39fc74f8a303db2269550d3e51b92bb GIT binary patch literal 2209 zcmV;S2wwMzP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2sTMXK~#8N)tbq2 z97PmG{UwCMYzWx1Ay_fk*x-R7yk?%UjV;gE47Rb28G|L?z>XCQ{=h##@CB^+f~HP( z-tMcXmsQmzwPa<))m3IyWxn%Xwpv})2X?dl@!PrC7}eAFe~VzhTz_MspV76b*NZs! z*Bhr7*VXCvM^n(qfyaQOpQNix`J8o`N3ZokqbcB<_1f&mPTCoD*}ZS8fa}~LW#C0u zmeRR3jJ;_DkU=BB6{Pg=&)uoHQg4ZohMI77(OmrpSpND^?$8nC~n!mtbeszo1o`eYR z;D{ijGALKy4p35Ja;U}hPhXmSzs@8uaRe8~HzR<=B zNpN_5Kw&Hfi6e)Tw-nD~9`#Y2-(4Cy4@bm&pXXYlQY)mQg&QxN6!Sqb#_1pfBl2QvwN*1FsKA@6M}v=Ap(L$rL5ly-hEa1 z8d;xtCH3)=gbI)7SL|h*?||;Jc2%rCP|>A0&Z2V0*GVu5{_1PrC9 zae18AJ<5-_1oV{-{_f|m6fe7g!FlDEHx`-5p`|#^q;f6Za+D>2F&F2{IgXE&&iDCU zQxxZQcX=!vkNqgv0ROg2!sT~gSndG9>mECk11oVc zlWI}=8fUD}TN=6!AFCK!O8^TVFA3m>62P5R`h3QA#YH6g*+Q#GYw)|~%N)g*OP}r? zI<#dBwgP`H>;Nhcymo*p&!Tc=*LOrKSiB`a&yyU3-L6OgI(zV7@zb3HEci=G06&)Z z)K8VcYL+j9Fc^Q0Dk!Wbo#ByV}HAf>$tb%=S2xVlP3W9i@pP>Jn->d zfJuicKcskF=BvuDcL5qJA9ui=vvc@G0%$;&rzzz=`uvGXoO~x0A>3Qa&W{4rp`{3a zyYmG+jSk>tC)E4sV;60yb-nwl%I1+;mB&c{MJ<(o`}rdJ6~FEPyN|xE9ngZnTguMQ zq-wjA1nq#^XO9(leA5m97;tug5-?`bOs$~Zr^@GXIc#eO01W&_)usf{7|>G`Jw%8L zO;rrueMo+Orm^rq-#&9Jho@0>p0fjwk9isRKOj;J+I^~Yz1EZH>mQ#C-V<=E!f(9Q zNC1O^FZamk9Z;!1}4E+s&fztz3N4Z_nn zNl#D^Uov1U29qfU?><(3odkHSaGx(<`$r2rZ}0f11kmP5I9}knkB)06c#!%O7stma z?iv^K^g+5}^<(AH`8S^%53g2|P~o|i%$E!pBRB-Sepk?$XNu7D{W?He@L4iQ0)4@& z;`k(Z8Wq3UK?`0F69{rUl}A|uaLv;P+Y(9e>H{uKN&t-{2)=l|kw~BsK6;-#0i3TL zAOX}$Lgs)wyef}RhF4o8p@Zie7P_12e-l>K&<+4>tOPFj9jSb5zzSZ@^L7?c(5of` zXo)`8OMta1?()~XD!$|JY9xVgS_q!It2pBkZdExv%3xh_%L{sK@M=sfc)o1Fy)_;= zGmbL2mH_p45*LtJ#3wi^tBQN&9vG+{@IW*!KoSw!Y-IMn_wB=5X zR4eU@6@R3_V^e^LL;%gFvf^F!0H=z8<3JbhKyg*u;eF1!%>HN|I8xOG-l}@Mu1>fA jTLf#Vp1uq1z=8h(zOKo8(|r)N00000NkvXXu0mjf2% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage25.png b/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage25.png new file mode 100644 index 0000000000000000000000000000000000000000..13c8eaa12fb494e767dc9ab49b122d6d52c64c41 GIT binary patch literal 2219 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage26.png b/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage26.png new file mode 100644 index 0000000000000000000000000000000000000000..61e14369bab85906c0d77d646396c073d6bb12ca GIT binary patch literal 2233 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 Hu0mjfL@h!h literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage27.png b/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage27.png new file mode 100644 index 0000000000000000000000000000000000000000..e508a16d5827b3846509abf64591fb4d07404c93 GIT binary patch literal 2224 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 JPDHLkV1gHbJ~{vZ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage3.png b/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage3.png new file mode 100644 index 0000000000000000000000000000000000000000..00fac085746ecd6fadbf1ed158a3b04644355580 GIT binary patch literal 2238 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 P00000NkvXXu0mjfvXDb_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage31.png b/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage31.png new file mode 100644 index 0000000000000000000000000000000000000000..86473870453b5e9ca5bf213f41c53e5c35e879c7 GIT binary patch literal 2242 zcmV;z2tD_SP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2vS$M7(Rh3pP;>8R-UTU zr!(u`D!LoUh|{MsZ{E!R`!lP%D{t-D&GN@@r#7ajc7OCsg8g#kjk$hCms777(f8M@ z$LIIe;U0~mppgSl0Y^VcmlpCd>ogBvSq6>P0pG0GHhvtWol&QK@MRTn^&L|Syy)UW z>RZEjFoghG&{Q>-|Pw->Kw=D?_)B<;SDT8alxC6{}c@Hu@ zMJ)Vo03O|~y6+?ucmo%_PoBZGU{hLcT~{4ZSG&e*&C_y{0Qi@~4!C=6@Q)9ypMwftv^4+NWi52j<&aRLI zht~%b+A>HSIh?$w?8i8&qa5E|8taE6V!ry(umc8o`J^Opqkl5%!TYuaBJ1>N!Mf+T zWAZs#^&F4b0Y_haxWCjZX1mPc?b8@-8q_5?CYRGDcX@xD@#M5EbIIF%PWKcmey76U zIeTP02_*p?_*M{_7#Lo=({EMCF=;Y_N! zgUi*=o#5oOEpw@LU2~_m1j7|}zyN>cgZ&$~dr6>C3E&WddTT%g1d~dwdM|kQRpoQE z>WnL?j+Z1 z%W3nK?Ij@lwS21lK9~f5X>jTle|ZAX7@R}8OR59rTGpm}QI6}L^6M^E{8oj>n>(PK zuG9pyprveQ0=Xt{d4jog-CgbSsq*_Im;`_6J=+0f0(c!VQrAEZmv#5vq^V^IK)No^ zaotmXy(geA4)C`=f2DZY1vJi9esQqKKn^WsJA=wKdCyTR0kpa3FXuWwRqF5KyUN?3 z!p{@H51pza>MdCQ*2<+Rldhv2*WKl@a6RiO*Z}`_NWz78Us&t_!Rw5j!GV>ynL#xv zb+yyB%zGNU51*=xttWs5kCz1SLkZwyl{%lXT{($Fy*1G)(j2_jcr9 z`{u7D*b4lq*a56O@Y(@dc_xu-65kOSqQOESn%hS z0Ddga)Q^?M*7nvUxWu*lQ6|9WllR2+j0M+fD*=)c0Q}8UFK?WG$98~@leGgFOi4)B zzNsk~1PxPqo_75O-lfVJ|u0{}-Pp(KDGex6RfH+a_XR~pX~p!S~pzLelw@&o{X z&UXMS4}AU=V9>FZA5-4fawTBuF7W$Zfac2Q4!C)820u>#1?ciLrJSSBo~Y#D+o^=W z#}d%GF9oPWO9_8t@Hsq%3gBfY)N}NyllIiR-`zE32eihKdMl5U02Z~Z{M*kLQLp%Q z2iQ6KPVImm1g->R5?cLR(rUYu1nqzuCl3{PeA5m97;tug5-?@bmU=og< z_I3ckz@M$!lmH41dWxcl2szQZ%HZ8yV>_UwsqjGGIB}>APhr)0&JH|2$&!>w1g5os-JXd&` zFW&nH3p{_`@kt4w%#v`pz;lj{YbPj3eASPzuG}@QT-k(lsgIN^k50e&+;n)Al7tG+ zQ8HgLpbba_yj~M@&s$1p>VBWVP-}(V)t9>9wc_|%@Dx`3+5jzhJxn0T`&oI^N&v2L zfKdVxwkP`f>H{vVl>iD!5Pb1^kVv2jpT10<0QzeONC4$ZFLS^hUMr8U4X-j!!T`@V zEOeUczY|u~*bV?}sst|hZCUv&zzSZ@^L8ds(5of`Xo))aOMvxO+~x0it@yUXtB?e~ zX(4z{S8>`CZdExvYQeg4%L{tP;8hq{@O;^Tvo#($(~eqjJpt-}NnAj-R^Gu;zTbBg zUWFA0zG#3a2|RU0OuovF@V_RR09Om#S6te0cohZW3E-TK$Id!$LkTQcd2a^@xCQR- zb3|R&Yk0d?m{h9|xSqNq9Xmk3!JAfoW9_E5|gX% znD_+8%4)@Z<>l&I!+7vT0Xa0{8JwQRAf3tk32iy4k?Kmja>XAi@GJ@tkqDsqR91Xg zJ-}H-z;U3951_bK+u?o8I?ba|JaD8{7kF>g^S(OVqhAuNr`mlN%AP&{1FrJL2$IBO QPXGV_07*qoM6N<$f~R;%K>z>% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage4.png b/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage4.png new file mode 100644 index 0000000000000000000000000000000000000000..f05bff3ae7ea8c15d388dee36d8f8ce5a2e5e91a GIT binary patch literal 2224 zcmV;h2v7HkP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2t`RmK~#8N)tbqY zR7Dhqc@l%bjiGxthARgUl))ibJI?|_GYbxYfH;OrpTV6g7rp^6VE6>Ce1i6VS^3}k z`}D~>R8Mq9{QY<4&6|0?lUZF|dF#M#mOp+ww?0L+`~EKx?3e3r^!gcHi+a6?zQ5i$ z-QQP-+aEBEtf9#~4QK#MeG6!6J$CQB=U0F(f zYZ!Y|2q1$-fGbGp;h(=3{rB(Ry&rkz*$s6>U;i86;8FCe;p|>fU>UT73pheMtP(IJ zjpyJ$RDJW=(f)c3Z)Xb=rQmgovmy@e0w%f=@Xy1)((5?aaE)K!FTc7;JD!9H@8F0a zqcSMh&<;>iVsbPe(Ch&G>rY==|9&Tvz`zk)@Pcj0gBMIx2Fve5&fGxvy0p-?CqeKI z9^qqff^aD5=_j7*mDS^YK3<%M7|QB*;9q@$pDMm>NnoH1+~K7dTn6I~FxTZR$mmhT z!runq(SxcjC!xR_xZr*A7+eM$rPbDT)e&{IYrJfp%t->^Uv@j-!Ntx$KC*feHp4Ie zC1o=HaN$x6#)GFVI-s#1uJ$;dd`OC^B%y=9*}>xvE}mR13Cjd5|6NrAd_o16!L}4v z-0KlKy5#M|qB=1y;7=C+u5*%7v8I&;{1QCEOH+~%+f{eh{qi~T-KhJC74TkbGm_x& z`hY@P3=&5UCvPeCV;t2{9N%3U>xUy^zVT7F13Gy5q$F^oe==*q`?dul*6EYMy2o+H z8I3BSBj=uQtaH&_!y!7z)X^b`v>Jl82%W0Flyg$x(a@vMm@^+uoJ&F~-U*Yes zofuC-Nk9WW3qlhE!|(3&n+rK6&52ZZ_i?2~5>Bk&zpzmAW#I7qf2{=gUPDrNOn@a}Wvb7XbK zl~l(|5-L2RUa^;Du>-o#+EsD&fr>80b|#h6CV%p=$2W-fR-50~@~L7m0l!v~aD4L) z0M?J4BD^#Pn?d7}0R4Awi`Sy!xb9JY9hD@UKfZqL{TGXGNJ2?K2QGO6GH9uFUCzXE z+I(eO35fkNpDMo(Cc$6roO;C{P5>H%b4Yhdb--LhZMql5aowZ*x{DRRTjB9^2b9y5 znt%*iitS7w*W{T;Fqf{ot6e@-exC%B;IF=CJAh08uR})a8pz>d-Muww)KCJDuFK=N z?oocdC7`c#@OM9drFhu|G%i+td9cVp4lTuY29;~_mZK~Iw7KXn=Q=)B>hI&b%FCd_ z_X*&KPE`^043_s=xin?cRTRf{cX=#akM$_n0ROg2!sT~gSndG9>x`Yjft9$KK{Y9L zwbM4_EsfoWPgRVqC4dEwmjv)b3E*UvI-jv!aT1AoHqjhu4u02onP>7?=!fg2bnnoi z{&xws0)H;-09GD&?EtMjlgKrR?}!+rdrRKWlk7>DD`LU9U*I@8d+=cK)13n>_)AIv zKbB|er%GeCy)_9gacwJ#3Gn&kEpa`@f@`&v07(e|{?56V*Dt+eJ3zaa>$#tvpTwSk$ueZ$Do|z2es$VCU%D zxdR-$1%bDe_0Oc$b}0$k0k_W{EAaS+9RM)k>;NTT%A}e6z83td^6^~`+u8vD1HV?a zApsN`^b|!85#mI1)Pj#bChwnVDm>7)&m7C)DXcor*@4HWybSyw5Xr$K{HoIZnosii zGI&qGtqQ;PRwDs43cj49cN$BA0+Ks8^5CP7$@@z&0n7ocJSHK+;}=>9pl|_jzF~n= z_X(p2h#-9>5Z4@HRrxrY4`&V_qx;Gu62Ky|>VPBa6?b#tVp;tQH3{`0f&z%jR-Sqc z-hHb4KFJg9D=+sX^soI6S}T9+%+dDhtB?fXIY;N47Oj^7!D$C5DAjd+Rq1}84+)OB zrz zUf?-L$F&nY$hjY3UF;SqUSpggNLO6_xbo=yo6k*$S1C!T@Ej%cB?H%hOC-TpA8=`<1W-tV z;EUITL;{WQ(TC&-pucv21W+ppnFH?dT6uhBc$Gd09X#K#&}pjwO_-~(9RS!=30&~o zvhuM2D|k82+nGQ?&rJr<5_RsE0Bfzd%U| z7xa$7t1z(O`LY3LYdmtM9c6GW0qXB0E+Dg&cW@M6?>h>w!ioc5)WMSkp1L9?pR*(U z-6ST!m4W+;OFIs)qCh+WoU`%RS?6si0t;5&+5rO2!2NZOsOx$SZ}$q5YV`rvQ&*&8 zC&_mPka#Nrejfr{a(Kk`8qVGn1qragdHTZX3(hAox%!TYPjIZPR@_%!uD&&ly)O#L zp%KsE^fU(POx{mu%Snw?SK1X<{E-5WMFAob0W_b=ig&9AII9Ra4s`Jj6xV7yypLI@ y*&oFNM_P4(w^lvgSBKmGC4#k7yYE6daNvK)cEkk3GtE{20000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2u(>uK~#8N)tbqY zR7Dhqc@l%bjiGxthARgUl))ibJI~Sx%`7+o0^%4heFk@~T=)jOfZ-Fk@(J4eW#xbC z@6#vmQ1n1&#NU5q-n^OTJDJtpmA4M;X8Gf{vl~-XyYK%J!G5{+Mz5dI)u`8t==W1h|5f9{l-x(SQH`-TRSep50VO^!48X4jx6n8qV$&1(rcOxPT+H!zuwo z(s&O3L)AB*9qq5z@OHK^Q3_tSI4k1dE?}Z70slPsE4_|$4cGVu{?e;kwBt#L@D7d$ zGAe^|4ebCWB_>Dn0nHA;zy9>4jqi6d2@D*;1uxi^Jb1xGWw5*+a^?oQ*TsdlJqdz$ z@CYA+6NE!aPe1WgudE*L^YP+5#86hh1OMt1{8aI6O9BIB;0`av;4&C@fVnPjK}L@v z7JfGXkM37JbP@`@feYRzkHKZIQCe+XR~=DTyT;4r$($qr{$;lV?qBHq<0GplVJrON zUs5LH7Z)zYU_5x*q5~TH;cAcL$%mwvN)kHw8y!4;|H8@DlCVs`^50b@z$a928Ei{& z#l0S(qf6dSEUFXZ0{&$2?>Z+b6>C~qz%Rigyfh^Vv0Zg{-7lXb-;KJTSOM>~J|hVZ zuMa4+#UOFyaPpR7KgLlV#qr&xv3@ur=IbAIJD`J?Pf7we`X{p%yl-0|Vx2x2ta}`H zOg=|ekK++L;OL7F50`qy%u5e%pT=m@pf15Nxtun+%lqSuC#P-5C2#jR-J@9XdlmlP z`ib!*lms;3vmi7vFuZoB-(1KsX-=fNyN@d^l5k?<-uZ=^Zv%(t|7#_{2SY&NOscwr z%hk`F;N-Loxs+Yk+|e_^aE%?%!C(8}@W$O%5@=KcIE0{{4TykXQYovqf_I-QpChX? zuB19%l2G9h^@_bLiyhE?)~<@H4^(t1wlk@mHu;l}J-$h_x7z%^mQNLn3Ha5LgyUOx z0I+`S6yc>Y*bEw%1n955EnbU?n>LOPKC$Q9Z*hJ zY63E7DYi3#T$5)W!CboTu6FrU`F#>hg1_>f?Eo?Xybc+uYaoY(B`7Qoa^{hslSi!DsO`d z-zR_{I#or~Gg$uC%B3ljuA(@uyUSzYdaOsm2KcvK5-z>_!g2=)UT5qK4y?q@45~?~ ztDUwXZ)xm4e5zt>EdeZeyd;1hN&qLT)cK6_=`#a zKbB|er%GeCy)_9gacxy;RXhPcpS&fm$5?QUs{}|&0PwfZzPxeq9oqpqPSy@!FeM?n zCYMXG9;NFFP;&UW@^K{rYvtn(034Bok^p}Ac{=sh;ITeO5gf&N+*|T~QG(Cp2>||r z?*LXF`1n_VLC02pOc^-sKHgmU{VqV`%EujWdu;*VCx8NUd74tr(HBot;^3<&14j|U zy``*w6rc_*Mfh8t_wW=dfR~+6&(Wt&nkfU%#+$2b9I3VPI0;};%gVp~d=d4EUw43= zqp!LHBDmnC76jf>)<2V0+odFE2i#gaR^ahXI{;w7*#Szxlu4xwycImYs(c)m!?tz+ zz`(CpZAt)z20ca5Lxea{R0f{)i^02($@^!T3J>(HGskjx3aid@cHr@`w?PEgKO`|| z_f@6)^$(Ba|M+C^o`9Pbe*LXR0%#O`IY;j_lmt!8YXueq^x&h9$@@!jeC7vM9+ME^ z@$;<&P`Cg%->|@``-D*hM3B+B=DwJ@iu;bK|+^ECNlgt;2q z0f0@Fzy-f8D<2E6f|v8Woe325+++YPQRjXMu-1yZ{5`J~-*$KvlE61D1kdRzPJ4u# zD~CrJtSfGLLGKv63IhwCFB@>S#v^CiQ3lr%p#GP{1!T7J4vymceMjL{SaINsI(U-6 zQ&+^~b9RLPHHisuW#GQz(vHKcC=gEo=WIN7)_EI>z=D;xc7T90aDSg8>bhRT+r7f1 zT7AIv)D`L2N%EZmB;HDZ--iH~93FAKhO;+CK>{prp1yGUg7ZmCuD)a96C5k6759~w zt8Wcs?~4L*Xv8x(J&i#+llK$aa#ADJm3GAyf26=;QGkd<0L`be;@#>2&ME?q16{lW z#kJZF?_<_!_DAu+kyc&ctyPcr)#3JkiC`_&?z>P99QYq2Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2uevrK~#8N)tbqY zR7Dhqc@l%bjiGxthARgUl))ibJI~Sx%`7+o0^%4heFk@~T=)jOfZ-Fk@(J4eW#xbC z@6#vmQ1n1&#NU5s-n^OTJDJthmA4M;X8Gf{vl~-XyYK%J!G5{+Mz5dI)u`8t==W1h|5f9{l-x(SQH`-TRSep50VO^!2|14jx6n8qV$&1(rcOxPT+H!zuwo z(s&O3L)AB*9qq5z@OHK^Q3_tSI4k1dE?}Z70slPsE4_|$4cGVu{?e;kwBt#L@D7d$ zGAe^|4ebCWB_>Dn0nHA;zy9>4jqi6d2@D*;1uxi^Jb1xGWw87{<-e;+fKRC4GT4^l zihDgmN0+>vSX3v*1^mh4-*rw>D%P~JfM0?~cxg%!V!P_@x?es=z8iHvu>#&}eMS-- zULR0si$UVZ;p8pFevG3!isQRWWBqVM%-28ac0dO&pOge{^iO6jc;B`_#5#R4Sob*Y zn0$_`9>*hgz|j{U9xnBYnU@~kK8?|)L0y7laye~sm-ojRPfpvAOWy8tx<|3%_bU9o z^%LVsC<$o5XF+IUVEEmgesdwmq&bo5?mn)xNWzJYd*>Hwz6>0m|F4w*9}EG7GpXth zE>}Nyf|JuWq52Y>B@!y9*7NuW^);1Gg(HXs6mNu{jb3f_ILe2%Qn zxRUC4NkWB3)GPL~EOtQmS-UE(K2Xu6*v_PK+T>3@_V^~z-fHvvT0T`QCg4{~5{_@( z0l@mPQ-qhsU^8f35}^O?ZSh)E9M?U{ucMNLbH_KXzW-wJO-U#T=)fgUKn5+fuFIKN zPMfc6D*>@z=2PYO!6f)Aol~#)!wEoRa1QA%sScQHs7?2xIIeq?Uw5(McPc!d?tpT- zQWKCtOR=2^%I}k468x3-YzL4D;C0AIT?08>th=`+jT%Y-(sg+p z*FDOww*>U%4*t&PuM{u4fX2njFAo+O$f2d!&Y*Hl-g1;BfHoKX#-gM8{pq|Nx1ax3(FlKc%88`IIt2oGpHt| zu6Ejnyrr@G@TrQiwFI!>@sa?3C;^|}~*_SsizGFK;$I03O45lPR z*W_|3)?E%9^1#P;0R|mgc~=H1#rxgo%I|jp8dpB)T6vrVu&8C_-+sP` zdd06hz|PUfc0dL^MJ))trL2D@t+q=^&k{hCjru9sp4?+LhB;n&}4B!EW2mvi(^V@Xgz(IpQ)`k1`G6vqb~Sb0oBgvZaf z5>(f^@~zk1LPPz4_d9c$Jcb3eQn8UoxPL;1KZo zT|sA_DMC~C`v7UdXUQN5)CI2<$5(=H{vV zlmH4z5Pb1^kVv2rKKhV60rb}nkN|2WA#=bTUMr8U46o8Bp@Zie7CKG!zX@|SwgUj0 zDuD}rTUI_6Uv*=())NTB6SV5@4+rclm2xE57aUDkOn#S_q!gRh;$+H&+gi zGFVsK@`BzmcohZ~JYP28Y>h|Gw4)5JB|!b1#06xw@(zyT>wQPzRakN0i#m9cz*ASm z?HZl01|H{!0$tVOAe2?Uc=d&q96elI8R?VeZl!8CRg7v@d=KV)r$Md%hk7r zvG+v*IW*!KoSw!Yoyq$NZ8@ot>Poxfia%1|u_!=9B7o*oS@CZ50B02e$AK>1f#OYWH0z2M+uX)1Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2t7$eK~#8N)tbq2 z97PmG{UwCMYzWx1Ay_fk*x-R7yk?%Uj4jXD47Rb28G|L?z>XCQ{=h##@CB^+f~HP( z-s-ETm(^8mwPa<))m3I?Wxn$=TdmIO1G`!N`0ea$jB5A&Un1Bq*WT#$GrAh}dJ%np zy?(mCuMW3Aih@QCJO&*7Bwbm^$E?#ldSwV2tpdJPug!k!q@7Wx-TN{HTz!`*124L~ zkowjz_NEX(28{q$kkW%ce=qv)-@ki5^31ba>WIGnH^9N8=vTwpy`sP}Xa^T?gmzdZ zU`QIz!GEaw=Ch;y^%~xK3lpW_b&Ini4(Hnh$7p0RHu-FU`JRXA&4Vf(u@-EqU;QiOOL4eaM*`=w27++VLa^ z-oYb$3{DUZB|ZJbQ@yf!ywAsr^AJN>{SN%APw-R4cPt4Elz}_E6oboP+yUmgyagFO zidgvD06e;1_0UNu@CGh;pF9Sa!A5DdbzOBtUF{k#nnbm!DX;5 z#TEB@gpMwGJF%!vjC1&t#lP#Eq*SbNWe&dpkMPo%B*b>r-F3fwihMWfeqsf@*XD#I zIJ`cf&=!Nlk;BPbiv1Wzbri>UmzMRz5iwu?sM`S@ynIv=xY0kEwcvf*0uk%<$za{% zxXa{oWc4^6u>+32`0#M4SIoTh@b+npHVx_$9Fxmwle@e>&UkX#hFtP?pVK{x6~9;E z?`@t~o`jNs27DHTCI*Jz-RUS-`Dc7Vle@~T9R;l z`wjrskDVgCv*$MsdZh> z#B$nvWm^e|{W2dbzYiwCU+J8B#UD-pS_bEk?vm<&xrW+wFN)*3NBMOZD}JZKmM$&eTtp#%z0Q5?tb1rkMF5c>;Vsc}rZ6vEUk436PWk;BTLOd3Ny~+W|UG)(&7W zCBfYT-zho#R1ue460lZ2?f}3MNhk^6ho7fYZw;OSwB+}-6z6eo$@@hKK9eT^_zS)R zSb5;%y8we`F9%IHM)AJPr^@el0UB36?tt4HbND_16rjt~lyZ(ff1(lx-$_LX_m;B$ zQGhzM6ya}m-osO<0A6-NJx3oqX-lp9-KQ!WM{2D+P6Alevhr^~Uqrp)*BxNz=oghX@KFN&!WW!Ml%@-zPCX zuv+oxo`n9j-$85TZ=N~YUVRmk06gdDeAA-!G9Wktl1m=^s?z;F9}=8aT**+~r37f@ zZ+7o+OW`SW(i0TKmkel&!DNcTyN{LMCjlN;c*qy8{i6k*w|9J00x0t&953*kqvP5M z9^}-Iu&%gkT#PdW>58i#S00^v^SSZxDkTXOo}*;GWI!9iA>j49g3dfsgr@HI0n&oc zl0g!v3tlUZuLMtF#cy=bg4e?Yf_#{jM_B@JjWYz>5=rpY2V7by0ThxT_~P{-kw7DS z^dWfy=&v0h0n|!D=72lARvup&UZqb$2hTSwbeiga6Q*j}4ghSd1TOd;S@~Fi6}+71 z?M$GcrzQhvi8}X7fVEcK<*#|I_>RM?kOaPIA$U$#aoQu?R5?7#U|n&`3wmwvDhw=m zzHGqR8jqZ5M;Tm8fciU$3&?Ec9UR5i`&!{uSaINsI(U-6Q&+^~Q+9;Eo5TdTGH_pU zY3=YT3d9q@IUA3ib>4;|uwdn_9U$Ng++XL2x~|vocCRq0Rv&OZbwxUMl6+?XiMJBq z_aVR~heuqm;p|OOkN^vur!Sno;CvF3tM4-L367Q3iu=mT)whPR_eB9YG~yYYp2i@Z z$@>XyIjNEAO1t8UKT_baC_qFafaX(K@ox11XB7d*fiB*G;#zHo_c7}<`=fZ^NUJXJ q)~d(*>TvtNM6i}>_gyFl4*U;TrMS+DD7PU10000^2bq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage8.png b/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage8.png new file mode 100644 index 0000000000000000000000000000000000000000..17d1814e53a1697739da4a5edec35b149a30a02b GIT binary patch literal 2209 zcmV;S2wwMzP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2sTMXK~#8N)tbqY zR7Dhqc@l%bjiGxthARgUl))ibJI~Sx%`7+o0^%4heFk@~T=)jOfZ-Fk@(IfOW#wP> z*XfgYD0-kX;_tsRZ{E!Foy_X$%3B9^v;6Vf+1VJ??)$$)uwSmdvCz-xYSimR^!@ev z>BW6@xcyNSG;-iE;OHmm%2GaNo#xRieb8tf@KwDw`>~UDMxA!=%M@_+9a08fba^TD ztzqm!v^xwaKFZ{?e&#u%Fef@8MgGbS?hO>J`fo0GRF5n35uu4Fm zG@gV1Q1#7cM;F&?cspB|C<-e;+fKRC4GT4^l zihDgmN0+>vSX3v*IsD1u-*rw>D%Q9%hhKt6cxg-$V!P_@x?es;z8iHvu>!u(=7c0T zygs1N7K6l*!^vBU{TN4e6vua$hWg=%n6H1-?SKwmJ}L>^=%375@V;$p@kUEUvOJUMNBE_u7p=^n+3->dNV zHct#Ep(LOIp9P_bf#G*|`b~u#lIBFJyZgA(JP9Xe_s-ANd>J@A|6eNsJ{STDXHwN2 zT&{lZ1ShAh&!z0T=8m2ThHLDA4*uE)hi7+NNuW^);1Gg(HXs6mNu{jb3f_IHe2%Qn zxRUC4NkWB3)GPL~%y&TdS-UE(K2Xu6*v_PK+T>3@_V|iuZ?*Y-Egvfu6Y#4g3CFkY z0AT&tDZ)!buo*Ni3DAG{wsn>LOPKC$Q9Z*hJ zY63E7DYi3#T$5)W!CboTu6FrY`F#>hg1_>f?Eo?Xybc+uYaoY(B`7Qoa^{lslSi!DldZy zzeoT-bgGJ|XRy52%B3-ruA?}vyUSzYdaOsm2KcvK5-z>_!g2=)UT5qK4y?q@45~?~ ztDUw!Z)xa0e5_(@EdeZeyd;1hN&qLT)cK6<(%^Bs_9+V>ljh)e=4p8*Vv^|RG2T6N zXeAy5TY*0tb^t36ymo+Ao=N0W6EIeu=sws!5gX3^0>{zD!Gpz5cMh=NFDe22Se~h$ zDvjCp)+D&ZwM-GRPo4muPu>#OV=TDFRRSa>0QlQyU!Glj$98~@leGgFOi75Y$>mb4 zN5%W(4nI{sjwE2MeB1$mBa%=Ozz;u9r`{So)*n`J9`}~KUzFf8c>;jH;5&eo2R^&&qnp2Dj0oE><4%*(+40g+{N`JY z1kfn>a*p0pDINz|qsr!Uc1VoV0x#qsE zd>qY(YsI7c$|DlMBC_g$BkC1*YvE#9{qr>m^&x@+h*Ch&WAN@{<@ZU953E)^x+h`r z+V7yX@;A>MZLhuxNdTU6biQfPdKnNL0m&r~eqHH)pAQL6E3Ray?otA@@;AG8xIuUd zo%93+@g)P=VlbIv@a|*f_ep@q74GxpYyW70=j|OIl>o{-3C9aO=jgb0f(JSEBdja# z8W-dALAv7V$CXFt-h6I6yh=$zh36=lFB#BAa0qz)uAno|6rrj6eSoy!vt*D2>Vnsb z<7>fFSn(SjwBYqHfgm4dk*AH7eW0QzeO zNC35xkU8KEua(EwhF4i6p@Zie7CKG!zX?+{v;zPeD}f7sTUI_6Uv*=&8v7 zTB6SV5@4+rclm2xE57aUDkOn#S_q!gRh;$+H&qUgGFVsK@`BzmcohZ~JYP28Y>h|G zw4)5JB|!b1#06xw@(zyT>wQPzRakN0i#m9cz*ASm?HZl01|H{!0$tVOAe2? zUc=d&q96elI8R?VeZl!8CRg7f@d=KV)r$Md%hk7rvG+v*IW*!KoSw!Yoyq$NZ8@ot z>Poxfia%1|u_!=9B7o*oS@CZ50B02e$AK>1f#OYWH0z2M+uXsD{9OWgFW)00000NkvXXu0mjf#ydS0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage9.png b/src/main/resources/assets/hem/textures/screens/hotairballoonpressureguage9.png new file mode 100644 index 0000000000000000000000000000000000000000..91de4bebe4eb30657ea5948ed80bcfd7c43a51c1 GIT binary patch literal 2215 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 BFh&3X literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/odometernumber0.png b/src/main/resources/assets/hem/textures/screens/odometernumber0.png new file mode 100644 index 0000000000000000000000000000000000000000..f484415cbcc261a0b1a66b5291201d251b36b4ca GIT binary patch literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^B0#Ll!3HFq)}LerQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nd!r97I;J!GcfQS24TkI`72U@f`>d^978<3-%fPoI&8qh@_ABBmFCO6|NlpN z^YVSVG07~iN+aa}%OlzBxjLth{{OJYKJH$U+0n_%`NCLKg9Dm_f;Ce-K4&ttRPNrm zcDtRyf@iNb7aq!FT$iq1JFi#N;7dgHvc%%ty6$|bY0SCCU)w_}HV3r{`(@tPE3$CA z`I_u)3%}N1o-kRX>OKM5ZNV%t{nDovo+Nd!r97I;J!GcfQS24TkI`72U@f;FBljv*f2Z~F|n8Vm$jJ_|`pU%dDKzmMle zfp(FbDy}Wk5h^>j`*FVdQ&MBb@06+Uwm;e9( literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/odometernumber2.png b/src/main/resources/assets/hem/textures/screens/odometernumber2.png new file mode 100644 index 0000000000000000000000000000000000000000..d2514966c127fb385705a88c10274ba92a1abd4b GIT binary patch literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^B0#Ll!3HFq)}LerQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nd!r97I;J!GcfQS24TkI`72U@f_pt(978<3-%dKnb;yCo<+tkIiiuU<|Nr-i zRGhTOcT;YR<3fI?%=9uN?$~LQ|39kRYrAQoy^8gbfb+>WQj3~a?w61f;VC)a;^ZJD z!NtjAlK%AYwzw+8hC1^J$wCZ!kDd4ZlqYoH!ui~}j*jzRU!Q&Ja)-n3Z$H{ML|%W# zkz=O&X8SDDWv1CROK)y5n5mg~spnQ=iE)%yjg$?=zrB7(8A5T-G@yGywqkFm}}d literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/odometernumber3.png b/src/main/resources/assets/hem/textures/screens/odometernumber3.png new file mode 100644 index 0000000000000000000000000000000000000000..db0fbe1aadb71ba5edcabdfde092bf1e78c72aea GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^B0#Ll!3HFq)}LerQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nd!r97I;J!GcfQS24TkI`72U@f`>g_978<3-}YPb9WoGbt(|0I68K{0|FaI7 zJ;(CJ`h|lPetL$f{4<&#B=-MscKyD^?)$w(l2$&=wBSAd?S)k8!FHxTovIpKdp7SU3Or6<3G#FQ<#IocQig;FC?7sWBes1&VI2HPT!B?$G|^ z+L=3fPOpql`<0~k*K?)N>+F_>sAZe>OwlbZ-eVM`ar#W_;?|X|JXHqiVn!m0(^szf wnanVKW@I>n4wtd5^Dd7=6TZ%fJoA|O{A8`Tj@tqgfZk#7boFyt=akR{07jyCD*ylh literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/odometernumber4.png b/src/main/resources/assets/hem/textures/screens/odometernumber4.png new file mode 100644 index 0000000000000000000000000000000000000000..7011a50f5818a3c700ff15ea5f6cf773b9478e87 GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^B0#Ll!3HFq)}LerQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nd!r97I;J!GcfQS24TkI`72U@f=fMJ978<3-%fPoYB1nosqGZkUsV48zwuHh zg+AZgTWmW@6c&_PM;6Rt`~M)~dvM$RRWG!zY)Vs1y)P7WMdeCUZrm>}%QI;c-5y$A zoAOg7=U`drp$jeVLwPkP8{7WLOKM#$9hG=0$veJff~ZKRPtMEcJ89*ILv}ahO*=iy z-sy4HjJqq0s%Gq**lVNi%DZ!8=?niur}G#W=5YKCcqaC#=;Q^%55ers2S}B PI+(%J)z4*}Q$iB}&o^kt literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/odometernumber5.png b/src/main/resources/assets/hem/textures/screens/odometernumber5.png new file mode 100644 index 0000000000000000000000000000000000000000..422b07ddc5ede071faf3295447b95614b139587b GIT binary patch literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^B0#Ll!3HFq)}LerQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nd!r97I;J!GcfQS24TkI`72U@f`>d^978<3-%j@CI&8q>QamYVm*&fT-}gs$ z@iP5%y>`6hqLUnl^Abs4nN7Lo`_KOVX|=TPZ{a5YFE-V(wgI|TrBRDjPtOT@H@hHv z*$cx3=0<}4S-wHh+Amt-7k;sl{HLwBUkfOrB>4N`*ClN|_FaGbrk_zVSv$jY%S@5< zQy=_p>MNft2|70=;n2Z?r+Qn`F6^2uv&<@QrNpK`ZVmIwg@Y`TR~gH*U3jy|RNiVw tTGQ>2C1+UjC%9cZBf>S^CvVyhhQE6?<~;UVw;t#l22WQ%mvv4FO#sDxcFF(% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/odometernumber6.png b/src/main/resources/assets/hem/textures/screens/odometernumber6.png new file mode 100644 index 0000000000000000000000000000000000000000..33f5ec85966f9ee543632762c775ebcec16a1ca8 GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^B0#Ll!3HFq)}LerQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nd!r97I;J!GcfQS24TkI`72U@f)_kp978<3-%fPoJ7mDa@>@tRM&QoR|K}YX z*G%=1Ij&jY@XEu|#?7A*J+k7 zfAuCDJ|=3wGn-F#MY-)m0iVMzZd3S#CstUlX?u3pk=@&dar4BW7moRV`+Nd!r97I;J!GcfQS24TkI`72U@g0nqc978<3-%d8^Zc(@>09^G^;h4EeG5}PW8E9W9Vu4T^}DNOk2+&& zlCXju^Le24{IceWQ&+xD{KIB2SM>EWtyeq5-1f1Z(BEW`_+p1;Nd!r97I;J!GcfQS24TkI`72U@f|op9978<3-%fJmJ7mDa@>@tRM&QoR|K}ZC zR5l$id*c!_!76CVvU^{xLi-;-soxR5ZvFGOhGOThw0lfWKl6&qk~4eBYo}VvuijQG zeNuFt{8rTLmf!RG?AF6eS}usIskWFW2W`zqg21}V^R63mFZhEJ)<+DF7CK+!u9XT_Z7@(6EgWqqC`&teaGPG L>gTe~DWM4fl1G2I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/odometernumber9.png b/src/main/resources/assets/hem/textures/screens/odometernumber9.png new file mode 100644 index 0000000000000000000000000000000000000000..3de25bc48a722c4589da5ac1b46e6adf7bf1cbf9 GIT binary patch literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^B0#Ll!3HFq)}LerQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nd!r97I;J!GcfQS24TkI`72U@f`>d^978<3-%dQp)odW(@>fWIuSoU#|Nm#Y zDhl2AJC>8ZkX61VDXlDh&EbNN_BQYPcb2}`x+8J9r`TnadwlG>rlnn8JN@hu&WQSL zv5x1aF8MXRS@(%daNVkhySCI-Y=5|pN7ybeqNSj+p=$Hp_KBWszYfn4Wvo5Be|5~X z#nXbG8~@eTiZp#*n=!-HbgBB$>r(SBNd!r97I;J!GcfQS24TkI`72U@g8MyP978<3-%bqVYBmsHwe6}n6n8jyyNSR} zpG~{ZXV`P`u^ilUa^H(hHh=hkZ`-@~Xik^9zw8j7SHT`kRWu}<(e!uLbwG&=!{N{7`*{wff;ZoC>bB({Yhg571Y7@@Oys=kgVY$hg z>}?Cb)?c15S)=Mh+R>*i(NaZ$Ulx?_nB#Ks@Yl9rmY9C&Qwz_O`|Yq)IJ=xt;px%~ soiUD_S~J@`I=%%}Y<<}*=l7AZbJFZ(?Obb|fnH(oboFyt=akR{00?||-T(jq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/odometernumberdecimal1.png b/src/main/resources/assets/hem/textures/screens/odometernumberdecimal1.png new file mode 100644 index 0000000000000000000000000000000000000000..fe4dbadf1fd01de611d30538e5cf43283f1858c7 GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^B0#Ll!3HFq)}LerQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nd!r97I;J!GcfQS24TkI`72U@f|Z^wjv*f2Z~Gj%4k!pP*LM9lRJVA2-baBA z&FqWiblx~q-t2O*Et`3&zxdqTxZv)m1!r#Q zTZ?V6zC2;^n}~v(?uA9`6y0xbT%mmGXB(HbSmKVn6@rp^(s%MCnv*|V;N0F+8K)=3 VH7%*dLlWo+22WQ%mvv4FO#sbJQ$YX# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/odometernumberdecimal2.png b/src/main/resources/assets/hem/textures/screens/odometernumberdecimal2.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0a90608846639c38830f0d8754eabf159dba3b GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^B0#Ll!3HFq)}LerQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nd!r97I;J!GcfQS24TkI`72U@f;&B3978<3-%euWYIfjZsqOl4sBZE4yq!)e zGrfzX)?a91b}adBR{dbpoj>B|bE{LG>pjXk7S20faN-F|@P7jn4T%@?I9nS`3`B$^ zGR~c9Kfdc*62sp-h2ts=RlW0PKe?;YuyFoutL7%V>+8+8E*EV4Ci{^;ar3&nk~eaq zZseP0`($7H;k7w4(J1)P63MNXU!+~J3Cdp@`O1I0<&y0aeb>D>F#m2xRdDI4#9wMv lUWqqj_);$aJ!PJH&-2`bZkBLOd7vj4JYD@<);T3K0RSM9bg}>d literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/odometernumberdecimal3.png b/src/main/resources/assets/hem/textures/screens/odometernumberdecimal3.png new file mode 100644 index 0000000000000000000000000000000000000000..0a4d11454860033d801567aa0493badf98bd0f7b GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^B0#Ll!3HFq)}LerQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nd!r97I;J!GcfQS24TkI`72U@g8MyP978<3-}XmxwHOGv*mhMot$(;u)Lv=s zb#E&vdlq??#H^RIGJpN#yS?en#l`nkxi((;6f&o+blz;Y$ckSpmdKI;Vst0G4cc5C8xG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/odometernumberdecimal4.png b/src/main/resources/assets/hem/textures/screens/odometernumberdecimal4.png new file mode 100644 index 0000000000000000000000000000000000000000..205604d985a3ed22ee0d5e5b30189af19c6b4887 GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^B0#Ll!3HFq)}LerQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nd!r97I;J!GcfQS24TkI`72U@f{Q#|978<3-%bqVYETehweG4owC>_c?&j9q zqN}0yN-_}|)#vOoZj1eY(D8A~!|i&@xVGj*c--9HBErkLHGw~I-GswAqM1|X75mQA zKO~lOUDe0;$Gxi)j4Ur7eyNd!r97I;J!GcfQS24TkI`72U@g8MyP978<3-%ifuYBAt(vF)mGTK{lmY!t_m z{L3{{{%&mIcRHA&mV7j~`e**S$2*putKEN7y=vaxKDiZQd#%=9oRsRP`Q3MiY48_` z3(_+?)VHdwTq{~~XnsJ|T%Pk@C)S^u95vbFNL_{PO2xaC{lUBmD^G@dEEPd*9g6$VdNKbLh*2~7a5OmRg3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/odometernumberdecimal6.png b/src/main/resources/assets/hem/textures/screens/odometernumberdecimal6.png new file mode 100644 index 0000000000000000000000000000000000000000..92bb34b3e8a81de0f89afc98c2fd2f7d30c9c550 GIT binary patch literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^B0#Ll!3HFq)}LerQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nd!r97I;J!GcfQS24TkI`72U@f@eKl978<3-%bqVJ7mD)Ts|dJ{fX2ZsgRb% z-%NckGs=5Z2iae{(YHPK_R;@^_I<}+1V{_bTs+fTci-FH*(;tWW|Uc%t~0yrvm$Z@ z|8~Z0uWfEw{8h_ekuOygthT}63cvZ>)~}ZF&sOtFek*it+qlsDdkLFs)`{mc?`cf8 z5_)OkH zPb5C(l4$d7=ex3dUIE9lL?vaf_D+vIGGWf2UoPlYou{ETQADylbTZIm44$rjF6*2U FngH_7dCLF* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/odometernumberdecimal7.png b/src/main/resources/assets/hem/textures/screens/odometernumberdecimal7.png new file mode 100644 index 0000000000000000000000000000000000000000..a2e841fd9a185452bab868d3ab9d0e4171bc90dd GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^B0#Ll!3HFq)}LerQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nd!r97I;J!GcfQS24TkI`72U@f-^l`978<3-%h^B)u6!R`d8#7_wU|)yFNJ1 zxSV_L?g4iGo&`5Qp3_=-_@2%6uU@6k@7$ICy1aGsRnFIb+SlE}S|>i*r>6McbA{2y zl?rx?=e0KMlC#P?sBL_G^+)y67}(3oUz| zx6PAPQS@c^mk|3@lBnp*X6ZanZ_b3%--N{$Y-&Eq?tWbK^R}4UIG`gLJYD@<);T3K F0RZouXI=mR literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/odometernumberdecimal8.png b/src/main/resources/assets/hem/textures/screens/odometernumberdecimal8.png new file mode 100644 index 0000000000000000000000000000000000000000..e22843b77efe64ea4e573df4a54bc14551130589 GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^B0#Ll!3HFq)}LerQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nd!r97I;J!GcfQS24TkI`72U@g6BM4978<3-%iTqI;WQp%@;fB;(keXO@9!i(E#b(| z6NLTt-Q~ac_0_Gspr+TwlZEcgHe7k@%GJ#?D|sipT9bB zVXggM5l6nv((gVIpRwo8T%#{*%ycugeYK^8rFO2^|5G-9-KW*IYuufu0DZ>b>FVdQ I&MBb@02V2Jng9R* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/odometernumberdecimal9.png b/src/main/resources/assets/hem/textures/screens/odometernumberdecimal9.png new file mode 100644 index 0000000000000000000000000000000000000000..3884b542863160dcdfe2e3535834fb3efa2ec4d1 GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^B0#Ll!3HFq)}LerQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nd!r97I;J!GcfQS24TkI`72U@g8MyP978<3-%e!YYBmsHsqOmVwEtrGb`6(D zchb(TY!#E?IQr(^+o<-359=#@FYhjWv2{n{a!;|#Hht~PvEG|sUOSz3iDixb?R5&z zy@LLpJ}6eyr)ht+AU4W=PVNrv!!4(Iy9M<41M;{1HZVHrP(Nd{(t`Cr%cq_$x)SuN zW?8+f>gs2E_<1+4SoUSfkEp}Zw{$lo3T*Z~+g2JRARS>pxydo%@74>Sx4u{|cgcu* sW$qWfHy?9$EcM%5Frocl`|qC&|9fYC|FS~80O%D4Pgg&ebxsLQ02=yzyZ`_I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/pipe.png b/src/main/resources/assets/hem/textures/screens/pipe.png new file mode 100644 index 0000000000000000000000000000000000000000..570e8d34ff1acfe4c32d3efba253b23cc25f83e0 GIT binary patch literal 1061 zcmeAS@N?(olHy`uVBq!ia0vp^4h#&83><7g7PDIckYax0>EaktG3V_JLvQIsnfChS zOWiyd?1;JTsLR2s8lh2=dwHW(c|q~J8B60ABp*BH#NNJ6t7O$z=8_2s3j#7qHr#tO zX-k&(9=>mD0#vu(`7QIKT0tQ1r@hVhebddwH4RSd%PrmdswL}cXLt7Af9F4+?@wNv zU*GBUtEWXK%uS|2Y(XJIRKqdG3`QyT1*{n$ft?>2^IE007#dIax)imd(UNl$lUdrc zOKTqop7o#m%6I?r>+PN$8+USSV%pZ{e%0&N#lTcW+qwN)?)+3e+cv{y&Y^Gz<8{l! zW9z?ujlQ_JSTKcq%cL?D&&lfPla_o{FL&xW>$;F})9(F7dq3RQx^Y+j^5%Ya*S_I-hydQv1rHWs6UBOpCvFwY{9(%Ut+n;>FAD!4(Zx z_s;EZPXM|t`#ry@re;*nQlUAlO}UL}G5*n>*1P`bXfPjSin;gu?{d?nvrnF_e>6z5$LJFjD|NN6?gCc|MI79;$x5>Q&uZf^M!1$Ry_7h z=|z2G&#@m1MA{Wvs}wIu$a@sp=DO@(dhX}e?VI_XdgQz&FnHhfEBWYG@NQeyRnDtU zJm(xY6dwrMF05N>z4W){o{#H~%3_NejJO&VKux=YIy|27TV+k{tZn@>7nuDSJYD@< J);T3K0RTq;psN4? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/speedgauge0.png b/src/main/resources/assets/hem/textures/screens/speedgauge0.png new file mode 100644 index 0000000000000000000000000000000000000000..730826dac1a60810f466348359ec06ddebc53969 GIT binary patch literal 2126 zcmV-U2(kBxP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2jfXZK~#8N)tb$c z6h#z;c@kp+H-_%r7_QV|802R_gSDujfH3^b3=9aU0|Mf2xbzv^xpLtf@B)TU;L0Z` z<7CyTI(_Ees_LHZfys!&CA+IK^E>xeO?OrwI<$}NkKe9UW8~)@*ydor-2JfC&(Iy$ z2Sqsc*L!CVrXd;d7;xw(YP-{csE$79S-~fDruuRFOj{W~{|jr=fNLiE6oD7r?!;q# zJ^R{*z#Z)QpT8IV_wV0rTzTv5i9Up5^&X($E*$6UT6p8aB4`CCutO^>4d_#3#1Dc)S;GgGzh3_NcJw%RQ;BTGYrG=Z|@Cxo3?}JwLRRB$Kb2uNM zQ2~fwe{r<>evu|9yx-Uy+NFypj4Og==Cg>o0o`h=*4#}Xy#Favcwbx}^qa4}v8zu- z=jnJp57tn!zjeC$>N4V5iE}dn14ZCb=6!Jy3?e`k4t&u!VFJJ(Ts~So+gz(2Tw0mkgx&D7HuT-EGzLWOqNOnhH6PdT(lN?*rX*vA@c_){f* zw|Q#%4@)(C2k!9GnBcFouQ7uhBdta?0pP7RrZ7R_`2_{9`63Y=mNAnbhjG}C#@FbO zeG$T%?_FFe@QkBOz=`_JEQ8mw1%&rASdBjJSVi{`?Q^_R2^)0wo{fgCH(xX0ZloUESS ztd(8{3Xjj%TK+1}sDo<-`0-fWw5Is$8a?w~0T3AOq5^K7tnPkxqfERTW0(~Eh zBB)n@_I^0Z|j53GVc)+BeFEPsHk-HH9gK@ zxUMnM^T0&-?F-A3mqDKaP#>H|pOkVyht>Z_ulcwdUD5myGXA)MM+_^V?5;EhM9^90 zF+pYmA~Wfb5o})tj8$X;mN2ssJz6neR3h3ClQZ<{A48@Z+Nj7%LqoQn?Ho_|^dYqdTkUN3fa|@Aplr zP~P{~`5MQIDnO-c;PKjbfeql_UO!&l`t-f70tnANc0yA)nP&LnqeW`W z9dfMP0G*F96W;eVXrBg9Gyw3AuDxGveIgaW?POK}2J^doWQxLg-{t2qvOFDdjG}ox z^Iib}hhRci0kWTtem1!G_bQA>1K4NGq{q2D>rn*|ep4#|nFqZ86~LfFnIDp$=W&(_ z$kq{M-YekIdJW$iz>mV^X-e5gub-&+;PaG1cm-tg^L$Lm%ipt4_=oFF`Lm$|@KOoQ zKDtkqO`6Hiiy|~l1^D?opJ!Yn3_wy#=0AS7sQoU`R)FlIFRB83@na0|<9$rZulcC_ zAFdxO@Q4!?0APTl0%*XPNhA4rQB(~Xpvub9z^5pDh~N{=Dqpo>dd=xeNNFuThaA@N0?+tJADM~S+d5GYXs~jBB7q8Kk8KCE>G{c^Gt$_C0 zKi6e`=jv*neKwc?cXDcQ&@YqVmj|{XDqF-i2F%s_+5Dn1tBIqpA1kF4%jyMxM8Zv(WVh7KM z30UM_G7m)t=r|4;W!{A`H2VOjW- zA1}YK;BKnk6Q)&U0RGSMJiC1&_*^sZ4X}h~#PfDmgD!ro^v@>GA5#Glyk>mv@N6&v zzqBAcc2^Pk&2cYMcqoE(@a%eD2s|4GCOm#@fW0+5a%KrSSf2o@e@TWaz`>*IeWCDd z$T;AOE-V)l@YEIJy}@BK>0c8!Aj^1`^?iY7<3iK`?6cvqGxyuFiU1&ERsjT#!1X$3 z=J~#_bKwn>GW!7MQ&))FPLx&#O~?$;^9Zh=>Rw3Jv&KaNnBaK&g54KHd=q1IuuS*{ zr=RAsYyE}8YvY0xn$O_)GzQ|HyzbC)pN=~=nsLwiO9$>vGYKOAjc;WoURf>R$RfZI z0bOE{b;9eIKHp2-ytJ8hf@fLx^L*R`+Z-&DpSQ^NKhP(&OYt}A$p8QV07*qoM6N<$ Ef>Ue{c>n+a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/speedgauge1.png b/src/main/resources/assets/hem/textures/screens/speedgauge1.png new file mode 100644 index 0000000000000000000000000000000000000000..f754e54a87c545ebbb03124353aa0dca413a2129 GIT binary patch literal 2121 zcmV-P2)6f$P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2i{3UK~#8N)tb+8 z6-5}uc@isy8%y_YELUm>!2|+YtVIO{3<;0~0s?A4K>S-SeFk@~T=)jOfaMdo@(IQ| zJ#%KxJ^6a3@8sSga>&K%XKberWW~ z`tspcLl(R#ab!fnhfJUW|2+RId>;|-A#(f#f9vc%&D{itS8&gGAGE5k0%(ex!}$P> z3PAk&i<8y&^E5%>{l@0dE?qofToEiYpNp6q(5-fA&D;dS`=2s}_r>)=zxmo5`}$OL zo{s19U=1nzJ7=q}t|G3bI5QJ4Py`-j-WM0aAOck3(AVhWcywVcxHkYEde-Q`CM0&n69E3;>dETa_FDDe%F=if_QTg7Nii92Ttg=0%s|wV$8jEg zJjOn8P057qwd($rr4*lSpBZODXF&IHRkP0t7208Q;`^F;%Aq|{`a0IaKGs;npGon% z?K9JVSgPSWaEG791b>}E66e2os- z7a^?q-sPnP&sbyvPSkH^Ie0BwKzKg~tI@|TRdf&0KF3RyuvJ&Um!F>)z8AFc_FbHV zstCvHR*fjlye>8uDSh4V6}kppBQpN9fq%Mndf0?yKnC8UXWZi$$WnR6J?=N*boKOR zt?Xr>@c4YK<*)LLI=EJVACJXNYl^?F(KGKA0D<8yD&Xen>h5PJswX)U@S<))pzniG z1oaBgzArY4W2JL>pKHYHjLC!s9ttmmx&pf07tel_(OG8N<;O*_R7fVk?<5me_g4U5 zb=%3|sUg@L^sMCLYIN!QP%`1hYIWz*Vu}+cBm-=}tq(evd5@SFk)_E+MWw5+>2VIj zb(KiZ0~6tQFD*`927LxVeQ+9mQpy1xR{tNp=HqH~Me{?*_~Qm1F|2^JyV4jCLFY1$ z334VNGLsG&!S+=^sUj1=MEKo{QUP#6HyQQruW;Vin46SRQ0=oCsN8Elz61OFIRX0i z#l`CJ^_3J;72w4>^WDZGVHw9}p0UpWKR&8}Qt3F6(q+)Vw+7%J-C0FHg4L{ezi(27 z^1i>$*En8O0V-VskJr8nYykiE`bu@{)AzaxAUyZj2~FW-n&FF&7O62OKQ4+xQnT3C zHMsyxc*K1bfSpzJ@f};m!6}_QH(9AT2mT+Kz!=Fhj`-yG@ixBx%BvFsTY}%T3P9!o z&kBgHc}~KLaJPNYIq7k3bRTS_C>d%1w6U;|;`xPzx&j*b9U6dtx;^!^_8#DiRkywG zkfm}1bUwzM@V>7>`!s-}0f2wB`F^$YiBtf$lUV^6%JD@T~#-D4d?Aq?2?NmZ0-vJrA%agdR=)UY4AAo; zIjl#*1Nz~$Q!zXmvX1BMfJZF745AMq==dj)uQ`$X`WX5JfM3D1b_YVRO>ICT>73=00000NkvXXu0mjfZsZov literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/speedgauge10.png b/src/main/resources/assets/hem/textures/screens/speedgauge10.png new file mode 100644 index 0000000000000000000000000000000000000000..bf960bd352ec3a33f2dc8ca45829b88949222564 GIT binary patch literal 2115 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/speedgauge12.png b/src/main/resources/assets/hem/textures/screens/speedgauge12.png new file mode 100644 index 0000000000000000000000000000000000000000..eafef483d47f32cc37c70a0a43ee1f2678eb29f4 GIT binary patch literal 2116 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/speedgauge15.png b/src/main/resources/assets/hem/textures/screens/speedgauge15.png new file mode 100644 index 0000000000000000000000000000000000000000..e25c6684bbc5554f74087f9a462043401a84c033 GIT binary patch literal 2135 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 M07*qoM6N<$g5M(lQ~&?~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/speedgauge19.png b/src/main/resources/assets/hem/textures/screens/speedgauge19.png new file mode 100644 index 0000000000000000000000000000000000000000..585d441b134cfa93995ef1454c34cd127bb55949 GIT binary patch literal 2124 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/speedgauge20.png b/src/main/resources/assets/hem/textures/screens/speedgauge20.png new file mode 100644 index 0000000000000000000000000000000000000000..a44e3232fe7326b781fe353f88e4008d2e5fcbff GIT binary patch literal 2108 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/speedgauge23.png b/src/main/resources/assets/hem/textures/screens/speedgauge23.png new file mode 100644 index 0000000000000000000000000000000000000000..bc01fc1e43ec33ab056ac904534449dbccf47f07 GIT binary patch literal 2104 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/speedgauge26.png b/src/main/resources/assets/hem/textures/screens/speedgauge26.png new file mode 100644 index 0000000000000000000000000000000000000000..8828a71ea1d088740aa8cb9bdedb16d36a491ff0 GIT binary patch literal 2110 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/speedgauge28.png b/src/main/resources/assets/hem/textures/screens/speedgauge28.png new file mode 100644 index 0000000000000000000000000000000000000000..a4763e83fb909462e9a14b6e41eb57addec0b4cc GIT binary patch literal 2106 zcmV-A2*vk_P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2hT}FK~#8N)tb+8 z6-5}uc@isy8%y_YELUm>K_CGw)}n#}LV)~%1OYW5ApR|vK7%_~E_?%C!14)P`2=H~ zo;fq;o_syicXDq+y6W)JbLV#V?|k1(?(Mn9jvZk8wmH}@_daa(GqmIS zAPMLGdjG=FG$aRH0uKE|ZFf2n)zJq%7JO3Ys~@+|x0T`ZA6lCRTr=6H2t4U-C!Xu; zInXu)?qDze{5|QvfB$ad(pzs&^dX$9_W%WV;XGg0+#44bK`S_c9a>>&K%XKberWW~ z_2q-DhAenf;>d`C51Bv%{(13N_&Oq9L*)1g{?55Qn!5=Oui&2XK4?{61<({Xhw}j% z6@d8l7bmOl=V^k%`;E<^UAlO}xFT3)J{K`Jpj&O#nz;#t_djI{?~Ch$e)F|A_VlUf zeL9}cgEge=Z=I{Yx`w!#;>=9IKoNM9d0$)vg9uQCLtmqhn` z!;6Fa;v7~ptr_o&C7F*ROaS=9YbUGco2%8st4rfe*b85OB*kR7aSfS}GXqge9_M-V z@fiEWH6;@^SE~nCmr{JbxiZd#&VcUYs%D=PDzwAq#Md?RltX)@^f=bSKGs;nucY|h z=F0RRmTLG8+~KD&!H=`AF$Y;9twuEg;H@^MFhSw@1qH`^k%$h*XWRa z5yG19Us+16<6aZaR?pUJ zWiJDT$LDJ;f0bv{!LVpl(8-?}JeU z^$O6wFE)x}rE__oYs7KJWI_WEg_l8H0p0G4XFtm5EHmx$^P*TPBop8}$%Hd|D*&*% z?d0&(5Nr;5R`PK*y7YA@nQ;3|wR3qf#R(IV0k+@P2c65jM@)>!(&VC|($!;np2Kim zCDQkSiSXN(7bh=+J_DdWIE_9j<$w;W|BsIOxEfv2{17t!q=82aDX~kcg)9kV1GR)K;ONz zSUtIQI>l54I9O-C+gKzlx^>0Q{pntLR6tnicQ&O{!4d z_v1Xq@uCV)=^A*x_FZ5D__w!CS9d;rud4vUbB~?S6y8iTeDTpDHRj~!MR7=K7W=v; z7k~+mxTgZJvx+{xW2-ngrIY6-D;4L!|05F^BYDOVpB_Kn#@AnYbwXfE@Hedjka@tf z0-|f4ldvM(ZC`XwdY&8I2OB9$h8h5^Ei9yXVPT=JfChex2H>A=Pkpt$2l!&uZSOl| zsoVgak1;2_?rYFK4WMWM;2+<7zuNjlDuCO`tN;w=clpQ^h4H@2-^WOJmZ^jGDVov1wd$Zl(3EFAssO@oY6T$kfcL)w7<4G}L-O}Uk=m~b zQRck@9T@_6h%Jtto#tbO4?zq1i|G z$#RqC17ao2qB!uv2qhQ5Bh-A*A-q3*lpl9E@li!70|$^ee{ib z_tb%1YJf(E_c$ayA953T46q*k+9y2Xdd>heyZ~_g!UD16GH~#y0>(Rce6g9-Sh1>v!~ipXz{`;o#!5v+sfuJ^gX zvteMux&fxxqIA!-2j+3?tz`)#?303c(o0tg&|>vhh|^L1b6+#4ok_5sePt`N7KD6I^d zkTXEvM{xaAcPLrUH7*js1jo}C?7kr4n;4^m<%Dl=`e`nAtsgqPHZDk^`3#OvV<7Iy z>kcjV>9}K~8TYKebl~1JlQ06%_*RzU_2mSPECL)6&?yF4C%lg7^S#u~OPg6IcrNSy kJ|FkUHV4be-#5?pKVqu1r&Vgor2qf`07*qoM6N<$f_tSAvH$=8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/speedgauge29.png b/src/main/resources/assets/hem/textures/screens/speedgauge29.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6a534fa328f4d9351b42dc3988ccf0c9d11198 GIT binary patch literal 2125 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/speedgauge5.png b/src/main/resources/assets/hem/textures/screens/speedgauge5.png new file mode 100644 index 0000000000000000000000000000000000000000..59a74b024736b73c39c3cdf55eee7e371dced3a8 GIT binary patch literal 2122 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/speedgauge8.png b/src/main/resources/assets/hem/textures/screens/speedgauge8.png new file mode 100644 index 0000000000000000000000000000000000000000..6c8156ac78491783b4fb1149c280d26a4b4878df GIT binary patch literal 2097 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/tempgauge0.png b/src/main/resources/assets/hem/textures/screens/tempgauge0.png new file mode 100644 index 0000000000000000000000000000000000000000..e1c62abe822f30ccbf76aaeab37e9b1508deb8ff GIT binary patch literal 2225 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/tempgauge11.png b/src/main/resources/assets/hem/textures/screens/tempgauge11.png new file mode 100644 index 0000000000000000000000000000000000000000..188a4107085b92b7b10d27fdb28f07169dd9172d GIT binary patch literal 2226 zcmV;j2u=5iP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2uDdoK~#8N)tbqY zR7Dhqc@l%bjiGxthARgUl))ibJI~Sx%`7+o0^%4heFk@~T=)jOfZ-Fk@(IfOW#wP> z_vw>&D7w1ojQIQS%$qm!d?&NIy7Jb6-7J6nc6K&Kwfp`r5$u<1Z!GjPx*GL*5q*EX zetL0V9d3UV1&thd3^@8py0VmyS*LmQN*^>@1$?VsoBh~HJEKm!_hkyW`VJ`rFS@*x z`qnV^rVu~|jR04W(t|&LFZ%D_zZZVwnP<1u5q|4{YKXGa&;Yk2D|Oq7DxEzXKKxC@x*O29u4{z|XoT*EbffxqFFn)S}3c>`+U4O4>6S0@4&zM1V2@L$CAK68MwnsF}Mr{2UO1W=y9Cr zQN+UE2H?^Cs)tTOfj4l$`{XgW2#ZGnDyi*v~?~`IGN$B8jbny873ny1g!ZHENe^-?NpHRVNuq^>9 z#d?H}E_pk#s7{P?_>;xI>zt%itZ`)yzXXr)(wHQ~cGcZ=zkG^(H|l<31$?2+2}y8x zeL$ft28knwleZN6F^=jej_)oF^}`V{U;n7v0Uf-2R1&z+Kbf`QecJ*N>-5QB-Q&1J zVr;pT)ioZm1CGA<@NlVD%)Bh%?b8@-8q~#PxFD(XyWHjdaK@9<*5?v+%{k-}D}JxS z-`hMfoP?5q27GiTlYog%zp0QzV(c-_xY9fcCuaA~&((YxI6VJfD*-+j0t#ocCm(yf zC`*9)xf7h6wmz4HTS& zBF2_Wv91_tmzN||ctpKoFUx!fbf2}W;_CZK%8>&h!OQ9EE^zm#?7qy$ip2!{YDvQJ z?K=QiKX!`nlEcdh26q6id9W_;7wg`hDURzN<=0V3!nxzKtM9*9d`l8a0y=QX6Ochm zu{{H!-Gh-!-q)}9`B?dVFbV!j=hQ2He*#bj%b?M@<_QoO?RX~d*OKnfJj$=TSn)d* z9#3~bIbEp<$e^Xz&IEEz?nyvukBZm(e60LF2`0f`dCztLnE+mgjMO!d!^OILYf?`D z@@uhAb}f$U9_80t0{U_Xf9La8ikDqL<9y|p2a62k&{Aw?P`M`0ye|oU&HMQMW99c{ zDldZyzeoT-bgGJ|XRy4-I&^&Rjgv)XkXbv5Fz!fmdJJ5T^(fc?|F%oQrFUOg?f}8- zjGe)Ol(?Be)vmfb*D`lSQ16#{ONu4dV@y#13mz{C;D-{x$tra|W4q!c*`!nCNzfd$ zGhWMGKDR_a{O+Mc3-@^tYz6*o*a56O@Y(@dc_xu(leyE!y(L{&P@ZUA9};uA>ptq9 z0JL%NVDZzP11$K9N&r8WXX>X)qqeyZ?vuzRuB{@6N7;OtG-r&#>q>y61OR{g?8~!@ z@7NB|ak6#*gDDBo3BX;7^{9BC+~KFn$B_iAm5)0Ba6}SH0{G$Q>C{_;$NIx6&g0&a z_lpvICQktH7kme>^1#P;0R|mf`60#oGM_5H-vww~`M3jaZ_MEr37`O7o~D#@^!XE& zIQUK~Lb$h-^^XG7p`{3atMdgsg$m$hC)9KFv6Hscy5D`OvT>x=%Ht$}MJ+4;_VY#5 zD}LPpc8Jw%8Tt*RKj`;feUrm^rq-#T+Fho`XWJZA?UA9@-1KOI>;1}~sh zr2Bm?90BS7?mE0D;AVy2e5;WF8Ut#SNQdW;ZQ>6Pfmjobi zf>a%ssCxpm@;AG8xIuUdo%93+@g)P=VlbIv@a|*f_elT?dW^P~kaB=1T^&5gY zGeu~B+2DY*;Im|q1nPp<(S6o^RcqcwZfE|Cb2XQtiGA<-mde0U2n5fHP5`asU7T07*qoM6N<$g8!y5 A1poj5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/tempgauge12.png b/src/main/resources/assets/hem/textures/screens/tempgauge12.png new file mode 100644 index 0000000000000000000000000000000000000000..36496d363df306f480f652b1b3cf26822bb96692 GIT binary patch literal 2215 zcmV;Y2w3-tP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2s}wdK~#8N)tbqY zR7Dttc@l%bjiGxthARgUl))ibJI?|#4}t?AAdcbEXK?4rg>S$M7(Rh3pP;>8R-UTU zhs;~IiXI>%PM^-ac{Bg-&#bPlytQX1%OAg;+L)r+{n0N8_REzw=K2|3PQ6}4-(RmD zpWj!9do+rIMh-j$9Q`C+TFA$&(>#1-3>vKizFDtr{5VKEqfWc~WfgGsU8WXz(Zz+- zw}!Dhg#cR62yg`{-TU+RqW}K=d+rCGd3IAB(bxY5ICzSFHJqI*3aka~-~vu)hgAZ` zr12d5hpKNrJ2<~y!`t4%L{0Fz#aR&tcL9^G1pIUFujX}}Yq-WQ@E2aaPure^gm-X6 zkf|1wYitK7DVZG22Q)hX|N7IHHoo7^BrtG-3tq52dGLZswP5*u%$XbLxz5kDLd&vDXI z#KPYO;L+Wx2TnqPH*mrG06;=z2+5Bw+FHsuJK6D!3MGPk>5U zPv~^X+lfVWVw}MrE&ko$B&A|aD>L{7c*09ll927HyX$`WD)QZ^`-v6sxz4VT1c%oL z6xuRK966l4r|ic#s-qm=U0T);N5p*fqhSXO@bXDX;70#s)`RzL`{ZMf7pXo5>z?B- z6JyJzR$b!}JK*Sx5BHaP#cY>3ynPy@O@q3a3^4ybS9I4@g%GZxlGJ8#Ti$cCE>`%oij6aUj`1(|JO=@4~BrknM_U_ zo=NcjN`{=aF_*mE=Nxkv3|H6z1N@Z__HW$oC4ojIfI|rCIhZ71$?Kj3`X+>57vxki zzFf+>Vx(POl2G9h^@_bHvmG#e)~?Fc_mz}O+3t|Ec`yQZPkH|_pDGp;@XI9$hwtA3 z!1}RM!b>e!f=TCE0!i8Kb#HHpaeJQf>!>8*^x=)m@4r}lQxZx725`v}(1MnF*X0gH zTLy&^I{USJs{B5f1b=C8>J@)H0jLGXpy^z5N1g<=xyG(ZIj(!kue(_BTNNH}?tpT- zQWMaEma?4* zCjfUT>#4j??(nP1$B_iAmCqdjI3fup0sQdubn3mqv;LsUdE9&QeksAXaS05I@pt2QNoLW7>7 z=pjN*w5~FE_hs__Elq_7`o@VvZFmZ+&U1F)@ntUq|EHr>&)@~Ljzg(D#S-(83I z1YEE1XW!~1fJVWWbM!$|{uX3V9-IfCzD(X<$~goJxVzdD9zWAd0EG*H^9>7}x(DDQ z2uXE!hgerWj*qRC?zuz)SVUGGa74Z0-e0&_R{u;*LVbv!09*v#t5K2?67#MoMC zskZ~>ul)g9D}VjO!T##2kObg4N9UUsy_W&ONUeGTts>p8xg-FA6Qt_6MBNjhmA^i` z!!3oU&`D2F5MMH&ErV$(gLj`QzfS^K&{KTz+CNy}d3(nvC4e$Z!r=nXIXbSL;6bkP z5jN#JCa*Eh7^KTr9p%cS({DaE9bTm*p~7>N%$E#kBRB-Sepk>fZz-YuWrG9KgKs5+ zBv2Q;Rvcdop2CV>8=wWRhY1AvAS;hr3BWbZ7;H}@!B-z}X{`iMNP^&t*Mmd?P5AUN zc>?IK9UuYJOG3*5cX+KlzBatdJP89l->}eWs{c(`Rm*k&U{fVhG6Aj@xUaah z?eHoJ#1p_d8;_lJ-i8ubu=3sx5O53JU+0LruGjE(t}v-qA8`qaT01KR_FPy&Md=itZ?=tZTj+NDl`^wAJw}!F%MFBZ9;u)Nt#vq-^ z`w4A1sgdeRyK==JD)1}{5RnL=`BYYXSUtd5MZj^Oiw~foy%sS1ZQ9N*@RTp?~ p)$_hO+@oI-tf$(22g;s3{{x~Khy3nI9ZCQI002ovPDHLkV1l;|E7|}6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/tempgauge13.png b/src/main/resources/assets/hem/textures/screens/tempgauge13.png new file mode 100644 index 0000000000000000000000000000000000000000..8833cfc9615a7f8835a61bdaa990b32fbea84956 GIT binary patch literal 2218 zcmV;b2vzrqP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2tP?gK~#8N)tbqY zR7Dttc@l%bjiGxthARgUl))ibJI?|#4}t?AAdcbEXK?4rg>S$M7(Rh3pP;>8R-UTU zhs?USiXI>%PM^-aH#7h5&#bPlytQX1%OAg;+L)qx`=ehH?3XKV%=I(6oO->8dw;!p zeBQ4P_h=LajU0FiIQmJtw2+Tkr+N6wGHA38_-4Jf@#7%vj5_V^msP-Z@0eQPMHd&+ zy)}&8DFo1hMu00w>E55e7yb9|-*Z3k%(I*7hS~!=Nhi@3;cyw@6)y?A>kby z5oD?b&BXA&4V!38hao;-NLq*}22zRZ~$=(*0%wB<<< zyn`ov1}6xIlAeCzskvJ9?C0a)dMG?z#F*Weew)0Veu58lIrg2r}0|zw45XW{^hU(?w%X`;{)p_;ePnp zzobmYA1++VU_5x*(gEdq&vQKaGAX8#gaQ8A0FU22cXYiZEE2HzcU1}S2^CxmwkJTP ztS5B3dJMZO!=pI8B( z>+A|iaCm({p)G^Nk;CCi0HV#6_cM;_D93k~#_q!rF<<>?*Z~8)d{PqV=%37b@V;$< z@VX~~dmYw2#~l-6%cWLb;}JXH=!*~cmwLr)mpQzB8lz2vx|j^t3Q|`haNh-fAI^Ak z+LpOQU2~4P#ERdk@ORE08BanBAeB-+!_ArX-XE4B(O{ zpam`UuFIKN-UG}w`i}Wjc|Vv0e`#>)6@PgG&={PYYwnWjtt4c*4=xP_S8y1 z-h*;n_mp4n3FwOh{H@PlDPDE~jkA?s94s=BLrdAtpmI&#bC;ld@_zVKdB2v*%b>!~ z6TlChsv_zwSl(kDI^TP9vN5&5rG#-un$u(8de&300siffgbVM!u-E~D*BLv511Zs& zLDjChJJ(v?lLJ$4_3ufsWIba_0W5gDB!C}E04J-|`Hbz#Nm`SxBj7a$b;j$t%jcH3 z55K){-`qXP2(|)$Ds})X54?7OR-Q@Zt;yWE$Gs=N&y(y)7!z~4s~>ew06MvMZ}H=U z11$LSN&r6=XX?jFqqeyZ?vuzRuC1d?Kx@91G-t-(btOPj0)W4H>gA2|@7NB|ak6#* zgDDB=1mG@ZJ(d0B4!^2=97(`h`P>13Ba%=Ozz;u9r`{Vp>kq1&$Gs=NFD3YvJORL; z^Bus-1E22#3_7;*W6FLlUsc}U1!%5(?tq&oXYlg`P=GE^Q_4B|?1@SazLiP{_nun! zrvP9I3bRI0;};%gVp~d=d4EUw43=qi@#^ z=t1B;weD|8tL;(}v;%IOJXGNEO*;T!z}W#xz?4Z_>ILn-u6!Jq!}fLnz`&oa+LQna z4SI^AhX^^*y2{|)$K?07G!-7`8z&C6;VG;-&)I>;$6f~hPe-es!3$^|slU&KBOv|X zU5EDsT(9tF-|8fQM!}bJ^g&bp7GzK!oClviCcj_GIRp#1yV?^TKhsM9g$sc54GWyQ z2jC(INp*LJSXVxdkFAyNxkLh3L{=SeM7`qPU$|IS|4dCneTbj{TnZ-Zcn0r2Ro+ix zY^}7^+X3^}{s66&zkcFifAv*J0`Q!p^G%E1%Ya~{Ry~1Mk@{;c2|(ZksX8uE_XKF= zuMh8Vqwo}N(i0TKmkemjU|P!H-KWa?NdOCaiZ5RK2MauJ@A#wyP-aOuT;MrJ$F&nY z$W=bVrhLcbHO5&6>GD-ax$@}ro6k*$S1C!T@Ej%cB?H|riI`+UBzinxK-uws0HiFEidS8gI8f- z!SiJU&enM3Ogn19^#rKDlemCvt-OPye7$cgyb3E0e9-_;5_sy0n0%ET;qNAy09Om# zS6te5cohZW3E-TK$Id!$LkTQcd2a^@xCQR7b3|R&Yj`_Xm{h9|xSqNq9Xm9rBu;(EtDd07*qoM6N<$f@hCKU;qFB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/tempgauge14.png b/src/main/resources/assets/hem/textures/screens/tempgauge14.png new file mode 100644 index 0000000000000000000000000000000000000000..b0b18b63aa4dfb47b536976b7baadb486eb00df9 GIT binary patch literal 2222 zcmV;f2vPTmP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2t!FkK~#8N)tbqY zR7Dttc@l%bjiGxthARgUl))ibJI?|#4}t?AAdcbEXK?4rg>S$M7(Rh3pP;>8R-UTU zhs?USiXI>%PM^-ac{Bg-&#bPlytQX1%OAg;+L)r+{n0N8_REzw=K2|3PQ6}4-(RmD zpWj!9do+rIMh-j$9Q`C+TFA$&(>#1-88li4e6wEL_;HYSMxA!|%PQdNJEj(R(Zz+- zw}!Dhg#cR62yg`{-TU+RqW}K=d+rCGd3IAB(bxY5ICzSFHJqI*3aka~-~vu)hgAZW zN#i;A4^`iMc5r^ZhPS-3Gd*D zAX6^sWzO6{&vkyLEl+~r z9X#PPI6*j+^z;)?&DE;seLh~!Lkwm02k@^x!H*T+vLrB23*6zQ46X%(11jfwdXAHx zA{PEO0FUlgJ#Z2VynzeeC(qy#7Eb{xsqU`(G+t|-mXid)zZ`bJ-E)I~d|>?~+z&td zmz2r)!-Y#3jDmjhvB!%X3I~+yJn--&G~RCsc3= ziF*QEfJ#|U=yb{3iA8l{oWUP0{@vgtrD9DhGx!B~!b@XGPy&$J)z4k`%U6-_M%_=W zfX{Vyg(Nt$uJMQ+aP-B8`%ArIw#yveK8?|)L0wFS3zj;+%Uw!<`ZJ!K zwq-6+*PLT6vEp|s{GGE$#*bV)0E$C)6@PgG&=_1o$|bK0SkRe(mU3M8lwWtT z;+Zct zdlIy()i1|&Pxcm03zqj-htBujoNP=ja4BKjk>>OmxSsVCY=D0|B;mrlFD!O|;C05% z;6O^;%%Eyl-JNSK?}_UIRz1BZ#gg@mDFv|L@sa?3C;^*_{HfRhtUU1A0a|$`k+&vur;mG2-Y*la_AxQ1yY8dz2|y?J z?k#?NaDWAWUJ2mG;!OQmY1B6N!F>|B#I<#l324pNlIF}9ysiXDN&xUTPrbZx{vF!^ zI!@LOU@#>iodDdWtf%rmxx=q2A4d|fRz7zC;D{uY1n|Sp)2a6c&-#NZ=W*}J`=tcm zk|zN8bG`#udEoP1fI-JreoT2^%U6}(?*cSeK6k*)lQZ~v0w_S2rzzzeefC5p2j5C1 zgnLh|{wY8mT1xmEgU{h9Q~)nKp`N2powTRk{qC!(HICFaS05I@p zt2QNoLW7>7=pjN*w5~FE_c3|@mZri3edENTHavw@=Q%s@_}I(9|LJJeGk5{5Bi-+F z;Rs0och})P0oN=1*|$0gpi%JU9DUG~zXchT2j{`3kIDN>Ifq~YcUODD<7avapl|_j zzF~n=_W)c3A*t@}5bMgv@v*hiJ(oxTi^!@2j;L4M`wJJ#>Yu4es1FeofJ?z-9naw1 zr^@e>7+WhX^>)DgwLd^><*%PO*k64Wk^nsC=zPa%s zsCxpm^4EuVxKVfto%93+@g)P=GMJV!c=xID`y_w`J;fKV{euObw|9I}0w}X294_#j zqvP5M9^@(?VNg1eRCtb(`H}%`1c!jv?+Uu*EhV(S zY;Zt&@U3K!1nPpIw)&C}}s<9ma*i;Ez@LRI- zS%4M1oagOKprBVx2GA09?w0`Tt+>ly^IGvOhgTs9eA7bkoUY=uC)}!Xc+`S*<(3!p zw!y0~u;BT!0cUGGa;6=%;Cceo-$`6RwpQN3QNG@{6<&oE2fk>4CkZ@tMNGcRj_`Mr zOn|Ee?kg^BJG_bl@dR+r#$#ulx1j_Uth~1a1l$7m*EyoD>ovTcD@>}@2V75Gk&c}t z-x)ySy#)Au2yn^a5!Y)tyHgY-zyjy#3#TtQpTy+qJ0?ECv9elmUwOIu)-ZOzC?JPM zJcHBI7^E|KKcOurHBwz^SFZR&1)fC#A`$^KpUR34s|Pr%2sjRO@c|UqYCF7-S*Lk4 wiU*Fg>H_brdfr!ud-O|!^;Em>K-shBe-U4SUWt$v{{R3007*qoM6N<$f;c!pbpQYW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/tempgauge15.png b/src/main/resources/assets/hem/textures/screens/tempgauge15.png new file mode 100644 index 0000000000000000000000000000000000000000..b9676ec516a65a79bd77b737b727e649f1638a2d GIT binary patch literal 2216 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/tempgauge19.png b/src/main/resources/assets/hem/textures/screens/tempgauge19.png new file mode 100644 index 0000000000000000000000000000000000000000..6f631d5a00b85d1edc1706380716a9b5efc634d6 GIT binary patch literal 2215 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/tempgauge2.png b/src/main/resources/assets/hem/textures/screens/tempgauge2.png new file mode 100644 index 0000000000000000000000000000000000000000..41da911cf974ed0bd0911b0420c2f9fd5ec8b0e2 GIT binary patch literal 2233 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/tempgauge24.png b/src/main/resources/assets/hem/textures/screens/tempgauge24.png new file mode 100644 index 0000000000000000000000000000000000000000..309ff16f5869b2de17a53587fda0631d94fa5251 GIT binary patch literal 2199 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 iNwA)3_xn)x?D-!_B8zwB8CY`w0000Cl literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/tempgauge26.png b/src/main/resources/assets/hem/textures/screens/tempgauge26.png new file mode 100644 index 0000000000000000000000000000000000000000..c51e1e1873909213aa7dce1ea69ca36e751f39eb GIT binary patch literal 2225 zcmV;i2u}BjP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2u4XnK~#8N)tbq2 z97PmG{UwCMYzWx1Ay_fk*x-R7yk?%UjV;gE47Rb28G|L?z>XCQ{=h##@CB^+f~HP( z-s-ETmsQm*wPa<))m3I?Wxn$=TdmIO1G`!N`0dYs~uMW3Aih@QCJOv#6Bwby|$E?#ldSwV2tpdJTug!k!q@7Wx-TSf(xcZJM124L= zkowjz_NEX(28{q$kkZ3He=qv)-@ki5^31cF>WIGnH^9N8=vTwpy`sP}Xa^T?gmzdZ zU`QIz!GEaw=Ch;y^%~xK3lpW_b&Ini4(Hnh$7p0RHu-FU`JRXA&4Vf(u@-EqU;QiOOL4eaM*`=w6rR+VLa^ z-oYb$3{DUZB|ZJbQ@yf!ywAsr^AJN>{SN%APw-R4cPt4Elz}_E6oboPa6si;j~>T~ z9z`ttZ2%rUsM>ZC3cP^}-Y1X2MOZuvP)T)n-KX)gc`_#nfPdNTfCm>l|M_``)uF&Gb?w&;Lzz2$K{`H&P-NkRvIvxCPUTs*m25*7(q{JW|I_=E~BgKY^= zDb^!&bjjO^MRj7F!=EhvUFRgFVofV^_yu@`m!>2kwyW;0`{m2XccbnnR=|60ERh6< z*9R2ZVvsm;IC)F4ALFQw;`r{;SU(&Q^No+X9nitcCnbR!{gYV>-nT6fu}+^1);*3p zCdQUaSzY51JK*Sx4-c1m#mq|&Z=c3!)1WRU!v#s5-{mgvhclj>wjr0OYtAv3Sn>N6 z{{F^^@g$T4G~lB%nFLI9`Yj7NCdQuPj4REPaAJ1COixBHw!?tL`xu9_80vtoYpukEc7JoUYUaWYAJ< zX9BqKe%5V%@zp=@bp^fH8|^zdjineg9nSB?i^sjUs3}2u{cvdRT{O; zeQ=*dE^%!YIlQlw&zDJa#u&V=1V~B%@ORF=JiGLc?EoDoYX>lxk`SE$+@)BLiucL0 z1b8Bb2n05~EEB?0{K^K|O1!DD^9iu2%EA`sVN|0uy{@&o{X(RTnV4}5$V zV9>FZA5*+9^GsP15ZC;E7oc(F;|{oUb`IYsfC6-Rno`cu=TB7P;5(@Z;hrf=1k!jC zpbjlX_}iWL@DwV5mz_}0(V195xldK=e)naSB>^#BYvpkgz@nCwfBX3&>J`8406Rxt z*A4)pknzptS=427aSz zQvxV7=qZXGBKSnxQ4HRFOx{0J3p&CBef!L@9G=3e^PC-ceC%c5|8!*a7`%X1k?!}o za0I090*Chm+^X;!Z#5D?qu|RqdZ#IW3t~_noChC$Ox|CLa|l-3KfVkiJbs~-016iX z=NlF{bq~Nr5R&Td4za3y93NXN-ExTpu!yWW;D~y~-CDRx_s49TzPc<&F7}WtCS>Ec#e|!k^yZ5hk)1b3Oe&l z5!zoiI3O+fEEyz$y5P0q_)72;R{UlMEqFalAjs{kJjxP)Yn&n2mPmrHKH$T1XyduUH+QaitjkQ3Q6Fb7J}z=6{kJIEh~pd8LTUA zc|orYUWI`L&zB82TjP;4?I?q52~dA0aRHgFyo00odS5HN3M&qLQ3p>Fc2L z?9;#YdCvT6ePd`=jjWlFF2pXH_P!_} zhekYu)6*EFGkHIuEhjZnU1?Wb@ka_g76ph%1kijcE8eXh;H)CxIMBsAP+Y6+@IGdp zW`7h99BI`B-dgo|Umb4$mk8EU?Y;};z=8h(V&RFqXP_DA00000NkvXXu0mjf!2cs^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/tempgauge27.png b/src/main/resources/assets/hem/textures/screens/tempgauge27.png new file mode 100644 index 0000000000000000000000000000000000000000..e9b3b5c68ee5c1fa32320937b3535695b2fa69d7 GIT binary patch literal 2214 zcmV;X2wC@uP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2s=qcK~#8N)tbqY zR7Dttc@l%bjiGxthARgUl))ibJI?|#4}t?AAdcbEXK?4rg>S$M7(Rh3pP;>8R-UTU zr!(u`D!LoUh|{MtZ{E!R`!lPnD{t-D&GN@@r#7ajc7OCsg8g#kjk$hCms777(f8M@ z$LIIe;U0~mppgSl0Y^VcmlpCd>ogBvSq6>P0pG0GHhvtWol&QK@MRTn^&L|Syy)UW z>RZEjFoghG&V2~?~`Y635%xyl~i}veHyPdPs>RH;9m|q;O@D>KR&R261Kw6 z{v~BH{&3+^2IIlgmJTS_d!FOTmq{^|BnPN#47~tiTlE97r$*c$O+ZKqd)29XNp5u;* zvE@>$uJMQ+aP-B8`%ArIw#yveK8?|)L0wFS3z9m&%U#|NXFNG=%Uq(aImcXL#qU)3 zJ72Mq96KG?r;yO#tSl>iPQsOMl35KJbu>KVNJ$;Td_i?&t7 z*m5cBijj7CNkWB3)GPL)%yz)=S-UD%AEQ?2`2K2c2>yVMU26DKpyZ0uYqGdZE$8}Hn^`3yfIKbcf z{FUNm7tlCc`NhE^139#m?F=f{IRQP!U_@Pr(M7;&ed#pp} zdv8uQRjmXhj62et9s}32o`MbVZ-*pYc=v_H4iLP~*clv1iJKWz?W((Tt>r!S`n&g} zShAimr2rN@UJ}3$C4iGv>U_p_1;Y(8;}fiyt2xV8NeP0{F2wQ$JQ3watBS zpF}QkZ5=thR*80>uO-cyF?d}Gkdy%6Z=QO2Xe!mOQT>0DqH&4#s=Lw(yU7n_tbM)C0l^lFKl@RVyCZW|o1*k(y34deo zIXs05;AJP&bM&07H)&73``xE#Y7%-YkCOlvwXFQx&lgdz_;m-^Ir>iRfDGQfC$4)E zl!%m8+odFE2i!P$sKDc!b^ySDvjda>O)j6Ryszc!Xju{*wzmTS2L5c-rUX!E&{GsW zMDR)OM*#GEOx_=5BBsIvedENTHavw@=Q%s@_}I(9|LJJeGk5{5Bi*mDGYKw-_XJ$8 z@MquZB!EW2mvi(%Q~nls0^E@YpFSq@fFOxE!X-hHb4K8dll(vq*d zT=2vWyjK4DiG%&sS0M?&bB@k8EqX5lf{|MF1X@M9Uvo(S0w+k-af!MoKr4TJc!wK> zr_f1HP!L}-pe=)GDT8;PD!)$xSkO~^@!CIF;CXw;CnbO~OTys-&pA4-o!~+8DK3M? zr^t6qUSphPkSAC)wgK>z>%07*qoM6N<$f|H0ab^rhX literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/tempgauge28.png b/src/main/resources/assets/hem/textures/screens/tempgauge28.png new file mode 100644 index 0000000000000000000000000000000000000000..76b32a2dea79f3b2400eaa13f74d32db9dae617e GIT binary patch literal 2206 zcmV;P2x0e$P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2s24UK~#8N)tbqY zR7Dttc@l%bjiGxthARgUl))ibJI?|#4}t?AAdcbEXK?4rg>S$M7(Rh3pP;>8R-UTU zr!(u`D!LoUh|{MtZ{E!R`!lPnD{t-D&GN@@r#7ajc7OCsg8g#kjk$hCms777(f8M@ z$LIIe;U0~mppgSl0Y^VcmlpCd>ogBvSq6>P0pG0GHhvtWol&QK@MRTn^&L|Syy)UW z>RZEjFoghG&V2~?~`Y635%xyl~i}veHyPdPs>RH;9m|q;O@D>KR&R261Kw6 z{v~BH{&3+^2IIlgmJTS_d!FOTmq{^|BnPN#47~tiTlE97r$*c$O+ZKqd)29XNp5u;* zvE@>$uJMQ+aP-B8`%ArIw#yveK8?|)L0wFS3z9m&%U#|NXFNG=%Uq(aImcXL#qU)3 zJ72Mq96KG?r;yO#tSl>iPQsOMl35KJbu>KVNJ$;Td_i?&t7 z*m5cBijj7CNkWB3)GPL)%yz)=S-UD%AEQ?2`2K2c2>yVMU26DKpyZ0uYqGdZE$8}Hn^`3yfIKbcf z{FUNm7tlCc`NhE^139#m?F=f{IRQP!U_@Pr(M7;&ed#pp} zdv8uQRjmXhj62et9s}32o`MbVZ-*pYc=v_H4iLP~*clv1iJKWz?W((Tt>r!S`n&g} zShAimr2rN@UJ}3$C4iGv>U_p_1;Y(8;}fiyt2xV8NeP0{F2wQ$JQ3watBS zpF}QkZ5?F-TJyD}IWq>YD*=)c0Q}8UFK?WG$98~@leGgFOi4&50Cy?tsk~1vcx_YK zr^?5X1gw?M9RN5Y2_*si@bh%)y}`47zw&wfwMxAwzb_^DmOKH#pYt8S$^)P80t`B~ z@?*;TS}xsh5&+GW&mC~{m;GK@;C`#QOnA|{d^JiieGntoulv64(LJPsZ4_RZ%M1| zQWCTSZk#++;PFj60ARq`0ZPD>Nn6VMT0T`%li;wu9RM)!XR9_PfI@?wqUa$)PPDEv zc=s`R5;UG`Dm>6PP8@2(Q&@GLvjdNhy$t-Hj#i!E)7ModL31D={kp?@0IM`o(6_Nlv=jeRXqW3Z&7^ziHpjD*%HJ1dSR$6M+Jpo$z>%%+TC_IHudV+%Z zk^yZQOiLNO`&9XT6053}o#Knv{=ovz+dDof0hC!14i|XN(Q)kr4|0`{uqod$d5v+F zLArd^QLa2X{pNGi;Z;f!Dm+KYe93?|fVFef)z}UIY^nq<_-$GFEWiq0&hvIAP|&L;189jl z_e+5FR@~*Ud9C=i!>f=4zG)$NPFHc-6K+*GJZizZa?1;P$KX{MSnzz=fU`9oIn$0> za6JL)?<6iDTPyG2C|~b83a`S7179@2lLVf+A|_vDNBFx*CcxDK_Z63R99~6%cmgl{(n^%~yp6(-f{1Fom8NXJf+?+hUEUIP3+1i0kzi0d_+ z2U8Rzzyjy#3#TtQpTy+qJ0?ECv9elmUwOIu)-WD?Q9urjcm}7ZF-T|fenMMLYNWc- zu3Yhl3OtJfL?i-eK9v<8Ru6Di5pW#n;sYqI)pmFvvrhA96b~F})dk*L^}MeR_vn`d g>#26%g|cVQ|3CMbugxj)hX4Qo07*qoM6N<$f@^swPXGV_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/tempgauge29.png b/src/main/resources/assets/hem/textures/screens/tempgauge29.png new file mode 100644 index 0000000000000000000000000000000000000000..5e03436538b550606aa752019c5e48299d9ca0f3 GIT binary patch literal 2226 zcmV;j2u=5iP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2uDdoK~#8N)tbqY zR7Dttc@l%bjiGxthARgUl))ibJI?|#4}t?AAdcbEXK?4rg>S$M7(Rh3pP;>8R-UTU zhs?USiXI>%PM^-ac{Bg-&#bPlytQX1%OAg;+L)r+{n0N8_REzw=K2|3PQ6}4-(RmD zpWj!9do+rIMh-j$9Q`C+TFA$&(>#1-88li4e6wEL_;HYSMxA!|%PQdNJEj(R(Zz+- zw}!Dhg#cR62yg`{-TU+RqW}K=d+rCGd3IAB(bxY5ICzSFHJqI*3aka~-~vu)hgAZW zN#i;A4^`iMc5r^ZhPS-3Gd*D zAX6^sWzO6{&vkyLEl+~r z9X#PPI6*j+^z;)?&DE;seLh~!Lkwm02k@^x!H*T+vLrB23*6zQ46X%(11jfwdXAHx zA{PEO0FUlgJ#Z2VynzeeC(qy#7Eb{xsqU`(G+t|-mXid)zZ`bJ-E)I~d|>?~+z&td zmz2r)!-Y#3j0aC!I-p$dd5$MvCdE{eFu-3M;PJcXj;@!4MFJN8t||dOp@M6{_5`Su z^@L8Byq#E7C&n54(c<3?PEsn?v@(NVfG4~(B?;NCy1VX|uOi=#x}R79pX=-jNpN_5 zK%p&z#F4|vd&+){qdLm*-KDX9I3nh&9}PQTfR|570yp|6vmU%}TOhJdpBAipjyopC zmP@U=#v^vX(H9@?FZGJqE^~PMG)9{Sbuk$(Nb3A9cX>aY@#M5EbBVg<9CL{kzf)zf{j_aQC>!>8*^x=)m@4r}lQxZx725`v}(1MnF*X2wsr!9j* z37!2~K2?4nOoG2OIQ5FZJOOA7ZVWQ(uCY}|Ij(!kue(_BTNNH}?tpT-QWMaEma?4* zMdB_V;wr* zdvmg>Y9%0H+>z$=7`UGG6l{QhJ0#)4yDuzufZ%n;&fq{w+{~bASKXa!E$^w<-@PZr zlJ$%!1+d`pk^p`v0i3K-=QFk|CuvQ(t~3X~GhWYKKDR_a{Pwme5`mxfeZSI5n zByx#s>nIb@ny)3znK5`>36PWk;BTIKdE@*$wgYsWtR28$N8|<;atuwx0Zc7ofTFxdU#VoWai%KmocuO)2N-vnMJ!_*N<*YoDCp{0bs zG58#wLIv=$6Y4qo)Jc2l-S3_n+Xbz0q~6NoB!ERNEC2TMMbs;P-2rxvzFj+@2Z2kO zgjWBSwAwBuK|A2a$wLJm-?Re&2AmzB1WcKz%q1?|3yd>80`p9@Do zdS8e41YEE1XW!~1fJVWWbM!$|{uX3V9vngUd`$FnFzPvnV7czD_JqgJ^b$bf0^oeZ z0;kSIEfIvIy1O6}Y!z|8CqZNLJCHq>NC1n-ssoOwSKRvx7t89OsY$305tuZkV6u)Y z_?AzV-v=0CY^}7^+X3^}{s66&zkcFifAv*J0`Q!p^G%E1%Ya~{Ry~1Mk?z-A4h);T>)ioTa+Qy;Dc>=9jd5CVxyowudagV={pNGi;Z;f!Dm+KYe93?|fp>!cCVcubc>?IK9UuYJOG3*5cX+KlzBatdJP89l->}eWs{c(`Rbx8#26%fwE`M|5WFW5=qeitN;K207*qoM6N<$g6Y>Y A+W-In literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/tempgauge3.png b/src/main/resources/assets/hem/textures/screens/tempgauge3.png new file mode 100644 index 0000000000000000000000000000000000000000..efb6b42279a2f8fe6bf26923734b9a252c8fe698 GIT binary patch literal 2228 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 D^^7m# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/tempgauge31.png b/src/main/resources/assets/hem/textures/screens/tempgauge31.png new file mode 100644 index 0000000000000000000000000000000000000000..4f7168d7b6b14565619cb8729c757754419d067c GIT binary patch literal 2232 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/tempgauge7.png b/src/main/resources/assets/hem/textures/screens/tempgauge7.png new file mode 100644 index 0000000000000000000000000000000000000000..71c28e6fbb07bf5b3c89c522ddb0f589eb39d6a4 GIT binary patch literal 2204 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/screens/transparentgreen.png b/src/main/resources/assets/hem/textures/screens/transparentgreen.png new file mode 100644 index 0000000000000000000000000000000000000000..48106937f5a29a4e24f92f02a9f4b90f7fd2ceba GIT binary patch literal 70 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}1TpU9x;*wXaDvn@hV42GJoHMLo Q5m17`)78&qol`;+0IE<9-v9sr literal 0 HcmV?d00001 diff --git a/src/main/resources/data/forge/tags/blocks/solid_block.json b/src/main/resources/data/forge/tags/blocks/solid_block.json new file mode 100644 index 0000000..24ef3ac --- /dev/null +++ b/src/main/resources/data/forge/tags/blocks/solid_block.json @@ -0,0 +1,383 @@ +{ + "replace": false, + "values": [ + "minecraft:polished_blackstone_bricks", + "minecraft:lime_terracotta", + "minecraft:infested_mossy_stone_bricks", + "hem:blueleaf_wood", + "minecraft:pink_glazed_terracotta", + "minecraft:white_shulker_box", + "minecraft:prismarine", + "minecraft:gold_ore", + "minecraft:diamond_block", + "minecraft:smooth_quartz_stairs", + "minecraft:snow", + "minecraft:polished_andesite_stairs", + "minecraft:gray_concrete_powder", + "minecraft:blue_concrete_powder", + "minecraft:chiseled_polished_blackstone", + "minecraft:redstone_ore", + "minecraft:nether_brick_stairs", + "minecraft:black_shulker_box", + "minecraft:light_gray_shulker_box", + "minecraft:cobblestone", + "minecraft:frosted_ice", + "hem:blueleaf_stone", + "minecraft:dirt", + "minecraft:warped_hyphae", + "minecraft:blue_glazed_terracotta", + "minecraft:acacia_planks", + "minecraft:chiseled_red_sandstone", + "minecraft:jack_o_lantern", + "minecraft:infested_cracked_stone_bricks", + "minecraft:dead_brain_coral_block", + "minecraft:cyan_glazed_terracotta", + "minecraft:diorite_stairs", + "minecraft:red_wool", + "minecraft:barrel", + "minecraft:stone_bricks", + "minecraft:crimson_planks", + "minecraft:shroomlight", + "minecraft:granite_slab", + "minecraft:polished_blackstone", + "minecraft:red_terracotta", + "minecraft:dried_kelp_block", + "minecraft:slime_block", + "minecraft:bricks", + "minecraft:emerald_block", + "minecraft:purple_glazed_terracotta", + "hem:blueleaf_cobblestone", + "minecraft:red_mushroom_block", + "minecraft:sandstone_stairs", + "minecraft:andesite_wall", + "minecraft:quartz_stairs", + "minecraft:smoker", + "hem:blueleaf_redwood_log", + "minecraft:blackstone", + "minecraft:magenta_shulker_box", + "minecraft:red_glazed_terracotta", + "minecraft:prismarine_wall", + "minecraft:spruce_planks", + "minecraft:gray_shulker_box", + "minecraft:birch_leaves", + "minecraft:polished_blackstone_brick_wall", + "minecraft:purpur_slab", + "minecraft:granite_stairs", + "minecraft:smooth_quartz", + "minecraft:mushroom_stem", + "minecraft:andesite_stairs", + "minecraft:ice", + "minecraft:pink_terracotta", + "minecraft:blackstone_stairs", + "minecraft:cobblestone_stairs", + "minecraft:pink_shulker_box", + "minecraft:granite_wall", + "minecraft:red_sandstone_stairs", + "minecraft:magenta_glazed_terracotta", + "minecraft:magenta_concrete_powder", + "hem:blueleaf_stone_gravel", + "hem:blueleaf_dirt_block", + "minecraft:oak_stairs", + "minecraft:soul_soil", + "minecraft:cyan_shulker_box", + "minecraft:cut_red_sandstone", + "minecraft:nether_bricks", + "minecraft:soul_sand", + "minecraft:purple_wool", + "minecraft:chiseled_nether_bricks", + "minecraft:warped_nylium", + "minecraft:dark_prismarine", + "hem:blueleaf_grass_block", + "minecraft:oak_wood", + "minecraft:dark_oak_stairs", + "minecraft:jungle_stairs", + "minecraft:yellow_wool", + "minecraft:red_nether_bricks", + "minecraft:blue_wool", + "minecraft:polished_blackstone_brick_stairs", + "minecraft:gravel", + "minecraft:carved_pumpkin", + "minecraft:end_stone_bricks", + "minecraft:sea_lantern", + "minecraft:acacia_wood", + "minecraft:brown_concrete", + "minecraft:chain_command_block", + "minecraft:light_blue_glazed_terracotta", + "hem:blueleaf_lush_leaves", + "minecraft:jungle_wood", + "minecraft:red_sandstone_wall", + "minecraft:obsidian", + "minecraft:granite", + "minecraft:grass_block", + "minecraft:brain_coral_block", + "minecraft:end_stone_brick_stairs", + "minecraft:yellow_glazed_terracotta", + "minecraft:white_wool", + "minecraft:gray_concrete", + "minecraft:dead_horn_coral_block", + "minecraft:brown_terracotta", + "minecraft:horn_coral_block", + "minecraft:diorite_wall", + "minecraft:red_concrete_powder", + "minecraft:honeycomb_block", + "minecraft:spruce_log", + "minecraft:basalt", + "minecraft:blackstone_wall", + "minecraft:acacia_leaves", + "minecraft:mycelium", + "minecraft:lodestone", + "minecraft:coal_ore", + "minecraft:coal_block", + "minecraft:tnt", + "minecraft:light_gray_concrete", + "minecraft:light_blue_shulker_box", + "minecraft:crimson_stem", + "minecraft:crafting_table", + "minecraft:brown_glazed_terracotta", + "minecraft:orange_concrete_powder", + "minecraft:lime_glazed_terracotta", + "minecraft:light_gray_concrete_powder", + "minecraft:yellow_concrete", + "minecraft:netherrack", + "minecraft:smooth_red_sandstone_stairs", + "minecraft:green_wool", + "minecraft:acacia_stairs", + "minecraft:hopper", + "minecraft:red_nether_brick_stairs", + "minecraft:sponge", + "minecraft:infested_stone", + "minecraft:magma_block", + "minecraft:cyan_terracotta", + "minecraft:prismarine_brick_stairs", + "minecraft:respawn_anchor", + "minecraft:purpur_block", + "minecraft:nether_wart_block", + "minecraft:blue_ice", + "minecraft:stripped_jungle_log", + "minecraft:stripped_spruce_wood", + "minecraft:warped_stairs", + "minecraft:magenta_wool", + "minecraft:spruce_wood", + "minecraft:prismarine_stairs", + "minecraft:quartz_block", + "minecraft:purple_terracotta", + "minecraft:gray_wool", + "hem:blueleaf_stone_stair", + "hem:blueleaf_log", + "minecraft:light_blue_concrete_powder", + "minecraft:lapis_block", + "minecraft:polished_blackstone_wall", + "minecraft:stone_brick_wall", + "minecraft:orange_glazed_terracotta", + "minecraft:infested_cobblestone", + "minecraft:pink_wool", + "minecraft:oak_leaves", + "minecraft:stone_stairs", + "minecraft:sticky_piston", + "minecraft:purple_concrete_powder", + "minecraft:green_shulker_box", + "minecraft:brick_wall", + "minecraft:green_glazed_terracotta", + "minecraft:birch_log", + "minecraft:observer", + "minecraft:stripped_birch_log", + "minecraft:mossy_stone_brick_stairs", + "minecraft:pink_concrete_powder", + "minecraft:white_terracotta", + "minecraft:jungle_leaves", + "minecraft:wet_sponge", + "minecraft:white_concrete_powder", + "minecraft:crying_obsidian", + "minecraft:smooth_red_sandstone", + "minecraft:black_concrete", + "minecraft:dropper", + "minecraft:cyan_concrete_powder", + "minecraft:diorite", + "minecraft:stripped_dark_oak_log", + "minecraft:lime_concrete", + "minecraft:bone_block", + "minecraft:stripped_warped_hyphae", + "minecraft:diorite_slab", + "minecraft:chiseled_sandstone", + "minecraft:cactus", + "minecraft:stripped_jungle_wood", + "minecraft:dark_oak_log", + "minecraft:green_concrete", + "minecraft:purple_shulker_box", + "minecraft:mossy_stone_brick_wall", + "minecraft:orange_concrete", + "minecraft:light_gray_terracotta", + "minecraft:jungle_log", + "minecraft:red_concrete", + "minecraft:dark_oak_leaves", + "minecraft:sand", + "hem:blueleaf_redwood_leaves", + "minecraft:stripped_acacia_wood", + "minecraft:note_block", + "minecraft:purple_concrete", + "minecraft:birch_stairs", + "minecraft:gray_glazed_terracotta", + "minecraft:purpur_pillar", + "minecraft:ender_chest", + "minecraft:packed_ice", + "minecraft:andesite", + "minecraft:bedrock", + "minecraft:hay_block", + "minecraft:magenta_concrete", + "minecraft:nether_brick_wall", + "minecraft:pumpkin", + "minecraft:orange_wool", + "minecraft:iron_block", + "minecraft:crimson_hyphae", + "hem:blueleaf_fluorescent_leaves", + "minecraft:terracotta", + "minecraft:loom", + "minecraft:oak_log", + "hem:blueleaf_cobblestone_stairs", + "minecraft:redstone_block", + "minecraft:end_stone", + "minecraft:polished_diorite", + "minecraft:stripped_oak_log", + "minecraft:yellow_terracotta", + "minecraft:stripped_spruce_log", + "minecraft:spruce_leaves", + "minecraft:piston_head", + "minecraft:green_concrete_powder", + "minecraft:magenta_terracotta", + "minecraft:orange_shulker_box", + "minecraft:smooth_sandstone_stairs", + "minecraft:polished_granite", + "minecraft:honey_block", + "minecraft:beehive", + "minecraft:coarse_dirt", + "minecraft:cake", + "minecraft:gold_block", + "minecraft:mossy_cobblestone", + "minecraft:cracked_stone_bricks", + "minecraft:lime_concrete_powder", + "minecraft:diamond_ore", + "minecraft:sandstone_wall", + "minecraft:yellow_shulker_box", + "minecraft:birch_planks", + "minecraft:chiseled_stone_bricks", + "minecraft:polished_blackstone_stairs", + "minecraft:infested_chiseled_stone_bricks", + "minecraft:cyan_wool", + "minecraft:black_terracotta", + "minecraft:stripped_warped_stem", + "minecraft:cartography_table", + "minecraft:warped_stem", + "minecraft:quartz_bricks", + "minecraft:bubble_coral_block", + "minecraft:cyan_concrete", + "minecraft:warped_planks", + "minecraft:green_terracotta", + "minecraft:brick_stairs", + "minecraft:mossy_stone_bricks", + "minecraft:stripped_crimson_hyphae", + "minecraft:netherite_block", + "hem:blueleaf_cobblestone_wall", + "minecraft:crimson_nylium", + "minecraft:cracked_nether_bricks", + "minecraft:bookshelf", + "minecraft:brown_concrete_powder", + "minecraft:grass_path", + "minecraft:beacon", + "minecraft:red_shulker_box", + "minecraft:clay", + "hem:blueleaf_dirt_grass_block", + "minecraft:gray_terracotta", + "minecraft:brown_wool", + "minecraft:polished_basalt", + "hem:blueleaf_stone_wall", + "minecraft:dark_oak_wood", + "minecraft:emerald_ore", + "minecraft:fire_coral_block", + "minecraft:blast_furnace", + "minecraft:brown_shulker_box", + "minecraft:furnace", + "minecraft:dead_tube_coral_block", + "minecraft:sandstone", + "minecraft:lime_wool", + "minecraft:white_glazed_terracotta", + "minecraft:tube_coral_block", + "minecraft:repeating_command_block", + "minecraft:smooth_sandstone", + "minecraft:fletching_table", + "minecraft:ancient_debris", + "minecraft:stripped_birch_wood", + "minecraft:blue_shulker_box", + "minecraft:dead_bubble_coral_block", + "minecraft:dark_prismarine_stairs", + "hem:blueleaf_cobblestone_slab", + "minecraft:light_gray_wool", + "minecraft:nether_quartz_ore", + "minecraft:target", + "minecraft:lime_shulker_box", + "minecraft:stone", + "minecraft:red_sandstone", + "minecraft:stripped_dark_oak_wood", + "minecraft:shulker_box", + "minecraft:glowstone", + "minecraft:black_wool", + "minecraft:smooth_stone", + "minecraft:stripped_crimson_stem", + "minecraft:warped_wart_block", + "minecraft:farmland", + "minecraft:light_blue_wool", + "minecraft:melon", + "minecraft:quartz_pillar", + "minecraft:chiseled_quartz_block", + "minecraft:stone_brick_stairs", + "minecraft:black_concrete_powder", + "minecraft:acacia_log", + "minecraft:trapped_chest", + "minecraft:birch_wood", + "minecraft:white_concrete", + "minecraft:dead_fire_coral_block", + "minecraft:smithing_table", + "minecraft:orange_terracotta", + "minecraft:red_sand", + "minecraft:blue_terracotta", + "minecraft:infested_stone_bricks", + "minecraft:mossy_cobblestone_stairs", + "minecraft:jungle_planks", + "minecraft:lapis_ore", + "minecraft:stripped_oak_wood", + "minecraft:polished_granite_slab", + "minecraft:polished_granite_stairs", + "minecraft:iron_ore", + "minecraft:snow_block", + "minecraft:crimson_stairs", + "minecraft:piston", + "minecraft:light_blue_concrete", + "minecraft:light_blue_terracotta", + "minecraft:gilded_blackstone", + "minecraft:cut_sandstone", + "minecraft:cracked_polished_blackstone_bricks", + "minecraft:black_glazed_terracotta", + "minecraft:podzol", + "minecraft:stripped_acacia_log", + "minecraft:yellow_concrete_powder", + "minecraft:dispenser", + "minecraft:prismarine_bricks", + "minecraft:spruce_stairs", + "minecraft:command_block", + "minecraft:bee_nest", + "minecraft:light_gray_glazed_terracotta", + "minecraft:red_nether_brick_wall", + "minecraft:pink_concrete", + "minecraft:chest", + "minecraft:polished_diorite_stairs", + "minecraft:brown_mushroom_block", + "minecraft:redstone_lamp", + "minecraft:nether_gold_ore", + "minecraft:jukebox", + "minecraft:dark_oak_planks", + "minecraft:oak_planks", + "hem:blueleaf_stone_slab", + "minecraft:purpur_stairs", + "minecraft:blue_concrete", + "minecraft:polished_andesite" + ] +} \ No newline at end of file diff --git a/src/main/resources/data/forge/tags/entity_types/vehicle_driver_seat.json b/src/main/resources/data/forge/tags/entity_types/vehicle_driver_seat.json new file mode 100644 index 0000000..828ff6c --- /dev/null +++ b/src/main/resources/data/forge/tags/entity_types/vehicle_driver_seat.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "hem:airboat", + "hem:hot_air_balloon" + ] +} \ No newline at end of file diff --git a/src/main/resources/data/forge/tags/items/hem_fossilfuel.json b/src/main/resources/data/forge/tags/items/hem_fossilfuel.json new file mode 100644 index 0000000..b1090ce --- /dev/null +++ b/src/main/resources/data/forge/tags/items/hem_fossilfuel.json @@ -0,0 +1,41 @@ +{ + "replace": false, + "values": [ + "minecraft:stripped_jungle_log", + "minecraft:acacia_wood", + "minecraft:oak_log", + "minecraft:stripped_dark_oak_log", + "minecraft:spruce_wood", + "minecraft:stripped_oak_log", + "minecraft:stripped_spruce_log", + "minecraft:jungle_wood", + "minecraft:dark_oak_wood", + "minecraft:spruce_planks", + "minecraft:dark_oak_log", + "minecraft:jungle_planks", + "minecraft:jungle_log", + "minecraft:coal", + "minecraft:spruce_log", + "minecraft:birch_planks", + "minecraft:warped_hyphae", + "minecraft:stripped_warped_stem", + "minecraft:stripped_acacia_log", + "minecraft:charcoal", + "minecraft:acacia_planks", + "minecraft:warped_stem", + "minecraft:coal_block", + "minecraft:warped_planks", + "minecraft:crimson_stem", + "minecraft:birch_log", + "minecraft:crimson_planks", + "minecraft:oak_wood", + "minecraft:stripped_birch_log", + "minecraft:stripped_crimson_stem", + "minecraft:dark_oak_planks", + "minecraft:oak_planks", + "minecraft:crimson_hyphae", + "minecraft:lava_bucket", + "minecraft:acacia_log", + "minecraft:birch_wood" + ] +} \ No newline at end of file diff --git a/src/main/resources/data/hem/dimension/blueleaf.json b/src/main/resources/data/hem/dimension/blueleaf.json new file mode 100644 index 0000000..5bb7047 --- /dev/null +++ b/src/main/resources/data/hem/dimension/blueleaf.json @@ -0,0 +1,229 @@ +{ + "type": "hem:blueleaf", + "generator": { + "type": "minecraft:noise", + "seed": 4410637259638643003, + "biome_source": { + "type": "minecraft:multi_noise", + "seed": 4410637259638643003, + "temperature_noise": { + "firstOctave": -5.95, + "amplitudes": [ + 2, + 2 + ] + }, + "humidity_noise": { + "firstOctave": -5.95, + "amplitudes": [ + 2, + 2 + ] + }, + "altitude_noise": { + "firstOctave": -5.95, + "amplitudes": [ + 2, + 2 + ] + }, + "weirdness_noise": { + "firstOctave": -5.95, + "amplitudes": [ + 2, + 2 + ] + }, + "biomes": [ + { + "biome": "hem:blueleaf_plains", + "parameters": { + "temperature": 1, + "humidity": -1, + "altitude": 0.75, + "weirdness": -1.5, + "offset": 0 + } + }, + { + "biome": "hem:blueleaf_hayfever_fields", + "parameters": { + "temperature": 0.5, + "humidity": -0.5, + "altitude": -0.75, + "weirdness": 1.5, + "offset": 0 + } + }, + { + "biome": "hem:heightend_blueleaf_plains", + "parameters": { + "temperature": 0, + "humidity": 0, + "altitude": 0.75, + "weirdness": -1.5, + "offset": 0 + } + }, + { + "biome": "hem:lush_blueleaf_plains", + "parameters": { + "temperature": -0.5, + "humidity": 0.5, + "altitude": -0.75, + "weirdness": 1.5, + "offset": 0 + } + }, + { + "biome": "hem:lush_blueleaf_marsh", + "parameters": { + "temperature": -1, + "humidity": 1, + "altitude": 0.75, + "weirdness": -1.5, + "offset": 0 + } + } + ] + }, + "settings": { + "name": "hem:blueleaf", + "bedrock_roof_position": -10, + "bedrock_floor_position": 0, + "sea_level": 63, + "disable_mob_generation": false, + "default_block": { + "Name": "hem:blueleaf_stone" + }, + "default_fluid": { + "Name": "minecraft:water", + "Properties": { + "level": "0" + } + }, + "noise": { + "min_y": 0, + "height": 256, + "density_factor": 1, + "density_offset": -0.46875, + "size_horizontal": 1, + "size_vertical": 2, + "simplex_surface_noise": true, + "random_density_offset": true, + "island_noise_override": false, + "amplified": false, + "sampling": { + "xz_scale": 1, + "y_scale": 1, + "xz_factor": 80, + "y_factor": 160 + }, + "bottom_slide": { + "target": -30, + "size": 0, + "offset": 0 + }, + "top_slide": { + "target": -10, + "size": 3, + "offset": 0 + } + }, + "structures": { + "structures": { + "minecraft:bastion_remnant": { + "spacing": 27, + "separation": 4, + "salt": 30084232 + }, + "minecraft:buried_treasure": { + "spacing": 1, + "separation": 0, + "salt": 0 + }, + "minecraft:desert_pyramid": { + "spacing": 32, + "separation": 8, + "salt": 14357617 + }, + "minecraft:endcity": { + "spacing": 20, + "separation": 11, + "salt": 10387313 + }, + "minecraft:fortress": { + "spacing": 27, + "separation": 4, + "salt": 30084232 + }, + "minecraft:igloo": { + "spacing": 32, + "separation": 8, + "salt": 14357618 + }, + "minecraft:jungle_pyramid": { + "spacing": 32, + "separation": 8, + "salt": 14357619 + }, + "minecraft:mansion": { + "spacing": 80, + "separation": 20, + "salt": 10387319 + }, + "minecraft:mineshaft": { + "spacing": 1, + "separation": 0, + "salt": 0 + }, + "minecraft:monument": { + "spacing": 32, + "separation": 5, + "salt": 10387313 + }, + "minecraft:nether_fossil": { + "spacing": 2, + "separation": 1, + "salt": 14357921 + }, + "minecraft:ocean_ruin": { + "spacing": 20, + "separation": 8, + "salt": 14357621 + }, + "minecraft:pillager_outpost": { + "spacing": 32, + "separation": 8, + "salt": 165745296 + }, + "minecraft:ruined_portal": { + "spacing": 40, + "separation": 15, + "salt": 34222645 + }, + "minecraft:shipwreck": { + "spacing": 24, + "separation": 4, + "salt": 165745295 + }, + "minecraft:stronghold": { + "spacing": 1, + "separation": 0, + "salt": 0 + }, + "minecraft:swamp_hut": { + "spacing": 32, + "separation": 8, + "salt": 14357620 + }, + "minecraft:village": { + "spacing": 32, + "separation": 8, + "salt": 10387312 + } + } + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/hem/dimension_type/blueleaf.json b/src/main/resources/data/hem/dimension_type/blueleaf.json new file mode 100644 index 0000000..54aac52 --- /dev/null +++ b/src/main/resources/data/hem/dimension_type/blueleaf.json @@ -0,0 +1,17 @@ +{ + "ultrawarm": false, + "natural": true, + "piglin_safe": false, + "respawn_anchor_works": true, + "bed_works": true, + "has_raids": true, + "has_skylight": true, + "has_ceiling": false, + "coordinate_scale": 1, + "ambient_light": 0, + "logical_height": 256, + "infiniburn": "minecraft:infiniburn_overworld", + "min_y": 0, + "height": 256, + "effects": "hem:blueleaf" +} \ No newline at end of file diff --git a/src/main/resources/data/hem/recipes/craft_blue_cobble.json b/src/main/resources/data/hem/recipes/craft_blue_cobble.json new file mode 100644 index 0000000..26c44d8 --- /dev/null +++ b/src/main/resources/data/hem/recipes/craft_blue_cobble.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "hem:blueleaf_stone_gravel" + }, + { + "item": "hem:blueleaf_stone_gravel" + }, + { + "item": "hem:blueleaf_stone_gravel" + }, + { + "item": "hem:blueleaf_stone_gravel" + } + ], + "result": { + "item": "hem:blueleaf_cobblestone", + "count": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/data/hem/recipes/smelt_blue_cobble.json b/src/main/resources/data/hem/recipes/smelt_blue_cobble.json new file mode 100644 index 0000000..36f0841 --- /dev/null +++ b/src/main/resources/data/hem/recipes/smelt_blue_cobble.json @@ -0,0 +1,12 @@ +{ + "group": "hals_exploration_mod", + "type": "minecraft:smelting", + "experience": 1, + "cookingtime": 60, + "ingredient": { + "item": "hem:blueleaf_cobblestone" + }, + "result": { + "item": "hem:blueleaf_stone" + } +} \ No newline at end of file diff --git a/src/main/resources/data/hem/structures/11x11floatingislandundertree.nbt b/src/main/resources/data/hem/structures/11x11floatingislandundertree.nbt new file mode 100644 index 0000000000000000000000000000000000000000..ff9a3894c76e0a1595314e473f82dbbcfc727d2c GIT binary patch literal 6151 zcmai24Or6W+VAtYKIV4D&cvm7R#&>srjeFuA+`66-ghmXwfPlF;nK>|jL<}Z<;wDv zbZsj?!R>JMs%HlCH0L+214buB#x$`MSvkQpr9vb`;Ju%}+Ol<4SC`!Up8L6<`?%v+8GNaVSlt`{FKc zkK+f=9VJJznL*KuCOF+!uB6)+o#;Hsq#hpYpR!D_YNAP*Wb3#s_q2l$ak@9noIIxO z>%T;huo^dVH^Ye* zt&FFWN^(rHp`M@Et-Q=p&k2d41=l_#q312stv$zRe^V-zvGQ=WIHCO1*oc1$Eh2v` zp-{!@#?@XH)bW-2$|aQit(WwZ%esZ~%5FE~F-3$6o)l7}8D74<%agRjNm%WoG#q<3<3RMGaa-xW4z1jUscgixw~r3F)kymT;BM>_ zu6(}$I6S1vi=w{}MNzMaHrm_S{7qhK42ea1c|pYwb5sK{8RQSD^vDTCCMumGHy*f? z8eFzJWwRk=Q;Bb#ySuWjH>#nBzxRT^K_g?g4sE24+4@o{O!vIHFOx3|w$};=j@0W0 zN8LP=60FzGQf2r4WRVT^{j-VB2q~z&+=OmKC{!`u<%zf#EO11IoO803e?>lJ*0GtYwN9- zwfA)-{dkB_G_oZAdx1j6+Cck`z|TODS6mBwL#om<;uYKD1F8iY87mds#Jui^DG=##CUye1kQ&}`J?~c&tnKCb36;r<^I8c#mPTf zg^i=nW6(U0!S*}`>GK!{p2yJnJO+<-*|~Vd7SS&&DSn?1YUjt${TJ3}A?O0P@mP*( z`L9cTM4nXH{y(jBAr_yw_8u?(uSfqZbUiZ-jVyT zQ7!+Q51cRy8DAW96I!y5=BYCOD^R{)@=a-+zxKlpVsSDYq+0<8S+e0E$r~<>=%C-B z7{uKk`~>4H*Y!Zk1*d<( z=Lm#LGnT-msqaoh{R{Bo=!i3o)6_sHs;;Ho6=yD zT@<&TVvF$!x20u;aUqBCCUaulnWxEb!HdHNP|EHzm#7vTnFX(}rD&+GS1U@qrAoPd zkuXUVSCwqqH`&BNfdTee_R)%#*8;nN7+#IUeLdDC z`RjOLr$5dn4u1!Ca}NiZWw2)21^ROSQ5x43dY-|Xtjq)GeYjO@WwVFp1hcRwf;ahf zUKyTA0#H;w;6;fEwa6+)-g*qd?M=sctrhaOq=Q z0W6byZ#$3G_mKUCFSaNQR{MhcNg+P;u7R)i@+J#FKgZ7Ok(}jmT`f-l#9`X?`>d59 z+;?<@MW?B8)&@b3I-X7|$ziuv>^@*14u{{$;5D3|APAE#GLm^g=N{e+xtADFE!M~+ z^scn=zE_1lLiVWFL`_+bnnR}%hh1((@I=)$VyR5xjDtR0Wx2mNG2Hj_&S1t?^%O`G zS!%=su=^NE+-#0|r9q(Xj{_Q}1ho--qBaI8CQ zzP%E@?5;bbGEKdP6%1hY0a?B-#0FhN$20x}6B`5(bN=Yii3)LZvM1atk;50#yOwrVh>dl%e78>+?$wdF%@u!A|82;+uLCYiulZ*i{_ zGcSqQ?%>i#S=ODtKM_+)BaJC^1&E1e@a&%3^Tl}60tlw&EgAVLQxl91(|@L%;RF`v zbS9|ZGBw5D4wo$`tAt``ntJHR^8vlJS6XkJ%!PZmy$6efD=Fg3U%*!*`f3@ZlaMv0 zAj}gvko|@QkY5d-9nA|%gTx$0S#D7L9fHUgE;o4!F4uxC=Zrl1*@T4OgMAW&>cqQL z7oqdtAv%1&x}AjLVc9;skOQS@e3LVTotplZG}tdJh60h@2Fcm{+IH8gLrfGJlX(-I z!bk>>^<_sKad-zHtS=`xr9J8t6bs=js;pu+3TSVLac%w3qnxm9yFj=7C{YgQLvE-h zz`gE=Em1`Uc;@$m`ixk5m+C@UTRL#|O0nBB{p-(!ZTm78|0EF^3Ryo3sxl5;e~-s1 zh12B!eou`XP63+`yj+N^(B+_ia0MLXblw=h5>jw00Lquczz{s}Ek6u=>-TmUzS(dQ zhDjy`R%0uH-5YY2brEbS{-}dEX>|wvJ1W4Iu27DGgjl%mrPEI5V2($*93&*bjd>8k z%{#$P5pPTJw!?XZO+=Ow33dKfet;KLMJ+pjILP5r-P|^Ap zB7^{~l4PC-^{d_q?y5WwD^#$=(*$OTr$LNOFmQtbF++-gLV$>vNFYugr= z5T8`v69Pxg&}YJE;b5jVFcUip%;f7`hPM&IXDFzYB#L3{H;}jdXqbdyAm>NRDZHSX zyt5z)uH63)=&n1OQVJzE3Dsd8c;!i=998M3L4;JZj%`4^9Eg3UaTQpj!~;TIGxY-6 zu&u7H_&c+3S&%(X5{HmW9)oG#5G0uTmmmxp&okOPOU*9RkQOa6 z8IT-FBFGlS`MvF(#;dm%2-W}XjrFXiGKgkd4CJ**31%xh|Ml`XfA0^oPebYT_eL!= z>IAg8aMb4hf<}VH)8_dd`e($5Vr335hGNjS+mfKfU(UiIjw5J}S{ed2iMp}`CIIh^ z(`7@k6!9#8(onSp!Dv=k`YTp7eurX=LsVq;-zoFJV%d{5M+V{s4@aF?*B9~$9$NW2 zUV8EE2MeG-Hyb=BYD#+4W9`Mh#83}f`7#KJ34-6{G*goM3M=YCjV2Ui;m|NOC|!2D z5c-M}PmU=n~alhC?T@WK$3MqS{S83N0vr$KBL%cmzeA8&bZ-{gi_0_Mpe z69cn^Gm@%=tm01wQmH!-1|@)b5Ng4bgbAhK3|Lt1BcSbh(q_{(p@L+CS8q<-6J5x={d=W zPkY|TL1h~af7+6fYBxU?i3<}Ws|kisY+8KAusIE3hMJv9=MJh^W<7iROEh07yo^s> zAb59b%ug!;es- zqd~L`pm@$4bTj(v)h>l$VqO?G0=#Xwe#Gw_jA)IJ0Oj2fB$YMhQ4}oLC-&Z*ek*I> z*Nd)G1tCgiWZ+qtHiO}37JAoS)QzeHPH_T304L={82Mw!q4Mh%_=yK5PH@6Bz#{O% z$f$qps^5qT{0u#pfF~ScmU_eSA~6I~fJt{k5|}HywqnHS&rUD6f-^(?*)1WwRh6Fe3rO91zKUTE<8qu7#9au#y_2+Ph@REBwRVx3Vq&x?hCnJ{sDT& zqsMs6wbs25#PKdrfZ;hWn?*4Qt1!PqF-EMy%t)BCJ*A`7E>-mQTCKgOxej^f@VLQ4 z%dN8=cjzX@zGF?;yv7E4&Duq+QJyh1 zzEN@vAKSuq*c_*YM~=*!qPd^q`a1oXKjJ8{IL_HOR}mK1AT_%&9 z?|%25-#NeYyXW44Q1S=6)xXo~C_$u_wI`P2^3K68kKbOb8f_fdTbmpC@((w*PQHEY z^qWbXeDcXJPn{n%9{%ITm)|@^9t~huw9iFLM(BR!-DCIWOfll+^4_t#%4#K-vpBEp z9$Q%{qUoqDT=S(I!==Mva>GP>nq^AEstbrAmYWFFyy?%K%jF#WQn^M!(*;quCLX(I zE=@S&#BA343xx7~k$U4;eYU87SV+qfPpLGb=LF1^`5dl=Zgl9GY!1s3-qZx-8Jd+A zzUJqVTk)eQMNF=TueNP&T4rXlqKjf$&(>VP1zcx(>UQ_FxO4uop{Ct5yz3f?s?HIG z@bV^Z#fOI}3p7$kuS2DEo9Zl^dM2fD;raka@l?82IvZ8w(4$S)W;?qGz3J64(Si0o zoH;rv_hTt#jJ@2sAY|#fI+O0vX$AU|0mQK_65~Eao)=ze=$pe6e5=8)cq#+@sH7${(}Kg(|_Oy`EWx4eXBeCFw(<>2v3M*40=pn|FM$}@l;C96?SZ&+US z&J-NXKbPl$*Y{V%%d)r=*?n1j?d=wc;%82UYO-u7|Dz+^P{JXW=lA0&r^P8;46;GV zG7c$+YF@lmuuI%tp~>kOC&%XQu1og*RcD;?_vlkEM3R=ZIxzvc6Z;5DE^2`&`5J!IB^NUT_v^MF=k^zE1uyqC3Gp! z1UT{$Q?qI}AKq+*TLSA`syw=+k@IcOq;Oe&^kA>yreesq%AqH-bsAV~#oPBVT1ECf z{YL{_gxyD_MBz;9-kvMJ@##z*-j;CpH$Hc6ns$5`PJ{?;eI{47yOGvD)$ZS)O~BQa z#r7l@lB(Uk9Cq*y_WCA}+lAL1arhK{piTk6VaJys9O z{tvC+OfLE+Eau|s8cXA?qUhUbg}MfBWt1K(5q|MopQ-=EO{shPUS8(P>-3I9h1_I( zR)CwiA9<-*#g~6tf|)m*(W_GQkl`xvj3LI=Yr0`cp7e&3tv6jiU+MI#-54Awvo!+% ze6ZY-H-Xpi7u-lzMp-N`_jm$MBL2#KY5CQN9lZUtA06YbZ8<_woE^hUh+hXN&g@I< zqZO?Fk|v)mWAYk5p?93w*R>ZJA_rpJwLgt+3y%8pqsE;#(p@FQ7u{e9z*-vv$4YRl zr=-REOHVy&WE*a@fzu9WJos9eM+Td*5R6_cMPK#b0|kF z$ow$_JS{#6o+!u@4SCwKvmJNw2^c!J2Zpwzq0KPs;uBFy>sn+mJTDdR-wvc)d;&tY zHbO0U-{ehf^!f&f=z}&dz}~zBT!f!5DuG?e``{Q5v=wS%ZA{yvX%M0(0(L;a8vvMP z*J~(m*dTHKDn&+}w98NtSa#BJ!LFn9g%Hm@uw(-)36w#vG)3u8sLVBnjzsQ2UR?M9 zwhag8$d$MmT^WtHl-27UY-|Gkv_uXZ;4P*0o?mwTpw~B;-GGhl;HkpSxqqKn^^+r; z`wi^a`u9=_NrRuF^_O9NW-P34IuAfm2WsOkD8GQMCC#|- z{MwuK@R)oR=UW{Z$!_94xj22Yl&WC8@B zz0IylX}Bs?Kw?tGIQy@;QJ(=JkYEVnM}lHe9np0FT_T_>sgE?M0hP`$kP!S^_??M@ z&mmz3v=K@e@y&9%?7L(^lPT&cXrPP+xz8|+&n{6W39v48D8hn0=9|$Y=on(cL%>i~ z{2 z8e+4cX%bYcouGIAOKzxB&LpCGbcAP1HKXh|wrmhm_7u*!+FtURt?tqRsFjVY5NILg8U4&Zl7SJUH9UoT4 zog_%=@j+|^T}>vR0>@%FyR8j|I~)i!Kv;YdpsWqJiy*L$Gv2GHYsO*OE_58yE};pR zH=z)Sz>_!~0$%*&Y5HMwoTI27JJd$w{9xJ`3IHAF@{rfz8sP?3=8JCmQ3t_g6FRq^ zhD??1P-u^006*5%84F1{y$wG1fKO|K4@o7z01oW8J!&vKAgPUiE5VVU0k76Z6~y?f zK{Vp;f`P4}t{IqwtWnqEsIdiq!Eogq@2IE`*bu|=SOq?f^K*H+?pHW$LF@<_OA zu|{{pJ@Z!t$nq&T-*p+lI6(?pKUug60<&v5t{I*EP}7IJKWboiw8sm8BEs%yj~4)g zN1bO~_-sS=CPYdtD(vW16if4Qn0qP$^kF~0`M)8^WGiqy+AQk^?vKzOQw}y_QzY3o zb)~ljPqzub%ND#3VF<3U9$i@&8|cz{EYAV)^~*52maH!mwXHCw(VkqF1z%fX{12f|VZq;t9Tj6bXtDPvA^?EkV z7Cght7JRoYc)AVvS!wnIO;e?qnxAW)Hzw7TPsvRyBLXFrn`>E_YtC7$Qr=Qh^Y70o zv_l{Bsm;a-jb3Yu{?Segx0mOQhmmaFgQQY{NBvqhHsD^!bqg~8Mtin6#I3!~07 zlvcS=EjNAxKJEo_uH2M!#V*vK`#kx|ythG5oqxq*x%7Y=Z84h&Vy;o&LL&y4fnTZYV1hg$jZNr3fhULq)Ah zl)6=6Q3lKtO-4$iu-)BN9kxTz%doFRA3YeTQKw|_A(^UW)JJ`Vp;+I{u! z3%Rd9FD>yq7?-}Jd(%kT_X5L|Y^^a%cGWU#v>>uCPu3!=){Z>7{ZMtYZ+OsbyJ)Rw zFv(i3XXgK6jnx)E(pjuo4Yr4;B1e8UZXW$0simjykW?)(6e5(d~)nEN|6IlH*jlFGW$3 zw_B>2%a3pJNr?+MS1Yi+xpA=ankv0jKX+ZJXiusw*|+&L|Y! zTq&%)#%0&QXu&0Rjb%lvK5cfY`M%{$eM@bzskwG=cf8S;>=nnh>P;srukB>lFoKfG zwXrpdlH>u|=5j`g{YjjLb@&K4*v=k4{AF6XI?a<~y*$RWrJzWS!QRX2BhTwnV%JGEDX9&45yl{ z!Muh83C+Ey{#M59jQjM3s+)^gFC}^053I5pwj4>>P%`729Dbk3je=RPSwDKFwoApX z!5c%mj@elNa1DYy?$p8E>J!yP$i!OY-#A-U|#-FV5|EA*baP} z?cX@|hJ!Z^)p#@5-o}>3ih*z$NDPPrqdUPdfv3wjOFpx7hd7p>waVyQ_2CK=IQT&` zo7eD7*Jo^L1=+S5+cw9SSkCo+bg;~N8tzxaebevYz5-4x-@*yrB#s8omL4x(|3cNF z;VF3cL=44WG6J*#EBg)tXeUS<&8!TInu_=`>p=dYwQzioIF^7r=_PT$smq<8m1FD> zUTd?dZFLN5l{K*>WZ+$kEN>tF27JX@uxo-TYa)nITvTql1voM|DXxGM`kU3x-}GEm zh5>Lu68868jNxY$BC@?AhNu*fde-7Y3~54m;c}dfrsXN^lfUcF#HXIWrK^Ump9II= zFZ+!PmaS#X+)0vMOFcfHC~Pb|0`D_!JxkVxG-5%-nHc{3)1Iv4_Q^}up9~@@hdsNN zhF)%CXFP}0Ik6zJ<=C_}I;Qv;Bzl3WG%dkZ^Ljn7@!MnU_c)L$Z}w(3*;<0_mugxt?zQ+68vZhKLOyU=xy+` zu9p);>^6V_r+6EECc+#CuIw>9L*V!k42?K+!{?qO;8`G9p1rlqMpO~a)>BX0n#c$;#>_xPk$+_=BoTDD#LIPsw_L;^F@_Op zZV(_TrJ#53nDT~8(5qa5-sds}rn^dkepmb_xQZt^z^N^_{bdH&n!XE(uoa0*7btEP zAYU2pAYhu%O}KFn#<6)BiAxvCMWMt{0?rlV&Tq(q<#6jJ`2m*CPh$;|+u^dB$jJDGLc8kzhoU3)Le0(l3S6^bS+fIIm5g*4j(0U7hJHnlU)t17 zm52hR*@5h!3Am|ziKcKHc9zA0g}jG^9u^meN}~*EqzW=^!?+10DagjRu=Z78l5VHB z7m1|3cn|KJslimPC(2X>xPd@jQ}(q0LKBqano6V`por21a!uJyJnm=g4k^oEibd|p z7g1Zsgltl4#@tO5NUf1>pXis;M9Bp>L5ba@nR(TTNJ=r?#S>qo6x)3fB;=bp@I!Dp zQKRd)v=Fq-Llkp8u=n1V*c%9L#~Z_fZ6G<8#O#UH9I`ruJa&YCYll^1jK|d zOgwHl9}7xSusNiqv~PMM^pU_kfl)xZW18@AXc(QI-ctx(IJf73vyj4_xVg8hkTik^ z{#5y;Zx}a0-A=KWxoDu#kIz_OZ9e9JBT{-%6j1EH>9m3^dQ49fAv{)(~0 ziy*d7WcG3CjatmxM{4YkXm8BY`E^~RZOKZhCN^E#+WX z#{*qg-=fTo{!yFx7(VYYJF^SwDlg>xM)#d_>hdN z?~plYKPK44Uqj{llW8w>!~T5r;@<-CZsbk){)7$>0QS9rXo8VChyH+3bLJIHpSz1s z+n=y5ADXP1R%Lw)4^=;Yi5QL&T`y$f_m5kfXSiz(5jR43LZNsSpKH<26}pQs*QW>Z zxmWRrhe-GHncn{LunsP>Xr|ht87Vg%)k+EmnMDUL!*cz0fgx-oEZXWUvHap$21)Wv z)lqFV7TCD>A>xrmyY%KPQFK$2LSfU5_L!xSHnUmR(Alp_lFMyF219h$=%eAg*R>Q2Svk6Zuvr#+*SCjA#lfZ>V& literal 0 HcmV?d00001 diff --git a/src/main/resources/data/hem/structures/15x15_4swamptree.nbt b/src/main/resources/data/hem/structures/15x15_4swamptree.nbt new file mode 100644 index 0000000000000000000000000000000000000000..29d6cf5c63c25a375a801639908a65c68539a56e GIT binary patch literal 14859 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

)6lHz408|d$vOddQi?^!3I6wLkt)E zJJZTxLdnBNG5f*juY@9Wr=v%GjA4QKhR(%|HxPi=NqN`{kgWaGnw$&|8yHwo{4RWM zxeesiul7I$&WVd00IY`?~q74o;6=o2C1Td|HHp_k#0yk30hcm7Vp`gB|l4OQ%W;y&?{{U~ut*$3PrS%Wc-Qu#;_jnNW);(C_ zTnTja+W5o*dk*CCvIS40tsJWPu5~7eGIAWzrRecz$Up z@Ia=|#Pr2NNN*u&$%S+lrn6NC`RL?a0ojyQaG#1`e>U7#E`<9M;6B|UIKAyNaHT6u zO<5J$B6hhzp5&7dV3k`13fghPqUGv8Ax;T=@|IIKjZ8}1J8+3bxx)Sz8cF6#1d0C*057@L|CGGk?b(98 zC{4P31Ap|94{nAu+4ZtP04E^3mdGvu(e=8%@w*qe0Jo&%nAw~hRhS(IJ=WRlQk3l4 zOsIt$Ep@5yApPK$K;o9ka7!vdm0d6MT`YnvN)7# z3#r>0G+4nyB9((Hk>Q~;teGZ5^SlQdXMGBd<3G2qC$Qc+F$Y7W%8jU)dPBw1&sI_}-C?)t zVFL{I#1ko9xlX8U;%b7r)p&AP5b?09F!9I1t|0<z;c^t+ z#HvOl9O;enJYhp2d{O9#echOceKr41uD-Y%v*DL;G}K`c@L8TGoHA67igPoZ{c<@f z%!4Wiz8;*Hh=yLkFHV`h#7*a`3E*4MVB69|LIn zpI6hr+l(k}McT%R6UZxqYBu&LO&VdCdRw7clRB+>am~lXbR#^|ENIzHPOF9vAYitH z><$3xQ@jU?>6>BHtzsx6JhbfgI-t8vkc<)Oj>SN0Xz@qX$*KM2;DCiO{esJVU+F={4CUeZm)>-79 zTPZ*_DAd&B9k^L1C&n6LiF1rAS}3BRS(Fe3-J*mjXw=k>>}(E#(yc;J44Wc%kc%}5 zx#mhhP>cv3Ieu-xfCC!?9(LH00@0i$Ml^*an!T8q8StDC1&`6?D0I;1Bj})6mqN$r z_EG3~!NlSFpwKbmR-VdH=%6u}LI;hS{=PpFZ*j&ES4wcL9o8F2_NlW2smwB10v(yg z$%v+hX~FH*zmYV=%e$pz-jfdE^z-1T;M_sxBzR+GGtM> z_>jWI+hi@%Um~efGnz%osTs|p)TtSbnymz!qbL1E(k+kf?DN+2&L-D5GzQy{k}x_B zsShM*aF{a&9FlWM8rN*0cMX3G1}D<132-mR!5eUa4%9&>qWEGxg^Pt0E~Znsc!i>u z2?HNV(0GY_Bta8aTT&86S3{kb(>VJ!y|c-udvwkwpa0MpY)+5Em@)8SBRvj}(YvN& zDLo&0(Hs1bbT~8~wqpd6cTSy%;tMH-i*O1T4iqkCQMi~w(aZjU(}mHqmHMoXW>M;R zc62r8$(JHD411s6+4tykD1@9|(il93YDvAc&?G(ih=vA-)Jx0guAyF9Xk0S}mZDx- zXw+o!qA0$g>a&sJVH1^aCd#iI3WE|VN%5i07)tbR(%#c7T0MrOA48>&r+0QdeGZ)` zACS-(Jcep%Glrzc2efoJl+(MWcnq!?14~i&urzS4sV<`U!jIyMMHFAmp!i}k#TWZX z*=eKNk*L9QtkK^GsB-* z#~7p6W$I%L8kV9y#-LGix5Jgf1v%{!n#fl;4IFajrI6r|1Gu2t5fw!*2?Jl~(kx1S zk3q92IYXpT<4Eu9^RwxlEgM7e8AH;OkI-p~&lvd7c??a^7+S@}^sXVF`O_Ipoq&&4 z!*qU;_e?rtx`pJ)qxQS{&nmlmdRZJ}mxz&SysNihSR`a?O-4g?nck$=a(=$`gs0{7 zM{D~fseLspLyZMT|DZBm%hAa>`mP*StIW8{XwaJGnjX3uKT}H#hH+1x;Qxj+s?%Am z5vE>aI*;LQXlyf7vJ91N?nWicWH1>777R}P{QgG_*3T-V+;p4uM9tB)N3je~+B+ET zPx?L-EPT*q*JkQ#w_r(3jdswZ7jU#$eI0s+=}D!QW$eF^wfmB*NvoAyG6ll&K7$v_ VD7$Q8Yfa-;?EfY8otfkR@PAU>4>AA% literal 0 HcmV?d00001 diff --git a/src/main/resources/data/hem/structures/15x15_4swamptree2.nbt b/src/main/resources/data/hem/structures/15x15_4swamptree2.nbt new file mode 100644 index 0000000000000000000000000000000000000000..78d2403c154b4e900340eeeffc387a443cecf1b9 GIT binary patch literal 14820 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/hem/structures/15x15generaltree.nbt b/src/main/resources/data/hem/structures/15x15generaltree.nbt new file mode 100644 index 0000000000000000000000000000000000000000..7cc6ba64fd91fa4d4dc3044fb1e9752f39a60274 GIT binary patch literal 15017 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 z zp4bw9kS>`3XsWi8xvr7J|3fDjrz5wCRL^~!4%R~F9gOo&V1gfEjx9dW|9!y5Asp^{ z0r3bxB3DsdQ1q!mVekz-Nsh7Aq*)#fBI6iQo{VtCVt};@i|&DF8!;Gji0DBuruuoayQAkiPK)jFY+K#5fO~V4Uut4QxDvTFPG`2A6;{iIJyC(WJ34D2d|62*O|@ zcY!%3JFm(GcH}RdS+uw zW>$FJuTYruN`9N@SVdNDSVW;?4uy`VD0KXeLdTN?9o4x12^sXi@E9GBhW&qN>{vy` zjuR9*-k{L&JcW*DD0IxG&~b=D$Hm9!_|2iCkcu5UD0D2N(6N9*$A3}ic#1;DzbJIn zJVwWF4;@tOkW=X3Q0Q==&|yQNV;+T$_b7Bct~;hFsQyDUOBfY994T~=69>ygm1!nY z%FDP^C0G~?BNt5iKsJ~NNsH`wpnno3c(K?e-_vuLk z*Kl){{Xo^Qy}j}0Xw&T`)9CG{WP9Uam+2=Z-_$$M&G#|=q;oS|bz_=Fr1r+%f!nzd zudTH=jplQ8g=IDr2eK&<`IFu5vUur5IU23S#HvO#dXWmt; wV&3g7sn*|=_$PLKtKyE_EU`BlYgbhphc*6Odo{O8&wcBe|2^=I)vPD}53VIoJpcdz literal 0 HcmV?d00001 diff --git a/src/main/resources/data/hem/structures/15x15lushtree.nbt b/src/main/resources/data/hem/structures/15x15lushtree.nbt new file mode 100644 index 0000000000000000000000000000000000000000..9b2c3e1665957890cc701029c170fe361d4bd648 GIT binary patch literal 14871 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/hem/structures/5x5floatingisland.nbt b/src/main/resources/data/hem/structures/5x5floatingisland.nbt new file mode 100644 index 0000000000000000000000000000000000000000..c4b3f09d43eeca92df9cec20a96afaeb7dd4924c GIT binary patch literal 1205 zcmb2|=3sz;qqBVTZ@US!eNWEtF1oxWuYqOfm-;7niZ2GQXL`KGE?}05hZftf%hg($ znJHDayWeZ%CNMQkcye=QdV0D_>!njOmM*OOU;g3PjF*8u{a3&2G3gHA|D7mbWgP2W z{B>v6yMM2i*Z)n=thxPV&xwzRXD^aJr8p<-$eAxWqCR?kvhqt#xOTtMRtHqt0SZ{{#>N?Jx&_;~($g;RD5b9kv6dHVQI$=HUmf;JJ-$9oF-st-MU$L z&QeJiJHLmIMeX7~cp7Hxo3J_DV)7xNb5tyrOPIu;xcOmoljG;7AcyR;fjFe*=($Tk zywU=sTDZvbeZ0nW@gh&#{#V84R(3R}v0F}FWVfV1?V#m989%P{AdA_;?P==!p3h7w zsy)FoOP1+e&3v)5esA{p7-Z;8=ohY8@?AvaICtTaIM?)tqQ5_J$p>ATDPni#Om*_q zgaCWx^yI$py@B@PU3GdQe`7R$?F{&0T(r$;ok(+)={eP}Su*N%yx*NVL(^I*Fb-yGwqSRge6(@cI&8>0K|?&AE#|8ytJFDs4A! zyw66>)pinb|6Xr?I{Vdyl7;)ZziyEG|0w&#`3LRk54LIluKW8#d!F&fXLa%IyVu>} znSZKQ+&e(y_rU<$U!88bna~O-kCA$L^_*Z29UO8G2vO zuxE9A?4wH6KCl0iS>AN&r|w<*?Q7U8&Pr$Z{o&TPVk2{V8yID zSkielSn+!8?cQoD;qChIt3oH<-`_JQx+Wuf>a?^{qpjxV`=>hpOn>pKHduP|uZ(}J Ndu_FDW@#}n0015;PksOZ literal 0 HcmV?d00001 diff --git a/src/main/resources/data/hem/structures/5x5floatingislandfragments.nbt b/src/main/resources/data/hem/structures/5x5floatingislandfragments.nbt new file mode 100644 index 0000000000000000000000000000000000000000..3004a08502d6bdf61f5b3a1ac4bb167b3822e68b GIT binary patch literal 994 zcmb2|=3sz;xwlT|J$4glefVzGqP*suO`a3nXO>=b47(|{#W_|WO67zY&y$Orxn8cw zIez)>a}^erWH&C+{$>1?9yx5Upk z`2Fk8yxv^@wz=={8}+sPk#d2~#>>r0zZ=_`UA*n}`C8NK9Q#=Hx~zMB{JkQxJWQNS zyiCF}l@h-#OM@e^LvMV~!qJ~^pA}~Hr|FuQZZ-!a!LA@9f}o#Qna!0VRq zjV;%JsaOTXQ36sE4Y(7<4(YT+a%>hzQ#~`w@VQyX8Lt^r4Wtvd_3XR?RJ2*}S;7Cx z1-x~2@AXVGn!&~>Z8qOpFFn!Vc+buf*)5JK)4)m>{RW!Dxmid~)yAu$=R-yFx7IUm zGkOi!|9hEa#B%|ytkpF5{r+J_{0SM(Vig;wik1%?4?nWyvd^4qp#3oL(BhWk9R21Q z)+cgWZgLdwD9^BF18RCJVNl(?tr^5pC_Xcz_`UB5sC!S&@aDZGZj^m2r`1jCdjQbt zH03kX45v#0on&@sj~p*hquC9H&E^@+yaw)v-tgX1FmgX6!wK}N;u)tItw6tr9a;l+ zGtloKr%ET99m;8`v^6^bRQ!N##$HG1I}EVUIx}OoQ!_AlKsvpT#bjMzn+Wo5+F78R zrh?tPSupK1$W0H#z&e>gHb*CX`_Jwu?effHhVnzfL&`1gAV0>RfZOW@xA!K;=c+di zH>J0%mj$}~+g4_vp1qF0ou17w%;y3*9voMa#Vdiv0UZpACT*~TZ*l-_RzCB3BYRr@ z1-9>C$IH!7P6S4_z|7=hdvr}QnjwLfa%L$=45Sg{b*M(S8EX^n_2u4QdS$Kr?3-_! z{$8>xfB3uj`=75H_m|dQmy>^H60`fk`M*EbKlcl^KF_~?{+>$hebxJ7b}wIPyKMd2 zRIc`dAEi>q@}lflZ#IdwUY>CM>8#x!o~BOp`CDLBy1)I|jc=bnO+RaM=hDr|&#Zjj z*KeBs?r+Y{-h-D)s*nHup!?_H(zn0!1)guSZ#(;V!le%}DRXWY?))-m*|#FA<*_$p zZZALmwdB9pC-W!sugAPAcxGK+8|ZuZ$Ncz@b>9D;dz=0JaLKoI^W~yyxo3q@aSIB* j<;twwY+Cbkr|;YRyC(5%*&OZj58c1C(4gR;Dgy%mTQ=|x literal 0 HcmV?d00001 diff --git a/src/main/resources/data/hem/structures/5x5lushshrub.nbt b/src/main/resources/data/hem/structures/5x5lushshrub.nbt new file mode 100644 index 0000000000000000000000000000000000000000..f355265286c9cabf133896a34c24de092ea75502 GIT binary patch literal 665 zcmV;K0%rXmiwFP!000000F{`_Zrd;rMTbK=ja?LIx83wVvhKR*s@p(uXjh0V8Isc1 zhxB`Ep&lb9NZuO(f)V>@?jbdkMBa$3B~0y~=tX2XSEuu4d0oqG?B{lF<0Q+mmYaue z*gj30(+_{w;*Y~*7diQVsF&3=H*-8+@siOD;|h!ibzD+M6UJwlw9cg#!PK(U@_@4k z>#|b_2044M&;AuYp~8erR*6CPG!T0jh2u2CU6HKTu?otRdHD_aLKE~91?Dt{K$C#Rr5?P+e@kGLC%hF zc7(GM&Pq5d;j9_ww11Rv_8I5ge4#9#$;$OJ+8<-k?4Z!IdiCg(r2O)gZd|ZCMq$ge~_~= zsDF^NBb*)Ktc0@?SxRJiBFhtX0#PRrb(UjA^jP|wTVha;rO&w~2K5+nHU{+=a(0BX zBb=3RR>D~cA0>P|;p2%qfv6LRbp>Kwq2Tl8*mQB8>Q=&+<`Cu6_jtH_=$>O2 zo8A4cdmhF(ZDT**pWgTpC)vp6>o^?axP0Gwx~lorPU3!x6?lJDpd0q^iVs&;{2YeI z%SZ1HZ6CK|vzzalc9bj0$EM$RZNJY+dU^Y~nVWBMoZ6um*?g3LpmJsCK^6c2&7n|{ literal 0 HcmV?d00001 diff --git a/src/main/resources/data/hem/structures/5x5neatlushtree.nbt b/src/main/resources/data/hem/structures/5x5neatlushtree.nbt new file mode 100644 index 0000000000000000000000000000000000000000..83ef7a3ff0555b32607567f9ae7e4c8f559b7546 GIT binary patch literal 909 zcmb2|=3sz;sk8k1ueb@g?_QntPl<1*>rah2#eGGOx_BxQr`()-wSq%Mey(ux4XMVB zzrSakoHg~^&R08EXImJ`_fuehm20ij74M%v zdd>?iezooqONa5gsRe#+UvGFlS)~xpx>M^!s>1ZMPiDR5o#p+t?bAoe`KoST*;Zbc zdh=Q8O82qA>J>#deb())S{cJP*SyK_M2@5GzIE>=h)`({*d@k_~7vYbxG6sQ#Tun8J;toW1Pcm z!Cs)}|25#VY3;h0q$@SP^R=f-02Nq*R4r$cXSQQ|WYO{X!7iDY>CE#P>=zubwH?-_g#6c-A5>RYzVXP4e>3g& z>l>~z7nyv0*{h|%fScU2s`ZrVI?)@?UvB<+=idqo(IbWe$Lkvdf3JC@viMu&FT2Ff zz^xI@Q9koOPM5g)IXfWuX|SUVb0N=>LIHKjuipdS_QTxsfBICQZwhlA`hm#z{%sw@ zRs7})_@@>dy|N4b8S(%acMbiFK(FxC$ox=QJn!O^&CGDm^F6Rxw-yvs=f2cF6Iz^> zt_=yfK4L;n?z*3a`r>EV>T@Ose%>m44j6rlpLtt`KZt4E%m@i}3+aNg2X7ACY~0M8 z&JGQ5z6Ubg=Vl*&cOzc!?~kpL_ox58|NL@tz1;q=&AJzBt$3FHE0?|ZWA*O$r}N+c z{w=<~U;bC}{kwaARaouSog6%`c2Ap~y#M=qU-M7DT4&Ao_wAee^%lQ>Bv$-?_3QHf yzXi(k?#s*lGJpQ=-KRy?bJpKG|L=|7-P8YUWc>J-zWJ{a&oEEIilRW#dt}{p(N(tw?a;PRS~5hs zL3@y%w{j%9ib8TGv5N{25&=&$k0X9Tq`43?fv)^zKnQU>i}suxf6m0zRKE13apHK) z#AIpf)ps{}wZplA=2#h{Ad8O@GIbft~>dgBb>ybtJ)vzzrBF9rAh}Fhif~1Vd$q@==WWsEBil89Kj6 zFjRIZXJ9x3!x9{;5%0HVceAtyV~t)fR`qge zjq`P7+JCF&Uz>Vwn&XGoskpvtD>b&>Y|O1F*4jEF;zjJiZ5QotKa4vOFLz~SR*hc! z8(lVx+U<@0=iZ3Pvi82-oeF(S`7WH*%W+}cYP$|K5`7A{)or7x^NlVyTR#<(wO*Cg zM&Mmr`qcSTy0dTBB*@naYRF|LkS? z*5vQ9x~qO!-Nm`f>Q%a8PnhrnmCH={5)T_}eRlzq^8$NbY`QUY3;DlWp8Y^N*?;&v io;8w=KW`!+u0Lz9znR9BbtT07gZKmQ4nDk)8~^}AW450F literal 0 HcmV?d00001 diff --git a/src/main/resources/data/hem/structures/anthill.nbt b/src/main/resources/data/hem/structures/anthill.nbt new file mode 100644 index 0000000000000000000000000000000000000000..f5dfa3863686b0ffed7c01503447bdc24063f9a0 GIT binary patch literal 124 zcmb2|=3syT+tY@8hYSQ63o5pa@t8NPUWL&vd_ zBnE@+k=+@QF|nC5#5eAK{;MJ?>YhPZ^u>C{=;FeEN9v~dl-GH7FPq$G@lEDj(4TAB a=j01_bex{5e>tk5k|uiwFP!000000F{_QPuoBcg=cq$mIU?EQ|V9P+%v~skrOSgRVPNV%K?f1 zULrgeEW7(&BSi@1^Sp0&#v3bJk&W2YKP45B^ZUZz8@Wu!xu5$q$@#UBPrG5<|CzQg z|2%I*AI8Zq3iA32Di_n-&1t!!#KZ;@7e)xCl@zyaK|RgS=Nf~0ikt(H6^N`zWJRKm5_Q&d zfnZweQo_dwA0vF6Y4zO*XRA1We&~iY&*}UVja`b}c84Tif2YIEZupyq)ZO1r^LR|+ zpM87x*?!#ZhV-7e{&@A>uT%G!h86j8=#OcC>h9;8u0OqqT>a?g?q@np{dg4FewTk8 KJMH*q5&!@`A|p@$ literal 0 HcmV?d00001 diff --git a/src/main/resources/data/hem/structures/boulder2.nbt b/src/main/resources/data/hem/structures/boulder2.nbt new file mode 100644 index 0000000000000000000000000000000000000000..018ac82ff5ed14540a86ac61451e6032a608ed31 GIT binary patch literal 503 zcmVg$1&kMuehO#L9=)1{3~?i{gdHy?{<{$A zjX`&+*n|+{qw4MSz!2slGx5It%qAkI$0QyzndV(-OPhN+T{F2^Zo1WbKR^EQH51!+ zeY_~i&y`FjeQ8QQzv4eeD~u93dPR;^7$b7z>|JA0+#A85^R0@X;%L9LyB?7~x}tj|2zS*@$_uIcR-Qml9n{ zbQzIza(1H231^fuT)&t!!X$!Gf-!>e3X_H)%+$IP(WOL}5;;cX4CfQU)b1;onvWAc z!PI<$sm(o@nsYEUXNj2+4BD%g=hqm6_90^8%tiYLq{Pu3*sKK(lbd zS>*4TJI0`yBF2a=BXXR`2?nk6<+(h@pmj#h63+yK-h-EC4)F7t75@-sEQe t+LvyZCH{B6ZFhNfXx3%Xw1;E%-BVMVmwf2kZYMH-ly5K~Be)_G005)`@Kyi- literal 0 HcmV?d00001 diff --git a/src/main/resources/data/hem/structures/boulder3.nbt b/src/main/resources/data/hem/structures/boulder3.nbt new file mode 100644 index 0000000000000000000000000000000000000000..56db00cdbf3a28af51b78a3625a689631252cd4e GIT binary patch literal 1692 zcmZ8hYfw{17`2R|qd^?0CSXZaR7B-*37}Ylj!|$Bn;rhWsBH(oJmIX436Z>eu(#)K(G7an3IBdWkHg`-eYxAM*0mB~|MoL<-+c4h_{gKm zV__UE0)sL4`oQ+kIG{00cTRbXE|73Fuxk0q>;8qrq(ivo#!E}zibfX`v~N^Huch)q zjnAyK#HML=|0qG`XP^b4#R#i+~Q!LQan=Qb*d1E0<5 zvaYIY4IqX>4#=BKhe@8BuuX{#D6(i_IZc=_FVrA7w6w_(3so6M|7XuF?uo$?>?YK^ zIW*pj`r|?5o#iz3LpLE!Z909xNFg!qNWLuDgx6dFsq{CY*J&|^Iv&*#3ELS^yNNPT4dQP_8gC z_gJVZvqfxIxueNU(RxZoEYN{pj+ntT6=XIucf@DK+Pl-m5`rOqF}*KZ$FCzUhxfBQ z)vjhR*)Xkm2@jLS%h@bPaG-%>pqS`lQsLIgX@Nlm^NQ|j2Fx$_oJKr_{DM#s;noDV z7H{EC*&+splolnVe&cSTqN+`ilhcZ8lRlK%v13BC$y;aDXp^{NOP?qpZ*M%L*rzyK z0(DY(bRAQn-iSqcItj>jC3QY&c?O|&eGSK9@=gYnBNZqEJ=HdQ;<~~<{u?wM*wd7p z@1K@okEA?qLq#|!Hk;ruP}>V`hOk(md}IdtV+-Zn7Kn#G^XNjVxf%asO^G!CT8{KS z%}3+ewK(Z02-e1QNzgM)AT3)6q&2oIznFMIzJD8K3*|AnFU$ePngKD6+;{0vdS|+j z#h5dZSBq0l0u1f=b4zdC7kzLw4B|p=p z8w?fKpw5r$IY}G(-4Qce?`Uc2Je~_b#~o3|C}l#G1Hdk2S_7C&twF{h@tT_Nq$twF znm+nxgBq*!5tD7xG-J7MBAaG!ip?OBAJEln!wPt^KScjRz{u zY&+Wxl!m=Cbv{F`{8$X+lkN~q7W-MnKacZyG~RtWtC$q2+LMInpt1a3QN(_r?habM zC@jeVk(b&g zbREst(`SmgW2#i%8n*qWYCO(*O$|XK?QLg#n*uVM$@iE@ ze9^Wlm|@OYl6k`XH=v0wWejNAc{3Q>M_%Frg%R%oxL{t*Ep|;^3)E8$Ue=w{M+BJc z(R#3+SY)}98i-)KorcLmX_X9fEu&M4njcsrLCOI=fUOaQ{=hOl z`6TTR>~zpb#tDFp#{vh<9@00y@fobyh-ZBzA%JuC46RH$OpvKr7TQb9Clz|E^AC_* z?Fh=iMH#_qpzhg2z`BE5c7S)LF^A;@XwmK~H>oWNspryHG9FvT(y_Q;J#}DZzGP+L zos~5!Th)L^0POQ0z_$Oy^a-_=l+WgmCm(JZIdUy7^|m6|sc2-nUotL?R&N*G8^ zX1I)_NA7C}UL;Or$%hk@8FRl`9sILbWt=sYE*~Bm9Up#^og1AbvFjJ8pukDil0GDd{|fI+@mOB9|D^oacW$dz{SBLGZ?gaZ literal 0 HcmV?d00001 diff --git a/src/main/resources/data/hem/structures/boulder4.nbt b/src/main/resources/data/hem/structures/boulder4.nbt new file mode 100644 index 0000000000000000000000000000000000000000..33e3551fcb837094ae911270b0763a87693b8f5f GIT binary patch literal 621 zcmV-z0+Rh7iwFP!000000F{`_ZWBQeMXRfNLTto_72;E}X3dgqG>JMe!jH&3Z1@nq z7f*1FLZ`d$^+=W#`OK~3s*2t6R%9bFPrs9i$nqG@kDKLrBe&@=PxF+rEZ0VE9(Kpa zpLu)!Rw%%N2{9+Pot030LIw zeDuQf_D2aHC47|dF(PNZUNPEW0>LQ37{SC26V@Qi^lAm7mJ+p;$T1?vnO>jQ&oYAP z`9#9UnVyd`y}3Knb9ScZEIu=WLAzR>Nm>lrL&W$w3hfWdF(PMmA{ewAs8%FuIfHfs z%_0)cB5%)8Ee6dLF-FufA}10#&Y(V*XRQ{4`iz{#p9u!_88JrGG9o7uInJOy8_{PY z`iz`K-kv2|4En4q&k5FG(7Z~YGA9r@N-$Qb)nY=&XYDn?p#4EUvEtKW(EgOpEe7q+ zKVs*_obms5sYl6*&jOSqW#YIF~+Jac<@GoRx4k!r3a$EvDCJ zBb<$Jj)Ze0oMXkg#i0Men)AEoahK*fEkBdSTZv!CeUgtq(*EvY_bctv_;jD=;~|N^ z_UXUZzMsaN?_YjtU5O9->5v{z(ewOOMO@GItue>$Uf|31F_O#Px#R7(a{tWY zn$Oj`WjB`FXq?#Z>>HMu(N-a~@km5#;7Nfrrh{{Sw=e~NHdLCf`(&1J(JcF2_KZ)s z@;icOho{NhIqYzS$ugboDv((AET^Sk_s5hOv-&4*4Oq0y>zLzr_NPHg(}i~S^dvXT z>@#-b_EC^fl~9&gZ;;5FTaG=ecItF|&HnR-v_y!$h`RBLxQusxKmM$>4D9}C7nXGHdcP=8LiJVa9A-gx z@keLomMWf`V|XaNDo&{I!n}rOPh0x+fsTsuom)_LDDu>qpaM76uEaegvq zX4GBghcaSwybCYPazD50K}=GXo!1YEhsiDHrwD%$U$tBCoS%jD!#CXLRN20Y7flmx z|8=^tI4z*wvfv!gEBz;PB){zDvt&PHDR9oqLi^#Gmd!#yhV;Xnmd%3a+<=TXEt`cQ zMznmcSknO1%D)aqD$Fr%t`Z3}@UsJyKCu4HU{7LS0HMT|n4Qf9p-hTHe_Wm9IaNpbh n^7U1w4;JPJS^e7g{}#{L?>Cm0?H9gTGts_fquz~Qq6`cGW_dL< literal 0 HcmV?d00001 diff --git a/src/main/resources/data/hem/structures/bush2.nbt b/src/main/resources/data/hem/structures/bush2.nbt new file mode 100644 index 0000000000000000000000000000000000000000..c3f2818ed3db02d2f801552b28a9e09c2231326c GIT binary patch literal 262 zcmV+h0r~zPiwFP!000000F9JQOT$1AhToY~ZB_)2qW`34&*I5z*_NqYy7^#tE9$Rz z18zwVNoF9BkZ0a!GLSVuja78NQUSQSYOJMAE;)%9s>bckcl%Q``QfET)pxPLrKrM9 zOg71X$C#l4DVT8%O)xx@!^(MRfw|O(;R%Lk7*^!4A_wLB6$~kuITtBhq{v}K4l8D6 zg$rem3TA0Ptk}7TU5lJ_j{X!_s*&-pSY--q#-GH)AI6k< zoGxor7wRPTDDSL>8f8NRV{_$U*9%2!gM>$$>HI!j@5$)Mqe_Z^-{J-2*KTIG0000- CX-5(O literal 0 HcmV?d00001 diff --git a/src/main/resources/data/hem/structures/lilypad.nbt b/src/main/resources/data/hem/structures/lilypad.nbt new file mode 100644 index 0000000000000000000000000000000000000000..ea5c0e5ecba9a7b5a035b49093e242a9472d84ad GIT binary patch literal 150 zcmV;H0BQdpiwFP!0000006mPc4uU`sM8|*#XKmxBSX&z_Te9Gw7fD&*>)%m9qeCM%Te&6}rUq(aez*k06q*DOVyqCXktYGV8qizI<&{3H%;Kg7gg zyev_4()#{{{7yBL$aiujR%c!}O}H^ox;psqsFNJuzss$d95|?tJ>b@O0UWl+mb(A| E0J2R+r~m)} literal 0 HcmV?d00001 diff --git a/src/main/resources/data/hem/structures/muncherclosed.nbt b/src/main/resources/data/hem/structures/muncherclosed.nbt new file mode 100644 index 0000000000000000000000000000000000000000..705ca314b6c03b9e81252ed31b954f424c1f2c66 GIT binary patch literal 178 zcmV;j08RfNiwFP!0000009B4b3c@fDMSo3On|K3{;#veZ;>vwm$2PP{N-`pNdJ}8~ zKYSRNVct`KL>bMS1c2OPtwckP4I7Hck*M3rcVkp}s~}v<64jZ>eh(Dn$%mefnstGO zO*iUxqBLS-?$`}v5BBN0fkJvFW*=APF9KC$&9nfwvz~~V7NWWaKU2s?4eE#PjO$Up gC~`uS7j5YuBCyLYHww{smjw6t06`&hdhh@M0LiaQO#lD@ literal 0 HcmV?d00001 diff --git a/src/main/resources/data/hem/structures/muncheropen.nbt b/src/main/resources/data/hem/structures/muncheropen.nbt new file mode 100644 index 0000000000000000000000000000000000000000..327546bae54bcad55213b63e52d6bbe39f2b15be GIT binary patch literal 185 zcmV;q07m~GiwFP!000000Bw%J3c@fDM5m@|6OZ2f6we}f5l>zvt!o?FBqdo9{CX2? zJvlJ2Fw4AAfJ7P1n*@ODVzxv@jtv`%$dXvqgKzq%a;hL)%@WHKll?v@$fFM}9W?6# z6`Q8l^+4&w!rZa#$nH~vw{*YRr)xS2sZ@+U&g`EAmXS5n1YVDNAZD7#>Jt1&Aup@2 ndg#Wu7Uhc~CscXXmj1&8HhJ5XLNwl`!8?2a%9%jZ00961U8Pfd literal 0 HcmV?d00001 diff --git a/src/main/resources/data/hem/structures/seagrass.nbt b/src/main/resources/data/hem/structures/seagrass.nbt new file mode 100644 index 0000000000000000000000000000000000000000..b77e0a6a9e9b241ee5d5c7b13d61184c4b3c127b GIT binary patch literal 152 zcmV;J0B8RniwFP!0000006mPc4uU`sM8|*%M{nV$SX&z_Te9eg7f+7dE-~@z1r;ZG z)yx|Ql*rY;m;snr%#5Yfmmv3cX0zU6-t~4RWF+rpk;N$ryV2 z&V)FDKm|fbdS85bpo7!lmumnetDLJ+JG2~Zuz?jNI=u7}_dn_j(V-rrE~0zXXw=B~ zrg&zmC#K5G>qx?8d_CL3eba^UcIL}xFB1#Xakr0sFRT^=!^3Y<961$Z8D~<13whOI zJ?FDY;_1W(G)EH6!$#v|=LKm(OpngZ{7|o^5zf-YSX_Mk=VCXLNPcAfMMhgrI>Z3@ Ocl-e_5p+dR0RR9cnqd3@ literal 0 HcmV?d00001 diff --git a/src/main/resources/data/hem/structures/wall2.nbt b/src/main/resources/data/hem/structures/wall2.nbt new file mode 100644 index 0000000000000000000000000000000000000000..9be39da8238e8dbb7115a8be6cc33b25ca213c2b GIT binary patch literal 142 zcmb2|=3sz;+#W-|Lk1$wvOxzdP;v_AxyRki3|DdN_>ZqY(eI4XUkBMymNE58}{J`4$*}UsP=dR Lt8JvY=l}o!bdXDt literal 0 HcmV?d00001 diff --git a/src/main/resources/data/hem/structures/wall4.nbt b/src/main/resources/data/hem/structures/wall4.nbt new file mode 100644 index 0000000000000000000000000000000000000000..4521b7fac669b2fc815187af1ff701f13849baba GIT binary patch literal 218 zcmV<0044t)iwFP!0000009}qvPQx$|gnj|E2TO8Dd+KvP$B)BXsk!d*764i>@my6xh<=_r?}Kz_G;4wt$zSU)-LAi)-rQ4OL)V%T9 zxMzwxrbx`w;v>y?(bm|#`-yn|;t<8 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/hem/structures/waterloggedgrass.nbt b/src/main/resources/data/hem/structures/waterloggedgrass.nbt new file mode 100644 index 0000000000000000000000000000000000000000..932e3d623a727cf965870618f5062e22bad0533c GIT binary patch literal 157 zcmV;O0Al|iiwFP!0000006mVu3c@fDL`PD!O@BcA6wjW;lh=~!*al-$vRehe-d3#x z0|T>f84DE1#J^|&OkT_`kh4>-o`OjQR&|Kyo7it_`Y1E>m%&ohDSyPecY&(>AQtwR zV$U?a%uznayA)#6@PbU!K;*~{?oMo4-gk8v80fB57^JPn^caU2lzXS{#3Vj;fZgH^ LAf&P=!vFvP*vv>9 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/hem/structures/waterloggedleaves3x3.nbt b/src/main/resources/data/hem/structures/waterloggedleaves3x3.nbt new file mode 100644 index 0000000000000000000000000000000000000000..df5d30a1072b6ce83c49f9b4231261bdb538fcc1 GIT binary patch literal 204 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