From aaeca7704e5fdd437feb9ad1be0839c9087e25e8 Mon Sep 17 00:00:00 2001 From: Tim Clancy Date: Wed, 26 Jul 2017 20:34:17 -0400 Subject: [PATCH] Initial 1.10.2 branch of the updated thermometer, temperature decay/hibernation system, and configurable crops/drinks/seasons PR. --- forge-1.10.2-12.18.3.2422-mdk/.gitignore | 22 + forge-1.10.2-12.18.3.2422-mdk/LICENSE-new.txt | 483 ++++++++++++++++++ forge-1.10.2-12.18.3.2422-mdk/README.txt | 59 +++ forge-1.10.2-12.18.3.2422-mdk/build.gradle | 93 ++++ .../gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 52271 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + forge-1.10.2-12.18.3.2422-mdk/gradlew.bat | 90 ++++ .../java/toughasnails/api/HealthHelper.java | 63 +++ .../main/java/toughasnails/api/ITANBlock.java | 19 + .../main/java/toughasnails/api/TANBlocks.java | 16 + .../toughasnails/api/TANCapabilities.java | 21 + .../java/toughasnails/api/TANPotions.java | 18 + .../api/achievement/TANAchievements.java | 22 + .../api/config/GameplayOption.java | 52 ++ .../api/config/ISyncedOption.java | 13 + .../toughasnails/api/config/SyncedConfig.java | 55 ++ .../toughasnails/api/item/IColoredItem.java | 18 + .../java/toughasnails/api/item/ItemDrink.java | 92 ++++ .../java/toughasnails/api/item/TANItems.java | 45 ++ .../api/season/IDecayableCrop.java | 21 + .../api/season/IHibernatingCrop.java | 27 + .../toughasnails/api/season/ISeasonData.java | 25 + .../java/toughasnails/api/season/Season.java | 74 +++ .../toughasnails/api/season/SeasonHelper.java | 56 ++ .../toughasnails/api/season/WorldHooks.java | 52 ++ .../toughasnails/api/stat/IPlayerStat.java | 23 + .../api/stat/PlayerStatRegistry.java | 53 ++ .../api/stat/StatHandlerBase.java | 14 + .../stat/capability/CapabilityProvider.java | 28 + .../api/stat/capability/ITemperature.java | 33 ++ .../api/stat/capability/IThirst.java | 27 + .../temperature/ITemperatureRegulator.java | 16 + .../api/temperature/Temperature.java | 48 ++ .../api/temperature/TemperatureHelper.java | 52 ++ .../api/temperature/TemperatureScale.java | 116 +++++ .../java/toughasnails/api/thirst/IDrink.java | 15 + .../toughasnails/api/thirst/ThirstHelper.java | 20 + .../toughasnails/api/thirst/WaterType.java | 48 ++ .../main/java/toughasnails/asm/ASMHelper.java | 112 ++++ .../main/java/toughasnails/asm/ObfHelper.java | 36 ++ .../toughasnails/asm/TANLoadingPlugin.java | 41 ++ .../asm/transformer/CropDecayTransformer.java | 135 +++++ .../EntityRendererTransformer.java | 99 ++++ .../transformer/InterfaceCheckVisitor.java | 26 + .../asm/transformer/WorldTransformer.java | 225 ++++++++ .../block/BlockGlowstoneTorch.java | 297 +++++++++++ .../block/BlockRainCollector.java | 185 +++++++ .../toughasnails/block/BlockSeasonSensor.java | 189 +++++++ .../toughasnails/block/BlockTANCampfire.java | 279 ++++++++++ .../toughasnails/block/BlockTANDeadCrops.java | 48 ++ .../java/toughasnails/block/BlockTANGas.java | 269 ++++++++++ .../toughasnails/block/BlockTANGeneric.java | 49 ++ .../block/BlockTANTemperatureCoil.java | 213 ++++++++ .../toughasnails/block/BlockTANTorchNew.java | 375 ++++++++++++++ .../toughasnails/client/gui/GuiFactory.java | 30 ++ .../toughasnails/client/gui/GuiTANConfig.java | 41 ++ .../java/toughasnails/command/TANCommand.java | 306 +++++++++++ .../config/CropGrowConfigEntry.java | 38 ++ .../config/GameplayConfigurationHandler.java | 332 ++++++++++++ .../config/SyncedConfigHandler.java | 58 +++ .../java/toughasnails/config/TANConfig.java | 366 +++++++++++++ .../java/toughasnails/core/ClientProxy.java | 129 +++++ .../java/toughasnails/core/CommonProxy.java | 14 + .../java/toughasnails/core/ToughAsNails.java | 83 +++ .../toughasnails/entities/EntityFreeze.java | 227 ++++++++ .../toughasnails/entities/ModelFreeze.java | 76 +++ .../toughasnails/entities/RenderFreeze.java | 24 + .../entities/projectile/EntityIceball.java | 336 ++++++++++++ .../entities/projectile/RenderIceball.java | 53 ++ .../handler/AchievementEventHandler.java | 98 ++++ .../handler/BlockHarvestEventHandler.java | 27 + .../handler/ExtendedStatHandler.java | 75 +++ .../handler/LootTableEventHandler.java | 44 ++ .../toughasnails/handler/PacketHandler.java | 25 + .../handler/health/HealthOverlayHandler.java | 59 +++ .../handler/health/MaxHealthHandler.java | 238 +++++++++ .../handler/season/ProviderIceHandler.java | 53 ++ .../handler/season/RandomUpdateHandler.java | 100 ++++ .../handler/season/SeasonHandler.java | 244 +++++++++ .../handler/season/SeasonSleepHandler.java | 36 ++ .../handler/season/StopSpawnHandler.java | 48 ++ .../season/WeatherFrequencyHandler.java | 61 +++ .../TemperatureDebugOverlayHandler.java | 137 +++++ .../TemperatureOverlayHandler.java | 252 +++++++++ .../handler/thirst/FillBottleHandler.java | 118 +++++ .../handler/thirst/ThirstOverlayHandler.java | 103 ++++ .../handler/thirst/ThirstStatHandler.java | 128 +++++ .../handler/thirst/VanillaDrinkHandler.java | 105 ++++ .../toughasnails/init/ModAchievements.java | 63 +++ .../java/toughasnails/init/ModBlocks.java | 135 +++++ .../java/toughasnails/init/ModConfig.java | 22 + .../java/toughasnails/init/ModCrafting.java | 191 +++++++ .../java/toughasnails/init/ModEntities.java | 86 ++++ .../java/toughasnails/init/ModHandlers.java | 85 +++ .../main/java/toughasnails/init/ModItems.java | 153 ++++++ .../java/toughasnails/init/ModPotions.java | 53 ++ .../main/java/toughasnails/init/ModStats.java | 23 + .../toughasnails/init/ModVanillaCompat.java | 37 ++ .../toughasnails/item/ItemBottleOfGas.java | 124 +++++ .../java/toughasnails/item/ItemCanteen.java | 186 +++++++ .../toughasnails/item/ItemFruitJuice.java | 96 ++++ .../java/toughasnails/item/ItemIceCharge.java | 78 +++ .../item/ItemLifebloodCrystal.java | 51 ++ .../toughasnails/item/ItemRespirator.java | 15 + .../toughasnails/item/ItemSeasonClock.java | 84 +++ .../java/toughasnails/item/ItemTANBlock.java | 80 +++ .../toughasnails/item/ItemTANSpawnEgg.java | 194 +++++++ .../toughasnails/item/ItemTANWaterBottle.java | 90 ++++ .../toughasnails/item/ItemThermometer.java | 113 ++++ .../network/message/MessageSyncConfigs.java | 62 +++ .../message/MessageSyncSeasonCycle.java | 50 ++ .../message/MessageTemperatureClient.java | 101 ++++ .../network/message/MessageToggleUI.java | 50 ++ .../network/message/MessageUpdateStat.java | 58 +++ .../particle/EntitySnowflakeFX.java | 97 ++++ .../particle/TANParticleTypes.java | 6 + .../potion/PotionColdResistance.java | 21 + .../potion/PotionHeatResistance.java | 25 + .../potion/PotionHyperthermia.java | 27 + .../potion/PotionHypothermia.java | 27 + .../toughasnails/potion/PotionThirst.java | 33 ++ .../java/toughasnails/potion/TANPotion.java | 31 ++ .../toughasnails/season/ISeasonedWorld.java | 18 + .../toughasnails/season/SeasonASMHelper.java | 170 ++++++ .../toughasnails/season/SeasonSavedData.java | 43 ++ .../java/toughasnails/season/SeasonTime.java | 52 ++ .../temperature/BlockTemperatureData.java | 17 + .../temperature/MaterialTemperatureData.java | 7 + .../temperature/TemperatureDebugger.java | 141 +++++ .../temperature/TemperatureHandler.java | 293 +++++++++++ .../temperature/TemperatureStorage.java | 70 +++ .../temperature/TemperatureTrend.java | 13 + .../modifier/AltitudeModifier.java | 55 ++ .../temperature/modifier/ArmorModifier.java | 128 +++++ .../temperature/modifier/BiomeModifier.java | 84 +++ .../modifier/ObjectProximityModifier.java | 148 ++++++ .../modifier/PlayerStateModifier.java | 69 +++ .../temperature/modifier/SeasonModifier.java | 187 +++++++ .../modifier/TemperatureModifier.java | 87 ++++ .../temperature/modifier/TimeModifier.java | 86 ++++ .../temperature/modifier/WeatherModifier.java | 83 +++ .../toughasnails/thirst/ThirstHandler.java | 215 ++++++++ .../toughasnails/thirst/ThirstStorage.java | 49 ++ .../tileentity/TileEntitySeasonSensor.java | 23 + .../TileEntityTemperatureSpread.java | 379 ++++++++++++++ .../java/toughasnails/util/BiomeUtils.java | 21 + .../toughasnails/util/BlockStateUtils.java | 128 +++++ .../main/java/toughasnails/util/MapUtils.java | 36 ++ .../util/PotionBrewingRecipe.java | 24 + .../java/toughasnails/util/RenderUtils.java | 24 + .../toughasnails/util/SeasonColourUtil.java | 94 ++++ .../util/block/VariantPagingHelper.java | 177 +++++++ .../util/inventory/CreativeTabTAN.java | 21 + .../resources/META-INF/toughasnails_at.cfg | 13 + .../toughasnails/blockstates/campfire.json | 36 ++ .../toughasnails/blockstates/dead_crops.json | 5 + .../blockstates/glowstone_torch.json | 9 + .../blockstates/rain_collector.json | 8 + .../blockstates/season_sensor_autumn.json | 5 + .../blockstates/season_sensor_spring.json | 5 + .../blockstates/season_sensor_summer.json | 5 + .../blockstates/season_sensor_winter.json | 5 + .../blockstates/temperature_coil.json | 8 + .../toughasnails/blockstates/torch_new.json | 164 ++++++ .../assets/toughasnails/lang/en_US.lang | 113 ++++ .../assets/toughasnails/lang/fr_FR.lang | 96 ++++ .../assets/toughasnails/lang/hu_HU.lang | 90 ++++ .../assets/toughasnails/lang/pt_PT.lang | 98 ++++ .../assets/toughasnails/lang/zh_CN.lang | 96 ++++ .../toughasnails/models/block/campfire.json | 222 ++++++++ .../models/block/campfire_out.json | 222 ++++++++ .../toughasnails/models/block/chiller.json | 8 + .../models/block/cooling_coil_off.json | 179 +++++++ .../models/block/cooling_coil_on.json | 179 +++++++ .../toughasnails/models/block/dead_crops.json | 6 + .../toughasnails/models/block/fireplace.json | 135 +++++ .../models/block/glowstone_torch.json | 6 + .../models/block/glowstone_torch_wall.json | 6 + .../models/block/heating_coil_off.json | 179 +++++++ .../models/block/heating_coil_on.json | 179 +++++++ .../toughasnails/models/block/new_torch.json | 6 + .../models/block/new_torch_wall.json | 6 + .../models/block/rain_collector_empty.json | 74 +++ .../models/block/rain_collector_level1.json | 80 +++ .../models/block/rain_collector_level2.json | 80 +++ .../models/block/rain_collector_level3.json | 81 +++ .../models/block/season_sensor_autumn.json | 20 + .../models/block/season_sensor_spring.json | 20 + .../models/block/season_sensor_summer.json | 20 + .../models/block/season_sensor_winter.json | 20 + .../toughasnails/models/item/air_filter.json | 6 + .../models/item/bottle_of_blackdamp.json | 6 + .../models/item/bottle_of_firedamp.json | 6 + .../models/item/bottle_of_stinkdamp.json | 6 + .../models/item/bottle_of_whitedamp.json | 6 + .../toughasnails/models/item/campfire.json | 7 + .../toughasnails/models/item/canteen.json | 10 + .../models/item/canteen_empty.json | 6 + .../models/item/canteen_filled.json | 6 + .../models/item/charcoal_filter.json | 6 + .../toughasnails/models/item/chiller.json | 3 + .../models/item/cooling_coil.json | 7 + .../toughasnails/models/item/dead_crops.json | 7 + .../models/item/dirty_water_bottle.json | 6 + .../models/item/filtered_water_bottle.json | 6 + .../toughasnails/models/item/fireplace.json | 3 + .../models/item/freeze_powder.json | 6 + .../toughasnails/models/item/freeze_rod.json | 6 + .../models/item/glowstone_torch.json | 6 + .../models/item/heating_coil.json | 7 + .../toughasnails/models/item/ice_charge.json | 6 + .../toughasnails/models/item/ice_cube.json | 6 + .../models/item/jelled_slime.json | 6 + .../models/item/jelled_slime_boots.json | 6 + .../models/item/jelled_slime_chestplate.json | 6 + .../models/item/jelled_slime_helmet.json | 6 + .../models/item/jelled_slime_leggings.json | 6 + .../toughasnails/models/item/juice_apple.json | 6 + .../models/item/juice_beetroot.json | 6 + .../models/item/juice_cactus.json | 6 + .../models/item/juice_carrot.json | 6 + .../models/item/juice_chorus_fruit.json | 6 + .../models/item/juice_glistering_melon.json | 6 + .../models/item/juice_golden_apple.json | 6 + .../models/item/juice_golden_carrot.json | 6 + .../toughasnails/models/item/juice_melon.json | 6 + .../models/item/juice_pumpkin.json | 6 + .../models/item/lifeblood_crystal.json | 6 + .../models/item/rain_collector.json | 7 + .../toughasnails/models/item/respirator.json | 6 + .../models/item/season_clock.json | 32 ++ .../models/item/season_clock_00.json | 6 + .../models/item/season_clock_01.json | 6 + .../models/item/season_clock_02.json | 6 + .../models/item/season_clock_03.json | 6 + .../models/item/season_clock_04.json | 6 + .../models/item/season_clock_05.json | 6 + .../models/item/season_clock_06.json | 6 + .../models/item/season_clock_07.json | 6 + .../models/item/season_clock_08.json | 6 + .../models/item/season_clock_09.json | 6 + .../models/item/season_clock_10.json | 6 + .../models/item/season_clock_11.json | 6 + .../models/item/season_clock_12.json | 6 + .../models/item/season_clock_13.json | 6 + .../models/item/season_clock_14.json | 6 + .../models/item/season_clock_15.json | 6 + .../models/item/season_clock_16.json | 6 + .../models/item/season_clock_17.json | 6 + .../models/item/season_clock_18.json | 6 + .../models/item/season_clock_19.json | 6 + .../models/item/season_clock_20.json | 6 + .../models/item/season_clock_21.json | 6 + .../models/item/season_clock_22.json | 6 + .../models/item/season_clock_23.json | 6 + .../models/item/season_sensor_autumn.json | 4 + .../models/item/season_sensor_spring.json | 4 + .../models/item/season_sensor_summer.json | 4 + .../models/item/season_sensor_winter.json | 4 + .../models/item/spawn_egg_freeze.json | 7 + .../toughasnails/models/item/tan_icon.json | 6 + .../toughasnails/models/item/thermometer.json | 29 ++ .../models/item/thermometer_00.json | 6 + .../models/item/thermometer_01.json | 6 + .../models/item/thermometer_02.json | 6 + .../models/item/thermometer_03.json | 6 + .../models/item/thermometer_04.json | 6 + .../models/item/thermometer_05.json | 6 + .../models/item/thermometer_06.json | 6 + .../models/item/thermometer_07.json | 6 + .../models/item/thermometer_08.json | 6 + .../models/item/thermometer_09.json | 6 + .../models/item/thermometer_10.json | 6 + .../models/item/thermometer_11.json | 6 + .../models/item/thermometer_12.json | 6 + .../models/item/thermometer_13.json | 6 + .../models/item/thermometer_14.json | 6 + .../models/item/thermometer_15.json | 6 + .../models/item/thermometer_16.json | 6 + .../models/item/thermometer_17.json | 6 + .../models/item/thermometer_18.json | 6 + .../models/item/thermometer_19.json | 6 + .../models/item/thermometer_20.json | 6 + .../toughasnails/models/item/torch_new.json | 6 + .../toughasnails/models/item/wool_boots.json | 6 + .../models/item/wool_chestplate.json | 6 + .../toughasnails/models/item/wool_helmet.json | 6 + .../models/item/wool_leggings.json | 6 + .../toughasnails/textures/blocks/chiller.png | Bin 0 -> 575 bytes .../textures/blocks/cooling_coil_off.png | Bin 0 -> 303 bytes .../textures/blocks/cooling_coil_on.png | Bin 0 -> 343 bytes .../textures/blocks/dead_crops.png | Bin 0 -> 218 bytes .../textures/blocks/glowstone_torch.png | Bin 0 -> 255 bytes .../textures/blocks/heating_coil_off.png | Bin 0 -> 588 bytes .../textures/blocks/heating_coil_on.png | Bin 0 -> 375 bytes .../textures/blocks/log_burnt.png | Bin 0 -> 616 bytes .../textures/blocks/log_burnt_top.png | Bin 0 -> 581 bytes .../textures/blocks/rain_collector_bottom.png | Bin 0 -> 550 bytes .../textures/blocks/rain_collector_inner.png | Bin 0 -> 589 bytes .../textures/blocks/rain_collector_side.png | Bin 0 -> 638 bytes .../textures/blocks/rain_collector_top.png | Bin 0 -> 525 bytes .../blocks/season_sensor_autumn_top.png | Bin 0 -> 295 bytes .../textures/blocks/season_sensor_side.png | Bin 0 -> 246 bytes .../blocks/season_sensor_spring_top.png | Bin 0 -> 295 bytes .../blocks/season_sensor_summer_top.png | Bin 0 -> 297 bytes .../blocks/season_sensor_winter_top.png | Bin 0 -> 293 bytes .../textures/blocks/torch_off.png | Bin 0 -> 1274 bytes .../toughasnails/textures/entity/freeze.png | Bin 0 -> 1317 bytes .../textures/gui/fire_vignette.png | Bin 0 -> 894 bytes .../textures/gui/ice_vignette.png | Bin 0 -> 895 bytes .../assets/toughasnails/textures/gui/logo.png | Bin 0 -> 10954 bytes .../toughasnails/textures/gui/overlay.png | Bin 0 -> 3451 bytes .../textures/items/air_filter.png | Bin 0 -> 294 bytes .../textures/items/bottle_of_blackdamp.png | Bin 0 -> 431 bytes .../textures/items/bottle_of_firedamp.png | Bin 0 -> 454 bytes .../textures/items/bottle_of_stinkdamp.png | Bin 0 -> 455 bytes .../textures/items/bottle_of_whitedamp.png | Bin 0 -> 454 bytes .../toughasnails/textures/items/campfire.png | Bin 0 -> 330 bytes .../textures/items/canteen_empty.png | Bin 0 -> 268 bytes .../textures/items/canteen_filled.png | Bin 0 -> 275 bytes .../textures/items/charcoal_filter.png | Bin 0 -> 360 bytes .../textures/items/cooling_coil.png | Bin 0 -> 321 bytes .../toughasnails/textures/items/dew_leaf.png | Bin 0 -> 310 bytes .../textures/items/dirty_water_bottle.png | Bin 0 -> 308 bytes .../textures/items/filtered_water_bottle.png | Bin 0 -> 339 bytes .../textures/items/freeze_powder.png | Bin 0 -> 365 bytes .../textures/items/freeze_rod.png | Bin 0 -> 309 bytes .../textures/items/heating_coil.png | Bin 0 -> 317 bytes .../textures/items/ice_charge.png | Bin 0 -> 335 bytes .../toughasnails/textures/items/ice_cube.png | Bin 0 -> 293 bytes .../textures/items/jelled_slime.png | Bin 0 -> 311 bytes .../textures/items/jelled_slime_boots.png | Bin 0 -> 270 bytes .../items/jelled_slime_chestplate.png | Bin 0 -> 307 bytes .../textures/items/jelled_slime_helmet.png | Bin 0 -> 253 bytes .../textures/items/jelled_slime_leggings.png | Bin 0 -> 257 bytes .../textures/items/juice_apple.png | Bin 0 -> 307 bytes .../textures/items/juice_beetroot.png | Bin 0 -> 306 bytes .../textures/items/juice_cactus.png | Bin 0 -> 306 bytes .../textures/items/juice_carrot.png | Bin 0 -> 306 bytes .../textures/items/juice_chorus_fruit.png | Bin 0 -> 306 bytes .../textures/items/juice_glistering_melon.png | Bin 0 -> 307 bytes .../textures/items/juice_golden_apple.png | Bin 0 -> 303 bytes .../textures/items/juice_golden_carrot.png | Bin 0 -> 303 bytes .../textures/items/juice_melon.png | Bin 0 -> 306 bytes .../textures/items/juice_pumpkin.png | Bin 0 -> 306 bytes .../textures/items/lifeblood_crystal.png | Bin 0 -> 422 bytes .../textures/items/rain_collector.png | Bin 0 -> 431 bytes .../textures/items/respirator.png | Bin 0 -> 348 bytes .../textures/items/season_clock_00.png | Bin 0 -> 362 bytes .../textures/items/season_clock_01.png | Bin 0 -> 348 bytes .../textures/items/season_clock_02.png | Bin 0 -> 362 bytes .../textures/items/season_clock_03.png | Bin 0 -> 358 bytes .../textures/items/season_clock_04.png | Bin 0 -> 358 bytes .../textures/items/season_clock_05.png | Bin 0 -> 349 bytes .../textures/items/season_clock_06.png | Bin 0 -> 353 bytes .../textures/items/season_clock_07.png | Bin 0 -> 349 bytes .../textures/items/season_clock_08.png | Bin 0 -> 349 bytes .../textures/items/season_clock_09.png | Bin 0 -> 346 bytes .../textures/items/season_clock_10.png | Bin 0 -> 343 bytes .../textures/items/season_clock_11.png | Bin 0 -> 341 bytes .../textures/items/season_clock_12.png | Bin 0 -> 340 bytes .../textures/items/season_clock_13.png | Bin 0 -> 337 bytes .../textures/items/season_clock_14.png | Bin 0 -> 345 bytes .../textures/items/season_clock_15.png | Bin 0 -> 345 bytes .../textures/items/season_clock_16.png | Bin 0 -> 347 bytes .../textures/items/season_clock_17.png | Bin 0 -> 342 bytes .../textures/items/season_clock_18.png | Bin 0 -> 345 bytes .../textures/items/season_clock_19.png | Bin 0 -> 342 bytes .../textures/items/season_clock_20.png | Bin 0 -> 350 bytes .../textures/items/season_clock_21.png | Bin 0 -> 354 bytes .../textures/items/season_clock_22.png | Bin 0 -> 348 bytes .../textures/items/season_clock_23.png | Bin 0 -> 355 bytes .../toughasnails/textures/items/tan_icon.png | Bin 0 -> 257 bytes .../textures/items/thermometer_00.png | Bin 0 -> 251 bytes .../textures/items/thermometer_01.png | Bin 0 -> 257 bytes .../textures/items/thermometer_02.png | Bin 0 -> 255 bytes .../textures/items/thermometer_03.png | Bin 0 -> 259 bytes .../textures/items/thermometer_04.png | Bin 0 -> 255 bytes .../textures/items/thermometer_05.png | Bin 0 -> 253 bytes .../textures/items/thermometer_06.png | Bin 0 -> 257 bytes .../textures/items/thermometer_07.png | Bin 0 -> 254 bytes .../textures/items/thermometer_08.png | Bin 0 -> 254 bytes .../textures/items/thermometer_09.png | Bin 0 -> 253 bytes .../textures/items/thermometer_10.png | Bin 0 -> 257 bytes .../textures/items/thermometer_11.png | Bin 0 -> 253 bytes .../textures/items/thermometer_12.png | Bin 0 -> 255 bytes .../textures/items/thermometer_13.png | Bin 0 -> 258 bytes .../textures/items/thermometer_14.png | Bin 0 -> 258 bytes .../textures/items/thermometer_15.png | Bin 0 -> 258 bytes .../textures/items/thermometer_16.png | Bin 0 -> 258 bytes .../textures/items/thermometer_17.png | Bin 0 -> 254 bytes .../textures/items/thermometer_18.png | Bin 0 -> 256 bytes .../textures/items/thermometer_19.png | Bin 0 -> 256 bytes .../textures/items/thermometer_20.png | Bin 0 -> 252 bytes .../textures/items/wool_boots.png | Bin 0 -> 283 bytes .../textures/items/wool_chestplate.png | Bin 0 -> 331 bytes .../textures/items/wool_helmet.png | Bin 0 -> 291 bytes .../textures/items/wool_leggings.png | Bin 0 -> 303 bytes .../armor/jelled_slime_armor_layer_1.png | Bin 0 -> 1314 bytes .../armor/jelled_slime_armor_layer_2.png | Bin 0 -> 821 bytes .../models/armor/respirator_layer_1.png | Bin 0 -> 340 bytes .../models/armor/wool_armor_layer_1.png | Bin 0 -> 3053 bytes .../models/armor/wool_armor_layer_2.png | Bin 0 -> 1577 bytes .../textures/particles/particles.png | Bin 0 -> 665 bytes .../textures/potions/TANPotionFX.png | Bin 0 -> 3019 bytes .../src/main/resources/mcmod.info | 10 + .../src/main/resources/pack.mcmeta | 6 + .../src/main/resources/version.properties | 2 + 409 files changed, 17204 insertions(+) create mode 100644 forge-1.10.2-12.18.3.2422-mdk/.gitignore create mode 100644 forge-1.10.2-12.18.3.2422-mdk/LICENSE-new.txt create mode 100644 forge-1.10.2-12.18.3.2422-mdk/README.txt create mode 100644 forge-1.10.2-12.18.3.2422-mdk/build.gradle create mode 100644 forge-1.10.2-12.18.3.2422-mdk/gradle.properties create mode 100644 forge-1.10.2-12.18.3.2422-mdk/gradle/wrapper/gradle-wrapper.jar create mode 100644 forge-1.10.2-12.18.3.2422-mdk/gradle/wrapper/gradle-wrapper.properties create mode 100644 forge-1.10.2-12.18.3.2422-mdk/gradlew.bat create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/HealthHelper.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/ITANBlock.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/TANBlocks.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/TANCapabilities.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/TANPotions.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/achievement/TANAchievements.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/config/GameplayOption.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/config/ISyncedOption.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/config/SyncedConfig.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/item/IColoredItem.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/item/ItemDrink.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/item/TANItems.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/season/IDecayableCrop.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/season/IHibernatingCrop.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/season/ISeasonData.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/season/Season.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/season/SeasonHelper.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/season/WorldHooks.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/stat/IPlayerStat.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/stat/PlayerStatRegistry.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/stat/StatHandlerBase.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/stat/capability/CapabilityProvider.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/stat/capability/ITemperature.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/stat/capability/IThirst.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/temperature/ITemperatureRegulator.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/temperature/Temperature.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/temperature/TemperatureHelper.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/temperature/TemperatureScale.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/thirst/IDrink.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/thirst/ThirstHelper.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/thirst/WaterType.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/ASMHelper.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/ObfHelper.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/TANLoadingPlugin.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/transformer/CropDecayTransformer.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/transformer/EntityRendererTransformer.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/transformer/InterfaceCheckVisitor.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/transformer/WorldTransformer.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockGlowstoneTorch.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockRainCollector.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockSeasonSensor.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockTANCampfire.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockTANDeadCrops.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockTANGas.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockTANGeneric.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockTANTemperatureCoil.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockTANTorchNew.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/client/gui/GuiFactory.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/client/gui/GuiTANConfig.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/command/TANCommand.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/config/CropGrowConfigEntry.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/config/GameplayConfigurationHandler.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/config/SyncedConfigHandler.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/config/TANConfig.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/core/ClientProxy.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/core/CommonProxy.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/core/ToughAsNails.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/entities/EntityFreeze.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/entities/ModelFreeze.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/entities/RenderFreeze.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/entities/projectile/EntityIceball.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/entities/projectile/RenderIceball.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/AchievementEventHandler.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/BlockHarvestEventHandler.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/ExtendedStatHandler.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/LootTableEventHandler.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/PacketHandler.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/health/HealthOverlayHandler.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/health/MaxHealthHandler.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/season/ProviderIceHandler.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/season/RandomUpdateHandler.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/season/SeasonHandler.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/season/SeasonSleepHandler.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/season/StopSpawnHandler.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/season/WeatherFrequencyHandler.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/temperature/TemperatureDebugOverlayHandler.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/temperature/TemperatureOverlayHandler.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/thirst/FillBottleHandler.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/thirst/ThirstOverlayHandler.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/thirst/ThirstStatHandler.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/thirst/VanillaDrinkHandler.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModAchievements.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModBlocks.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModConfig.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModCrafting.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModEntities.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModHandlers.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModItems.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModPotions.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModStats.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModVanillaCompat.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemBottleOfGas.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemCanteen.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemFruitJuice.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemIceCharge.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemLifebloodCrystal.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemRespirator.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemSeasonClock.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemTANBlock.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemTANSpawnEgg.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemTANWaterBottle.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemThermometer.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/network/message/MessageSyncConfigs.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/network/message/MessageSyncSeasonCycle.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/network/message/MessageTemperatureClient.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/network/message/MessageToggleUI.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/network/message/MessageUpdateStat.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/particle/EntitySnowflakeFX.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/particle/TANParticleTypes.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/potion/PotionColdResistance.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/potion/PotionHeatResistance.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/potion/PotionHyperthermia.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/potion/PotionHypothermia.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/potion/PotionThirst.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/potion/TANPotion.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/season/ISeasonedWorld.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/season/SeasonASMHelper.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/season/SeasonSavedData.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/season/SeasonTime.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/BlockTemperatureData.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/MaterialTemperatureData.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/TemperatureDebugger.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/TemperatureHandler.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/TemperatureStorage.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/TemperatureTrend.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/AltitudeModifier.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/ArmorModifier.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/BiomeModifier.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/ObjectProximityModifier.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/PlayerStateModifier.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/SeasonModifier.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/TemperatureModifier.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/TimeModifier.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/WeatherModifier.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/thirst/ThirstHandler.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/thirst/ThirstStorage.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/tileentity/TileEntitySeasonSensor.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/tileentity/TileEntityTemperatureSpread.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/BiomeUtils.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/BlockStateUtils.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/MapUtils.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/PotionBrewingRecipe.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/RenderUtils.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/SeasonColourUtil.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/block/VariantPagingHelper.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/inventory/CreativeTabTAN.java create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/META-INF/toughasnails_at.cfg create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/campfire.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/dead_crops.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/glowstone_torch.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/rain_collector.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/season_sensor_autumn.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/season_sensor_spring.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/season_sensor_summer.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/season_sensor_winter.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/temperature_coil.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/torch_new.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/lang/en_US.lang create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/lang/fr_FR.lang create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/lang/hu_HU.lang create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/lang/pt_PT.lang create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/lang/zh_CN.lang create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/campfire.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/campfire_out.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/chiller.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/cooling_coil_off.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/cooling_coil_on.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/dead_crops.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/fireplace.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/glowstone_torch.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/glowstone_torch_wall.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/heating_coil_off.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/heating_coil_on.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/new_torch.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/new_torch_wall.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/rain_collector_empty.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/rain_collector_level1.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/rain_collector_level2.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/rain_collector_level3.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/season_sensor_autumn.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/season_sensor_spring.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/season_sensor_summer.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/season_sensor_winter.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/air_filter.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/bottle_of_blackdamp.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/bottle_of_firedamp.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/bottle_of_stinkdamp.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/bottle_of_whitedamp.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/campfire.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/canteen.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/canteen_empty.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/canteen_filled.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/charcoal_filter.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/chiller.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/cooling_coil.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/dead_crops.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/dirty_water_bottle.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/filtered_water_bottle.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/fireplace.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/freeze_powder.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/freeze_rod.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/glowstone_torch.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/heating_coil.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/ice_charge.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/ice_cube.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/jelled_slime.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/jelled_slime_boots.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/jelled_slime_chestplate.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/jelled_slime_helmet.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/jelled_slime_leggings.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_apple.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_beetroot.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_cactus.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_carrot.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_chorus_fruit.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_glistering_melon.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_golden_apple.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_golden_carrot.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_melon.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_pumpkin.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/lifeblood_crystal.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/rain_collector.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/respirator.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_00.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_01.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_02.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_03.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_04.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_05.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_06.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_07.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_08.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_09.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_10.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_11.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_12.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_13.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_14.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_15.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_16.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_17.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_18.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_19.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_20.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_21.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_22.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_23.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_sensor_autumn.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_sensor_spring.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_sensor_summer.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_sensor_winter.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/spawn_egg_freeze.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/tan_icon.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_00.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_01.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_02.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_03.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_04.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_05.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_06.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_07.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_08.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_09.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_10.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_11.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_12.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_13.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_14.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_15.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_16.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_17.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_18.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_19.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_20.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/torch_new.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/wool_boots.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/wool_chestplate.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/wool_helmet.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/wool_leggings.json create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/chiller.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/cooling_coil_off.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/cooling_coil_on.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/dead_crops.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/glowstone_torch.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/heating_coil_off.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/heating_coil_on.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/log_burnt.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/log_burnt_top.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/rain_collector_bottom.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/rain_collector_inner.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/rain_collector_side.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/rain_collector_top.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/season_sensor_autumn_top.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/season_sensor_side.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/season_sensor_spring_top.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/season_sensor_summer_top.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/season_sensor_winter_top.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/torch_off.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/entity/freeze.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/gui/fire_vignette.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/gui/ice_vignette.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/gui/logo.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/gui/overlay.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/air_filter.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/bottle_of_blackdamp.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/bottle_of_firedamp.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/bottle_of_stinkdamp.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/bottle_of_whitedamp.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/campfire.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/canteen_empty.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/canteen_filled.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/charcoal_filter.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/cooling_coil.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/dew_leaf.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/dirty_water_bottle.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/filtered_water_bottle.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/freeze_powder.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/freeze_rod.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/heating_coil.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/ice_charge.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/ice_cube.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/jelled_slime.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/jelled_slime_boots.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/jelled_slime_chestplate.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/jelled_slime_helmet.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/jelled_slime_leggings.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/juice_apple.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/juice_beetroot.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/juice_cactus.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/juice_carrot.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/juice_chorus_fruit.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/juice_glistering_melon.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/juice_golden_apple.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/juice_golden_carrot.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/juice_melon.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/juice_pumpkin.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/lifeblood_crystal.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/rain_collector.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/respirator.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_00.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_01.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_02.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_03.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_04.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_05.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_06.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_07.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_08.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_09.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_10.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_11.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_12.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_13.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_14.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_15.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_16.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_17.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_18.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_19.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_20.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_21.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_22.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_23.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/tan_icon.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_00.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_01.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_02.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_03.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_04.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_05.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_06.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_07.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_08.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_09.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_10.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_11.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_12.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_13.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_14.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_15.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_16.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_17.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_18.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_19.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_20.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/wool_boots.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/wool_chestplate.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/wool_helmet.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/wool_leggings.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/models/armor/jelled_slime_armor_layer_1.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/models/armor/jelled_slime_armor_layer_2.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/models/armor/respirator_layer_1.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/models/armor/wool_armor_layer_1.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/models/armor/wool_armor_layer_2.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/particles/particles.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/potions/TANPotionFX.png create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/mcmod.info create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/pack.mcmeta create mode 100644 forge-1.10.2-12.18.3.2422-mdk/src/main/resources/version.properties diff --git a/forge-1.10.2-12.18.3.2422-mdk/.gitignore b/forge-1.10.2-12.18.3.2422-mdk/.gitignore new file mode 100644 index 00000000..2c770e09 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/.gitignore @@ -0,0 +1,22 @@ +# eclipse +bin +*.launch +.settings +.metadata +.classpath +.project + +# idea +out +*.ipr +*.iws +*.iml +.idea + +# gradle +build +.gradle + +# other +eclipse +run diff --git a/forge-1.10.2-12.18.3.2422-mdk/LICENSE-new.txt b/forge-1.10.2-12.18.3.2422-mdk/LICENSE-new.txt new file mode 100644 index 00000000..be2c9e66 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/LICENSE-new.txt @@ -0,0 +1,483 @@ +Minecraft Forge is licensed under the terms of the LGPL 2.1 found +here http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt and copied +below. + +A note on authorship: +All source artifacts are property of their original author, with +the exclusion of the contents of the patches directory and others +copied from it from time to time. Authorship of the contents of +the patches directory is retained by the Minecraft Forge project. +This is because the patches are partially machine generated +artifacts, and are changed heavily due to the way forge works. +Individual attribution within them is impossible. + +Consent: +All contributions to Forge must consent to the release of any +patch content to the Forge project. + +A note on infectivity: +The LGPL is chosen specifically so that projects may depend on Forge +features without being infected with its license. That is the +purpose of the LGPL. Mods and others using this code via ordinary +Java mechanics for referencing libraries are specifically not bound +by Forge's license for the Mod code. + + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/forge-1.10.2-12.18.3.2422-mdk/README.txt b/forge-1.10.2-12.18.3.2422-mdk/README.txt new file mode 100644 index 00000000..b45931f4 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/README.txt @@ -0,0 +1,59 @@ +------------------------------------------- +Source installation information for modders +------------------------------------------- +This code follows the Minecraft Forge installation methodology. It will apply +some small patches to the vanilla MCP source code, giving you and it access +to some of the data and functions you need to build a successful mod. + +Note also that the patches are built against "unrenamed" MCP source code (aka +srgnames) - this means that you will not be able to read them directly against +normal code. + +Source pack installation information: + +Standalone source installation +============================== + +Step 1: Open your command-line and browse to the folder where you extracted the zip file. + +Step 2: Once you have a command window up in the folder that the downloaded material was placed, type: + +Windows: "gradlew setupDecompWorkspace" +Linux/Mac OS: "./gradlew setupDecompWorkspace" + +Step 3: After all that finished, you're left with a choice. +For eclipse, run "gradlew eclipse" (./gradlew eclipse if you are on Mac/Linux) + +If you preffer to use IntelliJ, steps are a little different. +1. Open IDEA, and import project. +2. Select your build.gradle file and have it import. +3. Once it's finished you must close IntelliJ and run the following command: + +"gradlew genIntellijRuns" (./gradlew genIntellijRuns if you are on Mac/Linux) + +Step 4: The final step is to open Eclipse and switch your workspace to /eclipse/ (if you use IDEA, it should automatically start on your project) + +If at any point you are missing libraries in your IDE, or you've run into problems you can run "gradlew --refresh-dependencies" to refresh the local cache. "gradlew clean" to reset everything {this does not effect your code} and then start the processs again. + +Should it still not work, +Refer to #ForgeGradle on EsperNet for more information about the gradle environment. + +Tip: +If you do not care about seeing Minecraft's source code you can replace "setupDecompWorkspace" with one of the following: +"setupDevWorkspace": Will patch, deobfusicated, and gather required assets to run minecraft, but will not generated human readable source code. +"setupCIWorkspace": Same as Dev but will not download any assets. This is useful in build servers as it is the fastest because it does the least work. + +Tip: +When using Decomp workspace, the Minecraft source code is NOT added to your workspace in a editable way. Minecraft is treated like a normal Library. Sources are there for documentation and research purposes and usually can be accessed under the 'referenced libraries' section of your IDE. + +Forge source installation +========================= +MinecraftForge ships with this code and installs it as part of the forge +installation process, no further action is required on your part. + +LexManos' Install Video +======================= +https://www.youtube.com/watch?v=8VEdtQLuLO0&feature=youtu.be + +For more details update more often refer to the Forge Forums: +http://www.minecraftforge.net/forum/index.php/topic,14048.0.html diff --git a/forge-1.10.2-12.18.3.2422-mdk/build.gradle b/forge-1.10.2-12.18.3.2422-mdk/build.gradle new file mode 100644 index 00000000..e2a7937e --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/build.gradle @@ -0,0 +1,93 @@ +buildscript { + repositories { + jcenter() + maven { url = "http://files.minecraftforge.net/maven" } + } + dependencies { + classpath 'net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT' + } +} +apply plugin: 'net.minecraftforge.gradle.forge' +//Only edit below this line, the above code adds and enables the nessasary things for Forge to be setup. + + +version = "1.10.2-1.0" +group= "com.github.glitchfiend.biomesoplenty" // http://maven.apache.org/guides/mini/guide-naming-conventions.html +archivesBaseName = "ToughAsNails" + +sourceCompatibility = targetCompatibility = "1.8" // Need this here so eclipse task generates correctly. +compileJava { + sourceCompatibility = targetCompatibility = "1.8" +} + +minecraft { + version = "1.10.2-12.18.3.2422" + runDir = "run" + + // the mappings can be changed at any time, and must be in the following format. + // snapshot_YYYYMMDD snapshot are built nightly. + // stable_# stables are built at the discretion of the MCP team. + // Use non-default mappings at your own risk. they may not allways work. + // simply re-run your setup task after changing the mappings to update your workspace. + mappings = "snapshot_20161111" + // makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable. +} + +def commonManifest = { + attributes ( + "FMLCorePlugin": 'toughasnails.asm.TANLoadingPlugin', + "FMLCorePluginContainsFMLMod": 'true', + "ForceLoadAsMod": 'true', + "FMLAT": 'toughasnails_at.cfg' + ) +} + +jar { + manifest commonManifest + classifier = 'universal' +} + + +dependencies { + // you may put jars on which you depend on in ./libs + // or you may define them like so.. + //compile "some.group:artifact:version:classifier" + //compile "some.group:artifact:version" + + // real examples + //compile 'com.mod-buildcraft:buildcraft:6.0.8:dev' // adds buildcraft to the dev env + //compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env + + // the 'provided' configuration is for optional dependencies that exist at compile-time but might not at runtime. + //provided 'com.mod-buildcraft:buildcraft:6.0.8:dev' + + // the deobf configurations: 'deobfCompile' and 'deobfProvided' are the same as the normal compile and provided, + // except that these dependencies get remapped to your current MCP mappings + //deobfCompile 'com.mod-buildcraft:buildcraft:6.0.8:dev' + //deobfProvided 'com.mod-buildcraft:buildcraft:6.0.8:dev' + + // for more info... + // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html + // http://www.gradle.org/docs/current/userguide/dependency_management.html + +} + +processResources +{ + // this will ensure that this task is redone when the versions change. + inputs.property "version", project.version + inputs.property "mcversion", project.minecraft.version + + // replace stuff in mcmod.info, nothing else + from(sourceSets.main.resources.srcDirs) { + include 'mcmod.info' + + // replace version and mcversion + expand 'version':project.version, 'mcversion':project.minecraft.version + } + + // copy everything else, thats not the mcmod.info + from(sourceSets.main.resources.srcDirs) { + exclude 'mcmod.info' + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/gradle.properties b/forge-1.10.2-12.18.3.2422-mdk/gradle.properties new file mode 100644 index 00000000..e9b9fd5a --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/gradle.properties @@ -0,0 +1,3 @@ +# Sets default memory used for gradle commands. Can be overridden by user or command line properties. +# This is required to provide enough memory for the Minecraft decompilation process. +org.gradle.jvmargs=-Xmx3G diff --git a/forge-1.10.2-12.18.3.2422-mdk/gradle/wrapper/gradle-wrapper.jar b/forge-1.10.2-12.18.3.2422-mdk/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..30d399d8d2bf522ff5de94bf434a7cc43a9a74b5 GIT binary patch literal 52271 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 pNUL 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 Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_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=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +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/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/HealthHelper.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/HealthHelper.java new file mode 100644 index 00000000..b69ecb4b --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/HealthHelper.java @@ -0,0 +1,63 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.api; + +import java.util.UUID; + +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; + +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.attributes.AttributeModifier; +import net.minecraft.entity.ai.attributes.IAttributeInstance; +import net.minecraft.entity.player.EntityPlayer; + +public class HealthHelper { + public static final UUID STARTING_HEALTH_MODIFIER_ID = UUID.fromString("050F240E-868F-4164-A67E-374084DACA71"); + public static final UUID LIFEBLOOD_HEALTH_MODIFIER_ID = UUID.fromString("B04DB09D-ED8A-4B82-B1EF-ADB425174925"); + + public static int getActiveHearts(EntityPlayer player) { + return Math.min((int) (player.getMaxHealth() / 2), 10); + } + + public static int getInactiveHearts(EntityPlayer player) { + return Math.max(10 - (int) (player.getMaxHealth() / 2), 0); + } + + public static int getLifebloodHearts(EntityPlayer player) { + IAttributeInstance maxHealthInstance = player.getAttributeMap() + .getAttributeInstance(SharedMonsterAttributes.MAX_HEALTH); + AttributeModifier modifier = maxHealthInstance.getModifier(HealthHelper.LIFEBLOOD_HEALTH_MODIFIER_ID); + + if (modifier != null) { + return (int) (modifier.getAmount() / 2.0D); + } + + return 0; + } + + /** Returns true if successful */ + public static boolean addActiveHearts(EntityPlayer player, int hearts) { + IAttributeInstance maxHealthInstance = player.getAttributeMap() + .getAttributeInstance(SharedMonsterAttributes.MAX_HEALTH); + AttributeModifier modifier = maxHealthInstance.getModifier(HealthHelper.LIFEBLOOD_HEALTH_MODIFIER_ID); + float newHealth = player.getMaxHealth() + (hearts * 2); + double existingHearts = modifier != null ? modifier.getAmount() : 0.0D; + + if (newHealth <= 20.0F && newHealth > 0.0F) { + Multimap multimap = HashMultimap. create(); + modifier = new AttributeModifier(HealthHelper.LIFEBLOOD_HEALTH_MODIFIER_ID, "Lifeblood Health Modifier", + existingHearts + hearts * 2, 0); + multimap.put(SharedMonsterAttributes.MAX_HEALTH.getAttributeUnlocalizedName(), modifier); + player.getAttributeMap().applyAttributeModifiers(multimap); + return true; + } + + return false; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/ITANBlock.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/ITANBlock.java new file mode 100644 index 00000000..9ad0ec6b --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/ITANBlock.java @@ -0,0 +1,19 @@ +package toughasnails.api; + +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.state.IBlockState; +import net.minecraft.item.ItemBlock; + +public interface ITANBlock { + + public Class getItemClass(); + + @SuppressWarnings("rawtypes") + public IProperty[] getPresetProperties(); + + @SuppressWarnings("rawtypes") + public IProperty[] getNonRenderingProperties(); + + public String getStateName(IBlockState state); + +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/TANBlocks.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/TANBlocks.java new file mode 100644 index 00000000..191d9dad --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/TANBlocks.java @@ -0,0 +1,16 @@ +package toughasnails.api; + +import net.minecraft.block.Block; + +public class TANBlocks +{ + public static Block campfire; + public static Block gas; + public static Block temperature_coil; + public static Block rain_collector; + public static Block torch_new; + public static Block glowstone_torch; + public static Block dead_crops; + + public static Block[] season_sensors = new Block[4]; +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/TANCapabilities.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/TANCapabilities.java new file mode 100644 index 00000000..4da4d077 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/TANCapabilities.java @@ -0,0 +1,21 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.api; + +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.CapabilityInject; +import toughasnails.api.stat.capability.ITemperature; +import toughasnails.api.stat.capability.IThirst; + +public class TANCapabilities +{ + @CapabilityInject(ITemperature.class) + public static final Capability TEMPERATURE = null; + @CapabilityInject(IThirst.class) + public static final Capability THIRST = null; +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/TANPotions.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/TANPotions.java new file mode 100644 index 00000000..505b4ed4 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/TANPotions.java @@ -0,0 +1,18 @@ +package toughasnails.api; + +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionType; + +public class TANPotions +{ + public static Potion hypothermia; + public static Potion hyperthermia; + public static Potion thirst; + public static Potion cold_resistance; + public static Potion heat_resistance; + + public static PotionType cold_resistance_type; + public static PotionType long_cold_resistance_type; + public static PotionType heat_resistance_type; + public static PotionType long_heat_resistance_type; +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/achievement/TANAchievements.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/achievement/TANAchievements.java new file mode 100644 index 00000000..6c6505da --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/achievement/TANAchievements.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.api.achievement; + +import net.minecraft.stats.Achievement; + +public class TANAchievements +{ + public static Achievement thirst_quencher; + public static Achievement campfire_song; + public static Achievement life_or_death; + public static Achievement thirst_ender; + public static Achievement hot_or_cold; + public static Achievement that_time_of_year; + public static Achievement into_ice; + public static Achievement year_one; +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/config/GameplayOption.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/config/GameplayOption.java new file mode 100644 index 00000000..224d6289 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/config/GameplayOption.java @@ -0,0 +1,52 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.api.config; + +public enum GameplayOption implements ISyncedOption { + ENABLE_LOWERED_STARTING_HEALTH("Enable Lowered Starting Health"), // + ENABLE_THIRST("Enable Thirst"), // + ENABLE_TEMPERATURE("Enable Body Temperature"), // + ENABLE_SEASONS("Enable Seasons"), // + DRINKS("Drinks"), // + OVERRIDE_THERMOMETER_LIMITS("Override Thermometer Limits"), // + THERMOMETER_LOWER_BOUND("Thermometer Lower Bound"), // + THERMOMETER_UPPER_BOUND("Thermometer Upper Bound"), // + RAIN_CHILL("Enable Rain Chill on World Blocks"), // + BIOME_TEMP_MODIFIER("Biome Temperature Modification Scaling"), // + ALTITUDE_TEMP_MODIFIER("Altitude Temperature Modification Scaling"), // + WET_TEMP_MODIFIER("Temperature Modifier for being Wet"), // + SNOW_TEMP_MODIFIER("Temperature Modifier for Snow"), // + TIME_TEMP_MODIFIER("Time of Day Temperature Modification Scaling"), // + TIME_EXTREMITY_MODIFIER("Temperature Scaling for Time of Day Extremities"), // + EARLY_AUTUMN_MODIFIER("Temperature Modifier for the EARLY_AUTUMN Season"), // + MID_AUTUMN_MODIFIER("Temperature Modifier for the MID_AUTUMN Season"), // + LATE_AUTUMN_MODIFIER("Temperature Modifier for the LATE_AUTUMN Season"), // + EARLY_WINTER_MODIFIER("Temperature Modifier for the EARLY_WINTER Season"), // + MID_WINTER_MODIFIER("Temperature Modifier for the MID_WINTER Season"), // + LATE_WINTER_MODIFIER("Temperature Modifier for the LATE_WINTER Season"), // + EARLY_SPRING_MODIFIER("Temperature Modifier for the EARLY_SPRING Season"), // + MID_SPRING_MODIFIER("Temperature Modifier for the MID_SPRING Season"), // + LATE_SPRING_MODIFIER("Temperature Modifier for the LATE_SPRING Season"), // + EARLY_SUMMER_MODIFIER("Temperature Modifier for the EARLY_SUMMER Season"), // + MID_SUMMER_MODIFIER("Temperature Modifier for the MID_SUMMER Season"), // + LATE_SUMMER_MODIFIER("Temperature Modifier for the LATE_SUMMER Season"), // + TEMPERATURE_WITHERING("Crops Wither by Temperature"), // + HIBERNATING("Crops which Hibernate and don't Decay"), // + CROPS("Crops"); + + private final String optionName; + + private GameplayOption(String name) { + this.optionName = name; + } + + @Override + public String getOptionName() { + return this.optionName; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/config/ISyncedOption.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/config/ISyncedOption.java new file mode 100644 index 00000000..99e6d94c --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/config/ISyncedOption.java @@ -0,0 +1,13 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.api.config; + +public interface ISyncedOption +{ + String getOptionName(); +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/config/SyncedConfig.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/config/SyncedConfig.java new file mode 100644 index 00000000..e5f25a32 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/config/SyncedConfig.java @@ -0,0 +1,55 @@ +package toughasnails.api.config; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import com.google.common.collect.Maps; + +public class SyncedConfig { + public static Map optionsToSync = Maps + .newHashMap(); + + public static void addOption(ISyncedOption option, String defaultValue) { + optionsToSync.put(option.getOptionName(), + new SyncedConfigEntry(defaultValue)); + } + + public static boolean getBooleanValue(ISyncedOption option) { + return Boolean.valueOf(optionsToSync.get(option.getOptionName()).value); + } + + public static int getIntegerValue(ISyncedOption option) { + return Integer.valueOf(optionsToSync.get(option.getOptionName()).value); + } + + public static float getFloatValue(ISyncedOption option) { + return Float.valueOf(optionsToSync.get(option.getOptionName()).value); + } + + public static List getListValue(ISyncedOption option) { + SyncedConfigEntry value = optionsToSync.get(option.getOptionName()); + String rawList = value.value; + List result = new ArrayList(); + for (String drinkEntry : rawList.split(",")) { + result.add(drinkEntry); + } + return result; + } + + public static void restoreDefaults() { + for (SyncedConfigEntry entry : optionsToSync.values()) { + entry.value = entry.defaultValue; + } + } + + public static class SyncedConfigEntry { + public String value; + public final String defaultValue; + + public SyncedConfigEntry(String defaultValue) { + this.defaultValue = defaultValue; + this.value = defaultValue; + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/item/IColoredItem.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/item/IColoredItem.java new file mode 100644 index 00000000..9388b848 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/item/IColoredItem.java @@ -0,0 +1,18 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.api.item; + +import net.minecraft.client.renderer.color.IItemColor; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +public interface IColoredItem +{ + @SideOnly(Side.CLIENT) + public IItemColor getItemColor(); +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/item/ItemDrink.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/item/ItemDrink.java new file mode 100644 index 00000000..4f95644d --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/item/ItemDrink.java @@ -0,0 +1,92 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.api.item; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; +import net.minecraft.item.EnumAction; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.ActionResult; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumHand; +import net.minecraft.world.World; +import toughasnails.api.TANPotions; +import toughasnails.api.config.GameplayOption; +import toughasnails.api.config.SyncedConfig; +import toughasnails.api.stat.capability.IThirst; +import toughasnails.api.thirst.IDrink; +import toughasnails.api.thirst.ThirstHelper; +import toughasnails.thirst.ThirstHandler; + +public abstract class ItemDrink & IDrink> extends Item { + + public ItemDrink() { + this.setMaxStackSize(1); + this.setHasSubtypes(true); + this.setMaxDamage(0); + } + + @Override + public ActionResult onItemRightClick(ItemStack stack, + World world, EntityPlayer player, EnumHand hand) { + ThirstHandler thirstHandler = (ThirstHandler) ThirstHelper + .getThirstData(player); + + if (thirstHandler.isThirsty()) { + player.setActiveHand(hand); + } + + return new ActionResult(EnumActionResult.SUCCESS, stack); + } + + @Override + public ItemStack onItemUseFinish(ItemStack stack, World world, + EntityLivingBase entity) { + if (!world.isRemote && entity instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) entity; + IThirst thirst = ThirstHelper.getThirstData(player); + T type = getTypeFromMeta(stack.getMetadata()); + + thirst.addStats(type.getThirst(), type.getHydration()); + addEffects(player, type); + + return new ItemStack(Items.GLASS_BOTTLE); + } + + return stack; + } + + public void addEffects(EntityPlayer player, T type) { + if (player.getEntityWorld().rand.nextFloat() < type.getPoisonChance() + && SyncedConfig.getBooleanValue(GameplayOption.ENABLE_THIRST)) { + player.addPotionEffect(new PotionEffect(TANPotions.thirst, 600)); + } + } + + public abstract T getTypeFromMeta(int meta); + + @Override + public int getMaxItemUseDuration(ItemStack stack) { + return 32; + } + + @Override + public EnumAction getItemUseAction(ItemStack stack) { + return EnumAction.DRINK; + } + + // default behavior in Item is to return 0, but the meta value is important + // here because it determines which dart type to use + @Override + public int getMetadata(int metadata) { + return metadata; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/item/TANItems.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/item/TANItems.java new file mode 100644 index 00000000..e9b1b1e3 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/item/TANItems.java @@ -0,0 +1,45 @@ +package toughasnails.api.item; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemArmor.ArmorMaterial; + +public class TANItems +{ + public static Item tan_icon; + + public static Item canteen; + public static Item fruit_juice; + public static Item water_bottle; + public static Item thermometer; + + //public static Item bottle_of_gas; + + //public static Item respirator; + + public static Item wool_helmet; + public static Item wool_chestplate; + public static Item wool_leggings; + public static Item wool_boots; + public static Item jelled_slime_helmet; + public static Item jelled_slime_chestplate; + public static Item jelled_slime_leggings; + public static Item jelled_slime_boots; + + public static Item jelled_slime; + public static Item freeze_rod; + public static Item freeze_powder; + public static Item ice_cube; + public static Item ice_charge; + public static Item charcoal_filter; + //public static Item air_filter; + + public static Item lifeblood_crystal; + + public static Item season_clock; + + public static Item spawn_egg; + + public static ArmorMaterial wool_armor_material; + public static ArmorMaterial jelled_slime_armor_material; + public static ArmorMaterial respirator_material; +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/season/IDecayableCrop.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/season/IDecayableCrop.java new file mode 100644 index 00000000..b2ce0a94 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/season/IDecayableCrop.java @@ -0,0 +1,21 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.api.season; + +/** + * A marker interface which should be implemented by crops which decay in the + * winter in the absence of proper heating. + * + * Please note that due to how Java bytecode works, you must explicitly + * implement this interface if your class overrides updateTick. + */ +public interface IDecayableCrop { + + // Crop will only decay in winter if this returns true + boolean shouldDecay(); +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/season/IHibernatingCrop.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/season/IHibernatingCrop.java new file mode 100644 index 00000000..95cda4ac --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/season/IHibernatingCrop.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ + +package toughasnails.api.season; + +/** + * An interface which should be implemented by crops which become inactive in + * the winter in the absence of proper heating. + * + * Crops using this interface in 1.10 should make sure they use Forge's crop + * growth events and appropriately cancel the crop growth when the event result + * is set to DENY. (See net.minecraftforge.event.BlockEvent$CropGrowEvent or + * alternatively net.minecraftforge.common.ForgeHooks.onCropsGrowPre) + * + * Please note that due to how Java bytecode works, you must explicitly + * implement this interface if your class overrides updateTick. + */ +public interface IHibernatingCrop { + + // Crop will only hibernate in winter if this returns true + boolean shouldHibernate(); +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/season/ISeasonData.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/season/ISeasonData.java new file mode 100644 index 00000000..33b76735 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/season/ISeasonData.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.api.season; + +import toughasnails.api.season.Season.SubSeason; + +public interface ISeasonData +{ + /** + * The elapsed time in ticks for the current season cycle. + * Cycles are split into seasons rather than sub seasons + * i.e. Summer, Autumn, Winter and Spring. + * + * @return The time in ticks + */ + int getSeasonCycleTicks(); + + + SubSeason getSubSeason(); +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/season/Season.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/season/Season.java new file mode 100644 index 00000000..fb71cd97 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/season/Season.java @@ -0,0 +1,74 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.api.season; + +public enum Season +{ + SPRING, SUMMER, AUTUMN, WINTER; + + public static enum SubSeason + { + EARLY_SPRING(SPRING, 0x778087, 0.85F, 0x6F818F, 0.85F), + MID_SPRING(SPRING, 0x6F818F, 0x5F849F), + LATE_SPRING(SPRING, 0x678297, 0x3F89BF), + EARLY_SUMMER(SUMMER, 0x73808B, 0x5F849F), + MID_SUMMER(SUMMER, 0xFFFFFF, 0xFFFFFF), + LATE_SUMMER(SUMMER, 0x877777, 0x9F5F5F), + EARLY_AUTUMN(AUTUMN, 0x8F6F6F, 0xB74747), + MID_AUTUMN(AUTUMN, 0x9F5F5F, 0xCF2F2F), + LATE_AUTUMN(AUTUMN, 0xAF4F4F, 0.85F, 0xBF3F3F, 0.85F), + EARLY_WINTER(WINTER, 0x9F5F5F, 0.60F, 0xA75757, 0.60F), + MID_WINTER(WINTER, 0x8F6F6F, 0.45F, 0x9F5F5F, 0.45F), + LATE_WINTER(WINTER, 0xFFFFFF, 0.60F, 0x8F6F6F, 0.60F); + + private Season season; + private int grassOverlay; + private float grassSaturationMultiplier; + private int foliageOverlay; + private float foliageSaturationMultiplier; + + private SubSeason(Season season, int grassColour, float grassSaturation, int foliageColour, float foliageSaturation) + { + this.season = season; + this.grassOverlay = grassColour; + this.grassSaturationMultiplier = grassSaturation; + this.foliageOverlay = foliageColour; + this.foliageSaturationMultiplier = foliageSaturation; + } + + private SubSeason(Season season, int grassColour, int foliageColour) + { + this(season, grassColour, -1, foliageColour, -1); + } + + public Season getSeason() + { + return this.season; + } + + public int getGrassOverlay() + { + return this.grassOverlay; + } + + public float getGrassSaturationMultiplier() + { + return this.grassSaturationMultiplier; + } + + public int getFoliageOverlay() + { + return this.foliageOverlay; + } + + public float getFoliageSaturationMultiplier() + { + return this.foliageSaturationMultiplier; + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/season/SeasonHelper.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/season/SeasonHelper.java new file mode 100644 index 00000000..392a0cf8 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/season/SeasonHelper.java @@ -0,0 +1,56 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.api.season; + +import net.minecraft.world.World; +import toughasnails.api.config.SyncedConfig; +import toughasnails.api.config.GameplayOption; + +public class SeasonHelper +{ + /** + * Obtains data about the state of the season cycle in the world. This works both on + * the client and the server. + */ + public static ISeasonData getSeasonData(World world) + { + ISeasonData data; + + try + { + if (!world.isRemote) + { + data = (ISeasonData)Class.forName("toughasnails.handler.season.SeasonHandler").getMethod("getServerSeasonData", World.class).invoke(null, world); + } + else + { + data = (ISeasonData)Class.forName("toughasnails.handler.season.SeasonHandler").getMethod("getClientSeasonData").invoke(null); + } + } + catch (Exception e) + { + throw new RuntimeException("An error occurred obtaining season data", e); + } + + return data; + } + + /** + * Checks if the season provided allows snow to fall at a certain + * biome temperature. + * + * @param season The season to check + * @param temperature The biome temperature to check + * @return True if suitable, otherwise false + */ + public static boolean canSnowAtTempInSeason(Season season, float temperature) + { + //If we're in winter, the temperature can be anything equal to or below 0.7 + return temperature < 0.15F || (season == Season.WINTER && temperature <= 0.7F && SyncedConfig.getBooleanValue(GameplayOption.ENABLE_SEASONS)); + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/season/WorldHooks.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/season/WorldHooks.java new file mode 100644 index 00000000..6c490ca9 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/season/WorldHooks.java @@ -0,0 +1,52 @@ +package toughasnails.api.season; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public class WorldHooks +{ + /** + * An override of {@link World#canSnowAt(BlockPos, boolean)} + */ + public static boolean canSnowAtInSeason(World world, BlockPos pos, boolean checkLight, Season season) + { + try + { + return (Boolean)Class.forName("toughasnails.season.SeasonASMHelper").getMethod("canSnowAtInSeason", World.class, BlockPos.class, Boolean.class, Season.class).invoke(null, world, pos, checkLight, season); + } + catch (Exception e) + { + throw new RuntimeException("An error occurred calling canSnowAtInSeason", e); + } + } + + /** + * An override of {@link World#canBlockFreeze(BlockPos, boolean)} + */ + public static boolean canBlockFreezeInSeason(World world, BlockPos pos, boolean noWaterAdj, Season season) + { + try + { + return (Boolean)Class.forName("toughasnails.season.SeasonASMHelper").getMethod("canBlockFreezeInSeason", World.class, BlockPos.class, Boolean.class, Season.class).invoke(null, world, pos, noWaterAdj, season); + } + catch (Exception e) + { + throw new RuntimeException("An error occurred calling canBlockFreezeInSeason", e); + } + } + + /** + * An override of {@link World#isRainingAt(BlockPos)} + */ + public static boolean isRainingAtInSeason(World world, BlockPos pos, Season season) + { + try + { + return (Boolean)Class.forName("toughasnails.season.SeasonASMHelper").getMethod("isRainingAtInSeason", World.class, BlockPos.class, Season.class).invoke(null, world, pos, season); + } + catch (Exception e) + { + throw new RuntimeException("An error occurred calling isRainingAtInSeason", e); + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/stat/IPlayerStat.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/stat/IPlayerStat.java new file mode 100644 index 00000000..d4e45652 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/stat/IPlayerStat.java @@ -0,0 +1,23 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.api.stat; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import net.minecraftforge.fml.common.gameevent.TickEvent.Phase; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; + +public interface IPlayerStat +{ + public void update(EntityPlayer player, World world, Phase phase); + + public boolean hasChanged(); + public void onSendClientUpdate(); + + public IMessage createUpdateMessage(); +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/stat/PlayerStatRegistry.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/stat/PlayerStatRegistry.java new file mode 100644 index 00000000..a4df947e --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/stat/PlayerStatRegistry.java @@ -0,0 +1,53 @@ +package toughasnails.api.stat; + +import java.util.HashMap; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; + +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.Capability.IStorage; +import net.minecraftforge.common.capabilities.CapabilityManager; +import toughasnails.api.stat.capability.CapabilityProvider; + +public class PlayerStatRegistry { + private static HashMap> playerStats = Maps.newHashMap(); + private static HashMap> statCapabilities = Maps.newHashMap(); + + @SuppressWarnings("unchecked") + public static void addStat(Class capabilityClass, IStorage storage, + Class implementationClass) { + String identifier = capabilityClass.getName().intern(); + + if (identifier == null) { + throw new RuntimeException("Stat identifier cannot be null!"); + } else if (playerStats.containsKey(identifier)) { + throw new RuntimeException("Stat with identifier " + identifier + " already exists!"); + } + + try { + CapabilityManager.INSTANCE.register(capabilityClass, storage, (Class) implementationClass); + } catch (ClassCastException e) { + throw new IllegalArgumentException("Player stat must implement capability class!"); + } + + playerStats.put(identifier, implementationClass); + } + + public static void registerCapability(Capability capability) { + statCapabilities.put(capability.getName(), capability); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static CapabilityProvider createCapabilityProvider(String identifier) { + return new CapabilityProvider(statCapabilities.get(identifier)); + } + + public static Capability getCapability(String identifier) { + return statCapabilities.get(identifier); + } + + public static ImmutableMap> getCapabilityMap() { + return ImmutableMap.copyOf(statCapabilities); + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/stat/StatHandlerBase.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/stat/StatHandlerBase.java new file mode 100644 index 00000000..cf782e4f --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/stat/StatHandlerBase.java @@ -0,0 +1,14 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.api.stat; + +public abstract class StatHandlerBase implements IPlayerStat +{ + @Override + public void onSendClientUpdate() {} +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/stat/capability/CapabilityProvider.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/stat/capability/CapabilityProvider.java new file mode 100644 index 00000000..5ea465cb --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/stat/capability/CapabilityProvider.java @@ -0,0 +1,28 @@ +package toughasnails.api.stat.capability; + +import net.minecraft.util.EnumFacing; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ICapabilityProvider; + +/** Provides instances of our capability when requested where suitable */ +public class CapabilityProvider implements ICapabilityProvider { + /** The capability this is for */ + private final Capability capability; + private final C instance; + + public CapabilityProvider(Capability capability) { + this.capability = capability; + this.instance = capability.getDefaultInstance(); + } + + @Override + public boolean hasCapability(Capability capability, EnumFacing facing) { + return capability != null && capability == this.capability; + } + + @SuppressWarnings("unchecked") + @Override + public T getCapability(Capability capability, EnumFacing facing) { + return capability != null && capability == this.capability ? (T) this.instance : null; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/stat/capability/ITemperature.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/stat/capability/ITemperature.java new file mode 100644 index 00000000..b38945dc --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/stat/capability/ITemperature.java @@ -0,0 +1,33 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.api.stat.capability; + +import java.util.Map; + +import com.google.common.collect.ImmutableMap; + +import toughasnails.api.stat.IPlayerStat; +import toughasnails.api.temperature.Temperature; +import toughasnails.temperature.modifier.TemperatureModifier.ExternalModifier; + +//TODO: Switch over to using capabilities entirely. In some places it is still assumed that +//this is always implemented by TemperatureStats +public interface ITemperature extends IPlayerStat +{ + public void setTemperature(Temperature temperature); + public void addTemperature(Temperature difference); + public void applyModifier(String name, int amount, int rate, int duration); + public boolean hasModifier(String name); + public Temperature getTemperature(); + + public void setChangeTime(int ticks); + public int getChangeTime(); + + public ImmutableMap getExternalModifiers(); + public void setExternalModifiers(Map externalModifiers); +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/stat/capability/IThirst.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/stat/capability/IThirst.java new file mode 100644 index 00000000..dd12b8fd --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/stat/capability/IThirst.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.api.stat.capability; + +import toughasnails.api.stat.IPlayerStat; + +//TODO: Switch over to using capabilities entirely. In some places it is still assumed that +//this is always implemented by TemperatureStats +public interface IThirst extends IPlayerStat +{ + public void setThirst(int thirst); + public void setHydration(float hydration); + public void setExhaustion(float exhaustion); + public void addStats(int thirst, float hydration); + + public int getThirst(); + public float getHydration(); + public float getExhaustion(); + + public void setChangeTime(int ticks); + public int getChangeTime(); +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/temperature/ITemperatureRegulator.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/temperature/ITemperatureRegulator.java new file mode 100644 index 00000000..109b2e9f --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/temperature/ITemperatureRegulator.java @@ -0,0 +1,16 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.api.temperature; + +import net.minecraft.util.math.BlockPos; + +public interface ITemperatureRegulator +{ + public Temperature getRegulatedTemperature(); + public boolean isPosRegulated(BlockPos pos); +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/temperature/Temperature.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/temperature/Temperature.java new file mode 100644 index 00000000..d55c5f67 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/temperature/Temperature.java @@ -0,0 +1,48 @@ +package toughasnails.api.temperature; + +import toughasnails.api.temperature.TemperatureScale.TemperatureRange; + +public class Temperature +{ + private int rawValue; + private TemperatureRange temperatureRange; + + private int rangeIndex; + private float rangeDelta; + + public Temperature(int scalePos) + { + this.rawValue = scalePos; + this.temperatureRange = TemperatureScale.getTemperatureRange(getRawValue()); + this.rangeIndex = -1; + this.rangeDelta = -1F; + } + + /** The raw value of this temperature on a scale*/ + public int getRawValue() + { + return rawValue; + } + + /** The range in which this temperature belongs */ + public TemperatureRange getRange() + { + return temperatureRange; + } + + public int getRangeIndex(boolean reverseEnd) + { + if (rangeIndex == -1) + return TemperatureScale.getRangeIndex(getRawValue(), reverseEnd); + + return rangeIndex; + } + + public float getRangeDelta(boolean reverseEnd) + { + if (rangeDelta == -1F) + rangeDelta = TemperatureScale.getRangeDelta(getRawValue(), reverseEnd); + + return rangeDelta; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/temperature/TemperatureHelper.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/temperature/TemperatureHelper.java new file mode 100644 index 00000000..a7cc1c12 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/temperature/TemperatureHelper.java @@ -0,0 +1,52 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.api.temperature; + +import java.util.List; + +import com.google.common.collect.Lists; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import toughasnails.api.TANCapabilities; +import toughasnails.api.stat.capability.ITemperature; + +public class TemperatureHelper +{ + public static ITemperature getTemperatureData(EntityPlayer player) + { + return player.getCapability(TANCapabilities.TEMPERATURE, null); + } + + public static List getTemperatureRegulators(World world) + { + List list = Lists.newArrayList(); + + for (TileEntity tileEntity : world.tickableTileEntities) + { + if (tileEntity instanceof ITemperatureRegulator) list.add((ITemperatureRegulator)tileEntity); + } + + return list; + } + + public static boolean isPosClimatisedForTemp(World world, BlockPos pos, Temperature temperature) + { + for (ITemperatureRegulator regulator : getTemperatureRegulators(world)) + { + if (regulator.getRegulatedTemperature().getRawValue() >= temperature.getRawValue() && regulator.isPosRegulated(pos)) + { + return true; + } + } + + return false; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/temperature/TemperatureScale.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/temperature/TemperatureScale.java new file mode 100644 index 00000000..126aca78 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/temperature/TemperatureScale.java @@ -0,0 +1,116 @@ +package toughasnails.api.temperature; + +public class TemperatureScale +{ + private static int scaleTotal = generateTotalScale(); + private static int[] rangeStarts = generateRangeStarts(); + + /**Get the temperature range this position in the overall temperature scale is + * located within*/ + public static TemperatureRange getTemperatureRange(int scalePos) + { + //Ensure the scale position is within the allowed values + if (scalePos < 0 || scalePos > scaleTotal) + { + return null; + } + + for (TemperatureRange range : TemperatureRange.values()) + { + if (scalePos <= rangeStarts[range.ordinal()] + range.rangeSize - 1) + { + return range; + } + } + + throw new RuntimeException("Could not find range for value " + scalePos + ". This should never happen!"); + } + + /**Returns an index within a range, given a position in the overall temperature scale. + * When reversed, 1.0 values are when the input position is closer to 0 in the overall temperature scale*/ + public static int getRangeIndex(int scalePos, boolean reverseEnd) + { + TemperatureRange temperatureRange = getTemperatureRange(scalePos); + + return Math.abs((reverseEnd ? (temperatureRange.getRangeSize() - 1) : 0) - (scalePos - rangeStarts[temperatureRange.ordinal()])); + } + + /**Returns on a scale of 0.0F to 1.0F the location of a temperature within the current range + * When reversed, 1.0 values are when the input position is closer to 0 in the overall temperature scale*/ + public static float getRangeDelta(int scalePos, boolean reverseEnd) + { + return (float)(getRangeIndex(scalePos, reverseEnd) + 1) / (float)getTemperatureRange(scalePos).getRangeSize(); + } + + public static boolean isScalePosInRange(int scalePos, TemperatureRange startRange, TemperatureRange endRange) + { + return scalePos >= rangeStarts[startRange.ordinal()] && scalePos <= (rangeStarts[endRange.ordinal()] + endRange.rangeSize - 1); + } + + public static boolean isScalePosInRange(int scalePos, TemperatureRange range) + { + return isScalePosInRange(scalePos, range, range); + } + + /**Returns the position in the overall temperature scale of this range*/ + public static int getRangeStart(TemperatureRange range) + { + return rangeStarts[range.ordinal()]; + } + + public static int getScaleTotal() + { + return scaleTotal; + } + + private static int generateTotalScale() + { + int totalRange = 0; + + for (TemperatureRange range : TemperatureRange.values()) + { + totalRange += range.getRangeSize(); + } + + return totalRange - 1; + } + + private static int[] generateRangeStarts() + { + int[] generatedStarts = new int[TemperatureRange.values().length]; + + for (int index = 0; index < TemperatureRange.values().length; index++) + { + if (index > 0) + { + TemperatureRange previousRange = TemperatureRange.values()[index - 1]; + + generatedStarts[index] = generatedStarts[previousRange.ordinal()] + previousRange.rangeSize; + } + else generatedStarts[index] = 0; + } + + return generatedStarts; + } + + public static enum TemperatureRange + { + ICY(6), + COOL(5), + MILD(4), + WARM(5), + HOT(6); + + private int rangeSize; + + private TemperatureRange(int rangeSize) + { + this.rangeSize = rangeSize; + } + + public int getRangeSize() + { + return this.rangeSize; + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/thirst/IDrink.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/thirst/IDrink.java new file mode 100644 index 00000000..31c00f32 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/thirst/IDrink.java @@ -0,0 +1,15 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.api.thirst; + +public interface IDrink +{ + public int getThirst(); + public float getHydration(); + public float getPoisonChance(); +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/thirst/ThirstHelper.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/thirst/ThirstHelper.java new file mode 100644 index 00000000..2a93381e --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/thirst/ThirstHelper.java @@ -0,0 +1,20 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.api.thirst; + +import net.minecraft.entity.player.EntityPlayer; +import toughasnails.api.TANCapabilities; +import toughasnails.api.stat.capability.IThirst; + +public class ThirstHelper +{ + public static IThirst getThirstData(EntityPlayer player) + { + return player.getCapability(TANCapabilities.THIRST, null); + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/thirst/WaterType.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/thirst/WaterType.java new file mode 100644 index 00000000..97764d4e --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/api/thirst/WaterType.java @@ -0,0 +1,48 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.api.thirst; + +public enum WaterType +{ + DIRTY("Dirty Water", 3, 0.1F, 0.8F), + FILTERED("Filtered Water", 5, 0.25F, 0.4F), + CLEAN("Clean Water", 7, 0.5F, 0.0F); + + private String description; + private int thirst; + private float hydration; + private float poisonChance; + + private WaterType(String description, int thirst, float hydration, float poisonChance) + { + this.description = description; + this.thirst = thirst; + this.hydration = hydration; + this.poisonChance = poisonChance; + } + + public String getDescription() + { + return this.description; + } + + public int getThirst() + { + return this.thirst; + } + + public float getHydration() + { + return this.hydration; + } + + public float getPoisonChance() + { + return this.poisonChance; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/ASMHelper.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/ASMHelper.java new file mode 100644 index 00000000..aa99683b --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/ASMHelper.java @@ -0,0 +1,112 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.asm; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.objectweb.asm.tree.AbstractInsnNode; +import org.objectweb.asm.tree.MethodInsnNode; +import org.objectweb.asm.tree.MethodNode; +import org.objectweb.asm.util.Printer; +import org.objectweb.asm.util.Textifier; +import org.objectweb.asm.util.TraceMethodVisitor; + +import com.google.common.collect.Lists; + +public class ASMHelper { + public static final Logger LOGGER = LogManager.getLogger("ToughAsNails Transformer"); + + public static boolean methodEquals(MethodNode methodNode, String[] names, String desc) { + boolean nameMatches = false; + + for (String name : names) { + if (methodNode.name.equals(name)) { + nameMatches = true; + break; + } + } + + return nameMatches && methodNode.desc.equals(desc); + } + + public static void clearNextInstructions(MethodNode methodNode, AbstractInsnNode insnNode) { + Iterator iterator = methodNode.instructions + .iterator(methodNode.instructions.indexOf(insnNode)); + + while (iterator.hasNext()) { + iterator.next(); + iterator.remove(); + } + } + + public static MethodInsnNode getUniqueMethodInsnNode(MethodNode methodNode, int opcode, String owner, + String[] names, String desc) { + List matchedMethodNodes = matchMethodInsnNodes(methodNode, opcode, owner, names, desc); + + if (matchedMethodNodes.isEmpty()) + throw new RuntimeException( + "No method instruction node found matching " + owner + " " + names[0] + " " + desc); + if (matchedMethodNodes.size() > 1) + LOGGER.warn("Too many matched instructions were found in " + methodNode.name + " for " + owner + " " + + names[0] + " " + desc + ". Crashes or bugs may occur!"); + + return matchedMethodNodes.get(matchedMethodNodes.size() - 1); + } + + public static List matchMethodInsnNodes(MethodNode methodNode, int opcode, String owner, + String[] names, String desc) { + ArrayList matches = Lists.newArrayList(); + ArrayList validMethodNames = Lists.newArrayList(names); + + for (AbstractInsnNode insnNode : methodNode.instructions.toArray()) { + if (insnNode instanceof MethodInsnNode && insnNode.getOpcode() == opcode) { + MethodInsnNode methodInsnNode = (MethodInsnNode) insnNode; + + if (methodInsnNode.owner.equals(owner) & validMethodNames.contains(methodInsnNode.name) + && methodInsnNode.desc.equals(desc)) { + matches.add(methodInsnNode); + } + } + } + + return matches; + } + + public static void verifyClassHash(String className, byte[] bytes, String... expectedHashes) { + String currentHash = DigestUtils.md5Hex(bytes); + + if (!Lists.newArrayList(expectedHashes).contains(currentHash)) { + String error = String.format("Unexpected hash %s detected for class %s. Crashes or bugs may occur!", + currentHash, className); + LOGGER.error(error); + } else { + LOGGER.info(String.format("Valid hash %s found for class %s.", currentHash, className)); + } + } + + private static Printer printer = new Textifier(); + private static TraceMethodVisitor methodVisitor = new TraceMethodVisitor(printer); + + public static void printMethod(MethodNode methodNode) { + for (AbstractInsnNode insnNode : methodNode.instructions.toArray()) { + insnNode.accept(methodVisitor); + StringWriter stringWriter = new StringWriter(); + printer.print(new PrintWriter(stringWriter)); + printer.getText().clear(); + + LOGGER.info(stringWriter.toString().replace("\n", "")); + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/ObfHelper.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/ObfHelper.java new file mode 100644 index 00000000..8c0aaca6 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/ObfHelper.java @@ -0,0 +1,36 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.asm; + +import net.minecraftforge.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper; + +public class ObfHelper { + public static String createMethodDescriptor(boolean obfuscated, String returnType, String... types) { + String result = "("; + + for (String type : types) { + if (type.length() == 1) + result += type; + else { + result += "L" + (obfuscated ? FMLDeobfuscatingRemapper.INSTANCE.unmap(type) : type) + ";"; + } + } + + if (returnType.length() > 1) { + returnType = "L" + unmapType(obfuscated, returnType) + ";"; + } + + result += ")" + returnType; + + return result; + } + + public static String unmapType(boolean obfuscated, String type) { + return obfuscated ? FMLDeobfuscatingRemapper.INSTANCE.unmap(type) : type; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/TANLoadingPlugin.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/TANLoadingPlugin.java new file mode 100644 index 00000000..808d7eff --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/TANLoadingPlugin.java @@ -0,0 +1,41 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.asm; + +import java.util.Map; + +import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin; + +public class TANLoadingPlugin implements IFMLLoadingPlugin { + @Override + public String[] getASMTransformerClass() { + return new String[] { + "toughasnails.asm.transformer.CropDecayTransformer", + "toughasnails.asm.transformer.EntityRendererTransformer", + "toughasnails.asm.transformer.WorldTransformer" }; + } + + @Override + public String getModContainerClass() { + return null; + } + + @Override + public String getSetupClass() { + return null; + } + + @Override + public void injectData(Map data) { + } + + @Override + public String getAccessTransformerClass() { + return null; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/transformer/CropDecayTransformer.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/transformer/CropDecayTransformer.java new file mode 100644 index 00000000..65b88928 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/transformer/CropDecayTransformer.java @@ -0,0 +1,135 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.asm.transformer; + +import java.io.PrintWriter; +import java.util.List; + +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.InsnList; +import org.objectweb.asm.tree.InsnNode; +import org.objectweb.asm.tree.LdcInsnNode; +import org.objectweb.asm.tree.MethodInsnNode; +import org.objectweb.asm.tree.MethodNode; +import org.objectweb.asm.tree.VarInsnNode; +import org.objectweb.asm.util.TraceClassVisitor; + +import com.google.common.collect.Lists; + +import net.minecraft.launchwrapper.IClassTransformer; +import toughasnails.asm.ASMHelper; +import toughasnails.asm.ObfHelper; + +public class CropDecayTransformer implements IClassTransformer { + private static final String[] VALID_HASHES = new String[] { + // BlockCrops + "3d74307bb515539176e7a84967b10a28", "b835f0bbb24031fee6ad804d8c48d2dc", + // BlockStem + "6a28b8cb3a448cb0b9fa7f5c5d7df8d9" }; + + private static final String[] UPDATE_TICK_NAMES = new String[] { "updateTick", "func_180650_b", "b" }; + + @Override + public byte[] transform(String name, String transformedName, byte[] basicClass) { + if (transformedName.equals("net.minecraft.block.BlockCrops") + || transformedName.equals("net.minecraft.block.BlockStem")) { + + // This is a vanilla crop; let's implement the interface and inject + // the crop decay hook + return transformToDecay(basicClass, !transformedName.equals(name), transformedName, true); + } else { + // Check if some crop implements the interface, and if it does then + // inject the crop decay hook + ClassReader classReader = new ClassReader(basicClass); + InterfaceCheckVisitor visitor = new InterfaceCheckVisitor("toughasnails/api/season/IDecayableCrop"); + classReader.accept(visitor, ClassReader.SKIP_CODE); + if (visitor.isInterfaceFound) { + return transformToDecay(basicClass, !transformedName.equals(name), transformedName, false); + } + } + + return basicClass; + } + + private byte[] transformToDecay(byte[] bytes, boolean obfuscatedClass, String name, boolean isVanilla) { + System.out.println("Executing transform-to-decay"); + + // Decode the class from bytes + ClassNode classNode = new ClassNode(); + ClassReader classReader = new ClassReader(bytes); + System.out.println("Class reader debug output:"); + classReader.accept(classNode, 0); + classReader.accept(new TraceClassVisitor(new PrintWriter(System.out)), 0); + + if (isVanilla) { + // Check this class is unmodified + ASMHelper.verifyClassHash(name, bytes, VALID_HASHES); + // Vanilla crops need the interface added + classNode.interfaces.add("toughasnails/api/season/IDecayableCrop"); + + } + + List successfulTransformations = Lists.newArrayList(); + + // Iterate over the methods in the class + System.out.println("Iterating transform methodNodes"); + for (MethodNode methodNode : classNode.methods) { + if (ASMHelper.methodEquals(methodNode, UPDATE_TICK_NAMES, + ObfHelper.createMethodDescriptor(obfuscatedClass, "V", "net/minecraft/world/World", + "net/minecraft/util/math/BlockPos", "net/minecraft/block/state/IBlockState", + "java/util/Random"))) { + InsnList insnList = new InsnList(); + + // Get the current season + insnList.add(new VarInsnNode(Opcodes.ALOAD, 0)); + insnList.add(new VarInsnNode(Opcodes.ALOAD, 1)); + insnList.add(new VarInsnNode(Opcodes.ALOAD, 2)); + insnList.add( + new MethodInsnNode(Opcodes.INVOKESTATIC, "toughasnails/season/SeasonASMHelper", "onUpdateTick", + ObfHelper.createMethodDescriptor(obfuscatedClass, "V", "net/minecraft/block/Block", + "net/minecraft/world/World", "net/minecraft/util/math/BlockPos"), + false)); + + // Insert our new instructions before returning + methodNode.instructions.insertBefore(methodNode.instructions + .get(methodNode.instructions.indexOf(methodNode.instructions.getLast()) - 1), insnList); + + successfulTransformations.add(methodNode.name + " " + methodNode.desc); + } + } + + if (isVanilla) { + System.out.println("Is vanilla!"); + + // The vanilla method does not exist? What is this sorcery?!? + if (successfulTransformations.size() != 1) { + throw new RuntimeException("An error occurred transforming " + name + ". Applied transformations: " + + successfulTransformations.toString()); + } + + // Implement shouldDecay() method, which simply returns true. The + // method allows subclasses to override behavior. + MethodNode decayMethod = new MethodNode(Opcodes.ACC_PUBLIC, "shouldDecay", "()Z", null, null); + InsnList decayInsns = new InsnList(); + decayInsns.add(new LdcInsnNode(new Integer(1))); + decayInsns.add(new InsnNode(Opcodes.IRETURN)); + decayMethod.instructions.add(decayInsns); + classNode.methods.add(decayMethod); + } + + // Encode the altered class back into bytes + ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS); + classNode.accept(writer); + bytes = writer.toByteArray(); + + return bytes; + } +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/transformer/EntityRendererTransformer.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/transformer/EntityRendererTransformer.java new file mode 100644 index 00000000..40f6b2f7 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/transformer/EntityRendererTransformer.java @@ -0,0 +1,99 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.asm.transformer; + +import java.util.List; + +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.MethodInsnNode; +import org.objectweb.asm.tree.MethodNode; + +import com.google.common.collect.Lists; + +import net.minecraft.launchwrapper.IClassTransformer; +import toughasnails.asm.ASMHelper; +import toughasnails.asm.ObfHelper; + +public class EntityRendererTransformer implements IClassTransformer { + private static final String[] VALID_HASHES = new String[] { "7039efd63c08f2d8fa9f000a4a194d5c", + "48321722b6b3220fc8d2b5dd4a703476" }; + + private static final String[] RENDER_RAIN_SNOW_NAMES = new String[] { "renderRainSnow", "func_78474_d", "c" }; + private static final String[] ADD_RAIN_PARTICLES_NAMES = new String[] { "addRainParticles", "func_78484_h", "p" }; + + private static final String[] GET_FLOAT_TEMPERATURE_NAMES = new String[] { "getFloatTemperature", "func_180626_a", + "a" }; + + @Override + public byte[] transform(String name, String transformedName, byte[] basicClass) { + if (transformedName.equals("net.minecraft.client.renderer.EntityRenderer")) { + return transformEntityRenderer(basicClass, !transformedName.equals(name)); + } + + return basicClass; + } + + private byte[] transformEntityRenderer(byte[] bytes, boolean obfuscatedClass) { + // Decode the class from bytes + ClassNode classNode = new ClassNode(); + ClassReader classReader = new ClassReader(bytes); + classReader.accept(classNode, 0); + + // Check this class is unmodified + ASMHelper.verifyClassHash("EntityRenderer", bytes, VALID_HASHES); + + List successfulTransformations = Lists.newArrayList(); + + // Iterate over the methods in the class + for (MethodNode methodNode : classNode.methods) { + if (ASMHelper.methodEquals(methodNode, RENDER_RAIN_SNOW_NAMES, "(F)V")) { + MethodInsnNode targetMethodInsnNode = ASMHelper.getUniqueMethodInsnNode(methodNode, + Opcodes.INVOKEVIRTUAL, ObfHelper.unmapType(obfuscatedClass, "net/minecraft/world/biome/Biome"), + GET_FLOAT_TEMPERATURE_NAMES, + ObfHelper.createMethodDescriptor(obfuscatedClass, "F", "net/minecraft/util/math/BlockPos")); + + // Redirect the call to our own version of getFloatTemperature + targetMethodInsnNode.setOpcode(Opcodes.INVOKESTATIC); + targetMethodInsnNode.owner = "toughasnails/season/SeasonASMHelper"; + targetMethodInsnNode.name = "getFloatTemperature"; + targetMethodInsnNode.desc = ObfHelper.createMethodDescriptor(obfuscatedClass, "F", + "net/minecraft/world/biome/Biome", "net/minecraft/util/math/BlockPos"); + + successfulTransformations.add(methodNode.name + " " + methodNode.desc); + } else if (ASMHelper.methodEquals(methodNode, ADD_RAIN_PARTICLES_NAMES, "()V")) { + MethodInsnNode targetMethodInsnNode = ASMHelper.getUniqueMethodInsnNode(methodNode, + Opcodes.INVOKEVIRTUAL, ObfHelper.unmapType(obfuscatedClass, "net/minecraft/world/biome/Biome"), + GET_FLOAT_TEMPERATURE_NAMES, + ObfHelper.createMethodDescriptor(obfuscatedClass, "F", "net/minecraft/util/math/BlockPos")); + + // Redirect the call to our own version of getFloatTemperature + targetMethodInsnNode.setOpcode(Opcodes.INVOKESTATIC); + targetMethodInsnNode.owner = "toughasnails/season/SeasonASMHelper"; + targetMethodInsnNode.name = "getFloatTemperature"; + targetMethodInsnNode.desc = ObfHelper.createMethodDescriptor(obfuscatedClass, "F", + "net/minecraft/world/biome/Biome", "net/minecraft/util/math/BlockPos"); + + successfulTransformations.add(methodNode.name + " " + methodNode.desc); + } + } + + if (successfulTransformations.size() != 2) + throw new RuntimeException("An error occurred transforming EntityRenderer. Applied transformations: " + + successfulTransformations.toString()); + + // Encode the altered class back into bytes + ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS); + classNode.accept(writer); + bytes = writer.toByteArray(); + + return bytes; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/transformer/InterfaceCheckVisitor.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/transformer/InterfaceCheckVisitor.java new file mode 100644 index 00000000..0dfef6fc --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/transformer/InterfaceCheckVisitor.java @@ -0,0 +1,26 @@ +package toughasnails.asm.transformer; + +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.Opcodes; + +public class InterfaceCheckVisitor extends ClassVisitor { + public boolean isInterfaceFound; + public String searchInterface; + + public InterfaceCheckVisitor(String searchInterface) { + super(Opcodes.ASM5); + this.isInterfaceFound = false; + this.searchInterface = searchInterface; + } + + @Override + public void visit(int version, int access, String name, String signature, + String superName, String[] interfaces) { + for (String iface : interfaces) { + if (iface.equals(searchInterface)) { + isInterfaceFound = true; + return; + } + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/transformer/WorldTransformer.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/transformer/WorldTransformer.java new file mode 100644 index 00000000..0cbf86c0 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/asm/transformer/WorldTransformer.java @@ -0,0 +1,225 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.asm.transformer; + +import java.util.List; + +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.AbstractInsnNode; +import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.InsnList; +import org.objectweb.asm.tree.InsnNode; +import org.objectweb.asm.tree.MethodInsnNode; +import org.objectweb.asm.tree.MethodNode; +import org.objectweb.asm.tree.VarInsnNode; + +import com.google.common.collect.Lists; + +import net.minecraft.launchwrapper.IClassTransformer; +import toughasnails.asm.ASMHelper; +import toughasnails.asm.ObfHelper; + +public class WorldTransformer implements IClassTransformer { + private static final String[] VALID_HASHES = new String[] { + "547d356661b3b86facf7043fb930bcfb", + "a812fff5e65c73ca82f3f2c9ddd2fb03" }; + + private static final String[] CAN_SNOW_AT_NAMES = new String[] { + "canSnowAt", "func_175708_f", "f" }; + private static final String[] CAN_BLOCK_FREEZE_NAMES = new String[] { + "canBlockFreeze", "func_175670_e", "e" }; + private static final String[] IS_RAINING_AT_NAMES = new String[] { + "isRainingAt", "func_175727_C", "B" }; + private static final String[] GET_BIOME_GEN_FOR_COORDS_NAMES = new String[] { + "getBiome", "func_180494_b", "b" }; + + @Override + public byte[] transform(String name, String transformedName, + byte[] basicClass) { + if (transformedName.equals("net.minecraft.world.World")) { + return transformWorld(basicClass, !transformedName.equals(name)); + } + + return basicClass; + } + + private byte[] transformWorld(byte[] bytes, boolean obfuscatedClass) { + // Decode the class from bytes + ClassNode classNode = new ClassNode(); + ClassReader classReader = new ClassReader(bytes); + classReader.accept(classNode, 0); + + // Check this class is unmodified + ASMHelper.verifyClassHash("World", bytes, VALID_HASHES); + + List successfulTransformations = Lists.newArrayList(); + + // Iterate over the methods in the class + for (MethodNode methodNode : classNode.methods) { + if (ASMHelper.methodEquals(methodNode, CAN_SNOW_AT_NAMES, + ObfHelper.createMethodDescriptor(obfuscatedClass, "Z", + "net/minecraft/util/math/BlockPos", "Z"))) { + InsnList insnList = new InsnList(); + + // Get the current season + insnList.add(new VarInsnNode(Opcodes.ALOAD, 0)); + insnList.add(new MethodInsnNode(Opcodes.INVOKESTATIC, + "toughasnails/api/season/SeasonHelper", "getSeasonData", + ObfHelper.createMethodDescriptor(obfuscatedClass, + "toughasnails/api/season/ISeasonData", + "net/minecraft/world/World"), + false)); + insnList.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, + "toughasnails/api/season/ISeasonData", "getSubSeason", + "()Ltoughasnails/api/season/Season$SubSeason;", true)); + insnList.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, + "toughasnails/api/season/Season$SubSeason", "getSeason", + "()Ltoughasnails/api/season/Season;", false)); + insnList.add(new VarInsnNode(Opcodes.ASTORE, 3)); + + // Invoke our replacement method + insnList.add(new VarInsnNode(Opcodes.ALOAD, 0)); + insnList.add(new VarInsnNode(Opcodes.ALOAD, 1)); + insnList.add(new VarInsnNode(Opcodes.ILOAD, 2)); + insnList.add(new VarInsnNode(Opcodes.ALOAD, 3)); + insnList.add(new MethodInsnNode(Opcodes.INVOKESTATIC, + "toughasnails/season/SeasonASMHelper", + "canSnowAtInSeason", + ObfHelper.createMethodDescriptor(obfuscatedClass, "Z", + "net/minecraft/world/World", + "net/minecraft/util/math/BlockPos", "Z", + "toughasnails/api/season/Season"), + false)); + insnList.add(new InsnNode(Opcodes.IRETURN)); + + // Substitute existing instructions with our new ones + methodNode.instructions.clear(); + methodNode.instructions.insert(insnList); + + successfulTransformations + .add(methodNode.name + " " + methodNode.desc); + } else + if (ASMHelper.methodEquals(methodNode, CAN_BLOCK_FREEZE_NAMES, + ObfHelper.createMethodDescriptor(obfuscatedClass, "Z", + "net/minecraft/util/math/BlockPos", "Z"))) { + InsnList insnList = new InsnList(); + + // Get the current season + insnList.add(new VarInsnNode(Opcodes.ALOAD, 0)); + insnList.add(new MethodInsnNode(Opcodes.INVOKESTATIC, + "toughasnails/api/season/SeasonHelper", "getSeasonData", + ObfHelper.createMethodDescriptor(obfuscatedClass, + "toughasnails/api/season/ISeasonData", + "net/minecraft/world/World"), + false)); + insnList.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, + "toughasnails/api/season/ISeasonData", "getSubSeason", + "()Ltoughasnails/api/season/Season$SubSeason;", true)); + insnList.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, + "toughasnails/api/season/Season$SubSeason", "getSeason", + "()Ltoughasnails/api/season/Season;", false)); + insnList.add(new VarInsnNode(Opcodes.ASTORE, 3)); + + // Invoke our replacement method + insnList.add(new VarInsnNode(Opcodes.ALOAD, 0)); + insnList.add(new VarInsnNode(Opcodes.ALOAD, 1)); + insnList.add(new VarInsnNode(Opcodes.ILOAD, 2)); + insnList.add(new VarInsnNode(Opcodes.ALOAD, 3)); + insnList.add(new MethodInsnNode(Opcodes.INVOKESTATIC, + "toughasnails/season/SeasonASMHelper", + "canBlockFreezeInSeason", + ObfHelper.createMethodDescriptor(obfuscatedClass, "Z", + "net/minecraft/world/World", + "net/minecraft/util/math/BlockPos", "Z", + "toughasnails/api/season/Season"), + false)); + insnList.add(new InsnNode(Opcodes.IRETURN)); + + // Substitute existing instructions with our new ones + methodNode.instructions.clear(); + methodNode.instructions.insert(insnList); + + successfulTransformations + .add(methodNode.name + " " + methodNode.desc); + } else if (ASMHelper.methodEquals(methodNode, IS_RAINING_AT_NAMES, + ObfHelper.createMethodDescriptor(obfuscatedClass, "Z", + "net/minecraft/util/math/BlockPos"))) { + InsnList insnList = new InsnList(); + + // Get the current season + insnList.add(new VarInsnNode(Opcodes.ALOAD, 0)); + insnList.add(new MethodInsnNode(Opcodes.INVOKESTATIC, + "toughasnails/api/season/SeasonHelper", "getSeasonData", + ObfHelper.createMethodDescriptor(obfuscatedClass, + "toughasnails/api/season/ISeasonData", + "net/minecraft/world/World"), + false)); + insnList.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, + "toughasnails/api/season/ISeasonData", "getSubSeason", + "()Ltoughasnails/api/season/Season$SubSeason;", true)); + insnList.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, + "toughasnails/api/season/Season$SubSeason", "getSeason", + "()Ltoughasnails/api/season/Season;", false)); + insnList.add(new VarInsnNode(Opcodes.ASTORE, 2)); + + // Invoke our replacement method + insnList.add(new VarInsnNode(Opcodes.ALOAD, 0)); + insnList.add(new VarInsnNode(Opcodes.ALOAD, 1)); + insnList.add(new VarInsnNode(Opcodes.ALOAD, 2)); + insnList.add(new MethodInsnNode(Opcodes.INVOKESTATIC, + "toughasnails/season/SeasonASMHelper", + "isRainingAtInSeason", + ObfHelper.createMethodDescriptor(obfuscatedClass, "Z", + "net/minecraft/world/World", + "net/minecraft/util/math/BlockPos", + "toughasnails/api/season/Season"), + false)); + insnList.add(new InsnNode(Opcodes.ICONST_0)); // Necessary for + // compatibility + // with + // RandomThingsCore + insnList.add(new InsnNode(Opcodes.IRETURN)); + + MethodInsnNode invokeMethodNode = ASMHelper + .getUniqueMethodInsnNode(methodNode, + Opcodes.INVOKEVIRTUAL, + ObfHelper.unmapType(obfuscatedClass, + "net/minecraft/world/World"), + GET_BIOME_GEN_FOR_COORDS_NAMES, + ObfHelper.createMethodDescriptor( + obfuscatedClass, + "net/minecraft/world/biome/Biome", + "net/minecraft/util/math/BlockPos")); + AbstractInsnNode insertionPoint = methodNode.instructions.get( + methodNode.instructions.indexOf(invokeMethodNode) - 2); + + // Insert our new instructions before the insertion point + methodNode.instructions.insertBefore(insertionPoint, insnList); + + ASMHelper.clearNextInstructions(methodNode, insertionPoint); + + successfulTransformations + .add(methodNode.name + " " + methodNode.desc); + } + } + + if (successfulTransformations.size() != 3) + throw new RuntimeException( + "An error occurred transforming World. Applied transformations: " + + successfulTransformations.toString()); + + // Encode the altered class back into bytes + ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS); + classNode.accept(writer); + bytes = writer.toByteArray(); + + return bytes; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockGlowstoneTorch.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockGlowstoneTorch.java new file mode 100644 index 00000000..fb0feda2 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockGlowstoneTorch.java @@ -0,0 +1,297 @@ +package toughasnails.block; + +import javax.annotation.Nullable; + +import com.google.common.base.Predicate; + +import net.minecraft.block.Block; +import net.minecraft.block.SoundType; +import net.minecraft.block.material.Material; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.properties.PropertyDirection; +import net.minecraft.block.state.BlockStateContainer; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.BlockRenderLayer; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.Mirror; +import net.minecraft.util.Rotation; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import toughasnails.api.ITANBlock; +import toughasnails.item.ItemTANBlock; + +public class BlockGlowstoneTorch extends Block implements ITANBlock { + public static final PropertyDirection FACING = PropertyDirection.create("facing", new Predicate() { + public boolean apply(@Nullable EnumFacing p_apply_1_) { + return p_apply_1_ != EnumFacing.DOWN; + } + }); + + // implement ITANBlock + @Override + public Class getItemClass() { + return ItemTANBlock.class; + } + + @SuppressWarnings("rawtypes") + @Override + public IProperty[] getPresetProperties() { + return new IProperty[] {}; + } + + @SuppressWarnings("rawtypes") + @Override + public IProperty[] getNonRenderingProperties() { + return null; + } + + @Override + public String getStateName(IBlockState state) { + return ""; + } + + protected static final AxisAlignedBB STANDING_AABB = new AxisAlignedBB(0.4000000059604645D, 0.0D, + 0.4000000059604645D, 0.6000000238418579D, 0.6000000238418579D, 0.6000000238418579D); + protected static final AxisAlignedBB TORCH_NORTH_AABB = new AxisAlignedBB(0.3499999940395355D, 0.20000000298023224D, + 0.699999988079071D, 0.6499999761581421D, 0.800000011920929D, 1.0D); + protected static final AxisAlignedBB TORCH_SOUTH_AABB = new AxisAlignedBB(0.3499999940395355D, 0.20000000298023224D, + 0.0D, 0.6499999761581421D, 0.800000011920929D, 0.30000001192092896D); + protected static final AxisAlignedBB TORCH_WEST_AABB = new AxisAlignedBB(0.699999988079071D, 0.20000000298023224D, + 0.3499999940395355D, 1.0D, 0.800000011920929D, 0.6499999761581421D); + protected static final AxisAlignedBB TORCH_EAST_AABB = new AxisAlignedBB(0.0D, 0.20000000298023224D, + 0.3499999940395355D, 0.30000001192092896D, 0.800000011920929D, 0.6499999761581421D); + + public BlockGlowstoneTorch() { + super(Material.CIRCUITS); + this.setHardness(0.0F); + this.setSoundType(SoundType.WOOD); + this.setLightLevel(1.0F); + this.setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.UP)); + this.setTickRandomly(true); + } + + @Override + public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { + switch ((EnumFacing) state.getValue(FACING)) { + case EAST: + return TORCH_EAST_AABB; + case WEST: + return TORCH_WEST_AABB; + case SOUTH: + return TORCH_SOUTH_AABB; + case NORTH: + return TORCH_NORTH_AABB; + default: + return STANDING_AABB; + } + } + + @Nullable + @Override + public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, World worldIn, BlockPos pos) { + return NULL_AABB; + } + + @Override + public boolean isOpaqueCube(IBlockState state) { + return false; + } + + @Override + public boolean isFullCube(IBlockState state) { + return false; + } + + private boolean canPlaceOn(World worldIn, BlockPos pos) { + IBlockState state = worldIn.getBlockState(pos); + if (state.isSideSolid(worldIn, pos, EnumFacing.UP)) { + return true; + } else { + return state.getBlock().canPlaceTorchOnTop(state, worldIn, pos); + } + } + + @Override + public boolean canPlaceBlockAt(World worldIn, BlockPos pos) { + for (EnumFacing enumfacing : FACING.getAllowedValues()) { + if (this.canPlaceAt(worldIn, pos, enumfacing)) { + return true; + } + } + + return false; + } + + private boolean canPlaceAt(World worldIn, BlockPos pos, EnumFacing facing) { + BlockPos blockpos = pos.offset(facing.getOpposite()); + boolean flag = facing.getAxis().isHorizontal(); + return flag && worldIn.isSideSolid(blockpos, facing, true) + || facing.equals(EnumFacing.UP) && this.canPlaceOn(worldIn, blockpos); + } + + @Override + public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, + float hitZ, int meta, EntityLivingBase placer, ItemStack stack) { + if (this.canPlaceAt(world, pos, facing)) { + return this.getDefaultState().withProperty(FACING, facing); + } else { + for (EnumFacing enumfacing : EnumFacing.Plane.HORIZONTAL) { + if (world.isSideSolid(pos.offset(enumfacing.getOpposite()), enumfacing, true)) { + return this.getDefaultState().withProperty(FACING, enumfacing); + } + } + + return this.getDefaultState(); + } + } + + @Override + public void onBlockAdded(World worldIn, BlockPos pos, IBlockState state) { + this.checkForDrop(worldIn, pos, state); + } + + @Override + public void neighborChanged(IBlockState state, World worldIn, BlockPos pos, Block blockIn) { + this.onNeighborChangeInternal(worldIn, pos, state); + } + + protected boolean onNeighborChangeInternal(World worldIn, BlockPos pos, IBlockState state) { + if (!this.checkForDrop(worldIn, pos, state)) { + return true; + } else { + EnumFacing enumfacing = (EnumFacing) state.getValue(FACING); + EnumFacing.Axis enumfacing$axis = enumfacing.getAxis(); + EnumFacing enumfacing1 = enumfacing.getOpposite(); + boolean flag = false; + + if (enumfacing$axis.isHorizontal() && !worldIn.isSideSolid(pos.offset(enumfacing1), enumfacing, true)) { + flag = true; + } else if (enumfacing$axis.isVertical() && !this.canPlaceOn(worldIn, pos.offset(enumfacing1))) { + flag = true; + } + + if (flag) { + this.dropBlockAsItem(worldIn, pos, state, 0); + worldIn.setBlockToAir(pos); + return true; + } else { + return false; + } + } + } + + protected boolean checkForDrop(World worldIn, BlockPos pos, IBlockState state) { + if (state.getBlock() == this && this.canPlaceAt(worldIn, pos, (EnumFacing) state.getValue(FACING))) { + return true; + } else { + if (worldIn.getBlockState(pos).getBlock() == this) { + this.dropBlockAsItem(worldIn, pos, state, 0); + worldIn.setBlockToAir(pos); + } + + return false; + } + } + + /* + * @SideOnly(Side.CLIENT) + * + * @Override public void randomDisplayTick(IBlockState stateIn, World + * worldIn, BlockPos pos, Random rand) { EnumFacing enumfacing = + * (EnumFacing)stateIn.getValue(FACING); double d0 = (double)pos.getX() + + * 0.5D; double d1 = (double)pos.getY() + 0.7D; double d2 = + * (double)pos.getZ() + 0.5D; double d3 = 0.22D; double d4 = 0.27D; + * + * if (enumfacing.getAxis().isHorizontal()) { EnumFacing enumfacing1 = + * enumfacing.getOpposite(); + * worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + d4 * + * (double)enumfacing1.getFrontOffsetX(), d1 + d3, d2 + d4 * + * (double)enumfacing1.getFrontOffsetZ(), 0.0D, 0.0D, 0.0D, new int[0]); + * worldIn.spawnParticle(EnumParticleTypes.FLAME, d0 + d4 * + * (double)enumfacing1.getFrontOffsetX(), d1 + d3, d2 + d4 * + * (double)enumfacing1.getFrontOffsetZ(), 0.0D, 0.0D, 0.0D, new int[0]); } + * else { worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0, d1, d2, + * 0.0D, 0.0D, 0.0D, new int[0]); + * worldIn.spawnParticle(EnumParticleTypes.FLAME, d0, d1, d2, 0.0D, 0.0D, + * 0.0D, new int[0]); } } + */ + + @Override + public IBlockState getStateFromMeta(int meta) { + IBlockState iblockstate = this.getDefaultState(); + + switch (meta) { + case 1: + iblockstate = iblockstate.withProperty(FACING, EnumFacing.EAST); + break; + case 2: + iblockstate = iblockstate.withProperty(FACING, EnumFacing.WEST); + break; + case 3: + iblockstate = iblockstate.withProperty(FACING, EnumFacing.SOUTH); + break; + case 4: + iblockstate = iblockstate.withProperty(FACING, EnumFacing.NORTH); + break; + case 5: + default: + iblockstate = iblockstate.withProperty(FACING, EnumFacing.UP); + } + + return iblockstate; + } + + @SideOnly(Side.CLIENT) + @Override + public BlockRenderLayer getBlockLayer() { + return BlockRenderLayer.CUTOUT; + } + + @Override + public int getMetaFromState(IBlockState state) { + int i = 0; + + switch ((EnumFacing) state.getValue(FACING)) { + case EAST: + i = i | 1; + break; + case WEST: + i = i | 2; + break; + case SOUTH: + i = i | 3; + break; + case NORTH: + i = i | 4; + break; + case DOWN: + case UP: + default: + i = i | 5; + } + + return i; + } + + @Override + public IBlockState withRotation(IBlockState state, Rotation rot) { + return state.withProperty(FACING, rot.rotate((EnumFacing) state.getValue(FACING))); + } + + @Override + public IBlockState withMirror(IBlockState state, Mirror mirrorIn) { + return state.withRotation(mirrorIn.toRotation((EnumFacing) state.getValue(FACING))); + } + + @Override + protected BlockStateContainer createBlockState() { + return new BlockStateContainer(this, new IProperty[] { FACING }); + } +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockRainCollector.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockRainCollector.java new file mode 100644 index 00000000..19012880 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockRainCollector.java @@ -0,0 +1,185 @@ +package toughasnails.block; + +import javax.annotation.Nullable; + +import net.minecraft.block.Block; +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.properties.PropertyInteger; +import net.minecraft.block.state.BlockStateContainer; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.Items; +import net.minecraft.init.PotionTypes; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.PotionUtils; +import net.minecraft.util.BlockRenderLayer; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import toughasnails.api.ITANBlock; +import toughasnails.api.item.TANItems; +import toughasnails.item.ItemTANBlock; + +public class BlockRainCollector extends Block implements ITANBlock { + public static final PropertyInteger LEVEL = PropertyInteger.create("level", 0, 3); + + // implement ITANBlock + @Override + public Class getItemClass() { + return ItemTANBlock.class; + } + + @SuppressWarnings("rawtypes") + @Override + public IProperty[] getPresetProperties() { + return new IProperty[] {}; + } + + @SuppressWarnings("rawtypes") + @Override + public IProperty[] getNonRenderingProperties() { + return null; + } + + @Override + public String getStateName(IBlockState state) { + return ""; + } + + public BlockRainCollector() { + super(Material.IRON, MapColor.STONE); + this.setHardness(2.0F); + this.setDefaultState(this.blockState.getBaseState().withProperty(LEVEL, Integer.valueOf(0))); + } + + @Override + public boolean isOpaqueCube(IBlockState state) { + return false; + } + + @Override + public boolean isFullCube(IBlockState state) { + return false; + } + + @SideOnly(Side.CLIENT) + @Override + public BlockRenderLayer getBlockLayer() { + return BlockRenderLayer.CUTOUT; + } + + @Override + public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, + EnumHand hand, @Nullable ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) { + if (heldItem == null) { + return true; + } else { + int i = ((Integer) state.getValue(LEVEL)).intValue(); + Item item = heldItem.getItem(); + + if (item == Items.BUCKET) { + if (i == 3 && !worldIn.isRemote) { + if (!playerIn.capabilities.isCreativeMode) { + --heldItem.stackSize; + + if (heldItem.stackSize == 0) { + playerIn.setHeldItem(hand, new ItemStack(Items.WATER_BUCKET)); + } else if (!playerIn.inventory.addItemStackToInventory(new ItemStack(Items.WATER_BUCKET))) { + playerIn.dropItem(new ItemStack(Items.WATER_BUCKET), false); + } + } + + // playerIn.addStat(StatList.CAULDRON_USED); + this.setWaterLevel(worldIn, pos, state, 0); + } + + return true; + } else if (item == Items.GLASS_BOTTLE) { + if (i > 0 && !worldIn.isRemote) { + if (!playerIn.capabilities.isCreativeMode) { + ItemStack itemstack1 = PotionUtils.addPotionToItemStack(new ItemStack(Items.POTIONITEM), + PotionTypes.WATER); + + if (--heldItem.stackSize == 0) { + playerIn.setHeldItem(hand, itemstack1); + } else if (!playerIn.inventory.addItemStackToInventory(itemstack1)) { + playerIn.dropItem(itemstack1, false); + } else if (playerIn instanceof EntityPlayerMP) { + ((EntityPlayerMP) playerIn).sendContainerToPlayer(playerIn.inventoryContainer); + } + } + + this.setWaterLevel(worldIn, pos, state, i - 1); + } + + return true; + } else if (item == TANItems.canteen) { + if (i > 0 && !worldIn.isRemote) { + if (!playerIn.capabilities.isCreativeMode) { + heldItem.setItemDamage(3); + } + + this.setWaterLevel(worldIn, pos, state, i - 1); + } + + return true; + } else { + return false; + } + } + } + + public void setWaterLevel(World worldIn, BlockPos pos, IBlockState state, int level) { + worldIn.setBlockState(pos, state.withProperty(LEVEL, Integer.valueOf(MathHelper.clamp_int(level, 0, 3))), 2); + worldIn.updateComparatorOutputLevel(pos, this); + } + + @Override + public void fillWithRain(World worldIn, BlockPos pos) { + if (worldIn.rand.nextInt(4) == 1) { + float f = worldIn.getBiome(pos).getFloatTemperature(pos); + + if (worldIn.getBiomeProvider().getTemperatureAtHeight(f, pos.getY()) >= 0.15F) { + IBlockState iblockstate = worldIn.getBlockState(pos); + + if (((Integer) iblockstate.getValue(LEVEL)).intValue() < 3) { + worldIn.setBlockState(pos, iblockstate.cycleProperty(LEVEL), 2); + } + } + } + } + + @Override + public boolean hasComparatorInputOverride(IBlockState state) { + return true; + } + + @Override + public int getComparatorInputOverride(IBlockState blockState, World worldIn, BlockPos pos) { + return ((Integer) blockState.getValue(LEVEL)).intValue(); + } + + @Override + public IBlockState getStateFromMeta(int meta) { + return this.getDefaultState().withProperty(LEVEL, Integer.valueOf(meta)); + } + + @Override + public int getMetaFromState(IBlockState state) { + return ((Integer) state.getValue(LEVEL)).intValue(); + } + + @Override + protected BlockStateContainer createBlockState() { + return new BlockStateContainer(this, new IProperty[] { LEVEL }); + } +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockSeasonSensor.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockSeasonSensor.java new file mode 100644 index 00000000..181dc576 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockSeasonSensor.java @@ -0,0 +1,189 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.block; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.SoundType; +import net.minecraft.block.material.Material; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.properties.PropertyInteger; +import net.minecraft.block.state.BlockStateContainer; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumBlockRenderType; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.IStringSerializable; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import toughasnails.api.ITANBlock; +import toughasnails.api.TANBlocks; +import toughasnails.api.season.SeasonHelper; +import toughasnails.item.ItemTANBlock; +import toughasnails.season.SeasonTime; +import toughasnails.tileentity.TileEntitySeasonSensor; + +public class BlockSeasonSensor extends BlockContainer implements ITANBlock { + public static final PropertyInteger POWER = PropertyInteger.create("power", 0, 15); + public static final AxisAlignedBB BOUNDING_BOX = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 0.375D, 1.0D); + + // implement ITANBlock + @Override + public Class getItemClass() { + return ItemTANBlock.class; + } + + @SuppressWarnings("rawtypes") + @Override + public IProperty[] getPresetProperties() { + return new IProperty[] {}; + } + + @SuppressWarnings("rawtypes") + @Override + public IProperty[] getNonRenderingProperties() { + return new IProperty[] { POWER }; + } + + @Override + public String getStateName(IBlockState state) { + return type.getName(); + } + + private final DetectorType type; + + public BlockSeasonSensor(DetectorType type) { + super(Material.WOOD); + this.type = type; + this.setHardness(0.2F); + this.setSoundType(SoundType.WOOD); + this.setDefaultState(this.blockState.getBaseState().withProperty(POWER, Integer.valueOf(0))); + } + + @Override + public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { + return BOUNDING_BOX; + } + + @Override + public int getWeakPower(IBlockState blockState, IBlockAccess blockAccess, BlockPos pos, EnumFacing side) { + return ((Integer) blockState.getValue(POWER)).intValue(); + } + + public void updatePower(World world, BlockPos pos) { + // Seasons currently only work in the overworld + if (world.provider.getDimension() == 0) { + IBlockState currentState = world.getBlockState(pos); + + int power = 0; + int startTicks = this.type.ordinal() * SeasonTime.SEASON_TICKS; + int endTicks = (this.type.ordinal() + 1) * SeasonTime.SEASON_TICKS; + int currentTicks = SeasonHelper.getSeasonData(world).getSeasonCycleTicks(); + + if (currentTicks >= startTicks && currentTicks <= endTicks) { + float delta = (float) (currentTicks - startTicks) / (float) SeasonTime.SEASON_TICKS; + // Delta adjusted so that it peaks at 0.5 (the middle of the + // month) + float peak = 2.0F * (-Math.abs(delta - 0.5F) + 0.5F); + // Add one so at the start of the season it is powered at least + // a little + power = (int) Math.min(peak * 15.0F + 1.0F, 15.0F); + } + + // Only update the state if the power level has actually changed + if (((Integer) currentState.getValue(POWER)).intValue() != power) { + world.setBlockState(pos, currentState.withProperty(POWER, Integer.valueOf(power)), 3); + } + } + } + + @Override + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, + ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) { + if (player.isAllowEdit()) { + if (world.isRemote) { + return true; + } else { + Block nextBlock = TANBlocks.season_sensors[(this.type.ordinal() + 1) % DetectorType.values().length]; + world.setBlockState(pos, nextBlock.getDefaultState().withProperty(POWER, state.getValue(POWER)), 4); + ((BlockSeasonSensor) nextBlock).updatePower(world, pos); + return true; + } + } else { + return super.onBlockActivated(world, pos, state, player, hand, heldItem, side, hitX, hitY, hitZ); + } + } + + @Override + public Item getItemDropped(IBlockState state, Random rand, int fortune) { + return Item.getItemFromBlock(TANBlocks.season_sensors[0]); + } + + @Override + public boolean isFullCube(IBlockState state) { + return false; + } + + @Override + public boolean isOpaqueCube(IBlockState state) { + return false; + } + + @Override + public EnumBlockRenderType getRenderType(IBlockState state) { + return EnumBlockRenderType.MODEL; + } + + @Override + public boolean canProvidePower(IBlockState state) { + return true; + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntitySeasonSensor(); + } + + // map from state to meta and vice verca + @Override + public IBlockState getStateFromMeta(int meta) { + return this.getDefaultState().withProperty(POWER, meta); + } + + @Override + public int getMetaFromState(IBlockState state) { + return state.getValue(POWER); + } + + @Override + protected BlockStateContainer createBlockState() { + return new BlockStateContainer(this, new IProperty[] { POWER }); + } + + public static enum DetectorType implements IStringSerializable { + SPRING, SUMMER, AUTUMN, WINTER; + @Override + public String getName() { + return this.name().toLowerCase(); + } + + @Override + public String toString() { + return this.getName(); + } + }; +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockTANCampfire.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockTANCampfire.java new file mode 100644 index 00000000..381a0866 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockTANCampfire.java @@ -0,0 +1,279 @@ +package toughasnails.block; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.SoundType; +import net.minecraft.block.material.Material; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.properties.PropertyBool; +import net.minecraft.block.properties.PropertyInteger; +import net.minecraft.block.state.BlockStateContainer; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; +import net.minecraft.init.SoundEvents; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.BlockRenderLayer; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.EnumParticleTypes; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import toughasnails.api.ITANBlock; +import toughasnails.api.TANBlocks; +import toughasnails.api.achievement.TANAchievements; +import toughasnails.item.ItemTANBlock; + +public class BlockTANCampfire extends Block implements ITANBlock { + protected static final AxisAlignedBB SELECTION_BOX = new AxisAlignedBB(0.1D, 0.0D, 0.1D, 0.9D, 0.6D, 0.9D); + + public static final PropertyInteger AGE = PropertyInteger.create("age", 0, 7); + public static final PropertyBool BURNING = PropertyBool.create("burning"); + + // implement IBOPBlock + @Override + public Class getItemClass() { + return ItemTANBlock.class; + } + + @SuppressWarnings("rawtypes") + @Override + public IProperty[] getPresetProperties() { + return new IProperty[] {}; + } + + @SuppressWarnings("rawtypes") + @Override + public IProperty[] getNonRenderingProperties() { + return null; + } + + @Override + public String getStateName(IBlockState state) { + return ""; + } + + public BlockTANCampfire() { + // use rock as default material + this(Material.ROCK); + } + + public BlockTANCampfire(Material material) { + super(material); + // set some defaults + this.setTickRandomly(true); + this.setHardness(0.7F); + this.setDefaultState(this.blockState.getBaseState().withProperty(AGE, Integer.valueOf(0)).withProperty(BURNING, + Boolean.valueOf(false))); + this.setSoundType(SoundType.STONE); + } + + @Override + public void updateTick(World worldIn, BlockPos pos, IBlockState state, Random rand) { + super.updateTick(worldIn, pos, state, rand); + + int age = ((Integer) state.getValue(AGE)).intValue(); + + if (state.getValue(BURNING) == true) { + if (worldIn.isRainingAt(pos)) { + worldIn.setBlockState(pos, state.withProperty(BURNING, false).withProperty(AGE, 15), 2); + worldIn.playSound((EntityPlayer) null, pos, SoundEvents.BLOCK_LAVA_EXTINGUISH, SoundCategory.BLOCKS, + 0.5F, 2.6F + (worldIn.rand.nextFloat() - worldIn.rand.nextFloat()) * 0.8F); + for (int i = 0; i < 8; ++i) { + worldIn.spawnParticle(EnumParticleTypes.SMOKE_LARGE, + (double) ((float) pos.getX() + 0.75F - (rand.nextFloat() / 2.0F)), + (double) ((float) pos.getY() + 0.9F), + (double) ((float) pos.getZ() + 0.75F - (rand.nextFloat() / 2.0F)), 0.0D, 0.0D, 0.0D, + new int[] { Block.getStateId(state) }); + } + } + if (age < 7) { + if (rand.nextInt(8) == 0) { + worldIn.setBlockState(pos, state.withProperty(AGE, Integer.valueOf(age + 1)), 2); + } + } + if (age == 7) { + if (rand.nextInt(8) == 0) { + worldIn.setBlockState(pos, state.withProperty(BURNING, false), 2); + } + } + } + } + + @Override + public int getLightValue(IBlockState state, IBlockAccess world, BlockPos pos) { + if (state.getValue(BURNING) == true) { + return 15; + } else { + return 0; + } + } + + @Override + public AxisAlignedBB getSelectedBoundingBox(IBlockState state, World world, BlockPos pos) { + return SELECTION_BOX; + } + + // no collision box - you can walk straight through them + @Override + public AxisAlignedBB getCollisionBoundingBox(IBlockState state, World world, BlockPos pos) { + return NULL_AABB; + } + + @Override + public void onEntityCollidedWithBlock(World world, BlockPos pos, IBlockState state, Entity entity) { + if (state.getValue(BURNING) == true) { + if (entity instanceof EntityLivingBase) { + entity.setFire(1); + } + } + } + + @Override + public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, + EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) { + if (playerIn.getHeldItem(hand) != null) { + Item item = playerIn.getHeldItem(hand).getItem(); + int age = ((Integer) state.getValue(AGE)).intValue(); + + if (age == 0) { + if (state.getValue(BURNING) == false) { + if (!worldIn.isRainingAt(pos)) { + if (item == Items.STICK) { + if (worldIn.rand.nextInt(12) == 0) { + worldIn.setBlockState(pos, + TANBlocks.campfire.getDefaultState().withProperty(BURNING, true)); + playerIn.addStat(TANAchievements.campfire_song); + } + + if (item == Items.STICK) { + --playerIn.getHeldItem(hand).stackSize; + } + + return true; + } + + if (item == Items.FLINT_AND_STEEL) { + worldIn.playSound(playerIn, pos, SoundEvents.ITEM_FLINTANDSTEEL_USE, SoundCategory.BLOCKS, + 1.0F, worldIn.rand.nextFloat() * 0.4F + 0.8F); + worldIn.setBlockState(pos, + TANBlocks.campfire.getDefaultState().withProperty(BURNING, true)); + playerIn.addStat(TANAchievements.campfire_song); + + if (item == Items.FLINT_AND_STEEL) { + playerIn.getHeldItem(hand).damageItem(1, playerIn); + } + + return true; + } + } + } + } + } + + return super.onBlockActivated(worldIn, pos, state, playerIn, hand, heldItem, side, hitX, hitY, hitZ); + } + + @Override + @SideOnly(Side.CLIENT) + public void randomDisplayTick(IBlockState state, World worldIn, BlockPos pos, Random rand) { + // randomly throw up some particles so it looks like the flesh is + // bubbling + super.randomDisplayTick(state, worldIn, pos, rand); + + if (state.getValue(BURNING) == true) { + if (rand.nextInt(24) == 0) { + worldIn.playSound((double) ((float) pos.getX() + 0.5F), (double) ((float) pos.getY() + 0.5F), + (double) ((float) pos.getZ() + 0.5F), SoundEvents.BLOCK_FIRE_AMBIENT, SoundCategory.BLOCKS, + 1.0F + rand.nextFloat(), rand.nextFloat() * 0.7F + 0.3F, false); + } + + worldIn.spawnParticle(EnumParticleTypes.FLAME, + (double) ((float) pos.getX() + 0.75F - (rand.nextFloat() / 2.0F)), + (double) ((float) pos.getY() + 0.25F + (rand.nextFloat() / 2.0F)), + (double) ((float) pos.getZ() + 0.75F - (rand.nextFloat() / 2.0F)), 0.0D, 0.0D, 0.0D, + new int[] { Block.getStateId(state) }); + worldIn.spawnParticle(EnumParticleTypes.FLAME, + (double) ((float) pos.getX() + 0.75F - (rand.nextFloat() / 2.0F)), + (double) ((float) pos.getY() + 0.25F + (rand.nextFloat() / 2.0F)), + (double) ((float) pos.getZ() + 0.75F - (rand.nextFloat() / 2.0F)), 0.0D, 0.0D, 0.0D, + new int[] { Block.getStateId(state) }); + worldIn.spawnParticle(EnumParticleTypes.FLAME, + (double) ((float) pos.getX() + 0.75F - (rand.nextFloat() / 2.0F)), + (double) ((float) pos.getY() + 0.25F + (rand.nextFloat() / 2.0F)), + (double) ((float) pos.getZ() + 0.75F - (rand.nextFloat() / 2.0F)), 0.0D, 0.0D, 0.0D, + new int[] { Block.getStateId(state) }); + + worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, + (double) ((float) pos.getX() + 0.75F - (rand.nextFloat() / 2.0F)), + (double) ((float) pos.getY() + 0.9F), + (double) ((float) pos.getZ() + 0.75F - (rand.nextFloat() / 2.0F)), 0.0D, 0.0D, 0.0D, + new int[] { Block.getStateId(state) }); + + if (rand.nextInt(2) == 0) { + worldIn.spawnParticle(EnumParticleTypes.SMOKE_LARGE, + (double) ((float) pos.getX() + 0.75F - (rand.nextFloat() / 2.0F)), + (double) ((float) pos.getY() + 0.9F), + (double) ((float) pos.getZ() + 0.75F - (rand.nextFloat() / 2.0F)), 0.0D, 0.0D, 0.0D, + new int[] { Block.getStateId(state) }); + } + } + } + + @Override + public int quantityDropped(Random random) { + return 0; // Campfires shouldn't drop anything when mined + } + + // not opaque + @Override + public boolean isOpaqueCube(IBlockState state) { + return false; + } + + // not full cube + @Override + public boolean isFullCube(IBlockState state) { + return false; + } + + @Override + public boolean canPlaceBlockAt(World worldIn, BlockPos pos) { + return worldIn.getBlockState(pos).getBlock().isReplaceable(worldIn, pos) + && worldIn.getBlockState(pos.down()).isSideSolid(worldIn, pos, EnumFacing.UP); + } + + @SideOnly(Side.CLIENT) + @Override + public BlockRenderLayer getBlockLayer() { + return BlockRenderLayer.CUTOUT; + } + + @Override + public IBlockState getStateFromMeta(int meta) { + return this.getDefaultState().withProperty(AGE, meta >> 1).withProperty(BURNING, + Boolean.valueOf((meta & 1) > 0)); + } + + @Override + public int getMetaFromState(IBlockState state) { + int meta = state.getValue(AGE) << 1; + return ((Boolean) state.getValue(BURNING)).booleanValue() ? meta | 1 : meta; + } + + @Override + protected BlockStateContainer createBlockState() { + return new BlockStateContainer(this, new IProperty[] { AGE, BURNING }); + } + +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockTANDeadCrops.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockTANDeadCrops.java new file mode 100644 index 00000000..9a20017e --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockTANDeadCrops.java @@ -0,0 +1,48 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.block; + +import java.util.Random; + +import net.minecraft.block.BlockBush; +import net.minecraft.block.SoundType; +import net.minecraft.block.state.IBlockState; +import net.minecraft.init.Blocks; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockAccess; + +public class BlockTANDeadCrops extends BlockBush +{ + private static final AxisAlignedBB BOUNDING_BOX = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 0.125D, 1.0D); + + public BlockTANDeadCrops() + { + this.setHardness(0.0F); + this.setSoundType(SoundType.PLANT); + this.disableStats(); + } + + @Override + protected boolean canSustainBush(IBlockState state) + { + return state.getBlock() == Blocks.FARMLAND; + } + + @Override + public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) + { + return BOUNDING_BOX; + } + + @Override + public int quantityDropped(Random random) + { + return 0; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockTANGas.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockTANGas.java new file mode 100644 index 00000000..9b4b8694 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockTANGas.java @@ -0,0 +1,269 @@ +package toughasnails.block; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.properties.PropertyEnum; +import net.minecraft.block.state.BlockStateContainer; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityFallingBlock; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.init.MobEffects; +import net.minecraft.item.ItemBlock; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.EnumBlockRenderType; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumParticleTypes; +import net.minecraft.util.IStringSerializable; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.Explosion; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import toughasnails.api.ITANBlock; +import toughasnails.item.ItemTANBlock; + +public class BlockTANGas extends Block implements ITANBlock { + + // add properties + public static enum GasType implements IStringSerializable { + BLACKDAMP, WHITEDAMP, FIREDAMP, STINKDAMP; + @Override + public String getName() { + return this.name().toLowerCase(); + } + + @Override + public String toString() { + return this.getName(); + } + }; + + @SuppressWarnings("rawtypes") + public static final PropertyEnum VARIANT = PropertyEnum.create("variant", GasType.class); + + @Override + protected BlockStateContainer createBlockState() { + return new BlockStateContainer(this, new IProperty[] { VARIANT }); + } + + // implement IBOPBlock + @Override + public Class getItemClass() { + return ItemTANBlock.class; + } + + @SuppressWarnings("rawtypes") + @Override + public IProperty[] getPresetProperties() { + return new IProperty[] { VARIANT }; + } + + @SuppressWarnings("rawtypes") + @Override + public IProperty[] getNonRenderingProperties() { + return null; + } + + @SuppressWarnings("unchecked") + @Override + public String getStateName(IBlockState state) { + return ((GasType) state.getValue(VARIANT)).getName() + "_block"; + } + + @SuppressWarnings("unchecked") + public BlockTANGas() { + super(Material.AIR); + // set some defaults + this.setHardness(0.0F); + this.setDefaultState(this.blockState.getBaseState().withProperty(VARIANT, GasType.BLACKDAMP)); + } + + @SuppressWarnings("unchecked") + @Override + public IBlockState getStateFromMeta(int meta) { + return this.getDefaultState().withProperty(VARIANT, GasType.values()[meta]); + } + + @SuppressWarnings("unchecked") + @Override + public int getMetaFromState(IBlockState state) { + return ((GasType) state.getValue(VARIANT)).ordinal(); + } + + @SuppressWarnings("unchecked") + @Override + @SideOnly(Side.CLIENT) + public void randomDisplayTick(IBlockState state, World worldIn, BlockPos pos, Random rand) { + // randomly throw up some particles so it looks like the flesh is + // bubbling + super.randomDisplayTick(state, worldIn, pos, rand); + + switch ((GasType) state.getValue(VARIANT)) { + case WHITEDAMP: + if (rand.nextInt(12) == 0) { + worldIn.spawnParticle(EnumParticleTypes.SPELL_MOB, + (double) ((float) pos.getX() + 0.75F - (rand.nextFloat() / 2.0F)), + (double) ((float) pos.getY() + 0.9F), + (double) ((float) pos.getZ() + 0.75F - (rand.nextFloat() / 2.0F)), 0.0D, 0.0D, 0.0D, + new int[] { Block.getStateId(state) }); + } + + case STINKDAMP: + if (rand.nextInt(12) == 0) { + worldIn.spawnParticle(EnumParticleTypes.SPELL_MOB, + (double) ((float) pos.getX() + 0.75F - (rand.nextFloat() / 2.0F)), + (double) ((float) pos.getY() + 0.9F), + (double) ((float) pos.getZ() + 0.75F - (rand.nextFloat() / 2.0F)), 0.0D, 0.0D, 0.0D, + new int[] { Block.getStateId(state) }); + } + + case FIREDAMP: + if (rand.nextInt(12) == 0) { + worldIn.spawnParticle(EnumParticleTypes.SPELL_MOB, + (double) ((float) pos.getX() + 0.75F - (rand.nextFloat() / 2.0F)), + (double) ((float) pos.getY() + 0.9F), + (double) ((float) pos.getZ() + 0.75F - (rand.nextFloat() / 2.0F)), 0.0D, 0.0D, 0.0D, + new int[] { Block.getStateId(state) }); + } + + case BLACKDAMP: + default: + if (rand.nextInt(12) == 0) { + worldIn.spawnParticle(EnumParticleTypes.SPELL_MOB, + (double) ((float) pos.getX() + 0.75F - (rand.nextFloat() / 2.0F)), + (double) ((float) pos.getY() + 0.9F), + (double) ((float) pos.getZ() + 0.75F - (rand.nextFloat() / 2.0F)), 0.0D, 0.0D, 0.0D, + new int[] { Block.getStateId(state) }); + } + } + } + + @Override + public EnumBlockRenderType getRenderType(IBlockState state) { + return EnumBlockRenderType.INVISIBLE; + } + + // no collision box - you can walk straight through them + @Override + public AxisAlignedBB getCollisionBoundingBox(IBlockState state, World world, BlockPos pos) { + return NULL_AABB; + } + + @Override + public boolean isOpaqueCube(IBlockState state) { + return false; + } + + @Override + public boolean canDropFromExplosion(Explosion explosionIn) { + return false; + } + + @Override + public void dropBlockAsItemWithChance(World worldIn, BlockPos pos, IBlockState state, float chance, int fortune) { + } + + @Override + public boolean isReplaceable(IBlockAccess worldIn, BlockPos pos) { + return true; + } + + @SuppressWarnings("unchecked") + @Override + public int getFlammability(IBlockAccess world, BlockPos pos, EnumFacing face) { + IBlockState state = world.getBlockState(pos); + + switch ((GasType) state.getValue(VARIANT)) { + case FIREDAMP: + case STINKDAMP: + return 2000; + + case BLACKDAMP: + case WHITEDAMP: + default: + return 0; + } + } + + @SuppressWarnings("unchecked") + @Override + public int getFireSpreadSpeed(IBlockAccess world, BlockPos pos, EnumFacing face) { + IBlockState state = world.getBlockState(pos); + + switch ((GasType) state.getValue(VARIANT)) { + case FIREDAMP: + case STINKDAMP: + return 2000; + + case BLACKDAMP: + case WHITEDAMP: + default: + return 0; + } + } + + @SuppressWarnings("unchecked") + @Override + public void onBlockDestroyedByExplosion(World worldIn, BlockPos pos, Explosion explosionIn) { + IBlockState state = worldIn.getBlockState(pos); + + switch ((GasType) state.getValue(VARIANT)) { + case STINKDAMP: + if (!worldIn.isRemote) { + this.explode(worldIn, pos, state); + } + break; + + default: + break; + } + } + + @SuppressWarnings("unchecked") + @Override + public void onEntityCollidedWithBlock(World worldIn, BlockPos pos, IBlockState state, Entity entityIn) { + switch ((GasType) state.getValue(VARIANT)) { + // suffer wither effect if you walk on deathbloom + case WHITEDAMP: + if (entityIn instanceof EntityLivingBase) { + ((EntityLivingBase) entityIn).addPotionEffect(new PotionEffect(MobEffects.WEAKNESS, 500)); + ((EntityLivingBase) entityIn).addPotionEffect(new PotionEffect(MobEffects.HUNGER, 500)); + ((EntityLivingBase) entityIn).addPotionEffect(new PotionEffect(MobEffects.MINING_FATIGUE, 500)); + ((EntityLivingBase) entityIn).addPotionEffect(new PotionEffect(MobEffects.SLOWNESS, 500)); + } + break; + case STINKDAMP: + if (!worldIn.isRemote && entityIn instanceof EntityArrow) { + EntityArrow entityarrow = (EntityArrow) entityIn; + + if (entityarrow.isBurning()) { + this.explode(worldIn, pos, state); + } + } + break; + + default: + break; + } + } + + public void explode(World worldIn, BlockPos pos, IBlockState state) { + if (!worldIn.isRemote) { + EntityFallingBlock explosion = new EntityFallingBlock(worldIn, (double) pos.getX(), (double) pos.getY(), + (double) pos.getZ(), state); + worldIn.spawnEntityInWorld(explosion); + + float f = 2.0F; + worldIn.createExplosion(explosion, pos.getX(), pos.getY(), pos.getZ(), f, true); + + worldIn.setBlockToAir(pos); + } + } +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockTANGeneric.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockTANGeneric.java new file mode 100644 index 00000000..87bbf3c0 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockTANGeneric.java @@ -0,0 +1,49 @@ +package toughasnails.block; + +import net.minecraft.block.Block; +import net.minecraft.block.SoundType; +import net.minecraft.block.material.Material; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.state.IBlockState; +import net.minecraft.item.ItemBlock; +import toughasnails.api.ITANBlock; +import toughasnails.item.ItemTANBlock; + +public class BlockTANGeneric extends Block implements ITANBlock { + + // implement IBOPBlock + @Override + public Class getItemClass() { + return ItemTANBlock.class; + } + + @SuppressWarnings("rawtypes") + @Override + public IProperty[] getPresetProperties() { + return new IProperty[] {}; + } + + @SuppressWarnings("rawtypes") + @Override + public IProperty[] getNonRenderingProperties() { + return null; + } + + @Override + public String getStateName(IBlockState state) { + return ""; + } + + public BlockTANGeneric() { + // use rock as default material + this(Material.ROCK); + } + + public BlockTANGeneric(Material material) { + super(material); + // set some defaults + this.setHardness(1.0F); + this.setSoundType(SoundType.STONE); + } + +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockTANTemperatureCoil.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockTANTemperatureCoil.java new file mode 100644 index 00000000..d6cd2794 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockTANTemperatureCoil.java @@ -0,0 +1,213 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.block; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.properties.PropertyBool; +import net.minecraft.block.properties.PropertyEnum; +import net.minecraft.block.state.BlockStateContainer; +import net.minecraft.block.state.IBlockState; +import net.minecraft.item.ItemBlock; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumBlockRenderType; +import net.minecraft.util.EnumParticleTypes; +import net.minecraft.util.IStringSerializable; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import toughasnails.api.ITANBlock; +import toughasnails.core.ToughAsNails; +import toughasnails.item.ItemTANBlock; +import toughasnails.particle.TANParticleTypes; +import toughasnails.tileentity.TileEntityTemperatureSpread; + +public class BlockTANTemperatureCoil extends BlockContainer implements ITANBlock { + public static final PropertyEnum VARIANT = PropertyEnum.create("variant", CoilType.class); + public static final PropertyBool POWERED = PropertyBool.create("powered"); + protected static final AxisAlignedBB BOUNDING_BOX = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 0.75D, 1.0D); + + // implement ITANBlock + @Override + public Class getItemClass() { + return ItemTANBlock.class; + } + + @SuppressWarnings("rawtypes") + @Override + public IProperty[] getPresetProperties() { + return new IProperty[] { VARIANT }; + } + + @SuppressWarnings("rawtypes") + @Override + public IProperty[] getNonRenderingProperties() { + return null; + } + + @Override + public String getStateName(IBlockState state) { + return ((CoilType) state.getValue(VARIANT)).getName() + "_coil"; + } + + public BlockTANTemperatureCoil() { + super(Material.IRON); + this.setHardness(1.0F); + this.setDefaultState(this.blockState.getBaseState().withProperty(VARIANT, CoilType.COOLING) + .withProperty(POWERED, Boolean.valueOf(false))); + } + + @Override + public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { + return BOUNDING_BOX; + } + + @Override + public AxisAlignedBB getCollisionBoundingBox(IBlockState state, World world, BlockPos pos) { + return BOUNDING_BOX; + } + + @Override + public IBlockState getStateFromMeta(int meta) { + return this.getDefaultState().withProperty(VARIANT, CoilType.values()[meta & 1]).withProperty(POWERED, + Boolean.valueOf((meta & 8) > 0)); + } + + @Override + @SideOnly(Side.CLIENT) + public void randomDisplayTick(IBlockState state, World world, BlockPos pos, Random rand) { + if (state.getValue(POWERED) == true) { + if (state.getValue(VARIANT) == CoilType.HEATING) { + double d0 = (double) ((float) pos.getX() + 0.4F + rand.nextFloat() * 0.2F); + double d1 = (double) ((float) pos.getY() + 0.7F + rand.nextFloat() * 0.3F); + double d2 = (double) ((float) pos.getZ() + 0.4F + rand.nextFloat() * 0.2F); + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0, d1, d2, 0.0D, 0.0D, 0.0D, new int[0]); + } + if (state.getValue(VARIANT) == CoilType.COOLING) { + double d0 = (double) ((float) pos.getX() + 0.4F + rand.nextFloat() * 0.2F); + double d1 = (double) ((float) pos.getY() + 0.7F + rand.nextFloat() * 0.3F); + double d2 = (double) ((float) pos.getZ() + 0.4F + rand.nextFloat() * 0.2F); + ToughAsNails.proxy.spawnParticle(TANParticleTypes.SNOWFLAKE, d0, d1, d2, 0.0D, 0.0D, 0.0D, new int[0]); + } + } + } + + @Override + public int damageDropped(IBlockState state) { + return ((CoilType) state.getValue(VARIANT)).ordinal(); // Always drop + // the unpowered + // version + } + + @Override + public int getMetaFromState(IBlockState state) { + int baseMeta = ((CoilType) state.getValue(VARIANT)).ordinal(); + return baseMeta | (state.getValue(POWERED) ? 8 : 0); + } + + @Override + public int getLightValue(IBlockState state) { + return (Boolean) state.getValue(POWERED) ? 7 : 0; + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + IBlockState state = this.getStateFromMeta(meta); + switch (state.getValue(VARIANT)) { + case COOLING: + return new TileEntityTemperatureSpread(-10); + + case HEATING: + return new TileEntityTemperatureSpread(10); + } + + return null; + } + + @Override + public void breakBlock(World world, BlockPos pos, IBlockState state) { + if (TileEntityTemperatureSpread.ENABLE_DEBUG) { + TileEntity te = world.getTileEntity(pos); + + if (!world.isRemote && te != null) { + TileEntityTemperatureSpread tempFill = (TileEntityTemperatureSpread) te; + + tempFill.reset(); + } + } + + super.breakBlock(world, pos, state); + } + + @Override + public void neighborChanged(IBlockState state, World world, BlockPos pos, Block neighborBlock) { + updatePowered(world, pos, state); + } + + @Override + public void updateTick(World world, BlockPos pos, IBlockState state, Random rand) { + updatePowered(world, pos, state); + } + + private void updatePowered(World world, BlockPos pos, IBlockState state) { + boolean powered = world.isBlockPowered(pos) || world.isBlockPowered(pos.up()); + TileEntity te = world.getTileEntity(pos); + + if (!world.isRemote && te != null && powered != (Boolean) world.getBlockState(pos).getValue(POWERED)) { + TileEntityTemperatureSpread tempFill = (TileEntityTemperatureSpread) te; + + if (powered) { + tempFill.fill(); + world.setBlockState(pos, state.withProperty(POWERED, Boolean.valueOf(true))); + } else { + tempFill.reset(); + world.setBlockState(pos, state.withProperty(POWERED, Boolean.valueOf(false))); + } + } + } + + @Override + public boolean isOpaqueCube(IBlockState state) { + return false; + } + + @Override + public boolean isFullCube(IBlockState state) { + return false; + } + + @Override + public EnumBlockRenderType getRenderType(IBlockState state) { + return EnumBlockRenderType.MODEL; + } + + @Override + protected BlockStateContainer createBlockState() { + return new BlockStateContainer(this, new IProperty[] { VARIANT, POWERED }); + } + + public static enum CoilType implements IStringSerializable { + COOLING, HEATING; + @Override + public String getName() { + return this.name().toLowerCase(); + } + + @Override + public String toString() { + return this.getName(); + } + }; +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockTANTorchNew.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockTANTorchNew.java new file mode 100644 index 00000000..0ea674df --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/block/BlockTANTorchNew.java @@ -0,0 +1,375 @@ +package toughasnails.block; + +import java.util.Random; + +import javax.annotation.Nullable; + +import com.google.common.base.Predicate; + +import net.minecraft.block.Block; +import net.minecraft.block.SoundType; +import net.minecraft.block.material.Material; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.properties.PropertyBool; +import net.minecraft.block.properties.PropertyDirection; +import net.minecraft.block.properties.PropertyInteger; +import net.minecraft.block.state.BlockStateContainer; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; +import net.minecraft.init.SoundEvents; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.BlockRenderLayer; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.EnumParticleTypes; +import net.minecraft.util.Mirror; +import net.minecraft.util.Rotation; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import toughasnails.api.ITANBlock; +import toughasnails.api.TANBlocks; +import toughasnails.item.ItemTANBlock; + +public class BlockTANTorchNew extends Block implements ITANBlock { + public static final PropertyDirection FACING = PropertyDirection.create("facing", new Predicate() { + public boolean apply(@Nullable EnumFacing p_apply_1_) { + return p_apply_1_ != EnumFacing.DOWN; + } + }); + + public static final PropertyInteger AGE = PropertyInteger.create("age", 0, 15); + public static final PropertyBool BURNING = PropertyBool.create("burning"); + + // implement ITANBlock + @Override + public Class getItemClass() { + return ItemTANBlock.class; + } + + @SuppressWarnings("rawtypes") + @Override + public IProperty[] getPresetProperties() { + return new IProperty[] {}; + } + + @SuppressWarnings("rawtypes") + @Override + public IProperty[] getNonRenderingProperties() { + return null; + } + + @Override + public String getStateName(IBlockState state) { + return ""; + } + + protected static final AxisAlignedBB STANDING_AABB = new AxisAlignedBB(0.4000000059604645D, 0.0D, + 0.4000000059604645D, 0.6000000238418579D, 0.6000000238418579D, 0.6000000238418579D); + protected static final AxisAlignedBB TORCH_NORTH_AABB = new AxisAlignedBB(0.3499999940395355D, 0.20000000298023224D, + 0.699999988079071D, 0.6499999761581421D, 0.800000011920929D, 1.0D); + protected static final AxisAlignedBB TORCH_SOUTH_AABB = new AxisAlignedBB(0.3499999940395355D, 0.20000000298023224D, + 0.0D, 0.6499999761581421D, 0.800000011920929D, 0.30000001192092896D); + protected static final AxisAlignedBB TORCH_WEST_AABB = new AxisAlignedBB(0.699999988079071D, 0.20000000298023224D, + 0.3499999940395355D, 1.0D, 0.800000011920929D, 0.6499999761581421D); + protected static final AxisAlignedBB TORCH_EAST_AABB = new AxisAlignedBB(0.0D, 0.20000000298023224D, + 0.3499999940395355D, 0.30000001192092896D, 0.800000011920929D, 0.6499999761581421D); + + public BlockTANTorchNew() { + super(Material.CIRCUITS); + this.setHardness(0.0F); + this.setSoundType(SoundType.WOOD); + this.setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.UP) + .withProperty(AGE, Integer.valueOf(0)).withProperty(BURNING, Boolean.valueOf(true))); + this.setTickRandomly(true); + } + + @Override + public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { + switch ((EnumFacing) state.getValue(FACING)) { + case EAST: + return TORCH_EAST_AABB; + case WEST: + return TORCH_WEST_AABB; + case SOUTH: + return TORCH_SOUTH_AABB; + case NORTH: + return TORCH_NORTH_AABB; + default: + return STANDING_AABB; + } + } + + @Nullable + @Override + public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, World worldIn, BlockPos pos) { + return NULL_AABB; + } + + @Override + public boolean isOpaqueCube(IBlockState state) { + return false; + } + + @Override + public boolean isFullCube(IBlockState state) { + return false; + } + + @Override + public void updateTick(World worldIn, BlockPos pos, IBlockState state, Random rand) { + super.updateTick(worldIn, pos, state, rand); + + int age = ((Integer) state.getValue(AGE)).intValue(); + + if (state.getValue(BURNING) == true) { + if (worldIn.isRainingAt(pos)) { + worldIn.setBlockState(pos, state.withProperty(BURNING, false).withProperty(AGE, 15), 2); + worldIn.playSound((EntityPlayer) null, pos, SoundEvents.BLOCK_LAVA_EXTINGUISH, SoundCategory.BLOCKS, + 0.5F, 2.6F + (worldIn.rand.nextFloat() - worldIn.rand.nextFloat()) * 0.8F); + } + if (age < 15) { + if (rand.nextInt(8) == 0) { + worldIn.setBlockState(pos, state.withProperty(AGE, Integer.valueOf(age + 1)), 2); + } + } + if (age == 15) { + if (rand.nextInt(8) == 0) { + worldIn.setBlockState(pos, state.withProperty(BURNING, false), 2); + } + } + } + } + + @Override + public int getLightValue(IBlockState state, IBlockAccess world, BlockPos pos) { + if (state.getValue(BURNING) == true) { + return (int) (15.0F * 0.9375F); + } else { + return 0; + } + } + + @Override + public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, + EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) { + if (playerIn.getHeldItem(hand) != null) { + Item item = playerIn.getHeldItem(hand).getItem(); + int age = ((Integer) state.getValue(AGE)).intValue(); + + if (age == 0) { + if (state.getValue(BURNING) == false) { + if (!worldIn.isRainingAt(pos)) { + if (item == Items.FLINT_AND_STEEL) { + worldIn.playSound(playerIn, pos, SoundEvents.ITEM_FLINTANDSTEEL_USE, SoundCategory.BLOCKS, + 1.0F, worldIn.rand.nextFloat() * 0.4F + 0.8F); + worldIn.setBlockState(pos, TANBlocks.torch_new.getDefaultState() + .withProperty(FACING, state.getValue(FACING)).withProperty(BURNING, true)); + + if (item == Items.FLINT_AND_STEEL) { + playerIn.getHeldItem(hand).damageItem(1, playerIn); + } + + return true; + } + } + } + } + } + + return super.onBlockActivated(worldIn, pos, state, playerIn, hand, heldItem, side, hitX, hitY, hitZ); + } + + private boolean canPlaceOn(World worldIn, BlockPos pos) { + IBlockState state = worldIn.getBlockState(pos); + if (state.isSideSolid(worldIn, pos, EnumFacing.UP)) { + return true; + } else { + return state.getBlock().canPlaceTorchOnTop(state, worldIn, pos); + } + } + + @Override + public boolean canPlaceBlockAt(World worldIn, BlockPos pos) { + for (EnumFacing enumfacing : FACING.getAllowedValues()) { + if (this.canPlaceAt(worldIn, pos, enumfacing)) { + return true; + } + } + + return false; + } + + private boolean canPlaceAt(World worldIn, BlockPos pos, EnumFacing facing) { + BlockPos blockpos = pos.offset(facing.getOpposite()); + boolean flag = facing.getAxis().isHorizontal(); + return flag && worldIn.isSideSolid(blockpos, facing, true) + || facing.equals(EnumFacing.UP) && this.canPlaceOn(worldIn, blockpos); + } + + @Override + public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, + float hitZ, int meta, EntityLivingBase placer, ItemStack stack) { + if (this.canPlaceAt(world, pos, facing)) { + return this.getDefaultState().withProperty(FACING, facing); + } else { + for (EnumFacing enumfacing : EnumFacing.Plane.HORIZONTAL) { + if (world.isSideSolid(pos.offset(enumfacing.getOpposite()), enumfacing, true)) { + return this.getDefaultState().withProperty(FACING, enumfacing); + } + } + + return this.getDefaultState(); + } + } + + @Override + public void onBlockAdded(World worldIn, BlockPos pos, IBlockState state) { + this.checkForDrop(worldIn, pos, state); + } + + @Override + public void neighborChanged(IBlockState state, World worldIn, BlockPos pos, Block blockIn) { + this.onNeighborChangeInternal(worldIn, pos, state); + } + + protected boolean onNeighborChangeInternal(World worldIn, BlockPos pos, IBlockState state) { + if (!this.checkForDrop(worldIn, pos, state)) { + return true; + } else { + EnumFacing enumfacing = (EnumFacing) state.getValue(FACING); + EnumFacing.Axis enumfacing$axis = enumfacing.getAxis(); + EnumFacing enumfacing1 = enumfacing.getOpposite(); + boolean flag = false; + + if (enumfacing$axis.isHorizontal() && !worldIn.isSideSolid(pos.offset(enumfacing1), enumfacing, true)) { + flag = true; + } else if (enumfacing$axis.isVertical() && !this.canPlaceOn(worldIn, pos.offset(enumfacing1))) { + flag = true; + } + + if (flag) { + this.dropBlockAsItem(worldIn, pos, state, 0); + worldIn.setBlockToAir(pos); + return true; + } else { + return false; + } + } + } + + protected boolean checkForDrop(World worldIn, BlockPos pos, IBlockState state) { + if (state.getBlock() == this && this.canPlaceAt(worldIn, pos, (EnumFacing) state.getValue(FACING))) { + return true; + } else { + if (worldIn.getBlockState(pos).getBlock() == this) { + this.dropBlockAsItem(worldIn, pos, state, 0); + worldIn.setBlockToAir(pos); + } + + return false; + } + } + + @SideOnly(Side.CLIENT) + @Override + public void randomDisplayTick(IBlockState stateIn, World worldIn, BlockPos pos, Random rand) { + EnumFacing enumfacing = (EnumFacing) stateIn.getValue(FACING); + double d0 = (double) pos.getX() + 0.5D; + double d1 = (double) pos.getY() + 0.7D; + double d2 = (double) pos.getZ() + 0.5D; + double d3 = 0.22D; + double d4 = 0.27D; + + if (enumfacing.getAxis().isHorizontal()) { + EnumFacing enumfacing1 = enumfacing.getOpposite(); + worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + d4 * (double) enumfacing1.getFrontOffsetX(), + d1 + d3, d2 + d4 * (double) enumfacing1.getFrontOffsetZ(), 0.0D, 0.0D, 0.0D, new int[0]); + worldIn.spawnParticle(EnumParticleTypes.FLAME, d0 + d4 * (double) enumfacing1.getFrontOffsetX(), d1 + d3, + d2 + d4 * (double) enumfacing1.getFrontOffsetZ(), 0.0D, 0.0D, 0.0D, new int[0]); + } else { + worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0, d1, d2, 0.0D, 0.0D, 0.0D, new int[0]); + worldIn.spawnParticle(EnumParticleTypes.FLAME, d0, d1, d2, 0.0D, 0.0D, 0.0D, new int[0]); + } + } + + @Override + public IBlockState getStateFromMeta(int meta) { + IBlockState iblockstate = this.getDefaultState(); + + switch (meta) { + case 1: + iblockstate = iblockstate.withProperty(FACING, EnumFacing.EAST); + break; + case 2: + iblockstate = iblockstate.withProperty(FACING, EnumFacing.WEST); + break; + case 3: + iblockstate = iblockstate.withProperty(FACING, EnumFacing.SOUTH); + break; + case 4: + iblockstate = iblockstate.withProperty(FACING, EnumFacing.NORTH); + break; + case 5: + default: + iblockstate = iblockstate.withProperty(FACING, EnumFacing.UP); + } + + return iblockstate; + } + + @SideOnly(Side.CLIENT) + @Override + public BlockRenderLayer getBlockLayer() { + return BlockRenderLayer.CUTOUT; + } + + @Override + public int getMetaFromState(IBlockState state) { + int i = 0; + + switch ((EnumFacing) state.getValue(FACING)) { + case EAST: + i = i | 1; + break; + case WEST: + i = i | 2; + break; + case SOUTH: + i = i | 3; + break; + case NORTH: + i = i | 4; + break; + case DOWN: + case UP: + default: + i = i | 5; + } + + return i; + } + + @Override + public IBlockState withRotation(IBlockState state, Rotation rot) { + return state.withProperty(FACING, rot.rotate((EnumFacing) state.getValue(FACING))); + } + + @Override + public IBlockState withMirror(IBlockState state, Mirror mirrorIn) { + return state.withRotation(mirrorIn.toRotation((EnumFacing) state.getValue(FACING))); + } + + @Override + protected BlockStateContainer createBlockState() { + return new BlockStateContainer(this, new IProperty[] { FACING, AGE, BURNING }); + } +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/client/gui/GuiFactory.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/client/gui/GuiFactory.java new file mode 100644 index 00000000..9eeda961 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/client/gui/GuiFactory.java @@ -0,0 +1,30 @@ +package toughasnails.client.gui; + +import java.util.Set; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; +import net.minecraftforge.fml.client.IModGuiFactory; + +public class GuiFactory implements IModGuiFactory { + + @Override + public void initialize(Minecraft minecraftInstance) { + } + + @Override + public Class mainConfigGuiClass() { + return GuiTANConfig.class; + } + + @Override + public Set runtimeGuiCategories() { + return null; + } + + @SuppressWarnings("deprecation") + @Override + public RuntimeOptionGuiHandler getHandlerFor(RuntimeOptionCategoryElement element) { + return null; + } +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/client/gui/GuiTANConfig.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/client/gui/GuiTANConfig.java new file mode 100644 index 00000000..d212986a --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/client/gui/GuiTANConfig.java @@ -0,0 +1,41 @@ +package toughasnails.client.gui; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.util.text.translation.I18n; +import net.minecraftforge.common.config.ConfigElement; +import net.minecraftforge.fml.client.config.DummyConfigElement; +import net.minecraftforge.fml.client.config.GuiConfig; +import net.minecraftforge.fml.client.config.IConfigElement; +import toughasnails.config.GameplayConfigurationHandler; +import toughasnails.core.ToughAsNails; + +@SuppressWarnings("deprecation") +public class GuiTANConfig extends GuiConfig { + public GuiTANConfig(GuiScreen parentScreen) { + super(parentScreen, GuiTANConfig.getConfigElements(), ToughAsNails.MOD_ID, false, false, "/toughasnails"); + } + + private static List getConfigElements() { + List list = new ArrayList(); + + List SURVIVAL_SETTINGS = new ConfigElement(GameplayConfigurationHandler.config + .getCategory(GameplayConfigurationHandler.SURVIVAL_SETTINGS.toLowerCase())).getChildElements(); + + List DRINK_SETTINGS = new ConfigElement( + GameplayConfigurationHandler.config.getCategory(GameplayConfigurationHandler.DRINKS.toLowerCase())) + .getChildElements(); + + list.add(new DummyConfigElement.DummyCategoryElement( + I18n.translateToLocal("config.category.survivalSettings.title"), "config.category.arrowSettings", + SURVIVAL_SETTINGS)); + + list.add(new DummyConfigElement.DummyCategoryElement( + I18n.translateToLocal("config.category.drinkSettings.title"), "config.category.arrowSettings", + DRINK_SETTINGS)); + + return list; + } +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/command/TANCommand.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/command/TANCommand.java new file mode 100644 index 00000000..792cd650 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/command/TANCommand.java @@ -0,0 +1,306 @@ +package toughasnails.command; + +import java.util.List; + +import com.google.common.collect.Lists; + +import net.minecraft.command.CommandBase; +import net.minecraft.command.CommandException; +import net.minecraft.command.CommandResultStats; +import net.minecraft.command.ICommandSender; +import net.minecraft.command.WrongUsageException; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraftforge.fml.common.FMLCommonHandler; +import toughasnails.api.TANCapabilities; +import toughasnails.api.TANPotions; +import toughasnails.api.config.GameplayOption; +import toughasnails.api.config.SyncedConfig; +import toughasnails.api.season.Season.SubSeason; +import toughasnails.api.temperature.Temperature; +import toughasnails.api.temperature.TemperatureScale; +import toughasnails.api.thirst.ThirstHelper; +import toughasnails.handler.health.MaxHealthHandler; +import toughasnails.handler.season.SeasonHandler; +import toughasnails.season.SeasonSavedData; +import toughasnails.season.SeasonTime; +import toughasnails.temperature.TemperatureDebugger; +import toughasnails.temperature.TemperatureHandler; +import toughasnails.thirst.ThirstHandler; + +public class TANCommand extends CommandBase { + + @Override + public String getCommandName() { + return "toughasnails"; + } + + @Override + public String getCommandUsage(ICommandSender sender) { + return "commands.toughasnails.usage"; + } + + @Override + public List getCommandAliases() { + return Lists.newArrayList("tan"); + } + + @Override + public int getRequiredPermissionLevel() { + return 2; + } + + @Override + public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { + if (args.length < 1) { + throw new WrongUsageException("commands.toughasnails.usage"); + } else if ("tempinfo".equals(args[0])) { + displayTemperatureInfo(sender, args); + } else if ("tempat".equals(args[0])) { + if (args.length < 5 || args.length > 6) { + throw new WrongUsageException("commands.toughasnails.usage"); + } else { + retrieveTemperatureAt(sender, args); + } + } else if ("settemp".equals(args[0])) { + setTemperature(sender, args); + } else if ("setseason".equals(args[0])) { + if (args.length < 3 || args.length > 4) { + throw new WrongUsageException("commands.toughasnails.usage"); + } else { + setSeason(sender, args); + } + } else if ("setthirst".equals(args[0])) { + if (args.length != 3) { + throw new WrongUsageException("commands.toughasnails.usage"); + } else { + setThirst(sender, args); + } + } else if ("sethealth".equals(args[0])) { + if (args.length != 3) { + throw new WrongUsageException("commands.toughasnails.usage"); + } else { + setHealth(sender, args); + } + } + } + + private void displayTemperatureInfo(ICommandSender sender, String[] args) throws CommandException { + EntityPlayerMP player = getCommandSenderAsPlayer(sender); + TemperatureHandler temperatureStats = (TemperatureHandler) player.getCapability(TANCapabilities.TEMPERATURE, + null); + TemperatureDebugger debugger = temperatureStats.debugger; + + if (SyncedConfig.getBooleanValue(GameplayOption.ENABLE_TEMPERATURE)) { + debugger.setGuiVisible(!debugger.isGuiVisible(), player); + } else { + sender.addChatMessage(new TextComponentTranslation("commands.toughasnails.settemp.disabled")); + } + } + + // tan tempat + private void retrieveTemperatureAt(ICommandSender sender, String[] args) throws CommandException { + int dimensionID = 0; + int x = 0; + int y = 0; + int z = 0; + boolean printOutput = true; + try { + dimensionID = Integer.parseInt(args[1]); + x = Integer.parseInt(args[2]); + y = Integer.parseInt(args[3]); + z = Integer.parseInt(args[4]); + if (args.length >= 6) { + printOutput = Boolean.parseBoolean(args[5]); + } + } catch (NumberFormatException e) { + throw new WrongUsageException("commands.toughasnails.usage"); + } + + if (SyncedConfig.getBooleanValue(GameplayOption.ENABLE_TEMPERATURE)) { + World world = null; + WorldServer[] worldServers = FMLCommonHandler.instance().getMinecraftServerInstance().worldServers; + WorldServer candidate = FMLCommonHandler.instance().getMinecraftServerInstance() + .worldServerForDimension(dimensionID); + if (candidate == null) { + throw new WrongUsageException("commands.toughasnails.usage"); + } + + for (int i = 0; i < worldServers.length; i++) { + WorldServer target = worldServers[i]; + if (candidate.equals(target)) { + world = target; + break; + } + } + + if (world == null) { + throw new WrongUsageException("commands.toughasnails.usage"); + } + BlockPos position = new BlockPos(x, y, z); + + int finalTemperature = TemperatureHandler.getTargetTemperatureAt(world, position); + if (printOutput) { + sender.addChatMessage(new TextComponentTranslation("commands.toughasnails.tempat.success", dimensionID, + x, y, z, finalTemperature)); + } + sender.setCommandStat(CommandResultStats.Type.QUERY_RESULT, finalTemperature); + } else { + sender.addChatMessage(new TextComponentTranslation("commands.toughasnails.tempat.disabled")); + } + } + + private void setTemperature(ICommandSender sender, String[] args) throws CommandException { + EntityPlayerMP player = getCommandSenderAsPlayer(sender); + TemperatureHandler temperatureStats = (TemperatureHandler) player.getCapability(TANCapabilities.TEMPERATURE, + null); + int newTemp = parseInt(args[1], 0, TemperatureScale.getScaleTotal()); + // Temperature playerTemp = temperatureStats.getTemperature(); + + if (SyncedConfig.getBooleanValue(GameplayOption.ENABLE_TEMPERATURE)) { + // Remove any existing potion effects for hypo/hyperthermia + player.removePotionEffect(TANPotions.hypothermia); + player.removePotionEffect(TANPotions.hyperthermia); + + // Reset the change timer to 0 + temperatureStats.setChangeTime(0); + // Set to the new temperature + temperatureStats.setTemperature(new Temperature(newTemp)); + + sender.addChatMessage(new TextComponentTranslation("commands.toughasnails.settemp.success", newTemp)); + } else { + sender.addChatMessage(new TextComponentTranslation("commands.toughasnails.settemp.disabled")); + } + } + + private void setSeason(ICommandSender sender, String[] args) throws CommandException { + int dimensionID = 0; + boolean printOutput = true; + try { + dimensionID = Integer.parseInt(args[2]); + if (args.length >= 4) { + printOutput = Boolean.parseBoolean(args[3]); + } + } catch (NumberFormatException e) { + throw new WrongUsageException("commands.toughasnails.usage"); + } + SubSeason newSeason = null; + + for (SubSeason season : SubSeason.values()) { + if (season.toString().toLowerCase().equals(args[1].toLowerCase())) { + newSeason = season; + break; + } + } + + if (SyncedConfig.getBooleanValue(GameplayOption.ENABLE_SEASONS)) { + if (newSeason != null) { + World world = null; + WorldServer[] worldServers = FMLCommonHandler.instance().getMinecraftServerInstance().worldServers; + WorldServer candidate = FMLCommonHandler.instance().getMinecraftServerInstance() + .worldServerForDimension(dimensionID); + if (candidate == null) { + throw new WrongUsageException("commands.toughasnails.usage"); + } + + for (int i = 0; i < worldServers.length; i++) { + WorldServer target = worldServers[i]; + if (candidate.equals(target)) { + world = target; + break; + } + } + + if (world == null) { + throw new WrongUsageException("commands.toughasnails.usage"); + } + + SeasonSavedData seasonData = SeasonHandler.getSeasonSavedData(world); + seasonData.seasonCycleTicks = SeasonTime.DAY_TICKS * SeasonTime.SUB_SEASON_DURATION + * newSeason.ordinal(); + seasonData.markDirty(); + SeasonHandler.sendSeasonUpdate(world); + if (printOutput) { + sender.addChatMessage( + new TextComponentTranslation("commands.toughasnails.setseason.success", args[1])); + } + } else { + sender.addChatMessage(new TextComponentTranslation("commands.toughasnails.setseason.fail", args[1])); + } + } else { + sender.addChatMessage(new TextComponentTranslation("commands.toughasnails.setseason.disabled")); + } + } + + private void setHealth(ICommandSender sender, String[] args) throws CommandException { + String playerName = args[1]; + EntityPlayerMP player = FMLCommonHandler.instance().getMinecraftServerInstance().getPlayerList() + .getPlayerByUsername(playerName); + if (player == null) { + throw new WrongUsageException("commands.toughasnails.usage"); + } + + int newHealth = 0; + try { + newHealth = Integer.parseInt(args[2]); + } catch (NumberFormatException e) { + throw new WrongUsageException("commands.toughasnails.usage"); + } + + // If health is enabled + if (SyncedConfig.getBooleanValue(GameplayOption.ENABLE_LOWERED_STARTING_HEALTH)) { + + // Set the new health + MaxHealthHandler.overrideMaximumHealth(player.getUniqueID(), newHealth); + + sender.addChatMessage(new TextComponentTranslation("commands.toughasnails.sethealth.success", newHealth)); + } else { + sender.addChatMessage(new TextComponentTranslation("commands.toughasnails.sethealth.disabled")); + } + } + + private void setThirst(ICommandSender sender, String[] args) throws CommandException { + String playerName = args[1]; + EntityPlayerMP player = FMLCommonHandler.instance().getMinecraftServerInstance().getPlayerList() + .getPlayerByUsername(playerName); + if (player == null) { + throw new WrongUsageException("commands.toughasnails.usage"); + } + + int thirstLevel = 0; + try { + thirstLevel = Integer.parseInt(args[2]); + } catch (NumberFormatException e) { + throw new WrongUsageException("commands.toughasnails.usage"); + } + + // If thirst is enabled + if (SyncedConfig.getBooleanValue(GameplayOption.ENABLE_THIRST)) { + + // Remove any existing potion effects for thirst + player.removePotionEffect(TANPotions.thirst); + + // Set the new thirst + ThirstHandler thirstHandler = (ThirstHandler) ThirstHelper.getThirstData(player); + thirstHandler.setThirst(thirstLevel); + + sender.addChatMessage(new TextComponentTranslation("commands.toughasnails.setthirst.success", thirstLevel)); + } else { + sender.addChatMessage(new TextComponentTranslation("commands.toughasnails.setthirst.disabled")); + } + } + + @Override + public List getTabCompletionOptions(MinecraftServer server, ICommandSender sender, String[] args, + BlockPos pos) { + if (args.length == 1) { + return getListOfStringsMatchingLastWord(args, "settemp", "tempinfo", "setseason", "sethealth", "setthirst"); + } + + return null; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/config/CropGrowConfigEntry.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/config/CropGrowConfigEntry.java new file mode 100644 index 00000000..f3fa9e0c --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/config/CropGrowConfigEntry.java @@ -0,0 +1,38 @@ +package toughasnails.config; + +public class CropGrowConfigEntry { + private int minLiving; + private int minOptimal; + private int maxOptimal; + private int maxLiving; + private float nonOptimalChance; + + public CropGrowConfigEntry(int minLiving, int minOptimal, int maxOptimal, + int maxLiving, float nonOptimalChance) { + this.minLiving = minLiving; + this.minOptimal = minOptimal; + this.maxOptimal = maxOptimal; + this.maxLiving = maxLiving; + this.nonOptimalChance = nonOptimalChance; + } + + public int getMinLiving() { + return this.minLiving; + } + + public int getMinOptimal() { + return this.minOptimal; + } + + public int getMaxOptimal() { + return this.maxOptimal; + } + + public int getMaxLiving() { + return this.maxLiving; + } + + public float getNonOptimalChance() { + return this.nonOptimalChance; + } +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/config/GameplayConfigurationHandler.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/config/GameplayConfigurationHandler.java new file mode 100644 index 00000000..0dfc2580 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/config/GameplayConfigurationHandler.java @@ -0,0 +1,332 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.config; + +import java.io.File; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import net.minecraftforge.common.config.Configuration; +import net.minecraftforge.fml.client.event.ConfigChangedEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import toughasnails.api.config.GameplayOption; +import toughasnails.api.config.SyncedConfig; +import toughasnails.core.ToughAsNails; + +public class GameplayConfigurationHandler { + public static final String SURVIVAL_SETTINGS = "Survival Settings"; + public static final String DRINKS = "Drink Configuration"; + public static final String TEMPERATURE_TWEAKS = "Temperature Tweaks"; + public static final String CROP_TWEAKS = "Crop Tweaks"; + + public static Configuration config; + + public static final Map EXTERNAL_DECAYING_CROPS = new HashMap(); + public static final Map EXTERNAL_HIBERNATING_CROPS = new HashMap(); + + private static void parseExternalDecayingCrops() { + List crops = SyncedConfig.getListValue(GameplayOption.CROPS); + for (String cropEntry : crops) { + String[] cropData = cropEntry.split(";"); + if (cropData.length == 6) { + String cropName = cropData[0]; + System.out.println("Parsing crop: " + cropName); + int minLiving = 0; + int minOptimal = 0; + int maxOptimal = 0; + int maxLiving = 0; + float nonOptimalChance = 0; + try { + minLiving = Integer.parseInt(cropData[1]); + minOptimal = Integer.parseInt(cropData[2]); + maxOptimal = Integer.parseInt(cropData[3]); + maxLiving = Integer.parseInt(cropData[4]); + nonOptimalChance = Float.parseFloat(cropData[5]); + CropGrowConfigEntry cropGrowData = new CropGrowConfigEntry(minLiving, minOptimal, maxOptimal, + maxLiving, nonOptimalChance); + EXTERNAL_DECAYING_CROPS.put(cropName, cropGrowData); + } catch (NumberFormatException e) { + ToughAsNails.logger.error("Tried to process misconfigured crop! " + cropData.toString()); + } + } + } + } + + private static void parseExternalHibernatingCrops() { + List hibernating = SyncedConfig.getListValue(GameplayOption.HIBERNATING); + for (String cropEntry : hibernating) { + String[] cropData = cropEntry.split(";"); + if (cropData.length == 6) { + String cropName = cropData[0]; + System.out.println("Parsing hibernating crop: " + cropName); + int minWaking = 0; + int minOptimal = 0; + int maxOptimal = 0; + int maxWaking = 0; + float nonOptimalChance = 0; + try { + minWaking = Integer.parseInt(cropData[1]); + minOptimal = Integer.parseInt(cropData[2]); + maxOptimal = Integer.parseInt(cropData[3]); + maxWaking = Integer.parseInt(cropData[4]); + nonOptimalChance = Float.parseFloat(cropData[5]); + CropGrowConfigEntry cropGrowData = new CropGrowConfigEntry(minWaking, minOptimal, maxOptimal, + maxWaking, nonOptimalChance); + EXTERNAL_HIBERNATING_CROPS.put(cropName, cropGrowData); + } catch (NumberFormatException e) { + ToughAsNails.logger + .error("Tried to process misconfigured hibernating crop! " + cropData.toString()); + } + } + } + } + + public static void init(File configFile) { + if (config == null) { + config = new Configuration(configFile); + loadConfiguration(); + } + + // Parse the external decaying crops list into memory for greater + // efficiency. + if (EXTERNAL_DECAYING_CROPS.isEmpty()) { + parseExternalDecayingCrops(); + } + + // Parse the external hibernating crops list into memory for greater + // efficiency. + if (EXTERNAL_HIBERNATING_CROPS.isEmpty()) { + parseExternalHibernatingCrops(); + } + } + + private static void loadConfiguration() { + try { + // Major features + addSyncedBool(GameplayOption.ENABLE_LOWERED_STARTING_HEALTH, true, SURVIVAL_SETTINGS, + "Players begin with a lowered maximum health."); + addSyncedBool(GameplayOption.ENABLE_SEASONS, true, SURVIVAL_SETTINGS, "Seasons progress as days increase"); + addSyncedBool(GameplayOption.ENABLE_TEMPERATURE, true, SURVIVAL_SETTINGS, + "Players are affected by temperature"); + addSyncedBool(GameplayOption.ENABLE_THIRST, true, SURVIVAL_SETTINGS, "Players are affected by thirst"); + + // Drink list + String[] drinkDefault = { "minecraft:milk_bucket;*;6;0.4;0.0", "biomesoplenty:ambrosia;*;20;1.0;0.0", + "harvestcraft:blackberryItem;*;1;0.2;0.0", "harvestcraft:blueberryItem;*;1;0.2;0.0", + "harvestcraft:candleberryItem;*;1;0.2;0.0", "harvestcraft:raspberryItem;*;1;0.2;0.0", + "harvestcraft:strawberryItem;*;1;0.2;0.0", "harvestcraft:cactusfruitItem;*;3;0.5;0.0", + "harvestcraft:cantaloupeItem;*;1;0.3;0.0", "harvestcraft:cucumberItem;*;1;0.2;0.0", + "harvestcraft:tomatoItem;*;1;0.2;0.0", "harvestcraft:pineappleItem;*;2;0.4;0.0", + "harvestcraft:grapeItem;*;2;0.2;0.0", "harvestcraft:kiwiItem;*;2;0.2;0.0", + "harvestcraft:cranberryItem;*;1;0.1;0.0", "harvestcraft:cherryItem;*;1;0.1;0.0", + "harvestcraft:dragonfruitItem;*;1;0.2;0.0", "harvestcraft:lemonItem;*;1;0.2;0.0", + "harvestcraft:pearItem;*;1;0.1;0.0", "harvestcraft:grapefruitItem;*;2;0.2;0.0", + "harvestcraft:pomegranateItem;*;2;0.2;0.0", "harvestcraft:mangoItem;*;3;0.2;0.0", + "harvestcraft:coconutItem;*;6;0.4;0.0", "harvestcraft:orangeItem;*;3;0.3;0.0", + "harvestcraft:peachItem;*;2;0.2;0.0", "harvestcraft:raspberryjuiceItem;*;4;0.4;0.0", + "harvestcraft:freshmilkItem;*;6;0.1;0.0", "harvestcraft:teaItem;*;3;0.4;0.0", + "harvestcraft:coffeeItem;*;3;0.4;0.0", "harvestcraft:applejuiceItem;*;4;0.4;0.0", + "harvestcraft:melonjuiceItem;*;4;0.4;0.0", "harvestcraft:carrotjuiceItem;*;4;0.4;0.0", + "harvestcraft:strawberryjuiceItem;*;4;0.4;0.0", "harvestcraft:grapejuiceItem;*;4;0.4;0.0", + "harvestcraft:blueberryjuiceItem;*;4;0.4;0.0", "harvestcraft:cherryjuiceItem;*;4;0.4;0.0", + "harvestcraft:papayajuiceItem;*;4;0.4;0.0", "harvestcraft:starfruitjuiceItem;*;4;0.4;0.0", + "harvestcraft:orangejuiceItem;*;4;0.4;0.0", "harvestcraft:peachjuiceItem;*;4;0.4;0.0", + "harvestcraft:limejuiceItem;*;4;0.4;0.0", "harvestcraft:mangojuiceItem;*;4;0.4;0.0", + "harvestcraft:pomegranatejuiceItem;*;4;0.4;0.0", "harvestcraft:blackberryjuiceItem;*;4;0.4;0.0", + "harvestcraft:raspberryjuiceItem;*;4;0.4;0.0", "harvestcraft:kiwijuiceItem;*;4;0.4;0.0", + "harvestcraft:cranberryjuiceItem;*;4;0.4;0.0", "harvestcraft:cactusfruitjuiceItem;*;4;0.4;0.0", + "harvestcraft:plumjuiceItem;*;4;0.4;0.0", "harvestcraft:pearjuiceItem;*;4;0.4;0.0", + "harvestcraft:apricotjuiceItem;*;4;0.4;0.0", "harvestcraft:figjuiceItem;*;4;0.4;0.0", + "harvestcraft:grapefruitjuiceItem;*;4;0.4;0.0", "harvestcraft:persimmonjuiceItem;*;4;0.4;0.0", + "harvestcraft:pumkinsoupItem;*;4;0.4;0.0", "harvestcraft:melonsmoothieItem;*;5;0.4;0.0", + "harvestcraft:carrotsoupItem;*;4;0.4;0.0", "harvestcraft:strawberrysmoothieItem;*;4;0.4;0.0", + "harvestcraft:lemonadeItem;*;5;0.4;0.0", "harvestcraft:lemonsmoothieItem;*;5;0.4;0.0", + "harvestcraft:blueberrysmoothieItem;*;4;0.4;0.0", "harvestcraft:cherrysmoothieItem;*;4;0.4;0.0", + "harvestcraft:raspberryicedteaItem;*;4;0.5;0.0", "harvestcraft:chaiteaItem;*;5;0.4;0.0", + "harvestcraft:espressoItem;*;4;0.4;0.0", "harvestcraft:coffeeconlecheItem;*;4;0.4;0.0", + "harvestcraft:bananasmoothieItem;*;4;0.4;0.0", "harvestcraft:coconutmilkItem;*;6;0.1;0.0", + "harvestcraft:orangesmoothieItem;*;5;0.4;0.0", "harvestcraft:peachsmoothieItem;*;4;0.4;0.0", + "harvestcraft:pomegranatesmoothieItem;*;4;0.4;0.0", "harvestcraft:papayasmoothieItem;*;5;0.4;0.0", + "harvestcraft:mangosmoothieItem;*;5;0.4;0.0", "harvestcraft:blackberrysmoothieItem;*;4;0.4;0.0", + "harvestcraft:raspberrysmoothieItem;*;4;0.4;0.0", "harvestcraft:chocolatemilk;*;4;0.2;0.0", + "harvestcraft:pinacoladaItem;*;5;0.4;0.0", "harvestcraft:fruitpunchItem;*;5;0.4;0.0", + "harvestcraft:bubblywaterItem;*;1;0.1;0.0", "harvestcraft:cherrysodaItem;*;5;0.4;0.0", + "harvestcraft:colasodaItem;*;5;0.4;0.0", "harvestcraft:gingersodaItem;*;5;0.4;0.0", + "harvestcraft:grapesodaItem;*;5;0.4;0.0", "harvestcraft:lemonlimesodaItem;*;5;0.4;0.0", + "harvestcraft:orangesodaItem;*;5;0.4;0.0", "harvestcraft:rootbeersodaItem;*;5;0.4;0.0", + "harvestcraft:strawberrysodaItem;*;5;0.4;0.0", "harvestcraft:energydrinkItem;*;4;0.4;0.0", + "harvestcraft:appleciderItem;*;5;0.4;0.0", "harvestcraft:strawberrymilkshakeItem;*;4;0.4;0.0", + "harvestcraft:chocolatemilkshakeItem;*;4;0.4;0.0", "harvestcraft:bananamilkshakeItem;*;4;0.4;0.0", + "harvestcraft:applesmoothieItem;*;4;0.4;0.0", "harvestcraft:plumsmoothieItem;*;4;0.4;0.0", + "harvestcraft:coconutsmoothieItem;*;4;0.4;0.0", "harvestcraft:pearsmoothieItem;*;4;0.4;0.0", + "harvestcraft:grapesmoothieItem;*;4;0.4;0.0", "potioncore:custom_potion;*;2;0.0;0.1" }; + addSyncedList(GameplayOption.DRINKS, drinkDefault, DRINKS, + "List of additional drinks with configurable damage (* = any), thirst, " + + "hydration, and poison chance values. ;-delimited"); + + // Temperature tweaks + // Thermometer override + addSyncedBool(GameplayOption.OVERRIDE_THERMOMETER_LIMITS, false, TEMPERATURE_TWEAKS, + "Override the default TAN thermometer to have upper and lower bounds at the specified limits."); + addSyncedInt(GameplayOption.THERMOMETER_LOWER_BOUND, -25, TEMPERATURE_TWEAKS, + "The lower bound of the thermometer."); + addSyncedInt(GameplayOption.THERMOMETER_UPPER_BOUND, 25, TEMPERATURE_TWEAKS, + "The upper bound of the thermometer."); + + // Rain-chill + addSyncedBool(GameplayOption.RAIN_CHILL, true, TEMPERATURE_TWEAKS, + "Should rain reduce the temperature of a block in the world, or only snow?"); + + // Temperature modifiers + addSyncedInt(GameplayOption.BIOME_TEMP_MODIFIER, 10, TEMPERATURE_TWEAKS, + "Scale how significantly biome influences temperature."); + addSyncedInt(GameplayOption.ALTITUDE_TEMP_MODIFIER, 3, TEMPERATURE_TWEAKS, + "Scale how significantly altitude influences temperature."); + addSyncedInt(GameplayOption.WET_TEMP_MODIFIER, -7, TEMPERATURE_TWEAKS, + "Scale how significantly being wet influences temperature."); + addSyncedInt(GameplayOption.SNOW_TEMP_MODIFIER, -10, TEMPERATURE_TWEAKS, + "Scale how significantly snow influences temperature."); + addSyncedInt(GameplayOption.TIME_TEMP_MODIFIER, 7, TEMPERATURE_TWEAKS, + "Scale how significantly time of day influences temperature."); + addSyncedFloat(GameplayOption.TIME_EXTREMITY_MODIFIER, 1.25f, TEMPERATURE_TWEAKS, + "Scale how significantly the extreme times of day change the temperature."); + addSyncedInt(GameplayOption.EARLY_AUTUMN_MODIFIER, 2, TEMPERATURE_TWEAKS, + "Set how the temperature is modified in the EARLY_AUTUMN season."); + addSyncedInt(GameplayOption.MID_AUTUMN_MODIFIER, 0, TEMPERATURE_TWEAKS, + "Set how the temperature is modified in the MID_AUTUMN season."); + addSyncedInt(GameplayOption.LATE_AUTUMN_MODIFIER, -2, TEMPERATURE_TWEAKS, + "Set how the temperature is modified in the LATE_AUTUMN season."); + addSyncedInt(GameplayOption.EARLY_WINTER_MODIFIER, -4, TEMPERATURE_TWEAKS, + "Set how the temperature is modified in the EARLY_WINTER season."); + addSyncedInt(GameplayOption.MID_WINTER_MODIFIER, -6, TEMPERATURE_TWEAKS, + "Set how the temperature is modified in the MID_WINTER season."); + addSyncedInt(GameplayOption.LATE_WINTER_MODIFIER, -6, TEMPERATURE_TWEAKS, + "Set how the temperature is modified in the LATE_WINTER season."); + addSyncedInt(GameplayOption.EARLY_SPRING_MODIFIER, -4, TEMPERATURE_TWEAKS, + "Set how the temperature is modified in the EARLY_SPRING season."); + addSyncedInt(GameplayOption.MID_SPRING_MODIFIER, -2, TEMPERATURE_TWEAKS, + "Set how the temperature is modified in the MID_SPRING season."); + addSyncedInt(GameplayOption.LATE_SPRING_MODIFIER, 0, TEMPERATURE_TWEAKS, + "Set how the temperature is modified in the LATE_SPRING season."); + addSyncedInt(GameplayOption.EARLY_SUMMER_MODIFIER, 0, TEMPERATURE_TWEAKS, + "Set how the temperature is modified in the EARLY_SUMMER season."); + addSyncedInt(GameplayOption.MID_SUMMER_MODIFIER, 2, TEMPERATURE_TWEAKS, + "Set how the temperature is modified in the MID_SUMMER season."); + addSyncedInt(GameplayOption.LATE_SUMMER_MODIFIER, 4, TEMPERATURE_TWEAKS, + "Set how the temperature is modified in the LATE_SUMMER season."); + + // Crop tweaks + addSyncedBool(GameplayOption.TEMPERATURE_WITHERING, false, CROP_TWEAKS, + "Should crop withering be based on actual plant temperature or just the season?"); + + String[] cropDefault = { "minecraft:wheat;5;10;15;25;0.5", "minecraft:carrots;5;10;15;25;0.5", + "minecraft:potatoes;5;10;15;25;0.5", "minecraft:beetroots;5;10;15;25;0.5", + "minecraft:pumpkin_stem;5;10;15;25;0.5", "minecraft:melon_stem;5;10;15;25;0.5", + "harvestcraft:pamblackberryCrop;5;10;15;25;0.5", "harvestcraft:pamblueberryCrop;5;10;15;25;0.5", + "harvestcraft:pamcandleberryCrop;5;10;15;25;0.5", "harvestcraft:pamraspberryCrop;5;10;15;25;0.5", + "harvestcraft:pamstrawberryCrop;5;10;15;25;0.5", "harvestcraft:pamcactusfruitCrop;5;10;15;25;0.5", + "harvestcraft:pamasparagusCrop;5;10;15;25;0.5", "harvestcraft:pambarleyCrop;5;10;15;25;0.5", + "harvestcraft:pamoatsCrop;5;10;15;25;0.5", "harvestcraft:pamryeCrop;5;10;15;25;0.5", + "harvestcraft:pamcornCrop;5;10;15;25;0.5", "harvestcraft:pambambooshootCrop;5;10;15;25;0.5", + "harvestcraft:pamcantaloupeCrop;5;10;15;25;0.5", "harvestcraft:pamcucumberCrop;5;10;15;25;0.5", + "harvestcraft:pamwintersquashCrop;5;10;15;25;0.5", "harvestcraft:pamzucchiniCrop;5;10;15;25;0.5", + "harvestcraft:pambeetCrop;5;10;15;25;0.5", "harvestcraft:pamonionCrop;5;10;15;25;0.5", + "harvestcraft:pamparsnipCrop;5;10;15;25;0.5", "harvestcraft:pampeanutCrop;5;10;15;25;0.5", + "harvestcraft:pamradishCrop;5;10;15;25;0.5", "harvestcraft:pamrutabagaCrop;5;10;15;25;0.5", + "harvestcraft:pamsweetpotatoCrop;5;10;15;25;0.5", "harvestcraft:pamturnipCrop;5;10;15;25;0.5", + "harvestcraft:pamrhubarbCrop;5;10;15;25;0.5", "harvestcraft:pamceleryCrop;5;10;15;25;0.5", + "harvestcraft:pamgarlicCrop;5;10;15;25;0.5", "harvestcraft:pamgingerCrop;5;10;15;25;0.5", + "harvestcraft:pamspiceleafCrop;5;10;15;25;0.5", "harvestcraft:pamtealeafCrop;5;10;15;25;0.5", + "harvestcraft:pamcoffeebeanCrop;5;10;15;25;0.5", "harvestcraft:pammustardseedsCrop;5;10;15;25;0.5", + "harvestcraft:pambroccoliCrop;5;10;15;25;0.5", "harvestcraft:pamcauliflowerCrop;5;10;15;25;0.5", + "harvestcraft:pamleekCrop;5;10;15;25;0.5", "harvestcraft:pamlettuceCrop;5;10;15;25;0.5", + "harvestcraft:pamscallionCrop;5;10;15;25;0.5", "harvestcraft:pamartichokeCrop;5;10;15;25;0.5", + "harvestcraft:pambrusselsproutCrop;5;10;15;25;0.5", "harvestcraft:pamcabbageCrop;5;10;15;25;0.5", + "harvestcraft:pamspinachCrop;5;10;15;25;0.5", "harvestcraft:pamwhitemushroomCrop;5;10;15;25;0.5", + "harvestcraft:pambeanCrop;5;10;15;25;0.5", "harvestcraft:pamsoybeanCrop;5;10;15;25;0.5", + "harvestcraft:pambellpepperCrop;5;10;15;25;0.5", "harvestcraft:pamchilipepperCrop;5;10;15;25;0.5", + "harvestcraft:pameggplantCrop;5;10;15;25;0.5", "harvestcraft:pamokraCrop;5;10;15;25;0.5", + "harvestcraft:pampeasCrop;5;10;15;25;0.5", "harvestcraft:pamtomatoCrop;5;10;15;25;0.5", + "harvestcraft:pamcottonCrop;5;10;15;25;0.5", "harvestcraft:pampineappleCrop;5;10;15;25;0.5", + "harvestcraft:pamgrapeCrop;5;10;15;25;0.5", "harvestcraft:pamkiwiCrop;5;10;15;25;0.5", + "harvestcraft:pamcranberryCrop;5;10;15;25;0.5", "harvestcraft:pamriceCrop;5;10;15;25;0.5", + "harvestcraft:pamseaweedCrop;5;10;15;25;0.5", "harvestcraft:pamcurryleafCrop;5;10;15;25;0.5", + "harvestcraft:pamsesameseedsCrop;5;10;15;25;0.5", + "harvestcraft:pamwaterchestnutCrop;5;10;15;25;0.5" }; + addSyncedList(GameplayOption.CROPS, cropDefault, CROP_TWEAKS, + "List of crops with configurable min living, " + "min optimal, max optimal, max living temps, " + + "and the chance of skipping a growth tick outside " + + "of the optimal temperature range. ;-delimited"); + + String[] hibernateDefault = { "harvestcraft:pamAlmond;5;10;15;20;0.5", + "harvestcraft:pamApple;5;10;15;20;0.5", "harvestcraft:pamApricot;5;10;15;20;0.5", + "harvestcraft:pamAvocado;5;10;15;20;0.5", "harvestcraft:pamBanana;5;10;15;20;0.5", + "harvestcraft:pamCashew;5;10;15;20;0.5", "harvestcraft:pamCherry;5;10;15;20;0.5", + "harvestcraft:pamChestnut;5;10;15;20;0.5", "harvestcraft:pamCinnamon;5;10;15;20;0.5", + "harvestcraft:pamCoconut;5;10;15;20;0.5", "harvestcraft:pamDate;5;10;15;20;0.5", + "harvestcraft:pamDragonfruit;5;10;15;20;0.5", "harvestcraft:pamDurian;5;10;15;20;0.5", + "harvestcraft:pamFig;5;10;15;20;0.5", "harvestcraft:pamGooseberry;5;10;15;20;0.5", + "harvestcraft:pamGrapefruit;5;10;15;20;0.5", "harvestcraft:pamLemon;5;10;15;20;0.5", + "harvestcraft:pamLime;5;10;15;20;0.5", "harvestcraft:pamMango;5;10;15;20;0.5", + "harvestcraft:pamMaple;5;10;15;20;0.5", "harvestcraft:pamNutmeg;5;10;15;20;0.5", + "harvestcraft:pamOlive;5;10;15;20;0.5", "harvestcraft:pamOrange;5;10;15;20;0.5", + "harvestcraft:pamPapaya;5;10;15;20;0.5", "harvestcraft:pamPaperbark;5;10;15;20;0.5", + "harvestcraft:pamPeach;5;10;15;20;0.5", "harvestcraft:pamPear;5;10;15;20;0.5", + "harvestcraft:pamPecan;5;10;15;20;0.5", "harvestcraft:pamPeppercorn;5;10;15;20;0.5", + "harvestcraft:pamPersimmon;5;10;15;20;0.5", "harvestcraft:pamPistachio;5;10;15;20;0.5", + "harvestcraft:pamPlum;5;10;15;20;0.5", "harvestcraft:pamPomegranate;5;10;15;20;0.5", + "harvestcraft:pamStarfruit;5;10;15;20;0.5", "harvestcraft:pamVanillabean;5;10;15;20;0.5", + "harvestcraft:pamWalnut;5;10;15;20;0.5" }; + addSyncedList(GameplayOption.HIBERNATING, hibernateDefault, CROP_TWEAKS, + "List of hibernating crops with configurable min waking, " + + "min optimal, max optimal, max waking temps, " + + "and the chance of skipping a growth tick outside " + + "of the optimal temperature range. ;-delimited"); + } catch (Exception e) { + ToughAsNails.logger.error("Tough As Nails has encountered a problem loading gameplay.cfg", e); + } finally { + if (config.hasChanged()) { + config.save(); + } + } + } + + private static void addSyncedBool(GameplayOption option, boolean defaultValue, String category, String comment) { + boolean value = config.getBoolean(option.getOptionName(), category, defaultValue, comment); + SyncedConfig.addOption(option, "" + value); + } + + private static void addSyncedInt(GameplayOption option, int defaultValue, String category, String comment) { + int value = config.getInt(option.getOptionName(), category, defaultValue, Integer.MIN_VALUE, Integer.MAX_VALUE, + comment); + SyncedConfig.addOption(option, "" + value); + } + + private static void addSyncedFloat(GameplayOption option, float defaultValue, String category, String comment) { + float value = config.getFloat(option.getOptionName(), category, defaultValue, Float.MIN_VALUE, Float.MAX_VALUE, + comment); + SyncedConfig.addOption(option, "" + value); + } + + private static void addSyncedList(GameplayOption option, String[] defaultValue, String category, String comment) { + String[] drinkEntries = config.getStringList(option.getOptionName(), category, defaultValue, comment); + String drinkString = ""; + for (String drinkEntry : drinkEntries) { + drinkString += (drinkEntry + ","); + } + SyncedConfig.addOption(option, drinkString); + } + + @SubscribeEvent + public void onConfigurationChangedEvent(ConfigChangedEvent.OnConfigChangedEvent event) { + if (event.getModID().equalsIgnoreCase(ToughAsNails.MOD_ID)) { + loadConfiguration(); + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/config/SyncedConfigHandler.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/config/SyncedConfigHandler.java new file mode 100644 index 00000000..7322b898 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/config/SyncedConfigHandler.java @@ -0,0 +1,58 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.config; + +import java.util.Map.Entry; + +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraftforge.event.world.WorldEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.PlayerEvent.PlayerLoggedInEvent; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import toughasnails.api.config.SyncedConfig; +import toughasnails.core.ToughAsNails; +import toughasnails.handler.PacketHandler; +import toughasnails.network.message.MessageSyncConfigs; + +public class SyncedConfigHandler { + + @SubscribeEvent + public void onPlayerLogin(PlayerLoggedInEvent event) { + EntityPlayer player = event.player; + World world = player.getEntityWorld(); + + if (!world.isRemote) { + NBTTagCompound nbtOptions = new NBTTagCompound(); + + for (Entry entry : SyncedConfig.optionsToSync + .entrySet()) { + nbtOptions.setString(entry.getKey(), entry.getValue().value); + } + + IMessage message = new MessageSyncConfigs(nbtOptions); + PacketHandler.instance.sendTo(message, (EntityPlayerMP) player); + } + } + + @SideOnly(Side.CLIENT) + @SubscribeEvent + public void onWorldUnload(WorldEvent.Unload event) { + if (event.getWorld().isRemote && !Minecraft.getMinecraft() + .getConnection().getNetworkManager().isChannelOpen()) { + SyncedConfig.restoreDefaults(); + ToughAsNails.logger + .info("TAN configuration restored to local values"); + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/config/TANConfig.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/config/TANConfig.java new file mode 100644 index 00000000..89f6f6f0 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/config/TANConfig.java @@ -0,0 +1,366 @@ +/******************************************************************************* + * Copyright 2014-2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ + +package toughasnails.config; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import org.apache.commons.io.FileUtils; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + +import net.minecraft.block.Block; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.state.IBlockState; +import net.minecraft.init.Blocks; +import toughasnails.api.TANBlocks; +import toughasnails.block.BlockTANCampfire; +import toughasnails.block.BlockTANTemperatureCoil; +import toughasnails.block.BlockTANTemperatureCoil.CoilType; +import toughasnails.core.ToughAsNails; +import toughasnails.temperature.BlockTemperatureData; +import toughasnails.temperature.MaterialTemperatureData; +import toughasnails.util.BlockStateUtils; + +public class TANConfig { + + public static Gson serializer = new GsonBuilder().setPrettyPrinting().create(); + public static JsonParser parser = new JsonParser(); + + public static HashMap> blockTemperatureData; + + public static MaterialTemperatureData materialTemperatureData; + + public static void init(File configDir) { + + // Block temperature config: + blockTemperatureData = new HashMap>(); + + File blockTemperatureConfigFile = new File(configDir, "block_temperature.json"); + + // No config file, so create default config: + if (!blockTemperatureConfigFile.exists()) { + try { + BlockTemperatureData[] defaultBlockTemperatureData = { + new BlockTemperatureData( + TANBlocks.campfire.getDefaultState().withProperty(BlockTANCampfire.BURNING, true), + new String[] { BlockTANCampfire.BURNING.getName() }, 12.0F), + new BlockTemperatureData(Blocks.LIT_FURNACE.getDefaultState(), new String[0], + 12.0F), + new BlockTemperatureData(Blocks.LAVA.getDefaultState(), new String[0], + 1.5F), + new BlockTemperatureData(Blocks.FLOWING_LAVA.getDefaultState(), new String[0], 1.5F), + new BlockTemperatureData( + TANBlocks.temperature_coil.getDefaultState() + .withProperty(BlockTANTemperatureCoil.VARIANT, CoilType.HEATING) + .withProperty(BlockTANTemperatureCoil.POWERED, true), + new String[] { "heating_coil" }, 15.0f), + new BlockTemperatureData( + TANBlocks.temperature_coil.getDefaultState() + .withProperty(BlockTANTemperatureCoil.VARIANT, CoilType.COOLING) + .withProperty(BlockTANTemperatureCoil.POWERED, true), + new String[] { "cooling_coil" }, -15.0f) }; + + // Need to do this manually as there is some issue with getting + // Gson to serialise an IBlockState directly due to duplicated + // keys + JsonArray tempAry = new JsonArray(); + + for (BlockTemperatureData tempData : defaultBlockTemperatureData) { + tempAry.add(asJsonObject(tempData)); + } + + writeFile(blockTemperatureConfigFile, tempAry); + } catch (Exception e) { + ToughAsNails.logger.error("Error creating default block temperature config file: " + + blockTemperatureConfigFile.toString(), e); + } + } + + try { + String blockJsonString = FileUtils.readFileToString(blockTemperatureConfigFile); + + JsonElement blockAry = parser.parse(blockJsonString); + + if (blockAry == null) { + ToughAsNails.logger.error("Error parsing block temperature config from json file: " + + blockTemperatureConfigFile.toString() + " temperature information array does not exist."); + } + + if (blockAry.isJsonArray()) { + for (JsonElement ele : blockAry.getAsJsonArray()) { + BlockTemperatureData tempData = asBlockTemperatureData(ele, + "Error parsing block temperature state configuration " + ele.toString()); + + String blockName = tempData.state.getBlock().getRegistryName().toString(); + + if (!blockTemperatureData.containsKey(blockName)) { + blockTemperatureData.put(blockName, new ArrayList()); + } + + blockTemperatureData.get(blockName).add(tempData); + } + } + } catch (Exception e) { + ToughAsNails.logger.error( + "Error parsing block temperature config from json: " + blockTemperatureConfigFile.toString(), e); + } + + // Material temperature config: + materialTemperatureData = new MaterialTemperatureData(); + + File materialTemperatureConfigFile = new File(configDir, "material_temperature.json"); + + try { + if (!materialTemperatureConfigFile.exists()) { + writeFile(materialTemperatureConfigFile, materialTemperatureData); + } + } catch (Exception e) { + ToughAsNails.logger.error("Error creating default material temperature config file: " + + materialTemperatureConfigFile.toString(), e); + } + + try { + String materialJsonString = FileUtils.readFileToString(materialTemperatureConfigFile); + + Gson gson = new Gson(); + + materialTemperatureData = gson.fromJson(materialJsonString, MaterialTemperatureData.class); + } catch (Exception e) { + ToughAsNails.logger.error( + "Error parsing material temperature config from json: " + materialTemperatureConfigFile.toString(), + e); + } + + } + + protected static boolean writeFile(File outputFile, Object obj) { + try { + FileUtils.write(outputFile, serializer.toJson(obj)); + return true; + } catch (Exception e) { + ToughAsNails.logger + .error("Error writing config file " + outputFile.getAbsolutePath() + ": " + e.getMessage()); + return false; + } + } + + protected static Map parse(String jsonString) { + Map members; + + members = new HashMap(); + if (jsonString == null) { + return members; + } + + JsonElement rootElement = null; + try { + rootElement = parser.parse(jsonString); + if (rootElement != null) { + if (rootElement.isJsonObject()) { + for (Entry entry : rootElement.getAsJsonObject().entrySet()) { + members.put(entry.getKey(), entry.getValue()); + } + } else { + ToughAsNails.logger.error("Error parsing config: not a JSON object"); + } + } + } catch (Exception e) { + ToughAsNails.logger.error("Error parsing config: " + e.getMessage()); + } + + return members; + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + protected static ReadBlockState asBlockState(JsonElement ele, String extraPrefix) { + + try { + + JsonObject obj = ele.getAsJsonObject(); + + // attempt to load the specified block + if (!obj.has("block")) { + ToughAsNails.logger.error(extraPrefix + " Block name missing"); + return null; + } + JsonElement blockName = obj.get("block"); + if (!blockName.isJsonPrimitive()) { + ToughAsNails.logger.error(extraPrefix + " Invalid block name - must be a string"); + return null; + } + Block block = Block.getBlockFromName(blockName.getAsString()); + if (block == null) { + ToughAsNails.logger.error(extraPrefix + " Unrecognised block name " + blockName.getAsString()); + return null; + } + + IBlockState state = block.getDefaultState(); + + ArrayList usedProperties = new ArrayList(); + + // attempt to add properties + if (obj.has("properties")) { + JsonElement properties = obj.get("properties"); + if (!properties.isJsonObject()) { + ToughAsNails.logger.error(extraPrefix + " Invalid properties list - must be a JSON object"); + return null; + } + + for (Entry entry : properties.getAsJsonObject().entrySet()) { + String propRawName = entry.getKey(); + + IProperty property = BlockStateUtils.getPropertyByName(state, propRawName); + if (property != null) { + String propRawValue = entry.getValue().getAsString(); + + if (!propRawValue.equals("*")) { + Comparable propertyValue = BlockStateUtils.getPropertyValueByName(state, property, + propRawValue); + if (propertyValue != null) { + state = state.withProperty(property, propertyValue); + usedProperties.add(propRawName); + } else { + ToughAsNails.logger.error(extraPrefix + " Invalid value " + propRawValue + + " for property " + propRawName); + } + } + } else { + ToughAsNails.logger.error(extraPrefix + " Invalid property name: " + propRawName); + } + } + } + + return new ReadBlockState(state, usedProperties.toArray(new String[0])); + } catch (Exception e) { + ToughAsNails.logger.error(extraPrefix + " Error fetching blockstate: " + e.getMessage()); + return null; + } + + } + + protected static JsonObject asJsonObject(IBlockState state, String[] useProperties) { + try { + JsonObject obj = new JsonObject(); + + obj.addProperty("block", state.getBlock().getRegistryName().toString()); + + JsonObject props = new JsonObject(); + + for (IProperty blockProperty : state.getProperties().keySet()) { + String propName = blockProperty.getName(); + String propValue = state.getValue(blockProperty).toString(); + + if (useProperties != null) { + boolean foundProp = false; + for (String useName : useProperties) { + if (useName.equalsIgnoreCase(propName)) { + foundProp = true; + break; + } + } + + if (!foundProp) { + // If a property is unused, set the value to a special + // wildcard * to indicate that any value matches + propValue = "*"; + } + } + + props.addProperty(propName, propValue); + } + + obj.add("properties", props); + + return obj; + } catch (Exception e) { + ToughAsNails.logger.error("Error converting blockstate to Json: " + e.getMessage()); + return null; + } + } + + protected static JsonObject asJsonObject(IBlockState state) { + try { + return asJsonObject(state, null); + } catch (Exception e) { + ToughAsNails.logger.error("Error converting blockstate to Json: " + e.getMessage()); + return null; + } + } + + protected static JsonObject asJsonObject(BlockTemperatureData blockTemperatureData) { + JsonObject blockTempJson = new JsonObject(); + + JsonObject stateObject = asJsonObject(blockTemperatureData.state, blockTemperatureData.useProperties); + + blockTempJson.add("state", stateObject); + blockTempJson.addProperty("temperature", blockTemperatureData.blockTemperature); + + return blockTempJson; + } + + protected static BlockTemperatureData asBlockTemperatureData(JsonElement ele, String extraPrefix) { + try { + JsonObject obj = ele.getAsJsonObject(); + + // attempt to load the state + if (!obj.has("state")) { + ToughAsNails.logger.error(extraPrefix + " Block state missing"); + return null; + } + JsonElement blockState = obj.get("state"); + if (!blockState.isJsonObject()) { + ToughAsNails.logger.error(extraPrefix + " Invalid block state - must be an object"); + return null; + } + + ReadBlockState readState = asBlockState(blockState, extraPrefix); + + IBlockState state = readState.state; + String[] use_properties = readState.usedProperties; + + // attempt to get the temperature value + if (!obj.has("temperature")) { + ToughAsNails.logger.error(extraPrefix + " block temperature missing"); + return null; + } + JsonElement blockTemperature = obj.get("temperature"); + if (!blockTemperature.isJsonPrimitive()) { + ToughAsNails.logger.error(extraPrefix + " Invalid block temperature - must be a float"); + } + + float temperature = blockTemperature.getAsFloat(); + + return new BlockTemperatureData(state, use_properties, temperature); + } catch (Exception e) { + ToughAsNails.logger.error(extraPrefix + " Error fetching block temperature data: " + e.getMessage()); + return null; + } + + } + +} + +final class ReadBlockState { + IBlockState state; + String[] usedProperties; + + public ReadBlockState(IBlockState state, String[] usedProperties) { + this.state = state; + this.usedProperties = usedProperties; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/core/ClientProxy.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/core/ClientProxy.java new file mode 100644 index 00000000..b4c37a28 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/core/ClientProxy.java @@ -0,0 +1,129 @@ +package toughasnails.core; + +import net.minecraft.block.Block; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.renderer.block.model.ModelBakery; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.client.renderer.block.statemap.IStateMapper; +import net.minecraft.client.renderer.block.statemap.StateMap; +import net.minecraft.client.renderer.block.statemap.StateMapperBase; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.entity.Entity; +import net.minecraft.item.Item; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.MathHelper; +import net.minecraftforge.client.model.ModelLoader; +import net.minecraftforge.fml.client.registry.IRenderFactory; +import net.minecraftforge.fml.client.registry.RenderingRegistry; +import toughasnails.api.ITANBlock; +import toughasnails.entities.EntityFreeze; +import toughasnails.entities.RenderFreeze; +import toughasnails.entities.projectile.EntityIceball; +import toughasnails.entities.projectile.RenderIceball; +import toughasnails.particle.EntitySnowflakeFX; +import toughasnails.particle.TANParticleTypes; + +public class ClientProxy extends CommonProxy { + public static ResourceLocation particleTexturesLocation = new ResourceLocation( + "toughasnails:textures/particles/particles.png"); + + @Override + public void registerRenderers() { + // Entity rendering and other stuff will go here in future + registerEntityRenderer(EntityIceball.class, RenderIceball.class); + registerEntityRenderer(EntityFreeze.class, RenderFreeze.class); + } + + @Override + public void registerItemVariantModel(Item item, String name, int metadata) { + if (item != null) { + ModelBakery.registerItemVariants(item, new ResourceLocation("toughasnails:" + name)); + ModelLoader.setCustomModelResourceLocation(item, metadata, + new ModelResourceLocation(ToughAsNails.MOD_ID + ":" + name, "inventory")); + } + } + + @SuppressWarnings("rawtypes") + @Override + public void registerNonRenderingProperties(Block block) { + if (block instanceof ITANBlock) { + ITANBlock bopBlock = (ITANBlock) block; + IProperty[] nonRenderingProperties = bopBlock.getNonRenderingProperties(); + + if (nonRenderingProperties != null) { + // use a custom state mapper which will ignore the properties + // specified in the block as being non-rendering + IStateMapper custom_mapper = (new StateMap.Builder()).ignore(nonRenderingProperties).build(); + ModelLoader.setCustomStateMapper(block, custom_mapper); + } + } + } + + @Override + public void registerFluidBlockRendering(Block block, String name) { + final ModelResourceLocation fluidLocation = new ModelResourceLocation( + ToughAsNails.MOD_ID.toLowerCase() + ":fluids", name); + + // use a custom state mapper which will ignore the LEVEL property + ModelLoader.setCustomStateMapper(block, new StateMapperBase() { + @Override + protected ModelResourceLocation getModelResourceLocation(IBlockState state) { + return fluidLocation; + } + }); + } + + @Override + public void spawnParticle(TANParticleTypes type, double x, double y, double z, Object... info) { + Minecraft minecraft = Minecraft.getMinecraft(); + Particle entityFx = null; + switch (type) { + case SNOWFLAKE: + entityFx = new EntitySnowflakeFX(minecraft.theWorld, x, y, z, + MathHelper.getRandomDoubleInRange(minecraft.theWorld.rand, -0.03, 0.03), -0.02D, + MathHelper.getRandomDoubleInRange(minecraft.theWorld.rand, -0.03, 0.03)); + break; + default: + break; + } + + if (entityFx != null) { + minecraft.effectRenderer.addEffect(entityFx); + } + } + + // + // The below method and class is used as part of Forge 1668+'s workaround + // for render manager being null during preinit + // + + private static void registerEntityRenderer(Class entityClass, + Class> renderClass) { + RenderingRegistry.registerEntityRenderingHandler(entityClass, new EntityRenderFactory(renderClass)); + } + + private static class EntityRenderFactory implements IRenderFactory { + private Class> renderClass; + + private EntityRenderFactory(Class> renderClass) { + this.renderClass = renderClass; + } + + @Override + public Render createRenderFor(RenderManager manager) { + Render renderer = null; + + try { + renderer = renderClass.getConstructor(RenderManager.class).newInstance(manager); + } catch (Exception e) { + e.printStackTrace(); + } + + return renderer; + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/core/CommonProxy.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/core/CommonProxy.java new file mode 100644 index 00000000..8d3aeaeb --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/core/CommonProxy.java @@ -0,0 +1,14 @@ +package toughasnails.core; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import toughasnails.particle.TANParticleTypes; + +public class CommonProxy +{ + public void registerRenderers() {} + public void registerItemVariantModel(Item item, String name, int metadata) {} + public void registerNonRenderingProperties(Block block) {} + public void registerFluidBlockRendering(Block block, String name) {} + public void spawnParticle(TANParticleTypes type, double x, double y, double z, Object... info) {} +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/core/ToughAsNails.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/core/ToughAsNails.java new file mode 100644 index 00000000..8a7b2c9b --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/core/ToughAsNails.java @@ -0,0 +1,83 @@ +package toughasnails.core; + +import java.io.File; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.Mod.EventHandler; +import net.minecraftforge.fml.common.Mod.Instance; +import net.minecraftforge.fml.common.SidedProxy; +import net.minecraftforge.fml.common.event.FMLInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; +import net.minecraftforge.fml.common.event.FMLServerStartingEvent; +import toughasnails.command.TANCommand; +import toughasnails.config.TANConfig; +import toughasnails.handler.BlockHarvestEventHandler; +import toughasnails.handler.LootTableEventHandler; +import toughasnails.init.ModAchievements; +import toughasnails.init.ModBlocks; +import toughasnails.init.ModConfig; +import toughasnails.init.ModCrafting; +import toughasnails.init.ModEntities; +import toughasnails.init.ModHandlers; +import toughasnails.init.ModItems; +import toughasnails.init.ModPotions; +import toughasnails.init.ModStats; +import toughasnails.init.ModVanillaCompat; + +@Mod(modid = ToughAsNails.MOD_ID, version = ToughAsNails.MOD_VERSION, name = ToughAsNails.MOD_NAME, guiFactory = ToughAsNails.GUI_FACTORY) +public class ToughAsNails +{ + public static final String MOD_NAME = "Tough As Nails"; + public static final String MOD_ID = "ToughAsNails"; + public static final String MOD_VERSION = "@MOD_VERSION@"; + public static final String GUI_FACTORY = "toughasnails.client.gui.GuiFactory"; + + @Instance(MOD_ID) + public static ToughAsNails instance; + + @SidedProxy(clientSide = "toughasnails.core.ClientProxy", serverSide = "toughasnails.core.CommonProxy") + public static CommonProxy proxy; + + public static Logger logger = LogManager.getLogger(MOD_ID); + public static File configDirectory; + + @EventHandler + public void preInit(FMLPreInitializationEvent event) + { + configDirectory = new File(event.getModConfigurationDirectory(), "toughasnails"); + + ModConfig.init(configDirectory); + + ModBlocks.init(); + ModEntities.init(); + ModItems.init(); + ModStats.init(); + ModPotions.init(); + ModVanillaCompat.init(); + ModHandlers.init(); + + ModCrafting.init(); + ModAchievements.init(); + + MinecraftForge.EVENT_BUS.register(new LootTableEventHandler()); + MinecraftForge.EVENT_BUS.register(new BlockHarvestEventHandler()); + + proxy.registerRenderers(); + } + + @EventHandler + public void init(FMLInitializationEvent event) + { + TANConfig.init(configDirectory); + } + + @EventHandler + public void serverStarting(FMLServerStartingEvent event) + { + event.registerServerCommand(new TANCommand()); + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/entities/EntityFreeze.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/entities/EntityFreeze.java new file mode 100644 index 00000000..ebe38d56 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/entities/EntityFreeze.java @@ -0,0 +1,227 @@ +package toughasnails.entities; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.EntityAIBase; +import net.minecraft.entity.ai.EntityAIHurtByTarget; +import net.minecraft.entity.ai.EntityAILookIdle; +import net.minecraft.entity.ai.EntityAIMoveTowardsRestriction; +import net.minecraft.entity.ai.EntityAINearestAttackableTarget; +import net.minecraft.entity.ai.EntityAIWander; +import net.minecraft.entity.ai.EntityAIWatchClosest; +import net.minecraft.entity.monster.EntityMob; +import net.minecraft.entity.monster.IMob; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.util.DamageSource; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import toughasnails.api.item.TANItems; +import toughasnails.core.ToughAsNails; +import toughasnails.entities.projectile.EntityIceball; +import toughasnails.particle.TANParticleTypes; + +public class EntityFreeze extends EntityMob implements IMob { + private float heightOffset = 0.5F; + private int heightOffsetUpdateTime; + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public EntityFreeze(World worldIn) { + super(worldIn); + this.experienceValue = 10; + this.tasks.addTask(4, new EntityFreeze.AIFireballAttack(this)); + this.tasks.addTask(5, new EntityAIMoveTowardsRestriction(this, 1.0D)); + this.tasks.addTask(7, new EntityAIWander(this, 1.0D)); + this.tasks.addTask(8, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); + this.tasks.addTask(8, new EntityAILookIdle(this)); + this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, true, new Class[0])); + this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPlayer.class, true)); + } + + @Override + protected void applyEntityAttributes() { + super.applyEntityAttributes(); + this.getEntityAttribute(SharedMonsterAttributes.ATTACK_DAMAGE).setBaseValue(3.0D); + this.getEntityAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).setBaseValue(0.23000000417232513D); + this.getEntityAttribute(SharedMonsterAttributes.FOLLOW_RANGE).setBaseValue(48.0D); + } + + @Override + protected void entityInit() { + super.entityInit(); + } + + /* + * protected String getLivingSound() { return "mob.freeze.breathe"; } + * + * protected String getHurtSound() { return "mob.freeze.hit"; } + * + * protected String getDeathSound() { return "mob.freeze.death"; } + */ + + @Override + @SideOnly(Side.CLIENT) + public int getBrightnessForRender(float partialTicks) { + return 15728880; + } + + @Override + public float getBrightness(float partialTicks) { + return 1.0F; + } + + @Override + public void onLivingUpdate() { + if (!this.onGround && this.motionY < 0.0D) { + this.motionY *= 0.6D; + } + + if (this.getEntityWorld().isRemote) { + /* + * if (this.rand.nextInt(24) == 0 && !this.isSilent()) { + * this.worldObj.playSound(this.posX + 0.5D, this.posY + 0.5D, + * this.posZ + 0.5D, "fire.fire", 1.0F + this.rand.nextFloat(), + * this.rand.nextFloat() * 0.7F + 0.3F, false); } + */ + + for (int i = 0; i < 2; ++i) { + ToughAsNails.proxy.spawnParticle(TANParticleTypes.SNOWFLAKE, + this.posX + (this.rand.nextDouble() - 0.5D) * (double) this.width, + this.posY + this.rand.nextDouble() * (double) this.height, + this.posZ + (this.rand.nextDouble() - 0.5D) * (double) this.width, 0.0D, 0.0D, 0.0D, + new int[0]); + } + } + + super.onLivingUpdate(); + } + + @Override + protected void updateAITasks() { + if (this.isBurning()) { + this.attackEntityFrom(DamageSource.inFire, 1.0F); + } + + --this.heightOffsetUpdateTime; + + if (this.heightOffsetUpdateTime <= 0) { + this.heightOffsetUpdateTime = 100; + this.heightOffset = 0.5F + (float) this.rand.nextGaussian() * 3.0F; + } + + EntityLivingBase entitylivingbase = this.getAttackTarget(); + + if (entitylivingbase != null && entitylivingbase.posY + (double) entitylivingbase.getEyeHeight() > this.posY + + (double) this.getEyeHeight() + (double) this.heightOffset) { + this.motionY += (0.30000001192092896D - this.motionY) * 0.30000001192092896D; + this.isAirBorne = true; + } + + super.updateAITasks(); + } + + @Override + public void fall(float distance, float damageMultiplier) { + } + + @Override + protected Item getDropItem() { + return TANItems.freeze_rod; + } + + @Override + protected void dropFewItems(boolean p_70628_1_, int p_70628_2_) { + if (p_70628_1_) { + int i = this.rand.nextInt(2 + p_70628_2_); + + for (int j = 0; j < i; ++j) { + this.dropItem(TANItems.freeze_rod, 1); + } + } + } + + @Override + protected boolean isValidLightLevel() { + return true; + } + + static class AIFireballAttack extends EntityAIBase { + private EntityFreeze freeze; + private int field_179467_b; + private int field_179468_c; + + public AIFireballAttack(EntityFreeze p_i45846_1_) { + this.freeze = p_i45846_1_; + this.setMutexBits(3); + } + + public boolean shouldExecute() { + EntityLivingBase entitylivingbase = this.freeze.getAttackTarget(); + return entitylivingbase != null && entitylivingbase.isEntityAlive(); + } + + public void startExecuting() { + this.field_179467_b = 0; + } + + public void updateTask() { + --this.field_179468_c; + EntityLivingBase entitylivingbase = this.freeze.getAttackTarget(); + double d0 = this.freeze.getDistanceSqToEntity(entitylivingbase); + + if (d0 < 4.0D) { + if (this.field_179468_c <= 0) { + this.field_179468_c = 20; + this.freeze.attackEntityAsMob(entitylivingbase); + } + + this.freeze.getMoveHelper().setMoveTo(entitylivingbase.posX, entitylivingbase.posY, + entitylivingbase.posZ, 1.0D); + } else if (d0 < 256.0D) { + double d1 = entitylivingbase.posX - this.freeze.posX; + double d2 = entitylivingbase.getEntityBoundingBox().minY + (double) (entitylivingbase.height / 2.0F) + - (this.freeze.posY + (double) (this.freeze.height / 2.0F)); + double d3 = entitylivingbase.posZ - this.freeze.posZ; + + if (this.field_179468_c <= 0) { + ++this.field_179467_b; + + if (this.field_179467_b == 1) { + this.field_179468_c = 60; + } else if (this.field_179467_b <= 4) { + this.field_179468_c = 6; + } else { + this.field_179468_c = 100; + this.field_179467_b = 0; + } + + if (this.field_179467_b > 1) { + float f = MathHelper.sqrt_double(MathHelper.sqrt_double(d0)) * 0.5F; + this.freeze.getEntityWorld().playEvent((EntityPlayer) null, 1009, + new BlockPos((int) this.freeze.posX, (int) this.freeze.posY, (int) this.freeze.posZ), + 0); + + for (int i = 0; i < 1; ++i) { + EntityIceball entityiceball = new EntityIceball(this.freeze.getEntityWorld(), this.freeze, + d1 + this.freeze.getRNG().nextGaussian() * (double) f, d2, + d3 + this.freeze.getRNG().nextGaussian() * (double) f); + entityiceball.posY = this.freeze.posY + (double) (this.freeze.height / 2.0F) + 0.5D; + this.freeze.getEntityWorld().spawnEntityInWorld(entityiceball); + } + } + } + + this.freeze.getLookHelper().setLookPositionWithEntity(entitylivingbase, 10.0F, 10.0F); + } else { + this.freeze.getNavigator().clearPathEntity(); + this.freeze.getMoveHelper().setMoveTo(entitylivingbase.posX, entitylivingbase.posY, + entitylivingbase.posZ, 1.0D); + } + + super.updateTask(); + } + } +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/entities/ModelFreeze.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/entities/ModelFreeze.java new file mode 100644 index 00000000..a73ce9f0 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/entities/ModelFreeze.java @@ -0,0 +1,76 @@ +package toughasnails.entities; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.util.math.MathHelper; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ModelFreeze extends ModelBase +{ + private ModelRenderer[] freezeSticks = new ModelRenderer[12]; + private ModelRenderer freezeHead; + + public ModelFreeze() + { + for (int i = 0; i < this.freezeSticks.length; ++i) + { + this.freezeSticks[i] = new ModelRenderer(this, 0, 16); + this.freezeSticks[i].addBox(0.0F, 0.0F, 0.0F, 2, 8, 2); + } + + this.freezeHead = new ModelRenderer(this, 0, 0); + this.freezeHead.addBox(-4.0F, -4.0F, -4.0F, 8, 8, 8); + } + + @Override + public void render(Entity entityIn, float p_78088_2_, float p_78088_3_, float p_78088_4_, float p_78088_5_, float p_78088_6_, float scale) + { + this.setRotationAngles(p_78088_2_, p_78088_3_, p_78088_4_, p_78088_5_, p_78088_6_, scale, entityIn); + this.freezeHead.render(scale); + + for (int i = 0; i < this.freezeSticks.length; ++i) + { + this.freezeSticks[i].render(scale); + } + } + + @Override + public void setRotationAngles(float p_78087_1_, float p_78087_2_, float p_78087_3_, float p_78087_4_, float p_78087_5_, float p_78087_6_, Entity entityIn) + { + float f = p_78087_3_ * (float)Math.PI * -0.1F; + + for (int i = 0; i < 4; ++i) + { + this.freezeSticks[i].rotationPointY = -2.0F + MathHelper.cos(((float)(i * 2) + p_78087_3_) * 0.25F); + this.freezeSticks[i].rotationPointX = MathHelper.cos(f) * 9.0F; + this.freezeSticks[i].rotationPointZ = MathHelper.sin(f) * 9.0F; + ++f; + } + + f = ((float)Math.PI / 4F) + p_78087_3_ * (float)Math.PI * 0.03F; + + for (int j = 4; j < 8; ++j) + { + this.freezeSticks[j].rotationPointY = 2.0F + MathHelper.cos(((float)(j * 2) + p_78087_3_) * 0.25F); + this.freezeSticks[j].rotationPointX = MathHelper.cos(f) * 7.0F; + this.freezeSticks[j].rotationPointZ = MathHelper.sin(f) * 7.0F; + ++f; + } + + f = 0.47123894F + p_78087_3_ * (float)Math.PI * -0.05F; + + for (int k = 8; k < 12; ++k) + { + this.freezeSticks[k].rotationPointY = 11.0F + MathHelper.cos(((float)k * 1.5F + p_78087_3_) * 0.5F); + this.freezeSticks[k].rotationPointX = MathHelper.cos(f) * 5.0F; + this.freezeSticks[k].rotationPointZ = MathHelper.sin(f) * 5.0F; + ++f; + } + + this.freezeHead.rotateAngleY = p_78087_4_ / (180F / (float)Math.PI); + this.freezeHead.rotateAngleX = p_78087_5_ / (180F / (float)Math.PI); + } +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/entities/RenderFreeze.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/entities/RenderFreeze.java new file mode 100644 index 00000000..b6ff4884 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/entities/RenderFreeze.java @@ -0,0 +1,24 @@ +package toughasnails.entities; + +import net.minecraft.client.renderer.entity.RenderLiving; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class RenderFreeze extends RenderLiving +{ + private static final ResourceLocation freezeTextures = new ResourceLocation("toughasnails:textures/entity/freeze.png"); + + public RenderFreeze(RenderManager renderManagerIn) + { + super(renderManagerIn, new ModelFreeze(), 0.5F); + } + + @Override + protected ResourceLocation getEntityTexture(EntityFreeze entity) + { + return freezeTextures; + } +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/entities/projectile/EntityIceball.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/entities/projectile/EntityIceball.java new file mode 100644 index 00000000..ecb1961d --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/entities/projectile/EntityIceball.java @@ -0,0 +1,336 @@ +package toughasnails.entities.projectile; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.IProjectile; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.DamageSource; +import net.minecraft.util.EnumParticleTypes; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import toughasnails.core.ToughAsNails; +import toughasnails.particle.TANParticleTypes; + +public class EntityIceball extends Entity implements IProjectile { + private int xTile = -1; + private int yTile = -1; + private int zTile = -1; + private Block inTile; + private boolean inGround; + public EntityLivingBase shootingEntity; + private int ticksAlive; + private int ticksInAir; + public double accelerationX; + public double accelerationY; + public double accelerationZ; + + public EntityIceball(World worldIn) { + super(worldIn); + this.setSize(0.3125F, 0.3125F); + } + + @Override + protected void entityInit() { + } + + @Override + @SideOnly(Side.CLIENT) + public boolean isInRangeToRenderDist(double distance) { + double d0 = this.getEntityBoundingBox().getAverageEdgeLength() * 4.0D; + + if (Double.isNaN(d0)) { + d0 = 4.0D; + } + + d0 = d0 * 64.0D; + return distance < d0 * d0; + } + + public EntityIceball(World worldIn, double x, double y, double z, double accelX, double accelY, double accelZ) { + super(worldIn); + this.setSize(1.0F, 1.0F); + this.setLocationAndAngles(x, y, z, this.rotationYaw, this.rotationPitch); + this.setPosition(x, y, z); + double d0 = (double) MathHelper.sqrt_double(accelX * accelX + accelY * accelY + accelZ * accelZ); + this.accelerationX = accelX / d0 * 0.1D; + this.accelerationY = accelY / d0 * 0.1D; + this.accelerationZ = accelZ / d0 * 0.1D; + } + + public EntityIceball(World worldIn, EntityLivingBase shooter, double accelX, double accelY, double accelZ) { + super(worldIn); + this.shootingEntity = shooter; + this.setSize(1.0F, 1.0F); + this.setLocationAndAngles(shooter.posX, shooter.posY, shooter.posZ, shooter.rotationYaw, shooter.rotationPitch); + this.setPosition(this.posX, this.posY, this.posZ); + this.motionX = this.motionY = this.motionZ = 0.0D; + accelX = accelX + this.rand.nextGaussian() * 0.4D; + accelY = accelY + this.rand.nextGaussian() * 0.4D; + accelZ = accelZ + this.rand.nextGaussian() * 0.4D; + double d0 = (double) MathHelper.sqrt_double(accelX * accelX + accelY * accelY + accelZ * accelZ); + this.accelerationX = accelX / d0 * 0.1D; + this.accelerationY = accelY / d0 * 0.1D; + this.accelerationZ = accelZ / d0 * 0.1D; + } + + @Override + public void onUpdate() { + if (this.getEntityWorld().isRemote || (this.shootingEntity == null || !this.shootingEntity.isDead) + && this.getEntityWorld().isBlockLoaded(new BlockPos(this))) { + super.onUpdate(); + + if (this.inGround) { + if (this.getEntityWorld().getBlockState(new BlockPos(this.xTile, this.yTile, this.zTile)) + .getBlock() == this.inTile) { + ++this.ticksAlive; + + if (this.ticksAlive == 600) { + this.setDead(); + } + + return; + } + + this.inGround = false; + this.motionX *= (double) (this.rand.nextFloat() * 0.2F); + this.motionY *= (double) (this.rand.nextFloat() * 0.2F); + this.motionZ *= (double) (this.rand.nextFloat() * 0.2F); + this.ticksAlive = 0; + this.ticksInAir = 0; + } else { + ++this.ticksInAir; + } + + Vec3d vec3 = new Vec3d(this.posX, this.posY, this.posZ); + Vec3d vec31 = new Vec3d(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); + RayTraceResult movingobjectposition = this.getEntityWorld().rayTraceBlocks(vec3, vec31); + vec3 = new Vec3d(this.posX, this.posY, this.posZ); + vec31 = new Vec3d(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ); + + if (movingobjectposition != null) { + vec31 = new Vec3d(movingobjectposition.hitVec.xCoord, movingobjectposition.hitVec.yCoord, + movingobjectposition.hitVec.zCoord); + } + + Entity entity = null; + List list = this.getEntityWorld().getEntitiesWithinAABBExcludingEntity(this, + this.getEntityBoundingBox().addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, + 1.0D)); + double d0 = 0.0D; + + for (int i = 0; i < list.size(); ++i) { + Entity entity1 = (Entity) list.get(i); + + if (entity1.canBeCollidedWith() + && (!entity1.isEntityEqual(this.shootingEntity) || this.ticksInAir >= 25)) { + float f = 0.3F; + AxisAlignedBB axisalignedbb = entity1.getEntityBoundingBox().expand((double) f, (double) f, + (double) f); + RayTraceResult movingobjectposition1 = axisalignedbb.calculateIntercept(vec3, vec31); + + if (movingobjectposition1 != null) { + double d1 = vec3.squareDistanceTo(movingobjectposition1.hitVec); + + if (d1 < d0 || d0 == 0.0D) { + entity = entity1; + d0 = d1; + } + } + } + } + + if (entity != null) { + movingobjectposition = new RayTraceResult(entity); + } + + if (movingobjectposition != null) { + this.onImpact(movingobjectposition); + } + + this.posX += this.motionX; + this.posY += this.motionY; + this.posZ += this.motionZ; + float f1 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); + this.rotationYaw = (float) (MathHelper.atan2(this.motionZ, this.motionX) * 180.0D / Math.PI) + 90.0F; + + for (this.rotationPitch = (float) (MathHelper.atan2((double) f1, this.motionY) * 180.0D / Math.PI) + - 90.0F; this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) { + ; + } + + while (this.rotationPitch - this.prevRotationPitch >= 180.0F) { + this.prevRotationPitch += 360.0F; + } + + while (this.rotationYaw - this.prevRotationYaw < -180.0F) { + this.prevRotationYaw -= 360.0F; + } + + while (this.rotationYaw - this.prevRotationYaw >= 180.0F) { + this.prevRotationYaw += 360.0F; + } + + this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F; + this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F; + float f2 = this.getMotionFactor(); + + if (this.isInWater()) { + for (int j = 0; j < 4; ++j) { + float f3 = 0.25F; + this.getEntityWorld().spawnParticle(EnumParticleTypes.WATER_BUBBLE, + this.posX - this.motionX * (double) f3, this.posY - this.motionY * (double) f3, + this.posZ - this.motionZ * (double) f3, this.motionX, this.motionY, this.motionZ, + new int[0]); + } + + f2 = 0.8F; + } + + this.motionX += this.accelerationX; + this.motionY += this.accelerationY; + this.motionZ += this.accelerationZ; + this.motionX *= (double) f2; + this.motionY *= (double) f2; + this.motionZ *= (double) f2; + ToughAsNails.proxy.spawnParticle(TANParticleTypes.SNOWFLAKE, this.posX, this.posY + 0.5D, this.posZ, 0.0D, + 0.0D, 0.0D, new int[0]); + this.setPosition(this.posX, this.posY, this.posZ); + } else { + this.setDead(); + } + } + + protected float getMotionFactor() { + return 0.95F; + } + + protected void onImpact(RayTraceResult movingObject) { + if (!this.getEntityWorld().isRemote) { + if (movingObject.entityHit != null) { + boolean flag = movingObject.entityHit.attackEntityFrom(DamageSource.generic, 5.0F); + + if (flag) { + this.applyEnchantments(this.shootingEntity, movingObject.entityHit); + + /* + * if (!movingObject.entityHit.isImmuneToFire()) { + * movingObject.entityHit.setFire(5); } + */ + } + } else { + boolean flag1 = true; + + if (this.shootingEntity != null && this.shootingEntity instanceof EntityLiving) { + flag1 = this.getEntityWorld().getGameRules().getBoolean("mobGriefing"); + } + + if (flag1) { + // BlockPos blockpos = movingObject.getBlockPos() + // .offset(movingObject.sideHit); + + /* + * if (this.worldObj.isAirBlock(blockpos)) { + * this.worldObj.setBlockState(blockpos, + * Blocks.snow_layer.getDefaultState()); } + */ + } + } + + this.setDead(); + } + } + + @Override + public void writeEntityToNBT(NBTTagCompound tagCompound) { + tagCompound.setShort("xTile", (short) this.xTile); + tagCompound.setShort("yTile", (short) this.yTile); + tagCompound.setShort("zTile", (short) this.zTile); + ResourceLocation resourcelocation = (ResourceLocation) Block.REGISTRY.getNameForObject(this.inTile); + tagCompound.setString("inTile", resourcelocation == null ? "" : resourcelocation.toString()); + tagCompound.setByte("inGround", (byte) (this.inGround ? 1 : 0)); + tagCompound.setTag("direction", + this.newDoubleNBTList(new double[] { this.motionX, this.motionY, this.motionZ })); + } + + @Override + public void readEntityFromNBT(NBTTagCompound tagCompund) { + this.xTile = tagCompund.getShort("xTile"); + this.yTile = tagCompund.getShort("yTile"); + this.zTile = tagCompund.getShort("zTile"); + + if (tagCompund.hasKey("inTile", 8)) { + this.inTile = Block.getBlockFromName(tagCompund.getString("inTile")); + } else { + this.inTile = Block.getBlockById(tagCompund.getByte("inTile") & 255); + } + + this.inGround = tagCompund.getByte("inGround") == 1; + + if (tagCompund.hasKey("direction", 9)) { + NBTTagList nbttaglist = tagCompund.getTagList("direction", 6); + this.motionX = nbttaglist.getDoubleAt(0); + this.motionY = nbttaglist.getDoubleAt(1); + this.motionZ = nbttaglist.getDoubleAt(2); + } else { + this.setDead(); + } + } + + @Override + public boolean canBeCollidedWith() { + return true; + } + + @Override + public float getCollisionBorderSize() { + return 0.5F; + } + + @Override + public boolean attackEntityFrom(DamageSource source, float amount) { + if (this.isEntityInvulnerable(source)) { + return false; + } else { + this.setBeenAttacked(); + + if (source.getEntity() != null) { + Vec3d vec3 = source.getEntity().getLookVec(); + + if (vec3 != null) { + this.motionX = vec3.xCoord; + this.motionY = vec3.yCoord; + this.motionZ = vec3.zCoord; + this.accelerationX = this.motionX * 0.1D; + this.accelerationY = this.motionY * 0.1D; + this.accelerationZ = this.motionZ * 0.1D; + } + + if (source.getEntity() instanceof EntityLivingBase) { + this.shootingEntity = (EntityLivingBase) source.getEntity(); + } + + return true; + } else { + return false; + } + } + } + + @Override + public void setThrowableHeading(double x, double y, double z, float velocity, float inaccuracy) { + // TODO Auto-generated method stub + + } +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/entities/projectile/RenderIceball.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/entities/projectile/RenderIceball.java new file mode 100644 index 00000000..ded9ac67 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/entities/projectile/RenderIceball.java @@ -0,0 +1,53 @@ +package toughasnails.entities.projectile; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.RenderItem; +import net.minecraft.client.renderer.block.model.ItemCameraTransforms; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import toughasnails.api.item.TANItems; + +@SideOnly(Side.CLIENT) +public class RenderIceball extends Render +{ + private final RenderItem renderItem; + + public RenderIceball(RenderManager renderManagerIn) + { + super(renderManagerIn); + this.renderItem = Minecraft.getMinecraft().getRenderItem(); + } + + @Override + public void doRender(EntityIceball entity, double x, double y, double z, float entityYaw, float partialTicks) + { + GlStateManager.pushMatrix(); + GlStateManager.translate((float)x, (float)y, (float)z); + GlStateManager.enableRescaleNormal(); + GlStateManager.scale(0.5F, 0.5F, 0.5F); + GlStateManager.rotate(-this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F); + GlStateManager.rotate(this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F); + this.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); + this.renderItem.renderItem(this.getItemStack(entity), ItemCameraTransforms.TransformType.GROUND); + GlStateManager.disableRescaleNormal(); + GlStateManager.popMatrix(); + super.doRender(entity, x, y, z, entityYaw, partialTicks); + } + + public ItemStack getItemStack(EntityIceball entity) + { + return new ItemStack(TANItems.ice_charge, 1, 0); + } + + @Override + protected ResourceLocation getEntityTexture(EntityIceball entity) + { + return TextureMap.LOCATION_BLOCKS_TEXTURE; + } +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/AchievementEventHandler.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/AchievementEventHandler.java new file mode 100644 index 00000000..778d4411 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/AchievementEventHandler.java @@ -0,0 +1,98 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.handler; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.event.entity.living.LivingEntityUseItemEvent; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.PlayerEvent; +import net.minecraftforge.fml.common.gameevent.PlayerEvent.ItemCraftedEvent; +import toughasnails.api.achievement.TANAchievements; +import toughasnails.api.item.TANItems; + +public class AchievementEventHandler { + @SubscribeEvent + public void onItemPickup(PlayerEvent.ItemPickupEvent event) { + ItemStack stack = event.pickedUp.getEntityItem(); + Item item = stack.getItem(); + EntityPlayer player = event.player; + + if (item != null && item == TANItems.freeze_rod) { + player.addStat(TANAchievements.into_ice); + } + } + + @SubscribeEvent + public void onItemUsed(PlayerInteractEvent event) { + /* + * TODO: 1.9 if (event.action != Action.LEFT_CLICK_BLOCK) { ItemStack + * stack = event.entityPlayer.getHeldItem(); Item item = stack != null ? + * stack.getItem() : null; EntityPlayer player = event.entityPlayer; + * + * //Gone Home if (item == BOPItems.enderporter) { + * player.addStat(BOPAchievements.use_enderporter); } } + */ + } + + @SubscribeEvent + public void onItemUsed(LivingEntityUseItemEvent.Finish event) { + ItemStack stack = event.getItem(); + Item item = stack.getItem(); + + if (event.getEntity() instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) event.getEntityLiving(); + + // Life or Death + if (item == TANItems.lifeblood_crystal) { + player.addStat(TANAchievements.life_or_death); + } + } + } + + @SubscribeEvent + public void onItemCrafted(ItemCraftedEvent event) { + Item item = event.crafting.getItem(); + EntityPlayer player = event.player; + + // Thirst Quencher Achievement + if (item != null && item == TANItems.canteen) { + player.addStat(TANAchievements.thirst_quencher); + } + + // Thirst Ender Achievement + if (item != null && item == TANItems.fruit_juice) { + player.addStat(TANAchievements.thirst_ender); + } + + // Hot or Cold Achievement + if (item != null && item == TANItems.thermometer) { + player.addStat(TANAchievements.hot_or_cold); + } + + // That Time Of Year + if (item != null && item == TANItems.season_clock) { + player.addStat(TANAchievements.that_time_of_year); + } + } + + /* + * @SubscribeEvent public void onPlayerUpdate(LivingUpdateEvent event) { if + * (!event.getEntity().worldObj.isRemote && event.getEntity() instanceof + * EntityPlayer) { EntityPlayerMP player = + * (EntityPlayerMP)event.getEntity(); + * + * if (player.ticksExisted % 20 * 5 == 0) { if + * (!player.getStatFile().hasAchievementUnlocked(TANAchievements.year_one)) + * { + * + * } } } } + */ +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/BlockHarvestEventHandler.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/BlockHarvestEventHandler.java new file mode 100644 index 00000000..bdc1832e --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/BlockHarvestEventHandler.java @@ -0,0 +1,27 @@ +package toughasnails.handler; + +import java.util.Random; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraftforge.event.world.BlockEvent.HarvestDropsEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import toughasnails.api.item.TANItems; + +public class BlockHarvestEventHandler { + @SubscribeEvent + public void onBlockBreak(HarvestDropsEvent event) { + IBlockState state = event.getState(); + // int fortune = event.getFortuneLevel(); + + if (event.getHarvester() == null || event.isSilkTouching()) + return; + + if (state.getBlock() == Blocks.ICE && event.getHarvester() != null) { + event.getDrops().clear(); + event.getDrops().add( + new ItemStack(TANItems.ice_cube, new Random().nextInt(2))); + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/ExtendedStatHandler.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/ExtendedStatHandler.java new file mode 100644 index 00000000..1af43ad7 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/ExtendedStatHandler.java @@ -0,0 +1,75 @@ +package toughasnails.handler; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.event.AttachCapabilitiesEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.PlayerEvent.PlayerLoggedInEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent.Phase; +import net.minecraftforge.fml.common.gameevent.TickEvent.PlayerTickEvent; +import toughasnails.api.stat.IPlayerStat; +import toughasnails.api.stat.PlayerStatRegistry; +import toughasnails.api.stat.StatHandlerBase; +import toughasnails.core.ToughAsNails; + +public class ExtendedStatHandler { + @SuppressWarnings("deprecation") + @SubscribeEvent + public void onAttachCapabilities(AttachCapabilitiesEvent.Entity event) { + if (event.getEntity() instanceof EntityPlayer) { + for (String identifier : PlayerStatRegistry.getCapabilityMap().keySet()) { + ResourceLocation loc = new ResourceLocation(ToughAsNails.MOD_ID, identifier); + + // Each player should have their own instance for each stat, as + // associated values may vary + if (!event.getCapabilities().containsKey(loc)) + event.addCapability(loc, PlayerStatRegistry.createCapabilityProvider(identifier)); + } + } + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @SubscribeEvent + public void onPlayerLogin(PlayerLoggedInEvent event) { + EntityPlayer player = event.player; + World world = player.getEntityWorld(); + + if (!world.isRemote) { + for (Capability capability : PlayerStatRegistry.getCapabilityMap().values()) { + StatHandlerBase stat = (StatHandlerBase) player.getCapability(capability, null); + + capability.getStorage().readNBT(capability, stat, null, + player.getEntityData().getCompoundTag(capability.getName())); + stat.onSendClientUpdate(); + PacketHandler.instance.sendTo(stat.createUpdateMessage(), (EntityPlayerMP) player); + } + } + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @SubscribeEvent + public void onPlayerTick(PlayerTickEvent event) { + EntityPlayer player = event.player; + World world = player.getEntityWorld(); + + if (!world.isRemote) { + for (Capability capability : PlayerStatRegistry.getCapabilityMap().values()) { + IPlayerStat stat = (IPlayerStat) player.getCapability(capability, null); + + stat.update(player, world, event.phase); + + if (event.phase == Phase.START) { + if (stat.hasChanged()) { + player.getEntityData().setTag(capability.getName(), + capability.getStorage().writeNBT(capability, stat, null)); + stat.onSendClientUpdate(); + PacketHandler.instance.sendTo(stat.createUpdateMessage(), (EntityPlayerMP) player); + } + } + } + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/LootTableEventHandler.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/LootTableEventHandler.java new file mode 100644 index 00000000..016899f3 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/LootTableEventHandler.java @@ -0,0 +1,44 @@ +package toughasnails.handler; + +import net.minecraft.world.storage.loot.LootEntryItem; +import net.minecraft.world.storage.loot.LootPool; +import net.minecraft.world.storage.loot.LootTableList; +import net.minecraft.world.storage.loot.conditions.LootCondition; +import net.minecraft.world.storage.loot.functions.LootFunction; +import net.minecraftforge.event.LootTableLoadEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import toughasnails.api.item.TANItems; + +public class LootTableEventHandler +{ + @SubscribeEvent + public void onLootTableLoad(LootTableLoadEvent event) + { + if (event.getName().equals(LootTableList.CHESTS_NETHER_BRIDGE)) + { + LootPool main = event.getTable().getPool("main"); + if (main != null) + { + main.addEntry(new LootEntryItem(TANItems.lifeblood_crystal, 1, 0, new LootFunction[0], new LootCondition[0], "toughasnails:lifeblood_crystal")); + } + } + if (event.getName().equals(LootTableList.CHESTS_SPAWN_BONUS_CHEST)) + { + LootPool main = event.getTable().getPool("main"); + if (main != null) + { + main.addEntry(new LootEntryItem(TANItems.canteen, 10, 0, new LootFunction[0], new LootCondition[0], "toughasnails:canteen")); + } + } + if (event.getName().equals(LootTableList.CHESTS_IGLOO_CHEST)) + { + LootPool main = event.getTable().getPool("main"); + if (main != null) + { + main.addEntry(new LootEntryItem(TANItems.ice_cube, 8, 5, new LootFunction[0], new LootCondition[0], "toughasnails:ice_cube")); + main.addEntry(new LootEntryItem(TANItems.freeze_powder, 4, 3, new LootFunction[0], new LootCondition[0], "toughasnails:freeze_powder")); + main.addEntry(new LootEntryItem(TANItems.freeze_rod, 2, 1, new LootFunction[0], new LootCondition[0], "toughasnails:freeze_rod")); + } + } + } +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/PacketHandler.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/PacketHandler.java new file mode 100644 index 00000000..27d1f5c2 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/PacketHandler.java @@ -0,0 +1,25 @@ +package toughasnails.handler; + +import net.minecraftforge.fml.common.network.NetworkRegistry; +import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper; +import net.minecraftforge.fml.relauncher.Side; +import toughasnails.core.ToughAsNails; +import toughasnails.network.message.MessageSyncConfigs; +import toughasnails.network.message.MessageSyncSeasonCycle; +import toughasnails.network.message.MessageTemperatureClient; +import toughasnails.network.message.MessageToggleUI; +import toughasnails.network.message.MessageUpdateStat; + +public class PacketHandler +{ + public static final SimpleNetworkWrapper instance = NetworkRegistry.INSTANCE.newSimpleChannel(ToughAsNails.MOD_ID); + + public static void init() + { + instance.registerMessage(MessageUpdateStat.class, MessageUpdateStat.class, 0, Side.CLIENT); + instance.registerMessage(MessageTemperatureClient.class, MessageTemperatureClient.class, 1, Side.CLIENT); + instance.registerMessage(MessageToggleUI.class, MessageToggleUI.class, 2, Side.CLIENT); + instance.registerMessage(MessageSyncSeasonCycle.class, MessageSyncSeasonCycle.class, 3, Side.CLIENT); + instance.registerMessage(MessageSyncConfigs.class, MessageSyncConfigs.class, 4, Side.CLIENT); + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/health/HealthOverlayHandler.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/health/HealthOverlayHandler.java new file mode 100644 index 00000000..682edee8 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/health/HealthOverlayHandler.java @@ -0,0 +1,59 @@ +package toughasnails.handler.health; + +import static toughasnails.util.RenderUtils.drawTexturedModalRect; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import toughasnails.api.HealthHelper; +import toughasnails.api.config.GameplayOption; +import toughasnails.api.config.SyncedConfig; + +public class HealthOverlayHandler { + public static final ResourceLocation OVERLAY = new ResourceLocation("toughasnails:textures/gui/overlay.png"); + + // private final Random random = new Random(); + private final Minecraft minecraft = Minecraft.getMinecraft(); + + @SubscribeEvent + public void onPostRenderOverlay(RenderGameOverlayEvent.Pre event) { + ScaledResolution resolution = event.getResolution(); + int width = resolution.getScaledWidth(); + int height = resolution.getScaledHeight(); + EntityPlayerSP player = Minecraft.getMinecraft().thePlayer; + + if (event.getType() == ElementType.HEALTH + && SyncedConfig.getBooleanValue(GameplayOption.ENABLE_LOWERED_STARTING_HEALTH)) { + minecraft.getTextureManager().bindTexture(OVERLAY); + + if (minecraft.playerController.gameIsSurvivalOrAdventure()) { + drawInactiveHearts(width, height, HealthHelper.getInactiveHearts(player)); + } + } + } + + private void drawInactiveHearts(int width, int height, int inactiveHearts) { + GlStateManager.disableDepth(); + GlStateManager.enableBlend(); + int left = width / 2 - 91; + int top = height - 39; + + for (int i = 0; i < inactiveHearts; i++) { + int activeOffset = 8 * (10 - inactiveHearts); + int startX = left + i * 8 + activeOffset; + int startY = top; + + drawTexturedModalRect(startX, startY, 0, 43, 9, 9); + } + + minecraft.getTextureManager().bindTexture(Gui.ICONS); + GlStateManager.disableBlend(); + GlStateManager.enableDepth(); + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/health/MaxHealthHandler.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/health/MaxHealthHandler.java new file mode 100644 index 00000000..8b3f9182 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/health/MaxHealthHandler.java @@ -0,0 +1,238 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.handler.health; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; + +import net.minecraft.client.Minecraft; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.attributes.AttributeModifier; +import net.minecraft.entity.ai.attributes.IAttributeInstance; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.server.integrated.IntegratedServer; +import net.minecraft.world.EnumDifficulty; +import net.minecraft.world.World; +import net.minecraft.world.storage.WorldInfo; +import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent.Phase; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import toughasnails.api.HealthHelper; +import toughasnails.api.config.GameplayOption; +import toughasnails.api.config.SyncedConfig; + +public class MaxHealthHandler { + // TODO: If the health config option is changed and the current health is + // lower increase it to that new default + @SubscribeEvent + public void onPlayerLogin(TickEvent.PlayerTickEvent event) { + EntityPlayer player = event.player; + World world = player.getEntityWorld(); + + if (!world.isRemote) { + updateStartingHealthModifier(world.getDifficulty(), player); + } + } + + @SubscribeEvent + public void onPlayerClone(PlayerEvent.Clone event) { + IAttributeInstance oldMaxHealthInstance = event.getOriginal().getAttributeMap() + .getAttributeInstance(SharedMonsterAttributes.MAX_HEALTH); + AttributeModifier modifier = oldMaxHealthInstance.getModifier(HealthHelper.LIFEBLOOD_HEALTH_MODIFIER_ID); + + // Copy the lifeblood modifier from the 'old' player + if (SyncedConfig.getBooleanValue(GameplayOption.ENABLE_LOWERED_STARTING_HEALTH) && modifier != null) { + Multimap multimap = HashMultimap. create(); + multimap.put(SharedMonsterAttributes.MAX_HEALTH.getAttributeUnlocalizedName(), modifier); + event.getEntityPlayer().getAttributeMap().applyAttributeModifiers(multimap); + } + } + + @SideOnly(Side.CLIENT) + @SubscribeEvent + public void onServerTick(TickEvent.ServerTickEvent event) { + Minecraft minecraft = Minecraft.getMinecraft(); + IntegratedServer integratedServer = minecraft.getIntegratedServer(); + + if (SyncedConfig.getBooleanValue(GameplayOption.ENABLE_LOWERED_STARTING_HEALTH) && event.phase == Phase.END + && integratedServer != null) { + boolean gamePaused = Minecraft.getMinecraft().getConnection() != null && minecraft.isGamePaused(); + + if (!gamePaused && minecraft.theWorld != null) { + WorldInfo serverWorldInfo = integratedServer.worldServers[0].getWorldInfo(); + WorldInfo localWorldInfo = minecraft.theWorld.getWorldInfo(); + + // This is checked before the difficulty is actually changed to + // make the two match in IntegratedServer's tick() + if (localWorldInfo.getDifficulty() != serverWorldInfo.getDifficulty()) { + List players = integratedServer.getPlayerList().getPlayerList(); + + // Update the modifiers of all the connected players + for (EntityPlayerMP player : players) { + updateStartingHealthModifier(localWorldInfo.getDifficulty(), player); + } + } + } + } + } + + private static Map maxHealth = new HashMap(); + + public static void overrideMaximumHealth(UUID player, int newMaximumHealth) { + if (newMaximumHealth > 0 && newMaximumHealth <= 20) { + maxHealth.put(player, newMaximumHealth); + File f = new File("player_health_overrides.txt"); + List lines = new ArrayList(); + try { + if (!f.exists()) { + f.createNewFile(); + } + + BufferedReader br = new BufferedReader(new FileReader(f)); + String line; + while ((line = br.readLine()) != null) { + String[] split = line.split("\\|"); + String idString = split[0]; + if (!player.toString().equals(idString)) { + lines.add(line); + } + } + br.close(); + + f.delete(); + f.createNewFile(); + PrintWriter writer = new PrintWriter(new FileWriter("player_health_overrides.txt")); + for (String outLine : lines) { + writer.println(outLine); + } + writer.println(player.toString() + "|" + newMaximumHealth); + writer.close(); + } catch (FileNotFoundException e1) { + e1.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + private void updateStartingHealthModifier(EnumDifficulty difficulty, EntityPlayer player) { + UUID id = player.getUniqueID(); + IAttributeInstance maxHealthInstance = player.getAttributeMap() + .getAttributeInstance(SharedMonsterAttributes.MAX_HEALTH); + AttributeModifier modifier = maxHealthInstance.getModifier(HealthHelper.STARTING_HEALTH_MODIFIER_ID); + + // Don't update if the lowered starting health config option is disabled + if (!SyncedConfig.getBooleanValue(GameplayOption.ENABLE_LOWERED_STARTING_HEALTH)) { + if (modifier != null) { + maxHealthInstance.removeModifier(HealthHelper.STARTING_HEALTH_MODIFIER_ID); + } + + return; + } + + double difficultyHealthDecrement = 0; + boolean initialized = false; + if (!maxHealth.containsKey(id)) { + File f = new File("player_health_overrides.txt"); + try { + if (!f.exists()) { + f.createNewFile(); + } + + BufferedReader br = new BufferedReader(new FileReader(f)); + String line; + while ((line = br.readLine()) != null) { + String split[] = line.split("\\|"); + String idString = split[0]; + String maxHealthString = split[1]; + if (id.toString().equals(idString)) { + maxHealth.put(id, Integer.parseInt(maxHealthString)); + initialized = true; + break; + } + } + br.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } else { + difficultyHealthDecrement = -(20 - maxHealth.get(id)); + initialized = true; + } + + if (!initialized) { + switch (difficulty) { + case EASY: + difficultyHealthDecrement = -6.0D; + maxHealth.put(id, 14); + break; + + case NORMAL: + difficultyHealthDecrement = -10.0D; + maxHealth.put(id, 10); + break; + + case HARD: + difficultyHealthDecrement = -14.0D; + maxHealth.put(id, 6); + break; + + default: + difficultyHealthDecrement = -0.0D; + maxHealth.put(id, 20); + break; + } + } + + double lifebloodHearts = HealthHelper.getLifebloodHearts(player) * 2; + double overallHealthDecrement = difficultyHealthDecrement + lifebloodHearts; + + // Ensure that the total hearts is never above 20 when the difficulty is + // changed + if (overallHealthDecrement > 0.0D) { + difficultyHealthDecrement -= overallHealthDecrement; + } + + // If the player doesn't have a modifier for a lowered starting health, + // add one + // Or alternatively, if the player already has the attribute, update it + // only if it is less than the current difficulty + // When the difficulty is changed locally in the options menu, it should + // always change (forceUpdate) + if (modifier == null || modifier.getAmount() != difficultyHealthDecrement) { + Multimap multimap = HashMultimap. create(); + modifier = new AttributeModifier(HealthHelper.STARTING_HEALTH_MODIFIER_ID, "Starting Health Modifier", + difficultyHealthDecrement, 0); + multimap.put(SharedMonsterAttributes.MAX_HEALTH.getAttributeUnlocalizedName(), modifier); + player.getAttributeMap().applyAttributeModifiers(multimap); + + if (player.getHealth() > player.getMaxHealth()) { + player.setHealth(player.getMaxHealth()); + } + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/season/ProviderIceHandler.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/season/ProviderIceHandler.java new file mode 100644 index 00000000..76afb97e --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/season/ProviderIceHandler.java @@ -0,0 +1,53 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.handler.season; + +import net.minecraft.init.Blocks; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.event.terraingen.PopulateChunkEvent; +import net.minecraftforge.event.terraingen.PopulateChunkEvent.Populate.EventType; +import net.minecraftforge.fml.common.eventhandler.Event.Result; +import net.minecraftforge.fml.common.eventhandler.EventPriority; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import toughasnails.season.SeasonASMHelper; + +public class ProviderIceHandler +{ + /**Handle our own ice generation to ignore winter*/ + @SubscribeEvent(priority = EventPriority.HIGHEST) + public void onPopulateChunkEvent(PopulateChunkEvent.Populate event) + { + World world = event.getWorld(); + BlockPos pos = new BlockPos(event.getChunkX() * 16, 0, event.getChunkZ() * 16).add(8, 0, 8); + + if (event.getType() == EventType.ICE) + { + for (int k2 = 0; k2 < 16; ++k2) + { + for (int j3 = 0; j3 < 16; ++j3) + { + BlockPos blockpos1 = world.getPrecipitationHeight(pos.add(k2, 0, j3)); + BlockPos blockpos2 = blockpos1.down(); + + if (SeasonASMHelper.canBlockFreezeInSeason(world, blockpos2, false, null)) + { + world.setBlockState(blockpos2, Blocks.ICE.getDefaultState(), 2); + } + + if (SeasonASMHelper.canSnowAtInSeason(world, blockpos1, true, null)) + { + world.setBlockState(blockpos1, Blocks.SNOW_LAYER.getDefaultState(), 2); + } + } + } + + event.setResult(Result.DENY); + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/season/RandomUpdateHandler.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/season/RandomUpdateHandler.java new file mode 100644 index 00000000..4bdc6155 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/season/RandomUpdateHandler.java @@ -0,0 +1,100 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.handler.season; + +import java.util.Iterator; +import java.util.Random; + +import net.minecraft.block.BlockIce; +import net.minecraft.init.Blocks; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.WorldServer; +import net.minecraft.world.chunk.Chunk; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent.Phase; +import net.minecraftforge.fml.relauncher.Side; +import toughasnails.api.config.GameplayOption; +import toughasnails.api.config.SyncedConfig; +import toughasnails.api.season.Season; +import toughasnails.api.season.Season.SubSeason; +import toughasnails.api.season.SeasonHelper; + +public class RandomUpdateHandler { + + Random random = new Random(); + + // Randomly melt ice and snow when it isn't winter + @SubscribeEvent + public void onWorldTick(TickEvent.WorldTickEvent event) { + if (event.phase == Phase.END && event.side == Side.SERVER) { + WorldServer world = (WorldServer) event.world; + Season season = SeasonHelper.getSeasonData(world).getSubSeason().getSeason(); + SubSeason subSeason = SeasonHelper.getSeasonData(world).getSubSeason(); + + if (!(SyncedConfig.getBooleanValue(GameplayOption.ENABLE_SEASONS))) { + season = Season.SUMMER; + subSeason = SubSeason.MID_SUMMER; + } + + // Only melt when it isn't winter + if (subSeason != SubSeason.EARLY_WINTER && subSeason != SubSeason.MID_WINTER + && subSeason != SubSeason.LATE_WINTER) { + for (Iterator iterator = world + .getPersistentChunkIterable(world.getPlayerChunkMap().getChunkIterator()); iterator + .hasNext();) { + Chunk chunk = (Chunk) iterator.next(); + int x = chunk.xPosition * 16; + int z = chunk.zPosition * 16; + + int rand; + switch (subSeason) { + case EARLY_SPRING: + rand = 16; + break; + case MID_SPRING: + rand = 12; + break; + case LATE_SPRING: + rand = 8; + break; + default: + rand = 4; + break; + } + + if (world.rand.nextInt(rand) == 0) { + int randOffset = (random.nextInt() * 3 + 1013904223) >> 2; + BlockPos topPos = world.getPrecipitationHeight( + new BlockPos(x + (randOffset & 15), 0, z + (randOffset >> 8 & 15))); + BlockPos groundPos = topPos.down(); + + if (world.getBlockState(groundPos).getBlock() == Blocks.ICE + && !SeasonHelper.canSnowAtTempInSeason(season, + world.getBiome(groundPos).getFloatTemperature(groundPos))) { + + if (world.provider.doesWaterVaporize()) { + world.setBlockToAir(groundPos); + } else { + ((BlockIce) Blocks.ICE).dropBlockAsItem(world, groundPos, + world.getBlockState(groundPos), 0); + world.setBlockState(groundPos, Blocks.WATER.getDefaultState()); + world.notifyBlockOfStateChange(groundPos, Blocks.WATER); + } + } + + if (world.getBlockState(topPos).getBlock() == Blocks.SNOW_LAYER && !SeasonHelper + .canSnowAtTempInSeason(season, world.getBiome(topPos).getFloatTemperature(topPos))) { + world.setBlockToAir(topPos); + } + } + } + } + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/season/SeasonHandler.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/season/SeasonHandler.java new file mode 100644 index 00000000..4fa9c809 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/season/SeasonHandler.java @@ -0,0 +1,244 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.handler.season; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.storage.MapStorage; +import net.minecraftforge.event.world.BlockEvent; +import net.minecraftforge.fml.common.eventhandler.Event; +import net.minecraftforge.fml.common.eventhandler.Event.Result; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.PlayerEvent.PlayerLoggedInEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; +import toughasnails.api.config.GameplayOption; +import toughasnails.api.config.SyncedConfig; +import toughasnails.api.season.IDecayableCrop; +import toughasnails.api.season.IHibernatingCrop; +import toughasnails.api.season.ISeasonData; +import toughasnails.api.season.Season; +import toughasnails.api.season.Season.SubSeason; +import toughasnails.api.season.SeasonHelper; +import toughasnails.api.temperature.Temperature; +import toughasnails.api.temperature.TemperatureHelper; +import toughasnails.config.CropGrowConfigEntry; +import toughasnails.config.GameplayConfigurationHandler; +import toughasnails.handler.PacketHandler; +import toughasnails.network.message.MessageSyncSeasonCycle; +import toughasnails.season.SeasonSavedData; +import toughasnails.season.SeasonTime; +import toughasnails.temperature.TemperatureHandler; + +public class SeasonHandler { + + @SubscribeEvent + public void onWorldTick(TickEvent.WorldTickEvent event) { + World world = event.world; + + if (event.phase == TickEvent.Phase.END && !world.isRemote && world.provider.getDimension() == 0 + && SyncedConfig.getBooleanValue(GameplayOption.ENABLE_SEASONS)) { + SeasonSavedData savedData = getSeasonSavedData(world); + + if (savedData.seasonCycleTicks++ > SeasonTime.TOTAL_CYCLE_TICKS) { + savedData.seasonCycleTicks = 0; + } + + if (savedData.seasonCycleTicks % 20 == 0) { + sendSeasonUpdate(world); + } + + savedData.markDirty(); + } + } + + @SubscribeEvent + public void onPlayerLogin(PlayerLoggedInEvent event) { + EntityPlayer player = event.player; + World world = player.getEntityWorld(); + + sendSeasonUpdate(world); + } + + private SubSeason lastSeason = null; + public static int clientSeasonCycleTicks = 0; + + @SubscribeEvent + public void onClientTick(TickEvent.ClientTickEvent event) { + // Only do this when in the world + if (Minecraft.getMinecraft().thePlayer == null) + return; + + int dimension = Minecraft.getMinecraft().thePlayer.dimension; + + if (event.phase == TickEvent.Phase.END && dimension == 0 + && SyncedConfig.getBooleanValue(GameplayOption.ENABLE_SEASONS)) { + // Keep ticking as we're synchronized with the server only every + // second + if (clientSeasonCycleTicks++ > SeasonTime.TOTAL_CYCLE_TICKS) { + clientSeasonCycleTicks = 0; + } + + SeasonTime calendar = new SeasonTime(clientSeasonCycleTicks); + + if (calendar.getSubSeason() != lastSeason) { + Minecraft.getMinecraft().renderGlobal.loadRenderers(); + lastSeason = calendar.getSubSeason(); + } + } + } + + public static void sendSeasonUpdate(World world) { + if (!world.isRemote && SyncedConfig.getBooleanValue(GameplayOption.ENABLE_SEASONS)) { + SeasonSavedData savedData = getSeasonSavedData(world); + PacketHandler.instance.sendToAll(new MessageSyncSeasonCycle(savedData.seasonCycleTicks)); + } + } + + public static SeasonSavedData getSeasonSavedData(World world) { + MapStorage mapStorage = world.getPerWorldStorage(); + SeasonSavedData savedData = (SeasonSavedData) mapStorage.getOrLoadData(SeasonSavedData.class, + SeasonSavedData.DATA_IDENTIFIER); + + // If the saved data file hasn't been created before, create it + if (savedData == null) { + savedData = new SeasonSavedData(SeasonSavedData.DATA_IDENTIFIER); + mapStorage.setData(SeasonSavedData.DATA_IDENTIFIER, savedData); + savedData.markDirty(); // Mark for saving + } + + return savedData; + } + + /* + * Check for hibernating crops attempting to grow in the cold or heat, and + * block them. + */ + @SubscribeEvent + public void onCropGrowPre(BlockEvent.CropGrowEvent.Pre event) { + if (!event.getWorld().isRemote) { + Block block = event.getState().getBlock(); + String blockName = block.getRegistryName().toString(); + BlockPos pos = event.getPos(); + World world = event.getWorld(); + boolean temperatureWithering = SyncedConfig.getBooleanValue(GameplayOption.TEMPERATURE_WITHERING); + if (temperatureWithering) { + int minHibernate = 0; + int minOptimal = 0; + int maxOptimal = 0; + int maxHibernate = 0; + float nonOptimalChance = 0; + // Assign crop hibernation details from config file. + if (GameplayConfigurationHandler.EXTERNAL_HIBERNATING_CROPS.containsKey(blockName)) { + CropGrowConfigEntry cropData = GameplayConfigurationHandler.EXTERNAL_HIBERNATING_CROPS + .get(blockName); + minHibernate = cropData.getMinLiving(); + minOptimal = cropData.getMinOptimal(); + maxOptimal = cropData.getMaxOptimal(); + maxHibernate = cropData.getMaxLiving(); + nonOptimalChance = cropData.getNonOptimalChance(); + + // Otherwise, assign defaults. + } else if (block instanceof IHibernatingCrop && ((IHibernatingCrop) block).shouldHibernate()) { + minHibernate = 5; + minOptimal = 10; + maxOptimal = 15; + maxHibernate = 20; + nonOptimalChance = 0.5f; + } else { + event.setResult(Event.Result.ALLOW); + return; + } + + // Alive but not optimal, slow growth + int targetTemperature = TemperatureHandler.getTargetTemperatureAt(world, pos); + if ((targetTemperature > maxOptimal && targetTemperature <= maxHibernate) + || (targetTemperature < minOptimal && targetTemperature >= minHibernate) + && (Math.random() < nonOptimalChance)) { + event.setResult(Result.DENY); + } else if (targetTemperature < minHibernate || targetTemperature > maxHibernate) { + event.setResult(Result.DENY); + } + } else { + Season season = SeasonHelper.getSeasonData(world).getSubSeason().getSeason(); + if (season == Season.WINTER + && (block instanceof IHibernatingCrop && ((IHibernatingCrop) block).shouldHibernate()) + && !TemperatureHelper.isPosClimatisedForTemp(world, pos, new Temperature(1)) + && SyncedConfig.getBooleanValue(GameplayOption.ENABLE_SEASONS)) { + event.setResult(Event.Result.DENY); + } + } + } + } + + /* + * Detect crop grow events and check for the optimal growth condition. + */ + @SubscribeEvent + public void onCropGrowEvent(BlockEvent.CropGrowEvent event) { + if (!event.getWorld().isRemote) { + // This type of growth only applies when temperature decay is + // enabled. + Block block = event.getState().getBlock(); + World world = event.getWorld(); + BlockPos pos = event.getPos(); + String blockName = block.getRegistryName().toString(); + boolean temperatureWithering = SyncedConfig.getBooleanValue(GameplayOption.TEMPERATURE_WITHERING); + if (temperatureWithering) { + int minLiving = 0; + int minOptimal = 0; + int maxOptimal = 0; + int maxLiving = 0; + float nonOptimalChance = 0; + + // Assign crop life details from config file. + if (GameplayConfigurationHandler.EXTERNAL_DECAYING_CROPS.containsKey(blockName)) { + CropGrowConfigEntry cropData = GameplayConfigurationHandler.EXTERNAL_DECAYING_CROPS.get(blockName); + minLiving = cropData.getMinLiving(); + minOptimal = cropData.getMinOptimal(); + maxOptimal = cropData.getMaxOptimal(); + maxLiving = cropData.getMaxLiving(); + nonOptimalChance = cropData.getNonOptimalChance(); + + // Otherwise, assign defaults. + } else if (block instanceof IDecayableCrop && ((IDecayableCrop) block).shouldDecay()) { + minLiving = 5; + minOptimal = 10; + maxOptimal = 15; + maxLiving = 20; + nonOptimalChance = 0.5f; + } else { + event.setResult(Event.Result.ALLOW); + return; + } + + // Alive but not optimal, slow growth + int targetTemperature = TemperatureHandler.getTargetTemperatureAt(world, pos); + if ((targetTemperature > maxOptimal && targetTemperature <= maxLiving) + || (targetTemperature < minOptimal && targetTemperature >= minLiving) + && (Math.random() < nonOptimalChance)) { + event.setResult(Result.DENY); + } + } + } + } + + // + // Used to implement getSeasonData in the API + // + public static ISeasonData getServerSeasonData(World world) { + SeasonSavedData savedData = getSeasonSavedData(world); + return new SeasonTime(savedData.seasonCycleTicks); + } + + public static ISeasonData getClientSeasonData() { + return new SeasonTime(clientSeasonCycleTicks); + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/season/SeasonSleepHandler.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/season/SeasonSleepHandler.java new file mode 100644 index 00000000..def392cf --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/season/SeasonSleepHandler.java @@ -0,0 +1,36 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.handler.season; + +import net.minecraft.world.WorldServer; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent.Phase; +import net.minecraftforge.fml.relauncher.Side; +import toughasnails.api.config.SyncedConfig; +import toughasnails.api.config.GameplayOption; +import toughasnails.season.SeasonSavedData; + +public class SeasonSleepHandler { + @SubscribeEvent + public void onWorldTick(TickEvent.WorldTickEvent event) { + if (event.phase == Phase.START && event.side == Side.SERVER + && SyncedConfig.getBooleanValue(GameplayOption.ENABLE_SEASONS)) { + WorldServer world = (WorldServer) event.world; + + // Called before all players are awoken for the next day + if (world.areAllPlayersAsleep()) { + SeasonSavedData seasonData = SeasonHandler.getSeasonSavedData(world); + long timeDiff = 24000L - ((world.getWorldInfo().getWorldTime() + 24000L) % 24000L); + seasonData.seasonCycleTicks += timeDiff; + seasonData.markDirty(); + SeasonHandler.sendSeasonUpdate(world); + } + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/season/StopSpawnHandler.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/season/StopSpawnHandler.java new file mode 100644 index 00000000..1fd30694 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/season/StopSpawnHandler.java @@ -0,0 +1,48 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.handler.season; + +import net.minecraft.entity.passive.EntityAnimal; +import net.minecraft.world.World; +import net.minecraftforge.event.entity.living.LivingSpawnEvent; +import net.minecraftforge.event.terraingen.PopulateChunkEvent; +import net.minecraftforge.event.terraingen.PopulateChunkEvent.Populate.EventType; +import net.minecraftforge.fml.common.eventhandler.Event.Result; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import toughasnails.api.config.SyncedConfig; +import toughasnails.api.season.Season; +import toughasnails.api.season.SeasonHelper; +import toughasnails.api.config.GameplayOption; + +public class StopSpawnHandler +{ + //Animals shouldn't spawn during winter + @SubscribeEvent + public void onCheckEntitySpawn(LivingSpawnEvent.CheckSpawn event) + { + Season season = SeasonHelper.getSeasonData(event.getWorld()).getSubSeason().getSeason(); + + if (season == Season.WINTER && event.getEntity() instanceof EntityAnimal && SyncedConfig.getBooleanValue(GameplayOption.ENABLE_SEASONS)) + { + event.setResult(Result.DENY); + } + } + + @SubscribeEvent + public void onChunkPopulate(PopulateChunkEvent.Populate event) + { + World world = event.getWorld(); + Season season = SeasonHelper.getSeasonData(world).getSubSeason().getSeason(); + + //Prevent animals from spawning in new chunks during the winter + if (event.getType() == EventType.ANIMALS && season == Season.WINTER && SyncedConfig.getBooleanValue(GameplayOption.ENABLE_SEASONS)) + { + event.setResult(Result.DENY); + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/season/WeatherFrequencyHandler.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/season/WeatherFrequencyHandler.java new file mode 100644 index 00000000..1c7c4fdc --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/season/WeatherFrequencyHandler.java @@ -0,0 +1,61 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.handler.season; + +import net.minecraft.world.World; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent.Phase; +import net.minecraftforge.fml.common.gameevent.TickEvent.WorldTickEvent; +import net.minecraftforge.fml.relauncher.Side; +import toughasnails.api.config.SyncedConfig; +import toughasnails.api.season.Season; +import toughasnails.api.season.SeasonHelper; +import toughasnails.api.config.GameplayOption; + +public class WeatherFrequencyHandler +{ + @SubscribeEvent + public void onWorldTick(WorldTickEvent event) + { + if (event.phase == Phase.END && event.side == Side.SERVER && SyncedConfig.getBooleanValue(GameplayOption.ENABLE_SEASONS)) + { + World world = event.world; + Season season = SeasonHelper.getSeasonData(world).getSubSeason().getSeason(); + + //During winter, the absolute maximum delay between rain/thunder should be 30 mins, unlike + //the standard 160 minutes. We only wish to modify the time between rain/thunder occurring, not + //their duration. + + if (season == Season.SPRING) + { + if (!world.getWorldInfo().isRaining() && world.getWorldInfo().getRainTime() > 96000) + { + world.getWorldInfo().setRainTime(world.rand.nextInt(84000) + 12000); + } + } + else if (season == Season.SUMMER) + { + if (!world.getWorldInfo().isThundering() && world.getWorldInfo().getThunderTime() > 36000) + { + world.getWorldInfo().setThunderTime(world.rand.nextInt(24000) + 12000); + } + } + else if (season == Season.WINTER) + { + if (world.getWorldInfo().isThundering()) + { + world.getWorldInfo().setThundering(false);; + } + if (!world.getWorldInfo().isRaining() && world.getWorldInfo().getRainTime() > 36000) + { + world.getWorldInfo().setRainTime(world.rand.nextInt(24000) + 12000); + } + } + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/temperature/TemperatureDebugOverlayHandler.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/temperature/TemperatureDebugOverlayHandler.java new file mode 100644 index 00000000..be88d815 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/temperature/TemperatureDebugOverlayHandler.java @@ -0,0 +1,137 @@ +package toughasnails.handler.temperature; + +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.util.text.TextFormatting; +import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import toughasnails.api.TANCapabilities; +import toughasnails.api.temperature.Temperature; +import toughasnails.api.temperature.TemperatureScale; +import toughasnails.temperature.TemperatureDebugger; +import toughasnails.temperature.TemperatureDebugger.Modifier; +import toughasnails.temperature.TemperatureHandler; + +public class TemperatureDebugOverlayHandler { + + @SubscribeEvent + public void onPostRenderOverlay(RenderGameOverlayEvent.Post event) { + ScaledResolution resolution = event.getResolution(); + int width = resolution.getScaledWidth(); + int height = resolution.getScaledHeight(); + EntityPlayerSP player = Minecraft.getMinecraft().thePlayer; + + TemperatureHandler temperatureStats = (TemperatureHandler) player.getCapability(TANCapabilities.TEMPERATURE, + null); + TemperatureDebugger debugger = temperatureStats.debugger; + + if (event.getType() == ElementType.ALL && debugger.isGuiVisible()) { + drawModifierTable(width, height, temperatureStats.getTemperature(), debugger); + } + } + + private void drawModifierTable(int width, int height, Temperature temperature, TemperatureDebugger debugger) { + Map rateModifiers = debugger.modifiers[0]; + Map targetModifiers = debugger.modifiers[1]; + + if (targetModifiers != null && rateModifiers != null) { + // FontRenderer fontRenderer = Minecraft + // .getMinecraft().fontRendererObj; + + int targetTableHeight = getTableHeight(targetModifiers); + int totalTableHeight = targetTableHeight + getTableHeight(rateModifiers) + 2; + int startY = height / 2 - totalTableHeight / 2; + + String targetProgress = "" + TextFormatting.RED + temperature.getRawValue() + "/" + + debugger.targetTemperature + getCappedText(debugger.targetTemperature); + String rateProgress = "" + TextFormatting.RED + debugger.temperatureTimer + "/" + debugger.changeTicks; + + drawTable("Target " + targetProgress, 1, startY, targetModifiers); + drawTable("Rate " + rateProgress, 1, startY + targetTableHeight + 2, rateModifiers); + } + } + + @SideOnly(Side.CLIENT) + private static void drawTable(String title, int x, int y, Map contents) { + FontRenderer fontRenderer = Minecraft.getMinecraft().fontRendererObj; + + int lineWidth = getLineWidth(title, contents); + int textStart = x + 2; + int textEnd = textStart + lineWidth; + + Iterator> contentsIterator = contents.entrySet().iterator(); + + for (int i = 0; i < contents.size() + 1; i++) { + int rowTopY = y + i * fontRenderer.FONT_HEIGHT + 1; + int rowBottomY = rowTopY + fontRenderer.FONT_HEIGHT; + + if (i == 0) { + Gui.drawRect(x, rowBottomY - 1, textEnd, y, 1610612736); + Gui.drawRect(x, rowBottomY, textEnd, rowBottomY - 1, 1342177280); + fontRenderer.drawString(title, textStart + lineWidth / 2 - fontRenderer.getStringWidth(title) / 2, + y + 1, 553648127); + } else { + Entry entry = contentsIterator.next(); + String string = entry.getKey().name; + int value = entry.getValue(); + String formattedValue = getFormattedInt(value); + + Gui.drawRect(x, rowBottomY, textEnd, rowTopY, 1342177280); + fontRenderer.drawString(string, textStart, rowTopY, 553648127); + fontRenderer.drawString(formattedValue, textEnd - fontRenderer.getStringWidth(formattedValue), rowTopY, + 553648127); + } + } + } + + @SideOnly(Side.CLIENT) + private static int getTableHeight(Map contents) { + FontRenderer fontRenderer = Minecraft.getMinecraft().fontRendererObj; + + return (contents.size() + 1) * fontRenderer.FONT_HEIGHT + 1; + } + + @SideOnly(Side.CLIENT) + private static int getLineWidth(String title, Map elements) { + FontRenderer fontRenderer = Minecraft.getMinecraft().fontRendererObj; + int lineWidth = 0; + + for (Entry entry : elements.entrySet()) { + int i = entry.getValue(); + String string = entry.getKey().name + ": " + getFormattedInt(i); + + lineWidth = Math.max(fontRenderer.getStringWidth(string), lineWidth); + } + + lineWidth = Math.max(fontRenderer.getStringWidth(title), lineWidth); + + return lineWidth; + } + + private static String getCappedText(int targetTemperature) { + return TextFormatting.BLUE + " " + + (targetTemperature < 0 ? "(0)" + : targetTemperature > TemperatureScale.getScaleTotal() + ? "(" + TemperatureScale.getScaleTotal() + ")" : ""); + } + + private static String getFormattedInt(int i) { + TextFormatting format = i > 0 ? TextFormatting.RED : i < 0 ? TextFormatting.BLUE : TextFormatting.RESET; + + return "" + format + getNumberSign(i) + i; + } + + private static char getNumberSign(int i) { + return i > 0 ? '+' : ' '; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/temperature/TemperatureOverlayHandler.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/temperature/TemperatureOverlayHandler.java new file mode 100644 index 00000000..77781fb4 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/temperature/TemperatureOverlayHandler.java @@ -0,0 +1,252 @@ +package toughasnails.handler.temperature; + +import static toughasnails.util.RenderUtils.drawTexturedModalRect; + +import java.util.Random; + +import org.lwjgl.opengl.GL11; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.VertexBuffer; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent.Phase; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import toughasnails.api.TANCapabilities; +import toughasnails.api.config.GameplayOption; +import toughasnails.api.config.SyncedConfig; +import toughasnails.api.temperature.Temperature; +import toughasnails.api.temperature.TemperatureScale; +import toughasnails.api.temperature.TemperatureScale.TemperatureRange; +import toughasnails.temperature.TemperatureHandler; + +@SideOnly(Side.CLIENT) +public class TemperatureOverlayHandler { + public static final ResourceLocation OVERLAY = new ResourceLocation("toughasnails:textures/gui/overlay.png"); + public static final ResourceLocation ICE_VIGNETTE = new ResourceLocation( + "toughasnails:textures/gui/ice_vignette.png"); + public static final ResourceLocation FIRE_VIGNETTE = new ResourceLocation( + "toughasnails:textures/gui/fire_vignette.png"); + + private final Random random = new Random(); + private final Minecraft minecraft = Minecraft.getMinecraft(); + + private int updateCounter; + private FlashType flashType = FlashType.INCREASE; + private int flashCounter = -1; + private int prevTemperatureLevel = -1; + + @SubscribeEvent + public void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase == Phase.END && !minecraft.isGamePaused()) { + updateCounter++; + } + } + + @SubscribeEvent + public void onPostRenderOverlay(RenderGameOverlayEvent.Post event) { + ScaledResolution resolution = event.getResolution(); + int width = resolution.getScaledWidth(); + int height = resolution.getScaledHeight(); + EntityPlayerSP player = Minecraft.getMinecraft().thePlayer; + + TemperatureHandler temperatureStats = (TemperatureHandler) player.getCapability(TANCapabilities.TEMPERATURE, + null); + Temperature temperature = temperatureStats.getTemperature(); + + // When the update counter isn't incrementing, ensure the same numbers + // are produced (freezes moving gui elements) + random.setSeed((long) (updateCounter * 312871)); + + if (event.getType() == ElementType.PORTAL && SyncedConfig.getBooleanValue(GameplayOption.ENABLE_TEMPERATURE)) { + if (!player.capabilities.isCreativeMode) + drawTemperatureVignettes(width, height, temperature); + } else if (event.getType() == ElementType.EXPERIENCE + && SyncedConfig.getBooleanValue(GameplayOption.ENABLE_TEMPERATURE)) { + minecraft.getTextureManager().bindTexture(OVERLAY); + + if (minecraft.playerController.gameIsSurvivalOrAdventure()) { + drawTemperature(width, height, temperature); + } + } + } + + private void drawTemperature(int width, int height, Temperature temperature) { + int left = width / 2 - 8; + int top = height - 52; + + TemperatureRange temperatureRange = temperature.getRange(); + + if (temperatureRange == TemperatureRange.ICY || temperatureRange == TemperatureRange.HOT) { + float shakeDelta = temperatureRange == TemperatureRange.ICY ? temperature.getRangeDelta(true) + : temperature.getRangeDelta(false); + + if ((updateCounter % 1) == 0) { + top += (int) ((random.nextInt(3) - 1) * Math.min(shakeDelta * 3F, 1.0)); + left += (int) ((random.nextInt(3) - 1) * Math.min(shakeDelta * 1.5F, 1.0)); + } + } + + int temperatureLevel = temperature.getRawValue(); + + if (prevTemperatureLevel == -1) + prevTemperatureLevel = temperatureLevel; + + if (temperatureLevel > prevTemperatureLevel) { + flashCounter = updateCounter + 16; + flashType = FlashType.INCREASE; + } else if (temperatureLevel < prevTemperatureLevel) { + flashCounter = updateCounter + 16; + flashType = FlashType.DECREASE; + } + + prevTemperatureLevel = temperatureLevel; + + TemperatureIcon temperatureIcon = getTemperatureIcon(temperatureLevel); + int updateDelta = flashCounter - updateCounter; + + drawTexturedModalRect(left, top, 16 * (temperatureIcon.backgroundIndex), 0, 16, 16); + drawTexturedModalRect(left, top, 16 * (temperatureIcon.foregroundIndex), 0, 16, 16); + + if (temperatureIcon == TemperatureIcon.BALL) { + renderColouredBall(left, top, temperature, 0); + } + + if (flashCounter > (long) updateCounter) { + if (updateDelta > 6 && updateDelta / 3L % 2L == 1L) { + drawTexturedModalRect(left, top, 16 * (temperatureIcon.backgroundIndex + flashType.backgroundShift), 0, + 16, 16); + drawTexturedModalRect(left, top, 16 * (temperatureIcon.foregroundIndex + flashType.foregroundShift), 0, + 16, 16); + + if (temperatureIcon == TemperatureIcon.BALL) { + renderColouredBall(left, top, temperature, 2); + } + } + + GlStateManager.pushMatrix(); + + if (flashType == FlashType.INCREASE) { + GL11.glTranslatef(left + 16F, top + 16F, 0F); + GL11.glRotatef(180F, 0F, 0F, 1F); + } else { + GL11.glTranslatef(left, top, 0F); + } + + drawTexturedModalRect(0, 0, 16 * (16 - updateDelta), 16 * 15, 16, 16); + GlStateManager.popMatrix(); + } + } + + private void renderColouredBall(int x, int y, Temperature temperature, int textureShift) { + TemperatureRange temperatureRange = temperature.getRange(); + float changeDelta = temperatureRange == TemperatureRange.COOL ? temperature.getRangeDelta(true) + : temperature.getRangeDelta(false); + + if (temperatureRange != TemperatureRange.MILD) { + GlStateManager.pushMatrix(); + GlStateManager.color(1.0F, 1.0F, 1.0F, changeDelta); + drawTexturedModalRect(x, y, 16 * ((temperatureRange == TemperatureRange.COOL ? 8 : 9) + textureShift), + 16 * 1, 16, 16); + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); + GlStateManager.popMatrix(); + } + } + + private void drawTemperatureVignettes(int width, int height, Temperature temperature) { + TemperatureRange temperatureRange = temperature.getRange(); + float opacityDelta = temperature.getRangeDelta(false); + + ResourceLocation vignetteLocation = null; + + if (temperatureRange == TemperatureRange.ICY) { + opacityDelta = 1.0F - temperature.getRangeDelta(true); + vignetteLocation = ICE_VIGNETTE; + } else if (temperatureRange == TemperatureRange.HOT) { + vignetteLocation = FIRE_VIGNETTE; + } + + if (vignetteLocation != null) { + minecraft.getTextureManager().bindTexture(vignetteLocation); + + GlStateManager.disableDepth(); + GlStateManager.depthMask(false); + GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, 1, 0); + GlStateManager.color(1.0F, 1.0F, 1.0F, opacityDelta); + GlStateManager.disableAlpha(); + Tessellator tessellator = Tessellator.getInstance(); + VertexBuffer renderer = tessellator.getBuffer(); + renderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); + renderer.pos(0.0D, height, -90.0D).tex(0.0D, 1.0D).endVertex(); + renderer.pos(width, height, -90.0D).tex(1.0D, 1.0D).endVertex(); + renderer.pos(width, 0.0D, -90.0D).tex(1.0D, 0.0D).endVertex(); + renderer.pos(0.0D, 0.0D, -90.0D).tex(0.0D, 0.0D).endVertex(); + tessellator.draw(); + GlStateManager.depthMask(true); + GlStateManager.enableDepth(); + GlStateManager.enableAlpha(); + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); + } + } + + private static TemperatureIcon getTemperatureIcon(int scalePos) { + if (scalePos < 0 || scalePos > TemperatureScale.getScaleTotal()) { + return null; + } + + TemperatureIcon temperatureIcon = null; + + for (int index = 0; index < TemperatureIcon.values().length; index++) { + temperatureIcon = TemperatureIcon.values()[index]; + + if (TemperatureScale.isScalePosInRange(scalePos, temperatureIcon.startRange, temperatureIcon.endRange)) { + break; + } + } + + return temperatureIcon; + } + + private static enum TemperatureIcon { + SNOWFLAKE(0, 9, TemperatureRange.ICY), BALL(1, 10, TemperatureRange.COOL, TemperatureRange.WARM), FIRE(2, 11, + TemperatureRange.HOT); + + public final int backgroundIndex; + public final int foregroundIndex; + public final TemperatureRange startRange; + public final TemperatureRange endRange; + + private TemperatureIcon(int backgroundIndex, int foregroundIndex, TemperatureRange startRange, + TemperatureRange endRange) { + this.backgroundIndex = backgroundIndex; + this.foregroundIndex = foregroundIndex; + this.startRange = startRange; + this.endRange = endRange; + } + + private TemperatureIcon(int backgroundIndex, int foregroundIndex, TemperatureRange range) { + this(backgroundIndex, foregroundIndex, range, range); + } + } + + private static enum FlashType { + INCREASE(3, 3), DECREASE(3, 3); + + public final int backgroundShift; + public final int foregroundShift; + + private FlashType(int backgroundShift, int foregroundShift) { + this.backgroundShift = backgroundShift; + this.foregroundShift = foregroundShift; + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/thirst/FillBottleHandler.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/thirst/FillBottleHandler.java new file mode 100644 index 00000000..e8a65107 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/thirst/FillBottleHandler.java @@ -0,0 +1,118 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.handler.thirst; + +import net.minecraft.block.BlockCauldron; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.stats.StatList; +import net.minecraft.util.ActionResult; +import net.minecraft.util.EnumActionResult; +import net.minecraft.world.World; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import toughasnails.api.config.GameplayOption; +import toughasnails.api.config.SyncedConfig; +import toughasnails.api.item.TANItems; + +public class FillBottleHandler { + /** + * Substitutes normal filled water bottles for dirty water bottles + */ + @SubscribeEvent + public void onPlayerRightClickWater( + PlayerInteractEvent.RightClickItem event) throws Exception { + EntityPlayer player = event.getEntityPlayer(); + ItemStack stack = player.getHeldItem(event.getHand()); + + if (stack != null && stack.getItem().equals(Items.GLASS_BOTTLE) + && SyncedConfig.getBooleanValue(GameplayOption.ENABLE_THIRST)) { + + ActionResult actionResult = stack.getItem() + .onItemRightClick(new ItemStack(stack.getItem(), 0), + event.getWorld(), player, event.getHand()); + ItemStack resultStack = ((ItemStack) actionResult.getResult()); + + // NOTES FROM 1.9.4 testing. ResultStack is item.potion only when + // used on water. Dragon's breath is different. + // Don't compare tags directly, the water bottle in resultStack + // doesn't have Potion tag. + if (actionResult.getType().equals(EnumActionResult.SUCCESS) + && resultStack != null && ItemStack.areItemsEqual( + resultStack, new ItemStack(Items.POTIONITEM))) { + + --stack.stackSize; // Restore original amount of bottles + player.addStat(StatList.getObjectUseStats(stack.getItem())); + ItemStack bottleStack = new ItemStack(TANItems.water_bottle); + + if (!player.inventory.addItemStackToInventory(bottleStack)) { + player.dropItem(bottleStack, false); + } + event.setCanceled(true); + + // Prevent onItemRightClick from being fired a second time for + // bottles right clicked on water + + } + + } + } + + /** + * Produce dirty water bottles when filling empty bottles from the cauldron + */ + @SubscribeEvent + public void onRightClickCauldron( + PlayerInteractEvent.RightClickBlock event) { + World world = event.getWorld(); + EntityPlayer player = event.getEntityPlayer(); + IBlockState state = world.getBlockState(event.getPos()); + ItemStack heldStack = player.getHeldItem(event.getHand()); + Item heldItem; + if (heldStack == null || state == null + || (heldItem = heldStack.getItem()) == null) { + return; + } + + if (state.getBlock() instanceof BlockCauldron + && heldItem == Items.GLASS_BOTTLE + && SyncedConfig.getBooleanValue(GameplayOption.ENABLE_THIRST)) { + BlockCauldron cauldron = (BlockCauldron) state.getBlock(); + int level = ((Integer) state.getValue(BlockCauldron.LEVEL)); + + // Only fill when the cauldron has water in it + if (level > 0 && !world.isRemote) { + if (!player.capabilities.isCreativeMode) { + ItemStack waterBottle = new ItemStack( + TANItems.water_bottle); + player.addStat(StatList.CAULDRON_USED); + + if (--player.getHeldItem(event.getHand()).stackSize == 0) + + { + player.setHeldItem(event.getHand(), waterBottle); + } else if (!player.inventory + .addItemStackToInventory(waterBottle)) { + player.dropItem(waterBottle, false); + } else if (player instanceof EntityPlayerMP) { + ((EntityPlayerMP) player).sendContainerToPlayer( + player.inventoryContainer); + } + } + + cauldron.setWaterLevel(world, event.getPos(), state, level - 1); + // Prevent from producing a Vanilla water bottle + event.setCanceled(true); + } + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/thirst/ThirstOverlayHandler.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/thirst/ThirstOverlayHandler.java new file mode 100644 index 00000000..9924c437 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/thirst/ThirstOverlayHandler.java @@ -0,0 +1,103 @@ +package toughasnails.handler.thirst; + +import static toughasnails.util.RenderUtils.drawTexturedModalRect; + +import java.util.Random; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent.Phase; +import toughasnails.api.TANCapabilities; +import toughasnails.api.TANPotions; +import toughasnails.api.config.GameplayOption; +import toughasnails.api.config.SyncedConfig; +import toughasnails.thirst.ThirstHandler; + +public class ThirstOverlayHandler { + public static final ResourceLocation OVERLAY = new ResourceLocation("toughasnails:textures/gui/overlay.png"); + + private final Random random = new Random(); + private final Minecraft minecraft = Minecraft.getMinecraft(); + + private int updateCounter; + + @SubscribeEvent + public void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase == Phase.END && !minecraft.isGamePaused()) { + updateCounter++; + } + } + + @SubscribeEvent + public void onPreRenderOverlay(RenderGameOverlayEvent.Pre event) { + if (event.getType() == ElementType.AIR && SyncedConfig.getBooleanValue(GameplayOption.ENABLE_THIRST)) { + GlStateManager.pushMatrix(); + GlStateManager.translate(0.0F, -10.0F, 0.0F); + } + } + + @SubscribeEvent + public void onPostRenderOverlay(RenderGameOverlayEvent.Post event) { + ScaledResolution resolution = event.getResolution(); + int width = resolution.getScaledWidth(); + int height = resolution.getScaledHeight(); + EntityPlayerSP player = Minecraft.getMinecraft().thePlayer; + + ThirstHandler thirstStats = (ThirstHandler) player.getCapability(TANCapabilities.THIRST, null); + int thirstLevel = thirstStats.getThirst(); + float thirstHydrationLevel = thirstStats.getHydration(); + + // When the update counter isn't incrementing, ensure the same numbers + // are produced (freezes moving gui elements) + random.setSeed((long) (updateCounter * 312871)); + + if (event.getType() == ElementType.AIR && SyncedConfig.getBooleanValue(GameplayOption.ENABLE_THIRST)) { + GlStateManager.popMatrix(); + } else if (event.getType() == ElementType.EXPERIENCE + && SyncedConfig.getBooleanValue(GameplayOption.ENABLE_THIRST)) { + minecraft.getTextureManager().bindTexture(OVERLAY); + + if (minecraft.playerController.gameIsSurvivalOrAdventure()) { + drawThirst(width, height, thirstLevel, thirstHydrationLevel); + } + } + } + + private void drawThirst(int width, int height, int thirstLevel, float thirstHydrationLevel) { + int left = width / 2 + 91; + int top = height - 49; + + for (int i = 0; i < 10; i++) { + int dropletHalf = i * 2 + 1; + int iconIndex = 0; + int backgroundOffset = 0; + int startX = left - i * 8 - 9; + int startY = top; + + if (minecraft.thePlayer.isPotionActive(TANPotions.thirst)) { + iconIndex += 4; + backgroundOffset += 117; + } + + if (thirstHydrationLevel <= 0.0F && updateCounter % (thirstLevel * 3 + 1) == 0) { + startY = top + (random.nextInt(3) - 1); + } + + drawTexturedModalRect(startX, startY, backgroundOffset, 16, 9, 9); + + if (thirstLevel > dropletHalf) { + drawTexturedModalRect(startX, startY, (iconIndex + 4) * 9, 16, 9, 9); + } + if (thirstLevel == dropletHalf) { + drawTexturedModalRect(startX, startY, (iconIndex + 5) * 9, 16, 9, 9); + } + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/thirst/ThirstStatHandler.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/thirst/ThirstStatHandler.java new file mode 100644 index 00000000..1505f8bc --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/thirst/ThirstStatHandler.java @@ -0,0 +1,128 @@ +package toughasnails.handler.thirst; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.EnumCreatureAttribute; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.DamageSource; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.event.entity.living.LivingEvent.LivingJumpEvent; +import net.minecraftforge.event.entity.living.LivingHurtEvent; +import net.minecraftforge.event.entity.player.AttackEntityEvent; +import net.minecraftforge.event.world.BlockEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import toughasnails.api.TANCapabilities; +import toughasnails.thirst.ThirstHandler; + +public class ThirstStatHandler { + @SubscribeEvent + public void onPlayerJump(LivingJumpEvent event) { + World world = event.getEntity().getEntityWorld(); + + if (!world.isRemote) { + if (event.getEntity() instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) event.getEntity(); + ThirstHandler thirstStats = (ThirstHandler) player + .getCapability(TANCapabilities.THIRST, null); + + if (player.isSprinting()) { + thirstStats.addExhaustion(0.8F); + } else { + thirstStats.addExhaustion(0.2F); + } + } + } + } + + @SubscribeEvent + public void onPlayerHurt(LivingHurtEvent event) { + World world = event.getEntity().getEntityWorld(); + + if (!world.isRemote && event.getAmount() != 0.0F) { + if (event.getEntity() instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) event.getEntity(); + ThirstHandler thirstStats = (ThirstHandler) player + .getCapability(TANCapabilities.THIRST, null); + + // Uses hunger values for now, may change in the future + thirstStats.addExhaustion(event.getSource().getHungerDamage()); + } + } + } + + @SubscribeEvent + public void onPlayerAttackEntity(AttackEntityEvent event) { + World world = event.getEntity().getEntityWorld(); + Entity target = event.getTarget(); + + if (!world.isRemote) { + EntityPlayer player = event.getEntityPlayer(); + + if (target.canBeAttackedWithItem()) { + if (!target.hitByEntity(player)) { + float attackDamage = (float) player + .getEntityAttribute( + SharedMonsterAttributes.ATTACK_DAMAGE) + .getAttributeValue(); + float weaponAttackDamage = 0.0F; + + if (target instanceof EntityLivingBase) { + weaponAttackDamage = EnchantmentHelper + .getModifierForCreature( + player.getHeldItem(EnumHand.MAIN_HAND), + ((EntityLivingBase) target) + .getCreatureAttribute()); + } else { + weaponAttackDamage = EnchantmentHelper + .getModifierForCreature( + player.getHeldItem(EnumHand.MAIN_HAND), + EnumCreatureAttribute.UNDEFINED); + } + + if (attackDamage > 0.0F || weaponAttackDamage > 0.0F) { + boolean canAttack = target.attackEntityFrom( + DamageSource.causePlayerDamage(player), 0.0F); + + if (canAttack) { + // The only part of this method that is new - the + // rest is recreating the surrounding circumstances + // in attackTargetEntityWithCurrentItem + ThirstHandler thirstStats = (ThirstHandler) player + .getCapability(TANCapabilities.THIRST, + null); + + thirstStats.addExhaustion(0.3F); + } + } + } + } + } + } + + @SubscribeEvent + public void onBlockBreak(BlockEvent.BreakEvent event) { + World world = event.getWorld(); + EntityPlayer player = event.getPlayer(); + BlockPos pos = event.getPos(); + IBlockState state = event.getState(); + + if (!world.isRemote && !player.capabilities.isCreativeMode) { + boolean canHarvestBlock = state.getBlock().canHarvestBlock(world, + pos, player); + + if (canHarvestBlock) { + // The only part of this method that is new - the rest is + // recreating the surrounding circumstances in func_180237_b + ThirstHandler thirstStats = (ThirstHandler) player + .getCapability(TANCapabilities.THIRST, null); + + thirstStats.addExhaustion(0.025F); + } + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/thirst/VanillaDrinkHandler.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/thirst/VanillaDrinkHandler.java new file mode 100644 index 00000000..454b01cd --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/handler/thirst/VanillaDrinkHandler.java @@ -0,0 +1,105 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.handler.thirst; + +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.PotionEffect; +import net.minecraft.potion.PotionUtils; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.event.entity.living.LivingEntityUseItemEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.registry.ForgeRegistries; +import toughasnails.api.TANPotions; +import toughasnails.api.config.GameplayOption; +import toughasnails.api.config.SyncedConfig; +import toughasnails.api.thirst.ThirstHelper; +import toughasnails.core.ToughAsNails; +import toughasnails.thirst.ThirstHandler; + +public class VanillaDrinkHandler { + + @SubscribeEvent + public void onItemUseFinish(LivingEntityUseItemEvent.Finish event) { + if (event.getEntityLiving() instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) event.getEntityLiving(); + ItemStack stack = player.getHeldItem(player.getActiveHand()); + ThirstHandler thirstHandler = (ThirstHandler) ThirstHelper + .getThirstData(player); + + if (thirstHandler.isThirsty()) { + // For some reason the stack size can be zero for water bottles, + // which breaks everything. As a workaround, we temporarily set + // it to 1 + boolean zeroStack = false; + if (stack.stackSize <= 0) { + stack.stackSize = 1; + zeroStack = true; + } + if (stack.getItem().equals(Items.POTIONITEM)) { + if (PotionUtils.getFullEffectsFromItem(stack).isEmpty()) { + thirstHandler.addStats(7, 0.5F); + } else { + // Still fill thirst for other potions, but less than + // water + thirstHandler.addStats(4, 0.3F); + } + } + if (zeroStack) { + stack.stackSize = 0; + } + + // Check for any additional configured drinks. + ResourceLocation resLoc = ForgeRegistries.ITEMS + .getKey(stack.getItem()); + String itemName = resLoc.toString(); + + List drinks = SyncedConfig + .getListValue(GameplayOption.DRINKS); + + for (String drinkEntry : drinks) { + String[] drinkData = drinkEntry.split(";"); + if (drinkData.length == 5) { + String stackDamageString = "" + stack.getItemDamage(); + String drinkDamage = drinkData[1]; + boolean isProperDamage = (drinkDamage.equals("*") + || drinkDamage.equals(stackDamageString)); + if (itemName.equals(drinkData[0]) && isProperDamage) { + int thirstLevel = 0; + float hydration = 0f; + float poisonChance = 0f; + try { + thirstLevel = Integer.parseInt(drinkData[2]); + hydration = Float.parseFloat(drinkData[3]); + poisonChance = Float.parseFloat(drinkData[4]); + thirstHandler.addStats(thirstLevel, hydration); + + // Roll for poison + if (player.getEntityWorld().rand + .nextFloat() < poisonChance + && SyncedConfig.getBooleanValue( + GameplayOption.ENABLE_THIRST)) { + player.addPotionEffect(new PotionEffect( + TANPotions.thirst, 600)); + } + } catch (NumberFormatException e) { + ToughAsNails.logger + .error("Tried to drink misconfigured " + + itemName); + } + break; + } + } + } + } + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModAchievements.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModAchievements.java new file mode 100644 index 00000000..c0263ad2 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModAchievements.java @@ -0,0 +1,63 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.init; + +import static toughasnails.api.achievement.TANAchievements.campfire_song; +import static toughasnails.api.achievement.TANAchievements.hot_or_cold; +import static toughasnails.api.achievement.TANAchievements.into_ice; +import static toughasnails.api.achievement.TANAchievements.life_or_death; +import static toughasnails.api.achievement.TANAchievements.that_time_of_year; +import static toughasnails.api.achievement.TANAchievements.thirst_ender; +import static toughasnails.api.achievement.TANAchievements.thirst_quencher; +import static toughasnails.api.achievement.TANAchievements.year_one; + +import net.minecraft.item.ItemStack; +import net.minecraft.stats.Achievement; +import net.minecraftforge.common.AchievementPage; +import toughasnails.api.TANBlocks; +import toughasnails.api.item.TANItems; + +public class ModAchievements { + public static final AchievementPage achievementPage = new AchievementPage("Tough As Nails"); + + public static void init() { + AchievementPage.registerAchievementPage(achievementPage); + + addAchievements(); + } + + private static void addAchievements() { + thirst_quencher = addAchievement("achievement.thirst_quencher", "thirst_quencher", 0, 0, + new ItemStack(TANItems.canteen), null); + thirst_ender = addAchievement("achievement.thirst_ender", "thirst_ender", -2, -2, + new ItemStack(TANItems.fruit_juice), thirst_quencher); + + campfire_song = addAchievement("achievement.campfire_song", "campfire_song", -1, 2, + new ItemStack(TANBlocks.campfire), thirst_quencher); + life_or_death = addAchievement("achievement.life_or_death", "life_or_death", 1, 3, + new ItemStack(TANItems.lifeblood_crystal), campfire_song); + + into_ice = addAchievement("achievement.into_ice", "into_ice", -3, 1, new ItemStack(TANItems.freeze_rod), + campfire_song); + hot_or_cold = addAchievement("achievement.hot_or_cold", "hot_or_cold", -4, -1, + new ItemStack(TANItems.thermometer), into_ice); + + that_time_of_year = addAchievement("achievement.that_time_of_year", "that_time_of_year", 3, -1, + new ItemStack(TANItems.season_clock), thirst_quencher); + year_one = addAchievement("achievement.year_one", "year_one", 0, -4, new ItemStack(TANItems.tan_icon), + that_time_of_year).setSpecial(); + } + + private static Achievement addAchievement(String unlocalizedName, String identifier, int column, int row, + ItemStack iconStack, Achievement parent) { + Achievement achievement = new Achievement(unlocalizedName, identifier, column, row, iconStack, parent); + achievement.registerStat(); + achievementPage.getAchievements().add(achievement); + return achievement; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModBlocks.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModBlocks.java new file mode 100644 index 00000000..09f942ad --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModBlocks.java @@ -0,0 +1,135 @@ +package toughasnails.init; + +import static toughasnails.api.TANBlocks.campfire; +import static toughasnails.api.TANBlocks.dead_crops; +import static toughasnails.api.TANBlocks.glowstone_torch; +import static toughasnails.api.TANBlocks.rain_collector; +import static toughasnails.api.TANBlocks.season_sensors; +import static toughasnails.api.TANBlocks.temperature_coil; +import static toughasnails.api.TANBlocks.torch_new; + +import com.google.common.collect.ImmutableSet; + +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.common.registry.GameRegistry; +import toughasnails.api.ITANBlock; +import toughasnails.block.BlockGlowstoneTorch; +import toughasnails.block.BlockRainCollector; +import toughasnails.block.BlockSeasonSensor; +import toughasnails.block.BlockSeasonSensor.DetectorType; +import toughasnails.block.BlockTANCampfire; +import toughasnails.block.BlockTANDeadCrops; +import toughasnails.block.BlockTANTemperatureCoil; +import toughasnails.block.BlockTANTorchNew; +import toughasnails.core.ToughAsNails; +import toughasnails.tileentity.TileEntitySeasonSensor; +import toughasnails.tileentity.TileEntityTemperatureSpread; +import toughasnails.util.BlockStateUtils; +import toughasnails.util.inventory.CreativeTabTAN; + +public class ModBlocks +{ + + public static void init() + { + season_sensors[0] = registerBlock( new BlockSeasonSensor(DetectorType.SPRING), "season_sensor_spring" ); + season_sensors[1] = registerBlock( new BlockSeasonSensor(DetectorType.SUMMER), "season_sensor_summer" ).setCreativeTab(null); + season_sensors[2] = registerBlock( new BlockSeasonSensor(DetectorType.AUTUMN), "season_sensor_autumn" ).setCreativeTab(null); + season_sensors[3] = registerBlock( new BlockSeasonSensor(DetectorType.WINTER), "season_sensor_winter" ).setCreativeTab(null); + campfire = registerBlock( new BlockTANCampfire(), "campfire" ); + rain_collector = registerBlock( new BlockRainCollector(), "rain_collector" ); + //gas = registerBlock( new BlockTANGas(), "gas" ); + //gas.setCreativeTab(null); + temperature_coil = registerBlock(new BlockTANTemperatureCoil(), "temperature_coil"); + torch_new = registerBlock( new BlockTANTorchNew(), "torch_new" ); + glowstone_torch = registerBlock( new BlockGlowstoneTorch(), "glowstone_torch" ); + dead_crops = registerBlock(new BlockTANDeadCrops(), "dead_crops").setCreativeTab(null); + + GameRegistry.registerTileEntity(TileEntityTemperatureSpread.class, "temperature_spread"); + GameRegistry.registerTileEntity(TileEntitySeasonSensor.class, "season_sensor"); + } + + + public static void registerBlockVariant(Block block, String stateName, int stateMeta) + { + Item item = Item.getItemFromBlock(block); + ToughAsNails.proxy.registerItemVariantModel(item, stateName, stateMeta); + } + + public static Block registerBlock(Block block, String blockName) + { + // by default, set the creative tab for all blocks added in TAN to CreativeTabTAN.instance + return registerBlock(block, blockName, CreativeTabTAN.instance); + } + + public static Block registerBlock(Block block, String blockName, CreativeTabs tab) + { + + block.setUnlocalizedName(blockName); + block.setCreativeTab(tab); + + if (block instanceof ITANBlock) + { + // if this block supports the IBOPBlock interface then we can determine the item block class, and sub-blocks automatically + ITANBlock bopBlock = (ITANBlock)block; + registerBlockWithItem(block, blockName, bopBlock.getItemClass()); + + ToughAsNails.proxy.registerNonRenderingProperties(block); + + // check for missing default states + IBlockState defaultState = block.getDefaultState(); + if (defaultState == null) + { + defaultState = block.getBlockState().getBaseState(); + ToughAsNails.logger.error("missing default state for " + block.getUnlocalizedName()); + } + + // get the preset blocks variants + ImmutableSet presets = BlockStateUtils.getBlockPresets(block); + if (presets.isEmpty()) + { + // block has no sub-blocks to register + registerBlockVariant(block, blockName, 0); + } + else + { + // register all the sub-blocks + for (IBlockState state : presets) + { + String stateName = bopBlock.getStateName(state); + int stateMeta = block.getMetaFromState(state); + registerBlockVariant(block, stateName, stateMeta); + } + } + } + else + { + // for vanilla blocks, just register a single variant with meta=0 and assume ItemBlock for the item class + registerBlockWithItem(block, blockName, ItemBlock.class); + registerBlockVariant(block, blockName, 0); + } + + return block; + } + + private static void registerBlockWithItem(Block block, String blockName, Class clazz) + { + try + { + Item itemBlock = clazz != null ? (Item)clazz.getConstructor(Block.class).newInstance(block) : null; + ResourceLocation location = new ResourceLocation(ToughAsNails.MOD_ID, blockName); + + GameRegistry.register(block, location); + if (itemBlock != null) GameRegistry.register(itemBlock, location); + } + catch (Exception e) + { + throw new RuntimeException("An error occurred associating an item block during registration..."); + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModConfig.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModConfig.java new file mode 100644 index 00000000..2dab8bbb --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModConfig.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.init; + +import java.io.File; + +import net.minecraftforge.common.MinecraftForge; +import toughasnails.config.GameplayConfigurationHandler; + +public class ModConfig +{ + public static void init(File configDirectory) + { + GameplayConfigurationHandler.init(new File(configDirectory, "gameplay.cfg")); + MinecraftForge.EVENT_BUS.register(new GameplayConfigurationHandler()); + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModCrafting.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModCrafting.java new file mode 100644 index 00000000..c715aa6a --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModCrafting.java @@ -0,0 +1,191 @@ +package toughasnails.init; + +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.init.PotionTypes; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.PotionType; +import net.minecraft.potion.PotionUtils; +import net.minecraftforge.common.brewing.BrewingRecipeRegistry; +import net.minecraftforge.fml.common.registry.GameRegistry; +import net.minecraftforge.oredict.ShapedOreRecipe; +import toughasnails.api.TANBlocks; +import toughasnails.api.TANPotions; +import toughasnails.api.item.TANItems; +import toughasnails.block.BlockTANTemperatureCoil; +import toughasnails.item.ItemFruitJuice; +import toughasnails.item.ItemTANWaterBottle; +import toughasnails.util.PotionBrewingRecipe; + +public class ModCrafting +{ + public static void init() + { + addOreRegistration(); + addCraftingRecipies(); + addSmeltingRecipes(); + //removeCraftingRecipes(); + } + + private static void addCraftingRecipies() + { + // Register crafting recipes + + //Brewing + //Base + addBrewingRecipe(PotionTypes.AWKWARD, new ItemStack(Items.FIRE_CHARGE), TANPotions.heat_resistance_type); + addBrewingRecipe(PotionTypes.AWKWARD, new ItemStack(TANItems.ice_charge), TANPotions.cold_resistance_type); + + //Extended + addBrewingRecipe(TANPotions.heat_resistance_type, new ItemStack(Items.REDSTONE), TANPotions.long_heat_resistance_type); + addBrewingRecipe(TANPotions.cold_resistance_type, new ItemStack(Items.REDSTONE), TANPotions.long_cold_resistance_type); + + //Splash and lingering + addPotionTransforms(TANPotions.heat_resistance_type); + addPotionTransforms(TANPotions.cold_resistance_type); + addPotionTransforms(TANPotions.long_heat_resistance_type); + addPotionTransforms(TANPotions.long_cold_resistance_type); + + // Armor + GameRegistry.addShapedRecipe(new ItemStack(TANItems.wool_helmet), new Object [] {"###", "# #", '#', Blocks.WOOL}); + GameRegistry.addShapedRecipe(new ItemStack(TANItems.wool_chestplate), new Object [] {"# #", "###", "###", '#', Blocks.WOOL}); + GameRegistry.addShapedRecipe(new ItemStack(TANItems.wool_leggings), new Object [] {"###", "# #", "# #", '#', Blocks.WOOL}); + GameRegistry.addShapedRecipe(new ItemStack(TANItems.wool_boots), new Object [] {"# #", "# #", '#', Blocks.WOOL}); + GameRegistry.addShapedRecipe(new ItemStack(TANItems.jelled_slime_helmet), new Object [] {"###", "# #", '#', TANItems.jelled_slime}); + GameRegistry.addShapedRecipe(new ItemStack(TANItems.jelled_slime_chestplate), new Object [] {"# #", "###", "###", '#', TANItems.jelled_slime}); + GameRegistry.addShapedRecipe(new ItemStack(TANItems.jelled_slime_leggings), new Object [] {"###", "# #", "# #", '#', TANItems.jelled_slime}); + GameRegistry.addShapedRecipe(new ItemStack(TANItems.jelled_slime_boots), new Object [] {"# #", "# #", '#', TANItems.jelled_slime}); + + // Campfire + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(TANBlocks.campfire), new Object [] {" L ", "LLL", "CCC", 'C', Blocks.COBBLESTONE, 'L', "logWood"})); + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(TANBlocks.campfire), new Object [] {" L ", "LLL", "CCC", 'C', "chunkStone", 'L', "splitWood"})); + + // Rain Collector + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(TANBlocks.rain_collector), new Object [] {"IBI", "C C", "CCC", 'C', Blocks.COBBLESTONE, 'I', "ingotIron", 'B', Blocks.IRON_BARS})); + + // Heating Coil + GameRegistry.addShapedRecipe(new ItemStack(TANBlocks.temperature_coil, 1, BlockTANTemperatureCoil.CoilType.HEATING.ordinal()), new Object[] {"BBB", "BBB", "CCC", 'B', Items.BLAZE_ROD, 'C', Blocks.COBBLESTONE}); + + // Cooling Coil + GameRegistry.addShapedRecipe(new ItemStack(TANBlocks.temperature_coil, 1, BlockTANTemperatureCoil.CoilType.COOLING.ordinal()), new Object[] {"FFF", "FFF", "CCC", 'F', TANItems.freeze_rod, 'C', Blocks.COBBLESTONE}); + + // Canteen + GameRegistry.addShapedRecipe(new ItemStack(TANItems.canteen, 1), new Object[] {" L ", "L L", "LLL", 'L', Items.LEATHER}); + + // Filtered Canteen + GameRegistry.addShapelessRecipe(new ItemStack(TANItems.canteen, 1, 2), TANItems.charcoal_filter, new ItemStack(TANItems.canteen, 1, 1)); + + // Filtered Water Bottle + GameRegistry.addShapelessRecipe(new ItemStack(TANItems.water_bottle, 1, ItemTANWaterBottle.WaterBottleType.FILTERED.ordinal()), new Object[] {new ItemStack(TANItems.water_bottle, 1, ItemTANWaterBottle.WaterBottleType.DIRTY.ordinal()), TANItems.charcoal_filter}); + + // Fruit Juices + GameRegistry.addShapelessRecipe(new ItemStack(TANItems.fruit_juice, 1, ItemFruitJuice.JuiceType.APPLE.ordinal()), new Object[] {PotionUtils.addPotionToItemStack(new ItemStack(Items.POTIONITEM), PotionTypes.WATER), Items.SUGAR, Items.APPLE}); + GameRegistry.addShapelessRecipe(new ItemStack(TANItems.fruit_juice, 1, ItemFruitJuice.JuiceType.BEETROOT.ordinal()), new Object[] {PotionUtils.addPotionToItemStack(new ItemStack(Items.POTIONITEM), PotionTypes.WATER), Items.SUGAR, Items.BEETROOT}); + GameRegistry.addShapelessRecipe(new ItemStack(TANItems.fruit_juice, 1, ItemFruitJuice.JuiceType.CACTUS.ordinal()), new Object[] {PotionUtils.addPotionToItemStack(new ItemStack(Items.POTIONITEM), PotionTypes.WATER), Items.SUGAR, Blocks.CACTUS}); + GameRegistry.addShapelessRecipe(new ItemStack(TANItems.fruit_juice, 1, ItemFruitJuice.JuiceType.CARROT.ordinal()), new Object[] {PotionUtils.addPotionToItemStack(new ItemStack(Items.POTIONITEM), PotionTypes.WATER), Items.SUGAR, Items.CARROT}); + GameRegistry.addShapelessRecipe(new ItemStack(TANItems.fruit_juice, 1, ItemFruitJuice.JuiceType.CHORUS_FRUIT.ordinal()), new Object[] {PotionUtils.addPotionToItemStack(new ItemStack(Items.POTIONITEM), PotionTypes.WATER), Items.SUGAR, Items.CHORUS_FRUIT}); + GameRegistry.addShapelessRecipe(new ItemStack(TANItems.fruit_juice, 1, ItemFruitJuice.JuiceType.GLISTERING_MELON.ordinal()), new Object[] {PotionUtils.addPotionToItemStack(new ItemStack(Items.POTIONITEM), PotionTypes.WATER), Items.SUGAR, Items.SPECKLED_MELON}); + GameRegistry.addShapelessRecipe(new ItemStack(TANItems.fruit_juice, 1, ItemFruitJuice.JuiceType.GOLDEN_APPLE.ordinal()), new Object[] {PotionUtils.addPotionToItemStack(new ItemStack(Items.POTIONITEM), PotionTypes.WATER), Items.SUGAR, Items.GOLDEN_APPLE}); + GameRegistry.addShapelessRecipe(new ItemStack(TANItems.fruit_juice, 1, ItemFruitJuice.JuiceType.GOLDEN_CARROT.ordinal()), new Object[] {PotionUtils.addPotionToItemStack(new ItemStack(Items.POTIONITEM), PotionTypes.WATER), Items.SUGAR, Items.GOLDEN_CARROT}); + GameRegistry.addShapelessRecipe(new ItemStack(TANItems.fruit_juice, 1, ItemFruitJuice.JuiceType.MELON.ordinal()), new Object[] {PotionUtils.addPotionToItemStack(new ItemStack(Items.POTIONITEM), PotionTypes.WATER), Items.SUGAR, Items.MELON}); + GameRegistry.addShapelessRecipe(new ItemStack(TANItems.fruit_juice, 1, ItemFruitJuice.JuiceType.PUMPKIN.ordinal()), new Object[] {PotionUtils.addPotionToItemStack(new ItemStack(Items.POTIONITEM), PotionTypes.WATER), Items.SUGAR, Blocks.PUMPKIN}); + + // Freeze Powder + GameRegistry.addShapelessRecipe(new ItemStack(TANItems.freeze_powder, 2), new Object[] {TANItems.freeze_rod}); + + // Ice Charge + GameRegistry.addShapelessRecipe(new ItemStack(TANItems.ice_charge, 3), new Object[] {TANItems.ice_cube, Items.GUNPOWDER, TANItems.freeze_powder}); + + // Jelled Slime + GameRegistry.addShapedRecipe(new ItemStack(TANItems.jelled_slime, 3), new Object[] {"III", "ISI", "III", 'I', TANItems.ice_cube, 'S', Items.SLIME_BALL}); + + //Charcoal Filter + GameRegistry.addShapedRecipe(new ItemStack(TANItems.charcoal_filter, 3), new Object[] {"PPP", "CCC", "PPP", 'P', Items.PAPER, 'C', new ItemStack(Items.COAL, 1, 1)}); + + // Air Filter + //GameRegistry.addShapedRecipe(new ItemStack(TANItems.air_filter, 1), new Object[] {"LLL", "LCL", "LLL", 'L', Items.LEATHER, 'C', TANItems.charcoal_filter}); + + // Season Clock + GameRegistry.addShapedRecipe(new ItemStack(TANItems.season_clock, 1), new Object[] {" Q ", "QRQ", " Q ", 'Q', Items.QUARTZ, 'R', Items.REDSTONE}); + + // Season Sensor + GameRegistry.addShapedRecipe(new ItemStack(TANBlocks.season_sensors[0], 1), new Object[] {"GGG", "QSQ", "CCC", 'G', Blocks.GLASS, 'Q', Items.QUARTZ, 'S', TANItems.season_clock, 'C', new ItemStack(Blocks.STONE_SLAB, 1, 3)}); + + // Thermometer + GameRegistry.addShapedRecipe(new ItemStack(TANItems.thermometer, 1), new Object[] {" D ", "DQD", " D ", 'D', Items.DIAMOND, 'Q', Items.QUARTZ}); + + // Respirator + //GameRegistry.addShapedRecipe(new ItemStack(TANItems.respirator, 1), new Object[] {"SSS", "III", "AIA", 'S', Items.STRING, 'I', Items.IRON_INGOT, 'A', TANItems.air_filter}); + } + + public static void addSmeltingRecipes() + { + // Register smelting recipes + + // Clean Water Bottle + GameRegistry.addSmelting(new ItemStack(TANItems.water_bottle, 1, ItemTANWaterBottle.WaterBottleType.FILTERED.ordinal()), PotionUtils.addPotionToItemStack(new ItemStack(Items.POTIONITEM), PotionTypes.WATER), 0F); + } + + private static void addOreRegistration() + { + //Registration in Ore Dictionary + } + + /*private static void removeCraftingRecipes() + { + List recipes = CraftingManager.getInstance().getRecipeList(); + + Iterator remover = recipes.iterator(); + + while (remover.hasNext()) + { + ItemStack itemstack = remover.next().getRecipeOutput(); + if (itemstack != null && Block.getBlockFromItem(itemstack.getItem()) == Blocks.torch) + { + remover.remove(); + } + } + }*/ + + /** + * Adds a brewing recipe for each bottle to the specified potion type transformation + * @param input Input potion + * @param ingredient Transformation ingredient + * @param output Output potion + */ + private static void addBrewingRecipe(PotionType input, ItemStack ingredient, PotionType output) + { + addBrewingRecipe(new ItemStack(Items.POTIONITEM), input, ingredient, new ItemStack(Items.POTIONITEM), output); + addBrewingRecipe(new ItemStack(Items.SPLASH_POTION), input, ingredient, new ItemStack(Items.SPLASH_POTION), output); + addBrewingRecipe(new ItemStack(Items.LINGERING_POTION), input, ingredient, new ItemStack(Items.LINGERING_POTION), output); + } + + /** + * Adds recipes to transform potions into splash and lingering variants + * @param potion Potion type to add transformations + */ + private static void addPotionTransforms(PotionType potion) + { + // splash + addBrewingRecipe(new ItemStack(Items.POTIONITEM), potion, new ItemStack(Items.GUNPOWDER), new ItemStack(Items.SPLASH_POTION), potion); + addBrewingRecipe(new ItemStack(Items.LINGERING_POTION), potion, new ItemStack(Items.GUNPOWDER), new ItemStack(Items.SPLASH_POTION), potion); + + // lingering + addBrewingRecipe(new ItemStack(Items.POTIONITEM), potion, new ItemStack(Items.DRAGON_BREATH), new ItemStack(Items.LINGERING_POTION), potion); + addBrewingRecipe(new ItemStack(Items.SPLASH_POTION), potion, new ItemStack(Items.DRAGON_BREATH), new ItemStack(Items.LINGERING_POTION), potion); + + } + + /** + * Adds a general brewing recipe. Basically just a wrapper to remove the ugly PotionUtils calls and to use the NBT sensitive PotionBrewingRecipe + * @param inBottle Input bottle + * @param input Input potion + * @param ingredient Input ingredient + * @param outBottle Output bottle + * @param output Output potion + */ + private static void addBrewingRecipe(ItemStack inBottle, PotionType input, ItemStack ingredient, ItemStack outBottle, PotionType output) + { + BrewingRecipeRegistry.addRecipe(new PotionBrewingRecipe(PotionUtils.addPotionToItemStack(inBottle, input), ingredient, PotionUtils.addPotionToItemStack(outBottle, output))); + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModEntities.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModEntities.java new file mode 100644 index 00000000..f80151d2 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModEntities.java @@ -0,0 +1,86 @@ +package toughasnails.init; + +import java.util.Map; + +import com.google.common.collect.Maps; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityList; +import net.minecraft.entity.EntityList.EntityEggInfo; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EnumCreatureType; +import net.minecraft.init.Biomes; +import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; +import net.minecraftforge.fml.common.FMLCommonHandler; +import net.minecraftforge.fml.common.ModContainer; +import net.minecraftforge.fml.common.registry.EntityRegistry; +import net.minecraftforge.fml.common.registry.EntityRegistry.EntityRegistration; +import toughasnails.core.ToughAsNails; +import toughasnails.entities.EntityFreeze; +import toughasnails.entities.projectile.EntityIceball; + +public class ModEntities +{ + public static final Map entityEggs = Maps.newLinkedHashMap(); + public static final Map idToTANEntityName = Maps.newLinkedHashMap(); + + private static int nextTANEntityId = 1; + + public static void init() + { + // projectiles + registerTANEntity(EntityIceball.class, "iceball", 80, 3, true); + + // mobs + registerTANEntityWithSpawnEgg(EntityFreeze.class, "freeze", 80, 3, true, 0xECFAF4, 0x439FC3, Biomes.ICE_PLAINS, Biomes.ICE_MOUNTAINS); + } + + // register an entity + public static int registerTANEntity(Class entityClass, String entityName, int trackingRange, int updateFrequency, boolean sendsVelocityUpdates) + { + int tanEntityId = nextTANEntityId; + nextTANEntityId++; + EntityRegistry.registerModEntity(entityClass, entityName, tanEntityId, ToughAsNails.instance, trackingRange, updateFrequency, sendsVelocityUpdates); + idToTANEntityName.put(tanEntityId, entityName); + return tanEntityId; + } + + // register an entity and in addition create a spawn egg for it + public static int registerTANEntityWithSpawnEgg(Class entityClass, String entityName, int trackingRange, int updateFrequency, boolean sendsVelocityUpdates, int eggBackgroundColor, int eggForegroundColor, Biome... entityBiomes) + { + int tanEntityId = registerTANEntity(entityClass, entityName, trackingRange, updateFrequency, sendsVelocityUpdates); + entityEggs.put(Integer.valueOf(tanEntityId), new EntityList.EntityEggInfo(entityName, eggBackgroundColor, eggForegroundColor)); + EntityRegistry.addSpawn(entityClass, 3, 1, 3, EnumCreatureType.MONSTER, entityBiomes); + return tanEntityId; + } + + public static Entity createEntityByID(int tanEntityId, World worldIn) + { + Entity entity = null; + ModContainer mc = FMLCommonHandler.instance().findContainerFor(ToughAsNails.instance); + EntityRegistration er = EntityRegistry.instance().lookupModSpawn(mc, tanEntityId); + if (er != null) + { + Class clazz = er.getEntityClass(); + try + { + if (clazz != null) + { + entity = (Entity)clazz.getConstructor(new Class[] {World.class}).newInstance(new Object[] {worldIn}); + } + } + catch (Exception exception) + { + exception.printStackTrace(); + } + } + if (entity == null) + { + ToughAsNails.logger.warn("Skipping TAN Entity with id " + tanEntityId); + } + return entity; + } + + +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModHandlers.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModHandlers.java new file mode 100644 index 00000000..154309c5 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModHandlers.java @@ -0,0 +1,85 @@ +package toughasnails.init; + +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.FMLCommonHandler; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import toughasnails.config.SyncedConfigHandler; +import toughasnails.handler.AchievementEventHandler; +import toughasnails.handler.ExtendedStatHandler; +import toughasnails.handler.PacketHandler; +import toughasnails.handler.health.HealthOverlayHandler; +import toughasnails.handler.health.MaxHealthHandler; +import toughasnails.handler.season.ProviderIceHandler; +import toughasnails.handler.season.RandomUpdateHandler; +import toughasnails.handler.season.SeasonHandler; +import toughasnails.handler.season.SeasonSleepHandler; +import toughasnails.handler.season.StopSpawnHandler; +import toughasnails.handler.season.WeatherFrequencyHandler; +import toughasnails.handler.temperature.TemperatureDebugOverlayHandler; +import toughasnails.handler.temperature.TemperatureOverlayHandler; +import toughasnails.handler.thirst.FillBottleHandler; +import toughasnails.handler.thirst.ThirstOverlayHandler; +import toughasnails.handler.thirst.ThirstStatHandler; +import toughasnails.handler.thirst.VanillaDrinkHandler; + +public class ModHandlers { + public static void init() { + PacketHandler.init(); + + MinecraftForge.EVENT_BUS.register(new ExtendedStatHandler()); + MinecraftForge.EVENT_BUS.register(new SyncedConfigHandler()); + + MinecraftForge.EVENT_BUS.register(new ThirstStatHandler()); + MinecraftForge.EVENT_BUS.register(new VanillaDrinkHandler()); + MinecraftForge.EVENT_BUS.register(new FillBottleHandler()); + MinecraftForge.EVENT_BUS.register(new MaxHealthHandler()); + + // Handlers for functionality related to seasons + MinecraftForge.EVENT_BUS.register(new SeasonHandler()); + MinecraftForge.EVENT_BUS.register(new RandomUpdateHandler()); + MinecraftForge.TERRAIN_GEN_BUS.register(new ProviderIceHandler()); + MinecraftForge.EVENT_BUS.register(new SeasonSleepHandler()); + StopSpawnHandler stopSpawnHandler = new StopSpawnHandler(); + MinecraftForge.EVENT_BUS.register(stopSpawnHandler); + MinecraftForge.TERRAIN_GEN_BUS.register(stopSpawnHandler); + MinecraftForge.EVENT_BUS.register(new WeatherFrequencyHandler()); + MinecraftForge.EVENT_BUS.register(new AchievementEventHandler()); + + if (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) { + MinecraftForge.EVENT_BUS.register(new TemperatureOverlayHandler()); + MinecraftForge.EVENT_BUS.register(new TemperatureDebugOverlayHandler()); + MinecraftForge.EVENT_BUS.register(new ThirstOverlayHandler()); + MinecraftForge.EVENT_BUS.register(new HealthOverlayHandler()); + + registerSeasonColourHandlers(); + } + } + + @SideOnly(Side.CLIENT) + private static void registerSeasonColourHandlers() { + // TODO: restore color modifications. + // BiomeColorHelper.GRASS_COLOR = new BiomeColorHelper.ColorResolver() { + // @Override + // public int getColorAtPos(Biome biome, BlockPos blockPosition) { + // SeasonTime calendar = new + // SeasonTime(SeasonHandler.clientSeasonCycleTicks); + // return + // SeasonColourUtil.applySeasonalGrassColouring(calendar.getSubSeason(), + // biome.getGrassColorAtPos(blockPosition)); + // } + // }; + // + // BiomeColorHelper.FOLIAGE_COLOR = new BiomeColorHelper.ColorResolver() + // { + // @Override + // public int getColorAtPos(Biome biome, BlockPos blockPosition) { + // SeasonTime calendar = new + // SeasonTime(SeasonHandler.clientSeasonCycleTicks); + // return + // SeasonColourUtil.applySeasonalFoliageColouring(calendar.getSubSeason(), + // biome.getFoliageColorAtPos(blockPosition)); + // } + // }; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModItems.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModItems.java new file mode 100644 index 00000000..98c5d977 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModItems.java @@ -0,0 +1,153 @@ +package toughasnails.init; + +import static toughasnails.api.item.TANItems.canteen; +import static toughasnails.api.item.TANItems.charcoal_filter; +import static toughasnails.api.item.TANItems.freeze_powder; +import static toughasnails.api.item.TANItems.freeze_rod; +import static toughasnails.api.item.TANItems.fruit_juice; +import static toughasnails.api.item.TANItems.ice_charge; +import static toughasnails.api.item.TANItems.ice_cube; +import static toughasnails.api.item.TANItems.jelled_slime; +import static toughasnails.api.item.TANItems.jelled_slime_armor_material; +import static toughasnails.api.item.TANItems.jelled_slime_boots; +import static toughasnails.api.item.TANItems.jelled_slime_chestplate; +import static toughasnails.api.item.TANItems.jelled_slime_helmet; +import static toughasnails.api.item.TANItems.jelled_slime_leggings; +import static toughasnails.api.item.TANItems.lifeblood_crystal; +import static toughasnails.api.item.TANItems.respirator_material; +import static toughasnails.api.item.TANItems.season_clock; +import static toughasnails.api.item.TANItems.spawn_egg; +import static toughasnails.api.item.TANItems.tan_icon; +import static toughasnails.api.item.TANItems.thermometer; +import static toughasnails.api.item.TANItems.water_bottle; +import static toughasnails.api.item.TANItems.wool_armor_material; +import static toughasnails.api.item.TANItems.wool_boots; +import static toughasnails.api.item.TANItems.wool_chestplate; +import static toughasnails.api.item.TANItems.wool_helmet; +import static toughasnails.api.item.TANItems.wool_leggings; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.client.renderer.block.model.ModelBakery; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.init.Blocks; +import net.minecraft.init.SoundEvents; +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.item.Item; +import net.minecraft.item.ItemArmor; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.ModelLoader; +import net.minecraftforge.common.util.EnumHelper; +import net.minecraftforge.fml.common.FMLCommonHandler; +import net.minecraftforge.fml.common.registry.GameRegistry; +import net.minecraftforge.fml.relauncher.Side; +import toughasnails.api.item.TANItems; +import toughasnails.core.ToughAsNails; +import toughasnails.item.ItemCanteen; +import toughasnails.item.ItemFruitJuice; +import toughasnails.item.ItemIceCharge; +import toughasnails.item.ItemLifebloodCrystal; +import toughasnails.item.ItemSeasonClock; +import toughasnails.item.ItemTANSpawnEgg; +import toughasnails.item.ItemTANWaterBottle; +import toughasnails.item.ItemThermometer; +import toughasnails.util.inventory.CreativeTabTAN; + +public class ModItems +{ + public static void init() + { + registerItems(); + //setupModels(); + } + + public static void registerItems() + { + // TAN Creative Tab Icon + tan_icon = registerItem(new Item(), "tan_icon"); + tan_icon.setCreativeTab(null); + + // Armor Materials + wool_armor_material = EnumHelper.addArmorMaterial("WOOL", "toughasnails:wool_armor", 3, new int[]{2, 2, 2, 1}, 5, SoundEvents.ITEM_ARMOR_EQUIP_GENERIC, 0.0F); + wool_armor_material.customCraftingMaterial = Item.getItemFromBlock(Blocks.WOOL); + jelled_slime_armor_material = EnumHelper.addArmorMaterial("JELLED_SLIME", "toughasnails:jelled_slime_armor", 9, new int[]{2, 5, 3, 2}, 11, SoundEvents.ITEM_ARMOR_EQUIP_GENERIC, 0.0F); + jelled_slime_armor_material.customCraftingMaterial = TANItems.jelled_slime; + respirator_material = EnumHelper.addArmorMaterial("RESPIRATOR", "toughasnails:respirator", -1, new int[]{0,0,0,0}, 0, SoundEvents.ITEM_ARMOR_EQUIP_GENERIC, 0.0F); + + // Main Items + thermometer = registerItem(new ItemThermometer(), "thermometer"); + season_clock = registerItem(new ItemSeasonClock(), "season_clock"); + lifeblood_crystal = registerItem(new ItemLifebloodCrystal(), "lifeblood_crystal"); + canteen = registerItem(new ItemCanteen(), "canteen"); + water_bottle = registerItem(new ItemTANWaterBottle(), "water_bottle"); + fruit_juice = registerItem(new ItemFruitJuice(), "fruit_juice"); + + // Materials + ice_cube = registerItem(new Item(), "ice_cube"); + freeze_rod = registerItem(new Item(), "freeze_rod"); + freeze_powder = registerItem(new Item(), "freeze_powder"); + ice_charge = registerItem(new ItemIceCharge(), "ice_charge"); + jelled_slime = registerItem(new Item(), "jelled_slime"); + charcoal_filter = registerItem(new Item(), "charcoal_filter"); + //bottle_of_gas = registerItem(new ItemBottleOfGas(), "bottle_of_gas", null); + + // Respirators + //air_filter = registerItem(new Item(), "air_filter", null); + //respirator = registerItem(new ItemRespirator(respirator_material, 0), "respirator", null); + + // Armor + wool_helmet = registerItem(new ItemArmor(wool_armor_material, 0, EntityEquipmentSlot.HEAD), "wool_helmet"); + wool_chestplate = registerItem(new ItemArmor(wool_armor_material, 0, EntityEquipmentSlot.CHEST), "wool_chestplate"); + wool_leggings = registerItem(new ItemArmor(wool_armor_material, 0, EntityEquipmentSlot.LEGS), "wool_leggings"); + wool_boots = registerItem(new ItemArmor(wool_armor_material, 0, EntityEquipmentSlot.FEET), "wool_boots"); + jelled_slime_helmet = registerItem(new ItemArmor(jelled_slime_armor_material, 0, EntityEquipmentSlot.HEAD), "jelled_slime_helmet"); + jelled_slime_chestplate = registerItem(new ItemArmor(jelled_slime_armor_material, 0, EntityEquipmentSlot.CHEST), "jelled_slime_chestplate"); + jelled_slime_leggings = registerItem(new ItemArmor(jelled_slime_armor_material, 0, EntityEquipmentSlot.LEGS), "jelled_slime_leggings"); + jelled_slime_boots = registerItem(new ItemArmor(jelled_slime_armor_material, 0, EntityEquipmentSlot.FEET), "jelled_slime_boots"); + + spawn_egg = registerItem(new ItemTANSpawnEgg(), "spawn_egg"); + } + + public static Item registerItem(Item item, String name) + { + return registerItem(item, name, CreativeTabTAN.instance); + } + + public static Item registerItem(Item item, String name, CreativeTabs tab) + { + item.setUnlocalizedName(name); + if (tab != null) + { + item.setCreativeTab(CreativeTabTAN.instance); + } + GameRegistry.register(item, new ResourceLocation(ToughAsNails.MOD_ID, name)); + //TANCommand.itemCount++; + + // register sub types if there are any + if (FMLCommonHandler.instance().getSide() == Side.CLIENT) + { + if (item.getHasSubtypes()) + { + List subItems = new ArrayList(); + item.getSubItems(item, CreativeTabTAN.instance, subItems); + for (ItemStack subItem : subItems) + { + String subItemName = item.getUnlocalizedName(subItem); + subItemName = subItemName.substring(subItemName.indexOf(".") + 1); // remove 'item.' from the front + + ModelBakery.registerItemVariants(item, new ResourceLocation(ToughAsNails.MOD_ID, subItemName)); + ModelLoader.setCustomModelResourceLocation(item, subItem.getMetadata(), new ModelResourceLocation(ToughAsNails.MOD_ID + ":" + subItemName, "inventory")); + } + } + else + { + ModelLoader.setCustomModelResourceLocation(item, 0, new ModelResourceLocation(ToughAsNails.MOD_ID + ":" + name, "inventory")); + } + } + + return item; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModPotions.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModPotions.java new file mode 100644 index 00000000..8e92f413 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModPotions.java @@ -0,0 +1,53 @@ +package toughasnails.init; + +import static toughasnails.api.TANPotions.cold_resistance; +import static toughasnails.api.TANPotions.cold_resistance_type; +import static toughasnails.api.TANPotions.long_cold_resistance_type; +import static toughasnails.api.TANPotions.heat_resistance; +import static toughasnails.api.TANPotions.heat_resistance_type; +import static toughasnails.api.TANPotions.long_heat_resistance_type; +import static toughasnails.api.TANPotions.hyperthermia; +import static toughasnails.api.TANPotions.hypothermia; +import static toughasnails.api.TANPotions.thirst; + +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.potion.PotionType; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.common.registry.GameRegistry; +import toughasnails.api.TANPotions; +import toughasnails.core.ToughAsNails; +import toughasnails.potion.PotionColdResistance; +import toughasnails.potion.PotionHeatResistance; +import toughasnails.potion.PotionHyperthermia; +import toughasnails.potion.PotionHypothermia; +import toughasnails.potion.PotionThirst; + +public class ModPotions +{ + public static void init() + { + hypothermia = registerPotion("hypothermia", new PotionHypothermia(24).setPotionName("potion.hypothermia")); + hyperthermia = registerPotion("hyperthermia", new PotionHyperthermia(25).setPotionName("potion.hyperthermia")); + thirst = registerPotion("thirst", new PotionThirst(26).setPotionName("potion.thirst")); + cold_resistance = registerPotion("cold_resistance", new PotionColdResistance(27).setPotionName("potion.cold_resistance").setBeneficial()); + heat_resistance = registerPotion("heat_resistance", new PotionHeatResistance(28).setPotionName("potion.heat_resistance").setBeneficial()); + + cold_resistance_type = registerPotionType("cold_resistance_type", new PotionType(new PotionEffect[] {new PotionEffect(TANPotions.cold_resistance, 1200)})); + long_cold_resistance_type = registerPotionType("long_cold_resistance_type", new PotionType(new PotionEffect[] {new PotionEffect(TANPotions.cold_resistance, 2400)})); + heat_resistance_type = registerPotionType("heat_resistance_type", new PotionType(new PotionEffect[] {new PotionEffect(TANPotions.heat_resistance, 1200)})); + long_heat_resistance_type = registerPotionType("long_heat_resistance_type", new PotionType(new PotionEffect[] {new PotionEffect(TANPotions.heat_resistance, 2400)})); + } + + public static Potion registerPotion(String name, Potion potion) + { + GameRegistry.register(potion, new ResourceLocation(ToughAsNails.MOD_ID, name)); + return potion; + } + + public static PotionType registerPotionType(String name, PotionType potionType) + { + GameRegistry.register(potionType, new ResourceLocation(ToughAsNails.MOD_ID, name)); + return potionType; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModStats.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModStats.java new file mode 100644 index 00000000..fd55f7b3 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModStats.java @@ -0,0 +1,23 @@ +package toughasnails.init; + +import toughasnails.api.TANCapabilities; +import toughasnails.api.stat.PlayerStatRegistry; +import toughasnails.api.stat.capability.ITemperature; +import toughasnails.api.stat.capability.IThirst; +import toughasnails.temperature.TemperatureHandler; +import toughasnails.temperature.TemperatureStorage; +import toughasnails.thirst.ThirstHandler; +import toughasnails.thirst.ThirstStorage; + +public class ModStats +{ + public static void init() + { + PlayerStatRegistry.addStat(ITemperature.class, new TemperatureStorage(), TemperatureHandler.class); + PlayerStatRegistry.addStat(IThirst.class, new ThirstStorage(), ThirstHandler.class); + + //These MUST be registered after stats are added, as only then will ours capabilities be non-null + PlayerStatRegistry.registerCapability(TANCapabilities.TEMPERATURE); + PlayerStatRegistry.registerCapability(TANCapabilities.THIRST); + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModVanillaCompat.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModVanillaCompat.java new file mode 100644 index 00000000..29c379cb --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/init/ModVanillaCompat.java @@ -0,0 +1,37 @@ +package toughasnails.init; + +public class ModVanillaCompat +{ + public static void init() + { + addDungeonLoot(); + } + + private static void addDungeonLoot() + { + //Requires loot hooks which haven't yet been added + /*TODO: 1.9 ChestGenHooks desertTemple = ChestGenHooks.getInfo(ChestGenHooks.PYRAMID_DESERT_CHEST); + ChestGenHooks dungeon = ChestGenHooks.getInfo(ChestGenHooks.DUNGEON_CHEST); + ChestGenHooks jungleTemple = ChestGenHooks.getInfo(ChestGenHooks.PYRAMID_JUNGLE_CHEST); + ChestGenHooks mineshaft = ChestGenHooks.getInfo(ChestGenHooks.MINESHAFT_CORRIDOR); + ChestGenHooks strongholdCorridor = ChestGenHooks.getInfo(ChestGenHooks.STRONGHOLD_CORRIDOR); + ChestGenHooks strongholdCrossing = ChestGenHooks.getInfo(ChestGenHooks.STRONGHOLD_CROSSING); + ChestGenHooks strongholdLibrary = ChestGenHooks.getInfo(ChestGenHooks.STRONGHOLD_LIBRARY); + ChestGenHooks village = ChestGenHooks.getInfo(ChestGenHooks.VILLAGE_BLACKSMITH); + ChestGenHooks bonusChest = ChestGenHooks.getInfo(ChestGenHooks.BONUS_CHEST); + + bonusChest.addItem(new WeightedRandomChestContent(new ItemStack(TANItems.canteen), 1, 1, 15)); + + mineshaft.addItem(new WeightedRandomChestContent(new ItemStack(TANItems.jelled_slime_boots), 1, 1, 5)); + mineshaft.addItem(new WeightedRandomChestContent(new ItemStack(TANItems.jelled_slime_chestplate), 1, 1, 5)); + mineshaft.addItem(new WeightedRandomChestContent(new ItemStack(TANItems.jelled_slime_helmet), 1, 1, 5)); + mineshaft.addItem(new WeightedRandomChestContent(new ItemStack(TANItems.jelled_slime_leggings), 1, 1, 5)); + mineshaft.addItem(new WeightedRandomChestContent(new ItemStack(TANItems.respirator), 1, 1, 1)); + mineshaft.addItem(new WeightedRandomChestContent(new ItemStack(TANItems.air_filter), 2, 4, 5)); + + village.addItem(new WeightedRandomChestContent(new ItemStack(TANItems.wool_boots), 1, 1, 5)); + village.addItem(new WeightedRandomChestContent(new ItemStack(TANItems.wool_helmet), 1, 1, 5)); + village.addItem(new WeightedRandomChestContent(new ItemStack(TANItems.wool_chestplate), 1, 1, 5)); + village.addItem(new WeightedRandomChestContent(new ItemStack(TANItems.wool_leggings), 1, 1, 5));*/ + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemBottleOfGas.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemBottleOfGas.java new file mode 100644 index 00000000..e5d2edc6 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemBottleOfGas.java @@ -0,0 +1,124 @@ +package toughasnails.item; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockSnow; +import net.minecraft.block.state.IBlockState; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.IStringSerializable; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import toughasnails.api.TANBlocks; + +public class ItemBottleOfGas extends Item { + private Block block; + + public enum BottleContents implements IStringSerializable { + BLACKDAMP, WHITEDAMP, FIREDAMP, STINKDAMP; + + @Override + public String getName() { + return this.name().toLowerCase(); + } + + @Override + public String toString() { + return this.getName(); + } + } + + public ItemBottleOfGas() { + this.setHasSubtypes(true); + this.setMaxDamage(0); + this.setMaxStackSize(1); + + this.block = TANBlocks.gas; + } + + // add all the contents types as separate items in the creative tab + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item itemIn, CreativeTabs tab, List subItems) { + for (BottleContents contents : BottleContents.values()) { + subItems.add(new ItemStack(itemIn, 1, contents.ordinal())); + } + } + + // default behavior in Item is to return 0, but the meta value is important + // here because it determines the jar contents + @Override + public int getMetadata(int metadata) { + return metadata; + } + + public BottleContents getContentsType(ItemStack stack) { + int meta = stack.getMetadata(); + try { + return BottleContents.values()[meta]; + } catch (Exception e) { + // if metadata is out of bounds return blackdamp as a default + // (should never happen) + return BottleContents.BLACKDAMP; + } + } + + // get the correct name for this item by looking up the meta value in the + // JarContents enum + @Override + public String getUnlocalizedName(ItemStack stack) { + return "item.bottle_of_" + this.getContentsType(stack).getName(); + } + + @SuppressWarnings("deprecation") + @Override + public EnumActionResult onItemUse(ItemStack stack, EntityPlayer playerIn, World worldIn, BlockPos pos, + EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { + IBlockState iblockstate = worldIn.getBlockState(pos); + Block block = iblockstate.getBlock(); + + if (block == Blocks.SNOW_LAYER && ((Integer) iblockstate.getValue(BlockSnow.LAYERS)).intValue() < 1) { + side = EnumFacing.UP; + } else if (!block.isReplaceable(worldIn, pos)) { + pos = pos.offset(side); + } + + if (!playerIn.canPlayerEdit(pos, side, stack)) { + return EnumActionResult.PASS; + } else if (stack.stackSize == 0) { + return EnumActionResult.PASS; + } else { + if (worldIn.canBlockBePlaced(this.block, pos, false, side, (Entity) null, stack)) { + IBlockState iblockstate1 = this.block.getStateForPlacement(worldIn, pos, side, hitX, hitY, hitZ, + this.getMetadata(stack), playerIn, stack); + + if (worldIn.setBlockState(pos, iblockstate1, 3)) { + iblockstate1 = worldIn.getBlockState(pos); + + if (iblockstate1.getBlock() == this.block) { + ItemBlock.setTileEntityNBT(worldIn, playerIn, pos, stack); + iblockstate1.getBlock().onBlockPlacedBy(worldIn, pos, iblockstate1, playerIn, stack); + } + + stack.setItem(Items.GLASS_BOTTLE); + stack.setItemDamage(0); + return EnumActionResult.SUCCESS; + } + } + + return EnumActionResult.PASS; + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemCanteen.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemCanteen.java new file mode 100644 index 00000000..eb79cfc9 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemCanteen.java @@ -0,0 +1,186 @@ +package toughasnails.item; + +import net.minecraft.block.BlockCauldron; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumAction; +import net.minecraft.item.IItemPropertyGetter; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.PotionEffect; +import net.minecraft.stats.StatList; +import net.minecraft.util.ActionResult; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumHand; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.world.World; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import toughasnails.api.config.SyncedConfig; +import toughasnails.api.TANCapabilities; +import toughasnails.api.TANPotions; +import toughasnails.api.thirst.WaterType; +import toughasnails.api.config.GameplayOption; +import toughasnails.thirst.ThirstHandler; + +public class ItemCanteen extends Item { + public ItemCanteen() { + this.addPropertyOverride(new ResourceLocation("filled"), + new IItemPropertyGetter() { + @Override + @SideOnly(Side.CLIENT) + public float apply(ItemStack stack, World world, + EntityLivingBase entity) { + WaterType waterType = getWaterType(stack); + + if (waterType == null) + return 0.0F; + else + return 1.0F; + } + }); + + this.maxStackSize = 1; + this.setMaxDamage(3); + this.setNoRepair(); + } + + @SuppressWarnings("deprecation") + @Override + public ItemStack onItemUseFinish(ItemStack stack, World world, + EntityLivingBase entity) { + WaterType waterType = getWaterType(stack); + + if (entity instanceof EntityPlayer && waterType != null) { + EntityPlayer player = (EntityPlayer) entity; + + if (!player.capabilities.isCreativeMode) { + int damage = (stack.getItemDamage() >> 2) + 1; + int typeIndex = (waterType.ordinal() + 1); + + // Reset the canteen to its empty state + if (damage == this.getMaxDamage()) { + damage = 0; + typeIndex = 0; + } + + this.setDamage(stack, typeIndex | (damage << 2)); + } + + ThirstHandler thirstStats = (ThirstHandler) player + .getCapability(TANCapabilities.THIRST, null); + thirstStats.addStats(waterType.getThirst(), + waterType.getHydration()); + + if (!world.isRemote + && world.rand.nextFloat() < waterType.getPoisonChance() + && SyncedConfig + .getBooleanValue(GameplayOption.ENABLE_THIRST)) { + player.addPotionEffect( + new PotionEffect(TANPotions.thirst, 600)); + } + } + + return stack; + } + + @Override + public ActionResult onItemRightClick(ItemStack stack, + World world, EntityPlayer player, EnumHand hand) { + ThirstHandler thirstStats = (ThirstHandler) player + .getCapability(TANCapabilities.THIRST, null); + WaterType waterType = getWaterType(stack); + + if (!attemptCanteenFill(player, stack) && waterType != null + && getTimesUsed(stack) < 3 && thirstStats.isThirsty()) { + player.setActiveHand(hand); + } + + return new ActionResult(EnumActionResult.SUCCESS, stack); + } + + @Override + public double getDurabilityForDisplay(ItemStack stack) { + return (stack.getItemDamage() >> 2) / (double) stack.getMaxDamage(); + } + + /** + * Attempt to fill the provided canteen stack with water. + * + * @param player + * The player holding the canteen. + * @param stack + * The canteen item stack. + * @return true if successful, otherwise false. + */ + private boolean attemptCanteenFill(EntityPlayer player, ItemStack stack) { + World world = player.getEntityWorld(); + RayTraceResult movingObjectPos = this.rayTrace(world, player, true); + + if (movingObjectPos != null + && movingObjectPos.typeOfHit == RayTraceResult.Type.BLOCK) { + BlockPos pos = movingObjectPos.getBlockPos(); + IBlockState state = world.getBlockState(pos); + Fluid fluid = FluidRegistry.lookupFluidForBlock(state.getBlock()); + + if (fluid != null && fluid == FluidRegistry.WATER) // Temporary, + // until a + // registry is + // created + { + stack.setItemDamage(1); + return true; + } else if (state.getBlock() instanceof BlockCauldron) { + BlockCauldron cauldron = (BlockCauldron) state.getBlock(); + int level = ((Integer) state.getValue(BlockCauldron.LEVEL)); + + if (level > 0 && !world.isRemote) { + if (!player.capabilities.isCreativeMode) { + player.addStat(StatList.CAULDRON_USED); + stack.setItemDamage(1); + return true; + } + + cauldron.setWaterLevel(world, pos, state, level - 1); + } + } + } + + return false; + } + + private WaterType getWaterType(ItemStack stack) { + int type = stack.getMetadata() & 3; + return type > 0 ? WaterType.values()[type - 1] : null; + } + + private int getTimesUsed(ItemStack stack) { + return stack.getItemDamage() >> 2; + } + + @Override + public int getMaxItemUseDuration(ItemStack stack) { + return 32; + } + + @Override + public EnumAction getItemUseAction(ItemStack stack) { + return EnumAction.DRINK; + } + + @Override + public String getUnlocalizedName(ItemStack stack) { + WaterType type = getWaterType(stack); + + if (type != null) { + return "item." + type.toString().toLowerCase() + "_water_canteen"; + } else { + return "item.empty_canteen"; + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemFruitJuice.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemFruitJuice.java new file mode 100644 index 00000000..cf4fc161 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemFruitJuice.java @@ -0,0 +1,96 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.item; + +import java.util.List; + +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IStringSerializable; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import toughasnails.api.item.ItemDrink; +import toughasnails.api.thirst.IDrink; +import toughasnails.item.ItemFruitJuice.JuiceType; + +public class ItemFruitJuice extends ItemDrink { + @Override + public JuiceType getTypeFromMeta(int meta) { + return JuiceType.values()[meta % JuiceType.values().length]; + } + + // get the correct name for this item by looking up the meta value in the + // DartType enum + @Override + public String getUnlocalizedName(ItemStack stack) { + return "item.juice_" + getTypeFromMeta(stack.getMetadata()).toString(); + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tab, + List subItems) { + for (JuiceType juiceType : JuiceType.values()) { + subItems.add(new ItemStack(item, 1, juiceType.ordinal())); + } + } + + public static enum JuiceType implements IDrink,IStringSerializable { + APPLE(8, 0.8F), BEETROOT(10, 0.8F), CACTUS(9, 0.2F), CARROT(8, + 0.6F), CHORUS_FRUIT(12, 0.6F), GLISTERING_MELON(16, + 1.0F), GOLDEN_APPLE(20, 1.2F), GOLDEN_CARROT(14, + 1.0F), MELON(8, 0.5F), PUMPKIN(7, 0.7F); + + private int thirst; + private float hydration; + + private JuiceType(int thirst, float hydration) { + this.thirst = thirst; + this.hydration = hydration; + } + + @Override + public int getThirst() { + return this.thirst; + } + + @Override + public float getHydration() { + return this.hydration; + } + + @Override + public float getPoisonChance() { + return 0.0F; + } + + @Override + public String getName() { + return this.name().toLowerCase(); + } + + @Override + public String toString() { + return this.getName(); + } + } + + @Override + public boolean hasEffect(ItemStack stack) { + switch (getTypeFromMeta(stack.getMetadata())) { + case GLISTERING_MELON: + case GOLDEN_APPLE: + case GOLDEN_CARROT: + return true; + default: + return super.hasEffect(stack); + } + } + +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemIceCharge.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemIceCharge.java new file mode 100644 index 00000000..5a5143db --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemIceCharge.java @@ -0,0 +1,78 @@ +package toughasnails.item; + +import net.minecraft.block.BlockLiquid; +import net.minecraft.block.material.Material; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.stats.StatList; +import net.minecraft.util.ActionResult; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.world.World; + +public class ItemIceCharge extends Item +{ + + public ItemIceCharge() + { + this.setHasSubtypes(true); + } + + @SuppressWarnings("deprecation") + @Override + public ActionResult onItemRightClick(ItemStack itemStackIn, World worldIn, EntityPlayer playerIn, EnumHand hand) + { + RayTraceResult movingobjectposition = this.rayTrace(worldIn, playerIn, true); + + if (movingobjectposition == null) + { + return new ActionResult(EnumActionResult.PASS, itemStackIn); + } + else + { + if (movingobjectposition.typeOfHit == RayTraceResult.Type.BLOCK) + { + BlockPos blockpos = movingobjectposition.getBlockPos(); + + if (!worldIn.isBlockModifiable(playerIn, blockpos)) + { + return new ActionResult(EnumActionResult.PASS, itemStackIn); + } + + if (!playerIn.canPlayerEdit(blockpos.offset(movingobjectposition.sideHit), movingobjectposition.sideHit, itemStackIn)) + { + return new ActionResult(EnumActionResult.PASS, itemStackIn); + } + + BlockPos blockpos1 = blockpos.up(); + IBlockState iblockstate = worldIn.getBlockState(blockpos); + + if (iblockstate.getMaterial() == Material.WATER && ((Integer)iblockstate.getValue(BlockLiquid.LEVEL)).intValue() == 0 && worldIn.isAirBlock(blockpos1)) + { + net.minecraftforge.common.util.BlockSnapshot blocksnapshot = net.minecraftforge.common.util.BlockSnapshot.getBlockSnapshot(worldIn, blockpos1); + + worldIn.setBlockState(blockpos, Blocks.ICE.getDefaultState()); + if (net.minecraftforge.event.ForgeEventFactory.onPlayerBlockPlace(playerIn, blocksnapshot, net.minecraft.util.EnumFacing.UP).isCanceled()) + { + blocksnapshot.restore(true, false); + return new ActionResult(EnumActionResult.PASS, itemStackIn); + } + + if (!playerIn.capabilities.isCreativeMode) + { + --itemStackIn.stackSize; + } + + playerIn.addStat(StatList.getObjectUseStats(this)); + } + } + + return new ActionResult(EnumActionResult.SUCCESS, itemStackIn); + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemLifebloodCrystal.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemLifebloodCrystal.java new file mode 100644 index 00000000..dcdd410c --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemLifebloodCrystal.java @@ -0,0 +1,51 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.item; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.SoundEvents; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ActionResult; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumHand; +import net.minecraft.util.EnumParticleTypes; +import net.minecraft.util.SoundCategory; +import net.minecraft.world.World; +import toughasnails.api.HealthHelper; + +public class ItemLifebloodCrystal extends Item +{ + @Override + public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) + { + if (HealthHelper.addActiveHearts(player, 1)) + { + for (int i = 0; i < 8; i++) + { + double d0 = world.rand.nextGaussian() * 0.02D; + double d1 = world.rand.nextGaussian() * 0.02D; + double d2 = world.rand.nextGaussian() * 0.02D; + world.spawnParticle(EnumParticleTypes.HEART, player.posX + (double)(world.rand.nextFloat() * player.width * 2.0F) - (double)player.width, player.posY + 0.5D + (double)(world.rand.nextFloat() * player.height), player.posZ + (double)(world.rand.nextFloat() * player.width * 2.0F) - (double)player.width, d0, d1, d2, new int[0]); + } + world.playSound(player, player.getPosition(), SoundEvents.ENTITY_PLAYER_LEVELUP, SoundCategory.PLAYERS, 0.75F, 1.0F); + stack.stackSize--; + return new ActionResult(EnumActionResult.SUCCESS, stack); + } + else + { + return new ActionResult(EnumActionResult.FAIL, stack); + } + } + + @Override + public boolean hasEffect(ItemStack stack) + { + return true; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemRespirator.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemRespirator.java new file mode 100644 index 00000000..7083cf2a --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemRespirator.java @@ -0,0 +1,15 @@ +package toughasnails.item; + +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.item.ItemArmor; + +public class ItemRespirator extends ItemArmor +{ + public ItemRespirator(ItemArmor.ArmorMaterial material, int renderIndex) + { + // respirators are always on your head - armorType = 0 + super(material, renderIndex, EntityEquipmentSlot.HEAD); + + this.setCreativeTab(null); + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemSeasonClock.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemSeasonClock.java new file mode 100644 index 00000000..08ee0e17 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemSeasonClock.java @@ -0,0 +1,84 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.item; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.IItemPropertyGetter; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import toughasnails.api.season.SeasonHelper; +import toughasnails.season.SeasonTime; + +public class ItemSeasonClock extends Item { + public ItemSeasonClock() { + this.addPropertyOverride(new ResourceLocation("time"), + new IItemPropertyGetter() { + @SideOnly(Side.CLIENT) + double field_185088_a; + @SideOnly(Side.CLIENT) + double field_185089_b; + @SideOnly(Side.CLIENT) + int ticks; + + @Override + @SideOnly(Side.CLIENT) + public float apply(ItemStack stack, World world, + EntityLivingBase entity) { + Entity holder = (Entity) (entity != null ? entity + : stack.getItemFrame()); + + if (world == null && holder != null) { + world = holder.getEntityWorld(); + } + + if (world == null) { + return 0.0F; + } else { + double d0; + + if (world.provider.isSurfaceWorld()) { + int seasonCycleTicks = SeasonHelper + .getSeasonData(world) + .getSeasonCycleTicks(); + d0 = (double) ((float) seasonCycleTicks + / (float) SeasonTime.TOTAL_CYCLE_TICKS); + } else { + d0 = Math.random(); + } + + d0 = this.actualFrame(world, d0); + return MathHelper.positiveModulo((float) d0, 1.0F); + } + } + + @SideOnly(Side.CLIENT) + private double actualFrame(World world, double frame) { + if (world.getTotalWorldTime() != this.ticks) { + this.ticks = (int) world.getTotalWorldTime(); + double newFrame = frame - this.field_185088_a; + + if (newFrame < -0.5D) { + ++newFrame; + } + + this.field_185089_b += newFrame * 0.1D; + this.field_185089_b *= 0.9D; + this.field_185088_a += this.field_185089_b; + } + + return this.field_185088_a; + } + }); + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemTANBlock.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemTANBlock.java new file mode 100644 index 00000000..35876f11 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemTANBlock.java @@ -0,0 +1,80 @@ +package toughasnails.item; + +import java.util.List; + +import com.google.common.collect.ImmutableSet; + +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import toughasnails.api.ITANBlock; +import toughasnails.util.BlockStateUtils; + +public class ItemTANBlock extends ItemBlock +{ + + public ITANBlock tanBlock; + + public ItemTANBlock(Block block) + { + super(block); + if (block instanceof ITANBlock) + { + this.tanBlock = (ITANBlock)block; + } + else + { + throw new IllegalArgumentException("ItemBOPBlock must be created with a block implementing IBOPBlock"); + } + this.setHasSubtypes(true); + } + + // define the items which will appear in the creative tab (called by ItemBlock class) + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item itemIn, CreativeTabs tab, List subItems) + { + ImmutableSet presets = BlockStateUtils.getBlockPresets(this.block); + if (presets.isEmpty()) + { + subItems.add(new ItemStack(this.block, 1, 0)); + } + else + { + for (IBlockState state : presets) + { + subItems.add(new ItemStack(this.block, 1, this.block.getMetaFromState(state))); + } + } + } + + @Override + public int getMetadata(int metadata) + { + return metadata; + } + + @SuppressWarnings("deprecation") + @Override + public String getUnlocalizedName(ItemStack stack) + { + ImmutableSet presets = BlockStateUtils.getBlockPresets(this.block); + if (presets.isEmpty()) + { + return super.getUnlocalizedName(); + } + else + { + int meta = stack.getMetadata(); + IBlockState oldState = block.getStateFromMeta(meta); + IBlockState newState = BlockStateUtils.getPresetState(oldState); + + return super.getUnlocalizedName() + "." + tanBlock.getStateName(newState); + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemTANSpawnEgg.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemTANSpawnEgg.java new file mode 100644 index 00000000..16f9b697 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemTANSpawnEgg.java @@ -0,0 +1,194 @@ +/******************************************************************************* + * Copyright 2014-2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ + +package toughasnails.item; + +import java.util.List; +import java.util.Map.Entry; + +import net.minecraft.block.BlockFence; +import net.minecraft.block.BlockLiquid; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.color.IItemColor; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityList; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.IEntityLivingData; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.MobSpawnerBaseLogic; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityMobSpawner; +import net.minecraft.util.ActionResult; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import toughasnails.api.item.IColoredItem; +import toughasnails.init.ModEntities; + +public class ItemTANSpawnEgg extends Item implements IColoredItem { + + public ItemTANSpawnEgg() { + this.setHasSubtypes(true); + this.setMaxDamage(0); + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item itemIn, CreativeTabs tab, List subItems) { + for (Entry entry : ModEntities.entityEggs.entrySet()) { + subItems.add(new ItemStack(itemIn, 1, entry.getKey())); + } + } + + public static Entity spawnTANCreature(World worldIn, int entityID, double x, double y, double z) { + Entity entity = ModEntities.createEntityByID(entityID, worldIn); + + if (entity instanceof EntityLivingBase) { + EntityLiving entityliving = (EntityLiving) entity; + entity.setLocationAndAngles(x, y, z, MathHelper.wrapDegrees(worldIn.rand.nextFloat() * 360.0F), 0.0F); + entityliving.rotationYawHead = entityliving.rotationYaw; + entityliving.renderYawOffset = entityliving.rotationYaw; + entityliving.onInitialSpawn(worldIn.getDifficultyForLocation(new BlockPos(entityliving)), + (IEntityLivingData) null); + worldIn.spawnEntityInWorld(entity); + entityliving.playLivingSound(); + } + + return entity; + } + + @Override + public String getUnlocalizedName(ItemStack stack) { + int bopEntityId = stack.getMetadata(); + String entityName = ModEntities.idToTANEntityName.get(bopEntityId); + return super.getUnlocalizedName(stack) + "_" + entityName; + } + + @Override + @SideOnly(Side.CLIENT) + public IItemColor getItemColor() { + return new IItemColor() { + @Override + public int getColorFromItemstack(ItemStack stack, int tintIndex) { + EntityList.EntityEggInfo entityegginfo = ModEntities.entityEggs + .get(Integer.valueOf(stack.getMetadata())); + return entityegginfo != null + ? (tintIndex == 0 ? entityegginfo.primaryColor : entityegginfo.secondaryColor) : 16777215; + } + }; + } + + @Override + public EnumActionResult onItemUse(ItemStack stack, EntityPlayer playerIn, World worldIn, BlockPos pos, + EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { + if (worldIn.isRemote) { + return EnumActionResult.SUCCESS; + } else if (!playerIn.canPlayerEdit(pos.offset(facing), facing, stack)) { + return EnumActionResult.FAIL; + } else { + IBlockState iblockstate = worldIn.getBlockState(pos); + + if (iblockstate.getBlock() == Blocks.MOB_SPAWNER) { + TileEntity tileentity = worldIn.getTileEntity(pos); + + if (tileentity instanceof TileEntityMobSpawner) { + MobSpawnerBaseLogic mobspawnerbaselogic = ((TileEntityMobSpawner) tileentity).getSpawnerBaseLogic(); + mobspawnerbaselogic.setEntityName( + EntityList.CLASS_TO_NAME.get(EntityList.getClassFromID(stack.getMetadata()))); + tileentity.markDirty(); + worldIn.notifyBlockUpdate(pos, iblockstate, iblockstate, 3); + + if (!playerIn.capabilities.isCreativeMode) { + --stack.stackSize; + } + + return EnumActionResult.SUCCESS; + } + } + + pos = pos.offset(facing); + double d0 = 0.0D; + + if (facing == EnumFacing.UP && iblockstate instanceof BlockFence) { + d0 = 0.5D; + } + + Entity entity = spawnTANCreature(worldIn, stack.getMetadata(), (double) pos.getX() + 0.5D, + (double) pos.getY() + d0, (double) pos.getZ() + 0.5D); + + if (entity != null) { + if (entity instanceof EntityLivingBase && stack.hasDisplayName()) { + entity.setCustomNameTag(stack.getDisplayName()); + } + + if (!playerIn.capabilities.isCreativeMode) { + --stack.stackSize; + } + } + + return EnumActionResult.SUCCESS; + } + } + + @Override + public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) { + if (world.isRemote) { + return new ActionResult(EnumActionResult.FAIL, stack); + } else { + RayTraceResult movingobjectposition = this.rayTrace(world, player, true); + + if (movingobjectposition == null) { + return new ActionResult(EnumActionResult.FAIL, stack); + } else { + if (movingobjectposition.typeOfHit == RayTraceResult.Type.BLOCK) { + BlockPos blockpos = movingobjectposition.getBlockPos(); + + if (!world.isBlockModifiable(player, blockpos)) { + return new ActionResult(EnumActionResult.FAIL, stack); + } + + if (!player.canPlayerEdit(blockpos, movingobjectposition.sideHit, stack)) { + return new ActionResult(EnumActionResult.FAIL, stack); + } + + if (world.getBlockState(blockpos).getBlock() instanceof BlockLiquid) { + Entity entity = spawnTANCreature(world, stack.getMetadata(), (double) blockpos.getX() + 0.5D, + (double) blockpos.getY() + 0.5D, (double) blockpos.getZ() + 0.5D); + + if (entity != null) { + if (entity instanceof EntityLivingBase && stack.hasDisplayName()) { + ((EntityLiving) entity).setCustomNameTag(stack.getDisplayName()); + } + + if (!player.capabilities.isCreativeMode) { + --stack.stackSize; + } + + // TODO: 1.9 + // playerIn.triggerAchievement(StatList.objectUseStats[Item.getIdFromItem(this)]); + } + } + } + + return new ActionResult(EnumActionResult.SUCCESS, stack); + } + } + } + +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemTANWaterBottle.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemTANWaterBottle.java new file mode 100644 index 00000000..41f86bb4 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemTANWaterBottle.java @@ -0,0 +1,90 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.item; + +import java.util.List; + +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IStringSerializable; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import toughasnails.api.item.ItemDrink; +import toughasnails.api.thirst.IDrink; +import toughasnails.api.thirst.WaterType; +import toughasnails.item.ItemTANWaterBottle.WaterBottleType; + +public class ItemTANWaterBottle extends ItemDrink +{ + @Override + public WaterBottleType getTypeFromMeta(int meta) + { + return WaterBottleType.values()[meta % WaterBottleType.values().length]; + } + + // get the correct name for this item by looking up the meta value in the DartType enum + @Override + public String getUnlocalizedName(ItemStack stack) + { + return "item." + getTypeFromMeta(stack.getMetadata()).toString() + "_water_bottle"; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tab, List subItems) + { + for (WaterBottleType waterBottleType : WaterBottleType.values()) + { + subItems.add(new ItemStack(item, 1, waterBottleType.ordinal())); + } + } + + public static enum WaterBottleType implements IDrink, IStringSerializable + { + DIRTY(WaterType.DIRTY), + FILTERED(WaterType.FILTERED); + + private WaterType type; + + private WaterBottleType(WaterType type) + { + this.type = type; + } + + @Override + public int getThirst() + { + return type.getThirst(); + } + + @Override + public float getHydration() + { + return type.getHydration(); + } + + @Override + public float getPoisonChance() + { + return type.getPoisonChance(); + } + + @Override + public String getName() + { + return this.name().toLowerCase(); + } + + @Override + public String toString() + { + return this.getName(); + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemThermometer.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemThermometer.java new file mode 100644 index 00000000..e15f619a --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/item/ItemThermometer.java @@ -0,0 +1,113 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.item; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.IItemPropertyGetter; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ActionResult; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumHand; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import toughasnails.api.config.GameplayOption; +import toughasnails.api.config.SyncedConfig; +import toughasnails.api.temperature.TemperatureHelper; +import toughasnails.api.temperature.TemperatureScale; +import toughasnails.temperature.TemperatureHandler; + +public class ItemThermometer extends Item { + public ItemThermometer() { + this.addPropertyOverride(new ResourceLocation("temperature"), new IItemPropertyGetter() { + @SideOnly(Side.CLIENT) + double field_185088_a; + @SideOnly(Side.CLIENT) + double field_185089_b; + @SideOnly(Side.CLIENT) + int ticks; + + @Override + @SideOnly(Side.CLIENT) + public float apply(ItemStack stack, World world, EntityLivingBase entity) { + boolean overrideThermometerLimits = SyncedConfig + .getBooleanValue(GameplayOption.OVERRIDE_THERMOMETER_LIMITS); + int lowerBound = SyncedConfig.getIntegerValue(GameplayOption.THERMOMETER_LOWER_BOUND); + int upperBound = SyncedConfig.getIntegerValue(GameplayOption.THERMOMETER_UPPER_BOUND); + + if (entity == null || !(entity instanceof EntityPlayer)) { + Entity frame = stack.getItemFrame(); + if (frame != null) { + BlockPos framePosition = frame.getPosition(); + World frameWorld = frame.getEntityWorld(); + int finalTemperature = TemperatureHandler.getTargetTemperatureAt(frameWorld, framePosition); + + if (overrideThermometerLimits) { + float clampedTemp = (float) MathHelper.clamp_float(finalTemperature, lowerBound, + upperBound); + float shiftedTemp = (clampedTemp - lowerBound); + float needlePosition = shiftedTemp / ((float) (upperBound - lowerBound)); + return needlePosition; + } else { + return (float) MathHelper.clamp_float(finalTemperature, 0, TemperatureScale.getScaleTotal()) + / (float) TemperatureScale.getScaleTotal(); + } + } else { + return 0.0f; + } + } + + EntityPlayer player = (EntityPlayer) entity; + + if (world == null) + world = entity.getEntityWorld(); + + TemperatureHandler tempHandler = (TemperatureHandler) TemperatureHelper.getTemperatureData(player); + int finalTemperature = tempHandler.debugger.targetTemperature; + if (overrideThermometerLimits) { + float clampedTemp = (float) MathHelper.clamp_float(finalTemperature, lowerBound, upperBound); + float shiftedTemp = (clampedTemp - lowerBound); + return shiftedTemp / ((float) (upperBound - lowerBound)); + } else { + return (float) MathHelper.clamp_float(finalTemperature, 0, TemperatureScale.getScaleTotal()) + / (float) TemperatureScale.getScaleTotal(); + } + } + }); + } + + Map messageDebounce = new HashMap(); + + @Override + public ActionResult onItemRightClick(ItemStack itemStackIn, World world, EntityPlayer player, + EnumHand hand) { + if (!world.isRemote) { + // Get the temperature of the world at the player's location. + if (!messageDebounce.containsKey(player.getUniqueID()) + || (System.currentTimeMillis() - messageDebounce.get(player.getUniqueID()) > 2000)) { + BlockPos playerPosition = player.getPosition(); + int finalTemperature = TemperatureHandler.getTargetTemperatureAt(world, playerPosition); + + player.addChatMessage(new TextComponentTranslation("item.thermometer.read", finalTemperature)); + messageDebounce.put(player.getUniqueID(), System.currentTimeMillis()); + } + } + return new ActionResult(EnumActionResult.PASS, itemStackIn); + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/network/message/MessageSyncConfigs.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/network/message/MessageSyncConfigs.java new file mode 100644 index 00000000..e20e5339 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/network/message/MessageSyncConfigs.java @@ -0,0 +1,62 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.network.message; + +import io.netty.buffer.ByteBuf; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fml.common.network.ByteBufUtils; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; +import net.minecraftforge.fml.relauncher.Side; +import toughasnails.api.config.SyncedConfig; +import toughasnails.api.config.SyncedConfig.SyncedConfigEntry; +import toughasnails.core.ToughAsNails; + +public class MessageSyncConfigs implements IMessage, IMessageHandler +{ + public NBTTagCompound nbtOptions; + + public MessageSyncConfigs() {} + + public MessageSyncConfigs(NBTTagCompound nbtOptions) + { + this.nbtOptions = nbtOptions; + } + + @Override + public void fromBytes(ByteBuf buf) + { + this.nbtOptions = ByteBufUtils.readTag(buf); + } + + @Override + public void toBytes(ByteBuf buf) + { + ByteBufUtils.writeTag(buf, nbtOptions); + } + + @Override + public IMessage onMessage(MessageSyncConfigs message, MessageContext ctx) + { + if (ctx.side == Side.CLIENT) + { + for (String key : message.nbtOptions.getKeySet()) + { + SyncedConfigEntry entry = SyncedConfig.optionsToSync.get(key); + + if (entry == null) ToughAsNails.logger.error("Option " + key + " does not exist locally!"); + + entry.value = message.nbtOptions.getString(key); + ToughAsNails.logger.info("TAN configuration synchronized with the server"); + } + } + + return null; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/network/message/MessageSyncSeasonCycle.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/network/message/MessageSyncSeasonCycle.java new file mode 100644 index 00000000..dc1e9cda --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/network/message/MessageSyncSeasonCycle.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.network.message; + +import io.netty.buffer.ByteBuf; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; +import net.minecraftforge.fml.relauncher.Side; +import toughasnails.handler.season.SeasonHandler; + +public class MessageSyncSeasonCycle implements IMessage, IMessageHandler +{ + public int seasonCycleTicks; + + public MessageSyncSeasonCycle() {} + + public MessageSyncSeasonCycle(int seasonCycleTicks) + { + this.seasonCycleTicks = seasonCycleTicks; + } + + @Override + public void fromBytes(ByteBuf buf) + { + this.seasonCycleTicks = buf.readInt(); + } + + @Override + public void toBytes(ByteBuf buf) + { + buf.writeInt(this.seasonCycleTicks); + } + + @Override + public IMessage onMessage(MessageSyncSeasonCycle message, MessageContext ctx) + { + if (ctx.side == Side.CLIENT) + { + SeasonHandler.clientSeasonCycleTicks = message.seasonCycleTicks; + } + + return null; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/network/message/MessageTemperatureClient.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/network/message/MessageTemperatureClient.java new file mode 100644 index 00000000..1f25e741 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/network/message/MessageTemperatureClient.java @@ -0,0 +1,101 @@ +package toughasnails.network.message; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Map.Entry; + +import io.netty.buffer.ByteBuf; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.network.PacketBuffer; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; +import net.minecraftforge.fml.relauncher.Side; +import toughasnails.api.TANCapabilities; +import toughasnails.temperature.TemperatureDebugger; +import toughasnails.temperature.TemperatureDebugger.Modifier; +import toughasnails.temperature.TemperatureDebugger.ModifierType; +import toughasnails.temperature.TemperatureHandler; + +public class MessageTemperatureClient implements IMessage, IMessageHandler { + public int temperatureTimer; + public int changeTicks; + public int targetTemperature; + + @SuppressWarnings("unchecked") + public Map[] modifiers = new LinkedHashMap[ModifierType.values().length]; + + @SuppressWarnings({ "unchecked", "rawtypes" }) + public MessageTemperatureClient() { + for (int i = 0; i < ModifierType.values().length; i++) { + modifiers[i] = new LinkedHashMap(); + } + } + + public MessageTemperatureClient(int temperatureTimer, int changeTicks, int targetTemperature, + Map[] modifiers) { + this.temperatureTimer = temperatureTimer; + this.changeTicks = changeTicks; + this.targetTemperature = targetTemperature; + this.modifiers = modifiers; + } + + @Override + public void fromBytes(ByteBuf buf) { + PacketBuffer packetBuffer = new PacketBuffer(buf); + + this.temperatureTimer = packetBuffer.readInt(); + this.changeTicks = packetBuffer.readInt(); + this.targetTemperature = packetBuffer.readInt(); + + for (int mapIdx = 0; mapIdx < modifiers.length; mapIdx++) { + int size = packetBuffer.readInt(); + + for (int i = 0; i < size; i++) { + Modifier modifier = (Modifier) packetBuffer.readEnumValue(Modifier.class); + int value = packetBuffer.readInt(); + + modifiers[mapIdx].put(modifier, value); + } + } + } + + @Override + public void toBytes(ByteBuf buf) { + PacketBuffer packetBuffer = new PacketBuffer(buf); + + packetBuffer.writeInt(this.temperatureTimer); + packetBuffer.writeInt(this.changeTicks); + packetBuffer.writeInt(this.targetTemperature); + + for (Map modifier : modifiers) { + packetBuffer.writeInt(modifier.size()); + + for (Entry entry : modifier.entrySet()) { + packetBuffer.writeEnumValue(entry.getKey()); + packetBuffer.writeInt(entry.getValue()); + } + } + } + + @Override + public IMessage onMessage(MessageTemperatureClient message, MessageContext ctx) { + if (ctx.side == Side.CLIENT) { + EntityPlayerSP player = Minecraft.getMinecraft().thePlayer; + + if (player != null) { + TemperatureHandler temperatureStats = (TemperatureHandler) player + .getCapability(TANCapabilities.TEMPERATURE, null); + TemperatureDebugger debugger = temperatureStats.debugger; + + debugger.temperatureTimer = message.temperatureTimer; + debugger.changeTicks = message.changeTicks; + debugger.targetTemperature = message.targetTemperature; + debugger.modifiers = message.modifiers; + } + } + + return null; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/network/message/MessageToggleUI.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/network/message/MessageToggleUI.java new file mode 100644 index 00000000..8b7ecbbb --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/network/message/MessageToggleUI.java @@ -0,0 +1,50 @@ +package toughasnails.network.message; + +import io.netty.buffer.ByteBuf; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; +import net.minecraftforge.fml.relauncher.Side; +import toughasnails.api.TANCapabilities; +import toughasnails.temperature.TemperatureDebugger; +import toughasnails.temperature.TemperatureHandler; + +public class MessageToggleUI implements IMessage, IMessageHandler { + public boolean showDebugGUI; + + public MessageToggleUI() { + } + + public MessageToggleUI(boolean showDebugGUI) { + this.showDebugGUI = showDebugGUI; + } + + @Override + public void fromBytes(ByteBuf buf) { + this.showDebugGUI = buf.readBoolean(); + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeBoolean(this.showDebugGUI); + } + + @Override + public IMessage onMessage(MessageToggleUI message, MessageContext ctx) { + if (ctx.side == Side.CLIENT) { + EntityPlayerSP player = Minecraft.getMinecraft().thePlayer; + + if (player != null) { + TemperatureHandler temperatureStats = (TemperatureHandler) player + .getCapability(TANCapabilities.TEMPERATURE, null); + TemperatureDebugger debugger = temperatureStats.debugger; + + debugger.setGuiVisible(message.showDebugGUI); + } + } + + return null; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/network/message/MessageUpdateStat.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/network/message/MessageUpdateStat.java new file mode 100644 index 00000000..b8e8492c --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/network/message/MessageUpdateStat.java @@ -0,0 +1,58 @@ +package toughasnails.network.message; + +import io.netty.buffer.ByteBuf; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.fml.common.network.ByteBufUtils; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; +import toughasnails.api.stat.IPlayerStat; +import toughasnails.api.stat.PlayerStatRegistry; +import toughasnails.api.stat.StatHandlerBase; + +public class MessageUpdateStat implements IMessage, IMessageHandler { + public String identifier; + public NBTTagCompound data; + + public MessageUpdateStat() { + } + + public MessageUpdateStat(Capability capability, NBTTagCompound data) { + if (data == null) + throw new IllegalArgumentException("Data cannot be null!"); + + this.identifier = capability.getName(); + this.data = data; + } + + @Override + public void fromBytes(ByteBuf buf) { + this.identifier = ByteBufUtils.readUTF8String(buf); + this.data = ByteBufUtils.readTag(buf); + } + + @Override + public void toBytes(ByteBuf buf) { + ByteBufUtils.writeUTF8String(buf, this.identifier); + ByteBufUtils.writeTag(buf, this.data); + } + + @SuppressWarnings("unchecked") + @Override + public IMessage onMessage(MessageUpdateStat message, MessageContext ctx) { + EntityPlayerSP player = Minecraft.getMinecraft().thePlayer; + + if (player != null) { + Capability capability = (Capability) PlayerStatRegistry + .getCapability(message.identifier); + StatHandlerBase stat = (StatHandlerBase) player.getCapability(capability, null); + + capability.getStorage().readNBT(capability, stat, null, message.data); + } + + return null; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/particle/EntitySnowflakeFX.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/particle/EntitySnowflakeFX.java new file mode 100644 index 00000000..a78144c5 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/particle/EntitySnowflakeFX.java @@ -0,0 +1,97 @@ +package toughasnails.particle; + +import net.minecraft.client.particle.Particle; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.VertexBuffer; +import net.minecraft.entity.Entity; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.World; +import net.minecraftforge.fml.client.FMLClientHandler; +import toughasnails.core.ClientProxy; + +public class EntitySnowflakeFX extends Particle { + + public EntitySnowflakeFX(World world, double xCoordIn, double yCoordIn, double zCoordIn, double motionXIn, + double motionYIn, double motionZIn) { + this(world, xCoordIn, yCoordIn, zCoordIn, motionXIn, motionYIn, motionZIn, 1.0F); + } + + public EntitySnowflakeFX(World world, double xCoordIn, double yCoordIn, double zCoordIn, double motionXIn, + double motionYIn, double motionZIn, float par14) { + super(world, xCoordIn, yCoordIn, zCoordIn, 0.0D, 0.0D, 0.0D); + + this.particleTextureIndexX = 7; + this.particleTextureIndexY = 0; + + this.motionX *= 0.10000000149011612D; + this.motionY *= 0.10000000149011612D; + this.motionZ *= 0.10000000149011612D; + this.motionX += motionXIn; + this.motionY += motionYIn; + this.motionZ += motionZIn; + this.particleScale *= 0.75F; + this.particleScale *= par14; + this.particleMaxAge = (int) ((8.0D / (Math.random() * 0.8D + 0.2D)) * 8); + this.particleMaxAge = (int) ((float) this.particleMaxAge * par14); + this.particleAge = world.rand.nextInt(2); + this.particleAlpha = 1.0F; + this.particleGravity = 0.02F; + } + + @Override + public int getFXLayer() { + return 2; + } + + @Override + public void renderParticle(VertexBuffer renderer, Entity entity, float partialTicks, float rotX, float rotXZ, + float rotZ, float rotYZ, float rotXY) { + + // EffectRenderer will by default bind the vanilla particles texture, + // override with our own + FMLClientHandler.instance().getClient().renderEngine.bindTexture(ClientProxy.particleTexturesLocation); + + float scaleMultiplier = ((float) this.particleAge + partialTicks) / (float) this.particleMaxAge * 32.0F; + scaleMultiplier = MathHelper.clamp_float(scaleMultiplier, 0.0F, 1.0F); + this.particleScale = this.particleScale * scaleMultiplier; + + GlStateManager.depthMask(false); + GlStateManager.enableBlend(); + GlStateManager.blendFunc(770, 1); + + super.renderParticle(renderer, entity, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); + + GlStateManager.disableBlend(); + GlStateManager.depthMask(true); + + } + + @Override + public void onUpdate() { + prevPosX = posX; + prevPosY = posY; + prevPosZ = posZ; + + if (particleAge++ >= particleMaxAge) { + this.setExpired(); + } + + this.particleTextureIndexX = 7 - particleAge * 8 / particleMaxAge; + this.moveEntity(motionX, motionY, motionZ); + + if (posY == prevPosY) { + motionX *= 1.1D; + motionZ *= 1.1D; + } + + motionX *= 0.9599999785423279D; + motionY *= 0.9599999785423279D; + motionZ *= 0.9599999785423279D; + + if (isCollided) { + motionX *= 0.699999988079071D; + motionZ *= 0.699999988079071D; + } + } + +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/particle/TANParticleTypes.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/particle/TANParticleTypes.java new file mode 100644 index 00000000..a83d4210 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/particle/TANParticleTypes.java @@ -0,0 +1,6 @@ +package toughasnails.particle; + +public enum TANParticleTypes +{ + SNOWFLAKE; +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/potion/PotionColdResistance.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/potion/PotionColdResistance.java new file mode 100644 index 00000000..d705f364 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/potion/PotionColdResistance.java @@ -0,0 +1,21 @@ +package toughasnails.potion; + +import net.minecraft.entity.EntityLivingBase; +import toughasnails.api.TANPotions; + +public class PotionColdResistance extends TANPotion { + public PotionColdResistance(int id) { + super(true, 0x77A9FF, 2, 1); + } + + @Override + public void performEffect(EntityLivingBase entity, int amplifier) { + entity.removePotionEffect(TANPotions.hypothermia); + } + + @Override + public boolean isReady(int duration, int amplifier) { + int time = 50 >> amplifier; + return time > 0 ? duration % time == 0 : true; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/potion/PotionHeatResistance.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/potion/PotionHeatResistance.java new file mode 100644 index 00000000..54196e3a --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/potion/PotionHeatResistance.java @@ -0,0 +1,25 @@ +package toughasnails.potion; + +import net.minecraft.entity.EntityLivingBase; +import toughasnails.api.TANPotions; + +public class PotionHeatResistance extends TANPotion +{ + public PotionHeatResistance(int id) + { + super(true, 0xE54720, 1, 1); + } + + @Override + public void performEffect(EntityLivingBase entity, int amplifier) + { + entity.removePotionEffect(TANPotions.hyperthermia); + } + + @Override + public boolean isReady(int duration, int amplifier) + { + int time = 50 >> amplifier; + return time > 0 ? duration % time == 0 : true; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/potion/PotionHyperthermia.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/potion/PotionHyperthermia.java new file mode 100644 index 00000000..0486fa81 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/potion/PotionHyperthermia.java @@ -0,0 +1,27 @@ +package toughasnails.potion; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.util.DamageSource; + +public class PotionHyperthermia extends TANPotion +{ + public PotionHyperthermia(int id) + { + super(true, 0xFFA300, 3, 0); + + this.setIconIndex(3, 0); + } + + @Override + public void performEffect(EntityLivingBase entity, int amplifier) + { + entity.attackEntityFrom(DamageSource.generic, 0.5F); + } + + @Override + public boolean isReady(int duration, int amplifier) + { + int time = 50 >> amplifier; + return time > 0 ? duration % time == 0 : true; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/potion/PotionHypothermia.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/potion/PotionHypothermia.java new file mode 100644 index 00000000..a0542f34 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/potion/PotionHypothermia.java @@ -0,0 +1,27 @@ +package toughasnails.potion; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.util.DamageSource; + +public class PotionHypothermia extends TANPotion +{ + public PotionHypothermia(int id) + { + super(true, 0xA8CFFF, 2, 0); + + this.setIconIndex(2, 0); + } + + @Override + public void performEffect(EntityLivingBase entity, int amplifier) + { + entity.attackEntityFrom(DamageSource.generic, 0.5F); + } + + @Override + public boolean isReady(int duration, int amplifier) + { + int time = 50 >> amplifier; + return time > 0 ? duration % time == 0 : true; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/potion/PotionThirst.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/potion/PotionThirst.java new file mode 100644 index 00000000..41890da1 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/potion/PotionThirst.java @@ -0,0 +1,33 @@ +package toughasnails.potion; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import toughasnails.api.thirst.ThirstHelper; +import toughasnails.thirst.ThirstHandler; + +public class PotionThirst extends TANPotion +{ + public PotionThirst(int id) + { + super(true, 0x61D51A, 0, 0); + } + + @Override + public void performEffect(EntityLivingBase entity, int amplifier) + { + if (entity instanceof EntityPlayer) + { + EntityPlayer player = (EntityPlayer)entity; + ThirstHandler handler = (ThirstHandler)ThirstHelper.getThirstData(player); + + handler.addExhaustion(0.025F * (float)(amplifier + 1)); + } + } + + @Override + public boolean isReady(int duration, int amplifier) + { + int time = 50 >> amplifier; + return time > 0 ? duration % time == 0 : true; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/potion/TANPotion.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/potion/TANPotion.java new file mode 100644 index 00000000..ff8c9aa1 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/potion/TANPotion.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.potion; + +import net.minecraft.client.Minecraft; +import net.minecraft.potion.Potion; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +public abstract class TANPotion extends Potion { + private static final ResourceLocation POTIONS_LOCATION = new ResourceLocation( + "toughasnails:textures/potions/tanpotionfx.png"); + + protected TANPotion(boolean isBadEffectIn, int liquidColorIn, int x, int y) { + super(isBadEffectIn, liquidColorIn); + this.setIconIndex(x, y); + } + + @Override + @SideOnly(Side.CLIENT) + public boolean hasStatusIcon() { + Minecraft.getMinecraft().getTextureManager().bindTexture(POTIONS_LOCATION); + return super.hasStatusIcon(); + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/season/ISeasonedWorld.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/season/ISeasonedWorld.java new file mode 100644 index 00000000..4d2db42b --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/season/ISeasonedWorld.java @@ -0,0 +1,18 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.season; + +import net.minecraft.util.math.BlockPos; +import toughasnails.api.season.Season; + +/** Now with extra seasoning*/ +public interface ISeasonedWorld +{ + boolean canSnowAtInSeason(BlockPos pos, boolean checkLight, Season season); + boolean canBlockFreezeInSeason(BlockPos pos, boolean noWaterAdj, Season season); +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/season/SeasonASMHelper.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/season/SeasonASMHelper.java new file mode 100644 index 00000000..8277aa5b --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/season/SeasonASMHelper.java @@ -0,0 +1,170 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.season; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockLiquid; +import net.minecraft.block.material.Material; +import net.minecraft.block.state.IBlockState; +import net.minecraft.init.Biomes; +import net.minecraft.init.Blocks; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.EnumSkyBlock; +import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; +import toughasnails.api.TANBlocks; +import toughasnails.api.config.GameplayOption; +import toughasnails.api.config.SyncedConfig; +import toughasnails.api.season.IDecayableCrop; +import toughasnails.api.season.Season; +import toughasnails.api.season.SeasonHelper; +import toughasnails.api.temperature.Temperature; +import toughasnails.api.temperature.TemperatureHelper; +import toughasnails.config.CropGrowConfigEntry; +import toughasnails.config.GameplayConfigurationHandler; +import toughasnails.handler.season.SeasonHandler; +import toughasnails.temperature.TemperatureHandler; + +public class SeasonASMHelper { + /////////////////// + // World methods // + /////////////////// + + public static boolean canSnowAtInSeason(World world, BlockPos pos, boolean checkLight, Season season) { + Biome biome = world.getBiome(pos); + float temperature = biome.getFloatTemperature(pos); + + // If we're in winter, the temperature can be anything equal to or below + // 0.7 + if (!SeasonHelper.canSnowAtTempInSeason(season, temperature)) { + return false; + } else if (biome == Biomes.RIVER || biome == Biomes.OCEAN || biome == Biomes.DEEP_OCEAN) { + return false; + } else if (checkLight) { + if (pos.getY() >= 0 && pos.getY() < 256 && world.getLightFor(EnumSkyBlock.BLOCK, pos) < 10) { + IBlockState state = world.getBlockState(pos); + + if (state.getBlock().isAir(state, world, pos) && Blocks.SNOW_LAYER.canPlaceBlockAt(world, pos)) { + return true; + } + } + + return false; + } + + return true; + } + + public static boolean canBlockFreezeInSeason(World world, BlockPos pos, boolean noWaterAdj, Season season) { + Biome Biome = world.getBiome(pos); + float temperature = Biome.getFloatTemperature(pos); + + // If we're in winter, the temperature can be anything equal to or below + // 0.7 + if (!SeasonHelper.canSnowAtTempInSeason(season, temperature)) { + return false; + } else if (Biome == Biomes.RIVER || Biome == Biomes.OCEAN || Biome == Biomes.DEEP_OCEAN) { + return false; + } else { + if (pos.getY() >= 0 && pos.getY() < 256 && world.getLightFor(EnumSkyBlock.BLOCK, pos) < 10) { + IBlockState iblockstate = world.getBlockState(pos); + Block block = iblockstate.getBlock(); + + if ((block == Blocks.WATER || block == Blocks.FLOWING_WATER) + && ((Integer) iblockstate.getValue(BlockLiquid.LEVEL)).intValue() == 0) { + if (!noWaterAdj) { + return true; + } + + boolean west = (world.getBlockState(pos.west()).getMaterial() == Material.WATER); + boolean east = (world.getBlockState(pos.east()).getMaterial() == Material.WATER); + boolean north = (world.getBlockState(pos.north()).getMaterial() == Material.WATER); + boolean south = (world.getBlockState(pos.south()).getMaterial() == Material.WATER); + + boolean flag = west && east && north && south; + + if (!flag) { + return true; + } + } + } + + return false; + } + } + + public static boolean isRainingAtInSeason(World world, BlockPos pos, Season season) { + Biome biome = world.getBiome(pos); + return biome.getEnableSnow() && season != Season.WINTER ? false + : (world.canSnowAt(pos, false) ? false : biome.canRain()); + } + + /////////////////// + // Biome methods // + /////////////////// + + public static float getFloatTemperature(Biome biome, BlockPos pos) { + Season season = new SeasonTime(SeasonHandler.clientSeasonCycleTicks).getSubSeason().getSeason(); + + if (biome.getTemperature() <= 0.7F && season == Season.WINTER + && SyncedConfig.getBooleanValue(GameplayOption.ENABLE_SEASONS)) { + return 0.0F; + } else { + return biome.getFloatTemperature(pos); + } + } + + //////////////////////// + // BlockCrops methods // + //////////////////////// + + public static void onUpdateTick(Block block, World world, BlockPos pos) { + + // Should withering be based on the season, or on temperature? + String blockName = block.getRegistryName().toString(); + boolean temperatureWithering = SyncedConfig.getBooleanValue(GameplayOption.TEMPERATURE_WITHERING); + if (!temperatureWithering) { + Season season = SeasonHelper.getSeasonData(world).getSubSeason().getSeason(); + + if (season == Season.WINTER && !TemperatureHelper.isPosClimatisedForTemp(world, pos, new Temperature(1)) + && SyncedConfig.getBooleanValue(GameplayOption.ENABLE_SEASONS)) { + + // Kill those crops which implement the decaying API or + // externally-specified. + if (block instanceof IDecayableCrop && ((IDecayableCrop) block).shouldDecay()) { + world.setBlockState(pos, TANBlocks.dead_crops.getDefaultState()); + } else if (GameplayConfigurationHandler.EXTERNAL_DECAYING_CROPS.containsKey(blockName)) { + world.setBlockState(pos, TANBlocks.dead_crops.getDefaultState()); + } + } + } else { + int minLiving = 0; + int maxLiving = 0; + + // Assign crop life details from config file. + if (GameplayConfigurationHandler.EXTERNAL_DECAYING_CROPS.containsKey(blockName)) { + CropGrowConfigEntry cropData = GameplayConfigurationHandler.EXTERNAL_DECAYING_CROPS.get(blockName); + minLiving = cropData.getMinLiving(); + maxLiving = cropData.getMaxLiving(); + + // Otherwise, assign defaults. + } else if (block instanceof IDecayableCrop && ((IDecayableCrop) block).shouldDecay()) { + minLiving = 5; + maxLiving = 20; + } else { + return; + } + + // Kill the crop if it exceeds temperature bounds. + int targetTemperature = TemperatureHandler.getTargetTemperatureAt(world, pos); + if (targetTemperature > maxLiving || targetTemperature < minLiving) { + world.setBlockState(pos, TANBlocks.dead_crops.getDefaultState()); + } + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/season/SeasonSavedData.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/season/SeasonSavedData.java new file mode 100644 index 00000000..c139b669 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/season/SeasonSavedData.java @@ -0,0 +1,43 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.season; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.WorldSavedData; + +public class SeasonSavedData extends WorldSavedData +{ + public static final String DATA_IDENTIFIER = "seasons"; + + public int seasonCycleTicks; + + public SeasonSavedData() + { + this(DATA_IDENTIFIER); + } + + //This specific constructor is required for saving to occur + public SeasonSavedData(String identifier) + { + super(identifier); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) + { + this.seasonCycleTicks = nbt.getInteger("SeasonCycleTicks"); + } + + @Override + public NBTTagCompound writeToNBT(NBTTagCompound nbt) + { + nbt.setInteger("SeasonCycleTicks", this.seasonCycleTicks); + + return nbt; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/season/SeasonTime.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/season/SeasonTime.java new file mode 100644 index 00000000..f0f5b0d5 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/season/SeasonTime.java @@ -0,0 +1,52 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.season; + +import toughasnails.api.season.ISeasonData; +import toughasnails.api.season.Season; +import toughasnails.api.season.Season.SubSeason; + +public final class SeasonTime implements ISeasonData +{ + /** Not configurable, the duration of a single day*/ + public static final int DAY_TICKS = 24000; + /** The duration of a sub season in days*/ + public static final int SUB_SEASON_DURATION = 5; + public static final int SEASON_TICKS = DAY_TICKS * SUB_SEASON_DURATION * 3; + public static final int TOTAL_CYCLE_TICKS = (DAY_TICKS * SUB_SEASON_DURATION) * SubSeason.values().length; + + public final int time; + + public SeasonTime(int time) + { + this.time = time; + } + + public int getDay() + { + return (int)(this.time / DAY_TICKS); + } + + @Override + public int getSeasonCycleTicks() + { + return this.time; + } + + @Override + public SubSeason getSubSeason() + { + int index = (getDay() / SUB_SEASON_DURATION) % SubSeason.values().length; + return SubSeason.values()[index]; + } + + public Season getSeason() + { + return this.getSubSeason().getSeason(); + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/BlockTemperatureData.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/BlockTemperatureData.java new file mode 100644 index 00000000..3c5b9aba --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/BlockTemperatureData.java @@ -0,0 +1,17 @@ +package toughasnails.temperature; + +import net.minecraft.block.state.IBlockState; + +public class BlockTemperatureData { + + public IBlockState state; + public float blockTemperature; + public String[] useProperties; + + public BlockTemperatureData(IBlockState state, String[] useProperties, float blockTemperature) { + this.state = state; + this.useProperties = useProperties; + this.blockTemperature = blockTemperature; + } + +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/MaterialTemperatureData.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/MaterialTemperatureData.java new file mode 100644 index 00000000..a07a8fce --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/MaterialTemperatureData.java @@ -0,0 +1,7 @@ +package toughasnails.temperature; + +public class MaterialTemperatureData { + + public float fire = 1.0F; + +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/TemperatureDebugger.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/TemperatureDebugger.java new file mode 100644 index 00000000..492959f9 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/TemperatureDebugger.java @@ -0,0 +1,141 @@ +package toughasnails.temperature; + +import java.util.LinkedHashMap; +import java.util.Map; + +import net.minecraft.entity.player.EntityPlayerMP; +import toughasnails.handler.PacketHandler; +import toughasnails.network.message.MessageTemperatureClient; +import toughasnails.network.message.MessageToggleUI; +import toughasnails.util.MapUtils; + +public class TemperatureDebugger { + @SuppressWarnings("unchecked") + public Map[] modifiers = new LinkedHashMap[ModifierType.values().length]; + + private boolean showGui = false; + public int debugTimer; + + public int temperatureTimer; + public int changeTicks; + public int targetTemperature; + + private boolean currentlyMeasuring = false; + private Modifier currentModifier; + private int currentLevel = -1; + + public TemperatureDebugger() { + for (int i = 0; i < ModifierType.values().length; i++) { + modifiers[i] = new LinkedHashMap(); + } + } + + public void start(Modifier modifier, int startLevel) { + if (!currentlyMeasuring) { + this.currentModifier = modifier; + this.currentLevel = startLevel; + this.currentlyMeasuring = true; + } else { + throw new RuntimeException("Already measuring!"); + } + } + + public void end(int endLevel) { + if (currentlyMeasuring) { + int difference = -(currentLevel - endLevel); + + if (difference != 0) { + modifiers[currentModifier.modifierType.ordinal()].put(currentModifier, difference); + } + + currentlyMeasuring = false; + } else { + throw new RuntimeException("No measurement has been started!"); + } + } + + /** + * Sorts the modifier maps and sends them to the client + */ + public void finalize(EntityPlayerMP player) { + this.debugTimer = 0; + + if (this.showGui) { + sortModifiers(); + } + + PacketHandler.instance.sendTo( + new MessageTemperatureClient(temperatureTimer, changeTicks, targetTemperature, modifiers), player); + clearModifiers(); + } + + private void sortModifiers() { + for (int i = 0; i < modifiers.length; i++) { + modifiers[i] = MapUtils.sortMapByValue(modifiers[i]); + } + } + + public void clearModifiers() { + for (int i = 0; i < modifiers.length; i++) { + modifiers[i].clear(); + } + } + + public void setGuiVisible(boolean state, EntityPlayerMP updatePlayer) { + this.showGui = state; + this.debugTimer = 0; + + if (updatePlayer != null) { + PacketHandler.instance.sendTo(new MessageToggleUI(state), updatePlayer); + } + } + + public void setGuiVisible(boolean state) { + setGuiVisible(state, null); + } + + public boolean isGuiVisible() { + return this.showGui; + } + + public static enum ModifierType { + RATE, TARGET; + } + + public static enum Modifier { + EQUILIBRIUM_TARGET("Equilibrium", ModifierType.TARGET), BIOME_HUMIDITY_RATE("Biome Humidity", + ModifierType.RATE), BIOME_TEMPERATURE_TARGET("Biome Temperature", + ModifierType.TARGET), NEARBY_BLOCKS_RATE("Nearby Blocks", + ModifierType.RATE), NEARBY_BLOCKS_TARGET("Nearby Blocks", + ModifierType.TARGET), SPRINTING_RATE("Sprinting", + ModifierType.RATE), HEALTH_RATE("Health", + ModifierType.RATE), ALTITUDE_TARGET("Altitude", + ModifierType.TARGET), ARMOR_TARGET("Armor", + ModifierType.TARGET), ARMOR_RATE("Armor", + ModifierType.RATE), SPRINTING_TARGET( + "Sprinting", + ModifierType.TARGET), TIME_TARGET( + "Time", + ModifierType.TARGET), WET_RATE( + "Wet", + ModifierType.RATE), WET_TARGET( + "Wet", + ModifierType.TARGET), SNOW_TARGET( + "Snow", + ModifierType.TARGET), CLIMATISATION_TARGET( + "Climatisation", + ModifierType.TARGET), CLIMATISATION_RATE( + "Climatisation", + ModifierType.RATE), SEASON_TARGET( + "Season", + ModifierType.TARGET); + + public final String name; + public final ModifierType modifierType; + + private Modifier(String name, ModifierType modifierType) { + this.name = name; + this.modifierType = modifierType; + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/TemperatureHandler.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/TemperatureHandler.java new file mode 100644 index 00000000..c811437c --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/TemperatureHandler.java @@ -0,0 +1,293 @@ +package toughasnails.temperature; + +import java.util.Map; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.World; +import net.minecraftforge.fml.common.gameevent.TickEvent.Phase; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import toughasnails.api.TANCapabilities; +import toughasnails.api.TANPotions; +import toughasnails.api.config.GameplayOption; +import toughasnails.api.config.SyncedConfig; +import toughasnails.api.stat.StatHandlerBase; +import toughasnails.api.stat.capability.ITemperature; +import toughasnails.api.temperature.Temperature; +import toughasnails.api.temperature.TemperatureScale; +import toughasnails.api.temperature.TemperatureScale.TemperatureRange; +import toughasnails.network.message.MessageUpdateStat; +import toughasnails.temperature.TemperatureDebugger.Modifier; +import toughasnails.temperature.modifier.AltitudeModifier; +import toughasnails.temperature.modifier.ArmorModifier; +import toughasnails.temperature.modifier.BiomeModifier; +import toughasnails.temperature.modifier.ObjectProximityModifier; +import toughasnails.temperature.modifier.PlayerStateModifier; +import toughasnails.temperature.modifier.SeasonModifier; +import toughasnails.temperature.modifier.TemperatureModifier; +import toughasnails.temperature.modifier.TemperatureModifier.ExternalModifier; +import toughasnails.temperature.modifier.TimeModifier; +import toughasnails.temperature.modifier.WeatherModifier; + +public class TemperatureHandler extends StatHandlerBase implements ITemperature { + public static final int TEMPERATURE_SCALE_MIDPOINT = TemperatureScale.getScaleTotal() / 2; + public static final int BASE_TEMPERATURE_CHANGE_TICKS = 1200; + + private int temperatureLevel; + private int prevTemperatureLevel; + private int temperatureTimer; + + private TemperatureModifier altitudeModifier; + private TemperatureModifier armorModifier; + private TemperatureModifier biomeModifier; + private TemperatureModifier playerStateModifier; + private TemperatureModifier objectProximityModifier; + private TemperatureModifier weatherModifier; + private TemperatureModifier timeModifier; + private TemperatureModifier seasonModifier; + + private Map externalModifiers; + + public final TemperatureDebugger debugger = new TemperatureDebugger(); + + public TemperatureHandler() { + this.temperatureLevel = TemperatureScale.getScaleTotal() / 2; + this.prevTemperatureLevel = this.temperatureLevel; + + this.altitudeModifier = new AltitudeModifier(debugger); + this.armorModifier = new ArmorModifier(debugger); + this.biomeModifier = new BiomeModifier(debugger); + this.playerStateModifier = new PlayerStateModifier(debugger); + this.objectProximityModifier = new ObjectProximityModifier(debugger); + this.weatherModifier = new WeatherModifier(debugger); + this.timeModifier = new TimeModifier(debugger); + this.seasonModifier = new SeasonModifier(debugger); + + this.externalModifiers = Maps.newHashMap(); + } + + @Override + public void update(EntityPlayer player, World world, Phase phase) { + if (phase == Phase.END && !world.isRemote) { + int newTempChangeTicks = BASE_TEMPERATURE_CHANGE_TICKS; + + TemperatureTrend trend; + + if (debugger.targetTemperature == this.temperatureLevel) + trend = TemperatureTrend.STILL; + else + trend = debugger.targetTemperature > this.temperatureLevel ? TemperatureTrend.INCREASING + : TemperatureTrend.DECREASING; + + newTempChangeTicks = altitudeModifier.modifyChangeRate(world, player, newTempChangeTicks, trend); + newTempChangeTicks = armorModifier.modifyChangeRate(world, player, newTempChangeTicks, trend); + newTempChangeTicks = biomeModifier.modifyChangeRate(world, player, newTempChangeTicks, trend); + newTempChangeTicks = playerStateModifier.modifyChangeRate(world, player, newTempChangeTicks, trend); + newTempChangeTicks = objectProximityModifier.modifyChangeRate(world, player, newTempChangeTicks, trend); + newTempChangeTicks = weatherModifier.modifyChangeRate(world, player, newTempChangeTicks, trend); + newTempChangeTicks = timeModifier.modifyChangeRate(world, player, newTempChangeTicks, trend); + + java.util.Iterator iterator = this.externalModifiers.values() + .iterator(); + + debugger.start(Modifier.CLIMATISATION_RATE, newTempChangeTicks); + while (iterator.hasNext()) { + TemperatureModifier.ExternalModifier modifier = iterator.next(); + + if (this.temperatureTimer > modifier.getEndTime()) { + iterator.remove(); + } else { + if (SyncedConfig.getBooleanValue(GameplayOption.ENABLE_TEMPERATURE)) { + newTempChangeTicks += modifier.getRate(); + } + } + } + debugger.end(newTempChangeTicks); + + newTempChangeTicks = Math.max(20, newTempChangeTicks); + + boolean incrementTemperature = ++temperatureTimer >= newTempChangeTicks; + boolean updateClient = ++debugger.debugTimer % 5 == 0; + + debugger.temperatureTimer = temperatureTimer; + debugger.changeTicks = newTempChangeTicks; + + if (incrementTemperature && SyncedConfig.getBooleanValue(GameplayOption.ENABLE_TEMPERATURE)) { + for (ExternalModifier modifier : this.externalModifiers.values()) { + modifier.setEndTime(modifier.getEndTime() - this.temperatureTimer); + } + } + + if ((incrementTemperature || updateClient) + && SyncedConfig.getBooleanValue(GameplayOption.ENABLE_TEMPERATURE)) { + debugger.start(Modifier.EQUILIBRIUM_TARGET, 0); + debugger.end(TemperatureScale.getScaleTotal() / 2); + + Temperature targetTemperature = biomeModifier.modifyTarget(world, player, + new Temperature(TEMPERATURE_SCALE_MIDPOINT)); + targetTemperature = altitudeModifier.modifyTarget(world, player, targetTemperature); + targetTemperature = armorModifier.modifyTarget(world, player, targetTemperature); + targetTemperature = playerStateModifier.modifyTarget(world, player, targetTemperature); + targetTemperature = objectProximityModifier.modifyTarget(world, player, targetTemperature); + targetTemperature = weatherModifier.modifyTarget(world, player, targetTemperature); + targetTemperature = timeModifier.modifyTarget(world, player, targetTemperature); + targetTemperature = seasonModifier.modifyTarget(world, player, targetTemperature); + + debugger.start(Modifier.CLIMATISATION_TARGET, targetTemperature.getRawValue()); + for (TemperatureModifier.ExternalModifier modifier : this.externalModifiers.values()) { + targetTemperature = new Temperature(targetTemperature.getRawValue() + modifier.getAmount()); + } + debugger.end(targetTemperature.getRawValue()); + + debugger.targetTemperature = targetTemperature.getRawValue(); + + targetTemperature = new Temperature( + MathHelper.clamp_int(targetTemperature.getRawValue(), 0, TemperatureScale.getScaleTotal())); + + if (incrementTemperature) { + this.addTemperature(new Temperature( + (int) Math.signum(targetTemperature.getRawValue() - this.temperatureLevel))); + this.temperatureTimer = 0; + } + } + + addPotionEffects(player); + + if (updateClient) { + // This works because update is only called if !world.isRemote + debugger.finalize((EntityPlayerMP) player); + } + } + } + + private void addPotionEffects(EntityPlayer player) { + // TemperatureRange range = TemperatureScale + // .getTemperatureRange(this.temperatureLevel); + float multiplier = 1.0F; + + // The point from 0 to 1 at which potion effects begin in an extremity + // range + float extremityDelta = (3.0F / 6.0F); + + // Start the hypo/hyperthermia slightly after the real ranges start + int hypoRangeSize = (int) (TemperatureRange.ICY.getRangeSize() * extremityDelta); + int hypoRangeStart = hypoRangeSize - 1; + int hyperRangeSize = (int) (TemperatureRange.HOT.getRangeSize() * extremityDelta); + int hyperRangeStart = (TemperatureScale.getScaleTotal() + 1) - hyperRangeSize; + + // Don't apply any negative effects whilst in creative mode + if (!player.capabilities.isCreativeMode && (SyncedConfig.getBooleanValue(GameplayOption.ENABLE_TEMPERATURE))) { + if (this.temperatureLevel <= hypoRangeStart && (!player.isPotionActive(TANPotions.cold_resistance)) + && (temperatureLevel < prevTemperatureLevel || !player.isPotionActive(TANPotions.hypothermia))) { + multiplier = 1.0F - ((float) (this.temperatureLevel + 1) / (float) hypoRangeSize); + player.removePotionEffect(TANPotions.hypothermia); + player.addPotionEffect(new PotionEffect(TANPotions.hypothermia, (int) (1800 * multiplier) + 600, + (int) (3 * multiplier + extremityDelta))); + } else if (this.temperatureLevel >= hyperRangeStart && (!player.isPotionActive(TANPotions.heat_resistance)) + && (temperatureLevel > prevTemperatureLevel || !player.isPotionActive(TANPotions.hyperthermia))) { + multiplier = (float) (this.temperatureLevel - hyperRangeStart) / hyperRangeSize; + player.removePotionEffect(TANPotions.hyperthermia); + player.addPotionEffect(new PotionEffect(TANPotions.hyperthermia, (int) (1800 * multiplier) + 600, + (int) (3 * multiplier))); + } + } + } + + @Override + public boolean hasChanged() { + return this.prevTemperatureLevel != this.temperatureLevel; + } + + @Override + public void onSendClientUpdate() { + this.prevTemperatureLevel = this.temperatureLevel; + } + + @Override + public IMessage createUpdateMessage() { + NBTTagCompound data = (NBTTagCompound) TANCapabilities.TEMPERATURE.getStorage() + .writeNBT(TANCapabilities.TEMPERATURE, this, null); + return new MessageUpdateStat(TANCapabilities.TEMPERATURE, data); + } + + @Override + public void setChangeTime(int ticks) { + this.temperatureTimer = ticks; + } + + @Override + public int getChangeTime() { + return this.temperatureTimer; + } + + @Override + public void setTemperature(Temperature temperature) { + this.temperatureLevel = temperature.getRawValue(); + } + + @Override + public void addTemperature(Temperature difference) { + this.temperatureLevel = Math + .max(Math.min(TemperatureScale.getScaleTotal(), this.temperatureLevel + difference.getRawValue()), 0); + } + + @Override + public void applyModifier(String name, int amount, int rate, int duration) { + if (this.externalModifiers.containsKey(name)) { + ExternalModifier modifier = this.externalModifiers.get(name); + modifier.setEndTime(this.temperatureTimer + duration); + } else { + TemperatureModifier.ExternalModifier modifier = new TemperatureModifier.ExternalModifier(name, amount, rate, + this.temperatureTimer + duration); + this.externalModifiers.put(name, modifier); + } + } + + @Override + public boolean hasModifier(String name) { + return this.externalModifiers.containsKey(name); + } + + @Override + public ImmutableMap getExternalModifiers() { + return ImmutableMap.copyOf(this.externalModifiers); + } + + @Override + public void setExternalModifiers(Map externalModifiers) { + this.externalModifiers = externalModifiers; + } + + @Override + public Temperature getTemperature() { + return new Temperature(this.temperatureLevel); + } + + public static int getTargetTemperatureAt(World world, BlockPos position) { + final TemperatureDebugger debugger = new TemperatureDebugger(); + AltitudeModifier altitudeModifier = new AltitudeModifier(debugger); + BiomeModifier biomeModifier = new BiomeModifier(debugger); + ObjectProximityModifier objectProximityModifier = new ObjectProximityModifier(debugger); + WeatherModifier weatherModifier = new WeatherModifier(debugger); + TimeModifier timeModifier = new TimeModifier(debugger); + SeasonModifier seasonModifier = new SeasonModifier(debugger); + + Temperature baseTemperature = new Temperature(TemperatureHandler.TEMPERATURE_SCALE_MIDPOINT); + Temperature targetTemperature = biomeModifier.modifyTarget(world, position, baseTemperature); + targetTemperature = altitudeModifier.modifyTarget(world, position, targetTemperature); + targetTemperature = objectProximityModifier.modifyTarget(world, position, targetTemperature); + targetTemperature = weatherModifier.modifyTarget(world, position, targetTemperature); + targetTemperature = timeModifier.modifyTarget(world, position, targetTemperature); + targetTemperature = seasonModifier.modifyTarget(world, position, targetTemperature); + + int finalTemperature = targetTemperature.getRawValue(); + return finalTemperature; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/TemperatureStorage.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/TemperatureStorage.java new file mode 100644 index 00000000..fc1cd77b --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/TemperatureStorage.java @@ -0,0 +1,70 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.temperature; + +import java.util.Map; + +import com.google.common.collect.Maps; + +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.Capability.IStorage; +import net.minecraftforge.common.util.Constants; +import toughasnails.api.stat.capability.ITemperature; +import toughasnails.api.temperature.Temperature; +import toughasnails.temperature.modifier.TemperatureModifier.ExternalModifier; + +public class TemperatureStorage implements IStorage +{ + @Override + public NBTBase writeNBT(Capability capability, ITemperature instance, EnumFacing side) + { + NBTTagCompound compound = new NBTTagCompound(); + + compound.setInteger("temperatureLevel", instance.getTemperature().getRawValue()); + compound.setInteger("temperatureTimer", instance.getChangeTime()); + + NBTTagList externalModifierList = new NBTTagList(); + for (ExternalModifier modifier : instance.getExternalModifiers().values()) + { + externalModifierList.appendTag(modifier.serializeNBT()); + } + compound.setTag("ExternalModifiers", externalModifierList); + + return compound; + } + + @Override + public void readNBT(Capability capability, ITemperature instance, EnumFacing side, NBTBase nbt) + { + if (!(nbt instanceof NBTTagCompound)) throw new IllegalArgumentException("Temperature must be read from an NBTTagCompound!"); + + NBTTagCompound compound = (NBTTagCompound)nbt; + + if (compound.hasKey("temperatureLevel")) + { + instance.setTemperature(new Temperature(compound.getInteger("temperatureLevel"))); + instance.setChangeTime(compound.getInteger("temperatureTimer")); + + NBTTagList externalModifierTagList = compound.getTagList("ExternalModifiers", Constants.NBT.TAG_COMPOUND); + Map externalModifierList = Maps.newHashMap(); + for (int i = 0; i < externalModifierTagList.tagCount(); i++) + { + NBTTagCompound externalModifierCompound = externalModifierTagList.getCompoundTagAt(i); + ExternalModifier modifier = new ExternalModifier(); + modifier.deserializeNBT(externalModifierCompound); + externalModifierList.put(modifier.getName(), modifier); + } + instance.setExternalModifiers(externalModifierList); + } + } +} + diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/TemperatureTrend.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/TemperatureTrend.java new file mode 100644 index 00000000..62459986 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/TemperatureTrend.java @@ -0,0 +1,13 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.temperature; + +public enum TemperatureTrend +{ + STILL, INCREASING, DECREASING; +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/AltitudeModifier.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/AltitudeModifier.java new file mode 100644 index 00000000..d36a65ff --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/AltitudeModifier.java @@ -0,0 +1,55 @@ +package toughasnails.temperature.modifier; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.World; +import toughasnails.api.config.GameplayOption; +import toughasnails.api.config.SyncedConfig; +import toughasnails.api.temperature.Temperature; +import toughasnails.temperature.TemperatureDebugger; +import toughasnails.temperature.TemperatureDebugger.Modifier; +import toughasnails.temperature.TemperatureTrend; + +public class AltitudeModifier extends TemperatureModifier { + public final int ALTITUDE_TARGET_MODIFIER; + + public AltitudeModifier(TemperatureDebugger debugger) { + super(debugger); + this.ALTITUDE_TARGET_MODIFIER = SyncedConfig.getIntegerValue(GameplayOption.ALTITUDE_TEMP_MODIFIER); + } + + @Override + public int modifyChangeRate(World world, EntityPlayer player, int changeRate, TemperatureTrend trend) { + return changeRate; + } + + @Override + public Temperature modifyTarget(World world, EntityPlayer player, Temperature temperature) { + int temperatureLevel = temperature.getRawValue(); + int newTemperatureLevel = temperatureLevel; + + debugger.start(Modifier.ALTITUDE_TARGET, newTemperatureLevel); + + if (world.provider.isSurfaceWorld()) { + newTemperatureLevel -= MathHelper + .abs(MathHelper.floor_double(((64 - player.posY) / 64) * ALTITUDE_TARGET_MODIFIER) + 1); + } + + debugger.end(newTemperatureLevel); + + return new Temperature(newTemperatureLevel); + } + + public Temperature modifyTarget(World world, BlockPos position, Temperature temperature) { + int temperatureLevel = temperature.getRawValue(); + int newTemperatureLevel = temperatureLevel; + + if (world.provider.isSurfaceWorld()) { + newTemperatureLevel -= MathHelper + .abs(MathHelper.floor_double(((64 - position.getY()) / 64) * ALTITUDE_TARGET_MODIFIER) + 1); + } + + return new Temperature(newTemperatureLevel); + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/ArmorModifier.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/ArmorModifier.java new file mode 100644 index 00000000..ed684698 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/ArmorModifier.java @@ -0,0 +1,128 @@ +package toughasnails.temperature.modifier; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.world.World; +import toughasnails.api.item.TANItems; +import toughasnails.api.temperature.Temperature; +import toughasnails.temperature.TemperatureDebugger; +import toughasnails.temperature.TemperatureDebugger.Modifier; +import toughasnails.temperature.TemperatureTrend; + +public class ArmorModifier extends TemperatureModifier { + public static final int ARMOR_RATE_MODIFIER = 25; + public static final int JELLED_SLIME_TARGET_MODIFIER = -1; + public static final int WOOL_TARGET_MODIFIER = 1; + + public ArmorModifier(TemperatureDebugger debugger) { + super(debugger); + } + + @Override + public int modifyChangeRate(World world, EntityPlayer player, + int changeRate, TemperatureTrend trend) { + int newChangeRate = changeRate; + int armorRateModifier = ARMOR_RATE_MODIFIER; + + switch (trend) { + case INCREASING: + armorRateModifier *= -1; + break; + case STILL: + armorRateModifier = 0; + break; + default: + armorRateModifier = 0; + break; + } + + debugger.start(Modifier.ARMOR_RATE, newChangeRate); + + InventoryPlayer inventory = ((EntityPlayer) player).inventory; + + // Helmet + if (inventory.armorInventory[3] != null) { + newChangeRate += armorRateModifier; + } + + // Chestplate + if (inventory.armorInventory[2] != null) { + newChangeRate += armorRateModifier; + } + + // Legging + if (inventory.armorInventory[1] != null) { + newChangeRate += armorRateModifier; + } + + // Boots + if (inventory.armorInventory[0] != null) { + newChangeRate += armorRateModifier; + } + + debugger.end(newChangeRate); + + return newChangeRate; + } + + @Override + public Temperature modifyTarget(World world, EntityPlayer player, + Temperature temperature) { + int temperatureLevel = temperature.getRawValue(); + int newTemperatureLevel = temperatureLevel; + + debugger.start(Modifier.ARMOR_TARGET, newTemperatureLevel); + + InventoryPlayer inventory = ((EntityPlayer) player).inventory; + + // Helmet + if (inventory.armorInventory[3] != null) { + if (inventory.armorInventory[3].getItem() == TANItems.wool_helmet) { + newTemperatureLevel += WOOL_TARGET_MODIFIER; + } + if (inventory.armorInventory[3] + .getItem() == TANItems.jelled_slime_helmet) { + newTemperatureLevel += JELLED_SLIME_TARGET_MODIFIER; + } + } + + // Chestplate + if (inventory.armorInventory[2] != null) { + if (inventory.armorInventory[2] + .getItem() == TANItems.wool_chestplate) { + newTemperatureLevel += WOOL_TARGET_MODIFIER; + } + if (inventory.armorInventory[2] + .getItem() == TANItems.jelled_slime_chestplate) { + newTemperatureLevel += JELLED_SLIME_TARGET_MODIFIER; + } + } + + // Leggings + if (inventory.armorInventory[1] != null) { + if (inventory.armorInventory[1] + .getItem() == TANItems.wool_leggings) { + newTemperatureLevel += WOOL_TARGET_MODIFIER; + } + if (inventory.armorInventory[1] + .getItem() == TANItems.jelled_slime_leggings) { + newTemperatureLevel += JELLED_SLIME_TARGET_MODIFIER; + } + } + + // Boots + if (inventory.armorInventory[0] != null) { + if (inventory.armorInventory[0].getItem() == TANItems.wool_boots) { + newTemperatureLevel += WOOL_TARGET_MODIFIER; + } + if (inventory.armorInventory[0] + .getItem() == TANItems.jelled_slime_boots) { + newTemperatureLevel += JELLED_SLIME_TARGET_MODIFIER; + } + } + + debugger.end(newTemperatureLevel); + + return new Temperature(newTemperatureLevel); + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/BiomeModifier.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/BiomeModifier.java new file mode 100644 index 00000000..7ed8c692 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/BiomeModifier.java @@ -0,0 +1,84 @@ +package toughasnails.temperature.modifier; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; +import toughasnails.api.config.GameplayOption; +import toughasnails.api.config.SyncedConfig; +import toughasnails.api.temperature.Temperature; +import toughasnails.temperature.TemperatureDebugger; +import toughasnails.temperature.TemperatureDebugger.Modifier; +import toughasnails.temperature.TemperatureTrend; +import toughasnails.util.BiomeUtils; + +public class BiomeModifier extends TemperatureModifier { + public final int MAX_TEMP_OFFSET; + + public BiomeModifier(TemperatureDebugger debugger) { + super(debugger); + this.MAX_TEMP_OFFSET = SyncedConfig + .getIntegerValue(GameplayOption.BIOME_TEMP_MODIFIER); + } + + @Override + public int modifyChangeRate(World world, EntityPlayer player, + int changeRate, TemperatureTrend trend) { + Biome biome = world.getBiome(player.getPosition()); + float humidity = biome.getRainfall(); + float humidityMultiplier = 2.0F * Math.abs((humidity % 1.0F) - 0.5F); + int newChangeRate = changeRate - (int) ((10 * humidityMultiplier) * 20); + + debugger.start(Modifier.BIOME_HUMIDITY_RATE, changeRate); + debugger.end(newChangeRate); + + return newChangeRate; + } + + @Override + public Temperature modifyTarget(World world, EntityPlayer player, + Temperature temperature) { + Biome biome = world.getBiome(player.getPosition()); + Biome biomeNorth = world.getBiome(player.getPosition().add(0, 0, -10)); + Biome biomeSouth = world.getBiome(player.getPosition().add(0, 0, 10)); + Biome biomeEast = world.getBiome(player.getPosition().add(10, 0, 0)); + Biome biomeWest = world.getBiome(player.getPosition().add(-10, 0, 0)); + + float biomeTemp = ((BiomeUtils.getBiomeTempNorm(biome) + + BiomeUtils.getBiomeTempNorm(biomeNorth) + + BiomeUtils.getBiomeTempNorm(biomeSouth) + + BiomeUtils.getBiomeTempNorm(biomeEast) + + BiomeUtils.getBiomeTempNorm(biomeWest)) / 5.0F); + + // Denormalize, multiply by the max temp offset, add to the current temp + int newTemperatureLevel = temperature.getRawValue() + + (int) Math.round((biomeTemp * 2.0F - 1.0F) * MAX_TEMP_OFFSET); + + debugger.start(Modifier.BIOME_TEMPERATURE_TARGET, + temperature.getRawValue()); + debugger.end(newTemperatureLevel); + + return new Temperature(newTemperatureLevel); + } + + public Temperature modifyTarget(World world, BlockPos position, + Temperature temperature) { + Biome biome = world.getBiome(position); + Biome biomeNorth = world.getBiome(position.add(0, 0, -10)); + Biome biomeSouth = world.getBiome(position.add(0, 0, 10)); + Biome biomeEast = world.getBiome(position.add(10, 0, 0)); + Biome biomeWest = world.getBiome(position.add(-10, 0, 0)); + + float biomeTemp = ((BiomeUtils.getBiomeTempNorm(biome) + + BiomeUtils.getBiomeTempNorm(biomeNorth) + + BiomeUtils.getBiomeTempNorm(biomeSouth) + + BiomeUtils.getBiomeTempNorm(biomeEast) + + BiomeUtils.getBiomeTempNorm(biomeWest)) / 5.0F); + + // Denormalize, multiply by the max temp offset, add to the current temp + int newTemperatureLevel = temperature.getRawValue() + + (int) Math.round((biomeTemp * 2.0F - 1.0F) * MAX_TEMP_OFFSET); + + return new Temperature(newTemperatureLevel); + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/ObjectProximityModifier.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/ObjectProximityModifier.java new file mode 100644 index 00000000..d8de978d --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/ObjectProximityModifier.java @@ -0,0 +1,148 @@ +package toughasnails.temperature.modifier; + +import java.util.ArrayList; + +import net.minecraft.block.material.Material; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import toughasnails.api.temperature.Temperature; +import toughasnails.config.TANConfig; +import toughasnails.temperature.BlockTemperatureData; +import toughasnails.temperature.TemperatureDebugger; +import toughasnails.temperature.TemperatureDebugger.Modifier; +import toughasnails.temperature.TemperatureTrend; +import toughasnails.util.BlockStateUtils; + +//TODO: Replace this with something better +public class ObjectProximityModifier extends TemperatureModifier { + public ObjectProximityModifier(TemperatureDebugger debugger) { + super(debugger); + } + + @Override + public int modifyChangeRate(World world, EntityPlayer player, + int changeRate, TemperatureTrend trend) { + int newChangeRate = changeRate; + BlockPos playerPos = player.getPosition(); + + int tempSourceBlocks = 0; + + // System.out.println(new Calendar(world).getSubSeason()); + + for (int x = -3; x <= 3; x++) { + for (int y = -2; y <= 2; y++) { + for (int z = -3; z <= 3; z++) { + BlockPos pos = playerPos.add(x, y - 1, z); + IBlockState state = world.getBlockState(pos); + + if (getBlockTemperature(state) != 0.0F) + tempSourceBlocks++; + } + } + } + + debugger.start(Modifier.NEARBY_BLOCKS_RATE, newChangeRate); + newChangeRate -= tempSourceBlocks * 20; + debugger.end(newChangeRate); + + return newChangeRate; + } + + @Override + public Temperature modifyTarget(World world, EntityPlayer player, + Temperature temperature) { + int temperatureLevel = temperature.getRawValue(); + int newTemperatureLevel = temperatureLevel; + BlockPos playerPos = player.getPosition(); + + float blockTemperatureModifier = 0.0F; + + for (int x = -3; x <= 3; x++) { + for (int y = -2; y <= 2; y++) { + for (int z = -3; z <= 3; z++) { + BlockPos pos = playerPos.add(x, y - 1, z); + IBlockState state = world.getBlockState(pos); + + blockTemperatureModifier += getBlockTemperature(state); + } + } + } + + debugger.start(Modifier.NEARBY_BLOCKS_TARGET, newTemperatureLevel); + newTemperatureLevel += blockTemperatureModifier; + debugger.end(newTemperatureLevel); + + return new Temperature(newTemperatureLevel); + } + + public static float getBlockTemperature(IBlockState state) { + Material material = state.getMaterial(); + + // NPE guard + if (state.getBlock().getRegistryName() == null) { + return 0.0F; + } + String blockName = state.getBlock().getRegistryName().toString(); + + // Blocks + if (TANConfig.blockTemperatureData.containsKey(blockName)) { + ArrayList blockTempData = TANConfig.blockTemperatureData + .get(blockName); + + // Check if block has relevant state: + for (BlockTemperatureData tempData : blockTempData) { + boolean bAllSpecifiedPropertiesMatch = true; + for (String comparisonProperty : tempData.useProperties) { + IProperty targetProperty = BlockStateUtils + .getPropertyByName(state, comparisonProperty); + + if (!(state.getValue(targetProperty) == tempData.state + .getValue(targetProperty))) { + bAllSpecifiedPropertiesMatch = false; + } + } + + if (bAllSpecifiedPropertiesMatch) { + return tempData.blockTemperature; + } + } + + // If no matching states, then block is at ambient temperature: + return 0.0F; + } + + // Handle materials, but only if we didn't already find an actual block + // to use: + if (material == Material.FIRE) { + return TANConfig.materialTemperatureData.fire; + } + + return 0.0F; + } + + public Temperature modifyTarget(World world, BlockPos position, + Temperature temperature) { + int temperatureLevel = temperature.getRawValue(); + int newTemperatureLevel = temperatureLevel; + + float blockTemperatureModifier = 0.0F; + + for (int x = -3; x <= 3; x++) { + for (int y = -2; y <= 2; y++) { + for (int z = -3; z <= 3; z++) { + BlockPos pos = position.add(x, y - 1, z); + IBlockState state = world.getBlockState(pos); + + blockTemperatureModifier += getBlockTemperature(state); + } + } + } + + newTemperatureLevel += blockTemperatureModifier; + + return new Temperature(newTemperatureLevel); + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/PlayerStateModifier.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/PlayerStateModifier.java new file mode 100644 index 00000000..07509419 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/PlayerStateModifier.java @@ -0,0 +1,69 @@ +package toughasnails.temperature.modifier; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import toughasnails.api.temperature.Temperature; +import toughasnails.temperature.TemperatureDebugger; +import toughasnails.temperature.TemperatureDebugger.Modifier; +import toughasnails.temperature.TemperatureTrend; + +public class PlayerStateModifier extends TemperatureModifier { + public static final int SPRINTING_RATE_MODIFIER = 200; + public static final int SPRINTING_TARGET_MODIFIER = 3; + + public PlayerStateModifier(TemperatureDebugger debugger) { + super(debugger); + } + + @Override + public int modifyChangeRate(World world, EntityPlayer player, + int changeRate, TemperatureTrend trend) { + int newChangeRate = changeRate; + int sprintingRateModifier = SPRINTING_RATE_MODIFIER; + + switch (trend) { + case INCREASING: + sprintingRateModifier *= -1; + break; + case STILL: + sprintingRateModifier = 0; + break; + default: + sprintingRateModifier = 0; + break; + } + + debugger.start(Modifier.SPRINTING_RATE, newChangeRate); + + if (player.isSprinting()) { + newChangeRate += sprintingRateModifier; + } + + debugger.end(newChangeRate); + debugger.start(Modifier.HEALTH_RATE, newChangeRate); + + newChangeRate -= (1.0 - (player.getHealth() / player.getMaxHealth())) + * 200; + + debugger.end(newChangeRate); + + return newChangeRate; + } + + @Override + public Temperature modifyTarget(World world, EntityPlayer player, + Temperature temperature) { + int temperatureLevel = temperature.getRawValue(); + int newTemperatureLevel = temperatureLevel; + + debugger.start(Modifier.SPRINTING_TARGET, newTemperatureLevel); + + if (player.isSprinting()) { + newTemperatureLevel += SPRINTING_TARGET_MODIFIER; + } + + debugger.end(newTemperatureLevel); + + return new Temperature(newTemperatureLevel); + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/SeasonModifier.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/SeasonModifier.java new file mode 100644 index 00000000..5d998ea8 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/SeasonModifier.java @@ -0,0 +1,187 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.temperature.modifier; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import toughasnails.api.config.SyncedConfig; +import toughasnails.api.season.Season.SubSeason; +import toughasnails.api.season.SeasonHelper; +import toughasnails.api.temperature.Temperature; +import toughasnails.api.config.GameplayOption; +import toughasnails.temperature.TemperatureDebugger; +import toughasnails.temperature.TemperatureDebugger.Modifier; +import toughasnails.temperature.TemperatureTrend; + +public class SeasonModifier extends TemperatureModifier { + + public final int EARLY_AUTUMN_MODIFIER; + public final int MID_AUTUMN_MODIFIER; + public final int LATE_AUTUMN_MODIFIER; + public final int EARLY_WINTER_MODIFIER; + public final int MID_WINTER_MODIFIER; + public final int LATE_WINTER_MODIFIER; + public final int EARLY_SPRING_MODIFIER; + public final int MID_SPRING_MODIFIER; + public final int LATE_SPRING_MODIFIER; + public final int EARLY_SUMMER_MODIFIER; + public final int MID_SUMMER_MODIFIER; + public final int LATE_SUMMER_MODIFIER; + + public SeasonModifier(TemperatureDebugger debugger) { + super(debugger); + this.EARLY_AUTUMN_MODIFIER = SyncedConfig + .getIntegerValue(GameplayOption.EARLY_AUTUMN_MODIFIER); + this.MID_AUTUMN_MODIFIER = SyncedConfig + .getIntegerValue(GameplayOption.MID_AUTUMN_MODIFIER); + this.LATE_AUTUMN_MODIFIER = SyncedConfig + .getIntegerValue(GameplayOption.LATE_AUTUMN_MODIFIER); + + this.EARLY_WINTER_MODIFIER = SyncedConfig + .getIntegerValue(GameplayOption.EARLY_WINTER_MODIFIER); + this.MID_WINTER_MODIFIER = SyncedConfig + .getIntegerValue(GameplayOption.MID_WINTER_MODIFIER); + this.LATE_WINTER_MODIFIER = SyncedConfig + .getIntegerValue(GameplayOption.LATE_WINTER_MODIFIER); + + this.EARLY_SPRING_MODIFIER = SyncedConfig + .getIntegerValue(GameplayOption.EARLY_SPRING_MODIFIER); + this.MID_SPRING_MODIFIER = SyncedConfig + .getIntegerValue(GameplayOption.MID_SPRING_MODIFIER); + this.LATE_SPRING_MODIFIER = SyncedConfig + .getIntegerValue(GameplayOption.LATE_SPRING_MODIFIER); + + this.EARLY_SUMMER_MODIFIER = SyncedConfig + .getIntegerValue(GameplayOption.EARLY_SUMMER_MODIFIER); + this.MID_SUMMER_MODIFIER = SyncedConfig + .getIntegerValue(GameplayOption.MID_SUMMER_MODIFIER); + this.LATE_SUMMER_MODIFIER = SyncedConfig + .getIntegerValue(GameplayOption.LATE_SUMMER_MODIFIER); + } + + @Override + public int modifyChangeRate(World world, EntityPlayer player, + int changeRate, TemperatureTrend trend) { + return changeRate; + } + + @Override + public Temperature modifyTarget(World world, EntityPlayer player, + Temperature temperature) { + int temperatureLevel = temperature.getRawValue(); + SubSeason season = SeasonHelper.getSeasonData(world).getSubSeason(); + + if (!(SyncedConfig.getBooleanValue(GameplayOption.ENABLE_SEASONS))) { + season = SubSeason.MID_SUMMER; + } + + debugger.start(Modifier.SEASON_TARGET, temperatureLevel); + + if (world.provider.isSurfaceWorld()) { + switch (season) { + case EARLY_AUTUMN: + temperatureLevel += this.EARLY_AUTUMN_MODIFIER; + break; + case MID_AUTUMN: + temperatureLevel += this.MID_AUTUMN_MODIFIER; + break; + case LATE_AUTUMN: + temperatureLevel += this.LATE_AUTUMN_MODIFIER; + break; + case EARLY_WINTER: + temperatureLevel += this.EARLY_WINTER_MODIFIER; + break; + case MID_WINTER: + temperatureLevel += this.MID_WINTER_MODIFIER; + break; + case LATE_WINTER: + temperatureLevel += this.LATE_WINTER_MODIFIER; + break; + case EARLY_SPRING: + temperatureLevel += this.EARLY_SPRING_MODIFIER; + break; + case MID_SPRING: + temperatureLevel += this.MID_SPRING_MODIFIER; + break; + case LATE_SPRING: + temperatureLevel += this.LATE_SPRING_MODIFIER; + break; + case EARLY_SUMMER: + temperatureLevel += this.EARLY_SUMMER_MODIFIER; + break; + case MID_SUMMER: + temperatureLevel += this.MID_SUMMER_MODIFIER; + break; + case LATE_SUMMER: + temperatureLevel += this.LATE_SUMMER_MODIFIER; + break; + default: + break; + } + } + debugger.end(temperatureLevel); + + return new Temperature(temperatureLevel); + } + + public Temperature modifyTarget(World world, BlockPos position, + Temperature temperature) { + int temperatureLevel = temperature.getRawValue(); + SubSeason season = SeasonHelper.getSeasonData(world).getSubSeason(); + + if (!(SyncedConfig.getBooleanValue(GameplayOption.ENABLE_SEASONS))) { + season = SubSeason.MID_SUMMER; + } + + if (world.provider.isSurfaceWorld()) { + switch (season) { + case EARLY_AUTUMN: + temperatureLevel += this.EARLY_AUTUMN_MODIFIER; + break; + case MID_AUTUMN: + temperatureLevel += this.MID_AUTUMN_MODIFIER; + break; + case LATE_AUTUMN: + temperatureLevel += this.LATE_AUTUMN_MODIFIER; + break; + case EARLY_WINTER: + temperatureLevel += this.EARLY_WINTER_MODIFIER; + break; + case MID_WINTER: + temperatureLevel += this.MID_WINTER_MODIFIER; + break; + case LATE_WINTER: + temperatureLevel += this.LATE_WINTER_MODIFIER; + break; + case EARLY_SPRING: + temperatureLevel += this.EARLY_SPRING_MODIFIER; + break; + case MID_SPRING: + temperatureLevel += this.MID_SPRING_MODIFIER; + break; + case LATE_SPRING: + temperatureLevel += this.LATE_SPRING_MODIFIER; + break; + case EARLY_SUMMER: + temperatureLevel += this.EARLY_SUMMER_MODIFIER; + break; + case MID_SUMMER: + temperatureLevel += this.MID_SUMMER_MODIFIER; + break; + case LATE_SUMMER: + temperatureLevel += this.LATE_SUMMER_MODIFIER; + break; + default: + break; + } + } + + return new Temperature(temperatureLevel); + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/TemperatureModifier.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/TemperatureModifier.java new file mode 100644 index 00000000..ab43a732 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/TemperatureModifier.java @@ -0,0 +1,87 @@ +package toughasnails.temperature.modifier; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraftforge.common.util.INBTSerializable; +import toughasnails.api.temperature.Temperature; +import toughasnails.temperature.TemperatureDebugger; +import toughasnails.temperature.TemperatureTrend; + +public abstract class TemperatureModifier +{ + protected final TemperatureDebugger debugger; + + protected TemperatureModifier(TemperatureDebugger debugger) + { + this.debugger = debugger; + } + + public abstract int modifyChangeRate(World world, EntityPlayer player, int changeRate, TemperatureTrend trend); + public abstract Temperature modifyTarget(World world, EntityPlayer player, Temperature temperature); + + public static class ExternalModifier implements INBTSerializable + { + private String name; + private int amount; + private int rate; + private int endTime; + + public ExternalModifier() {} + + public ExternalModifier(String name, int amount, int rate, int endTime) + { + this.name = name; + this.amount = amount; + this.rate = rate; + this.endTime = endTime; + } + + public String getName() + { + return this.name; + } + + public int getAmount() + { + return this.amount; + } + + public int getRate() + { + return this.rate; + } + + public int getEndTime() + { + return this.endTime; + } + + public void setEndTime(int time) + { + this.endTime = time; + } + + @Override + public NBTTagCompound serializeNBT() + { + NBTTagCompound compound = new NBTTagCompound(); + + compound.setString("Name", this.name); + compound.setInteger("Amount", this.amount); + compound.setInteger("Rate", this.rate); + compound.setInteger("EndTime", this.endTime); + + return compound; + } + + @Override + public void deserializeNBT(NBTTagCompound nbt) + { + this.name = nbt.getString("Name"); + this.amount = nbt.getInteger("Amount"); + this.rate = nbt.getInteger("Rate"); + this.endTime = nbt.getInteger("EndTime"); + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/TimeModifier.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/TimeModifier.java new file mode 100644 index 00000000..2572f697 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/TimeModifier.java @@ -0,0 +1,86 @@ +package toughasnails.temperature.modifier; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; +import toughasnails.api.config.GameplayOption; +import toughasnails.api.config.SyncedConfig; +import toughasnails.api.temperature.Temperature; +import toughasnails.temperature.TemperatureDebugger; +import toughasnails.temperature.TemperatureDebugger.Modifier; +import toughasnails.temperature.TemperatureTrend; +import toughasnails.util.BiomeUtils; + +public class TimeModifier extends TemperatureModifier { + public final int TIME_TARGET_MODIFIER; + + /** + * Multiplies how much should the temperature be increased/decreased by the + * closer the biome temp is to a extreme hot or cold + */ + public final float EXTREMITY_MULTIPLIER; + + public TimeModifier(TemperatureDebugger debugger) { + super(debugger); + this.TIME_TARGET_MODIFIER = SyncedConfig + .getIntegerValue(GameplayOption.TIME_TEMP_MODIFIER); + this.EXTREMITY_MULTIPLIER = SyncedConfig + .getFloatValue(GameplayOption.TIME_EXTREMITY_MODIFIER); + } + + @Override + public int modifyChangeRate(World world, EntityPlayer player, + int changeRate, TemperatureTrend trend) { + return changeRate; + } + + @Override + public Temperature modifyTarget(World world, EntityPlayer player, + Temperature temperature) { + Biome biome = world.getBiome(player.getPosition()); + long worldTime = world.getWorldTime(); + + float extremityModifier = BiomeUtils.getBiomeTempExtremity(biome); + // Reaches the highest point during the middle of the day and at + // midnight. Normalized to be between -1 and 1 + float timeNorm = (-Math.abs(((worldTime + 6000) % 24000.0F) - 12000.0F) + + 6000.0F) / 6000.0F; + + int temperatureLevel = temperature.getRawValue(); + int newTemperatureLevel = temperatureLevel; + + debugger.start(Modifier.TIME_TARGET, newTemperatureLevel); + + if (world.provider.isSurfaceWorld()) { + newTemperatureLevel += TIME_TARGET_MODIFIER * timeNorm * (Math + .max(1.0F, extremityModifier * EXTREMITY_MULTIPLIER)); + } + + debugger.end(newTemperatureLevel); + + return new Temperature(newTemperatureLevel); + } + + public Temperature modifyTarget(World world, BlockPos position, + Temperature temperature) { + Biome biome = world.getBiome(position); + long worldTime = world.getWorldTime(); + + float extremityModifier = BiomeUtils.getBiomeTempExtremity(biome); + // Reaches the highest point during the middle of the day and at + // midnight. Normalized to be between -1 and 1 + float timeNorm = (-Math.abs(((worldTime + 6000) % 24000.0F) - 12000.0F) + + 6000.0F) / 6000.0F; + + int temperatureLevel = temperature.getRawValue(); + int newTemperatureLevel = temperatureLevel; + + if (world.provider.isSurfaceWorld()) { + newTemperatureLevel += TIME_TARGET_MODIFIER * timeNorm * (Math + .max(1.0F, extremityModifier * EXTREMITY_MULTIPLIER)); + } + + return new Temperature(newTemperatureLevel); + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/WeatherModifier.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/WeatherModifier.java new file mode 100644 index 00000000..3d78c1d0 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/temperature/modifier/WeatherModifier.java @@ -0,0 +1,83 @@ +package toughasnails.temperature.modifier; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; +import toughasnails.api.config.GameplayOption; +import toughasnails.api.config.SyncedConfig; +import toughasnails.api.temperature.Temperature; +import toughasnails.temperature.TemperatureDebugger; +import toughasnails.temperature.TemperatureDebugger.Modifier; +import toughasnails.temperature.TemperatureTrend; + +public class WeatherModifier extends TemperatureModifier { + public static final int WET_RATE_MODIFIER = -750; + public final int WET_TARGET_MODIFIER; + public final int SNOW_TARGET_MODIFIER; + + public WeatherModifier(TemperatureDebugger debugger) { + super(debugger); + this.WET_TARGET_MODIFIER = SyncedConfig + .getIntegerValue(GameplayOption.WET_TEMP_MODIFIER); + this.SNOW_TARGET_MODIFIER = SyncedConfig + .getIntegerValue(GameplayOption.SNOW_TEMP_MODIFIER); + } + + @Override + public int modifyChangeRate(World world, EntityPlayer player, + int changeRate, TemperatureTrend trend) { + int newChangeRate = changeRate; + + debugger.start(Modifier.WET_RATE, changeRate); + + if (player.isWet()) { + newChangeRate += WET_RATE_MODIFIER; + } + + debugger.end(newChangeRate); + + return newChangeRate; + } + + @Override + public Temperature modifyTarget(World world, EntityPlayer player, + Temperature temperature) { + int temperatureLevel = temperature.getRawValue(); + int newTemperatureLevel = temperatureLevel; + + BlockPos playerPos = player.getPosition(); + + if (player.isWet()) { + debugger.start(Modifier.WET_TARGET, newTemperatureLevel); + newTemperatureLevel += WET_TARGET_MODIFIER; + debugger.end(newTemperatureLevel); + } else if (world.isRaining() && world.canSeeSky(playerPos) + && world.getBiome(playerPos).getEnableSnow()) { + debugger.start(Modifier.SNOW_TARGET, newTemperatureLevel); + newTemperatureLevel += SNOW_TARGET_MODIFIER; + debugger.end(newTemperatureLevel); + } + + return new Temperature(newTemperatureLevel); + } + + public Temperature modifyTarget(World world, BlockPos position, + Temperature temperature) { + int temperatureLevel = temperature.getRawValue(); + int newTemperatureLevel = temperatureLevel; + boolean rainChill = SyncedConfig + .getBooleanValue(GameplayOption.RAIN_CHILL); + + if (world.isRaining() && world.canSeeSky(position)) { + Biome biome = world.getBiome(position); + if (biome.getEnableSnow()) { + newTemperatureLevel += SNOW_TARGET_MODIFIER; + } else if (biome.canRain() && rainChill) { + newTemperatureLevel += WET_TARGET_MODIFIER; + } + } + + return new Temperature(newTemperatureLevel); + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/thirst/ThirstHandler.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/thirst/ThirstHandler.java new file mode 100644 index 00000000..5bfb6842 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/thirst/ThirstHandler.java @@ -0,0 +1,215 @@ +package toughasnails.thirst; + +import javax.vecmath.Vector3d; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.DamageSource; +import net.minecraft.world.EnumDifficulty; +import net.minecraft.world.World; +import net.minecraftforge.fml.common.gameevent.TickEvent.Phase; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import toughasnails.api.config.SyncedConfig; +import toughasnails.api.TANCapabilities; +import toughasnails.api.stat.StatHandlerBase; +import toughasnails.api.stat.capability.IThirst; +import toughasnails.api.config.GameplayOption; +import toughasnails.network.message.MessageUpdateStat; + +public class ThirstHandler extends StatHandlerBase implements IThirst +{ + private int thirstLevel; + private int prevThirstLevel; + private float thirstHydrationLevel; + private float thirstExhaustionLevel; + + /**Used to time the seconds passed since thirst damage was last dealt to the player*/ + private int thirstTimer; + + private Vector3d movementVec; + + public ThirstHandler() + { + this.thirstLevel = 20; + this.thirstHydrationLevel = 5.0F; + } + + @Override + public void update(EntityPlayer player, World world, Phase phase) + { + if (SyncedConfig.getBooleanValue(GameplayOption.ENABLE_THIRST)) + { + if (phase == Phase.START) + { + if (movementVec != null) + { + Vector3d movement = new Vector3d(player.posX, player.posY, player.posZ); + movement.sub(movementVec); movement.absolute(); + int distance = (int)Math.round(movement.length() * 100.0F); + + if (distance > 0) applyMovementExhaustion(player, distance); + } + } + else if (phase == Phase.END) + { + this.movementVec = new Vector3d(player.posX, player.posY, player.posZ); + + EnumDifficulty enumdifficulty = world.getDifficulty(); + + if (this.thirstExhaustionLevel > 4.0F) + { + this.thirstExhaustionLevel -= 4.0F; + + if (this.thirstHydrationLevel > 0.0F) + { + this.thirstHydrationLevel = Math.max(this.thirstHydrationLevel - 1.0F, 0.0F); + } + else if (enumdifficulty != EnumDifficulty.PEACEFUL) + { + this.thirstLevel = Math.max(this.thirstLevel - 1, 0); + } + } + + if (this.thirstLevel <= 0) + { + ++this.thirstTimer; + + //Inflict thirst damage every 4 seconds + if (this.thirstTimer >= 80) + { + if (player.getHealth() > 10.0F || enumdifficulty == EnumDifficulty.HARD || player.getHealth() > 1.0F && enumdifficulty == EnumDifficulty.NORMAL) + { + player.attackEntityFrom(DamageSource.starve, 1.0F); + } + + this.thirstTimer = 0; + } + } + else + { + this.thirstTimer = 0; + } + + //If thirst is too low, prevent the player from sprinting + if (!player.capabilities.isCreativeMode && player.isSprinting() && thirstLevel <= 6) + { + player.setSprinting(false); + } + } + } + } + + private void applyMovementExhaustion(EntityPlayer player, int distance) + { + if (player.isInsideOfMaterial(Material.WATER)) + { + this.addExhaustion(0.015F * (float)distance * 0.01F); + } + else if (player.isInWater()) + { + this.addExhaustion(0.015F * (float)distance * 0.01F); + } + else if (player.onGround) + { + if (player.isSprinting()) + { + this.addExhaustion(0.099999994F * (float)distance * 0.01F); + } + else + { + this.addExhaustion(0.01F * (float)distance * 0.01F); + } + } + } + + @Override + public boolean hasChanged() + { + return this.prevThirstLevel != this.thirstLevel; + } + + @Override + public void onSendClientUpdate() + { + this.prevThirstLevel = this.thirstLevel; + } + + @Override + public IMessage createUpdateMessage() + { + NBTTagCompound data = (NBTTagCompound)TANCapabilities.THIRST.getStorage().writeNBT(TANCapabilities.THIRST, this, null); + return new MessageUpdateStat(TANCapabilities.THIRST, data); + } + + @Override + public void setThirst(int thirst) + { + this.thirstLevel = thirst; + } + + @Override + public void setHydration(float hydration) + { + this.thirstHydrationLevel = hydration; + } + + @Override + public void setExhaustion(float exhaustion) + { + this.thirstExhaustionLevel = exhaustion; + } + + @Override + public int getThirst() + { + return this.thirstLevel; + } + + @Override + public float getHydration() + { + return this.thirstHydrationLevel; + } + + @Override + public float getExhaustion() + { + return this.thirstExhaustionLevel; + } + + @Override + public void setChangeTime(int ticks) + { + this.thirstTimer = ticks; + } + + @Override + public int getChangeTime() + { + return this.thirstTimer; + } + + @Override + public void addStats(int thirst, float hydration) + { + if (SyncedConfig.getBooleanValue(GameplayOption.ENABLE_THIRST)) + { + this.thirstLevel = Math.min(thirst + this.thirstLevel, 20); + this.thirstHydrationLevel = Math.min(this.thirstHydrationLevel + (float)thirst * hydration * 2.0F, (float)this.thirstLevel); + } + } + + public void addExhaustion(float amount) + { + if (SyncedConfig.getBooleanValue(GameplayOption.ENABLE_THIRST)) + { + this.thirstExhaustionLevel = Math.min(this.thirstExhaustionLevel + amount, 40.0F); + } + } + + public boolean isThirsty() + { + return this.thirstLevel < 20; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/thirst/ThirstStorage.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/thirst/ThirstStorage.java new file mode 100644 index 00000000..a51585e6 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/thirst/ThirstStorage.java @@ -0,0 +1,49 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.thirst; + +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.Capability.IStorage; +import toughasnails.api.stat.capability.IThirst; + +public class ThirstStorage implements IStorage +{ + @Override + public NBTBase writeNBT(Capability capability, IThirst instance, EnumFacing side) + { + NBTTagCompound compound = new NBTTagCompound(); + + compound.setInteger("thirstLevel", instance.getThirst()); + compound.setInteger("thirstTimer", instance.getChangeTime()); + compound.setFloat("thirstHydrationLevel", instance.getHydration()); + compound.setFloat("thirstExhaustionLevel", instance.getExhaustion()); + + return compound; + } + + @Override + public void readNBT(Capability capability, IThirst instance, EnumFacing side, NBTBase nbt) + { + if (!(nbt instanceof NBTTagCompound)) throw new IllegalArgumentException("Thirst must be read from an NBTTagCompound!"); + + NBTTagCompound compound = (NBTTagCompound)nbt; + + if (compound.hasKey("thirstLevel")) + { + instance.setThirst(compound.getInteger("thirstLevel")); + instance.setHydration(compound.getInteger("thirstHydrationLevel")); + instance.setExhaustion(compound.getInteger("thirstExhaustionLevel")); + instance.setChangeTime(compound.getInteger("thirstTimer")); + } + + } +} + diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/tileentity/TileEntitySeasonSensor.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/tileentity/TileEntitySeasonSensor.java new file mode 100644 index 00000000..325e1d9a --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/tileentity/TileEntitySeasonSensor.java @@ -0,0 +1,23 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.tileentity; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ITickable; +import toughasnails.api.season.SeasonHelper; +import toughasnails.block.BlockSeasonSensor; + +public class TileEntitySeasonSensor extends TileEntity implements ITickable { + @Override + public void update() { + if (this.worldObj != null && !this.worldObj.isRemote + && SeasonHelper.getSeasonData(this.worldObj).getSeasonCycleTicks() % 20L == 0L) { + ((BlockSeasonSensor) this.getBlockType()).updatePower(this.worldObj, this.pos); + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/tileentity/TileEntityTemperatureSpread.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/tileentity/TileEntityTemperatureSpread.java new file mode 100644 index 00000000..959385f3 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/tileentity/TileEntityTemperatureSpread.java @@ -0,0 +1,379 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.tileentity; + +import java.util.Set; + +import com.google.common.base.Predicate; +import com.google.common.collect.Sets; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.projectile.EntitySmallFireball; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTUtil; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.ITickable; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import toughasnails.api.TANCapabilities; +import toughasnails.api.season.IDecayableCrop; +import toughasnails.api.stat.capability.ITemperature; +import toughasnails.api.temperature.ITemperatureRegulator; +import toughasnails.api.temperature.Temperature; + +public class TileEntityTemperatureSpread extends TileEntity implements ITickable, ITemperatureRegulator { + public static final int MAX_SPREAD_DISTANCE = 50; + public static final int RATE_MODIFIER = -500; + public static final boolean ENABLE_DEBUG = false; + + private Set spawnedEntities; + + private Set[] filledPositions; + private Set obstructedPositions; + + private int updateTicks; + private int temperatureModifier; + + private AxisAlignedBB maxSpreadBox; + + @SuppressWarnings("unchecked") + public TileEntityTemperatureSpread() { + // Initialize sets for all strengths + this.filledPositions = new Set[MAX_SPREAD_DISTANCE + 1]; + for (int i = 0; i < MAX_SPREAD_DISTANCE + 1; i++) { + this.filledPositions[i] = Sets.newConcurrentHashSet(); + } + this.obstructedPositions = Sets.newConcurrentHashSet(); + + if (ENABLE_DEBUG) + this.spawnedEntities = Sets.newHashSet(); + } + + public TileEntityTemperatureSpread(int temperatureModifier) { + this(); + + this.temperatureModifier = temperatureModifier; + } + + // TODO: Stagger updates if necessary, so verification occurs slower away + // from the base position + // Doesn't really seem necessary at the moment, it appears to be fast enough + @Override + public void update() { + World world = this.getWorld(); + + // Verify every second + if (++updateTicks % 20 == 0) { + // Ensure there has been no changes since last time + if (!verify()) { + // Refill again + fill(); + } + + // When first placed, this may be null because it hasn't been + // created when read from NBT + if (this.maxSpreadBox == null) { + this.maxSpreadBox = new AxisAlignedBB(this.pos.getX() - MAX_SPREAD_DISTANCE, + this.pos.getY() - MAX_SPREAD_DISTANCE, this.pos.getZ() - MAX_SPREAD_DISTANCE, + this.pos.getX() + MAX_SPREAD_DISTANCE, this.pos.getY() + MAX_SPREAD_DISTANCE, + this.pos.getZ() + MAX_SPREAD_DISTANCE); + } + + // Iterate over all nearby players + for (EntityPlayer player : world.getEntitiesWithinAABB(EntityPlayer.class, this.maxSpreadBox)) { + BlockPos delta = player.getPosition().subtract(this.getPos()); + int distance = Math.abs(delta.getX()) + Math.abs(delta.getY()) + Math.abs(delta.getZ()); + boolean collided = false; + + // Check if the player collides with any of the filled + // positions. + // Player must be in a strength equal to or less than the + // distance they are away from the coil + outer: for (int i = MAX_SPREAD_DISTANCE - distance; i >= 0; i--) { + for (BlockPos pos : this.filledPositions[i]) { + // If a collision is found, stop looking + if (player.getEntityBoundingBox().intersects(pos.getX(), pos.getY(), pos.getZ(), + pos.getX() + 1D, pos.getY() + 1D, pos.getZ() + 1D)) { + collided = true; + break outer; + } + } + } + + // Apply temperature modifier if collided + if (collided) { + ITemperature temperature = player.getCapability(TANCapabilities.TEMPERATURE, null); + + // Apply modifier for 5 seconds + temperature.applyModifier("Climatisation", this.temperatureModifier, RATE_MODIFIER, 5 * 20); + } + } + + if (ENABLE_DEBUG) { + // There is a mismatch between the filled positions and the + // spawned entities, repopulate spawned entities + // If this is active, there should at least be a position in the + // set for the max spread distance + if (!world.isRemote && spawnedEntities.isEmpty() + && !this.filledPositions[MAX_SPREAD_DISTANCE].isEmpty()) { + for (int strength = 0; strength <= MAX_SPREAD_DISTANCE; strength++) { + for (BlockPos pos : this.filledPositions[strength]) { + final AxisAlignedBB boundingBox = new AxisAlignedBB(pos.getX(), pos.getY(), pos.getZ(), + pos.getX() + 1.0D, pos.getY() + 1.0D, pos.getZ() + 1.0D); + + Predicate predicate = new Predicate() { + @Override + public boolean apply(EntitySmallFireball input) { + // Check intersections with this entity a + // little bit over 1x1x1, because it seemed + // the outer layer of fireballs wasn't + // included otherwise + BlockPos pos = input.getPosition(); + return boundingBox.intersects(pos.getX() - 0.1D, pos.getY() - 0.1D, + pos.getZ() - 0.1D, pos.getX() + 1.1D, pos.getY() + 1.1D, pos.getZ() + 1.1D); + } + }; + + // Fireballs don't have a bounding box so we can't + // use getEntitiesWithinAABB (which really stinks!) + spawnedEntities.addAll(this.getWorld().getEntities(EntitySmallFireball.class, predicate)); + } + } + } + } + } + } + + public void reset() { + if (ENABLE_DEBUG) { + for (Entity entity : this.spawnedEntities) { + entity.setDead(); + } + this.spawnedEntities.clear(); + } + + // Clear set of current positions + for (Set set : this.filledPositions) { + set.clear(); + } + this.obstructedPositions.clear(); + } + + public void fill() { + reset(); + + // Add blocks around the temperature modifier block to the queue + for (EnumFacing facing : EnumFacing.values()) { + BlockPos offsetPos = pos.offset(facing); + + // Only attempt to update tracking for this position if there is air + // here. + // Even positions already being tracked should be filled with air. + if (this.canFill(offsetPos)) + this.filledPositions[MAX_SPREAD_DISTANCE].add(offsetPos); + } + + runStage(MAX_SPREAD_DISTANCE - 1); + + if (ENABLE_DEBUG) { + for (Set trackedPositions : this.filledPositions) { + for (BlockPos trackedPosition : trackedPositions) { + if (trackedPosition != null) { + BlockPos pos = trackedPosition; + EntitySmallFireball fireball = new EntitySmallFireball(getWorld(), (double) pos.getX() + 0.5D, + (double) pos.getY() + 0.5D, (double) pos.getZ() + 0.5D, 0.0D, 0.0D, 0.0D); + this.spawnedEntities.add(fireball); + this.getWorld().spawnEntityInWorld(fireball); + } + } + } + } + } + + private void runStage(int strength) { + // Don't spread if strength is 0 (or somehow less) + if (strength > 0) { + // Populate queue for next stage + for (BlockPos trackedPosition : this.filledPositions[strength + 1]) { + BlockPos pos = trackedPosition; + spreadAroundPos(pos, strength); + } + + // Next stage should have less strength than this + runStage(strength - 1); + } + } + + /** + * Begins tracking this position or updates its strength. Returns true if + * changed from before + **/ + private void setTrackedStrength(BlockPos pos, int strength) { + // Only attempt to update tracking for this position if there is air + // here. + // Even positions already being tracked should be filled with air. + if (this.canFill(pos)) { + this.filledPositions[strength].add(pos); + } else { + this.obstructedPositions.add(pos); + } + } + + /** + * Strength is the strength of the initial pos, not what it will spread to + * its surroundings + */ + private void spreadAroundPos(BlockPos pos, int strength) { + for (EnumFacing facing : EnumFacing.values()) { + BlockPos offsetPos = pos.offset(facing); + + // Don't set if the tracked positions already contains this position + if (this.filledPositions[strength + 1].contains(offsetPos)) { + continue; + } + + // Set suitable adjacent positions as tracked + setTrackedStrength(offsetPos, strength); + } + } + + /** Returns true if verified, false if regen is required */ + public boolean verify() { + for (Set trackedPositions : this.filledPositions) { + for (BlockPos pos : trackedPositions) { + if (!this.canFill(pos)) + return false; + } + } + + for (BlockPos pos : this.obstructedPositions) { + if (this.canFill(pos)) + return false; + } + + return true; + } + + private boolean canFill(BlockPos pos) { + // Only spread within enclosed areas, significantly reduces the impact + // on performance and suits the purpose of coils + return !this.getWorld().isBlockFullCube(pos) && (!this.getWorld().canSeeSky(pos) + || this.getWorld().getBlockState(pos).getBlock() instanceof IDecayableCrop); + } + + @Override + public void readFromNBT(NBTTagCompound compound) { + super.readFromNBT(compound); + + // After pos has been read + this.maxSpreadBox = new AxisAlignedBB(this.pos.getX() - MAX_SPREAD_DISTANCE, + this.pos.getY() - MAX_SPREAD_DISTANCE, this.pos.getZ() - MAX_SPREAD_DISTANCE, + this.pos.getX() + MAX_SPREAD_DISTANCE, this.pos.getY() + MAX_SPREAD_DISTANCE, + this.pos.getZ() + MAX_SPREAD_DISTANCE); + + if (compound.hasKey("FilledPositions")) { + this.temperatureModifier = compound.getInteger("TemperatureModifier"); + + NBTTagCompound filledCompound = compound.getCompoundTag("FilledPositions"); + + for (int strength = 0; strength <= MAX_SPREAD_DISTANCE; strength++) { + if (!filledCompound.hasKey("Strength" + strength)) + throw new IllegalArgumentException( + "Compound missing strength sub-compound Strength" + strength + "!"); + + NBTTagCompound strengthCompound = filledCompound.getCompoundTag("Strength" + strength); + this.filledPositions[strength] = readPosSet(strengthCompound); + } + this.spawnedEntities = Sets.newConcurrentHashSet(); // Recreate + // spawned + // entities set + // and + // repopulate + // later + + NBTTagCompound obstructedCompound = compound.getCompoundTag("ObstructedPositions"); + this.obstructedPositions = readPosSet(obstructedCompound); + } + } + + @Override + public NBTTagCompound writeToNBT(NBTTagCompound compound) { + super.writeToNBT(compound); + + NBTTagCompound filledCompound = new NBTTagCompound(); + + compound.setInteger("TemperatureModifier", this.temperatureModifier); + + for (int i = 0; i <= MAX_SPREAD_DISTANCE; i++) { + NBTTagCompound strengthCompound = new NBTTagCompound(); + writePosSet(strengthCompound, this.filledPositions[i]); + filledCompound.setTag("Strength" + i, strengthCompound); + } + compound.setTag("FilledPositions", filledCompound); + + NBTTagCompound obstructedCompound = new NBTTagCompound(); + writePosSet(obstructedCompound, this.obstructedPositions); + compound.setTag("ObstructedPositions", obstructedCompound); + + return compound; + } + + @Override + public boolean shouldRefresh(World world, BlockPos pos, IBlockState oldState, IBlockState newSate) { + // This should function as it does in Vanilla, using Forges setup + // appears to break fireball spawning when the state is changed + return oldState.getBlock() != newSate.getBlock(); + } + + private void writePosSet(NBTTagCompound compound, Set posSet) { + compound.setInteger("Count", posSet.size()); + + int index = 0; + + for (BlockPos pos : posSet) { + compound.setTag("Pos" + index, NBTUtil.createPosTag(pos)); + index++; + } + } + + private Set readPosSet(NBTTagCompound compound) { + if (!compound.hasKey("Count")) + throw new IllegalArgumentException("Compound is not a valid pos set"); + + int count = compound.getInteger("Count"); + Set posSet = Sets.newConcurrentHashSet(); + + for (int i = 0; i < count; i++) { + BlockPos pos = NBTUtil.getPosFromTag(compound.getCompoundTag("Pos" + i)); + if (pos != null) + posSet.add(pos); + } + + return posSet; + } + + @Override + public Temperature getRegulatedTemperature() { + return new Temperature(this.temperatureModifier); + } + + @Override + public boolean isPosRegulated(BlockPos pos) { + for (int i = 0; i < MAX_SPREAD_DISTANCE; i++) { + Set regulatedPositions = this.filledPositions[i]; + if (regulatedPositions.contains(pos)) + return true; + } + + return false; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/BiomeUtils.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/BiomeUtils.java new file mode 100644 index 00000000..812b03b9 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/BiomeUtils.java @@ -0,0 +1,21 @@ +package toughasnails.util; + +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.biome.Biome; + +public class BiomeUtils { + /** + * Get biome temperature on a scale of 0 to 1, 0 freezing and 1 boiling hot + **/ + public static float getBiomeTempNorm(Biome biome) { + return MathHelper.clamp_float(biome.getTemperature(), 0.0F, 1.35F) / 1.35F; + } + + /** + * Get the biome temperature's level of extremity from 0 to 1, 0 least + * extreme and 1 most extreme + */ + public static float getBiomeTempExtremity(Biome biome) { + return Math.abs(getBiomeTempNorm(biome) * 2.0F - 1.0F); + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/BlockStateUtils.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/BlockStateUtils.java new file mode 100644 index 00000000..db4a6cf0 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/BlockStateUtils.java @@ -0,0 +1,128 @@ +package toughasnails.util; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map.Entry; +import java.util.Stack; + +import com.google.common.collect.ImmutableSet; + +import net.minecraft.block.Block; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.state.IBlockState; +import toughasnails.api.ITANBlock; + +public class BlockStateUtils { + + // utility function for dumping block state info to a string + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static String getStateInfoAsString(IBlockState state) { + String desc = state.getBlock().getClass().getName() + "["; + Iterator it = state.getProperties().entrySet().iterator(); + boolean first = true; + while (it.hasNext()) { + if (!first) { + desc = desc + ","; + } + Entry entry = (Entry) it.next(); + IProperty iproperty = (IProperty) entry.getKey(); + Comparable comparable = (Comparable) entry.getValue(); + desc = desc + iproperty.getName() + "=" + iproperty.getName(comparable); + first = false; + } + desc = desc + "]"; + return desc; + } + + // returns a set of states, one for every possible combination of values + // from the provided properties + @SuppressWarnings("rawtypes") + public static ImmutableSet getStatesSet(IBlockState baseState, IProperty... properties) { + Stack propStack = new Stack(); + List states = new ArrayList(); + for (IProperty prop : properties) { + propStack.push(prop); + } + if (!propStack.isEmpty()) { + addStatesToList(baseState, states, propStack); + } + ImmutableSet ret = ImmutableSet.copyOf(states); + return ret; + } + + // recursively add state values to a list + @SuppressWarnings({ "rawtypes", "unchecked" }) + private static void addStatesToList(IBlockState state, List list, Stack stack) { + if (stack.empty()) { + list.add(state); + return; + } else { + IProperty prop = stack.pop(); + for (Object value : prop.getAllowedValues()) { + addStatesToList(state.withProperty(prop, (Comparable) value), list, stack); + } + stack.push(prop); + } + } + + // return all of the different 'preset' variants of a block + // works by looping through all the different values of the properties + // specified in block.getPresetProperties() + // only works on blocks supporting IBOPBlock - returns an empty set for + // vanilla blocks + public static ImmutableSet getBlockPresets(Block block) { + if (!(block instanceof ITANBlock)) { + return ImmutableSet. of(); + } + IBlockState defaultState = block.getDefaultState(); + if (defaultState == null) { + defaultState = block.getBlockState().getBaseState(); + } + return getStatesSet(defaultState, ((ITANBlock) block).getPresetProperties()); + } + + /** + * Discards additional block information to retrieve a state equivalent to + * those in the inventory + **/ + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static IBlockState getPresetState(IBlockState state) { + IBlockState outState = state.getBlock().getDefaultState(); + + if (state.getBlock() instanceof ITANBlock) { + ITANBlock bopBlock = (ITANBlock) state.getBlock(); + + for (IProperty property : bopBlock.getPresetProperties()) { + outState = outState.withProperty(property, state.getValue(property)); + } + } + + return outState; + } + + @SuppressWarnings("rawtypes") + public static IProperty getPropertyByName(IBlockState blockState, String propertyName) { + for (IProperty property : (ImmutableSet>) blockState.getProperties().keySet()) { + if (property.getName().equals(propertyName)) + return property; + } + + return null; + } + + public static boolean isValidPropertyName(IBlockState blockState, String propertyName) { + return getPropertyByName(blockState, propertyName) != null; + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static Comparable getPropertyValueByName(IBlockState blockState, IProperty property, String valueName) { + for (Comparable value : (ImmutableSet) property.getAllowedValues()) { + if (value.toString().equals(valueName)) + return value; + } + + return null; + } + +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/MapUtils.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/MapUtils.java new file mode 100644 index 00000000..b11766f0 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/MapUtils.java @@ -0,0 +1,36 @@ +package toughasnails.util; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +public class MapUtils { + @SuppressWarnings("unchecked") + public static > Map sortMapByValue(Map map) { + List> list = new ArrayList>(map.size()); + list.addAll(map.entrySet()); + ValueComparator comparator = new ValueComparator(); + Collections.sort(list, comparator); + + Map result = new LinkedHashMap(); + for (@SuppressWarnings("rawtypes") + Iterator iterator = list.iterator(); iterator.hasNext();) { + Map.Entry entry = (Map.Entry) iterator.next(); + result.put(entry.getKey(), entry.getValue()); + } + + return result; + } + + private static class ValueComparator> implements Comparator> { + @Override + public int compare(Entry o1, Entry o2) { + return -o1.getValue().compareTo(o2.getValue()); + } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/PotionBrewingRecipe.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/PotionBrewingRecipe.java new file mode 100644 index 00000000..eefb961c --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/PotionBrewingRecipe.java @@ -0,0 +1,24 @@ +package toughasnails.util; + +import javax.annotation.Nonnull; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.brewing.BrewingRecipe; + +public class PotionBrewingRecipe extends BrewingRecipe +{ + + private ItemStack input; + + public PotionBrewingRecipe(ItemStack input, ItemStack ingredient, ItemStack output) + { + super(input, ingredient, output); + this.input = input; + } + + @Override + public boolean isInput(@Nonnull ItemStack stack) + { + return super.isInput(stack) && ItemStack.areItemStackTagsEqual(input, stack); + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/RenderUtils.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/RenderUtils.java new file mode 100644 index 00000000..2215e5c7 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/RenderUtils.java @@ -0,0 +1,24 @@ +package toughasnails.util; + +import org.lwjgl.opengl.GL11; + +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.VertexBuffer; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; + +public class RenderUtils +{ + public static void drawTexturedModalRect(int x, int y, int textureX, int textureY, int width, int height) + { + float f = 0.00390625F; + float f1 = 0.00390625F; + Tessellator tessellator = Tessellator.getInstance(); + VertexBuffer worldrenderer = tessellator.getBuffer(); + worldrenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); + worldrenderer.pos((double)(x + 0), (double)(y + height), 0.0D).tex((double)((float)(textureX + 0) * f), (double)((float)(textureY + height) * f1)).endVertex();; + worldrenderer.pos((double)(x + width), (double)(y + height), 0.0D).tex((double)((float)(textureX + width) * f), (double)((float)(textureY + height) * f1)).endVertex(); + worldrenderer.pos((double)(x + width), (double)(y + 0), 0.0D).tex((double)((float)(textureX + width) * f), (double)((float)(textureY + 0) * f1)).endVertex(); + worldrenderer.pos((double)(x + 0), (double)(y + 0), 0.0D).tex((double)((float)(textureX + 0) * f), (double)((float)(textureY + 0) * f1)).endVertex(); + tessellator.draw(); + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/SeasonColourUtil.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/SeasonColourUtil.java new file mode 100644 index 00000000..5dfd8e2c --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/SeasonColourUtil.java @@ -0,0 +1,94 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package toughasnails.util; + + +import org.lwjgl.util.Color; + +import toughasnails.api.config.SyncedConfig; +import toughasnails.api.season.Season.SubSeason; +import toughasnails.api.config.GameplayOption; + +public class SeasonColourUtil +{ + public static int multiplyColours(int colour1, int colour2) + { + //Convert each colour to a scale between 0 and 1 and multiply them + //Multiply by 255 to bring back between 0 and 255 + return (int)((colour1 / 255.0F) * (colour2 / 255.0F) * 255.0F); + } + + public static int overlayBlendChannel(int underColour, int overColour) + { + int retVal; + if (underColour < 128) + { + retVal = multiplyColours(2 * underColour, overColour); + } + else + { + retVal = multiplyColours(2 * (255 - underColour), 255 - overColour); + retVal = 255 - retVal; + } + return retVal; + } + + public static int overlayBlend(int underColour, int overColour) + { + int r = overlayBlendChannel((underColour >> 16) & 255, (overColour >> 16) & 255); + int g = overlayBlendChannel((underColour >> 8) & 255, (overColour >> 8) & 255); + int b = overlayBlendChannel(underColour & 255, overColour & 255); + + return (r & 255) << 16 | (g & 255) << 8 | (b & 255); + } + + public static int saturateColour(int colour, float saturationMultiplier) + { + Color newColour = getColourFromInt(colour); + float[] hsb = newColour.toHSB(null); + hsb[1] *= saturationMultiplier; + newColour.fromHSB(hsb[0], hsb[1], hsb[2]); + return getIntFromColour(newColour); + } + + public static int applySeasonalGrassColouring(SubSeason season, int originalColour) + { + int overlay = season.getGrassOverlay(); + float saturationMultiplier = season.getGrassSaturationMultiplier(); + if (!(SyncedConfig.getBooleanValue(GameplayOption.ENABLE_SEASONS))) + { + overlay = SubSeason.MID_SUMMER.getGrassOverlay(); + saturationMultiplier = SubSeason.MID_SUMMER.getGrassSaturationMultiplier(); + } + int newColour = overlay == 0xFFFFFF ? originalColour : overlayBlend(originalColour, overlay); + return saturationMultiplier != -1 ? saturateColour(newColour, saturationMultiplier) : newColour; + } + + public static int applySeasonalFoliageColouring(SubSeason season, int originalColour) + { + int overlay = season.getFoliageOverlay(); + float saturationMultiplier = season.getFoliageSaturationMultiplier(); + if (!(SyncedConfig.getBooleanValue(GameplayOption.ENABLE_SEASONS))) + { + overlay = SubSeason.MID_SUMMER.getFoliageOverlay(); + saturationMultiplier = SubSeason.MID_SUMMER.getFoliageSaturationMultiplier(); + } + int newColour = overlay == 0xFFFFFF ? originalColour : overlayBlend(originalColour, overlay); + return saturationMultiplier != -1 ? saturateColour(newColour, saturationMultiplier) : newColour; + } + + private static Color getColourFromInt(int colour) + { + return new Color((colour >> 16) & 255, (colour >> 8) & 255, colour & 255); + } + + private static int getIntFromColour(Color colour) + { + return (colour.getRed() & 255) << 16 | (colour.getGreen() & 255) << 8 | colour.getBlue() & 255; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/block/VariantPagingHelper.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/block/VariantPagingHelper.java new file mode 100644 index 00000000..285cd422 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/block/VariantPagingHelper.java @@ -0,0 +1,177 @@ +/******************************************************************************* + * Copyright 2014-2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ + +package toughasnails.util.block; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; + +import net.minecraft.block.Block; +import net.minecraft.block.properties.PropertyEnum; +import net.minecraft.block.state.IBlockState; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IStringSerializable; + +public class VariantPagingHelper & IStringSerializable & VariantPagingHelper.IPagedVariants> { + + public interface IPagedVariants { + + } + + public class PageIndex { + private int pageNum; + private int index; + + public PageIndex(int pageNum, int index) { + this.pageNum = pageNum; + this.index = index; + } + + public int getPageNum() { + return this.pageNum; + } + + public int getIndex() { + return this.index; + } + + @Override + public String toString() { + return "page:" + this.pageNum + " index:" + this.index; + } + } + + protected int variantsPerPage; + protected Class variantsEnumClass; + @SuppressWarnings("rawtypes") + protected Map pageNumToProperty = new HashMap(); + protected Map variantToPageIndex = new HashMap(); + protected Map masterIndexToVariant = new HashMap(); + protected Map pageNumToBlock = new HashMap(); + protected Map blockToPageNum = new HashMap(); + + public VariantPagingHelper(int variantsPerPage, Class variantsEnumClass) { + this(variantsPerPage, variantsEnumClass, Predicates. alwaysTrue()); + } + + @SuppressWarnings("unchecked") + public VariantPagingHelper(int variantsPerPage, Class variantsEnumClass, Predicate filter) { + + this.variantsPerPage = variantsPerPage; + this.variantsEnumClass = variantsEnumClass; + + Object[] variants = variantsEnumClass.getEnumConstants(); + if (variants == null) { + throw new IllegalArgumentException( + "Failed creating PagedBlock - variantsEnumClass has no enum constants - is it an enum class?"); + } + + ArrayList currentPage = new ArrayList(); + int currentPageNum = 0; + + for (Object obj : variants) { + V variant = (V) obj; + if (!filter.apply(variant)) { + continue; + } + currentPage.add(variant); + if (currentPage.size() == variantsPerPage) { + this.addVariantPage(currentPageNum, currentPage); + currentPage = new ArrayList(); + currentPageNum++; + } + } + if (!currentPage.isEmpty()) { + this.addVariantPage(currentPageNum, currentPage); + } + + } + + protected void addVariantPage(int pageNum, ArrayList variants) { + for (int index = 0; index < variants.size(); ++index) { + V variant = variants.get(index); + this.variantToPageIndex.put(variant, new PageIndex(pageNum, index)); + this.masterIndexToVariant.put(Integer.valueOf(pageNum * this.variantsPerPage + index), variant); + } + this.pageNumToProperty.put(Integer.valueOf(pageNum), + PropertyEnum.create("variant", this.variantsEnumClass, variants)); + } + + public void addBlock(int pageNum, B block) { + this.pageNumToBlock.put(pageNum, block); + this.blockToPageNum.put(block, pageNum); + } + + public int getVariantsPerPage() { + return this.variantsPerPage; + } + + public int getNumPages() { + return this.pageNumToProperty.size(); + } + + @SuppressWarnings("rawtypes") + public PropertyEnum getVariantProperty(int pageNum) { + return this.pageNumToProperty.get(pageNum); + } + + public int getIndex(V variant) { + return this.variantToPageIndex.get(variant).getIndex(); + } + + public int getPageNum(V variant) { + return this.variantToPageIndex.get(variant).getPageNum(); + } + + public int getPageNum(B block) { + return this.blockToPageNum.get(block); + } + + @SuppressWarnings("unchecked") + public V getVariant(int pageNum, int index) { + V value = this.masterIndexToVariant.get(pageNum * this.variantsPerPage + index); + + // Use the default value if we can't find one for this index + if (value == null) + value = (V) this.getBlock(pageNum).getDefaultState().getValue(this.getVariantProperty(pageNum)); + + return value; + } + + public V getVariant(B block, int index) { + return this.getVariant(this.getPageNum(block), index); + } + + public B getBlock(int pageNum) { + return this.pageNumToBlock.get(pageNum); + } + + public B getBlock(V variant) { + return this.pageNumToBlock.get(this.getPageNum(variant)); + } + + @SuppressWarnings("unchecked") + public IBlockState getVariantState(V variant) { + return this.getBlock(variant).getDefaultState().withProperty(this.getVariantProperty(this.getPageNum(variant)), + variant); + } + + public ItemStack getVariantItem(V variant) { + return this.getVariantItem(variant, 1); + } + + public ItemStack getVariantItem(V variant, int howMany) { + return new ItemStack(this.getBlock(variant), howMany, + this.getBlock(variant).getMetaFromState(this.getVariantState(variant))); + } + +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/inventory/CreativeTabTAN.java b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/inventory/CreativeTabTAN.java new file mode 100644 index 00000000..99ffb8e9 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/java/toughasnails/util/inventory/CreativeTabTAN.java @@ -0,0 +1,21 @@ +package toughasnails.util.inventory; + +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import toughasnails.api.item.TANItems; + +public class CreativeTabTAN extends CreativeTabs +{ + public static final CreativeTabs instance = new CreativeTabTAN(CreativeTabs.getNextID(), "tabToughAsNails"); + + private CreativeTabTAN(int index, String label) + { + super(index, label); + } + + @Override + public Item getTabIconItem() + { + return TANItems.tan_icon; + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/META-INF/toughasnails_at.cfg b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/META-INF/toughasnails_at.cfg new file mode 100644 index 00000000..fd8bfe10 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/META-INF/toughasnails_at.cfg @@ -0,0 +1,13 @@ +#Season colouring +public-f net.minecraft.world.biome.BiomeColorHelper field_180291_a #GRASS_COLOR +public-f net.minecraft.world.biome.BiomeColorHelper field_180289_b #FOLIAGE_COLOR +public net.minecraft.world.biome.BiomeColorHelper$ColorResolver + +#Seasonal melting +public net.minecraft.world.World field_73005_l #updateLCG +public net.minecraft.block.BlockIce func_185679_b(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;)V + +#Seasonal freezing +public net.minecraft.world.World func_175696_F(Lnet/minecraft/util/math/BlockPos;)Z #isWater + + diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/campfire.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/campfire.json new file mode 100644 index 00000000..95630ad0 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/campfire.json @@ -0,0 +1,36 @@ +{ + "variants": { + "age=0,burning=true": { "model": "toughasnails:campfire" }, + "age=1,burning=true": { "model": "toughasnails:campfire" }, + "age=2,burning=true": { "model": "toughasnails:campfire" }, + "age=3,burning=true": { "model": "toughasnails:campfire" }, + "age=4,burning=true": { "model": "toughasnails:campfire" }, + "age=5,burning=true": { "model": "toughasnails:campfire" }, + "age=6,burning=true": { "model": "toughasnails:campfire" }, + "age=7,burning=true": { "model": "toughasnails:campfire" }, + "age=8,burning=true": { "model": "toughasnails:campfire" }, + "age=9,burning=true": { "model": "toughasnails:campfire" }, + "age=10,burning=true": { "model": "toughasnails:campfire" }, + "age=11,burning=true": { "model": "toughasnails:campfire" }, + "age=12,burning=true": { "model": "toughasnails:campfire" }, + "age=13,burning=true": { "model": "toughasnails:campfire" }, + "age=14,burning=true": { "model": "toughasnails:campfire" }, + "age=15,burning=true": { "model": "toughasnails:campfire" }, + "age=0,burning=false": { "model": "toughasnails:campfire" }, + "age=1,burning=false": { "model": "toughasnails:campfire_out" }, + "age=2,burning=false": { "model": "toughasnails:campfire_out" }, + "age=3,burning=false": { "model": "toughasnails:campfire_out" }, + "age=4,burning=false": { "model": "toughasnails:campfire_out" }, + "age=5,burning=false": { "model": "toughasnails:campfire_out" }, + "age=6,burning=false": { "model": "toughasnails:campfire_out" }, + "age=7,burning=false": { "model": "toughasnails:campfire_out" }, + "age=8,burning=false": { "model": "toughasnails:campfire_out" }, + "age=9,burning=false": { "model": "toughasnails:campfire_out" }, + "age=10,burning=false": { "model": "toughasnails:campfire_out" }, + "age=11,burning=false": { "model": "toughasnails:campfire_out" }, + "age=12,burning=false": { "model": "toughasnails:campfire_out" }, + "age=13,burning=false": { "model": "toughasnails:campfire_out" }, + "age=14,burning=false": { "model": "toughasnails:campfire_out" }, + "age=15,burning=false": { "model": "toughasnails:campfire_out" } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/dead_crops.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/dead_crops.json new file mode 100644 index 00000000..fc91921c --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/dead_crops.json @@ -0,0 +1,5 @@ +{ + "variants": { + "normal": { "model": "toughasnails:dead_crops" } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/glowstone_torch.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/glowstone_torch.json new file mode 100644 index 00000000..9239dc0a --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/glowstone_torch.json @@ -0,0 +1,9 @@ +{ + "variants": { + "facing=up": { "model": "toughasnails:glowstone_torch" }, + "facing=east": { "model": "toughasnails:glowstone_torch_wall" }, + "facing=south": { "model": "toughasnails:glowstone_torch_wall", "y": 90 }, + "facing=west": { "model": "toughasnails:glowstone_torch_wall", "y": 180 }, + "facing=north": { "model": "toughasnails:glowstone_torch_wall", "y": 270 } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/rain_collector.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/rain_collector.json new file mode 100644 index 00000000..457e6039 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/rain_collector.json @@ -0,0 +1,8 @@ +{ + "variants": { + "level=0": { "model": "toughasnails:rain_collector_empty" }, + "level=1": { "model": "toughasnails:rain_collector_level1" }, + "level=2": { "model": "toughasnails:rain_collector_level2" }, + "level=3": { "model": "toughasnails:rain_collector_level3" } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/season_sensor_autumn.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/season_sensor_autumn.json new file mode 100644 index 00000000..d7c60ccf --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/season_sensor_autumn.json @@ -0,0 +1,5 @@ +{ + "variants": { + "normal": { "model": "toughasnails:season_sensor_autumn" } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/season_sensor_spring.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/season_sensor_spring.json new file mode 100644 index 00000000..4d192e28 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/season_sensor_spring.json @@ -0,0 +1,5 @@ +{ + "variants": { + "normal": { "model": "toughasnails:season_sensor_spring" } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/season_sensor_summer.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/season_sensor_summer.json new file mode 100644 index 00000000..5d08fea7 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/season_sensor_summer.json @@ -0,0 +1,5 @@ +{ + "variants": { + "normal": { "model": "toughasnails:season_sensor_summer" } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/season_sensor_winter.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/season_sensor_winter.json new file mode 100644 index 00000000..b963d4b9 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/season_sensor_winter.json @@ -0,0 +1,5 @@ +{ + "variants": { + "normal": { "model": "toughasnails:season_sensor_winter" } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/temperature_coil.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/temperature_coil.json new file mode 100644 index 00000000..b09bb5a0 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/temperature_coil.json @@ -0,0 +1,8 @@ +{ + "variants": { + "powered=false,variant=cooling": { "model": "toughasnails:cooling_coil_off" }, + "powered=true,variant=cooling": { "model": "toughasnails:cooling_coil_on" }, + "powered=false,variant=heating": { "model": "toughasnails:heating_coil_off" }, + "powered=true,variant=heating": { "model": "toughasnails:heating_coil_on" } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/torch_new.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/torch_new.json new file mode 100644 index 00000000..ab5dfbb2 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/blockstates/torch_new.json @@ -0,0 +1,164 @@ +{ + "variants": { + "age=0,burning=true,facing=up": { "model": "normal_torch" }, + "age=1,burning=true,facing=up": { "model": "normal_torch" }, + "age=2,burning=true,facing=up": { "model": "normal_torch" }, + "age=3,burning=true,facing=up": { "model": "normal_torch" }, + "age=4,burning=true,facing=up": { "model": "normal_torch" }, + "age=5,burning=true,facing=up": { "model": "normal_torch" }, + "age=6,burning=true,facing=up": { "model": "normal_torch" }, + "age=7,burning=true,facing=up": { "model": "normal_torch" }, + "age=8,burning=true,facing=up": { "model": "normal_torch" }, + "age=9,burning=true,facing=up": { "model": "normal_torch" }, + "age=10,burning=true,facing=up": { "model": "normal_torch" }, + "age=11,burning=true,facing=up": { "model": "normal_torch" }, + "age=12,burning=true,facing=up": { "model": "normal_torch" }, + "age=13,burning=true,facing=up": { "model": "normal_torch" }, + "age=14,burning=true,facing=up": { "model": "normal_torch" }, + "age=15,burning=true,facing=up": { "model": "normal_torch" }, + "age=0,burning=true,facing=east": { "model": "normal_torch_wall" }, + "age=1,burning=true,facing=east": { "model": "normal_torch_wall" }, + "age=2,burning=true,facing=east": { "model": "normal_torch_wall" }, + "age=3,burning=true,facing=east": { "model": "normal_torch_wall" }, + "age=4,burning=true,facing=east": { "model": "normal_torch_wall" }, + "age=5,burning=true,facing=east": { "model": "normal_torch_wall" }, + "age=6,burning=true,facing=east": { "model": "normal_torch_wall" }, + "age=7,burning=true,facing=east": { "model": "normal_torch_wall" }, + "age=8,burning=true,facing=east": { "model": "normal_torch_wall" }, + "age=9,burning=true,facing=east": { "model": "normal_torch_wall" }, + "age=10,burning=true,facing=east": { "model": "normal_torch_wall" }, + "age=11,burning=true,facing=east": { "model": "normal_torch_wall" }, + "age=12,burning=true,facing=east": { "model": "normal_torch_wall" }, + "age=13,burning=true,facing=east": { "model": "normal_torch_wall" }, + "age=14,burning=true,facing=east": { "model": "normal_torch_wall" }, + "age=15,burning=true,facing=east": { "model": "normal_torch_wall" }, + "age=0,burning=true,facing=south": { "model": "normal_torch_wall", "y": 90 }, + "age=1,burning=true,facing=south": { "model": "normal_torch_wall", "y": 90 }, + "age=2,burning=true,facing=south": { "model": "normal_torch_wall", "y": 90 }, + "age=3,burning=true,facing=south": { "model": "normal_torch_wall", "y": 90 }, + "age=4,burning=true,facing=south": { "model": "normal_torch_wall", "y": 90 }, + "age=5,burning=true,facing=south": { "model": "normal_torch_wall", "y": 90 }, + "age=6,burning=true,facing=south": { "model": "normal_torch_wall", "y": 90 }, + "age=7,burning=true,facing=south": { "model": "normal_torch_wall", "y": 90 }, + "age=8,burning=true,facing=south": { "model": "normal_torch_wall", "y": 90 }, + "age=9,burning=true,facing=south": { "model": "normal_torch_wall", "y": 90 }, + "age=10,burning=true,facing=south": { "model": "normal_torch_wall", "y": 90 }, + "age=11,burning=true,facing=south": { "model": "normal_torch_wall", "y": 90 }, + "age=12,burning=true,facing=south": { "model": "normal_torch_wall", "y": 90 }, + "age=13,burning=true,facing=south": { "model": "normal_torch_wall", "y": 90 }, + "age=14,burning=true,facing=south": { "model": "normal_torch_wall", "y": 90 }, + "age=15,burning=true,facing=south": { "model": "normal_torch_wall", "y": 90 }, + "age=0,burning=true,facing=west": { "model": "normal_torch_wall", "y": 180 }, + "age=1,burning=true,facing=west": { "model": "normal_torch_wall", "y": 180 }, + "age=2,burning=true,facing=west": { "model": "normal_torch_wall", "y": 180 }, + "age=3,burning=true,facing=west": { "model": "normal_torch_wall", "y": 180 }, + "age=4,burning=true,facing=west": { "model": "normal_torch_wall", "y": 180 }, + "age=5,burning=true,facing=west": { "model": "normal_torch_wall", "y": 180 }, + "age=6,burning=true,facing=west": { "model": "normal_torch_wall", "y": 180 }, + "age=7,burning=true,facing=west": { "model": "normal_torch_wall", "y": 180 }, + "age=8,burning=true,facing=west": { "model": "normal_torch_wall", "y": 180 }, + "age=9,burning=true,facing=west": { "model": "normal_torch_wall", "y": 180 }, + "age=10,burning=true,facing=west": { "model": "normal_torch_wall", "y": 180 }, + "age=11,burning=true,facing=west": { "model": "normal_torch_wall", "y": 180 }, + "age=12,burning=true,facing=west": { "model": "normal_torch_wall", "y": 180 }, + "age=13,burning=true,facing=west": { "model": "normal_torch_wall", "y": 180 }, + "age=14,burning=true,facing=west": { "model": "normal_torch_wall", "y": 180 }, + "age=15,burning=true,facing=west": { "model": "normal_torch_wall", "y": 180 }, + "age=0,burning=true,facing=north": { "model": "normal_torch_wall", "y": 270 }, + "age=1,burning=true,facing=north": { "model": "normal_torch_wall", "y": 270 }, + "age=2,burning=true,facing=north": { "model": "normal_torch_wall", "y": 270 }, + "age=3,burning=true,facing=north": { "model": "normal_torch_wall", "y": 270 }, + "age=4,burning=true,facing=north": { "model": "normal_torch_wall", "y": 270 }, + "age=5,burning=true,facing=north": { "model": "normal_torch_wall", "y": 270 }, + "age=6,burning=true,facing=north": { "model": "normal_torch_wall", "y": 270 }, + "age=7,burning=true,facing=north": { "model": "normal_torch_wall", "y": 270 }, + "age=8,burning=true,facing=north": { "model": "normal_torch_wall", "y": 270 }, + "age=9,burning=true,facing=north": { "model": "normal_torch_wall", "y": 270 }, + "age=10,burning=true,facing=north": { "model": "normal_torch_wall", "y": 270 }, + "age=11,burning=true,facing=north": { "model": "normal_torch_wall", "y": 270 }, + "age=12,burning=true,facing=north": { "model": "normal_torch_wall", "y": 270 }, + "age=13,burning=true,facing=north": { "model": "normal_torch_wall", "y": 270 }, + "age=14,burning=true,facing=north": { "model": "normal_torch_wall", "y": 270 }, + "age=15,burning=true,facing=north": { "model": "normal_torch_wall", "y": 270 }, + "age=0,burning=false,facing=up": { "model": "toughasnails:new_torch" }, + "age=1,burning=false,facing=up": { "model": "toughasnails:new_torch" }, + "age=2,burning=false,facing=up": { "model": "toughasnails:new_torch" }, + "age=3,burning=false,facing=up": { "model": "toughasnails:new_torch" }, + "age=4,burning=false,facing=up": { "model": "toughasnails:new_torch" }, + "age=5,burning=false,facing=up": { "model": "toughasnails:new_torch" }, + "age=6,burning=false,facing=up": { "model": "toughasnails:new_torch" }, + "age=7,burning=false,facing=up": { "model": "toughasnails:new_torch" }, + "age=8,burning=false,facing=up": { "model": "toughasnails:new_torch" }, + "age=9,burning=false,facing=up": { "model": "toughasnails:new_torch" }, + "age=10,burning=false,facing=up": { "model": "toughasnails:new_torch" }, + "age=11,burning=false,facing=up": { "model": "toughasnails:new_torch" }, + "age=12,burning=false,facing=up": { "model": "toughasnails:new_torch" }, + "age=13,burning=false,facing=up": { "model": "toughasnails:new_torch" }, + "age=14,burning=false,facing=up": { "model": "toughasnails:new_torch" }, + "age=15,burning=false,facing=up": { "model": "toughasnails:new_torch" }, + "age=0,burning=false,facing=east": { "model": "toughasnails:new_torch_wall" }, + "age=1,burning=false,facing=east": { "model": "toughasnails:new_torch_wall" }, + "age=2,burning=false,facing=east": { "model": "toughasnails:new_torch_wall" }, + "age=3,burning=false,facing=east": { "model": "toughasnails:new_torch_wall" }, + "age=4,burning=false,facing=east": { "model": "toughasnails:new_torch_wall" }, + "age=5,burning=false,facing=east": { "model": "toughasnails:new_torch_wall" }, + "age=6,burning=false,facing=east": { "model": "toughasnails:new_torch_wall" }, + "age=7,burning=false,facing=east": { "model": "toughasnails:new_torch_wall" }, + "age=8,burning=false,facing=east": { "model": "toughasnails:new_torch_wall" }, + "age=9,burning=false,facing=east": { "model": "toughasnails:new_torch_wall" }, + "age=10,burning=false,facing=east": { "model": "toughasnails:new_torch_wall" }, + "age=11,burning=false,facing=east": { "model": "toughasnails:new_torch_wall" }, + "age=12,burning=false,facing=east": { "model": "toughasnails:new_torch_wall" }, + "age=13,burning=false,facing=east": { "model": "toughasnails:new_torch_wall" }, + "age=14,burning=false,facing=east": { "model": "toughasnails:new_torch_wall" }, + "age=15,burning=false,facing=east": { "model": "toughasnails:new_torch_wall" }, + "age=0,burning=false,facing=south": { "model": "toughasnails:new_torch_wall", "y": 90 }, + "age=1,burning=false,facing=south": { "model": "toughasnails:new_torch_wall", "y": 90 }, + "age=2,burning=false,facing=south": { "model": "toughasnails:new_torch_wall", "y": 90 }, + "age=3,burning=false,facing=south": { "model": "toughasnails:new_torch_wall", "y": 90 }, + "age=4,burning=false,facing=south": { "model": "toughasnails:new_torch_wall", "y": 90 }, + "age=5,burning=false,facing=south": { "model": "toughasnails:new_torch_wall", "y": 90 }, + "age=6,burning=false,facing=south": { "model": "toughasnails:new_torch_wall", "y": 90 }, + "age=7,burning=false,facing=south": { "model": "toughasnails:new_torch_wall", "y": 90 }, + "age=8,burning=false,facing=south": { "model": "toughasnails:new_torch_wall", "y": 90 }, + "age=9,burning=false,facing=south": { "model": "toughasnails:new_torch_wall", "y": 90 }, + "age=10,burning=false,facing=south": { "model": "toughasnails:new_torch_wall", "y": 90 }, + "age=11,burning=false,facing=south": { "model": "toughasnails:new_torch_wall", "y": 90 }, + "age=12,burning=false,facing=south": { "model": "toughasnails:new_torch_wall", "y": 90 }, + "age=13,burning=false,facing=south": { "model": "toughasnails:new_torch_wall", "y": 90 }, + "age=14,burning=false,facing=south": { "model": "toughasnails:new_torch_wall", "y": 90 }, + "age=15,burning=false,facing=south": { "model": "toughasnails:new_torch_wall", "y": 90 }, + "age=0,burning=false,facing=west": { "model": "toughasnails:new_torch_wall", "y": 180 }, + "age=1,burning=false,facing=west": { "model": "toughasnails:new_torch_wall", "y": 180 }, + "age=2,burning=false,facing=west": { "model": "toughasnails:new_torch_wall", "y": 180 }, + "age=3,burning=false,facing=west": { "model": "toughasnails:new_torch_wall", "y": 180 }, + "age=4,burning=false,facing=west": { "model": "toughasnails:new_torch_wall", "y": 180 }, + "age=5,burning=false,facing=west": { "model": "toughasnails:new_torch_wall", "y": 180 }, + "age=6,burning=false,facing=west": { "model": "toughasnails:new_torch_wall", "y": 180 }, + "age=7,burning=false,facing=west": { "model": "toughasnails:new_torch_wall", "y": 180 }, + "age=8,burning=false,facing=west": { "model": "toughasnails:new_torch_wall", "y": 180 }, + "age=9,burning=false,facing=west": { "model": "toughasnails:new_torch_wall", "y": 180 }, + "age=10,burning=false,facing=west": { "model": "toughasnails:new_torch_wall", "y": 180 }, + "age=11,burning=false,facing=west": { "model": "toughasnails:new_torch_wall", "y": 180 }, + "age=12,burning=false,facing=west": { "model": "toughasnails:new_torch_wall", "y": 180 }, + "age=13,burning=false,facing=west": { "model": "toughasnails:new_torch_wall", "y": 180 }, + "age=14,burning=false,facing=west": { "model": "toughasnails:new_torch_wall", "y": 180 }, + "age=15,burning=false,facing=west": { "model": "toughasnails:new_torch_wall", "y": 180 }, + "age=0,burning=false,facing=north": { "model": "toughasnails:new_torch_wall", "y": 270 }, + "age=1,burning=false,facing=north": { "model": "toughasnails:new_torch_wall", "y": 270 }, + "age=2,burning=false,facing=north": { "model": "toughasnails:new_torch_wall", "y": 270 }, + "age=3,burning=false,facing=north": { "model": "toughasnails:new_torch_wall", "y": 270 }, + "age=4,burning=false,facing=north": { "model": "toughasnails:new_torch_wall", "y": 270 }, + "age=5,burning=false,facing=north": { "model": "toughasnails:new_torch_wall", "y": 270 }, + "age=6,burning=false,facing=north": { "model": "toughasnails:new_torch_wall", "y": 270 }, + "age=7,burning=false,facing=north": { "model": "toughasnails:new_torch_wall", "y": 270 }, + "age=8,burning=false,facing=north": { "model": "toughasnails:new_torch_wall", "y": 270 }, + "age=9,burning=false,facing=north": { "model": "toughasnails:new_torch_wall", "y": 270 }, + "age=10,burning=false,facing=north": { "model": "toughasnails:new_torch_wall", "y": 270 }, + "age=11,burning=false,facing=north": { "model": "toughasnails:new_torch_wall", "y": 270 }, + "age=12,burning=false,facing=north": { "model": "toughasnails:new_torch_wall", "y": 270 }, + "age=13,burning=false,facing=north": { "model": "toughasnails:new_torch_wall", "y": 270 }, + "age=14,burning=false,facing=north": { "model": "toughasnails:new_torch_wall", "y": 270 }, + "age=15,burning=false,facing=north": { "model": "toughasnails:new_torch_wall", "y": 270 } + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/lang/en_US.lang b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/lang/en_US.lang new file mode 100644 index 00000000..04ec3456 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/lang/en_US.lang @@ -0,0 +1,113 @@ +achievement.thirst_quencher=Thirst Quencher +achievement.thirst_quencher.desc=Craft a canteen out of leather +achievement.thirst_ender=Thirst Ender +achievement.thirst_ender.desc=Make a bottle of refreshing fruit juice +achievement.campfire_song=Campfire Song +achievement.campfire_song.desc=Light a campfire made out of logs and cobblestone! +achievement.into_ice=Into Ice +achievement.into_ice.desc=Relieve a Freeze of its rod +achievement.hot_or_cold=Hot or Cold +achievement.hot_or_cold.desc=Make a thermometer out of diamonds and Nether quartz +achievement.that_time_of_year=That Time of Year +achievement.that_time_of_year.desc=Craft a season clock with Nether quartz and redstone +achievement.year_one=Year One +achievement.year_one.desc=Survive a full year! +achievement.life_or_death=Life or Death +achievement.life_or_death.desc=Search Nether Fortresses for loot to increase your health! + +commands.toughasnails.usage=/toughasnails [args] +commands.toughasnails.settemp.success=Set player temperature to %s +commands.toughasnails.settemp.disabled=Body Temperature is currently disabled! +commands.toughasnails.setseason.success=Set season to %s +commands.toughasnails.setseason.fail=Invalid season %s +commands.toughasnails.setseason.disabled=Seasons are currently disabled! +commands.toughasnails.setthirst.success=Set thirst to %s +commands.toughasnails.setthirst.disabled=Thirst is currently disabled! +commands.toughasnails.sethealth.success=Set health to %s +commands.toughasnails.sethealth.disabled=Health is currently disabled! +commands.toughasnails.tempat.success=Temperature at dimension %s: %s,%s,%s is %s +commands.toughasnails.tempat.disabled=Temperature is currently disabled! + +config.category.survivalSettings.title=Survival Settings + +itemGroup.tabToughAsNails=Tough As Nails + +tile.campfire.name=Campfire +tile.dead_crops.name=Dead Crops +tile.rain_collector.name=Rain Collector +tile.temperature_coil.cooling_coil.name=Cooling Coil +tile.temperature_coil.heating_coil.name=Heating Coil +tile.season_sensor_spring.name=Season Sensor +tile.season_sensor_summer.name=Season Sensor +tile.season_sensor_autumn.name=Season Sensor +tile.season_sensor_winter.name=Season Sensor +tile.torch_new.name=Torch + +item.air_filter.name=Air Filter +item.bottle_of_blackdamp.name=Bottle of Blackdamp +item.bottle_of_whitedamp.name=Bottle of Whitedamp +item.bottle_of_firedamp.name=Bottle of Firedamp +item.bottle_of_stinkdamp.name=Bottle of Stinkdamp +item.clean_water_canteen.name=Clean Water Canteen +item.charcoal_filter.name=Charcoal Filter +item.dirty_water_canteen.name=Dirty Water Canteen +item.dirty_water_bottle.name=Dirty Water Bottle +item.empty_canteen.name=Empty Canteen +item.filtered_water_canteen.name=Filtered Water Canteen +item.filtered_water_bottle.name=Filtered Water Bottle +item.freeze_powder.name=Freeze Powder +item.freeze_rod.name=Freeze Rod +item.ice_charge.name=Ice Charge +item.ice_cube.name=Ice Cube +item.jelled_slime.name=Jelled Slime +item.jelled_slime_helmet.name=Jelled Slime Helmet +item.jelled_slime_chestplate.name=Jelled Slime Chestplate +item.jelled_slime_leggings.name=Jelled Slime Leggings +item.jelled_slime_boots.name=Jelled Slime Boots +item.juice_apple.name=Apple Juice +item.juice_beetroot.name=Beetroot Juice +item.juice_cactus.name=Cactus Juice +item.juice_carrot.name=Carrot Juice +item.juice_chorus_fruit.name=Chorus Fruit Juice +item.juice_glistering_melon.name=Glistering Melon Juice +item.juice_golden_apple.name=Golden Apple Juice +item.juice_golden_carrot.name=Golden Carrot Juice +item.juice_melon.name=Melon Juice +item.juice_pumpkin.name=Pumpkin Juice +item.lifeblood_crystal.name=Lifeblood Crystal +item.respirator.name=Respirator +item.season_clock.name=Season Clock +item.spawn_egg_freeze.name=Spawn Freeze +item.tan_icon.name=TAN Icon +item.thermometer.name=Thermometer +item.thermometer.read=The temperature here is %d degrees. +item.wool_helmet.name=Wool Hood +item.wool_chestplate.name=Wool Jacket +item.wool_leggings.name=Wool Pants +item.wool_boots.name=Wool Boots + +potion.hypothermia=Hypothermia +potion.hyperthermia=Hyperthermia +potion.thirst=Thirst +potion.cold_resistance=Cold Resistance +potion.heat_resistance=Heat Resistance + +potion.effect.cold_resistance_type=Potion of Cold Resistance +potion.effect.long_cold_resistance_type=Potion of Cold Resistance +potion.effect.heat_resistance_type=Potion of Heat Resistance +potion.effect.long_heat_resistance_type=Potion of Heat Resistance + +splash_potion.effect.cold_resistance_type=Splash Potion of Cold Resistance +splash_potion.effect.long_cold_resistance_type=Splash Potion of Cold Resistance +splash_potion.effect.heat_resistance_type=Splash Potion of Heat Resistance +splash_potion.effect.long_heat_resistance_type=Splash Potion of Heat Resistance + +lingering_potion.effect.cold_resistance_type=Lingering Potion of Cold Resistance +lingering_potion.effect.long_cold_resistance_type=Lingering Potion of Cold Resistance +lingering_potion.effect.heat_resistance_type=Lingering Potion of Heat Resistance +lingering_potion.effect.long_heat_resistance_type=Lingering Potion of Heat Resistance + +tipped_arrow.effect.cold_resistance_type=Arrow of Cold Resistance +tipped_arrow.effect.long_cold_resistance_type=Arrow of Cold Resistance +tipped_arrow.effect.heat_resistance_type=Arrow of Heat Resistance +tipped_arrow.effect.long_heat_resistance_type=Arrow of Heat Resistance \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/lang/fr_FR.lang b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/lang/fr_FR.lang new file mode 100644 index 00000000..1cd3296a --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/lang/fr_FR.lang @@ -0,0 +1,96 @@ +achievement.thirst_quencher=Boisson désaltérante +achievement.thirst_quencher.desc=Fabriquer une gourde en cuir +achievement.thirst_ender=Boisson exotique +achievement.thirst_ender.desc=Fabriquer une fiole d'un jus de fruit rafraichissant +achievement.campfire_song=Musique de Feu de camp +achievement.campfire_song.desc=Allumer un feu de camp créé de bois et de pierres! +achievement.into_ice=Dans la glace +achievement.into_ice.desc=Soulager un Freeze de son bâton +achievement.hot_or_cold=Chaleur ou fraicheur +achievement.hot_or_cold.desc=Fabriquer un thermometre de diamonts et de Quartz du Nether +achievement.that_time_of_year=Cet période de l'année +achievement.that_time_of_year.desc=Fabriquer une montre des saisons de Quartz du Nether et de la redstone +achievement.year_one=Année Une +achievement.year_one.desc=Survivre une année complète! +achievement.life_or_death=Vivre ou mourir +achievement.life_or_death.desc=A la recherche d'une forteresse du Nether pour un butin qui augmente votre santé! + +commands.toughasnails.usage=/toughasnails [args] +commands.toughasnails.settemp.success=Température corporelle du joueur réglée à %s +commands.toughasnails.settemp.disabled=La température corporelle a été désactivée! +commands.toughasnails.setseason.success=Saison réglée à %s +commands.toughasnails.setseason.fail=Saison incorrecte %s +commands.toughasnails.setseason.disabled=Les saisons ont été désactivées! + +config.category.survivalSettings.title=Réglages de Survie + +itemGroup.tabToughAsNails=Tough As Nails + +tile.campfire.name=Feux de camp +tile.dead_crops.name=Cultures mortes +tile.rain_collector.name=Collecteur d'eau de pluie +tile.temperature_coil.cooling_coil.name=Tube de refroidissement +tile.temperature_coil.heating_coil.name=Bobine de chauffage +tile.season_sensor_spring.name=Capteur de saison +tile.season_sensor_summer.name=Capteur de saison +tile.season_sensor_autumn.name=Capteur de saison +tile.season_sensor_winter.name=Capteur de saison +tile.torch_new.name=Torche + +item.air_filter.name=Filtreur d'air +item.bottle_of_blackdamp.name=Fiole de Blackdamp +item.bottle_of_whitedamp.name=Fiole de Whitedamp +item.bottle_of_firedamp.name=Fiole de Firedamp +item.bottle_of_stinkdamp.name=Fiole de Stinkdamp +item.clean_water_canteen.name=Gourde d'eau potable +item.charcoal_filter.name=Filtre au charbon de bois +item.dirty_water_canteen.name=Gourde d'eau sale +item.dirty_water_bottle.name=Fiole d'eau sale +item.empty_canteen.name=Gourde vide +item.filtered_water_canteen.name=Gourde d'eau filtré +item.filtered_water_bottle.name=Fiole d'eau filtré +item.freeze_powder.name=Poudre de glace +item.freeze_rod.name=Bâton de Freeze +item.ice_charge.name=Boule de glace +item.ice_cube.name=Cube de glace +item.jelled_slime.name=Gelée de Slime +item.jelled_slime_helmet.name=Casque en gelée de Slime +item.jelled_slime_chestplate.name=Plastron en gelée de Slime +item.jelled_slime_leggings.name=Jambières en gelée de Slime +item.jelled_slime_boots.name=Bottes en gelée de Slime +item.juice_apple.name=Jus de Pomme +item.juice_beetroot.name=Jus de Betterave +item.juice_cactus.name=Jus de Cactus +item.juice_carrot.name=Jus de Carotte +item.juice_chorus_fruit.name=Jus de fruit de Chorus +item.juice_glistering_melon.name=Jus de Pastèque scintillante +item.juice_golden_apple.name=Jus de Pomme d'orée +item.juice_golden_carrot.name=Jus de Carotte d'orée +item.juice_melon.name=Jus de Pastèque +item.juice_pumpkin.name=Jus de Citrouille +item.lifeblood_crystal.name=Cristal de santé +item.respirator.name=Respirateur +item.season_clock.name=Montre des saisons +item.spawn_egg_freeze.name=Oeuf de Freeze +item.tan_icon.name=TAN Icône +item.thermometer.name=Thermometre +item.wool_helmet.name=Capuche de laine +item.wool_chestplate.name=Veste de laine +item.wool_leggings.name=Pentalon de laine +item.wool_boots.name=Bottes de laine + +potion.hypothermia=Hypothermie +potion.hyperthermia=Hyperthermie +potion.thirst=Soif +potion.cold_resistance=Résistance au froid +potion.heat_resistance=Résistance à la chaleur + +potion.effect.cold_resistance_type=Potion de résistance au froid +potion.effect.long_cold_resistance_type=Potion de résistance au froid +potion.effect.heat_resistance_type=Potion de résistance à la chaleur +potion.effect.long_heat_resistance_type=Potion de résistance à la chaleur + +tipped_arrow.effect.cold_resistance_type=Flêche de résistance au froid +tipped_arrow.effect.long_cold_resistance_type=Flêche de résistance au froid +tipped_arrow.effect.heat_resistance_type=Flêche de résistance à la chaleur +tipped_arrow.effect.long_heat_resistance_type=Flêche de résistance à la chaleur diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/lang/hu_HU.lang b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/lang/hu_HU.lang new file mode 100644 index 00000000..b8a635ef --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/lang/hu_HU.lang @@ -0,0 +1,90 @@ +achievement.thirst_quencher=Szomjoltó +achievement.thirst_quencher.desc=Készíts egy kulacsot bőrből +achievement.thirst_ender=Szomjvégző +achievement.thirst_ender.desc=Készíts egy palack frissítő gyümölcslevet +achievement.campfire_song=Tábortüzi Énekek +achievement.campfire_song.desc=Gyújts egy tábortüzet, ami rönkből és zúzottkőből készül! +achievement.into_ice=Be a jégbe! +achievement.into_ice.desc=Könnyíts meg egy Fagyot a rúdjától ( ͡° ͜ʖ ͡°) +achievement.hot_or_cold=Meleg vagy Hideg +achievement.hot_or_cold.desc=Készíts hőmérőt gyémántból és kvarcból +achievement.that_time_of_year=Az évnek az a napja +achievement.that_time_of_year.desc=Készíts évszakórát kvarcból és vöröskőből +achievement.year_one=Első év +achievement.year_one.desc=Élj túl egy évet! +achievement.life_or_death=Élet vagy Halál +achievement.life_or_death.desc=Keress Pokol kastélyokat zsákmányokért, és növeld az életed! + +commands.toughasnails.usage=/toughasnails [érték] +commands.toughasnails.settemp.success=Játékos hőmérséklete átállítva: %s +commands.toughasnails.setseason.success=Évszak átállítva: %s +commands.toughasnails.setseason.fail=Érvénytelen évszak: %s + +itemGroup.tabToughAsNails=Tough As Nails + +tile.campfire.name=Tábortűz +tile.dead_crops.name=Halott Növény +tile.temperature_coil.cooling_coil.name=Hűtőtest +tile.temperature_coil.heating_coil.name=Fűtőtest +tile.season_sensor_spring.name=Évszak Érzékelő +tile.season_sensor_summer.name=Évszak Érzékelő +tile.season_sensor_autumn.name=Évszak Érzékelő +tile.season_sensor_winter.name=Évszak Érzékelő + +item.air_filter.name=Levegőszűrő +item.bottle_of_blackdamp.name=Palackozott Feketenyirok +item.bottle_of_whitedamp.name=Palackozott Fehérnyirok +item.bottle_of_firedamp.name=Palackozott Tűznyirok +item.bottle_of_stinkdamp.name=Palackozott Bűznyirok +item.clean_water_canteen.name=Tiszta Vizes Kulacs +item.charcoal_filter.name=Faszén Szűrő +item.dirty_water_canteen.name=Koszos Vizes Kulacs +item.dirty_water_bottle.name=Koszos Vizes Palack +item.empty_canteen.name=Üres Kulacs +item.filtered_water_canteen.name=Tisztított Vizes Kulacs +item.filtered_water_bottle.name=Tisztított Vizes Palack +item.freeze_powder.name=Fagypor +item.freeze_rod.name=Fagyrúd +item.ice_charge.name=Jéggolyó +item.ice_cube.name=Jégkocka +item.jelled_slime.name=Kocsonyás Nyálka +item.jelled_slime_helmet.name=Kocsonyás Nyálka Sisak +item.jelled_slime_chestplate.name=Kocsonyás Nyálka Mellvért +item.jelled_slime_leggings.name=Kocsonyás Nyálka Lábszárvédő +item.jelled_slime_boots.name=Kocsonyás Nyálka Csizma +item.juice_apple.name=Almalé +item.juice_beetroot.name=Céklalé +item.juice_cactus.name=Kaktuszlé +item.juice_carrot.name=Répalé +item.juice_chorus_fruit.name=Refréngyümölcslé +item.juice_glistering_melon.name=Ragyogó Dinnyelé +item.juice_golden_apple.name=Aranyalmalé +item.juice_golden_carrot.name=Aranyrépalé +item.juice_melon.name=Dinnyelé +item.juice_pumpkin.name=Töklé +item.lifeblood_crystal.name=Éltető Kristály +item.respirator.name=Gázmaszk +item.season_clock.name=Évszakóra +item.spawn_egg_freeze.name=Idézés: Fagy +item.tan_icon.name=TAN Ikon +item.thermometer.name=Hőmérő +item.wool_helmet.name=Gyapjúcsuklya +item.wool_chestplate.name=Gyapjúmellény +item.wool_leggings.name=Gyapjúnadrág +item.wool_boots.name=Gyapjúcsizma + +potion.hypothermia=Hipotermia +potion.hyperthermia=Hipertermia +potion.thirst=Szomj +potion.cold_resistance=Hidegvédelem +potion.heat_resistance=Hővédelem + +potion.effect.cold_resistance_type=Hidegvédelem bájitala +potion.effect.long_cold_resistance_type=Hidegvédelem bájitala +potion.effect.heat_resistance_type=Hővédelem bájitala +potion.effect.long_heat_resistance_type=Hővédelem bájitala + +tipped_arrow.effect.cold_resistance_type=Hidegvédelem nyila +tipped_arrow.effect.long_cold_resistance_type=Hidegvédelem nyila +tipped_arrow.effect.heat_resistance_type=Hővédelem nyila +tipped_arrow.effect.long_heat_resistance_type=Hővédelem nyila \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/lang/pt_PT.lang b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/lang/pt_PT.lang new file mode 100644 index 00000000..040ec5b7 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/lang/pt_PT.lang @@ -0,0 +1,98 @@ +//Made by marcoasfonseca + +achievement.thirst_quencher=Supressor de Sede +achievement.thirst_quencher.desc=Constrói um cantil a partir de couro. +achievement.thirst_ender=Fim da Sede +achievement.thirst_ender.desc=Faz uma garrafa de sumo de fruta refrescante. +achievement.campfire_song=Juntos à volta da Fogueira +achievement.campfire_song.desc=Acende uma fogueira feita de troncos e empedrado! +achievement.into_ice=Congelado +achievement.into_ice.desc=Faz com que um Freeze largue a sua vara. +achievement.hot_or_cold=Quente ou Frio +achievement.hot_or_cold.desc=Faz um tremómetro a partir de diamantes e quartzo do Nether. +achievement.that_time_of_year=Tempo do Ano +achievement.that_time_of_year.desc=Faz um relógio de estações com quartzo do Nether e redstone. +achievement.year_one=Ano 1 +achievement.year_one.desc=Subrevive um ano! +achievement.life_or_death=Uma Questão de Vida ou Morte! +achievement.life_or_death.desc=Procura nos baús duma Fortaleza do Nether uma melhoria de vida! + +commands.toughasnails.usage=/toughasnails [args] +commands.toughasnails.settemp.success=Set player temperature to %s +commands.toughasnails.settemp.disabled=Body Temperature is currently disabled! +commands.toughasnails.setseason.success=Set season to %s +commands.toughasnails.setseason.fail=Invalid season %s +commands.toughasnails.setseason.disabled=Seasons are currently disabled! + +config.category.survivalSettings.title=Definições de Subrevivência + +itemGroup.tabToughAsNails=Tough As Nails + +tile.campfire.name=Fogueira +tile.dead_crops.name=Plantação Mortas +tile.rain_collector.name=Coletor de Chuva +tile.temperature_coil.cooling_coil.name=Bobina de Arrefecimento +tile.temperature_coil.heating_coil.name=Bobina de Aquecimento +tile.season_sensor_spring.name=Sensor de Estação +tile.season_sensor_summer.name=Sensor de Estação +tile.season_sensor_autumn.name=Sensor de Estação +tile.season_sensor_winter.name=Sensor de Estação +tile.torch_new.name=Tocha + +item.air_filter.name=Filtro de Ar +item.bottle_of_blackdamp.name=Garrafa de Blackdamp +item.bottle_of_whitedamp.name=Garrafa de Whitedamp +item.bottle_of_firedamp.name=Garrafa de Firedamp +item.bottle_of_stinkdamp.name=Garrafa de Stinkdamp +item.clean_water_canteen.name=Cantil de Água Limpa +item.charcoal_filter.name=Filtro de Carvão Vegetal +item.dirty_water_canteen.name=Cantil de Água Suja +item.dirty_water_bottle.name=Garrafa de Água Suja +item.empty_canteen.name=Cantil Vazio +item.filtered_water_canteen.name=Cantil de Água Filtrada +item.filtered_water_bottle.name=Garrafa de Água Filtrada +item.freeze_powder.name=Pó de Freeze +item.freeze_rod.name=Vara de Freeze +item.ice_charge.name=Projétil de Fogo +item.ice_cube.name=Cubo de Gelo +item.jelled_slime.name=Slime Gelatinoso +item.jelled_slime_helmet.name=Capacete de Slime Gelatinoso +item.jelled_slime_chestplate.name=Peitoral de Slime Gelatinoso +item.jelled_slime_leggings.name=Perneiras de Slime Gelatinoso +item.jelled_slime_boots.name=Botas de Slime Gelatinoso +item.juice_apple.name=Sumo de Maçã +item.juice_beetroot.name=Sumo de Beterraba +item.juice_cactus.name=Sumo de Cato +item.juice_carrot.name=Sumo de Cenoura +item.juice_chorus_fruit.name=Sumo de Fruta do Coro +item.juice_glistering_melon.name=Sumo de Melancia Reluzente +item.juice_golden_apple.name=Sumo de Maçã Dourada +item.juice_golden_carrot.name=Sumo de Cenoura Dourada +item.juice_melon.name=Somo de Melancia +item.juice_pumpkin.name=Sumo de Abóbora +item.lifeblood_crystal.name=Cristal de Vida +item.respirator.name=Respirator +item.season_clock.name=Relógio de Estações +item.spawn_egg_freeze.name=Evocar Freeze +item.tan_icon.name=Ícone TAN +item.thermometer.name=Termómetro +item.wool_helmet.name=Capuz de Lã +item.wool_chestplate.name=Casaco de Lã +item.wool_leggings.name=Calças de Lã +item.wool_boots.name=Botas de Lã + +potion.hypothermia=Hipotermia +potion.hyperthermia=hipertermia +potion.thirst=Sede +potion.cold_resistance=Resistência ao Frio +potion.heat_resistance=Resistência ao Calor + +potion.effect.cold_resistance_type=Poção de Resistência ao Frio +potion.effect.long_cold_resistance_type=Poção de Resistência ao Frio +potion.effect.heat_resistance_type=Poção de Resistência ao Calor +potion.effect.long_heat_resistance_type=Poção de Resistência ao Frio + +tipped_arrow.effect.cold_resistance_type=Flecha de Resistência ao Frio +tipped_arrow.effect.long_cold_resistance_type=Flecha de Resistência ao Frio +tipped_arrow.effect.heat_resistance_type=Flecha de Resistência ao Calor +tipped_arrow.effect.long_heat_resistance_type=Flecha de Resistência ao Calor diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/lang/zh_CN.lang b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/lang/zh_CN.lang new file mode 100644 index 00000000..45e491a4 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/lang/zh_CN.lang @@ -0,0 +1,96 @@ +achievement.thirst_quencher=解渴的饮料 +achievement.thirst_quencher.desc=制作一个水壶 +achievement.thirst_ender=脱水终结者 +achievement.thirst_ender.desc=做一瓶新鲜的果汁 +achievement.campfire_song=篝火晚会 +achievement.campfire_song.desc=点燃由圆石和原木制作的篝火! +achievement.into_ice=与冰共舞 +achievement.into_ice.desc=得到一个寒冰棍 +achievement.hot_or_cold=冰与火 +achievement.hot_or_cold.desc=用钻石和下界石英做一个体温计 +achievement.that_time_of_year=一年之计 +achievement.that_time_of_year.desc=用红石和下界石英做一个季节指示器 +achievement.year_one=新年大吉 +achievement.year_one.desc=在游戏中生存下一整年! +achievement.life_or_death=生存与死亡 +achievement.life_or_death.desc=在地狱堡垒找到生命水晶并恢复生命值! + +commands.toughasnails.usage=/toughasnails [参数] +commands.toughasnails.settemp.success=已经将玩家体温设置为%s +commands.toughasnails.settemp.disabled=玩家体温目前已禁用! +commands.toughasnails.setseason.success=已经将季节设置为%s +commands.toughasnails.setseason.fail=无效的季节参数:%s +commands.toughasnails.setseason.disabled=季节目前已禁用! + +config.category.survivalSettings.title=生存设定 + +itemGroup.tabToughAsNails=意志坚定 + +tile.campfire.name=篝火 +tile.dead_crops.name=死亡的作物 +tile.rain_collector.name=雨水收集器 +tile.temperature_coil.cooling_coil.name=冷却旋管 +tile.temperature_coil.heating_coil.name=加热旋管 +tile.season_sensor_spring.name=季节传感器(春) +tile.season_sensor_summer.name=季节传感器(夏) +tile.season_sensor_autumn.name=季节传感器(秋) +tile.season_sensor_winter.name=季节传感器(冬) +tile.torch_new.name=火把 + +item.air_filter.name=空气过滤器 +item.bottle_of_blackdamp.name=一瓶窒息瓦斯 +item.bottle_of_whitedamp.name=一瓶一氧化碳 +item.bottle_of_firedamp.name=一瓶沼气 +item.bottle_of_stinkdamp.name=一瓶硫化氢 +item.clean_water_canteen.name=纯净水水壶 +item.charcoal_filter.name=活性炭过滤器 +item.dirty_water_canteen.name=脏水水壶 +item.dirty_water_bottle.name=脏水水瓶 +item.empty_canteen.name=空水壶 +item.filtered_water_canteen.name=过滤水水壶 +item.filtered_water_bottle.name=过滤水水瓶 +item.freeze_powder.name=寒冰粉 +item.freeze_rod.name=寒冰棒 +item.ice_charge.name=寒冰弹 +item.ice_cube.name=小冰块 +item.jelled_slime.name=冻结史莱姆 +item.jelled_slime_helmet.name=冻结史莱姆头盔 +item.jelled_slime_chestplate.name=冻结史莱姆胸甲 +item.jelled_slime_leggings.name=冻结史莱姆护腿 +item.jelled_slime_boots.name=冻结史莱姆靴子 +item.juice_apple.name=苹果汁 +item.juice_beetroot.name=甜菜汁 +item.juice_cactus.name=仙人掌汁 +item.juice_carrot.name=胡萝卜汁 +item.juice_chorus_fruit.name=紫影果果汁 +item.juice_glistering_melon.name=金西瓜果汁 +item.juice_golden_apple.name=金苹果果汁 +item.juice_golden_carrot.name=金胡萝卜果汁 +item.juice_melon.name=西瓜汁 +item.juice_pumpkin.name=南瓜汁 +item.lifeblood_crystal.name=生命水晶 +item.respirator.name=口罩 +item.season_clock.name=季节指示仪 +item.spawn_egg_freeze.name=生成 寒冰怪 +item.tan_icon.name=TAN图标 +item.thermometer.name=温度计 +item.wool_helmet.name=羊毛头巾 +item.wool_chestplate.name=羊毛夹克 +item.wool_leggings.name=羊毛裤子 +item.wool_boots.name=羊毛靴子 + +potion.hypothermia=伤寒 +potion.hyperthermia=中暑 +potion.thirst=脱水 +potion.cold_resistance=严寒抗性 +potion.heat_resistance=炽热抗性 + +potion.effect.cold_resistance_type=严寒抗性药水 +potion.effect.long_cold_resistance_type=严寒抗性药水 +potion.effect.heat_resistance_type=炽热抗性药水 +potion.effect.long_heat_resistance_type=炙热抗性药水 + +tipped_arrow.effect.cold_resistance_type=严寒抗性之箭 +tipped_arrow.effect.long_cold_resistance_type=严寒抗性之箭 +tipped_arrow.effect.heat_resistance_type=炙热抗性之箭 +tipped_arrow.effect.long_heat_resistance_type=炙热抗性之箭 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/campfire.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/campfire.json new file mode 100644 index 00000000..758a3f9a --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/campfire.json @@ -0,0 +1,222 @@ +{ + "textures": { + "particle": "toughasnails:items/campfire", + "0": "minecraft:blocks/cobblestone", + "1": "minecraft:blocks/log_oak", + "2": "minecraft:blocks/log_oak_top" + }, + "elements": [ + { + "name": "Stone", + "from": [ 4.0, 0.0, 0.0 ], + "to": [ 7.0, 3.0, 3.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] } + } + }, + { + "name": "Stone", + "from": [ 9.0, 0.0, 0.0 ], + "to": [ 12.0, 3.0, 3.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] } + } + }, + { + "name": "Stone", + "from": [ 13.0, 0.0, 4.0 ], + "to": [ 16.0, 3.0, 7.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] } + } + }, + { + "name": "Stone", + "from": [ 13.0, 0.0, 9.0 ], + "to": [ 16.0, 3.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] } + } + }, + { + "name": "Stone", + "from": [ 9.0, 0.0, 13.0 ], + "to": [ 12.0, 3.0, 16.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] } + } + }, + { + "name": "Stone", + "from": [ 4.0, 0.0, 13.0 ], + "to": [ 7.0, 3.0, 16.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] } + } + }, + { + "name": "Stone", + "from": [ 0.0, 0.0, 9.0 ], + "to": [ 3.0, 3.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] } + } + }, + { + "name": "Stone", + "from": [ 0.0, 0.0, 4.0 ], + "to": [ 3.0, 3.0, 7.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] } + } + }, + { + "name": "Stone Small", + "from": [ 2.0, 0.0, 2.0 ], + "to": [ 4.0, 2.0, 4.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] } + } + }, + { + "name": "Stone Small", + "from": [ 12.0, 0.0, 2.0 ], + "to": [ 14.0, 2.0, 4.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] } + } + }, + { + "name": "Stone Small", + "from": [ 12.0, 0.0, 12.0 ], + "to": [ 14.0, 2.0, 14.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] } + } + }, + { + "name": "Stone Small", + "from": [ 2.0, 0.0, 12.0 ], + "to": [ 4.0, 2.0, 14.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] } + } + }, + { + "name": "Log", + "from": [ 7.0, 0.0, 11.0 ], + "to": [ 9.0, 8.0, 13.0 ], + "rotation": { "origin": [ 8.0, 4.0, 12.0 ], "axis": "x", "angle": -45.0 }, + "faces": { + "north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "up": { "texture": "#2", "uv": [ 7.0, 7.0, 9.0, 9.0 ] }, + "down": { "texture": "#2", "uv": [ 7.0, 7.0, 9.0, 9.0 ] } + } + }, + { + "name": "Log", + "from": [ 11.0, 0.0, 7.0 ], + "to": [ 13.0, 8.0, 9.0 ], + "rotation": { "origin": [ 12.0, 4.0, 8.0 ], "axis": "z", "angle": 45.0 }, + "faces": { + "north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "up": { "texture": "#2", "uv": [ 7.0, 7.0, 9.0, 9.0 ] }, + "down": { "texture": "#2", "uv": [ 7.0, 7.0, 9.0, 9.0 ] } + } + }, + { + "name": "Log", + "from": [ 7.0, 0.0, 3.0 ], + "to": [ 9.0, 8.0, 5.0 ], + "rotation": { "origin": [ 8.0, 4.0, 4.0 ], "axis": "x", "angle": 45.0 }, + "faces": { + "north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "up": { "texture": "#2", "uv": [ 7.0, 7.0, 9.0, 9.0 ] }, + "down": { "texture": "#2", "uv": [ 7.0, 7.0, 9.0, 9.0 ] } + } + }, + { + "name": "Log", + "from": [ 3.0, 0.0, 7.0 ], + "to": [ 5.0, 8.0, 9.0 ], + "rotation": { "origin": [ 4.0, 4.0, 8.0 ], "axis": "z", "angle": -45.0 }, + "faces": { + "north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "up": { "texture": "#2", "uv": [ 7.0, 7.0, 9.0, 9.0 ] }, + "down": { "texture": "#2", "uv": [ 7.0, 7.0, 9.0, 9.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/campfire_out.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/campfire_out.json new file mode 100644 index 00000000..3ef10365 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/campfire_out.json @@ -0,0 +1,222 @@ +{ + "textures": { + "particle": "toughasnails:items/campfire", + "0": "minecraft:blocks/cobblestone", + "1": "toughasnails:blocks/log_burnt", + "2": "toughasnails:blocks/log_burnt_top" + }, + "elements": [ + { + "name": "Stone", + "from": [ 4.0, 0.0, 0.0 ], + "to": [ 7.0, 3.0, 3.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] } + } + }, + { + "name": "Stone", + "from": [ 9.0, 0.0, 0.0 ], + "to": [ 12.0, 3.0, 3.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] } + } + }, + { + "name": "Stone", + "from": [ 13.0, 0.0, 4.0 ], + "to": [ 16.0, 3.0, 7.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] } + } + }, + { + "name": "Stone", + "from": [ 13.0, 0.0, 9.0 ], + "to": [ 16.0, 3.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] } + } + }, + { + "name": "Stone", + "from": [ 9.0, 0.0, 13.0 ], + "to": [ 12.0, 3.0, 16.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] } + } + }, + { + "name": "Stone", + "from": [ 4.0, 0.0, 13.0 ], + "to": [ 7.0, 3.0, 16.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] } + } + }, + { + "name": "Stone", + "from": [ 0.0, 0.0, 9.0 ], + "to": [ 3.0, 3.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] } + } + }, + { + "name": "Stone", + "from": [ 0.0, 0.0, 4.0 ], + "to": [ 3.0, 3.0, 7.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 3.0 ] } + } + }, + { + "name": "Stone Small", + "from": [ 2.0, 0.0, 2.0 ], + "to": [ 4.0, 2.0, 4.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] } + } + }, + { + "name": "Stone Small", + "from": [ 12.0, 0.0, 2.0 ], + "to": [ 14.0, 2.0, 4.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] } + } + }, + { + "name": "Stone Small", + "from": [ 12.0, 0.0, 12.0 ], + "to": [ 14.0, 2.0, 14.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] } + } + }, + { + "name": "Stone Small", + "from": [ 2.0, 0.0, 12.0 ], + "to": [ 4.0, 2.0, 14.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] } + } + }, + { + "name": "Log", + "from": [ 7.0, 0.0, 11.0 ], + "to": [ 9.0, 8.0, 13.0 ], + "rotation": { "origin": [ 8.0, 4.0, 12.0 ], "axis": "x", "angle": -45.0 }, + "faces": { + "north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "up": { "texture": "#2", "uv": [ 7.0, 7.0, 9.0, 9.0 ] }, + "down": { "texture": "#2", "uv": [ 7.0, 7.0, 9.0, 9.0 ] } + } + }, + { + "name": "Log", + "from": [ 11.0, 0.0, 7.0 ], + "to": [ 13.0, 8.0, 9.0 ], + "rotation": { "origin": [ 12.0, 4.0, 8.0 ], "axis": "z", "angle": 45.0 }, + "faces": { + "north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "up": { "texture": "#2", "uv": [ 7.0, 7.0, 9.0, 9.0 ] }, + "down": { "texture": "#2", "uv": [ 7.0, 7.0, 9.0, 9.0 ] } + } + }, + { + "name": "Log", + "from": [ 7.0, 0.0, 3.0 ], + "to": [ 9.0, 8.0, 5.0 ], + "rotation": { "origin": [ 8.0, 4.0, 4.0 ], "axis": "x", "angle": 45.0 }, + "faces": { + "north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "up": { "texture": "#2", "uv": [ 7.0, 7.0, 9.0, 9.0 ] }, + "down": { "texture": "#2", "uv": [ 7.0, 7.0, 9.0, 9.0 ] } + } + }, + { + "name": "Log", + "from": [ 3.0, 0.0, 7.0 ], + "to": [ 5.0, 8.0, 9.0 ], + "rotation": { "origin": [ 4.0, 4.0, 8.0 ], "axis": "z", "angle": -45.0 }, + "faces": { + "north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "east": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "west": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 8.0 ] }, + "up": { "texture": "#2", "uv": [ 7.0, 7.0, 9.0, 9.0 ] }, + "down": { "texture": "#2", "uv": [ 7.0, 7.0, 9.0, 9.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/chiller.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/chiller.json new file mode 100644 index 00000000..a047391c --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/chiller.json @@ -0,0 +1,8 @@ +{ + "parent": "block/orientable", + "textures": { + "top": "blocks/furnace_top", + "front": "toughasnails:blocks/chiller", + "side": "blocks/furnace_side" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/cooling_coil_off.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/cooling_coil_off.json new file mode 100644 index 00000000..116e4495 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/cooling_coil_off.json @@ -0,0 +1,179 @@ +{ + "parent": "block/block", + "textures": { + "particle": "blocks/furnace_top", + "0": "toughasnails:blocks/cooling_coil_off", + "1": "blocks/furnace_top" + }, + "elements": [ + { + "name": "Base", + "from": [ 0.0, 0.0, 0.0 ], + "to": [ 16.0, 2.0, 16.0 ], + "faces": { + "north": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 2.0 ] }, + "east": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 2.0 ] }, + "south": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 2.0 ] }, + "west": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 2.0 ] }, + "up": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 16.0 ] }, + "down": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 16.0 ] } + } + }, + { + "name": "Coil Rod", + "from": [ 2.0, 2.0, 2.0 ], + "to": [ 14.0, 4.0, 4.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "east": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "west": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 }, + "down": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 } + } + }, + { + "name": "Coil Rod", + "from": [ 2.0, 2.0, 12.0 ], + "to": [ 14.0, 4.0, 14.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "east": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "west": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 }, + "down": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 } + } + }, + { + "name": "Coil Rod", + "from": [ 2.0, 2.0, 4.0 ], + "to": [ 4.0, 4.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "south": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "up": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] }, + "down": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] } + } + }, + { + "name": "Coil Rod", + "from": [ 12.0, 2.0, 4.0 ], + "to": [ 14.0, 4.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "south": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "up": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] }, + "down": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 15.0 ] } + } + }, + { + "name": "Coil Rod 2", + "from": [ 2.0, 6.0, 2.0 ], + "to": [ 14.0, 8.0, 4.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "east": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "west": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 }, + "down": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 } + } + }, + { + "name": "Coil Rod 2", + "from": [ 2.0, 6.0, 12.0 ], + "to": [ 14.0, 8.0, 14.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "east": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "west": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 }, + "down": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 } + } + }, + { + "name": "Coil Rod 2", + "from": [ 2.0, 6.0, 4.0 ], + "to": [ 4.0, 8.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "south": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "up": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] }, + "down": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] } + } + }, + { + "name": "Coil Rod 2", + "from": [ 12.0, 6.0, 4.0 ], + "to": [ 14.0, 8.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "south": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "up": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] }, + "down": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 15.0 ] } + } + }, + { + "name": "Coil Rod 3", + "from": [ 2.0, 10.0, 2.0 ], + "to": [ 14.0, 12.0, 4.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "east": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "west": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 }, + "down": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 } + } + }, + { + "name": "Coil Rod 3", + "from": [ 2.0, 10.0, 12.0 ], + "to": [ 14.0, 12.0, 14.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "east": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "west": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 }, + "down": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 } + } + }, + { + "name": "Coil Rod 3", + "from": [ 2.0, 10.0, 4.0 ], + "to": [ 4.0, 12.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "south": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "up": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] }, + "down": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] } + } + }, + { + "name": "Coil Rod 3", + "from": [ 12.0, 10.0, 4.0 ], + "to": [ 14.0, 12.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "south": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "up": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] }, + "down": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 15.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/cooling_coil_on.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/cooling_coil_on.json new file mode 100644 index 00000000..775cc3c0 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/cooling_coil_on.json @@ -0,0 +1,179 @@ +{ + "parent": "block/block", + "textures": { + "particle": "blocks/furnace_top", + "0": "toughasnails:blocks/cooling_coil_on", + "1": "blocks/furnace_top" + }, + "elements": [ + { + "name": "Base", + "from": [ 0.0, 0.0, 0.0 ], + "to": [ 16.0, 2.0, 16.0 ], + "faces": { + "north": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 2.0 ] }, + "east": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 2.0 ] }, + "south": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 2.0 ] }, + "west": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 2.0 ] }, + "up": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 16.0 ] }, + "down": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 16.0 ] } + } + }, + { + "name": "Coil Rod", + "from": [ 2.0, 2.0, 2.0 ], + "to": [ 14.0, 4.0, 4.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "east": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "west": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 }, + "down": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 } + } + }, + { + "name": "Coil Rod", + "from": [ 2.0, 2.0, 12.0 ], + "to": [ 14.0, 4.0, 14.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "east": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "west": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 }, + "down": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 } + } + }, + { + "name": "Coil Rod", + "from": [ 2.0, 2.0, 4.0 ], + "to": [ 4.0, 4.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "south": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "up": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] }, + "down": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] } + } + }, + { + "name": "Coil Rod", + "from": [ 12.0, 2.0, 4.0 ], + "to": [ 14.0, 4.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "south": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "up": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] }, + "down": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 15.0 ] } + } + }, + { + "name": "Coil Rod 2", + "from": [ 2.0, 6.0, 2.0 ], + "to": [ 14.0, 8.0, 4.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "east": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "west": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 }, + "down": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 } + } + }, + { + "name": "Coil Rod 2", + "from": [ 2.0, 6.0, 12.0 ], + "to": [ 14.0, 8.0, 14.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "east": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "west": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 }, + "down": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 } + } + }, + { + "name": "Coil Rod 2", + "from": [ 2.0, 6.0, 4.0 ], + "to": [ 4.0, 8.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "south": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "up": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] }, + "down": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] } + } + }, + { + "name": "Coil Rod 2", + "from": [ 12.0, 6.0, 4.0 ], + "to": [ 14.0, 8.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "south": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "up": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] }, + "down": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 15.0 ] } + } + }, + { + "name": "Coil Rod 3", + "from": [ 2.0, 10.0, 2.0 ], + "to": [ 14.0, 12.0, 4.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "east": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "west": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 }, + "down": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 } + } + }, + { + "name": "Coil Rod 3", + "from": [ 2.0, 10.0, 12.0 ], + "to": [ 14.0, 12.0, 14.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "east": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "west": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 }, + "down": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 } + } + }, + { + "name": "Coil Rod 3", + "from": [ 2.0, 10.0, 4.0 ], + "to": [ 4.0, 12.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "south": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "up": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] }, + "down": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] } + } + }, + { + "name": "Coil Rod 3", + "from": [ 12.0, 10.0, 4.0 ], + "to": [ 14.0, 12.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "south": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "up": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] }, + "down": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 15.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/dead_crops.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/dead_crops.json new file mode 100644 index 00000000..74760ff3 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/dead_crops.json @@ -0,0 +1,6 @@ +{ + "parent": "block/crop", + "textures": { + "crop": "toughasnails:blocks/dead_crops" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/fireplace.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/fireplace.json new file mode 100644 index 00000000..167f9ab8 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/fireplace.json @@ -0,0 +1,135 @@ +{ + "parent": "block/block", + "textures": { + "particle": "blocks/brick", + "0": "blocks/brick", + "1": "blocks/log_oak", + "2": "blocks/log_oak_top", + "3": "blocks/iron_bars", + "4": "blocks/fire_layer_0" + }, + "elements": [ + { + "name": "Bottom", + "from": [ 0.0, 0.0, 4.0 ], + "to": [ 16.0, 2.0, 16.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 14.0, 16.0, 16.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 14.0, 12.0, 16.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 14.0, 16.0, 16.0 ] }, + "west": { "texture": "#0", "uv": [ 4.0, 14.0, 16.0, 16.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 16.0, 12.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 4.0, 16.0, 16.0 ] } + } + }, + { + "name": "Wall", + "from": [ 0.0, 2.0, 4.0 ], + "to": [ 2.0, 10.0, 14.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 14.0, 6.0, 16.0, 14.0 ] }, + "east": { "texture": "#0", "uv": [ 2.0, 6.0, 12.0, 14.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 6.0, 2.0, 14.0 ] }, + "west": { "texture": "#0", "uv": [ 4.0, 6.0, 14.0, 14.0 ] }, + "up": { "texture": "#0", "uv": [ 14.0, 2.0, 16.0, 12.0 ] }, + "down": { "texture": "#0", "uv": [ 14.0, 4.0, 16.0, 14.0 ] } + } + }, + { + "name": "Wall", + "from": [ 14.0, 2.0, 4.0 ], + "to": [ 16.0, 10.0, 14.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 6.0, 2.0, 14.0 ] }, + "east": { "texture": "#0", "uv": [ 2.0, 6.0, 12.0, 14.0 ] }, + "south": { "texture": "#0", "uv": [ 14.0, 6.0, 16.0, 14.0 ] }, + "west": { "texture": "#0", "uv": [ 4.0, 6.0, 14.0, 14.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 2.0, 2.0, 12.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 4.0, 2.0, 14.0 ] } + } + }, + { + "name": "Back", + "from": [ 0.0, 2.0, 14.0 ], + "to": [ 16.0, 10.0, 16.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 6.0, 16.0, 14.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 6.0, 2.0, 14.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 6.0, 16.0, 14.0 ] }, + "west": { "texture": "#0", "uv": [ 14.0, 6.0, 16.0, 14.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 16.0, 2.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 14.0, 16.0, 16.0 ] } + } + }, + { + "name": "Top", + "from": [ 0.0, 10.0, 4.0 ], + "to": [ 16.0, 13.0, 16.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 3.0, 16.0, 6.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 3.0, 12.0, 6.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 3.0, 16.0, 6.0 ] }, + "west": { "texture": "#0", "uv": [ 4.0, 3.0, 16.0, 6.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 16.0, 12.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 4.0, 16.0, 16.0 ] } + } + }, + { + "name": "Upper Top", + "from": [ 2.0, 13.0, 6.0 ], + "to": [ 14.0, 15.0, 14.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 2.0, 1.0, 14.0, 3.0 ] }, + "east": { "texture": "#0", "uv": [ 2.0, 1.0, 10.0, 3.0 ] }, + "south": { "texture": "#0", "uv": [ 2.0, 1.0, 14.0, 3.0 ] }, + "west": { "texture": "#0", "uv": [ 6.0, 1.0, 14.0, 3.0 ] }, + "up": { "texture": "#0", "uv": [ 2.0, 2.0, 14.0, 10.0 ] }, + "down": { "texture": "#0", "uv": [ 2.0, 6.0, 14.0, 14.0 ] } + } + }, + { + "name": "Peak", + "from": [ 4.0, 15.0, 8.0 ], + "to": [ 12.0, 16.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 4.0, 0.0, 12.0, 1.0 ] }, + "east": { "texture": "#0", "uv": [ 4.0, 0.0, 8.0, 1.0 ] }, + "south": { "texture": "#0", "uv": [ 4.0, 0.0, 12.0, 1.0 ] }, + "west": { "texture": "#0", "uv": [ 8.0, 0.0, 12.0, 1.0 ] }, + "up": { "texture": "#0", "uv": [ 4.0, 4.0, 12.0, 8.0 ] }, + "down": { "texture": "#0", "uv": [ 4.0, 8.0, 12.0, 12.0 ] } + } + }, + { + "name": "Log", + "from": [ 2.0, 2.0, 9.0 ], + "to": [ 14.0, 4.0, 13.0 ], + "faces": { + "north": { "texture": "#1", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 }, + "east": { "texture": "#2", "uv": [ 6.0, 7.0, 10.0, 9.0 ] }, + "south": { "texture": "#1", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 }, + "west": { "texture": "#2", "uv": [ 6.0, 7.0, 10.0, 9.0 ] }, + "up": { "texture": "#1", "uv": [ 6.0, 2.0, 10.0, 14.0 ], "rotation": 90 }, + "down": { "texture": "#1", "uv": [ 6.0, 2.0, 10.0, 14.0 ], "rotation": 90 } + } + }, + { + "name": "Guard", + "from": [ 2.0, 2.0, 5.0 ], + "to": [ 14.0, 4.0, 5.0 ], + "faces": { + "north": { "texture": "#3", "uv": [ 2.0, 0.0, 14.0, 2.0 ] }, + "south": { "texture": "#3", "uv": [ 2.0, 0.0, 14.0, 2.0 ] } + } + }, + { + "name": "Fire", + "from": [ 2.0, 4.0, 11.0 ], + "to": [ 14.0, 10.0, 11.0 ], + "faces": { + "north": { "texture": "#4", "uv": [ 2.0, 6.0, 14.0, 12.0 ] }, + "south": { "texture": "#4", "uv": [ 2.0, 6.0, 14.0, 12.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/glowstone_torch.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/glowstone_torch.json new file mode 100644 index 00000000..2491e5cb --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/glowstone_torch.json @@ -0,0 +1,6 @@ +{ + "parent": "block/torch", + "textures": { + "torch": "toughasnails:blocks/glowstone_torch" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/glowstone_torch_wall.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/glowstone_torch_wall.json new file mode 100644 index 00000000..41604e90 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/glowstone_torch_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "block/torch_wall", + "textures": { + "torch": "toughasnails:blocks/glowstone_torch" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/heating_coil_off.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/heating_coil_off.json new file mode 100644 index 00000000..fd8793c5 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/heating_coil_off.json @@ -0,0 +1,179 @@ +{ + "parent": "block/block", + "textures": { + "particle": "blocks/furnace_top", + "0": "toughasnails:blocks/heating_coil_off", + "1": "blocks/furnace_top" + }, + "elements": [ + { + "name": "Base", + "from": [ 0.0, 0.0, 0.0 ], + "to": [ 16.0, 2.0, 16.0 ], + "faces": { + "north": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 2.0 ] }, + "east": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 2.0 ] }, + "south": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 2.0 ] }, + "west": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 2.0 ] }, + "up": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 16.0 ] }, + "down": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 16.0 ] } + } + }, + { + "name": "Coil Rod", + "from": [ 2.0, 2.0, 2.0 ], + "to": [ 14.0, 4.0, 4.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "east": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "west": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 }, + "down": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 } + } + }, + { + "name": "Coil Rod", + "from": [ 2.0, 2.0, 12.0 ], + "to": [ 14.0, 4.0, 14.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "east": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "west": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 }, + "down": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 } + } + }, + { + "name": "Coil Rod", + "from": [ 2.0, 2.0, 4.0 ], + "to": [ 4.0, 4.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "south": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "up": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] }, + "down": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] } + } + }, + { + "name": "Coil Rod", + "from": [ 12.0, 2.0, 4.0 ], + "to": [ 14.0, 4.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "south": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "up": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] }, + "down": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 15.0 ] } + } + }, + { + "name": "Coil Rod 2", + "from": [ 2.0, 6.0, 2.0 ], + "to": [ 14.0, 8.0, 4.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "east": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "west": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 }, + "down": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 } + } + }, + { + "name": "Coil Rod 2", + "from": [ 2.0, 6.0, 12.0 ], + "to": [ 14.0, 8.0, 14.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "east": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "west": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 }, + "down": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 } + } + }, + { + "name": "Coil Rod 2", + "from": [ 2.0, 6.0, 4.0 ], + "to": [ 4.0, 8.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "south": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "up": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] }, + "down": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] } + } + }, + { + "name": "Coil Rod 2", + "from": [ 12.0, 6.0, 4.0 ], + "to": [ 14.0, 8.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "south": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "up": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] }, + "down": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 15.0 ] } + } + }, + { + "name": "Coil Rod 3", + "from": [ 2.0, 10.0, 2.0 ], + "to": [ 14.0, 12.0, 4.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "east": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "west": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 }, + "down": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 } + } + }, + { + "name": "Coil Rod 3", + "from": [ 2.0, 10.0, 12.0 ], + "to": [ 14.0, 12.0, 14.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "east": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "west": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 }, + "down": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 } + } + }, + { + "name": "Coil Rod 3", + "from": [ 2.0, 10.0, 4.0 ], + "to": [ 4.0, 12.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "south": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "up": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] }, + "down": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] } + } + }, + { + "name": "Coil Rod 3", + "from": [ 12.0, 10.0, 4.0 ], + "to": [ 14.0, 12.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "south": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "up": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] }, + "down": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 15.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/heating_coil_on.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/heating_coil_on.json new file mode 100644 index 00000000..5dccd987 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/heating_coil_on.json @@ -0,0 +1,179 @@ +{ + "parent": "block/block", + "textures": { + "particle": "blocks/furnace_top", + "0": "toughasnails:blocks/heating_coil_on", + "1": "blocks/furnace_top" + }, + "elements": [ + { + "name": "Base", + "from": [ 0.0, 0.0, 0.0 ], + "to": [ 16.0, 2.0, 16.0 ], + "faces": { + "north": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 2.0 ] }, + "east": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 2.0 ] }, + "south": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 2.0 ] }, + "west": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 2.0 ] }, + "up": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 16.0 ] }, + "down": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 16.0 ] } + } + }, + { + "name": "Coil Rod", + "from": [ 2.0, 2.0, 2.0 ], + "to": [ 14.0, 4.0, 4.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "east": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "west": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 }, + "down": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 } + } + }, + { + "name": "Coil Rod", + "from": [ 2.0, 2.0, 12.0 ], + "to": [ 14.0, 4.0, 14.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "east": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "west": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 }, + "down": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 } + } + }, + { + "name": "Coil Rod", + "from": [ 2.0, 2.0, 4.0 ], + "to": [ 4.0, 4.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "south": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "up": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] }, + "down": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] } + } + }, + { + "name": "Coil Rod", + "from": [ 12.0, 2.0, 4.0 ], + "to": [ 14.0, 4.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "south": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "up": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] }, + "down": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 15.0 ] } + } + }, + { + "name": "Coil Rod 2", + "from": [ 2.0, 6.0, 2.0 ], + "to": [ 14.0, 8.0, 4.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "east": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "west": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 }, + "down": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 } + } + }, + { + "name": "Coil Rod 2", + "from": [ 2.0, 6.0, 12.0 ], + "to": [ 14.0, 8.0, 14.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "east": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "west": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 }, + "down": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 } + } + }, + { + "name": "Coil Rod 2", + "from": [ 2.0, 6.0, 4.0 ], + "to": [ 4.0, 8.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "south": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "up": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] }, + "down": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] } + } + }, + { + "name": "Coil Rod 2", + "from": [ 12.0, 6.0, 4.0 ], + "to": [ 14.0, 8.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "south": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "up": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] }, + "down": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 15.0 ] } + } + }, + { + "name": "Coil Rod 3", + "from": [ 2.0, 10.0, 2.0 ], + "to": [ 14.0, 12.0, 4.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "east": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "west": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 }, + "down": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 } + } + }, + { + "name": "Coil Rod 3", + "from": [ 2.0, 10.0, 12.0 ], + "to": [ 14.0, 12.0, 14.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "east": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "south": { "texture": "#0", "uv": [ 7.0, 14.0, 9.0, 2.0 ], "rotation": 90 }, + "west": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "up": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 }, + "down": { "texture": "#0", "uv": [ 7.0, 2.0, 9.0, 14.0 ], "rotation": 90 } + } + }, + { + "name": "Coil Rod 3", + "from": [ 2.0, 10.0, 4.0 ], + "to": [ 4.0, 12.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "south": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "up": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] }, + "down": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] } + } + }, + { + "name": "Coil Rod 3", + "from": [ 12.0, 10.0, 4.0 ], + "to": [ 14.0, 12.0, 12.0 ], + "faces": { + "north": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "south": { "texture": "#0", "uv": [ 7.0, 0.0, 9.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ], "rotation": 90 }, + "up": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 11.0 ] }, + "down": { "texture": "#0", "uv": [ 7.0, 3.0, 9.0, 15.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/new_torch.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/new_torch.json new file mode 100644 index 00000000..d3823dc4 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/new_torch.json @@ -0,0 +1,6 @@ +{ + "parent": "block/torch", + "textures": { + "torch": "toughasnails:blocks/torch_off" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/new_torch_wall.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/new_torch_wall.json new file mode 100644 index 00000000..cc246380 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/new_torch_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "block/torch_wall", + "textures": { + "torch": "toughasnails:blocks/torch_off" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/rain_collector_empty.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/rain_collector_empty.json new file mode 100644 index 00000000..5b1af48c --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/rain_collector_empty.json @@ -0,0 +1,74 @@ +{ + "parent": "block/block", + "ambientocclusion": false, + "textures": { + "particle": "toughasnails:blocks/rain_collector_side", + "top": "toughasnails:blocks/rain_collector_top", + "bottom": "toughasnails:blocks/rain_collector_bottom", + "side": "toughasnails:blocks/rain_collector_side", + "inside": "toughasnails:blocks/rain_collector_inner" + }, + "elements": [ + { "from": [ 0, 0, 0 ], + "to": [ 2, 16, 16 ], + "faces": { + "down": { "texture": "#bottom" }, + "up": { "texture": "#top", "cullface": "up" }, + "north": { "texture": "#side", "cullface": "north" }, + "south": { "texture": "#side", "cullface": "south" }, + "west": { "texture": "#side", "cullface": "west" }, + "east": { "texture": "#side" } + } + }, + { "from": [ 2, 0, 2 ], + "to": [ 14, 4, 14 ], + "faces": { + "down": { "texture": "#bottom" }, + "up": { "texture": "#inside", "cullface": "up" }, + "north": { "texture": "#side", "cullface": "north" }, + "south": { "texture": "#side", "cullface": "south" }, + "west": { "texture": "#side", "cullface": "west" }, + "east": { "texture": "#side", "cullface": "east" } + } + }, + { "from": [ 14, 0, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "down": { "texture": "#bottom" }, + "up": { "texture": "#top", "cullface": "up" }, + "north": { "texture": "#side", "cullface": "north" }, + "south": { "texture": "#side", "cullface": "south" }, + "west": { "texture": "#side" }, + "east": { "texture": "#side", "cullface": "east" } + } + }, + { "from": [ 2, 0, 0 ], + "to": [ 14, 16, 2 ], + "faces": { + "down": { "texture": "#bottom" }, + "up": { "texture": "#top", "cullface": "up" }, + "north": { "texture": "#side", "cullface": "north" }, + "south": { "texture": "#side" }, + "west": { "texture": "#side", "cullface": "west" }, + "east": { "texture": "#side", "cullface": "east" } + } + }, + { "from": [ 2, 0, 14 ], + "to": [ 14, 16, 16 ], + "faces": { + "down": { "texture": "#bottom" }, + "up": { "texture": "#top", "cullface": "up" }, + "north": { "texture": "#side" }, + "south": { "texture": "#side", "cullface": "south" }, + "west": { "texture": "#side", "cullface": "west" }, + "east": { "texture": "#side", "cullface": "east" } + } + }, + { "from": [ 2, 16, 2 ], + "to": [ 14, 16, 14 ], + "faces": { + "up": { "texture": "#top" } + } + } + ] +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/rain_collector_level1.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/rain_collector_level1.json new file mode 100644 index 00000000..500c4749 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/rain_collector_level1.json @@ -0,0 +1,80 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "toughasnails:blocks/rain_collector_side", + "top": "toughasnails:blocks/rain_collector_top", + "bottom": "toughasnails:blocks/rain_collector_bottom", + "side": "toughasnails:blocks/rain_collector_side", + "inside": "toughasnails:blocks/rain_collector_inner", + "water": "blocks/water_still" + }, + "elements": [ + { "from": [ 0, 0, 0 ], + "to": [ 2, 16, 16 ], + "faces": { + "down": { "texture": "#bottom" }, + "up": { "texture": "#top", "cullface": "up" }, + "north": { "texture": "#side", "cullface": "north" }, + "south": { "texture": "#side", "cullface": "south" }, + "west": { "texture": "#side", "cullface": "west" }, + "east": { "texture": "#side" } + } + }, + { "from": [ 2, 0, 2 ], + "to": [ 14, 4, 14 ], + "faces": { + "down": { "texture": "#bottom" }, + "up": { "texture": "#inside", "cullface": "up" }, + "north": { "texture": "#side", "cullface": "north" }, + "south": { "texture": "#side", "cullface": "south" }, + "west": { "texture": "#side", "cullface": "west" }, + "east": { "texture": "#side", "cullface": "east" } + } + }, + { "from": [ 14, 0, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "down": { "texture": "#bottom" }, + "up": { "texture": "#top", "cullface": "up" }, + "north": { "texture": "#side", "cullface": "north" }, + "south": { "texture": "#side", "cullface": "south" }, + "west": { "texture": "#side" }, + "east": { "texture": "#side", "cullface": "east" } + } + }, + { "from": [ 2, 0, 0 ], + "to": [ 14, 16, 2 ], + "faces": { + "down": { "texture": "#bottom" }, + "up": { "texture": "#top", "cullface": "up" }, + "north": { "texture": "#side", "cullface": "north" }, + "south": { "texture": "#side" }, + "west": { "texture": "#side", "cullface": "west" }, + "east": { "texture": "#side", "cullface": "east" } + } + }, + { "from": [ 2, 0, 14 ], + "to": [ 14, 16, 16 ], + "faces": { + "down": { "texture": "#bottom" }, + "up": { "texture": "#top", "cullface": "up" }, + "north": { "texture": "#side" }, + "south": { "texture": "#side", "cullface": "south" }, + "west": { "texture": "#side", "cullface": "west" }, + "east": { "texture": "#side", "cullface": "east" } + } + }, + { "from": [ 2, 16, 2 ], + "to": [ 14, 16, 14 ], + "faces": { + "up": { "texture": "#top" } + } + }, + { "from": [ 2, 9, 2 ], + "to": [ 14, 9, 14 ], + "faces": { + "up": { "texture": "#water" } + } + } + ] +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/rain_collector_level2.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/rain_collector_level2.json new file mode 100644 index 00000000..e21df12f --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/rain_collector_level2.json @@ -0,0 +1,80 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "toughasnails:blocks/rain_collector_side", + "top": "toughasnails:blocks/rain_collector_top", + "bottom": "toughasnails:blocks/rain_collector_bottom", + "side": "toughasnails:blocks/rain_collector_side", + "inside": "toughasnails:blocks/rain_collector_inner", + "water": "blocks/water_still" + }, + "elements": [ + { "from": [ 0, 0, 0 ], + "to": [ 2, 16, 16 ], + "faces": { + "down": { "texture": "#bottom" }, + "up": { "texture": "#top", "cullface": "up" }, + "north": { "texture": "#side", "cullface": "north" }, + "south": { "texture": "#side", "cullface": "south" }, + "west": { "texture": "#side", "cullface": "west" }, + "east": { "texture": "#side" } + } + }, + { "from": [ 2, 0, 2 ], + "to": [ 14, 4, 14 ], + "faces": { + "down": { "texture": "#bottom" }, + "up": { "texture": "#inside", "cullface": "up" }, + "north": { "texture": "#side", "cullface": "north" }, + "south": { "texture": "#side", "cullface": "south" }, + "west": { "texture": "#side", "cullface": "west" }, + "east": { "texture": "#side", "cullface": "east" } + } + }, + { "from": [ 14, 0, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "down": { "texture": "#bottom" }, + "up": { "texture": "#top", "cullface": "up" }, + "north": { "texture": "#side", "cullface": "north" }, + "south": { "texture": "#side", "cullface": "south" }, + "west": { "texture": "#side" }, + "east": { "texture": "#side", "cullface": "east" } + } + }, + { "from": [ 2, 0, 0 ], + "to": [ 14, 16, 2 ], + "faces": { + "down": { "texture": "#bottom" }, + "up": { "texture": "#top", "cullface": "up" }, + "north": { "texture": "#side", "cullface": "north" }, + "south": { "texture": "#side" }, + "west": { "texture": "#side", "cullface": "west" }, + "east": { "texture": "#side", "cullface": "east" } + } + }, + { "from": [ 2, 0, 14 ], + "to": [ 14, 16, 16 ], + "faces": { + "down": { "texture": "#bottom" }, + "up": { "texture": "#top", "cullface": "up" }, + "north": { "texture": "#side" }, + "south": { "texture": "#side", "cullface": "south" }, + "west": { "texture": "#side", "cullface": "west" }, + "east": { "texture": "#side", "cullface": "east" } + } + }, + { "from": [ 2, 16, 2 ], + "to": [ 14, 16, 14 ], + "faces": { + "up": { "texture": "#top" } + } + }, + { "from": [ 2, 12, 2 ], + "to": [ 14, 12, 14 ], + "faces": { + "up": { "texture": "#water" } + } + } + ] +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/rain_collector_level3.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/rain_collector_level3.json new file mode 100644 index 00000000..23bd49a0 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/rain_collector_level3.json @@ -0,0 +1,81 @@ +{ + "parent": "block/block", + "ambientocclusion": false, + "textures": { + "particle": "toughasnails:blocks/rain_collector_side", + "top": "toughasnails:blocks/rain_collector_top", + "bottom": "toughasnails:blocks/rain_collector_bottom", + "side": "toughasnails:blocks/rain_collector_side", + "inside": "toughasnails:blocks/rain_collector_inner", + "water": "blocks/water_still" + }, + "elements": [ + { "from": [ 0, 0, 0 ], + "to": [ 2, 16, 16 ], + "faces": { + "down": { "texture": "#bottom" }, + "up": { "texture": "#top", "cullface": "up" }, + "north": { "texture": "#side", "cullface": "north" }, + "south": { "texture": "#side", "cullface": "south" }, + "west": { "texture": "#side", "cullface": "west" }, + "east": { "texture": "#side" } + } + }, + { "from": [ 2, 0, 2 ], + "to": [ 14, 4, 14 ], + "faces": { + "down": { "texture": "#bottom" }, + "up": { "texture": "#inside", "cullface": "up" }, + "north": { "texture": "#side", "cullface": "north" }, + "south": { "texture": "#side", "cullface": "south" }, + "west": { "texture": "#side", "cullface": "west" }, + "east": { "texture": "#side", "cullface": "east" } + } + }, + { "from": [ 14, 0, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "down": { "texture": "#bottom" }, + "up": { "texture": "#top", "cullface": "up" }, + "north": { "texture": "#side", "cullface": "north" }, + "south": { "texture": "#side", "cullface": "south" }, + "west": { "texture": "#side" }, + "east": { "texture": "#side", "cullface": "east" } + } + }, + { "from": [ 2, 0, 0 ], + "to": [ 14, 16, 2 ], + "faces": { + "down": { "texture": "#bottom" }, + "up": { "texture": "#top", "cullface": "up" }, + "north": { "texture": "#side", "cullface": "north" }, + "south": { "texture": "#side" }, + "west": { "texture": "#side", "cullface": "west" }, + "east": { "texture": "#side", "cullface": "east" } + } + }, + { "from": [ 2, 0, 14 ], + "to": [ 14, 16, 16 ], + "faces": { + "down": { "texture": "#bottom" }, + "up": { "texture": "#top", "cullface": "up" }, + "north": { "texture": "#side" }, + "south": { "texture": "#side", "cullface": "south" }, + "west": { "texture": "#side", "cullface": "west" }, + "east": { "texture": "#side", "cullface": "east" } + } + }, + { "from": [ 2, 16, 2 ], + "to": [ 14, 16, 14 ], + "faces": { + "up": { "texture": "#top" } + } + }, + { "from": [ 2, 15, 2 ], + "to": [ 14, 15, 14 ], + "faces": { + "up": { "texture": "#water" } + } + } + ] +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/season_sensor_autumn.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/season_sensor_autumn.json new file mode 100644 index 00000000..a22d1afa --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/season_sensor_autumn.json @@ -0,0 +1,20 @@ +{ "parent": "block/thin_block", + "textures": { + "particle": "toughasnails:blocks/season_sensor_autumn_top", + "top": "toughasnails:blocks/season_sensor_autumn_top", + "side": "toughasnails:blocks/season_sensor_side" + }, + "elements": [ + { "from": [ 0, 0, 0 ], + "to": [ 16, 6, 16 ], + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" }, + "north": { "uv": [ 0, 10, 16, 16 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 0, 10, 16, 16 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 10, 16, 16 ], "texture": "#side", "cullface": "west" }, + "east": { "uv": [ 0, 10, 16, 16 ], "texture": "#side", "cullface": "east" } + } + } + ] +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/season_sensor_spring.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/season_sensor_spring.json new file mode 100644 index 00000000..22e54165 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/season_sensor_spring.json @@ -0,0 +1,20 @@ +{ "parent": "block/thin_block", + "textures": { + "particle": "toughasnails:blocks/season_sensor_spring_top", + "top": "toughasnails:blocks/season_sensor_spring_top", + "side": "toughasnails:blocks/season_sensor_side" + }, + "elements": [ + { "from": [ 0, 0, 0 ], + "to": [ 16, 6, 16 ], + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" }, + "north": { "uv": [ 0, 10, 16, 16 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 0, 10, 16, 16 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 10, 16, 16 ], "texture": "#side", "cullface": "west" }, + "east": { "uv": [ 0, 10, 16, 16 ], "texture": "#side", "cullface": "east" } + } + } + ] +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/season_sensor_summer.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/season_sensor_summer.json new file mode 100644 index 00000000..02d2afdb --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/season_sensor_summer.json @@ -0,0 +1,20 @@ +{ "parent": "block/thin_block", + "textures": { + "particle": "toughasnails:blocks/season_sensor_summer_top", + "top": "toughasnails:blocks/season_sensor_summer_top", + "side": "toughasnails:blocks/season_sensor_side" + }, + "elements": [ + { "from": [ 0, 0, 0 ], + "to": [ 16, 6, 16 ], + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" }, + "north": { "uv": [ 0, 10, 16, 16 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 0, 10, 16, 16 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 10, 16, 16 ], "texture": "#side", "cullface": "west" }, + "east": { "uv": [ 0, 10, 16, 16 ], "texture": "#side", "cullface": "east" } + } + } + ] +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/season_sensor_winter.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/season_sensor_winter.json new file mode 100644 index 00000000..83b0b10c --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/block/season_sensor_winter.json @@ -0,0 +1,20 @@ +{ "parent": "block/thin_block", + "textures": { + "particle": "toughasnails:blocks/season_sensor_winter_top", + "top": "toughasnails:blocks/season_sensor_winter_top", + "side": "toughasnails:blocks/season_sensor_side" + }, + "elements": [ + { "from": [ 0, 0, 0 ], + "to": [ 16, 6, 16 ], + "faces": { + "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#side", "cullface": "down" }, + "up": { "uv": [ 0, 0, 16, 16 ], "texture": "#top" }, + "north": { "uv": [ 0, 10, 16, 16 ], "texture": "#side", "cullface": "north" }, + "south": { "uv": [ 0, 10, 16, 16 ], "texture": "#side", "cullface": "south" }, + "west": { "uv": [ 0, 10, 16, 16 ], "texture": "#side", "cullface": "west" }, + "east": { "uv": [ 0, 10, 16, 16 ], "texture": "#side", "cullface": "east" } + } + } + ] +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/air_filter.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/air_filter.json new file mode 100644 index 00000000..70dd7318 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/air_filter.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/air_filter" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/bottle_of_blackdamp.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/bottle_of_blackdamp.json new file mode 100644 index 00000000..56a20a54 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/bottle_of_blackdamp.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/bottle_of_blackdamp" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/bottle_of_firedamp.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/bottle_of_firedamp.json new file mode 100644 index 00000000..6dc3e495 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/bottle_of_firedamp.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/bottle_of_firedamp" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/bottle_of_stinkdamp.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/bottle_of_stinkdamp.json new file mode 100644 index 00000000..4de96ed7 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/bottle_of_stinkdamp.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/bottle_of_stinkdamp" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/bottle_of_whitedamp.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/bottle_of_whitedamp.json new file mode 100644 index 00000000..3e5b6ff5 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/bottle_of_whitedamp.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/bottle_of_whitedamp" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/campfire.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/campfire.json new file mode 100644 index 00000000..1b6d1fb7 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/campfire.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/campfire" + } +} + diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/canteen.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/canteen.json new file mode 100644 index 00000000..7e608038 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/canteen.json @@ -0,0 +1,10 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/canteen_empty" + }, + "overrides": [ + { "predicate": { "filled": 0.0 }, "model": "toughasnails:item/canteen" }, + { "predicate": { "filled": 1.0 }, "model": "toughasnails:item/canteen_filled" } + ] +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/canteen_empty.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/canteen_empty.json new file mode 100644 index 00000000..569114fe --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/canteen_empty.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/canteen_empty" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/canteen_filled.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/canteen_filled.json new file mode 100644 index 00000000..3717343c --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/canteen_filled.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/canteen_filled" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/charcoal_filter.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/charcoal_filter.json new file mode 100644 index 00000000..4290040b --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/charcoal_filter.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/charcoal_filter" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/chiller.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/chiller.json new file mode 100644 index 00000000..11058635 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/chiller.json @@ -0,0 +1,3 @@ +{ + "parent": "toughasnails:block/chiller" +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/cooling_coil.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/cooling_coil.json new file mode 100644 index 00000000..d135c7ef --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/cooling_coil.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/cooling_coil" + } +} + diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/dead_crops.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/dead_crops.json new file mode 100644 index 00000000..f63717c9 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/dead_crops.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:blocks/dead_crops" + } +} + diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/dirty_water_bottle.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/dirty_water_bottle.json new file mode 100644 index 00000000..d0a1ae57 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/dirty_water_bottle.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/dirty_water_bottle" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/filtered_water_bottle.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/filtered_water_bottle.json new file mode 100644 index 00000000..4ce0eb97 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/filtered_water_bottle.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/filtered_water_bottle" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/fireplace.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/fireplace.json new file mode 100644 index 00000000..b3206a12 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/fireplace.json @@ -0,0 +1,3 @@ +{ + "parent": "toughasnails:block/fireplace" +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/freeze_powder.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/freeze_powder.json new file mode 100644 index 00000000..58a32ccd --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/freeze_powder.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/freeze_powder" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/freeze_rod.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/freeze_rod.json new file mode 100644 index 00000000..016b0475 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/freeze_rod.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/freeze_rod" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/glowstone_torch.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/glowstone_torch.json new file mode 100644 index 00000000..ecfa08fb --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/glowstone_torch.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:blocks/glowstone_torch" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/heating_coil.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/heating_coil.json new file mode 100644 index 00000000..86ea4d6c --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/heating_coil.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/heating_coil" + } +} + diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/ice_charge.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/ice_charge.json new file mode 100644 index 00000000..1cf98cf2 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/ice_charge.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/ice_charge" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/ice_cube.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/ice_cube.json new file mode 100644 index 00000000..d41d82bf --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/ice_cube.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/ice_cube" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/jelled_slime.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/jelled_slime.json new file mode 100644 index 00000000..4ae6ea18 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/jelled_slime.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/jelled_slime" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/jelled_slime_boots.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/jelled_slime_boots.json new file mode 100644 index 00000000..7ae4c8a9 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/jelled_slime_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/jelled_slime_boots" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/jelled_slime_chestplate.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/jelled_slime_chestplate.json new file mode 100644 index 00000000..a5162544 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/jelled_slime_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/jelled_slime_chestplate" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/jelled_slime_helmet.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/jelled_slime_helmet.json new file mode 100644 index 00000000..acf872d1 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/jelled_slime_helmet.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/jelled_slime_helmet" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/jelled_slime_leggings.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/jelled_slime_leggings.json new file mode 100644 index 00000000..a87fbbd5 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/jelled_slime_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/jelled_slime_leggings" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_apple.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_apple.json new file mode 100644 index 00000000..f25f5e3a --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_apple.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/juice_apple" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_beetroot.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_beetroot.json new file mode 100644 index 00000000..fec5f365 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_beetroot.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/juice_beetroot" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_cactus.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_cactus.json new file mode 100644 index 00000000..4312c157 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_cactus.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/juice_cactus" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_carrot.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_carrot.json new file mode 100644 index 00000000..7ebcebb2 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_carrot.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/juice_carrot" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_chorus_fruit.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_chorus_fruit.json new file mode 100644 index 00000000..f77cca8b --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_chorus_fruit.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/juice_chorus_fruit" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_glistering_melon.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_glistering_melon.json new file mode 100644 index 00000000..e475b596 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_glistering_melon.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/juice_glistering_melon" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_golden_apple.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_golden_apple.json new file mode 100644 index 00000000..af8df458 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_golden_apple.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/juice_golden_apple" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_golden_carrot.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_golden_carrot.json new file mode 100644 index 00000000..3de39168 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_golden_carrot.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/juice_golden_carrot" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_melon.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_melon.json new file mode 100644 index 00000000..cc4935d2 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_melon.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/juice_melon" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_pumpkin.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_pumpkin.json new file mode 100644 index 00000000..9257be8e --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/juice_pumpkin.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/juice_pumpkin" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/lifeblood_crystal.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/lifeblood_crystal.json new file mode 100644 index 00000000..650dbd7a --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/lifeblood_crystal.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/lifeblood_crystal" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/rain_collector.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/rain_collector.json new file mode 100644 index 00000000..c48326f3 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/rain_collector.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/rain_collector" + } +} + diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/respirator.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/respirator.json new file mode 100644 index 00000000..5fd17603 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/respirator.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/respirator" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock.json new file mode 100644 index 00000000..a6af7a48 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock.json @@ -0,0 +1,32 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/season_clock_00" + }, + "overrides": [ + { "predicate": { "time": 0.0000000000000000 }, "model": "toughasnails:item/season_clock" }, + { "predicate": { "time": 0.0416666666666665 }, "model": "toughasnails:item/season_clock_01" }, + { "predicate": { "time": 0.0833333333333332 }, "model": "toughasnails:item/season_clock_02" }, + { "predicate": { "time": 0.1249999999999999 }, "model": "toughasnails:item/season_clock_03" }, + { "predicate": { "time": 0.1666666666666666 }, "model": "toughasnails:item/season_clock_04" }, + { "predicate": { "time": 0.2083333333333333 }, "model": "toughasnails:item/season_clock_05" }, + { "predicate": { "time": 0.2500000000000000 }, "model": "toughasnails:item/season_clock_06" }, + { "predicate": { "time": 0.2916666666666667 }, "model": "toughasnails:item/season_clock_07" }, + { "predicate": { "time": 0.3333333333333334 }, "model": "toughasnails:item/season_clock_08" }, + { "predicate": { "time": 0.3750000000000001 }, "model": "toughasnails:item/season_clock_09" }, + { "predicate": { "time": 0.4166666666666668 }, "model": "toughasnails:item/season_clock_10" }, + { "predicate": { "time": 0.4583333333333335 }, "model": "toughasnails:item/season_clock_11" }, + { "predicate": { "time": 0.5000000000000000 }, "model": "toughasnails:item/season_clock_12" }, + { "predicate": { "time": 0.5416666666666667 }, "model": "toughasnails:item/season_clock_13" }, + { "predicate": { "time": 0.5833333333333334 }, "model": "toughasnails:item/season_clock_14" }, + { "predicate": { "time": 0.6250000000000001 }, "model": "toughasnails:item/season_clock_15" }, + { "predicate": { "time": 0.6666666666666668 }, "model": "toughasnails:item/season_clock_16" }, + { "predicate": { "time": 0.7083333333333335 }, "model": "toughasnails:item/season_clock_17" }, + { "predicate": { "time": 0.7500000000000000 }, "model": "toughasnails:item/season_clock_18" }, + { "predicate": { "time": 0.7916666666666667 }, "model": "toughasnails:item/season_clock_19" }, + { "predicate": { "time": 0.8333333333333334 }, "model": "toughasnails:item/season_clock_20" }, + { "predicate": { "time": 0.8750000000000001 }, "model": "toughasnails:item/season_clock_21" }, + { "predicate": { "time": 0.9166666666666668 }, "model": "toughasnails:item/season_clock_22" }, + { "predicate": { "time": 0.9583333333333335 }, "model": "toughasnails:item/season_clock_23" } + ] +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_00.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_00.json new file mode 100644 index 00000000..f03f1e33 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_00.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/season_clock_00" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_01.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_01.json new file mode 100644 index 00000000..081ecbc8 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_01.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/season_clock_01" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_02.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_02.json new file mode 100644 index 00000000..2cbfed5e --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_02.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/season_clock_02" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_03.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_03.json new file mode 100644 index 00000000..25adfdf2 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_03.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/season_clock_03" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_04.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_04.json new file mode 100644 index 00000000..d67c1a4c --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_04.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/season_clock_04" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_05.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_05.json new file mode 100644 index 00000000..b74cf52d --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_05.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/season_clock_05" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_06.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_06.json new file mode 100644 index 00000000..0bd92cd9 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_06.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/season_clock_06" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_07.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_07.json new file mode 100644 index 00000000..685c02a7 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_07.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/season_clock_07" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_08.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_08.json new file mode 100644 index 00000000..d657ee7e --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_08.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/season_clock_08" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_09.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_09.json new file mode 100644 index 00000000..d0635214 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_09.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/season_clock_09" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_10.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_10.json new file mode 100644 index 00000000..1957647d --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_10.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/season_clock_10" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_11.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_11.json new file mode 100644 index 00000000..f1ace506 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_11.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/season_clock_11" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_12.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_12.json new file mode 100644 index 00000000..a9f9f4c2 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_12.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/season_clock_12" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_13.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_13.json new file mode 100644 index 00000000..e46179f3 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_13.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/season_clock_13" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_14.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_14.json new file mode 100644 index 00000000..88f4e9ec --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_14.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/season_clock_14" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_15.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_15.json new file mode 100644 index 00000000..609627f2 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_15.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/season_clock_15" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_16.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_16.json new file mode 100644 index 00000000..5f1bb16a --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_16.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/season_clock_16" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_17.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_17.json new file mode 100644 index 00000000..cbe42361 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_17.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/season_clock_17" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_18.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_18.json new file mode 100644 index 00000000..ac768925 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_18.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/season_clock_18" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_19.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_19.json new file mode 100644 index 00000000..6f899193 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_19.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/season_clock_19" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_20.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_20.json new file mode 100644 index 00000000..c1305516 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_20.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/season_clock_20" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_21.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_21.json new file mode 100644 index 00000000..fbf71ffb --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_21.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/season_clock_21" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_22.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_22.json new file mode 100644 index 00000000..8804bf0b --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_22.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/season_clock_22" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_23.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_23.json new file mode 100644 index 00000000..47cd6ec8 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_clock_23.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/season_clock_23" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_sensor_autumn.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_sensor_autumn.json new file mode 100644 index 00000000..92087f4a --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_sensor_autumn.json @@ -0,0 +1,4 @@ +{ + "parent": "toughasnails:block/season_sensor_autumn" +} + diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_sensor_spring.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_sensor_spring.json new file mode 100644 index 00000000..240fdbb6 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_sensor_spring.json @@ -0,0 +1,4 @@ +{ + "parent": "toughasnails:block/season_sensor_spring" +} + diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_sensor_summer.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_sensor_summer.json new file mode 100644 index 00000000..0195d50d --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_sensor_summer.json @@ -0,0 +1,4 @@ +{ + "parent": "toughasnails:block/season_sensor_summer" +} + diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_sensor_winter.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_sensor_winter.json new file mode 100644 index 00000000..9a20c52d --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/season_sensor_winter.json @@ -0,0 +1,4 @@ +{ + "parent": "toughasnails:block/season_sensor_winter" +} + diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/spawn_egg_freeze.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/spawn_egg_freeze.json new file mode 100644 index 00000000..908f7fa0 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/spawn_egg_freeze.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "items/spawn_egg", + "layer1": "items/spawn_egg_overlay" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/tan_icon.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/tan_icon.json new file mode 100644 index 00000000..c571f410 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/tan_icon.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/tan_icon" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer.json new file mode 100644 index 00000000..d7f3bfe4 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer.json @@ -0,0 +1,29 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/thermometer_00" + }, + "overrides": [ + { "predicate": { "temperature": 0.000000000000000 }, "model": "toughasnails:item/thermometer" }, + { "predicate": { "temperature": 0.047619047619048 }, "model": "toughasnails:item/thermometer_01" }, + { "predicate": { "temperature": 0.0952380952380956 }, "model": "toughasnails:item/thermometer_02" }, + { "predicate": { "temperature": 0.1428571428571432 }, "model": "toughasnails:item/thermometer_03" }, + { "predicate": { "temperature": 0.1904761904761908 }, "model": "toughasnails:item/thermometer_04" }, + { "predicate": { "temperature": 0.2380952380952384 }, "model": "toughasnails:item/thermometer_05" }, + { "predicate": { "temperature": 0.285714285714286 }, "model": "toughasnails:item/thermometer_06" }, + { "predicate": { "temperature": 0.3333333333333336 }, "model": "toughasnails:item/thermometer_07" }, + { "predicate": { "temperature": 0.3809523809523812 }, "model": "toughasnails:item/thermometer_08" }, + { "predicate": { "temperature": 0.4285714285714288 }, "model": "toughasnails:item/thermometer_09" }, + { "predicate": { "temperature": 0.4761904761904764 }, "model": "toughasnails:item/thermometer_10" }, + { "predicate": { "temperature": 0.523809523809524 }, "model": "toughasnails:item/thermometer_11" }, + { "predicate": { "temperature": 0.5714285714285716 }, "model": "toughasnails:item/thermometer_12" }, + { "predicate": { "temperature": 0.6190476190476192 }, "model": "toughasnails:item/thermometer_13" }, + { "predicate": { "temperature": 0.6666666666666668 }, "model": "toughasnails:item/thermometer_14" }, + { "predicate": { "temperature": 0.7142857142857144 }, "model": "toughasnails:item/thermometer_15" }, + { "predicate": { "temperature": 0.761904761904762 }, "model": "toughasnails:item/thermometer_16" }, + { "predicate": { "temperature": 0.8095238095238096 }, "model": "toughasnails:item/thermometer_17" }, + { "predicate": { "temperature": 0.8571428571428572 }, "model": "toughasnails:item/thermometer_18" }, + { "predicate": { "temperature": 0.9047619047619048 }, "model": "toughasnails:item/thermometer_19" }, + { "predicate": { "temperature": 0.9523809523809524 }, "model": "toughasnails:item/thermometer_20" } + ] +} \ No newline at end of file diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_00.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_00.json new file mode 100644 index 00000000..d82072cd --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_00.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/thermometer_00" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_01.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_01.json new file mode 100644 index 00000000..87ce488b --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_01.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/thermometer_01" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_02.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_02.json new file mode 100644 index 00000000..9d718c6b --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_02.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/thermometer_02" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_03.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_03.json new file mode 100644 index 00000000..514f333b --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_03.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/thermometer_03" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_04.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_04.json new file mode 100644 index 00000000..4be01e43 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_04.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/thermometer_04" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_05.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_05.json new file mode 100644 index 00000000..57fd02bf --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_05.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/thermometer_05" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_06.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_06.json new file mode 100644 index 00000000..d55cee36 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_06.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/thermometer_06" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_07.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_07.json new file mode 100644 index 00000000..40286dc2 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_07.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/thermometer_07" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_08.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_08.json new file mode 100644 index 00000000..7d8095cc --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_08.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/thermometer_18" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_09.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_09.json new file mode 100644 index 00000000..3e542f6f --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_09.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/thermometer_09" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_10.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_10.json new file mode 100644 index 00000000..e5c14847 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_10.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/thermometer_10" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_11.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_11.json new file mode 100644 index 00000000..52084a0a --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_11.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/thermometer_11" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_12.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_12.json new file mode 100644 index 00000000..bba0ad26 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_12.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/thermometer_12" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_13.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_13.json new file mode 100644 index 00000000..8fea8f2c --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_13.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/thermometer_13" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_14.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_14.json new file mode 100644 index 00000000..5fd0a416 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_14.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/thermometer_14" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_15.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_15.json new file mode 100644 index 00000000..09027e3c --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_15.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/thermometer_15" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_16.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_16.json new file mode 100644 index 00000000..ffba7ef0 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_16.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/thermometer_16" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_17.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_17.json new file mode 100644 index 00000000..b7d57842 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_17.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/thermometer_17" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_18.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_18.json new file mode 100644 index 00000000..7d8095cc --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_18.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/thermometer_18" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_19.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_19.json new file mode 100644 index 00000000..29ca7ddb --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_19.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/thermometer_19" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_20.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_20.json new file mode 100644 index 00000000..65e29a19 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/thermometer_20.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/thermometer_20" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/torch_new.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/torch_new.json new file mode 100644 index 00000000..4e6da468 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/torch_new.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "blocks/torch_on" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/wool_boots.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/wool_boots.json new file mode 100644 index 00000000..e33031f9 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/wool_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/wool_boots" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/wool_chestplate.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/wool_chestplate.json new file mode 100644 index 00000000..55d04737 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/wool_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/wool_chestplate" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/wool_helmet.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/wool_helmet.json new file mode 100644 index 00000000..5cd4bf0f --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/wool_helmet.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/wool_helmet" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/wool_leggings.json b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/wool_leggings.json new file mode 100644 index 00000000..bf09e8ff --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/models/item/wool_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "toughasnails:items/wool_leggings" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/chiller.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/chiller.png new file mode 100644 index 0000000000000000000000000000000000000000..da9a70400bcded2059671c691d095a22ac04142e GIT binary patch literal 575 zcmV-F0>J%=P)3s+C|4j# z(uuZ?#K446T@>8>Ri@&*813a2fOvX>wUlV{cM#= zr9KT3i9|dekHumi2BA}VK^L4CX<$BX~TRz?{qrD;jmCBv|6nngL1hHGairm zLgw@NX0xdckw~OouWvRR+qOre(U*baIFrewR;wM4$Nhdk7z_|pt5r%+JjV&qp8+E9 z{RZLB=kshfBfBn%0$kVqeE~*t1EfN3x7)>HL1QW!jkeqE-EOy9t>g|fiSdXUDVR>D zB+>@@pe+hT)bIC2D&UNiZ==yToleMt!JuM}Gyn^h%O%4BQct(rg(M_BRWO@$I;{=4 zT#g|e4hLRf0GG>!Oo2dvK@s9vuh+d^4-K19rBaEaA1_chQf0t_@OklgAj@X6+CZVw z?)`q}i_Y)&`+Pnzz+A6au8`?HV4!1>dcXisd;INoV~l#!Vh|RH0x3ZBP9kH=s#q*~ z8}NWafJbbcnW286QmJ6oyD@+T?`I(4^935G6|DRx0zwZ@>P1?X^$%gMLizTh%QOH0 N002ovPDHLkV1j_V?w$Yu literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/cooling_coil_off.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/cooling_coil_off.png new file mode 100644 index 0000000000000000000000000000000000000000..62034e68a2350356ed4ae02a68c877754055439c GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+L6~vJ#O${~L5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33Jx%6EJLI-J4N)z4*}Q$iB}j2(69 literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/cooling_coil_on.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/cooling_coil_on.png new file mode 100644 index 0000000000000000000000000000000000000000..fbf99e2e960b7c62c5b94b5ddbe64f577ce92a6f GIT binary patch literal 343 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXPIMM=Lb}C)zif> z#KM2+WNmIHN0HX=_a$>T9dwca~)sD46$7oPXcrXWYTIS(mh0 zZMz}Nb8!cF?UvN6PjL1v6FL;T9KtmHv*^1)#G?)z4*}Q$iB}W?+DL literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/dead_crops.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/dead_crops.png new file mode 100644 index 0000000000000000000000000000000000000000..4bce33840f430b358faee2a3032e112b1315cb07 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+L6~vJ#O${~L5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33J20UBs%2pMy8ZbOM{!6;yXd+u9!=_zR3NHU=sBH~@WAZva31|m{r>mdK II;Vst0Fe?#;s5{u literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/glowstone_torch.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/glowstone_torch.png new file mode 100644 index 0000000000000000000000000000000000000000..62778dba8355146fad791c558fb314939c41f22b GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJwt=FTwDi$it;^O978PplOu~vZZBsxAFWVz}!aSjBCwpp~2fxvu{A>m9 teT>FhHvgkvdj>yaD%LHuVKXpbVCd6#?0uttcP`Ls22WQ%mvv4FO#s)N2bZe?^J zG%heMIczh2P5=M_%1J~)R5(v{Q`=4gF%a#S@}Th+jV~HV(2z(XMgt!A@8O{Y_ibvq~2?_Q9OH2a?>kq{)ybNq=78&)9`w5mIF zRo*1nL4XQ#c!SuN4c_I@@y<;J@d6y8ozFP5jlJz%Dj$TiK`nN1c4%cUjSq z(P(7EwnCfxYi=VP(L#uZ{WkTU&$t3~NLC0bm72|gX^HK^I#Aw6r%X@vW2XTQNvEPP zDVB_`>S|7(&aQ^%Ubl~m2MA~#`ec`=xnAZ>=&{fcwU=Hm`Oy#sJ@6217^$H!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXPIMM=Lb~t)zif> z#KOOHvSPMVqD1RodG2J#3#VNIHm>l^dDiNBQ0KR@HsA3XiHD|{WKLu~eQ3?56ajYO zJFU?=T}FM+TYujx5tFO1@UOD}5ybE>^|CMXY3Wt(+GOVLkL3N46;x{eYZpGs*UuC~t76J=C3~tEPcLwR%T&??2@HW`^Z{ph)>wt{p z{A~5@ed?+V!=e(t$4Y*a*}(QZv+Pg(-n7cP;fmyv{+|qwq>lIk1AxKP)z4*}Q$iB} D=}wYh literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/log_burnt.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/log_burnt.png new file mode 100644 index 0000000000000000000000000000000000000000..79b0c68c7f9493f871cb05dc1f76d5b6f2437f85 GIT binary patch literal 616 zcmV-u0+;=XP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;(#7eog=Y0oh4JK~y+TEt1KO+b|GBc?~9rrPx}zNThaI zmd0Z_8D|a-kVF3ekMcMSU=T99s=BJ1!s=pb)!gaVQRPY0R@vIiN@Y_c8670a=Ub`RcPEVu1Mm> zB-F+Hjix7}TzUd})M$F{&A!y!hE$j- z)9-6vA_2}6(J^{qC!WB{SReiPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;(#7eog=Y0k%m*K~y+TMUq)>gD?<;dG1T2Rv~F2K!8BF z?<0iVYLkcl|KHQkIBKQE8pht)^{kc9)dN>IG}SR=%$M^Szmi!kXK$}BuDJk*n-!sO zdaS&27knS`a~FbT)RED|W}8^>UAjKhK4jvX3VN`YA>P-1m)lKh6``I7S``}rNXZw` ziUiaZY6;n=tco*a(Rr=l<4$7+)YIxMBA&iZp}*+znu z1d^%qtRPz=0ad8Wko1Mq7q0AtAo;qBhUsFoqhNv%&TW+FVPAU`IX3>O746ARC~o)n+zq zo0wUk;S3nB%0QRGA~Vo)e@f67uMB7sw%FsY;K)^3iTk;FoQm5J(<-~-(%b=C*+T{Z zJB3Lna`sq6xA+E+y230#Byc&Qlv>;s<7tfbHYA+JKn`&1-=!v9Gl8)c6P1DSUG4xF z%dT|G>1q8uqO00000NkvXXu0mjf+JE&` literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/rain_collector_bottom.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/rain_collector_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..a3a5a08557cdc2f77eb77d2c270853d5115d0a94 GIT binary patch literal 550 zcmV+>0@?kEP)#nY@ zno+&Kzr$j&NSMuL7>!043^8rbc2D0R$fwOUxMR+vmCsCZE>ml26XkV>WC za=8!+h0tg;Bs?CEPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^5z3JSmg00F&8L_t(IPnD8Mj{#8>h3mhNh)9Q&vb z!2*f7#1LYPp-BvFo`q;_2pcPZw7;sd=vumqmwNBrbM86km0-8qKb5jttrm;LY&L%= zrPu47PN#ay)?hH$Y&KC8Wk9uBjmP7eOvdB!L?V$drF=dgC%IgXl|#4N9S(75~WgUx7)G8E=xiH1nlAdR!VK!ZnxL#^>VqiTCLS;)o3&@CYVenXhx$E z69$99a5w}UjYfZ!;$%LbLs2Xip_T#oz!pLQwA*dK-1U0BX0y3mE}6;IY&JtAZ91J! zAV&kWmbw8zQoCI2T})=sBG_7txJ0Hf-b3=jhVm?l=T=bHGq zR$Jj_Ws9W4;Q&Ar>;J+7t?6_c$4pbXC{3(zpU-DfVuehFJsuCpBy(PEX9SjCTp^(q# zi^XD*NF0UT-uSIU)c{AO?d$sZ?q-8dRUp=Rcp%WHKQGJFQlW zkxeSe<#Gx^tyWXwd_K=+v(0An*PmD{7VUPM2JH9y^?F^a)c{Z%*(5$@l}cqa8ol4| zPN#D`9uJ2Dpy6;>EEdb}3Dvpv7jsO4v07*qoM6N<$g4 literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/rain_collector_top.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/rain_collector_top.png new file mode 100644 index 0000000000000000000000000000000000000000..393ee7fdc39ed44e52539eec595c5e9046d27e00 GIT binary patch literal 525 zcmV+o0`mQdP)N2bZe?^J zG%heMF)*zP3cvsW0g6dPK~y+Tb(6<#12GIl^%pLH+rj~zVEEbwf zCYsG=p--n%&F6D%Hk-iF!F}$tlx3Ng%cbh|x>~K4`u%>$N~NN9yRAl}p=!0NX0xec zvG{`#=ytm)L5&SS`d&CdaskQebUGgxw%j3|4+hMa5(&B03CaGv_hc}@-G`~j8W*_ZufRTMeW^8dcEGi48Z6J9SR4d(I_JP zHL@dC9z$}O^wV~`{YZgIbD7q$r;Vh5P8)FsM$l*@Kc+7q#e0@@vtmyQuumRe3Ik9s zmqR-0U@!;_9hUx9tJT{9c~H@OWJ?zFfwT=028Y8z>GgU=7swUBZS>fpyFSKBrBc)_ z2FYE(BOepShk+lJbtaZQ^a;u{NYKCu8wSJAmgh`;{H* P00000NkvXXu0mjfCXU}p literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/season_sensor_autumn_top.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/season_sensor_autumn_top.png new file mode 100644 index 0000000000000000000000000000000000000000..93fc55d7661485b94c133160e6a7a32433d198f8 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DkBK$x-p&dPkCphSslL`iUdT1k0gQ7S`0VrE{6US4X6f{C7io@I`4ogYxmQcoAh z5DWjg6Aby94R{!S20yD&ihs%di=%8>-rd!G9&=B3+?cQ{S@pBCZ=hkg@t;3 znRgEU;8bk+d2>=t#ryIA)&$Al=U0#LT=By}Z;C1rt33 zJ_`SFbMAF>rY7WXho1%HR{fs8CSq!Mc_e2ac+SGs^+F3#A$s j6&NJh_%a!ou`yh}xBR!jn+b_PD;Ydp{an^LB{Ts5wzEsb literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/season_sensor_spring_top.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/season_sensor_spring_top.png new file mode 100644 index 0000000000000000000000000000000000000000..bd02cab6e049406ffb4fbb509191da6e37e9ce98 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DkBK$x-p&dPkCphSslL`iUdT1k0gQ7S`0VrE{6US4X6f{C7io@I`4ogYxmQcoAh z5DWjg6Aby94R{!S20yD&y8n>1rlE7@Lha=3Uai_Ja4EKJ2iD*yDvt+c}9^Mt!%XB8Hzjuy+$-z}x7rLc#@=q+} zdL!oc#=-s4x-$#84kTtw@Y$I0!g!U#`a4tDLmKZM>X3cmacin&2;+o}Z!SKsSNNg4 nVOBwUhLP*aRRxN3elui$@m*ZG?crpggBd(s{an^LB{Ts5SK4lQ literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/season_sensor_summer_top.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/season_sensor_summer_top.png new file mode 100644 index 0000000000000000000000000000000000000000..04f9b0d2a623c6524a58d127f64b9980ce43a28a GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DkBK$x-p&dPkCphSslL`iUdT1k0gQ7S`0VrE{6US4X6f{C7io@I`4ogYxma!(h> z5DWjg6Ap47HsE2{Jo$dyp~odn?J_uJ4~uaelDA8?+@$B;ne>x{1O~Y7wEVRe{ZK zc~wIi@1E+Aec^Fys%i-1i8i*ABCFf(E#ms3!lvI6;>1s;*b z3=DkBK$x-p&dPkCphSslL`iUdT1k0gQ7S`0VrE{6US4X6f{C7io@I`4ogYxmVow*x z5DWjg6Atn=8}KmP)O@cq@uZcbc>+Vo*PC78+IAiMwNqSooSHV7jg?hL`_ZEqnaewx zKMFf>y#1i`^TWOO3%Cwc|17&)@m78g!~FS{uB+V`)AruUFLJuTvU-(+e%6M)3tO}{ zL`!aDmi64dsYQ$7<^_eBNmnmKhcw15)ie%iynCuc_Jzl-sj4B26E?oNc)MQVhx&$D l1!);Zt}9m+D9njw>^+`Xw|x0cA)s>^JYD@<);T3K0RZRiY?1%~ literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/torch_off.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/blocks/torch_off.png new file mode 100644 index 0000000000000000000000000000000000000000..9af4f5eae10a091ed5a1b7ad7dbd4e0a68e7c744 GIT binary patch literal 1274 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Lb6AYF9SoBDg#49GXulV|3LaB z14F3+1H-EX1_rAc3=HD=lj4uMF)%PQ1o(uw0`+JqifXBgnrn$$>q*<_%h(#onw#r6 z7%MoLD*4!|r3V?-B-uGQI7}{fnOf>Lz1(9)h3EYG0HDTEFd70wJp?Wu+3UiR|DNig)Whh9@%q!8$ zOD$0_(KFC9G+4{UbpWWy+0(@_L?bx)M?YJJ)`24&sRvkYR4(M1!N4y*g;DrHa;s4S z)1Ns3Y(5Sh%%>VSITmC;Olt;;HR%Mf#jqOB`1N0&L9Y4r1?fF=E(48Y@O1TaS?83{ F1OSPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!T+tq#F-d_H|7=D z)MTL1#6^tR@Ec!<7r-o{Kmxd#5i!vaH=WsxiHIg%GI1*EM#UKky2aZd8?7VZV$>0A z>~1i+(T;U=ZQr*a9?$=Qr#T&`TO5VGbRT{_=Y7s)=l?&?Id3~FnM_W}HD%ig?=k5U&M+T@q)YF%kELz7nuUjw%b>tF6+QSI0D_{aH zMb&3IjPquL*cm77dGy5pzXyy#9f-s+z+E7(KOnC|)h8qU;|@yWyl%m|_VET5hZ5Yp zp_O;IxTaaf8|dz;FR1waBi#1LM+fMZjV&x5eb9d6y50PYIbc*_^>^G?3@X}wnC_}= zTU!;r+ zyIk-YhXD(!cG2qHURv~8D;u%2X+Mjv^aWJ=9(t^)lWwivm8t`@Ap@$q{-ycPdT2vu zkm~+E#ljx=x{HOE{uZETem<_UqnX>TU)jP2U~bnKP}0~%pC^K}*5{`u+6HKA+fjP? zc$6O9*1@}~I`RdG-G^}05rY8_ec40bhT?1*40!3ULC%Vg{Xx33rk&Ov3ej`>1GLoh z4>g`mumP*~`Dy*{BUIkrdr=0QopcG#1gqUXL7V*JekYn16Lj&R^L=2Z z-d-1o(I3i8iGh8p&(6ds^$yy!tfL>X3l?=Lhzy&L3qH~oI1@(I?xQ?n2UD>~GM=gf z`OPrsMA)z)XI$DYSk&djD*oUoU0qT^C~tekn*z_kG$@y_AYKf(Zp99+OF1VDfJlga z>R5AK*Y~dIox?sjWt-3=B+v zJY5_^D&pQ=ab#pL;9yWxzFFxQJK?b->$7`07gQKHgc({m84j^9Br-J^Fgna&Q1D?8 lP#YB<4U-|CAhN$PfA)~}4}KUu37A(HJYD@<);T3K0RS%Hs}TSI literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/gui/ice_vignette.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/gui/ice_vignette.png new file mode 100644 index 0000000000000000000000000000000000000000..e4c74be8493ba35aadc44556634e33262a950f64 GIT binary patch literal 895 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6&2?&#~tz_78O`%fY(kk47* z5n0T@z;_6Q8AUa`8i0ZlC9V-A!TD(=<%vb93~dIox?sjWt-3=B+v zJzX3_D&pQ=ab#pr;9*cyUORWDk7ctAzgEG!+l;eV7!sKp3>Y0|Fevyi2&ge|2s5;B mG8`He9u1QrpCD4+);w)fTI3gOHy@Z;7(8A5T-G@yGywpo$*K?l literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/gui/logo.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/gui/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3dff5718b636df20602be9a58e89a3d51ac72faf GIT binary patch literal 10954 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 literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/gui/overlay.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/gui/overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..f2e2a7692f48b2d8c8e95f018f41ce1afb4b9988 GIT binary patch literal 3451 zcmeHJ`#03<9{$dZ8JB4^8M!kfyVyI-bV9Y<#x3kZJMAc9Bw>?gGK@Cnk|Pl&-6+?# zoa$8KNH~;{ap}0uE-{!4#*o|0xDIN*o3r+B=MUIFoSwBlpU?9=zr1Tb@8@0XO+V)C zj#AT80{{T!>EU`D03e$b0;s??N7OU_6PrUR+{w!c04mwYFClOMfC0yjo^adr&CJX+ zoREy~c4#@>H3$+#k%~^I8&K1$XivZ*07$dZdhwmgggfreGg@lTZm<*pg#e4iDl02% zXlS^TI+R*ASu4nR+ymBs02fNxAdd-3m>dp=$K(BnzxI9-99!y~nVFed02dY(mY0_o z<=`eZ&;5pP3H;>=lw(_2TMvbL+}n3+FaM7L_^vAN-nFRVMA!si5dOXG*?b_dv z6-xMf8diAFxCsPP^Zz-0pMNGYEYl>qm>R6Qy5ynLS9s6OHuGH$(}}I443nbG>nRN% zQ+ish|4WmeD;H<=b6hHB=d}^~>PwvcVzeCSbS^E{t##;y_1I9lR(rNoLUM_6(SL=g;w&P{tfk)IO) z??>JKk-cfg>&UOl<;{8o2g(sK;*E)eq5_fWGkmiUQL!rXe7UYi{t@f#@6pL;Hjksp zLe)@X`YpYdzUinxsd#0YVQb&Vl`y_mhY1DeaBpMDab@Wp30Q6bd2Rk?V;-}H3#FYVsX!7d?5=e zPB%3!5^=X%Ug7tdrPe%!Q_>@6}?^#~J_Y2$y@eVak1}xdv#P5ke zUGH;O~2l$!OI=kr!U;YGqx8b zSvM+0=uh#QCP>r6M}6B{E*`RQj~s#L)!X&SZ(!dK8HXc`x0;pcL2T@5wlmwwt(~pKo!FpO# z6S`8iu8Lev(ILpNN_H-aaM^)Yod#!x-?T9?CAS?sZm$#}MXZfHP6O0W!Vfl(B+@Id zn~^K(_<`6a-3p7kg}oKq4uY1jyt+PXA;0P_V@cTebgNHvZ1t}EyNt}HL2J(D&WCHy z7M`h~#k1~i*h5>(X^I#obYKBB1FdEK_IX6Gp8GF{DtvbKZ7ibbWmHKOa;4jHz_y+w znT5^~0)yU=-e~9MYA|hn^)6xP;TKUp{ctW@8MdlGC2zDP$C%8o7#K|rIm}1t%O;G} z(6ZFADio|65AkYOhcqv`pXJaT1B=aghZUxG5KKVBcp@_gy>@br&W2>Oo9D%)kE|Jp2%8Mun z>=;uXwPws*!wxbv6U@Z2cXkeShZK8YnmENTt!QbR3sT-^9?ylU^yU_TbxZ+H&cq*z zT=WH2-K}&-)j9j75Wm+E<&B`&H`H3@tc7sZvSK-69Ufw&PHXo9>T##&Mi9OBSM!)E z!;%&sQ)j4L)PgIA)m@u0!Y5O{cGSRXRU0oXld+S|puRy{8@gL7nV{ zRO)pK+FlJ?XFuGMM^wMnUyy--1Q@5@u)D3-s5@o2*h^Mrb>W@hM#j znOfb%lORKe8b8| zBlTZ6Q(A}VtQ)T@Uj!#EX5U~(p7m|-K@N^&5A;j;q;Xhjq0i$&ujpk*yr_HjbANPY zrL#WPKRq0y|9Y_NfH{5iJY&_6(%-mRHEe#aDwh>G<~M)MR#6RhiZcXe9u79)T8xk* zoaZ#|g%R3_Ijo&yRn=oi>8P={@~~w`4PObX5rn=?@rv&<4KV=W$BAE!ldTlJTi;es MH*eQ+XVR5F0Li9}XaE2J literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/air_filter.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/air_filter.png new file mode 100644 index 0000000000000000000000000000000000000000..4d7f0cf0ef4d0b60b869538552fc4e66a035ce2e GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+L6~vJ#O${~L5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33J83=xpiRqki;`(_yKdOGX&jwA_49xI={{*? z9F}*QW$g6QgSS|we|7kSThm20XU5knjimqlVgG1+LuK85&4NEno#INX-jpz@bZ7+0aWy1( k&o16|Fz(5R`kY@3C-$_wW|pye33M-mr>mdKI;Vst0G4`cMF0Q* literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/bottle_of_blackdamp.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/bottle_of_blackdamp.png new file mode 100644 index 0000000000000000000000000000000000000000..44c2d66fb9d95ce569195cb2364fc3b41daafdab GIT binary patch literal 431 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3dtTpz6=aistgPb%?u1b{{!il z3=E|P3=FRl7#OT(FffScPl`Y422{&g;1OBOz`!jC!i@DP@e_f95+$w?CBgY=CFO}l zsSE{)nRz98d8s7|CVB>XmN~|CehdtZf}SppAr}5i0}QiT0z~cvFS(z@KSApa<1|%v zkHwislQ=V8^RCf(%;+OHJ3)PtT9}yQY+c>8IXX56j#R#QUSF0NYh>`?%xuXYc?^HL z!_QV%WM)|Gw|)Hkso?zMa|;bV?Gi|KyI%U^@2`L*^Ze7|#FNe>JbYf-|7F9`-t>(UapvYy;M}lrZ6+Rc(b8d$*pRWBWwwBvaZNnM$4L(+Vi`_Vs*Mqn@ zk<R@rah>=4#3r6X8R_$iy+$X?-2+vabxeJmx8=G{ zUd=X1#W8Z4_|Zg(YrG+$OHb9_U;W6U?=_pmqXSz%oo!_Gj(A>U^m*5g`8WPBCeGg4 Uby~Y42N-}1p00i_>zopr0Mf9fNB{r; literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/bottle_of_firedamp.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/bottle_of_firedamp.png new file mode 100644 index 0000000000000000000000000000000000000000..da6f35156a1904c04bfccd96e6714de952c9e226 GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3dtTpz6=aistgPb%?u1b{{!il z3=E|P3=FRl7#OT(FffScPl`Y422{&g;1OBOz`!jC!i@DP@e_f95+$w?CBgY=CFO}l zsSE{)nRz98d8s7|CVB>XmN~|CehdtZ8lEnWAr}70KmPx>ca>PJpeYf|z!`J$>!1DV zS3dmrDi0Om6#05WW&?wWP35O2|7U*nekgII-D}}0_h${P3mBF>Oz3&~KXhH!|K+p0 z|Js+olljONbMhYJF$G_~>7W0<*6h8z4P^d+W)=S^*=QIRlpwRLmIOjC7!%rv-)cSbK0GmU;iIC-TYsF z@BTmk&pqFr;4_8s?RBgF>+AP0IzL`5zrMpb;rC|Qg0uenY+JKy{=c>@WNQ#<004R= z004l4008;_004mL004C`008P>0026e000+nl3&F}00009a7bBm000XS000XS0e@s) zkpKVy7<5HgbW?9;ba!ELWdLwtX>N2bZe?^JG%heMIczh2P5=M_DM>^@R5(v#`2YVu zMHs6fDHu}#30%qb{J$sE@c&A8RTK#n^~fBs02DlV^5p-S^-JLx#D_|usz>I41)u<= z;b4sA|5dJv|EHUa{Xci^9PtKR$=(6RAWfGKIsD(XYZp-JKUfR|P}C!Hzyd&kY{05= zUAO@-c^DhaN9KS9fB>W!YIi%zN3;?K004R= z004l4008;_004mL004C`008P>0026e000+nl3&F}00009a7bBm000XS000XS0e@s) zkpKVy7<5HgbW?9;ba!ELWdLwtX>N2bZe?^JG%heMIczh2P5=M_C`m*?R5(wiP%%rx zP#Em5=-$DxU|qy+B1P=1POeVXU*I2blrGi5EfIC8ph5^)GU=ef*iu?3RPoV5hYCe0 zoz8q8$>V#p&=e02a`)XGykr3Ui*wCoIBN(rk9Xkh6>zh?VjPUT6l}y$O5vq$Ym$yn zW?l+5Vo4D^)e6yB< zjR;hxC*-XhE1!6UDx4}g#%P7-#>DB-|&>!kC~|kP8;vI`}~+G4kwdz1CILAW%c`` wi{H~}x&aE&z`XLpfdoldGCrAkDV8TPf6sip&&sS~KL7v#07*qoM6N<$f;e`zlmGw# literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/campfire.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/campfire.png new file mode 100644 index 0000000000000000000000000000000000000000..94b7dbf7d9714f9dc668d04f1ace126d5675c1f9 GIT binary patch literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ+=c3K0y!QkoY=d#Wzp$Pz1mwqY$ literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/canteen_empty.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/canteen_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..51b67f0dd30e6b3abf7e05456edd18944caefef8 GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjGL736~_k^`TL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33J9Q7 z5DWig2}K2$*f;hZ&O2KeeV94SRVo@^R?drR;cd)h(zFvx=DNP6(2KdSZ9(?2G!8%J z38se)b}1^nKd^`8Y8!)sV~Xz!i8Kx$*)~N5#uVv^rb^NcI(!lvI6;>1s;*b z3=DjGL736~_k^`TL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33J!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXPIMM=Lb~t%+tj& z#KM1R&}qIV1A#Y3H6AKzuq;}n61S(~GrLXIljpw${~UQ`k`uW=Rn5nUbMD-kZLF>? zS)#YL#kwxnxLGP|82fpqLg$2Qw=RSmSsC0s^KhxqW|#N|XFXXHZYTgn+8)~$Z=GovT6O>kF;`>#Fm zA@hqK%ZeUgVLZI*#EO;P)!HT^DuE8|Cd)K0#LT=By}Z;C1rt33 zJQVfuqpy0Z&T%T2UmP-klt-NnYfqrJ}C zep9dT%2y9V|8Dz#IwafH#o~^$h06Q4%pdM6%WSHMi#wFe&0yWnX_NBt*B>tBiGn{4 zU(OYrvGcmD@{7GE&g^}+Wqy!X^~LTPJCCmwOqfu-Zu)Pn3PI!VJC?ezXsSy7I2?CO z*UEQ+s!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXPIMM=Lb}?#nZ(x z#KM2+goC_?3OTM_>`_yqcA)on;jlxI`};I2aMNMLb7P;Znr8%5>qK zJlzlVyCw2!dOX#G zRrlgy-B*j6@?8SOSx(kjv|fKEE;;M)OP5N9q+N}k^(6||fbM7TboFyt=akR{0PNFk A^Z)<= literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/dirty_water_bottle.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/dirty_water_bottle.png new file mode 100644 index 0000000000000000000000000000000000000000..83b626ab7c3f337365ca39b39689b71a704abf32 GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL8%hgh?3y^w370~qEv=}#LT=BJwMkFg)(D3 zQ$0gN_s>q|Kvj!9T^vI!{F5c_Jn&lg{J-tOw*TR~R{v|~66Bv}Q~BxtnO{o_cpf<~ z?O;~mWlz@mzrHB+kNw@4H~)7QKldnS^|`z*cDKiM9wrgVhIi?cco;LU^>8q=&)L*} zy`EJ(-C(|kv%@TrJFy36Ihyb^^Dtaw;br_OeUl+GTl*7FL*@hnv!?7Rn>H!jWtgBg yiI+jMNs{T%iCLUd49o^cPe^FF`W`sIz;IRZ;KsCloD+f0W$<+Mb6Mw<&;$T7h-zE_ literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/filtered_water_bottle.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/filtered_water_bottle.png new file mode 100644 index 0000000000000000000000000000000000000000..568615f1a7aa0c658dad8ca419a6619edc85579a GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL8%hgh?3y^w370~qEv=}#LT=BJwMkFg)(D3 zQ$0gN_s>q|Kvjo4T^vI!{F5c_Jn&lg{J-tOw*TR~R{v|~66Bv}Q~BxtnO{o_cpf<~ z?O;~mWlz@mzrHB+kNw@4H~)7QKldnS^|`z*cDKiM9wrgVhIi?cco;Lk^}b|apHu8` zvp)O#ng0(nC;t;p!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXPIMM=Lb~t+SA1` z#KJ#$fvm^d|NN;F85?FfHk3FokeV}h?!g>`UY-w998>=ErD&U-W!3+Cw_+!;j@3>p z*;JmX+u_KJDn3P?X66M9Csy7(A7I*WLxEuu^HG70Fw5pAQW6b6#aSG-&11Qw;Cy4c zE$io>{SGGajGb$1|Ic5Trkm&d=e!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXPIMM=Lb}?+0(@_ z#KJ%M$N&HKt`e&i?AC00^Q^w}*i{F$mi~nd@?mi$Pybgd9R7V``u{tIrVe79Yz;YV zj1$rx9?Dcui;!_vG~?MM$ujHx|NrX^-fDDkPInIM;BC%nvy_fC=2%>C!En?3jhSqT zJd6@Rq4{Y7$Fw@$D2mZt)yWaH>0{*tD>h yyP0#s+Z#fhh7vvvmrOO!xgCpO?L7Wpl3}&`_g1w7l~O?GGkCiCxvX0#LT=By}Z;C1rt33 zJJB|28`l)>)t$*JicS% zDmgpNy869SX8aUcS!CR zdtC0+Iq|pe_PxKcc0#LT=By}Z;C1rt33 zJmLSt+QF=0dqlbqNioT zSxf8p|H@a!f0*y<)TiP6K*~`fWkOH%h5r|FcOPJrsB(Q^`e1*tgGz+*3AYJu0@5yr z4HVZmwrYLh9=4sr?@`Ov)JN*t@!<_ycWsYW^p2+fN`@b&=WjV~K`o!_a)%o@b zXBDn*(9RYXosiI~u;<@fcLTR;J?DQKFoZE&X5cCn=uI<@V|HMOHMCNbny_}_yoN?b ZhCSOhh41rus{-^3gQu&X%Q~loCIBxrc$WYG literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/ice_cube.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/ice_cube.png new file mode 100644 index 0000000000000000000000000000000000000000..c8b2d85b98d0192cd37692915ec8c29223a6649b GIT binary patch literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXPIMM=Lb}?*we)^ z#KM2+goC`z1_CUa>Y^=r8B9ytrU=A+nW)dZgx79m>f)_iF8#8Ic8QQml%FS<#8A*# zqH*jctI%^lt0_Bb8^1Ph%5PoO+#S`WQL_8Ij6Ad6C&`CFCzL}U{B%30s@K_{s&B$P zrQ)KqUePt)51Uk4RetT1?$}XdC9vP=!yVoqM}OFF$!Ft;pWrj;h0#i;L(aN^GHibS jA}>G4UwT++@P|S4$9vCz6NLDH&Smg)^>bP0l+XkKK6hrp literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/jelled_slime.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/jelled_slime.png new file mode 100644 index 0000000000000000000000000000000000000000..d3737c6d73b8aa5043e5d6898ae1cdaa0e0df7f4 GIT binary patch literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+L6~vJ#O${~L5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33J+LNbg{i&W)&3xlm!oRu8*RKP5fWgz%&t;ucLK6UK CfNz@s literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/jelled_slime_boots.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/jelled_slime_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..c490b1e410ce88aa7ad6d4346c20805a03e53e72 GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL8%hgh?3y^w370~qEv=}#LT=BJwMkFg)(D3 zQ$0gN_s>q|KvlJ#E{-7<{>c(;2ej_JvFCAa-O!cDs=(^2-u0i|q~f1B=QVdjhS?Tu z44N#Bb4)!Y*b;<~GlUc#+;w~N#$6zZ1t(Y)TooG5vl{R`a$c&ykj8vQEJu%_Q*pIp zA*To9i7<&{&wM6G_?ap&J1`mWh#q4&k@aDvbWlShBSY7V-Rvi}1Owg8z~JfX=d#Wz Gp$Pzxdr^D< literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/jelled_slime_chestplate.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/jelled_slime_chestplate.png new file mode 100644 index 0000000000000000000000000000000000000000..4143cb41eddd05f0b9efdd6dfc6e220f977cccee GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL8%hgh?3y^w370~qEv=}#LT=BJwMkFg)(D3 zQ$0gN_s>q|Kvj!8T^vI!{LfA}$l2^5;JRH||6sFh1$Tsl!t*;h4mpR#oL+5c7g=oc zL4WtVp6Zi|{B}oX7T%ljp}wTQO!;{7k=5=d2J0V}&Ht4XQF`e8?F&!3HR|?xpLzZF zOk399GZWf&U448gi81=7UQn{svo3B2H4ACcGp(@!S487tc7OQCeRM1LtZ6et-Z}_( xr|$bx=NPP}Kb_klJYwZO9f>VPTk1VItgr5JEOk6^_!ZE#44$rjF6*2UngHv1bmag5 literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/jelled_slime_helmet.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/jelled_slime_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..5dea8961a25d73079c2ff3cad6fe795ae2cf4449 GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL8%hgh?3y^w370~qEv=}#LT=BJwMkFg)(D3 zQ$0gN_s>q|Kvg-OE{-7<{>c){4rtwbV{gVY^%%bc*K9wL}yqIxd8Hb8nz~>GY9v+6it&1I+W;NXf+RNbS>gTe~DWM4fn=enD literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/jelled_slime_leggings.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/jelled_slime_leggings.png new file mode 100644 index 0000000000000000000000000000000000000000..6fb01891f1e2f828160d21516b39ef654b2bd54c GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL8%hgh?3y^w370~qEv=}#LT=BJwMkFg)(D3 zQ$0gN_s>q|Kve~vE{-7<{>c(G2ej_JvA5$1ZIf*fF`27ztdm*F=KpM#*N@FuQV#68 zz4`xPhK}Bz;%h2`W(+C991S_n$5eI#S!c`y*fx3=G4Ar+am0{e6ZZvPiBd*RJ%*c2 rXIXCmMLZNe70#LT=By}Z;C1rt33 zJ>-=9|6#B>hZp@qiJBy!tl(YI=UKhLD<2nzMh-AaN^hrF7ng8~lW|b+}E*AOU z-sB+58TC^F6P5*EK67xEqX|zl55q+kUdEr&Hyc7rtDZ0#LT=By}Z;C1rt33 zJ>-=9|6#B>hZp@qiJBy!tl(YI=UKhLD<2nzMh-AaN^hrF7nQ^L1*!Xs6{^|N3 z{o~1jnnggNS5GFhXR}>2;4xxw5jJ6YlAprdRk`GZF~c&&R&SYg8z;C=Dq(h*fELpfV5gMsIOh;s4@5mQEHW`?HhL*KkC&L{w#%i!ti=d#Wzp$Py9=xFx< literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/juice_cactus.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/juice_cactus.png new file mode 100644 index 0000000000000000000000000000000000000000..4ec77fa4729b7a314f2dbaad5c7101bd66d973d0 GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ>-=9|6#B>hZp@qiJBy!tl(YI=UKhLD<2nzMh-AaN^hrF7nd|Q7aP#fhW4Y}A z0#LT=By}Z;C1rt33 zJ>-=9|6#B>hZp@qiJBy!tl(YI=UKhLD<2nzMh-AaN^hrF7nfqp~VdmR0H!zopr0IU;j8~^|S literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/juice_chorus_fruit.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/juice_chorus_fruit.png new file mode 100644 index 0000000000000000000000000000000000000000..e759570e6c6b19a50744bd989eafc3601d2bc06b GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ>-=9|6#B>hZp@qiJBy!tl(YI=UKhLD<2nzMh-AaN^hrF7nQ?P=NXit{E-e0c zy|TRVr;8-hr7LgD8P`a<95y(?AmDpJV8Z^1yeG<6shnq+(Z+IGXU8#_cB4zY44Fzd w873&rP*mtyGjjo>0Yh+4&%&T9EId36`OY_9uenip3+P-1Pgg&ebxsLQ02RD%R{#J2 literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/juice_glistering_melon.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/juice_glistering_melon.png new file mode 100644 index 0000000000000000000000000000000000000000..d5ec0570ba94a32dbde969e681197493a309f796 GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ>-=9|6#B>hZp@qiJBy!tl(YI=UKhLD<2nzMh-AaN^hrF7ng8A{V&&TreQni$ z{+Sw0KV2l5E|r{$;anr>a@gPmgMjY^feHI3@0#LT=By}Z;C1rt33 zJ>-=9|6#B>hZp@qiJBy!tl(YI=UKhLD<2nzMh-AaN^hrF7ng493GRhQemy-M^ zua(B|xzmVc$;%K{7vqk$#0iWFvlb{S)GJGG(30#LT=By}Z;C1rt33 zJ>-=9|6#B>hZp@qiJBy!tl(YI=UKhLD<2nzMh-AaN^hrF7ng8Y z|4-wFpDvP2mrAra7D>7sHaNi`;Cn$}!v2Z85l_9AF&gj&=Lkqm-#H&C!vn;#~j5Cr_c&08=OGsc~uzPTUKS^-15zws+p00i_>zopr0K&*0#LT=By}Z;C1rt33 zJ>-=9|6#B>hZp@qiJBy!tl(YI=UKhLD<2nzMh-AaN^hrF7nReNUJbXKR+pPXS z&&+Q4=_1K=X-i1B@ES>%!v-f91bi_eEH++IfZ0#LT=By}Z;C1rt33 zJ>-=9|6#B>hZp@qiJBy!tl(YI=UKhLD<2nzMh-AaN^hrF7nReHcIQVv)J$mc^ z^W`fWf4WFAUD~4K&Adj^<*>mC1_9p-0u%O6qH>;LMw^#?zopr07w#VJpcdz literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/lifeblood_crystal.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/lifeblood_crystal.png new file mode 100644 index 0000000000000000000000000000000000000000..4fbaa1fb846ef96ea535ee510d1474b6a6617649 GIT binary patch literal 422 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DkxK$!8B)5ZfpL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33JtpCO{BMPJ$iqy_9NU&wTW6$bKO!#Mi{KS)bfeCJg3~47c6Bv9S zJz|t@$|*KvKK)-qXI3B&L*j%ZuKyV}C_YzN^1$rzC7weXYz+n;2iff6HYo0x)7ukh zVZal_VU)0{K_Tv}LXRTDVFlg=7mh8LY}v?l$iPF{4k#Epq2kYcMuuZ**^0Jn=WzhT Ol)=;0&t;ucLK6T}vY*oc literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/rain_collector.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/rain_collector.png new file mode 100644 index 0000000000000000000000000000000000000000..a08d2db09abe60940dda295217c0abfae17b25b9 GIT binary patch literal 431 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv>0#LT=By}Z;C1rt33 zJwt=FTwDi$rpkM|IEGmGw@$XtZgCJeDz2^VsCYXv>dE<{#+t?y%NE_778f1eHGjFB zR(;6~j+yDdbEo+e-MGB#JT}MX&iy_+Fkt89<+r+}*ETPj$duE2;qz%j-kWT^?Z?$k zeJ8j7+V_2hZ1nWDoL&QmYf+2}!a{dhT5nq`3uhP{>zG+7Ui3dtk<%C$8`7>UW?)gwc(F^*!C-FM70wPeg~J9vw&m*c)XaN+^RZm* z$%?2iRcrtjp`njxgN@xNAq4udZ literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/respirator.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/respirator.png new file mode 100644 index 0000000000000000000000000000000000000000..48107226e884e6173362de4412319ec80976d8bb GIT binary patch literal 348 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXPIMM=Lb}C%hSa% z#KM2+1Z%EC4kE6>QJqr-1fm^1GBc+iyLYK{X^CZ|(<~j8rse(SAmTXpxCi*xWiwzy^DyV_W8K4+rjwgnxQB08Me4?e2T)P0rb z{i63zTI83eBg-;*mN@_9+sTl!pd;b__s;j{D(|){iZHOXN}h?mzI2ii&(Ft|ma`NN zT;Tk{{$7#U^3MLe&hL-2zF$^kJ!LSfro!o<0gt1~68DhCl06F4um=Y literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_00.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_00.png new file mode 100644 index 0000000000000000000000000000000000000000..0c09dc0e2c825bad8e5d6aa15bc88c3648afaafb GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DkxL735kHCP2GC{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXPIMM=Lb~t!qdeu z#KOOKf+F7`2Lab=alQbXCN76$4i1)mlL}Z^_zrVcF$>wWUAYqeU1UktN%>Fa#=CDf zRV1Z9-~TV~*&Od6k>KT=?>$Wt7Ua%vQ=Dk|;=!X`LeoN3GbWyMc^JM=e9MA$+4`?` zo%3L0oqgQzhFR~0?|btnJr~wa*s=3$>-RSr0SyL@(pwg&2t9bc&|$lTXv^1)9hR#$ zGu~I!Jiy9Q<8X#Seq#LbGaLmEjKogd&=H#Q^j7>orrjsm{(EdFwv=6?FlC9$oYxx! z8DbvTzyH3OU*OCk0|TZ8)`o_*&jt5oOn7)$_wRVa{CxV!&bHfu^*}!}c)I$ztaD0e F0stNJiT3~i literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_01.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_01.png new file mode 100644 index 0000000000000000000000000000000000000000..8ce92ef8e830f5d26dd8b95b98d83e12700de9ec GIT binary patch literal 348 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+K$tP>S|=w^P@=>&q9iy!t)x7$D3zfgF*C13FE6!3!9>qM&oalj&JU>OmZytj zh=qUe1Vz3>1`@61;(P`+O`HzN92_illL}Z^_zrWHHLF(eteiRjou)_V$?RXV_FpLd zJ=y=w`|A6TL_Q?Sa z%~$5TcLqptemG#jq_X|D@RhG-GJTCXpV)#`PTbL39?>vy(v*(hDKndyYtnDWIX5Ou p*DV%c(D2ytedEVO#dw`A{ijdvu!OS*`2u~(;OXk;vd$@?2>|~$gn!lvI6;>1s;*b z3=DkxL735kHCP2GC{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXPIMM=Lb~t!qdeu z#KOO~e<9x?1BsUJdNv0xD9m8cQE6##c%aVN-*6zYqABuDgs5+CNEPKKVTH@<~gfjZqTk(TAN#$UotN^BK&k)?%{@$ z&k_~>C^gMUE@fCG{h&!e!k8(;NtPi_!mWYt>_3LeecPrRD!;y)z`-)}_0Jbf3Y;Gs zExu3FjCo*x`co3ON!mf9R)(G?ljpHIdSZu;s{CYhxO+uu_MeKkKtD5hy85}Sb4q9e E03uw9h5!Hn literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_03.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_03.png new file mode 100644 index 0000000000000000000000000000000000000000..60b654a182dd949366094bdb8cfa9bdc0a015239 GIT binary patch literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DkxL735kHCP2GC{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXPIMM=Lb~t#M8ww z#KOO~e<9x?1BsUJdNv0xD9m8cQE6##c%aVN-*6zYqABuiU|*X-0D<1@aON}e#KNTwb9{%z;>XbS-*wb|{Q3MZQC<3wC#7>s)q%n#Qt zpR#V%D(MDxr+`B}3^g<3kDp>j{Q37v}cBj{jvq;LbOt^cLDv&;OXk;vd$@?2>|kj Bk1hZJ literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_04.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_04.png new file mode 100644 index 0000000000000000000000000000000000000000..6662d0acd3176946477c406e6da04a62e787ed30 GIT binary patch literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DkxL735kHCP2GC{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXPIMM=Lb~t#M8ww z#KOO~e<9x?0}aVkX>^$6BV@Dx-~#uaUP`|a*zzpcKr_g^_@MF=Gx>2ZhpsiT0=mjai8y# zz3X0YXlc6m>z{VMT=Zv2`CiTGO!<>kn8OpMGoBLp;m{XtAr!yCVvp;C?nO*%r*bfe zP5eClfX?~btQHGc6c#gV=s6?!p!sx!!p1lL6H>J;-!SbyDE(z(!tt zpO%q%VBh^nhqXy3>RAHgf`r3+B45jiJ#t;T&sqQM@zXD-mH_?B;OXk;vd$@?2>=Zn BiUR-u literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_05.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_05.png new file mode 100644 index 0000000000000000000000000000000000000000..2881a2eb8f40b089666a98704932cdbd34363207 GIT binary patch literal 349 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+K$tP>S|=w^P@=>&q9iy!t)x7$D3zfgF*C13FE6!3!9>qM&oalj&JU>Owx^3@ zh=u>u35tA&90Xjy>&Yz05C{aVkX>^zrBGlJ#AaMulDo(EEm8CyMiP2Yb!xbyg-sn>U!yFTCyz`!r>Ro?>b<;uVFB27t?cQx+P*znG{C?1go&Cpo8~dM3 r2lb+!DKG>~D7b%QS9@#4#Toqe`RCk|i|6?Ry~*I|>gTe~DWM4f&p3r5 literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_06.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_06.png new file mode 100644 index 0000000000000000000000000000000000000000..8d3d8a19f5e663f4812e5c04da45361ee8824e29 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+K$tP>S|=w^P@=>&q9iy!t)x7$D3zfgF*C13FE6!3!9>qM&oalj&JU>OzNd?0 zh=qUe1Vz3>4g#*<^<)-g2!sd-iKw)&G&)QQ5$bC=khp_&6(?8o!K>o8gB7O#@vJvy zzFnqXxoGqM{W;gS`p)9pyDaWIKX>X+6PM1C!Y#WvFQ4|gu*fQ}Jyoopb$yCYfX_g!eA|`jPZ~T|IaQBNl;;B#0PoGs*Cj|5=gQu&X%Q~loCIHHxfSmvU literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_07.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_07.png new file mode 100644 index 0000000000000000000000000000000000000000..2723f8a9178aac0dae98705f43273c5714402883 GIT binary patch literal 349 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+K$tP>S|=w^P@=>&q9iy!t)x7$D3zfgF*C13FE6!3!9>qM&oalj&JU>Owx^3@ zh=qUe1VgSv4k9k!_2d+;Ma^(xv36wP=Jr-xTEW6?EuEhzx?%f9Z~5D{txr$s%>3|w zS6*2HS9-df{j7Se(;Fwhdz4ssVVnO`oe462*UD2lU%iTwS$xOjSTxhK>#f_jn(-+% zBtP$omb-Uv_VH`d3?*GjOBgp6a{Tb=zqdZ=`TBqfA8IW57|-TTV>=+Ts6%FXdTax` zQ$h;M346hrOb^&kYg}0QhCLv3^}oUsFWmG`G%hH%d~3=uX@W#YWr@#2#`}@ipVv7k qd-rLIB=9VmS-v%~aDtrFXI5s$^9e?+3lxCfWbkzLb6Mw<&;$V6QGqi6 literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_08.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_08.png new file mode 100644 index 0000000000000000000000000000000000000000..71abdb4fa1646d7548ff79c2c9762a98c929ee2a GIT binary patch literal 349 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DkxL735kHCP2GC{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXPIMM=Lb}C+tbA{ z#KOO~-7=z)93^lEd8xlT{*ocVNb z>1SgD*R=F~cW0QXp1k2{Ubx>v0S5M# z11C5dEZvqd{78^w-KG7TIpyXl`EQbUUvRfMT-Z6UOp3wNgXf5i)v|(y|7SjLmcMYq q>bMA(0o$cBv!nJ~ypWUn%zAy#dG5QNCklbyWbkzLb6Mw<&;$SnhJuLz literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_09.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_09.png new file mode 100644 index 0000000000000000000000000000000000000000..e41daba55789c03411236e342f207224fdee8e61 GIT binary patch literal 346 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DkxL735kHCP2GC{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXPIMM=Lb}C!_&nv z#KOO~-%&AT+){ZRP+}?@_&jm%^*mQ&*xOYsi_R>4gFtwCv-yi); zNl=(M_va=Ld2c=8v<$!vM+UMb|kH+}c?Y^lrA=Y>qJY_)KU>{DggcCAe@xuMvt zviRLEnYoK*WFDyKDdKS8$XlquqVrCizoYVN%yLG9(;A=BD(>&+e-|zDm_bIMNzjPt zLu%hdO@_D#w?@Cz`i51vejT23k@sE#7t7q^UzadWXlZdc)11u3{^R_veLop{bu5!lvI6;>1s;*b z3=DkxL735kHCP2GC{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXPIMM=Lb}C)zif> z#KOO~-;nE&fkbPuIDf#)7fI}bcUZ*T-4{N1CMZ(!NrKPMwvqir-1T`XpPb@O%wLu% zXOj_k@3+U*DYMctopx8m$$a@6zJo)AFTB0KfTO5Xv+wc3Yp0~2CrVrrV0!iYs95>) z`CAQ7Neh&$%2H&Md7YfgD07@)&QC7JPR7^Yi&-9)8#1^FR{rpweZ5Softw*Ch2?;Z zvM_^8gj?geRAq!lvI6;>1s;*b z3=Dh+K$tP>S|=w^P@=>&q9iy!t)x7$D3zfgF*C13FE6!3!9>qM&oalj&JU>OvZsq< zh=qUe1VgSv4g#*v_2d*LT{^a8XxL40Pz?>t0+xFzC_;2l!ciyBu za5Vb;KUsL@>~+!XzERiPTMPe4h;^0}7FS4b(Kz~c!<~Ejg0W?ON)_MkJy#Xkku1%6 z`?~R)bN4+sgc@09E{lw8)MK7f%;Z(Tt-O+ROUryi?FU~On{F(22@Gst{^!yl%i0p8 ze1Q8f$AnAo{4ad}{c;1_rkm0_6BR!1n74*uv8tuu_nSuS>_5&W?(k)8irsj|kzv7t jhjvF_9d_EO@rn64@A>FV?{zPM-ed4|^>bP0l+XkKB6)*D literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_12.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_12.png new file mode 100644 index 0000000000000000000000000000000000000000..c6d70e4ee4544aa4a61851d76cb9efe6ed94158a GIT binary patch literal 340 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+K$tP>S|=w^P@=>&q9iy!t)x7$D3zfgF*C13FE6!3!9>qM&oalj&JU>OlBbJf zh=u>s2^)D28Hl*-k%(Usd|feTw{dWTW!O zrP@XR-yPjHYxcI-+Y$Hl__+^%5R78!>i+uo&6b<{=O#_)Kb<(!wRQz-gVC`iiYyB_ zOxG{J{Ot?xrKp`gp=(thY|qg@%aX9Rh>2ynz=WOq|MNNs*uC@f5NlwS7i@BO_|x%$ zg+ZQ2+2QFP&IPZ_5+j8+ofOt-RQS9@PL)B}IY{BxNh5adJDcC!lvI6;>1s;*b z3=Dh+K$tP>S|=w^P@=>&q9iy!t)x7$D3zfgF*C13FE6!3!9>qM&oalj&JU>Oyr+v} zh=qUe1VgSv1`@5s;`{+GUtC(3*VMgualnO>${H^`W#&{d@lV*h&eHP~cjeRnhH8}` zG-@l~E3f^zd|!O^ONr@651Q0YS?y4C&0A@%-OKk^r0A65ch|BR~Ri^1TELau^wQoSL*3u_$fS5lOZm` zt?^u{eM906-FDT*v-ddivdlgHbp_*umL(2nCMR>T|2S8;N0(VDvdm{8L$bnIn`@^Y dDcGB&u_alZ`M;#+xhc?V44$rjF6*2UngG`PeTM)5 literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_14.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_14.png new file mode 100644 index 0000000000000000000000000000000000000000..a6630fcb05cb6dcd838837dd0e727642ad1ab7d0 GIT binary patch literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DkxL735kHCP2GC{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXPIMM=Lb}C-P6S} z#KOO~eFl6%B;3mbj%I5&XJLlJ)LbclWcX9j8 znOryVbN%_gnX@*S5LBXKk3=lp9;ksVK6M-KBABT2uqGm%tkh z2ae?BEI$$?S<~{qtFKs9YvIFs_XYPfj|-Le{Gu8rPMXp2TjR_@#($eL-!Ud^nB8ir mp}>%`Lq6-Jq5;3uWoDnCGsjHqCRhNy$l&Sf=d#Wzp$Pyje0^~M literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_15.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_15.png new file mode 100644 index 0000000000000000000000000000000000000000..80fbc912890d4c6dfa572a8579fdd9cd9c9bf8d4 GIT binary patch literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DkxL735kHCP2GC{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXPIMM=Lb}C-P6S} z#KOO~-;nE&fkbPuIDf#)7nk(-@|wCAFAlhHQd#4L=`IV4uPk|ycV5q$>=Jj9yZ+XU zFYWFpPFKs1#rDirURabj?DN>ccB(TJV@NBZ^H+Qz2oI>iDF l0TULzPx_gt7#s46{aM}FO1tl~t^mEr;OXk;vd$@?2>@8!f`!lvI6;>1s;*b z3=DkxL735kHCP2GC{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXPIMM=Lb}C)6>N< z#KOO~-Z537Duz2C}XDTzc-&EYap+;?{ zKw5fS*<#Jqo7;+WAE#zsFtIDwoag`haMDY*{0(eQ&rA3JV0hx>r113M#v_dHbxyn6PdJ%& pT!{6|fvrW+(bL#IAJ+KA%y{+E3yo`mwLniYc)I$ztaD0e0sv$Qgl7N% literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_17.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_17.png new file mode 100644 index 0000000000000000000000000000000000000000..e2133f5ae28f94506e0afebb23fd90391d7689e4 GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+K$tP>S|=w^P@=>&q9iy!t)x7$D3zfgF*C13FE6!3!9>qM&oalj&JU>Oil>WX zh=qUe1Vg?i2LadbdU6bhSr=^Fe)-Zo7wx_UopH^_W(nW8cp)c!ST(!lvI6;>1s;*b z3=Dh+K$tP>S|=w^P@=>&q9iy!t)x7$D3zfgF*C13FE6!3!9>qM&oalj&JU>Ox~Gd{ zh=qUe1Vg?i1BupZasGyfOdEFWe)+<0(PZ}vF6$3II>UKqS4sLiL#xDl@^YEknLj7% zx9opktGQxp=Iy^vjMtw&e8{4X*{t)=qlNEVe^rXsT$JH&PhGoJk9!6CqdiMAl4AW>nqbs?f=L&a$!Thgc-zzS*fP8;{#B(9k}>_}?z& zMxcWRFH1$D1mmRJe>r!(+aWW}!K|`bS12X!ySK)HACsnZ{7#wK%v|%_z-AiLLA~f_ n3Jd`s9@h0uZEvj!Tq!T_bpLba>X4N{FEV(#`njxgN@xNAstJa) literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_19.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_19.png new file mode 100644 index 0000000000000000000000000000000000000000..4d556f2b66299555f8470173583086bb5efe74d4 GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+K$tP>S|=w^P@=>&q9iy!t)x7$D3zfgF*C13FE6!3!9>qM&oalj&JU>Oil>WX zh=u>$2^)D28Hl)S=4NI|ZCtW&dGjPYp%6(%l?Y|tQndxekL|V|FAy!6cK#PzvU|-- zk)Ji+bC&-yjolu*WKXP|*t4IanW7$IQ-es~X#eGs0`P`U!1_iBhl4xudJ(@v4OLr*wltP0ZX0Itoq i+Sfm|y|rfJs(Uhbp0+ApJ@FCfKL$@%KbLh*2~7YK3VkX7 literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_20.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_20.png new file mode 100644 index 0000000000000000000000000000000000000000..91794eea2ba7e9eec99ccf2f33db907d55f56a0d GIT binary patch literal 350 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DkxL735kHCP2GC{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXPIMM=Lb}C$J50z z#KOO~-;l4#K%%u;oWJ2AlfjD3v-{quSX8q3mVDyVIXCA(?^0{y<1a!!OT}H5_kQRf z=W+l4z3YpfEz{XwU>Y7b4Wcdib&H`d()QK;k=9?x#zlP z_VPc0yM3nRsx+kD6VY})`uwRvMQejke!61If}HiOSD)9&ZK#%)X<=Y__&AJVfeHh+ zlR^cHgU(@L1{n#r2CvHchE-O-o=%$3yDx#4W#;p@N{llEgqSb(PqU18V1N7DJ8qFZ qDKncHTAVa~CFfK|c!*E^#mIE?<#T~{_duXO89ZJ6T-G@yGywo7P=KTW literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_21.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/season_clock_21.png new file mode 100644 index 0000000000000000000000000000000000000000..e7f834cfb69f6b1952ac7570907c6383357d3096 GIT binary patch literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DkxL735kHCP2GC{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXPIMM=Lb~tz|+Ms z#KOO~ehvLYg1CccnhR9SIDk+)QBfn(;K<>w^U3C(@ly{}pJ zxwrc1=eyIRk1o@=ws*?r%ZHtA*V*baolLrH61IEQrb!Co-`i8g6r5C6yxwKd!XVaT zxVSIswy2#^<|f*{>@+pl=<`ahT&%>WzH6^>On* zSun7-EMVzpxO3+A!%Bu63Act>pZ_tWR!Z;(JDL4xQWZ#!lvI6;>1s;*b z3=DkxL735kHCP2GC{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXPIMM=Lb}C%hSa% z#KOO~-A2a#ehPU5RvCbwaY}u+7{W zIhjLy?o`j{Y*X``w$^|9JUP)-uX1Ooe(IjBQ!L{8@PljYoxW3boF&(`uY0}0rRi(& z>qG6Ea%L|xR8SB;&aM67v_oXm{q=c?Dnd1nCMW;5lInbL=4~2hgF>|}XV~}C8ye&} zzKE0wHJp0W)6jf~<;ab9{u7q%{`XuYrP+Ljvf}3*^VT+eR8^e#?ck<1`8~$x^J^V9 qNb6>EFtEzM-F@TB3WK!lvI6;>1s;*b z3=Dh+K$tP>S|=w^P@=>&q9iy!t)x7$D3zfgF*C13FE6!3!9>qM&oalj&JU>Op{I*u zh=qUe1Vz3>1`@5+;(P`+O`HzN92_illL}Z^_zrWHHLF(etXw(&p5}=wC$hiI`WJou zovQxJfBU{ajlVkOQ_anv?~Z3~47e`;Fj8Uv4qfj=`76hlM%=S0zowD7R+b@sN9HVp z6b_3${&z1*yxx|(meE1&w3yI=Pv+Lq|HH!B9SS)PiZMAgRIYVr*xyquVsMAS@l2o+ z!+S%{1FZKMj`c9usV!t`;BOOLki1!NfyTFYMyV;y(q|eKKJSQCVfdt|DDeECQ7iYK w^w7JpjmLDNmI*WjemGkx@7>*65xCO+%g(13%8S#k0X@s$>FVdQ&MBb@0IWoW&;S4c literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/tan_icon.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/tan_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4a82c55be41e0e87b5e131a5cbd462fa1f0a36ef GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXPIMM=Lb|%@9E+g zV&Olx{~#}eA_vRclat;Y4_k4{YDcti&+*Qt{+}AgC)Jd^&eWVWoKT#$;67{kgT02z z>o_MwXP@q{PH>G8&RQGe^>Wj^&Ac53>?#_9#v3L*-=E7c|Hke~ru!XS*ycNguqihr wXMgUKJ79QZ1&Pme(f&U&CRyXUTh~x9Q3fGvOixco!N>;T)tpp56O7Rf==XO3!@g7N0$05Ap_08%4msQ(|U=J@tAU<}fX&48!w3jeoTNP=B~VhFkcme(f&U&CRyXUTh~x9Q3fGvOixco!N>;T)tpp56O7Rf==XO3!@g7N0$05Ap_08%4msQ(|U=J@tAU<}fX&48!w3jeoTNP=B~VhGHDGyD6%xP0Y* zxFN`z2^s*heci&E|Nq}_0%MRukT^&aQ3ik{VBUafhGCFKm}ZP{0CB8yGvS7yYep9b zsl_k=CP57LnURed6EH(Swj^&`j}?P7V%3an2r(F|W^w@lYbbdluxAV&{ml6H?|;X)&u7d&mUbYxy!HQWU6q6D91K~~7(9$mO!)ua{2;I6 zHJ>Sr3N^2<$ZSwlXjLejptgvI!Seu5V`f|81h*M!Jp~MfYl@8@wk^nZ6K7v})PO}gYiM^7-2F?!KRPv+yMVn2MuJ+_`7)q>8D`I5W99^j;G~Z1b=pzPCS3j3^P6me(f&U&CRyXUTh~x9Q3fGvOixco!N>;T)tpp56O7Rf==XO3me(f&U&CRyXUTh~x9Q3fGvOixco!N>;T)qG}u-~XiYnHUE2`#XT~!-o&C8v?g| zVGY=j>Zu3*H#Rnc@#f?JFa{X_QX^%k{~xR7`1Uhk{QvzXtOh)FSNOl(LK5r>6hqJr zxOHj{+z@2VL>o}P@;}%RkV23+NE1;8fFxjsz%;`!NFz)$MmT^t*14H*L(ny&i-Xi+ z7yy$X2K&s&#*7J=As}0lx2?yDK^n1YMmB^Pj8!wa000M`dcw=i5i|e*002ovPDHLk FV1n{*W?cXP literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_05.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_05.png new file mode 100644 index 0000000000000000000000000000000000000000..a857bbca759710c330e77bc84e966d6a6f24d61b GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`M?75|Ln`JZCrE5@IC}A)y^&hv z<6Y6$0}KM$6tjK&{oN0qV0(CVPKe#-|183n~uUDA=OG`^1 ztSByGkZ9&%SUJ(?%K!e*;+o%*2K!30&i()Y-aJv_!F|I4^NH)sd&IGQi0d0M}L zQ6XF*TkRx+0GlRDXS0c5DuV}88i$WDPqWD(ljIiWj^w$sIn7yOjdxji=(aH$a3*ay z-;;A@MuQ~NCe_N@Rcj=c2(C^`aqc)6VLF+cVR2N|^xX;$Izaz0c)I$ztaD0e0ssUX BUg-b; literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_06.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_06.png new file mode 100644 index 0000000000000000000000000000000000000000..88e3872de197e8abdda7623922bfc69a4f988a5b GIT binary patch literal 257 zcmV+c0sj7pP)me(f&U&CRyXUTh~x9Q3fGvJhQ*=e|ma493vZqS94PNOfW__px@sCj2}LHh}{r$ z1OC6?^uMvO5sWt{2Y@li0FW9fL;e3)HOIG~0psea2maqWH3x18%z&rv3jeoTNP=B~ zVhFkc!Bo00000NkvXX Hu0mjf`+i}p literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_07.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_07.png new file mode 100644 index 0000000000000000000000000000000000000000..d2d098f09281415e4914d746cbce748fb205fe6e GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`M?GB}Ln`JZCrE5@IC}A)y^&hv z<6Y6$0}KM$6titM?|)xkRb?fkEZq`b9Q4!2z|DNY{rikP@^&>HcLhqA^XAU_{Qv)N z-~ZCm(*N`Q_!yEWFe;b^wf*|PF{>}%p843-VEzWfU5x&BMgQe*pTM%4=_pXwsqla8 z(hX~7sxUi9ED=!QyW}#3QGs)YqQO}Mo=Y5;dj$Cu`bzWE?g*5eeep7gS@+z_=U-i*rVA#Q4Q#~uUau3i$44$rjF6*2UngC9e BU)=xz literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_08.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_08.png new file mode 100644 index 0000000000000000000000000000000000000000..539226786b7b70fe43a59645477694813f205ac5 GIT binary patch literal 254 zcmVme(f&U&CRyXUTh~x9Q3fGvJhQ*=e|ma493vZqS94PNOfX)zum;7Det!ore)#Yq zc0!@{@@y=9GbUh$fNV+LwjL`6X~e1-*$`qdR?XxB05me(f&U&CRyXUTh~x9Q3fGvOixe$e`bFlmw_8YpU4dc< zx&h@Y|HBPH)=ZKCAPiCn5(jA_$^eiA%n+Dn7zSyCX~qZ#5XU+<6K)8)W^{3oS_}hV z62xGi8QGXI0W$<-OY*k$STRT=R?WzU5QDL5CKmtzpH+MdR@t2>00000NkvXXu0mjf Dt@L6{ literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_10.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_10.png new file mode 100644 index 0000000000000000000000000000000000000000..eb97b1cb6f964f658aad4c5c87451469307f4923 GIT binary patch literal 257 zcmV+c0sj7pP)me(f&U&CRyXUTh~x9Q3fGvOixb-<1_pFz%;T!cr_=L&je$11N!|P!1&?Ahu954 zH=ugzf&c&CZ~A}h)SUmDlLNpQWB^Ewl%f8AteWH7&ww#VGt7X-#zwdSPu&&%Z?}*H zy8^`!bOXv){)ZcYteGSOKp3PDBo5L6OFF??+-1m`7LR{mU%4gKyZ2M|J%AM2iG|mvfOR>H1+?( zwgWs2nQA8)1lTlLI-5-dQyDy%(l~sKd74cQnIyL`cO=i9&1udOYrM@sp BVnzS} literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_12.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_12.png new file mode 100644 index 0000000000000000000000000000000000000000..3c5867c093a05da53eecac853bf84f5500ae278f GIT binary patch literal 255 zcmVme(f&U&CRyXUTh~x9Q3fGvOixdT<1_pFPz=JWIjMXm7^7%jSo6Q%-vNvtK75GX z5Of2oryls<*x300|NBkme(f&U&CRyXUTh~x9Q3fGvOixdT<1_pFPz=JWIjMXm7^54|@9zM{4@y=9GbUh$fNV+LwjL`6X~e1-*$`qdR?XxB09LVmPb;WP8~^|S07*qo IM6N<$f^A4-Q2+n{ literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_14.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/thermometer_14.png new file mode 100644 index 0000000000000000000000000000000000000000..bc8ad043fb918388bc12ab50eaeb8339fa45abaa GIT binary patch literal 258 zcmV+d0sa1oP)me(f&U&CRyXUTh~x9Q3fGvOixdT<1_pFPz=JWIjMXm7^54|@9zM{4me(f&U&CRyXUTh~x9Q3fGvOixco!N>;T)tpp56O7RfIJ3X+f4{%O|A!ABVmAcc zfa<9S{x>!@g7N0$fdBvBZvqme(f&U&CRyXUTh~x9Q3fGvOixco!N>;T)tpp56O7Rf==XQ{e`bH*|A!ABVmAcc zfa<9S{x>!@g7N0$fdBvBZ~DJ(VGUS~l%f8AteWH7&ww#VGd2UBx-0zOZXpSF1&Sf) z29&S-4>ts+`PQj9q!|FhAcf$-13Dd~nVp%}@-|2-A!a4j_(oZYJCibj|4E zAhj3#<^xMy#5V4Iu_&)l4n`0Q7)me(f&U&CRyXUTh~x9Q3fGvOixco!N>;T)tpp56O7Rf==XO3!@g7N0$05CqYzYnZN%25A5R?YG4XTTVw8Qp;Y?>GIwb!yK4?G}me(f&U&CRyXUTh~x9Q3fGvOixco!N>;T)tpp56O7Rf==XO3!@g7N0$05Ap_08%4msQ(|U=J@tAU<}fX&48!w3jfdS?*qF6#SnA@%2)n}8v@h( z|NSN~-fkgDoB<#VQV0?U*?Q~L9Iy-U8UT`j83NM`!yt_?%^2YT;#lWq!VN*!j4lpR zi(vpvf*9;GBO5a&V1|HfN#3>|D+X!Asu|f3VlYTzvPD7lXe50000me(f&U&CRyXUTh~x9Q3fGvOixco!N>;T)tpp56O7Rf==XO3!@g7N0$05Ap_08%4msQ(|U=J@tAU<}fX&48!w3jeoTNP=B~VhFkcuxAV&{p`m#;{={dJ!c!1zvKG9J=&uwwlRrg7vody|A%=UulY=3RNx8X z5VGIA|NZ~}-)A3?IC3nL!GkG{!^fDXIj8MrpCF$?UumA&9f6XwFCHmum0&xd(s9tv zc#~l=P|=BLPjX*xOq$@fX4XVrMYiOtK6(rci%--rd%Qdy2J{Ytr>mdKI;Vst08^A> Ay8r+H literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/wool_boots.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/wool_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..c58d9043dfc98fd8194f121e4723a7d9a69fad2c GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+L6~vJ#O${~L8%hgh?3y^w370~qEv=}#LT=BJwMkFg)(D3Q$0gN_s>q|KvmN{ zT^vI!{O|T1!lvI6;>1s;*b z3=Dh+K$tP>S|=w^P^!c=q9iy!t)x7$D3u`~F*C13&(AePq0Cs%RL{`R{j-xfP}Oly z7sn6_|Fsh~@*Xk}a5d(ZRc&1v*`VcZz$mMI;i3Vfu*;i6Jo6M^xYh-}xzVAdKKIBJsE*aP!gc&;QPO_c27#`@rkExr%Ks57(JjI&oMw zd@$gVWGJ4L-oda(^2l{jUW4h0@++A{yghXHFa^YLD4aRJ;PlniiQJCD6OO+%YQFR6 zeZkJgC}E|B4VQUYR+w%-aG*Pn;eh=m>$FYJQ*VeJ(AmwI80x$K+{rk7o>@`Pc~`&Q ZS0|Ho;NjMLSwJr_c)I$ztaD0e0swPIfHeRB literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/wool_helmet.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/items/wool_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..62aafa07fe132952cd2dd7084070b0829ef3b9e5 GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{^MbQ4*Y=R#Ki=l*$m0n3-3i=jR%tP-d)Ws%L2E{@KYKsA|5a zi(`m||Jk06ysZWT&X?1>?*|68%wk=!i96Zg!2AdP0voxFQ`jafmY92p)#idFaFucLE{-fd#W&}6ZfnYvne>$J{CYca}2y!v0D6@X6ZO1HR7I}w}GUd_o~DW0msaL;oclmH<+9*dZHzlDtWe? jDLUlP`a^Gxo-r)!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{^MbQ4*Y=R#Ki=l*$m0n3-3i=jR%tP-d)Ws%L2E{@KYKsA{#R zi(`m||JtB~yoVJ8lBfOqb*6dWZio0clMJmK)K0Ky>@HzTTVQnPh0_ji(W{eKpKo64 zapdV7ZhdF%3R`)}HOVtyUuA2apQ}0Lb7m*cy7xN+&t-8QHu3u&t(-p3bW^)YgW)l^ zb2fXwS9S6n;&?PKXwzZEmLw_3oyOb^6F2Jrd#PQuc$qxI;}c6>T3={+uA*DZq4TuA vC4A!-=7g4o=AM7IFnDh|wdxbP0l+XkKTqO3IP)<{98gxZibW?9;ba!ELWdKlNX>N2bPDNB8 zb~7$DE-^7j^FlWO00f>%L_t(&L+zRSOH@G=$M;W*=!YT;5_({5FGDG^%y7$EL`fmd z(lS#jZ8fn3(?S%3-bC0-gba%!M3GnuA|m>6x}W2GmyN`Jy1VPzfy13SGiUDX{hrs% zM*c;`{e^Bz`x;j^5_LO!Hn@_3&93r(u{{~{)AE-tzK*-3d!ORL&)3||nGQEF-|1=| z9mxL=0NQizmAmolf@_J4v?x%$ZpL%(4vwlZQs*W1(X&X*qZeXIbcjV%7KWM#wv`8^f@V-d*W zPgg(?B+`R4OdG$i9NT66qhq_5{|DH5Wv#={Ve))=@S}+CaJ0L?xO_Bf{$4g*WNpUw z4{fu00GSwFYX>z$QP(k zpV}r9R7n6I-oSptjFxWx{|kzlO$N6L87;B)9b-LoXXCE)kIyC|8T2lEswSeLp1Ry~2Gz|8S#`AfoAl9AIWc^}{9nG3Z) z^+(-Ah3zLJl_aPi8QpHo*Z1PA5te8*N>D}SL>9q1Vh{GE&H+SweAEx8NODz`pokw^ z-LObjU@rcybA{>^p6DqSP_1fh_QAT$(R=)I;StrI)%ig+shm$Ai}6z;AV%fKxqv!= zaos6OUzVnmresu}v|-xF)MuXbVd<;ST)&0z2vn@T512M+Q2WE&CacdG!z>^`g^G|q zD5cM54el9ecYbZKF%YIt1xZFiU+XchKI2+Hz3;af9`ThypZh|P7D75T($*;w#LhmC z*<36FM0J|Ho$NLlW2zd7^dL-|cW8aRk2rw7^mreAPPHT7`%K?&Gd#ieg_qD%Hf*--k;}f9&=?b3Y9w>s2 z@;F}|OP~)*w1o(5EC#d~2T{MwAA}s##aIVx`{BQcXwJG=12 Y-%yJaa5@m}`Tzg`07*qoM6N<$f`sB|H2?qr literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/models/armor/jelled_slime_armor_layer_2.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/models/armor/jelled_slime_armor_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..c6c3addc6fa8b98acc58a580b841428c22deeca9 GIT binary patch literal 821 zcmV-51Iqk~P)N2bPDNB8 zb~7$DE-^7j^FlWO00OZ|L_t(&L+zIROOsI)$M=s(5&jZc;UEcXVJQn`mMxrGLmW&} zvo=`6A+@H)Xdsq|QqYS=guRJSVqwHEB!)jkf5GYb9PbtB*I4+t`-Q`E&wYFDbHC?% z&J%EOaBy&NaBy&NaBy&NaBygUbXvNev`F95Md@FTi0Q5!j4XFcMZU_+&-;>mb*c6) z0OrRlH`HjG?%KiacYTsuO~{>(aUmK^_rXPT{-~TSG)U)Mvn1YMR{h6bv`OcDNW#;n zgq*;WIp-#it1*}Sa3CUN8G9Xfw%Bc;CC z#=mGS1!ZtGD(P==Wg6ybXEzht#xmsr^_k0@;mWj$eNkmeS_98qr|3@h?WdT$9{Za+h&fgvFd8@Jst1ybuhUuoUdd>Po z0RII1RUyANq>P73$E2`+Qw^Vp*jojxY~rsw^m0z5 z>hwvUwa`R^CeV}VL)xaaA}>lX;GP3ld?JH{sk=Z14U`% z(zv7_@12rT@6x@0n(=yB0q(TWL z(Gnp#-(#0PG>?o}PZX)lJfFE3dzsf%34y>LdOrg}?b_Zf00000NkvXXu0mjfR0@77 literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/models/armor/respirator_layer_1.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/models/armor/respirator_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..6881734094802d55ac551fb3c6008fd849e797af GIT binary patch literal 340 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQY`6?zK#qG8~eHcB(eheoCO|{ z#S9F5`$3q|f;CtLC@4|l8c`CQpH@7|XFhYdtr19>N_#lD*2m}_=|VW#5Zm6wIGc;XH}^`GaEaOUU|<7cAm*5Q30 z#Qg*lc^3=!_!(Foe8Gao@Vsntbd!$b_3w{wz1%LRx3uL&-R^zc&)*BJmeqVZr#WN8 z`Onw(zMH;c>%V#ZGoJ61Z@N`A_uG&5xJMomuIv}0UNf(24;Pkgx>mBD`9l3Uj>iiQ y9xHhKS$^B=^wx`N2bPDNB8 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 literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/models/armor/wool_armor_layer_2.png b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/assets/toughasnails/textures/models/armor/wool_armor_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..8022d9fe685a379887eba867fa223fde9d68d4d2 GIT binary patch literal 1577 zcmeHGYfqX76n?3ztF3l3)XjG5rZsEVESg&Dy3`My)*HPz6}M>7)=NS00#5LTqIm6q zf}p%!5D?@dAfOmT4N}27DtH6$Svr;-b8?>KoDa{*LyeA# za65hBGyni@h{(`bsDBHk*C{8cf_IpDsKE%a5g~xa_USe>yq6yQAQ%9&b!YxgISBwx zK=l2%Fo-X~AggjvH97IMxQEmqljwO#bi!jM@iC2hA8=YPCH*JvyDPx3^cX*Z1}H_4oG=3=9|yhQYx>qtQ4tG&CZmjY_EF zQreh|Zjm#l6ikb10_|Y@52?*4=0_napPM$jHd(=;+wk*!cMP#Kgqpj;D?t67333u7#oFr``-=#dGP)hkc2L|kqHC! z2O=*J!{UiZJcd}9l7|MOQ?NLqUsPC}S3!VZpr5~g#9qivNJa`GG&nBuUfSVz-kyQU zcHl#(9(oEz7~F{$Y?#Se{_!EbqWB5W4SW69uiWI%&I8#LW(@0AbA)p;3+>ngb=p`D z&N)n@qc?y;gS&a^oL<|{4W4j#oMC*k{}rQ1^h>By?Od%z6Ju;hO+^I_x351;IwqYD zWQuL<#hiIuFI;))*5!zhF{-nx5sn&$2d!^yyea8a{?^+5Ze2J2yqcwP`P0HkzG%>yYK4mc8(PhjlJ>5+uJ~#=63tR!Q883 OCm_P2LNy`DmHz!lvI6;>1s;*b z3=Dh+L6~vJ#O${~L5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33JG+x0e#L?ih$LJiPP2#nxSa!`8Yzi!_q;S-djSdG6nu_dK*|tNi-wulIj{{LA8e zac=v^d`t7J?c0}I&i(%U{VvgC?|)U+?x|jBa{u<-KQ+(Z)&1pvZS(fcYn$sokMSqO zy~zB!T)aB($j);$|MT{}DK`52d1md~TDSVc&%7<-@8zYvpSQDmW4774$K~^%r+<6* z`*qd!{12ryQR(s7zs{_CeA&uPV!qAZ9XC5lYiGSbJLlTX+m(My?7#8uyMRT@1dP+@86cp!Ka^fgl`WNn6_tiant!I7rv!A`+eD>OFKk=64S0u$0#Q*@1 zG%+^B0RTwof`EMxq1-L8wHC@APyK8908o)EzT>(V03d+nRcj+*9ECzz0)U08s1sV= z2Lkbe!3ZKE{&I3*($X#$6V^guiwy}TAgt(UVkW|kjc}hsc&#FQ1t-G=PC&eUHryc}ZdD=gS_1c~ zg5ROReCTjr2HdX|j_-l{^}}2T6mK&X{X1a(9q_;=<UdnKh0NF@2@nP?l$7+bA$51kAzy;vjt9AAT6 zykS1!asko!H%f?827XSzVVDbvG^M-M=uTv!;Am_`HD`XQs$d$y{l*ZWB z#oE=!IW)vOCUndFdqgg7N-k+dE`9a*Yc7Vej(g9()*5|6@Di9WMs+-lXrs7)rVzg+ z_zx%DTcYW&Ff5jv(E=8**5R<$jpO$Hu|7zmP$)DSt*BSfQW(=wdjC`9!=d6h0hv7a zE}2!Cve1~lO{4X9WdGQD%I>GmF)P!1%nwy(DnF8ic_u_mvf8&Q>dvtt!d}d7` z5KIYnXM`f`;6L_X6UY~%a()d831@C4g!%t$fYqkRQ6WfCg0bB_0D!&wbwK8ycJ+io zd6JPW$;!`z6y!>D2MDg-c#<04orKgqJp(aoZl`fZIRM|4S^l zbEUc%*~X_wMq+DY=|db$K7=M<^^%oB$|e~?dp`e0ta<9cCY+)qP!#OT{Q^lg#Xr$4V@w5hyO-q^*_S16@!U16 zRb^E2r~YK~PDk`WgY(W{6Z*_tg|nv$N?`^I|t;}iEIDnMn#}BJvhENS3FZZD=zi5+S^22hWT5lC za0}MK#Ux=Y1Y+gl=PbFYUOz9XOEILbRe=_+Kw-)W7I*fSz3j~$*4^T;9xu)w$S)16 z`GA&EV0rhvbS&N;My)7e<)fZUI$*{WIlBc%v?Uak8weU2Ec2FbR?JuXZFeT`8Sfr~ zz?&OjLN3ylhu5`2v0hRpvIvSjL>$-{(=Rpp2*+@w4=fKQ% zN%c3p267d{NtfHX!5{CMFsa$-`Mls;FFu%@l=Ru(*IOmRY^F+%1JBUw!p3YxFO zfh&wjuiJVsB=nv+6V1q3ol57Q)r<88U6*1m#?^*Cn8yTzWVReUI?>U!d;+>s0It%wva1mb<) z$U&PQeg5CRkd-28UNkGj&3nEYT^Or7Yq0iL(ZCU#pN?@|G_4%Mec2Fn#ew&p&X>LL ztEc)KvpIyW4YznO4W(3z{bXA}-mLU7fTj<{h*u}Y?$J8!SmHaDumru}gtcl8rak$% zOs-@&ITi@j=R@4<~f#R5)XDqtc^WP`UDMWK4*qO8i?5s{+w>e|y6X7KqFd$q7> zrZ~J&?k?Ay`n0;FHVlvvvxBUaASTlr$Z6q-r{#P*(Bv7V6yoIX$#*G!+e;D6n0agv zBiadTo{?VDS;vR8r}oe4r4oo6$oi)`EtNfpWV-gQGp4n_+(*fl*$*aUBD^P=KIMa8t7;z&c5bwR+N(2Z59+YWAwN>5vXIT`J?&T-wlCM zI`-e^Ou+tgXU7OxS%bez@k@;KmH3#SYAfPBguIKLJyFJ8GhB7{8JGGpDu1UDK e3LKhtb}(}aoa=dv=V`ybFD6FjhGmyrV*Ue0Y;=$S literal 0 HcmV?d00001 diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/mcmod.info b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/mcmod.info new file mode 100644 index 00000000..c4335729 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/mcmod.info @@ -0,0 +1,10 @@ +[{ + "modid": "ToughAsNails", + "name": "Tough As Nails", + "description": "Adds survival features to increase difficulty and realism, including thirst, body temperature, and more!", + "version": "1.10.2-1.0", + "mcversion": "1.10.2", + "url": "http://mods.curse.com/mc-mods/minecraft/246391-tough-as-nails", + "authorList": ["Adubbz", "Forstride"], + "logoFile": "assets/toughasnails/textures/gui/logo.png" +}] diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/pack.mcmeta b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/pack.mcmeta new file mode 100644 index 00000000..33aae04c --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "pack_format": 1, + "description": "Resources used for Tough As Nails" + } +} diff --git a/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/version.properties b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/version.properties new file mode 100644 index 00000000..c1270b64 --- /dev/null +++ b/forge-1.10.2-12.18.3.2422-mdk/src/main/resources/version.properties @@ -0,0 +1,2 @@ +${modid}.version=${mod_version} +${modid}.build_number=${build_number} \ No newline at end of file