diff --git a/src/generated/resources/assets/anvilcraft/blockstates/mass_energy_inverter.json b/src/generated/resources/assets/anvilcraft/blockstates/mass_energy_inverter.json new file mode 100644 index 0000000000..a18a0cbe97 --- /dev/null +++ b/src/generated/resources/assets/anvilcraft/blockstates/mass_energy_inverter.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "anvilcraft:block/mass_energy_inverter" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/anvilcraft/lang/en_ud.json b/src/generated/resources/assets/anvilcraft/lang/en_ud.json index 1da0c2e7cc..178b7cb0d1 100644 --- a/src/generated/resources/assets/anvilcraft/lang/en_ud.json +++ b/src/generated/resources/assets/anvilcraft/lang/en_ud.json @@ -508,6 +508,7 @@ "block.anvilcraft.magnet_block": "ʇǝuᵷɐW ɟo ʞɔoꞁᗺ", "block.anvilcraft.magnetic_chute": "ǝʇnɥƆ ɔᴉʇǝuᵷɐW", "block.anvilcraft.magnetoelectric_core": "ǝɹoƆ ɔᴉɹʇɔǝꞁǝoʇǝuᵷɐW", + "block.anvilcraft.mass_energy_inverter": "ɹǝʇɹǝʌuI ʎᵷɹǝuƎ ssɐW", "block.anvilcraft.melt_gem": "ɯǝ⅁ ʇꞁǝW", "block.anvilcraft.melt_gem_cauldron": "uoɹpꞁnɐƆ ɯǝ⅁ ʇꞁǝW", "block.anvilcraft.menger_sponge": "ǝᵷuodS ɹǝᵷuǝW", @@ -867,6 +868,9 @@ "gui.anvilcraft.category.portal_conversion": "ꞁɐʇɹoԀ oʇuI sꞁꞁɐℲ ʞɔoꞁᗺ", "gui.anvilcraft.category.portal_conversion.fall_through": "%s ɥᵷnoɹɥʇ ꞁꞁɐɟ uǝɥʍ pǝʇɹǝʌuoƆ", "gui.anvilcraft.category.procedural_process": "ᵷuᴉssǝɔoɹԀ ǝɔuǝnbǝS ʞɔoꞁᗺ", + "gui.anvilcraft.category.shulker_container_upgrade": "ǝpɐɹᵷd∩ ɹǝuᴉɐʇuoƆ ɹǝʞꞁnɥS", + "gui.anvilcraft.category.shulker_container_upgrade.drop_on_top": "ǝʇɐɹɔ ǝᵷɹɐꞁ ǝɥʇ oʇuo sɯǝʇᴉ ǝsǝɥʇ doɹᗡ", + "gui.anvilcraft.category.shulker_container_upgrade.strike": "ǝʇɐɹɔ ǝɥʇ ǝpɐɹᵷdn oʇ ꞁᴉʌuɐ uɐ ɥʇᴉʍ ǝʞᴉɹʇS", "gui.anvilcraft.category.solid_liquid": "uoᴉʇɔɐǝᴚ pᴉnꞁℲ-pᴉꞁoS", "gui.anvilcraft.category.solid_liquid.consume_fluid": "%2$s ɟo ᗺɯ %1$d :ǝɯnsuoƆ", "gui.anvilcraft.category.solid_liquid.produce_fluid": "%2$s ɟo ᗺɯ %1$d :ǝɔnpoɹԀ", @@ -1494,6 +1498,7 @@ "screen.anvilcraft.storage.category.name": "%s :ǝɯɐN", "screen.anvilcraft.storage.category.setting.title": "ᵷuᴉʇʇǝS ʎɹoᵷǝʇɐƆ", "screen.anvilcraft.storage.category.tooltip": "doʇ oʇ uᴉd oʇ ʞɔᴉꞁɔ ʇɥᵷᴉɹ 'sǝʇɐuɹǝʇꞁɐ oʇ ǝʌoɯ oʇ ʞɔᴉꞁɔ ʇɟǝꞀ", + "screen.anvilcraft.storage.count": "%s :ʇunoƆ", "screen.anvilcraft.storage.nbt": "%s ʎꞁʇuǝɹɹnƆ :⟘ᗺN ˙ɟɟᴉᗡ ɥʇᴉʍ sɯǝʇI pꞁoℲ pꞁnoɥS", "screen.anvilcraft.storage.nbt.fold": "ǝnɹ⟘", "screen.anvilcraft.storage.nbt.unfold": "ǝsꞁɐℲ", @@ -1535,6 +1540,8 @@ "screen.anvilcraft.tesla_tower.filter.unknown": "ɹǝʇꞁᴉℲ uʍouʞu∩", "screen.anvilcraft.tooltip.cfa_amplifier": "ꞁᴉʌuⱯ ᵷuᴉᵷɹoℲ ꞁɐᴉʇsǝꞁǝƆ ǝɥʇ uo ʎꞁꞁɐuoᵷɐᴉp pǝɔɐꞁd ǝq ʇsnɯ ʇI", "screen.anvilcraft.tooltip.cfa_interface": "ɯoʇʇoq ꞁᴉʌuⱯ ᵷuᴉᵷɹoℲ ꞁɐᴉʇsǝꞁǝƆ ǝɥʇ ɟo ǝpᴉs ǝɥʇ ʇsuᴉɐᵷɐ ʎꞁʇɥᵷᴉʇ pǝɔɐꞁd ǝq ʇsnɯ ʇI", + "screen.anvilcraft.tooltip.crate.break_requires_shift": "ʇᴉ ʞɐǝɹq oʇ ʇɟᴉɥS pꞁoH ¡sɯǝʇᴉ ʎuɐɯ ooʇ suᴉɐʇuoɔ ǝʇɐɹɔ ǝɥ⟘", + "screen.anvilcraft.tooltip.crate.hammer_break_denied": "ʇᴉ ǝʌoɯǝɹ ʇouuɐɔ ɹǝɯɯɐH ꞁᴉʌuⱯ ǝɥ⟘ ¡sɯǝʇᴉ ʎuɐɯ ooʇ suᴉɐʇuoɔ ǝʇɐɹɔ ǝɥ⟘", "screen.anvilcraft.tooltip.fluid_tank.break_confirm": "ꞁɐʌoɯǝɹ ɯɹᴉɟuoɔ oʇ ʇꞁⱯ+ʇɟᴉɥS+ꞁɹʇƆ ᵷuᴉpꞁoɥ ǝꞁᴉɥʍ uᴉɐᵷɐ ʇᴉ ǝuᴉW ˙pᴉnꞁɟ ǝʇᴉuᴉɟuᴉ suᴉɐʇuoɔ ʞuɐʇ sᴉɥ⟘", "screen.anvilcraft.tooltip.fluid_tank.break_modifiers": "ʞuɐʇ pᴉnꞁɟ-ǝʇᴉuᴉɟuᴉ sᴉɥʇ ǝʌoɯǝɹ oʇ ᵷuᴉuᴉɯ ǝꞁᴉɥʍ ʇꞁⱯ+ʇɟᴉɥS+ꞁɹʇƆ pꞁoH", "screen.anvilcraft.tooltip.fluid_tank.tool_break_failed": "poᴚ uoᵷɐɹᗡ ɹo ɹǝɯɯɐH ꞁᴉʌuⱯ uɐ ɥʇᴉʍ pǝʌoɯǝɹ ǝq ʇouuɐɔ sʞuɐʇ pᴉnꞁɟ-ǝʇᴉuᴉɟuI", @@ -1718,6 +1725,8 @@ "tooltip.anvilcraft.item.corrupted_beacon_activator.shift": "ǝᵷɐɯɐp s,ɯɐǝq ǝɥʇ sʇsooq ɹǝʇᴉɔxƎ uoɔɐǝᗺ pǝʇdnɹɹoƆ ǝɥʇ ᵷuᴉʇuɐɥɔuƎ\nsqoɯ ʇɹǝʌuoɔ ʇou sǝop puɐ ssɐꞁᵷ ɥᵷnoɹɥʇ sǝssɐd ʇI\nɹǝɥʇᴉM ᵷuᴉʇɔᴉꞁɟuᴉ puɐ ǝᵷɐɯɐp ᵷuᴉꞁɐǝp 'sʇǝᵷɹɐʇ ɥᵷnoɹɥʇ sǝɔɹǝᴉd ʇɐɥʇ uoᴉʇdnɹɹoɔ ɟo ɯɐǝq ɐ sǝɹᴉℲ", "tooltip.anvilcraft.item.crab_claw": "ᵷuᴉpꞁoɥ uǝɥʍ ɥʇᵷuǝꞁ ɥɔnoʇ ǝsɐǝɹɔuI", "tooltip.anvilcraft.item.crab_trap": "sʇɔnpoɹd ɔᴉʇɐnbɐ ɥɔʇɐɔ noʎ dꞁǝɥ oʇ ɹǝʇɐʍ ǝɥʇ uᴉ ʇᴉ ᵷuᴉɔɐꞁԀ", + "tooltip.anvilcraft.item.crate": "sɯǝʇᴉ ɟo ǝɔɐds 8߈0ᘔ oʇ dn sǝɹoʇS", + "tooltip.anvilcraft.item.crate.shift": "ʇᴉ ʞɐǝɹq oʇ ʇɟᴉɥS pꞁoɥ 'sɯǝʇᴉ 000⥝ uɐɥʇ ǝɹoɯ spꞁoɥ ʇᴉ uǝɥM\nsʇuǝʇuoɔ ǝɥʇ sdoɹp ʇᴉ ᵷuᴉʞɐǝɹᗺ\nsɯǝʇᴉ 8߈0ᘔ uᴉɐʇuoɔ uɐƆ", "tooltip.anvilcraft.item.cream_block": "ʇᴉ ʇɐǝ oʇ uoods ɐ sɐ ꞁǝʌoɥs ɐ ǝsn 'ɯɐǝɹɔ ɟo ʞɔoꞁq Ɐ", "tooltip.anvilcraft.item.creative_crate": "ʎꞁddns puɐ ǝᵷɐɹoʇs ɯǝʇᴉ ǝʇᴉuᴉɟuI", "tooltip.anvilcraft.item.creative_crate.shift": "sɯǝʇᴉ ʇno ǝʞɐʇ oʇ ʞɔᴉꞁɔ-ʇɟǝꞁ sɹǝʎɐꞁd ꞁɐʌᴉʌɹnS\nuoᴉʇɐɹnᵷᴉɟuoɔ ǝɥʇ ɹɐǝꞁɔ oʇ ʞɔᴉꞁɔ-ʇɟǝꞁ sɹǝʎɐꞁd ǝʌᴉʇɐǝɹƆ\npǝɹnᵷᴉɟuoɔ sᴉ ɯǝʇᴉ ou uǝɥʍ sɯǝʇᴉ ʇnduᴉ ꞁꞁɐ sʎoɹʇsǝᗡ\nʇno uǝʞɐʇ uǝɥʍ pǝɯnsuoɔ ǝq ʇou ꞁꞁᴉʍ sɯǝʇI\nǝɹnᵷᴉɟuoɔ oʇ ǝpᴉsuᴉ sɯǝʇᴉ ǝɔɐꞁd :ǝdʎʇ ʇǝs ɐ ɟo sɯǝʇᴉ ǝʇᴉuᴉɟuᴉ sǝpᴉʌoɹԀ", @@ -1835,6 +1844,8 @@ "tooltip.anvilcraft.item.large_cake": "dn noʎ sꞁꞁᴉɟ ǝʇᴉq ɥɔɐǝ 'sǝʇᴉq ㄥᘔ ˙ǝʞɐɔ ᵷᴉq ʎɹǝʌ ɐ 'ǝʞɐɔ Ɐ", "tooltip.anvilcraft.item.large_cauldron": "uoɹpꞁnɐɔ ǝᵷnɥ ʎꞁǝɯǝɹʇxǝ uⱯ", "tooltip.anvilcraft.item.large_cauldron.shift": "spᴉnꞁɟ ǝꞁdᴉʇꞁnɯ ǝɹoʇs uɐƆ\nsʞɔoꞁq ǝsɐq ʇuǝɹǝɟɟᴉp ɐᴉʌ sǝdʎʇ ᵷuᴉssǝɔoɹd ǝꞁdᴉʇꞁnɯ ɥʇᴉʍ ǝꞁqᴉʇɐdɯoƆ\nsǝdᴉɔǝɹ ᵷuᴉʇɟɐɹɔ uoɹpꞁnɐɔ ꞁꞁɐ ɯɹoɟɹǝd uɐƆ", + "tooltip.anvilcraft.item.large_crate": "sɯǝʇᴉ ɟo ǝɔɐds 9Ɛϛϛ9 oʇ dn sǝɹoʇs 'ǝʇɐɹɔ ƐxƐxƐ ǝᵷnɥ Ɐ", + "tooltip.anvilcraft.item.large_crate.shift": "ɹǝuᴉɐʇuoƆ ɹǝʞꞁnɥS oʇ ǝʇɐpdn uɐƆ\nʇᴉ ʞɐǝɹq oʇ ʇɟᴉɥS pꞁoɥ 'sɯǝʇᴉ 000⥝ uɐɥʇ ǝɹoɯ spꞁoɥ ʇᴉ uǝɥM\nsʇuǝʇuoɔ ǝɥʇ sdoɹp ʇᴉ ᵷuᴉʞɐǝɹᗺ\nsɯǝʇᴉ 9Ɛϛϛ9 uᴉɐʇuoɔ uɐƆ", "tooltip.anvilcraft.item.large_fluid_tank": "spᴉnꞁɟ ǝꞁdᴉʇꞁnɯ sǝɹoʇS", "tooltip.anvilcraft.item.large_fluid_tank.shift": "ɹǝɟsuɐɹʇ pᴉnꞁɟ ɹoɟ sɹǝsuǝdsᴉᗡ ɥʇᴉʍ ʇɔɐɹǝʇuᴉ uɐƆ\nǝʇᴉuᴉɟuᴉ oʇ pǝʇɹǝʌuoɔ ǝq ꞁꞁᴉʍ ᗺ008ᘔ⥝ sǝɥɔɐǝɹ ʇɐɥʇ pᴉnꞁɟ ɟo ǝdʎʇ ɥɔɐǝ 'spᴉnꞁɟ ǝꞁdᴉʇꞁnɯ ǝɹoʇs uɐƆ\nǝᵷɐɹoʇs ꞁɐʇoʇ pǝʇᴉɯᴉꞁun ʞɔoꞁun sǝᵷuodS ɹǝᵷuǝW\nspᴉnꞁɟ ɟo ɹǝqɯnu ʎuɐ ʎq pǝɹɐɥs ᗺᘔ⥝ϛ sǝɹoʇS", "tooltip.anvilcraft.item.large_laser": "Mʞ 9ϛᘔ sǝɯnsuoɔ 'ɹǝsɐꞁ ɟo sꞁǝʌǝꞁ ʎʇᴉsuǝʇuᴉ 9⥝ sʇndʇno 'sɹǝsɐꞁ 9⥝ oʇ ʇuǝꞁɐʌᴉnbƎ", @@ -1915,6 +1926,8 @@ "tooltip.anvilcraft.item.sapphire": "ʇsoɹɟ ɟo ɹǝʍod ǝɥʇ ᵷuᴉuᴉɐʇuoƆ", "tooltip.anvilcraft.item.sapphire_amulet": "ɹǝʍoԀ ʇᴉnpuoƆ sʇuɐɹ⅁", "tooltip.anvilcraft.item.seeds_pack": "doɹɔ ɹo pǝǝs ɯopuɐɹ ɐ uᴉɐʇqo oʇ uǝdO", + "tooltip.anvilcraft.item.shulker_container": "ǝʇɐɹƆ ǝᵷɹɐꞀ ɐ ɯoɹɟ pǝpɐɹᵷdn ɹǝuᴉɐʇuoɔ ᵷuᴉpꞁoɟ-ǝɔɐds Ɐ", + "tooltip.anvilcraft.item.shulker_container.shift": "(߈ oʇ dn) ǝɔɐds ǝᵷɐɹoʇs ǝɥʇ sǝꞁqnop ǝuo ɥɔɐƎ\nʎʇᴉɔɐdɐɔ puɐdxǝ oʇ ꞁᴉʌuɐ uɐ ɥʇᴉʍ ǝʞᴉɹʇs puɐ doʇ uo sɹossǝɹdɯoɔɹǝʌO ǝɔɐdS doɹᗡ\nǝpᴉsuᴉ pǝɹoʇs sɯǝʇᴉ sʇᴉ ɥʇᴉʍ ɹǝuᴉɐʇuoɔ ǝɥʇ sdoɹp ʇᴉ ᵷuᴉʞɐǝɹᗺ\nsɯǝʇᴉ 9Ɛϛϛ9 uᴉɐʇuoɔ ǝdʎʇ ɥɔɐǝ 'sɯǝʇᴉ ɟo sǝdʎʇ 9Ɛϛϛ9 uᴉɐʇuoɔ uɐƆ", "tooltip.anvilcraft.item.silence_amulet": "ɹǝɹɐǝʍ ǝɥʇ sǝɔuǝꞁᴉS", "tooltip.anvilcraft.item.silver_block": "ꞁɐʇǝɯ ǝʌᴉʇɔǝꞁɟǝɹ ʎꞁɥᵷᴉɥ ɟo ʞɔoꞁq ǝᵷɹɐꞁ Ɐ", "tooltip.anvilcraft.item.silver_ingot": "ꞁɐʇǝɯ ǝʌᴉʇɔǝꞁɟǝɹ ʎꞁɥᵷᴉɥ ɟo ǝɔǝᴉd Ɐ", @@ -2080,10 +2093,12 @@ "tooltip.anvilcraft.smart_block_placer.jade.placement.pickup": "dnʞɔᴉԀ", "tooltip.anvilcraft.smart_block_placer.jade.placement_mode": "%s :ǝpoW ʇuǝɯǝɔɐꞁԀ", "tooltip.anvilcraft.space_overcompressor.stored_mass": "%s :ssɐW pǝɹoʇS", + "tooltip.anvilcraft.storage.types": ":sǝdʎ⟘", + "tooltip.anvilcraft.storage.types.value": "%s / %s ", "tooltip.anvilcraft.thought": "oɟuᴉ ǝɹoɯ ɹoɟ [%s] ssǝɹԀ", "tooltip.anvilcraft.wip_block.jade.recipe": "%s :ǝdᴉɔǝᴚ ꞁɐɹnpǝɔoɹԀ", "tooltip.anvilcraft.wip_block.jade.step_count": "%d :pǝʇnɔǝxƎ sdǝʇS", "tooltip.anvilcraft.working_progress.progress": "%%%2$s %1$s ", "tooltip.anvilcraft.working_progress.time": "%2$s / %1$s ", "tooltip.anvilcraft.working_progress.title": ":ssǝɹᵷoɹd ᵷuᴉʞɹoM" -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/anvilcraft/lang/en_us.json b/src/generated/resources/assets/anvilcraft/lang/en_us.json index d2bdc59ba5..33f9635184 100644 --- a/src/generated/resources/assets/anvilcraft/lang/en_us.json +++ b/src/generated/resources/assets/anvilcraft/lang/en_us.json @@ -508,6 +508,7 @@ "block.anvilcraft.magnet_block": "Block of Magnet", "block.anvilcraft.magnetic_chute": "Magnetic Chute", "block.anvilcraft.magnetoelectric_core": "Magnetoelectric Core", + "block.anvilcraft.mass_energy_inverter": "Mass Energy Inverter", "block.anvilcraft.melt_gem": "Melt Gem", "block.anvilcraft.melt_gem_cauldron": "Melt Gem Cauldron", "block.anvilcraft.menger_sponge": "Menger Sponge", @@ -867,6 +868,9 @@ "gui.anvilcraft.category.portal_conversion": "Block Falls Into Portal", "gui.anvilcraft.category.portal_conversion.fall_through": "Converted when fall through %s", "gui.anvilcraft.category.procedural_process": "Block Sequence Processing", + "gui.anvilcraft.category.shulker_container_upgrade": "Shulker Container Upgrade", + "gui.anvilcraft.category.shulker_container_upgrade.drop_on_top": "Drop these items onto the large crate", + "gui.anvilcraft.category.shulker_container_upgrade.strike": "Strike with an anvil to upgrade the crate", "gui.anvilcraft.category.solid_liquid": "Solid-Fluid Reaction", "gui.anvilcraft.category.solid_liquid.consume_fluid": "Consume: %1$d mB of %2$s", "gui.anvilcraft.category.solid_liquid.produce_fluid": "Produce: %1$d mB of %2$s", @@ -1494,6 +1498,7 @@ "screen.anvilcraft.storage.category.name": "Name: %s", "screen.anvilcraft.storage.category.setting.title": "Category Setting", "screen.anvilcraft.storage.category.tooltip": "Left click to move to alternates, right click to pin to top", + "screen.anvilcraft.storage.count": "Count: %s", "screen.anvilcraft.storage.nbt": "Should Fold Items with Diff. NBT: Currently %s", "screen.anvilcraft.storage.nbt.fold": "True", "screen.anvilcraft.storage.nbt.unfold": "False", @@ -1535,6 +1540,8 @@ "screen.anvilcraft.tesla_tower.filter.unknown": "Unknown Filter", "screen.anvilcraft.tooltip.cfa_amplifier": "It must be placed diagonally on the Celestial Forging Anvil", "screen.anvilcraft.tooltip.cfa_interface": "It must be placed tightly against the side of the Celestial Forging Anvil bottom", + "screen.anvilcraft.tooltip.crate.break_requires_shift": "The crate contains too many items! Hold Shift to break it", + "screen.anvilcraft.tooltip.crate.hammer_break_denied": "The crate contains too many items! The Anvil Hammer cannot remove it", "screen.anvilcraft.tooltip.fluid_tank.break_confirm": "This tank contains infinite fluid. Mine it again while holding Ctrl+Shift+Alt to confirm removal", "screen.anvilcraft.tooltip.fluid_tank.break_modifiers": "Hold Ctrl+Shift+Alt while mining to remove this infinite-fluid tank", "screen.anvilcraft.tooltip.fluid_tank.tool_break_failed": "Infinite-fluid tanks cannot be removed with an Anvil Hammer or Dragon Rod", @@ -1718,6 +1725,8 @@ "tooltip.anvilcraft.item.corrupted_beacon_activator.shift": "Fires a beam of corruption that pierces through targets, dealing damage and inflicting Wither\nIt passes through glass and does not convert mobs\nEnchanting the Corrupted Beacon Exciter boosts the beam's damage", "tooltip.anvilcraft.item.crab_claw": "Increase touch length when holding", "tooltip.anvilcraft.item.crab_trap": "Placing it in the water to help you catch aquatic products", + "tooltip.anvilcraft.item.crate": "Stores up to 2048 space of items", + "tooltip.anvilcraft.item.crate.shift": "Can contain 2048 items\nBreaking it drops the contents\nWhen it holds more than 1000 items, hold Shift to break it", "tooltip.anvilcraft.item.cream_block": "A block of cream, use a shovel as a spoon to eat it", "tooltip.anvilcraft.item.creative_crate": "Infinite item storage and supply", "tooltip.anvilcraft.item.creative_crate.shift": "Provides infinite items of a set type: place items inside to configure\nItems will not be consumed when taken out\nDestroys all input items when no item is configured\nCreative players left-click to clear the configuration\nSurvival players left-click to take out items", @@ -1835,6 +1844,8 @@ "tooltip.anvilcraft.item.large_cake": "A cake, a very big cake. 27 bites, each bite fills you up", "tooltip.anvilcraft.item.large_cauldron": "An extremely huge cauldron", "tooltip.anvilcraft.item.large_cauldron.shift": "Can perform all cauldron crafting recipes\nCompatible with multiple processing types via different base blocks\nCan store multiple fluids", + "tooltip.anvilcraft.item.large_crate": "A huge 3x3x3 crate, stores up to 65536 space of items", + "tooltip.anvilcraft.item.large_crate.shift": "Can contain 65536 items\nBreaking it drops the contents\nWhen it holds more than 1000 items, hold Shift to break it\nCan update to Shulker Container", "tooltip.anvilcraft.item.large_fluid_tank": "Stores multiple fluids", "tooltip.anvilcraft.item.large_fluid_tank.shift": "Stores 512B shared by any number of fluids\nMenger Sponges unlock unlimited total storage\nCan store multiple fluids, each type of fluid that reaches 12800B will be converted to infinite\nCan interact with Dispensers for fluid transfer", "tooltip.anvilcraft.item.large_laser": "Equivalent to 16 lasers, outputs 16 intensity levels of laser, consumes 256 kW", @@ -1915,6 +1926,8 @@ "tooltip.anvilcraft.item.sapphire": "Containing the power of frost", "tooltip.anvilcraft.item.sapphire_amulet": "Grants Conduit Power", "tooltip.anvilcraft.item.seeds_pack": "Open to obtain a random seed or crop", + "tooltip.anvilcraft.item.shulker_container": "A space-folding container upgraded from a Large Crate", + "tooltip.anvilcraft.item.shulker_container.shift": "Can contain 65536 types of items, each type contain 65536 items\nBreaking it drops the container with its items stored inside\nDrop Space Overcompressors on top and strike with an anvil to expand capacity\nEach one doubles the storage space (up to 4)", "tooltip.anvilcraft.item.silence_amulet": "Silences the wearer", "tooltip.anvilcraft.item.silver_block": "A large block of highly reflective metal", "tooltip.anvilcraft.item.silver_ingot": "A piece of highly reflective metal", @@ -2080,10 +2093,12 @@ "tooltip.anvilcraft.smart_block_placer.jade.placement.pickup": "Pickup", "tooltip.anvilcraft.smart_block_placer.jade.placement_mode": "Placement Mode: %s", "tooltip.anvilcraft.space_overcompressor.stored_mass": "Stored Mass: %s", + "tooltip.anvilcraft.storage.types": "Types:", + "tooltip.anvilcraft.storage.types.value": " %s / %s", "tooltip.anvilcraft.thought": "Press [%s] for more info", "tooltip.anvilcraft.wip_block.jade.recipe": "Procedural Recipe: %s", "tooltip.anvilcraft.wip_block.jade.step_count": "Steps Executed: %d", "tooltip.anvilcraft.working_progress.progress": " %1$s %2$s%%", "tooltip.anvilcraft.working_progress.time": " %1$s / %2$s", "tooltip.anvilcraft.working_progress.title": "Working progress:" -} +} \ No newline at end of file diff --git a/src/generated/resources/assets/anvilcraft/models/item/mass_energy_inverter.json b/src/generated/resources/assets/anvilcraft/models/item/mass_energy_inverter.json new file mode 100644 index 0000000000..3325b8b6eb --- /dev/null +++ b/src/generated/resources/assets/anvilcraft/models/item/mass_energy_inverter.json @@ -0,0 +1,3 @@ +{ + "parent": "anvilcraft:block/mass_energy_inverter" +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/chiseled_copper_deoxidize.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/chiseled_copper_deoxidize.json new file mode 100644 index 0000000000..8d210e6c51 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/chiseled_copper_deoxidize.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/chiseled_copper_deoxidize" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/chiseled_copper_deoxidize" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/chiseled_copper_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/chiseled_copper_dewax.json new file mode 100644 index 0000000000..a6812fef5a --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/chiseled_copper_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/chiseled_copper_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/chiseled_copper_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_block_deoxidize.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_block_deoxidize.json new file mode 100644 index 0000000000..885c6f1172 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_block_deoxidize.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/copper_block_deoxidize" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/copper_block_deoxidize" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_block_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_block_dewax.json new file mode 100644 index 0000000000..c2fd029b51 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_block_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/copper_block_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/copper_block_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_bulb_deoxidize.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_bulb_deoxidize.json new file mode 100644 index 0000000000..0462a2f789 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_bulb_deoxidize.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/copper_bulb_deoxidize" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/copper_bulb_deoxidize" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_bulb_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_bulb_dewax.json new file mode 100644 index 0000000000..aafbcb8645 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_bulb_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/copper_bulb_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/copper_bulb_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_door_deoxidize.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_door_deoxidize.json new file mode 100644 index 0000000000..f6243df961 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_door_deoxidize.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/copper_door_deoxidize" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/copper_door_deoxidize" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_door_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_door_dewax.json new file mode 100644 index 0000000000..049f108e91 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_door_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/copper_door_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/copper_door_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_grate_deoxidize.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_grate_deoxidize.json new file mode 100644 index 0000000000..2304f84e13 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_grate_deoxidize.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/copper_grate_deoxidize" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/copper_grate_deoxidize" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_grate_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_grate_dewax.json new file mode 100644 index 0000000000..8df9870480 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_grate_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/copper_grate_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/copper_grate_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_trapdoor_deoxidize.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_trapdoor_deoxidize.json new file mode 100644 index 0000000000..30b965c179 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_trapdoor_deoxidize.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/copper_trapdoor_deoxidize" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/copper_trapdoor_deoxidize" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_trapdoor_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_trapdoor_dewax.json new file mode 100644 index 0000000000..95ea0d8a27 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/copper_trapdoor_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/copper_trapdoor_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/copper_trapdoor_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/cut_copper_deoxidize.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/cut_copper_deoxidize.json new file mode 100644 index 0000000000..e5da3db9aa --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/cut_copper_deoxidize.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/cut_copper_deoxidize" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/cut_copper_deoxidize" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/cut_copper_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/cut_copper_dewax.json new file mode 100644 index 0000000000..d07295ef61 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/cut_copper_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/cut_copper_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/cut_copper_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/cut_copper_slab_deoxidize.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/cut_copper_slab_deoxidize.json new file mode 100644 index 0000000000..7da99dde03 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/cut_copper_slab_deoxidize.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/cut_copper_slab_deoxidize" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/cut_copper_slab_deoxidize" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/cut_copper_slab_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/cut_copper_slab_dewax.json new file mode 100644 index 0000000000..b69b01588b --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/cut_copper_slab_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/cut_copper_slab_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/cut_copper_slab_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/cut_copper_stairs_deoxidize.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/cut_copper_stairs_deoxidize.json new file mode 100644 index 0000000000..dc6b462119 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/cut_copper_stairs_deoxidize.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/cut_copper_stairs_deoxidize" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/cut_copper_stairs_deoxidize" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/cut_copper_stairs_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/cut_copper_stairs_dewax.json new file mode 100644 index 0000000000..0c41c26a3e --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/cut_copper_stairs_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/cut_copper_stairs_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/cut_copper_stairs_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_chiseled_copper_deoxidize.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_chiseled_copper_deoxidize.json new file mode 100644 index 0000000000..ec97755c46 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_chiseled_copper_deoxidize.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/exposed_chiseled_copper_deoxidize" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/exposed_chiseled_copper_deoxidize" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_chiseled_copper_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_chiseled_copper_dewax.json new file mode 100644 index 0000000000..7814653443 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_chiseled_copper_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/exposed_chiseled_copper_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/exposed_chiseled_copper_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_bulb_deoxidize.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_bulb_deoxidize.json new file mode 100644 index 0000000000..d5781a9202 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_bulb_deoxidize.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/exposed_copper_bulb_deoxidize" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/exposed_copper_bulb_deoxidize" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_bulb_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_bulb_dewax.json new file mode 100644 index 0000000000..0f89c32c7f --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_bulb_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/exposed_copper_bulb_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/exposed_copper_bulb_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_deoxidize.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_deoxidize.json new file mode 100644 index 0000000000..c28cc1c66a --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_deoxidize.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/exposed_copper_deoxidize" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/exposed_copper_deoxidize" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_dewax.json new file mode 100644 index 0000000000..adbf232490 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/exposed_copper_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/exposed_copper_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_door_deoxidize.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_door_deoxidize.json new file mode 100644 index 0000000000..19813ee38a --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_door_deoxidize.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/exposed_copper_door_deoxidize" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/exposed_copper_door_deoxidize" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_door_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_door_dewax.json new file mode 100644 index 0000000000..d80087069f --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_door_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/exposed_copper_door_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/exposed_copper_door_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_grate_deoxidize.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_grate_deoxidize.json new file mode 100644 index 0000000000..fb0664a6fa --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_grate_deoxidize.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/exposed_copper_grate_deoxidize" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/exposed_copper_grate_deoxidize" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_grate_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_grate_dewax.json new file mode 100644 index 0000000000..4c14933d9a --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_grate_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/exposed_copper_grate_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/exposed_copper_grate_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_trapdoor_deoxidize.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_trapdoor_deoxidize.json new file mode 100644 index 0000000000..f32f2d9e58 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_trapdoor_deoxidize.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/exposed_copper_trapdoor_deoxidize" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/exposed_copper_trapdoor_deoxidize" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_trapdoor_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_trapdoor_dewax.json new file mode 100644 index 0000000000..d1fddcf8ed --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_copper_trapdoor_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/exposed_copper_trapdoor_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/exposed_copper_trapdoor_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_cut_copper_deoxidize.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_cut_copper_deoxidize.json new file mode 100644 index 0000000000..a9dcca40f3 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_cut_copper_deoxidize.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/exposed_cut_copper_deoxidize" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/exposed_cut_copper_deoxidize" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_cut_copper_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_cut_copper_dewax.json new file mode 100644 index 0000000000..dfdf4e390f --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_cut_copper_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/exposed_cut_copper_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/exposed_cut_copper_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_cut_copper_slab_deoxidize.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_cut_copper_slab_deoxidize.json new file mode 100644 index 0000000000..cd02281df3 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_cut_copper_slab_deoxidize.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/exposed_cut_copper_slab_deoxidize" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/exposed_cut_copper_slab_deoxidize" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_cut_copper_slab_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_cut_copper_slab_dewax.json new file mode 100644 index 0000000000..3d26c4dbce --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_cut_copper_slab_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/exposed_cut_copper_slab_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/exposed_cut_copper_slab_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_cut_copper_stairs_deoxidize.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_cut_copper_stairs_deoxidize.json new file mode 100644 index 0000000000..7e7de9c476 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_cut_copper_stairs_deoxidize.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/exposed_cut_copper_stairs_deoxidize" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/exposed_cut_copper_stairs_deoxidize" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_cut_copper_stairs_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_cut_copper_stairs_dewax.json new file mode 100644 index 0000000000..6ed240527a --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/exposed_cut_copper_stairs_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/exposed_cut_copper_stairs_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/exposed_cut_copper_stairs_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/oxidized_chiseled_copper_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/oxidized_chiseled_copper_dewax.json new file mode 100644 index 0000000000..a26bd5e56c --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/oxidized_chiseled_copper_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/oxidized_chiseled_copper_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/oxidized_chiseled_copper_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/oxidized_copper_bulb_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/oxidized_copper_bulb_dewax.json new file mode 100644 index 0000000000..096c67d188 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/oxidized_copper_bulb_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/oxidized_copper_bulb_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/oxidized_copper_bulb_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/oxidized_copper_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/oxidized_copper_dewax.json new file mode 100644 index 0000000000..42d06c527e --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/oxidized_copper_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/oxidized_copper_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/oxidized_copper_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/oxidized_copper_door_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/oxidized_copper_door_dewax.json new file mode 100644 index 0000000000..d4d229685a --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/oxidized_copper_door_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/oxidized_copper_door_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/oxidized_copper_door_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/oxidized_copper_grate_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/oxidized_copper_grate_dewax.json new file mode 100644 index 0000000000..59548ea1d0 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/oxidized_copper_grate_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/oxidized_copper_grate_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/oxidized_copper_grate_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/oxidized_copper_trapdoor_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/oxidized_copper_trapdoor_dewax.json new file mode 100644 index 0000000000..37f5ee3c80 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/oxidized_copper_trapdoor_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/oxidized_copper_trapdoor_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/oxidized_copper_trapdoor_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/oxidized_cut_copper_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/oxidized_cut_copper_dewax.json new file mode 100644 index 0000000000..c1aa046e8e --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/oxidized_cut_copper_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/oxidized_cut_copper_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/oxidized_cut_copper_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/oxidized_cut_copper_slab_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/oxidized_cut_copper_slab_dewax.json new file mode 100644 index 0000000000..23dec37f70 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/oxidized_cut_copper_slab_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/oxidized_cut_copper_slab_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/oxidized_cut_copper_slab_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/oxidized_cut_copper_stairs_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/oxidized_cut_copper_stairs_dewax.json new file mode 100644 index 0000000000..f4977fa357 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/oxidized_cut_copper_stairs_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/oxidized_cut_copper_stairs_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/oxidized_cut_copper_stairs_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_acacia_log_strip.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_acacia_log_strip.json new file mode 100644 index 0000000000..4d4ed90d70 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_acacia_log_strip.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/stripped_acacia_log_strip" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/stripped_acacia_log_strip" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_acacia_wood_strip.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_acacia_wood_strip.json new file mode 100644 index 0000000000..60b831336a --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_acacia_wood_strip.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/stripped_acacia_wood_strip" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/stripped_acacia_wood_strip" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_bamboo_block_strip.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_bamboo_block_strip.json new file mode 100644 index 0000000000..f51b2bd745 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_bamboo_block_strip.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/stripped_bamboo_block_strip" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/stripped_bamboo_block_strip" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_birch_log_strip.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_birch_log_strip.json new file mode 100644 index 0000000000..6a4e831f49 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_birch_log_strip.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/stripped_birch_log_strip" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/stripped_birch_log_strip" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_birch_wood_strip.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_birch_wood_strip.json new file mode 100644 index 0000000000..6df3ad9d72 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_birch_wood_strip.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/stripped_birch_wood_strip" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/stripped_birch_wood_strip" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_cherry_log_strip.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_cherry_log_strip.json new file mode 100644 index 0000000000..5e683e2401 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_cherry_log_strip.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/stripped_cherry_log_strip" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/stripped_cherry_log_strip" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_cherry_wood_strip.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_cherry_wood_strip.json new file mode 100644 index 0000000000..b440b504b0 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_cherry_wood_strip.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/stripped_cherry_wood_strip" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/stripped_cherry_wood_strip" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_crimson_hyphae_strip.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_crimson_hyphae_strip.json new file mode 100644 index 0000000000..7288edeac8 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_crimson_hyphae_strip.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/stripped_crimson_hyphae_strip" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/stripped_crimson_hyphae_strip" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_crimson_stem_strip.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_crimson_stem_strip.json new file mode 100644 index 0000000000..7a2248fb69 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_crimson_stem_strip.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/stripped_crimson_stem_strip" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/stripped_crimson_stem_strip" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_dark_oak_log_strip.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_dark_oak_log_strip.json new file mode 100644 index 0000000000..0be5a2745b --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_dark_oak_log_strip.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/stripped_dark_oak_log_strip" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/stripped_dark_oak_log_strip" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_dark_oak_wood_strip.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_dark_oak_wood_strip.json new file mode 100644 index 0000000000..8e65741a52 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_dark_oak_wood_strip.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/stripped_dark_oak_wood_strip" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/stripped_dark_oak_wood_strip" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_jungle_log_strip.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_jungle_log_strip.json new file mode 100644 index 0000000000..9ae1140f92 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_jungle_log_strip.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/stripped_jungle_log_strip" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/stripped_jungle_log_strip" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_jungle_wood_strip.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_jungle_wood_strip.json new file mode 100644 index 0000000000..930e2a0d37 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_jungle_wood_strip.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/stripped_jungle_wood_strip" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/stripped_jungle_wood_strip" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_mangrove_log_strip.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_mangrove_log_strip.json new file mode 100644 index 0000000000..2f34d6650e --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_mangrove_log_strip.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/stripped_mangrove_log_strip" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/stripped_mangrove_log_strip" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_mangrove_wood_strip.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_mangrove_wood_strip.json new file mode 100644 index 0000000000..cda9fdc415 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_mangrove_wood_strip.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/stripped_mangrove_wood_strip" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/stripped_mangrove_wood_strip" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_oak_log_strip.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_oak_log_strip.json new file mode 100644 index 0000000000..94e0d3772b --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_oak_log_strip.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/stripped_oak_log_strip" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/stripped_oak_log_strip" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_oak_wood_strip.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_oak_wood_strip.json new file mode 100644 index 0000000000..3b535305ee --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_oak_wood_strip.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/stripped_oak_wood_strip" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/stripped_oak_wood_strip" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_spruce_log_strip.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_spruce_log_strip.json new file mode 100644 index 0000000000..6b34a2bb92 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_spruce_log_strip.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/stripped_spruce_log_strip" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/stripped_spruce_log_strip" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_spruce_wood_strip.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_spruce_wood_strip.json new file mode 100644 index 0000000000..a6e6b5aa6c --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_spruce_wood_strip.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/stripped_spruce_wood_strip" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/stripped_spruce_wood_strip" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_warped_hyphae_strip.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_warped_hyphae_strip.json new file mode 100644 index 0000000000..81a1bd9667 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_warped_hyphae_strip.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/stripped_warped_hyphae_strip" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/stripped_warped_hyphae_strip" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_warped_stem_strip.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_warped_stem_strip.json new file mode 100644 index 0000000000..b00f3cca2b --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/stripped_warped_stem_strip.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/stripped_warped_stem_strip" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/stripped_warped_stem_strip" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_chiseled_copper_deoxidize.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_chiseled_copper_deoxidize.json new file mode 100644 index 0000000000..3a1a62b823 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_chiseled_copper_deoxidize.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/weathered_chiseled_copper_deoxidize" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/weathered_chiseled_copper_deoxidize" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_chiseled_copper_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_chiseled_copper_dewax.json new file mode 100644 index 0000000000..dec9d2cc22 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_chiseled_copper_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/weathered_chiseled_copper_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/weathered_chiseled_copper_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_bulb_deoxidize.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_bulb_deoxidize.json new file mode 100644 index 0000000000..98e7e0fbe3 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_bulb_deoxidize.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/weathered_copper_bulb_deoxidize" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/weathered_copper_bulb_deoxidize" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_bulb_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_bulb_dewax.json new file mode 100644 index 0000000000..2799354a92 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_bulb_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/weathered_copper_bulb_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/weathered_copper_bulb_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_deoxidize.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_deoxidize.json new file mode 100644 index 0000000000..074e2ed5db --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_deoxidize.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/weathered_copper_deoxidize" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/weathered_copper_deoxidize" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_dewax.json new file mode 100644 index 0000000000..84d70e3da3 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/weathered_copper_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/weathered_copper_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_door_deoxidize.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_door_deoxidize.json new file mode 100644 index 0000000000..088fcbc961 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_door_deoxidize.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/weathered_copper_door_deoxidize" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/weathered_copper_door_deoxidize" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_door_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_door_dewax.json new file mode 100644 index 0000000000..dc02a950a4 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_door_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/weathered_copper_door_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/weathered_copper_door_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_grate_deoxidize.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_grate_deoxidize.json new file mode 100644 index 0000000000..018ae39eee --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_grate_deoxidize.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/weathered_copper_grate_deoxidize" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/weathered_copper_grate_deoxidize" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_grate_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_grate_dewax.json new file mode 100644 index 0000000000..b944aa464e --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_grate_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/weathered_copper_grate_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/weathered_copper_grate_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_trapdoor_deoxidize.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_trapdoor_deoxidize.json new file mode 100644 index 0000000000..b05e5416ef --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_trapdoor_deoxidize.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/weathered_copper_trapdoor_deoxidize" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/weathered_copper_trapdoor_deoxidize" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_trapdoor_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_trapdoor_dewax.json new file mode 100644 index 0000000000..12012c51bd --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_copper_trapdoor_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/weathered_copper_trapdoor_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/weathered_copper_trapdoor_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_cut_copper_deoxidize.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_cut_copper_deoxidize.json new file mode 100644 index 0000000000..9a6f118392 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_cut_copper_deoxidize.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/weathered_cut_copper_deoxidize" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/weathered_cut_copper_deoxidize" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_cut_copper_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_cut_copper_dewax.json new file mode 100644 index 0000000000..1700d95390 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_cut_copper_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/weathered_cut_copper_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/weathered_cut_copper_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_cut_copper_slab_deoxidize.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_cut_copper_slab_deoxidize.json new file mode 100644 index 0000000000..1fd37c4dea --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_cut_copper_slab_deoxidize.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/weathered_cut_copper_slab_deoxidize" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/weathered_cut_copper_slab_deoxidize" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_cut_copper_slab_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_cut_copper_slab_dewax.json new file mode 100644 index 0000000000..6ac2d96334 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_cut_copper_slab_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/weathered_cut_copper_slab_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/weathered_cut_copper_slab_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_cut_copper_stairs_deoxidize.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_cut_copper_stairs_deoxidize.json new file mode 100644 index 0000000000..8b568c1499 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_cut_copper_stairs_deoxidize.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/weathered_cut_copper_stairs_deoxidize" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/weathered_cut_copper_stairs_deoxidize" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_cut_copper_stairs_dewax.json b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_cut_copper_stairs_dewax.json new file mode 100644 index 0000000000..f614acc181 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/block_smear/weathered_cut_copper_stairs_dewax.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:block_smear/weathered_cut_copper_stairs_dewax" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:block_smear/weathered_cut_copper_stairs_dewax" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/building_blocks/crate.json b/src/generated/resources/data/anvilcraft/advancement/recipes/building_blocks/crate.json new file mode 100644 index 0000000000..7181cc2f2d --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/building_blocks/crate.json @@ -0,0 +1,43 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_planks": { + "conditions": { + "items": [ + { + "items": "#minecraft:planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_resin": { + "conditions": { + "items": [ + { + "items": "anvilcraft:resin" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:crate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_planks", + "has_resin" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:crate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/multiblock/large_crate.json b/src/generated/resources/data/anvilcraft/advancement/recipes/multiblock/large_crate.json new file mode 100644 index 0000000000..d71edd896c --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/multiblock/large_crate.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:multiblock/large_crate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:multiblock/large_crate" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipes/procedural_process/mass_energy_inverter.json b/src/generated/resources/data/anvilcraft/advancement/recipes/procedural_process/mass_energy_inverter.json new file mode 100644 index 0000000000..729e0ae555 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipes/procedural_process/mass_energy_inverter.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:procedural_process/mass_energy_inverter" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:procedural_process/mass_energy_inverter" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/loot_table/blocks/hyperdimension_storage_station.json b/src/generated/resources/data/anvilcraft/loot_table/blocks/hyperdimension_storage_station.json index c6fdb92825..15ee50e138 100644 --- a/src/generated/resources/data/anvilcraft/loot_table/blocks/hyperdimension_storage_station.json +++ b/src/generated/resources/data/anvilcraft/loot_table/blocks/hyperdimension_storage_station.json @@ -20,6 +20,15 @@ } } ], + "functions": [ + { + "function": "minecraft:copy_components", + "include": [ + "anvilcraft:storage" + ], + "source": "block_entity" + } + ], "name": "anvilcraft:hyperdimension_storage_station" } ], diff --git a/src/generated/resources/data/anvilcraft/loot_table/blocks/mass_energy_inverter.json b/src/generated/resources/data/anvilcraft/loot_table/blocks/mass_energy_inverter.json new file mode 100644 index 0000000000..8eda435f61 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/loot_table/blocks/mass_energy_inverter.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "anvilcraft:mass_energy_inverter" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "anvilcraft:blocks/mass_energy_inverter" +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/loot_table/blocks/shulker_container.json b/src/generated/resources/data/anvilcraft/loot_table/blocks/shulker_container.json index f0f591b8f6..e983d094a5 100644 --- a/src/generated/resources/data/anvilcraft/loot_table/blocks/shulker_container.json +++ b/src/generated/resources/data/anvilcraft/loot_table/blocks/shulker_container.json @@ -20,6 +20,15 @@ } } ], + "functions": [ + { + "function": "minecraft:copy_components", + "include": [ + "anvilcraft:storage" + ], + "source": "block_entity" + } + ], "name": "anvilcraft:shulker_container" } ], diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/chiseled_copper_deoxidize.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/chiseled_copper_deoxidize.json new file mode 100644 index 0000000000..88e344ac3c --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/chiseled_copper_deoxidize.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:exposed_chiseled_copper" + } + ], + "result": { + "block": "minecraft:chiseled_copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/chiseled_copper_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/chiseled_copper_dewax.json new file mode 100644 index 0000000000..c8b00289fe --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/chiseled_copper_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_chiseled_copper" + } + ], + "result": { + "block": "minecraft:chiseled_copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_block_deoxidize.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_block_deoxidize.json new file mode 100644 index 0000000000..8534365e36 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_block_deoxidize.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:exposed_copper" + } + ], + "result": { + "block": "minecraft:copper_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_block_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_block_dewax.json new file mode 100644 index 0000000000..d5354631a0 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_block_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_copper_block" + } + ], + "result": { + "block": "minecraft:copper_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_bulb_deoxidize.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_bulb_deoxidize.json new file mode 100644 index 0000000000..67b782a884 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_bulb_deoxidize.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:exposed_copper_bulb" + } + ], + "result": { + "block": "minecraft:copper_bulb" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_bulb_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_bulb_dewax.json new file mode 100644 index 0000000000..76886c1766 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_bulb_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_copper_bulb" + } + ], + "result": { + "block": "minecraft:copper_bulb" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_door_deoxidize.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_door_deoxidize.json new file mode 100644 index 0000000000..023a117f82 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_door_deoxidize.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:exposed_copper_door" + } + ], + "result": { + "block": "minecraft:copper_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_door_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_door_dewax.json new file mode 100644 index 0000000000..a860282132 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_door_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_copper_door" + } + ], + "result": { + "block": "minecraft:copper_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_grate_deoxidize.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_grate_deoxidize.json new file mode 100644 index 0000000000..f586d24410 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_grate_deoxidize.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:exposed_copper_grate" + } + ], + "result": { + "block": "minecraft:copper_grate" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_grate_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_grate_dewax.json new file mode 100644 index 0000000000..d13c8b350f --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_grate_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_copper_grate" + } + ], + "result": { + "block": "minecraft:copper_grate" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_trapdoor_deoxidize.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_trapdoor_deoxidize.json new file mode 100644 index 0000000000..c7809a3d8d --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_trapdoor_deoxidize.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:exposed_copper_trapdoor" + } + ], + "result": { + "block": "minecraft:copper_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_trapdoor_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_trapdoor_dewax.json new file mode 100644 index 0000000000..e283f055f8 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/copper_trapdoor_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_copper_trapdoor" + } + ], + "result": { + "block": "minecraft:copper_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/cut_copper_deoxidize.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/cut_copper_deoxidize.json new file mode 100644 index 0000000000..5f40141a18 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/cut_copper_deoxidize.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:exposed_cut_copper" + } + ], + "result": { + "block": "minecraft:cut_copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/cut_copper_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/cut_copper_dewax.json new file mode 100644 index 0000000000..341619ed53 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/cut_copper_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_cut_copper" + } + ], + "result": { + "block": "minecraft:cut_copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/cut_copper_slab_deoxidize.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/cut_copper_slab_deoxidize.json new file mode 100644 index 0000000000..0fef507962 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/cut_copper_slab_deoxidize.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:exposed_cut_copper_slab" + } + ], + "result": { + "block": "minecraft:cut_copper_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/cut_copper_slab_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/cut_copper_slab_dewax.json new file mode 100644 index 0000000000..bc62f1a684 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/cut_copper_slab_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_cut_copper_slab" + } + ], + "result": { + "block": "minecraft:cut_copper_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/cut_copper_stairs_deoxidize.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/cut_copper_stairs_deoxidize.json new file mode 100644 index 0000000000..018ec5b694 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/cut_copper_stairs_deoxidize.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:exposed_cut_copper_stairs" + } + ], + "result": { + "block": "minecraft:cut_copper_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/cut_copper_stairs_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/cut_copper_stairs_dewax.json new file mode 100644 index 0000000000..f6b92a036d --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/cut_copper_stairs_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_cut_copper_stairs" + } + ], + "result": { + "block": "minecraft:cut_copper_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_chiseled_copper_deoxidize.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_chiseled_copper_deoxidize.json new file mode 100644 index 0000000000..43d4826182 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_chiseled_copper_deoxidize.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:weathered_chiseled_copper" + } + ], + "result": { + "block": "minecraft:exposed_chiseled_copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_chiseled_copper_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_chiseled_copper_dewax.json new file mode 100644 index 0000000000..a998150a54 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_chiseled_copper_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_exposed_chiseled_copper" + } + ], + "result": { + "block": "minecraft:exposed_chiseled_copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_bulb_deoxidize.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_bulb_deoxidize.json new file mode 100644 index 0000000000..c44f40ec54 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_bulb_deoxidize.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:weathered_copper_bulb" + } + ], + "result": { + "block": "minecraft:exposed_copper_bulb" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_bulb_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_bulb_dewax.json new file mode 100644 index 0000000000..cb52ca93ec --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_bulb_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_exposed_copper_bulb" + } + ], + "result": { + "block": "minecraft:exposed_copper_bulb" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_deoxidize.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_deoxidize.json new file mode 100644 index 0000000000..4fe1adf1e6 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_deoxidize.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:weathered_copper" + } + ], + "result": { + "block": "minecraft:exposed_copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_dewax.json new file mode 100644 index 0000000000..d93e4b170e --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_exposed_copper" + } + ], + "result": { + "block": "minecraft:exposed_copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_door_deoxidize.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_door_deoxidize.json new file mode 100644 index 0000000000..77d457ee9b --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_door_deoxidize.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:weathered_copper_door" + } + ], + "result": { + "block": "minecraft:exposed_copper_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_door_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_door_dewax.json new file mode 100644 index 0000000000..10f7af08a8 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_door_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_exposed_copper_door" + } + ], + "result": { + "block": "minecraft:exposed_copper_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_grate_deoxidize.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_grate_deoxidize.json new file mode 100644 index 0000000000..41ea3c11a7 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_grate_deoxidize.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:weathered_copper_grate" + } + ], + "result": { + "block": "minecraft:exposed_copper_grate" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_grate_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_grate_dewax.json new file mode 100644 index 0000000000..0812946ca1 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_grate_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_exposed_copper_grate" + } + ], + "result": { + "block": "minecraft:exposed_copper_grate" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_trapdoor_deoxidize.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_trapdoor_deoxidize.json new file mode 100644 index 0000000000..c049907ff2 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_trapdoor_deoxidize.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:weathered_copper_trapdoor" + } + ], + "result": { + "block": "minecraft:exposed_copper_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_trapdoor_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_trapdoor_dewax.json new file mode 100644 index 0000000000..5fc25a8dfe --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_copper_trapdoor_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_exposed_copper_trapdoor" + } + ], + "result": { + "block": "minecraft:exposed_copper_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_cut_copper_deoxidize.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_cut_copper_deoxidize.json new file mode 100644 index 0000000000..2bd38ce396 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_cut_copper_deoxidize.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:weathered_cut_copper" + } + ], + "result": { + "block": "minecraft:exposed_cut_copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_cut_copper_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_cut_copper_dewax.json new file mode 100644 index 0000000000..51c9270c63 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_cut_copper_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_exposed_cut_copper" + } + ], + "result": { + "block": "minecraft:exposed_cut_copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_cut_copper_slab_deoxidize.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_cut_copper_slab_deoxidize.json new file mode 100644 index 0000000000..730e7f4f01 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_cut_copper_slab_deoxidize.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:weathered_cut_copper_slab" + } + ], + "result": { + "block": "minecraft:exposed_cut_copper_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_cut_copper_slab_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_cut_copper_slab_dewax.json new file mode 100644 index 0000000000..c32280719f --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_cut_copper_slab_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_exposed_cut_copper_slab" + } + ], + "result": { + "block": "minecraft:exposed_cut_copper_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_cut_copper_stairs_deoxidize.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_cut_copper_stairs_deoxidize.json new file mode 100644 index 0000000000..9b7dcb5cd3 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_cut_copper_stairs_deoxidize.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:weathered_cut_copper_stairs" + } + ], + "result": { + "block": "minecraft:exposed_cut_copper_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_cut_copper_stairs_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_cut_copper_stairs_dewax.json new file mode 100644 index 0000000000..9e5c423a3f --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/exposed_cut_copper_stairs_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_exposed_cut_copper_stairs" + } + ], + "result": { + "block": "minecraft:exposed_cut_copper_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/oxidized_chiseled_copper_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/oxidized_chiseled_copper_dewax.json new file mode 100644 index 0000000000..35758008af --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/oxidized_chiseled_copper_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_oxidized_chiseled_copper" + } + ], + "result": { + "block": "minecraft:oxidized_chiseled_copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/oxidized_copper_bulb_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/oxidized_copper_bulb_dewax.json new file mode 100644 index 0000000000..130bd2e833 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/oxidized_copper_bulb_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_oxidized_copper_bulb" + } + ], + "result": { + "block": "minecraft:oxidized_copper_bulb" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/oxidized_copper_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/oxidized_copper_dewax.json new file mode 100644 index 0000000000..d6a44c7920 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/oxidized_copper_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_oxidized_copper" + } + ], + "result": { + "block": "minecraft:oxidized_copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/oxidized_copper_door_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/oxidized_copper_door_dewax.json new file mode 100644 index 0000000000..f461cef32e --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/oxidized_copper_door_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_oxidized_copper_door" + } + ], + "result": { + "block": "minecraft:oxidized_copper_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/oxidized_copper_grate_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/oxidized_copper_grate_dewax.json new file mode 100644 index 0000000000..f46b04f0e2 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/oxidized_copper_grate_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_oxidized_copper_grate" + } + ], + "result": { + "block": "minecraft:oxidized_copper_grate" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/oxidized_copper_trapdoor_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/oxidized_copper_trapdoor_dewax.json new file mode 100644 index 0000000000..4984ea5e30 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/oxidized_copper_trapdoor_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_oxidized_copper_trapdoor" + } + ], + "result": { + "block": "minecraft:oxidized_copper_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/oxidized_cut_copper_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/oxidized_cut_copper_dewax.json new file mode 100644 index 0000000000..daebec16d6 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/oxidized_cut_copper_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_oxidized_cut_copper" + } + ], + "result": { + "block": "minecraft:oxidized_cut_copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/oxidized_cut_copper_slab_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/oxidized_cut_copper_slab_dewax.json new file mode 100644 index 0000000000..cb9ef57a30 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/oxidized_cut_copper_slab_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_oxidized_cut_copper_slab" + } + ], + "result": { + "block": "minecraft:oxidized_cut_copper_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/oxidized_cut_copper_stairs_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/oxidized_cut_copper_stairs_dewax.json new file mode 100644 index 0000000000..c2c744b8ab --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/oxidized_cut_copper_stairs_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_oxidized_cut_copper_stairs" + } + ], + "result": { + "block": "minecraft:oxidized_cut_copper_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_acacia_log_strip.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_acacia_log_strip.json new file mode 100644 index 0000000000..6cfb8812b5 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_acacia_log_strip.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:acacia_log" + } + ], + "result": { + "block": "minecraft:stripped_acacia_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_acacia_wood_strip.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_acacia_wood_strip.json new file mode 100644 index 0000000000..26c3b75c20 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_acacia_wood_strip.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:acacia_wood" + } + ], + "result": { + "block": "minecraft:stripped_acacia_wood" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_bamboo_block_strip.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_bamboo_block_strip.json new file mode 100644 index 0000000000..700404910d --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_bamboo_block_strip.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:bamboo_block" + } + ], + "result": { + "block": "minecraft:stripped_bamboo_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_birch_log_strip.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_birch_log_strip.json new file mode 100644 index 0000000000..b0aa908a76 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_birch_log_strip.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:birch_log" + } + ], + "result": { + "block": "minecraft:stripped_birch_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_birch_wood_strip.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_birch_wood_strip.json new file mode 100644 index 0000000000..599d9ebfaa --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_birch_wood_strip.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:birch_wood" + } + ], + "result": { + "block": "minecraft:stripped_birch_wood" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_cherry_log_strip.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_cherry_log_strip.json new file mode 100644 index 0000000000..4d9c9717f1 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_cherry_log_strip.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:cherry_log" + } + ], + "result": { + "block": "minecraft:stripped_cherry_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_cherry_wood_strip.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_cherry_wood_strip.json new file mode 100644 index 0000000000..187a96c312 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_cherry_wood_strip.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:cherry_wood" + } + ], + "result": { + "block": "minecraft:stripped_cherry_wood" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_crimson_hyphae_strip.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_crimson_hyphae_strip.json new file mode 100644 index 0000000000..cad7c88ad2 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_crimson_hyphae_strip.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:crimson_hyphae" + } + ], + "result": { + "block": "minecraft:stripped_crimson_hyphae" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_crimson_stem_strip.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_crimson_stem_strip.json new file mode 100644 index 0000000000..5cff8d15eb --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_crimson_stem_strip.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:crimson_stem" + } + ], + "result": { + "block": "minecraft:stripped_crimson_stem" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_dark_oak_log_strip.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_dark_oak_log_strip.json new file mode 100644 index 0000000000..2b6a80cd1f --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_dark_oak_log_strip.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:dark_oak_log" + } + ], + "result": { + "block": "minecraft:stripped_dark_oak_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_dark_oak_wood_strip.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_dark_oak_wood_strip.json new file mode 100644 index 0000000000..9bfafa284b --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_dark_oak_wood_strip.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:dark_oak_wood" + } + ], + "result": { + "block": "minecraft:stripped_dark_oak_wood" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_jungle_log_strip.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_jungle_log_strip.json new file mode 100644 index 0000000000..dce67e5b45 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_jungle_log_strip.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:jungle_log" + } + ], + "result": { + "block": "minecraft:stripped_jungle_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_jungle_wood_strip.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_jungle_wood_strip.json new file mode 100644 index 0000000000..0c42f85db2 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_jungle_wood_strip.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:jungle_wood" + } + ], + "result": { + "block": "minecraft:stripped_jungle_wood" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_mangrove_log_strip.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_mangrove_log_strip.json new file mode 100644 index 0000000000..9affde6f1e --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_mangrove_log_strip.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:mangrove_log" + } + ], + "result": { + "block": "minecraft:stripped_mangrove_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_mangrove_wood_strip.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_mangrove_wood_strip.json new file mode 100644 index 0000000000..daa195c80c --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_mangrove_wood_strip.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:mangrove_wood" + } + ], + "result": { + "block": "minecraft:stripped_mangrove_wood" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_oak_log_strip.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_oak_log_strip.json new file mode 100644 index 0000000000..a307e703c1 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_oak_log_strip.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:oak_log" + } + ], + "result": { + "block": "minecraft:stripped_oak_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_oak_wood_strip.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_oak_wood_strip.json new file mode 100644 index 0000000000..320357b536 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_oak_wood_strip.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:oak_wood" + } + ], + "result": { + "block": "minecraft:stripped_oak_wood" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_spruce_log_strip.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_spruce_log_strip.json new file mode 100644 index 0000000000..1983fba42e --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_spruce_log_strip.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:spruce_log" + } + ], + "result": { + "block": "minecraft:stripped_spruce_log" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_spruce_wood_strip.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_spruce_wood_strip.json new file mode 100644 index 0000000000..53486e7dc1 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_spruce_wood_strip.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:spruce_wood" + } + ], + "result": { + "block": "minecraft:stripped_spruce_wood" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_warped_hyphae_strip.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_warped_hyphae_strip.json new file mode 100644 index 0000000000..266c33390c --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_warped_hyphae_strip.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:warped_hyphae" + } + ], + "result": { + "block": "minecraft:stripped_warped_hyphae" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_warped_stem_strip.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_warped_stem_strip.json new file mode 100644 index 0000000000..a970ca9748 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/stripped_warped_stem_strip.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:warped_stem" + } + ], + "result": { + "block": "minecraft:stripped_warped_stem" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_chiseled_copper_deoxidize.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_chiseled_copper_deoxidize.json new file mode 100644 index 0000000000..d256f6e7c5 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_chiseled_copper_deoxidize.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:oxidized_chiseled_copper" + } + ], + "result": { + "block": "minecraft:weathered_chiseled_copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_chiseled_copper_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_chiseled_copper_dewax.json new file mode 100644 index 0000000000..907792f95e --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_chiseled_copper_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_weathered_chiseled_copper" + } + ], + "result": { + "block": "minecraft:weathered_chiseled_copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_bulb_deoxidize.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_bulb_deoxidize.json new file mode 100644 index 0000000000..ac5bef6fd0 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_bulb_deoxidize.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:oxidized_copper_bulb" + } + ], + "result": { + "block": "minecraft:weathered_copper_bulb" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_bulb_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_bulb_dewax.json new file mode 100644 index 0000000000..2e3a31cd55 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_bulb_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_weathered_copper_bulb" + } + ], + "result": { + "block": "minecraft:weathered_copper_bulb" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_deoxidize.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_deoxidize.json new file mode 100644 index 0000000000..b7c5defff8 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_deoxidize.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:oxidized_copper" + } + ], + "result": { + "block": "minecraft:weathered_copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_dewax.json new file mode 100644 index 0000000000..257b438839 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_weathered_copper" + } + ], + "result": { + "block": "minecraft:weathered_copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_door_deoxidize.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_door_deoxidize.json new file mode 100644 index 0000000000..09141046b2 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_door_deoxidize.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:oxidized_copper_door" + } + ], + "result": { + "block": "minecraft:weathered_copper_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_door_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_door_dewax.json new file mode 100644 index 0000000000..dd88634eec --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_door_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_weathered_copper_door" + } + ], + "result": { + "block": "minecraft:weathered_copper_door" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_grate_deoxidize.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_grate_deoxidize.json new file mode 100644 index 0000000000..a3fb840621 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_grate_deoxidize.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:oxidized_copper_grate" + } + ], + "result": { + "block": "minecraft:weathered_copper_grate" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_grate_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_grate_dewax.json new file mode 100644 index 0000000000..9ff06dd0a7 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_grate_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_weathered_copper_grate" + } + ], + "result": { + "block": "minecraft:weathered_copper_grate" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_trapdoor_deoxidize.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_trapdoor_deoxidize.json new file mode 100644 index 0000000000..fa630c0a64 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_trapdoor_deoxidize.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:oxidized_copper_trapdoor" + } + ], + "result": { + "block": "minecraft:weathered_copper_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_trapdoor_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_trapdoor_dewax.json new file mode 100644 index 0000000000..7d7413c3f4 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_copper_trapdoor_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_weathered_copper_trapdoor" + } + ], + "result": { + "block": "minecraft:weathered_copper_trapdoor" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_cut_copper_deoxidize.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_cut_copper_deoxidize.json new file mode 100644 index 0000000000..9bdc513cee --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_cut_copper_deoxidize.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:oxidized_cut_copper" + } + ], + "result": { + "block": "minecraft:weathered_cut_copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_cut_copper_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_cut_copper_dewax.json new file mode 100644 index 0000000000..8f98980593 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_cut_copper_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_weathered_cut_copper" + } + ], + "result": { + "block": "minecraft:weathered_cut_copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_cut_copper_slab_deoxidize.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_cut_copper_slab_deoxidize.json new file mode 100644 index 0000000000..60629934a5 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_cut_copper_slab_deoxidize.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:oxidized_cut_copper_slab" + } + ], + "result": { + "block": "minecraft:weathered_cut_copper_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_cut_copper_slab_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_cut_copper_slab_dewax.json new file mode 100644 index 0000000000..7db8fdc831 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_cut_copper_slab_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_weathered_cut_copper_slab" + } + ], + "result": { + "block": "minecraft:weathered_cut_copper_slab" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_cut_copper_stairs_deoxidize.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_cut_copper_stairs_deoxidize.json new file mode 100644 index 0000000000..7fbcd5942c --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_cut_copper_stairs_deoxidize.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:oxidized_cut_copper_stairs" + } + ], + "result": { + "block": "minecraft:weathered_cut_copper_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_cut_copper_stairs_dewax.json b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_cut_copper_stairs_dewax.json new file mode 100644 index 0000000000..d4800f33a5 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/block_smear/weathered_cut_copper_stairs_dewax.json @@ -0,0 +1,25 @@ +{ + "type": "anvilcraft:block_smear", + "inputs": [ + { + "blocks": [ + "minecraft:grindstone", + "anvilcraft:ember_grindstone", + "anvilcraft:frost_grindstone", + "anvilcraft:royal_grindstone", + "anvilcraft:transcendence_grindstone" + ], + "properties": [ + { + "face": "ceiling" + } + ] + }, + { + "blocks": "minecraft:waxed_weathered_cut_copper_stairs" + } + ], + "result": { + "block": "minecraft:weathered_cut_copper_stairs" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/crate.json b/src/generated/resources/data/anvilcraft/recipe/crate.json new file mode 100644 index 0000000000..f5c02041ca --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/crate.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "A": { + "tag": "minecraft:planks" + }, + "B": { + "item": "anvilcraft:resin" + } + }, + "pattern": [ + "AAA", + "ABA", + "AAA" + ], + "result": { + "count": 2, + "id": "anvilcraft:crate" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/multiblock/celestial_forging_anvil.json b/src/generated/resources/data/anvilcraft/recipe/multiblock/celestial_forging_anvil.json index 280a95a8a9..92e073520f 100644 --- a/src/generated/resources/data/anvilcraft/recipe/multiblock/celestial_forging_anvil.json +++ b/src/generated/resources/data/anvilcraft/recipe/multiblock/celestial_forging_anvil.json @@ -9,7 +9,7 @@ ], [ "CCC", - "CCC", + "CFC", "CCC" ], [ @@ -33,6 +33,9 @@ }, "E": { "block": "anvilcraft:negative_matter_block" + }, + "F": { + "block": "anvilcraft:mass_energy_inverter" } } }, diff --git a/src/generated/resources/data/anvilcraft/recipe/multiblock/large_crate.json b/src/generated/resources/data/anvilcraft/recipe/multiblock/large_crate.json new file mode 100644 index 0000000000..c2d2744e17 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/multiblock/large_crate.json @@ -0,0 +1,34 @@ +{ + "type": "anvilcraft:multiblock", + "pattern": { + "layers": [ + [ + "AAA", + "AAA", + "AAA" + ], + [ + "AAA", + "ABA", + "AAA" + ], + [ + "AAA", + "AAA", + "AAA" + ] + ], + "symbols": { + "A": { + "tag": "c:stripped_logs" + }, + "B": { + "block": "anvilcraft:resin_block" + } + } + }, + "result": { + "count": 1, + "id": "anvilcraft:large_crate" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/procedural_process/mass_energy_inverter.json b/src/generated/resources/data/anvilcraft/recipe/procedural_process/mass_energy_inverter.json new file mode 100644 index 0000000000..28981ab0e7 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/procedural_process/mass_energy_inverter.json @@ -0,0 +1,104 @@ +{ + "type": "anvilcraft:procedural_process", + "displayed_models": [ + "anvilcraft:block/wip_display/mass_energy_inverter_wip", + "anvilcraft:block/wip_display/mass_energy_inverter_wip_2", + "anvilcraft:block/wip_display/mass_energy_inverter_wip_3" + ], + "icon": { + "count": 1, + "id": "anvilcraft:mass_energy_inverter" + }, + "initial_block": { + "blocks": "anvilcraft:laser_receiver" + }, + "loop": 3, + "multiple_loop_first_step": { + "content": { + "type": "anvilcraft:block_processing", + "inputs": [ + { + "blocks": "anvilcraft:wip_block" + }, + { + "blocks": "anvilcraft:neutron_irradiator", + "properties": [ + { + "type": "mass" + } + ] + } + ], + "result": { + "block": "anvilcraft:wip_block" + } + }, + "index": 0 + }, + "result_block": { + "block": "anvilcraft:mass_energy_inverter" + }, + "steps": [ + { + "content": { + "type": "anvilcraft:block_processing", + "inputs": [ + { + "blocks": "anvilcraft:laser_receiver" + }, + { + "blocks": "anvilcraft:neutron_irradiator", + "properties": [ + { + "type": "mass" + } + ] + } + ], + "result": { + "block": "anvilcraft:wip_block" + } + }, + "index": 0 + }, + { + "content": { + "type": "anvilcraft:block_processing", + "inputs": [ + { + "blocks": "anvilcraft:wip_block" + }, + { + "blocks": "anvilcraft:neutron_irradiator", + "properties": [ + { + "type": "energy" + } + ] + } + ], + "result": { + "block": "anvilcraft:wip_block" + } + }, + "index": 1 + }, + { + "content": { + "type": "anvilcraft:item_inject", + "block_ingredient": { + "blocks": "anvilcraft:wip_block" + }, + "block_result": { + "block": "anvilcraft:wip_block" + }, + "ingredients": [ + { + "items": "anvilcraft:transcendium_nugget" + } + ] + }, + "index": 2 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json index 559c668d73..9b82603093 100644 --- a/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json +++ b/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json @@ -78,6 +78,7 @@ "anvilcraft:jewelcrafting_table", "anvilcraft:transparent_crafting_table", "anvilcraft:space_overcompressor", + "anvilcraft:mass_energy_inverter", "anvilcraft:shulker_container", "anvilcraft:hyperdimension_storage_station", "anvilcraft:chute", diff --git a/src/main/java/dev/dubhe/anvilcraft/anvil/MassInjectBehavior.java b/src/main/java/dev/dubhe/anvilcraft/anvil/MassInjectBehavior.java index e0db80284b..ea74ba4ecd 100644 --- a/src/main/java/dev/dubhe/anvilcraft/anvil/MassInjectBehavior.java +++ b/src/main/java/dev/dubhe/anvilcraft/anvil/MassInjectBehavior.java @@ -3,6 +3,7 @@ import dev.anvilcraft.lib.v2.recipe.AnvilLibRecipe; import dev.dubhe.anvilcraft.api.anvil.IAnvilBehavior; import dev.dubhe.anvilcraft.api.event.AnvilEvent; +import dev.dubhe.anvilcraft.block.MassEnergyInverterBlock; import dev.dubhe.anvilcraft.block.entity.SpaceOvercompressorBlockEntity; import dev.dubhe.anvilcraft.init.recipe.ModRecipeTypes; import dev.dubhe.anvilcraft.recipe.anvil.MassInjectRecipe; @@ -50,7 +51,11 @@ public boolean handle( if (itemEntity.getItem().isEmpty()) itemEntity.discard(); if (remainingProcessCount <= 0) break; } - compressor.injectMass(totalMassConsumed); + long mass = totalMassConsumed; + if (mass > 0 && MassEnergyInverterBlock.hasAdjacentInverter(level, hitBlockPos)) { + mass *= 2; + } + compressor.injectMass(mass); return true; } } diff --git a/src/main/java/dev/dubhe/anvilcraft/api/itemhandler/ReadOnlyItemHandlerWrapper.java b/src/main/java/dev/dubhe/anvilcraft/api/itemhandler/ReadOnlyItemHandlerWrapper.java new file mode 100644 index 0000000000..077701b7c6 --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/api/itemhandler/ReadOnlyItemHandlerWrapper.java @@ -0,0 +1,47 @@ +package dev.dubhe.anvilcraft.api.itemhandler; + +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.items.IItemHandler; + +/// ??? IItemHandler ???????????????? +public class ReadOnlyItemHandlerWrapper implements IItemHandler { + private final IItemHandler delegate; + + public ReadOnlyItemHandlerWrapper(IItemHandler delegate) { + this.delegate = delegate; + } + + @Override + public int getSlots() { + return this.delegate.getSlots(); + } + + @Override + public ItemStack getStackInSlot(int slot) { + return this.delegate.getStackInSlot(slot); + } + + @Override + public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { + return stack; + } + + @Override + public ItemStack extractItem(int slot, int amount, boolean simulate) { + return ItemStack.EMPTY; + } + + @Override + public int getSlotLimit(int slot) { + return this.delegate.getSlotLimit(slot); + } + + @Override + public boolean isItemValid(int slot, ItemStack stack) { + return false; + } + + public static IItemHandler wrap(IItemHandler delegate) { + return new ReadOnlyItemHandlerWrapper(delegate); + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/api/tooltip/ItemTooltipManager.java b/src/main/java/dev/dubhe/anvilcraft/api/tooltip/ItemTooltipManager.java index 18f3fe4b7c..b640bef605 100644 --- a/src/main/java/dev/dubhe/anvilcraft/api/tooltip/ItemTooltipManager.java +++ b/src/main/java/dev/dubhe/anvilcraft/api/tooltip/ItemTooltipManager.java @@ -9,13 +9,17 @@ import dev.dubhe.anvilcraft.block.PowerConverterSmallBlock; import dev.dubhe.anvilcraft.block.PowerConverterSuperBigBlock; import dev.dubhe.anvilcraft.client.init.ModKeyMappings; +import dev.dubhe.anvilcraft.client.rpc.StorageClientStub; import dev.dubhe.anvilcraft.init.block.ModBlocks; import dev.dubhe.anvilcraft.init.item.ModComponents; import dev.dubhe.anvilcraft.init.item.ModFoodItems; import dev.dubhe.anvilcraft.init.item.ModItemTags; import dev.dubhe.anvilcraft.init.item.ModItems; +import dev.dubhe.anvilcraft.inventory.tooltip.StorageTooltip; import dev.dubhe.anvilcraft.item.amulet.AmuletBoxItem; import dev.dubhe.anvilcraft.item.property.component.BoxContents; +import dev.dubhe.anvilcraft.item.property.component.StorageRef; +import dev.dubhe.anvilcraft.rpc.StorageServerStub; import dev.dubhe.anvilcraft.util.UnitUtil; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; @@ -26,17 +30,26 @@ import net.minecraft.network.chat.ComponentUtils; import net.minecraft.network.chat.contents.TranslatableContents; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; public class ItemTooltipManager { private static final Map NORMAL = Maps.newHashMap(); private static final Map SHIFT = Maps.newHashMap(); + private static final Map STORAGE_USAGE = new ConcurrentHashMap<>(); + private static final Map STORAGE_USAGE_TIMES = new ConcurrentHashMap<>(); + private static final Set STORAGE_USAGE_PENDING = ConcurrentHashMap.newKeySet(); + private static final long STORAGE_USAGE_REFRESH_INTERVAL = 2000L; static { NORMAL.put(ModItems.MAGNET.get(), "Attract surrounding items when use"); @@ -368,6 +381,9 @@ public class ItemTooltipManager { ); NORMAL.put(ModBlocks.PUMP.asItem(), "Pumps fluids, consumes 32 kW"); NORMAL.put(ModBlocks.CREATIVE_CRATE.asItem(), "Infinite item storage and supply"); + NORMAL.put(ModBlocks.CRATE.asItem(), "Stores up to 2048 space of items"); + NORMAL.put(ModBlocks.LARGE_CRATE.asItem(), "A huge 3x3x3 crate, stores up to 65536 space of items"); + NORMAL.put(ModBlocks.SHULKER_CONTAINER.asItem(), "A space-folding container upgraded from a Large Crate"); NORMAL.put(ModBlocks.CREATIVE_FLUID_TANK.asItem(), "Infinite fluid storage and supply"); NORMAL.put(ModBlocks.FLUID_TANK.asItem(), "Stores fluids"); NORMAL.put(ModBlocks.LARGE_FLUID_TANK.asItem(), "Stores multiple fluids"); @@ -637,6 +653,26 @@ Supports pickup mode (from containers or drops) and move mode (direct block move Creative players left-click to clear the configuration Survival players left-click to take out items""" ); + SHIFT.put( + ModBlocks.CRATE.asItem(), """ + Can contain 2048 items + Breaking it drops the contents + When it holds more than 1000 items, hold Shift to break it""" + ); + SHIFT.put( + ModBlocks.LARGE_CRATE.asItem(), """ + Can contain 65536 items + Breaking it drops the contents + When it holds more than 1000 items, hold Shift to break it + Can update to Shulker Container""" + ); + SHIFT.put( + ModBlocks.SHULKER_CONTAINER.asItem(), """ + Can contain 65536 types of items, each type contain 65536 items + Breaking it drops the container with its items stored inside + Drop Space Overcompressors on top and strike with an anvil to expand capacity + Each one doubles the storage space (up to 4)""" + ); SHIFT.put( ModBlocks.CREATIVE_FLUID_TANK.asItem(), """ Provides infinite fluid of a set type: fill fluid inside to configure @@ -885,6 +921,43 @@ public static void addTooltip(ItemStack stack, List tooltip) { } } + public static Optional getStorageTooltip(ItemStack stack) { + StorageRef ref = stack.get(ModComponents.STORAGE); + if (ref == null || ref.id().isEmpty()) { + return Optional.empty(); + } + UUID storageId = ref.id().get(); + StorageServerStub.StorageUsage usage = STORAGE_USAGE.get(storageId); + if ( + usage == null + || System.currentTimeMillis() - STORAGE_USAGE_TIMES.getOrDefault(storageId, 0L) + > STORAGE_USAGE_REFRESH_INTERVAL + ) { + ItemTooltipManager.requestStorageUsage(storageId); + } + if (usage == null || usage.typeLimit() <= 0 || usage.typeLimit() == Integer.MAX_VALUE) { + return Optional.empty(); + } + return Optional.of(new StorageTooltip(usage.usedTypes(), usage.typeLimit(), usage.types())); + } + + private static void requestStorageUsage(UUID storageId) { + if (Minecraft.getInstance().player == null) { + return; + } + if (!STORAGE_USAGE_PENDING.add(storageId)) { + return; + } + StorageClientStub.loadUsage(storageId).whenComplete((usage, error) -> { + STORAGE_USAGE_PENDING.remove(storageId); + if (error != null || usage == null || usage.typeLimit() <= 0) { + return; + } + STORAGE_USAGE.put(storageId, usage); + STORAGE_USAGE_TIMES.put(storageId, System.currentTimeMillis()); + }); + } + /** * 添加翻译后的tooltip,自动将 \n 拆分为多行 */ diff --git a/src/main/java/dev/dubhe/anvilcraft/block/MassEnergyInverterBlock.java b/src/main/java/dev/dubhe/anvilcraft/block/MassEnergyInverterBlock.java new file mode 100644 index 0000000000..541212c78e --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/block/MassEnergyInverterBlock.java @@ -0,0 +1,73 @@ +package dev.dubhe.anvilcraft.block; + +import com.mojang.serialization.MapCodec; +import dev.dubhe.anvilcraft.api.hammer.IHammerRemovable; +import dev.dubhe.anvilcraft.block.better.BetterBaseEntityBlock; +import dev.dubhe.anvilcraft.block.entity.MassEnergyInverterBlockEntity; +import dev.dubhe.anvilcraft.init.block.ModBlockEntities; +import dev.dubhe.anvilcraft.init.block.ModBlocks; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +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.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; + +public class MassEnergyInverterBlock extends BetterBaseEntityBlock implements IHammerRemovable { + private static final VoxelShape SHAPE = Shapes.or( + Block.box(3.0, 0.0, 3.0, 13.0, 16.0, 13.0), + Block.box(1.0, 3.0, 1.0, 15.0, 13.0, 15.0) + ); + + public MassEnergyInverterBlock(Properties properties) { + super(properties); + } + + @Override + protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { + return SHAPE; + } + + @Override + protected RenderShape getRenderShape(BlockState state) { + return RenderShape.MODEL; + } + + @Override + protected MapCodec codec() { + return simpleCodec(MassEnergyInverterBlock::new); + } + + @Override + public @Nullable BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new MassEnergyInverterBlockEntity(pos, state); + } + + @Override + public @Nullable BlockEntityTicker getTicker( + Level level, BlockState state, BlockEntityType type + ) { + if (level.isClientSide) return null; + return createTickerHelper( + type, ModBlockEntities.MASS_ENERGY_INVERTER.get(), MassEnergyInverterBlockEntity::tick + ); + } + + public static boolean hasAdjacentInverter(Level level, BlockPos pos) { + for (Direction direction : Direction.Plane.HORIZONTAL) { + if (level.getBlockState(pos.relative(direction)).is(ModBlocks.MASS_ENERGY_INVERTER)) { + return true; + } + } + return false; + } +} \ No newline at end of file diff --git a/src/main/java/dev/dubhe/anvilcraft/block/container/storage/CrateBlock.java b/src/main/java/dev/dubhe/anvilcraft/block/container/storage/CrateBlock.java index d055921a7c..1f33f06402 100644 --- a/src/main/java/dev/dubhe/anvilcraft/block/container/storage/CrateBlock.java +++ b/src/main/java/dev/dubhe/anvilcraft/block/container/storage/CrateBlock.java @@ -19,6 +19,8 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.player.Player; @@ -71,7 +73,7 @@ public static List getNearbyCrates(Level level, BlockPos sourc public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, Player player) { BlockEntity blockEntity = level.getBlockEntity(pos); if (blockEntity instanceof CrateBlockEntity be) { - be.playerWillDestroy(level, pos, state, player); + be.dropContents(level, pos); } return super.playerWillDestroy(level, pos, state, player); @@ -97,6 +99,7 @@ protected ItemInteractionResult useItemOn( if (player instanceof ServerPlayer) { return ItemInteractionResult.sidedSuccess(false); } else if (level.isClientSide()) { + level.playSound(player, pos, SoundEvents.BARREL_OPEN, SoundSource.BLOCKS, 1.0F, 1.0F); DistExecutor.run(Dist.CLIENT, () -> () -> StorageScreen.openScreen(entity.getBlockPos())); return ItemInteractionResult.sidedSuccess(true); } diff --git a/src/main/java/dev/dubhe/anvilcraft/block/container/storage/HyperdimensionStorageStationBlock.java b/src/main/java/dev/dubhe/anvilcraft/block/container/storage/HyperdimensionStorageStationBlock.java index eb5713003c..f330fd993e 100644 --- a/src/main/java/dev/dubhe/anvilcraft/block/container/storage/HyperdimensionStorageStationBlock.java +++ b/src/main/java/dev/dubhe/anvilcraft/block/container/storage/HyperdimensionStorageStationBlock.java @@ -1,5 +1,6 @@ package dev.dubhe.anvilcraft.block.container.storage; +import dev.anvilcraft.lib.v2.registrum.providers.loot.RegistrumBlockLootTables; import dev.anvilcraft.lib.v2.util.DistExecutor; import dev.anvilcraft.lib.v2.util.ShapeUtil; import dev.dubhe.anvilcraft.api.hammer.IHammerRemovable; @@ -9,12 +10,18 @@ import dev.dubhe.anvilcraft.block.state.Cube3x3PartHalf; import dev.dubhe.anvilcraft.client.gui.screen.StorageScreen; import dev.dubhe.anvilcraft.init.block.ModBlockEntities; +import dev.dubhe.anvilcraft.init.item.ModComponents; +import net.minecraft.advancements.critereon.StatePropertiesPredicate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; 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.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -23,8 +30,17 @@ import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.EnumProperty; import net.minecraft.world.level.block.state.properties.Property; +import net.minecraft.world.level.storage.loot.LootParams; +import net.minecraft.world.level.storage.loot.LootPool; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.entries.LootItem; +import net.minecraft.world.level.storage.loot.functions.CopyComponentsFunction; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.level.storage.loot.predicates.LootItemBlockStatePropertyCondition; +import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; @@ -35,6 +51,22 @@ public class HyperdimensionStorageStationBlock implements MultiPartBlockEntity, IHammerRemovable { public static final EnumProperty HALF = EnumProperty.create("half", Cube3x3PartHalf.class); + public static void loot(RegistrumBlockLootTables tables, HyperdimensionStorageStationBlock block) { + for (Cube3x3PartHalf part : block.getParts()) { + if (part.getOffset().distSqr(block.getMainPartOffset()) != 0) continue; + tables.add(block, LootTable.lootTable() + .withPool(tables.applyExplosionCondition(block, LootPool.lootPool() + .setRolls(ConstantValue.exactly(1.0f))) + .add(LootItem.lootTableItem(block) + .when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(block) + .setProperties(StatePropertiesPredicate.Builder.properties() + .hasProperty(block.getPart(), part))) + .apply(CopyComponentsFunction.copyComponents(CopyComponentsFunction.Source.BLOCK_ENTITY) + .include(ModComponents.STORAGE))))); + break; + } + } + public HyperdimensionStorageStationBlock(Properties properties) { super(properties); } @@ -76,9 +108,19 @@ public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { @Override public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, Player player) { - BlockEntity blockEntity = level.getBlockEntity(this.getMainPartPos(pos, state)); - if (blockEntity instanceof HyperdimensionStorageStationBlockEntity be) { - be.playerWillDestroy(level, pos, state, player); + if (player.isCreative() && level instanceof ServerLevel serverLevel) { + BlockPos mainPos = this.getMainPartPos(pos, state); + BlockState mainState = level.getBlockState(mainPos); + BlockEntity blockEntity = level.getBlockEntity(mainPos); + if (mainState.is(this) && blockEntity instanceof HyperdimensionStorageStationBlockEntity) { + LootParams.Builder builder = new LootParams.Builder(serverLevel) + .withParameter(LootContextParams.ORIGIN, Vec3.atCenterOf(mainPos)) + .withParameter(LootContextParams.TOOL, player.getMainHandItem()) + .withOptionalParameter(LootContextParams.BLOCK_ENTITY, blockEntity); + for (ItemStack stack : mainState.getDrops(builder)) { + Block.popResource(serverLevel, mainPos, stack); + } + } } return super.playerWillDestroy(level, pos, state, player); @@ -99,6 +141,7 @@ public InteractionResult use( if (player instanceof ServerPlayer) { return InteractionResult.sidedSuccess(false); } else if (level.isClientSide()) { + level.playSound(player, pos, SoundEvents.ENDER_CHEST_OPEN, SoundSource.BLOCKS, 1.0F, 1.0F); DistExecutor.run(Dist.CLIENT, () -> () -> StorageScreen.openScreen(entity.getBlockPos())); return InteractionResult.SUCCESS; } diff --git a/src/main/java/dev/dubhe/anvilcraft/block/container/storage/LargeCrateBlock.java b/src/main/java/dev/dubhe/anvilcraft/block/container/storage/LargeCrateBlock.java index 659478de1e..152fe8cb4d 100644 --- a/src/main/java/dev/dubhe/anvilcraft/block/container/storage/LargeCrateBlock.java +++ b/src/main/java/dev/dubhe/anvilcraft/block/container/storage/LargeCrateBlock.java @@ -12,6 +12,8 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; @@ -78,7 +80,7 @@ public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, Player player) { BlockEntity blockEntity = level.getBlockEntity(this.getMainPartPos(pos, state)); if (blockEntity instanceof LargeCrateBlockEntity be) { - be.playerWillDestroy(level, pos, state, player); + be.dropContents(level, this.getMainPartPos(pos, state)); } return super.playerWillDestroy(level, pos, state, player); @@ -99,6 +101,7 @@ public InteractionResult use( if (player instanceof ServerPlayer) { return InteractionResult.sidedSuccess(false); } else if (level.isClientSide()) { + level.playSound(player, pos, SoundEvents.BARREL_OPEN, SoundSource.BLOCKS, 1.0F, 1.0F); DistExecutor.run(Dist.CLIENT, () -> () -> StorageScreen.openScreen(entity.getBlockPos())); return InteractionResult.SUCCESS; } diff --git a/src/main/java/dev/dubhe/anvilcraft/block/container/storage/ShulkerContainerBlock.java b/src/main/java/dev/dubhe/anvilcraft/block/container/storage/ShulkerContainerBlock.java index 6ab4cdb3d8..db8cc5fc19 100644 --- a/src/main/java/dev/dubhe/anvilcraft/block/container/storage/ShulkerContainerBlock.java +++ b/src/main/java/dev/dubhe/anvilcraft/block/container/storage/ShulkerContainerBlock.java @@ -2,6 +2,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import dev.anvilcraft.lib.v2.registrum.providers.loot.RegistrumBlockLootTables; import dev.anvilcraft.lib.v2.util.DistExecutor; import dev.anvilcraft.lib.v2.util.ShapeUtil; import dev.dubhe.anvilcraft.api.hammer.IHammerRemovable; @@ -11,11 +12,15 @@ import dev.dubhe.anvilcraft.block.state.OpenedCube3x3PartHalf; import dev.dubhe.anvilcraft.client.gui.screen.StorageScreen; import dev.dubhe.anvilcraft.init.block.ModBlockEntities; +import dev.dubhe.anvilcraft.init.item.ModComponents; +import net.minecraft.advancements.critereon.StatePropertiesPredicate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Vec3i; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.ItemInteractionResult; @@ -32,8 +37,17 @@ import net.minecraft.world.level.block.state.properties.EnumProperty; import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.level.pathfinder.PathComputationType; +import net.minecraft.world.level.storage.loot.LootParams; +import net.minecraft.world.level.storage.loot.LootPool; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.entries.LootItem; +import net.minecraft.world.level.storage.loot.functions.CopyComponentsFunction; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.level.storage.loot.predicates.LootItemBlockStatePropertyCondition; +import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; @@ -45,6 +59,22 @@ public class ShulkerContainerBlock public static final EnumProperty HALF = EnumProperty.create("half", OpenedCube3x3PartHalf.class); public static final BooleanProperty OPENED = BooleanProperty.create("opened"); + public static void loot(RegistrumBlockLootTables tables, ShulkerContainerBlock block) { + for (OpenedCube3x3PartHalf part : block.getParts()) { + if (!part.isMain()) continue; + tables.add(block, LootTable.lootTable() + .withPool(tables.applyExplosionCondition(block, LootPool.lootPool() + .setRolls(ConstantValue.exactly(1.0f))) + .add(LootItem.lootTableItem(block) + .when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(block) + .setProperties(StatePropertiesPredicate.Builder.properties() + .hasProperty(block.getPart(), part))) + .apply(CopyComponentsFunction.copyComponents(CopyComponentsFunction.Source.BLOCK_ENTITY) + .include(ModComponents.STORAGE))))); + break; + } + } + private static final ImmutableMap> UPDATE_OFFSET = ImmutableMap.of( Direction.DOWN, ImmutableList.of( @@ -219,9 +249,25 @@ public void removePartsAndUpdate(Level level, BlockPos pos) { @Override public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, Player player) { - BlockEntity blockEntity = level.getBlockEntity(this.getMainPartPos(pos, state)); - if (blockEntity instanceof ShulkerContainerBlockEntity be) { - be.playerWillDestroy(level, pos, state, player); + if (level instanceof ServerLevel serverLevel) { + BlockPos mainPos = this.getMainPartPos(pos, state); + BlockState mainState = level.getBlockState(mainPos); + BlockEntity blockEntity = level.getBlockEntity(mainPos); + if (mainState.is(this) && blockEntity instanceof ShulkerContainerBlockEntity storage) { + boolean empty = storage.getTotalCount() == 0; + if (empty) { + storage.clearId(); + } + if (player.isCreative() && !empty) { + LootParams.Builder builder = new LootParams.Builder(serverLevel) + .withParameter(LootContextParams.ORIGIN, Vec3.atCenterOf(mainPos)) + .withParameter(LootContextParams.TOOL, player.getMainHandItem()) + .withOptionalParameter(LootContextParams.BLOCK_ENTITY, blockEntity); + for (ItemStack stack : mainState.getDrops(builder)) { + Block.popResource(serverLevel, mainPos, stack); + } + } + } } return super.playerWillDestroy(level, pos, state, player); @@ -243,6 +289,7 @@ protected ItemInteractionResult useItemOn( if (player instanceof ServerPlayer) { return ItemInteractionResult.sidedSuccess(false); } else if (level.isClientSide()) { + level.playSound(player, pos, SoundEvents.SHULKER_BOX_OPEN, SoundSource.BLOCKS, 1.0F, 1.0F); DistExecutor.run(Dist.CLIENT, () -> () -> StorageScreen.openScreen(entity.getBlockPos())); return ItemInteractionResult.sidedSuccess(true); } diff --git a/src/main/java/dev/dubhe/anvilcraft/block/entity/MassEnergyInverterBlockEntity.java b/src/main/java/dev/dubhe/anvilcraft/block/entity/MassEnergyInverterBlockEntity.java new file mode 100644 index 0000000000..1e980da4ac --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/block/entity/MassEnergyInverterBlockEntity.java @@ -0,0 +1,63 @@ +package dev.dubhe.anvilcraft.block.entity; + +import dev.dubhe.anvilcraft.api.power.IPowerConsumer; +import dev.dubhe.anvilcraft.api.power.PowerGrid; +import dev.dubhe.anvilcraft.init.block.ModBlockEntities; +import lombok.Getter; +import lombok.Setter; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; + +public class MassEnergyInverterBlockEntity extends BlockEntity implements IPowerConsumer { + public static final int POWER_CONSUMPTION = 1024; + public static final long MASS_PER_TICK = 5; + + @Getter + @Setter + private @Nullable PowerGrid grid; + + public MassEnergyInverterBlockEntity(BlockEntityType type, BlockPos pos, BlockState blockState) { + super(type, pos, blockState); + } + + public MassEnergyInverterBlockEntity(BlockPos pos, BlockState blockState) { + this(ModBlockEntities.MASS_ENERGY_INVERTER.get(), pos, blockState); + } + + public static MassEnergyInverterBlockEntity createBlockEntity( + BlockEntityType type, BlockPos pos, BlockState state + ) { + return new MassEnergyInverterBlockEntity(type, pos, state); + } + + public static void tick(Level level, BlockPos pos, BlockState state, MassEnergyInverterBlockEntity blockEntity) { + if (level.isClientSide) return; + if (!blockEntity.isGridWorking()) return; + for (Direction direction : Direction.Plane.HORIZONTAL) { + BlockPos neighborPos = pos.relative(direction); + if (level.getBlockEntity(neighborPos) instanceof SpaceOvercompressorBlockEntity compressor) { + compressor.injectMass(MASS_PER_TICK); + } + } + } + + @Override + public int getInputPower() { + return POWER_CONSUMPTION; + } + + @Override + public @Nullable Level getCurrentLevel() { + return this.level; + } + + @Override + public BlockPos getPos() { + return this.getBlockPos(); + } +} \ No newline at end of file diff --git a/src/main/java/dev/dubhe/anvilcraft/block/entity/storage/ShulkerContainerBlockEntity.java b/src/main/java/dev/dubhe/anvilcraft/block/entity/storage/ShulkerContainerBlockEntity.java index b5514ebdee..3f5b238049 100644 --- a/src/main/java/dev/dubhe/anvilcraft/block/entity/storage/ShulkerContainerBlockEntity.java +++ b/src/main/java/dev/dubhe/anvilcraft/block/entity/storage/ShulkerContainerBlockEntity.java @@ -63,15 +63,14 @@ public void recheckOpeners() { if (this.remove || this.level == null) { return; } - Set nearbyOpeners = new HashSet<>(); - for (Player player : this.level.players()) { - if (!player.hasContainerOpen()) continue; - double interactionRange = player.blockInteractionRange(); - if (player.distanceToSqr(this.worldPosition.getCenter()) < interactionRange * interactionRange) { - nearbyOpeners.add(player.getUUID()); + this.openers.removeIf(uuid -> { + Player player = this.level.getPlayerByUUID(uuid); + if (player == null || !player.isAlive()) { + return true; } - } - this.openers.retainAll(nearbyOpeners); + double interactionRange = player.blockInteractionRange(); + return player.distanceToSqr(this.worldPosition.getCenter()) >= interactionRange * interactionRange; + }); this.openersCounter.recheckOpeners(this.level, this.worldPosition, this.getBlockState()); if (this.openersCounter.getOpenerCount() == 0) { ShulkerContainerBlockEntity.setOpened(this.level, this.worldPosition, this.getBlockState(), false); diff --git a/src/main/java/dev/dubhe/anvilcraft/block/entity/storage/StorageBlockEntity.java b/src/main/java/dev/dubhe/anvilcraft/block/entity/storage/StorageBlockEntity.java index aef8967a0f..2ab78046ed 100644 --- a/src/main/java/dev/dubhe/anvilcraft/block/entity/storage/StorageBlockEntity.java +++ b/src/main/java/dev/dubhe/anvilcraft/block/entity/storage/StorageBlockEntity.java @@ -1,8 +1,10 @@ package dev.dubhe.anvilcraft.block.entity.storage; +import dev.dubhe.anvilcraft.api.itemhandler.unlimited.UnlimitedItemStacksResourceHandler; import dev.dubhe.anvilcraft.init.item.ModComponents; import dev.dubhe.anvilcraft.item.property.component.StorageRef; import dev.dubhe.anvilcraft.saved.storage.StorageType; +import dev.dubhe.anvilcraft.saved.storage.Storages; import lombok.Getter; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; @@ -11,8 +13,6 @@ import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; -import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -45,6 +45,11 @@ public void setId(UUID id) { } } + public void clearId() { + this.id = null; + this.setChanged(); + } + @Override protected void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) { if (this.id != null) { @@ -89,13 +94,35 @@ protected void collectImplicitComponents(DataComponentMap.Builder builder) { builder.set(ModComponents.STORAGE, new StorageRef(this.storageType, this.id)); } - public void playerWillDestroy(Level level, BlockPos pos, BlockState state, Player player) { - if (!level.isClientSide() && player.isCreative() && this.getId() != null) { - ItemStack itemStack = new ItemStack(state.getBlock()); - itemStack.applyComponents(this.collectComponents()); - ItemEntity entity = new ItemEntity(level, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, itemStack); - entity.setDefaultPickUpDelay(); - level.addFreshEntity(entity); + public long getTotalCount() { + if (this.id == null) { + return 0; + } + return Storages.get().get(this.id) + .map(storage -> { + UnlimitedItemStacksResourceHandler items = storage.getItems(); + long total = 0; + for (int i = 0; i < items.size(); i++) { + total += items.getAmountAsLong(i); + } + return total; + }) + .orElse(0L); + } + + public void dropContents(Level level, BlockPos pos) { + if (this.id != null) { + Storages.get().get(this.id).ifPresent(storage -> { + UnlimitedItemStacksResourceHandler items = storage.getItems(); + for (int i = 0; i < items.size(); i++) { + ItemStack stack = items.getUnlimitedStackInSlot(i).toStack(); + if (stack.isEmpty()) continue; + while (!stack.isEmpty()) { + Block.popResource(level, pos, stack.split(Math.min(64, stack.getCount()))); + } + } + Storages.get().remove(this.id); + }); } } } diff --git a/src/main/java/dev/dubhe/anvilcraft/block/item/ShulkerContainerBlockItem.java b/src/main/java/dev/dubhe/anvilcraft/block/item/ShulkerContainerBlockItem.java index 2d7004cff7..d6ab5e0392 100644 --- a/src/main/java/dev/dubhe/anvilcraft/block/item/ShulkerContainerBlockItem.java +++ b/src/main/java/dev/dubhe/anvilcraft/block/item/ShulkerContainerBlockItem.java @@ -1,14 +1,24 @@ package dev.dubhe.anvilcraft.block.item; +import dev.dubhe.anvilcraft.api.tooltip.ItemTooltipManager; import dev.dubhe.anvilcraft.block.container.storage.ShulkerContainerBlock; import dev.dubhe.anvilcraft.block.state.OpenedCube3x3PartHalf; +import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.properties.BooleanProperty; +import java.util.Optional; + public class ShulkerContainerBlockItem extends FlexibleMultiPartBlockItem { public ShulkerContainerBlockItem(ShulkerContainerBlock block, Properties properties) { super(block, properties); } + @Override + public Optional getTooltipImage(ItemStack stack) { + return ItemTooltipManager.getStorageTooltip(stack); + } + @Override public boolean canFitInsideContainerItems() { return false; diff --git a/src/main/java/dev/dubhe/anvilcraft/client/gui/screen/CategorySettingsScreen.java b/src/main/java/dev/dubhe/anvilcraft/client/gui/screen/CategorySettingsScreen.java index 1fbbd0f509..5684b56d98 100644 --- a/src/main/java/dev/dubhe/anvilcraft/client/gui/screen/CategorySettingsScreen.java +++ b/src/main/java/dev/dubhe/anvilcraft/client/gui/screen/CategorySettingsScreen.java @@ -381,12 +381,13 @@ private void renderInventorySlot(GuiGraphics graphics, Inventory inv, int slot, if (!stack.isEmpty()) { graphics.renderItem(stack, x, y); graphics.renderItemDecorations(this.font, stack, x, y); - if (MathUtil.isInRange(mouseX, mouseY, x - 2, y - 2, x + 17, y + 17)) { - graphics.renderTooltip(this.font, stack, mouseX, mouseY); - } } this.renderInventorySlotHighlightFront(graphics, slot, x, y, mouseX, mouseY); + + if (!stack.isEmpty() && MathUtil.isInRange(mouseX, mouseY, x - 2, y - 2, x + 17, y + 17)) { + graphics.renderTooltip(this.font, stack, mouseX, mouseY); + } } private void renderInventorySlotHighlightBack(GuiGraphics graphics, int slot, int x, int y, int mouseX, int mouseY) { diff --git a/src/main/java/dev/dubhe/anvilcraft/client/gui/screen/StorageScreen.java b/src/main/java/dev/dubhe/anvilcraft/client/gui/screen/StorageScreen.java index 2da425f63c..8690f2e885 100644 --- a/src/main/java/dev/dubhe/anvilcraft/client/gui/screen/StorageScreen.java +++ b/src/main/java/dev/dubhe/anvilcraft/client/gui/screen/StorageScreen.java @@ -46,6 +46,7 @@ import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; import net.neoforged.neoforge.client.ItemDecoratorHandler; import java.util.ArrayList; @@ -54,6 +55,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.concurrent.CompletableFuture; import javax.annotation.Nullable; @@ -125,10 +127,13 @@ public class StorageScreen extends Screen { private boolean remappedOrder; private int nextLogicalSlot; private final IntSet quickCraftSlots = new IntOpenHashSet(); + private final IntSet quickCraftStorageSlots = new IntOpenHashSet(); private boolean quickCrafting; private int quickCraftingButton; private int lastClickedInventorySlot = -1; - private int pickupAllSlot = -1; + private boolean quickMoveDragging; + private final IntSet quickMoveSlots = new IntOpenHashSet(); + private final IntSet pendingQuickMoveSlots = new IntOpenHashSet(); private int left; private int top; private int titleLabelX; @@ -320,6 +325,8 @@ protected void init() { @Override public void tick() { super.tick(); + this.carried = this.player.inventoryMenu.getCarried(); + this.flushQuickMoves(); if (this.metadataCooldown > 0) { this.metadataCooldown--; } else { @@ -394,6 +401,11 @@ private void renderStorageContents(GuiGraphics graphics, int mouseX, int mouseY) int slot = this.displayOrder.getInt(orderIndex); UnlimitedItemStack stack = this.getDisplayedStack(slot); + + // 高亮先画在底层,物品图标盖过高亮,tooltip最后绘制 + if (hovered) { + AbstractContainerScreen.renderSlotHighlight(graphics, x, y, 0); + } if (!stack.isEmpty()) { ItemStack itemStack = stack.toStack(); graphics.renderItem(itemStack, x, y); @@ -405,14 +417,17 @@ private void renderStorageContents(GuiGraphics graphics, int mouseX, int mouseY) x, y ); - if (hovered && this.carried.isEmpty()) { - graphics.renderTooltip(this.font, itemStack, mouseX, mouseY); - } } - - // 悬停高亮画在物品之上 - if (hovered) { - AbstractContainerScreen.renderSlotHighlight(graphics, x, y, 0); + if (hovered && this.carried.isEmpty() && !stack.isEmpty()) { + List tooltipLines = new ArrayList<>(stack.toStack().getTooltipLines( + Item.TooltipContext.of(this.minecraft.level), + this.player, + this.minecraft.options.advancedItemTooltips + ? TooltipFlag.Default.ADVANCED + : TooltipFlag.Default.NORMAL + )); + tooltipLines.add(Component.translatable("screen.anvilcraft.storage.count", stack.getCount())); + graphics.renderTooltip(this.font, tooltipLines, Optional.empty(), mouseX, mouseY); } } this.renderStorageSlider(graphics); @@ -467,17 +482,16 @@ private void renderInventorySlot(GuiGraphics graphics, Inventory inv, int slot, stack = this.getQuickCraftPreviewStack(slot); graphics.fill(x, y, x + 16, y + 16, -2130706433); } + // 高亮先画在底层,物品图标盖过高亮,tooltip最后绘制 + if (hovered) { + AbstractContainerScreen.renderSlotHighlight(graphics, x, y, 0); + } if (!stack.isEmpty()) { graphics.renderItem(stack, x, y); graphics.renderItemDecorations(this.font, stack, x, y); - if (hovered && this.carried.isEmpty()) { - graphics.renderTooltip(this.font, stack, mouseX, mouseY); - } } - - // 悬停高亮画在物品之上 - if (hovered) { - AbstractContainerScreen.renderSlotHighlight(graphics, x, y, 0); + if (hovered && this.carried.isEmpty() && !stack.isEmpty()) { + graphics.renderTooltip(this.font, stack, mouseX, mouseY); } } @@ -559,8 +573,12 @@ private void renderCarriedItem(GuiGraphics graphics, int mouseX, int mouseY) { } renderedCarried = this.carried.copyWithCount(remaining); } + // 鼠标物品输出在所有槽位内容之上(高亮/槽位物品/数量文字),仍低于tooltip + graphics.pose().pushPose(); + graphics.pose().translate(0.0F, 0.0F, 100.0F); graphics.renderItem(renderedCarried, mouseX - 8, mouseY - 8); graphics.renderItemDecorations(this.font, renderedCarried, mouseX - 8, mouseY - 8); + graphics.pose().popPose(); } private ItemStack getQuickCraftPreviewStack(int inventorySlot) { @@ -576,6 +594,9 @@ private ItemStack getQuickCraftPreviewStack(int inventorySlot) { } private int getQuickCraftRemaining() { + if (this.quickCraftingButton == 2) { + return this.carried.getCount(); + } int remaining = this.carried.getCount(); for (int screenSlot : this.quickCraftSlots) { Slot slot = this.player.inventoryMenu.getSlot(screenSlot); @@ -624,24 +645,60 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { } int slot = this.getInventorySlot(mouseX, mouseY); - if (slot == -1 || this.minecraft.gameMode == null) { + if (slot == -1) { + if (this.minecraft.gameMode != null && !this.carried.isEmpty()) { + this.player.inventoryMenu.setCarried(this.carried); + this.minecraft.gameMode.handleInventoryMouseClick( + this.player.inventoryMenu.containerId, + -999, + button, + ClickType.PICKUP, + this.player + ); + this.carried = this.player.inventoryMenu.getCarried(); + return true; + } + return false; + } + if (this.minecraft.gameMode == null) { return false; } this.lastClickedInventorySlot = slot; + if (Screen.hasAltDown()) { + this.moveSameToStorage(slot); + return true; + } + if (Screen.hasShiftDown()) { - this.interactWithStorage(slot, button, StorageInput.QUICK_MOVE_TO_STORAGE); + if (this.carried.isEmpty()) { + this.quickMoveDragging = true; + StorageClientStub.beginUndoGroup(this.sourcePos); + this.queueQuickMove(slot); + } else { + this.interactWithStorage(slot, button, StorageInput.QUICK_MOVE_TO_STORAGE); + } return true; } - if (!this.carried.isEmpty()) { - if (button == 0 && this.isDoubleClick(slot) && slot == lastClickedInventorySlot) { - this.pickupAllSlot = this.getScreenSlot(slot); - return true; + this.carried = this.player.inventoryMenu.getCarried(); + if (button == 0 && this.isDoubleClick(slot, button) && slot == lastClickedInventorySlot) { + if (this.carried.isEmpty()) { + this.player.inventoryMenu.setCarried(this.carried); + this.minecraft.gameMode.handleInventoryMouseClick( + this.player.inventoryMenu.containerId, + this.getScreenSlot(slot), + button, + ClickType.PICKUP, + this.player + ); + this.carried = this.player.inventoryMenu.getCarried(); } - this.quickCrafting = true; - this.quickCraftingButton = button; - this.quickCraftSlots.clear(); + this.doubleclick = true; + return true; + } + if (!this.carried.isEmpty()) { + this.startQuickCraft(button); return true; } @@ -660,10 +717,13 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { if ( storageSlot != null && this.player.hasInfiniteMaterials() - && this.carried.isEmpty() && this.minecraft.options.keyPickItem.matchesMouse(2) ) { - this.interactWithStorage(storageSlot, 0, StorageInput.CLONE); + if (this.carried.isEmpty()) { + this.interactWithStorage(storageSlot, 0, StorageInput.CLONE); + } else { + this.startQuickCraft(button); + } return true; } @@ -676,14 +736,18 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { return false; } - this.minecraft.gameMode.handleInventoryMouseClick( - this.player.inventoryMenu.containerId, - slot, - 0, - ClickType.CLONE, - this.player - ); - this.carried = this.player.inventoryMenu.getCarried(); + if (this.carried.isEmpty()) { + this.minecraft.gameMode.handleInventoryMouseClick( + this.player.inventoryMenu.containerId, + slot, + 0, + ClickType.CLONE, + this.player + ); + this.carried = this.player.inventoryMenu.getCarried(); + } else { + this.startQuickCraft(button); + } return true; } @@ -692,32 +756,48 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { private long lastClickTime; private int lastClickSlot = -1; + private int lastClickButton = -1; + private boolean doubleclick; - private boolean isDoubleClick(int slot) { - boolean sameSlot = slot == this.lastClickSlot; + private boolean isDoubleClick(int slot, int button) { + final boolean quick = slot == this.lastClickSlot + && System.currentTimeMillis() - this.lastClickTime < 250L + && button == this.lastClickButton; this.lastClickSlot = slot; - if (sameSlot) { - long now = System.currentTimeMillis(); - boolean quick = now - this.lastClickTime < 250L; - this.lastClickTime = now; - return quick; - } this.lastClickTime = System.currentTimeMillis(); - return false; + this.lastClickButton = button; + return quick; } @Override public boolean mouseDragged(double mouseX, double mouseY, int button, double dragX, double dragY) { + if (this.quickMoveDragging) { + if (button == 0 && Screen.hasShiftDown()) { + int inventorySlot = this.getInventorySlot(mouseX, mouseY); + if (inventorySlot != -1) { + this.queueQuickMove(inventorySlot); + } + } + return true; + } if (!this.quickCrafting || button != this.quickCraftingButton || this.carried.isEmpty()) { return super.mouseDragged(mouseX, mouseY, button, dragX, dragY); } + Integer storageSlot = this.getStorageSlot(mouseX, mouseY); + if (storageSlot != null) { + if (button == 2 && this.player.hasInfiniteMaterials()) { + this.quickCraftStorageSlots.add(storageSlot); + } + return true; + } + int inventorySlot = this.getInventorySlot(mouseX, mouseY); if (inventorySlot != -1) { int screenSlot = this.getScreenSlot(inventorySlot); Slot slot = this.player.inventoryMenu.getSlot(screenSlot); if ( - this.carried.getCount() > this.quickCraftSlots.size() + (this.carried.getCount() > this.quickCraftSlots.size() || button == 2) && AbstractContainerMenu.canItemQuickReplace(slot, this.carried, true) && slot.mayPlace(this.carried) && this.player.inventoryMenu.canDragTo(slot) @@ -731,19 +811,30 @@ public boolean mouseDragged(double mouseX, double mouseY, int button, double dra @Override public boolean mouseReleased(double mouseX, double mouseY, int button) { super.mouseReleased(mouseX, mouseY, button); - if (this.pickupAllSlot != -1) { + if (this.quickMoveDragging) { + this.quickMoveDragging = false; + this.quickMoveSlots.clear(); + this.flushQuickMoves(); + StorageClientStub.endUndoGroup(this.sourcePos); + return true; + } + if (this.doubleclick) { + this.doubleclick = false; + this.lastClickTime = 0L; if (button == 0 && this.minecraft.gameMode != null) { - this.player.inventoryMenu.setCarried(this.carried); - this.minecraft.gameMode.handleInventoryMouseClick( - this.player.inventoryMenu.containerId, - this.pickupAllSlot, - 0, - ClickType.PICKUP_ALL, - this.player - ); - this.carried = this.player.inventoryMenu.getCarried(); + int inventorySlot = this.getInventorySlot(mouseX, mouseY); + if (inventorySlot == this.lastClickedInventorySlot) { + this.player.inventoryMenu.setCarried(this.carried); + this.minecraft.gameMode.handleInventoryMouseClick( + this.player.inventoryMenu.containerId, + this.getScreenSlot(inventorySlot), + 0, + ClickType.PICKUP_ALL, + this.player + ); + this.carried = this.player.inventoryMenu.getCarried(); + } } - this.pickupAllSlot = -1; return true; } if (!this.quickCrafting) { @@ -752,7 +843,7 @@ public boolean mouseReleased(double mouseX, double mouseY, int button) { if (button == this.quickCraftingButton && this.minecraft.gameMode != null) { this.player.inventoryMenu.setCarried(this.carried); - if (this.quickCraftSlots.isEmpty()) { + if (this.quickCraftSlots.isEmpty() && this.quickCraftStorageSlots.isEmpty()) { int inventorySlot = this.getInventorySlot(mouseX, mouseY); if (inventorySlot != -1) { this.minecraft.gameMode.handleInventoryMouseClick( @@ -764,16 +855,115 @@ public boolean mouseReleased(double mouseX, double mouseY, int button) { ); } } else { - this.quickCraftToSlots(button); + if (!this.quickCraftStorageSlots.isEmpty()) { + this.clonePutToStorage(); + } + if (!this.quickCraftSlots.isEmpty()) { + this.quickCraftToSlots(button); + } } this.carried = this.player.inventoryMenu.getCarried(); + if (this.carried.isEmpty()) { + this.lastClickTime = 0L; + } } this.quickCrafting = false; this.quickCraftSlots.clear(); + this.quickCraftStorageSlots.clear(); return true; } + private void startQuickCraft(int button) { + this.quickCrafting = true; + this.quickCraftingButton = button; + this.quickCraftSlots.clear(); + this.quickCraftStorageSlots.clear(); + } + + private void clonePutToStorage() { + if (this.quickCraftStorageSlots.isEmpty()) { + return; + } + IntList slots = new IntArrayList(this.quickCraftStorageSlots); + StorageClientStub.clonePut(this.sourcePos, slots).whenCompleteAsync( + (changed, error) -> { + if (error != null || !changed) { + return; + } + if (this.preservingOrder) { + this.interactionSyncPending = true; + this.syncPreservedOrder(); + return; + } + this.reorder(false); + }, + this.screenExecutor + ); + } + + private void queueQuickMove(int slot) { + if (this.quickMoveSlots.add(slot)) { + this.pendingQuickMoveSlots.add(slot); + } + } + + private void flushQuickMoves() { + if (this.pendingQuickMoveSlots.isEmpty()) { + return; + } + IntList slots = new IntArrayList(this.pendingQuickMoveSlots); + this.pendingQuickMoveSlots.clear(); + StorageClientStub.quickMoveToStorage(this.sourcePos, slots).whenCompleteAsync( + (changed, error) -> { + if (error != null || !changed) { + return; + } + if (this.preservingOrder) { + this.interactionSyncPending = true; + this.syncPreservedOrder(); + return; + } + this.reorder(false); + }, + this.screenExecutor + ); + } + + private void moveSameToStorage(int slot) { + StorageClientStub.moveSameToStorage(this.sourcePos, slot).whenCompleteAsync( + (changed, error) -> { + if (error != null || !changed) { + return; + } + if (this.preservingOrder) { + this.interactionSyncPending = true; + this.syncPreservedOrder(); + return; + } + this.reorder(false); + }, + this.screenExecutor + ); + } + + private void undoLastMove() { + StorageClientStub.undo(this.sourcePos).whenCompleteAsync( + (result, error) -> { + if (error != null || !result.changed()) { + return; + } + if (this.preservingOrder) { + this.interactionSyncPending = true; + this.syncPreservedOrder(); + return; + } + this.reorder(false); + }, + this.screenExecutor + ); + } + private void quickCraftToSlots(int button) { if (this.minecraft.gameMode == null) { return; @@ -880,6 +1070,10 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { } InputConstants.Key key = InputConstants.getKey(keyCode, scanCode); + if (Screen.hasControlDown() && keyCode == InputConstants.KEY_Z) { + this.undoLastMove(); + return true; + } if (super.keyPressed(keyCode, scanCode, modifiers)) { return true; } else if (this.minecraft.options.keyInventory.isActiveAndMatches(key)) { @@ -1568,7 +1762,7 @@ private static void renderItemDecorations( // 抬高 z 使耐久条与数量数字绘制在物品图标之上 graphics.pose().pushPose(); - graphics.pose().translate(0, 0, 300); + graphics.pose().translate(0, 0, 200); // 耐久条 if (stack.isBarVisible()) { diff --git a/src/main/java/dev/dubhe/anvilcraft/client/gui/tooltip/ClientStorageTooltip.java b/src/main/java/dev/dubhe/anvilcraft/client/gui/tooltip/ClientStorageTooltip.java new file mode 100644 index 0000000000..522f256ec4 --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/client/gui/tooltip/ClientStorageTooltip.java @@ -0,0 +1,122 @@ +package dev.dubhe.anvilcraft.client.gui.tooltip; + +import dev.dubhe.anvilcraft.inventory.tooltip.StorageTooltip; +import net.minecraft.ChatFormatting; +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.MultiBufferSource; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import org.joml.Matrix4f; + +import java.util.List; + +public class ClientStorageTooltip implements ClientTooltipComponent { + private static final int LINE_HEIGHT = 10; + private static final int ICON_SIZE = 16; + private static final int ICON_GAP = 2; + private static final int MAX_VISIBLE_TYPES = 9; + + private final int usedTypes; + private final int typeLimit; + private final List types; + + public ClientStorageTooltip(StorageTooltip tooltip) { + this.usedTypes = tooltip.usedTypes(); + this.typeLimit = tooltip.typeLimit(); + this.types = tooltip.types(); + } + + private boolean hasMore() { + return this.usedTypes > this.types.size(); + } + + @Override + public int getHeight() { + int height = ClientStorageTooltip.LINE_HEIGHT * 2; + if (!this.types.isEmpty()) { + height += ClientStorageTooltip.ICON_SIZE; + } + return height; + } + + @Override + public int getWidth(Font font) { + int width = Math.max( + font.width(Component.translatable("tooltip.anvilcraft.storage.types")), + font.width(Component.translatable("tooltip.anvilcraft.storage.types.value", this.usedTypes, this.typeLimit)) + ); + if (!this.types.isEmpty()) { + int visible = Math.min(this.types.size(), ClientStorageTooltip.MAX_VISIBLE_TYPES); + int iconsWidth = visible * (ClientStorageTooltip.ICON_SIZE + ClientStorageTooltip.ICON_GAP) + - ClientStorageTooltip.ICON_GAP; + if (this.hasMore()) { + iconsWidth += ClientStorageTooltip.ICON_GAP + font.width(Component.literal("...")); + } + width = Math.max(width, iconsWidth); + } + return width; + } + + @Override + public void renderText( + Font font, + int mouseX, + int mouseY, + Matrix4f matrix, + MultiBufferSource.BufferSource bufferSource + ) { + font.drawInBatch( + Component.translatable("tooltip.anvilcraft.storage.types").withStyle(ChatFormatting.BLUE), + mouseX, + mouseY, + -1, + true, + matrix, + bufferSource, + Font.DisplayMode.NORMAL, + 0, + 15728880 + ); + font.drawInBatch( + Component.translatable("tooltip.anvilcraft.storage.types.value", this.usedTypes, this.typeLimit) + .withStyle(ChatFormatting.GRAY), + mouseX, + mouseY + ClientStorageTooltip.LINE_HEIGHT, + -1, + true, + matrix, + bufferSource, + Font.DisplayMode.NORMAL, + 0, + 15728880 + ); + } + + @Override + public void renderImage(Font font, int x, int y, GuiGraphics guiGraphics) { + if (this.types.isEmpty()) { + return; + } + int iconY = y + ClientStorageTooltip.LINE_HEIGHT * 2; + int visible = Math.min(this.types.size(), ClientStorageTooltip.MAX_VISIBLE_TYPES); + for (int i = 0; i < visible; i++) { + guiGraphics.renderItem( + this.types.get(i), + x + i * (ClientStorageTooltip.ICON_SIZE + ClientStorageTooltip.ICON_GAP), + iconY + ); + } + if (this.hasMore()) { + guiGraphics.drawString( + font, + Component.literal("...").withStyle(ChatFormatting.GRAY), + x + visible * (ClientStorageTooltip.ICON_SIZE + ClientStorageTooltip.ICON_GAP), + iconY + (ClientStorageTooltip.ICON_SIZE - ClientStorageTooltip.LINE_HEIGHT) / 2, + -1, + true + ); + } + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/client/init/ModTooltipComponents.java b/src/main/java/dev/dubhe/anvilcraft/client/init/ModTooltipComponents.java index 502c9ea794..3c7e83c121 100644 --- a/src/main/java/dev/dubhe/anvilcraft/client/init/ModTooltipComponents.java +++ b/src/main/java/dev/dubhe/anvilcraft/client/init/ModTooltipComponents.java @@ -2,13 +2,16 @@ import dev.dubhe.anvilcraft.client.gui.tooltip.ClientCreativeCrateTooltip; import dev.dubhe.anvilcraft.client.gui.tooltip.ClientFluidTankTooltip; +import dev.dubhe.anvilcraft.client.gui.tooltip.ClientStorageTooltip; import dev.dubhe.anvilcraft.inventory.tooltip.CreativeCrateTooltip; import dev.dubhe.anvilcraft.inventory.tooltip.FluidTankTooltip; +import dev.dubhe.anvilcraft.inventory.tooltip.StorageTooltip; import net.neoforged.neoforge.client.event.RegisterClientTooltipComponentFactoriesEvent; public class ModTooltipComponents { public static void register(RegisterClientTooltipComponentFactoriesEvent event) { event.register(FluidTankTooltip.class, ClientFluidTankTooltip::new); + event.register(StorageTooltip.class, ClientStorageTooltip::new); event.register(CreativeCrateTooltip.class, ClientCreativeCrateTooltip::new); } } diff --git a/src/main/java/dev/dubhe/anvilcraft/client/rpc/StorageClientStub.java b/src/main/java/dev/dubhe/anvilcraft/client/rpc/StorageClientStub.java index 3a5186c397..e45e450b5c 100644 --- a/src/main/java/dev/dubhe/anvilcraft/client/rpc/StorageClientStub.java +++ b/src/main/java/dev/dubhe/anvilcraft/client/rpc/StorageClientStub.java @@ -75,6 +75,72 @@ public static CompletableFuture interact( ); } + public static CompletableFuture clonePut(BlockPos sourcePos, IntList slots) { + return RPC.invoke( + RpcTarget.server(), + StorageServerStub::clonePut, + StorageClientStub.playerId(), + sourcePos.asLong(), + slots + ); + } + + public static CompletableFuture quickMoveToStorage(BlockPos sourcePos, IntList slots) { + return RPC.invoke( + RpcTarget.server(), + StorageServerStub::quickMoveToStorage, + StorageClientStub.playerId(), + sourcePos.asLong(), + slots + ); + } + + public static CompletableFuture moveSameToStorage(BlockPos sourcePos, int slot) { + return RPC.invoke( + RpcTarget.server(), + StorageServerStub::moveSameToStorage, + StorageClientStub.playerId(), + sourcePos.asLong(), + slot + ); + } + + public static CompletableFuture loadUsage(UUID storageId) { + return RPC.invoke( + RpcTarget.server(), + StorageServerStub::getStorageUsage, + StorageClientStub.playerId(), + storageId + ); + } + + public static CompletableFuture undo(BlockPos sourcePos) { + return RPC.invoke( + RpcTarget.server(), + StorageServerStub::undo, + StorageClientStub.playerId(), + sourcePos.asLong() + ); + } + + public static void beginUndoGroup(BlockPos sourcePos) { + RPC.call( + RpcTarget.server(), + StorageServerStub::beginUndoGroup, + StorageClientStub.playerId(), + sourcePos.asLong() + ); + } + + public static void endUndoGroup(BlockPos sourcePos) { + RPC.call( + RpcTarget.server(), + StorageServerStub::endUndoGroup, + StorageClientStub.playerId(), + sourcePos.asLong() + ); + } + public static CompletableFuture deposit(BlockPos sourcePos, boolean all) { return RPC.invoke( RpcTarget.server(), diff --git a/src/main/java/dev/dubhe/anvilcraft/client/support/RenderSupport.java b/src/main/java/dev/dubhe/anvilcraft/client/support/RenderSupport.java index 683c4b387f..a1ae3aa2b2 100644 --- a/src/main/java/dev/dubhe/anvilcraft/client/support/RenderSupport.java +++ b/src/main/java/dev/dubhe/anvilcraft/client/support/RenderSupport.java @@ -48,6 +48,7 @@ import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.DoorBlock; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.HalfTransparentBlock; import net.minecraft.world.level.block.LiquidBlock; @@ -55,6 +56,7 @@ import net.minecraft.world.level.block.StainedGlassPaneBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; import net.minecraft.world.level.material.FluidState; import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import net.neoforged.neoforge.client.model.data.ModelData; @@ -87,6 +89,52 @@ public class RenderSupport { public static final BlockRenderFunction SINGLE_BLOCK = (blockState, poseStack, buffers) -> { if (airLevelLike == null) return; BlockRenderDispatcher blockRenderDispatcher = Minecraft.getInstance().getBlockRenderer(); + if (blockState.getBlock() instanceof DoorBlock) { + renderDoorBlock(blockRenderDispatcher, blockState, poseStack, buffers); + return; + } + renderBlockState(blockRenderDispatcher, blockState, poseStack, buffers); + if (currentClientLevel == null) return; + getCachedBlockEntity(blockState).ifPresent(blockEntity -> { + blockEntity.setLevel(currentClientLevel); + blockEntity.setBlockState(blockState); + renderBlockEntity(blockEntity, poseStack, buffers); + }); + }; + + private static void renderDoorBlock( + BlockRenderDispatcher blockRenderDispatcher, + BlockState blockState, + PoseStack poseStack, + MultiBufferSource buffers + ) { + // 门是双格方块:上半扇锚定原格,下半扇向下叠一格,保持原尺寸完整拼接,利用原格下方的空间避免与上方砧子重叠 + BlockState closedState = blockState.setValue(DoorBlock.OPEN, false); + poseStack.pushPose(); + poseStack.translate(0.0F, -1.0F, 0.0F); + renderBlockState( + blockRenderDispatcher, + closedState.setValue(DoorBlock.HALF, DoubleBlockHalf.LOWER), + poseStack, + buffers + ); + poseStack.popPose(); + poseStack.pushPose(); + renderBlockState( + blockRenderDispatcher, + closedState.setValue(DoorBlock.HALF, DoubleBlockHalf.UPPER), + poseStack, + buffers + ); + poseStack.popPose(); + } + + private static void renderBlockState( + BlockRenderDispatcher blockRenderDispatcher, + BlockState blockState, + PoseStack poseStack, + MultiBufferSource buffers + ) { BakedModel model = blockRenderDispatcher.getBlockModel(blockState); for (RenderType renderType : model.getRenderTypes(blockState, RANDOM, ModelData.EMPTY)) { VertexConsumer bufferBuilder = buffers.getBuffer(renderType); @@ -102,13 +150,7 @@ public class RenderSupport { renderType ); } - if (currentClientLevel == null) return; - getCachedBlockEntity(blockState).ifPresent(blockEntity -> { - blockEntity.setLevel(currentClientLevel); - blockEntity.setBlockState(blockState); - renderBlockEntity(blockEntity, poseStack, buffers); - }); - }; + } public static BlockRenderFunction wipEntity(ResourceLocation recipeId, int stepCount) { return (blockState, poseStack, buffers) -> { diff --git a/src/main/java/dev/dubhe/anvilcraft/data/lang/CategoryLang.java b/src/main/java/dev/dubhe/anvilcraft/data/lang/CategoryLang.java index 2e4b4d62ac..8d5dbed0f8 100644 --- a/src/main/java/dev/dubhe/anvilcraft/data/lang/CategoryLang.java +++ b/src/main/java/dev/dubhe/anvilcraft/data/lang/CategoryLang.java @@ -24,6 +24,7 @@ public static void init(RegistrumLangProvider provider) { provider.add("screen.anvilcraft.storage.capacity.space", "Total Capacity: %1$s/%2$s"); provider.add("screen.anvilcraft.storage.capacity.types", "Types: %1$s/%2$s"); provider.add("screen.anvilcraft.storage.capacity.infinity", "Infinity Storage"); + provider.add("screen.anvilcraft.storage.count", "Count: %s"); provider.add("screen.anvilcraft.storage.category.name", "Name: %s"); provider.add("screen.anvilcraft.storage.category.mode", "Mode: %s"); provider.add("screen.anvilcraft.storage.category.mode.unlimited", "Unlimited"); diff --git a/src/main/java/dev/dubhe/anvilcraft/data/lang/JeiLang.java b/src/main/java/dev/dubhe/anvilcraft/data/lang/JeiLang.java index 76ef00593a..b3a63b96c4 100644 --- a/src/main/java/dev/dubhe/anvilcraft/data/lang/JeiLang.java +++ b/src/main/java/dev/dubhe/anvilcraft/data/lang/JeiLang.java @@ -79,6 +79,10 @@ public static void init(RegistrumLangProvider provider) { provider.add("gui.anvilcraft.category.beacon_conversion.activate", "Use this item to activate beacon"); provider.add("gui.anvilcraft.category.beacon_conversion.beacon_base", "Use this block as beacon base"); + provider.add("gui.anvilcraft.category.shulker_container_upgrade", "Shulker Container Upgrade"); + provider.add("gui.anvilcraft.category.shulker_container_upgrade.drop_on_top", "Drop these items onto the large crate"); + provider.add("gui.anvilcraft.category.shulker_container_upgrade.strike", "Strike with an anvil to upgrade the crate"); + provider.add("gui.anvilcraft.category.decay", "Decay"); provider.add("gui.anvilcraft.category.decay.random_tick", "The block at center will decay on a random tick"); provider.add("gui.anvilcraft.category.decay.center", "Put this block at the center"); diff --git a/src/main/java/dev/dubhe/anvilcraft/data/lang/ScreenLang.java b/src/main/java/dev/dubhe/anvilcraft/data/lang/ScreenLang.java index 60a042ba8b..3967f9590f 100644 --- a/src/main/java/dev/dubhe/anvilcraft/data/lang/ScreenLang.java +++ b/src/main/java/dev/dubhe/anvilcraft/data/lang/ScreenLang.java @@ -102,6 +102,8 @@ public static void init(RegistrumLangProvider provider) { provider.add("tooltip.anvilcraft.fluid_tank.capacity.value", " %s / %s"); provider.add("tooltip.anvilcraft.fluid_tank.capacity.value.infinity", " %s / ∞"); provider.add("tooltip.anvilcraft.fluid_tank.fluid", "Fluid:"); + provider.add("tooltip.anvilcraft.storage.types", "Types:"); + provider.add("tooltip.anvilcraft.storage.types.value", " %s / %s"); provider.add("tooltip.anvilcraft.fluid_tank.more", "and %s more..."); provider.add("tooltip.anvilcraft.creative_crate.item", "Item:"); diff --git a/src/main/java/dev/dubhe/anvilcraft/data/lang/ScreenTooltipLang.java b/src/main/java/dev/dubhe/anvilcraft/data/lang/ScreenTooltipLang.java index 7b190c85bb..c5b915136c 100644 --- a/src/main/java/dev/dubhe/anvilcraft/data/lang/ScreenTooltipLang.java +++ b/src/main/java/dev/dubhe/anvilcraft/data/lang/ScreenTooltipLang.java @@ -12,6 +12,8 @@ public static void init(RegistrumLangProvider provider) { provider.add("screen.anvilcraft.tooltip.cfa_amplifier", "It must be placed diagonally on the Celestial Forging Anvil"); provider.add("screen.anvilcraft.tooltip.trading_station.break_failed", "Please do not break someone else's Trading Station! Hold Shift to forcibly break it"); + provider.add("screen.anvilcraft.tooltip.crate.break_requires_shift", "The crate contains too many items! Hold Shift to break it"); + provider.add("screen.anvilcraft.tooltip.crate.hammer_break_denied", "The crate contains too many items! The Anvil Hammer cannot remove it"); provider.add("screen.anvilcraft.tooltip.fluid_tank.break_confirm", "This tank contains infinite fluid. Mine it again while holding Ctrl+Shift+Alt to confirm removal"); provider.add("screen.anvilcraft.tooltip.fluid_tank.break_modifiers", "Hold Ctrl+Shift+Alt while mining to remove this infinite-fluid tank"); provider.add("screen.anvilcraft.tooltip.fluid_tank.tool_break_failed", "Infinite-fluid tanks cannot be removed with an Anvil Hammer or Dragon Rod"); diff --git a/src/main/java/dev/dubhe/anvilcraft/data/recipe/BlockSmearRecipeLoader.java b/src/main/java/dev/dubhe/anvilcraft/data/recipe/BlockSmearRecipeLoader.java index a22d3cc0dd..46577bafbc 100644 --- a/src/main/java/dev/dubhe/anvilcraft/data/recipe/BlockSmearRecipeLoader.java +++ b/src/main/java/dev/dubhe/anvilcraft/data/recipe/BlockSmearRecipeLoader.java @@ -1,12 +1,19 @@ package dev.dubhe.anvilcraft.data.recipe; import dev.anvilcraft.lib.v2.registrum.providers.RegistrumRecipeProvider; +import dev.anvilcraft.lib.v2.util.predicate.BlockStatePredicate; +import dev.dubhe.anvilcraft.init.block.ModBlocks; import dev.dubhe.anvilcraft.recipe.anvil.wrap.BlockSmearRecipe; import net.minecraft.core.Holder; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.item.AxeItem; import net.minecraft.world.item.HoneycombItem; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.GrindstoneBlock; +import net.minecraft.world.level.block.WeatheringCopper; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.AttachFace; public class BlockSmearRecipeLoader { public static void init(RegistrumRecipeProvider provider) { @@ -17,9 +24,46 @@ public static void init(RegistrumRecipeProvider provider) { HoneycombItem.getWaxed(holder.value().defaultBlockState()) .ifPresent(state -> blockSmear(provider, Blocks.HONEYCOMB_BLOCK, holder.value(), state.getBlock())); } + + /// 倒置的砂轮(挂在方块下方)可以打磨下方的铜类方块和原木:去蜡、去锈、去皮。 + BlockStatePredicate invertedGrindstone = BlockStatePredicate.builder() + .of( + Blocks.GRINDSTONE, + ModBlocks.EMBER_GRINDSTONE.get(), + ModBlocks.FROST_GRINDSTONE.get(), + ModBlocks.ROYAL_GRINDSTONE.get(), + ModBlocks.TRANSCENDENCE_GRINDSTONE.get() + ) + .with(GrindstoneBlock.FACE, AttachFace.CEILING) + .build(); + + for (Holder holder : BuiltInRegistries.BLOCK.holders().toList()) { + Block block = holder.value(); + Block waxedOff = HoneycombItem.WAX_OFF_BY_BLOCK.get().get(block); + if (waxedOff != null) { + blockSmear(provider, invertedGrindstone, block, waxedOff, "dewax"); + } + WeatheringCopper.getPrevious(block.defaultBlockState()) + .ifPresent(state -> blockSmear(provider, invertedGrindstone, block, state.getBlock(), "deoxidize")); + BlockState stripped = AxeItem.getAxeStrippingState(block.defaultBlockState()); + if (stripped != null) { + blockSmear(provider, invertedGrindstone, block, stripped.getBlock(), "strip"); + } + } } private static void blockSmear(RegistrumRecipeProvider provider, Block block1, Block block2, Block result) { BlockSmearRecipe.builder().input(block1).input(block2).result(result).save(provider); } + + private static void blockSmear( + RegistrumRecipeProvider provider, + BlockStatePredicate input1, + Block input2, + Block result, + String suffix + ) { + String id = BuiltInRegistries.BLOCK.getKey(result).getPath() + "_" + suffix; + BlockSmearRecipe.builder().input(input1).input(input2).result(result).save(provider, id); + } } diff --git a/src/main/java/dev/dubhe/anvilcraft/data/recipe/MultiBlockRecipeLoader.java b/src/main/java/dev/dubhe/anvilcraft/data/recipe/MultiBlockRecipeLoader.java index f8db73f7dd..db28adb305 100644 --- a/src/main/java/dev/dubhe/anvilcraft/data/recipe/MultiBlockRecipeLoader.java +++ b/src/main/java/dev/dubhe/anvilcraft/data/recipe/MultiBlockRecipeLoader.java @@ -257,13 +257,22 @@ public static void init(RegistrumRecipeProvider provider) { MultiblockRecipe.builder("anvilcraft:celestial_forging_anvil", 1) .layer("AAA", "ABA", "AAA") - .layer("CCC", "CCC", "CCC") + .layer("CCC", "CFC", "CCC") .layer("DED", "E E", "DED") .symbol('A', "anvilcraft:transcendium_block") .symbol('B', "anvilcraft:spacetime_supercomputer") .symbol('C', "minecraft:gold_block") .symbol('D', "anvilcraft:confinement_chamber") .symbol('E', "anvilcraft:negative_matter_block") + .symbol('F', "anvilcraft:mass_energy_inverter") + .save(provider); + + MultiblockRecipe.builder(ModBlocks.LARGE_CRATE, 1) + .layer("AAA", "AAA", "AAA") + .layer("AAA", "ABA", "AAA") + .layer("AAA", "AAA", "AAA") + .symbol('A', BlockPredicateWithState.ofTag("c:stripped_logs")) + .symbol('B', ModBlocks.RESIN_BLOCK) .save(provider); } } diff --git a/src/main/java/dev/dubhe/anvilcraft/data/recipe/ProceduralProcessRecipeLoader.java b/src/main/java/dev/dubhe/anvilcraft/data/recipe/ProceduralProcessRecipeLoader.java index 7288672dfb..e4d687214c 100644 --- a/src/main/java/dev/dubhe/anvilcraft/data/recipe/ProceduralProcessRecipeLoader.java +++ b/src/main/java/dev/dubhe/anvilcraft/data/recipe/ProceduralProcessRecipeLoader.java @@ -52,6 +52,43 @@ public static void init(RegistrumRecipeProvider provider) { ) .save(provider); + // 能质逆变器 + ProceduralProcessRecipeBuilder.of(ModBlocks.LASER_RECEIVER.get()) + .addStep( + BlockProcessingRecipe.builder() + .fakeNeutronIrradiation(ModBlocks.LASER_RECEIVER.get(), IrradiatorType.MASS) + .result(ModBlocks.WIP_BLOCK.get()) + .buildRecipe() + ) + .addStep( + BlockProcessingRecipe.builder() + .fakeNeutronIrradiation(ModBlocks.WIP_BLOCK.get(), IrradiatorType.ENERGY) + .result(ModBlocks.WIP_BLOCK.get()) + .buildRecipe() + ) + .addStep( + ItemInjectRecipe.builder() + .inputBlock(ModBlocks.WIP_BLOCK.get()) + .requires(ModItems.TRANSCENDIUM_NUGGET) + .resultBlock(ModBlocks.WIP_BLOCK) + .buildRecipe() + ) + .result(ModBlocks.MASS_ENERGY_INVERTER) + .icon(ModBlocks.MASS_ENERGY_INVERTER.asStack()) + .displayedModels( + AnvilCraft.of("mass_energy_inverter_wip"), + AnvilCraft.of("mass_energy_inverter_wip_2"), + AnvilCraft.of("mass_energy_inverter_wip_3") + ) + .loop(3) + .multipleLoopFirstStep( + BlockProcessingRecipe.builder() + .fakeNeutronIrradiation(ModBlocks.WIP_BLOCK.get(), IrradiatorType.MASS) + .result(ModBlocks.WIP_BLOCK.get()) + .buildRecipe() + ) + .save(provider); + ProceduralProcessRecipeBuilder.of(Blocks.PURPUR_BLOCK) .addStep( ItemInjectRecipe.builder() diff --git a/src/main/java/dev/dubhe/anvilcraft/data/recipe/ShapedRecipeLoader.java b/src/main/java/dev/dubhe/anvilcraft/data/recipe/ShapedRecipeLoader.java index 03dcbc05e7..453cd4aecc 100644 --- a/src/main/java/dev/dubhe/anvilcraft/data/recipe/ShapedRecipeLoader.java +++ b/src/main/java/dev/dubhe/anvilcraft/data/recipe/ShapedRecipeLoader.java @@ -7,6 +7,7 @@ import dev.dubhe.anvilcraft.init.item.ModItems; import net.minecraft.data.recipes.RecipeCategory; import net.minecraft.data.recipes.ShapedRecipeBuilder; +import net.minecraft.tags.ItemTags; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; import net.minecraft.world.level.ItemLike; @@ -16,6 +17,7 @@ public ShapedRecipeLoader(RegistrumRecipeProvider provider) { this.nineToOne(provider); this.chargedNeutroniumIngot(provider); this.controlValve(provider); + this.crate(provider); } public void nineToOne(RegistrumRecipeProvider provider) { @@ -62,6 +64,18 @@ private void controlValve(RegistrumRecipeProvider provider) { .save(provider); } + private void crate(RegistrumRecipeProvider provider) { + ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, ModBlocks.CRATE, 2) + .pattern("AAA") + .pattern("ABA") + .pattern("AAA") + .define('A', ItemTags.PLANKS) + .define('B', ModItems.RESIN) + .unlockedBy(AnvilCraftDatagen.hasItem(ItemTags.PLANKS), AnvilCraftDatagen.has(ItemTags.PLANKS)) + .unlockedBy(AnvilCraftDatagen.hasItem(ModItems.RESIN), AnvilCraftDatagen.has(ModItems.RESIN)) + .save(provider); + } + private void nine21( RegistrumRecipeProvider provider, RecipeCategory recipeCategory, diff --git a/src/main/java/dev/dubhe/anvilcraft/event/BreakBlockEventListener.java b/src/main/java/dev/dubhe/anvilcraft/event/BreakBlockEventListener.java index 4434fc4865..b9518b18cc 100644 --- a/src/main/java/dev/dubhe/anvilcraft/event/BreakBlockEventListener.java +++ b/src/main/java/dev/dubhe/anvilcraft/event/BreakBlockEventListener.java @@ -1,5 +1,8 @@ package dev.dubhe.anvilcraft.event; +import dev.dubhe.anvilcraft.block.container.storage.CrateBlock; +import dev.dubhe.anvilcraft.block.container.storage.LargeCrateBlock; +import dev.dubhe.anvilcraft.block.entity.storage.StorageBlockEntity; import dev.dubhe.anvilcraft.init.block.ModBlockEntities; import dev.dubhe.anvilcraft.init.block.ModBlocks; import dev.dubhe.anvilcraft.item.ResonatorItem; @@ -13,6 +16,9 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; import net.neoforged.bus.api.EventPriority; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; @@ -34,6 +40,32 @@ public static void preventInfiniteFluidTankBreak(BlockEvent.BreakEvent event) { } } + @SubscribeEvent + public static void preventCrateBreak(BlockEvent.BreakEvent event) { + Player player = event.getPlayer(); + if (player.isShiftKeyDown()) return; + if (!(player.level() instanceof ServerLevel level)) return; + BlockPos pos = event.getPos(); + BlockState state = level.getBlockState(pos); + Block block = state.getBlock(); + BlockEntity blockEntity; + if (block instanceof LargeCrateBlock largeCrate) { + blockEntity = level.getBlockEntity(largeCrate.getMainPartPos(pos, state)); + } else if (block instanceof CrateBlock) { + blockEntity = level.getBlockEntity(pos); + } else { + return; + } + if (!(blockEntity instanceof StorageBlockEntity be)) return; + if (be.getTotalCount() > 1000) { + player.displayClientMessage( + Component.translatable("screen.anvilcraft.tooltip.crate.break_requires_shift").withStyle(ChatFormatting.RED), + true + ); + event.setCanceled(true); + } + } + @SubscribeEvent public static void onBlockRemoved(BlockEvent.BreakEvent event) { Player player = event.getPlayer(); diff --git a/src/main/java/dev/dubhe/anvilcraft/event/CapabilitiesEventListener.java b/src/main/java/dev/dubhe/anvilcraft/event/CapabilitiesEventListener.java index 6ec35f2bc9..c590137547 100644 --- a/src/main/java/dev/dubhe/anvilcraft/event/CapabilitiesEventListener.java +++ b/src/main/java/dev/dubhe/anvilcraft/event/CapabilitiesEventListener.java @@ -7,7 +7,10 @@ import dev.dubhe.anvilcraft.api.fluid.PowderSnowWrapper; import dev.dubhe.anvilcraft.api.fluid.VoidFluidHandler; import dev.dubhe.anvilcraft.api.itemhandler.HoneyCauldronWrapper; +import dev.dubhe.anvilcraft.api.itemhandler.ReadOnlyItemHandlerWrapper; +import dev.dubhe.anvilcraft.block.container.storage.HyperdimensionStorageStationBlock; import dev.dubhe.anvilcraft.block.container.storage.LargeCrateBlock; +import dev.dubhe.anvilcraft.block.container.storage.ShulkerContainerBlock; import dev.dubhe.anvilcraft.block.entity.FeCollectorBlockEntity; import dev.dubhe.anvilcraft.block.entity.LargeCauldronBlockEntity; import dev.dubhe.anvilcraft.block.entity.PowerConverterBlockEntity; @@ -83,6 +86,35 @@ public static void registerCapabilities(final RegisterCapabilitiesEvent event) { ModBlockEntities.CRATE.get(), CapabilitiesEventListener::storageItemHandler ); + event.registerBlock( + Capabilities.ItemHandler.BLOCK, + ((level, pos, state, blockEntity, side) -> { + if (!(state.getBlock() instanceof ShulkerContainerBlock shulkerContainer)) { + return null; + } + BlockEntity mainBe = level.getBlockEntity(shulkerContainer.getMainPartPos(pos, state)); + if (mainBe instanceof StorageBlockEntity storage) { + return ReadOnlyItemHandlerWrapper.wrap(CapabilitiesEventListener.storageItemHandler(storage, side)); + } + return null; + }), + ModBlocks.SHULKER_CONTAINER.get() + ); + + event.registerBlock( + Capabilities.ItemHandler.BLOCK, + ((level, pos, state, blockEntity, side) -> { + if (!(state.getBlock() instanceof HyperdimensionStorageStationBlock station)) { + return null; + } + BlockEntity mainBe = level.getBlockEntity(station.getMainPartPos(pos, state)); + if (mainBe instanceof StorageBlockEntity storage) { + return ReadOnlyItemHandlerWrapper.wrap(CapabilitiesEventListener.storageItemHandler(storage, side)); + } + return null; + }), + ModBlocks.HYPERDIMENSION_STORAGE_STATION.get() + ); event.registerBlock( Capabilities.ItemHandler.BLOCK, diff --git a/src/main/java/dev/dubhe/anvilcraft/event/InWorldRecipeEventListener.java b/src/main/java/dev/dubhe/anvilcraft/event/InWorldRecipeEventListener.java index d45f87a529..34a6fed311 100644 --- a/src/main/java/dev/dubhe/anvilcraft/event/InWorldRecipeEventListener.java +++ b/src/main/java/dev/dubhe/anvilcraft/event/InWorldRecipeEventListener.java @@ -1,13 +1,17 @@ package dev.dubhe.anvilcraft.event; import dev.anvilcraft.lib.v2.recipe.InWorldRecipe; +import dev.anvilcraft.lib.v2.recipe.cache.BlockCache; import dev.anvilcraft.lib.v2.recipe.event.InWorldRecipeEvent; import dev.anvilcraft.lib.v2.recipe.event.InWorldRecipeManagerEvent; import dev.anvilcraft.lib.v2.recipe.event.ItemCacheEvent; import dev.anvilcraft.lib.v2.recipe.util.InWorldRecipeContext; +import dev.anvilcraft.lib.v2.util.predicate.BlockStatePredicate; import dev.dubhe.anvilcraft.AnvilCraft; import dev.dubhe.anvilcraft.block.entity.LargeCauldronBlockEntity; import dev.dubhe.anvilcraft.init.block.ModBlockEntities; +import dev.dubhe.anvilcraft.init.recipe.ModRecipeTypes; +import dev.dubhe.anvilcraft.recipe.anvil.wrap.BlockSmearRecipe; import dev.dubhe.anvilcraft.recipe.anvil.wrap.MeshRecipe; import dev.dubhe.anvilcraft.recipe.anvil.wrap.VanillaRecipesWrap; import dev.dubhe.anvilcraft.recipe.generate.MeshRecipeGeneratingCache; @@ -20,10 +24,14 @@ import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.crafting.RecipeManager; import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.Property; +import net.minecraft.world.phys.Vec3; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import java.util.List; +import java.util.Map; @EventBusSubscriber(modid = AnvilCraft.MOD_ID) public class InWorldRecipeEventListener { @@ -54,6 +62,48 @@ public static void inWorldRecipe(InWorldRecipeEvent event) { TriggerUtil.inWorldRecipe(level, pos, ResourceLocation.parse(recipeType.toString()), id); } + /** + * 砧库的方块涂抹结果不会继承输入方块的方块状态, + * 这里把被处理方块的属性(如去皮前的原木朝向)复制给结果方块。 + * + * @param event 世界内配方事件 + */ + @SubscribeEvent + public static void inheritSmearBlockState(InWorldRecipeEvent event) { + if (event.getRecipeType() != ModRecipeTypes.BLOCK_SMEAR_TYPE.get()) return; + if (!(event.getRecipe() instanceof BlockSmearRecipe recipe)) return; + List inputs = recipe.getInputBlocks(); + if (inputs.isEmpty()) return; + InWorldRecipeContext context = event.getContext(); + BlockCache cache = context.computeIfAbsent(BlockCache.BLOCK_CACHE); + Vec3 inputOffset = recipe.getProperty().getBlockInputOffset().subtract(0, inputs.size() - 1, 0); + BlockPos inputPos = BlockPos.containing(context.getPos().add(inputOffset)); + BlockPos outputPos = BlockPos.containing(context.getPos().add(recipe.getProperty().getBlockOutputOffset())); + BlockState input = context.getLevel().getBlockState(inputPos); + BlockState output = cache.getBlockState(outputPos); + cache.setBlock(outputPos, inheritProperties(input, output)); + } + + private static BlockState inheritProperties(BlockState source, BlockState target) { + BlockState result = target; + for (Map.Entry, Comparable> entry : source.getValues().entrySet()) { + Property property = entry.getKey(); + Comparable value = entry.getValue(); + if (result.hasProperty(property) && property.getValueClass().isInstance(value)) { + result = inheritProperty(result, property, value); + } + } + return result; + } + + private static > BlockState inheritProperty( + BlockState target, + Property property, + Comparable value + ) { + return target.setValue(property, property.getValueClass().cast(value)); + } + @SubscribeEvent public static void spawnItemEntity(ItemCacheEvent.SpawnItemEntity event) { ItemEntity entity = event.getEntity(); diff --git a/src/main/java/dev/dubhe/anvilcraft/init/block/ModBlockEntities.java b/src/main/java/dev/dubhe/anvilcraft/init/block/ModBlockEntities.java index dde6601a34..5ae859d4f5 100644 --- a/src/main/java/dev/dubhe/anvilcraft/init/block/ModBlockEntities.java +++ b/src/main/java/dev/dubhe/anvilcraft/init/block/ModBlockEntities.java @@ -42,6 +42,7 @@ import dev.dubhe.anvilcraft.block.entity.LensBlockEntity; import dev.dubhe.anvilcraft.block.entity.LoadMonitorBlockEntity; import dev.dubhe.anvilcraft.block.entity.MagneticChuteBlockEntity; +import dev.dubhe.anvilcraft.block.entity.MassEnergyInverterBlockEntity; import dev.dubhe.anvilcraft.block.entity.MineralFountainBlockEntity; import dev.dubhe.anvilcraft.block.entity.MobAmberBlockEntity; import dev.dubhe.anvilcraft.block.entity.NeutronIrradiatorBlockEntity; @@ -304,6 +305,11 @@ public class ModBlockEntities { SpaceOvercompressorBlockEntity::createBlockEntity ).validBlocks(ModBlocks.SPACE_OVERCOMPRESSOR).register(); + public static final BlockEntityEntry MASS_ENERGY_INVERTER = REGISTRUM.blockEntity( + "mass_energy_inverter", + MassEnergyInverterBlockEntity::createBlockEntity + ).validBlocks(ModBlocks.MASS_ENERGY_INVERTER).register(); + public static final BlockEntityEntry BLACK_HOLE = REGISTRUM.blockEntity( "black_hole", BlackHoleBlockEntity::createBlockEntity diff --git a/src/main/java/dev/dubhe/anvilcraft/init/block/ModBlocks.java b/src/main/java/dev/dubhe/anvilcraft/init/block/ModBlocks.java index d36c5cc089..1f8d681ada 100644 --- a/src/main/java/dev/dubhe/anvilcraft/init/block/ModBlocks.java +++ b/src/main/java/dev/dubhe/anvilcraft/init/block/ModBlocks.java @@ -92,6 +92,7 @@ import dev.dubhe.anvilcraft.block.MagnetBlock; import dev.dubhe.anvilcraft.block.MagneticChuteBlock; import dev.dubhe.anvilcraft.block.MagnetoElectricCoreBlock; +import dev.dubhe.anvilcraft.block.MassEnergyInverterBlock; import dev.dubhe.anvilcraft.block.MeltGemCauldron; import dev.dubhe.anvilcraft.block.MengerSpongeBlock; import dev.dubhe.anvilcraft.block.MilkCauldronBlock; @@ -1557,6 +1558,19 @@ public class ModBlocks { .build() .register(); + public static final BlockEntry MASS_ENERGY_INVERTER = REGISTRUM.block( + "mass_energy_inverter", + MassEnergyInverterBlock::new + ) + .initialProperties(() -> Blocks.IRON_BLOCK) + .properties(properties -> properties.isValidSpawn(Blocks::never).noOcclusion()) + .blockstate(DataGenUtil::simple) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item() + .model((ctx, provider) -> provider.blockItem(ctx)) + .build() + .register(); + public static final BlockEntry MENGER_SPONGE = REGISTRUM.block("menger_sponge", MengerSpongeBlock::new) .initialProperties(() -> Blocks.SPONGE) .properties(properties -> properties.noOcclusion().isValidSpawn(Blocks::never)) @@ -1603,7 +1617,7 @@ public class ModBlocks { public static final BlockEntry SHULKER_CONTAINER = REGISTRUM .block("shulker_container", ShulkerContainerBlock::new) .initialProperties(() -> Blocks.NETHERITE_BLOCK) - .loot(FlexibleMultiPartBlock::loot) + .loot(ShulkerContainerBlock::loot) .properties(properties -> properties .noOcclusion() .explosionResistance(1200) @@ -1625,7 +1639,7 @@ public class ModBlocks { public static final BlockEntry HYPERDIMENSION_STORAGE_STATION = REGISTRUM .block("hyperdimension_storage_station", HyperdimensionStorageStationBlock::new) .initialProperties(() -> Blocks.NETHERITE_BLOCK) - .loot(SimpleMultiPartBlock::loot) + .loot(HyperdimensionStorageStationBlock::loot) .properties(properties -> properties .noOcclusion() .explosionResistance(1200) diff --git a/src/main/java/dev/dubhe/anvilcraft/init/item/tabs/FunctionalBlocks.java b/src/main/java/dev/dubhe/anvilcraft/init/item/tabs/FunctionalBlocks.java index e28c514ba5..72cc0e5992 100644 --- a/src/main/java/dev/dubhe/anvilcraft/init/item/tabs/FunctionalBlocks.java +++ b/src/main/java/dev/dubhe/anvilcraft/init/item/tabs/FunctionalBlocks.java @@ -110,6 +110,7 @@ public void accept() { this.plain(ModBlocks.TRANSPARENT_CRAFTING_TABLE); // 通透工作台 this.plain(ModBlocks.SPACE_OVERCOMPRESSOR); // 空间超压器 + this.plain(ModBlocks.MASS_ENERGY_INVERTER); // 能质逆变器 this.plain(ModBlocks.CRATE); // 板条箱 this.plain(ModBlocks.LARGE_CRATE); // 大板条箱 this.plain(ModBlocks.SHULKER_CONTAINER); // 潜影集装箱 diff --git a/src/main/java/dev/dubhe/anvilcraft/integration/jei/AnvilCraftJeiPlugin.java b/src/main/java/dev/dubhe/anvilcraft/integration/jei/AnvilCraftJeiPlugin.java index 8169d4aae3..1d6e62d059 100644 --- a/src/main/java/dev/dubhe/anvilcraft/integration/jei/AnvilCraftJeiPlugin.java +++ b/src/main/java/dev/dubhe/anvilcraft/integration/jei/AnvilCraftJeiPlugin.java @@ -24,6 +24,7 @@ import dev.dubhe.anvilcraft.integration.jei.category.MultipleToOneSmithingCategory; import dev.dubhe.anvilcraft.integration.jei.category.PortalConversionCategory; import dev.dubhe.anvilcraft.integration.jei.category.ProceduralProcessCategory; +import dev.dubhe.anvilcraft.integration.jei.category.ShulkerContainerUpgradeCategory; import dev.dubhe.anvilcraft.integration.jei.category.anvil.BlockCompressCategory; import dev.dubhe.anvilcraft.integration.jei.category.anvil.BlockCrushCategory; import dev.dubhe.anvilcraft.integration.jei.category.anvil.BlockSmearCategory; @@ -50,6 +51,7 @@ import dev.dubhe.anvilcraft.integration.jei.recipe.MeshRecipeGroup; import dev.dubhe.anvilcraft.integration.jei.recipe.MineralFountainJeiRecipe; import dev.dubhe.anvilcraft.integration.jei.recipe.MobTransformJeiRecipe; +import dev.dubhe.anvilcraft.integration.jei.recipe.ShulkerContainerUpgradeRecipe; import dev.dubhe.anvilcraft.inventory.RoyalSmithingMenu; import dev.dubhe.anvilcraft.recipe.CanningFoodRecipe; import dev.dubhe.anvilcraft.recipe.ChargerChargingRecipe; @@ -129,6 +131,8 @@ public class AnvilCraftJeiPlugin implements IModPlugin { public static final RecipeType BEACON_CONVERSION = createRecipeType("beacon_conversion", BeaconConversionRecipe.class); public static final RecipeType DECAY = createRecipeType("decay", DecayRecipe.class); + public static final RecipeType SHULKER_CONTAINER_UPGRADE = + createRecipeType("shulker_container_upgrade", ShulkerContainerUpgradeRecipe.class); public static final RecipeType> BLOCK_COMPRESS = createRecipeHolderType("block_compress"); @@ -218,6 +222,7 @@ public void registerRecipes(IRecipeRegistration registration) { ProceduralProcessCategory.registerRecipes(registration); EnergyWeaponCategory.registerRecipes(registration); MineralFountainCategory.registerRecipes(registration); + ShulkerContainerUpgradeCategory.registerRecipes(registration); } @Override @@ -252,6 +257,7 @@ public void registerRecipeCatalysts(IRecipeCatalystRegistration registration) { ProceduralProcessCategory.registerRecipeCatalysts(registration); EnergyWeaponCategory.registerRecipeCatalysts(registration); MineralFountainCategory.registerRecipeCatalysts(registration); + ShulkerContainerUpgradeCategory.registerRecipeCatalysts(registration); registration.addRecipeCatalyst(new ItemStack(ModBlocks.BATCH_CRAFTER), RecipeTypes.CRAFTING); @@ -301,6 +307,7 @@ public void registerCategories(IRecipeCategoryRegistration registration) { registration.addRecipeCategories(new ProceduralProcessCategory(guiHelper)); registration.addRecipeCategories(new EnergyWeaponCategory(guiHelper)); registration.addRecipeCategories(new MineralFountainCategory(guiHelper)); + registration.addRecipeCategories(new ShulkerContainerUpgradeCategory(guiHelper)); } @Override diff --git a/src/main/java/dev/dubhe/anvilcraft/integration/jei/category/ShulkerContainerUpgradeCategory.java b/src/main/java/dev/dubhe/anvilcraft/integration/jei/category/ShulkerContainerUpgradeCategory.java new file mode 100644 index 0000000000..8934702e31 --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/integration/jei/category/ShulkerContainerUpgradeCategory.java @@ -0,0 +1,161 @@ +package dev.dubhe.anvilcraft.integration.jei.category; + +import dev.dubhe.anvilcraft.block.container.storage.LargeCrateBlock; +import dev.dubhe.anvilcraft.block.state.Cube3x3PartHalf; +import dev.dubhe.anvilcraft.client.support.RenderSupport; +import dev.dubhe.anvilcraft.init.block.ModBlocks; +import dev.dubhe.anvilcraft.integration.jei.AnvilCraftJeiPlugin; +import dev.dubhe.anvilcraft.integration.jei.recipe.ShulkerContainerUpgradeRecipe; +import dev.dubhe.anvilcraft.integration.jei.util.JeiBlockIngredientUtil; +import dev.dubhe.anvilcraft.integration.jei.util.JeiRenderHelper; +import mezz.jei.api.gui.ITickTimer; +import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; +import mezz.jei.api.gui.drawable.IDrawable; +import mezz.jei.api.gui.ingredient.IRecipeSlotsView; +import mezz.jei.api.gui.widgets.IRecipeExtrasBuilder; +import mezz.jei.api.helpers.IGuiHelper; +import mezz.jei.api.recipe.IFocusGroup; +import mezz.jei.api.recipe.RecipeIngredientRole; +import mezz.jei.api.recipe.RecipeType; +import mezz.jei.api.recipe.category.IRecipeCategory; +import mezz.jei.api.registration.IRecipeCatalystRegistration; +import mezz.jei.api.registration.IRecipeRegistration; +import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Blocks; +import org.jetbrains.annotations.Nullable; + +public class ShulkerContainerUpgradeCategory implements IRecipeCategory { + public static final int WIDTH = 162; + public static final int HEIGHT = 64; + public static final int NETHERITE_BLOCK_COUNT = 6; + + private final IDrawable icon; + private final IDrawable slotDefault; + private final IDrawable arrowIn; + private final IDrawable arrowOutputFromBelow; + private final ITickTimer timer; + private final Component title; + private final Component dropOnTopTooltip; + private final Component strikeTooltip; + + public ShulkerContainerUpgradeCategory(IGuiHelper helper) { + this.icon = helper.createDrawableItemStack(ModBlocks.SHULKER_CONTAINER.asStack()); + this.slotDefault = JeiRenderHelper.getSlotDefault(helper); + this.arrowIn = JeiRenderHelper.getArrowInput(helper); + this.arrowOutputFromBelow = JeiRenderHelper.getArrowOutputFromBelow(helper); + this.timer = helper.createTickTimer(30, 60, true); + this.title = Component.translatable("gui.anvilcraft.category.shulker_container_upgrade"); + this.dropOnTopTooltip = + Component.translatable("gui.anvilcraft.category.shulker_container_upgrade.drop_on_top") + .withStyle(ChatFormatting.GOLD); + this.strikeTooltip = + Component.translatable("gui.anvilcraft.category.shulker_container_upgrade.strike") + .withStyle(ChatFormatting.GOLD); + } + + @Override + public RecipeType getRecipeType() { + return AnvilCraftJeiPlugin.SHULKER_CONTAINER_UPGRADE; + } + + @Override + public Component getTitle() { + return title; + } + + @Override + public int getWidth() { + return WIDTH; + } + + @Override + public int getHeight() { + return HEIGHT; + } + + @Override + public @Nullable IDrawable getIcon() { + return icon; + } + + @Override + public void setRecipe( + IRecipeLayoutBuilder builder, ShulkerContainerUpgradeRecipe recipe, IFocusGroup focuses) { + builder.addSlot(RecipeIngredientRole.INPUT, 9, 8) + .addItemStack(ModBlocks.SPACE_OVERCOMPRESSOR.asStack()) + .addRichTooltipCallback((recipeSlotView, tooltip) -> tooltip.add(dropOnTopTooltip)); + builder.addSlot(RecipeIngredientRole.INPUT, 31, 8) + .addItemStack(new ItemStack(Blocks.NETHERITE_BLOCK, NETHERITE_BLOCK_COUNT)) + .addRichTooltipCallback((recipeSlotView, tooltip) -> tooltip.add(dropOnTopTooltip)); + JeiBlockIngredientUtil.addSlot( + builder, + RecipeIngredientRole.INPUT, + "crate", + 69, + 32, + 25, + 25, + ModBlocks.LARGE_CRATE.get() + ); + builder.addSlot(RecipeIngredientRole.OUTPUT, 128, 8) + .addItemStack(ModBlocks.SHULKER_CONTAINER.asStack()) + .addRichTooltipCallback((recipeSlotView, tooltip) -> tooltip.add(strikeTooltip)); + } + + @Override + public void createRecipeExtras( + IRecipeExtrasBuilder builder, ShulkerContainerUpgradeRecipe recipe, IFocusGroup focuses) { + JeiBlockIngredientUtil.suppressHoverOverlays(builder); + } + + @Override + public void draw( + ShulkerContainerUpgradeRecipe recipe, + IRecipeSlotsView recipeSlotsView, + GuiGraphics guiGraphics, + double mouseX, + double mouseY) { + float anvilYOffset = JeiRenderHelper.getAnvilAnimationOffset(timer); + RenderSupport.renderBlock( + guiGraphics, + Blocks.ANVIL.defaultBlockState(), + 81, + 22 + anvilYOffset, + 20, + 12, + RenderSupport.SINGLE_BLOCK); + RenderSupport.renderBlock( + guiGraphics, + ModBlocks.LARGE_CRATE.getDefaultState().setValue(LargeCrateBlock.HALF, Cube3x3PartHalf.MID_CENTER), + 81, + 44, + 10, + 8, + RenderSupport.SINGLE_BLOCK); + + arrowIn.draw(guiGraphics, 52, 30); + arrowOutputFromBelow.draw(guiGraphics, 94, 29); + + slotDefault.draw(guiGraphics, 8, 7); + slotDefault.draw(guiGraphics, 30, 7); + slotDefault.draw(guiGraphics, 127, 7); + } + + public static void registerRecipes(IRecipeRegistration registration) { + registration.addRecipes( + AnvilCraftJeiPlugin.SHULKER_CONTAINER_UPGRADE, + ShulkerContainerUpgradeRecipe.getAllRecipes()); + } + + public static void registerRecipeCatalysts(IRecipeCatalystRegistration registration) { + registration.addRecipeCatalyst(ModBlocks.LARGE_CRATE.asStack(), AnvilCraftJeiPlugin.SHULKER_CONTAINER_UPGRADE); + registration.addRecipeCatalyst( + ModBlocks.SHULKER_CONTAINER.asStack(), AnvilCraftJeiPlugin.SHULKER_CONTAINER_UPGRADE); + registration.addRecipeCatalyst( + ModBlocks.SPACE_OVERCOMPRESSOR.asStack(), AnvilCraftJeiPlugin.SHULKER_CONTAINER_UPGRADE); + AnvilCraftJeiPlugin.addAnvilProcessingCatalysts(registration, AnvilCraftJeiPlugin.SHULKER_CONTAINER_UPGRADE); + } +} \ No newline at end of file diff --git a/src/main/java/dev/dubhe/anvilcraft/integration/jei/category/anvil/BlockSmearCategory.java b/src/main/java/dev/dubhe/anvilcraft/integration/jei/category/anvil/BlockSmearCategory.java index 1d18eac6cb..8295ff010e 100644 --- a/src/main/java/dev/dubhe/anvilcraft/integration/jei/category/anvil/BlockSmearCategory.java +++ b/src/main/java/dev/dubhe/anvilcraft/integration/jei/category/anvil/BlockSmearCategory.java @@ -30,6 +30,8 @@ import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.DoorBlock; +import net.minecraft.world.level.block.GrindstoneBlock; import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.Nullable; @@ -127,7 +129,7 @@ public void draw( Blocks.ANVIL.defaultBlockState(), 50, 12 + anvilYOffset, - 20, + 40, 12, RenderSupport.SINGLE_BLOCK ); @@ -143,14 +145,14 @@ public void draw( renderedState, 50, 30 + 10 * i, - 10 - 10 * i, + renderedState.getBlock() instanceof DoorBlock ? 10 : 25 - 10 * i, 12, RenderSupport.SINGLE_BLOCK ); } RenderSupport.renderBlock( - guiGraphics, Blocks.ANVIL.defaultBlockState(), 110, 20, 20, 12, RenderSupport.SINGLE_BLOCK + guiGraphics, Blocks.ANVIL.defaultBlockState(), 110, 20, 80, 12, RenderSupport.SINGLE_BLOCK ); List input = recipe.getFirstInputBlock().constructStatesForRender(); BlockState renderedState = JeiBlockIngredientUtil.getDisplayedState(recipeSlotsView, RESULT_INPUT_BLOCK, input) @@ -160,12 +162,19 @@ public void draw( renderedState, 110, 30, - 10, + 60, 12, RenderSupport.SINGLE_BLOCK ); + BlockState resultState = recipe.getFirstResultBlock().state(); RenderSupport.renderBlock( - guiGraphics, recipe.getFirstResultBlock().state(), 110, 40, 0, 12, RenderSupport.SINGLE_BLOCK + guiGraphics, + resultState, + 110, + 40, + resultState.getBlock() instanceof DoorBlock ? 10 : 0, + 12, + RenderSupport.SINGLE_BLOCK ); } diff --git a/src/main/java/dev/dubhe/anvilcraft/integration/jei/recipe/ShulkerContainerUpgradeRecipe.java b/src/main/java/dev/dubhe/anvilcraft/integration/jei/recipe/ShulkerContainerUpgradeRecipe.java new file mode 100644 index 0000000000..9c8e1c5312 --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/integration/jei/recipe/ShulkerContainerUpgradeRecipe.java @@ -0,0 +1,9 @@ +package dev.dubhe.anvilcraft.integration.jei.recipe; + +import com.google.common.collect.ImmutableList; + +public record ShulkerContainerUpgradeRecipe() { + public static ImmutableList getAllRecipes() { + return ImmutableList.of(new ShulkerContainerUpgradeRecipe()); + } +} \ No newline at end of file diff --git a/src/main/java/dev/dubhe/anvilcraft/inventory/tooltip/StorageTooltip.java b/src/main/java/dev/dubhe/anvilcraft/inventory/tooltip/StorageTooltip.java new file mode 100644 index 0000000000..1b05e02f23 --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/inventory/tooltip/StorageTooltip.java @@ -0,0 +1,9 @@ +package dev.dubhe.anvilcraft.inventory.tooltip; + +import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.world.item.ItemStack; + +import java.util.List; + +public record StorageTooltip(int usedTypes, int typeLimit, List types) implements TooltipComponent { +} diff --git a/src/main/java/dev/dubhe/anvilcraft/item/AnvilHammerItem.java b/src/main/java/dev/dubhe/anvilcraft/item/AnvilHammerItem.java index 3339a13fa3..5145b23c3b 100644 --- a/src/main/java/dev/dubhe/anvilcraft/item/AnvilHammerItem.java +++ b/src/main/java/dev/dubhe/anvilcraft/item/AnvilHammerItem.java @@ -4,6 +4,9 @@ import dev.dubhe.anvilcraft.api.hammer.HammerManager; import dev.dubhe.anvilcraft.api.hammer.IHammerChangeable; import dev.dubhe.anvilcraft.api.hammer.IHammerRemovable; +import dev.dubhe.anvilcraft.block.container.storage.CrateBlock; +import dev.dubhe.anvilcraft.block.container.storage.LargeCrateBlock; +import dev.dubhe.anvilcraft.block.entity.storage.StorageBlockEntity; import dev.dubhe.anvilcraft.client.AnvilCraftClient; import dev.dubhe.anvilcraft.init.ModMenuTypes; import dev.dubhe.anvilcraft.init.block.ModBlockTags; @@ -19,6 +22,7 @@ import dev.dubhe.anvilcraft.util.BreakBlockUtil; import dev.dubhe.anvilcraft.util.InfiniteFluidTankBreakProtection; import dev.dubhe.anvilcraft.util.TriggerUtil; +import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.Component; @@ -118,6 +122,19 @@ private static void breakBlock(ServerPlayer player, BlockPos pos, ServerLevel le InfiniteFluidTankBreakProtection.showToolBreakDenied(player); return; } + BlockState mainState = level.getBlockState(pos); + Block mainBlock = mainState.getBlock(); + if ( + (mainBlock instanceof CrateBlock || mainBlock instanceof LargeCrateBlock) + && level.getBlockEntity(pos) instanceof StorageBlockEntity storage + && storage.getTotalCount() > 1000 + ) { + player.displayClientMessage( + Component.translatable("screen.anvilcraft.tooltip.crate.hammer_break_denied").withStyle(ChatFormatting.RED), + true + ); + return; + } state = level.getBlockState(pos); block = state.getBlock(); BlockPos posToRemove = pos; @@ -125,8 +142,8 @@ private static void breakBlock(ServerPlayer player, BlockPos pos, ServerLevel le BlockEvent.BreakEvent breakEvent = new BlockEvent.BreakEvent(level, posToRemove, state, player); NeoForge.EVENT_BUS.post(breakEvent); if (breakEvent.isCanceled()) return; - final List drops = player.isCreative() ? List.of() : BreakBlockUtil.dropSilkTouch(level, pos); block.playerWillDestroy(level, posToRemove, state, player); + final List drops = player.isCreative() ? List.of() : BreakBlockUtil.dropSilkTouch(level, pos); level.destroyBlock(posToRemove, false); if (player.isCreative()) return; if (!player.isAlive() && player.hasDisconnected()) { diff --git a/src/main/java/dev/dubhe/anvilcraft/rpc/StorageServerStub.java b/src/main/java/dev/dubhe/anvilcraft/rpc/StorageServerStub.java index 20545807c9..e1cbe06be3 100644 --- a/src/main/java/dev/dubhe/anvilcraft/rpc/StorageServerStub.java +++ b/src/main/java/dev/dubhe/anvilcraft/rpc/StorageServerStub.java @@ -46,9 +46,11 @@ import net.neoforged.neoforge.server.ServerLifecycleHooks; import java.lang.reflect.Method; +import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; +import java.util.Deque; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -61,6 +63,7 @@ public final class StorageServerStub { private static final int MAX_PLAYER_STUBS = 5; private static final int MAX_SYNC_SLOTS = 256; + private static final int MAX_UNDO_RECORDS = 4; private static final ThreadLocal REGISTRIES = new ThreadLocal<>(); @SuppressWarnings("unused") public static final StreamCodec ORDER_STREAM_CODEC = ByteBufCodecs.VAR_INT @@ -72,6 +75,9 @@ public final class StorageServerStub { private long version; private long orderVersion; private final Map orders = new HashMap<>(); + private final Deque undoRecords = new ArrayDeque<>(); + private final Map undoGroup = new HashMap<>(); + private boolean undoingGroup; private static HolderLookup.Provider getAndClear() { HolderLookup.Provider registries = StorageServerStub.REGISTRIES.get(); @@ -142,7 +148,7 @@ public static InteractionResult interact(UUID playerId, long sourcePos, int slot ItemStack carried = player.inventoryMenu.getCarried(); boolean changed = false; if (action == StorageInput.QUICK_MOVE_TO_STORAGE) { - changed = StorageServerStub.moveInventoryStackToStorage(player, view, slot); + changed = StorageServerStub.moveInventoryStackToStorage(player, view, slot) > 0; } else if (action == StorageInput.CLONE) { if ( player.hasInfiniteMaterials() @@ -185,10 +191,118 @@ public static InteractionResult interact(UUID playerId, long sourcePos, int slot return new InteractionResult(carried, changed); } + @RemoteCallable(validator = StorageAccessValidator.class) + public static boolean clonePut( + UUID playerId, + long sourcePos, + @CallableParam(clazz = StorageServerStub.class, field = "ORDER_STREAM_CODEC") IntList slots + ) { + if (slots.isEmpty() || slots.size() > StorageServerStub.MAX_SYNC_SLOTS) { + StorageServerStub.REGISTRIES.remove(); + throw new IllegalArgumentException("Invalid clone put slots"); + } + StorageView view = StorageServerStub.getView(StorageServerStub.getAndClear(), playerId, sourcePos); + ServerPlayer player = StorageServerStub.getServerPlayer(playerId); + ItemStack carried = player.inventoryMenu.getCarried(); + if (!player.hasInfiniteMaterials() || carried.isEmpty()) { + return false; + } + boolean changed = false; + for (int index : slots) { + if (index < 0 || index >= view.size()) { + continue; + } + if (view.insert(carried.copyWithCount(1), carried.getMaxStackSize()) > 0) { + changed = true; + } + } + if (changed) { + player.getInventory().setChanged(); + player.inventoryMenu.broadcastChanges(); + } + return changed; + } + + @RemoteCallable(validator = StorageAccessValidator.class) + public static boolean quickMoveToStorage( + UUID playerId, + long sourcePos, + @CallableParam(clazz = StorageServerStub.class, field = "ORDER_STREAM_CODEC") IntList slots + ) { + if (slots.isEmpty() || slots.size() > StorageServerStub.MAX_SYNC_SLOTS) { + StorageServerStub.REGISTRIES.remove(); + throw new IllegalArgumentException("Invalid quick move slots"); + } + StorageView view = StorageServerStub.getView(StorageServerStub.getAndClear(), playerId, sourcePos); + ServerPlayer player = StorageServerStub.getServerPlayer(playerId); + final StorageServerStub stub = StorageServerStub.get(playerId, view.primary().getId()); + Map moved = new HashMap<>(); + boolean changed = false; + IntOpenHashSet visited = new IntOpenHashSet(slots.size()); + for (int slot : slots) { + if (slot < 0 || !visited.add(slot)) { + continue; + } + ItemStack stack = player.getInventory().getItem(slot); + if (stack.isEmpty()) { + continue; + } + ItemStack key = stack.copyWithCount(1); + int inserted = StorageServerStub.moveInventoryStackToStorage(player, view, slot); + if (inserted > 0) { + moved.merge(key, inserted, Integer::sum); + changed = true; + } + } + if (changed) { + StorageServerStub.recordUndo(stub, moved); + player.getInventory().setChanged(); + player.inventoryMenu.broadcastChanges(); + } + return changed; + } + + @RemoteCallable(validator = StorageAccessValidator.class) + public static boolean moveSameToStorage(UUID playerId, long sourcePos, int slot) { + StorageView view = StorageServerStub.getView(StorageServerStub.getAndClear(), playerId, sourcePos); + ServerPlayer player = StorageServerStub.getServerPlayer(playerId); + final StorageServerStub stub = StorageServerStub.get(playerId, view.primary().getId()); + Inventory inventory = player.getInventory(); + if (slot < 0 || slot >= Inventory.INVENTORY_SIZE) { + return false; + } + ItemStack sample = inventory.getItem(slot).copyWithCount(1); + if (sample.isEmpty()) { + return false; + } + Map moved = new HashMap<>(); + boolean changed = false; + for (int index = 0; index < Inventory.INVENTORY_SIZE; index++) { + ItemStack stack = inventory.getItem(index); + if (stack.isEmpty() || !ItemStack.isSameItemSameComponents(stack, sample)) { + continue; + } + int inserted = view.insert(stack.copyWithCount(1), stack.getCount()); + if (inserted > 0) { + moved.merge(stack.copyWithCount(1), inserted, Integer::sum); + stack.shrink(inserted); + changed = true; + } + } + if (changed) { + StorageServerStub.recordUndo(stub, moved); + inventory.setChanged(); + player.inventoryMenu.broadcastChanges(); + } + return changed; + } + @RemoteCallable(validator = StorageAccessValidator.class) public static DepositResult deposit(UUID playerId, long sourcePos, boolean all) { StorageView view = StorageServerStub.getView(StorageServerStub.getAndClear(), playerId, sourcePos); ServerPlayer player = StorageServerStub.getServerPlayer(playerId); + final StorageServerStub stub = StorageServerStub.get(playerId, view.primary().getId()); + Map moved = new HashMap<>(); boolean changed = false; for (int slot = Inventory.getSelectionSize(); slot < Inventory.INVENTORY_SIZE; slot++) { ItemStack stack = player.getInventory().getItem(slot); @@ -197,17 +311,133 @@ public static DepositResult deposit(UUID playerId, long sourcePos, boolean all) } int inserted = view.insert(stack.copyWithCount(1), stack.getCount()); if (inserted > 0) { + moved.merge(stack.copyWithCount(1), inserted, Integer::sum); stack.shrink(inserted); changed = true; } } if (changed) { + StorageServerStub.recordUndo(stub, moved); player.getInventory().setChanged(); player.inventoryMenu.broadcastChanges(); } return new DepositResult(changed); } + @RemoteCallable(validator = StorageAccessValidator.class) + public static DepositResult undo(UUID playerId, long sourcePos) { + StorageView view = StorageServerStub.getView(StorageServerStub.getAndClear(), playerId, sourcePos); + ServerPlayer player = StorageServerStub.getServerPlayer(playerId); + StorageServerStub stub = StorageServerStub.get(playerId, view.primary().getId()); + UndoRecord record = stub.undoRecords.pollFirst(); + if (record == null) { + return new DepositResult(false); + } + Inventory inventory = player.getInventory(); + int emptySlots = 0; + for (int slot = 0; slot < Inventory.INVENTORY_SIZE; slot++) { + if (inventory.getItem(slot).isEmpty()) { + emptySlots++; + } + } + boolean changed = false; + for (Map.Entry entry : record.moved.entrySet()) { + ItemStack resource = entry.getKey(); + int needed = entry.getValue(); + int maxStack = inventory.getMaxStackSize(resource); + int stackSpace = StorageServerStub.getStackSpace(inventory, resource); + int fit = Math.min(needed, stackSpace + emptySlots * maxStack); + int extract = Math.min(fit, StorageServerStub.countInStorage(view, resource, fit)); + if (extract <= 0) { + continue; + } + int beyondStacks = Math.max(0, extract - stackSpace); + emptySlots -= (beyondStacks + maxStack - 1) / maxStack; + int extracted = StorageServerStub.extractByResource(view, resource, extract); + if (extracted > 0) { + ItemStack returned = resource.copyWithCount(extracted); + if (!player.addItem(returned)) { + view.insert(returned.copyWithCount(1), returned.getCount()); + } + changed = true; + } + } + if (changed) { + inventory.setChanged(); + player.inventoryMenu.broadcastChanges(); + } + return new DepositResult(changed); + } + + private static int getStackSpace(Inventory inventory, ItemStack resource) { + int space = 0; + int maxStack = inventory.getMaxStackSize(resource); + for (int slot = 0; slot < Inventory.INVENTORY_SIZE; slot++) { + ItemStack stack = inventory.getItem(slot); + if (ItemStack.isSameItemSameComponents(stack, resource)) { + space += maxStack - stack.getCount(); + } + } + return space; + } + + private static int countInStorage(StorageView view, ItemStack resource, int limit) { + int count = 0; + for (int index = 0; index < view.size() && count < limit; index++) { + if (view.amount(index) <= 0 || !ItemStack.isSameItemSameComponents(view.resource(index), resource)) { + continue; + } + count += view.amount(index); + } + return count; + } + + @RemoteCallable(validator = StorageAccessValidator.class) + public static void beginUndoGroup(UUID playerId, long sourcePos) { + StorageView view = StorageServerStub.getView(StorageServerStub.getAndClear(), playerId, sourcePos); + StorageServerStub stub = StorageServerStub.get(playerId, view.primary().getId()); + stub.undoGroup.clear(); + stub.undoingGroup = true; + } + + @RemoteCallable(validator = StorageAccessValidator.class) + public static void endUndoGroup(UUID playerId, long sourcePos) { + StorageView view = StorageServerStub.getView(StorageServerStub.getAndClear(), playerId, sourcePos); + StorageServerStub stub = StorageServerStub.get(playerId, view.primary().getId()); + if (!stub.undoingGroup) { + return; + } + stub.undoingGroup = false; + if (!stub.undoGroup.isEmpty()) { + StorageServerStub.pushUndo(stub, stub.undoGroup); + stub.undoGroup.clear(); + } + } + + @RemoteCallable(validator = StorageUsageValidator.class) + public static StorageUsage getStorageUsage(UUID playerId, UUID storageId) { + return Storages.get().get(storageId) + .map(storage -> { + UnlimitedItemStacksResourceHandler items = storage.getItems(); + List representatives = new ArrayList<>(); + for (int index = 0; index < items.size() && representatives.size() < 9; index++) { + if (items.getAmountAsLong(index) <= 0) continue; + ItemStack stack = items.getUnlimitedStackInSlot(index).toStack().copyWithCount(1); + if (StorageServerStub.containsType(representatives, stack)) continue; + representatives.add(stack); + } + return new StorageUsage(items.getTypeCount(), items.getTypeLimit(), representatives); + }) + .orElse(new StorageUsage(0, 0, List.of())); + } + + private static boolean containsType(List types, ItemStack stack) { + for (ItemStack type : types) { + if (ItemStack.isSameItemSameComponents(type, stack)) return true; + } + return false; + } + @RemoteCallable(validator = StorageAccessValidator.class) public static DepositResult take(UUID playerId, long sourcePos) { StorageView view = StorageServerStub.getView(StorageServerStub.getAndClear(), playerId, sourcePos); @@ -245,6 +475,37 @@ public static DepositResult take(UUID playerId, long sourcePos) { return new DepositResult(changed); } + private static void recordUndo(StorageServerStub stub, Map moved) { + if (moved.isEmpty()) { + return; + } + if (stub.undoingGroup) { + for (Map.Entry entry : moved.entrySet()) { + stub.undoGroup.merge(entry.getKey(), entry.getValue(), Integer::sum); + } + return; + } + StorageServerStub.pushUndo(stub, moved); + } + + private static void pushUndo(StorageServerStub stub, Map moved) { + stub.undoRecords.addFirst(new UndoRecord(moved)); + while (stub.undoRecords.size() > StorageServerStub.MAX_UNDO_RECORDS) { + stub.undoRecords.removeLast(); + } + } + + private static int extractByResource(StorageView view, ItemStack resource, int amount) { + int extracted = 0; + for (int index = 0; index < view.size() && extracted < amount; index++) { + if (view.amount(index) <= 0 || !ItemStack.isSameItemSameComponents(view.resource(index), resource)) { + continue; + } + extracted += view.extract(index, amount - extracted); + } + return extracted; + } + private static boolean matchesStorageItem(StorageView view, ItemStack stack) { for (int index = 0; index < view.size(); index++) { if (view.amount(index) > 0 && ItemStack.isSameItemSameComponents(view.resource(index), stack)) { @@ -254,25 +515,25 @@ private static boolean matchesStorageItem(StorageView view, ItemStack stack) { return false; } - private static boolean moveInventoryStackToStorage( + private static int moveInventoryStackToStorage( ServerPlayer player, StorageView view, int slot ) { Inventory inventory = player.getInventory(); if (slot < 0 || slot >= Inventory.INVENTORY_SIZE) { - return false; + return 0; } ItemStack stack = inventory.getItem(slot); if (stack.isEmpty()) { - return false; + return 0; } int inserted = view.insert(stack.copyWithCount(1), stack.getCount()); if (inserted <= 0) { - return false; + return 0; } stack.shrink(inserted); - return true; + return inserted; } private static boolean moveStorageStackToInventory( @@ -362,6 +623,22 @@ public static void clear() { StorageServerStub.STUBS.clear(); } + public static final class StorageUsageValidator implements IRemoteCallableValidator { + @Override + public boolean validate(IPayloadContext ctx, Method method, Object[] args) { + if ( + !(ctx.player() instanceof ServerPlayer player) + || args.length < 2 + || !(args[0] instanceof UUID playerId) + || !player.getGameProfile().getId().equals(playerId) + || !(args[1] instanceof UUID) + ) { + return false; + } + return true; + } + } + public static final class StorageAccessValidator implements IRemoteCallableValidator { @Override public boolean validate(IPayloadContext ctx, Method method, Object[] args) { @@ -433,6 +710,18 @@ public record Metadata(long version, long orderVersion, double fullness, Capacit ); } + public record StorageUsage(int usedTypes, int typeLimit, List types) { + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_INT, + StorageUsage::usedTypes, + ByteBufCodecs.VAR_INT, + StorageUsage::typeLimit, + ItemStack.OPTIONAL_STREAM_CODEC.apply(ByteBufCodecs.list()), + StorageUsage::types, + StorageUsage::new + ); + } + public record Capacity(int space, int spaceSize, int typeCount, int typeLimit) { public static final StreamCodec STREAM_CODEC = StreamCodec.composite( ByteBufCodecs.VAR_INT, @@ -487,6 +776,9 @@ public record DepositResult(boolean changed) { ); } + private record UndoRecord(Map moved) { + } + private static StorageServerStub get(UUID playerId, UUID storageId) { Collection stubs = StorageServerStub.STUBS.get(playerId); StorageServerStub cached = null;