Repository: Glitchfiend/ToughAsNails
Branch: 1.21.11
Commit: 1d9a97181cd8
Files: 580
Total size: 687.5 KB
Directory structure:
gitextract_61ihz9wd/
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── 1-bug_report.yml
│ │ ├── 2-crash_report.yml
│ │ ├── 3-feature_request.yml
│ │ └── config.yml
│ └── workflows/
│ └── gradle-publish.yml
├── .gitignore
├── LICENSE
├── README.md
├── build.gradle
├── common/
│ ├── build.gradle
│ └── src/
│ ├── generated/
│ │ └── resources/
│ │ ├── .cache/
│ │ │ ├── 103d9f3f36b01595f1aa5172191e60eff02e6924
│ │ │ ├── 1edd1aa8a5f5209e40be6ce639ab3fdd92079a0c
│ │ │ ├── 20dae170dba4c8eb919766d5be31700d182da0d9
│ │ │ ├── 237ed1d533e00e9b8d8148d6061ae61b82e960bb
│ │ │ ├── 4ff5308374b2e7729a466dfe56bd6182ead9b2c3
│ │ │ ├── 59eb3dbb5f86130e09b3c62d89b9525ee01cf52d
│ │ │ ├── 77038cb024c5999ce280bcb6800e72cf1c655fe7
│ │ │ ├── 9dc2e1bbb6dbc88d629e62ed955e4c156b6652a3
│ │ │ ├── d288570b70137f55051bdf585fe1fd764998d579
│ │ │ ├── d5932a16d3f0544ba1e8cda3b77d0d46f353493b
│ │ │ ├── d6a68f98580d9908a43dbfe9cc754bc0c1ac14b0
│ │ │ ├── e17ca3f95219f355def414f7430c77a0b006e725
│ │ │ └── ece1a0d38a152b7be1e86680691afdfd6d9fba1f
│ │ ├── assets/
│ │ │ └── toughasnails/
│ │ │ ├── equipment/
│ │ │ │ ├── leaf.json
│ │ │ │ └── wool.json
│ │ │ ├── items/
│ │ │ │ ├── apple_juice.json
│ │ │ │ ├── cactus_juice.json
│ │ │ │ ├── charc_os.json
│ │ │ │ ├── chorus_fruit_juice.json
│ │ │ │ ├── copper_dirty_water_canteen.json
│ │ │ │ ├── copper_purified_water_canteen.json
│ │ │ │ ├── copper_water_canteen.json
│ │ │ │ ├── diamond_dirty_water_canteen.json
│ │ │ │ ├── diamond_purified_water_canteen.json
│ │ │ │ ├── diamond_water_canteen.json
│ │ │ │ ├── dirty_water_bottle.json
│ │ │ │ ├── empty_copper_canteen.json
│ │ │ │ ├── empty_diamond_canteen.json
│ │ │ │ ├── empty_gold_canteen.json
│ │ │ │ ├── empty_iron_canteen.json
│ │ │ │ ├── empty_leather_canteen.json
│ │ │ │ ├── empty_netherite_canteen.json
│ │ │ │ ├── glow_berry_juice.json
│ │ │ │ ├── gold_dirty_water_canteen.json
│ │ │ │ ├── gold_purified_water_canteen.json
│ │ │ │ ├── gold_water_canteen.json
│ │ │ │ ├── ice_cream.json
│ │ │ │ ├── iron_dirty_water_canteen.json
│ │ │ │ ├── iron_purified_water_canteen.json
│ │ │ │ ├── iron_water_canteen.json
│ │ │ │ ├── leaf_boots.json
│ │ │ │ ├── leaf_chestplate.json
│ │ │ │ ├── leaf_helmet.json
│ │ │ │ ├── leaf_leggings.json
│ │ │ │ ├── leather_dirty_water_canteen.json
│ │ │ │ ├── leather_purified_water_canteen.json
│ │ │ │ ├── leather_water_canteen.json
│ │ │ │ ├── melon_juice.json
│ │ │ │ ├── netherite_dirty_water_canteen.json
│ │ │ │ ├── netherite_purified_water_canteen.json
│ │ │ │ ├── netherite_water_canteen.json
│ │ │ │ ├── pumpkin_juice.json
│ │ │ │ ├── purified_water_bottle.json
│ │ │ │ ├── rain_collector.json
│ │ │ │ ├── sweet_berry_juice.json
│ │ │ │ ├── tan_icon.json
│ │ │ │ ├── temperature_gauge.json
│ │ │ │ ├── thermometer.json
│ │ │ │ ├── thermoregulator.json
│ │ │ │ ├── water_purifier.json
│ │ │ │ ├── wool_boots.json
│ │ │ │ ├── wool_chestplate.json
│ │ │ │ ├── wool_helmet.json
│ │ │ │ └── wool_leggings.json
│ │ │ └── models/
│ │ │ └── item/
│ │ │ ├── apple_juice.json
│ │ │ ├── cactus_juice.json
│ │ │ ├── charc_os.json
│ │ │ ├── chorus_fruit_juice.json
│ │ │ ├── copper_dirty_water_canteen.json
│ │ │ ├── copper_purified_water_canteen.json
│ │ │ ├── copper_water_canteen.json
│ │ │ ├── diamond_dirty_water_canteen.json
│ │ │ ├── diamond_purified_water_canteen.json
│ │ │ ├── diamond_water_canteen.json
│ │ │ ├── dirty_water_bottle.json
│ │ │ ├── empty_copper_canteen.json
│ │ │ ├── empty_diamond_canteen.json
│ │ │ ├── empty_gold_canteen.json
│ │ │ ├── empty_iron_canteen.json
│ │ │ ├── empty_leather_canteen.json
│ │ │ ├── empty_netherite_canteen.json
│ │ │ ├── glow_berry_juice.json
│ │ │ ├── gold_dirty_water_canteen.json
│ │ │ ├── gold_purified_water_canteen.json
│ │ │ ├── gold_water_canteen.json
│ │ │ ├── ice_cream.json
│ │ │ ├── iron_dirty_water_canteen.json
│ │ │ ├── iron_purified_water_canteen.json
│ │ │ ├── iron_water_canteen.json
│ │ │ ├── leaf_boots.json
│ │ │ ├── leaf_boots_amethyst_trim.json
│ │ │ ├── leaf_boots_copper_trim.json
│ │ │ ├── leaf_boots_diamond_trim.json
│ │ │ ├── leaf_boots_emerald_trim.json
│ │ │ ├── leaf_boots_gold_trim.json
│ │ │ ├── leaf_boots_iron_trim.json
│ │ │ ├── leaf_boots_lapis_trim.json
│ │ │ ├── leaf_boots_netherite_trim.json
│ │ │ ├── leaf_boots_quartz_trim.json
│ │ │ ├── leaf_boots_redstone_trim.json
│ │ │ ├── leaf_boots_resin_trim.json
│ │ │ ├── leaf_chestplate.json
│ │ │ ├── leaf_chestplate_amethyst_trim.json
│ │ │ ├── leaf_chestplate_copper_trim.json
│ │ │ ├── leaf_chestplate_diamond_trim.json
│ │ │ ├── leaf_chestplate_emerald_trim.json
│ │ │ ├── leaf_chestplate_gold_trim.json
│ │ │ ├── leaf_chestplate_iron_trim.json
│ │ │ ├── leaf_chestplate_lapis_trim.json
│ │ │ ├── leaf_chestplate_netherite_trim.json
│ │ │ ├── leaf_chestplate_quartz_trim.json
│ │ │ ├── leaf_chestplate_redstone_trim.json
│ │ │ ├── leaf_chestplate_resin_trim.json
│ │ │ ├── leaf_helmet.json
│ │ │ ├── leaf_helmet_amethyst_trim.json
│ │ │ ├── leaf_helmet_copper_trim.json
│ │ │ ├── leaf_helmet_diamond_trim.json
│ │ │ ├── leaf_helmet_emerald_trim.json
│ │ │ ├── leaf_helmet_gold_trim.json
│ │ │ ├── leaf_helmet_iron_trim.json
│ │ │ ├── leaf_helmet_lapis_trim.json
│ │ │ ├── leaf_helmet_netherite_trim.json
│ │ │ ├── leaf_helmet_quartz_trim.json
│ │ │ ├── leaf_helmet_redstone_trim.json
│ │ │ ├── leaf_helmet_resin_trim.json
│ │ │ ├── leaf_leggings.json
│ │ │ ├── leaf_leggings_amethyst_trim.json
│ │ │ ├── leaf_leggings_copper_trim.json
│ │ │ ├── leaf_leggings_diamond_trim.json
│ │ │ ├── leaf_leggings_emerald_trim.json
│ │ │ ├── leaf_leggings_gold_trim.json
│ │ │ ├── leaf_leggings_iron_trim.json
│ │ │ ├── leaf_leggings_lapis_trim.json
│ │ │ ├── leaf_leggings_netherite_trim.json
│ │ │ ├── leaf_leggings_quartz_trim.json
│ │ │ ├── leaf_leggings_redstone_trim.json
│ │ │ ├── leaf_leggings_resin_trim.json
│ │ │ ├── leather_dirty_water_canteen.json
│ │ │ ├── leather_purified_water_canteen.json
│ │ │ ├── leather_water_canteen.json
│ │ │ ├── melon_juice.json
│ │ │ ├── netherite_dirty_water_canteen.json
│ │ │ ├── netherite_purified_water_canteen.json
│ │ │ ├── netherite_water_canteen.json
│ │ │ ├── pumpkin_juice.json
│ │ │ ├── purified_water_bottle.json
│ │ │ ├── sweet_berry_juice.json
│ │ │ ├── tan_icon.json
│ │ │ ├── thermometer_00.json
│ │ │ ├── thermometer_01.json
│ │ │ ├── thermometer_02.json
│ │ │ ├── thermometer_03.json
│ │ │ ├── thermometer_04.json
│ │ │ ├── thermometer_05.json
│ │ │ ├── thermometer_06.json
│ │ │ ├── thermometer_07.json
│ │ │ ├── thermometer_08.json
│ │ │ ├── thermometer_09.json
│ │ │ ├── thermometer_10.json
│ │ │ ├── thermometer_11.json
│ │ │ ├── thermometer_12.json
│ │ │ ├── thermometer_13.json
│ │ │ ├── thermometer_14.json
│ │ │ ├── thermometer_15.json
│ │ │ ├── thermometer_16.json
│ │ │ ├── thermometer_17.json
│ │ │ ├── thermometer_18.json
│ │ │ ├── thermometer_19.json
│ │ │ ├── thermometer_20.json
│ │ │ ├── wool_boots.json
│ │ │ ├── wool_boots_amethyst_trim.json
│ │ │ ├── wool_boots_copper_trim.json
│ │ │ ├── wool_boots_diamond_trim.json
│ │ │ ├── wool_boots_emerald_trim.json
│ │ │ ├── wool_boots_gold_trim.json
│ │ │ ├── wool_boots_iron_trim.json
│ │ │ ├── wool_boots_lapis_trim.json
│ │ │ ├── wool_boots_netherite_trim.json
│ │ │ ├── wool_boots_quartz_trim.json
│ │ │ ├── wool_boots_redstone_trim.json
│ │ │ ├── wool_boots_resin_trim.json
│ │ │ ├── wool_chestplate.json
│ │ │ ├── wool_chestplate_amethyst_trim.json
│ │ │ ├── wool_chestplate_copper_trim.json
│ │ │ ├── wool_chestplate_diamond_trim.json
│ │ │ ├── wool_chestplate_emerald_trim.json
│ │ │ ├── wool_chestplate_gold_trim.json
│ │ │ ├── wool_chestplate_iron_trim.json
│ │ │ ├── wool_chestplate_lapis_trim.json
│ │ │ ├── wool_chestplate_netherite_trim.json
│ │ │ ├── wool_chestplate_quartz_trim.json
│ │ │ ├── wool_chestplate_redstone_trim.json
│ │ │ ├── wool_chestplate_resin_trim.json
│ │ │ ├── wool_helmet.json
│ │ │ ├── wool_helmet_amethyst_trim.json
│ │ │ ├── wool_helmet_copper_trim.json
│ │ │ ├── wool_helmet_diamond_trim.json
│ │ │ ├── wool_helmet_emerald_trim.json
│ │ │ ├── wool_helmet_gold_trim.json
│ │ │ ├── wool_helmet_iron_trim.json
│ │ │ ├── wool_helmet_lapis_trim.json
│ │ │ ├── wool_helmet_netherite_trim.json
│ │ │ ├── wool_helmet_quartz_trim.json
│ │ │ ├── wool_helmet_redstone_trim.json
│ │ │ ├── wool_helmet_resin_trim.json
│ │ │ ├── wool_leggings.json
│ │ │ ├── wool_leggings_amethyst_trim.json
│ │ │ ├── wool_leggings_copper_trim.json
│ │ │ ├── wool_leggings_diamond_trim.json
│ │ │ ├── wool_leggings_emerald_trim.json
│ │ │ ├── wool_leggings_gold_trim.json
│ │ │ ├── wool_leggings_iron_trim.json
│ │ │ ├── wool_leggings_lapis_trim.json
│ │ │ ├── wool_leggings_netherite_trim.json
│ │ │ ├── wool_leggings_quartz_trim.json
│ │ │ ├── wool_leggings_redstone_trim.json
│ │ │ └── wool_leggings_resin_trim.json
│ │ └── data/
│ │ ├── minecraft/
│ │ │ └── tags/
│ │ │ ├── block/
│ │ │ │ └── mineable/
│ │ │ │ ├── axe.json
│ │ │ │ └── pickaxe.json
│ │ │ ├── damage_type/
│ │ │ │ ├── bypasses_armor.json
│ │ │ │ └── bypasses_effects.json
│ │ │ ├── enchantment/
│ │ │ │ ├── on_random_loot.json
│ │ │ │ ├── tradeable.json
│ │ │ │ └── treasure.json
│ │ │ ├── item/
│ │ │ │ └── dyeable.json
│ │ │ └── point_of_interest_type/
│ │ │ └── acquirable_job_site.json
│ │ └── toughasnails/
│ │ ├── advancement/
│ │ │ └── recipes/
│ │ │ ├── combat/
│ │ │ │ ├── leaf_boots.json
│ │ │ │ ├── leaf_chestplate.json
│ │ │ │ ├── leaf_helmet.json
│ │ │ │ ├── leaf_leggings.json
│ │ │ │ ├── wool_boots.json
│ │ │ │ ├── wool_chestplate.json
│ │ │ │ ├── wool_helmet.json
│ │ │ │ └── wool_leggings.json
│ │ │ ├── decorations/
│ │ │ │ ├── rain_collector.json
│ │ │ │ ├── thermoregulator.json
│ │ │ │ └── water_purifier.json
│ │ │ ├── food/
│ │ │ │ ├── apple_juice.json
│ │ │ │ ├── cactus_juice.json
│ │ │ │ ├── charc_os.json
│ │ │ │ ├── chorus_fruit_juice.json
│ │ │ │ ├── glow_berry_juice.json
│ │ │ │ ├── ice_cream.json
│ │ │ │ ├── melon_juice.json
│ │ │ │ ├── pumpkin_juice.json
│ │ │ │ └── sweet_berry_juice.json
│ │ │ ├── redstone/
│ │ │ │ └── temperature_gauge.json
│ │ │ └── tools/
│ │ │ ├── empty_copper_canteen.json
│ │ │ ├── empty_diamond_canteen.json
│ │ │ ├── empty_gold_canteen.json
│ │ │ ├── empty_iron_canteen.json
│ │ │ ├── empty_leather_canteen.json
│ │ │ ├── empty_netherite_canteen_smithing.json
│ │ │ ├── netherite_dirty_water_canteen_smithing.json
│ │ │ ├── netherite_purified_water_canteen_smithing.json
│ │ │ ├── netherite_water_canteen_smithing.json
│ │ │ └── thermometer.json
│ │ ├── damage_type/
│ │ │ ├── hyperthermia.json
│ │ │ └── thirst.json
│ │ ├── enchantment/
│ │ │ ├── thermal_tuning.json
│ │ │ └── water_cleansing.json
│ │ ├── loot_table/
│ │ │ └── blocks/
│ │ │ ├── rain_collector.json
│ │ │ ├── temperature_gauge.json
│ │ │ ├── thermoregulator.json
│ │ │ └── water_purifier.json
│ │ ├── recipe/
│ │ │ ├── apple_juice.json
│ │ │ ├── cactus_juice.json
│ │ │ ├── charc_os.json
│ │ │ ├── chorus_fruit_juice.json
│ │ │ ├── copper_purified_water_canteen.json
│ │ │ ├── copper_water_canteen.json
│ │ │ ├── diamond_purified_water_canteen.json
│ │ │ ├── diamond_water_canteen.json
│ │ │ ├── empty_copper_canteen.json
│ │ │ ├── empty_diamond_canteen.json
│ │ │ ├── empty_gold_canteen.json
│ │ │ ├── empty_iron_canteen.json
│ │ │ ├── empty_leather_canteen.json
│ │ │ ├── empty_netherite_canteen_smithing.json
│ │ │ ├── glow_berry_juice.json
│ │ │ ├── gold_purified_water_canteen.json
│ │ │ ├── gold_water_canteen.json
│ │ │ ├── ice_cream.json
│ │ │ ├── iron_purified_water_canteen.json
│ │ │ ├── iron_water_canteen.json
│ │ │ ├── leaf_boots.json
│ │ │ ├── leaf_chestplate.json
│ │ │ ├── leaf_helmet.json
│ │ │ ├── leaf_leggings.json
│ │ │ ├── leather_purified_water_canteen.json
│ │ │ ├── leather_water_canteen.json
│ │ │ ├── melon_juice.json
│ │ │ ├── netherite_dirty_water_canteen_smithing.json
│ │ │ ├── netherite_purified_water_canteen.json
│ │ │ ├── netherite_purified_water_canteen_smithing.json
│ │ │ ├── netherite_water_canteen.json
│ │ │ ├── netherite_water_canteen_smithing.json
│ │ │ ├── potion.json
│ │ │ ├── pumpkin_juice.json
│ │ │ ├── purified_water_bottle.json
│ │ │ ├── rain_collector.json
│ │ │ ├── sweet_berry_juice.json
│ │ │ ├── temperature_gauge.json
│ │ │ ├── thermometer.json
│ │ │ ├── thermoregulator.json
│ │ │ ├── water_purifier.json
│ │ │ ├── wool_boots.json
│ │ │ ├── wool_chestplate.json
│ │ │ ├── wool_helmet.json
│ │ │ └── wool_leggings.json
│ │ └── tags/
│ │ ├── block/
│ │ │ ├── cooling_blocks.json
│ │ │ ├── heating_blocks.json
│ │ │ └── passable_blocks.json
│ │ ├── entity_type/
│ │ │ └── neutralising_mounts.json
│ │ ├── item/
│ │ │ ├── cooling_armor.json
│ │ │ ├── cooling_consumed_items.json
│ │ │ ├── cooling_held_items.json
│ │ │ ├── drinks.json
│ │ │ ├── enchantable/
│ │ │ │ └── canteen.json
│ │ │ ├── heating_armor.json
│ │ │ ├── heating_consumed_items.json
│ │ │ ├── heating_held_items.json
│ │ │ ├── hydration/
│ │ │ │ ├── 100_hydration_drinks.json
│ │ │ │ ├── 10_hydration_drinks.json
│ │ │ │ ├── 20_hydration_drinks.json
│ │ │ │ ├── 30_hydration_drinks.json
│ │ │ │ ├── 40_hydration_drinks.json
│ │ │ │ ├── 50_hydration_drinks.json
│ │ │ │ ├── 60_hydration_drinks.json
│ │ │ │ ├── 70_hydration_drinks.json
│ │ │ │ ├── 80_hydration_drinks.json
│ │ │ │ └── 90_hydration_drinks.json
│ │ │ ├── poison_chance/
│ │ │ │ ├── 100_poison_chance_drinks.json
│ │ │ │ ├── 25_poison_chance_drinks.json
│ │ │ │ ├── 50_poison_chance_drinks.json
│ │ │ │ └── 75_poison_chance_drinks.json
│ │ │ ├── thermoregulator_cooling_fuel.json
│ │ │ ├── thermoregulator_heating_fuel.json
│ │ │ └── thirst/
│ │ │ ├── 10_thirst_drinks.json
│ │ │ ├── 11_thirst_drinks.json
│ │ │ ├── 12_thirst_drinks.json
│ │ │ ├── 13_thirst_drinks.json
│ │ │ ├── 14_thirst_drinks.json
│ │ │ ├── 15_thirst_drinks.json
│ │ │ ├── 16_thirst_drinks.json
│ │ │ ├── 17_thirst_drinks.json
│ │ │ ├── 18_thirst_drinks.json
│ │ │ ├── 19_thirst_drinks.json
│ │ │ ├── 1_thirst_drinks.json
│ │ │ ├── 20_thirst_drinks.json
│ │ │ ├── 2_thirst_drinks.json
│ │ │ ├── 3_thirst_drinks.json
│ │ │ ├── 4_thirst_drinks.json
│ │ │ ├── 5_thirst_drinks.json
│ │ │ ├── 6_thirst_drinks.json
│ │ │ ├── 7_thirst_drinks.json
│ │ │ ├── 8_thirst_drinks.json
│ │ │ └── 9_thirst_drinks.json
│ │ ├── trim_material/
│ │ │ ├── cooling_trims.json
│ │ │ └── heating_trims.json
│ │ └── worldgen/
│ │ └── biome/
│ │ ├── cold_biomes.json
│ │ ├── dirty_water_biomes.json
│ │ ├── hot_biomes.json
│ │ ├── icy_biomes.json
│ │ ├── neutral_biomes.json
│ │ ├── purified_water_biomes.json
│ │ └── warm_biomes.json
│ └── main/
│ ├── java/
│ │ └── toughasnails/
│ │ ├── api/
│ │ │ ├── TANAPI.java
│ │ │ ├── block/
│ │ │ │ └── TANBlocks.java
│ │ │ ├── blockentity/
│ │ │ │ └── TANBlockEntityTypes.java
│ │ │ ├── container/
│ │ │ │ └── TANContainerTypes.java
│ │ │ ├── crafting/
│ │ │ │ ├── TANRecipeBookCategories.java
│ │ │ │ ├── TANRecipeSerializers.java
│ │ │ │ └── TANRecipeTypes.java
│ │ │ ├── damagesource/
│ │ │ │ └── TANDamageTypes.java
│ │ │ ├── enchantment/
│ │ │ │ └── TANEnchantments.java
│ │ │ ├── item/
│ │ │ │ └── TANItems.java
│ │ │ ├── particle/
│ │ │ │ └── TANParticles.java
│ │ │ ├── player/
│ │ │ │ └── ITANPlayer.java
│ │ │ ├── potion/
│ │ │ │ ├── TANEffects.java
│ │ │ │ └── TANPotions.java
│ │ │ ├── temperature/
│ │ │ │ ├── IPlayerTemperatureModifier.java
│ │ │ │ ├── IPositionalTemperatureModifier.java
│ │ │ │ ├── IProximityBlockModifier.java
│ │ │ │ ├── ITemperature.java
│ │ │ │ ├── TemperatureHelper.java
│ │ │ │ └── TemperatureLevel.java
│ │ │ ├── thirst/
│ │ │ │ ├── IThirst.java
│ │ │ │ ├── ThirstHelper.java
│ │ │ │ └── WaterType.java
│ │ │ └── village/
│ │ │ ├── TANPoiTypes.java
│ │ │ └── TANVillagerProfessions.java
│ │ ├── block/
│ │ │ ├── RainCollectorBlock.java
│ │ │ ├── TemperatureGaugeBlock.java
│ │ │ ├── ThermoregulatorBlock.java
│ │ │ ├── WaterPurifierBlock.java
│ │ │ └── entity/
│ │ │ ├── TemperatureGaugeBlockEntity.java
│ │ │ ├── ThermoregulatorBlockEntity.java
│ │ │ └── WaterPurifierBlockEntity.java
│ │ ├── client/
│ │ │ ├── gui/
│ │ │ │ ├── ThermoregulatorScreen.java
│ │ │ │ └── WaterPurifierScreen.java
│ │ │ ├── handler/
│ │ │ │ ├── KeyHandler.java
│ │ │ │ ├── LevelRenderHandler.java
│ │ │ │ └── TooltipHandler.java
│ │ │ ├── item/
│ │ │ │ └── TemperatureProperty.java
│ │ │ └── particle/
│ │ │ └── ThermoregulatorParticle.java
│ │ ├── config/
│ │ │ ├── ClientConfig.java
│ │ │ ├── TemperatureConfig.java
│ │ │ └── ThirstConfig.java
│ │ ├── container/
│ │ │ ├── ThermoregulatorContainer.java
│ │ │ ├── ThermoregulatorCoolingFuelSlot.java
│ │ │ ├── ThermoregulatorHeatingFuelSlot.java
│ │ │ ├── WaterPurifierFilterSlot.java
│ │ │ ├── WaterPurifierMenu.java
│ │ │ └── WaterPurifierResultSlot.java
│ │ ├── core/
│ │ │ └── ToughAsNails.java
│ │ ├── crafting/
│ │ │ └── WaterPurifierRecipe.java
│ │ ├── init/
│ │ │ ├── ModApi.java
│ │ │ ├── ModArmorMaterials.java
│ │ │ ├── ModBlockEntities.java
│ │ │ ├── ModBlocks.java
│ │ │ ├── ModClient.java
│ │ │ ├── ModCompatibility.java
│ │ │ ├── ModConfig.java
│ │ │ ├── ModContainerTypes.java
│ │ │ ├── ModCrafting.java
│ │ │ ├── ModCreativeTab.java
│ │ │ ├── ModEnchantments.java
│ │ │ ├── ModEquipmentAssets.java
│ │ │ ├── ModItems.java
│ │ │ ├── ModPackets.java
│ │ │ ├── ModParticles.java
│ │ │ ├── ModPotions.java
│ │ │ ├── ModRecipePropertySets.java
│ │ │ ├── ModTags.java
│ │ │ └── ModVillages.java
│ │ ├── item/
│ │ │ ├── DirtyWaterBottleItem.java
│ │ │ ├── DrinkItem.java
│ │ │ ├── EmptyCanteenItem.java
│ │ │ ├── FilledCanteenItem.java
│ │ │ ├── JuiceItem.java
│ │ │ ├── PurifiedWaterBottleItem.java
│ │ │ └── StackableBowlFoodItem.java
│ │ ├── mixin/
│ │ │ ├── MixinFoodData.java
│ │ │ ├── MixinLivingEntity.java
│ │ │ ├── MixinPlayer.java
│ │ │ ├── MixinPotionBrewing.java
│ │ │ ├── MixinRecipeManager.java
│ │ │ ├── MixinServerLevel.java
│ │ │ ├── MixinServerPlayer.java
│ │ │ └── client/
│ │ │ ├── MixinGui.java
│ │ │ ├── MixinItemStack.java
│ │ │ ├── MixinLocalPlayer.java
│ │ │ └── MixinRangeSelectItemModelProperties.java
│ │ ├── network/
│ │ │ ├── DrinkInWorldPacket.java
│ │ │ ├── UpdateTemperaturePacket.java
│ │ │ └── UpdateThirstPacket.java
│ │ ├── potion/
│ │ │ └── ThirstEffect.java
│ │ ├── temperature/
│ │ │ ├── AreaFill.java
│ │ │ ├── BuiltInTemperatureModifier.java
│ │ │ ├── TemperatureData.java
│ │ │ ├── TemperatureHandler.java
│ │ │ ├── TemperatureHelperImpl.java
│ │ │ ├── TemperatureHooksClient.java
│ │ │ └── TemperatureOverlayRenderer.java
│ │ └── thirst/
│ │ ├── ThirstData.java
│ │ ├── ThirstHandler.java
│ │ ├── ThirstHelperImpl.java
│ │ ├── ThirstHooks.java
│ │ ├── ThirstHooksClient.java
│ │ └── ThirstOverlayRenderer.java
│ └── resources/
│ ├── assets/
│ │ └── toughasnails/
│ │ ├── atlases/
│ │ │ └── gui.json
│ │ ├── blockstates/
│ │ │ ├── rain_collector.json
│ │ │ ├── temperature_gauge.json
│ │ │ ├── thermoregulator.json
│ │ │ └── water_purifier.json
│ │ ├── lang/
│ │ │ ├── cs_cz.json
│ │ │ ├── de_de.json
│ │ │ ├── en_us.json
│ │ │ ├── es_es.json
│ │ │ ├── fr_fr.json
│ │ │ ├── it_it.json
│ │ │ ├── ja_jp.json
│ │ │ ├── ko_kr.json
│ │ │ ├── lol_us.json
│ │ │ ├── nn_no.json
│ │ │ ├── pl_pl.json
│ │ │ ├── pt_br.json
│ │ │ ├── ru_ru.json
│ │ │ ├── tr_tr.json
│ │ │ ├── uk_ua.json
│ │ │ ├── vi_vn.json
│ │ │ ├── zh_cn.json
│ │ │ └── zh_tw.json
│ │ ├── models/
│ │ │ ├── block/
│ │ │ │ ├── rain_collector.json
│ │ │ │ ├── rain_collector_level1.json
│ │ │ │ ├── rain_collector_level2.json
│ │ │ │ ├── rain_collector_level3.json
│ │ │ │ ├── temperature_gauge.json
│ │ │ │ ├── temperature_gauge_inverted.json
│ │ │ │ ├── thermoregulator.json
│ │ │ │ ├── thermoregulator_active.json
│ │ │ │ ├── thermoregulator_cooling_active.json
│ │ │ │ ├── thermoregulator_heating_active.json
│ │ │ │ ├── water_purifier.json
│ │ │ │ └── water_purifier_filtering.json
│ │ │ └── item/
│ │ │ ├── rain_collector.json
│ │ │ ├── temperature_gauge.json
│ │ │ ├── thermoregulator.json
│ │ │ └── water_purifier.json
│ │ ├── particles/
│ │ │ ├── thermoregulator_cool.json
│ │ │ ├── thermoregulator_neutral.json
│ │ │ └── thermoregulator_warm.json
│ │ └── textures/
│ │ └── block/
│ │ ├── temperature_gauge_inverted_top.png.mcmeta
│ │ ├── temperature_gauge_top.png.mcmeta
│ │ ├── thermoregulator_front_active.png.mcmeta
│ │ ├── thermoregulator_side_cooling.png.mcmeta
│ │ └── thermoregulator_side_heating.png.mcmeta
│ ├── data/
│ │ └── toughasnails/
│ │ ├── loot_table/
│ │ │ └── chests/
│ │ │ └── village/
│ │ │ └── village_climatologist.json
│ │ └── structure/
│ │ └── village/
│ │ ├── desert/
│ │ │ └── houses/
│ │ │ └── desert_climatologist_1.nbt
│ │ ├── plains/
│ │ │ └── houses/
│ │ │ └── plains_climatologist_1.nbt
│ │ ├── savanna/
│ │ │ └── houses/
│ │ │ └── savanna_climatologist_1.nbt
│ │ ├── snowy/
│ │ │ └── houses/
│ │ │ └── snowy_climatologist_1.nbt
│ │ └── taiga/
│ │ └── houses/
│ │ └── taiga_climatologist_1.nbt
│ ├── pack.mcmeta
│ ├── toughasnails.accesswidener
│ └── toughasnails.mixins.json
├── fabric/
│ ├── build.gradle
│ └── src/
│ └── main/
│ ├── java/
│ │ └── toughasnails/
│ │ └── fabric/
│ │ ├── core/
│ │ │ └── ToughAsNailsFabric.java
│ │ └── mixin/
│ │ └── client/
│ │ └── MixinGui.java
│ └── resources/
│ ├── fabric.mod.json
│ └── toughasnails.fabric.mixins.json
├── forge/
│ ├── build.gradle
│ └── src/
│ └── main/
│ ├── java/
│ │ └── toughasnails/
│ │ └── forge/
│ │ ├── core/
│ │ │ └── ToughAsNailsForge.java
│ │ └── mixin/
│ │ ├── MixinTemperatureHelperImpl.java
│ │ ├── MixinThermoregulatorBlockEntity.java
│ │ ├── MixinWaterPurifierBlockEntity.java
│ │ └── client/
│ │ └── MixinGui.java
│ └── resources/
│ ├── META-INF/
│ │ ├── accesstransformer.cfg
│ │ └── mods.toml
│ └── toughasnails.forge.mixins.json
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── neoforge/
│ ├── build.gradle
│ └── src/
│ └── main/
│ ├── java/
│ │ └── toughasnails/
│ │ └── neoforge/
│ │ ├── core/
│ │ │ └── ToughAsNailsNeoForge.java
│ │ ├── datagen/
│ │ │ ├── DataGenerationHandler.java
│ │ │ ├── ModDamageTypes.java
│ │ │ ├── loot/
│ │ │ │ ├── TANBlockLoot.java
│ │ │ │ └── TANLootTableProvider.java
│ │ │ ├── model/
│ │ │ │ ├── TANEquipmentAssetProvider.java
│ │ │ │ ├── TANItemModelGenerators.java
│ │ │ │ └── TANModelProvider.java
│ │ │ ├── provider/
│ │ │ │ ├── TANBiomeTagsProvider.java
│ │ │ │ ├── TANBlockTagsProvider.java
│ │ │ │ ├── TANDamageTypeTagsProvider.java
│ │ │ │ ├── TANEnchantmentTagsProvider.java
│ │ │ │ ├── TANEntityTypeTagsProvider.java
│ │ │ │ ├── TANItemTagsProvider.java
│ │ │ │ ├── TANPoiTypesTagsProvider.java
│ │ │ │ ├── TANRecipeProvider.java
│ │ │ │ └── TANTrimMaterialTagsProvider.java
│ │ │ └── recipes/
│ │ │ └── WaterPurifierRecipeBuilder.java
│ │ └── mixin/
│ │ └── client/
│ │ └── MixinGui.java
│ └── resources/
│ ├── META-INF/
│ │ ├── accesstransformer.cfg
│ │ └── neoforge.mods.toml
│ └── toughasnails.neoforge.mixins.json
└── settings.gradle
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/ISSUE_TEMPLATE/1-bug_report.yml
================================================
name: 1.21.3+ Bug Report
description: File a bug report
labels: [bug]
body:
- type: markdown
attributes:
value: |
For bugs experienced with Minecraft 1.21.3+. Older versions are not supported.
If any section does not apply, replace its content with "N/A".
Please search for existing bug reports before making your own report.
Duplicate reports will be marked as such and you will be referred to the original report.
- type: textarea
attributes:
label: What's the issue you encountered?
description: |
Describe the issue in detail and what you were doing beforehand.
validations:
required: true
- type: textarea
attributes:
label: How can the issue be reproduced?
description: Include a detailed step by step process for recreating your issue.
validations:
required: true
- type: input
attributes:
label: Logs
description: |
Logs can be found in your Minecraft directory under `/logs/latest.log`.
If your issue caused Minecraft to crash, include the crash report by creating a [gist](https://gist.github.com/) and pasting the link here.
If your don't include logs in instances of crash related issues, we will ask you to provide one.
- type: input
attributes:
label: Mod Version
description: |
Replace ×'s with the mod version you are using.
You can find your mod version by checking the ``Mods`` menu on the title screen.
placeholder: ×.×.×.×
validations:
required: true
- type: textarea
attributes:
label: Additional information
description: |
Any other information relevant to your issue.
================================================
FILE: .github/ISSUE_TEMPLATE/2-crash_report.yml
================================================
name: 1.21.3+ Crash Report
description: File a crash report
labels: [crash]
body:
- type: markdown
attributes:
value: |
For crashes experienced with Minecraft 1.21.3+. Older versions are not supported.
If any section does not apply, replace its content with "N/A".
Please search for existing crash reports before making your own report.
Duplicate reports will be marked as such and you will be referred to the original report.
- type: textarea
attributes:
label: What's the issue you encountered?
description: |
Describe the issue in detail and what you were doing beforehand.
validations:
required: true
- type: textarea
attributes:
label: How can the issue be reproduced?
description: Include a detailed step by step process for recreating your issue.
validations:
required: true
- type: input
attributes:
label: Logs
description: |
Logs can be found in your Minecraft directory under `/logs/latest.log`.
If your issue caused Minecraft to crash, include the crash report by creating a [gist](https://gist.github.com/) and pasting the link here.
If your don't include logs in instances of crash related issues, we will ask you to provide one.
validations:
required: true
- type: input
attributes:
label: Mod Version
description: |
Replace ×'s with the mod version you are using.
You can find your mod version by checking the ``Mods`` menu on the title screen.
placeholder: ×.×.×.×
validations:
required: true
- type: textarea
attributes:
label: Additional information
description: |
Any other information relevant to your issue.
================================================
FILE: .github/ISSUE_TEMPLATE/3-feature_request.yml
================================================
name: 1.21.3+ Feature Request
description: Request a new feature
labels: [feature]
body:
- type: markdown
attributes:
value: |
Feature requests for Minecraft 1.21.3+. Older versions are not supported.
If any section does not apply, replace its contents with "N/A".
Please search for existing feature requests before you make your own request.
Duplicate requests will be marked as such and you will be referred to the original request.
- type: markdown
attributes:
value: "## What feature are you suggesting?"
- type: textarea
attributes:
label: Overview
description: Provide an overview of the feature being suggested.
validations:
required: true
- type: textarea
attributes:
label: Why would this feature be useful?
description: |
Describe the benefits of implementing this feature.
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: Glitchfiend Discord
url: https://discord.gg/GyyzU6T
about: Please ask general questions here instead of opening issues for them.
================================================
FILE: .github/workflows/gradle-publish.yml
================================================
name: Publish
on:
workflow_dispatch:
push:
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: "Checkout"
uses: actions/checkout@v4
with:
fetch-depth: 0
fetch-tags: true
- name: Set up JDK 21
uses: actions/setup-java@v3
with:
java-version: '21'
distribution: 'oracle'
server-id: github # Value of the distributionManagement/repository/id field of the pom.xml
settings-path: ${{ github.workspace }} # location for the settings.xml file
- name: Setup Gradle
uses: gradle/gradle-build-action@v2
- name: Publish
run: ./gradlew publish
env:
MAVEN_USER: ${{ secrets.MAVEN_USER }}
MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }}
BUILD_NUMBER: ${{ github.run_number }}
- name: CurseForge Publish
run: ./gradlew curseforge -PcurseApiKey=${CURSE_API_KEY}
env:
CURSE_API_KEY: ${{ secrets.CURSE_API_KEY }}
BUILD_NUMBER: ${{ github.run_number }}
continue-on-error: true
- name: Modrinth Publish
run: ./gradlew modrinth -PmodrinthToken=${MODRINTH_TOKEN}
env:
MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }}
BUILD_NUMBER: ${{ github.run_number }}
continue-on-error: true
================================================
FILE: .gitignore
================================================
# eclipse
bin
*.launch
.settings
.metadata
.classpath
.project
# idea
out
*.ipr
*.iws
*.iml
.idea/*
!.idea/scopes
# gradle
build
.gradle
# other
eclipse
run
runs
================================================
FILE: LICENSE
================================================
All rights reserved.
================================================
FILE: README.md
================================================

**Tough As Nails** is a **Minecraft mod** that adds various features to increase the game's difficulty, including body temperature and thirst.
© 2024 Glitchfiend. All rights reserved.
================================================
FILE: build.gradle
================================================
buildscript {
repositories {
gradlePluginPortal()
maven {
name = "Forge"
url = "https://maven.minecraftforge.net"
}
}
dependencies {
classpath 'com.modrinth.minotaur:Minotaur:2.+'
classpath 'gradle.plugin.org.jetbrains.gradle.plugin.idea-ext:gradle-idea-ext:1.1.7' // Required for NeoGradle
classpath 'net.minecraftforge:gradleutils:2.2.0' // Required for changelog generation
}
}
apply plugin: 'org.jetbrains.gradle.plugin.idea-ext'
apply plugin: 'net.minecraftforge.gradleutils'
changelog {
fromTag '9.2.0'
}
ext {
mod_version = gradleutils.getTagOffsetVersion()
changelog_file = rootProject.file("build/changelog.txt")
trimChangelog = (String text) -> {
def m = text =~ /(?s) - (?:[0-9.]+) (.+?)(?=( - )|$)/
return '```\n' + m[0][1].replaceAll(/(?m)^ */, '')
}
}
allprojects {
// Allow 400 errors.
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xmaxerrs" << "400"
}
}
}
subprojects {
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'maven-publish'
if (!project.name.equals("Common")) {
apply plugin: 'com.modrinth.minotaur'
}
version = "${minecraft_version}-${mod_version}"
java.toolchain.languageVersion = JavaLanguageVersion.of(21)
java.withSourcesJar()
jar {
manifest {
attributes([
'Specification-Title' : mod_name,
'Specification-Vendor' : mod_authors,
'Specification-Version' : mod_version,
'Implementation-Title' : project.name,
'Implementation-Version' : mod_version,
'Implementation-Vendor' : mod_authors,
'Implementation-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"),
'Timestamp' : System.currentTimeMillis(),
'Built-On-Java' : "${System.getProperty('java.vm.version')} (${System.getProperty('java.vm.vendor')})",
'Build-On-Minecraft' : minecraft_version
])
}
}
repositories {
mavenCentral()
maven {
name = 'Sponge / Mixin'
url = 'https://repo.spongepowered.org/repository/maven-public/'
}
maven {
name = 'Forge'
url = "https://maven.minecraftforge.net"
}
}
tasks.withType(JavaCompile).configureEach {
it.options.encoding = 'UTF-8'
it.options.release.set(21)
}
processResources {
var expandProps = [
minecraft_version : minecraft_version,
forge_version : forge_version, forge_version_range: forge_version_range, forge_loader_version_range: forge_loader_version_range,
neoforge_version : neoforge_version, neoforge_version_range: neoforge_version_range, neoforge_loader_version_range: neoforge_loader_version_range,
glitchcore_version : glitchcore_version, serene_seasons_version: serene_seasons_version,
mod_id : mod_id, mod_name: mod_name, mod_display_name: mod_display_name, mod_version: mod_version,
mod_authors : mod_authors, mod_description: mod_description,
mod_issues_url : mod_issues_url, mod_page_url: mod_page_url, mod_git_url: mod_git_url,
mod_discord_url : mod_discord_url,
mod_license : mod_license
]
filesMatching(['pack.mcmeta', 'fabric.mod.json', 'META-INF/mods.toml', 'META-INF/neoforge.mods.toml', "*.mixins.json"]) {
expand expandProps
}
inputs.properties(expandProps)
}
// Disables Gradle's custom module metadata from being published to maven. The
// metadata includes mapped dependencies which are not reasonably consumable by
// other mod developers.
tasks.withType(GenerateModuleMetadata) {
enabled = false
}
afterEvaluate {
// Share Modrinth configuration between loaders
// Unfortunately the CurseForge plugin breaks when doing this
// remapJar does not exist until after initial evaluation
if (!name.equals("Common")) {
modrinth {
token = findProperty('modrinthToken')
projectId = mod_modrinth_id
versionNumber = mod_version
versionName = "${mod_version} for ${name} ${minecraft_version}"
versionType = release_channel
uploadFile = name.equals("Fabric") ? remapJar : jar
gameVersions = [minecraft_version]
loaders = [name.toLowerCase()]
dependencies {
if (name.equals("Fabric")) {
required.project "fabric-api"
}
required.project "glitchcore"
}
if (changelog_file.exists()) {
changelog = trimChangelog(changelog_file.text)
}
}
}
// archivesBaseName is not set until after initial evaluation
publishing {
publications {
mavenJava(MavenPublication) {
artifactId project.archivesBaseName
groupId project.group
version project.version
from components.java
pom {
name = project.archivesBaseName
description = project.mod_description
url = project.mod_git_url
scm {
url = project.mod_git_url
connection = project.mod_scm_url
developerConnection = project.mod_scm_url
}
issueManagement {
system = 'github'
url = project.mod_issues_url
}
licenses {
license {
name = project.mod_license
}
}
developers {
developer {
id = 'adubbz'
name = 'Adubbz'
}
developer {
id = 'forstride'
name = 'Forstride'
}
}
withXml {
NodeList dependencies = asNode().dependencies
NodeList allDeps = dependencies.'*'
// Remove forge deps
allDeps. findAll() { Node el ->
el.artifactId.text() == 'forge' && el.groupId.text() == 'net.minecraftforge'
}.forEach() { Node el ->
el.parent().remove(el)
}
// Remove ForgeGradle's mapped suffix from versions & set as optional so anyone else doesn't inherit them
allDeps. findAll() { Node el ->
el.version.text().contains('_mapped_')
}.each { Node el ->
el.version.each { Node version ->
def versionText = version.text()
version.setValue(versionText.substring(0, versionText.indexOf('_mapped_')))
}
el.appendNode('optional', true)
}
}
}
}
}
repositories {
maven {
url = "https://maven.minecraftforge.net/releases/"
credentials {
username = System.getenv("MAVEN_USER")
password = System.getenv("MAVEN_PASSWORD")
}
}
}
}
}
}
================================================
FILE: common/build.gradle
================================================
plugins {
id 'org.spongepowered.gradle.vanilla' version '0.2.1-SNAPSHOT'
}
base.archivesName.set("${mod_name}-common")
minecraft {
version(minecraft_version)
if (file("src/main/resources/${mod_id}.accesswidener").exists()) {
accessWideners(project.file("src/main/resources/${mod_id}.accesswidener"))
}
}
sourceSets.main.resources.srcDir 'src/generated/resources'
dependencies {
compileOnly group:'org.spongepowered', name: 'mixin', version: '0.8.5'
compileOnly group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.2'
compileOnly("com.electronwill.night-config:toml:${nightconfig_version}")
compileOnly("com.electronwill.night-config:core:${nightconfig_version}")
compileOnly("net.jodah:typetools:0.6.3")
compileOnly 'com.github.glitchfiend:GlitchCore-common:' + minecraft_version + '-' + glitchcore_version
compileOnly 'com.github.glitchfiend:SereneSeasons-common:' + minecraft_version + '-' + serene_seasons_version
}
================================================
FILE: common/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924
================================================
// 1.21.11 2025-12-14T21:33:41.3484912 Registries
55b6780cec82f4d4f609e750902d114649d4a8ad data/toughasnails/damage_type/hyperthermia.json
eae6d7bc6de6b808206268351a4eb97746f013bf data/toughasnails/damage_type/thirst.json
0b83414be2d208b5f29e5575e1b11fe45ee59319 data/toughasnails/enchantment/thermal_tuning.json
776078f24c4c010fd0186baa0a3b13d7cef2ac12 data/toughasnails/enchantment/water_cleansing.json
================================================
FILE: common/src/generated/resources/.cache/1edd1aa8a5f5209e40be6ce639ab3fdd92079a0c
================================================
// 1.21.11 2025-12-14T21:33:41.3534926 Tags for minecraft:enchantment mod id vanilla
0ef1512d105fb2b8c0f389b6cc5fffd07ba5c820 data/minecraft/tags/enchantment/on_random_loot.json
0ef1512d105fb2b8c0f389b6cc5fffd07ba5c820 data/minecraft/tags/enchantment/tradeable.json
0ef1512d105fb2b8c0f389b6cc5fffd07ba5c820 data/minecraft/tags/enchantment/treasure.json
================================================
FILE: common/src/generated/resources/.cache/20dae170dba4c8eb919766d5be31700d182da0d9
================================================
// 1.21.11 2025-12-14T21:33:41.3449906 Tags for minecraft:worldgen/biome mod id toughasnails
2b52a1f084a28479a2e448b5ca6be229c52b6aa9 data/toughasnails/tags/worldgen/biome/cold_biomes.json
92158999e9537d3b7c9cd1a65cc1aa65bf673c2d data/toughasnails/tags/worldgen/biome/dirty_water_biomes.json
8548cd9e18e161a303323283cb2c7ab2f2ff2cb0 data/toughasnails/tags/worldgen/biome/hot_biomes.json
775e0f72e6757e7740bc9110927f01e0fc675071 data/toughasnails/tags/worldgen/biome/icy_biomes.json
9128966f06f646c3a8f85e09692e7ce97009d009 data/toughasnails/tags/worldgen/biome/neutral_biomes.json
35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/worldgen/biome/purified_water_biomes.json
92b547e23992c4f327b30052a1b36aab5b36d767 data/toughasnails/tags/worldgen/biome/warm_biomes.json
================================================
FILE: common/src/generated/resources/.cache/237ed1d533e00e9b8d8148d6061ae61b82e960bb
================================================
// 1.21.11 2025-12-14T21:33:41.3419832 Tags for minecraft:trim_material mod id toughasnails
35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/trim_material/cooling_trims.json
35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/trim_material/heating_trims.json
================================================
FILE: common/src/generated/resources/.cache/4ff5308374b2e7729a466dfe56bd6182ead9b2c3
================================================
// 1.21.11 2025-12-14T21:33:41.3524921 Tags for minecraft:point_of_interest_type mod id toughasnails
7ccb22b62459a1c793d38a6fafc772b5d19837e0 data/minecraft/tags/point_of_interest_type/acquirable_job_site.json
================================================
FILE: common/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d
================================================
// 1.21.11 2025-12-14T21:33:41.3479918 Loot Tables
8fca2e50f9df3893ec7ecb84fb15e5f83b33508a data/toughasnails/loot_table/blocks/rain_collector.json
5b982875ef4148c8acb507e82e690b7ffd814749 data/toughasnails/loot_table/blocks/temperature_gauge.json
3014cc41e7b43922f50ec3eb6c2eb83fbf3201d2 data/toughasnails/loot_table/blocks/thermoregulator.json
1410cb58946442b13107a7153298bdcdc8ccaacc data/toughasnails/loot_table/blocks/water_purifier.json
================================================
FILE: common/src/generated/resources/.cache/77038cb024c5999ce280bcb6800e72cf1c655fe7
================================================
// 1.21.11 2025-12-28T21:06:11.1499569 Model Definitions
a46a7ed55fa00f2a5e8e739fed5ceb555c7c8502 assets/toughasnails/items/apple_juice.json
c591889fd14596775b2f5d363c1417e6dbbddf2a assets/toughasnails/items/cactus_juice.json
8d13e160ccdd855380e2758d9a511f4727663ed1 assets/toughasnails/items/charc_os.json
84955afd1ea6b6f48c025abba670b53e52223060 assets/toughasnails/items/chorus_fruit_juice.json
2713827de5b432976b69b3cd358233687f3e14aa assets/toughasnails/items/copper_dirty_water_canteen.json
874d400e8449c5fba00d6e16796a830c867bda9b assets/toughasnails/items/copper_purified_water_canteen.json
4a2aef09261145a699342a6094bbd7dbaf08fb93 assets/toughasnails/items/copper_water_canteen.json
54a470976016ff0539c943d2096f2382be41936c assets/toughasnails/items/diamond_dirty_water_canteen.json
8b83f236433628746586751edd0ae607eb32d791 assets/toughasnails/items/diamond_purified_water_canteen.json
c333133047921cac899a9fcd0834945659749614 assets/toughasnails/items/diamond_water_canteen.json
73d47530a0d37f0789b4a865364e21245f1c94cb assets/toughasnails/items/dirty_water_bottle.json
a9f1890a5115d346e99f62e861c7ede940e54fb0 assets/toughasnails/items/empty_copper_canteen.json
e169a03f53a1496b79b06da7df487720ed8759ea assets/toughasnails/items/empty_diamond_canteen.json
3ad34e22529cf475a2f87e5753d136bc92b8ca70 assets/toughasnails/items/empty_gold_canteen.json
c394973b72ff60388de38c34182362c534d36bd6 assets/toughasnails/items/empty_iron_canteen.json
85edb0a4bb82b3bd6ad730ba1fbcbbbcf6db56a9 assets/toughasnails/items/empty_leather_canteen.json
416d63c13bf7bcd673120ca1a1ac71314b268d1d assets/toughasnails/items/empty_netherite_canteen.json
789027711fe954b1d6ebaa6477ba484c73d1dc97 assets/toughasnails/items/glow_berry_juice.json
4e53af0490601d02e19b636a3c694c2b98dbe317 assets/toughasnails/items/gold_dirty_water_canteen.json
bfabd47c2329716e02db1936ab81a61f809218e2 assets/toughasnails/items/gold_purified_water_canteen.json
365fce211285945360ee966d257ce210af3b2bf6 assets/toughasnails/items/gold_water_canteen.json
df126ef457d525c87a5a6d8c365deff420a07463 assets/toughasnails/items/ice_cream.json
ca2449c2b116ebecf70f32faeb2f9f866831a97e assets/toughasnails/items/iron_dirty_water_canteen.json
80c210194ebf33db20c3df4858ed883d59cd028b assets/toughasnails/items/iron_purified_water_canteen.json
09407f691faa92ff02285e563ca1b643c1382b4e assets/toughasnails/items/iron_water_canteen.json
304856f0fef764aa6e00ef0be3cee7b60467bf55 assets/toughasnails/items/leaf_boots.json
a20a8c97813fd4c11ba7ce0163f12c65115aba88 assets/toughasnails/items/leaf_chestplate.json
c6c397ce69818106e2ffd53cfab511d732f3f3f8 assets/toughasnails/items/leaf_helmet.json
e3c02088c70737e0581a68cb08700c2ca9f1ccfa assets/toughasnails/items/leaf_leggings.json
4777163e047e6d9bedd3d432302e0ddac13ef1a7 assets/toughasnails/items/leather_dirty_water_canteen.json
97fdbc2ade0feac8b34de3f1a4c11298e3b482c5 assets/toughasnails/items/leather_purified_water_canteen.json
c3a1ceb48d2519bbe384999c4d8ae110a2745c6d assets/toughasnails/items/leather_water_canteen.json
af39586b7b8cde34445b4228e60ac1f93cd614f5 assets/toughasnails/items/melon_juice.json
fb1454eaf50592a87f7d80aa308252d13045149e assets/toughasnails/items/netherite_dirty_water_canteen.json
1e571d8d117827974a82cf33433e85e92f9e2dbf assets/toughasnails/items/netherite_purified_water_canteen.json
0098213afce11f42384f7f6be6166ec8785aec70 assets/toughasnails/items/netherite_water_canteen.json
743d52b9771291c5cab2360c793c504ad0d685f2 assets/toughasnails/items/pumpkin_juice.json
ca4bbef609fcac533228c6fb7cbec3ebb16f2832 assets/toughasnails/items/purified_water_bottle.json
57d254270b20dbbcba6fed8e6dd042182cc4121f assets/toughasnails/items/rain_collector.json
24a62f4383a28cd81b355ede24124f96f0a495fb assets/toughasnails/items/sweet_berry_juice.json
83604432a420cf2b813bfb1e41dd90257d1c2cf1 assets/toughasnails/items/tan_icon.json
748ab730c9622fef6624caa632939b6787e87321 assets/toughasnails/items/temperature_gauge.json
0bec0e66c111212fb2674c9ec7be38d0099f615b assets/toughasnails/items/thermometer.json
173f3c94c0ce5e45d6390bfe3b5e272d5161df81 assets/toughasnails/items/thermoregulator.json
dc76830866633f9afa704ec99fb65ba3c804d3e4 assets/toughasnails/items/water_purifier.json
99a5b5f52946e054be85477e9aa6a28c1d598991 assets/toughasnails/items/wool_boots.json
9bac72f2d86a0766bd571c20a27dba85f86f9870 assets/toughasnails/items/wool_chestplate.json
52f118bacf86016d30fab23fd88c48c3de1c3032 assets/toughasnails/items/wool_helmet.json
d3edd21cbe8d3bc6186269ffaa4132ad1b8d5cc9 assets/toughasnails/items/wool_leggings.json
fbb3928956c38cd4f6dfaaf5092047123f8c76ff assets/toughasnails/models/item/apple_juice.json
aac7597ce5ef5a4367bbcf0830bdf1d7d7573299 assets/toughasnails/models/item/cactus_juice.json
a6231c29ef436d8c7bd574d5a51b3d306d1f0d68 assets/toughasnails/models/item/charc_os.json
772a9bd1b7c39e6957fea6c02c8cf8aff24ed87e assets/toughasnails/models/item/chorus_fruit_juice.json
da651f690598888fa5c4dec9861844ba87731a0c assets/toughasnails/models/item/copper_dirty_water_canteen.json
ba24df3f5de607e9417343e9bbe4ce5b3a9d5bd8 assets/toughasnails/models/item/copper_purified_water_canteen.json
d1d7215bd676f8267e10559ef1a62153fdfc77c8 assets/toughasnails/models/item/copper_water_canteen.json
4c397fc95b7424b35c08c8a88d495b92fbe40bbb assets/toughasnails/models/item/diamond_dirty_water_canteen.json
0f803ad10c5c413c5f68e0be556011064b36cd22 assets/toughasnails/models/item/diamond_purified_water_canteen.json
de912d9d0ac5127a236a2905b5670397a50beb1b assets/toughasnails/models/item/diamond_water_canteen.json
cfd0134395f237e4ddcfeb4011778f2cc3974b5d assets/toughasnails/models/item/dirty_water_bottle.json
d02f8c4cf872aa0a3f6324569d24029eb121f5e9 assets/toughasnails/models/item/empty_copper_canteen.json
2b9d74b0141910fd8a5fe559589f5dfbbff1b50e assets/toughasnails/models/item/empty_diamond_canteen.json
a368bb2246c60e7ee24050262f1037ff48c15955 assets/toughasnails/models/item/empty_gold_canteen.json
622d385b35248843b51514cf802b47b11612cd56 assets/toughasnails/models/item/empty_iron_canteen.json
ed2d3569d7c3f6e75e6d65512a1758407b87e0e1 assets/toughasnails/models/item/empty_leather_canteen.json
19321f614a82577909e3493d661643c605ea7a64 assets/toughasnails/models/item/empty_netherite_canteen.json
fff3625b65a04e925e5a9865a75ead3a4e2e2fa0 assets/toughasnails/models/item/glow_berry_juice.json
1d916fa543d103bf60d801abdccfd7160e1de580 assets/toughasnails/models/item/gold_dirty_water_canteen.json
c377c2c570d0495860676846356313e936b07756 assets/toughasnails/models/item/gold_purified_water_canteen.json
b0d8c49c046ebeca6d152ff24447492768350dba assets/toughasnails/models/item/gold_water_canteen.json
25bf02c23652396ecf977e2591c0f1a2c2817ff9 assets/toughasnails/models/item/ice_cream.json
017e043f1ebf570f435f69a422bc4290e0e5c775 assets/toughasnails/models/item/iron_dirty_water_canteen.json
721f73aebf8120e01e48460bb2ccf1be5075ac74 assets/toughasnails/models/item/iron_purified_water_canteen.json
b00f98e717644b19aaf4539bca340a4d8022dedb assets/toughasnails/models/item/iron_water_canteen.json
a6ec6a0e5205ffd5e5de4010b353822eaac2370e assets/toughasnails/models/item/leaf_boots.json
ad8f22de0b62eeda1deabc1069cd80944ef8455b assets/toughasnails/models/item/leaf_boots_amethyst_trim.json
348a4ee8a5bde6da1cd071773cfa4c6ffa45dceb assets/toughasnails/models/item/leaf_boots_copper_trim.json
39fca9edaf3c47fad93dd2772eb2c195324d399c assets/toughasnails/models/item/leaf_boots_diamond_trim.json
334bb38c15a6c14ca7183e1c995e24a2cbc4fba9 assets/toughasnails/models/item/leaf_boots_emerald_trim.json
9f4b16775ef245a2d834a4208f2bb38e034cc5fa assets/toughasnails/models/item/leaf_boots_gold_trim.json
f37d0673e820c65b4c277d04cf033767f2cb33a6 assets/toughasnails/models/item/leaf_boots_iron_trim.json
c1268e927f0089bcecf65ec3d9f94ab4449fe158 assets/toughasnails/models/item/leaf_boots_lapis_trim.json
3f01a4d0bfd054727e628cf6fc974444fd9c4b14 assets/toughasnails/models/item/leaf_boots_netherite_trim.json
4318dd4eff0ae258d5f3797ee3b10f853755eba5 assets/toughasnails/models/item/leaf_boots_quartz_trim.json
316417000cd96df6db6cd780e0a98de660ed8068 assets/toughasnails/models/item/leaf_boots_redstone_trim.json
1151488035fdfbca30334c84af476f791a66cc16 assets/toughasnails/models/item/leaf_boots_resin_trim.json
f31d13df0441fa68f035b5e44f5acb52ec12cc43 assets/toughasnails/models/item/leaf_chestplate.json
8d850c71367a8fa6c46276d445c526ae2675545e assets/toughasnails/models/item/leaf_chestplate_amethyst_trim.json
5172ce521cc7c732c66e1c21fbf2a3cd9c1039cc assets/toughasnails/models/item/leaf_chestplate_copper_trim.json
e23474ac60b809a0f6b78f4d93e337dea51b4d8c assets/toughasnails/models/item/leaf_chestplate_diamond_trim.json
d1ce5e4d0bbd6599012235bd2b385cea29503c39 assets/toughasnails/models/item/leaf_chestplate_emerald_trim.json
ddf3b752b86b7a4b560394bdbdbc874d7e57dfb5 assets/toughasnails/models/item/leaf_chestplate_gold_trim.json
8b3bc12bc45f7d2d0ad167290052b16688ab003d assets/toughasnails/models/item/leaf_chestplate_iron_trim.json
b4b2db65b491dfaa7740a5c702db58141d1f2cbc assets/toughasnails/models/item/leaf_chestplate_lapis_trim.json
fe99a23c3754618afd2e7671940887b68f0d7ba3 assets/toughasnails/models/item/leaf_chestplate_netherite_trim.json
8a217d89061fc2a46ec1e34584f6fc530f018495 assets/toughasnails/models/item/leaf_chestplate_quartz_trim.json
b68cc189af5de8df65632a3b8498afdb9033a317 assets/toughasnails/models/item/leaf_chestplate_redstone_trim.json
3abfecdda82b6d6e02c5aa71f1fac93f6e88f1d5 assets/toughasnails/models/item/leaf_chestplate_resin_trim.json
260a753ef2397cbfcfe2be687e9d3d9531b67b83 assets/toughasnails/models/item/leaf_helmet.json
29a2194b01e73fe20c7d3f40a74ceb10cb02b896 assets/toughasnails/models/item/leaf_helmet_amethyst_trim.json
2d821aed3149962ce3212a29f47e6989f9db49d7 assets/toughasnails/models/item/leaf_helmet_copper_trim.json
682817ea56cb9be67b28b8a9fccd701fe8a6e19d assets/toughasnails/models/item/leaf_helmet_diamond_trim.json
2989f8b286781717b929d47b11f1441545cfe3b4 assets/toughasnails/models/item/leaf_helmet_emerald_trim.json
fac76a804a963c476c20889f3ec6e408257c51b2 assets/toughasnails/models/item/leaf_helmet_gold_trim.json
147c8aa6b36c8e11d47fb755bc87683467439179 assets/toughasnails/models/item/leaf_helmet_iron_trim.json
ad0d1f8eb1da3718a34b66765e876285e4643b70 assets/toughasnails/models/item/leaf_helmet_lapis_trim.json
917e9f9267a7843678f62244d7bebc391464932f assets/toughasnails/models/item/leaf_helmet_netherite_trim.json
793b1fba3c6a0f386660ad7647d348cb32f6eb84 assets/toughasnails/models/item/leaf_helmet_quartz_trim.json
5fb18c32856c2344802e2d35f56ec059fb466ba1 assets/toughasnails/models/item/leaf_helmet_redstone_trim.json
5cbc37182f2ad76d7bc5ddbb614273b96d97dd84 assets/toughasnails/models/item/leaf_helmet_resin_trim.json
db5518ccec85c37db8b2c97d1713d1b9a28e0b4c assets/toughasnails/models/item/leaf_leggings.json
0f56b3f25ce691129af0cc428ae302568edd97ad assets/toughasnails/models/item/leaf_leggings_amethyst_trim.json
186d7599f1fc27e89fe14241cf29bc9ea33fccaa assets/toughasnails/models/item/leaf_leggings_copper_trim.json
29129d5b2781d88855f89389e73f1ce97d3aa0be assets/toughasnails/models/item/leaf_leggings_diamond_trim.json
0fe1f198a135e3dcb9e624677cf8bb0f71f543eb assets/toughasnails/models/item/leaf_leggings_emerald_trim.json
5875fc49ae3a988f99c258fcf4e01ddb2e3a13a8 assets/toughasnails/models/item/leaf_leggings_gold_trim.json
76c4ae533c9a420cf61ef9e7d2d385cf00b8d6a5 assets/toughasnails/models/item/leaf_leggings_iron_trim.json
8074ffe9509c4592cb3080cd40ed3f8ab5a6fde8 assets/toughasnails/models/item/leaf_leggings_lapis_trim.json
7624eca624835ea89ce37a30277cb0457a0e6944 assets/toughasnails/models/item/leaf_leggings_netherite_trim.json
ff42c39f4d2602a397610f2ec87d64d3b7739741 assets/toughasnails/models/item/leaf_leggings_quartz_trim.json
a86d317549a09cd4a906a896da1d1f8da0ba6db3 assets/toughasnails/models/item/leaf_leggings_redstone_trim.json
bcce3e10337d82938288a099788a0b6770540674 assets/toughasnails/models/item/leaf_leggings_resin_trim.json
0dfe5962b380ecf81c76a32c003fc40d2d558394 assets/toughasnails/models/item/leather_dirty_water_canteen.json
3cc2430a4925db4b0b8be8aafb39a9d28112f253 assets/toughasnails/models/item/leather_purified_water_canteen.json
41659224602b677c75f404edab10bfb67115b9f9 assets/toughasnails/models/item/leather_water_canteen.json
4a326df9cef778cbbe5da99431ae3c3e0973cb88 assets/toughasnails/models/item/melon_juice.json
f687e95afe50c05d5e469a19c8134ade3b3e5574 assets/toughasnails/models/item/netherite_dirty_water_canteen.json
e0379f9024f6a77d4183b249082f8eaef4ff5e60 assets/toughasnails/models/item/netherite_purified_water_canteen.json
6e0abd17fee6bfdd17ff588621e5acd5dfc95bf7 assets/toughasnails/models/item/netherite_water_canteen.json
f38f99fd48ebf8c98d12c47d4974678a20b3739c assets/toughasnails/models/item/pumpkin_juice.json
b2af0a87766e5af5e6eefbf43e7f4248a79ef579 assets/toughasnails/models/item/purified_water_bottle.json
fec75c479c98f911a97f4bddc74ffaddd4f7e7ed assets/toughasnails/models/item/sweet_berry_juice.json
29222617ef6336b350d04425ec94c4ab59ee761e assets/toughasnails/models/item/tan_icon.json
0fbb3edc334b05d5f3657d01ad0444da28d830ec assets/toughasnails/models/item/thermometer_00.json
f90715b0138223634226f703377c9210440ebba4 assets/toughasnails/models/item/thermometer_01.json
440c2d22c0b439446b29607c91a0f59c109a2ac9 assets/toughasnails/models/item/thermometer_02.json
2907ac0ae691401c03c0ca68d12a9957a001acdb assets/toughasnails/models/item/thermometer_03.json
c52014a435b97758257ab34348feb7ff1e84ae40 assets/toughasnails/models/item/thermometer_04.json
95e6ab7ba41753eb89e2b6734b3f65f67a516fea assets/toughasnails/models/item/thermometer_05.json
6f9f7308638335f6d22deed54f58af41d80d57ac assets/toughasnails/models/item/thermometer_06.json
650c231de872dafeefafe2178f68bbf11db28577 assets/toughasnails/models/item/thermometer_07.json
17be302c23083a79a0737442f263d8a90ba9a082 assets/toughasnails/models/item/thermometer_08.json
2f20e8f45b4bbffe275eb3cf833adc221afc27b7 assets/toughasnails/models/item/thermometer_09.json
78599b8e101dce74c1a8b35fa0f329493e0b2500 assets/toughasnails/models/item/thermometer_10.json
dd8bfe31c24513ada71c632b77b9ece6d1c59c1a assets/toughasnails/models/item/thermometer_11.json
aa47031765274df8d84141ce6ee6723a4d0d0152 assets/toughasnails/models/item/thermometer_12.json
717bda823c19584c4d1f0d4e6ad8776d3ca0dada assets/toughasnails/models/item/thermometer_13.json
3e152a20f652e3ae96905168bc5fdb9cc38e4c58 assets/toughasnails/models/item/thermometer_14.json
678f08f1c7738e468f663117f0c3e7ee736c7fe3 assets/toughasnails/models/item/thermometer_15.json
f330be7df4b6985d0c83fd154ad528cc1eeee767 assets/toughasnails/models/item/thermometer_16.json
62e6066b57cdaafc3c70c415cf98e3f9387d2a43 assets/toughasnails/models/item/thermometer_17.json
a90d31153bbc8e7d36dcb024c10e4c0a2b27e7bf assets/toughasnails/models/item/thermometer_18.json
0f27a70b4dddfcf0598b74f6f02b86be202ca464 assets/toughasnails/models/item/thermometer_19.json
e0508d7e82ef472eff6f73f7a8a92a54094cbd41 assets/toughasnails/models/item/thermometer_20.json
40cdbc19e3166a9ce090dd41416f087b71148597 assets/toughasnails/models/item/wool_boots.json
0ae799bf1bec71d090b0a9bbd320e713ade840ff assets/toughasnails/models/item/wool_boots_amethyst_trim.json
f0741eeba8213a03810bf5a87bd6b68c1d3a7dc2 assets/toughasnails/models/item/wool_boots_copper_trim.json
7011ac4d0480e11bfb543ce9db67252093e2d82b assets/toughasnails/models/item/wool_boots_diamond_trim.json
e0783866a99e6765eb9b18c07a56cf20f442ded1 assets/toughasnails/models/item/wool_boots_emerald_trim.json
7c86c39e3d91212722cf94a66fec2b835d422280 assets/toughasnails/models/item/wool_boots_gold_trim.json
face03b7f6b9a53fbcdc802ec75d6f115278ca90 assets/toughasnails/models/item/wool_boots_iron_trim.json
0a0d2c7cc9115e4cb1589ddd25f8b31eafacb452 assets/toughasnails/models/item/wool_boots_lapis_trim.json
23f8908cd78cfba1a0aa5874a8751815f9f7dd64 assets/toughasnails/models/item/wool_boots_netherite_trim.json
288229c5f22ad8a10f6b50812aeb43696b08dad3 assets/toughasnails/models/item/wool_boots_quartz_trim.json
4993a8628fdc2c68ae8ed7e7b76365b44dd7f0a2 assets/toughasnails/models/item/wool_boots_redstone_trim.json
dc900450cae37f2765b57389a14202a8b67d2b2e assets/toughasnails/models/item/wool_boots_resin_trim.json
a724b0810b1132118c88468abff22eb0f817285a assets/toughasnails/models/item/wool_chestplate.json
554e54b0437e75ef5d8a44d3c668ccb959806739 assets/toughasnails/models/item/wool_chestplate_amethyst_trim.json
1b28bdcabf970b3bcc78d128cc32657ad90e567d assets/toughasnails/models/item/wool_chestplate_copper_trim.json
0bfd385ff2cd5b8d9420573fad03715e1846434a assets/toughasnails/models/item/wool_chestplate_diamond_trim.json
172e7f3646db33d87aed40cb05d1c8a9f63b74af assets/toughasnails/models/item/wool_chestplate_emerald_trim.json
6c700e699ac4a913c676360fe03de665f100e062 assets/toughasnails/models/item/wool_chestplate_gold_trim.json
0623f9a2d6168d9a21544298657945823ccf836a assets/toughasnails/models/item/wool_chestplate_iron_trim.json
db827b6f0297b731ba22a088b26ae7ed2eb4e5e4 assets/toughasnails/models/item/wool_chestplate_lapis_trim.json
85345ecf3302637502b1b2d7b60469adb64b05e7 assets/toughasnails/models/item/wool_chestplate_netherite_trim.json
3615b6087f37f9c515ebe65fc0f51ba616be5705 assets/toughasnails/models/item/wool_chestplate_quartz_trim.json
802466fba61809ab725e7885a3594a37c5166e17 assets/toughasnails/models/item/wool_chestplate_redstone_trim.json
eb807ec653cedad522b37a720d8716d85d9bd097 assets/toughasnails/models/item/wool_chestplate_resin_trim.json
07e5d211adecce95e10350d44bcc097485bb5faa assets/toughasnails/models/item/wool_helmet.json
13e3dd842af67fff170942a7d0817d371d6e7327 assets/toughasnails/models/item/wool_helmet_amethyst_trim.json
63d169526543fffd1ef77e1d2fe45358e38e266d assets/toughasnails/models/item/wool_helmet_copper_trim.json
5d4ab99f37bf8c41c5ed120243902f7e3d894d14 assets/toughasnails/models/item/wool_helmet_diamond_trim.json
829e496d0d78cacf2fc4e02a106d90e7b1a91a65 assets/toughasnails/models/item/wool_helmet_emerald_trim.json
8f80d6cd6160d203bbbaf150c75b6ad227e92d24 assets/toughasnails/models/item/wool_helmet_gold_trim.json
8e3ecfa0a793f3d76a5d7c26d5ac6459af8c0400 assets/toughasnails/models/item/wool_helmet_iron_trim.json
f93903d5536ba686c276035a281dcfd3709569a4 assets/toughasnails/models/item/wool_helmet_lapis_trim.json
806d81ba18de15120438b4bbeccf8e102b0b0708 assets/toughasnails/models/item/wool_helmet_netherite_trim.json
b710a8c6d3738520e40e119abaea30f0712b8559 assets/toughasnails/models/item/wool_helmet_quartz_trim.json
fc12ec2f31552b7d6fbad169bb0092b8f6e075c6 assets/toughasnails/models/item/wool_helmet_redstone_trim.json
2bf4d3744d9c37fab301c531b2069e9b0610d567 assets/toughasnails/models/item/wool_helmet_resin_trim.json
32090a0205fe2301c369b7ce97bac6e4e50eae81 assets/toughasnails/models/item/wool_leggings.json
8382d868b6c6ec556c3e5f31d48a0c1a5be2fbe5 assets/toughasnails/models/item/wool_leggings_amethyst_trim.json
8d999351fc0b9558795f26c5203037f274e53a56 assets/toughasnails/models/item/wool_leggings_copper_trim.json
cbfc0b586c9fea54d4b6dc65aa90ecf914ee3236 assets/toughasnails/models/item/wool_leggings_diamond_trim.json
ba67a7202fb4b4552d46295faba4f861eb4ee41a assets/toughasnails/models/item/wool_leggings_emerald_trim.json
d6f44cabad027e1cee881d44f6aa1c3db88ae74f assets/toughasnails/models/item/wool_leggings_gold_trim.json
04920743e4c5b2ecdbb4e64ba10622c28f2b53ea assets/toughasnails/models/item/wool_leggings_iron_trim.json
76af0d4749e8f592a1fc3b6c0f11dd6f704d468d assets/toughasnails/models/item/wool_leggings_lapis_trim.json
060a61be7409a2170bcfd8f17c7827da0f9d3efa assets/toughasnails/models/item/wool_leggings_netherite_trim.json
2f93d4eeac9582b4ad80d58efd82651537c79b66 assets/toughasnails/models/item/wool_leggings_quartz_trim.json
277de1982c3349ef9a7324baac887a971615b413 assets/toughasnails/models/item/wool_leggings_redstone_trim.json
63d815886a81ffbbdfb731c6fafaf04d1eddb140 assets/toughasnails/models/item/wool_leggings_resin_trim.json
================================================
FILE: common/src/generated/resources/.cache/9dc2e1bbb6dbc88d629e62ed955e4c156b6652a3
================================================
// 1.21.11 2025-12-14T21:33:41.3519919 Tags for minecraft:item mod id toughasnails
54fbb602df8fe763300ee759cb3a9fbb72ded2eb data/minecraft/tags/item/dyeable.json
f05342856fe99891fa5e94bbe8db82a4f75ac41e data/toughasnails/tags/item/cooling_armor.json
572f6d0748095755aeef0ca7d602f4ebba9bfd76 data/toughasnails/tags/item/cooling_consumed_items.json
7c304628a9c17ca3ba6cd13e199fcf73ad9c974f data/toughasnails/tags/item/cooling_held_items.json
d7e37bc0c1468593bf2403c8bab7e97c17edde8e data/toughasnails/tags/item/drinks.json
2128c434dd823a25c4cb1370f7d09fdbff2e89d8 data/toughasnails/tags/item/enchantable/canteen.json
eb101cb126ebd917a2c240ff53e1e6e16ba3bf83 data/toughasnails/tags/item/heating_armor.json
cf863878a8af4a7e610b91efb2c1d7846d13868b data/toughasnails/tags/item/heating_consumed_items.json
efe9e0caf089100a228c46379f3aa70d7f602ddc data/toughasnails/tags/item/heating_held_items.json
d7b753d45aecdc84f69d294a00dc5271088c2abc data/toughasnails/tags/item/hydration/100_hydration_drinks.json
01720430f7a548fffd9ef59e9e7037fff02e6da3 data/toughasnails/tags/item/hydration/10_hydration_drinks.json
6ca6b5a2b8cffea21f6112afc30cc32fa4a4e2d7 data/toughasnails/tags/item/hydration/20_hydration_drinks.json
edb5947f84984a39ab47c98c6fb0b3c3a9a8cc39 data/toughasnails/tags/item/hydration/30_hydration_drinks.json
f87a1c4dc42b16f1628cfca591895d987e5dc6ca data/toughasnails/tags/item/hydration/40_hydration_drinks.json
4f7422a225cdc6c2f193883f99997942060a44fb data/toughasnails/tags/item/hydration/50_hydration_drinks.json
ce37a9edf9fd513131ff36c4478e629a45057d38 data/toughasnails/tags/item/hydration/60_hydration_drinks.json
a8d4693f32c2dabe2f0ff10cb6ccae93882c8530 data/toughasnails/tags/item/hydration/70_hydration_drinks.json
7fd9471261d08e940601fdecd379217eb90622d1 data/toughasnails/tags/item/hydration/80_hydration_drinks.json
35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/hydration/90_hydration_drinks.json
e29ce056acb765bed57cb10188a195741ad86407 data/toughasnails/tags/item/poison_chance/100_poison_chance_drinks.json
f87a1c4dc42b16f1628cfca591895d987e5dc6ca data/toughasnails/tags/item/poison_chance/25_poison_chance_drinks.json
35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/poison_chance/50_poison_chance_drinks.json
cc0aa3bf437ed849deda4e4b64aff3665160dae6 data/toughasnails/tags/item/poison_chance/75_poison_chance_drinks.json
60d949cfbd83ede5b827cfb937e7a541da50825a data/toughasnails/tags/item/thermoregulator_cooling_fuel.json
4eba53176c4c88b96590e24041f1fe66e24a4d6e data/toughasnails/tags/item/thermoregulator_heating_fuel.json
0395ed7d6e3d7510a25d2f4ef8b498b0d8c6c9eb data/toughasnails/tags/item/thirst/10_thirst_drinks.json
35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/thirst/11_thirst_drinks.json
35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/thirst/12_thirst_drinks.json
35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/thirst/13_thirst_drinks.json
35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/thirst/14_thirst_drinks.json
35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/thirst/15_thirst_drinks.json
35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/thirst/16_thirst_drinks.json
35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/thirst/17_thirst_drinks.json
35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/thirst/18_thirst_drinks.json
35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/thirst/19_thirst_drinks.json
01720430f7a548fffd9ef59e9e7037fff02e6da3 data/toughasnails/tags/item/thirst/1_thirst_drinks.json
35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/thirst/20_thirst_drinks.json
edb5947f84984a39ab47c98c6fb0b3c3a9a8cc39 data/toughasnails/tags/item/thirst/2_thirst_drinks.json
f87a1c4dc42b16f1628cfca591895d987e5dc6ca data/toughasnails/tags/item/thirst/3_thirst_drinks.json
35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/thirst/4_thirst_drinks.json
7fd9471261d08e940601fdecd379217eb90622d1 data/toughasnails/tags/item/thirst/5_thirst_drinks.json
24b02d22d0e3e4abbeed0c96fc20b8dc05dc5f6e data/toughasnails/tags/item/thirst/6_thirst_drinks.json
a90844d1583073e1a3538fe5afe6e279aa3073b8 data/toughasnails/tags/item/thirst/7_thirst_drinks.json
a8d4693f32c2dabe2f0ff10cb6ccae93882c8530 data/toughasnails/tags/item/thirst/8_thirst_drinks.json
35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/toughasnails/tags/item/thirst/9_thirst_drinks.json
================================================
FILE: common/src/generated/resources/.cache/d288570b70137f55051bdf585fe1fd764998d579
================================================
// 1.21.11 2025-12-14T21:33:41.3499917 TAN Recipes
538aa9aa354f6743d9832c0ec7a8642b70f515f2 data/toughasnails/advancement/recipes/combat/leaf_boots.json
2cb6e078f817b17b47c66d6ca824b44751c06ecd data/toughasnails/advancement/recipes/combat/leaf_chestplate.json
4a11700a18931f1f67270bef246e6b57d1cf5a5b data/toughasnails/advancement/recipes/combat/leaf_helmet.json
92732ab3d75844d388eea763c654120903b2df4e data/toughasnails/advancement/recipes/combat/leaf_leggings.json
c6798fc2c097b87d061820015eef0c14aaaaf1c3 data/toughasnails/advancement/recipes/combat/wool_boots.json
b735e388f317f827951e1fcd71f7d7076d846019 data/toughasnails/advancement/recipes/combat/wool_chestplate.json
5678da96edd184f098392efb1d8aa82740551b18 data/toughasnails/advancement/recipes/combat/wool_helmet.json
584e5f5d4d842b1b059a566fb58dd5643ec6a6b8 data/toughasnails/advancement/recipes/combat/wool_leggings.json
898c7abddb9f6e89481a42f140367c9cf5e6ea4a data/toughasnails/advancement/recipes/decorations/rain_collector.json
20a1c603ca73d6fb93e294c4620bb1f002208d2a data/toughasnails/advancement/recipes/decorations/thermoregulator.json
441400bda4d19c989e62a7fbf1b3bb5bd43064a9 data/toughasnails/advancement/recipes/decorations/water_purifier.json
ec99cbc4bc7d858443bbfa259626570a34d515e5 data/toughasnails/advancement/recipes/food/apple_juice.json
2b251232b3322008c7bc03741646d58e54c3ce67 data/toughasnails/advancement/recipes/food/cactus_juice.json
2ceff39e198a3570692b3f953b4d994042643d78 data/toughasnails/advancement/recipes/food/charc_os.json
20d67b977fc7ce355c862cc5c1f6434cb2249226 data/toughasnails/advancement/recipes/food/chorus_fruit_juice.json
a386c8045141bcae0b7ccdeaff8c687cf1e12f52 data/toughasnails/advancement/recipes/food/glow_berry_juice.json
fd44b7c77b809c029e4195348910c74f641b20f6 data/toughasnails/advancement/recipes/food/ice_cream.json
43ed15141145d7471daea21cb4227b401502d948 data/toughasnails/advancement/recipes/food/melon_juice.json
dc4821d6d28c6f0625dce5384be24487789a37f3 data/toughasnails/advancement/recipes/food/pumpkin_juice.json
2801d661cf1f6531a5e3a3268ac4b31699b43b2d data/toughasnails/advancement/recipes/food/sweet_berry_juice.json
0c7c1277d2b67363ae24c7899b12d98f6acf6490 data/toughasnails/advancement/recipes/redstone/temperature_gauge.json
4d97de66b3303ab60f18c2d8c5662021130d8099 data/toughasnails/advancement/recipes/tools/empty_copper_canteen.json
4bd9339ef899c3d4c422f7ca077ff0e527a524b7 data/toughasnails/advancement/recipes/tools/empty_diamond_canteen.json
8a21f07c3a0d6daa40362b6873c2b95c34dd10cd data/toughasnails/advancement/recipes/tools/empty_gold_canteen.json
b7cae73d49989fb2ca8a9b5d5967d2a673230968 data/toughasnails/advancement/recipes/tools/empty_iron_canteen.json
02f22c09e9d0862258897ad74a03f89cb0a7ea48 data/toughasnails/advancement/recipes/tools/empty_leather_canteen.json
f1cc178cdd820a87e997cc32feab7c35dcef76b8 data/toughasnails/advancement/recipes/tools/empty_netherite_canteen_smithing.json
0e1fe6941ec0892c378d8c49a9760c4fa1a12863 data/toughasnails/advancement/recipes/tools/netherite_dirty_water_canteen_smithing.json
2e24e29003f3c7c1640a560a6e592cfba4d4e0f6 data/toughasnails/advancement/recipes/tools/netherite_purified_water_canteen_smithing.json
f52d954a9a4287b320ce5a2bb6434e4513b22691 data/toughasnails/advancement/recipes/tools/netherite_water_canteen_smithing.json
72085fcf1772fab81d8dc3723424bdc1c5c6dd00 data/toughasnails/advancement/recipes/tools/thermometer.json
7ae9cd24767c9e22920fc6742750639e7c25d563 data/toughasnails/recipe/apple_juice.json
0fa25520aa35419fcb34fe1086bda3f445302c77 data/toughasnails/recipe/cactus_juice.json
47fd12f6eb3a0024c6de07d278e3b681718cd023 data/toughasnails/recipe/charc_os.json
0504fefb53205c273ca75f2682178277eef01d4d data/toughasnails/recipe/chorus_fruit_juice.json
ccd406e9a079e1e84d06314aac77085f1f5fa342 data/toughasnails/recipe/copper_purified_water_canteen.json
65c58665c421c80ac28018938d0567c7b1ee9ba6 data/toughasnails/recipe/copper_water_canteen.json
c25c5e89aa3a8074615615176ba3f1b217ca2faa data/toughasnails/recipe/diamond_purified_water_canteen.json
ec714b56d629a6546550cedb66650e949e51fcc4 data/toughasnails/recipe/diamond_water_canteen.json
d0691c802fd374aeb7ad983887c325fdac834b2e data/toughasnails/recipe/empty_copper_canteen.json
b6ff10adedcd98934cca27cc29ebb6c67e432081 data/toughasnails/recipe/empty_diamond_canteen.json
f112bb27cf9a5626319c8145da5813e0d7ff0b70 data/toughasnails/recipe/empty_gold_canteen.json
64e691d70fc9c358f36f1e6a5b0fd638e40e1f13 data/toughasnails/recipe/empty_iron_canteen.json
38e534d8e98abc149852dba77b5cae519c568f09 data/toughasnails/recipe/empty_leather_canteen.json
4f27f9e4cf54d20b07a441e8996856bedfaee01a data/toughasnails/recipe/empty_netherite_canteen_smithing.json
8c11dc93bc9a23c5a9e18ee64e3f620d8136ac48 data/toughasnails/recipe/glow_berry_juice.json
69be74e00404672ee28fd5c87655a27244c5062f data/toughasnails/recipe/gold_purified_water_canteen.json
dc05d85c895b0e41c1fbd20e85a0107b216b97a6 data/toughasnails/recipe/gold_water_canteen.json
87310eadcb834b2a6c6ff27b758d28ca58eea4c1 data/toughasnails/recipe/ice_cream.json
7afd5591286be697309a4bb85a7beead2ae8362a data/toughasnails/recipe/iron_purified_water_canteen.json
d71f13ff24d6b8c5967ccfb00e77e177ce3fc3d2 data/toughasnails/recipe/iron_water_canteen.json
51b498d973655d79b9a4197a82833742453bfcf7 data/toughasnails/recipe/leaf_boots.json
e872838768cacd34384bec36ddf0c761c2e8a9a4 data/toughasnails/recipe/leaf_chestplate.json
b134446bb20b1dddbf701e2b9cca48416ce4e45d data/toughasnails/recipe/leaf_helmet.json
eb0481ca4e00397c5e72125a7b59555042934ce4 data/toughasnails/recipe/leaf_leggings.json
5e0ccfb780bbe271863f1feff90d20553dcefba4 data/toughasnails/recipe/leather_purified_water_canteen.json
3c87d0c96c709a0dcf7954c2f7b831678afeb8b0 data/toughasnails/recipe/leather_water_canteen.json
fe315b7c2ac5b588859583fcffd92fe5a16e907e data/toughasnails/recipe/melon_juice.json
53371ba20c7a0040a9d50cc72df261c940878d82 data/toughasnails/recipe/netherite_dirty_water_canteen_smithing.json
908a02215fb93a13be152f3f09ce105ff7b12fde data/toughasnails/recipe/netherite_purified_water_canteen.json
678b238401a961d8ac969cae9785c2a07b513953 data/toughasnails/recipe/netherite_purified_water_canteen_smithing.json
8b8ee7a534d61dbc1060dafdc4a244987d6de619 data/toughasnails/recipe/netherite_water_canteen.json
b6a097d7daee3fdc5ed543a12d7ced1691d22a0f data/toughasnails/recipe/netherite_water_canteen_smithing.json
ceedf2e2958333f02b577fb673e60e3a605113a5 data/toughasnails/recipe/potion.json
c25f8ea63deddea28304843d9fa4bf9d2a656234 data/toughasnails/recipe/pumpkin_juice.json
c85c37688386d19ebb8a03dab0281fe4bead3bca data/toughasnails/recipe/purified_water_bottle.json
dc11330068388d2a26806f4c46e7704a1e1e44b5 data/toughasnails/recipe/rain_collector.json
c578b91c32ec0e4763cfeed650f99caf7eac88df data/toughasnails/recipe/sweet_berry_juice.json
c329bb907035607d58dc77f74aa6d057b66bf502 data/toughasnails/recipe/temperature_gauge.json
c398e5e91633b705be2b5354c3e605ccabab1db9 data/toughasnails/recipe/thermometer.json
596bfedee294eb93394a02bb0c2977d49ff7d165 data/toughasnails/recipe/thermoregulator.json
bbcd1dfd1c65f9f8fba02280f16d924ea6176da3 data/toughasnails/recipe/water_purifier.json
684a130792523667b2a939c49ec57ed43c7ce0e2 data/toughasnails/recipe/wool_boots.json
882f4f333255d6000be1d018d01356349754e2fa data/toughasnails/recipe/wool_chestplate.json
82840cdcfe0739f279dd98df7a5954c05f6c9ca6 data/toughasnails/recipe/wool_helmet.json
c1b29b1bdcd08fb700f78bfe64c88aa20072bec3 data/toughasnails/recipe/wool_leggings.json
================================================
FILE: common/src/generated/resources/.cache/d5932a16d3f0544ba1e8cda3b77d0d46f353493b
================================================
// 1.21.11 2025-12-14T21:33:41.3494913 Tags for minecraft:damage_type mod id toughasnails
114a24c8e8dfc4dca5477ef3ceb9cdce6f35c49d data/minecraft/tags/damage_type/bypasses_armor.json
7bc5233723c7bfc14215cd1f26c7fd14f2da6c81 data/minecraft/tags/damage_type/bypasses_effects.json
================================================
FILE: common/src/generated/resources/.cache/d6a68f98580d9908a43dbfe9cc754bc0c1ac14b0
================================================
// 1.21.11 2025-12-14T21:33:41.3439903 Tags for minecraft:block mod id toughasnails
bffb0fdf09ac6cfbed64666a723e8a78cb784bbd data/minecraft/tags/block/mineable/axe.json
0342cd45a4d6f790afda91090de45871d9b0ef63 data/minecraft/tags/block/mineable/pickaxe.json
eed9ca8217c04724f67008aba1a0a5edde5697c2 data/toughasnails/tags/block/cooling_blocks.json
658fab0118eb1ac9896e1b9ab89f2d5ed055a967 data/toughasnails/tags/block/heating_blocks.json
e31d0ccf1dd374df5d89a102ae1829d4411012f6 data/toughasnails/tags/block/passable_blocks.json
================================================
FILE: common/src/generated/resources/.cache/e17ca3f95219f355def414f7430c77a0b006e725
================================================
// 1.21.11 2026-02-24T22:31:51.7123482 Tags for minecraft:entity_type mod id toughasnails
98ee250779a1d5c1a5915d68a6c27e6f7e3c849a data/toughasnails/tags/entity_type/neutralising_mounts.json
================================================
FILE: common/src/generated/resources/.cache/ece1a0d38a152b7be1e86680691afdfd6d9fba1f
================================================
// 1.21.11 2025-12-14T21:33:41.347491 Equipment Asset Definitions
4b2945d310c6084cdfa1731f33901d34d6ce4731 assets/toughasnails/equipment/leaf.json
192c8a743376167dc4e419443577552eb962ef7f assets/toughasnails/equipment/wool.json
================================================
FILE: common/src/generated/resources/assets/toughasnails/equipment/leaf.json
================================================
{
"layers": {
"humanoid": [
{
"dyeable": {
"color_when_undyed": -6265536
},
"texture": "toughasnails:leaf"
},
{
"dyeable": {
"color_when_undyed": -6265536
},
"texture": "toughasnails:leaf_overlay"
}
],
"humanoid_leggings": [
{
"dyeable": {
"color_when_undyed": -6265536
},
"texture": "toughasnails:leaf"
},
{
"dyeable": {
"color_when_undyed": -6265536
},
"texture": "toughasnails:leaf_overlay"
}
]
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/equipment/wool.json
================================================
{
"layers": {
"humanoid": [
{
"dyeable": {
"color_when_undyed": -6265536
},
"texture": "toughasnails:wool"
},
{
"texture": "toughasnails:wool_overlay"
}
],
"humanoid_leggings": [
{
"dyeable": {
"color_when_undyed": -6265536
},
"texture": "toughasnails:wool"
},
{
"texture": "toughasnails:wool_overlay"
}
]
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/apple_juice.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/apple_juice"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/cactus_juice.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/cactus_juice"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/charc_os.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/charc_os"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/chorus_fruit_juice.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/chorus_fruit_juice"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/copper_dirty_water_canteen.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/copper_dirty_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/copper_purified_water_canteen.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/copper_purified_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/copper_water_canteen.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/copper_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/diamond_dirty_water_canteen.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/diamond_dirty_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/diamond_purified_water_canteen.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/diamond_purified_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/diamond_water_canteen.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/diamond_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/dirty_water_bottle.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/dirty_water_bottle"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/empty_copper_canteen.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/empty_copper_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/empty_diamond_canteen.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/empty_diamond_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/empty_gold_canteen.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/empty_gold_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/empty_iron_canteen.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/empty_iron_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/empty_leather_canteen.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/empty_leather_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/empty_netherite_canteen.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/empty_netherite_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/glow_berry_juice.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/glow_berry_juice"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/gold_dirty_water_canteen.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/gold_dirty_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/gold_purified_water_canteen.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/gold_purified_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/gold_water_canteen.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/gold_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/ice_cream.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/ice_cream"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/iron_dirty_water_canteen.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/iron_dirty_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/iron_purified_water_canteen.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/iron_purified_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/iron_water_canteen.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/iron_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/leaf_boots.json
================================================
{
"model": {
"type": "minecraft:select",
"cases": [
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_boots_quartz_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:quartz"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_boots_iron_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:iron"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_boots_netherite_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:netherite"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_boots_redstone_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:redstone"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_boots_copper_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:copper"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_boots_gold_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:gold"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_boots_emerald_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:emerald"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_boots_diamond_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:diamond"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_boots_lapis_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:lapis"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_boots_amethyst_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:amethyst"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_boots_resin_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:resin"
}
],
"fallback": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_boots",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"property": "minecraft:trim_material"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/leaf_chestplate.json
================================================
{
"model": {
"type": "minecraft:select",
"cases": [
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_chestplate_quartz_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:quartz"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_chestplate_iron_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:iron"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_chestplate_netherite_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:netherite"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_chestplate_redstone_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:redstone"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_chestplate_copper_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:copper"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_chestplate_gold_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:gold"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_chestplate_emerald_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:emerald"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_chestplate_diamond_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:diamond"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_chestplate_lapis_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:lapis"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_chestplate_amethyst_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:amethyst"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_chestplate_resin_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:resin"
}
],
"fallback": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_chestplate",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"property": "minecraft:trim_material"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/leaf_helmet.json
================================================
{
"model": {
"type": "minecraft:select",
"cases": [
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_helmet_quartz_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:quartz"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_helmet_iron_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:iron"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_helmet_netherite_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:netherite"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_helmet_redstone_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:redstone"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_helmet_copper_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:copper"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_helmet_gold_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:gold"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_helmet_emerald_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:emerald"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_helmet_diamond_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:diamond"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_helmet_lapis_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:lapis"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_helmet_amethyst_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:amethyst"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_helmet_resin_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:resin"
}
],
"fallback": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_helmet",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"property": "minecraft:trim_material"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/leaf_leggings.json
================================================
{
"model": {
"type": "minecraft:select",
"cases": [
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_leggings_quartz_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:quartz"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_leggings_iron_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:iron"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_leggings_netherite_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:netherite"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_leggings_redstone_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:redstone"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_leggings_copper_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:copper"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_leggings_gold_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:gold"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_leggings_emerald_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:emerald"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_leggings_diamond_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:diamond"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_leggings_lapis_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:lapis"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_leggings_amethyst_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:amethyst"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_leggings_resin_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"when": "minecraft:resin"
}
],
"fallback": {
"type": "minecraft:model",
"model": "toughasnails:item/leaf_leggings",
"tints": [
{
"type": "minecraft:dye",
"default": -12012264
}
]
},
"property": "minecraft:trim_material"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/leather_dirty_water_canteen.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leather_dirty_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/leather_purified_water_canteen.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leather_purified_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/leather_water_canteen.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/leather_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/melon_juice.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/melon_juice"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/netherite_dirty_water_canteen.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/netherite_dirty_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/netherite_purified_water_canteen.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/netherite_purified_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/netherite_water_canteen.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/netherite_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/pumpkin_juice.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/pumpkin_juice"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/purified_water_bottle.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/purified_water_bottle"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/rain_collector.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:block/rain_collector"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/sweet_berry_juice.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/sweet_berry_juice"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/tan_icon.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/tan_icon"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/temperature_gauge.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:block/temperature_gauge"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/thermometer.json
================================================
{
"model": {
"type": "minecraft:range_dispatch",
"deltas": {},
"entries": [
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/thermometer_00"
},
"threshold": 0.0
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/thermometer_01"
},
"threshold": 0.05
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/thermometer_02"
},
"threshold": 0.1
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/thermometer_03"
},
"threshold": 0.15
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/thermometer_04"
},
"threshold": 0.2
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/thermometer_05"
},
"threshold": 0.25
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/thermometer_06"
},
"threshold": 0.3
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/thermometer_07"
},
"threshold": 0.35
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/thermometer_08"
},
"threshold": 0.4
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/thermometer_09"
},
"threshold": 0.45
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/thermometer_10"
},
"threshold": 0.5
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/thermometer_11"
},
"threshold": 0.55
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/thermometer_12"
},
"threshold": 0.6
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/thermometer_13"
},
"threshold": 0.65
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/thermometer_14"
},
"threshold": 0.7
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/thermometer_15"
},
"threshold": 0.75
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/thermometer_16"
},
"threshold": 0.8
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/thermometer_17"
},
"threshold": 0.85
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/thermometer_18"
},
"threshold": 0.9
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/thermometer_19"
},
"threshold": 0.95
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/thermometer_20"
},
"threshold": 1.0
}
],
"property": "minecraft:temperature"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/thermoregulator.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:block/thermoregulator"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/water_purifier.json
================================================
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:block/water_purifier"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/wool_boots.json
================================================
{
"model": {
"type": "minecraft:select",
"cases": [
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_boots_quartz_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:quartz"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_boots_iron_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:iron"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_boots_netherite_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:netherite"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_boots_redstone_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:redstone"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_boots_copper_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:copper"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_boots_gold_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:gold"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_boots_emerald_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:emerald"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_boots_diamond_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:diamond"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_boots_lapis_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:lapis"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_boots_amethyst_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:amethyst"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_boots_resin_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:resin"
}
],
"fallback": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_boots",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"property": "minecraft:trim_material"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/wool_chestplate.json
================================================
{
"model": {
"type": "minecraft:select",
"cases": [
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_chestplate_quartz_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:quartz"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_chestplate_iron_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:iron"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_chestplate_netherite_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:netherite"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_chestplate_redstone_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:redstone"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_chestplate_copper_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:copper"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_chestplate_gold_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:gold"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_chestplate_emerald_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:emerald"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_chestplate_diamond_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:diamond"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_chestplate_lapis_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:lapis"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_chestplate_amethyst_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:amethyst"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_chestplate_resin_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:resin"
}
],
"fallback": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_chestplate",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"property": "minecraft:trim_material"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/wool_helmet.json
================================================
{
"model": {
"type": "minecraft:select",
"cases": [
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_helmet_quartz_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:quartz"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_helmet_iron_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:iron"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_helmet_netherite_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:netherite"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_helmet_redstone_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:redstone"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_helmet_copper_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:copper"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_helmet_gold_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:gold"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_helmet_emerald_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:emerald"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_helmet_diamond_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:diamond"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_helmet_lapis_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:lapis"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_helmet_amethyst_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:amethyst"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_helmet_resin_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:resin"
}
],
"fallback": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_helmet",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"property": "minecraft:trim_material"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/items/wool_leggings.json
================================================
{
"model": {
"type": "minecraft:select",
"cases": [
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_leggings_quartz_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:quartz"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_leggings_iron_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:iron"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_leggings_netherite_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:netherite"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_leggings_redstone_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:redstone"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_leggings_copper_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:copper"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_leggings_gold_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:gold"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_leggings_emerald_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:emerald"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_leggings_diamond_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:diamond"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_leggings_lapis_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:lapis"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_leggings_amethyst_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:amethyst"
},
{
"model": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_leggings_resin_trim",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"when": "minecraft:resin"
}
],
"fallback": {
"type": "minecraft:model",
"model": "toughasnails:item/wool_leggings",
"tints": [
{
"type": "minecraft:dye",
"default": -6265536
}
]
},
"property": "minecraft:trim_material"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/apple_juice.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/apple_juice"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/cactus_juice.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/cactus_juice"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/charc_os.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/charc_os"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/chorus_fruit_juice.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/chorus_fruit_juice"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/copper_dirty_water_canteen.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/copper_dirty_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/copper_purified_water_canteen.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/copper_purified_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/copper_water_canteen.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/copper_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/diamond_dirty_water_canteen.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/diamond_dirty_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/diamond_purified_water_canteen.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/diamond_purified_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/diamond_water_canteen.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/diamond_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/dirty_water_bottle.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/dirty_water_bottle"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/empty_copper_canteen.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/empty_copper_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/empty_diamond_canteen.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/empty_diamond_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/empty_gold_canteen.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/empty_gold_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/empty_iron_canteen.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/empty_iron_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/empty_leather_canteen.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/empty_leather_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/empty_netherite_canteen.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/empty_netherite_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/glow_berry_juice.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/glow_berry_juice"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/gold_dirty_water_canteen.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/gold_dirty_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/gold_purified_water_canteen.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/gold_purified_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/gold_water_canteen.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/gold_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/ice_cream.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/ice_cream"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/iron_dirty_water_canteen.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/iron_dirty_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/iron_purified_water_canteen.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/iron_purified_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/iron_water_canteen.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/iron_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_boots.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_boots",
"layer1": "toughasnails:item/leaf_boots_overlay"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_boots_amethyst_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_boots",
"layer1": "toughasnails:item/leaf_boots_overlay",
"layer2": "minecraft:trims/items/boots_trim_amethyst"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_boots_copper_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_boots",
"layer1": "toughasnails:item/leaf_boots_overlay",
"layer2": "minecraft:trims/items/boots_trim_copper"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_boots_diamond_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_boots",
"layer1": "toughasnails:item/leaf_boots_overlay",
"layer2": "minecraft:trims/items/boots_trim_diamond"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_boots_emerald_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_boots",
"layer1": "toughasnails:item/leaf_boots_overlay",
"layer2": "minecraft:trims/items/boots_trim_emerald"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_boots_gold_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_boots",
"layer1": "toughasnails:item/leaf_boots_overlay",
"layer2": "minecraft:trims/items/boots_trim_gold"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_boots_iron_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_boots",
"layer1": "toughasnails:item/leaf_boots_overlay",
"layer2": "minecraft:trims/items/boots_trim_iron"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_boots_lapis_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_boots",
"layer1": "toughasnails:item/leaf_boots_overlay",
"layer2": "minecraft:trims/items/boots_trim_lapis"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_boots_netherite_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_boots",
"layer1": "toughasnails:item/leaf_boots_overlay",
"layer2": "minecraft:trims/items/boots_trim_netherite"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_boots_quartz_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_boots",
"layer1": "toughasnails:item/leaf_boots_overlay",
"layer2": "minecraft:trims/items/boots_trim_quartz"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_boots_redstone_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_boots",
"layer1": "toughasnails:item/leaf_boots_overlay",
"layer2": "minecraft:trims/items/boots_trim_redstone"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_boots_resin_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_boots",
"layer1": "toughasnails:item/leaf_boots_overlay",
"layer2": "minecraft:trims/items/boots_trim_resin"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_chestplate.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_chestplate",
"layer1": "toughasnails:item/leaf_chestplate_overlay"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_chestplate_amethyst_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_chestplate",
"layer1": "toughasnails:item/leaf_chestplate_overlay",
"layer2": "minecraft:trims/items/chestplate_trim_amethyst"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_chestplate_copper_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_chestplate",
"layer1": "toughasnails:item/leaf_chestplate_overlay",
"layer2": "minecraft:trims/items/chestplate_trim_copper"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_chestplate_diamond_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_chestplate",
"layer1": "toughasnails:item/leaf_chestplate_overlay",
"layer2": "minecraft:trims/items/chestplate_trim_diamond"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_chestplate_emerald_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_chestplate",
"layer1": "toughasnails:item/leaf_chestplate_overlay",
"layer2": "minecraft:trims/items/chestplate_trim_emerald"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_chestplate_gold_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_chestplate",
"layer1": "toughasnails:item/leaf_chestplate_overlay",
"layer2": "minecraft:trims/items/chestplate_trim_gold"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_chestplate_iron_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_chestplate",
"layer1": "toughasnails:item/leaf_chestplate_overlay",
"layer2": "minecraft:trims/items/chestplate_trim_iron"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_chestplate_lapis_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_chestplate",
"layer1": "toughasnails:item/leaf_chestplate_overlay",
"layer2": "minecraft:trims/items/chestplate_trim_lapis"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_chestplate_netherite_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_chestplate",
"layer1": "toughasnails:item/leaf_chestplate_overlay",
"layer2": "minecraft:trims/items/chestplate_trim_netherite"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_chestplate_quartz_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_chestplate",
"layer1": "toughasnails:item/leaf_chestplate_overlay",
"layer2": "minecraft:trims/items/chestplate_trim_quartz"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_chestplate_redstone_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_chestplate",
"layer1": "toughasnails:item/leaf_chestplate_overlay",
"layer2": "minecraft:trims/items/chestplate_trim_redstone"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_chestplate_resin_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_chestplate",
"layer1": "toughasnails:item/leaf_chestplate_overlay",
"layer2": "minecraft:trims/items/chestplate_trim_resin"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_helmet.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_helmet",
"layer1": "toughasnails:item/leaf_helmet_overlay"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_helmet_amethyst_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_helmet",
"layer1": "toughasnails:item/leaf_helmet_overlay",
"layer2": "minecraft:trims/items/helmet_trim_amethyst"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_helmet_copper_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_helmet",
"layer1": "toughasnails:item/leaf_helmet_overlay",
"layer2": "minecraft:trims/items/helmet_trim_copper"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_helmet_diamond_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_helmet",
"layer1": "toughasnails:item/leaf_helmet_overlay",
"layer2": "minecraft:trims/items/helmet_trim_diamond"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_helmet_emerald_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_helmet",
"layer1": "toughasnails:item/leaf_helmet_overlay",
"layer2": "minecraft:trims/items/helmet_trim_emerald"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_helmet_gold_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_helmet",
"layer1": "toughasnails:item/leaf_helmet_overlay",
"layer2": "minecraft:trims/items/helmet_trim_gold"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_helmet_iron_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_helmet",
"layer1": "toughasnails:item/leaf_helmet_overlay",
"layer2": "minecraft:trims/items/helmet_trim_iron"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_helmet_lapis_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_helmet",
"layer1": "toughasnails:item/leaf_helmet_overlay",
"layer2": "minecraft:trims/items/helmet_trim_lapis"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_helmet_netherite_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_helmet",
"layer1": "toughasnails:item/leaf_helmet_overlay",
"layer2": "minecraft:trims/items/helmet_trim_netherite"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_helmet_quartz_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_helmet",
"layer1": "toughasnails:item/leaf_helmet_overlay",
"layer2": "minecraft:trims/items/helmet_trim_quartz"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_helmet_redstone_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_helmet",
"layer1": "toughasnails:item/leaf_helmet_overlay",
"layer2": "minecraft:trims/items/helmet_trim_redstone"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_helmet_resin_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_helmet",
"layer1": "toughasnails:item/leaf_helmet_overlay",
"layer2": "minecraft:trims/items/helmet_trim_resin"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_leggings.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_leggings",
"layer1": "toughasnails:item/leaf_leggings_overlay"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_leggings_amethyst_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_leggings",
"layer1": "toughasnails:item/leaf_leggings_overlay",
"layer2": "minecraft:trims/items/leggings_trim_amethyst"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_leggings_copper_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_leggings",
"layer1": "toughasnails:item/leaf_leggings_overlay",
"layer2": "minecraft:trims/items/leggings_trim_copper"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_leggings_diamond_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_leggings",
"layer1": "toughasnails:item/leaf_leggings_overlay",
"layer2": "minecraft:trims/items/leggings_trim_diamond"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_leggings_emerald_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_leggings",
"layer1": "toughasnails:item/leaf_leggings_overlay",
"layer2": "minecraft:trims/items/leggings_trim_emerald"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_leggings_gold_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_leggings",
"layer1": "toughasnails:item/leaf_leggings_overlay",
"layer2": "minecraft:trims/items/leggings_trim_gold"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_leggings_iron_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_leggings",
"layer1": "toughasnails:item/leaf_leggings_overlay",
"layer2": "minecraft:trims/items/leggings_trim_iron"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_leggings_lapis_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_leggings",
"layer1": "toughasnails:item/leaf_leggings_overlay",
"layer2": "minecraft:trims/items/leggings_trim_lapis"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_leggings_netherite_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_leggings",
"layer1": "toughasnails:item/leaf_leggings_overlay",
"layer2": "minecraft:trims/items/leggings_trim_netherite"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_leggings_quartz_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_leggings",
"layer1": "toughasnails:item/leaf_leggings_overlay",
"layer2": "minecraft:trims/items/leggings_trim_quartz"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_leggings_redstone_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_leggings",
"layer1": "toughasnails:item/leaf_leggings_overlay",
"layer2": "minecraft:trims/items/leggings_trim_redstone"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leaf_leggings_resin_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leaf_leggings",
"layer1": "toughasnails:item/leaf_leggings_overlay",
"layer2": "minecraft:trims/items/leggings_trim_resin"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leather_dirty_water_canteen.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leather_dirty_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leather_purified_water_canteen.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leather_purified_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/leather_water_canteen.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/leather_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/melon_juice.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/melon_juice"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/netherite_dirty_water_canteen.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/netherite_dirty_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/netherite_purified_water_canteen.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/netherite_purified_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/netherite_water_canteen.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/netherite_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/pumpkin_juice.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/pumpkin_juice"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/purified_water_bottle.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/purified_water_bottle"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/sweet_berry_juice.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/sweet_berry_juice"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/tan_icon.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/tan_icon"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/thermometer_00.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/thermometer_00"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/thermometer_01.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/thermometer_01"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/thermometer_02.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/thermometer_02"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/thermometer_03.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/thermometer_03"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/thermometer_04.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/thermometer_04"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/thermometer_05.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/thermometer_05"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/thermometer_06.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/thermometer_06"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/thermometer_07.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/thermometer_07"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/thermometer_08.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/thermometer_08"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/thermometer_09.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/thermometer_09"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/thermometer_10.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/thermometer_10"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/thermometer_11.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/thermometer_11"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/thermometer_12.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/thermometer_12"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/thermometer_13.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/thermometer_13"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/thermometer_14.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/thermometer_14"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/thermometer_15.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/thermometer_15"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/thermometer_16.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/thermometer_16"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/thermometer_17.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/thermometer_17"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/thermometer_18.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/thermometer_18"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/thermometer_19.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/thermometer_19"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/thermometer_20.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/thermometer_20"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_boots.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_boots",
"layer1": "toughasnails:item/wool_boots_overlay"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_boots_amethyst_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_boots",
"layer1": "toughasnails:item/wool_boots_overlay",
"layer2": "minecraft:trims/items/boots_trim_amethyst"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_boots_copper_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_boots",
"layer1": "toughasnails:item/wool_boots_overlay",
"layer2": "minecraft:trims/items/boots_trim_copper"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_boots_diamond_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_boots",
"layer1": "toughasnails:item/wool_boots_overlay",
"layer2": "minecraft:trims/items/boots_trim_diamond"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_boots_emerald_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_boots",
"layer1": "toughasnails:item/wool_boots_overlay",
"layer2": "minecraft:trims/items/boots_trim_emerald"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_boots_gold_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_boots",
"layer1": "toughasnails:item/wool_boots_overlay",
"layer2": "minecraft:trims/items/boots_trim_gold"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_boots_iron_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_boots",
"layer1": "toughasnails:item/wool_boots_overlay",
"layer2": "minecraft:trims/items/boots_trim_iron"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_boots_lapis_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_boots",
"layer1": "toughasnails:item/wool_boots_overlay",
"layer2": "minecraft:trims/items/boots_trim_lapis"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_boots_netherite_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_boots",
"layer1": "toughasnails:item/wool_boots_overlay",
"layer2": "minecraft:trims/items/boots_trim_netherite"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_boots_quartz_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_boots",
"layer1": "toughasnails:item/wool_boots_overlay",
"layer2": "minecraft:trims/items/boots_trim_quartz"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_boots_redstone_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_boots",
"layer1": "toughasnails:item/wool_boots_overlay",
"layer2": "minecraft:trims/items/boots_trim_redstone"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_boots_resin_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_boots",
"layer1": "toughasnails:item/wool_boots_overlay",
"layer2": "minecraft:trims/items/boots_trim_resin"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_chestplate.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_chestplate",
"layer1": "toughasnails:item/wool_chestplate_overlay"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_chestplate_amethyst_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_chestplate",
"layer1": "toughasnails:item/wool_chestplate_overlay",
"layer2": "minecraft:trims/items/chestplate_trim_amethyst"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_chestplate_copper_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_chestplate",
"layer1": "toughasnails:item/wool_chestplate_overlay",
"layer2": "minecraft:trims/items/chestplate_trim_copper"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_chestplate_diamond_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_chestplate",
"layer1": "toughasnails:item/wool_chestplate_overlay",
"layer2": "minecraft:trims/items/chestplate_trim_diamond"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_chestplate_emerald_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_chestplate",
"layer1": "toughasnails:item/wool_chestplate_overlay",
"layer2": "minecraft:trims/items/chestplate_trim_emerald"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_chestplate_gold_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_chestplate",
"layer1": "toughasnails:item/wool_chestplate_overlay",
"layer2": "minecraft:trims/items/chestplate_trim_gold"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_chestplate_iron_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_chestplate",
"layer1": "toughasnails:item/wool_chestplate_overlay",
"layer2": "minecraft:trims/items/chestplate_trim_iron"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_chestplate_lapis_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_chestplate",
"layer1": "toughasnails:item/wool_chestplate_overlay",
"layer2": "minecraft:trims/items/chestplate_trim_lapis"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_chestplate_netherite_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_chestplate",
"layer1": "toughasnails:item/wool_chestplate_overlay",
"layer2": "minecraft:trims/items/chestplate_trim_netherite"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_chestplate_quartz_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_chestplate",
"layer1": "toughasnails:item/wool_chestplate_overlay",
"layer2": "minecraft:trims/items/chestplate_trim_quartz"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_chestplate_redstone_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_chestplate",
"layer1": "toughasnails:item/wool_chestplate_overlay",
"layer2": "minecraft:trims/items/chestplate_trim_redstone"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_chestplate_resin_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_chestplate",
"layer1": "toughasnails:item/wool_chestplate_overlay",
"layer2": "minecraft:trims/items/chestplate_trim_resin"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_helmet.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_helmet",
"layer1": "toughasnails:item/wool_helmet_overlay"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_helmet_amethyst_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_helmet",
"layer1": "toughasnails:item/wool_helmet_overlay",
"layer2": "minecraft:trims/items/helmet_trim_amethyst"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_helmet_copper_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_helmet",
"layer1": "toughasnails:item/wool_helmet_overlay",
"layer2": "minecraft:trims/items/helmet_trim_copper"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_helmet_diamond_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_helmet",
"layer1": "toughasnails:item/wool_helmet_overlay",
"layer2": "minecraft:trims/items/helmet_trim_diamond"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_helmet_emerald_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_helmet",
"layer1": "toughasnails:item/wool_helmet_overlay",
"layer2": "minecraft:trims/items/helmet_trim_emerald"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_helmet_gold_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_helmet",
"layer1": "toughasnails:item/wool_helmet_overlay",
"layer2": "minecraft:trims/items/helmet_trim_gold"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_helmet_iron_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_helmet",
"layer1": "toughasnails:item/wool_helmet_overlay",
"layer2": "minecraft:trims/items/helmet_trim_iron"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_helmet_lapis_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_helmet",
"layer1": "toughasnails:item/wool_helmet_overlay",
"layer2": "minecraft:trims/items/helmet_trim_lapis"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_helmet_netherite_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_helmet",
"layer1": "toughasnails:item/wool_helmet_overlay",
"layer2": "minecraft:trims/items/helmet_trim_netherite"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_helmet_quartz_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_helmet",
"layer1": "toughasnails:item/wool_helmet_overlay",
"layer2": "minecraft:trims/items/helmet_trim_quartz"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_helmet_redstone_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_helmet",
"layer1": "toughasnails:item/wool_helmet_overlay",
"layer2": "minecraft:trims/items/helmet_trim_redstone"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_helmet_resin_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_helmet",
"layer1": "toughasnails:item/wool_helmet_overlay",
"layer2": "minecraft:trims/items/helmet_trim_resin"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_leggings.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_leggings",
"layer1": "toughasnails:item/wool_leggings_overlay"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_leggings_amethyst_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_leggings",
"layer1": "toughasnails:item/wool_leggings_overlay",
"layer2": "minecraft:trims/items/leggings_trim_amethyst"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_leggings_copper_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_leggings",
"layer1": "toughasnails:item/wool_leggings_overlay",
"layer2": "minecraft:trims/items/leggings_trim_copper"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_leggings_diamond_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_leggings",
"layer1": "toughasnails:item/wool_leggings_overlay",
"layer2": "minecraft:trims/items/leggings_trim_diamond"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_leggings_emerald_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_leggings",
"layer1": "toughasnails:item/wool_leggings_overlay",
"layer2": "minecraft:trims/items/leggings_trim_emerald"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_leggings_gold_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_leggings",
"layer1": "toughasnails:item/wool_leggings_overlay",
"layer2": "minecraft:trims/items/leggings_trim_gold"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_leggings_iron_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_leggings",
"layer1": "toughasnails:item/wool_leggings_overlay",
"layer2": "minecraft:trims/items/leggings_trim_iron"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_leggings_lapis_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_leggings",
"layer1": "toughasnails:item/wool_leggings_overlay",
"layer2": "minecraft:trims/items/leggings_trim_lapis"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_leggings_netherite_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_leggings",
"layer1": "toughasnails:item/wool_leggings_overlay",
"layer2": "minecraft:trims/items/leggings_trim_netherite"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_leggings_quartz_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_leggings",
"layer1": "toughasnails:item/wool_leggings_overlay",
"layer2": "minecraft:trims/items/leggings_trim_quartz"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_leggings_redstone_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_leggings",
"layer1": "toughasnails:item/wool_leggings_overlay",
"layer2": "minecraft:trims/items/leggings_trim_redstone"
}
}
================================================
FILE: common/src/generated/resources/assets/toughasnails/models/item/wool_leggings_resin_trim.json
================================================
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "toughasnails:item/wool_leggings",
"layer1": "toughasnails:item/wool_leggings_overlay",
"layer2": "minecraft:trims/items/leggings_trim_resin"
}
}
================================================
FILE: common/src/generated/resources/data/minecraft/tags/block/mineable/axe.json
================================================
{
"values": [
"toughasnails:rain_collector",
"toughasnails:water_purifier"
]
}
================================================
FILE: common/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json
================================================
{
"values": [
"toughasnails:thermoregulator",
"toughasnails:temperature_gauge"
]
}
================================================
FILE: common/src/generated/resources/data/minecraft/tags/damage_type/bypasses_armor.json
================================================
{
"values": [
"toughasnails:hyperthermia",
"toughasnails:thirst"
]
}
================================================
FILE: common/src/generated/resources/data/minecraft/tags/damage_type/bypasses_effects.json
================================================
{
"values": [
"toughasnails:thirst"
]
}
================================================
FILE: common/src/generated/resources/data/minecraft/tags/enchantment/on_random_loot.json
================================================
{
"values": [
"toughasnails:thermal_tuning",
"toughasnails:water_cleansing"
]
}
================================================
FILE: common/src/generated/resources/data/minecraft/tags/enchantment/tradeable.json
================================================
{
"values": [
"toughasnails:thermal_tuning",
"toughasnails:water_cleansing"
]
}
================================================
FILE: common/src/generated/resources/data/minecraft/tags/enchantment/treasure.json
================================================
{
"values": [
"toughasnails:thermal_tuning",
"toughasnails:water_cleansing"
]
}
================================================
FILE: common/src/generated/resources/data/minecraft/tags/item/dyeable.json
================================================
{
"values": [
"toughasnails:leaf_helmet",
"toughasnails:leaf_chestplate",
"toughasnails:leaf_leggings",
"toughasnails:leaf_boots",
"toughasnails:wool_helmet",
"toughasnails:wool_chestplate",
"toughasnails:wool_leggings",
"toughasnails:wool_boots"
]
}
================================================
FILE: common/src/generated/resources/data/minecraft/tags/point_of_interest_type/acquirable_job_site.json
================================================
{
"values": [
"toughasnails:climatologist"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/combat/leaf_boots.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_leaves": {
"conditions": {
"items": [
{
"items": "#minecraft:leaves"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:leaf_boots"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_leaves"
]
],
"rewards": {
"recipes": [
"toughasnails:leaf_boots"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/combat/leaf_chestplate.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_leaves": {
"conditions": {
"items": [
{
"items": "#minecraft:leaves"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:leaf_chestplate"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_leaves"
]
],
"rewards": {
"recipes": [
"toughasnails:leaf_chestplate"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/combat/leaf_helmet.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_leaves": {
"conditions": {
"items": [
{
"items": "#minecraft:leaves"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:leaf_helmet"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_leaves"
]
],
"rewards": {
"recipes": [
"toughasnails:leaf_helmet"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/combat/leaf_leggings.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_leaves": {
"conditions": {
"items": [
{
"items": "#minecraft:leaves"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:leaf_leggings"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_leaves"
]
],
"rewards": {
"recipes": [
"toughasnails:leaf_leggings"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/combat/wool_boots.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:wool_boots"
},
"trigger": "minecraft:recipe_unlocked"
},
"has_wool": {
"conditions": {
"items": [
{
"items": "#minecraft:wool"
}
]
},
"trigger": "minecraft:inventory_changed"
}
},
"requirements": [
[
"has_the_recipe",
"has_wool"
]
],
"rewards": {
"recipes": [
"toughasnails:wool_boots"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/combat/wool_chestplate.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:wool_chestplate"
},
"trigger": "minecraft:recipe_unlocked"
},
"has_wool": {
"conditions": {
"items": [
{
"items": "#minecraft:wool"
}
]
},
"trigger": "minecraft:inventory_changed"
}
},
"requirements": [
[
"has_the_recipe",
"has_wool"
]
],
"rewards": {
"recipes": [
"toughasnails:wool_chestplate"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/combat/wool_helmet.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:wool_helmet"
},
"trigger": "minecraft:recipe_unlocked"
},
"has_wool": {
"conditions": {
"items": [
{
"items": "#minecraft:wool"
}
]
},
"trigger": "minecraft:inventory_changed"
}
},
"requirements": [
[
"has_the_recipe",
"has_wool"
]
],
"rewards": {
"recipes": [
"toughasnails:wool_helmet"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/combat/wool_leggings.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:wool_leggings"
},
"trigger": "minecraft:recipe_unlocked"
},
"has_wool": {
"conditions": {
"items": [
{
"items": "#minecraft:wool"
}
]
},
"trigger": "minecraft:inventory_changed"
}
},
"requirements": [
[
"has_the_recipe",
"has_wool"
]
],
"rewards": {
"recipes": [
"toughasnails:wool_leggings"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/decorations/rain_collector.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_string": {
"conditions": {
"items": [
{
"items": "minecraft:string"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:rain_collector"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_string"
]
],
"rewards": {
"recipes": [
"toughasnails:rain_collector"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/decorations/thermoregulator.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:thermoregulator"
},
"trigger": "minecraft:recipe_unlocked"
},
"has_thermometer": {
"conditions": {
"items": [
{
"items": "toughasnails:thermometer"
}
]
},
"trigger": "minecraft:inventory_changed"
}
},
"requirements": [
[
"has_the_recipe",
"has_thermometer"
]
],
"rewards": {
"recipes": [
"toughasnails:thermoregulator"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/decorations/water_purifier.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_copper_ingot": {
"conditions": {
"items": [
{
"items": "minecraft:copper_ingot"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:water_purifier"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_copper_ingot"
]
],
"rewards": {
"recipes": [
"toughasnails:water_purifier"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/food/apple_juice.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_apple": {
"conditions": {
"items": [
{
"items": "minecraft:apple"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:apple_juice"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_apple"
]
],
"rewards": {
"recipes": [
"toughasnails:apple_juice"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/food/cactus_juice.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_cactus": {
"conditions": {
"items": [
{
"items": "minecraft:cactus"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:cactus_juice"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_cactus"
]
],
"rewards": {
"recipes": [
"toughasnails:cactus_juice"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/food/charc_os.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_charcoal": {
"conditions": {
"items": [
{
"items": "minecraft:charcoal"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:charc_os"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_charcoal"
]
],
"rewards": {
"recipes": [
"toughasnails:charc_os"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/food/chorus_fruit_juice.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_chorus_fruit": {
"conditions": {
"items": [
{
"items": "minecraft:chorus_fruit"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:chorus_fruit_juice"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_chorus_fruit"
]
],
"rewards": {
"recipes": [
"toughasnails:chorus_fruit_juice"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/food/glow_berry_juice.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_glow_berries": {
"conditions": {
"items": [
{
"items": "minecraft:glow_berries"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:glow_berry_juice"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_glow_berries"
]
],
"rewards": {
"recipes": [
"toughasnails:glow_berry_juice"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/food/ice_cream.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_snowball": {
"conditions": {
"items": [
{
"items": "minecraft:snowball"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:ice_cream"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_snowball"
]
],
"rewards": {
"recipes": [
"toughasnails:ice_cream"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/food/melon_juice.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_melon_slice": {
"conditions": {
"items": [
{
"items": "minecraft:melon_slice"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:melon_juice"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_melon_slice"
]
],
"rewards": {
"recipes": [
"toughasnails:melon_juice"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/food/pumpkin_juice.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_pumpkin": {
"conditions": {
"items": [
{
"items": "minecraft:pumpkin"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:pumpkin_juice"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_pumpkin"
]
],
"rewards": {
"recipes": [
"toughasnails:pumpkin_juice"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/food/sweet_berry_juice.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_sweet_berries": {
"conditions": {
"items": [
{
"items": "minecraft:sweet_berries"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:sweet_berry_juice"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_sweet_berries"
]
],
"rewards": {
"recipes": [
"toughasnails:sweet_berry_juice"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/redstone/temperature_gauge.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:temperature_gauge"
},
"trigger": "minecraft:recipe_unlocked"
},
"has_thermometer": {
"conditions": {
"items": [
{
"items": "toughasnails:thermometer"
}
]
},
"trigger": "minecraft:inventory_changed"
}
},
"requirements": [
[
"has_the_recipe",
"has_thermometer"
]
],
"rewards": {
"recipes": [
"toughasnails:temperature_gauge"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/tools/empty_copper_canteen.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_copper_ingot": {
"conditions": {
"items": [
{
"items": "minecraft:copper_ingot"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:empty_copper_canteen"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_copper_ingot"
]
],
"rewards": {
"recipes": [
"toughasnails:empty_copper_canteen"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/tools/empty_diamond_canteen.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_diamond": {
"conditions": {
"items": [
{
"items": "minecraft:diamond"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:empty_diamond_canteen"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_diamond"
]
],
"rewards": {
"recipes": [
"toughasnails:empty_diamond_canteen"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/tools/empty_gold_canteen.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_gold_ingot": {
"conditions": {
"items": [
{
"items": "minecraft:gold_ingot"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:empty_gold_canteen"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_gold_ingot"
]
],
"rewards": {
"recipes": [
"toughasnails:empty_gold_canteen"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/tools/empty_iron_canteen.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_iron_ingot": {
"conditions": {
"items": [
{
"items": "minecraft:iron_ingot"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:empty_iron_canteen"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_iron_ingot"
]
],
"rewards": {
"recipes": [
"toughasnails:empty_iron_canteen"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/tools/empty_leather_canteen.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_leather": {
"conditions": {
"items": [
{
"items": "minecraft:leather"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:empty_leather_canteen"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_leather"
]
],
"rewards": {
"recipes": [
"toughasnails:empty_leather_canteen"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/tools/empty_netherite_canteen_smithing.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_netherite_ingot": {
"conditions": {
"items": [
{
"items": "minecraft:netherite_ingot"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:empty_netherite_canteen_smithing"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_netherite_ingot"
]
],
"rewards": {
"recipes": [
"toughasnails:empty_netherite_canteen_smithing"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/tools/netherite_dirty_water_canteen_smithing.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_netherite_ingot": {
"conditions": {
"items": [
{
"items": "minecraft:netherite_ingot"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:netherite_dirty_water_canteen_smithing"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_netherite_ingot"
]
],
"rewards": {
"recipes": [
"toughasnails:netherite_dirty_water_canteen_smithing"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/tools/netherite_purified_water_canteen_smithing.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_netherite_ingot": {
"conditions": {
"items": [
{
"items": "minecraft:netherite_ingot"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:netherite_purified_water_canteen_smithing"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_netherite_ingot"
]
],
"rewards": {
"recipes": [
"toughasnails:netherite_purified_water_canteen_smithing"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/tools/netherite_water_canteen_smithing.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_netherite_ingot": {
"conditions": {
"items": [
{
"items": "minecraft:netherite_ingot"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:netherite_water_canteen_smithing"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_netherite_ingot"
]
],
"rewards": {
"recipes": [
"toughasnails:netherite_water_canteen_smithing"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/advancement/recipes/tools/thermometer.json
================================================
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_redstone": {
"conditions": {
"items": [
{
"items": "minecraft:redstone"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "toughasnails:thermometer"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_redstone"
]
],
"rewards": {
"recipes": [
"toughasnails:thermometer"
]
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/damage_type/hyperthermia.json
================================================
{
"exhaustion": 0.1,
"message_id": "toughasnails.hyperthermia",
"scaling": "when_caused_by_living_non_player"
}
================================================
FILE: common/src/generated/resources/data/toughasnails/damage_type/thirst.json
================================================
{
"exhaustion": 0.0,
"message_id": "toughasnails.thirst",
"scaling": "when_caused_by_living_non_player"
}
================================================
FILE: common/src/generated/resources/data/toughasnails/enchantment/thermal_tuning.json
================================================
{
"anvil_cost": 4,
"description": {
"translate": "enchantment.toughasnails.thermal_tuning"
},
"max_cost": {
"base": 75,
"per_level_above_first": 25
},
"max_level": 1,
"min_cost": {
"base": 25,
"per_level_above_first": 25
},
"slots": [
"chest"
],
"supported_items": "#minecraft:enchantable/chest_armor",
"weight": 2
}
================================================
FILE: common/src/generated/resources/data/toughasnails/enchantment/water_cleansing.json
================================================
{
"anvil_cost": 4,
"description": {
"translate": "enchantment.toughasnails.water_cleansing"
},
"max_cost": {
"base": 75,
"per_level_above_first": 25
},
"max_level": 1,
"min_cost": {
"base": 25,
"per_level_above_first": 25
},
"slots": [
"mainhand"
],
"supported_items": "#toughasnails:enchantable/canteen",
"weight": 2
}
================================================
FILE: common/src/generated/resources/data/toughasnails/loot_table/blocks/rain_collector.json
================================================
{
"type": "minecraft:block",
"pools": [
{
"bonus_rolls": 0.0,
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
],
"entries": [
{
"type": "minecraft:item",
"name": "toughasnails:rain_collector"
}
],
"rolls": 1.0
}
],
"random_sequence": "toughasnails:blocks/rain_collector"
}
================================================
FILE: common/src/generated/resources/data/toughasnails/loot_table/blocks/temperature_gauge.json
================================================
{
"type": "minecraft:block",
"pools": [
{
"bonus_rolls": 0.0,
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
],
"entries": [
{
"type": "minecraft:item",
"name": "toughasnails:temperature_gauge"
}
],
"rolls": 1.0
}
],
"random_sequence": "toughasnails:blocks/temperature_gauge"
}
================================================
FILE: common/src/generated/resources/data/toughasnails/loot_table/blocks/thermoregulator.json
================================================
{
"type": "minecraft:block",
"pools": [
{
"bonus_rolls": 0.0,
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
],
"entries": [
{
"type": "minecraft:item",
"name": "toughasnails:thermoregulator"
}
],
"rolls": 1.0
}
],
"random_sequence": "toughasnails:blocks/thermoregulator"
}
================================================
FILE: common/src/generated/resources/data/toughasnails/loot_table/blocks/water_purifier.json
================================================
{
"type": "minecraft:block",
"pools": [
{
"bonus_rolls": 0.0,
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
],
"entries": [
{
"type": "minecraft:item",
"name": "toughasnails:water_purifier"
}
],
"rolls": 1.0
}
],
"random_sequence": "toughasnails:blocks/water_purifier"
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/apple_juice.json
================================================
{
"type": "minecraft:crafting_shapeless",
"category": "misc",
"group": "juice",
"ingredients": [
"toughasnails:purified_water_bottle",
"minecraft:sugar",
"minecraft:apple"
],
"result": {
"count": 1,
"id": "toughasnails:apple_juice"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/cactus_juice.json
================================================
{
"type": "minecraft:crafting_shapeless",
"category": "misc",
"group": "juice",
"ingredients": [
"toughasnails:purified_water_bottle",
"minecraft:sugar",
"minecraft:cactus"
],
"result": {
"count": 1,
"id": "toughasnails:cactus_juice"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/charc_os.json
================================================
{
"type": "minecraft:crafting_shaped",
"category": "misc",
"key": {
"#": "minecraft:charcoal",
"B": "minecraft:bowl",
"S": "minecraft:sugar"
},
"pattern": [
" # ",
"#S#",
" B "
],
"result": {
"count": 1,
"id": "toughasnails:charc_os"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/chorus_fruit_juice.json
================================================
{
"type": "minecraft:crafting_shapeless",
"category": "misc",
"group": "juice",
"ingredients": [
"toughasnails:purified_water_bottle",
"minecraft:sugar",
"minecraft:chorus_fruit"
],
"result": {
"count": 1,
"id": "toughasnails:chorus_fruit_juice"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/copper_purified_water_canteen.json
================================================
{
"type": "toughasnails:water_purifying",
"input": {
"count": 1,
"id": "toughasnails:copper_water_canteen"
},
"purifytime": 200,
"result": {
"count": 1,
"id": "toughasnails:copper_purified_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/copper_water_canteen.json
================================================
{
"type": "toughasnails:water_purifying",
"input": {
"count": 1,
"id": "toughasnails:copper_dirty_water_canteen"
},
"purifytime": 400,
"result": {
"count": 1,
"id": "toughasnails:copper_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/diamond_purified_water_canteen.json
================================================
{
"type": "toughasnails:water_purifying",
"input": {
"count": 1,
"id": "toughasnails:diamond_water_canteen"
},
"purifytime": 200,
"result": {
"count": 1,
"id": "toughasnails:diamond_purified_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/diamond_water_canteen.json
================================================
{
"type": "toughasnails:water_purifying",
"input": {
"count": 1,
"id": "toughasnails:diamond_dirty_water_canteen"
},
"purifytime": 400,
"result": {
"count": 1,
"id": "toughasnails:diamond_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/empty_copper_canteen.json
================================================
{
"type": "minecraft:crafting_shaped",
"category": "equipment",
"key": {
"#": "minecraft:copper_ingot"
},
"pattern": [
" # ",
"# #",
" # "
],
"result": {
"count": 1,
"id": "toughasnails:empty_copper_canteen"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/empty_diamond_canteen.json
================================================
{
"type": "minecraft:crafting_shaped",
"category": "equipment",
"key": {
"#": "minecraft:diamond"
},
"pattern": [
" # ",
"# #",
" # "
],
"result": {
"count": 1,
"id": "toughasnails:empty_diamond_canteen"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/empty_gold_canteen.json
================================================
{
"type": "minecraft:crafting_shaped",
"category": "equipment",
"key": {
"#": "minecraft:gold_ingot"
},
"pattern": [
" # ",
"# #",
" # "
],
"result": {
"count": 1,
"id": "toughasnails:empty_gold_canteen"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/empty_iron_canteen.json
================================================
{
"type": "minecraft:crafting_shaped",
"category": "equipment",
"key": {
"#": "minecraft:iron_ingot"
},
"pattern": [
" # ",
"# #",
" # "
],
"result": {
"count": 1,
"id": "toughasnails:empty_iron_canteen"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/empty_leather_canteen.json
================================================
{
"type": "minecraft:crafting_shaped",
"category": "equipment",
"key": {
"#": "minecraft:leather"
},
"pattern": [
" # ",
"# #",
" # "
],
"result": {
"count": 1,
"id": "toughasnails:empty_leather_canteen"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/empty_netherite_canteen_smithing.json
================================================
{
"type": "minecraft:smithing_transform",
"addition": "minecraft:netherite_ingot",
"base": "toughasnails:empty_diamond_canteen",
"result": {
"id": "toughasnails:empty_netherite_canteen"
},
"template": "minecraft:netherite_upgrade_smithing_template"
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/glow_berry_juice.json
================================================
{
"type": "minecraft:crafting_shapeless",
"category": "misc",
"group": "juice",
"ingredients": [
"toughasnails:purified_water_bottle",
"minecraft:sugar",
"minecraft:glow_berries"
],
"result": {
"count": 1,
"id": "toughasnails:glow_berry_juice"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/gold_purified_water_canteen.json
================================================
{
"type": "toughasnails:water_purifying",
"input": {
"count": 1,
"id": "toughasnails:gold_water_canteen"
},
"purifytime": 200,
"result": {
"count": 1,
"id": "toughasnails:gold_purified_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/gold_water_canteen.json
================================================
{
"type": "toughasnails:water_purifying",
"input": {
"count": 1,
"id": "toughasnails:gold_dirty_water_canteen"
},
"purifytime": 400,
"result": {
"count": 1,
"id": "toughasnails:gold_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/ice_cream.json
================================================
{
"type": "minecraft:crafting_shaped",
"category": "misc",
"key": {
"#": "minecraft:snowball",
"B": "minecraft:bowl",
"S": "minecraft:sugar"
},
"pattern": [
" # ",
"#S#",
" B "
],
"result": {
"count": 1,
"id": "toughasnails:ice_cream"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/iron_purified_water_canteen.json
================================================
{
"type": "toughasnails:water_purifying",
"input": {
"count": 1,
"id": "toughasnails:iron_water_canteen"
},
"purifytime": 200,
"result": {
"count": 1,
"id": "toughasnails:iron_purified_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/iron_water_canteen.json
================================================
{
"type": "toughasnails:water_purifying",
"input": {
"count": 1,
"id": "toughasnails:iron_dirty_water_canteen"
},
"purifytime": 400,
"result": {
"count": 1,
"id": "toughasnails:iron_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/leaf_boots.json
================================================
{
"type": "minecraft:crafting_shaped",
"category": "equipment",
"key": {
"X": "#minecraft:leaves"
},
"pattern": [
"X X",
"X X"
],
"result": {
"count": 1,
"id": "toughasnails:leaf_boots"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/leaf_chestplate.json
================================================
{
"type": "minecraft:crafting_shaped",
"category": "equipment",
"key": {
"X": "#minecraft:leaves"
},
"pattern": [
"X X",
"XXX",
"XXX"
],
"result": {
"count": 1,
"id": "toughasnails:leaf_chestplate"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/leaf_helmet.json
================================================
{
"type": "minecraft:crafting_shaped",
"category": "equipment",
"key": {
"X": "#minecraft:leaves"
},
"pattern": [
"XXX",
"X X"
],
"result": {
"count": 1,
"id": "toughasnails:leaf_helmet"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/leaf_leggings.json
================================================
{
"type": "minecraft:crafting_shaped",
"category": "equipment",
"key": {
"X": "#minecraft:leaves"
},
"pattern": [
"XXX",
"X X",
"X X"
],
"result": {
"count": 1,
"id": "toughasnails:leaf_leggings"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/leather_purified_water_canteen.json
================================================
{
"type": "toughasnails:water_purifying",
"input": {
"count": 1,
"id": "toughasnails:leather_water_canteen"
},
"purifytime": 200,
"result": {
"count": 1,
"id": "toughasnails:leather_purified_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/leather_water_canteen.json
================================================
{
"type": "toughasnails:water_purifying",
"input": {
"count": 1,
"id": "toughasnails:leather_dirty_water_canteen"
},
"purifytime": 400,
"result": {
"count": 1,
"id": "toughasnails:leather_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/melon_juice.json
================================================
{
"type": "minecraft:crafting_shapeless",
"category": "misc",
"group": "juice",
"ingredients": [
"toughasnails:purified_water_bottle",
"minecraft:sugar",
"minecraft:melon_slice"
],
"result": {
"count": 1,
"id": "toughasnails:melon_juice"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/netherite_dirty_water_canteen_smithing.json
================================================
{
"type": "minecraft:smithing_transform",
"addition": "minecraft:netherite_ingot",
"base": "toughasnails:diamond_dirty_water_canteen",
"result": {
"id": "toughasnails:netherite_dirty_water_canteen"
},
"template": "minecraft:netherite_upgrade_smithing_template"
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/netherite_purified_water_canteen.json
================================================
{
"type": "toughasnails:water_purifying",
"input": {
"count": 1,
"id": "toughasnails:netherite_water_canteen"
},
"purifytime": 200,
"result": {
"count": 1,
"id": "toughasnails:netherite_purified_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/netherite_purified_water_canteen_smithing.json
================================================
{
"type": "minecraft:smithing_transform",
"addition": "minecraft:netherite_ingot",
"base": "toughasnails:diamond_purified_water_canteen",
"result": {
"id": "toughasnails:netherite_purified_water_canteen"
},
"template": "minecraft:netherite_upgrade_smithing_template"
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/netherite_water_canteen.json
================================================
{
"type": "toughasnails:water_purifying",
"input": {
"count": 1,
"id": "toughasnails:netherite_dirty_water_canteen"
},
"purifytime": 400,
"result": {
"count": 1,
"id": "toughasnails:netherite_water_canteen"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/netherite_water_canteen_smithing.json
================================================
{
"type": "minecraft:smithing_transform",
"addition": "minecraft:netherite_ingot",
"base": "toughasnails:diamond_water_canteen",
"result": {
"id": "toughasnails:netherite_water_canteen"
},
"template": "minecraft:netherite_upgrade_smithing_template"
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/potion.json
================================================
{
"type": "toughasnails:water_purifying",
"input": {
"count": 1,
"id": "toughasnails:dirty_water_bottle"
},
"purifytime": 400,
"result": {
"components": {
"minecraft:potion_contents": {
"potion": "minecraft:water"
}
},
"count": 1,
"id": "minecraft:potion"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/pumpkin_juice.json
================================================
{
"type": "minecraft:crafting_shapeless",
"category": "misc",
"group": "juice",
"ingredients": [
"toughasnails:purified_water_bottle",
"minecraft:sugar",
"minecraft:pumpkin"
],
"result": {
"count": 1,
"id": "toughasnails:pumpkin_juice"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/purified_water_bottle.json
================================================
{
"type": "toughasnails:water_purifying",
"input": {
"components": {
"minecraft:potion_contents": {
"potion": "minecraft:water"
}
},
"count": 1,
"id": "minecraft:potion"
},
"purifytime": 200,
"result": {
"count": 1,
"id": "toughasnails:purified_water_bottle"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/rain_collector.json
================================================
{
"type": "minecraft:crafting_shaped",
"category": "misc",
"key": {
"S": "minecraft:string",
"W": "#minecraft:planks"
},
"pattern": [
"WSW",
"W W",
"WWW"
],
"result": {
"count": 1,
"id": "toughasnails:rain_collector"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/sweet_berry_juice.json
================================================
{
"type": "minecraft:crafting_shapeless",
"category": "misc",
"group": "juice",
"ingredients": [
"toughasnails:purified_water_bottle",
"minecraft:sugar",
"minecraft:sweet_berries"
],
"result": {
"count": 1,
"id": "toughasnails:sweet_berry_juice"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/temperature_gauge.json
================================================
{
"type": "minecraft:crafting_shaped",
"category": "redstone",
"key": {
"B": "minecraft:brick_slab",
"G": "minecraft:glass",
"Q": "minecraft:quartz",
"T": "toughasnails:thermometer"
},
"pattern": [
"GGG",
"QTQ",
"BBB"
],
"result": {
"count": 1,
"id": "toughasnails:temperature_gauge"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/thermometer.json
================================================
{
"type": "minecraft:crafting_shaped",
"category": "equipment",
"key": {
"#": "minecraft:copper_ingot",
"X": "minecraft:redstone"
},
"pattern": [
" # ",
"#X#",
" # "
],
"result": {
"count": 1,
"id": "toughasnails:thermometer"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/thermoregulator.json
================================================
{
"type": "minecraft:crafting_shaped",
"category": "misc",
"key": {
"I": "minecraft:iron_ingot",
"S": "minecraft:smooth_stone",
"T": "toughasnails:thermometer"
},
"pattern": [
"SIS",
"ITI",
"SIS"
],
"result": {
"count": 1,
"id": "toughasnails:thermoregulator"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/water_purifier.json
================================================
{
"type": "minecraft:crafting_shaped",
"category": "misc",
"key": {
"C": "minecraft:copper_ingot",
"G": "minecraft:glass",
"W": "#minecraft:planks"
},
"pattern": [
"GCG",
"C C",
"WWW"
],
"result": {
"count": 1,
"id": "toughasnails:water_purifier"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/wool_boots.json
================================================
{
"type": "minecraft:crafting_shaped",
"category": "equipment",
"key": {
"X": "#minecraft:wool"
},
"pattern": [
"X X",
"X X"
],
"result": {
"count": 1,
"id": "toughasnails:wool_boots"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/wool_chestplate.json
================================================
{
"type": "minecraft:crafting_shaped",
"category": "equipment",
"key": {
"X": "#minecraft:wool"
},
"pattern": [
"X X",
"XXX",
"XXX"
],
"result": {
"count": 1,
"id": "toughasnails:wool_chestplate"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/wool_helmet.json
================================================
{
"type": "minecraft:crafting_shaped",
"category": "equipment",
"key": {
"X": "#minecraft:wool"
},
"pattern": [
"XXX",
"X X"
],
"result": {
"count": 1,
"id": "toughasnails:wool_helmet"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/recipe/wool_leggings.json
================================================
{
"type": "minecraft:crafting_shaped",
"category": "equipment",
"key": {
"X": "#minecraft:wool"
},
"pattern": [
"XXX",
"X X",
"X X"
],
"result": {
"count": 1,
"id": "toughasnails:wool_leggings"
}
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/block/cooling_blocks.json
================================================
{
"values": [
"minecraft:soul_fire",
"minecraft:soul_campfire",
"minecraft:soul_lantern",
"minecraft:packed_ice",
"minecraft:blue_ice",
"minecraft:powder_snow_cauldron"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/block/heating_blocks.json
================================================
{
"values": [
"minecraft:fire",
"minecraft:campfire",
"minecraft:lantern",
"minecraft:lava",
"minecraft:magma_block",
"minecraft:lava_cauldron"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/block/passable_blocks.json
================================================
{
"values": [
"#minecraft:doors",
"#minecraft:trapdoors",
"minecraft:scaffolding"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/entity_type/neutralising_mounts.json
================================================
{
"values": [
"#c:minecarts",
"#c:boats",
{
"id": "#mts:builder_seat",
"required": false
}
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/cooling_armor.json
================================================
{
"values": [
"toughasnails:leaf_helmet",
"toughasnails:leaf_chestplate",
"toughasnails:leaf_leggings",
"toughasnails:leaf_boots"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/cooling_consumed_items.json
================================================
{
"values": [
"toughasnails:ice_cream"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/cooling_held_items.json
================================================
{
"values": [
"minecraft:powder_snow_bucket"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/drinks.json
================================================
{
"values": [
"#toughasnails:thirst/1_thirst_drinks",
"#toughasnails:thirst/2_thirst_drinks",
"#toughasnails:thirst/3_thirst_drinks",
"#toughasnails:thirst/4_thirst_drinks",
"#toughasnails:thirst/5_thirst_drinks",
"#toughasnails:thirst/6_thirst_drinks",
"#toughasnails:thirst/7_thirst_drinks",
"#toughasnails:thirst/8_thirst_drinks",
"#toughasnails:thirst/9_thirst_drinks",
"#toughasnails:thirst/10_thirst_drinks",
"#toughasnails:thirst/11_thirst_drinks",
"#toughasnails:thirst/12_thirst_drinks",
"#toughasnails:thirst/13_thirst_drinks",
"#toughasnails:thirst/14_thirst_drinks",
"#toughasnails:thirst/15_thirst_drinks",
"#toughasnails:thirst/16_thirst_drinks",
"#toughasnails:thirst/17_thirst_drinks",
"#toughasnails:thirst/18_thirst_drinks",
"#toughasnails:thirst/19_thirst_drinks",
"#toughasnails:thirst/20_thirst_drinks"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/enchantable/canteen.json
================================================
{
"values": [
"toughasnails:empty_leather_canteen",
"toughasnails:leather_dirty_water_canteen",
"toughasnails:leather_water_canteen",
"toughasnails:leather_purified_water_canteen",
"toughasnails:empty_copper_canteen",
"toughasnails:copper_dirty_water_canteen",
"toughasnails:copper_water_canteen",
"toughasnails:copper_purified_water_canteen",
"toughasnails:empty_iron_canteen",
"toughasnails:iron_dirty_water_canteen",
"toughasnails:iron_water_canteen",
"toughasnails:iron_purified_water_canteen",
"toughasnails:empty_gold_canteen",
"toughasnails:gold_dirty_water_canteen",
"toughasnails:gold_water_canteen",
"toughasnails:gold_purified_water_canteen",
"toughasnails:empty_diamond_canteen",
"toughasnails:diamond_dirty_water_canteen",
"toughasnails:diamond_water_canteen",
"toughasnails:diamond_purified_water_canteen",
"toughasnails:empty_netherite_canteen",
"toughasnails:netherite_dirty_water_canteen",
"toughasnails:netherite_water_canteen",
"toughasnails:netherite_purified_water_canteen"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/heating_armor.json
================================================
{
"values": [
"toughasnails:wool_helmet",
"toughasnails:wool_chestplate",
"toughasnails:wool_leggings",
"toughasnails:wool_boots"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/heating_consumed_items.json
================================================
{
"values": [
"toughasnails:charc_os"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/heating_held_items.json
================================================
{
"values": [
"minecraft:lava_bucket"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/hydration/100_hydration_drinks.json
================================================
{
"values": [
"toughasnails:cactus_juice"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/hydration/10_hydration_drinks.json
================================================
{
"values": [
"toughasnails:dirty_water_bottle",
"toughasnails:leather_dirty_water_canteen",
"toughasnails:copper_dirty_water_canteen",
"toughasnails:iron_dirty_water_canteen",
"toughasnails:gold_dirty_water_canteen",
"toughasnails:diamond_dirty_water_canteen",
"toughasnails:netherite_dirty_water_canteen",
"minecraft:ominous_bottle"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/hydration/20_hydration_drinks.json
================================================
{
"values": [
"toughasnails:chorus_fruit_juice",
"toughasnails:glow_berry_juice",
"toughasnails:sweet_berry_juice"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/hydration/30_hydration_drinks.json
================================================
{
"values": [
"minecraft:milk_bucket"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/hydration/40_hydration_drinks.json
================================================
{
"values": [
"minecraft:potion",
"toughasnails:leather_water_canteen",
"toughasnails:copper_water_canteen",
"toughasnails:iron_water_canteen",
"toughasnails:gold_water_canteen",
"toughasnails:diamond_water_canteen",
"toughasnails:netherite_water_canteen"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/hydration/50_hydration_drinks.json
================================================
{
"values": [
"toughasnails:melon_juice"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/hydration/60_hydration_drinks.json
================================================
{
"values": [
"toughasnails:pumpkin_juice"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/hydration/70_hydration_drinks.json
================================================
{
"values": [
"toughasnails:apple_juice"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/hydration/80_hydration_drinks.json
================================================
{
"values": [
"toughasnails:purified_water_bottle",
"toughasnails:leather_purified_water_canteen",
"toughasnails:copper_purified_water_canteen",
"toughasnails:iron_purified_water_canteen",
"toughasnails:gold_purified_water_canteen",
"toughasnails:diamond_purified_water_canteen",
"toughasnails:netherite_purified_water_canteen"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/hydration/90_hydration_drinks.json
================================================
{
"values": []
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/poison_chance/100_poison_chance_drinks.json
================================================
{
"values": [
"minecraft:ominous_bottle"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/poison_chance/25_poison_chance_drinks.json
================================================
{
"values": [
"minecraft:potion",
"toughasnails:leather_water_canteen",
"toughasnails:copper_water_canteen",
"toughasnails:iron_water_canteen",
"toughasnails:gold_water_canteen",
"toughasnails:diamond_water_canteen",
"toughasnails:netherite_water_canteen"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/poison_chance/50_poison_chance_drinks.json
================================================
{
"values": []
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/poison_chance/75_poison_chance_drinks.json
================================================
{
"values": [
"toughasnails:dirty_water_bottle",
"toughasnails:leather_dirty_water_canteen",
"toughasnails:copper_dirty_water_canteen",
"toughasnails:iron_dirty_water_canteen",
"toughasnails:gold_dirty_water_canteen",
"toughasnails:diamond_dirty_water_canteen",
"toughasnails:netherite_dirty_water_canteen"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/thermoregulator_cooling_fuel.json
================================================
{
"values": [
"toughasnails:ice_cream",
"minecraft:ice",
"minecraft:packed_ice",
"minecraft:blue_ice",
"minecraft:breeze_rod",
"minecraft:wind_charge",
"minecraft:snowball",
"minecraft:snow",
"minecraft:snow_block",
"minecraft:powder_snow_bucket"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/thermoregulator_heating_fuel.json
================================================
{
"values": [
"toughasnails:charc_os",
"minecraft:magma_block",
"minecraft:magma_cream",
"minecraft:blaze_powder",
"minecraft:blaze_rod",
"minecraft:fire_charge",
"minecraft:coal",
"minecraft:charcoal",
"minecraft:coal_block",
"minecraft:lava_bucket"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/thirst/10_thirst_drinks.json
================================================
{
"values": [
"toughasnails:chorus_fruit_juice"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/thirst/11_thirst_drinks.json
================================================
{
"values": []
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/thirst/12_thirst_drinks.json
================================================
{
"values": []
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/thirst/13_thirst_drinks.json
================================================
{
"values": []
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/thirst/14_thirst_drinks.json
================================================
{
"values": []
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/thirst/15_thirst_drinks.json
================================================
{
"values": []
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/thirst/16_thirst_drinks.json
================================================
{
"values": []
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/thirst/17_thirst_drinks.json
================================================
{
"values": []
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/thirst/18_thirst_drinks.json
================================================
{
"values": []
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/thirst/19_thirst_drinks.json
================================================
{
"values": []
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/thirst/1_thirst_drinks.json
================================================
{
"values": [
"toughasnails:dirty_water_bottle",
"toughasnails:leather_dirty_water_canteen",
"toughasnails:copper_dirty_water_canteen",
"toughasnails:iron_dirty_water_canteen",
"toughasnails:gold_dirty_water_canteen",
"toughasnails:diamond_dirty_water_canteen",
"toughasnails:netherite_dirty_water_canteen",
"minecraft:ominous_bottle"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/thirst/20_thirst_drinks.json
================================================
{
"values": []
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/thirst/2_thirst_drinks.json
================================================
{
"values": [
"minecraft:milk_bucket"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/thirst/3_thirst_drinks.json
================================================
{
"values": [
"minecraft:potion",
"toughasnails:leather_water_canteen",
"toughasnails:copper_water_canteen",
"toughasnails:iron_water_canteen",
"toughasnails:gold_water_canteen",
"toughasnails:diamond_water_canteen",
"toughasnails:netherite_water_canteen"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/thirst/4_thirst_drinks.json
================================================
{
"values": []
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/thirst/5_thirst_drinks.json
================================================
{
"values": [
"toughasnails:purified_water_bottle",
"toughasnails:leather_purified_water_canteen",
"toughasnails:copper_purified_water_canteen",
"toughasnails:iron_purified_water_canteen",
"toughasnails:gold_purified_water_canteen",
"toughasnails:diamond_purified_water_canteen",
"toughasnails:netherite_purified_water_canteen"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/thirst/6_thirst_drinks.json
================================================
{
"values": [
"toughasnails:glow_berry_juice",
"toughasnails:pumpkin_juice",
"toughasnails:sweet_berry_juice"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/thirst/7_thirst_drinks.json
================================================
{
"values": [
"toughasnails:cactus_juice",
"toughasnails:melon_juice"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/thirst/8_thirst_drinks.json
================================================
{
"values": [
"toughasnails:apple_juice"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/item/thirst/9_thirst_drinks.json
================================================
{
"values": []
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/trim_material/cooling_trims.json
================================================
{
"values": []
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/trim_material/heating_trims.json
================================================
{
"values": []
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/worldgen/biome/cold_biomes.json
================================================
{
"values": [
"minecraft:the_end",
"minecraft:small_end_islands",
"minecraft:end_midlands",
"minecraft:end_highlands",
"minecraft:end_barrens",
"minecraft:deep_dark",
"minecraft:taiga",
"minecraft:old_growth_spruce_taiga",
"minecraft:old_growth_pine_taiga",
"minecraft:windswept_hills",
"minecraft:windswept_forest",
"minecraft:windswept_gravelly_hills",
"minecraft:cold_ocean",
"minecraft:deep_cold_ocean"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/worldgen/biome/dirty_water_biomes.json
================================================
{
"values": [
"minecraft:mangrove_swamp",
"minecraft:mushroom_fields",
"minecraft:swamp"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/worldgen/biome/hot_biomes.json
================================================
{
"values": [
"minecraft:nether_wastes",
"minecraft:crimson_forest",
"minecraft:warped_forest",
"minecraft:basalt_deltas",
"minecraft:desert",
"minecraft:badlands",
"minecraft:wooded_badlands",
"minecraft:eroded_badlands"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/worldgen/biome/icy_biomes.json
================================================
{
"values": [
"minecraft:ice_spikes",
"minecraft:snowy_taiga",
"minecraft:snowy_plains",
"minecraft:snowy_slopes",
"minecraft:grove",
"minecraft:jagged_peaks",
"minecraft:frozen_peaks",
"minecraft:snowy_beach",
"minecraft:frozen_river",
"minecraft:frozen_ocean",
"minecraft:deep_frozen_ocean"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/worldgen/biome/neutral_biomes.json
================================================
{
"values": [
"minecraft:the_void",
"minecraft:dripstone_caves",
"minecraft:swamp",
"minecraft:plains",
"minecraft:sunflower_plains",
"minecraft:dark_forest",
"minecraft:birch_forest",
"minecraft:old_growth_birch_forest",
"minecraft:forest",
"minecraft:flower_forest",
"minecraft:meadow",
"minecraft:cherry_grove",
"minecraft:stony_peaks",
"minecraft:stony_shore",
"minecraft:beach",
"minecraft:river",
"minecraft:ocean",
"minecraft:deep_ocean",
"minecraft:lukewarm_ocean",
"minecraft:deep_lukewarm_ocean"
]
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/worldgen/biome/purified_water_biomes.json
================================================
{
"values": []
}
================================================
FILE: common/src/generated/resources/data/toughasnails/tags/worldgen/biome/warm_biomes.json
================================================
{
"values": [
"minecraft:soul_sand_valley",
"minecraft:lush_caves",
"minecraft:mangrove_swamp",
"minecraft:jungle",
"minecraft:sparse_jungle",
"minecraft:bamboo_jungle",
"minecraft:savanna",
"minecraft:savanna_plateau",
"minecraft:windswept_savanna",
"minecraft:warm_ocean",
"minecraft:mushroom_fields"
]
}
================================================
FILE: common/src/main/java/toughasnails/api/TANAPI.java
================================================
/*******************************************************************************
* Copyright 2023, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.api;
public class TANAPI
{
public static final String MOD_ID = "toughasnails";
}
================================================
FILE: common/src/main/java/toughasnails/api/block/TANBlocks.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.api.block;
import net.minecraft.world.level.block.Block;
public class TANBlocks
{
public static Block THERMOREGULATOR;
public static Block TEMPERATURE_GAUGE;
public static Block RAIN_COLLECTOR;
public static Block WATER_PURIFIER;
}
================================================
FILE: common/src/main/java/toughasnails/api/blockentity/TANBlockEntityTypes.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.api.blockentity;
import net.minecraft.world.level.block.entity.BlockEntityType;
public class TANBlockEntityTypes
{
public static BlockEntityType> WATER_PURIFIER;
public static BlockEntityType> TEMPERATURE_GAUGE;
public static BlockEntityType> THERMOREGULATOR;
}
================================================
FILE: common/src/main/java/toughasnails/api/container/TANContainerTypes.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.api.container;
import net.minecraft.world.inventory.MenuType;
public class TANContainerTypes
{
public static MenuType> WATER_PURIFIER;
public static MenuType> THERMOREGULATOR;
}
================================================
FILE: common/src/main/java/toughasnails/api/crafting/TANRecipeBookCategories.java
================================================
/*******************************************************************************
* Copyright 2024, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.api.crafting;
import net.minecraft.world.item.crafting.RecipeBookCategory;
public class TANRecipeBookCategories
{
public static RecipeBookCategory WATER_PURIFYING;
}
================================================
FILE: common/src/main/java/toughasnails/api/crafting/TANRecipeSerializers.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.api.crafting;
import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.item.crafting.RecipeSerializer;
import net.minecraft.world.item.crafting.SingleRecipeInput;
public class TANRecipeSerializers
{
public static RecipeSerializer extends Recipe> WATER_PURIFYING;
}
================================================
FILE: common/src/main/java/toughasnails/api/crafting/TANRecipeTypes.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.api.crafting;
import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.item.crafting.RecipeType;
import net.minecraft.world.item.crafting.SingleRecipeInput;
public class TANRecipeTypes
{
public static RecipeType extends Recipe> WATER_PURIFYING;
}
================================================
FILE: common/src/main/java/toughasnails/api/damagesource/TANDamageTypes.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.api.damagesource;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.Identifier;
import net.minecraft.world.damagesource.DamageType;
import toughasnails.api.TANAPI;
public class TANDamageTypes
{
public static final ResourceKey HYPERTHERMIA = register("hyperthermia");
public static final ResourceKey THIRST = register("thirst");
private static ResourceKey register(String name)
{
return ResourceKey.create(Registries.DAMAGE_TYPE, Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, name));
}
}
================================================
FILE: common/src/main/java/toughasnails/api/enchantment/TANEnchantments.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.api.enchantment;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.Identifier;
import net.minecraft.world.item.enchantment.Enchantment;
import toughasnails.core.ToughAsNails;
public class TANEnchantments
{
public static ResourceKey THERMAL_TUNING = key("thermal_tuning");
public static ResourceKey WATER_CLEANSING = key("water_cleansing");
private static ResourceKey key(String name)
{
return ResourceKey.create(Registries.ENCHANTMENT, Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, name));
}
}
================================================
FILE: common/src/main/java/toughasnails/api/item/TANItems.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.api.item;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.Block;
public class TANItems
{
// Block Items
public static Item THERMOREGULATOR;
public static Item TEMPERATURE_GAUGE;
public static Item RAIN_COLLECTOR;
public static Item WATER_PURIFIER;
// Items
public static Item THERMOMETER;
public static Item LEAF_HELMET;
public static Item LEAF_CHESTPLATE;
public static Item LEAF_LEGGINGS;
public static Item LEAF_BOOTS;
public static Item WOOL_HELMET;
public static Item WOOL_CHESTPLATE;
public static Item WOOL_LEGGINGS;
public static Item WOOL_BOOTS;
public static Item ICE_CREAM;
public static Item CHARC_0S;
public static Item EMPTY_LEATHER_CANTEEN;
public static Item LEATHER_DIRTY_WATER_CANTEEN;
public static Item LEATHER_WATER_CANTEEN;
public static Item LEATHER_PURIFIED_WATER_CANTEEN;
public static Item EMPTY_COPPER_CANTEEN;
public static Item COPPER_DIRTY_WATER_CANTEEN;
public static Item COPPER_WATER_CANTEEN;
public static Item COPPER_PURIFIED_WATER_CANTEEN;
public static Item EMPTY_IRON_CANTEEN;
public static Item IRON_DIRTY_WATER_CANTEEN;
public static Item IRON_WATER_CANTEEN;
public static Item IRON_PURIFIED_WATER_CANTEEN;
public static Item EMPTY_GOLD_CANTEEN;
public static Item GOLD_DIRTY_WATER_CANTEEN;
public static Item GOLD_WATER_CANTEEN;
public static Item GOLD_PURIFIED_WATER_CANTEEN;
public static Item EMPTY_DIAMOND_CANTEEN;
public static Item DIAMOND_DIRTY_WATER_CANTEEN;
public static Item DIAMOND_WATER_CANTEEN;
public static Item DIAMOND_PURIFIED_WATER_CANTEEN;
public static Item EMPTY_NETHERITE_CANTEEN;
public static Item NETHERITE_DIRTY_WATER_CANTEEN;
public static Item NETHERITE_WATER_CANTEEN;
public static Item NETHERITE_PURIFIED_WATER_CANTEEN;
public static Item DIRTY_WATER_BOTTLE;
public static Item PURIFIED_WATER_BOTTLE;
public static Item APPLE_JUICE;
public static Item CACTUS_JUICE;
public static Item CHORUS_FRUIT_JUICE;
public static Item GLOW_BERRY_JUICE;
public static Item MELON_JUICE;
public static Item PUMPKIN_JUICE;
public static Item SWEET_BERRY_JUICE;
public static Item TAN_ICON;
}
================================================
FILE: common/src/main/java/toughasnails/api/particle/TANParticles.java
================================================
package toughasnails.api.particle;
import net.minecraft.core.particles.SimpleParticleType;
public class TANParticles
{
public static SimpleParticleType THERMOREGULATOR_COOL;
public static SimpleParticleType THERMOREGULATOR_WARM;
public static SimpleParticleType THERMOREGULATOR_NEUTRAL;
}
================================================
FILE: common/src/main/java/toughasnails/api/player/ITANPlayer.java
================================================
package toughasnails.api.player;
import toughasnails.api.temperature.ITemperature;
import toughasnails.api.thirst.IThirst;
public interface ITANPlayer
{
ITemperature getTemperatureData();
IThirst getThirstData();
boolean getClimateClemencyGranted();
void setClimateClemencyGranted(boolean value);
}
================================================
FILE: common/src/main/java/toughasnails/api/potion/TANEffects.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.api.potion;
import net.minecraft.core.Holder;
import net.minecraft.world.effect.MobEffect;
public class TANEffects
{
public static Holder THIRST;
public static Holder ICE_RESISTANCE;
public static Holder CLIMATE_CLEMENCY;
public static Holder INTERNAL_WARMTH;
public static Holder INTERNAL_CHILL;
}
================================================
FILE: common/src/main/java/toughasnails/api/potion/TANPotions.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.api.potion;
import net.minecraft.core.Holder;
import net.minecraft.world.item.alchemy.Potion;
public class TANPotions
{
public static Holder ICE_RESISTANCE;
public static Holder LONG_ICE_RESISTANCE;
}
================================================
FILE: common/src/main/java/toughasnails/api/temperature/IPlayerTemperatureModifier.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.api.temperature;
import net.minecraft.world.entity.player.Player;
public interface IPlayerTemperatureModifier
{
TemperatureLevel modify(Player player, TemperatureLevel current);
}
================================================
FILE: common/src/main/java/toughasnails/api/temperature/IPositionalTemperatureModifier.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.api.temperature;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.Level;
public interface IPositionalTemperatureModifier
{
TemperatureLevel modify(Level level, BlockPos pos, TemperatureLevel current);
}
================================================
FILE: common/src/main/java/toughasnails/api/temperature/IProximityBlockModifier.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.api.temperature;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
public interface IProximityBlockModifier {
Type getProximityType(Level level, BlockPos pos, BlockState state);
enum Type
{
HEATING, COOLING, NONE
}
}
================================================
FILE: common/src/main/java/toughasnails/api/temperature/ITemperature.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.api.temperature;
import net.minecraft.core.BlockPos;
import java.util.Set;
public interface ITemperature
{
/**
* Get the temperature level.
* @return temperature level.
*/
TemperatureLevel getLevel();
/**
* Get the number of ticks of hyperthermia.
* @return number of ticks.
*/
int getHyperthermiaTicks();
/**
* Get the number of extremity delay ticks.
* @return number of ticks.
*/
int getExtremityDelayTicks();
/**
* Get the number of ticks since water was touched.
* @return number of ticks.
*/
int getDryTicks();
/**
* Get the last temperature level.
* @return temperature level.
*/
TemperatureLevel getLastLevel();
/**
* Get the target temperature level.
* @return temperature level.
*/
TemperatureLevel getTargetLevel();
/**
* Get the number of ticks to delay changing the temperature.
* @return number of ticks.
*/
int getChangeDelayTicks();
/**
* Get the last number of ticks of hyperthermia.
* @return number of ticks.
*/
int getLastHyperthermiaTicks();
/**
* Get the last positions of nearby thermoregulators.
* @return nearby thermoregulators.
*/
Set getLastNearbyThermoregulators();
/**
* Get the positions of nearby thermoregulators.
* @return nearby thermoregulators.
*/
Set getNearbyThermoregulators();
/**
* Set the temperature level.
* @param level temperature level
*/
void setLevel(TemperatureLevel level);
/**
* Set the number of ticks of hyperthermia.
* @param ticks number of ticks.
*/
void setHyperthermiaTicks(int ticks);
/**
* Set the number of extremity delay ticks.
* @param ticks number of ticks.
*/
void setExtremityDelayTicks(int ticks);
/**
* Set the number of ticks since water was touched.
* @return number of ticks.
*/
void setDryTicks(int ticks);
/**
* Set the last temperature level.
* @param level temperature level.
*/
void setLastLevel(TemperatureLevel level);
/**
* Set the target temperature level.
* @param level temperature level.
*/
void setTargetLevel(TemperatureLevel level);
/**
* Set the number of ticks to delay changing the temperature.
*/
void setChangeDelayTicks(int ticks);
/**
* Set the last number of hyperthermia ticks.
* @param ticks number of ticks.
*/
void setLastHyperthermiaTicks(int ticks);
/**
* Set the last nearby thermoregulators.
* @param values nearby thermoregulators.
*/
void setLastNearbyThermoregulators(Set values);
/**
* Set the nearby thermoregulators.
* @param values nearby thermoregulators.
*/
void setNearbyThermoregulators(Set values);
}
================================================
FILE: common/src/main/java/toughasnails/api/temperature/TemperatureHelper.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.api.temperature;
import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
public class TemperatureHelper
{
/**
* Check the temperature at a given position.
* @param level the current level.
* @param pos the position to check.
* @return temperature level.
*/
public static TemperatureLevel getTemperatureAtPos(Level level, BlockPos pos)
{
return Impl.INSTANCE.getTemperatureAtPos(level, pos);
}
/**
* Get the temperature for a player.
* @param player the player.
* @return temperature level.
*/
public static TemperatureLevel getTemperatureForPlayer(Player player)
{
return getTemperatureData(player).getLevel();
}
/**
* Obtains the temperature data for a player.
* @param player the player to obtain temperature data for
* @return the player's temperature data
*/
public static ITemperature getTemperatureData(Player player)
{
return Impl.INSTANCE.getPlayerTemperature(player);
}
/**
* Sets the number of ticks a player is experiencing hyperthermia.
* @param player the player.
* @param ticks number of ticks.
*/
public static void setTicksHyperthermic(Player player, int ticks)
{
Impl.INSTANCE.setTicksHyperthermic(player, ticks);
}
/**
* Get the percentage at which the player is hyperthermic.
* @param player the player.
* @return percentage hyperthermic.
*/
public static float getPercentHyperthermic(Player player)
{
return Impl.INSTANCE.getPercentHyperthermic(player);
}
/**
* Check whether the player is fully hyperthermic
* @param player the player.
* @return fully hyperthermic.
*/
public static boolean isFullyHyperthermic(Player player)
{
return Impl.INSTANCE.isFullyHyperthermic(player);
}
/**
* Gets the number of ticks required to experience hyperthermia.
* @return The number of ticks required for hyperthermia.
*/
public static int getTicksRequiredForHyperthermia()
{
return Impl.INSTANCE.getTicksRequiredForHyperthermia();
}
/**
* Gets the ticks at which the player is hyperthermic.
* @param player the player.
* @return number of ticks.
*/
public static int getTicksHyperthermic(Player player)
{
return Impl.INSTANCE.getTicksHyperthermic(player);
}
/**
* Gets whether a state is heating.
* @param state the state to check.
* @return is heating.
*/
public static boolean isHeatingBlock(BlockState state)
{
return Impl.INSTANCE.isHeating(state);
}
/**
* Gets whether a state is cooling.
* @param state the state to check.
* @return is cooling.
*/
public static boolean isCoolingBlock(BlockState state)
{
return Impl.INSTANCE.isCooling(state);
}
/**
* Register a player temperature modifier.
* @param modifier the modifier.
*/
public static void registerPlayerTemperatureModifier(IPlayerTemperatureModifier modifier)
{
Impl.INSTANCE.registerPlayerTemperatureModifier(modifier);
}
/**
* Register a positional temperature modifier.
* @param modifier the modifier.
*/
public static void registerPositionalTemperatureModifier(IPositionalTemperatureModifier modifier)
{
Impl.INSTANCE.registerPositionalTemperatureModifier(modifier);
}
/**
* Register a proximity temperature modifier.
* @param modifier the modifier.
*/
public static void registerProximityBlockModifier(IProximityBlockModifier modifier)
{
Impl.INSTANCE.registerProximityBlockModifier(modifier);
}
/**
* Checks whether temperature is enabled.
* @return whether temperature is enabled.
*/
public static boolean isTemperatureEnabled()
{
return Impl.INSTANCE.isTemperatureEnabled();
}
/** Internal implementation details */
public static class Impl
{
public static TemperatureHelper.Impl.ITemperatureHelper INSTANCE = null;
public interface ITemperatureHelper
{
TemperatureLevel getTemperatureAtPos(Level level, BlockPos pos);
ITemperature getPlayerTemperature(Player player);
void setTicksHyperthermic(Player player, int ticks);
float getPercentHyperthermic(Player player);
boolean isFullyHyperthermic(Player player);
int getTicksRequiredForHyperthermia();
int getTicksHyperthermic(Player player);
boolean isHeating(BlockState state);
boolean isCooling(BlockState state);
void registerPlayerTemperatureModifier(IPlayerTemperatureModifier modifier);
void registerPositionalTemperatureModifier(IPositionalTemperatureModifier modifier);
void registerProximityBlockModifier(IProximityBlockModifier modifier);
boolean isTemperatureEnabled();
}
}
}
================================================
FILE: common/src/main/java/toughasnails/api/temperature/TemperatureLevel.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.api.temperature;
import net.minecraft.util.Mth;
public enum TemperatureLevel
{
ICY, COLD, NEUTRAL, WARM, HOT;
public TemperatureLevel increment(int amount)
{
return TemperatureLevel.values()[Mth.clamp(this.ordinal() + amount, 0, TemperatureLevel.values().length - 1)];
}
public TemperatureLevel decrement(int amount)
{
return increment(-amount);
}
}
================================================
FILE: common/src/main/java/toughasnails/api/thirst/IThirst.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.api.thirst;
public interface IThirst
{
/**
* Get the level of thirst ranging from 0 to 20.
* @return The thirst level.
*/
int getThirst();
/**
* Get the last level of thirst ranging from 0 to 20.
* @return The thirst level.
*/
int getLastThirst();
/**
* Get the number of thirst ticks.
* @return The number of thirst ticks.
*/
int getTickTimer();
/**
* Get the current hydration level.
* @return The hydration level.
*/
float getHydration();
/**
* Get whether the last hydration value was zero.
* @return Whether the last hydration was zero.
*/
boolean getLastHydrationZero();
/**
* Get the level of thirst exhaustion ranging from 0 to 40.
* @return The level of exhaustion.
*/
float getExhaustion();
/**
* Set the thirst level.
* @param level thirst level
*/
void setThirst(int level);
/**
* Add to the thirst level
* @param thirst amount to add to the thirst level.
*/
void addThirst(int thirst);
/**
* Set the last thirst level.
* @param thirst thirst level
*/
void setLastThirst(int thirst);
/**
* Set the tick timer.
* @param timer tick timer
*/
void setTickTimer(int timer);
/**
* Add ticks to the tick timer
* @param ticks The number of thirst ticks.
*/
void addTicks(int ticks);
/**
* Set the hydration level.
* @param hydration hydration level.
*/
void setHydration(float hydration);
/**
* Set whether the last hydration value was zero.
* @param value value.
*/
void setLastHydrationZero(boolean value);
/**
* Add to the hydration level.
* @param hydration amount of hydration to add.
*/
void addHydration(float hydration);
/**
* Set the exhaustion level.
* @param exhaustion exhaustion level.
*/
void setExhaustion(float exhaustion);
/**
* Add to the exhaustion level.
* @param exhaustion amount of exhaustion to add.
*/
void addExhaustion(float exhaustion);
/**
* Consume a drink with the given thirst and hydration modifier.
* @param thirst amount to add to the thirst level.
* @param hydrationModifier modifier used to determine the amount of hydration to add.
*/
void drink(int thirst, float hydrationModifier);
/**
* Checks whether the player is thirsty or not.
* @return whether the player is thirsty.
*/
boolean isThirsty();
}
================================================
FILE: common/src/main/java/toughasnails/api/thirst/ThirstHelper.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.api.thirst;
import net.minecraft.world.entity.player.Player;
public class ThirstHelper
{
/**
* Obtains the thirst data for a player.
* @param player the player to obtain thirst data for
* @return the player's thirst data
*/
public static IThirst getThirst(Player player)
{
return Impl.INSTANCE.getThirst(player);
}
/**
* Checks whether a player is able to drink.
* @param player the player to check
* @param ignoreThirst allow drinking regardless of the player's thirst level
* @return whether the player can drink
*/
public static boolean canDrink(Player player, boolean ignoreThirst)
{
return Impl.INSTANCE.canDrink(player, ignoreThirst);
}
/**
* Checks whether thirst is enabled.
* @return whether thirst is enabled.
*/
public static boolean isThirstEnabled()
{
return Impl.INSTANCE.isThirstEnabled();
}
/** Internal implementation details */
public static class Impl
{
public static IThirstHelper INSTANCE = null;
public interface IThirstHelper
{
IThirst getThirst(Player player);
boolean canDrink(Player player, boolean ignoreThirst);
boolean isThirstEnabled();
}
}
}
================================================
FILE: common/src/main/java/toughasnails/api/thirst/WaterType.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.api.thirst;
public enum WaterType
{
NORMAL(0.5F), DIRTY(1.0F), PURIFIED(0.0F);
private float poisonChance;
WaterType(float poisonChance)
{
this.poisonChance = poisonChance;
}
public float getPoisonChance()
{
return this.poisonChance;
}
}
================================================
FILE: common/src/main/java/toughasnails/api/village/TANPoiTypes.java
================================================
/*******************************************************************************
* Copyright 2024, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.api.village;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.Identifier;
import net.minecraft.world.entity.ai.village.poi.PoiType;
import toughasnails.api.TANAPI;
public class TANPoiTypes
{
public static final ResourceKey CLIMATOLOGIST = createKey("climatologist");
private static ResourceKey createKey(String name)
{
return ResourceKey.create(Registries.POINT_OF_INTEREST_TYPE, Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, name));
}
}
================================================
FILE: common/src/main/java/toughasnails/api/village/TANVillagerProfessions.java
================================================
/*******************************************************************************
* Copyright 2024, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.api.village;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.Identifier;
import net.minecraft.world.entity.npc.villager.VillagerProfession;
import toughasnails.core.ToughAsNails;
public class TANVillagerProfessions
{
public static final ResourceKey CLIMATOLOGIST = createKey("climatologist");
private static ResourceKey createKey(String name)
{
return ResourceKey.create(Registries.VILLAGER_PROFESSION, Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, name));
}
}
================================================
FILE: common/src/main/java/toughasnails/block/RainCollectorBlock.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.block;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.stats.Stats;
import net.minecraft.util.Mth;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.IntegerProperty;
import net.minecraft.world.level.pathfinder.PathComputationType;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.shapes.BooleanOp;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.Shapes;
import net.minecraft.world.phys.shapes.VoxelShape;
import toughasnails.api.item.TANItems;
public class RainCollectorBlock extends Block
{
private static final VoxelShape INSIDE = box(2.0D, 15.0D, 2.0D, 14.0D, 16.0D, 14.0D);
protected static final VoxelShape SHAPE = Shapes.join(Shapes.block(), Shapes.or(INSIDE), BooleanOp.ONLY_FIRST);
public static final IntegerProperty LEVEL = IntegerProperty.create("level", 0, 3);
public RainCollectorBlock(Properties properties)
{
super(properties);
this.registerDefaultState(this.stateDefinition.any().setValue(LEVEL, Integer.valueOf(0)));
}
@Override
public VoxelShape getShape(BlockState p_151964_, BlockGetter p_151965_, BlockPos p_151966_, CollisionContext p_151967_) {
return SHAPE;
}
@Override
protected InteractionResult useItemOn(ItemStack stack, BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hitResult)
{
if (stack.isEmpty() || stack.getItem() != Items.GLASS_BOTTLE)
return InteractionResult.PASS;
int waterLevel = state.getValue(LEVEL);
if (waterLevel > 0 && !worldIn.isClientSide())
{
if (!player.getAbilities().instabuild)
{
ItemStack newStack = new ItemStack(TANItems.PURIFIED_WATER_BOTTLE);
player.awardStat(Stats.USE_CAULDRON);
stack.shrink(1);
if (stack.isEmpty()) player.setItemInHand(hand, newStack);
else if (!player.getInventory().add(newStack)) player.drop(newStack, false);
else player.inventoryMenu.sendAllDataToRemote();
}
worldIn.playSound(null, pos, SoundEvents.BOTTLE_FILL, SoundSource.BLOCKS, 1.0F, 1.0F);
this.setWaterLevel(worldIn, pos, state, waterLevel - 1);
}
return InteractionResult.SUCCESS;
}
public void setWaterLevel(Level world, BlockPos pos, BlockState state, int level)
{
world.setBlock(pos, state.setValue(LEVEL, Integer.valueOf(Mth.clamp(level, 0, 3))), 2);
world.updateNeighbourForOutputSignal(pos, this);
}
@Override
public void handlePrecipitation(BlockState state, Level level, BlockPos pos, Biome.Precipitation precipitation)
{
if (shouldHandlePrecipitation(level, precipitation) && state.getValue(LEVEL) < 3)
{
level.setBlock(pos, state.cycle(LEVEL), 2);
}
}
protected static boolean shouldHandlePrecipitation(Level level, Biome.Precipitation precipitation)
{
if (precipitation == Biome.Precipitation.RAIN)
{
return level.getRandom().nextFloat() < 0.6F;
}
else if (precipitation == Biome.Precipitation.SNOW)
{
return level.getRandom().nextFloat() < 0.3F;
}
else
{
return false;
}
}
@Override
public boolean hasAnalogOutputSignal(BlockState state)
{
return true;
}
@Override
public int getAnalogOutputSignal(BlockState state, Level world, BlockPos pos, Direction direction)
{
return state.getValue(LEVEL);
}
@Override
protected boolean isPathfindable(BlockState state, PathComputationType pathComputationType)
{
return false;
}
@Override
protected void createBlockStateDefinition(StateDefinition.Builder builder)
{
builder.add(LEVEL);
}
}
================================================
FILE: common/src/main/java/toughasnails/block/TemperatureGaugeBlock.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.block;
import com.mojang.serialization.MapCodec;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.util.Mth;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.BaseEntityBlock;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.RenderShape;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityTicker;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.block.state.properties.BooleanProperty;
import net.minecraft.world.level.block.state.properties.IntegerProperty;
import net.minecraft.world.level.gameevent.GameEvent;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
import toughasnails.api.blockentity.TANBlockEntityTypes;
import toughasnails.api.temperature.TemperatureLevel;
import toughasnails.block.entity.TemperatureGaugeBlockEntity;
import toughasnails.temperature.TemperatureHelperImpl;
import javax.annotation.Nullable;
public class TemperatureGaugeBlock extends BaseEntityBlock
{
public static final MapCodec CODEC = simpleCodec(TemperatureGaugeBlock::new);
protected static final VoxelShape SHAPE = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 6.0D, 16.0D);
public static final IntegerProperty POWER = BlockStateProperties.POWER;
public static final BooleanProperty INVERTED = BlockStateProperties.INVERTED;
@Override
public MapCodec codec()
{
return CODEC;
}
public TemperatureGaugeBlock(Properties properties)
{
super(properties);
this.registerDefaultState(this.stateDefinition.any().setValue(POWER, Integer.valueOf(0)).setValue(INVERTED, false));
}
@Override
protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult)
{
if (player.mayBuild())
{
if (level.isClientSide())
{
return InteractionResult.SUCCESS;
}
else
{
BlockState blockstate = (BlockState)state.cycle(INVERTED);
level.setBlock(pos, blockstate, 2);
level.gameEvent(GameEvent.BLOCK_CHANGE, pos, GameEvent.Context.of(player, blockstate));
updateSignalStrength(blockstate, level, pos);
return InteractionResult.CONSUME;
}
}
else
{
return super.useWithoutItem(state, level, pos, player, hitResult);
}
}
@Override
public VoxelShape getShape(BlockState state, BlockGetter reader, BlockPos pos, CollisionContext selectionContext)
{
return SHAPE;
}
@Override
public RenderShape getRenderShape(BlockState state)
{
return RenderShape.MODEL;
}
@Override
public boolean useShapeForLightOcclusion(BlockState state)
{
return true;
}
@Override
public boolean isSignalSource(BlockState state)
{
return true;
}
@Override
public int getSignal(BlockState state, BlockGetter getter, BlockPos pos, Direction direction)
{
return state.getValue(POWER);
}
@Override
public BlockEntity newBlockEntity(BlockPos $$0, BlockState $$1) {
return new TemperatureGaugeBlockEntity($$0, $$1);
}
@Nullable
@Override
public BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType type)
{
return !level.isClientSide()
? createTickerHelper(type, (BlockEntityType)TANBlockEntityTypes.TEMPERATURE_GAUGE, TemperatureGaugeBlock::tickEntity)
: null;
}
private static void tickEntity(Level level, BlockPos pos, BlockState state, TemperatureGaugeBlockEntity blockEntity)
{
if (level.getGameTime() % 20L == 0L) {
updateSignalStrength(state, level, pos);
}
}
@Override
protected void createBlockStateDefinition(StateDefinition.Builder builder)
{
builder.add(POWER, INVERTED);
}
private static void updateSignalStrength(BlockState state, Level level, BlockPos pos)
{
TemperatureLevel temperatureLevel = TemperatureHelperImpl.getTemperatureAtPosWithoutProximity(level, pos);
int strength;
if (state.getValue(INVERTED)) {
strength = (Mth.clamp(temperatureLevel.ordinal(), 2, 4) - 2) * 8 - 1;
}
else
{
strength = 15 - Mth.clamp(temperatureLevel.ordinal(), 0, 2) * 8;
}
strength = Mth.clamp(strength, 0, 15);
if (state.getValue(POWER) != strength) {
level.setBlock(pos, state.setValue(POWER, strength), 3);
}
}
}
================================================
FILE: common/src/main/java/toughasnails/block/ThermoregulatorBlock.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.block;
import com.mojang.serialization.MapCodec;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.particles.ParticleOptions;
import net.minecraft.util.RandomSource;
import net.minecraft.world.Containers;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.*;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityTicker;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.block.state.properties.BooleanProperty;
import net.minecraft.world.level.block.state.properties.EnumProperty;
import net.minecraft.world.level.redstone.Orientation;
import net.minecraft.world.phys.BlockHitResult;
import toughasnails.api.blockentity.TANBlockEntityTypes;
import toughasnails.api.particle.TANParticles;
import toughasnails.block.entity.ThermoregulatorBlockEntity;
import javax.annotation.Nullable;
import java.util.function.ToIntFunction;
public class ThermoregulatorBlock extends BaseEntityBlock
{
public static final MapCodec CODEC = simpleCodec(WaterPurifierBlock::new);
public static final EnumProperty FACING = HorizontalDirectionalBlock.FACING;
public static final BooleanProperty COOLING = BooleanProperty.create("cooling");
public static final BooleanProperty HEATING = BooleanProperty.create("heating");
public static final BooleanProperty ENABLED = BlockStateProperties.ENABLED;
public ThermoregulatorBlock(Properties properties)
{
super(properties);
this.registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.NORTH).setValue(COOLING, false).setValue(HEATING, false).setValue(ENABLED, true));
}
@Override
protected MapCodec extends BaseEntityBlock> codec()
{
return CODEC;
}
@Override
protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult)
{
if (level.isClientSide())
{
return InteractionResult.SUCCESS;
}
else
{
player.openMenu(state.getMenuProvider(level, pos));
return InteractionResult.CONSUME;
}
}
@Override
public BlockEntity newBlockEntity(BlockPos pos, BlockState state)
{
return new ThermoregulatorBlockEntity(pos, state);
}
@Override
@Nullable
public BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType type)
{
return level.isClientSide() ? null : createTickerHelper(type, (BlockEntityType) TANBlockEntityTypes.THERMOREGULATOR, ThermoregulatorBlockEntity::serverTick);
}
public static ToIntFunction lightLevel(int level)
{
return (state) -> {
boolean cooling = state.getValue(COOLING);
boolean heating = state.getValue(HEATING);
return ((cooling ? 1: 0) + (heating ? 1: 0)) * level;
};
}
@Override
public BlockState getStateForPlacement(BlockPlaceContext $$0) {
return (BlockState)this.defaultBlockState().setValue(FACING, $$0.getHorizontalDirection().getOpposite()).setValue(ENABLED, true);
}
@Override
public BlockState rotate(BlockState $$0, Rotation $$1) {
return (BlockState)$$0.setValue(FACING, $$1.rotate((Direction)$$0.getValue(FACING)));
}
@Override
public BlockState mirror(BlockState $$0, Mirror $$1) {
return $$0.rotate($$1.getRotation((Direction)$$0.getValue(FACING)));
}
@Override
protected void createBlockStateDefinition(StateDefinition.Builder builder)
{
builder.add(FACING, COOLING, HEATING, ENABLED);
}
@Override
public RenderShape getRenderShape(BlockState state)
{
return RenderShape.MODEL;
}
@Override
public void onPlace(BlockState state, Level level, BlockPos $$2, BlockState $$3, boolean $$4)
{
if (!$$3.is(state.getBlock())) {
this.checkPoweredState(level, $$2, state);
}
}
@Override
public void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, Orientation orientation, boolean movedByPiston)
{
this.checkPoweredState(level, pos, state);
}
private void checkPoweredState(Level level, BlockPos pos, BlockState state)
{
boolean flag = !level.hasNeighborSignal(pos);
if (flag != state.getValue(ENABLED)) {
level.setBlock(pos, state.setValue(ENABLED, Boolean.valueOf(flag)), 2);
}
}
@Override
public boolean hasAnalogOutputSignal(BlockState state)
{
return true;
}
@Override
public int getAnalogOutputSignal(BlockState state, Level level, BlockPos pos, Direction direction)
{
return AbstractContainerMenu.getRedstoneSignalFromBlockEntity(level.getBlockEntity(pos));
}
@Override
public void animateTick(BlockState p_221253_, Level p_221254_, BlockPos p_221255_, RandomSource p_221256_)
{
boolean cooling = p_221253_.getValue(COOLING);
boolean heating = p_221253_.getValue(HEATING);
Direction direction = p_221253_.getValue(FACING);
Direction.Axis direction$axis = direction.getAxis();
BlockPos blockpos = p_221255_.relative(direction);
BlockState blockstate = p_221254_.getBlockState(blockpos);
if ((cooling || heating) && !isFaceFull(blockstate.getCollisionShape(p_221254_, blockpos), direction.getOpposite()))
{
double d0 = (double)p_221255_.getX() + 0.5D;
double d1 = (double)p_221255_.getY() + 0.5D;
double d2 = (double)p_221255_.getZ() + 0.5D;
double d4 = (p_221256_.nextDouble() * 0.3D) - (p_221256_.nextDouble() * 0.3D);
double d5 = direction$axis == Direction.Axis.X ? (double)direction.getStepX() * 0.55D : d4;
double d6 = direction$axis == Direction.Axis.Z ? (double)direction.getStepZ() * 0.55D : d4;
double ymove = (p_221256_.nextDouble() * 0.05D) - (p_221256_.nextDouble() * 0.05D);
double xmove = direction$axis == Direction.Axis.X ? (double)direction.getStepX() * 0.15D : ymove;
double zmove = direction$axis == Direction.Axis.Z ? (double)direction.getStepZ() * 0.15D : ymove;
ParticleOptions particle = TANParticles.THERMOREGULATOR_NEUTRAL;
if (cooling && !heating) { particle = TANParticles.THERMOREGULATOR_COOL; }
if (!cooling && heating) { particle = TANParticles.THERMOREGULATOR_WARM; }
p_221254_.addParticle(particle, d0 + d5, d1 + d4, d2 + d6, xmove, ymove, zmove);
}
}
}
================================================
FILE: common/src/main/java/toughasnails/block/WaterPurifierBlock.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.block;
import com.mojang.serialization.MapCodec;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.component.DataComponents;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.util.RandomSource;
import net.minecraft.world.Containers;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.*;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityTicker;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.BooleanProperty;
import net.minecraft.world.level.block.state.properties.EnumProperty;
import net.minecraft.world.phys.BlockHitResult;
import toughasnails.api.blockentity.TANBlockEntityTypes;
import toughasnails.block.entity.WaterPurifierBlockEntity;
import javax.annotation.Nullable;
public class WaterPurifierBlock extends BaseEntityBlock
{
public static final MapCodec CODEC = simpleCodec(WaterPurifierBlock::new);
public static final EnumProperty FACING = HorizontalDirectionalBlock.FACING;
public static final BooleanProperty PURIFYING = BooleanProperty.create("filtering");
public WaterPurifierBlock(Properties builderIn)
{
super(builderIn);
this.registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.NORTH).setValue(PURIFYING, Boolean.valueOf(false)));
}
@Override
protected MapCodec extends BaseEntityBlock> codec()
{
return CODEC;
}
@Override
protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult blockHitResult)
{
if (level.isClientSide())
{
return InteractionResult.SUCCESS;
}
else
{
player.openMenu(state.getMenuProvider(level, pos));
return InteractionResult.CONSUME;
}
}
@Override
public BlockEntity newBlockEntity(BlockPos pos, BlockState state)
{
return new WaterPurifierBlockEntity(pos, state);
}
@Override
@Nullable
public BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType type)
{
return level.isClientSide() ? null : createTickerHelper(type, (BlockEntityType) TANBlockEntityTypes.WATER_PURIFIER, WaterPurifierBlockEntity::serverTick);
}
@Override
public BlockState getStateForPlacement(BlockPlaceContext context)
{
return this.defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite());
}
@Override
public boolean hasAnalogOutputSignal(BlockState state)
{
return true;
}
@Override
public int getAnalogOutputSignal(BlockState blockState, Level worldIn, BlockPos pos, Direction direction)
{
return AbstractContainerMenu.getRedstoneSignalFromBlockEntity(worldIn.getBlockEntity(pos));
}
@Override
public BlockState rotate(BlockState state, Rotation rot)
{
return state.setValue(FACING, rot.rotate(state.getValue(FACING)));
}
@Override
public BlockState mirror(BlockState state, Mirror mirror)
{
return state.rotate(mirror.getRotation(state.getValue(FACING)));
}
@Override
protected void createBlockStateDefinition(StateDefinition.Builder builder)
{
builder.add(FACING, PURIFYING);
}
@Override
public RenderShape getRenderShape(BlockState state)
{
return RenderShape.MODEL;
}
@Override
public void animateTick(BlockState p_221253_, Level p_221254_, BlockPos p_221255_, RandomSource p_221256_)
{
if (p_221253_.getValue(PURIFYING) && p_221256_.nextInt(12) == 0)
{
double d0 = (double)p_221255_.getX() + 0.5D;
double d1 = (double)p_221255_.getY() + 0.4D;
double d2 = (double)p_221255_.getZ() + 0.5D;
Direction direction = p_221253_.getValue(FACING);
Direction.Axis direction$axis = direction.getAxis();
double d4 = p_221256_.nextDouble() * 0.4D - 0.2D;
double d5 = direction$axis == Direction.Axis.X ? (double)direction.getStepX() * 0.55D : d4;
double d6 = p_221256_.nextDouble() * 1.0D / 16.0D;
double d7 = direction$axis == Direction.Axis.Z ? (double)direction.getStepZ() * 0.55D : d4;
p_221254_.addParticle(ParticleTypes.DRIPPING_WATER, d0 + d5, d1 + d6, d2 + d7, 0.0D, 0.0D, 0.0D);
}
}
}
================================================
FILE: common/src/main/java/toughasnails/block/entity/TemperatureGaugeBlockEntity.java
================================================
/*******************************************************************************
* Copyright 2023, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.block.entity;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import toughasnails.api.blockentity.TANBlockEntityTypes;
public class TemperatureGaugeBlockEntity extends BlockEntity
{
public TemperatureGaugeBlockEntity(BlockPos pos, BlockState state) {
super(TANBlockEntityTypes.TEMPERATURE_GAUGE, pos, state);
}
}
================================================
FILE: common/src/main/java/toughasnails/block/entity/ThermoregulatorBlockEntity.java
================================================
/*******************************************************************************
* Copyright 2023, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.block.entity;
import com.google.common.collect.ImmutableSet;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.NonNullList;
import net.minecraft.nbt.*;
import net.minecraft.network.chat.Component;
import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.Container;
import net.minecraft.world.ContainerHelper;
import net.minecraft.world.WorldlyContainer;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.ContainerData;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BaseContainerBlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.storage.ValueInput;
import net.minecraft.world.level.storage.ValueOutput;
import net.minecraft.world.phys.AABB;
import org.jetbrains.annotations.Nullable;
import toughasnails.api.blockentity.TANBlockEntityTypes;
import toughasnails.api.temperature.ITemperature;
import toughasnails.api.temperature.TemperatureHelper;
import toughasnails.block.ThermoregulatorBlock;
import toughasnails.container.ThermoregulatorContainer;
import toughasnails.core.ToughAsNails;
import toughasnails.init.ModTags;
import toughasnails.temperature.AreaFill;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
public class ThermoregulatorBlockEntity extends BaseContainerBlockEntity implements WorldlyContainer
{
/** Radius at which to inform players of a nearby thermoregulator **/
public static final int INFORM_PLAYER_RADIUS = 20;
private static final int SPREAD_RADIUS = 16;
public static final int CONSUMABLE_DURATION = 1600;
public static final int SLOT_COOLING = 0;
public static final int SLOT_HEATING = 1;
private NonNullList items = NonNullList.withSize(2, ItemStack.EMPTY);
private int coolingTimeRemaining;
private int heatingTimeRemaining;
private int fillTimer = 0;
private Set filledBlocks = new HashSet<>();
protected final ContainerData dataAccess = new ContainerData()
{
@Override
public int get(int index)
{
switch(index) {
case 0:
return ThermoregulatorBlockEntity.this.coolingTimeRemaining;
case 1:
return ThermoregulatorBlockEntity.this.heatingTimeRemaining;
default:
return 0;
}
}
@Override
public void set(int index, int value)
{
switch(index) {
case 0:
ThermoregulatorBlockEntity.this.coolingTimeRemaining = value;
break;
case 1:
ThermoregulatorBlockEntity.this.heatingTimeRemaining = value;
break;
}
}
@Override
public int getCount()
{
return 2;
}
};
public ThermoregulatorBlockEntity(BlockPos pos, BlockState state)
{
super(TANBlockEntityTypes.THERMOREGULATOR, pos, state);
}
@Override
public void loadAdditional(ValueInput input)
{
super.loadAdditional(input);
this.items = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY);
ContainerHelper.loadAllItems(input, this.items);
this.coolingTimeRemaining = input.getInt("CoolingTimeRemaining").orElse(0);
this.heatingTimeRemaining = input.getInt("HeatingTimeRemaining").orElse(0);
this.fillTimer = input.getInt("FillTimer").orElse(0);
ValueInput.TypedInputList list = input.listOrEmpty("FilledBlocks", BlockPos.CODEC);
list.forEach(pos -> this.filledBlocks.add(pos));
this.filledBlocks = new HashSet<>();
}
@Override
public void saveAdditional(ValueOutput output)
{
super.saveAdditional(output);
output.putInt("CoolingTimeRemaining", this.coolingTimeRemaining);
output.putInt("HeatingTimeRemaining", this.heatingTimeRemaining);
output.putInt("FillTimer", this.fillTimer);
ValueOutput.TypedOutputList list = output.list("FilledBlocks", BlockPos.CODEC);
this.filledBlocks.stream().forEach(pos -> {
list.add(pos);
});
ContainerHelper.saveAllItems(output, this.items);
}
@Override
public ClientboundBlockEntityDataPacket getUpdatePacket()
{
return ClientboundBlockEntityDataPacket.create(this);
}
@Override
public CompoundTag getUpdateTag(HolderLookup.Provider lookup)
{
return this.saveCustomOnly(lookup);
}
public static void serverTick(Level level, BlockPos pos, BlockState state, ThermoregulatorBlockEntity blockEntity)
{
boolean previouslyCooling = blockEntity.isCooling();
boolean previouslyHeating = blockEntity.isHeating();
boolean changed = false;
if (!state.getValue(ThermoregulatorBlock.ENABLED))
{
blockEntity.filledBlocks.clear();
if (state.getValue(ThermoregulatorBlock.COOLING) || state.getValue(ThermoregulatorBlock.HEATING))
{
state = state.setValue(ThermoregulatorBlock.COOLING, false).setValue(ThermoregulatorBlock.HEATING, false);
level.setBlock(pos, state, 3);
setChanged(level, pos, state);
}
return;
}
if (blockEntity.isCooling()) --blockEntity.coolingTimeRemaining;
if (blockEntity.isHeating()) --blockEntity.heatingTimeRemaining;
if (!blockEntity.isCooling())
{
ItemStack fuel = blockEntity.items.get(SLOT_COOLING);
if (!fuel.isEmpty())
{
Item fuelItem = fuel.getItem();
blockEntity.coolingTimeRemaining = CONSUMABLE_DURATION;
changed = true;
fuel.shrink(1);
if (fuel.isEmpty())
{
blockEntity.items.set(SLOT_COOLING, fuelItem.getCraftingRemainder());
}
}
}
if (!blockEntity.isHeating())
{
ItemStack fuel = blockEntity.items.get(SLOT_HEATING);
if (!fuel.isEmpty())
{
Item fuelItem = fuel.getItem();
blockEntity.heatingTimeRemaining = CONSUMABLE_DURATION;
changed = true;
fuel.shrink(1);
if (fuel.isEmpty())
{
blockEntity.items.set(SLOT_HEATING, fuelItem.getCraftingRemainder());
}
}
}
if (state.getValue(ThermoregulatorBlock.COOLING) != blockEntity.isCooling())
{
changed = true;
state = state.setValue(ThermoregulatorBlock.COOLING, blockEntity.isCooling());
level.setBlock(pos, state, 3);
}
if (state.getValue(ThermoregulatorBlock.HEATING) != blockEntity.isHeating())
{
changed = true;
state = state.setValue(ThermoregulatorBlock.HEATING, blockEntity.isHeating());
level.setBlock(pos, state, 3);
}
if (!blockEntity.isHeating() && !blockEntity.isCooling())
{
blockEntity.filledBlocks.clear();
}
// Fill every second
if ((blockEntity.isCooling() || blockEntity.isHeating()) && blockEntity.fillTimer % 20 == 0)
{
// Update nearby thermoregulators for players
for (ServerPlayer player : level.getEntitiesOfClass(ServerPlayer.class, new AABB(pos.getX(), pos.getY(), pos.getZ(), pos.getX(), pos.getY() - 4, pos.getZ()).inflate(INFORM_PLAYER_RADIUS, (double) INFORM_PLAYER_RADIUS / 2.0, INFORM_PLAYER_RADIUS))) {
ITemperature temperature = TemperatureHelper.getTemperatureData(player);
temperature.getNearbyThermoregulators().add(pos);
}
// Perform fill
BlockPos fillStart = pos.relative(state.getValue(ThermoregulatorBlock.FACING));
blockEntity.filledBlocks.clear();
AreaFill.fill(level, fillStart, new AreaFill.PositionChecker() {
@Override
public void onSolid(Level level, AreaFill.FillPos pos) {}
@Override
public void onPassable(Level level, AreaFill.FillPos pos)
{
blockEntity.filledBlocks.add(pos.pos());
}
@Override
public boolean isPassable(Level level, AreaFill.FillPos pos)
{
BlockState state = level.getBlockState(pos.pos());
return isConfined(level, pos.pos()) && (state.isAir() || state.is(ModTags.Blocks.PASSABLE_BLOCKS) || !isFlowBlocking(level, pos, state));
}
}, SPREAD_RADIUS);
changed = true;
}
++blockEntity.fillTimer;
// Mark as changed
if (changed)
{
setChanged(level, pos, state);
level.sendBlockUpdated(pos, state, state, 3);
}
}
public Effect getEffectAtPos(BlockPos pos)
{
if (this.filledBlocks.contains(pos)) return this.getEffect();
else return Effect.NONE;
}
public ImmutableSet getFilledBlocks()
{
return ImmutableSet.copyOf(this.filledBlocks);
}
public Effect getEffect()
{
boolean cooling = isCooling();
boolean heating = isHeating();
if (cooling && heating) return Effect.NEUTRALIZING;
else if (cooling) return Effect.COOLING;
else if (heating) return Effect.HEATING;
else return Effect.NONE;
}
public boolean isCooling()
{
return this.coolingTimeRemaining > 0;
}
public boolean isHeating()
{
return this.heatingTimeRemaining > 0;
}
@Override
public boolean stillValid(Player player)
{
return Container.stillValidBlockEntity(this, player);
}
@Override
protected AbstractContainerMenu createMenu(int id, Inventory player)
{
return new ThermoregulatorContainer(id, player, this, this.dataAccess);
}
@Override
protected Component getDefaultName()
{
return Component.translatable("container.toughasnails.thermoregulator");
}
@Override
public int[] getSlotsForFace(Direction direction)
{
if (direction == Direction.UP)
return new int[]{SLOT_COOLING, SLOT_HEATING};
BlockState state = this.getBlockState();
Direction facing = state.getValue(ThermoregulatorBlock.FACING);
if (facing.getClockWise() == direction) return new int[]{SLOT_COOLING};
else if (facing.getCounterClockWise() == direction) return new int[]{SLOT_HEATING};
else return new int[]{};
}
@Override
public boolean canPlaceItemThroughFace(int index, ItemStack stack, @Nullable Direction direction)
{
return this.canPlaceItem(index, stack);
}
@Override
public boolean canPlaceItem(int index, ItemStack stack)
{
if (index == SLOT_COOLING) return isCoolingFuel(stack);
else if (index == SLOT_HEATING) return isHeatingFuel(stack);
else return false;
}
@Override
public boolean canTakeItemThroughFace(int index, ItemStack stack, Direction direction) {
return false;
}
@Override
public int getContainerSize()
{
return this.items.size();
}
@Override
public boolean isEmpty()
{
for (ItemStack itemstack : this.items)
{
if (!itemstack.isEmpty()) {
return false;
}
}
return true;
}
@Override
public ItemStack getItem(int index)
{
return this.items.get(index);
}
@Override
public ItemStack removeItem(int index, int count)
{
return ContainerHelper.removeItem(this.items, index, count);
}
@Override
protected NonNullList getItems()
{
return this.items;
}
@Override
protected void setItems(NonNullList items)
{
this.items = items;
}
@Override
public ItemStack removeItemNoUpdate(int index)
{
return ContainerHelper.takeItem(this.items, index);
}
@Override
public void setItem(int index, ItemStack stack)
{
ItemStack currentStack = this.items.get(index);
boolean sameItem = !stack.isEmpty() && ItemStack.isSameItemSameComponents(stack, currentStack);
this.items.set(index, stack);
if (stack.getCount() > this.getMaxStackSize())
{
stack.setCount(this.getMaxStackSize());
}
if (!sameItem)
{
this.setChanged();
}
}
@Override
public void clearContent()
{
this.items.clear();
}
public static boolean isCoolingFuel(ItemStack stack)
{
return stack.is(ModTags.Items.THERMOREGULATOR_COOLING_FUEL);
}
public static boolean isHeatingFuel(ItemStack stack)
{
return stack.is(ModTags.Items.THERMOREGULATOR_HEATING_FUEL);
}
public enum Effect
{
COOLING, HEATING, NEUTRALIZING, NONE;
}
}
================================================
FILE: common/src/main/java/toughasnails/block/entity/WaterPurifierBlockEntity.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.block.entity;
import com.google.common.collect.ImmutableMap;
import net.minecraft.core.*;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.tags.ItemTags;
import net.minecraft.tags.TagKey;
import net.minecraft.util.Mth;
import net.minecraft.world.ContainerHelper;
import net.minecraft.world.WorldlyContainer;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.ContainerData;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.*;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BaseContainerBlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.storage.ValueInput;
import net.minecraft.world.level.storage.ValueOutput;
import toughasnails.api.blockentity.TANBlockEntityTypes;
import toughasnails.api.crafting.TANRecipeTypes;
import toughasnails.block.WaterPurifierBlock;
import toughasnails.container.WaterPurifierMenu;
import toughasnails.crafting.WaterPurifierRecipe;
import javax.annotation.Nullable;
import java.util.Iterator;
public class WaterPurifierBlockEntity extends BaseContainerBlockEntity implements WorldlyContainer
{
protected static final int SLOT_INPUT = 0;
protected static final int SLOT_FILTER = 1;
protected static final int SLOT_RESULT = 2;
private static final int[] SLOTS_FOR_UP = new int[]{SLOT_INPUT};
private static final int[] SLOTS_FOR_DOWN = new int[]{SLOT_RESULT, SLOT_FILTER};
private static final int[] SLOTS_FOR_SIDES = new int[]{SLOT_FILTER};
private NonNullList items = NonNullList.withSize(3, ItemStack.EMPTY);
/** The time remaining from the previously used filter */
private int filterTimeRemaining;
/** The total duration associated with the previously used filter */
private int filterDuration;
/** The progress towards meeting the total purify time. */
private int purifyProgress;
/** The total time needed to complete purification. */
private int purifyTotalTime;
private final RecipeManager.CachedCheck> quickCheck;
protected final ContainerData dataAccess = new ContainerData()
{
@Override
public int get(int index)
{
switch(index) {
case 0:
return WaterPurifierBlockEntity.this.filterTimeRemaining;
case 1:
return WaterPurifierBlockEntity.this.filterDuration;
case 2:
return WaterPurifierBlockEntity.this.purifyProgress;
case 3:
return WaterPurifierBlockEntity.this.purifyTotalTime;
default:
return 0;
}
}
@Override
public void set(int index, int value)
{
switch(index) {
case 0:
WaterPurifierBlockEntity.this.filterTimeRemaining = value;
break;
case 1:
WaterPurifierBlockEntity.this.filterDuration = value;
break;
case 2:
WaterPurifierBlockEntity.this.purifyProgress = value;
break;
case 3:
WaterPurifierBlockEntity.this.purifyTotalTime = value;
}
}
@Override
public int getCount()
{
return 4;
}
};
public WaterPurifierBlockEntity(BlockPos pos, BlockState state)
{
super(TANBlockEntityTypes.WATER_PURIFIER, pos, state);
this.quickCheck = RecipeManager.createCheck(TANRecipeTypes.WATER_PURIFYING);
}
@Override
protected void loadAdditional(ValueInput input)
{
super.loadAdditional(input);
this.items = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY);
ContainerHelper.loadAllItems(input, this.items);
this.filterTimeRemaining = input.getInt("FilterTimeRemaining").orElse(0);
this.filterDuration = input.getInt("FilterDuration").orElse(0);
this.purifyProgress = input.getInt("PurifyProgress").orElse(0);
this.purifyTotalTime = input.getInt("PurifyTotalTime").orElse(0);
}
@Override
protected void saveAdditional(ValueOutput output)
{
super.saveAdditional(output);
output.putInt("FilterTimeRemaining", this.filterTimeRemaining);
output.putInt("FilterDuration", this.filterDuration);
output.putInt("PurifyProgress", this.purifyProgress);
output.putInt("PurifyTotalTime", this.purifyTotalTime);
ContainerHelper.saveAllItems(output, this.items);
}
public static void serverTick(Level level, BlockPos pos, BlockState state, WaterPurifierBlockEntity blockEntity)
{
boolean previouslyFiltering = blockEntity.isFiltering();
boolean changed = false;
if (blockEntity.isFiltering())
{
--blockEntity.filterTimeRemaining;
}
ItemStack filterStack = blockEntity.items.get(1);
boolean hasFilter = !filterStack.isEmpty();
if (blockEntity.isFiltering() || hasFilter && !blockEntity.items.get(0).isEmpty()) {
RecipeHolder extends Recipe> recipe = blockEntity.quickCheck.getRecipeFor(new SingleRecipeInput(blockEntity.items.get(0)), (ServerLevel)level).orElse(null);
if (recipe != null)
{
if (!blockEntity.isFiltering() && blockEntity.canFilter(recipe.value())) {
blockEntity.filterTimeRemaining = blockEntity.getFilterDuration(filterStack);
blockEntity.filterDuration = blockEntity.filterTimeRemaining;
// If we are now filtering, consume the filter item
if (blockEntity.isFiltering()) {
changed = true;
if (hasFilter)
{
Item filter = filterStack.getItem();
filterStack.shrink(1);
if (filterStack.isEmpty())
{
blockEntity.items.set(1, filter.getCraftingRemainder());
}
}
}
}
if (blockEntity.isFiltering() && blockEntity.canFilter(recipe.value())) {
++blockEntity.purifyProgress;
if (blockEntity.purifyProgress == blockEntity.purifyTotalTime) {
blockEntity.purifyProgress = 0;
blockEntity.purifyTotalTime = blockEntity.getTotalPurifyTime();
blockEntity.filter(recipe.value());
changed = true;
}
} else {
blockEntity.purifyProgress = 0;
}
} else if (!blockEntity.isFiltering() && blockEntity.purifyProgress > 0) {
blockEntity.purifyProgress = Mth.clamp(blockEntity.purifyProgress - 2, 0, blockEntity.purifyTotalTime);
}
}
if (previouslyFiltering != blockEntity.isFiltering())
{
changed = true;
state = state.setValue(WaterPurifierBlock.PURIFYING, blockEntity.isFiltering());
level.setBlock(pos, state, 3);
}
// Mark as changed
if (changed) setChanged(level, pos, state);
}
@Override
protected AbstractContainerMenu createMenu(int id, Inventory player)
{
return new WaterPurifierMenu(id, player, this, this.dataAccess);
}
@Override
protected Component getDefaultName()
{
return Component.translatable("container.toughasnails.water_purifier");
}
@Override
protected NonNullList getItems()
{
return this.items;
}
@Override
protected void setItems(NonNullList items)
{
this.items = items;
}
@Override
public int[] getSlotsForFace(Direction side)
{
switch (side)
{
case DOWN:
return SLOTS_FOR_DOWN;
case UP:
return SLOTS_FOR_UP;
default:
return SLOTS_FOR_SIDES;
}
}
@Override
public boolean canPlaceItem(int slot, ItemStack stack)
{
if (slot == SLOT_RESULT) return false;
else if (slot != SLOT_FILTER) return true;
else
{
return isFilter(stack);
}
}
@Override
public boolean canPlaceItemThroughFace(int index, ItemStack stack, @Nullable Direction direction)
{
return this.canPlaceItem(index, stack);
}
@Override
public boolean canTakeItemThroughFace(int index, ItemStack stack, Direction direction)
{
return !(direction == Direction.DOWN && index == SLOT_FILTER);
}
@Override
public int getContainerSize()
{
return this.items.size();
}
@Override
public boolean isEmpty()
{
for (ItemStack itemstack : this.items)
{
if (!itemstack.isEmpty()) {
return false;
}
}
return true;
}
@Override
public ItemStack getItem(int index)
{
return this.items.get(index);
}
@Override
public ItemStack removeItem(int index, int count)
{
return ContainerHelper.removeItem(this.items, index, count);
}
@Override
public ItemStack removeItemNoUpdate(int index)
{
return ContainerHelper.takeItem(this.items, index);
}
@Override
public void setItem(int index, ItemStack stack)
{
ItemStack currentStack = this.items.get(index);
boolean sameItem = !stack.isEmpty() && ItemStack.isSameItemSameComponents(stack, currentStack);
this.items.set(index, stack);
if (stack.getCount() > this.getMaxStackSize())
{
stack.setCount(this.getMaxStackSize());
}
// Update the purify time for the new input
if (index == 0 && !sameItem)
{
this.purifyTotalTime = this.getTotalPurifyTime();
this.purifyProgress = 0;
this.setChanged();
}
}
@Override
public boolean stillValid(Player player)
{
if (this.level.getBlockEntity(this.worldPosition) != this)
{
return false;
}
else
{
return player.distanceToSqr((double)this.worldPosition.getX() + 0.5D, (double)this.worldPosition.getY() + 0.5D, (double)this.worldPosition.getZ() + 0.5D) <= 64.0D;
}
}
@Override
public void clearContent()
{
this.items.clear();
}
public boolean isFiltering()
{
return this.filterTimeRemaining > 0;
}
protected boolean canFilter(@Nullable Recipe recipe)
{
if (!this.items.get(0).isEmpty() && recipe != null)
{
ItemStack input = this.items.get(0);
ItemStack recipeResult = recipe.assemble(new SingleRecipeInput(input), this.level.registryAccess());
// Invalid recipe result
if (recipeResult.isEmpty())
return false;
ItemStack currentResult = this.items.get(2);
// Result slot is free, we're good to go
if (currentResult.isEmpty())
return true;
// The item can't be filtered if the existing item in the result slot isn't the same as this
if (!ItemStack.isSameItem(currentResult, recipeResult))
return false;
if (currentResult.getCount() + recipeResult.getCount() <= this.getMaxStackSize() && currentResult.getCount() + recipeResult.getCount() <= currentResult.getMaxStackSize())
{
return true;
}
else
{
return currentResult.getCount() + recipeResult.getCount() <= recipeResult.getMaxStackSize();
}
}
else return false;
}
/** Get the time taken for an input item to be purified. */
protected int getTotalPurifyTime()
{
SingleRecipeInput singlerecipeinput = new SingleRecipeInput(this.items.get(0));
return this.quickCheck.getRecipeFor(singlerecipeinput, (ServerLevel)this.level).map(p_379263_ -> ((WaterPurifierRecipe)p_379263_.value()).getPurifyTime()).orElse(200);
}
private void filter(@Nullable Recipe recipe)
{
if (recipe != null && this.canFilter(recipe))
{
ItemStack input = this.items.get(0);
ItemStack recipeResult = recipe.assemble(new SingleRecipeInput(input), this.level.registryAccess());
ItemStack currentResult = this.items.get(2);
// Update the result stuck
if (currentResult.isEmpty())
{
this.items.set(2, recipeResult.copy());
}
else if (currentResult.getItem() == recipeResult.getItem())
{
currentResult.grow(recipeResult.getCount());
}
// Reduce the input stack
input.shrink(1);
}
}
public static boolean isFilter(ItemStack stack)
{
return getFilterDuration(stack) > 0;
}
public static int getFilterDuration(ItemStack filter)
{
if (filter == null || filter.isEmpty())
return 0;
return getFilterDurations().getOrDefault(filter.getItem(), 0);
}
private static ImmutableMap- getFilterDurations()
{
ImmutableMap.Builder
- builder = ImmutableMap.builder();
add(builder, Items.SHORT_GRASS, 100);
add(builder, Items.PAPER, 200);
add(builder, Items.GRAVEL, 400);
add(builder, ItemTags.SAND, 800);
add(builder, Items.CHARCOAL, 1600);
add(builder, Items.PRISMARINE_CRYSTALS, 3200);
add(builder, Items.HEART_OF_THE_SEA, 6400);
return builder.build();
}
private static void add(ImmutableMap.Builder
- builder, TagKey
- tagKey, int i)
{
Iterator var3 = BuiltInRegistries.ITEM.getTagOrEmpty(tagKey).iterator();
while(var3.hasNext())
{
Holder
- holder = (Holder)var3.next();
builder.put(holder.value(), i);
}
}
private static void add(ImmutableMap.Builder
- builder, Item item, int i)
{
builder.put(item, i);
}
}
================================================
FILE: common/src/main/java/toughasnails/client/gui/ThermoregulatorScreen.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.client.gui;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.client.renderer.RenderPipelines;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import net.minecraft.world.entity.player.Inventory;
import toughasnails.api.TANAPI;
import toughasnails.container.ThermoregulatorContainer;
public class ThermoregulatorScreen extends AbstractContainerScreen
{
private static final Identifier TEXTURE = Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "textures/gui/container/thermoregulator.png");
public ThermoregulatorScreen(ThermoregulatorContainer screenContainer, Inventory inv, Component titleIn)
{
super(screenContainer, inv, titleIn);
}
public void init()
{
super.init();
this.leftPos = (this.width - this.imageWidth) / 2;
this.titleLabelX = (this.imageWidth - this.font.width(this.title)) / 2;
}
@Override
public void render(GuiGraphics gui, int mouseX, int mouseY, float partialTicks)
{
this.renderBackground(gui, mouseX, mouseY, partialTicks);
super.render(gui, mouseX, mouseY, partialTicks);
this.renderTooltip(gui, mouseX, mouseY);
}
@Override
protected void renderBg(GuiGraphics gui, float partialTicks, int mouseX, int mouseY)
{
int leftPos = this.leftPos;
int topPos = this.topPos;
gui.blit(RenderPipelines.GUI_TEXTURED, TEXTURE, leftPos, topPos, 0, 0, this.imageWidth, this.imageHeight, 256, 256);
if (this.menu.isCooling())
{
int progress = this.menu.getCoolingFuelProgress();
gui.blit(RenderPipelines.GUI_TEXTURED, TEXTURE, leftPos + 44 + 1, topPos + 25 + 13 - progress, 176, 13 - progress, 14, progress + 1, 256, 256);
}
if (this.menu.isHeating())
{
int progress = this.menu.getHeatingFuelProgress();
gui.blit(RenderPipelines.GUI_TEXTURED, TEXTURE, leftPos + 116 + 1, topPos + 25 + 13 - progress, 176, 27 - progress, 14, progress + 1, 256, 256);
}
}
}
================================================
FILE: common/src/main/java/toughasnails/client/gui/WaterPurifierScreen.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.client.gui;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.client.renderer.RenderPipelines;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import net.minecraft.world.entity.player.Inventory;
import toughasnails.api.TANAPI;
import toughasnails.container.WaterPurifierMenu;
public class WaterPurifierScreen extends AbstractContainerScreen
{
private static final Identifier TEXTURE = Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "textures/gui/container/water_purifier.png");
public WaterPurifierScreen(WaterPurifierMenu screenContainer, Inventory inv, Component titleIn)
{
super(screenContainer, inv, titleIn);
}
public void init()
{
super.init();
this.leftPos = (this.width - this.imageWidth) / 2;
this.titleLabelX = (this.imageWidth - this.font.width(this.title)) / 2;
}
@Override
public void render(GuiGraphics gui, int mouseX, int mouseY, float partialTicks)
{
this.renderBackground(gui, mouseX, mouseY, partialTicks);
super.render(gui, mouseX, mouseY, partialTicks);
this.renderTooltip(gui, mouseX, mouseY);
}
@Override
protected void renderBg(GuiGraphics gui, float partialTicks, int mouseX, int mouseY)
{
int leftPos = this.leftPos;
int topPos = this.topPos;
gui.blit(RenderPipelines.GUI_TEXTURED, TEXTURE, leftPos, topPos, 0, 0, this.imageWidth, this.imageHeight, 256, 256);
if (this.menu.isFiltering())
{
int filterProgress = this.menu.getFilterProgress();
// NOTE: This is moved over right by 1 compared to the furnace
// stack, x, y, u, v, width, height
gui.blit(RenderPipelines.GUI_TEXTURED, TEXTURE, leftPos + 56 + 1, topPos + 36 + 13 - filterProgress, 176, 13 - filterProgress, 14, filterProgress + 1, 256, 256);
}
int purifyProgress = this.menu.getPurifyProgress();
gui.blit(RenderPipelines.GUI_TEXTURED, TEXTURE, leftPos + 79, topPos + 34, 176, 14, purifyProgress + 1, 16, 256, 256);
}
}
================================================
FILE: common/src/main/java/toughasnails/client/handler/KeyHandler.java
================================================
/*******************************************************************************
* Copyright 2023, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.client.handler;
import com.mojang.blaze3d.platform.InputConstants;
import glitchcore.event.client.InputEvent;
import net.minecraft.ChatFormatting;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.components.ChatComponent;
import net.minecraft.network.chat.CommonComponents;
import net.minecraft.network.chat.Component;
public class KeyHandler
{
public static void onKeyPress(InputEvent.Key event)
{
Minecraft minecraft = Minecraft.getInstance();
boolean isF3Down = InputConstants.isKeyDown(Minecraft.getInstance().getWindow(), InputConstants.KEY_F3);
if (minecraft.screen == null && isF3Down)
{
boolean handledDebugKey = false;
switch (event.getKey())
{
case InputConstants.KEY_7 -> {
LevelRenderHandler.enableDebug = !LevelRenderHandler.enableDebug;
if (LevelRenderHandler.enableDebug) debugFeedbackTranslated("debug.temperature_fill.on");
else debugFeedbackTranslated("debug.temperature_fill.off");
handledDebugKey = true;
}
case InputConstants.KEY_Q -> {
ChatComponent component = minecraft.gui.getChat();
component.addMessage(Component.translatable("debug.temperature_fill.help"));
// Should already be marked as handled by Vanilla
}
}
event.setHandledDebugKey(event.getHandledDebugKey() | handledDebugKey);
}
}
private static void debugComponent(ChatFormatting formatting, Component component) {
Minecraft.getInstance()
.gui
.getChat()
.addMessage(
Component.empty()
.append(Component.translatable("debug.prefix").withStyle(formatting, ChatFormatting.BOLD))
.append(CommonComponents.SPACE)
.append(component)
);
}
private static void debugFeedbackComponent(Component $$0) {
debugComponent(ChatFormatting.YELLOW, $$0);
}
private static void debugFeedbackTranslated(String $$0, Object... $$1) {
debugFeedbackComponent(Component.translatableEscape($$0, $$1));
}
}
================================================
FILE: common/src/main/java/toughasnails/client/handler/LevelRenderHandler.java
================================================
/*******************************************************************************
* Copyright 2023, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.client.handler;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import glitchcore.event.client.LevelRenderEvent;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.rendertype.RenderTypes;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3;
import org.joml.Matrix3f;
import org.joml.Matrix4f;
import toughasnails.api.temperature.TemperatureHelper;
import toughasnails.block.entity.ThermoregulatorBlockEntity;
import toughasnails.temperature.AreaFill;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class LevelRenderHandler
{
public static boolean enableDebug = false;
public static void onLevelRender(LevelRenderEvent event) {
Player player = Minecraft.getInstance().player;
if (!enableDebug || player == null)
return;
Vec3 cameraPos = event.getCamera().pos;
PoseStack poseStack = event.getPoseStack();
MultiBufferSource.BufferSource bufferSource = Minecraft.getInstance().renderBuffers().bufferSource();
VertexConsumer vertexConsumer = bufferSource.getBuffer(RenderTypes.lines());
poseStack.pushPose();
poseStack.translate(-cameraPos.x(), -cameraPos.y(), -cameraPos.z());
getConnectedBlocks(player).forEach(block -> block.render(poseStack, vertexConsumer));
poseStack.popPose();
}
private static final Set connectedBlocks = new HashSet<>();
private static Set getConnectedBlocks(Player player)
{
Level level = player.level();
// The optimisation is good enough for me, and this isn't really a feature for a broad audience
// If that changes though, the below code is an option.
//if (connectedBlocks.isEmpty() || level.getGameTime() % 20L == 0L)
//{
// Clear old connectedBlocks
connectedBlocks.clear();
populateConnectedBlocks(player);
//}
return connectedBlocks;
}
private static void populateConnectedBlocks(Player player)
{
Level level = player.level();
BlockPos playerPos = player.blockPosition();
// If the player's position is obstructed (for example, when mounted or inside a block), use the position above instead
if (!level.isEmptyBlock(playerPos))
playerPos = playerPos.above();
Set passablePositions = new HashSet<>();
Set heatingPositions = new HashSet<>();
Set coolingPositions = new HashSet<>();
Set thermoregulatorPositions = new HashSet<>();
Set blockingPositions = new HashSet<>();
AreaFill.fill(level, playerPos, new AreaFill.PositionChecker() {
@Override
public void onSolid(Level level, AreaFill.FillPos pos)
{
BlockState state = level.getBlockState(pos.pos());
if (TemperatureHelper.isHeatingBlock(state))
{
heatingPositions.add(pos.pos());
}
else if (TemperatureHelper.isCoolingBlock(state))
{
coolingPositions.add(pos.pos());
}
else blockingPositions.add(pos.pos());
}
@Override
public void onPassable(Level level, AreaFill.FillPos pos)
{
passablePositions.add(pos.pos());
}
});
// Add blocks from thermoregulators
for (BlockPos pos : TemperatureHelper.getTemperatureData(player).getNearbyThermoregulators())
{
ThermoregulatorBlockEntity blockEntity = (ThermoregulatorBlockEntity)level.getBlockEntity(pos);
if (blockEntity == null)
continue;
thermoregulatorPositions.addAll(blockEntity.getFilledBlocks());
}
connectBlocks(passablePositions, 170, 170, 170, 255); // Grey
connectBlocks(heatingPositions, 255, 170, 0, 255); // Orange
connectBlocks(coolingPositions, 85, 255, 255, 255); // Blue
connectBlocks(thermoregulatorPositions, 255, 85, 255, 255); // Purple
connectBlocks(blockingPositions, 255, 85, 85, 255); // Red
}
private static void connectBlocks(Set positions, int r, int g, int b, int a)
{
// TODO: This could probably be optimised so that blocks opposite each other can set each other's faces, but this is good enough for now
for (BlockPos pos : positions)
{
Set connectedFaces = new HashSet<>();
for (Direction dir : Direction.values())
{
if (positions.contains(pos.relative(dir)))
connectedFaces.add(dir);
}
if (!connectedFaces.containsAll(Arrays.stream(Direction.values()).toList()))
connectedBlocks.add(new ConnectedBlock(pos, connectedFaces, (float)r / 255.0F, (float)g / 255.0F, (float)b / 255.0F, (float)a / 255.0F));
}
}
private static class ConnectedBlock
{
private final BlockPos pos;
private final Set connectedFaces;
private final float r;
private final float g;
private final float b;
private final float a;
private final float minX;
private final float minY;
private final float minZ;
private final float maxX;
private final float maxY;
private final float maxZ;
private ConnectedBlock(BlockPos pos, Set connectedFaces, float r, float g, float b, float a)
{
this.pos = pos;
this.connectedFaces = connectedFaces;
this.r = r;
this.g = g;
this.b = b;
this.a = a;
// Offset by 0.0001 to prevent Z-fighting with the selection box
this.minX = (float)pos.getX() + 0.0001F;
this.minY = (float)pos.getY() + 0.0001F;
this.minZ = (float)pos.getZ() + 0.0001F;
this.maxX = (float)pos.getX() + 1 - 0.0001F;
this.maxY = (float)pos.getY() + 1 - 0.0001F;
this.maxZ = (float)pos.getZ() + 1 - 0.0001F;
}
public void render(PoseStack poseStack, VertexConsumer vertexConsumer)
{
Matrix4f poseMatrix = poseStack.last().pose();
PoseStack.Pose lastPose = poseStack.last();
// North face (towards -Z)
drawLine(vertexConsumer, poseMatrix, lastPose, minX, minY, minZ, maxX, minY, minZ, Direction.NORTH, Direction.DOWN);
drawLine(vertexConsumer, poseMatrix, lastPose, minX, minY, minZ, minX, maxY, minZ, Direction.NORTH, Direction.WEST);
drawLine(vertexConsumer, poseMatrix, lastPose, maxX, minY, minZ, maxX, maxY, minZ, Direction.NORTH, Direction.EAST);
drawLine(vertexConsumer, poseMatrix, lastPose, maxX, maxY, minZ, minX, maxY, minZ, Direction.NORTH, Direction.UP);
// South face (towards +Z)
drawLine(vertexConsumer, poseMatrix, lastPose, minX, maxY, maxZ, minX, minY, maxZ, Direction.SOUTH, Direction.WEST);
drawLine(vertexConsumer, poseMatrix, lastPose, minX, minY, maxZ, maxX, minY, maxZ, Direction.SOUTH, Direction.DOWN);
drawLine(vertexConsumer, poseMatrix, lastPose, minX, maxY, maxZ, maxX, maxY, maxZ, Direction.SOUTH, Direction.UP);
drawLine(vertexConsumer, poseMatrix, lastPose, maxX, minY, maxZ, maxX, maxY, maxZ, Direction.SOUTH, Direction.EAST);
// West face (towards -X)
drawLine(vertexConsumer, poseMatrix, lastPose, minX, minY, minZ, minX, minY, maxZ, Direction.WEST, Direction.DOWN);
drawLine(vertexConsumer, poseMatrix, lastPose, minX, maxY, minZ, minX, maxY, maxZ, Direction.WEST, Direction.UP);
// East face (towards +X)
drawLine(vertexConsumer, poseMatrix, lastPose, maxX, minY, maxZ, maxX, minY, minZ, Direction.EAST, Direction.DOWN);
drawLine(vertexConsumer, poseMatrix, lastPose, maxX, maxY, minZ, maxX, maxY, maxZ, Direction.EAST, Direction.UP);
}
public Set getConnectedFaces()
{
return this.connectedFaces;
}
private void drawLine(VertexConsumer vertexConsumer, Matrix4f poseMatrix, PoseStack.Pose lastPose, float fromX, float fromY, float fromZ, float toX, float toY, float toZ, Direction... relevantFaces)
{
// Don't draw this line if it forms part of a connected face
if (Arrays.stream(relevantFaces).anyMatch(this.connectedFaces::contains))
return;
float normalX = Math.signum(fromX - toX);
float normalY = Math.signum(fromY - toY);
float normalZ = Math.signum(fromZ - toZ);
vertexConsumer.addVertex(poseMatrix, fromX, fromY, fromZ).setColor(r, g, b, a).setNormal(lastPose, normalX, normalY, normalZ);
vertexConsumer.addVertex(poseMatrix, toX, toY, toZ).setColor(r, g, b, a).setNormal(lastPose, normalX, normalY, normalZ);
}
}
}
================================================
FILE: common/src/main/java/toughasnails/client/handler/TooltipHandler.java
================================================
/*******************************************************************************
* Copyright 2022, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.client.handler;
import glitchcore.event.client.ItemTooltipEvent;
import glitchcore.event.client.RenderTooltipEvent;
import glitchcore.util.Environment;
import net.minecraft.ChatFormatting;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent;
import net.minecraft.client.renderer.RenderPipelines;
import net.minecraft.core.Holder;
import net.minecraft.core.RegistryAccess;
import net.minecraft.network.chat.Component;
import net.minecraft.util.Mth;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.equipment.trim.TrimMaterial;
import net.minecraft.world.item.equipment.trim.TrimMaterials;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import toughasnails.init.ModConfig;
import toughasnails.init.ModTags;
import toughasnails.thirst.ThirstOverlayRenderer;
import java.util.Optional;
public class TooltipHandler
{
public static void onTooltip(ItemTooltipEvent event)
{
// Don't display heating or cooling tooltips if temperature is disabled
if (!ModConfig.temperature.enableTemperature)
return;
if (!Environment.isClient())
throw new IllegalStateException("ItemTooltipEvent unexpectedly called on the server");
// In some rare cases (on Forge at least) this may be called with a null connection
if (Minecraft.getInstance().getConnection() == null)
return;
ItemStack stack = event.getStack();
Block block = Block.byItem(stack.getItem());
BlockState state = block.defaultBlockState();
RegistryAccess registryAccess = Minecraft.getInstance().getConnection().registryAccess();
Optional> trimMaterial = TrimMaterials.getFromIngredient(registryAccess, stack);
// Heating/Cooling Blocks and Armor/Trimmed Armor
if (state.is(ModTags.Blocks.HEATING_BLOCKS) || stack.is(ModTags.Items.HEATING_ARMOR) || (trimMaterial.isPresent() && trimMaterial.get().is(ModTags.Trims.HEATING_TRIMS)))
{
event.getTooltip().add(Component.literal("\uD83D\uDD25 ").append(Component.translatable("desc.toughasnails.heating")).withStyle(ChatFormatting.GOLD));
}
if (state.is(ModTags.Blocks.COOLING_BLOCKS) || stack.is(ModTags.Items.COOLING_ARMOR) || (trimMaterial.isPresent() && trimMaterial.get().is(ModTags.Trims.COOLING_TRIMS)))
{
event.getTooltip().add(Component.literal("\u2744 ").append(Component.translatable("desc.toughasnails.cooling")).withStyle(ChatFormatting.AQUA));
}
// Heating/Cooling Held Items
if (stack.is(ModTags.Items.HEATING_HELD_ITEMS))
{
event.getTooltip().add(Component.literal("\uD83D\uDD25 ").append(Component.translatable("desc.toughasnails.heating_held")).withStyle(ChatFormatting.GOLD));
}
if (stack.is(ModTags.Items.COOLING_HELD_ITEMS))
{
event.getTooltip().add(Component.literal("\u2744 ").append(Component.translatable("desc.toughasnails.cooling_held")).withStyle(ChatFormatting.AQUA));
}
// Heating/Cooling Consumables
if (stack.is(ModTags.Items.HEATING_CONSUMED_ITEMS))
{
event.getTooltip().add(Component.literal("\uD83D\uDD25 ").append(Component.translatable("desc.toughasnails.heating_consumed")).withStyle(ChatFormatting.GOLD));
}
if (stack.is(ModTags.Items.COOLING_CONSUMED_ITEMS))
{
event.getTooltip().add(Component.literal("\u2744 ").append(Component.translatable("desc.toughasnails.cooling_consumed")).withStyle(ChatFormatting.AQUA));
}
// Heating/Cooling Trim Material Items
if (trimMaterial.isPresent() && trimMaterial.get().is(ModTags.Trims.HEATING_TRIMS))
{
event.getTooltip().add(Component.literal("\uD83D\uDD25 ").append(Component.translatable("desc.toughasnails.heating_trim")).withStyle(ChatFormatting.GOLD));
}
if (trimMaterial.isPresent() && trimMaterial.get().is(ModTags.Trims.COOLING_TRIMS))
{
event.getTooltip().add(Component.literal("\u2744 ").append(Component.translatable("desc.toughasnails.cooling_trim")).withStyle(ChatFormatting.AQUA));
}
}
public static void onRenderTooltip(RenderTooltipEvent event)
{
ItemStack stack = event.getStack();
// Don't display thirst tooltips if thirst is disabled
if (!ModConfig.thirst.enableThirst)
return;
if (stack.is(ModTags.Items.DRINKS))
{
event.getComponents().add(new ThirstClientTooltipComponent(ModTags.Items.getThirstRestored(stack)));
}
}
private static class ThirstClientTooltipComponent implements ClientTooltipComponent
{
private final int amount;
private ThirstClientTooltipComponent(int amount)
{
this.amount = amount;
}
@Override
public int getHeight(Font font)
{
return 9;
}
@Override
public int getWidth(Font font)
{
return (this.amount / 2) * 8;
}
@Override
public void renderImage(Font font, int x, int y, int width, int height, GuiGraphics gui)
{
gui.pose().pushMatrix();
for (int i = 0; i < Mth.ceil(this.amount / 2.0F); i++)
{
int dropletHalf = i * 2 + 1;
int startX = x + i * 8;
int startY = y;
// Args: poseStack, x, y, u, v, width, height, texWidth, texHeight
// Draw a full droplet
if (this.amount > dropletHalf)
{
gui.blit(RenderPipelines.GUI_TEXTURED, ThirstOverlayRenderer.OVERLAY, startX, startY, 0, 41, 8, 8, 256, 256);
}
else if (this.amount == dropletHalf) // Draw a half droplet
{
gui.blit(RenderPipelines.GUI_TEXTURED, ThirstOverlayRenderer.OVERLAY, startX, startY, 8, 41, 8, 8, 256, 256);
}
}
gui.pose().popMatrix();
}
}
}
================================================
FILE: common/src/main/java/toughasnails/client/item/TemperatureProperty.java
================================================
/*******************************************************************************
* Copyright 2024, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.client.item;
import com.google.common.collect.Maps;
import com.mojang.serialization.Codec;
import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.renderer.item.properties.numeric.RangeSelectItemModelProperty;
import net.minecraft.core.BlockPos;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.ItemOwner;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.Nullable;
import toughasnails.api.temperature.TemperatureHelper;
import toughasnails.api.temperature.TemperatureLevel;
import toughasnails.temperature.TemperatureHelperImpl;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class TemperatureProperty implements RangeSelectItemModelProperty
{
public static final MapCodec CODEC = RecordCodecBuilder.mapCodec((builder) ->
builder.group(
Codec.unboundedMap(Codec.INT, Delta.CODEC)
.fieldOf("deltas")
.forGetter(TemperatureProperty::deltas)
).apply(builder, TemperatureProperty::new)
);
private final Map deltas;
public TemperatureProperty(Map deltas)
{
this.deltas = Maps.newHashMap(deltas);
}
public TemperatureProperty() { this.deltas = new HashMap<>(); }
@Override
public float get(ItemStack stack, @Nullable ClientLevel level, @Nullable ItemOwner owner, int i)
{
Entity holder = (Entity)(owner != null ? owner : stack.getEntityRepresentation());
if (owner == null)
return 0.5F;
if (level == null && owner.level() instanceof ClientLevel)
level = (ClientLevel)holder.level();
if (level == null)
return 0.5F;
Delta delta = deltas.computeIfAbsent(holder.getId(), k -> new Delta());
delta.update(level, getTemperatureForThermometer(level, holder));
return delta.getValue();
}
@Override
public MapCodec extends RangeSelectItemModelProperty> type()
{
return CODEC;
}
private Map deltas()
{
return this.deltas;
}
private static TemperatureLevel getTemperatureForThermometer(Level level, Entity holder)
{
TemperatureLevel temperatureLevel = TemperatureHelper.getTemperatureAtPos(level, holder.blockPosition());
// Use the player to acquire nearby thermoregulators, even if they aren't holding the thermometer
Player player = Minecraft.getInstance().player;
Set nearbyThermoregulators = TemperatureHelper.getTemperatureData(player).getNearbyThermoregulators();
return TemperatureHelperImpl.modifyTemperatureByThermoregulators(level, nearbyThermoregulators, holder.blockPosition(), temperatureLevel);
}
private static class Delta
{
public static final Codec CODEC = RecordCodecBuilder.create((builder) ->
builder.group(
Codec.LONG.fieldOf("last_update_tick").forGetter(Delta::lastUpdateTick),
Codec.DOUBLE.fieldOf("value").forGetter(Delta::currentValue),
Codec.DOUBLE.fieldOf("rota").forGetter(Delta::rota)
).apply(builder, Delta::new)
);
private long lastUpdateTick;
private double currentValue;
private double rota;
public Delta(long lastUpdateTick, double currentValue, double rota)
{
this.lastUpdateTick = lastUpdateTick;
this.currentValue = currentValue;
this.rota = rota;
}
public Delta() {}
private void update(ClientLevel level, TemperatureLevel temperatureLevel)
{
if (level.getGameTime() == this.lastUpdateTick)
return;
this.lastUpdateTick = level.getGameTime();
double targetValue = temperatureLevel.ordinal() * 0.25;
double delta = targetValue - this.currentValue;
// Add a small increment to the rota to move towards the target value
this.rota += delta * 0.1;
// Diminish the rota over time. The clock uses 0.9, but we want slightly less wobbling
this.rota *= 0.87;
this.currentValue = Mth.clamp(this.currentValue + this.rota, 0.0, 1.0);
}
public float getValue()
{
// Round to the nearest 0.05
return (float)((double)Math.round(this.currentValue * 20.0) / 20.0);
}
private long lastUpdateTick()
{
return this.lastUpdateTick;
}
private double currentValue()
{
return this.currentValue;
}
private double rota()
{
return this.rota;
}
}
}
================================================
FILE: common/src/main/java/toughasnails/client/particle/ThermoregulatorParticle.java
================================================
package toughasnails.client.particle;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.particle.*;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.core.particles.SimpleParticleType;
import net.minecraft.util.RandomSource;
public class ThermoregulatorParticle extends SingleQuadParticle
{
ThermoregulatorParticle(ClientLevel p_105856_, double p_105857_, double p_105858_, double p_105859_, double p_105860_, double p_105861_, double p_105862_, TextureAtlasSprite sprite)
{
super(p_105856_, p_105857_, p_105858_, p_105859_, sprite);
this.lifetime = this.random.nextInt(8) + 8;
this.gravity = 3.0E-6F;
this.xd = p_105860_;
this.yd = p_105861_;
this.zd = p_105862_;
}
@Override
public void tick()
{
this.xo = this.x;
this.yo = this.y;
this.zo = this.z;
if (this.age++ < this.lifetime && !(this.alpha <= 0.0F))
{
this.move(this.xd, this.yd, this.zd);
if (this.age >= this.lifetime - 60 && this.alpha > 0.01F)
{
this.alpha -= 0.01F;
}
}
else
{
this.remove();
}
}
@Override
public float getQuadSize(float p_107089_)
{
float f = ((float)this.age + p_107089_) / (float)this.lifetime;
return this.quadSize * (1.0F - f * f);
}
@Override
public SingleQuadParticle.Layer getLayer() {
return SingleQuadParticle.Layer.OPAQUE;
}
public static class Provider implements ParticleProvider
{
private final SpriteSet sprite;
public Provider(SpriteSet p_105793_) {
this.sprite = p_105793_;
}
@Override
public Particle createParticle(SimpleParticleType p_105804_, ClientLevel p_105805_, double p_105806_, double p_105807_, double p_105808_, double p_105809_, double p_105810_, double p_105811_, RandomSource p_445842_) {
return new ThermoregulatorParticle(p_105805_, p_105806_, p_105807_, p_105808_, p_105809_, p_105810_, p_105811_, this.sprite.get(p_445842_));
}
}
}
================================================
FILE: common/src/main/java/toughasnails/config/ClientConfig.java
================================================
/*******************************************************************************
* Copyright 2023, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.config;
import glitchcore.config.Config;
import glitchcore.util.Environment;
import toughasnails.api.TANAPI;
public class ClientConfig extends Config
{
public int thirstLeftOffset;
public int thirstTopOffset;
public int temperatureLeftOffset;
public int temperatureTopOffset;
public ClientConfig()
{
super(Environment.getConfigPath().resolve(TANAPI.MOD_ID + "/client.toml"));
}
@Override
public void load()
{
thirstLeftOffset = addNumber("gui.thirst_left_offset", 0, Integer.MIN_VALUE, Integer.MAX_VALUE, "The offset of the left of the thirst overlay from its default position.");
thirstTopOffset = addNumber("gui.thirst_top_offset", 0, Integer.MIN_VALUE, Integer.MAX_VALUE, "The offset of the top of the thirst overlay from its default position.");
temperatureLeftOffset = addNumber("gui.temperature_left_offset", 0, Integer.MIN_VALUE, Integer.MAX_VALUE, "The offset of the left of the temperature overlay from its default position.");
temperatureTopOffset = addNumber("gui.temperature_top_offset", 0, Integer.MIN_VALUE, Integer.MAX_VALUE, "The offset of the top of the temperature overlay from its default position.");
}
}
================================================
FILE: common/src/main/java/toughasnails/config/TemperatureConfig.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.config;
import com.google.common.collect.ImmutableList;
import glitchcore.config.Config;
import glitchcore.util.Environment;
import toughasnails.api.TANAPI;
import toughasnails.temperature.BuiltInTemperatureModifier;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class TemperatureConfig extends Config
{
public boolean enableTemperature;
public int temperatureChangeDelay;
public int armorTemperatureChangeDelay;
public int mountTemperatureChangeDelay;
public int handheldTemperatureChangeDelay;
public int playerTemperatureChangeDelay;
public int internalTemperatureChangeDelay;
public int extremityReboundTemperatureChangeDelay;
public int extremityDamageDelay;
public int climateClemencyDuration;
public boolean climateClemencyRespawning;
public int consumableEffectDuration;
public int temperatureDropAltitude;
public int temperatureRiseAltitude;
public int environmentalModifierAltitude;
public int nearHeatCoolProximity;
public int nightHotTemperatureChange;
public int nightTemperatureChange;
public int onFireTemperatureChange;
public int powderSnowTemperatureChange;
public int wetTemperatureChange;
public int snowTemperatureChange;
public int wetTicks;
public List temperatureModifierOrder;
public TemperatureConfig()
{
super(Environment.getConfigPath().resolve(TANAPI.MOD_ID + "/temperature.toml"));
}
private static final List DEFAULT_TEMPERATURE_MODIFIER_ORDER = ImmutableList.of(BuiltInTemperatureModifier.PLAYER_MODIFIERS, BuiltInTemperatureModifier.ITEM_MODIFIER, BuiltInTemperatureModifier.ARMOR_MODIFIER, BuiltInTemperatureModifier.MOUNT_MODIFIER, BuiltInTemperatureModifier.INTERNAL_MODIFIER)
.stream().map(e -> e.toString().toLowerCase()).toList();
private static final Predicate
> TEMPERATURE_MODIFIER_VALIDATOR = list -> {
Set configEntries = list.stream().map(String::toLowerCase).collect(Collectors.toSet());
Set allModifiers = Arrays.stream(BuiltInTemperatureModifier.values()).map(m -> m.toString().toLowerCase()).collect(Collectors.toSet());
return configEntries.containsAll(allModifiers) && allModifiers.containsAll(configEntries);
};
@Override
public void load()
{
// Toggles
enableTemperature = add("toggles.enable_temperature", true, "Enable or disable temperature.");
// General options
temperatureChangeDelay = addNumber("general.temperature_change_delay", 500, 0, Integer.MAX_VALUE, "Number of ticks to delay changing the player's temperature after their temperature changes.");
armorTemperatureChangeDelay = addNumber("general.armor_temperature_change_delay", 50, 0, Integer.MAX_VALUE, "Number of ticks to delay changing the player's temperature after their temperature changes when wearing armor.");
mountTemperatureChangeDelay = addNumber("general.mount_temperature_change_delay", 50, 0, Integer.MAX_VALUE, "Number of ticks to delay changing the player's temperature after their temperature changes when mounted.");
handheldTemperatureChangeDelay = addNumber("general.handheld_temperature_change_delay", 375, 0, Integer.MAX_VALUE, "Number of ticks to delay changing the player's temperature after their temperature changes when holding an item.");
playerTemperatureChangeDelay = addNumber("general.player_temperature_change_delay", 125, 0, Integer.MAX_VALUE, "Number of ticks to delay changing the player's temperature after their temperature changes when affected by a player-based temperature modifier.");
internalTemperatureChangeDelay = addNumber("general.internal_temperature_change_delay", 20, 0, Integer.MAX_VALUE, "Number of ticks to delay changing the player's temperature after their temperature changes from consuming a heating or cooling item.");
extremityReboundTemperatureChangeDelay = addNumber("general.extremity_rebound_temperature_change_delay", 250, 0, Integer.MAX_VALUE, "Number of ticks to delay changing the player's temperature after their temperature changes when rebounding from an extreme temperature.");
extremityDamageDelay = addNumber("general.extremity_damage_delay", 500, 0, Integer.MAX_VALUE, "Number of ticks to delay taking damage when icy or hot.");
climateClemencyDuration = addNumber("general.climate_clemency_duration", 6000, 0, Integer.MAX_VALUE, "Number of ticks for the duration of Climate Clemency.");
climateClemencyRespawning = add("general.climate_clemency_respawning", false, "Whether or not Climate Clemency should be granted when respawning.");
consumableEffectDuration = add("general.consumable_effect_duration", 1200, "Duration of heating or cooling effects given by consuming items.");
temperatureModifierOrder = add("general.temperature_modifier_order", DEFAULT_TEMPERATURE_MODIFIER_ORDER, "The order in which to apply built-in temperature modifiers", TEMPERATURE_MODIFIER_VALIDATOR);
// Altitude options
temperatureDropAltitude = addNumber("altitude.temperature_drop_altitude", 160, -64, 1024, "Y level to drop the temperature at when above");
temperatureRiseAltitude = addNumber("altitude.temperature_rise_altitude", -32, -64, 1024, "Y level to rise the temperature at when below");
environmentalModifierAltitude = addNumber("altitude.environmental_modifier_altitude", 50, -64, 256, "Y level above which environmental modifiers are applied");
// Blocks options
nearHeatCoolProximity = addNumber("blocks.near_heat_cool_proximity", 8, 1, 16, "The proximity which constitutes near a heat or cool source");
// Immersion options
onFireTemperatureChange = addNumber("immersion.on_fire_temperature_change", 2, -4, 4, "Amount to change the temperature by when on fire.");
powderSnowTemperatureChange = addNumber("immersion.powdered_snow_temperature_change", -2, -4, 4, "Amount to change the temperature by when in powdered snow.");
wetTemperatureChange = addNumber("immersion.wet_temperature_change", -1, -4, 4, "Amount to change the temperature by when wet.");
snowTemperatureChange = addNumber("immersion.snow_temperature_change", -1, -4, 4, "Amount to change the temperature by when snowing.");
wetTicks = addNumber("immersion.wet_ticks", 40, 0, Integer.MAX_VALUE, "Number of ticks a player stays wet for after touching water, rain or snow.");
// Time options
nightTemperatureChange = addNumber("time.night_temperature_change", -1, -4, 4, "Amount to change the temperature at night when the original temperature is not hot.");
nightHotTemperatureChange = addNumber("time.night_hot_temperature_change", -2, -4, 4, "Amount to change the temperature at night when the original temperature is hot.");
}
}
================================================
FILE: common/src/main/java/toughasnails/config/ThirstConfig.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.config;
import glitchcore.config.Config;
import glitchcore.util.Environment;
import toughasnails.api.TANAPI;
import java.nio.file.Path;
public class ThirstConfig extends Config
{
public boolean enableThirst;
public boolean enableHandDrinking;
public boolean removeSourceBlocks;
public boolean thirstPreventSprint;
public boolean thirstPreventHealthRegen;
public double thirstExhaustionThreshold;
public int handDrinkingThirst;
public double handDrinkingHydration;
public ThirstConfig()
{
super(Environment.getConfigPath().resolve(TANAPI.MOD_ID + "/thirst.toml"));
}
@Override
public void load()
{
// Toggles
enableThirst = add("toggles.enable_thirst", true, "Enable or disable thirst.");
enableHandDrinking = add("toggles.enable_hand_drinking", false, "Enable or disable hand drinking.");
removeSourceBlocks = add("toggles.remove_source_blocks", false, "Remove source blocks when filling the canteen.");
thirstPreventSprint = add("toggles.thirst_prevent_sprint", true, "Prevent sprinting when thirsty.");
thirstPreventHealthRegen = add("toggles.thirst_prevent_health_regen", true, "Prevent health regeneration when thirsty.");
// General options
thirstExhaustionThreshold = addNumber("general.exhaustion_threshold", 8.0D, 0.0D, Double.MAX_VALUE, "The threshold at which exhaustion causes a reduction in hydration and the thirst bar.");
// Drink options
handDrinkingThirst = addNumber("drink_options.hand_drinking_thirst", 1, 0, 20, "Thirst restored from drinking with hands.");
handDrinkingHydration = addNumber("drink_options.hand_drinking_hydration", 0.1D, 0.0D, Double.MAX_VALUE, "Hydration restored from drinking with hands.");
}
}
================================================
FILE: common/src/main/java/toughasnails/container/ThermoregulatorContainer.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.container;
import net.minecraft.world.Container;
import net.minecraft.world.SimpleContainer;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.ContainerData;
import net.minecraft.world.inventory.SimpleContainerData;
import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.RecipeType;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.NotNull;
import toughasnails.api.container.TANContainerTypes;
import toughasnails.api.crafting.TANRecipeTypes;
import toughasnails.block.entity.ThermoregulatorBlockEntity;
import toughasnails.block.entity.WaterPurifierBlockEntity;
import toughasnails.crafting.WaterPurifierRecipe;
public class ThermoregulatorContainer extends AbstractContainerMenu
{
private final Container container;
private final ContainerData data;
private final Level level;
public ThermoregulatorContainer(int id, Inventory playerInventory)
{
this(id, playerInventory, new SimpleContainer(2), new SimpleContainerData(2));
}
public ThermoregulatorContainer(int id, Inventory playerInventory, Container container, ContainerData data)
{
super(TANContainerTypes.THERMOREGULATOR, id);
this.container = container;
this.data = data;
this.level = playerInventory.player.level();
// Add input item slot
this.addSlot(new ThermoregulatorCoolingFuelSlot(container, ThermoregulatorBlockEntity.SLOT_COOLING, 44, 42));
// Add filter item slot
this.addSlot(new ThermoregulatorHeatingFuelSlot(container, ThermoregulatorBlockEntity.SLOT_HEATING, 116, 42));
// Add inventory slots
for (int row = 0; row < 3; ++row)
{
for (int col = 0; col < 9; ++col)
{
this.addSlot(new Slot(playerInventory, col + row * 9 + 9, 8 + col * 18, 84 + row * 18));
}
}
// Add hotbar slots
for (int slot = 0; slot < 9; ++slot)
{
this.addSlot(new Slot(playerInventory, slot, 8 + slot * 18, 142));
}
// Add data slots
this.addDataSlots(data);
}
@Override
public boolean stillValid(Player player)
{
return this.container.stillValid(player);
}
@Override
public @NotNull ItemStack quickMoveStack(@NotNull Player player, int index)
{
ItemStack prevItem = ItemStack.EMPTY;
Slot slot = this.slots.get(index);
if (slot.hasItem())
{
ItemStack slotItem = slot.getItem();
prevItem = slotItem.copy();
// Output
if (index != ThermoregulatorBlockEntity.SLOT_HEATING && index != ThermoregulatorBlockEntity.SLOT_COOLING) // Moving from inventory to the purifier
{
if (ThermoregulatorBlockEntity.isCoolingFuel(slotItem))
{
if (!this.moveItemStackTo(slotItem, 0, 1, false)) {
return ItemStack.EMPTY;
}
}
else if (ThermoregulatorBlockEntity.isHeatingFuel(slotItem))
{
if (!this.moveItemStackTo(slotItem, 1, 2, false))
{
return ItemStack.EMPTY;
}
}
else if (index >= 2 && index < 30)
{
if (!this.moveItemStackTo(slotItem, 30, 38, false))
{
return ItemStack.EMPTY;
}
}
else if (index >= 30 && index < 38 && !this.moveItemStackTo(slotItem, 2, 30, false)) {
return ItemStack.EMPTY;
}
}
else if (!this.moveItemStackTo(slotItem, 2, 38, false)) // Move from purifier to inventory
{
return ItemStack.EMPTY;
}
if (slotItem.isEmpty())
{
slot.set(ItemStack.EMPTY);
}
else
{
slot.setChanged();
}
// No change
if (slotItem.getCount() == prevItem.getCount())
{
return ItemStack.EMPTY;
}
slot.onTake(player, slotItem);
}
return prevItem;
}
public int getCoolingFuelProgress()
{
return this.data.get(0) * 13 / ThermoregulatorBlockEntity.CONSUMABLE_DURATION;
}
public int getHeatingFuelProgress()
{
return this.data.get(1) * 13 / ThermoregulatorBlockEntity.CONSUMABLE_DURATION;
}
public boolean isCooling()
{
return this.data.get(0) > 0;
}
public boolean isHeating()
{
return this.data.get(1) > 0;
}
}
================================================
FILE: common/src/main/java/toughasnails/container/ThermoregulatorCoolingFuelSlot.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.container;
import net.minecraft.world.Container;
import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack;
import toughasnails.block.entity.ThermoregulatorBlockEntity;
public class ThermoregulatorCoolingFuelSlot extends Slot
{
public ThermoregulatorCoolingFuelSlot(Container inventory, int index, int xPosition, int yPosition)
{
super(inventory, index, xPosition, yPosition);
}
@Override
public boolean mayPlace(ItemStack stack)
{
return ThermoregulatorBlockEntity.isCoolingFuel(stack);
}
}
================================================
FILE: common/src/main/java/toughasnails/container/ThermoregulatorHeatingFuelSlot.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.container;
import net.minecraft.world.Container;
import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack;
import toughasnails.block.entity.ThermoregulatorBlockEntity;
public class ThermoregulatorHeatingFuelSlot extends Slot
{
public ThermoregulatorHeatingFuelSlot(Container inventory, int index, int xPosition, int yPosition)
{
super(inventory, index, xPosition, yPosition);
}
@Override
public boolean mayPlace(ItemStack stack)
{
return ThermoregulatorBlockEntity.isHeatingFuel(stack);
}
}
================================================
FILE: common/src/main/java/toughasnails/container/WaterPurifierFilterSlot.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.container;
import net.minecraft.world.Container;
import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack;
public class WaterPurifierFilterSlot extends Slot
{
private final WaterPurifierMenu menu;
public WaterPurifierFilterSlot(WaterPurifierMenu container, Container inventory, int index, int xPosition, int yPosition)
{
super(inventory, index, xPosition, yPosition);
this.menu = container;
}
@Override
public boolean mayPlace(ItemStack stack)
{
return this.menu.isFilter(stack);
}
}
================================================
FILE: common/src/main/java/toughasnails/container/WaterPurifierMenu.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.container;
import net.minecraft.resources.ResourceKey;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.Container;
import net.minecraft.world.SimpleContainer;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.ContainerData;
import net.minecraft.world.inventory.SimpleContainerData;
import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.*;
import net.minecraft.world.level.Level;
import toughasnails.api.crafting.TANRecipeTypes;
import toughasnails.api.container.TANContainerTypes;
import toughasnails.block.entity.WaterPurifierBlockEntity;
import toughasnails.crafting.WaterPurifierRecipe;
import toughasnails.init.ModRecipePropertySets;
public class WaterPurifierMenu extends AbstractContainerMenu
{
private final Container container;
private final ContainerData data;
private final Level level;
private final RecipePropertySet acceptedInputs;
public WaterPurifierMenu(int id, Inventory playerInventory)
{
this(id, playerInventory, new SimpleContainer(3), new SimpleContainerData(4));
}
public WaterPurifierMenu(int id, Inventory playerInventory, Container container, ContainerData data)
{
super(TANContainerTypes.WATER_PURIFIER, id);
this.container = container;
this.data = data;
this.level = playerInventory.player.level();
this.acceptedInputs = this.level.recipeAccess().propertySet(ModRecipePropertySets.WATER_PURIFYING);
// Add input item slot
this.addSlot(new Slot(container, 0, 56, 17));
// Add filter item slot
this.addSlot(new WaterPurifierFilterSlot(this, container, 1, 56, 53));
// Add output item slot
this.addSlot(new WaterPurifierResultSlot(container, 2, 116, 35));
// Add inventory slots
for (int row = 0; row < 3; ++row)
{
for (int col = 0; col < 9; ++col)
{
this.addSlot(new Slot(playerInventory, col + row * 9 + 9, 8 + col * 18, 84 + row * 18));
}
}
// Add hotbar slots
for (int slot = 0; slot < 9; ++slot)
{
this.addSlot(new Slot(playerInventory, slot, 8 + slot * 18, 142));
}
// Add data slots
this.addDataSlots(data);
}
@Override
public boolean stillValid(Player player)
{
return this.container.stillValid(player);
}
@Override
public ItemStack quickMoveStack(Player player, int index)
{
ItemStack prevItem = ItemStack.EMPTY;
Slot slot = this.slots.get(index);
if (slot != null && slot.hasItem())
{
ItemStack slotItem = slot.getItem();
prevItem = slotItem.copy();
// Output
if (index == 2)
{
if (!this.moveItemStackTo(slotItem, 3, 39, true))
{
return ItemStack.EMPTY;
}
slot.onQuickCraft(slotItem, prevItem);
}
else if (index != 1 && index != 0) // Moving from inventory to the purifier
{
if (this.canPurify(slotItem))
{
if (!this.moveItemStackTo(slotItem, 0, 1, false)) {
return ItemStack.EMPTY;
}
}
else if (this.isFilter(slotItem))
{
if (!this.moveItemStackTo(slotItem, 1, 2, false))
{
return ItemStack.EMPTY;
}
}
else if (index >= 3 && index < 30)
{
if (!this.moveItemStackTo(slotItem, 30, 39, false))
{
return ItemStack.EMPTY;
}
}
else if (index >= 30 && index < 39 && !this.moveItemStackTo(slotItem, 3, 30, false)) {
return ItemStack.EMPTY;
}
}
else if (!this.moveItemStackTo(slotItem, 3, 39, false)) // Move from purifier to inventory
{
return ItemStack.EMPTY;
}
if (slotItem.isEmpty())
{
slot.set(ItemStack.EMPTY);
}
else
{
slot.setChanged();
}
// No change
if (slotItem.getCount() == prevItem.getCount())
{
return ItemStack.EMPTY;
}
slot.onTake(player, slotItem);
}
return prevItem;
}
protected boolean canPurify(ItemStack stack)
{
return this.acceptedInputs.test(stack);
}
protected boolean isFilter(ItemStack stack)
{
return WaterPurifierBlockEntity.isFilter(stack);
}
public int getPurifyProgress()
{
int progress = this.data.get(2);
int totalTime = this.data.get(3);
return totalTime != 0 && progress != 0 ? progress * 24 / totalTime : 0;
}
public int getFilterProgress()
{
int filterDuration = this.data.get(1);
// Prevent division by 0
if (filterDuration == 0)
{
filterDuration = 200;
}
return this.data.get(0) * 13 / filterDuration;
}
public boolean isFiltering()
{
return this.data.get(0) > 0;
}
}
================================================
FILE: common/src/main/java/toughasnails/container/WaterPurifierResultSlot.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.container;
import net.minecraft.world.Container;
import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack;
public class WaterPurifierResultSlot extends Slot
{
public WaterPurifierResultSlot(Container inventory, int index, int xPosition, int yPosition)
{
super(inventory, index, xPosition, yPosition);
}
// Prevent placing item in slot
@Override
public boolean mayPlace(ItemStack stack)
{
return false;
}
}
================================================
FILE: common/src/main/java/toughasnails/core/ToughAsNails.java
================================================
/*******************************************************************************
* Copyright 2023, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.core;
import glitchcore.event.EventManager;
import glitchcore.util.Environment;
import glitchcore.util.RegistryHelper;
import net.minecraft.core.RegistryAccess;
import net.minecraft.core.registries.Registries;
import net.minecraft.server.MinecraftServer;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import toughasnails.api.TANAPI;
import toughasnails.client.handler.KeyHandler;
import toughasnails.client.handler.LevelRenderHandler;
import toughasnails.client.handler.TooltipHandler;
import toughasnails.init.*;
import toughasnails.temperature.TemperatureHandler;
import toughasnails.temperature.TemperatureOverlayRenderer;
import toughasnails.thirst.ThirstHandler;
import toughasnails.thirst.ThirstOverlayRenderer;
public class ToughAsNails
{
public static final String MOD_ID = TANAPI.MOD_ID;
public static final Logger LOGGER = LogManager.getLogger(MOD_ID);
public static void init()
{
ModConfig.init();
ModTags.init();
addRegistrars();
addHandlers();
ModPackets.init();
ModApi.init();
ModCompatibility.init();
}
public static void setupClient()
{
ModClient.setupRenderTypes();
}
public static void onServerAboutToStart(MinecraftServer server)
{
ModVillages.addBuildings(server.registryAccess());
}
private static void addRegistrars()
{
var regHelper = RegistryHelper.create();
regHelper.addRegistrar(Registries.BLOCK, ModBlocks::registerBlocks);
regHelper.addRegistrar(Registries.ITEM, ModItems::registerItems);
regHelper.addRegistrar(Registries.MENU, ModContainerTypes::registerContainers);
regHelper.addRegistrar(Registries.BLOCK_ENTITY_TYPE, ModBlockEntities::registerBlockEntities);
regHelper.addRegistrar(Registries.RECIPE_SERIALIZER, ModCrafting::registerRecipeSerializers);
regHelper.addRegistrar(Registries.RECIPE_TYPE, ModCrafting::registerRecipeTypes);
regHelper.addRegistrar(Registries.RECIPE_BOOK_CATEGORY, ModCrafting::registerRecipeBookCategories);
regHelper.addRegistrar(Registries.MOB_EFFECT, ModPotions::registerEffects);
regHelper.addRegistrar(Registries.POTION, ModPotions::registerPotions);
regHelper.addRegistrar(Registries.CREATIVE_MODE_TAB, ModCreativeTab::registerCreativeTabs);
regHelper.addRegistrar(Registries.PARTICLE_TYPE, ModParticles::registerParticles);
regHelper.addRegistrar(Registries.POINT_OF_INTEREST_TYPE, ModVillages::registerPointsOfInterest);
regHelper.addRegistrar(Registries.VILLAGER_PROFESSION, ModVillages::registerProfessions);
}
private static void addHandlers()
{
// Temperature handlers
EventManager.addListener(TemperatureHandler::onChangeDimension);
EventManager.addListener(TemperatureHandler::onItemUseFinish);
// Thirst handlers
EventManager.addListener(ThirstHandler::onChangeDimension);
EventManager.addListener(ThirstHandler::onItemUseFinish);
EventManager.addListener(ThirstHandler::onPlayerUseItem);
EventManager.addListener(ThirstHandler::onUseBlock);
// Misc handlers
EventManager.addListener(ModVillages::addVillagerTrades);
EventManager.addListener(ModVillages::addWanderingVillagerTrades);
if (Environment.isClient())
{
addClientHandlers();
}
}
private static void addClientHandlers()
{
// Temperature
EventManager.addListener(TemperatureOverlayRenderer::onClientTick);
EventManager.addListener(TemperatureOverlayRenderer::onBeginRenderFood);
EventManager.addListener(TemperatureOverlayRenderer::onBeginRenderFrostbite);
EventManager.addListener(LevelRenderHandler::onLevelRender);
// Thirst
EventManager.addListener(ThirstOverlayRenderer::onClientTick);
EventManager.addListener(ThirstOverlayRenderer::onBeginRenderAir);
EventManager.addListener(ThirstHandler::onUseEmpty);
EventManager.addListener(ThirstHandler::onClientTick);
// Coloring
EventManager.addListener(ModClient::registerBlockColors);
// Particles
EventManager.addListener(ModClient::registerParticleSprites);
// Tooltips
EventManager.addListener(TooltipHandler::onTooltip);
EventManager.addListener(TooltipHandler::onRenderTooltip);
// Debug
EventManager.addListener(KeyHandler::onKeyPress);
}
}
================================================
FILE: common/src/main/java/toughasnails/crafting/WaterPurifierRecipe.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.crafting;
import com.mojang.serialization.Codec;
import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.RegistryAccess;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.world.Container;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.*;
import net.minecraft.world.level.Level;
import toughasnails.api.crafting.TANRecipeBookCategories;
import toughasnails.api.crafting.TANRecipeSerializers;
import toughasnails.api.crafting.TANRecipeTypes;
import javax.annotation.Nullable;
public class WaterPurifierRecipe implements Recipe
{
protected final ItemStack input;
protected final ItemStack result;
protected final int purifyTime;
@Nullable
private PlacementInfo placementInfo;
public WaterPurifierRecipe(ItemStack input, ItemStack result, int purifyTime)
{
this.input = input;
this.result = result;
this.purifyTime = purifyTime;
}
@Override
public boolean matches(SingleRecipeInput input, Level var2)
{
if (this.input == null)
return false;
ItemStack containerInput = input.getItem(0);
return ItemStack.isSameItemSameComponents(this.input, containerInput) && this.input.getDamageValue() == containerInput.getDamageValue();
}
@Override
public ItemStack assemble(SingleRecipeInput var1, HolderLookup.Provider var2)
{
return this.result.copy();
}
public ItemStack input()
{
return this.input;
}
protected ItemStack result()
{
return this.result;
}
@Override
public PlacementInfo placementInfo()
{
if (this.placementInfo == null) {
this.placementInfo = PlacementInfo.create(Ingredient.of(this.input.getItem()));
}
return this.placementInfo;
}
@Override
public RecipeBookCategory recipeBookCategory()
{
return TANRecipeBookCategories.WATER_PURIFYING;
}
@Override
public RecipeSerializer extends Recipe> getSerializer()
{
return TANRecipeSerializers.WATER_PURIFYING;
}
@Override
public RecipeType extends Recipe> getType()
{
return TANRecipeTypes.WATER_PURIFYING;
}
public int getPurifyTime()
{
return this.purifyTime;
}
public static class Serializer implements RecipeSerializer
{
private static final MapCodec CODEC = RecordCodecBuilder.mapCodec((builder) -> {
return builder.group(ItemStack.CODEC.fieldOf("input").forGetter((p_296920_) -> {
return p_296920_.input;
}), ItemStack.CODEC.fieldOf("result").forGetter((p_296923_) -> {
return p_296923_.result;
}), Codec.INT.fieldOf("purifytime").orElse(200).forGetter((p_296919_) -> {
return p_296919_.purifyTime;
})).apply(builder, WaterPurifierRecipe::new);
});
private final StreamCodec streamCodec = StreamCodec.of(this::toNetwork, this::fromNetwork);
public WaterPurifierRecipe fromNetwork(RegistryFriendlyByteBuf buffer)
{
ItemStack input = ItemStack.STREAM_CODEC.decode(buffer);
ItemStack result = ItemStack.STREAM_CODEC.decode(buffer);
int purifyTime = buffer.readInt();
return new WaterPurifierRecipe(input, result, purifyTime);
}
public void toNetwork(RegistryFriendlyByteBuf buffer, WaterPurifierRecipe recipe)
{
ItemStack.STREAM_CODEC.encode(buffer, recipe.input);
ItemStack.STREAM_CODEC.encode(buffer, recipe.result);
buffer.writeInt(recipe.purifyTime);
}
@Override
public MapCodec codec()
{
return CODEC;
}
@Override
public StreamCodec streamCodec() {
return this.streamCodec;
}
}
}
================================================
FILE: common/src/main/java/toughasnails/init/ModApi.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.init;
import toughasnails.api.temperature.TemperatureHelper;
import toughasnails.api.thirst.ThirstHelper;
import toughasnails.temperature.TemperatureHelperImpl;
import toughasnails.thirst.ThirstHelperImpl;
public class ModApi
{
public static void init()
{
ThirstHelper.Impl.INSTANCE = new ThirstHelperImpl();
TemperatureHelper.Impl.INSTANCE = new TemperatureHelperImpl();
}
}
================================================
FILE: common/src/main/java/toughasnails/init/ModArmorMaterials.java
================================================
package toughasnails.init;
import net.minecraft.util.Util;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.tags.ItemTags;
import net.minecraft.world.item.equipment.ArmorMaterial;
import net.minecraft.world.item.equipment.ArmorType;
import java.util.EnumMap;
public class ModArmorMaterials
{
public static final ArmorMaterial WOOL = new ArmorMaterial(5, Util.make(new EnumMap<>(ArmorType.class), map -> {
map.put(ArmorType.BOOTS, 1);
map.put(ArmorType.LEGGINGS, 1);
map.put(ArmorType.CHESTPLATE, 1);
map.put(ArmorType.HELMET, 1);
}), 1, SoundEvents.ARMOR_EQUIP_GENERIC, 0.0F, 0.0F, ItemTags.WOOL, ModEquipmentAssets.WOOL);
public static ArmorMaterial LEAF = new ArmorMaterial(5, Util.make(new EnumMap<>(ArmorType.class), (map) -> {
map.put(ArmorType.BOOTS, 1);
map.put(ArmorType.LEGGINGS, 1);
map.put(ArmorType.CHESTPLATE, 1);
map.put(ArmorType.HELMET, 1);
}), 1, SoundEvents.ARMOR_EQUIP_GENERIC, 0.0F, 0.0F, ItemTags.LEAVES, ModEquipmentAssets.LEAF);
}
================================================
FILE: common/src/main/java/toughasnails/init/ModBlockEntities.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.init;
import net.minecraft.resources.Identifier;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import toughasnails.api.block.TANBlocks;
import toughasnails.api.blockentity.TANBlockEntityTypes;
import toughasnails.block.entity.TemperatureGaugeBlockEntity;
import toughasnails.block.entity.ThermoregulatorBlockEntity;
import toughasnails.block.entity.WaterPurifierBlockEntity;
import toughasnails.core.ToughAsNails;
import java.util.Set;
import java.util.function.BiConsumer;
public class ModBlockEntities
{
public static void registerBlockEntities(BiConsumer> func)
{
TANBlockEntityTypes.WATER_PURIFIER = register(func, "water_purifier", WaterPurifierBlockEntity::new, Set.of(TANBlocks.WATER_PURIFIER));
TANBlockEntityTypes.TEMPERATURE_GAUGE = register(func, "temperature_gauge", TemperatureGaugeBlockEntity::new, Set.of(TANBlocks.TEMPERATURE_GAUGE));
TANBlockEntityTypes.THERMOREGULATOR = register(func, "thermoregulator", ThermoregulatorBlockEntity::new, Set.of(TANBlocks.THERMOREGULATOR));
}
private static BlockEntityType> register(BiConsumer> func, String name, BlockEntityType.BlockEntitySupplier supplier, Set blocks)
{
var type = new BlockEntityType(supplier, blocks);
func.accept(Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, name), type);
return type;
}
}
================================================
FILE: common/src/main/java/toughasnails/init/ModBlocks.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.init;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.Identifier;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.CaveVines;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.properties.NoteBlockInstrument;
import net.minecraft.world.level.material.MapColor;
import toughasnails.api.TANAPI;
import toughasnails.api.block.TANBlocks;
import toughasnails.block.RainCollectorBlock;
import toughasnails.block.TemperatureGaugeBlock;
import toughasnails.block.ThermoregulatorBlock;
import toughasnails.block.WaterPurifierBlock;
import toughasnails.core.ToughAsNails;
import java.util.function.BiConsumer;
import java.util.function.Function;
public class ModBlocks
{
public static void registerBlocks(BiConsumer func)
{
TANBlocks.THERMOREGULATOR = register(func, "thermoregulator", ThermoregulatorBlock::new, BlockBehaviour.Properties.of().mapColor(MapColor.STONE).instrument(NoteBlockInstrument.BASEDRUM).requiresCorrectToolForDrops().strength(3.5F).lightLevel(ThermoregulatorBlock.lightLevel(6)));
TANBlocks.TEMPERATURE_GAUGE = register(func, "temperature_gauge", TemperatureGaugeBlock::new, BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_RED).requiresCorrectToolForDrops().strength(1.0F));
TANBlocks.RAIN_COLLECTOR = register(func, "rain_collector", RainCollectorBlock::new, BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_BLUE).instrument(NoteBlockInstrument.BASS).strength(2.5F).sound(SoundType.WOOD).noOcclusion());
TANBlocks.WATER_PURIFIER = register(func, "water_purifier", WaterPurifierBlock::new, BlockBehaviour.Properties.of().mapColor(MapColor.WOOD).instrument(NoteBlockInstrument.BASS).requiresCorrectToolForDrops().strength(2.5F).sound(SoundType.WOOD).noOcclusion());
}
private static Block register(BiConsumer func, ResourceKey key, Function factory, BlockBehaviour.Properties properties)
{
Block block = factory.apply(properties.setId(key));
func.accept(key.identifier(), block);
return block;
}
private static Block register(BiConsumer func, String name, Function factory, BlockBehaviour.Properties properties)
{
return register(func, blockId(name), factory, properties);
}
private static ResourceKey blockId(String name)
{
return ResourceKey.create(Registries.BLOCK, Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, name));
}
}
================================================
FILE: common/src/main/java/toughasnails/init/ModClient.java
================================================
/*******************************************************************************
* Copyright 2023, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.init;
import glitchcore.event.client.RegisterColorsEvent;
import glitchcore.event.client.RegisterParticleSpritesEvent;
import glitchcore.util.RenderHelper;
import net.minecraft.client.renderer.chunk.ChunkSectionLayer;
import toughasnails.api.particle.TANParticles;
import toughasnails.client.particle.ThermoregulatorParticle;
import static toughasnails.api.block.TANBlocks.RAIN_COLLECTOR;
import static toughasnails.api.block.TANBlocks.WATER_PURIFIER;
public class ModClient
{
public static void registerBlockColors(RegisterColorsEvent.Block event)
{
event.register((state, world, pos, tintIndex) -> 0x47DAFF, RAIN_COLLECTOR);
event.register((state, world, pos, tintIndex) -> 0x3F76E4, WATER_PURIFIER);
}
public static void registerParticleSprites(RegisterParticleSpritesEvent event)
{
event.registerSpriteSet(TANParticles.THERMOREGULATOR_COOL, ThermoregulatorParticle.Provider::new);
event.registerSpriteSet(TANParticles.THERMOREGULATOR_WARM, ThermoregulatorParticle.Provider::new);
event.registerSpriteSet(TANParticles.THERMOREGULATOR_NEUTRAL, ThermoregulatorParticle.Provider::new);
}
public static void setupRenderTypes()
{
RenderHelper.setRenderType(RAIN_COLLECTOR, ChunkSectionLayer.CUTOUT);
RenderHelper.setRenderType(WATER_PURIFIER, ChunkSectionLayer.CUTOUT);
}
}
================================================
FILE: common/src/main/java/toughasnails/init/ModCompatibility.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.init;
import glitchcore.util.Environment;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Holder;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.levelgen.Heightmap;
import sereneseasons.api.season.Season;
import sereneseasons.api.season.SeasonHelper;
import sereneseasons.init.ModTags;
import sereneseasons.season.SeasonHooks;
import toughasnails.api.temperature.TemperatureHelper;
import toughasnails.api.temperature.TemperatureLevel;
import toughasnails.core.ToughAsNails;
public class ModCompatibility
{
public static void init()
{
if (Environment.isModLoaded("sereneseasons"))
{
ToughAsNails.LOGGER.info("Serene Seasons detected. Enabling season modifier.");
TemperatureHelper.registerPositionalTemperatureModifier(ModCompatibility::seasonModifier);
}
}
public static boolean coldEnoughToSnowSeasonal(Level level, Holder biome, BlockPos pos)
{
return SeasonHooks.coldEnoughToSnowSeasonal(level, pos, level.getSeaLevel());
}
private static TemperatureLevel seasonModifier(Level level, BlockPos pos, TemperatureLevel current)
{
Holder biome = level.getBiome(pos);
// Only adjust if above the environmental modifier altitude
if (pos.getY() <= ModConfig.temperature.environmentalModifierAltitude && pos.getY() < level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, pos).below().getY())
return current;
// Check if biome uses seasonal effects
if (biome.is(ModTags.Biomes.BLACKLISTED_BIOMES))
return current;
Season.TropicalSeason tropicalSeason = SeasonHelper.getSeasonState(level).getTropicalSeason();
// Adjust for mid dry/wet season
if (biome.is(ModTags.Biomes.TROPICAL_BIOMES))
{
switch (tropicalSeason)
{
case MID_DRY:
current = current.increment(1);
break;
case MID_WET:
if (current == TemperatureLevel.HOT)
current = current.decrement(1);
break;
}
return current;
}
Season season = SeasonHelper.getSeasonState(level).getSeason();
switch (season)
{
case SUMMER:
current = current.increment(1);
break;
case WINTER:
current = current.decrement(1);
break;
}
return current;
}
}
================================================
FILE: common/src/main/java/toughasnails/init/ModConfig.java
================================================
/*******************************************************************************
* Copyright 2023, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.init;
import glitchcore.config.ConfigSync;
import glitchcore.util.Environment;
import toughasnails.config.ClientConfig;
import toughasnails.config.TemperatureConfig;
import toughasnails.config.ThirstConfig;
public class ModConfig
{
public static ThirstConfig thirst;
public static TemperatureConfig temperature;
public static ClientConfig client;
public static void init()
{
thirst = new ThirstConfig();
temperature = new TemperatureConfig();
ConfigSync.register(thirst);
ConfigSync.register(temperature);
if (Environment.isClient())
{
client = new ClientConfig();
}
}
}
================================================
FILE: common/src/main/java/toughasnails/init/ModContainerTypes.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.init;
import glitchcore.util.Environment;
import net.minecraft.client.gui.screens.MenuScreens;
import net.minecraft.resources.Identifier;
import net.minecraft.world.flag.FeatureFlags;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.MenuType;
import toughasnails.api.TANAPI;
import toughasnails.api.container.TANContainerTypes;
import toughasnails.client.gui.ThermoregulatorScreen;
import toughasnails.client.gui.WaterPurifierScreen;
import toughasnails.container.ThermoregulatorContainer;
import toughasnails.container.WaterPurifierMenu;
import java.util.function.BiConsumer;
public class ModContainerTypes
{
public static void registerContainers(BiConsumer> func)
{
TANContainerTypes.WATER_PURIFIER = register(func, "water_purifier", WaterPurifierMenu::new);
TANContainerTypes.THERMOREGULATOR = register(func, "thermoregulator", ThermoregulatorContainer::new);
if (Environment.isClient())
{
MenuScreens.register((MenuType) TANContainerTypes.WATER_PURIFIER, WaterPurifierScreen::new);
MenuScreens.register((MenuType) TANContainerTypes.THERMOREGULATOR, ThermoregulatorScreen::new);
}
}
public static MenuType> register(BiConsumer> func, String name, MenuType.MenuSupplier factory)
{
var menuType = new MenuType<>(factory, FeatureFlags.DEFAULT_FLAGS);
func.accept(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, name), menuType);
return menuType;
}
}
================================================
FILE: common/src/main/java/toughasnails/init/ModCrafting.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.init;
import net.minecraft.resources.Identifier;
import net.minecraft.world.item.crafting.*;
import toughasnails.api.TANAPI;
import toughasnails.api.crafting.TANRecipeBookCategories;
import toughasnails.api.crafting.TANRecipeSerializers;
import toughasnails.api.crafting.TANRecipeTypes;
import toughasnails.crafting.WaterPurifierRecipe;
import java.util.function.BiConsumer;
public class ModCrafting
{
public static void registerRecipeSerializers(BiConsumer> func)
{
TANRecipeSerializers.WATER_PURIFYING = (RecipeSerializer extends Recipe>) registerSerializer(func, "water_purifying", new WaterPurifierRecipe.Serializer());
}
public static void registerRecipeTypes(BiConsumer> func)
{
TANRecipeTypes.WATER_PURIFYING = (RecipeType extends Recipe>) registerRecipe(func, "water_purifying", new RecipeType()
{
@Override
public String toString()
{
return "water_purifying";
}
});
}
public static void registerRecipeBookCategories(BiConsumer func)
{
TANRecipeBookCategories.WATER_PURIFYING = registerRecipeBookCategory(func, "water_purifying", new RecipeBookCategory());
}
private static RecipeSerializer> registerSerializer(BiConsumer> func, String name, RecipeSerializer> serializer)
{
func.accept(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, name), serializer);
return serializer;
}
private static RecipeType> registerRecipe(BiConsumer> func, String name, RecipeType> type)
{
func.accept(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, name), type);
return type;
}
private static RecipeBookCategory registerRecipeBookCategory(BiConsumer func, String name, RecipeBookCategory category)
{
func.accept(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, name), category);
return category;
}
}
================================================
FILE: common/src/main/java/toughasnails/init/ModCreativeTab.java
================================================
/*******************************************************************************
* Copyright 2022, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.init;
import com.google.common.collect.ImmutableList;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.Identifier;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.Block;
import toughasnails.api.TANAPI;
import toughasnails.api.block.TANBlocks;
import toughasnails.api.item.TANItems;
import java.lang.reflect.Field;
import java.util.function.BiConsumer;
public class ModCreativeTab
{
public static void registerCreativeTabs(BiConsumer func)
{
var ITEM_BLACKLIST = ImmutableList.of(TANItems.TAN_ICON);
var tab = CreativeModeTab.builder(CreativeModeTab.Row.TOP, 0)
.icon(() -> new ItemStack(TANItems.TAN_ICON))
.title(Component.translatable("itemGroup.toughasnails"))
.displayItems((displayParameters, output) ->
{
for (Field field : TANItems.class.getFields())
{
if (field.getType() != Item.class) continue;
try
{
Item item = (Item) field.get(null);
if (!ITEM_BLACKLIST.contains(item))
output.accept(new ItemStack(item));
}
catch (IllegalAccessException e)
{
}
}
}).build();
register(func, "main", tab);
}
private static CreativeModeTab register(BiConsumer func, String name, CreativeModeTab tab)
{
func.accept(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, name), tab);
return tab;
}
}
================================================
FILE: common/src/main/java/toughasnails/init/ModEnchantments.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.init;
import net.minecraft.core.HolderGetter;
import net.minecraft.core.registries.Registries;
import net.minecraft.data.worldgen.BootstrapContext;
import net.minecraft.resources.ResourceKey;
import net.minecraft.tags.EnchantmentTags;
import net.minecraft.tags.ItemTags;
import net.minecraft.world.entity.EquipmentSlotGroup;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.enchantment.Enchantment;
import toughasnails.api.enchantment.TANEnchantments;
public class ModEnchantments
{
public static void bootstrap(BootstrapContext context)
{
HolderGetter enchantmentGetter = context.lookup(Registries.ENCHANTMENT);
HolderGetter- itemGetter = context.lookup(Registries.ITEM);
register(
context,
TANEnchantments.THERMAL_TUNING,
Enchantment.enchantment(
Enchantment.definition(itemGetter.getOrThrow(ItemTags.CHEST_ARMOR_ENCHANTABLE), 2, 1, Enchantment.dynamicCost(25, 25), Enchantment.dynamicCost(75, 25), 4, EquipmentSlotGroup.CHEST)
)
);
register(
context,
TANEnchantments.WATER_CLEANSING,
Enchantment.enchantment(
Enchantment.definition(itemGetter.getOrThrow(ModTags.Items.CANTEEN), 2, 1, Enchantment.dynamicCost(25, 25), Enchantment.dynamicCost(75, 25), 4, EquipmentSlotGroup.MAINHAND)
)
);
}
private static void register(BootstrapContext context, ResourceKey key, Enchantment.Builder builder)
{
context.register(key, builder.build(key.identifier()));
}
}
================================================
FILE: common/src/main/java/toughasnails/init/ModEquipmentAssets.java
================================================
/*******************************************************************************
* Copyright 2024, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.init;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.Identifier;
import net.minecraft.world.item.equipment.EquipmentAsset;
import net.minecraft.world.item.equipment.EquipmentAssets;
import toughasnails.core.ToughAsNails;
import java.util.function.BiConsumer;
public class ModEquipmentAssets
{
public static final ResourceKey LEAF = createId("leaf");
public static final ResourceKey WOOL = createId("wool");
static ResourceKey createId(String name)
{
return ResourceKey.create(EquipmentAssets.ROOT_ID, Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, name));
}
}
================================================
FILE: common/src/main/java/toughasnails/init/ModItems.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.init;
import glitchcore.util.Environment;
import net.minecraft.core.component.DataComponents;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.Identifier;
import net.minecraft.world.food.FoodProperties;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.component.Consumables;
import net.minecraft.world.item.component.DyedItemColor;
import net.minecraft.world.item.equipment.ArmorType;
import net.minecraft.world.level.block.Block;
import toughasnails.api.TANAPI;
import toughasnails.api.block.TANBlocks;
import toughasnails.api.item.TANItems;
import toughasnails.core.ToughAsNails;
import toughasnails.item.*;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.Function;
public class ModItems
{
public static void registerItems(BiConsumer func)
{
// Block Items
TANItems.THERMOREGULATOR = registerBlock(func, TANBlocks.THERMOREGULATOR);
TANItems.TEMPERATURE_GAUGE = registerBlock(func, TANBlocks.TEMPERATURE_GAUGE);
TANItems.RAIN_COLLECTOR = registerBlock(func, TANBlocks.RAIN_COLLECTOR);
TANItems.WATER_PURIFIER = registerBlock(func, TANBlocks.WATER_PURIFIER);
// Items
TANItems.THERMOMETER = registerItem(func, "thermometer", Item::new, new Item.Properties().stacksTo(1));
TANItems.LEAF_HELMET = registerItem(func, "leaf_helmet", new Item.Properties().humanoidArmor(ModArmorMaterials.LEAF, ArmorType.HELMET).stacksTo(1));
TANItems.LEAF_CHESTPLATE = registerItem(func, "leaf_chestplate", new Item.Properties().humanoidArmor(ModArmorMaterials.LEAF, ArmorType.CHESTPLATE).stacksTo(1));
TANItems.LEAF_LEGGINGS = registerItem(func, "leaf_leggings", new Item.Properties().humanoidArmor(ModArmorMaterials.LEAF, ArmorType.LEGGINGS).stacksTo(1));
TANItems.LEAF_BOOTS = registerItem(func, "leaf_boots", new Item.Properties().humanoidArmor(ModArmorMaterials.LEAF, ArmorType.BOOTS).stacksTo(1));
TANItems.WOOL_HELMET = registerItem(func, "wool_helmet", new Item.Properties().component(DataComponents.DYED_COLOR, new DyedItemColor(0xFFFFFF)).humanoidArmor(ModArmorMaterials.WOOL, ArmorType.HELMET).stacksTo(1));
TANItems.WOOL_CHESTPLATE = registerItem(func, "wool_chestplate", new Item.Properties().component(DataComponents.DYED_COLOR, new DyedItemColor(0xFFFFFF)).humanoidArmor(ModArmorMaterials.WOOL, ArmorType.CHESTPLATE).stacksTo(1));
TANItems.WOOL_LEGGINGS = registerItem(func, "wool_leggings", new Item.Properties().component(DataComponents.DYED_COLOR, new DyedItemColor(0xFFFFFF)).humanoidArmor(ModArmorMaterials.WOOL, ArmorType.LEGGINGS).stacksTo(1));
TANItems.WOOL_BOOTS = registerItem(func, "wool_boots", new Item.Properties().component(DataComponents.DYED_COLOR, new DyedItemColor(0xFFFFFF)).humanoidArmor(ModArmorMaterials.WOOL, ArmorType.BOOTS).stacksTo(1));
TANItems.ICE_CREAM = registerItem(func, "ice_cream", StackableBowlFoodItem::new, new Item.Properties().stacksTo(16).component(DataComponents.CONSUMABLE, Consumables.DEFAULT_FOOD).usingConvertsTo(Items.BOWL).food(new FoodProperties.Builder().nutrition(0).saturationModifier(0.0F).alwaysEdible().build()));
TANItems.CHARC_0S = registerItem(func, "charc_os", StackableBowlFoodItem::new, new Item.Properties().stacksTo(16).component(DataComponents.CONSUMABLE, Consumables.DEFAULT_FOOD).usingConvertsTo(Items.BOWL).food(new FoodProperties.Builder().nutrition(0).saturationModifier(0.0F).alwaysEdible().build()));
TANItems.EMPTY_LEATHER_CANTEEN = registerItem(func, "empty_leather_canteen", p -> new EmptyCanteenItem(0, p), new Item.Properties().enchantable(1).stacksTo(1));
TANItems.LEATHER_DIRTY_WATER_CANTEEN = registerItem(func, "leather_dirty_water_canteen", p -> new FilledCanteenItem(0, p), new Item.Properties().durability(5));
TANItems.LEATHER_WATER_CANTEEN = registerItem(func, "leather_water_canteen", p -> new FilledCanteenItem(0, p), new Item.Properties().durability(5));
TANItems.LEATHER_PURIFIED_WATER_CANTEEN = registerItem(func, "leather_purified_water_canteen", p -> new FilledCanteenItem(0, p), new Item.Properties().durability(5));
TANItems.EMPTY_COPPER_CANTEEN = registerItem(func, "empty_copper_canteen", p -> new EmptyCanteenItem(1, p), new Item.Properties().enchantable(1).stacksTo(1));
TANItems.COPPER_DIRTY_WATER_CANTEEN = registerItem(func, "copper_dirty_water_canteen", p -> new FilledCanteenItem(1, p), new Item.Properties().durability(6));
TANItems.COPPER_WATER_CANTEEN = registerItem(func, "copper_water_canteen", p -> new FilledCanteenItem(1, p), new Item.Properties().durability(6));
TANItems.COPPER_PURIFIED_WATER_CANTEEN = registerItem(func, "copper_purified_water_canteen", p -> new FilledCanteenItem(1, p), new Item.Properties().durability(6));
TANItems.EMPTY_IRON_CANTEEN = registerItem(func, "empty_iron_canteen", p -> new EmptyCanteenItem(2, p), new Item.Properties().enchantable(1).stacksTo(1));
TANItems.IRON_DIRTY_WATER_CANTEEN = registerItem(func, "iron_dirty_water_canteen", p -> new FilledCanteenItem(2, p), new Item.Properties().durability(7));
TANItems.IRON_WATER_CANTEEN = registerItem(func, "iron_water_canteen", p -> new FilledCanteenItem(2, p), new Item.Properties().durability(7));
TANItems.IRON_PURIFIED_WATER_CANTEEN = registerItem(func, "iron_purified_water_canteen", p -> new FilledCanteenItem(2, p), new Item.Properties().durability(7));
TANItems.EMPTY_GOLD_CANTEEN = registerItem(func, "empty_gold_canteen", p -> new EmptyCanteenItem(3, p), new Item.Properties().enchantable(1).stacksTo(1));
TANItems.GOLD_DIRTY_WATER_CANTEEN = registerItem(func, "gold_dirty_water_canteen", p -> new FilledCanteenItem(3, p), new Item.Properties().durability(10));
TANItems.GOLD_WATER_CANTEEN = registerItem(func, "gold_water_canteen", p -> new FilledCanteenItem(3, p), new Item.Properties().durability(10));
TANItems.GOLD_PURIFIED_WATER_CANTEEN = registerItem(func, "gold_purified_water_canteen", p -> new FilledCanteenItem(3, p), new Item.Properties().durability(10));
TANItems.EMPTY_DIAMOND_CANTEEN = registerItem(func, "empty_diamond_canteen", p -> new EmptyCanteenItem(4, p), new Item.Properties().enchantable(1).stacksTo(1));
TANItems.DIAMOND_DIRTY_WATER_CANTEEN = registerItem(func, "diamond_dirty_water_canteen", p -> new FilledCanteenItem(4, p), new Item.Properties().durability(15));
TANItems.DIAMOND_WATER_CANTEEN = registerItem(func, "diamond_water_canteen", p -> new FilledCanteenItem(4, p), new Item.Properties().durability(15));
TANItems.DIAMOND_PURIFIED_WATER_CANTEEN = registerItem(func, "diamond_purified_water_canteen", p -> new FilledCanteenItem(4, p), new Item.Properties().durability(15));
TANItems.EMPTY_NETHERITE_CANTEEN = registerItem(func, "empty_netherite_canteen", p -> new EmptyCanteenItem(5, p), new Item.Properties().enchantable(1).stacksTo(1));
TANItems.NETHERITE_DIRTY_WATER_CANTEEN = registerItem(func, "netherite_dirty_water_canteen", p -> new FilledCanteenItem(5, p), new Item.Properties().durability(25));
TANItems.NETHERITE_WATER_CANTEEN = registerItem(func, "netherite_water_canteen", p -> new FilledCanteenItem(5, p), new Item.Properties().durability(25));
TANItems.NETHERITE_PURIFIED_WATER_CANTEEN = registerItem(func, "netherite_purified_water_canteen", p -> new FilledCanteenItem(5, p), new Item.Properties().durability(25));
TANItems.DIRTY_WATER_BOTTLE = registerItem(func, "dirty_water_bottle", DirtyWaterBottleItem::new, new Item.Properties().stacksTo(1));
TANItems.PURIFIED_WATER_BOTTLE = registerItem(func, "purified_water_bottle", PurifiedWaterBottleItem::new, new Item.Properties().stacksTo(1));
TANItems.APPLE_JUICE = registerItem(func, "apple_juice", JuiceItem::new, new Item.Properties().stacksTo(16));
TANItems.CACTUS_JUICE = registerItem(func, "cactus_juice", JuiceItem::new, new Item.Properties().stacksTo(16));
TANItems.CHORUS_FRUIT_JUICE = registerItem(func, "chorus_fruit_juice", JuiceItem::new, new Item.Properties().stacksTo(16));
TANItems.GLOW_BERRY_JUICE = registerItem(func, "glow_berry_juice", JuiceItem::new, new Item.Properties().stacksTo(16));
TANItems.MELON_JUICE = registerItem(func, "melon_juice", JuiceItem::new, new Item.Properties().stacksTo(16));
TANItems.PUMPKIN_JUICE = registerItem(func, "pumpkin_juice", JuiceItem::new, new Item.Properties().stacksTo(16));
TANItems.SWEET_BERRY_JUICE = registerItem(func, "sweet_berry_juice", JuiceItem::new, new Item.Properties().stacksTo(16));
TANItems.TAN_ICON = registerItem(func, "tan_icon", Item::new, new Item.Properties());
}
public static Item registerBlock(BiConsumer func, Block block)
{
return registerBlock(func, block, BlockItem::new);
}
public static Item registerBlock(BiConsumer func, Block block, BiFunction factory)
{
return registerBlock(func, block, factory, new Item.Properties());
}
public static Item registerBlock(BiConsumer func, Block block, BiFunction factory, Item.Properties properties)
{
return registerItem(func, blockIdToItemId(block.builtInRegistryHolder().key()), p_370785_ -> factory.apply(block, p_370785_), properties.useBlockDescriptionPrefix()
);
}
private static Item registerItem(BiConsumer func, ResourceKey
- key, Function factory, Item.Properties properties)
{
Item item = factory.apply(properties.setId(key));
func.accept(key.identifier(), item);
return item;
}
private static Item registerItem(BiConsumer func, String name, Function factory, Item.Properties properties)
{
return registerItem(func, itemId(name), factory, properties);
}
private static Item registerItem(BiConsumer func, String name, Item.Properties properties)
{
return registerItem(func, itemId(name), Item::new, properties);
}
private static ResourceKey
- blockIdToItemId(ResourceKey key)
{
return ResourceKey.create(Registries.ITEM, key.identifier());
}
private static ResourceKey
- itemId(String name)
{
return ResourceKey.create(Registries.ITEM, Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, name));
}
}
================================================
FILE: common/src/main/java/toughasnails/init/ModPackets.java
================================================
/*******************************************************************************
* Copyright 2023, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.init;
import glitchcore.network.CustomPacket;
import glitchcore.network.PacketHandler;
import net.minecraft.resources.Identifier;
import toughasnails.api.TANAPI;
import toughasnails.core.ToughAsNails;
import toughasnails.network.DrinkInWorldPacket;
import toughasnails.network.UpdateTemperaturePacket;
import toughasnails.network.UpdateThirstPacket;
public class ModPackets
{
private static final Identifier CHANNEL = Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "main");
public static final PacketHandler HANDLER = new PacketHandler(CHANNEL);
public static void init()
{
register("update_temperature", new UpdateTemperaturePacket());
register("update_thirst", new UpdateThirstPacket());
register("drink_in_world", new DrinkInWorldPacket());
}
public static void register(String name, CustomPacket> packet)
{
HANDLER.register(Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, name), packet);
}
}
================================================
FILE: common/src/main/java/toughasnails/init/ModParticles.java
================================================
/*******************************************************************************
* Copyright 2023, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.init;
import net.minecraft.core.particles.ParticleOptions;
import net.minecraft.core.particles.ParticleType;
import net.minecraft.core.particles.SimpleParticleType;
import net.minecraft.resources.Identifier;
import toughasnails.api.TANAPI;
import toughasnails.api.particle.TANParticles;
import java.util.function.BiConsumer;
public class ModParticles
{
public static void registerParticles(BiConsumer> func)
{
TANParticles.THERMOREGULATOR_COOL = register(func, "thermoregulator_cool", new SimpleParticleType(false));
TANParticles.THERMOREGULATOR_WARM = register(func, "thermoregulator_warm", new SimpleParticleType(false));
TANParticles.THERMOREGULATOR_NEUTRAL = register(func, "thermoregulator_neutral", new SimpleParticleType(false));
}
private static > T register(BiConsumer> func, String name, T particle)
{
func.accept(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, name), particle);
return particle;
}
}
================================================
FILE: common/src/main/java/toughasnails/init/ModPotions.java
================================================
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.init;
import net.minecraft.core.Holder;
import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.Identifier;
import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.effect.MobEffectCategory;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.alchemy.Potion;
import net.minecraft.world.item.alchemy.PotionBrewing;
import net.minecraft.world.item.alchemy.Potions;
import toughasnails.api.TANAPI;
import toughasnails.api.potion.TANEffects;
import toughasnails.api.potion.TANPotions;
import toughasnails.core.ToughAsNails;
import toughasnails.potion.ThirstEffect;
import java.util.function.BiConsumer;
public class ModPotions
{
public static void registerEffects(BiConsumer func)
{
TANEffects.THIRST = registerEffect(func, "thirst", new ThirstEffect(MobEffectCategory.HARMFUL, 0x76DB4C));
TANEffects.ICE_RESISTANCE = registerEffect(func, "ice_resistance", new MobEffect(MobEffectCategory.BENEFICIAL, 0x77A9FF));
TANEffects.CLIMATE_CLEMENCY = registerEffect(func, "climate_clemency", new MobEffect(MobEffectCategory.BENEFICIAL, 0xB6B6B6));
TANEffects.INTERNAL_WARMTH = registerEffect(func, "internal_warmth", new MobEffect(MobEffectCategory.BENEFICIAL, 0xFFFAD9));
TANEffects.INTERNAL_CHILL = registerEffect(func, "internal_chill", new MobEffect(MobEffectCategory.BENEFICIAL, 0xE1FCFF));
}
public static void registerPotions(BiConsumer func)
{
TANPotions.ICE_RESISTANCE = registerPotion(func, "ice_resistance", new Potion("ice_resistance", new MobEffectInstance(TANEffects.ICE_RESISTANCE, 3600)));
TANPotions.LONG_ICE_RESISTANCE = registerPotion(func, "long_ice_resistance", new Potion("long_ice_resistance", new MobEffectInstance(TANEffects.ICE_RESISTANCE, 9600)));
}
private static Holder registerEffect(BiConsumer func, String name, MobEffect effect)
{
Identifier location = Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, name);
ResourceKey key = ResourceKey.create(Registries.MOB_EFFECT, location);
func.accept(location, effect);
return BuiltInRegistries.MOB_EFFECT.get(key).orElseThrow();
}
private static Holder registerPotion(BiConsumer func, String name, Potion potion)
{
Identifier location = Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, name);
ResourceKey key = ResourceKey.create(Registries.POTION, location);
func.accept(location, potion);
return BuiltInRegistries.POTION.get(key).orElseThrow();
}
}
================================================
FILE: common/src/main/java/toughasnails/init/ModRecipePropertySets.java
================================================
/*******************************************************************************
* Copyright 2024, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.init;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.Identifier;
import net.minecraft.world.item.crafting.RecipePropertySet;
import toughasnails.core.ToughAsNails;
public class ModRecipePropertySets
{
public static final ResourceKey WATER_PURIFYING = register("water_purifying");
private static ResourceKey register(String name)
{
return ResourceKey.create(RecipePropertySet.TYPE_KEY, Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, name));
}
}
================================================
FILE: common/src/main/java/toughasnails/init/ModTags.java
================================================
package toughasnails.init;
import net.minecraft.core.Holder;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.Identifier;
import net.minecraft.tags.TagKey;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.equipment.trim.TrimMaterial;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.block.Block;
import toughasnails.api.TANAPI;
import toughasnails.api.thirst.WaterType;
import toughasnails.core.ToughAsNails;
public class ModTags
{
public static void init()
{
Blocks.init();
Items.init();
Biomes.init();
Trims.init();
EntityTypes.init();
}
public static class Blocks
{
private static void init() {}
public static final TagKey COOLING_BLOCKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "cooling_blocks"));
public static final TagKey HEATING_BLOCKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "heating_blocks"));
public static final TagKey PASSABLE_BLOCKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "passable_blocks"));
public static TagKey create(Identifier name)
{
return TagKey.create(Registries.BLOCK, name);
}
}
public static class Items
{
private static void init() {}
public static final TagKey
- COOLING_ARMOR = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "cooling_armor"));
public static final TagKey
- HEATING_ARMOR = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "heating_armor"));
public static final TagKey
- COOLING_HELD_ITEMS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "cooling_held_items"));
public static final TagKey
- HEATING_HELD_ITEMS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "heating_held_items"));
public static final TagKey
- COOLING_CONSUMED_ITEMS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "cooling_consumed_items"));
public static final TagKey
- HEATING_CONSUMED_ITEMS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "heating_consumed_items"));
public static final TagKey
- THERMOREGULATOR_COOLING_FUEL = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "thermoregulator_cooling_fuel"));
public static final TagKey
- THERMOREGULATOR_HEATING_FUEL = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "thermoregulator_heating_fuel"));
public static final TagKey
- ONE_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "thirst/1_thirst_drinks"));
public static final TagKey
- TWO_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "thirst/2_thirst_drinks"));
public static final TagKey
- THREE_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "thirst/3_thirst_drinks"));
public static final TagKey
- FOUR_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "thirst/4_thirst_drinks"));
public static final TagKey
- FIVE_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "thirst/5_thirst_drinks"));
public static final TagKey
- SIX_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "thirst/6_thirst_drinks"));
public static final TagKey
- SEVEN_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "thirst/7_thirst_drinks"));
public static final TagKey
- EIGHT_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "thirst/8_thirst_drinks"));
public static final TagKey
- NINE_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "thirst/9_thirst_drinks"));
public static final TagKey
- TEN_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "thirst/10_thirst_drinks"));
public static final TagKey
- ELEVEN_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "thirst/11_thirst_drinks"));
public static final TagKey
- TWELVE_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "thirst/12_thirst_drinks"));
public static final TagKey
- THIRTEEN_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "thirst/13_thirst_drinks"));
public static final TagKey
- FOURTEEN_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "thirst/14_thirst_drinks"));
public static final TagKey
- FIFTEEN_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "thirst/15_thirst_drinks"));
public static final TagKey
- SIXTEEN_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "thirst/16_thirst_drinks"));
public static final TagKey
- SEVENTEEN_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "thirst/17_thirst_drinks"));
public static final TagKey
- EIGHTEEN_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "thirst/18_thirst_drinks"));
public static final TagKey
- NINETEEN_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "thirst/19_thirst_drinks"));
public static final TagKey
- TWENTY_THIRST_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "thirst/20_thirst_drinks"));
public static final TagKey
- TEN_HYDRATION_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "hydration/10_hydration_drinks"));
public static final TagKey
- TWENTY_HYDRATION_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "hydration/20_hydration_drinks"));
public static final TagKey
- THIRTY_HYDRATION_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "hydration/30_hydration_drinks"));
public static final TagKey
- FOURTY_HYDRATION_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "hydration/40_hydration_drinks"));
public static final TagKey
- FIFTY_HYDRATION_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "hydration/50_hydration_drinks"));
public static final TagKey
- SIXTY_HYDRATION_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "hydration/60_hydration_drinks"));
public static final TagKey
- SEVENTY_HYDRATION_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "hydration/70_hydration_drinks"));
public static final TagKey
- EIGHTY_HYDRATION_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "hydration/80_hydration_drinks"));
public static final TagKey
- NINETY_HYDRATION_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "hydration/90_hydration_drinks"));
public static final TagKey
- ONE_HUNDRED_HYDRATION_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "hydration/100_hydration_drinks"));
public static final TagKey
- TWENTY_FIVE_POISON_CHANCE_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "poison_chance/25_poison_chance_drinks"));
public static final TagKey
- FIFTY_POISON_CHANCE_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "poison_chance/50_poison_chance_drinks"));
public static final TagKey
- SEVENTY_FIVE_POISON_CHANCE_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "poison_chance/75_poison_chance_drinks"));
public static final TagKey
- ONE_HUNDRED_POISON_CHANCE_DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "poison_chance/100_poison_chance_drinks"));
public static final TagKey
- DRINKS = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "drinks"));
public static final TagKey
- CANTEEN = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "enchantable/canteen"));
public static int getThirstRestored(ItemStack drink)
{
if (drink.is(ModTags.Items.ONE_THIRST_DRINKS)) { return 1; }
if (drink.is(ModTags.Items.TWO_THIRST_DRINKS)) { return 2; }
if (drink.is(ModTags.Items.THREE_THIRST_DRINKS)) { return 3; }
if (drink.is(ModTags.Items.FOUR_THIRST_DRINKS)) { return 4; }
if (drink.is(ModTags.Items.FIVE_THIRST_DRINKS)) { return 5; }
if (drink.is(ModTags.Items.SIX_THIRST_DRINKS)) { return 6; }
if (drink.is(ModTags.Items.SEVEN_THIRST_DRINKS)) { return 7; }
if (drink.is(ModTags.Items.EIGHT_THIRST_DRINKS)) { return 8; }
if (drink.is(ModTags.Items.NINE_THIRST_DRINKS)) { return 9; }
if (drink.is(ModTags.Items.TEN_THIRST_DRINKS)) { return 10; }
if (drink.is(ModTags.Items.ELEVEN_THIRST_DRINKS)) { return 11; }
if (drink.is(ModTags.Items.TWELVE_THIRST_DRINKS)) { return 12; }
if (drink.is(ModTags.Items.THIRTEEN_THIRST_DRINKS)) { return 13; }
if (drink.is(ModTags.Items.FOURTEEN_THIRST_DRINKS)) { return 14; }
if (drink.is(ModTags.Items.FIFTEEN_THIRST_DRINKS)) { return 15; }
if (drink.is(ModTags.Items.SIXTEEN_THIRST_DRINKS)) { return 16; }
if (drink.is(ModTags.Items.SEVENTEEN_THIRST_DRINKS)) { return 17; }
if (drink.is(ModTags.Items.EIGHTEEN_THIRST_DRINKS)) { return 18; }
if (drink.is(ModTags.Items.NINETEEN_THIRST_DRINKS)) { return 19; }
if (drink.is(ModTags.Items.TWENTY_THIRST_DRINKS)) { return 20; }
return 0;
}
public static TagKey
- create(final Identifier name)
{
return TagKey.create(Registries.ITEM, name);
}
}
public static class Biomes
{
private static void init() {}
public static final TagKey ICY_BIOMES = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "icy_biomes"));
public static final TagKey COLD_BIOMES = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "cold_biomes"));
public static final TagKey NEUTRAL_BIOMES = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "neutral_biomes"));
public static final TagKey WARM_BIOMES = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "warm_biomes"));
public static final TagKey HOT_BIOMES = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "hot_biomes"));
public static final TagKey DIRTY_WATER_BIOMES = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "dirty_water_biomes"));
public static final TagKey PURIFIED_WATER_BIOMES = create(Identifier.fromNamespaceAndPath(TANAPI.MOD_ID, "purified_water_biomes"));
private static TagKey create(Identifier loc)
{
return TagKey.create(Registries.BIOME, loc);
}
public static WaterType getBiomeWaterType(Holder biome)
{
if (biome.is(DIRTY_WATER_BIOMES))
return WaterType.DIRTY;
else if (biome.is(PURIFIED_WATER_BIOMES))
return WaterType.PURIFIED;
else
return WaterType.NORMAL;
}
}
public static class Trims
{
public static void init() {}
public static final TagKey COOLING_TRIMS = create("cooling_trims");
public static final TagKey HEATING_TRIMS = create("heating_trims");
private static TagKey create(String name)
{
return TagKey.create(Registries.TRIM_MATERIAL, Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, name));
}
}
public static class EntityTypes
{
private static void init() {}
public static final TagKey> NEUTRALISING_MOUNTS = create(Identifier.fromNamespaceAndPath(ToughAsNails.MOD_ID, "neutralising_mounts"));
public static TagKey> create(Identifier name)
{
return TagKey.create(Registries.ENTITY_TYPE, name);
}
}
}
================================================
FILE: common/src/main/java/toughasnails/init/ModVillages.java
================================================
/*******************************************************************************
* Copyright 2023, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package toughasnails.init;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.mojang.datafixers.util.Pair;
import glitchcore.event.village.VillagerTradesEvent;
import glitchcore.event.village.WandererTradesEvent;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import net.minecraft.core.Holder;
import net.minecraft.core.Registry;
import net.minecraft.core.RegistryAccess;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.Identifier;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.util.RandomSource;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.ai.village.poi.PoiType;
import net.minecraft.world.entity.ai.village.poi.PoiTypes;
import net.minecraft.world.entity.npc.villager.VillagerProfession;
import net.minecraft.world.entity.npc.villager.VillagerTrades;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.trading.ItemCost;
import net.minecraft.world.item.trading.MerchantOffer;
import net.minecraft.world.level.ItemLike;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.levelgen.structure.pools.SinglePoolElement;
import net.minecraft.world.level.levelgen.structure.pools.StructurePoolElement;
import net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool;
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorList;
import toughasnails.api.block.TANBlocks;
import toughasnails.api.item.TANItems;
import toughasnails.api.village.TANPoiTypes;
import toughasnails.api.village.TANVillagerProfessions;
import toughasnails.core.ToughAsNails;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.Predicate;
public class ModVillages
{
//Cost, Amount, Trades Until Disabled, Villager XP, Price Multiplier
//Amount Required, Trades Until Disabled, Villager XP
private static final VillagerTrades.ItemListing[] CLIMATOLOGIST_LEVEL_1_TRADES = new VillagerTrades.ItemListing[]{
new ItemsForEmeralds(new ItemStack(TANItems.ICE_CREAM), 1, 2, 12, 1, 0.2F),
new ItemsForEmeralds(new ItemStack(TANItems.CHARC_0S), 1, 2, 12, 1, 0.2F)};
private static final VillagerTrades.ItemListing[] CLIMATOLOGIST_LEVEL_2_TRADES = new VillagerTrades.ItemListing[]{
new ItemsForEmeralds(new ItemStack(Blocks.PACKED_ICE), 4, 8, 16, 1, 0.2F),
new ItemsForEmeralds(new ItemStack(Blocks.MAGMA_BLOCK), 4, 8, 16, 1, 0.2F),
new EmeraldForItems(Blocks.PACKED_ICE, 16, 10, 2),
new EmeraldForItems(Blocks.MAGMA_BLOCK, 16, 10, 2)};
private static final VillagerTrades.ItemListing[] CLIMATOLOGIST_LEVEL_3_TRADES = new VillagerTrades.ItemListing[]{
new ItemsForEmeralds(new ItemStack(TANItems.WOOL_HELMET), 5, 1, 12, 3, 0.2F),
new ItemsForEmeralds(new ItemStack(TANItems.WOOL_BOOTS), 4, 1, 12, 3, 0.2F),
new ItemsForEmeralds(new ItemStack(TANItems.LEAF_HELMET), 5, 1, 12, 3, 0.2F),
new ItemsForEmeralds(new ItemStack(TANItems.LEAF_BOOTS), 4, 1, 12, 3, 0.2F)};
private static final VillagerTrades.ItemListing[] CLIMATOLOGIST_LEVEL_4_TRADES = new VillagerTrades.ItemListing[]{
new ItemsForEmeralds(new ItemStack(TANItems.WOOL_CHESTPLATE), 7, 1, 12, 3, 0.2F),
new ItemsForEmeralds(new ItemStack(TANItems.WOOL_LEGGINGS), 3, 1, 12, 3, 0.2F),
new ItemsForEmeralds(new ItemStack(TANItems.LEAF_CHESTPLATE), 7, 1, 12, 3, 0.2F),
new ItemsForEmeralds(new ItemStack(TANItems.LEAF_LEGGINGS), 3, 1, 12, 3, 0.2F)};
private static final VillagerTrades.ItemListing[] CLIMATOLOGIST_LEVEL_5_TRADES = new VillagerTrades.ItemListing[]{
new ItemsForEmeralds(new ItemStack(Items.POWDER_SNOW_BUCKET), 4, 1, 10, 2, 0.2F),
new ItemsForEmeralds(new ItemStack(Items.LAVA_BUCKET), 4, 1, 10, 2, 0.2F),
new EmeraldForItems(Items.SNOWBALL, 16, 5, 1),
new EmeraldForItems(Items.CHARCOAL, 16, 5, 1)};
private static final Int2ObjectMap CLIMATOLOGIST_TRADES = toIntMap(ImmutableMap.of(1, CLIMATOLOGIST_LEVEL_1_TRADES, 2, CLIMATOLOGIST_LEVEL_2_TRADES, 3, CLIMATOLOGIST_LEVEL_3_TRADES, 4, CLIMATOLOGIST_LEVEL_4_TRADES, 5, CLIMATOLOGIST_LEVEL_5_TRADES));
public static void addVillagerTrades(VillagerTradesEvent event)
{
if (event.getProfession() == TANVillagerProfessions.CLIMATOLOGIST)
{
for (int level = 1; level <= 5; level++)
{
for (VillagerTrades.ItemListing trade : CLIMATOLOGIST_TRADES.get(level))
{
if (event.getLevel() == level)
{
event.getTrades().add(trade);
}
}
}
}
}
//Cost, Amount, Trades Until Disabled, Villager XP
private static final VillagerTrades.ItemListing[] WANDERING_TRADER_GENERIC = new VillagerTrades.ItemListing[]{
new ItemsForEmeralds(TANItems.ICE_CREAM, 2, 1, 4, 1),
new ItemsForEmeralds(TANItems.CHARC_0S, 2, 1, 4, 1),
new ItemsForEmeralds(TANItems.GLOW_BERRY_JUICE, 2, 1, 4, 1),
new ItemsForEmeralds(TANItems.SWEET_BERRY_JUICE, 2, 1, 4, 1),
new ItemsForEmeralds(TANItems.PUMPKIN_JUICE, 2, 1, 3, 1),
new ItemsForEmeralds(TANItems.MELON_JUICE, 3, 1, 3, 1),
new ItemsForEmeralds(TANItems.APPLE_JUICE, 4, 1, 2, 1),
new ItemsForEmeralds(TANItems.CACTUS_JUICE, 4, 1, 2, 1)};
private static final VillagerTrades.ItemListing[] WANDERING_TRADER_RARE = new VillagerTrades.ItemListing[]{
new ItemsForEmeralds(TANItems.CHORUS_FRUIT_JUICE, 5, 1, 1, 1),
new ItemsForEmeralds(TANItems.PURIFIED_WATER_BOTTLE, 4, 1, 2, 1)};
public static void addWanderingVillagerTrades(WandererTradesEvent event)
{
event.addGenericTrades(Arrays.stream(WANDERING_TRADER_GENERIC).toList());
event.addRareTrades(Arrays.stream(WANDERING_TRADER_RARE).toList());
}
public static void addBuildings(RegistryAccess registryAccess)
{
Registry templatePools = registryAccess.lookupOrThrow(Registries.TEMPLATE_POOL);
Registry processorLists = registryAccess.lookupOrThrow(Registries.PROCESSOR_LIST);
addBuildingToPool(templatePools, processorLists, Identifier.parse("minecraft:village/desert/houses"), ToughAsNails.MOD_ID + ":village/desert/houses/desert_climatologist_1", 1);
addBuildingToPool(templatePools, processorLists, Identifier.parse("minecraft:village/savanna/houses"), ToughAsNails.MOD_ID + ":village/savanna/houses/savanna_climatologist_1", 2);
addBuildingToPool(templatePools, processorLists, Identifier.parse("minecraft:village/plains/houses"), ToughAsNails.MOD_ID + ":village/plains/houses/plains_climatologist_1", 2);
addBuildingToPool(templatePools, processorLists, Identifier.parse("minecraft:village/taiga/houses"), ToughAsNails.MOD_ID + ":village/taiga/houses/taiga_climatologist_1", 3);
addBuildingToPool(templatePools, processorLists, Identifier.parse("minecraft:village/snowy/houses"), ToughAsNails.MOD_ID + ":village/snowy/houses/snowy_climatologist_1", 2);
}
public static void registerPointsOfInterest(BiConsumer func)
{
register(func, TANPoiTypes.CLIMATOLOGIST, getBlockStates(TANBlocks.THERMOREGULATOR), 1, 1);
}
public static void registerProfessions(BiConsumer func)
{
register(func, TANVillagerProfessions.CLIMATOLOGIST, TANPoiTypes.CLIMATOLOGIST, SoundEvents.VILLAGER_WORK_ARMORER);
}
static class EmeraldForItems implements VillagerTrades.ItemListing {
private final Item item;
private final int cost;
private final int maxUses;
private final int villagerXp;
private final float priceMultiplier;
public EmeraldForItems(ItemLike p_35657_, int p_35658_, int p_35659_, int p_35660_) {
this.item = p_35657_.asItem();
this.cost = p_35658_;
this.maxUses = p_35659_;
this.villagerXp = p_35660_;
this.priceMultiplier = 0.05F;
}
@Override
public MerchantOffer getOffer(ServerLevel level, Entity p_219682_, RandomSource p_219683_) {
ItemCost cost = new ItemCost(this.item, this.cost);
return new MerchantOffer(cost, new ItemStack(Items.EMERALD), this.maxUses, this.villagerXp, this.priceMultiplier);
}
}
static class ItemsForEmeralds implements VillagerTrades.ItemListing {
private final ItemStack itemStack;
private final int emeraldCost;
private final int numberOfItems;
private final int maxUses;
private final int villagerXp;
private final float priceMultiplier;
public ItemsForEmeralds(Item p_35746_, int p_35747_, int p_35748_, int p_35749_, int p_35750_) {
this(new ItemStack(p_35746_), p_35747_, p_35748_, p_35749_, p_35750_);
}
public ItemsForEmeralds(ItemStack p_35752_, int p_35753_, int p_35754_, int p_35755_, int p_35756_) {
this(p_35752_, p_35753_, p_35754_, p_35755_, p_35756_, 0.05F);
}
public ItemsForEmeralds(ItemStack p_35758_, int p_35759_, int p_35760_, int p_35761_, int p_35762_, float p_35763_) {
this.itemStack = p_35758_;
this.emeraldCost = p_35759_;
this.numberOfItems = p_35760_;
this.maxUses = p_35761_;
this.villagerXp = p_35762_;
this.priceMultiplier = p_35763_;
}
@Override
public MerchantOffer getOffer(ServerLevel level, Entity p_219699_, RandomSource p_219700_) {
return new MerchantOffer(new ItemCost(Items.EMERALD, this.emeraldCost), new ItemStack(this.itemStack.getItem(), this.numberOfItems), this.maxUses, this.villagerXp, this.priceMultiplier);
}
}
private static Int2ObjectMap toIntMap(ImmutableMap p_221238_0_) {
return new Int2ObjectOpenHashMap<>(p_221238_0_);
}
public static void addBuildingToPool(Registry templatePoolRegistry, Registry processorListRegistry, Identifier poolRL, String nbtPieceRL, int weight)
{
templatePoolRegistry.get(poolRL).ifPresent(pool -> {
Identifier emptyProcessor = Identifier.fromNamespaceAndPath("minecraft", "empty");
Holder processorHolder = processorListRegistry.getOrThrow(ResourceKey.create(Registries.PROCESSOR_LIST, emptyProcessor));
SinglePoolElement piece = SinglePoolElement.single(nbtPieceRL, processorHolder).apply(StructureTemplatePool.Projection.RIGID);
for (int i = 0; i < weight; i++) {
pool.value().templates.add(piece);
}
List> listOfPieceEntries = new ArrayList<>(pool.value().rawTemplates);
listOfPieceEntries.add(new Pair<>(piece, weight));
pool.value().rawTemplates = listOfPieceEntries;
});
}
private static PoiType register(BiConsumer func, ResourceKey key, Set states, int maxTickets, int validRange)
{
PoiType type = new PoiType(states, maxTickets, validRange);
func.accept(key.identifier(), type);
registerBlockStates(key, states);
return type;
}
private static VillagerProfession register(BiConsumer func, ResourceKey key, ResourceKey poi, @Nullable SoundEvent workSound)
{
return register(func, key, (h) -> h.is(poi), (h) -> h.is(poi), workSound);
}
private static VillagerProfession register(BiConsumer func, ResourceKey key, Predicate