From c6be9dc9e27000420ede940ddbeaa5eab454393d Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Wed, 18 Sep 2024 02:52:22 -0400 Subject: [PATCH 01/10] Quantum Storage Fixes (#1976) --- .../gtceu/common/machine/storage/QuantumChestMachine.java | 2 +- .../gtceu/common/machine/storage/QuantumTankMachine.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java index 34d104c590..fd28c3939c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java @@ -304,7 +304,7 @@ public boolean onLeftClick(Player player, Level world, InteractionHand hand, Blo var drained = cache.extractItem(0, player.isShiftKeyDown() ? stored.getItem().getMaxStackSize() : 1, false); if (!drained.isEmpty()) { - if (player.addItem(drained)) { + if (!player.addItem(drained)) { Block.popResource(world, getPos().relative(getFrontFacing()), drained); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java index e2a8178699..05d319b7fe 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java @@ -132,7 +132,9 @@ public long fill(FluidStack resource, boolean simulate) { private long handleVoiding(long filled, FluidStack resource) { if (filled < resource.getAmount() && isVoiding && isFluidValid(0, resource)) { - return resource.getAmount(); + if (stored.isEmpty() || stored.isFluidEqual(resource)) { + return resource.getAmount(); + } } return filled; From 569eb616a745ed83c843b61d072e0ee8819f3f20 Mon Sep 17 00:00:00 2001 From: Karthi Suresh <75553966+JuiceyBeans@users.noreply.github.com> Date: Wed, 18 Sep 2024 21:58:46 +0400 Subject: [PATCH 02/10] Misc texture fixes (#1974) --- .../models/block/empty_tier_i_battery.json | 4 +- .../models/block/empty_tier_ii_battery.json | 4 +- .../models/block/empty_tier_iii_battery.json | 4 +- .../models/block/ev_lapotronic_battery.json | 4 +- .../gtceu/models/block/industrial_tnt.json | 2 +- .../models/block/iv_lapotronic_battery.json | 4 +- .../models/block/luv_lapotronic_battery.json | 4 +- .../models/block/uhv_ultimate_battery.json | 4 +- .../models/block/uv_lapotronic_battery.json | 4 +- .../models/block/zpm_lapotronic_battery.json | 4 +- .../gtceu/api/gui/GuiTextures.java | 8 ++-- .../gtceu/common/data/GTBlocks.java | 2 +- .../gtceu/common/data/GTModels.java | 4 +- .../block/machine/electric_gear_box_16a.json | 4 +- .../block/machine/electric_gear_box_2a.json | 4 +- .../block/machine/electric_gear_box_32a.json | 4 +- .../block/machine/electric_gear_box_8a.json | 4 +- .../machine/kinetic_electric_machine.json | 4 +- .../block/machine/part/kinetic_input_box.json | 4 +- .../machine/part/kinetic_output_box.json | 4 +- .../gtceu/textures/block/black_lamp.png | Bin 336 -> 0 bytes .../assets/gtceu/textures/block/blue_lamp.png | Bin 368 -> 0 bytes .../gtceu/textures/block/brown_lamp.png | Bin 364 -> 0 bytes ...{OVERLAY_SCREEN.png => overlay_screen.png} | Bin .../assets/gtceu/textures/block/cyan_lamp.png | Bin 380 -> 0 bytes .../assets/gtceu/textures/block/gray_lamp.png | Bin 339 -> 0 bytes .../gtceu/textures/block/green_lamp.png | Bin 331 -> 0 bytes .../block/lamps/light_gray.png.mcmeta | 2 +- .../lamps/light_gray_emissive.png.mcmeta | 2 +- .../block/lamps/light_gray_off.png.mcmeta | 2 +- .../gtceu/textures/block/light_blue_lamp.png | Bin 348 -> 0 bytes .../gtceu/textures/block/light_gray_lamp.png | Bin 382 -> 0 bytes .../assets/gtceu/textures/block/lime_lamp.png | Bin 328 -> 0 bytes .../fermenter/overlay_front_active.png.mcmeta | 10 ----- .../overlay_front_active_emissive.png.mcmeta | 10 ----- .../textures/block/{ => machines}/gearbox.png | Bin .../gtceu/textures/block/magenta_lamp.png | Bin 373 -> 0 bytes .../block/{ => misc}/industrial_tnt_side.png | Bin .../molybdenum_disilicide_coil_block.png | Bin 769 -> 0 bytes ...olybdenum_disilicide_coil_block.png.mcmeta | 5 --- .../molybdenum_disilicide_coil_block_ctm.png | Bin 2821 -> 0 bytes .../overlay_front_active.png.mcmeta | 10 ----- .../overlay_front_active_emissive.png.mcmeta | 10 ----- .../overlay_front_active.png.mcmeta | 10 ----- .../overlay_front_active_emissive.png.mcmeta | 10 ----- .../overlay_front_active.png.mcmeta | 10 ----- .../overlay_front_active_emissive.png.mcmeta | 10 ----- .../overlay_front_active.png.mcmeta | 10 ----- .../overlay_front_active_emissive.png.mcmeta | 10 ----- .../overlay_front_active.png.mcmeta | 10 ----- .../overlay_front_active_emissive.png.mcmeta | 10 ----- .../overlay_front_active.png.mcmeta | 10 ----- .../overlay_front_active_emissive.png.mcmeta | 10 ----- .../gtceu/textures/block/orange_lamp.png | Bin 335 -> 0 bytes .../assets/gtceu/textures/block/pink_lamp.png | Bin 367 -> 0 bytes .../gtceu/textures/block/purple_lamp.png | Bin 364 -> 0 bytes .../assets/gtceu/textures/block/red_lamp.png | Bin 369 -> 0 bytes .../textures/block/rubber_hanging_sign.png | Bin 1362 -> 0 bytes .../gtceu/textures/block/rubber_sign.png | Bin 1111 -> 0 bytes .../block/rubber_wall_hanging_sign.png | Bin 1362 -> 0 bytes .../gtceu/textures/block/rubber_wall_sign.png | Bin 1111 -> 0 bytes .../textures/block/storage/tank/metal_0.png | Bin 161 -> 0 bytes .../textures/block/storage/tank/metal_1.png | Bin 194 -> 0 bytes .../textures/block/storage/tank/metal_10.png | Bin 210 -> 0 bytes .../textures/block/storage/tank/metal_11.png | Bin 233 -> 0 bytes .../textures/block/storage/tank/metal_12.png | Bin 218 -> 0 bytes .../textures/block/storage/tank/metal_13.png | Bin 242 -> 0 bytes .../textures/block/storage/tank/metal_14.png | Bin 238 -> 0 bytes .../textures/block/storage/tank/metal_15.png | Bin 255 -> 0 bytes .../textures/block/storage/tank/metal_2.png | Bin 191 -> 0 bytes .../textures/block/storage/tank/metal_3.png | Bin 220 -> 0 bytes .../textures/block/storage/tank/metal_4.png | Bin 191 -> 0 bytes .../textures/block/storage/tank/metal_5.png | Bin 218 -> 0 bytes .../textures/block/storage/tank/metal_6.png | Bin 218 -> 0 bytes .../textures/block/storage/tank/metal_7.png | Bin 239 -> 0 bytes .../textures/block/storage/tank/metal_8.png | Bin 188 -> 0 bytes .../textures/block/storage/tank/metal_9.png | Bin 216 -> 0 bytes .../block/storage/tank/metal_background.png | Bin 221 -> 0 bytes .../block/storage/tank/metal_border.png | Bin 285 -> 0 bytes .../textures/block/storage/tank/wooden_0.png | Bin 161 -> 0 bytes .../textures/block/storage/tank/wooden_1.png | Bin 183 -> 0 bytes .../textures/block/storage/tank/wooden_10.png | Bin 203 -> 0 bytes .../textures/block/storage/tank/wooden_11.png | Bin 217 -> 0 bytes .../textures/block/storage/tank/wooden_12.png | Bin 203 -> 0 bytes .../textures/block/storage/tank/wooden_13.png | Bin 210 -> 0 bytes .../textures/block/storage/tank/wooden_14.png | Bin 220 -> 0 bytes .../textures/block/storage/tank/wooden_15.png | Bin 226 -> 0 bytes .../textures/block/storage/tank/wooden_2.png | Bin 187 -> 0 bytes .../textures/block/storage/tank/wooden_3.png | Bin 207 -> 0 bytes .../textures/block/storage/tank/wooden_4.png | Bin 189 -> 0 bytes .../textures/block/storage/tank/wooden_5.png | Bin 203 -> 0 bytes .../textures/block/storage/tank/wooden_6.png | Bin 208 -> 0 bytes .../textures/block/storage/tank/wooden_7.png | Bin 221 -> 0 bytes .../textures/block/storage/tank/wooden_8.png | Bin 182 -> 0 bytes .../textures/block/storage/tank/wooden_9.png | Bin 196 -> 0 bytes .../block/storage/tank/wooden_background.png | Bin 221 -> 0 bytes .../block/storage/tank/wooden_border.png | Bin 296 -> 0 bytes .../textures/block/stripped_rubber_wood.png | Bin 612 -> 565 bytes .../block/treated_wood_hanging_sign.png | Bin 623 -> 0 bytes .../entity/signs/hanging/treated_wood.png | Bin 936 -> 7069 bytes .../textures/entity/signs/treated_wood.png | Bin 826 -> 1254 bytes .../textures/gui/hanging_signs/rubber.png | Bin 0 -> 895 bytes .../gui/hanging_signs/treated_wood.png | Bin 0 -> 873 bytes .../assets/gtceu/textures/gui/rubber.png | Bin 567 -> 0 bytes .../gtceu/textures/hanging_signs/rubber.png | Bin 567 -> 0 bytes .../item/bioware.mainframe.png.mcmeta | 9 ---- .../gtceu/textures/item/data_stick.png.mcmeta | 5 ++- .../item/wetware_processor_mainframe.png | Bin 1042 -> 1461 bytes .../wetware_processor_mainframe.png.mcmeta | 40 +++++++++--------- 109 files changed, 66 insertions(+), 219 deletions(-) delete mode 100644 src/main/resources/assets/gtceu/textures/block/black_lamp.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/blue_lamp.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/brown_lamp.png rename src/main/resources/assets/gtceu/textures/block/cover/{OVERLAY_SCREEN.png => overlay_screen.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/cyan_lamp.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/gray_lamp.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/green_lamp.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/light_blue_lamp.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/light_gray_lamp.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lime_lamp.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/machines/fermenter/overlay_front_active.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/machines/fermenter/overlay_front_active_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/{ => machines}/gearbox.png (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/magenta_lamp.png rename src/main/resources/assets/gtceu/textures/block/{ => misc}/industrial_tnt_side.png (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/molybdenum_disilicide_coil_block.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/molybdenum_disilicide_coil_block.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/molybdenum_disilicide_coil_block_ctm.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/fluid_drilling_rig/overlay_front_active.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/fluid_drilling_rig/overlay_front_active_emissive.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_steel_boiler/overlay_front_active.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_steel_boiler/overlay_front_active_emissive.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_titanium_boiler/overlay_front_active.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_titanium_boiler/overlay_front_active_emissive.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/implosion_compressor/overlay_front_active.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/implosion_compressor/overlay_front_active_emissive.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/multi_furnace/overlay_front_active.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/multi_furnace/overlay_front_active_emissive.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/pyrolyse_oven/overlay_front_active.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/pyrolyse_oven/overlay_front_active_emissive.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/orange_lamp.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/pink_lamp.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/purple_lamp.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/red_lamp.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/rubber_hanging_sign.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/rubber_sign.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/rubber_wall_hanging_sign.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/rubber_wall_sign.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_0.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_1.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_10.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_11.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_12.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_13.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_14.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_15.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_2.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_3.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_4.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_5.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_6.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_7.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_8.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_9.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_background.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_border.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_0.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_1.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_10.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_11.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_12.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_13.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_14.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_15.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_2.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_3.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_4.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_5.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_6.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_7.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_8.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_9.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_background.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_border.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/treated_wood_hanging_sign.png create mode 100644 src/main/resources/assets/gtceu/textures/gui/hanging_signs/rubber.png create mode 100644 src/main/resources/assets/gtceu/textures/gui/hanging_signs/treated_wood.png delete mode 100644 src/main/resources/assets/gtceu/textures/gui/rubber.png delete mode 100644 src/main/resources/assets/gtceu/textures/hanging_signs/rubber.png delete mode 100644 src/main/resources/assets/gtceu/textures/item/bioware.mainframe.png.mcmeta diff --git a/src/generated/resources/assets/gtceu/models/block/empty_tier_i_battery.json b/src/generated/resources/assets/gtceu/models/block/empty_tier_i_battery.json index 8d725b683a..97b55dd87d 100644 --- a/src/generated/resources/assets/gtceu/models/block/empty_tier_i_battery.json +++ b/src/generated/resources/assets/gtceu/models/block/empty_tier_i_battery.json @@ -2,7 +2,7 @@ "parent": "minecraft:block/cube_bottom_top", "textures": { "bottom": "gtceu:block/casings/battery/empty_tier_i/top", - "side": "gtceu:block/casings/battery/empty_tier_i/top", - "top": "gtceu:block/casings/battery/empty_tier_i/side" + "side": "gtceu:block/casings/battery/empty_tier_i/side", + "top": "gtceu:block/casings/battery/empty_tier_i/top" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/empty_tier_ii_battery.json b/src/generated/resources/assets/gtceu/models/block/empty_tier_ii_battery.json index cb5bae8d09..496b354670 100644 --- a/src/generated/resources/assets/gtceu/models/block/empty_tier_ii_battery.json +++ b/src/generated/resources/assets/gtceu/models/block/empty_tier_ii_battery.json @@ -2,7 +2,7 @@ "parent": "minecraft:block/cube_bottom_top", "textures": { "bottom": "gtceu:block/casings/battery/empty_tier_ii/top", - "side": "gtceu:block/casings/battery/empty_tier_ii/top", - "top": "gtceu:block/casings/battery/empty_tier_ii/side" + "side": "gtceu:block/casings/battery/empty_tier_ii/side", + "top": "gtceu:block/casings/battery/empty_tier_ii/top" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/empty_tier_iii_battery.json b/src/generated/resources/assets/gtceu/models/block/empty_tier_iii_battery.json index b300ceaac7..21d890afc3 100644 --- a/src/generated/resources/assets/gtceu/models/block/empty_tier_iii_battery.json +++ b/src/generated/resources/assets/gtceu/models/block/empty_tier_iii_battery.json @@ -2,7 +2,7 @@ "parent": "minecraft:block/cube_bottom_top", "textures": { "bottom": "gtceu:block/casings/battery/empty_tier_iii/top", - "side": "gtceu:block/casings/battery/empty_tier_iii/top", - "top": "gtceu:block/casings/battery/empty_tier_iii/side" + "side": "gtceu:block/casings/battery/empty_tier_iii/side", + "top": "gtceu:block/casings/battery/empty_tier_iii/top" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/ev_lapotronic_battery.json b/src/generated/resources/assets/gtceu/models/block/ev_lapotronic_battery.json index 4849880502..af181216b9 100644 --- a/src/generated/resources/assets/gtceu/models/block/ev_lapotronic_battery.json +++ b/src/generated/resources/assets/gtceu/models/block/ev_lapotronic_battery.json @@ -2,7 +2,7 @@ "parent": "minecraft:block/cube_bottom_top", "textures": { "bottom": "gtceu:block/casings/battery/ev_lapotronic/top", - "side": "gtceu:block/casings/battery/ev_lapotronic/top", - "top": "gtceu:block/casings/battery/ev_lapotronic/side" + "side": "gtceu:block/casings/battery/ev_lapotronic/side", + "top": "gtceu:block/casings/battery/ev_lapotronic/top" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/industrial_tnt.json b/src/generated/resources/assets/gtceu/models/block/industrial_tnt.json index 21734bfa6a..3711dcc37e 100644 --- a/src/generated/resources/assets/gtceu/models/block/industrial_tnt.json +++ b/src/generated/resources/assets/gtceu/models/block/industrial_tnt.json @@ -2,7 +2,7 @@ "parent": "minecraft:block/cube_bottom_top", "textures": { "bottom": "minecraft:block/tnt_bottom", - "side": "gtceu:block/industrial_tnt_side", + "side": "gtceu:block/misc/industrial_tnt_side", "top": "minecraft:block/tnt_top" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/iv_lapotronic_battery.json b/src/generated/resources/assets/gtceu/models/block/iv_lapotronic_battery.json index 37e72e0f79..eeccabf47d 100644 --- a/src/generated/resources/assets/gtceu/models/block/iv_lapotronic_battery.json +++ b/src/generated/resources/assets/gtceu/models/block/iv_lapotronic_battery.json @@ -2,7 +2,7 @@ "parent": "minecraft:block/cube_bottom_top", "textures": { "bottom": "gtceu:block/casings/battery/iv_lapotronic/top", - "side": "gtceu:block/casings/battery/iv_lapotronic/top", - "top": "gtceu:block/casings/battery/iv_lapotronic/side" + "side": "gtceu:block/casings/battery/iv_lapotronic/side", + "top": "gtceu:block/casings/battery/iv_lapotronic/top" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/luv_lapotronic_battery.json b/src/generated/resources/assets/gtceu/models/block/luv_lapotronic_battery.json index 41e5dbcee4..5d01dec145 100644 --- a/src/generated/resources/assets/gtceu/models/block/luv_lapotronic_battery.json +++ b/src/generated/resources/assets/gtceu/models/block/luv_lapotronic_battery.json @@ -2,7 +2,7 @@ "parent": "minecraft:block/cube_bottom_top", "textures": { "bottom": "gtceu:block/casings/battery/luv_lapotronic/top", - "side": "gtceu:block/casings/battery/luv_lapotronic/top", - "top": "gtceu:block/casings/battery/luv_lapotronic/side" + "side": "gtceu:block/casings/battery/luv_lapotronic/side", + "top": "gtceu:block/casings/battery/luv_lapotronic/top" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/uhv_ultimate_battery.json b/src/generated/resources/assets/gtceu/models/block/uhv_ultimate_battery.json index c92f74c787..0abbfc3ec7 100644 --- a/src/generated/resources/assets/gtceu/models/block/uhv_ultimate_battery.json +++ b/src/generated/resources/assets/gtceu/models/block/uhv_ultimate_battery.json @@ -2,7 +2,7 @@ "parent": "minecraft:block/cube_bottom_top", "textures": { "bottom": "gtceu:block/casings/battery/uhv_ultimate/top", - "side": "gtceu:block/casings/battery/uhv_ultimate/top", - "top": "gtceu:block/casings/battery/uhv_ultimate/side" + "side": "gtceu:block/casings/battery/uhv_ultimate/side", + "top": "gtceu:block/casings/battery/uhv_ultimate/top" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/uv_lapotronic_battery.json b/src/generated/resources/assets/gtceu/models/block/uv_lapotronic_battery.json index 5bf09d6c21..399f927a2c 100644 --- a/src/generated/resources/assets/gtceu/models/block/uv_lapotronic_battery.json +++ b/src/generated/resources/assets/gtceu/models/block/uv_lapotronic_battery.json @@ -2,7 +2,7 @@ "parent": "minecraft:block/cube_bottom_top", "textures": { "bottom": "gtceu:block/casings/battery/uv_lapotronic/top", - "side": "gtceu:block/casings/battery/uv_lapotronic/top", - "top": "gtceu:block/casings/battery/uv_lapotronic/side" + "side": "gtceu:block/casings/battery/uv_lapotronic/side", + "top": "gtceu:block/casings/battery/uv_lapotronic/top" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/zpm_lapotronic_battery.json b/src/generated/resources/assets/gtceu/models/block/zpm_lapotronic_battery.json index f7203c0069..46c8402bcc 100644 --- a/src/generated/resources/assets/gtceu/models/block/zpm_lapotronic_battery.json +++ b/src/generated/resources/assets/gtceu/models/block/zpm_lapotronic_battery.json @@ -2,7 +2,7 @@ "parent": "minecraft:block/cube_bottom_top", "textures": { "bottom": "gtceu:block/casings/battery/zpm_lapotronic/top", - "side": "gtceu:block/casings/battery/zpm_lapotronic/top", - "top": "gtceu:block/casings/battery/zpm_lapotronic/side" + "side": "gtceu:block/casings/battery/zpm_lapotronic/side", + "top": "gtceu:block/casings/battery/zpm_lapotronic/top" } } \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/GuiTextures.java b/src/main/java/com/gregtechceu/gtceu/api/gui/GuiTextures.java index 6f6402b627..6e8e97cec2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/GuiTextures.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/GuiTextures.java @@ -49,11 +49,11 @@ public class GuiTextures { public static final ResourceTexture TOOL_DISABLE_AUTO_OUTPUT = new ResourceTexture( "gtceu:textures/gui/overlay/tool_disable_auto_output.png"); public static final ResourceTexture TOOL_SWITCH_CONVERTER_NATIVE = new ResourceTexture( - "gtceu:textures/gui/overlay/tool_wire_block.png"); // switch to tool_switch_converter_native once that gets - // made + "gtceu:textures/gui/overlay/tool_wire_block.png"); // todo switch to tool_switch_converter_native once that + // gets made public static final ResourceTexture TOOL_SWITCH_CONVERTER_EU = new ResourceTexture( - "gtceu:textures/gui/overlay/tool_wire_connect.png"); // switch to tool_switch_converter_eu once that gets - // made + "gtceu:textures/gui/overlay/tool_wire_connect.png"); // todo switch to tool_switch_converter_eu once that + // gets made // BASE TEXTURES public static final ResourceBorderTexture BACKGROUND = new ResourceBorderTexture( diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java index f6e82919bc..efdfa08f54 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java @@ -980,7 +980,7 @@ private static BlockEntry createFireboxCasing(BoilerFireboxType typ .properties(p -> p.mapColor(MapColor.FIRE).instabreak().sound(SoundType.GRASS).ignitedByLava()) .tag(BlockTags.MINEABLE_WITH_AXE) .blockstate((ctx, prov) -> prov.simpleBlock(ctx.get(), prov.models().cubeBottomTop(ctx.getName(), - prov.blockTexture(ctx.get()).withSuffix("_side"), + GTCEu.id("block/misc/industrial_tnt_side"), new ResourceLocation("minecraft", "block/tnt_bottom"), new ResourceLocation("minecraft", "block/tnt_top")))) .simpleItem() diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTModels.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTModels.java index e4b2e48589..49cd489948 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTModels.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTModels.java @@ -256,9 +256,9 @@ public static NonNullBiConsumer, RegistrateB IBatteryData batteryData) { return (ctx, prov) -> { prov.simpleBlock(ctx.getEntry(), prov.models().cubeBottomTop(name, + GTCEu.id("block/casings/battery/" + batteryData.getBatteryName() + "/side"), GTCEu.id("block/casings/battery/" + batteryData.getBatteryName() + "/top"), - GTCEu.id("block/casings/battery/" + batteryData.getBatteryName() + "/top"), - GTCEu.id("block/casings/battery/" + batteryData.getBatteryName() + "/side"))); + GTCEu.id("block/casings/battery/" + batteryData.getBatteryName() + "/top"))); }; } diff --git a/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_16a.json b/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_16a.json index 61f3a15388..376c5d7004 100644 --- a/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_16a.json +++ b/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_16a.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "gearbox": "gtceu:block/gearbox", + "gearbox": "gtceu:block/machines/gearbox", "bottom": "gtceu:block/casings/voltage/lv/bottom", "top": "gtceu:block/casings/voltage/lv/top", "particle": "gtceu:block/casings/voltage/lv/side", @@ -141,4 +141,4 @@ "children": [10, 11, 12, 13] } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_2a.json b/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_2a.json index 61f3a15388..376c5d7004 100644 --- a/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_2a.json +++ b/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_2a.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "gearbox": "gtceu:block/gearbox", + "gearbox": "gtceu:block/machines/gearbox", "bottom": "gtceu:block/casings/voltage/lv/bottom", "top": "gtceu:block/casings/voltage/lv/top", "particle": "gtceu:block/casings/voltage/lv/side", @@ -141,4 +141,4 @@ "children": [10, 11, 12, 13] } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_32a.json b/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_32a.json index 61f3a15388..376c5d7004 100644 --- a/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_32a.json +++ b/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_32a.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "gearbox": "gtceu:block/gearbox", + "gearbox": "gtceu:block/machines/gearbox", "bottom": "gtceu:block/casings/voltage/lv/bottom", "top": "gtceu:block/casings/voltage/lv/top", "particle": "gtceu:block/casings/voltage/lv/side", @@ -141,4 +141,4 @@ "children": [10, 11, 12, 13] } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_8a.json b/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_8a.json index 61f3a15388..376c5d7004 100644 --- a/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_8a.json +++ b/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_8a.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "gearbox": "gtceu:block/gearbox", + "gearbox": "gtceu:block/machines/gearbox", "bottom": "gtceu:block/casings/voltage/lv/bottom", "top": "gtceu:block/casings/voltage/lv/top", "particle": "gtceu:block/casings/voltage/lv/side", @@ -141,4 +141,4 @@ "children": [10, 11, 12, 13] } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/models/block/machine/kinetic_electric_machine.json b/src/main/resources/assets/gtceu/models/block/machine/kinetic_electric_machine.json index 3cc33c85d4..6c10dcaa71 100644 --- a/src/main/resources/assets/gtceu/models/block/machine/kinetic_electric_machine.json +++ b/src/main/resources/assets/gtceu/models/block/machine/kinetic_electric_machine.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "gearbox": "gtceu:block/gearbox", + "gearbox": "gtceu:block/machines/gearbox", "bottom": "gtceu:block/casings/voltage/lv/bottom", "top": "gtceu:block/casings/voltage/lv/top", "particle": "gtceu:block/casings/voltage/lv/side", @@ -135,4 +135,4 @@ "children": [10, 11, 12, 13] } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/models/block/machine/part/kinetic_input_box.json b/src/main/resources/assets/gtceu/models/block/machine/part/kinetic_input_box.json index 5f5e596559..0fb707de57 100644 --- a/src/main/resources/assets/gtceu/models/block/machine/part/kinetic_input_box.json +++ b/src/main/resources/assets/gtceu/models/block/machine/part/kinetic_input_box.json @@ -3,7 +3,7 @@ "parent": "block/block", "textures": { "overlay": "gtceu:block/overlay/machine/overlay_pipe_in", - "gearbox": "gtceu:block/gearbox", + "gearbox": "gtceu:block/machines/gearbox", "bottom": "gtceu:block/casings/voltage/lv/bottom", "top": "gtceu:block/casings/voltage/lv/top", "particle": "gtceu:block/casings/voltage/lv/side", @@ -152,4 +152,4 @@ "children": [11, 12, 13, 14] } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/models/block/machine/part/kinetic_output_box.json b/src/main/resources/assets/gtceu/models/block/machine/part/kinetic_output_box.json index 1a2d2843bb..ca0aafa82f 100644 --- a/src/main/resources/assets/gtceu/models/block/machine/part/kinetic_output_box.json +++ b/src/main/resources/assets/gtceu/models/block/machine/part/kinetic_output_box.json @@ -3,7 +3,7 @@ "parent": "block/block", "textures": { "overlay": "gtceu:block/overlay/machine/overlay_pipe_out", - "gearbox": "gtceu:block/gearbox", + "gearbox": "gtceu:block/machines/gearbox", "bottom": "gtceu:block/casings/voltage/lv/bottom", "top": "gtceu:block/casings/voltage/lv/top", "particle": "gtceu:block/casings/voltage/lv/side", @@ -152,4 +152,4 @@ "children": [11, 12, 13, 14] } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/black_lamp.png b/src/main/resources/assets/gtceu/textures/block/black_lamp.png deleted file mode 100644 index 77f2d80c66251a967e0df8450669daa243b8759d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 336 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!Ka=sjv*HQQztv}H5mvng!9X-VK<%b*bXIJLn;IFZ)0s4LiP-itn{?k~?2olyn)ocH`0Dw)zn^)foH?&`ddVIS zTQ#dc%DK-AYOdYm%V1?m(-VCD?9sALJ)KEY&t2ELF4^(%zP*;^bal_^rL0qAwQrxP zwb-$XwPWJ`g`5>uM^0=@>r?yi&&-4GWr#sY+c%!J6MI+}`z9PYl_PD%nUs3(#(8Ix zUnws_9JU4g&~8t6Nd6Eh};mjH$hQZl_EVKWg3R fmff~}^9k-fjVqoXIv(^0=wSv=S3j3^P6>XYR+{Yfhy zR^EKGb&EcKu*CZRg5N2Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0Rc%wK~y+Tm6P2H zf~qqJ+rPTl&uG3*V*}wv%8M9-K^hK z$#tA+)-6#K)r^P@!ugz5c|?9N=Aa*Vl%+Y3P3c&4I@8fxQk*2pVCTFT#-bmnDqK&Q ziTutZgc#nlv|y7%F(eyho5FfT9vHATN2N^QZ(;+zR})yTX@(7OIDO!zS{3w#q52H^ zz_%gq&Y%1!2<2LIz1(E%!7!Rh2%(yZv!wdBGtmc*-?1L;T4xvl0000< KMNUMnLSTY2#+VNP diff --git a/src/main/resources/assets/gtceu/textures/block/cover/OVERLAY_SCREEN.png b/src/main/resources/assets/gtceu/textures/block/cover/overlay_screen.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/cover/OVERLAY_SCREEN.png rename to src/main/resources/assets/gtceu/textures/block/cover/overlay_screen.png diff --git a/src/main/resources/assets/gtceu/textures/block/cyan_lamp.png b/src/main/resources/assets/gtceu/textures/block/cyan_lamp.png deleted file mode 100644 index 2f48f3b2777fea43d3749996a27482bf2298886b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 380 zcmV-?0fYXDP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0TD?=K~y+Tm6I`U z!axv3f1m-3P?{)EQ$#e8%mvct3OPnDzy)#)u0YQTD5$6?Vv;%Y2S+%ygTT#h%UJ7XfEe_;T})m+&}iodjaGo<*UDIw#^Tiq?~5_M zqbN6+y?qMI#h~*j$xR3EGDyW3-|Z$AlW_Wl8n^8W>&QGZWNQ-5mTPpm7e!Rvf~nFD=vD;o!KE6oG5A|D zNYDr7*Arude_hZ00008OaIMyuwW_2n?>v| z)L!sbhrU!=s4#Vp0QYBU*_*1Hzc!q)di^sdJZx@X`z))lefN8hRf@TqD?Mt66}i|w zO{7iHeCxF-sgmKsFOL@baIbnXOC|S!*{#hzo}8Rb4cYUa$1qmy@V`98Iqzg^TEw>1 zI-=(vHd#N;YwosTVL!2b*9jwaKK6v-Whd0GaV>TTi?4%118{5$zf?u>bM?YeuWmGj)aG__7|nw=#%>0{ZIFNObWXZR>AP(R(4 iBdhk#%*Xzmi~MY{nayW}f6D;<%;4$j=d#Wzp$P!X1cx{P diff --git a/src/main/resources/assets/gtceu/textures/block/green_lamp.png b/src/main/resources/assets/gtceu/textures/block/green_lamp.png deleted file mode 100644 index 5c5ab75869f55fd15f3a8d713d717a4ce369cf5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!3Ul$jv*HQOD7-XYH|>0Q+I6cIakJMRmEvl z_U5GZHxAimjxRA%OWHr(zAM>pa>4lq|R@GCZDl&@VI$-(+|eu@`!RPY}GwYg9J`Yk(~uye-#6IpAf%q@Mr zaO+&bjR$o+J=T90X;=31Q+Gb~PW1RTmGWH~LG8SEFI|yvxvhLSq9;eNFe52$7KdW{ z^F?|LYDe>28Bcv{RZWtY*wE-XTjdICy^!>Y$l8QR;Wpk2bLA?xXjCXDw(7*ALQIGBav{Io3{5{*BKb@>E8s5;&IQjF| qM~%Kl3Jf!neG?2W%)dVK1#j%E$^74@9ykc}JcFmJpUXO@geCwkKZOYZ diff --git a/src/main/resources/assets/gtceu/textures/block/light_gray_lamp.png b/src/main/resources/assets/gtceu/textures/block/light_gray_lamp.png deleted file mode 100644 index 79288252899e5871400a381b149b84a8f44ff601..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 382 zcmV-^0fGLBP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0TW3?K~y+Tm6OeC z0x=YYk12>cGx!7A5%dANDRkq)ZK2yffG^`K`4U|ex-MP0D$S}R8jHG7&+Xh{22_#* z;U*{f?%WBvwWr62BXY%2l+SLt?f#C>i1F^8+D diff --git a/src/main/resources/assets/gtceu/textures/block/lime_lamp.png b/src/main/resources/assets/gtceu/textures/block/lime_lamp.png deleted file mode 100644 index c3b986bb08b4994290c7eb07bbacc2b115e7f09a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 328 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!MmO=jv*HQOD8+>H5mxFx=(ZJvHr-B<73m* z{!wC`O&gHRyW6?0hjE%#{w+llDV>k%XQybsH=cXxWL4;%Bii1<_R?XY*Xz_4v7NS= z{`{N9%{!{gb93J5eM{YWJ5t3m=Sk4Ca|s)*HP0la8x?P?+|hC3W6V~!88P2mRi?;t zM?bNZ)t$YgMCOlgRzh`eWA0fA(+kgf8h&$WNpLS-$DW+vckqhjjHJYEy-dv!H~M62 zO)i?SEMCBL=hp#!ix-UI&G#p%B=DTM-nk))QJh&=de;kfqXyI2hZoqd-+V&)FVdQ&MBb@0J)NY5C8xG diff --git a/src/main/resources/assets/gtceu/textures/block/machines/fermenter/overlay_front_active.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/machines/fermenter/overlay_front_active.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/machines/fermenter/overlay_front_active.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/machines/fermenter/overlay_front_active_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/machines/fermenter/overlay_front_active_emissive.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/machines/fermenter/overlay_front_active_emissive.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/gearbox.png b/src/main/resources/assets/gtceu/textures/block/machines/gearbox.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/gearbox.png rename to src/main/resources/assets/gtceu/textures/block/machines/gearbox.png diff --git a/src/main/resources/assets/gtceu/textures/block/magenta_lamp.png b/src/main/resources/assets/gtceu/textures/block/magenta_lamp.png deleted file mode 100644 index da6872b464531db448d33a30c52bb7ee6d481ee1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc4P2fsjv*HQQzu(<9dZz8bJxA@=GrsQ!IdTd zf$W~P-l=QXPVK$^fp4C}1_751LZ%#c2V#RGUi?dT6Z)|6r{bBkvVHcyPb`T#d#l+g zbt;$p{-wQ~?k+h2-)vs_{C=`hMqOLW-@5pb#MCEg?WVrBoNxX9cY48Y8N(h=f6*Ng zXKIR{aVWNz-U3GF>LNbDoLQU0^ggI>YcgI+-*tP4bdV$*pHuM=xw|&W*!_1I(FMOwFHT?OSaaT3WrCk=BF=GZ=AQ`o`aB( RJ}{^lJYD@<);T3K0RWaUlji^c diff --git a/src/main/resources/assets/gtceu/textures/block/industrial_tnt_side.png b/src/main/resources/assets/gtceu/textures/block/misc/industrial_tnt_side.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/industrial_tnt_side.png rename to src/main/resources/assets/gtceu/textures/block/misc/industrial_tnt_side.png diff --git a/src/main/resources/assets/gtceu/textures/block/molybdenum_disilicide_coil_block.png b/src/main/resources/assets/gtceu/textures/block/molybdenum_disilicide_coil_block.png deleted file mode 100644 index db354b252f21acb6775cd11220e96d49c1d76da2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 769 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 diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/fluid_drilling_rig/overlay_front_active.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/multiblock/fluid_drilling_rig/overlay_front_active.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/multiblock/fluid_drilling_rig/overlay_front_active.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/fluid_drilling_rig/overlay_front_active_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/multiblock/fluid_drilling_rig/overlay_front_active_emissive.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/multiblock/fluid_drilling_rig/overlay_front_active_emissive.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_steel_boiler/overlay_front_active.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_steel_boiler/overlay_front_active.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_steel_boiler/overlay_front_active.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_steel_boiler/overlay_front_active_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_steel_boiler/overlay_front_active_emissive.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_steel_boiler/overlay_front_active_emissive.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_titanium_boiler/overlay_front_active.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_titanium_boiler/overlay_front_active.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_titanium_boiler/overlay_front_active.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_titanium_boiler/overlay_front_active_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_titanium_boiler/overlay_front_active_emissive.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_titanium_boiler/overlay_front_active_emissive.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/implosion_compressor/overlay_front_active.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/multiblock/implosion_compressor/overlay_front_active.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/multiblock/implosion_compressor/overlay_front_active.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/implosion_compressor/overlay_front_active_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/multiblock/implosion_compressor/overlay_front_active_emissive.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/multiblock/implosion_compressor/overlay_front_active_emissive.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/multi_furnace/overlay_front_active.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/multiblock/multi_furnace/overlay_front_active.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/multiblock/multi_furnace/overlay_front_active.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/multi_furnace/overlay_front_active_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/multiblock/multi_furnace/overlay_front_active_emissive.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/multiblock/multi_furnace/overlay_front_active_emissive.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/pyrolyse_oven/overlay_front_active.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/multiblock/pyrolyse_oven/overlay_front_active.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/multiblock/pyrolyse_oven/overlay_front_active.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/pyrolyse_oven/overlay_front_active_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/multiblock/pyrolyse_oven/overlay_front_active_emissive.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/multiblock/pyrolyse_oven/overlay_front_active_emissive.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/orange_lamp.png b/src/main/resources/assets/gtceu/textures/block/orange_lamp.png deleted file mode 100644 index 9ccca32548fcbd43ff46e47b286212ab1e23bacb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!6%+Bjv*HQQzviaYcddM^H)>magZn|D^e`{ zwlb!MLwx?J@`A)^5==Z-c4YojGGKx<=+`DEw zd(M4pu7GXYI)bkcH1Jxie#-P;Ncu!vY{E?8Hr@gYyA7JFnc^j8ojbsOOt(Xgd7^et zuJg1;?H=jbwk{Wicp^m)oMriU@S5ZT!w=C)oEKP+U620TFgI5%m|?=?O^nfJk3{PJ dFH`%)G<)Wvn@svibAkS4@O1TaS?83{1OVVrff)b* diff --git a/src/main/resources/assets/gtceu/textures/block/pink_lamp.png b/src/main/resources/assets/gtceu/textures/block/pink_lamp.png deleted file mode 100644 index a89851610672483dd85b26ede7c8b9c1f0dda5c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 367 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc4J@86jv*HQQzzSU9dZz8Rga3uNMsU9*3VF` zVD?YRPfvf}xu>DGwWDM1Pe%_f^A!;p_f&+<6n0e#q#5tNfBH?{u~~k{^0lsHZtuRB zztTk4%_Zl-*WV`feJ2WS{jAar`K%Lk z=dj#!Jn(>8cZxIblw2 diff --git a/src/main/resources/assets/gtceu/textures/block/purple_lamp.png b/src/main/resources/assets/gtceu/textures/block/purple_lamp.png deleted file mode 100644 index 9ffa35898f45b09a62dd49bba1708845e6948acf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc4UC>Hjv*HQQzxJ2JLn*AY`M&JR>!@JN|W|A zh8Go;mVWZO=is8EcgMvvkS~^x?~S?DCEq_c|4vHVw)yk#UG-LuCNJzX!d+L^e2JcU z?Po^^@2y0Shc!OFp-)r1ufA9j+~?|P486b1RBn;E zCtRB}*)`ooRp++ov<@qm4XWp)b{?32gl$u}c*L`oL}r;j{+KCSnc^j?<~Q>9L<{WY zby;VyjW?2Qok8B4*NRZgXhmQ52ljFkEK@{b+Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0R~A#K~y+Tm6Oj7 z!9Wnkrxh;hLPT90#KooJB|MCGkVw3Phw&8RB;qL4p)R&a#h?AAou&<8`z4#*ozCy; zbhl#-z5a_5In`>i`YjcP$%=>#+OA9E#g-biG6yjS=X<&rNo=#f(0tURgYU-%vz6ip zJe&$A*PR$XsXNaQV%P^NVv~vIkd3lUVVRMKe6Ti0wM^h|VgtBACa^pch7E8yMc}M* z6%>V`^bCr?xCK#aATovV*-*~F6qaj*J`Pdz3x;wPz%2{>g|laX#=vihAV3osZ^r;z zYPXux^`JxD<&mz@Lnmkhi+GK}5X#lDU2xN}C-2crN~yS+I7_Q|I}^PDotCja0TZh- P00000NkvXXu0mjfHnx{i diff --git a/src/main/resources/assets/gtceu/textures/block/rubber_hanging_sign.png b/src/main/resources/assets/gtceu/textures/block/rubber_hanging_sign.png deleted file mode 100644 index 02e77aabd0c7ae7461e172e1feec0acc07b83400..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1362 zcmV-Y1+DstP)r683lD54ZWX%I>fN)a0q9Q%B?cl%@JQS9yd{3CH} zu-6j#N~_h*zVGgv_ukCB_mqe*iqAiNPXO*LpQ6>C;-$uICdWdSA9exov;v?R1%wU5 zt@|(1YESWM^b7GIXROr#;K$pBlP9KmfOUd(g6An#*WyYpNiEILRD6J?<&{18rChre68JmRIdquq z1MwiI85-7sUU!wr>5wF~^amM%uW7eJ0G^wOX!ssWL%FPFX+}ZCFEKg(WPXVx$*|TQ z?re9#4wEaT=qHxdhkvrPyh4&%oO6f>%_yMT8<1s|^-dq4k}Ew}@=ui2Er?YSCIVG1kC09_!r%fCuT@^t!9O zHu1+6zUL|O+~IkOxS#SMJ70Zol;3U!Xa$|_fMyhMw^RK0-P0?qZ49{j-OWR_iq3O~ zQpG2wN6a0yUNn?3UNQhImq&2UB~^DEVosdmvYkYZZWRzgjr@cs>C1(((#t z&RvkvwFt$8W@hJQW_Dg4!>uqgJ1^I-T~(#`7H<>=Jv6QVL#XX}K#4LU_KJ*|*?DQT zr?`9fS4z1{b62D^#=nWGqrhVi-t7^w8)jzbW${K4>Z23Ae(h>C_B0VxCrs%rfO0Y= zc3T=HF3nw$Qf4PkUYb@baF#Ql|XJalEQM;Ip~& zGS+JF_gaylw3`O!Kx=qms?B<*Pp_X<>1w+b(v4F(8w1AM0cqyg5C6;WZyk$>sB%`V zA#27GpGF!!StlVP;pzC@ogGHe2P_Za9JbV-r1_sabs`6E9&E!~!bw&85X-+!y zdb=6mq%dA1@b=9QMykQOprg9EMDUUW1a%(Y0lO)*|etCD!(diDh z@U3-pdMShS7(~EmKfsQh@kx?nhstNUtNH=Ovqe!nJGYtYTU&T~trMe_s`>#U;2eku zaX-a6M>8~4@32nj@v#uCigVfXbai}{N0dnM&Nm7X!P?Db;1N485LZw#pmogf2TWBE=3}ZcHMD@>*?9$~qwmeR^@>RnOByPdoBla8iW6QVJ(R zJjhUritijmp^tNgAo=<>QgA$mChkH9biSE6tA^^+U3IGNz2}ys zlmPhXgWJhki*pVD#9)ok_nr_F+gmlx1@7MaiyPN30pMItMPt!W8G9%BGzV`r3>H_BjnOd68QDm03^N1P#nX3WdB>7)_^~>`K@Zo#6 zlJkMORQ6{blPWtNRBP}d0-mX5<<&DsY?Z5wrF`_ zyC%<-w)4k3P?f`^n$}U*Ib9#fR48)Gy79+C)f(zjaUpRqYq_vl0Zu%*8c)3&l1`o(@?4oz z7Hfwe7nwyw2qCezKR;Gmtyw$%C;@){?J>p}Lf+qHkcA0=zCA+0wO}&_T2k* z7at-aBsv$!tgID(v;ePPyG%^5ShhU)W5&(vm&r0q*A2;KcYj4)D%M)^%&=JXSR-Va z#rcF0)`~w`0BeQ$tVOM1)%47l9eHMOKGF4q!RY#c^F7l^iT4o?I3I`+rjvZF_@f0_ zwVs{r$xwPiWN&}Tq%IB}R>FtDc>(m!voS3Y5sVD(Y~A={A#c2PB^{NJqrM=7;b<9a zh#{hCh>7FlmQo^wgtbH2S||RuKRg;$3y+(j_usvl{ylK#v+tg(xj1dmqle|H17Lfr zKC#K11mvAJUrGR*6J_Uu;ymm=aV*WR!4a^&V+*gYM(+B#)rsFI_AN;u@B(MUl zz@$_{gj_Ata=f)XZP3;yE^ZYZRzo_U@IKIYf!TOxdFr57E|ypkwx>h9|2_AJSX_iE zKLO z!+SOnFe?1`aB-6J`rn{C7jkkdEZZ=&njtY?Mm8rIA)fsZP&F{`0-XyiR)h7c3(GlJ zI{>=-q{l^Qnql!}smzw1%nHt*={5iWwMKYxyWn8uIaql%DrK`C9AVp?{bu0!KH$9K d?AN(x;2%-~Rm$>ir3nB4002ovPDHLkV1gY!55@oh diff --git a/src/main/resources/assets/gtceu/textures/block/rubber_wall_hanging_sign.png b/src/main/resources/assets/gtceu/textures/block/rubber_wall_hanging_sign.png deleted file mode 100644 index 02e77aabd0c7ae7461e172e1feec0acc07b83400..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1362 zcmV-Y1+DstP)r683lD54ZWX%I>fN)a0q9Q%B?cl%@JQS9yd{3CH} zu-6j#N~_h*zVGgv_ukCB_mqe*iqAiNPXO*LpQ6>C;-$uICdWdSA9exov;v?R1%wU5 zt@|(1YESWM^b7GIXROr#;K$pBlP9KmfOUd(g6An#*WyYpNiEILRD6J?<&{18rChre68JmRIdquq z1MwiI85-7sUU!wr>5wF~^amM%uW7eJ0G^wOX!ssWL%FPFX+}ZCFEKg(WPXVx$*|TQ z?re9#4wEaT=qHxdhkvrPyh4&%oO6f>%_yMT8<1s|^-dq4k}Ew}@=ui2Er?YSCIVG1kC09_!r%fCuT@^t!9O zHu1+6zUL|O+~IkOxS#SMJ70Zol;3U!Xa$|_fMyhMw^RK0-P0?qZ49{j-OWR_iq3O~ zQpG2wN6a0yUNn?3UNQhImq&2UB~^DEVosdmvYkYZZWRzgjr@cs>C1(((#t z&RvkvwFt$8W@hJQW_Dg4!>uqgJ1^I-T~(#`7H<>=Jv6QVL#XX}K#4LU_KJ*|*?DQT zr?`9fS4z1{b62D^#=nWGqrhVi-t7^w8)jzbW${K4>Z23Ae(h>C_B0VxCrs%rfO0Y= zc3T=HF3nw$Qf4PkUYb@baF#Ql|XJalEQM;Ip~& zGS+JF_gaylw3`O!Kx=qms?B<*Pp_X<>1w+b(v4F(8w1AM0cqyg5C6;WZyk$>sB%`V zA#27GpGF!!StlVP;pzC@ogGHe2P_Za9JbV-r1_sabs`6E9&E!~!bw&85X-+!y zdb=6mq%dA1@b=9QMykQOprg9EMDUUW1a%(Y0lO)*|etCD!(diDh z@U3-pdMShS7(~EmKfsQh@kx?nhstNUtNH=Ovqe!nJGYtYTU&T~trMe_s`>#U;2eku zaX-a6M>8~4@32nj@v#uCigVfXbai}{N0dnM&Nm7X!P?Db;1N485LZw#pmogf2TWBE=3}ZcHMD@>*?9$~qwmeR^@>RnOByPdoBla8iW6QVJ(R zJjhUritijmp^tNgAo=<>QgA$mChkH9biSE6tA^^+U3IGNz2}ys zlmPhXgWJhki*pVD#9)ok_nr_F+gmlx1@7MaiyPN30pMItMPt!W8G9%BGzV`r3>H_BjnOd68QDm03^N1P#nX3WdB>7)_^~>`K@Zo#6 zlJkMORQ6{blPWtNRBP}d0-mX5<<&DsY?Z5wrF`_ zyC%<-w)4k3P?f`^n$}U*Ib9#fR48)Gy79+C)f(zjaUpRqYq_vl0Zu%*8c)3&l1`o(@?4oz z7Hfwe7nwyw2qCezKR;Gmtyw$%C;@){?J>p}Lf+qHkcA0=zCA+0wO}&_T2k* z7at-aBsv$!tgID(v;ePPyG%^5ShhU)W5&(vm&r0q*A2;KcYj4)D%M)^%&=JXSR-Va z#rcF0)`~w`0BeQ$tVOM1)%47l9eHMOKGF4q!RY#c^F7l^iT4o?I3I`+rjvZF_@f0_ zwVs{r$xwPiWN&}Tq%IB}R>FtDc>(m!voS3Y5sVD(Y~A={A#c2PB^{NJqrM=7;b<9a zh#{hCh>7FlmQo^wgtbH2S||RuKRg;$3y+(j_usvl{ylK#v+tg(xj1dmqle|H17Lfr zKC#K11mvAJUrGR*6J_Uu;ymm=aV*WR!4a^&V+*gYM(+B#)rsFI_AN;u@B(MUl zz@$_{gj_Ata=f)XZP3;yE^ZYZRzo_U@IKIYf!TOxdFr57E|ypkwx>h9|2_AJSX_iE zKLO z!+SOnFe?1`aB-6J`rn{C7jkkdEZZ=&njtY?Mm8rIA)fsZP&F{`0-XyiR)h7c3(GlJ zI{>=-q{l^Qnql!}smzw1%nHt*={5iWwMKYxyWn8uIaql%DrK`C9AVp?{bu0!KH$9K d?AN(x;2%-~Rm$>ir3nB4002ovPDHLkV1gY!55@oh diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_0.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_0.png deleted file mode 100644 index f4c8b519fcdaf5c53a7b913b097904173dab1348..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`8J;eVAr-flP7LHbpupk0^Z&{+ z&H6;cwzCNhW|JPYUtkY2G~Ri#ROKVj*={9uhp*x#kC-=fPn^MQ=b+wKdVk&51wzgY zr;gn4nb~3De7~c@fzfE={pk&FBCV%{G-CiPCGOvu|xy+I&0bU2AxZm44ada3?+nRPSdu?J*=FHcu3>&*% z`@KGG-nET=$rnz)N1PYBH7CkvG)%78v;MBHa={T5hSNtj&PY{SI^#>P2!BMw)E)Ek t8CP$t(zxBcQF#*k?!JhIwVm~!7^Tg*8PjdgWdR+<;OXk;vd$@?2>=PbOF;kt diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_10.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_10.png deleted file mode 100644 index 5e63bfb09d283891c9cbba6a2ddf0d373bdb74f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Gd*1#Ln>~~4UXnJqQLRx-*&@` zKd!~C+P}$LYWLl3B048sn9p$}hcGO-r*v#b?uv+Oe&YKBy?%u#f8NO`Y8iwZ`JP-8~llB1}$>8bg K=d#Wzp$P!4hE^^B diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_11.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_11.png deleted file mode 100644 index 139df6448d70605b1d1a257b1a0098faa9177b50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmVlT4~$1*V+@` z)>?AT?TLCpL}C`Vdz&9VBc=3B(Ao#Ufqw`_@JiqUDdn4h10T!Z7(-E$K`+kgZPB0s5Bn=^4)8N<NCEqT2{~F7)-}cu jgu-)SMZ)?$@e6nWCK3=t$W3Xd00000NkvXXu0mjf`R8D= diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_12.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_12.png deleted file mode 100644 index 64951eb2db07aa6a2e3708001c01e07c65c21de9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 218 zcmV<0044v4P)?c5c9v2KA*F;c!0n!gwE|-d zg7>~P<@_Sd$ZdcS0(&wAzBHc--m@2avLC}+zzo>_|;4fF@%7W=IJd^ zGx)Ml6s(f3eXTV@j1gA?d>?uo$7z9@L9eJ<7%8AAs-Nj!1~b$*M_%tu+`;&I{Z2BGkxbz&MULl3PFz7=~e2P$M7rvpUM} z!$J?a44^cxhFC28YHkkEdykgp>RV{d;L8Fj=q2a%Wm&*N2=hD0Jy?EyUaKfSu`V4$rnWp$GY3GA#hgNSLG=vm?lthFT8btTcL+kI=E zp+X2GVvMzE+g^koxege|k&a|e;R902T|tk0JTK~y--m@Wo@Xq}0&8tp zWAa&R4P#77)(h`FL?#~3Eqlfo#}R^^M^Zpm}7tV$&6cLcSYW8IY)B$K>2_kIsOw^J`$ qS1Q?{rNQvnE-}reyS7~W!H`wOW&PyDyT3peF?hQAxvX diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_3.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_3.png deleted file mode 100644 index c3340157af9eddeef8035fb66c38b8b81fd97d74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220 zcmV<203-j2P)3GB$@{iDF{ShJ|ugLNX72Tv1;1hytpd?}WMIjR(0Yb|1oNGbJ|K+zwdE8qlP WW)03Kjy{3_0000cGMJs;NnCw>-CYUOQJX;mxfz3)gH7Sg=oTYLM1%iQDt!vqgOmRQLN@&S&ZCVT#IL zkiz+j^+kj7<*M>>>BP1kreiZq6)&X~b||t;Fxk9b;cUW-glTuq&vxh$Ok>*9^@!sV q&x*z2>_YB2Y>UDR&i(y$jy>3)d!PH_quYTlV(@hJb6Mw<&;$U%sY^Tn diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_5.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_5.png deleted file mode 100644 index 4b1fbcf33331b07752ce18a3a6cc473447f84da8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3q4&NLn>~q4ffjX-7d))bn$>+wo_ zYgkA34%xSx+!$?69l2v3Rm~Lkz;VIWV?57TWDP{t94Owqx_b8^z6yZ}v+E5D^U`L| zC}vw;`I9S#-%jfW>-WEt7fflAWsdheF1kbROxHfG2O3dT2dY?q?KAml`abj#zi9l& S_v}E&GI+ZBxvX~q4f5nWtibc+|9i%b z9jfdP4%Am2<@DGg>f60CE7O5%-pPuF%J&bozG+8jK8v%0o6#y_;`7fB-{rQ*8gXT;{V)9Jjt`&VQkE&tp6Uh|?w4y=9X|LoP?@>W^~Iy!l`j5tRS{002ovPDHLkV1gDAY9{~y diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_8.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_8.png deleted file mode 100644 index 01d77b072cadb005c2ee81a71b53b67497eb3929..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-gg21oNXDDZs#xBX!= z|GbYu|BO^wTuVweq;Mu?M|y7)ytr-FwOd6GlI(@z_b9b|Q1f`nsPLhE0jsx?{emf4 zEF5>Pzb-L6wvkHKo*WM9)FS+Mu}z0WLj)=ax%Y5v^NUT{i- nTGQ#4LlT?!owD3|t%PaOJ}%S6|C0X!ox|Yi>gTe~DWM4frqfGo diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_9.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_9.png deleted file mode 100644 index 1202099cb3f858c47c7287c65befa20c0ef82ebf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^F3W0Ln>~~4T!mKkhdR#)i7?XJ-vK3nxwuWV_b$nkNz5MY#OZI!e?;6H4 zHY|EmCSUR))AG50li@uEzCW%7EZ#i&7ozraSbVUwTkZT;&vXYycLl>kOWqlOUkY*n Poyy?p>gTe~DWM4fd}mT& diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_background.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_background.png deleted file mode 100644 index b3781b10417bf8a44be91e5368240e57f11885bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1enu*lQJF~q`u>11!d0}33hFaPRa^)BV+^BXVC`mM&iMw<*Sb8TyT!C#)} z#xnV^;4()y(+6P_TCZ1Wo|w0EsnU#d2h6pkD;9ZgV-cKV`{x{kexLQ)-BQ`X(m>l8 NJYD@<);T3K0RYkuNL&B_ diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_border.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_border.png deleted file mode 100644 index 23d6c10087b471ed45e3770deb8071ceccd36e44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1enaFeHtV~BI(Gn=^|zy5FUcK5fr zoq?P9+?~FLn{|sPwN)<^IMuu?bJAxUX2I4~t4xx5Ub(8IJm`OX!EA9=cwm+Y#A*Gtp>Cg{!9YYX;L`@5hfZ`QFj^S9+P|G$^bxhHqFr+pQ7 z?fuzbn?L>6Vq8D*da3Da_WF+YM1$AM*S$V)!%cIB_h*~apKbEp*`ylZ_ZFW@zFwNi d-Jwy#aLA@~+o{K|jDfCa@O1TaS?83{1OUHgaV`J= diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_0.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_0.png deleted file mode 100644 index f4c8b519fcdaf5c53a7b913b097904173dab1348..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`8J;eVAr-flP7LHbpupk0^Z&{+ z&H6;cwzCNhW|JPYUtkY2G~Ri#ROKVj*={9uhp*x#kC-=fPn^MQ=b+wKdVk&51wzgY zr;gn4nb~3De7~c@fzfE={pk&FBCV%-9TS8yVJ!-)yM=FCfK{dCY(z(%6t8h4Bu9)2xe6 z6W1O7z@#~=)2LyIgG;zikb=mdKI;Vst0JzgW=>Px# diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_10.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_10.png deleted file mode 100644 index d849cb2941377eaf893f239f9fe07f1bd804e1b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRRA}1|M>sko_S|QUAKNq zBe%?tU;Nuu1QH}Zyq9-kRy-@grjV`1)}W)&x4A{a!NYi$&6(2bG?j<^%r&z%wlS`3 z?0Cdfa`Xs`k_}HspihX2kT9EyWP`V{kIZ_;9eY}HG)^Wqyi;0qiP26xccy^r9!87H zj3?v`VkW12w>Lf_(UX{yQYmo%co^?GHWfAoyC?7YoE!^ufUaZkboFyt=akR{0J>^K AbN~PV diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_11.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_11.png deleted file mode 100644 index db74d322dab13714b0725a3eb525edd604c927cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3p`yMLn>}1-!N8w`Tvhtyanb<@p64-SOO}w1lsoc$V`%eg#!g0tm78BCJapo4 Q0=kvK)78&qol`;+0PUbpk^lez diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_12.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_12.png deleted file mode 100644 index 0ad5616dd2ee42ec2c78e1b0d8b5eceeed1bba08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRRA}1-!N8wX)j}1-!N8w`Tvhtya3AR7K+b=kH7~g3)Bk=hDi&>qF3fx_fbrkg! zmPp3RJ+s>I`rtVQXX9%I3Z?=Fs}BA+<(Oe+%`%w+{uORDjiF^I7p zVN=+&P^F!5SNDN+?5Pq-!E(DKBJ}qeD6l+u$-p6T;-JD_hCS~;+_c-iI2h}1-!N8wX)j}1-!N8w`Tvhtya3AR7K+b=kH7~g3)Bk=hDi&>qF3fx_fbrkg! zmPp3RJ+s>I`rtVQXX9%I3Z?=Fs}BA+<(Oe+%`%w+{uORDjiF^I7p zVN=+&P^F!5SNDN+?5Pq-!E(DKBJ}qeD6l+u$CM09Pi!2AZ=Cp~u&;luR1B{N a55paeN9(@*c#sElG=rzBpUXO@geCyiCsqIe diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_2.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_2.png deleted file mode 100644 index 2c95591fa1941791fcc994fe9b7ad1e68f8326d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-fhfBgS%&#Wrp^nihV z-@n7UCl54a9@t;c!P{bzEYYxLrUb(#hCBwvvoAgwTo>eFu9?+o)Ud?CCEO=SL1^)e z6&WgOJRU|2)6-^H#4#6Ca^DP?beQ3;t4k}Ro%qBQhI0-&eVhOAA2#(Y`)};rb5P=# k+cfr%wK-QGWH}@;u!wy3sXl+S8t57ZPgg&ebxsLQ06+yohyVZp diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_3.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_3.png deleted file mode 100644 index ad4f3ed29fe665a909487b2491fde06062a23fb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(>z@qLn>}1-!N8w`TvhtyaLNtKhKJ#s-T%T_-=@6)x`)Bj)z4*}Q$iB}8s$Zj diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_5.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_5.png deleted file mode 100644 index 8aabbb4ed0f91cbdc049facf9adcd6e1c59e3770..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRRA}1-!N8w`Tvhtya>zd^ z*1^Mgm(7{d1m**bj%{gc5*@-6#EwV)JHBkj3kQ~+4H8E!coj@}J}hHSGCh1G@KD1I z1{bp_PYfK&1#d6}v?-cBohZZRa+FDf$APEFkRh$|XYGZ@=b3@7WAJqKb6Mw<&;$Tz C5lOB9 diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_6.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_6.png deleted file mode 100644 index 9435521e5448a2e7b9b2231f2de6f27f3eef691d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(>+}rLn>}1-!N8wX)je5vkyTt#b$N^oyg$n>gTe~ HDWM4fy7)~g diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_7.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_7.png deleted file mode 100644 index 9946a5dbbb81537ef14ebeb247365d4bd0e78f61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`OFUg1Ln>}1-!N8w`Tvhtya>zd^ z*1^Mgm(7{d1m**bj%{gc5*@-6#EwV)JHBkj3kQ~+4H8E!coj@}J}hHSGCh1G@KD1I z1{bp_PYfK&1#d6}v?-cBohZZRa+FDfCt-)$$#?b|`3(j=y*m7le&1Mi@M^;mhDM=R VaaWqI6#?DL;OXk;vd$@?2>@bJRCoXY diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_8.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_8.png deleted file mode 100644 index 3a1909badc973d54419d4419d0a8195ecd05bb77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`wVp1HAr-fhfBgS%&%Cpuu3NvQ zkz3}+FaGT+0tpfy-pe~NE1s2LQ^;0hYtYf?+uS1I;9+Zb0i zc06J#IeLUe$%dyR&?m%1NSIAUvccQfM`k_ajy-9TS8yOBa)c+Td;>bK^zz}I{$dKY#I7jsegVU^w zPZQTMw=&-|IIvtYTVjG#hlZX*xQ~y*p~DRlM_pW%4HF$EG43!qeB`54!|CV~ZIfi! uUg#-l$v!9+)YvST%W$v6L65DKk>P~bkNQ%9PgOu?F?hQAxvX11!d0}33hFaPRa^)BV+^BXVC`mM&iMw<*Sb8TyT!C#)} z#xnV^;4()y(+6P_TCZ1Wo|w0EsnU#d2h6pkD;9ZgV-cKV`{x{kexLQ)-BQ`X(m>l8 NJYD@<);T3K0RYkuNL&B_ diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_border.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_border.png deleted file mode 100644 index e8a8cae131041cfc425f1f4b925c32b0b5d91629..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1enaIdF}V~B-+@*QL4m;WD|ua}(AxTZs6#=nn` z*$=LC0XfiCB&Kb@j%4GD%7yg65&9J<91^az8etDnm{r-UW|nQv)w diff --git a/src/main/resources/assets/gtceu/textures/block/stripped_rubber_wood.png b/src/main/resources/assets/gtceu/textures/block/stripped_rubber_wood.png index a4c0d2afb73c36497ae180476c1dc368309cbaf1..814313935a1e2d68c9e25b64cd4d9b813c7baaf5 100644 GIT binary patch delta 540 zcmV+%0^|MU1hoW^B!2;OQb$4nuFf3k00004XF*Lt006O%3;baP00009a7bBm000tl z000tl0bXTW;{X5w%1J~)R5(v%liPCIFc5}U!a@dYa4~777tI6Y9r_A=|Jz=5GD#@d z*p?4i)xTm>CjD+!E7;Y)2dkeyo_&!U`daP?*mOS+&wE@Td)rLxKGdN?Nzo60+$8ne4W!hmu4wA7z*G2nhNRba@9-e*5(oKQAkDiI_RpTLoY^ zlqphcXFg=Q4eo2l%=oP1JfYnNPp663w>!fj1lf)XwRUVcbAO4bKRF%`5NhuNkdAaPAe*AXikG~cGa*l{N?#}-! zgs|Nz)Yj4CJdu-bo!XZ^d}Ec9Ql?y8GU7 zd{2byt&)Nee}Dh;ohb)ech@Fet(_Q@pj$$pKBx^R24%{DzhADD90?(CCn<@upt!|67tweMi3Iio*3%{-n8 zYc=K)IZOd}M+H(8LmoNZs50jBPZo_ zEC76aIxwYxZt-+Z$3jkuh;UntF(3wIt;QGwcV|9imdl;ijPu(KfLL4SP!jLUy3ct| zkr0I5oiWC~ALsX#r-z9Y1LtMkJnDTQ^5troBCl^(Vo+K)uD8k<(7NyWx4!uWppOp) z6;OqgwnTXl`HE_ckGCke`yOv=_OTlRms{JrESEa~-3H6GqRPi|DYXrr9}BG+Hk=d# Z{{aAeH5r!j&!_+Z002ovPDHLkV1na43(Wuk diff --git a/src/main/resources/assets/gtceu/textures/block/treated_wood_hanging_sign.png b/src/main/resources/assets/gtceu/textures/block/treated_wood_hanging_sign.png deleted file mode 100644 index f8085eba5386cf64b05a9e7ebf8fa27dfadba540..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 623 zcmV-#0+9WQP)4y+2@WeRO}6>?9avPcl_@CN6tUyPfmY7E?l_$uk2qrJ^b1DzWHC0!`!}L zG#va__)ks%o<6?kITv2OU*o~8bAV$m4E9=%F7{AhnvGJ7-EjdN5#ibMHxdC}yjugH zv%;%)-^f@sazkOFT%ewhh0LXd#YGJv8Hy4IMhB8bq7N(m5xvUDU8L=HAkoObG1?kFy#7@6xS z^K~Ky!8=GP5{u(jSl@04S`GxCHnvfn*_&}kT~{Q8mO?klwAm1#$sMcf1F{*G4|Q_6a$masC$X6oe6anNI|HQvNz6z09908zh9jRc1K2)gmE)vXWWru zA)C>(Mx6ppSJ)dDmKG9Ib1-O{LmQkr(I@9ZmkXQQ6Bc?s<|?H%qf_VDkqY|IPK~9y zLPYr0;p~vEoLzBI!5wgLHxNZcvErntcqyO?I9{A$#>cgF`3YJS7cz`cAkF{)002ov JPDHLkV1g7858wa* diff --git a/src/main/resources/assets/gtceu/textures/entity/signs/hanging/treated_wood.png b/src/main/resources/assets/gtceu/textures/entity/signs/hanging/treated_wood.png index d1b019d3a52db3b44183c09ce2a3b7e5fff3db99..3549aa963acf87ddfb099f863d83bfd4ba2399fe 100644 GIT binary patch literal 7069 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 diff --git a/src/main/resources/assets/gtceu/textures/entity/signs/treated_wood.png b/src/main/resources/assets/gtceu/textures/entity/signs/treated_wood.png index e178b70d4cfbd7bc89aa13a9c6e4bd7bf6608c28..0d2ae602047c38964ac974bb08b38fc5a6629f0d 100644 GIT binary patch delta 1235 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 V$0q|5{MG;f002ovPDHLkV1hiAlAr(p literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/gui/hanging_signs/treated_wood.png b/src/main/resources/assets/gtceu/textures/gui/hanging_signs/treated_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..0f248931231cac8e4a0350e275b3c0a1363c8502 GIT binary patch literal 873 zcmV-v1D5=WP)EX>4Tx04R}tkv&MmKpe$iQ>A`XMC>5ykfAzR5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|?BJy6A|?JWDYS_7;J6>}?mh0_0YbING^=eK&~)2O z#G+yU4&<~KKJM7Q8N|;d?N8IGfbO!gLrz= zHaPDShge=#iO-40Ou8WPBi9v=-#F)77I*{h@IUz7t(Bde@REX2p#8;hK1P7RE>NpD&iAq7)J_2ZGjOFh{G}=|^GSN8 zp@olt-fiIGx}hn1z~v4w@MOrQ>`H!`LN*J$pV2p^f&N>dYt8GezK_!fAW2=tZ-9eC zU^GYB>n+~h(cIg=XX^d^0Aw|Cp`Oi^6#xJL24YJ`L;(K)0000pCw%h&000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j~eA3nCx&nZ@t`000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0003%NklbS|kP@0T?R8 z3$QWsc)SQ3ufWu*LtCUIq;}#kxMv)zh~AX^{_ns4&gbmqZaM&L&gazCnydDMzrxs# z`tm98bgn1>s>V=PYZl8DXQct4)GA4K0D*Tg=`c1TT;JXg50B3S|3u0QWoEM*j){~v z^0`>9juMG^L7=YIM9U22VSLobfdxh;Cr==&^-q+E&ALO>~0C;=<%oMY12uy8C z|1l;J#%UecodY^Hl^6SJ{c|g_fo{ms{R7|!bRxTMFvV!!00000NkvXXu0mjfsB4VT literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/gui/rubber.png b/src/main/resources/assets/gtceu/textures/gui/rubber.png deleted file mode 100644 index 7cc979de2a81a296649e70365a6b7d0fe1a09c08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 567 zcmV-70?7S|P)$#eY(54J&cD1kRT%w5P(R5hy_?8CSeKe zh83_D_JBl&ErZ6Mp}+Ne1U>FCmXQ3U7d+LiQ}@+XpFh2kT|4p9zocuoJYD|)APcz4 z;(es4OJd55Q{lyt-Ewhxg)wSwt?)jQvd}n-RuE!ZbV?~w zN+2SL2+v-;m3Qwy$nE^UzOU09>g?<}52^b)eRsIHym}Diu5JNz?e;;J@9UI^@bUbW zXsv0S1t25=$%H7l%CcEIZuTR?7%0nGW3=MS*KbM#q%0V%XzG%Xgu*C%$N;32xZVwT zAF)Pb^qkN?D_EncO2hB#9#>k7G1RV@1zNLt4~y>BmUpEK^8ifz5h`4`ZM#G^-N_z~j^U=)i}_>cmkN z8l@D&l*oBrZSsknGa^D$m$cnT2#MW(I09-{FinBB_xKR!Up`pOInxgwfZd;orY>=n zW#9QDKq<9E<0{L|zQ-C(h>3piOt*az30{g@`Qi zhLDbcZV1aOZ8riCQ>N`bT7wT6tu;PmHfu)+iIitYe*s9-En}OP=xYD~002ovPDHLk FV1fXq`$GT# diff --git a/src/main/resources/assets/gtceu/textures/hanging_signs/rubber.png b/src/main/resources/assets/gtceu/textures/hanging_signs/rubber.png deleted file mode 100644 index 7cc979de2a81a296649e70365a6b7d0fe1a09c08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 567 zcmV-70?7S|P)$#eY(54J&cD1kRT%w5P(R5hy_?8CSeKe zh83_D_JBl&ErZ6Mp}+Ne1U>FCmXQ3U7d+LiQ}@+XpFh2kT|4p9zocuoJYD|)APcz4 z;(es4OJd55Q{lyt-Ewhxg)wSwt?)jQvd}n-RuE!ZbV?~w zN+2SL2+v-;m3Qwy$nE^UzOU09>g?<}52^b)eRsIHym}Diu5JNz?e;;J@9UI^@bUbW zXsv0S1t25=$%H7l%CcEIZuTR?7%0nGW3=MS*KbM#q%0V%XzG%Xgu*C%$N;32xZVwT zAF)Pb^qkN?D_EncO2hB#9#>k7G1RV@1zNLt4~y>BmUpEK^8ifz5h`4`ZM#G^-N_z~j^U=)i}_>cmkN z8l@D&l*oBrZSsknGa^D$m$cnT2#MW(I09-{FinBB_xKR!Up`pOInxgwfZd;orY>=n zW#9QDKq<9E<0{L|zQ-C(h>3piOt*az30{g@`Qi zhLDbcZV1aOZ8riCQ>N`bT7wT6tu;PmHfu)+iIitYe*s9-En}OP=xYD~002ovPDHLk FV1fXq`$GT# diff --git a/src/main/resources/assets/gtceu/textures/item/bioware.mainframe.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/bioware.mainframe.png.mcmeta deleted file mode 100644 index 8a6e059cfa..0000000000 --- a/src/main/resources/assets/gtceu/textures/item/bioware.mainframe.png.mcmeta +++ /dev/null @@ -1,9 +0,0 @@ -{ - "animation": { - "interpolate": false, - "frametime": 2, - "frames": [ - 0, 1, 2, 3, 4, 3, 2, 1 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/data_stick.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/data_stick.png.mcmeta index 5f132698f8..592ac6b260 100644 --- a/src/main/resources/assets/gtceu/textures/item/data_stick.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/data_stick.png.mcmeta @@ -10,7 +10,8 @@ { "index": 5, "time": 2 }, { "index": 6, "time": 2 }, { "index": 7, "time": 2 }, - { "index": 8, "time": 2 } + { "index": 8, "time": 2 }, + { "index": 9, "time": 2 } ] } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/item/wetware_processor_mainframe.png b/src/main/resources/assets/gtceu/textures/item/wetware_processor_mainframe.png index fc00c0938802c57cbbc8aa20021c7534f1d7fe7d..463ad2c6b8b5d4696f0263eae17ccc546c8e179e 100644 GIT binary patch delta 1456 zcmV;h1yA~t2(=547k_{V1^@s60+s0^0004nX+uL$Nkc;*aB^>EX>4Tx04R}tkv&Mm zKpe$iQ^gM|qIM8*$WWbH5EbdDRVYG*QY*CTU~=gfG-*guTpR`0f`cE6RRvrIQE;tk@NO-tvzPaI@LNg+Nb4jXhq z;zzE_F28XuI4tnYppj0^69+u3r_4s2lA00006VoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6 z000McNliru=m`-LF)yK5EHMB802y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2! zfese{0Dl9FNklZP?*7fPGh_Oh|dChU@s64pbUb!M`=*^LMm_nk7s zzBe;3?|t?=E1-uhPEYFeIA8oM(BnWar@OarA%8v`0{}=>84Ieaf86_K1QB{U@g`Me z>>qpu2@)XA&!0R+MLx4VPBNB2GL}GmIEGrYq3?(l!8k%iK0`8==n9gIB|twTRb@z3 z**pg%2tRjlcm!3`000A#2uzbGRb{;T@C94BSz{+;wdKMI03eDGUQe?@d~~#-jGsvs zaes~?geXE7%J{KXRABoz(&t+(oC649F?ET-@HK2gXBM%ngRUK2T%y)&K-mj+#*e`s zK~+@%fKqBR0mwKn29XzosH27V*)b!bOb+O+6WhwoLMgRTM+arxBx2z9i& zl8D@_F(%Gr$4n_Nq(}9eBO?HS_;8Hbk$(QPM?4^1+BXl(Sa8L7@G>P}DIMsK2SXXZ(b7Yia34GXuze#8rPPLk zwtF5ZrMA)59uGVoc>17YZ>Qt^>w_plSSd>Gc(9lfFc=PCGonK&wGl;#dEV!Q2Y+;B z(hXa=!gemrHnV}>qZ;%`oL$FWwMKoKEN+s;J0pPJ05JqZ~E$Ytq;iR8`%j@A9y_Q z^ueF%0|4&zfpK2|fKtdk59TkL7=P3{0;6vp)S3;WtzGjVF9xwL>K+d~9(X+9?hCHI zAJ8k4;C#pWdKD7+k~x3T#0yR60*WmUc&jxV*vL*;i!9y>xj6v9_fiAvqK=u#aYnJZ z<^gf`cyOh8002{|hyC*a0CvTF_dK8-_=>f?FYJo@I5<2qy{S0j0sVWmaDR^F!ioKb zgTF5jN3l}IQaWJz0m7CCG*C!&nzpkQ4+^Px#1ZP1_K>z@;j|==^ z1poj532;bRa{vGi!Tc(e3bacv{D!8c~EV!pd zpGVK9+>>WB^?z0~g5jY-x#5dIf>5bc&zz zXC*AJd~;t)t5OysP%f9{!f({;o5gOauM0oijUBrq^M4RdV)cD}j2;{k5s1{SLj!L1 z_1k)D4Ut!%lLA3L0Yt`59Ep&1#2{G8$M)@6D;A4#-q+h584*K<#5^ci0~`YZpdu;& z@qKB&-WrlD8g3vG_oO5=Z3G)A53Eb+mpTvBop&GHkK{pQA*qNh?m-%#m~2>uAY96S zIu9=Xtbd55Gv$G`bmly`ePEkdI#V8SR9okHkmmu&^I+ZOfkmb~PWy>r&8qs1a)PmJbzH~Z|x6w($%iDz{aWf2Y`j8;<0v4 z0wnBA`BqnmK(jos$2<@6JW%)|@~53V0P0lw{jd82ka~Xr5n;;T8-NA@3rPGJd2S{& zj}H-Ol?NvVbneu?jlm`r3 zq3a`69sr1TaVa88+0O$7M84{=chf)t5OowvWVrl>fVEq0Ff44K=<1BMb5b6RRb7Zf z`HIKN{Fcb5V(lC^LA(wkSekae-kZ*WpMM8ZRS`;wj5bvsSYn3hrwgJG7>A5SIr4l2)cXP{O~M2hRNh0!lSo(L|eV00000NkvXXt^-0~ Ef(J~*`Tzg` diff --git a/src/main/resources/assets/gtceu/textures/item/wetware_processor_mainframe.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/wetware_processor_mainframe.png.mcmeta index e945b0c407..fb20356f73 100644 --- a/src/main/resources/assets/gtceu/textures/item/wetware_processor_mainframe.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/wetware_processor_mainframe.png.mcmeta @@ -5,33 +5,33 @@ "frames": [ { "index": 1, "time": 40 }, 0, - 3, - { "index": 5, "time": 60 }, - 7, - 8, + 2, + { "index": 4, "time": 60 }, + 6, 7, - 3, - { "index": 4, "time": 50 }, + 6, + 2, + { "index": 3, "time": 50 }, 0, - { "index": 6, "time": 30 }, - 7, - 8, + { "index": 5, "time": 30 }, + 6, 7, + 6, { "index": 1, "time": 40 }, 0, - 3, - { "index": 5, "time": 60 }, - 7, - 8, + 2, + { "index": 4, "time": 60 }, + 6, 7, - 3, - { "index": 4, "time": 50 }, + 6, + 2, + { "index": 3, "time": 50 }, 0, - { "index": 6, "time": 30 }, + { "index": 5, "time": 30 }, { "index": 0, "time": 120 }, - 7, - 8, - 7 + 6, + 7, + 6 ] } -} \ No newline at end of file +} From 14e321a497ca0330f3a5d1102e1e6c80f7da614d Mon Sep 17 00:00:00 2001 From: EasterFG <31056634+EasterFG@users.noreply.github.com> Date: Thu, 19 Sep 2024 09:37:51 +0800 Subject: [PATCH 03/10] Fix jei drag (#1973) Co-authored-by: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> --- .../gtceu/api/gui/misc/IGhostFluidTarget.java | 4 ++++ .../gtceu/api/gui/misc/IGhostItemTarget.java | 10 ++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/IGhostFluidTarget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/misc/IGhostFluidTarget.java index 28087d91e0..e4b16e1181 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/IGhostFluidTarget.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/misc/IGhostFluidTarget.java @@ -70,6 +70,10 @@ default Object convertIngredient(Object ingredient) { ingredient = fluid == null ? FluidStack.empty() : FluidStack.create(fluid, fluidEmiStack.getAmount(), fluidEmiStack.getNbt()); } + + if (LDLib.isJeiLoaded() && ingredient instanceof net.minecraftforge.fluids.FluidStack fluidStack) { + ingredient = FluidStack.create(fluidStack.getFluid(), fluidStack.getAmount(), fluidStack.getTag()); + } return ingredient; } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/IGhostItemTarget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/misc/IGhostItemTarget.java index d9f99b71ad..28593addd8 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/IGhostItemTarget.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/misc/IGhostItemTarget.java @@ -12,6 +12,7 @@ import com.google.common.collect.Lists; import dev.emi.emi.api.stack.EmiStack; +import mezz.jei.api.ingredients.ITypedIngredient; import org.jetbrains.annotations.NotNull; import java.util.Collections; @@ -53,10 +54,15 @@ public void accept(@NotNull Object ingredient) { default Object convertIngredient(Object ingredient) { if (LDLib.isEmiLoaded() && ingredient instanceof EmiStack itemEmiStack) { Item item = itemEmiStack.getKeyOfType(Item.class); - ingredient = item == null ? null : new ItemStack(item, (int) itemEmiStack.getAmount()); - if (ingredient instanceof ItemStack itemStack) { + ItemStack itemStack = item == null ? ItemStack.EMPTY : new ItemStack(item, (int) itemEmiStack.getAmount()); + if (!itemStack.isEmpty()) { itemStack.setTag(itemEmiStack.getNbt()); } + ingredient = itemStack; + } + + if (LDLib.isJeiLoaded() && ingredient instanceof ITypedIngredient itemJeiStack) { + return itemJeiStack.getItemStack().orElse(ItemStack.EMPTY); } return ingredient; } From 95ca694d0689c54d5744001c39c7ae0c015b45c8 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Wed, 18 Sep 2024 20:45:44 -0600 Subject: [PATCH 04/10] Wood Recipes and Boats (#1980) --- .../resources/assets/gtceu/lang/en_ud.json | 6 + .../resources/assets/gtceu/lang/en_us.json | 6 + .../assets/gtceu/models/item/rubber_boat.json | 6 + .../gtceu/models/item/rubber_chest_boat.json | 6 + .../gtceu/models/item/treated_wood_boat.json | 6 + .../models/item/treated_wood_chest_boat.json | 6 + .../gregtechceu/gtceu/client/ClientProxy.java | 14 ++ .../renderer/entity/GTBoatRenderer.java | 60 +++++++ .../gtceu/common/data/GTBlocks.java | 1 + .../gtceu/common/data/GTEntityTypes.java | 16 +- .../gtceu/common/data/GTItems.java | 22 +++ .../gtceu/common/data/GTMaterials.java | 1 + .../gtceu/common/entity/GTBoat.java | 123 +++++++++++++ .../gtceu/common/entity/GTChestBoat.java | 71 ++++++++ .../gtceu/common/item/GTBoatItem.java | 91 ++++++++++ .../item/GTBoatItemDispenseBehaviour.java | 72 ++++++++ .../gtceu/data/recipe/WoodTypeEntry.java | 45 +++++ .../data/recipe/misc/WoodMachineRecipes.java | 163 +++++++++++++++--- .../resources/META-INF/accesstransformer.cfg | 2 + .../textures/entity/boat/rubber_boat.png | Bin 0 -> 2872 bytes .../entity/boat/rubber_chest_boat.png | Bin 0 -> 4731 bytes .../textures/entity/boat/treated_boat.png | Bin 0 -> 2845 bytes .../entity/boat/treated_chest_boat.png | Bin 0 -> 4714 bytes .../gtceu/textures/item/rubber_boat.png | Bin 0 -> 614 bytes .../gtceu/textures/item/rubber_chest_boat.png | Bin 0 -> 635 bytes .../gtceu/textures/item/treated_wood_boat.png | Bin 0 -> 556 bytes .../textures/item/treated_wood_chest_boat.png | Bin 0 -> 621 bytes 27 files changed, 692 insertions(+), 25 deletions(-) create mode 100644 src/generated/resources/assets/gtceu/models/item/rubber_boat.json create mode 100644 src/generated/resources/assets/gtceu/models/item/rubber_chest_boat.json create mode 100644 src/generated/resources/assets/gtceu/models/item/treated_wood_boat.json create mode 100644 src/generated/resources/assets/gtceu/models/item/treated_wood_chest_boat.json create mode 100644 src/main/java/com/gregtechceu/gtceu/client/renderer/entity/GTBoatRenderer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/common/entity/GTBoat.java create mode 100644 src/main/java/com/gregtechceu/gtceu/common/entity/GTChestBoat.java create mode 100644 src/main/java/com/gregtechceu/gtceu/common/item/GTBoatItem.java create mode 100644 src/main/java/com/gregtechceu/gtceu/common/item/GTBoatItemDispenseBehaviour.java create mode 100644 src/main/resources/assets/gtceu/textures/entity/boat/rubber_boat.png create mode 100644 src/main/resources/assets/gtceu/textures/entity/boat/rubber_chest_boat.png create mode 100644 src/main/resources/assets/gtceu/textures/entity/boat/treated_boat.png create mode 100644 src/main/resources/assets/gtceu/textures/entity/boat/treated_chest_boat.png create mode 100644 src/main/resources/assets/gtceu/textures/item/rubber_boat.png create mode 100644 src/main/resources/assets/gtceu/textures/item/rubber_chest_boat.png create mode 100644 src/main/resources/assets/gtceu/textures/item/treated_wood_boat.png create mode 100644 src/main/resources/assets/gtceu/textures/item/treated_wood_chest_boat.png diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index add14c8f1b..f0ccff0fc4 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -2586,6 +2586,8 @@ "enchantment.gtceu.disjunction.desc": "˙sqoɯ pǝʇɐןǝɹ-ɹǝpuƎ oʇ ssǝuʍoןS puɐ ssǝuʞɐǝM sǝıןddⱯ", "enchantment.gtceu.hard_hammer.desc": "˙ɹǝɯɯɐH ɥɔǝ⟘bǝɹ⅁ ɐ ɥʇıʍ pǝuıɯ ǝɹǝʍ ʎǝɥʇ ɟı sɐ sʞɔoןq sʞɐǝɹᗺ", "enchantment.hard_hammer": "buıɹǝɯɯɐH", + "entity.gtceu.boat": "ʇɐoᗺ", + "entity.gtceu.chest_boat": "ʇɐoᗺ ʇsǝɥƆ", "entity.gtceu.dynamite": "ǝʇıɯɐuʎᗡ", "entity.gtceu.industrial_tnt": "⟘N⟘ ןɐıɹʇsnpuI", "entity.gtceu.powderbarrel": "ןǝɹɹɐqɹǝpʍoԀ", @@ -4716,6 +4718,8 @@ "item.gtceu.rotor_casting_mold.tooltip": "sɹoʇoᴚ buıʞɐɯ ɹoɟ pןoWㄥ§", "item.gtceu.rotor_extruder_mold": ")ɹoʇoᴚ( pןoW ɹǝpnɹʇxƎ", "item.gtceu.rotor_extruder_mold.tooltip": "sɹoʇoᴚ buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", + "item.gtceu.rubber_boat": "ʇɐoᗺ ɹǝqqnᴚ", + "item.gtceu.rubber_chest_boat": "ʇsǝɥƆ ɥʇıʍ ʇɐoᗺ ɹǝqqnᴚ", "item.gtceu.rubber_gloves": "sǝʌoן⅁ ɹǝqqnᴚ", "item.gtceu.salt_dust": "ʇןɐS", "item.gtceu.saw_extruder_mold.tooltip": "sʍɐS buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", @@ -4928,7 +4932,9 @@ "item.gtceu.tool.wrench.tooltip": "sǝuıɥɔɐW ǝןʇuɐɯsıp oʇ ʞɔıןɔ ʇɟǝן pןoH8§", "item.gtceu.transistor": "ɹoʇsısuɐɹ⟘", "item.gtceu.transistor.tooltip": "ʇuǝuodɯoƆ ɔıuoɹʇɔǝןƎ ɔısɐᗺㄥ§", + "item.gtceu.treated_wood_boat": "ʇɐoᗺ pooM pǝʇɐǝɹ⟘", "item.gtceu.treated_wood_bolt": "ʞɔıʇS pooM pǝʇɐǝɹ⟘ ʇɹoɥS", + "item.gtceu.treated_wood_chest_boat": "ʇsǝɥƆ ɥʇıʍ ʇɐoᗺ pooM pǝʇɐǝɹ⟘", "item.gtceu.treated_wood_dust": "dןnԀ pooM pǝʇɐǝɹ⟘", "item.gtceu.treated_wood_plate": "ʞuɐןԀ pooM pǝʇɐǝɹ⟘", "item.gtceu.treated_wood_rod": "ʞɔıʇS pooM pǝʇɐǝɹ⟘", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 7c1eb46ed9..08b1471817 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -2586,6 +2586,8 @@ "enchantment.gtceu.disjunction.desc": "Applies Weakness and Slowness to Ender-related mobs.", "enchantment.gtceu.hard_hammer.desc": "Breaks blocks as if they were mined with a GregTech Hammer.", "enchantment.hard_hammer": "Hammering", + "entity.gtceu.boat": "Boat", + "entity.gtceu.chest_boat": "Chest Boat", "entity.gtceu.dynamite": "Dynamite", "entity.gtceu.industrial_tnt": "Industrial TNT", "entity.gtceu.powderbarrel": "Powderbarrel", @@ -4716,6 +4718,8 @@ "item.gtceu.rotor_casting_mold.tooltip": "§7Mold for making Rotors", "item.gtceu.rotor_extruder_mold": "Extruder Mold (Rotor)", "item.gtceu.rotor_extruder_mold.tooltip": "§7Extruder Shape for making Rotors", + "item.gtceu.rubber_boat": "Rubber Boat", + "item.gtceu.rubber_chest_boat": "Rubber Boat with Chest", "item.gtceu.rubber_gloves": "Rubber Gloves", "item.gtceu.salt_dust": "Salt", "item.gtceu.saw_extruder_mold.tooltip": "§7Extruder Shape for making Saws", @@ -4928,7 +4932,9 @@ "item.gtceu.tool.wrench.tooltip": "§8Hold left click to dismantle Machines", "item.gtceu.transistor": "Transistor", "item.gtceu.transistor.tooltip": "§7Basic Electronic Component", + "item.gtceu.treated_wood_boat": "Treated Wood Boat", "item.gtceu.treated_wood_bolt": "Short Treated Wood Stick", + "item.gtceu.treated_wood_chest_boat": "Treated Wood Boat with Chest", "item.gtceu.treated_wood_dust": "Treated Wood Pulp", "item.gtceu.treated_wood_plate": "Treated Wood Plank", "item.gtceu.treated_wood_rod": "Treated Wood Stick", diff --git a/src/generated/resources/assets/gtceu/models/item/rubber_boat.json b/src/generated/resources/assets/gtceu/models/item/rubber_boat.json new file mode 100644 index 0000000000..1298fccf6d --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/item/rubber_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "gtceu:item/rubber_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/rubber_chest_boat.json b/src/generated/resources/assets/gtceu/models/item/rubber_chest_boat.json new file mode 100644 index 0000000000..69a0964968 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/item/rubber_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "gtceu:item/rubber_chest_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/treated_wood_boat.json b/src/generated/resources/assets/gtceu/models/item/treated_wood_boat.json new file mode 100644 index 0000000000..2ad82d61dc --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/item/treated_wood_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "gtceu:item/treated_wood_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/treated_wood_chest_boat.json b/src/generated/resources/assets/gtceu/models/item/treated_wood_chest_boat.json new file mode 100644 index 0000000000..c24d335945 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/item/treated_wood_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "gtceu:item/treated_wood_chest_boat" + } +} \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java index c1f7f35e7e..336acbcfc7 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java @@ -8,22 +8,27 @@ import com.gregtechceu.gtceu.api.gui.compass.GTRecipeViewCreator; import com.gregtechceu.gtceu.api.gui.compass.MultiblockAction; import com.gregtechceu.gtceu.client.particle.HazardParticle; +import com.gregtechceu.gtceu.client.renderer.entity.GTBoatRenderer; import com.gregtechceu.gtceu.client.renderer.entity.GTExplosiveRenderer; import com.gregtechceu.gtceu.common.CommonProxy; import com.gregtechceu.gtceu.common.data.GTBlockEntities; import com.gregtechceu.gtceu.common.data.GTEntityTypes; import com.gregtechceu.gtceu.common.data.GTParticleTypes; +import com.gregtechceu.gtceu.common.entity.GTBoat; import com.gregtechceu.gtceu.utils.input.KeyBind; import com.lowdragmc.lowdraglib.gui.compass.CompassManager; import com.lowdragmc.lowdraglib.gui.compass.component.RecipeComponent; +import net.minecraft.client.model.BoatModel; +import net.minecraft.client.model.ChestBoatModel; import net.minecraft.client.renderer.blockentity.HangingSignRenderer; import net.minecraft.client.renderer.blockentity.SignRenderer; import net.minecraft.client.renderer.entity.ThrownItemRenderer; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.event.EntityRenderersEvent; import net.minecraftforge.client.event.RegisterGuiOverlaysEvent; import net.minecraftforge.client.event.RegisterKeyMappingsEvent; @@ -64,6 +69,15 @@ public void onRegisterEntityRenderers(EntityRenderersEvent.RegisterRenderers eve event.registerBlockEntityRenderer(GTBlockEntities.GT_SIGN.get(), SignRenderer::new); event.registerBlockEntityRenderer(GTBlockEntities.GT_HANGING_SIGN.get(), HangingSignRenderer::new); + + event.registerEntityRenderer(GTEntityTypes.BOAT.get(), c -> new GTBoatRenderer(c, false)); + event.registerEntityRenderer(GTEntityTypes.CHEST_BOAT.get(), c -> new GTBoatRenderer(c, true)); + + for (var type : GTBoat.BoatType.values()) { + ForgeHooksClient.registerLayerDefinition(GTBoatRenderer.getBoatModelName(type), BoatModel::createBodyModel); + ForgeHooksClient.registerLayerDefinition(GTBoatRenderer.getChestBoatModelName(type), + ChestBoatModel::createBodyModel); + } } @SubscribeEvent diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/entity/GTBoatRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/entity/GTBoatRenderer.java new file mode 100644 index 0000000000..f5b3d71d55 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/entity/GTBoatRenderer.java @@ -0,0 +1,60 @@ +package com.gregtechceu.gtceu.client.renderer.entity; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.common.entity.GTBoat; +import com.gregtechceu.gtceu.common.entity.GTChestBoat; + +import net.minecraft.client.model.BoatModel; +import net.minecraft.client.model.ChestBoatModel; +import net.minecraft.client.model.ListModel; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.entity.BoatRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.vehicle.Boat; + +import com.google.common.collect.ImmutableMap; +import com.mojang.datafixers.util.Pair; + +import java.util.Map; +import java.util.stream.Stream; + +public class GTBoatRenderer extends BoatRenderer { + + private final Map>> boats; + + public GTBoatRenderer(EntityRendererProvider.Context context, boolean chestBoat) { + super(context, chestBoat); + boats = Stream.of(GTBoat.BoatType.values()).collect(ImmutableMap.toImmutableMap(k -> k, + (m) -> Pair.of(new ResourceLocation(GTCEu.MOD_ID, + getTextureLocation(m, chestBoat)), createBoatModel(context, m, chestBoat)))); + } + + @Override + public Pair> getModelWithLocation(Boat boat) { + if (boat instanceof GTChestBoat gtcb) { + return this.boats.get(gtcb.getBoatType()); + } else + return this.boats.get(((GTBoat) boat).getBoatType()); + } + + private static String getTextureLocation(GTBoat.BoatType type, boolean chest) { + return chest ? "textures/entity/boat/" + type.getName() + "_chest_boat.png" : + "textures/entity/boat/" + type.getName() + "_boat.png"; + } + + private BoatModel createBoatModel(EntityRendererProvider.Context context, GTBoat.BoatType type, boolean chest) { + ModelLayerLocation modelLoc = chest ? getChestBoatModelName(type) : getBoatModelName(type); + ModelPart part = context.bakeLayer(modelLoc); + return chest ? new ChestBoatModel(part) : new BoatModel(part); + } + + public static ModelLayerLocation getChestBoatModelName(GTBoat.BoatType type) { + return new ModelLayerLocation(new ResourceLocation(GTCEu.MOD_ID, "chest_boat/" + type.getName()), "main"); + } + + public static ModelLayerLocation getBoatModelName(GTBoat.BoatType type) { + return new ModelLayerLocation(new ResourceLocation(GTCEu.MOD_ID, "boat/" + type.getName()), "main"); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java index efdfa08f54..3d1c611ff9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java @@ -1298,6 +1298,7 @@ public static ItemColor leavesItemColor() { .tag(ItemTags.WOODEN_FENCES) .build() .register(); + public static final BlockEntry TREATED_WOOD_SIGN = REGISTRATE .block("treated_wood_sign", (p) -> new GTStandingSignBlock(p, TREATED_WOOD_TYPE)) .initialProperties(() -> Blocks.SPRUCE_SIGN) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTEntityTypes.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTEntityTypes.java index 13a09ffdcf..5a7d473cce 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTEntityTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTEntityTypes.java @@ -1,8 +1,6 @@ package com.gregtechceu.gtceu.common.data; -import com.gregtechceu.gtceu.common.entity.DynamiteEntity; -import com.gregtechceu.gtceu.common.entity.IndustrialTNTEntity; -import com.gregtechceu.gtceu.common.entity.PowderbarrelEntity; +import com.gregtechceu.gtceu.common.entity.*; import net.minecraft.tags.EntityTypeTags; import net.minecraft.world.entity.MobCategory; @@ -32,5 +30,17 @@ public class GTEntityTypes { .properties(builder -> builder.sized(0.98F, 0.98F).fireImmune().clientTrackingRange(10).updateInterval(10)) .register(); + public static final EntityEntry BOAT = REGISTRATE + .entity("boat", GTBoat::new, MobCategory.MISC) + .lang("Boat") + .properties(builder -> builder.sized(1.375f, 0.5625f).clientTrackingRange(10)) + .register(); + + public static final EntityEntry CHEST_BOAT = REGISTRATE + .entity("chest_boat", GTChestBoat::new, MobCategory.MISC) + .lang("Chest Boat") + .properties(builder -> builder.sized(1.375f, 0.5625f).clientTrackingRange(10)) + .register(); + public static void init() {} } diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java index 92ed72be06..167fa50dd5 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java @@ -31,6 +31,7 @@ import com.gregtechceu.gtceu.api.registry.registrate.CompassSection; import com.gregtechceu.gtceu.api.registry.registrate.GTRegistrate; import com.gregtechceu.gtceu.common.data.materials.GTFoods; +import com.gregtechceu.gtceu.common.entity.GTBoat; import com.gregtechceu.gtceu.common.item.*; import com.gregtechceu.gtceu.common.item.armor.*; import com.gregtechceu.gtceu.common.item.tool.behavior.LighterBehavior; @@ -2698,6 +2699,27 @@ public Component getItemName(ItemStack stack) { public static ItemEntry BLACKLIGHT = REGISTRATE.item("blacklight", Item::new) .onRegister(compassNode(GTCompassSections.MISC)).register(); + public static ItemEntry RUBBER_BOAT = REGISTRATE + .item("rubber_boat", p -> new GTBoatItem(false, GTBoat.BoatType.RUBBER, new Item.Properties())) + .lang("Rubber Boat") + .register(); + + public static ItemEntry TREATED_WOOD_BOAT = REGISTRATE + .item("treated_wood_boat", p -> new GTBoatItem(false, GTBoat.BoatType.TREATED_WOOD, new Item.Properties())) + .lang("Treated Wood Boat") + .register(); + + public static ItemEntry RUBBER_CHEST_BOAT = REGISTRATE + .item("rubber_chest_boat", p -> new GTBoatItem(true, GTBoat.BoatType.RUBBER, new Item.Properties())) + .lang("Rubber Boat with Chest") + .register(); + + public static ItemEntry TREATED_WOOD_CHEST_BOAT = REGISTRATE + .item("treated_wood_chest_boat", + p -> new GTBoatItem(true, GTBoat.BoatType.TREATED_WOOD, new Item.Properties())) + .lang("Treated Wood Boat with Chest") + .register(); + public static void init() { generateMaterialItems(); generateTools(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTMaterials.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTMaterials.java index 224eaf27af..1119778619 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTMaterials.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTMaterials.java @@ -123,6 +123,7 @@ public static void init() { ingot.setIgnored(Iron, Items.IRON_INGOT); ingot.setIgnored(Gold, Items.GOLD_INGOT); ingot.setIgnored(Copper, Items.COPPER_INGOT); + ingot.setIgnored(Brick, Items.BRICK); ingot.setIgnored(Wax, Items.HONEYCOMB); nugget.setIgnored(Gold, Items.GOLD_NUGGET); diff --git a/src/main/java/com/gregtechceu/gtceu/common/entity/GTBoat.java b/src/main/java/com/gregtechceu/gtceu/common/entity/GTBoat.java new file mode 100644 index 0000000000..6986a26b67 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/entity/GTBoat.java @@ -0,0 +1,123 @@ +package com.gregtechceu.gtceu.common.entity; + +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTEntityTypes; +import com.gregtechceu.gtceu.common.data.GTItems; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; + +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; + +public class GTBoat extends Boat { + + public GTBoat(EntityType entityType, Level level) { + super(entityType, level); + this.blocksBuilding = true; + } + + public GTBoat(Level level, double x, double y, double z) { + super(GTEntityTypes.BOAT.get(), level); + this.setPos(x, y, z); + this.xo = x; + this.yo = y; + this.zo = z; + } + + @Nullable + @Override + public Component getCustomName() { + return super.getCustomName(); + } + + @Override + public Packet getAddEntityPacket() { + return new ClientboundAddEntityPacket(this); + } + + @Override + protected void addAdditionalSaveData(CompoundTag compound) { + compound.putString("Type", getBoatType().getName()); + } + + @Override + protected void readAdditionalSaveData(CompoundTag compound) { + if (compound.contains("Type")) { + entityData.set(DATA_ID_TYPE, BoatType.byName(compound.getString("Type")).ordinal()); + } + } + + @Override + public Item getDropItem() { + return switch (BoatType.byId(this.entityData.get(DATA_ID_TYPE))) { + case RUBBER -> GTItems.RUBBER_BOAT.get(); + case TREATED_WOOD -> GTItems.TREATED_WOOD_BOAT.get(); + }; + } + + public void setBoatType(BoatType type) { + this.entityData.set(DATA_ID_TYPE, type.ordinal()); + } + + public BoatType getBoatType() { + return BoatType.byId(entityData.get(DATA_ID_TYPE)); + } + + @Override + public void setVariant(Type variant) {} + + @Override + public Type getVariant() { + return Type.OAK; + } + + public enum BoatType { + + RUBBER("rubber", GTBlocks.RUBBER_PLANK.get()), + TREATED_WOOD("treated", GTBlocks.TREATED_WOOD_PLANK.get()); + + private final String name; + private final Block planks; + + private static final BoatType[] VALUES = values(); + + private BoatType(String name, Block planks) { + this.name = name; + this.planks = planks; + } + + public String getName() { + return this.name; + } + + public Block getPlanks() { + return this.planks; + } + + public String toString() { + return this.name; + } + + /** + * Get a boat type by its enum ordinal + */ + public static BoatType byId(int id) { + if (id < 0 || id >= VALUES.length) id = 0; + return VALUES[id]; + } + + public static BoatType byName(String name) { + return Arrays.stream(VALUES).filter(type -> type.getName().equals(name)).findFirst().orElse(VALUES[0]); + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/entity/GTChestBoat.java b/src/main/java/com/gregtechceu/gtceu/common/entity/GTChestBoat.java new file mode 100644 index 0000000000..81825a0b61 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/entity/GTChestBoat.java @@ -0,0 +1,71 @@ +package com.gregtechceu.gtceu.common.entity; + +import com.gregtechceu.gtceu.common.data.GTEntityTypes; +import com.gregtechceu.gtceu.common.data.GTItems; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.entity.vehicle.ChestBoat; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.Level; + +public class GTChestBoat extends ChestBoat { + + public GTChestBoat(EntityType entityType, Level level) { + super(entityType, level); + this.blocksBuilding = true; + } + + public GTChestBoat(Level level, double x, double y, double z) { + super(GTEntityTypes.CHEST_BOAT.get(), level); + this.setPos(x, y, z); + this.xo = x; + this.yo = y; + this.zo = z; + } + + @Override + public Packet getAddEntityPacket() { + return new ClientboundAddEntityPacket(this); + } + + @Override + protected void addAdditionalSaveData(CompoundTag compound) { + compound.putString("Type", getBoatType().getName()); + } + + @Override + protected void readAdditionalSaveData(CompoundTag compound) { + if (compound.contains("Type")) { + entityData.set(DATA_ID_TYPE, GTBoat.BoatType.byName(compound.getString("Type")).ordinal()); + } + } + + @Override + public Item getDropItem() { + return switch (GTBoat.BoatType.byId(this.entityData.get(DATA_ID_TYPE))) { + case RUBBER -> GTItems.RUBBER_CHEST_BOAT.get(); + case TREATED_WOOD -> GTItems.TREATED_WOOD_CHEST_BOAT.get(); + }; + } + + public void setBoatType(GTBoat.BoatType type) { + this.entityData.set(DATA_ID_TYPE, type.ordinal()); + } + + public GTBoat.BoatType getBoatType() { + return GTBoat.BoatType.byId(entityData.get(DATA_ID_TYPE)); + } + + @Override + public void setVariant(Type variant) {} + + @Override + public Type getVariant() { + return Type.OAK; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/GTBoatItem.java b/src/main/java/com/gregtechceu/gtceu/common/item/GTBoatItem.java new file mode 100644 index 0000000000..945cc8a009 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/item/GTBoatItem.java @@ -0,0 +1,91 @@ +package com.gregtechceu.gtceu.common.item; + +import com.gregtechceu.gtceu.common.entity.GTBoat; +import com.gregtechceu.gtceu.common.entity.GTChestBoat; + +import net.minecraft.stats.Stats; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntitySelector; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; + +import java.util.List; +import java.util.function.Predicate; + +public class GTBoatItem extends Item { + + private static final Predicate ENTITY_PREDICATE = EntitySelector.NO_SPECTATORS.and(Entity::isPickable); + private final GTBoat.BoatType type; + private final boolean hasChest; + + public GTBoatItem(boolean hasChest, GTBoat.BoatType type, Item.Properties properties) { + super(properties); + this.hasChest = hasChest; + this.type = type; + DispenserBlock.registerBehavior(this, new GTBoatItemDispenseBehaviour(type, hasChest)); + } + + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + ItemStack itemstack = player.getItemInHand(hand); + HitResult hitresult = getPlayerPOVHitResult(level, player, ClipContext.Fluid.ANY); + if (hitresult.getType() == HitResult.Type.MISS) { + return InteractionResultHolder.pass(itemstack); + } else { + Vec3 vec3 = player.getViewVector(1.0F); + double d0 = 5.0; + List list = level.getEntities(player, + player.getBoundingBox().expandTowards(vec3.scale(5.0)).inflate(1.0), ENTITY_PREDICATE); + if (!list.isEmpty()) { + Vec3 vec31 = player.getEyePosition(); + for (Entity e : list) { + AABB aabb = e.getBoundingBox().inflate((double) e.getPickRadius()); + if (aabb.contains(vec31)) { + return InteractionResultHolder.pass(itemstack); + } + } + } + + if (hitresult.getType() == HitResult.Type.BLOCK) { + Boat boat; + if (hasChest) { + boat = new GTChestBoat(level, hitresult.getLocation().x, hitresult.getLocation().y, + hitresult.getLocation().z); + ((GTChestBoat) boat).setBoatType(type); + } else { + boat = new GTBoat(level, hitresult.getLocation().x, hitresult.getLocation().y, + hitresult.getLocation().z); + ((GTBoat) boat).setBoatType(type); + } + + boat.setYRot(player.getYRot()); + if (!level.noCollision(boat, boat.getBoundingBox())) { + return InteractionResultHolder.fail(itemstack); + } else { + if (!level.isClientSide) { + level.addFreshEntity(boat); + level.gameEvent(player, GameEvent.ENTITY_PLACE, hitresult.getLocation()); + if (!player.getAbilities().instabuild) { + itemstack.shrink(1); + } + } + + player.awardStat(Stats.ITEM_USED.get(this)); + return InteractionResultHolder.sidedSuccess(itemstack, level.isClientSide()); + } + } else { + return InteractionResultHolder.pass(itemstack); + } + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/GTBoatItemDispenseBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/GTBoatItemDispenseBehaviour.java new file mode 100644 index 0000000000..edad373466 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/item/GTBoatItemDispenseBehaviour.java @@ -0,0 +1,72 @@ +package com.gregtechceu.gtceu.common.item; + +import com.gregtechceu.gtceu.common.entity.GTBoat; +import com.gregtechceu.gtceu.common.entity.GTChestBoat; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockSource; +import net.minecraft.core.Direction; +import net.minecraft.core.dispenser.DefaultDispenseItemBehavior; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.DispenserBlock; + +public class GTBoatItemDispenseBehaviour extends DefaultDispenseItemBehavior { + + private final DefaultDispenseItemBehavior defaultDispenseItemBehavior = new DefaultDispenseItemBehavior(); + private final GTBoat.BoatType type; + private final boolean isChestBoat; + + public GTBoatItemDispenseBehaviour(GTBoat.BoatType type) { + this(type, false); + } + + public GTBoatItemDispenseBehaviour(GTBoat.BoatType type, boolean isChestBoat) { + this.type = type; + this.isChestBoat = isChestBoat; + } + + public ItemStack execute(BlockSource source, ItemStack stack) { + Direction direction = (Direction) source.getBlockState().getValue(DispenserBlock.FACING); + Level level = source.getLevel(); + double d0 = 0.5625 + (double) EntityType.BOAT.getWidth() / 2.0; + double d1 = source.x() + (double) direction.getStepX() * d0; + double d2 = source.y() + (double) ((float) direction.getStepY() * 1.125F); + double d3 = source.z() + (double) direction.getStepZ() * d0; + BlockPos blockpos = source.getPos().relative(direction); + + Boat boat; + if (isChestBoat) { + boat = new GTChestBoat(level, d0, d1, d2); + ((GTChestBoat) boat).setBoatType(type); + } else { + boat = new GTBoat(level, d0, d1, d2); + ((GTBoat) boat).setBoatType(type); + } + + boat.setYRot(direction.toYRot()); + double d4; + if (((Boat) boat).canBoatInFluid(level.getFluidState(blockpos))) { + d4 = 1.0; + } else { + if (!level.getBlockState(blockpos).isAir() || + !((Boat) boat).canBoatInFluid(level.getFluidState(blockpos.below()))) { + return this.defaultDispenseItemBehavior.dispense(source, stack); + } + + d4 = 0.0; + } + + ((Boat) boat).setPos(d1, d2 + d4, d3); + level.addFreshEntity((Entity) boat); + stack.shrink(1); + return stack; + } + + protected void playSound(BlockSource source) { + source.getLevel().levelEvent(1000, source.getPos(), 0); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/WoodTypeEntry.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/WoodTypeEntry.java index 82e4334adf..ddab441154 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/WoodTypeEntry.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/WoodTypeEntry.java @@ -80,6 +80,14 @@ public final class WoodTypeEntry { public final Item chestBoat; @Nullable public final String chestBoatRecipeName; + @Nullable + public final Item sign; + @Nullable + public final String signRecipeName; + @Nullable + public final Item hangingSign; + @Nullable + public final String hangingSignRecipeName; public final Material material; public final boolean addLogOreDict; @@ -115,6 +123,8 @@ private WoodTypeEntry(@NotNull String modid, @NotNull String woodName, @NotNull @Nullable Item stairs, @Nullable String stairsRecipeName, boolean addStairsCraftingRecipe, @Nullable Item boat, @Nullable String boatRecipeName, @Nullable Item chestBoat, @Nullable String chestBoatRecipeName, + @Nullable Item sign, @Nullable String signRecipeName, + @Nullable Item hangingSign, @Nullable String hangingSignRecipeName, @Nullable Material material, boolean addLogOreDict, boolean addPlanksOreDict, boolean addDoorsOreDict, boolean addSlabsOreDict, @@ -153,6 +163,10 @@ private WoodTypeEntry(@NotNull String modid, @NotNull String woodName, @NotNull this.boatRecipeName = boatRecipeName; this.chestBoat = chestBoat; this.chestBoatRecipeName = chestBoatRecipeName; + this.sign = sign; + this.signRecipeName = signRecipeName; + this.hangingSign = hangingSign; + this.hangingSignRecipeName = hangingSignRecipeName; this.material = material != null ? material : GTMaterials.Wood; this.addLogOreDict = addLogOreDict; @@ -219,6 +233,10 @@ public static class Builder { private String boatRecipeName; private Item chestBoat = null; private String chestBoatRecipeName; + private Item sign = null; + private String signRecipeName; + private Item hangingSign = null; + private String hangingSignRecipeName; @Nullable private Material material = null; @@ -462,6 +480,32 @@ public Builder chestBoat(@NotNull Item chestBoat, @Nullable String chestBoatReci return this; } + /** + * Add an entry for a sign + * + * @param sign the sign to add + * @param signRecipeName the recipe name for crafting the sign + * @return this + */ + public Builder sign(@NotNull Item sign, @Nullable String signRecipeName) { + this.sign = sign; + this.signRecipeName = signRecipeName; + return this; + } + + /** + * Add an entry for a sign + * + * @param hangingSign the hanging sign to add + * @param hangingSignRecipeName the recipe name for crafting the hanging sign + * @return this + */ + public Builder hangingSign(@NotNull Item hangingSign, @Nullable String hangingSignRecipeName) { + this.hangingSign = hangingSign; + this.hangingSignRecipeName = hangingSignRecipeName; + return this; + } + /** * Specify material for wood entry. If not provided, {@link GTMaterials#Wood} will be used * @@ -573,6 +617,7 @@ public WoodTypeEntry build() { fence, fenceRecipeName, fenceGate, fenceGateRecipeName, stairs, stairsRecipeName, addStairsCraftingRecipe, boat, boatRecipeName, chestBoat, chestBoatRecipeName, + sign, signRecipeName, hangingSign, hangingSignRecipeName, material, addLogOreDict, addPlanksOreDict, addDoorsOreDict, addSlabsOreDict, addFencesOreDict, addFenceGatesOreDict, addStairsOreDict, addPlanksUnificationInfo, diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/WoodMachineRecipes.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/WoodMachineRecipes.java index d5421a05ea..6674b5b159 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/WoodMachineRecipes.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/WoodMachineRecipes.java @@ -8,6 +8,7 @@ import com.gregtechceu.gtceu.api.data.chemical.material.stack.UnificationEntry; import com.gregtechceu.gtceu.api.data.tag.TagUtil; import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.recipe.VanillaRecipeHelper; @@ -65,6 +66,8 @@ private static List getDefaultEntries() { .stairs(Items.OAK_STAIRS, "oak_stairs") .boat(Items.OAK_BOAT, "oak_boat") .chestBoat(Items.OAK_CHEST_BOAT, "oak_chest_boat") + .sign(Items.OAK_SIGN, "oak_sign") + .hangingSign(Items.OAK_HANGING_SIGN, "oak_hanging_sign") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "spruce") @@ -81,6 +84,8 @@ private static List getDefaultEntries() { .stairs(Items.SPRUCE_STAIRS, "spruce_stairs") .boat(Items.SPRUCE_BOAT, "spruce_boat") .chestBoat(Items.SPRUCE_CHEST_BOAT, "spruce_chest_boat") + .sign(Items.SPRUCE_SIGN, "spruce_sign") + .hangingSign(Items.SPRUCE_HANGING_SIGN, "spruce_hanging_sign") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "birch") @@ -97,6 +102,8 @@ private static List getDefaultEntries() { .stairs(Items.BIRCH_STAIRS, "birch_stairs") .boat(Items.BIRCH_BOAT, "birch_boat") .chestBoat(Items.BIRCH_CHEST_BOAT, "birch_chest_boat") + .sign(Items.BIRCH_SIGN, "birch_sign") + .hangingSign(Items.BIRCH_HANGING_SIGN, "birch_hanging_sign") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "jungle") @@ -113,6 +120,8 @@ private static List getDefaultEntries() { .stairs(Items.JUNGLE_STAIRS, "jungle_stairs") .boat(Items.JUNGLE_BOAT, "jungle_boat") .chestBoat(Items.JUNGLE_CHEST_BOAT, "jungle_chest_boat") + .sign(Items.JUNGLE_SIGN, "jungle_sign") + .hangingSign(Items.JUNGLE_HANGING_SIGN, "jungle_hanging_sign") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "acacia") @@ -129,6 +138,8 @@ private static List getDefaultEntries() { .stairs(Items.ACACIA_STAIRS, "acacia_stairs") .boat(Items.ACACIA_BOAT, "acacia_boat") .chestBoat(Items.ACACIA_CHEST_BOAT, "acacia_chest_boat") + .sign(Items.ACACIA_SIGN, "acacia_sign") + .hangingSign(Items.ACACIA_HANGING_SIGN, "acacia_hanging_sign") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "dark_oak") @@ -145,6 +156,8 @@ private static List getDefaultEntries() { .stairs(Items.DARK_OAK_STAIRS, "dark_oak_stairs") .boat(Items.DARK_OAK_BOAT, "dark_oak_boat") .chestBoat(Items.DARK_OAK_CHEST_BOAT, "dark_oak_chest_boat") + .sign(Items.DARK_OAK_SIGN, "dark_oak_sign") + .hangingSign(Items.DARK_OAK_HANGING_SIGN, "dark_oak_hanging_sign") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "bamboo") @@ -160,6 +173,8 @@ private static List getDefaultEntries() { .stairs(Items.BAMBOO_STAIRS, "bamboo_stairs") .boat(Items.BAMBOO_RAFT, "bamboo_raft") .chestBoat(Items.BAMBOO_CHEST_RAFT, "bamboo_chest_raft") + .sign(Items.BAMBOO_SIGN, "bamboo_sign") + .hangingSign(Items.BAMBOO_HANGING_SIGN, "bamboo_hanging_sign") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "cherry") @@ -176,6 +191,8 @@ private static List getDefaultEntries() { .stairs(Items.CHERRY_STAIRS, "cherry_stairs") .boat(Items.CHERRY_BOAT, "cherry_boat") .chestBoat(Items.CHERRY_CHEST_BOAT, "cherry_chest_boat") + .sign(Items.CHERRY_SIGN, "cherry_sign") + .hangingSign(Items.CHERRY_HANGING_SIGN, "cherry_hanging_sign") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "mangrove") @@ -192,6 +209,8 @@ private static List getDefaultEntries() { .stairs(Items.MANGROVE_STAIRS, "mangrove_stairs") .boat(Items.MANGROVE_BOAT, "mangrove_boat") .chestBoat(Items.MANGROVE_CHEST_BOAT, "mangrove_chest_boat") + .sign(Items.MANGROVE_SIGN, "mangrove_sign") + .hangingSign(Items.MANGROVE_HANGING_SIGN, "mangrove_hanging_sign") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "crimson") @@ -207,6 +226,8 @@ private static List getDefaultEntries() { .fence(Items.CRIMSON_FENCE, "crimson_fence") .fenceGate(Items.CRIMSON_FENCE_GATE, "crimson_fence_gate") .stairs(Items.CRIMSON_STAIRS, "crimson_stairs") + .sign(Items.CRIMSON_SIGN, "crimson_sign") + .hangingSign(Items.CRIMSON_HANGING_SIGN, "crimson_hanging_sign") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "warped") @@ -222,6 +243,8 @@ private static List getDefaultEntries() { .fence(Items.WARPED_FENCE, "warped_fence") .fenceGate(Items.WARPED_FENCE_GATE, "warped_fence_gate") .stairs(Items.WARPED_STAIRS, "warped_stairs") + .sign(Items.WARPED_SIGN, "warped_sign") + .hangingSign(Items.WARPED_HANGING_SIGN, "warped_hanging_sign") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(GTCEu.MOD_ID, "rubber") @@ -231,12 +254,15 @@ private static List getDefaultEntries() { .wood(GTBlocks.RUBBER_WOOD.asItem()) .strippedWood(GTBlocks.STRIPPED_RUBBER_WOOD.asItem()) .door(GTBlocks.RUBBER_DOOR.asItem(), null) - .trapdoor(GTBlocks.RUBBER_TRAPDOOR.asItem(), null) + .trapdoor(GTBlocks.RUBBER_TRAPDOOR.asItem(), "rubber_trapdoor") .slab(GTBlocks.RUBBER_SLAB.asItem(), null).addSlabRecipe() .fence(GTBlocks.RUBBER_FENCE.asItem(), null) .fenceGate(GTBlocks.RUBBER_FENCE_GATE.asItem(), null) .stairs(GTBlocks.RUBBER_STAIRS.asItem(), null).addStairsRecipe() - // .boat(GTItems.RUBBER_BOAT.asItem(), null) // TODO someone forgot boat textures. + .boat(GTItems.RUBBER_BOAT.asItem(), null) + .chestBoat(GTItems.RUBBER_CHEST_BOAT.asItem(), null) + .sign(GTBlocks.RUBBER_SIGN.asItem(), null) + .hangingSign(GTBlocks.RUBBER_HANGING_SIGN.asItem(), null) .generateLogToPlankRecipe(false) // rubber log does not have a tag .registerAllTags() .registerAllUnificationInfo() @@ -249,10 +275,12 @@ private static List getDefaultEntries() { .fence(GTBlocks.TREATED_WOOD_FENCE.asItem(), null) .fenceGate(GTBlocks.TREATED_WOOD_FENCE_GATE.asItem(), null) .stairs(GTBlocks.TREATED_WOOD_STAIRS.asItem(), null).addStairsRecipe() - // .boat(GTItems.TREATED_WOOD_BOAT.asItem(), null) // TODO someone forgot boat textures. + .boat(GTItems.TREATED_WOOD_BOAT.asItem(), null) + .chestBoat(GTItems.TREATED_WOOD_CHEST_BOAT.asItem(), null) + .sign(GTBlocks.TREATED_WOOD_SIGN.asItem(), null) + .hangingSign(GTBlocks.TREATED_WOOD_HANGING_SIGN.asItem(), null) .material(TreatedWood) - .generateLogToPlankRecipe(false) - .registerAllUnificationInfo() + .registerUnificationInfo(false, true, true, true, true, true, true, true) .build()); } return DEFAULT_ENTRIES; @@ -458,6 +486,102 @@ public static void registerWoodTypeRecipe(Consumer provider, @No } } + // sign + if (entry.sign != null && entry.slab != null) { + final boolean hasSignRecipe = entry.signRecipeName != null; + String recipeName = hasSignRecipe ? entry.signRecipeName : name + "_sign"; + if (ConfigHolder.INSTANCE.recipes.hardWoodRecipes) { + VanillaRecipeHelper.addShapedRecipe(provider, recipeName + "_iron", new ItemStack(entry.sign), + "LLL", "rPr", "sSd", + 'P', entry.planks, + 'r', new UnificationEntry(screw, Iron), + 'L', entry.slab, + 'S', entry.getStick()); + + // plank -> sign assembling + ASSEMBLER_RECIPES.recipeBuilder(recipeName + "_iron") + .circuitMeta(4) + .inputItems(new ItemStack(entry.slab, 1)) + .inputItems(entry.getStick(), 1) + .inputFluids(Iron.getFluid(GTValues.L / 9)) + .outputItems(entry.sign, 3) + .duration(200).EUt(4).save(provider); + + VanillaRecipeHelper.addShapedRecipe(provider, recipeName + "_steel", new ItemStack(entry.sign, 2), + "LLL", "rPr", "sSd", + 'P', entry.planks, + 'r', new UnificationEntry(screw, Steel), + 'L', entry.slab, + 'S', entry.getStick()); + + // plank -> sign assembling + ASSEMBLER_RECIPES.recipeBuilder(recipeName + "_steel") + .circuitMeta(4) + .inputItems(new ItemStack(entry.slab, 1)) + .inputItems(entry.getStick(), 1) + .inputFluids(Steel.getFluid(GTValues.L / 9)) + .outputItems(entry.sign, 5) + .duration(200).EUt(4).save(provider); + } else { + VanillaRecipeHelper.addShapedRecipe(provider, recipeName, new ItemStack(entry.sign, 3), + "PPP", "PPP", " s ", + 'P', entry.planks, + 's', entry.getStick()); + } + + if (entry.hangingSign != null) { + final boolean hasHangingSignRecipe = entry.hangingSignRecipeName != null; + String recipeNameHanging = hasHangingSignRecipe ? entry.hangingSignRecipeName : name + "_hanging_sign"; + ASSEMBLER_RECIPES.recipeBuilder(recipeNameHanging) + .inputItems(entry.sign) + .inputItems(ring, Iron, 2) + .inputItems(Items.CHAIN, 2) + .circuitMeta(5) + .duration(150) + .EUt(4) + .save(provider); + } + } + + // trapdoor + if (entry.trapdoor != null) { + final boolean hasTrapdoorRecipe = entry.trapdoorRecipeName != null; + String recipeName = hasTrapdoorRecipe ? entry.trapdoorRecipeName : name + "_trapdoor"; + if (ConfigHolder.INSTANCE.recipes.hardWoodRecipes) { + VanillaRecipeHelper.addShapedRecipe(provider, recipeName + "_iron", new ItemStack(entry.trapdoor), + "bPS", "PdP", "SPb", + 'P', entry.planks, + 'b', new UnificationEntry(bolt, Iron), + 'S', entry.getStick()); + + // plank -> trapdoor assembling + ASSEMBLER_RECIPES.recipeBuilder(recipeName + "_iron") + .circuitMeta(3) + .inputItems(new ItemStack(entry.planks, 2)) + .inputFluids(Iron.getFluid(GTValues.L / 9)) + .outputItems(entry.trapdoor) + .duration(200).EUt(4).save(provider); + + VanillaRecipeHelper.addShapedRecipe(provider, recipeName + "_steel", new ItemStack(entry.trapdoor, 2), + "bPS", "PdP", "SPb", + 'P', entry.planks, + 'b', new UnificationEntry(bolt, Steel), + 'S', entry.getStick()); + + // plank -> trapdoor assembling + ASSEMBLER_RECIPES.recipeBuilder(recipeName + "_steel") + .circuitMeta(3) + .inputItems(new ItemStack(entry.planks, 2)) + .inputFluids(Steel.getFluid(GTValues.L / 9)) + .outputItems(entry.trapdoor, 2) + .duration(200).EUt(4).save(provider); + } else { + VanillaRecipeHelper.addShapedRecipe(provider, recipeName, new ItemStack(entry.trapdoor, 2), + "PPP", "PPP", + 'P', entry.planks); + } + } + // stairs if (entry.stairs != null) { final boolean hasStairRecipe = entry.stairsRecipeName != null; @@ -592,29 +716,24 @@ public static void registerWoodTypeRecipe(Consumer provider, @No // chest boat if (entry.chestBoat != null) { final boolean hasChestBoatRecipe = entry.chestBoatRecipeName != null; + String recipeName = hasChestBoatRecipe ? entry.chestBoatRecipeName : name + "_chest_boat"; if (ConfigHolder.INSTANCE.recipes.hardWoodRecipes) { - if (entry.boat != null) { - - VanillaRecipeHelper.addShapedRecipe(provider, - hasChestBoatRecipe ? entry.chestBoatRecipeName : name + "_chest_boat", - new ItemStack(entry.chestBoat), - " B ", "SCS", " w ", - 'B', entry.boat, - 'S', new UnificationEntry(bolt, Wood), - 'C', Tags.Items.CHESTS_WOODEN); - } + VanillaRecipeHelper.addShapedRecipe(provider, recipeName, + new ItemStack(entry.chestBoat), + " B ", "SCS", " w ", + 'B', entry.boat, + 'S', new UnificationEntry(bolt, Wood), + 'C', Tags.Items.CHESTS_WOODEN); } else { - if (!hasChestBoatRecipe) { - VanillaRecipeHelper.addShapelessRecipe(provider, name + "_chest_boat", - new ItemStack(entry.chestBoat), - entry.boat, Tags.Items.CHESTS); - } + VanillaRecipeHelper.addShapelessRecipe(provider, recipeName, + new ItemStack(entry.chestBoat), + entry.boat, Tags.Items.CHESTS_WOODEN); } - // plank -> boat assembling + // boat -> chest boat assembling ASSEMBLER_RECIPES.recipeBuilder(name + "_chest_boat") .inputItems(new ItemStack(entry.boat)) - .inputItems(Tags.Items.CHESTS) + .inputItems(Tags.Items.CHESTS_WOODEN) .outputItems(entry.chestBoat) .circuitMeta(16) .duration(100).EUt(4).save(provider); diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 6131827e9f..e416b85be7 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -20,6 +20,8 @@ public net.minecraft.world.entity.item.ItemEntity f_31986_ # pickupDelay public net.minecraft.server.network.ServerGamePacketListenerImpl f_9737_ # aboveGroundTickCount public net.minecraft.world.entity.Entity m_20115_(IZ)V # setSharedFlag +public net.minecraft.world.entity.vehicle.Boat f_38285_ # DATA_ID_TYPE + # for AE2 to be able to load (idk why but it needs these?) public net.minecraft.world.level.block.Blocks m_50774_(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)Z # always public net.minecraft.world.level.block.Blocks m_50805_(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)Z # never diff --git a/src/main/resources/assets/gtceu/textures/entity/boat/rubber_boat.png b/src/main/resources/assets/gtceu/textures/entity/boat/rubber_boat.png new file mode 100644 index 0000000000000000000000000000000000000000..97e9a65ef9b698e1e31ddb87af050cd72e5a666e GIT binary patch literal 2872 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/entity/boat/treated_chest_boat.png b/src/main/resources/assets/gtceu/textures/entity/boat/treated_chest_boat.png new file mode 100644 index 0000000000000000000000000000000000000000..f3a00cba8f4ee1cb9de440006eee3b68de0d6d3f GIT binary patch literal 4714 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 a8a`wi?vi0G@9Ogipr>W1*`V?4)qeo+sTg$t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/item/rubber_boat.png b/src/main/resources/assets/gtceu/textures/item/rubber_boat.png new file mode 100644 index 0000000000000000000000000000000000000000..d2998da345c49c0abc68e24c460d8f962e29e16c GIT binary patch literal 614 zcmV-s0-61ZP)Llg(=rQ5400FEcfhnY1%bhz+Ln!w+mD7|?*$MafR; zvf$FSf0JvMf;$Cwv$8Hqp^GLIv9ZNMLYZkM&15n(ljma0q@l|`c-(g%@0@cv_gx{S zthUT>ze~Y5>@J68Bmm{V+mNG9r%0>>svJUsfLxU5&`jsj?qNIE^R; zItT7d={uWc_FB*nBRLUQC%~&wd;@5k1_1e7Ho0$fsaGtVMwF7O{qUxuZ5nufz`IwA zeE!+N%uk*tM4lgD6r(HN|`+Ruw zAT76C%(7gvSuWXp**!~13WmUGbO|ncs7lg6vAT3m)~f|Z z*(_i4pv!_5i?PtB{{Y~;7xDU`mFC-3i`rT)t)yJc;tht>D;B+>BJbv7#EZ%brzaix z{_REzEG{Hw9ku<`+?~xb-e8CuND79))-{|)myD2trA1SG`qrH3`2>92kpve#zU-c1 z>ly_^;0DwA$&BJLe>;9k;tdja-9YlyY0+%{LDw~5WQJlw^0=7e*Lj$jxUo{AdD5n6 zXcTM%*PGJM&uilHa+s0)+jEP)LG#9%OS*Te2WSjJb4Do(o%Kq#aL*YyI3@Wm_HI;lQ|aCDF}yGqIN7>&n+{M84INJvm?w0a=Q!oAx7 ztZ$j!zM_MHyPvOQ>$F_SKz{_+^@7UBIJ2u1D-}wP$J%C%wapqO z$76lV#4?IxZua*KQK>ar0PL3|0R-U1n-)*9!$EbqIXw`WmW}7uI{?$NdA2lz)BG7g z{C3vg?U75z(PBe<{2uCYuG`HH0AROdv6ShBsEW<BKt1~w-!B{H6#`X~-$p~h> z1F1Gc^2&gVc#t0F$6;AMeKZ|_l7pQJc1soj`OgNAAC6$wn;5o4j|vi+N`9w;BBWq+ z__BEUw$L*qU%XeA*e6vswvR|?Dtc64*xeOT&RmaT*$NLlRa<_M8H8yXe~CO_>hDBcT(Ir|IBnVhn5Ln&K)nqkft%YwMI`|5{a0AtTFqxt0L+3l?S>sW6rL|JXTkcP!m%$oJFfEn%MHbBm zO}D^Be?d8C=vM*WeY&RIu=#NtI^2O^v5d8F<=yf2Wlh^XtfZ(r7Inwsyf@JhH!J84 zrfdK+@kfo*yTCVWs3O6fotTf%hl!Q=%s)_i}o9uNS ziNAV^4RGF@;8*tSYx&=Odn{qi^MnQ=@FbCDyI_-~w uu$^3NoVK~?|31n7I!J*DD!#=-$N4vqoX0pCw-fsS0000`p#+r~IOw>VTWT}p_ zl4zV5{R14_9Y_pu=;}y9NQ{evOW6nsxHOW6QjgNYwe)A&>+5j6YtICIk~jCf?|aYZ zd7kgx1Gm`fN>Z+_B;{@QwyC3=hfzOMbMq2leW^P*P0D;OCr01XZ%oH`F6?aUOIJP2yt;Y9K_fQA6+cxvOc8|0V0^`uvPqtK)(w ziK%e_cJ{A^eFZ{JcH7@bHJO^5Cp6*3H2aP=if>Gn)k=Z2)Z z>QR_(yXZjdc0PP7l3vs>uG{Q>KX+wrGzS#`9O_k`#@vtxi2$!(B*!o6uP zrKSZj+8%i)Xd-5Ug5Py1-=u~j&4#QB4)rPk`$r8nQxQtdHhNtW4+^4wAA83Jijabs ziujzZxJ0spf9jGRkjYkv`hCQM0=+&Q5i#w9%QnPRxac8YE(KVQhxwW_IQZ4Hg%Tm4 z4svr)=~1ag{;~s;BV!V@9@1XpxNXJ@D#+0#r2Oy1{?q;dq4e|MoILkd00000NkvXX Hu0mjfpphNC literal 0 HcmV?d00001 From 228ebabaa92250ee9597654ec30dc56893f688fc Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Thu, 19 Sep 2024 03:21:33 -0400 Subject: [PATCH 05/10] Fixed filtering on auto-transfer (#1982) --- .../java/com/gregtechceu/gtceu/api/machine/MetaMachine.java | 4 ++-- .../gtceu/api/machine/trait/NotifiableFluidTank.java | 6 ++++-- .../gtceu/api/machine/trait/NotifiableItemStackHandler.java | 6 ++++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java index 85af6710fe..abdf3fbd3e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -645,7 +645,7 @@ public boolean canConnectRedstone(Direction side) { // ****** Capability ********// ////////////////////////////////////// - protected Predicate getItemCapFilter(@Nullable Direction side) { + public Predicate getItemCapFilter(@Nullable Direction side) { if (side != null) { var cover = getCoverContainer().getCoverAtSide(side); if (cover instanceof ItemFilterCover filterCover) { @@ -655,7 +655,7 @@ protected Predicate getItemCapFilter(@Nullable Direction side) { return item -> true; } - protected Predicate getFluidCapFilter(@Nullable Direction side) { + public Predicate getFluidCapFilter(@Nullable Direction side) { if (side != null) { var cover = getCoverContainer().getCoverAtSide(side); if (cover instanceof FluidFilterCover filterCover) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java index 9a0886a267..d94952c8d6 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java @@ -267,7 +267,8 @@ public void exportToNearby(@NotNull Direction... facings) { var level = getMachine().getLevel(); var pos = getMachine().getPos(); for (Direction facing : facings) { - FluidTransferHelper.exportToTarget(this, Integer.MAX_VALUE, f -> true, level, pos.relative(facing), + FluidTransferHelper.exportToTarget(this, Integer.MAX_VALUE, getMachine().getFluidCapFilter(facing), level, + pos.relative(facing), facing.getOpposite()); } } @@ -276,7 +277,8 @@ public void importFromNearby(@NotNull Direction... facings) { var level = getMachine().getLevel(); var pos = getMachine().getPos(); for (Direction facing : facings) { - FluidTransferHelper.importToTarget(this, Integer.MAX_VALUE, f -> true, level, pos.relative(facing), + FluidTransferHelper.importToTarget(this, Integer.MAX_VALUE, getMachine().getFluidCapFilter(facing), level, + pos.relative(facing), facing.getOpposite()); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java index 739d0ecabe..d48bfa1c87 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java @@ -225,7 +225,8 @@ public void exportToNearby(@NotNull Direction... facings) { var level = getMachine().getLevel(); var pos = getMachine().getPos(); for (Direction facing : facings) { - ItemTransferHelper.exportToTarget(this, Integer.MAX_VALUE, f -> true, level, pos.relative(facing), + ItemTransferHelper.exportToTarget(this, Integer.MAX_VALUE, getMachine().getItemCapFilter(facing), level, + pos.relative(facing), facing.getOpposite()); } } @@ -234,7 +235,8 @@ public void importFromNearby(@NotNull Direction... facings) { var level = getMachine().getLevel(); var pos = getMachine().getPos(); for (Direction facing : facings) { - ItemTransferHelper.importToTarget(this, Integer.MAX_VALUE, f -> true, level, pos.relative(facing), + ItemTransferHelper.importToTarget(this, Integer.MAX_VALUE, getMachine().getItemCapFilter(facing), level, + pos.relative(facing), facing.getOpposite()); } } From 730daaf87f300b734f5be5d001a1416d995bc7b2 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Thu, 19 Sep 2024 15:08:02 -0600 Subject: [PATCH 06/10] Steam Turbine Fix (#1983) --- .../gtceu/api/recipe/modifier/ParallelLogic.java | 6 +++--- .../multiblock/generator/LargeTurbineMachine.java | 9 +++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/modifier/ParallelLogic.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/modifier/ParallelLogic.java index ca54364215..017778e95c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/modifier/ParallelLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/modifier/ParallelLogic.java @@ -124,14 +124,14 @@ public static int limitByOutputMerging(@NotNull GTRecipe recipe, @NotNull IRecip // If we are voiding items, reset the item limit to the maximum number of parallels if (voiding) { if (modifiedParallelAmounts.containsKey(cap)) { - modifiedParallelAmounts.put(cap, modifiedParallelAmounts.getInt(cap) + parallelAmount); + modifiedParallelAmounts.put(cap, Math.min(modifiedParallelAmounts.getInt(cap), parallelAmount)); } else { modifiedParallelAmounts.put(cap, parallelAmount); } } else { if (modifiedParallelAmounts.containsKey(cap)) { - modifiedParallelAmounts.put(cap, modifiedParallelAmounts.getInt(cap) + - cap.limitParallel(recipe, holder, parallelAmount)); + modifiedParallelAmounts.put(cap, Math.min(modifiedParallelAmounts.getInt(cap), + cap.limitParallel(recipe, holder, parallelAmount))); } else { modifiedParallelAmounts.put(cap, cap.limitParallel(recipe, holder, parallelAmount)); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeTurbineMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeTurbineMachine.java index 612f4772ce..3aa735944d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeTurbineMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeTurbineMachine.java @@ -11,6 +11,7 @@ import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; +import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; import com.gregtechceu.gtceu.api.recipe.logic.OCParams; import com.gregtechceu.gtceu.api.recipe.logic.OCResult; import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; @@ -114,6 +115,14 @@ public static GTRecipe recipeModifier(MetaMachine machine, @NotNull GTRecipe rec long eut = turbineMachine.boostProduction((long) (EUt * holderEfficiency * parallelResult.getSecond())); + recipe = new GTRecipe(recipe.recipeType, recipe.id, + recipe.copyContents(recipe.inputs, ContentModifier.multiplier(parallelResult.getSecond())), + recipe.copyContents(recipe.outputs, ContentModifier.multiplier(parallelResult.getSecond())), + recipe.tickInputs, recipe.tickOutputs, recipe.inputChanceLogics, recipe.outputChanceLogics, + recipe.tickInputChanceLogics, recipe.tickOutputChanceLogics, recipe.conditions, + recipe.ingredientActions, + recipe.data, recipe.duration, recipe.isFuel); + result.init(-eut, recipe.duration, parallelResult.getSecond(), params.getOcAmount()); return recipe; From bd63f0c773ff1aee564a864102161bdc8f57704a Mon Sep 17 00:00:00 2001 From: Austin <31421419+Vextin@users.noreply.github.com> Date: Thu, 19 Sep 2024 20:59:37 -0400 Subject: [PATCH 07/10] Add Compressor recipe for snow balls -> snow (#1969) --- .../gtceu/data/recipe/misc/VanillaStandardRecipes.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/VanillaStandardRecipes.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/VanillaStandardRecipes.java index ca7f209f1d..b3e856005a 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/VanillaStandardRecipes.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/VanillaStandardRecipes.java @@ -82,6 +82,11 @@ private static void compressingRecipes(Consumer provider) { .outputItems(new ItemStack(Blocks.CLAY)) .save(provider); + COMPRESSOR_RECIPES.recipeBuilder("snowballs_to_snow").duration(200).EUt(2) + .inputItems(new ItemStack(Items.SNOWBALL, 4)) + .outputItems(new ItemStack(Items.SNOW_BLOCK)) + .save(provider); + COMPRESSOR_RECIPES.recipeBuilder("glowstone").duration(300).EUt(2) .inputItems(new ItemStack(Items.GLOWSTONE_DUST, 4)) .outputItems(new ItemStack(Blocks.GLOWSTONE)) From a9d278ff217abc590c07f69ee2021403aadcae47 Mon Sep 17 00:00:00 2001 From: a-a-GiTHuB-a-a <64599476+a-a-GiTHuB-a-a@users.noreply.github.com> Date: Thu, 19 Sep 2024 21:25:58 -0400 Subject: [PATCH 08/10] Added rubber log variants to #minecraft:logs_that_burn (#1914) --- .../minecraft/tags/blocks/logs_that_burn.json | 7 +++++-- .../gtceu/common/data/GTBlocks.java | 18 ++++++++++++------ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/generated/resources/data/minecraft/tags/blocks/logs_that_burn.json b/src/generated/resources/data/minecraft/tags/blocks/logs_that_burn.json index 0e9a2d0809..39f4a40dc7 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/logs_that_burn.json +++ b/src/generated/resources/data/minecraft/tags/blocks/logs_that_burn.json @@ -1,5 +1,8 @@ { "values": [ - "gtceu:rubber_log" + "gtceu:rubber_log", + "gtceu:stripped_rubber_log", + "gtceu:rubber_wood", + "gtceu:stripped_rubber_wood" ] -} \ No newline at end of file +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java index 3d1c611ff9..c123384a66 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java @@ -1073,8 +1073,10 @@ public static ItemColor leavesItemColor() { .initialProperties(() -> Blocks.STRIPPED_SPRUCE_LOG) .lang("Stripped Rubber Log") .blockstate((ctx, provider) -> provider.logBlock(ctx.get())) - .tag(BlockTags.MINEABLE_WITH_AXE) - .simpleItem() + .tag(BlockTags.LOGS_THAT_BURN, BlockTags.MINEABLE_WITH_AXE) + .item() + .tag(ItemTags.LOGS_THAT_BURN) + .build() .register(); public static final BlockEntry RUBBER_WOOD = REGISTRATE .block("rubber_wood", RotatedPillarBlock::new) @@ -1082,8 +1084,10 @@ public static ItemColor leavesItemColor() { .lang("Rubber Wood") .blockstate((ctx, provider) -> provider.axisBlock(ctx.get(), provider.blockTexture(GTBlocks.RUBBER_LOG.get()), provider.blockTexture(GTBlocks.RUBBER_LOG.get()))) - .tag(BlockTags.MINEABLE_WITH_AXE) - .simpleItem() + .tag(BlockTags.LOGS_THAT_BURN, BlockTags.MINEABLE_WITH_AXE) + .item() + .tag(ItemTags.LOGS_THAT_BURN) + .build() .register(); public static final BlockEntry STRIPPED_RUBBER_WOOD = REGISTRATE .block("stripped_rubber_wood", RotatedPillarBlock::new) @@ -1091,8 +1095,10 @@ public static ItemColor leavesItemColor() { .lang("Stripped Rubber Wood") .blockstate((ctx, provider) -> provider.axisBlock(ctx.get(), provider.blockTexture(ctx.get()), provider.blockTexture(ctx.get()))) - .tag(BlockTags.MINEABLE_WITH_AXE) - .simpleItem() + .tag(BlockTags.LOGS_THAT_BURN, BlockTags.MINEABLE_WITH_AXE) + .item() + .tag(ItemTags.LOGS_THAT_BURN) + .build() .register(); public static final BlockEntry RUBBER_PLANK = REGISTRATE From 05f5dd120c959e192a92ba73210b994c15ad4102 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 20 Sep 2024 04:27:27 +0300 Subject: [PATCH 09/10] Fix recipe format changes breaking all machines (#1955) --- .github/actions/build_setup/action.yml | 1 - .../gregtechceu/gtceu/api/addon/IGTAddon.java | 5 - .../recipe/ItemRecipeCapability.java | 2 +- .../capability/recipe/RecipeCapability.java | 11 ++ .../gtceu/api/codec/DispatchedMapCodec.java | 79 +++++++++++ .../medicalcondition/MedicalCondition.java | 4 + .../api/machine/multiblock/CleanroomType.java | 3 + .../api/machine/steam/SimpleSteamMachine.java | 2 +- .../gtceu/api/recipe/GTRecipe.java | 28 +++- .../gtceu/api/recipe/GTRecipeSerializer.java | 134 ++++++++++-------- .../gtceu/api/recipe/RecipeCondition.java | 47 +++--- .../gtceu/api/recipe/ResearchData.java | 13 +- .../recipe/condition/RecipeConditionType.java | 21 +++ .../gtceu/api/recipe/content/Content.java | 21 ++- .../recipe/content/IContentSerializer.java | 24 +++- .../recipe/content/SerializerBigInteger.java | 16 +++ .../recipe/content/SerializerBlockState.java | 6 + .../api/recipe/content/SerializerDouble.java | 6 + .../api/recipe/content/SerializerFloat.java | 6 + .../content/SerializerFluidIngredient.java | 6 + .../recipe/content/SerializerIngredient.java | 12 ++ .../api/recipe/content/SerializerInteger.java | 6 + .../api/recipe/content/SerializerLong.java | 6 + .../recipe/ingredient/FluidIngredient.java | 7 + .../gtceu/api/registry/GTRegistries.java | 4 +- .../gtceu/api/registry/GTRegistry.java | 13 +- .../gtceu/common/data/GTRecipeConditions.java | 64 ++++++--- .../gtceu/common/data/GTRecipeTypes.java | 4 +- .../common/data/GTSyncedFieldAccessors.java | 6 +- .../part/DataAccessHatchMachine.java | 2 +- .../AdjacentBlockCondition.java | 19 ++- .../{ => condition}/BiomeCondition.java | 20 ++- .../{ => condition}/CleanroomCondition.java | 19 ++- .../{ => condition}/DimensionCondition.java | 20 ++- .../{ => condition}/EUToStartCondition.java | 19 ++- .../EnvironmentalHazardCondition.java | 21 ++- .../{ => condition}/PositionYCondition.java | 23 ++- .../recipe/{ => condition}/RPMCondition.java | 20 ++- .../{ => condition}/RainingCondition.java | 20 ++- .../{ => condition}/ResearchCondition.java | 21 ++- .../{ => condition}/RockBreakerCondition.java | 18 ++- .../{ => condition}/ThunderCondition.java | 20 ++- .../recipe/{ => condition}/VentCondition.java | 17 ++- .../material/MaterialRegistryImpl.java | 5 +- .../data/recipe/builder/GTRecipeBuilder.java | 4 +- .../gtceu/integration/GTRecipeWidget.java | 2 +- .../kjs/recipe/GTRecipeSchema.java | 2 +- .../recipe/components/GTRecipeComponents.java | 20 +-- .../gtceu/syncdata/GTRecipeAccessor.java | 43 ------ .../gtceu/syncdata/GTRecipePayload.java | 61 ++++++++ 50 files changed, 720 insertions(+), 233 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/api/codec/DispatchedMapCodec.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/recipe/condition/RecipeConditionType.java rename src/main/java/com/gregtechceu/gtceu/common/recipe/{ => condition}/AdjacentBlockCondition.java (70%) rename src/main/java/com/gregtechceu/gtceu/common/recipe/{ => condition}/BiomeCondition.java (76%) rename src/main/java/com/gregtechceu/gtceu/common/recipe/{ => condition}/CleanroomCondition.java (78%) rename src/main/java/com/gregtechceu/gtceu/common/recipe/{ => condition}/DimensionCondition.java (81%) rename src/main/java/com/gregtechceu/gtceu/common/recipe/{ => condition}/EUToStartCondition.java (72%) rename src/main/java/com/gregtechceu/gtceu/common/recipe/{ => condition}/EnvironmentalHazardCondition.java (76%) rename src/main/java/com/gregtechceu/gtceu/common/recipe/{ => condition}/PositionYCondition.java (71%) rename src/main/java/com/gregtechceu/gtceu/common/recipe/{ => condition}/RPMCondition.java (77%) rename src/main/java/com/gregtechceu/gtceu/common/recipe/{ => condition}/RainingCondition.java (72%) rename src/main/java/com/gregtechceu/gtceu/common/recipe/{ => condition}/ResearchCondition.java (66%) rename src/main/java/com/gregtechceu/gtceu/common/recipe/{ => condition}/RockBreakerCondition.java (73%) rename src/main/java/com/gregtechceu/gtceu/common/recipe/{ => condition}/ThunderCondition.java (72%) rename src/main/java/com/gregtechceu/gtceu/common/recipe/{ => condition}/VentCondition.java (64%) delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipeAccessor.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipePayload.java diff --git a/.github/actions/build_setup/action.yml b/.github/actions/build_setup/action.yml index 00d312ece4..40e38cd7df 100644 --- a/.github/actions/build_setup/action.yml +++ b/.github/actions/build_setup/action.yml @@ -31,7 +31,6 @@ runs: - name: Setup Gradle uses: gradle/actions/setup-gradle@v3 with: - gradle-home-cache-cleanup: true cache-write-only: ${{ inputs.update-cache }} generate-job-summary: false gradle-home-cache-includes: | diff --git a/src/main/java/com/gregtechceu/gtceu/api/addon/IGTAddon.java b/src/main/java/com/gregtechceu/gtceu/api/addon/IGTAddon.java index fa95834d05..7aa4eb4571 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/addon/IGTAddon.java +++ b/src/main/java/com/gregtechceu/gtceu/api/addon/IGTAddon.java @@ -66,11 +66,6 @@ default void registerCovers() {} */ default void registerRecipeCapabilities() {} - /** - * Call init on your custom Recipe Conditions here - */ - default void registerRecipeConditions() {} - /** * Call init on your custom IWorldGenLayer class(es) here */ diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/ItemRecipeCapability.java b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/ItemRecipeCapability.java index d4765d7750..556a62d972 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/ItemRecipeCapability.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/ItemRecipeCapability.java @@ -16,7 +16,7 @@ import com.gregtechceu.gtceu.api.recipe.lookup.*; import com.gregtechceu.gtceu.api.recipe.modifier.ParallelLogic; import com.gregtechceu.gtceu.api.recipe.ui.GTRecipeTypeUI; -import com.gregtechceu.gtceu.common.recipe.ResearchCondition; +import com.gregtechceu.gtceu.common.recipe.condition.ResearchCondition; import com.gregtechceu.gtceu.common.valueprovider.AddedFloat; import com.gregtechceu.gtceu.common.valueprovider.CastedFloat; import com.gregtechceu.gtceu.common.valueprovider.FlooredInt; diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/RecipeCapability.java b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/RecipeCapability.java index 27b38b8fdc..5d585562d2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/RecipeCapability.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/RecipeCapability.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.api.capability.recipe; +import com.gregtechceu.gtceu.api.codec.DispatchedMapCodec; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.recipe.content.Content; @@ -8,6 +9,7 @@ import com.gregtechceu.gtceu.api.recipe.lookup.AbstractMapIngredient; import com.gregtechceu.gtceu.api.recipe.modifier.ParallelLogic; import com.gregtechceu.gtceu.api.recipe.ui.GTRecipeTypeUI; +import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; @@ -15,6 +17,7 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; +import com.mojang.serialization.Codec; import io.netty.buffer.Unpooled; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; @@ -29,6 +32,10 @@ */ public abstract class RecipeCapability { + public static final Codec> DIRECT_CODEC = GTRegistries.RECIPE_CAPABILITIES.codec(); + public static final Codec, List>> CODEC = new DispatchedMapCodec<>( + RecipeCapability.DIRECT_CODEC, + RecipeCapability::contentCodec); public static final Comparator> COMPARATOR = Comparator.comparingInt(o -> o.sortIndex); public final String name; @@ -46,6 +53,10 @@ protected RecipeCapability(String name, int color, boolean doRenderSlot, int sor this.serializer = serializer; } + public static Codec> contentCodec(RecipeCapability capability) { + return Content.codec(capability).listOf(); + } + /** * deep copy of this content. recipe need it for searching and such things */ diff --git a/src/main/java/com/gregtechceu/gtceu/api/codec/DispatchedMapCodec.java b/src/main/java/com/gregtechceu/gtceu/api/codec/DispatchedMapCodec.java new file mode 100644 index 0000000000..f5e2b7b968 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/codec/DispatchedMapCodec.java @@ -0,0 +1,79 @@ +package com.gregtechceu.gtceu.api.codec; + +import com.gregtechceu.gtceu.GTCEu; + +import com.google.common.collect.ImmutableMap; +import com.mojang.datafixers.util.Pair; +import com.mojang.datafixers.util.Unit; +import com.mojang.serialization.*; +import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; + +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Stream; + +public record DispatchedMapCodec( + Codec keyCodec, + Function> valueCodecFunction) + implements Codec> { + + @Override + public DataResult encode(final Map input, final DynamicOps ops, final T prefix) { + final RecordBuilder mapBuilder = ops.mapBuilder(); + for (final Map.Entry entry : input.entrySet()) { + mapBuilder.add(keyCodec.encodeStart(ops, entry.getKey()), + encodeValue(valueCodecFunction.apply(entry.getKey()), entry.getValue(), ops)); + } + return mapBuilder.build(prefix); + } + + @SuppressWarnings("unchecked") + private DataResult encodeValue(final Codec codec, final V input, final DynamicOps ops) { + return codec.encodeStart(ops, (V2) input); + } + + @Override + public DataResult, T>> decode(final DynamicOps ops, final T input) { + return ops.getMap(input).flatMap(map -> { + final Map entries = new Object2ObjectArrayMap<>(); + final Stream.Builder> failed = Stream.builder(); + + final DataResult finalResult = map.entries().reduce( + DataResult.success(Unit.INSTANCE, Lifecycle.stable()), + (result, entry) -> parseEntry(result, ops, entry, entries, failed), + (r1, r2) -> r1.apply2stable((u1, u2) -> u1, r2)); + + final Pair, T> pair = Pair.of(ImmutableMap.copyOf(entries), input); + final T errors = ops.createMap(failed.build()); + + return finalResult.map(ignored -> pair).setPartial(pair) + .mapError(error -> error + " missed input: " + errors); + }); + } + + private DataResult parseEntry(final DataResult result, final DynamicOps ops, + final Pair input, final Map entries, + final Stream.Builder> failed) { + final DataResult keyResult = keyCodec.parse(ops, input.getFirst()); + final DataResult valueResult = keyResult.map(valueCodecFunction) + .flatMap(valueCodec -> valueCodec.parse(ops, input.getSecond()).map(Function.identity())); + final DataResult> entryResult = keyResult.apply2stable(Pair::of, valueResult); + + final Optional> entry = entryResult.resultOrPartial(GTCEu.LOGGER::error); + if (entry.isPresent()) { + final K key = entry.get().getFirst(); + final V value = entry.get().getSecond(); + if (entries.putIfAbsent(key, value) != null) { + failed.add(input); + return result.apply2stable((u, p) -> u, + DataResult.error(() -> "Duplicate entry for key: '" + key + "'")); + } + } + if (entryResult.error().isPresent()) { + failed.add(input); + } + + return result.apply2stable((u, p) -> u, entryResult); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/medicalcondition/MedicalCondition.java b/src/main/java/com/gregtechceu/gtceu/api/data/medicalcondition/MedicalCondition.java index e4e2d34289..0bd126827a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/medicalcondition/MedicalCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/medicalcondition/MedicalCondition.java @@ -10,6 +10,7 @@ import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.level.Level; +import com.mojang.serialization.Codec; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; @@ -22,7 +23,10 @@ public class MedicalCondition { public static final Map CONDITIONS = new HashMap<>(); + public static final Codec CODEC = Codec.STRING.xmap(MedicalCondition.CONDITIONS::get, + MedicalCondition::getName); + @Getter public final String name; public final int color; public final float maxProgression; // amount of seconds until maximum progression is reached diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/CleanroomType.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/CleanroomType.java index 831398f019..0768944289 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/CleanroomType.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/CleanroomType.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.api.machine.multiblock; +import com.mojang.serialization.Codec; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -16,6 +17,8 @@ public class CleanroomType { public static final CleanroomType STERILE_CLEANROOM = new CleanroomType("sterile_cleanroom", "gtceu.recipe.cleanroom_sterile.display_name"); + public static final Codec CODEC = Codec.STRING.xmap(CLEANROOM_TYPES::get, CleanroomType::getName); + private final String name; private final String translationKey; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java index ac4923b3a5..457c05d430 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java @@ -18,7 +18,7 @@ import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.api.recipe.logic.OCParams; import com.gregtechceu.gtceu.api.recipe.logic.OCResult; -import com.gregtechceu.gtceu.common.recipe.VentCondition; +import com.gregtechceu.gtceu.common.recipe.condition.VentCondition; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipe.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipe.java index bddbcd3714..e9f18c0ab2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipe.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipe.java @@ -4,6 +4,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.*; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.chance.logic.ChanceLogic; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; import com.gregtechceu.gtceu.api.recipe.content.Content; import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; @@ -20,6 +21,7 @@ import it.unimi.dsi.fastutil.objects.Object2IntMap; import lombok.Getter; +import lombok.Setter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -39,7 +41,8 @@ public class GTRecipe implements net.minecraft.world.item.crafting.Recipe, List> inputs; public final Map, List> outputs; public final Map, List> tickInputs; @@ -63,7 +66,26 @@ public class GTRecipe implements net.minecraft.world.item.crafting.Recipe, List> inputs, + Map, List> outputs, + Map, List> tickInputs, + Map, List> tickOutputs, + Map, ChanceLogic> inputChanceLogics, + Map, ChanceLogic> outputChanceLogics, + Map, ChanceLogic> tickInputChanceLogics, + Map, ChanceLogic> tickOutputChanceLogics, + List conditions, + List ingredientActions, + @NotNull CompoundTag data, + int duration, + boolean isFuel) { + this(recipeType, null, inputs, outputs, tickInputs, tickOutputs, + inputChanceLogics, outputChanceLogics, tickInputChanceLogics, tickOutputChanceLogics, + conditions, ingredientActions, data, duration, isFuel); + } + + public GTRecipe(GTRecipeType recipeType, + @Nullable ResourceLocation id, Map, List> inputs, Map, List> outputs, Map, List> tickInputs, @@ -308,7 +330,7 @@ public void handlePost(Map, List> contents, IRecipe public ActionResult checkConditions(@NotNull RecipeLogic recipeLogic) { if (conditions.isEmpty()) return ActionResult.SUCCESS; - Map> or = new HashMap<>(); + Map, List> or = new HashMap<>(); for (RecipeCondition condition : conditions) { if (condition.isOr()) { or.computeIfAbsent(condition.getType(), type -> new ArrayList<>()).add(condition); diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeSerializer.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeSerializer.java index 3db8b37185..1450800669 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeSerializer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeSerializer.java @@ -5,20 +5,24 @@ import com.gregtechceu.gtceu.api.recipe.chance.logic.ChanceLogic; import com.gregtechceu.gtceu.api.recipe.content.Content; import com.gregtechceu.gtceu.api.registry.GTRegistries; -import com.gregtechceu.gtceu.common.recipe.ResearchCondition; +import com.gregtechceu.gtceu.common.recipe.condition.ResearchCondition; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.GsonHelper; +import net.minecraft.util.ExtraCodecs; import net.minecraft.util.Tuple; import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraftforge.common.crafting.CraftingHelper; import com.google.gson.JsonArray; import com.google.gson.JsonElement; +import com.google.gson.JsonNull; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; +import com.mojang.serialization.Dynamic; +import com.mojang.serialization.JsonOps; +import com.mojang.serialization.codecs.RecordCodecBuilder; import dev.latvian.mods.kubejs.recipe.ingredientaction.IngredientAction; import org.jetbrains.annotations.NotNull; @@ -31,6 +35,8 @@ */ public class GTRecipeSerializer implements RecipeSerializer { + public static final Codec CODEC = makeCodec(GTCEu.isKubeJSLoaded()); + public static final GTRecipeSerializer SERIALIZER = new GTRecipeSerializer(); public Map, List> capabilitiesFromJson(JsonObject json) { @@ -60,61 +66,9 @@ public Map, ChanceLogic> chanceLogicsFromJson(JsonObject jso @Override public @NotNull GTRecipe fromJson(@NotNull ResourceLocation id, @NotNull JsonObject json) { - String recipeType = GsonHelper.getAsString(json, "type"); - int duration = json.has("duration") ? GsonHelper.getAsInt(json, "duration") : 100; - CompoundTag data = new CompoundTag(); - if (json.has("data")) - data = CraftingHelper.getNBT(json.get("data")); - Map, List> inputs = capabilitiesFromJson( - json.has("inputs") ? json.getAsJsonObject("inputs") : new JsonObject()); - Map, List> tickInputs = capabilitiesFromJson( - json.has("tickInputs") ? json.getAsJsonObject("tickInputs") : new JsonObject()); - Map, List> outputs = capabilitiesFromJson( - json.has("outputs") ? json.getAsJsonObject("outputs") : new JsonObject()); - Map, List> tickOutputs = capabilitiesFromJson( - json.has("tickOutputs") ? json.getAsJsonObject("tickOutputs") : new JsonObject()); - - Map, ChanceLogic> inputChanceLogics = chanceLogicsFromJson( - json.has("inputChanceLogics") ? - json.getAsJsonObject("inputChanceLogics") : - new JsonObject()); - Map, ChanceLogic> tickInputChanceLogics = chanceLogicsFromJson( - json.has("tickInputChanceLogics") ? - json.getAsJsonObject("tickInputChanceLogics") : - new JsonObject()); - Map, ChanceLogic> outputChanceLogics = chanceLogicsFromJson( - json.has("outputChanceLogics") ? - json.getAsJsonObject("outputChanceLogics") : - new JsonObject()); - Map, ChanceLogic> tickOutputChanceLogics = chanceLogicsFromJson( - json.has("tickOutputChanceLogics") ? - json.getAsJsonObject("tickOutputChanceLogics") : - new JsonObject()); - List conditions = new ArrayList<>(); - JsonArray conditionsJson = json.has("recipeConditions") ? json.getAsJsonArray("recipeConditions") : - new JsonArray(); - for (JsonElement jsonElement : conditionsJson) { - if (jsonElement instanceof JsonObject jsonObject) { - var conditionKey = GsonHelper.getAsString(jsonObject, "type", ""); - var clazz = GTRegistries.RECIPE_CONDITIONS.get(conditionKey); - if (clazz != null) { - RecipeCondition condition = RecipeCondition.create(clazz); - if (condition != null) { - conditions.add(condition - .deserialize(GsonHelper.getAsJsonObject(jsonObject, "data", new JsonObject()))); - } - } - } - } - List ingredientActions = new ArrayList<>(); - if (GTCEu.isKubeJSLoaded()) { - ingredientActions = KJSCallWrapper.getIngredientActions(json); - } - boolean isFuel = GsonHelper.getAsBoolean(json, "isFuel", false); - return new GTRecipe((GTRecipeType) BuiltInRegistries.RECIPE_TYPE.get(new ResourceLocation(recipeType)), id, - inputs, outputs, tickInputs, tickOutputs, - inputChanceLogics, outputChanceLogics, tickInputChanceLogics, tickOutputChanceLogics, - conditions, ingredientActions, data, duration, isFuel); + GTRecipe recipe = CODEC.parse(JsonOps.INSTANCE, json).getOrThrow(false, GTCEu.LOGGER::error); + recipe.setId(id); + return recipe; } public static Tuple, List> entryReader(FriendlyByteBuf buf) { @@ -131,12 +85,12 @@ public static void entryWriter(FriendlyByteBuf buf, Map.Entry makeCodec(boolean isKubeLoaded) { + // @formatter:off + if (!isKubeLoaded) { + return RecordCodecBuilder.create(instance -> instance.group( + GTRegistries.RECIPE_TYPES.codec().fieldOf("type").forGetter(val -> val.recipeType), + RecipeCapability.CODEC.optionalFieldOf("inputs", Map.of()).forGetter(val -> val.inputs), + RecipeCapability.CODEC.optionalFieldOf("outputs", Map.of()).forGetter(val -> val.outputs), + RecipeCapability.CODEC.optionalFieldOf("tickInputs", Map.of()).forGetter(val -> val.tickInputs), + RecipeCapability.CODEC.optionalFieldOf("tickOutputs", Map.of()).forGetter(val -> val.tickOutputs), + Codec.unboundedMap(RecipeCapability.DIRECT_CODEC, GTRegistries.CHANCE_LOGICS.codec()) + .optionalFieldOf("inputChanceLogics", Map.of()).forGetter(val -> val.inputChanceLogics), + Codec.unboundedMap(RecipeCapability.DIRECT_CODEC, GTRegistries.CHANCE_LOGICS.codec()) + .optionalFieldOf("outputChanceLogics", Map.of()).forGetter(val -> val.outputChanceLogics), + Codec.unboundedMap(RecipeCapability.DIRECT_CODEC, GTRegistries.CHANCE_LOGICS.codec()) + .optionalFieldOf("tickInputChanceLogics", Map.of()).forGetter(val -> val.tickInputChanceLogics), + Codec.unboundedMap(RecipeCapability.DIRECT_CODEC, GTRegistries.CHANCE_LOGICS.codec()) + .optionalFieldOf("tickOutputChanceLogics", Map.of()).forGetter(val -> val.tickOutputChanceLogics), + RecipeCondition.CODEC.listOf().optionalFieldOf("recipeConditions", List.of()).forGetter(val -> val.conditions), + CompoundTag.CODEC.optionalFieldOf("data", new CompoundTag()).forGetter(val -> val.data), + ExtraCodecs.NON_NEGATIVE_INT.fieldOf("duration").forGetter(val -> val.duration), + Codec.BOOL.optionalFieldOf("isFuel", false).forGetter(val -> val.isFuel)) + .apply(instance, (type, + inputs, outputs, tickInputs, tickOutputs, + inputChanceLogics, outputChanceLogics, tickInputChanceLogics, tickOutputChanceLogics, + conditions, data, duration, isFuel) -> + new GTRecipe(type, inputs, outputs, tickInputs, tickOutputs, + inputChanceLogics, outputChanceLogics, tickInputChanceLogics, tickOutputChanceLogics, + conditions, List.of(), data, duration, isFuel))); + } else { + return RecordCodecBuilder.create(instance -> instance.group( + GTRegistries.RECIPE_TYPES.codec().fieldOf("type").forGetter(val -> val.recipeType), + RecipeCapability.CODEC.optionalFieldOf("inputs", Map.of()).forGetter(val -> val.inputs), + RecipeCapability.CODEC.optionalFieldOf("outputs", Map.of()).forGetter(val -> val.outputs), + RecipeCapability.CODEC.optionalFieldOf("tickInputs", Map.of()).forGetter(val -> val.tickInputs), + RecipeCapability.CODEC.optionalFieldOf("tickOutputs", Map.of()).forGetter(val -> val.tickOutputs), + Codec.unboundedMap(RecipeCapability.DIRECT_CODEC, GTRegistries.CHANCE_LOGICS.codec()) + .optionalFieldOf("inputChanceLogics", Map.of()).forGetter(val -> val.inputChanceLogics), + Codec.unboundedMap(RecipeCapability.DIRECT_CODEC, GTRegistries.CHANCE_LOGICS.codec()) + .optionalFieldOf("outputChanceLogics", Map.of()).forGetter(val -> val.outputChanceLogics), + Codec.unboundedMap(RecipeCapability.DIRECT_CODEC, GTRegistries.CHANCE_LOGICS.codec()) + .optionalFieldOf("tickInputChanceLogics", Map.of()).forGetter(val -> val.tickInputChanceLogics), + Codec.unboundedMap(RecipeCapability.DIRECT_CODEC, GTRegistries.CHANCE_LOGICS.codec()) + .optionalFieldOf("tickOutputChanceLogics", Map.of()).forGetter(val -> val.tickOutputChanceLogics), + RecipeCondition.CODEC.listOf().optionalFieldOf("recipeConditions", List.of()).forGetter(val -> val.conditions), + KJSCallWrapper.INGREDIENT_ACTION_CODEC.optionalFieldOf("kubejs:actions", List.of()).forGetter(val -> (List) val.ingredientActions), + CompoundTag.CODEC.optionalFieldOf("data", new CompoundTag()).forGetter(val -> val.data), + ExtraCodecs.NON_NEGATIVE_INT.fieldOf("duration").forGetter(val -> val.duration), + Codec.BOOL.optionalFieldOf("isFuel", false).forGetter(val -> val.isFuel)) + .apply(instance, GTRecipe::new)); + } + // @formatter:on + } + public static class KJSCallWrapper { + public static final Codec> INGREDIENT_ACTION_CODEC = Codec.PASSTHROUGH.xmap( + dynamic -> { + JsonElement json = dynamic.convert(JsonOps.INSTANCE).getValue(); + return IngredientAction.parseList(json); + }, + list -> new Dynamic<>(JsonOps.INSTANCE, JsonNull.INSTANCE)); + public static List getIngredientActions(JsonObject json) { return IngredientAction.parseList(json.get("kubejs:actions")); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeCondition.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeCondition.java index ca9a5a8285..5a0b7c052b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeCondition.java @@ -1,7 +1,8 @@ package com.gregtechceu.gtceu.api.recipe; -import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -11,30 +12,43 @@ import net.minecraft.util.GsonHelper; import com.google.gson.JsonObject; +import com.mojang.datafixers.Products; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * @author KilaBash * @date 2022/05/27 * @implNote RecipeCondition, global conditions */ +@Accessors(chain = true) public abstract class RecipeCondition { - @Nullable - public static RecipeCondition create(Class clazz) { - if (clazz == null) return null; - try { - return clazz.newInstance(); - } catch (Exception ignored) { - GTCEu.LOGGER.error("condition {} has no NonArgsConstructor", clazz); - return null; - } + public static final Codec CODEC = GTRegistries.RECIPE_CONDITIONS.codec() + .dispatch(RecipeCondition::getType, RecipeConditionType::getCodec); + + public static < + RC extends RecipeCondition> Products.P1, Boolean> isReverse(RecordCodecBuilder.Instance instance) { + return instance.group(Codec.BOOL.fieldOf("reverse").forGetter(val -> val.isReverse)); } + @Getter + @Setter protected boolean isReverse; - public abstract String getType(); + public RecipeCondition() { + this(false); + } + + public RecipeCondition(boolean isReverse) { + this.isReverse = isReverse; + } + + public abstract RecipeConditionType getType(); public String getTranslationKey() { return "gtceu.recipe.condition." + getType(); @@ -49,19 +63,10 @@ public IGuiTexture getValidTexture() { 0.5f); } - public boolean isReverse() { - return isReverse; - } - public boolean isOr() { return false; } - public RecipeCondition setReverse(boolean reverse) { - isReverse = reverse; - return this; - } - public abstract Component getTooltips(); public abstract boolean test(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic); diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/ResearchData.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/ResearchData.java index 1515e446ee..9bc4045050 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/ResearchData.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/ResearchData.java @@ -7,20 +7,24 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; import com.mojang.serialization.JsonOps; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.AllArgsConstructor; import lombok.Getter; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; -import java.util.Collection; import java.util.Iterator; import java.util.List; @AllArgsConstructor public final class ResearchData implements Iterable { - private final Collection entries; + public static final Codec CODEC = ResearchEntry.CODEC.listOf().xmap(ResearchData::new, + data -> data.entries); + + private final List entries; public ResearchData() { entries = new ArrayList<>(); @@ -74,6 +78,11 @@ public void toNetwork(FriendlyByteBuf buf) { */ public static final class ResearchEntry { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.STRING.fieldOf("researchId").forGetter(val -> val.researchId), + ItemStack.CODEC.fieldOf("dataItem").forGetter(val -> val.dataItem)) + .apply(instance, ResearchEntry::new)); + @NotNull @Getter private final String researchId; diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/condition/RecipeConditionType.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/condition/RecipeConditionType.java new file mode 100644 index 0000000000..b73f764b78 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/condition/RecipeConditionType.java @@ -0,0 +1,21 @@ +package com.gregtechceu.gtceu.api.recipe.condition; + +import com.gregtechceu.gtceu.api.recipe.RecipeCondition; + +import com.mojang.serialization.Codec; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +public class RecipeConditionType { + + public final ConditionFactory factory; + @Getter + public final Codec codec; + + @FunctionalInterface + public interface ConditionFactory { + + T createDefault(); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/Content.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/Content.java index 4ae0183f9f..59ddbd82ef 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/Content.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/Content.java @@ -12,10 +12,13 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.ExtraCodecs; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.Getter; import org.jetbrains.annotations.Nullable; @@ -37,8 +40,22 @@ public Content(Object content, int chance, int maxChance, int tierChanceBoost, @ this.chance = chance; this.maxChance = maxChance; this.tierChanceBoost = fixBoost(tierChanceBoost); - this.slotName = slotName; - this.uiName = uiName; + this.slotName = slotName == null || slotName.isEmpty() ? null : slotName; + this.uiName = uiName == null || uiName.isEmpty() ? null : uiName; + } + + public static Codec codec(RecipeCapability capability) { + return RecordCodecBuilder.create(instance -> instance.group( + capability.serializer.codec().fieldOf("content").forGetter(val -> capability.of(val.content)), + ExtraCodecs.NON_NEGATIVE_INT.optionalFieldOf("chance", ChanceLogic.getMaxChancedValue()) + .forGetter(val -> val.chance), + ExtraCodecs.NON_NEGATIVE_INT.optionalFieldOf("maxChance", ChanceLogic.getMaxChancedValue()) + .forGetter(val -> val.maxChance), + ExtraCodecs.NON_NEGATIVE_INT.optionalFieldOf("tierChanceBoost", 0) + .forGetter(val -> val.tierChanceBoost), + Codec.STRING.optionalFieldOf("slotName", "").forGetter(val -> val.slotName != null ? val.slotName : ""), + Codec.STRING.optionalFieldOf("uiName", "").forGetter(val -> val.uiName != null ? val.uiName : "")) + .apply(instance, Content::new)); } public Content copy(RecipeCapability capability, @Nullable ContentModifier modifier) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/IContentSerializer.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/IContentSerializer.java index 0fd6c8770b..5a145a06f4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/IContentSerializer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/IContentSerializer.java @@ -1,25 +1,33 @@ package com.gregtechceu.gtceu.api.recipe.content; +import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.recipe.chance.logic.ChanceLogic; import com.lowdragmc.lowdraglib.LDLib; +import com.lowdragmc.lowdraglib.Platform; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.Tag; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.RegistryOps; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; import com.mojang.serialization.JsonOps; public interface IContentSerializer { default void toNetwork(FriendlyByteBuf buf, T content) { - buf.writeUtf(LDLib.GSON.toJson(toJson(content))); + RegistryOps ops = RegistryOps.create(JsonOps.INSTANCE, Platform.getFrozenRegistry()); + buf.writeUtf(codec().encodeStart(ops, content).getOrThrow(false, GTCEu.LOGGER::error).toString()); } default T fromNetwork(FriendlyByteBuf buf) { - return fromJson(LDLib.GSON.fromJson(buf.readUtf(), JsonElement.class)); + RegistryOps ops = RegistryOps.create(JsonOps.INSTANCE, Platform.getFrozenRegistry()); + return codec().parse(ops, LDLib.GSON.fromJson(buf.readUtf(), JsonElement.class)).getOrThrow(false, + GTCEu.LOGGER::error); } T fromJson(JsonElement json); @@ -63,6 +71,18 @@ default Content fromNetworkContent(FriendlyByteBuf buf) { return new Content(inner, chance, maxChance, tierChanceBoost, slotName, uiName); } + Codec codec(); + + default T fromJson(JsonElement json, HolderLookup.Provider provider) { + RegistryOps ops = RegistryOps.create(JsonOps.INSTANCE, provider); + return codec().parse(ops, json).getOrThrow(false, GTCEu.LOGGER::error); + } + + default JsonElement toJson(T content, HolderLookup.Provider provider) { + RegistryOps ops = RegistryOps.create(JsonOps.INSTANCE, provider); + return codec().encodeStart(ops, content).getOrThrow(false, GTCEu.LOGGER::error); + } + @SuppressWarnings("unchecked") default JsonElement toJsonContent(Content content) { JsonObject json = new JsonObject(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerBigInteger.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerBigInteger.java index 2367a59fd5..acda029381 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerBigInteger.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerBigInteger.java @@ -4,6 +4,9 @@ import com.google.gson.JsonElement; import com.google.gson.JsonPrimitive; +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; +import com.mojang.serialization.Lifecycle; import java.math.BigInteger; @@ -14,6 +17,14 @@ */ public class SerializerBigInteger implements IContentSerializer { + public static final Codec CODEC = Codec.STRING.comapFlatMap(str -> { + try { + return DataResult.success(new BigInteger(str), Lifecycle.stable()); + } catch (Exception e) { + return DataResult.error(e::getMessage, Lifecycle.stable()); + } + }, BigInteger::toString); + public static SerializerBigInteger INSTANCE = new SerializerBigInteger(); private SerializerBigInteger() {} @@ -54,4 +65,9 @@ public BigInteger of(Object o) { public BigInteger defaultValue() { return BigInteger.ZERO; } + + @Override + public Codec codec() { + return CODEC; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerBlockState.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerBlockState.java index c6dcada1e5..6ca7efee8f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerBlockState.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerBlockState.java @@ -14,6 +14,7 @@ import com.google.common.collect.ImmutableMap; import com.google.gson.JsonElement; import com.google.gson.JsonNull; +import com.mojang.serialization.Codec; import com.mojang.serialization.JsonOps; import java.util.Map; @@ -86,4 +87,9 @@ public BlockState of(Object o) { public BlockState defaultValue() { return Blocks.AIR.defaultBlockState(); } + + @Override + public Codec codec() { + return BlockState.CODEC; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerDouble.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerDouble.java index 92c1a85b5c..9b71b5c440 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerDouble.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerDouble.java @@ -4,6 +4,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonPrimitive; +import com.mojang.serialization.Codec; import org.apache.commons.lang3.math.NumberUtils; public class SerializerDouble implements IContentSerializer { @@ -48,4 +49,9 @@ public Double of(Object o) { public Double defaultValue() { return 0d; } + + @Override + public Codec codec() { + return Codec.DOUBLE; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerFloat.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerFloat.java index ad1aebc444..2399ad1014 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerFloat.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerFloat.java @@ -4,6 +4,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonPrimitive; +import com.mojang.serialization.Codec; import org.apache.commons.lang3.math.NumberUtils; public class SerializerFloat implements IContentSerializer { @@ -48,4 +49,9 @@ public Float of(Object o) { public Float defaultValue() { return 0f; } + + @Override + public Codec codec() { + return Codec.FLOAT; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerFluidIngredient.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerFluidIngredient.java index 84791ba351..a81680796c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerFluidIngredient.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerFluidIngredient.java @@ -7,6 +7,7 @@ import net.minecraft.network.FriendlyByteBuf; import com.google.gson.JsonElement; +import com.mojang.serialization.Codec; public class SerializerFluidIngredient implements IContentSerializer { @@ -49,4 +50,9 @@ public FluidIngredient of(Object o) { public FluidIngredient defaultValue() { return FluidIngredient.EMPTY; } + + @Override + public Codec codec() { + return FluidIngredient.CODEC; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerIngredient.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerIngredient.java index 62a4bdbc74..5a876ed9f9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerIngredient.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerIngredient.java @@ -9,9 +9,16 @@ import net.minecraft.world.level.ItemLike; import com.google.gson.JsonElement; +import com.mojang.serialization.Codec; +import com.mojang.serialization.Dynamic; +import com.mojang.serialization.JsonOps; public class SerializerIngredient implements IContentSerializer { + public static final Codec CODEC = Codec.PASSTHROUGH.xmap( + dynamic -> Ingredient.fromJson(dynamic.convert(JsonOps.INSTANCE).getValue()), + ingredient -> new Dynamic<>(JsonOps.INSTANCE, ingredient.toJson())); + public static SerializerIngredient INSTANCE = new SerializerIngredient(); private SerializerIngredient() {} @@ -55,4 +62,9 @@ public Ingredient of(Object o) { public Ingredient defaultValue() { return Ingredient.EMPTY; } + + @Override + public Codec codec() { + return CODEC; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerInteger.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerInteger.java index fcee352cf1..ebab0c336b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerInteger.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerInteger.java @@ -4,6 +4,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonPrimitive; +import com.mojang.serialization.Codec; import org.apache.commons.lang3.math.NumberUtils; public class SerializerInteger implements IContentSerializer { @@ -48,4 +49,9 @@ public Integer of(Object o) { public Integer defaultValue() { return 0; } + + @Override + public Codec codec() { + return Codec.INT; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerLong.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerLong.java index 561b7d4ec8..3336e22a7e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerLong.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerLong.java @@ -4,6 +4,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonPrimitive; +import com.mojang.serialization.Codec; import org.apache.commons.lang3.math.NumberUtils; /** @@ -53,4 +54,9 @@ public Long of(Object o) { public Long defaultValue() { return 0L; } + + @Override + public Codec codec() { + return Codec.LONG; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/FluidIngredient.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/FluidIngredient.java index 6eb582b828..619eaade6d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/FluidIngredient.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/FluidIngredient.java @@ -17,6 +17,9 @@ import com.google.common.collect.Lists; import com.google.gson.*; +import com.mojang.serialization.Codec; +import com.mojang.serialization.Dynamic; +import com.mojang.serialization.JsonOps; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import lombok.Getter; import org.jetbrains.annotations.Nullable; @@ -28,6 +31,10 @@ public class FluidIngredient implements Predicate { + public static final Codec CODEC = Codec.PASSTHROUGH.xmap( + dynamic -> FluidIngredient.fromJson(dynamic.convert(JsonOps.INSTANCE).getValue()), + ingredient -> new Dynamic<>(JsonOps.INSTANCE, ingredient.toJson())); + public static final FluidIngredient EMPTY = new FluidIngredient(Stream.empty(), 0, null); public FluidIngredient.Value[] values; @Nullable diff --git a/src/main/java/com/gregtechceu/gtceu/api/registry/GTRegistries.java b/src/main/java/com/gregtechceu/gtceu/api/registry/GTRegistries.java index ebd9e80b9d..570ed47518 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/registry/GTRegistries.java +++ b/src/main/java/com/gregtechceu/gtceu/api/registry/GTRegistries.java @@ -10,8 +10,8 @@ import com.gregtechceu.gtceu.api.data.worldgen.bedrockore.BedrockOreDefinition; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; -import com.gregtechceu.gtceu.api.recipe.RecipeCondition; import com.gregtechceu.gtceu.api.recipe.chance.logic.ChanceLogic; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; import com.gregtechceu.gtceu.api.registry.registrate.CompassNode; import com.gregtechceu.gtceu.api.registry.registrate.CompassSection; import com.gregtechceu.gtceu.api.sound.SoundEntry; @@ -52,7 +52,7 @@ public final class GTRegistries { public static final GTRegistry.RL MACHINES = new GTRegistry.RL<>(GTCEu.id("machine")); public static final GTRegistry.String> RECIPE_CAPABILITIES = new GTRegistry.String<>( GTCEu.id("recipe_capability")); - public static final GTRegistry.String> RECIPE_CONDITIONS = new GTRegistry.String<>( + public static final GTRegistry.String> RECIPE_CONDITIONS = new GTRegistry.String<>( GTCEu.id("recipe_condition")); public static final GTRegistry.String CHANCE_LOGICS = new GTRegistry.String<>( GTCEu.id("chance_logic")); diff --git a/src/main/java/com/gregtechceu/gtceu/api/registry/GTRegistry.java b/src/main/java/com/gregtechceu/gtceu/api/registry/GTRegistry.java index 3e042c3118..2b00d1fe95 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/registry/GTRegistry.java +++ b/src/main/java/com/gregtechceu/gtceu/api/registry/GTRegistry.java @@ -86,7 +86,7 @@ private boolean checkActiveModContainerIsGregtech() { container.getModId().equals("minecraft")); // check for minecraft modid in case of datagen or a mishap } - public void register(K key, V value) { + public T register(K key, T value) { if (frozen) { throw new IllegalStateException("[register] registry %s has been frozen".formatted(registryName)); } @@ -95,24 +95,27 @@ public void register(K key, V value) { "[register] registry %s contains key %s already".formatted(registryName, key)); } registry.put(key, value); + return value; } @Nullable - public V replace(K key, V value) { + public T replace(K key, T value) { if (frozen) { throw new IllegalStateException("[replace] registry %s has been frozen".formatted(registryName)); } if (!containKey(key)) { GTCEu.LOGGER.warn("[replace] couldn't find key %s in registry %s".formatted(registryName, key)); } - return registry.put(key, value); + registry.put(key, value); + return value; } - public V registerOrOverride(K key, V value) { + public T registerOrOverride(K key, T value) { if (frozen) { throw new IllegalStateException("[register] registry %s has been frozen".formatted(registryName)); } - return registry.put(key, value); + registry.put(key, value); + return value; } @NotNull diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeConditions.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeConditions.java index b417b96201..0851426579 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeConditions.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeConditions.java @@ -2,11 +2,9 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTCEuAPI; -import com.gregtechceu.gtceu.api.addon.AddonFinder; -import com.gregtechceu.gtceu.api.addon.IGTAddon; -import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; import com.gregtechceu.gtceu.api.registry.GTRegistries; -import com.gregtechceu.gtceu.common.recipe.*; +import com.gregtechceu.gtceu.common.recipe.condition.*; import net.minecraftforge.fml.ModLoader; @@ -17,31 +15,53 @@ */ public final class GTRecipeConditions { + static { + GTRegistries.RECIPE_CONDITIONS.unfreeze(); + } + private GTRecipeConditions() {} - public static void init() { - GTRegistries.RECIPE_CONDITIONS.unfreeze(); + public static final RecipeConditionType BIOME = GTRegistries.RECIPE_CONDITIONS.register("biome", + new RecipeConditionType<>(BiomeCondition::new, BiomeCondition.CODEC)); + public static final RecipeConditionType DIMENSION = GTRegistries.RECIPE_CONDITIONS + .register("dimension", new RecipeConditionType<>(DimensionCondition::new, DimensionCondition.CODEC)); + public static final RecipeConditionType POSITION_Y = GTRegistries.RECIPE_CONDITIONS + .register("pos_y", new RecipeConditionType<>(PositionYCondition::new, PositionYCondition.CODEC)); + public static final RecipeConditionType RAINING = GTRegistries.RECIPE_CONDITIONS.register("rain", + new RecipeConditionType<>(RainingCondition::new, RainingCondition.CODEC)); + public static final RecipeConditionType ROCK_BREAKER = GTRegistries.RECIPE_CONDITIONS + .register("rock_breaker", new RecipeConditionType<>(RockBreakerCondition::new, RockBreakerCondition.CODEC)); + public static final RecipeConditionType ADJACENT_BLOCK = GTRegistries.RECIPE_CONDITIONS + .register("adjacent_block", + new RecipeConditionType<>(AdjacentBlockCondition::new, AdjacentBlockCondition.CODEC)); + public static final RecipeConditionType THUNDER = GTRegistries.RECIPE_CONDITIONS + .register("thunder", new RecipeConditionType<>(ThunderCondition::new, ThunderCondition.CODEC)); + public static final RecipeConditionType VENT = GTRegistries.RECIPE_CONDITIONS.register("steam_vent", + new RecipeConditionType<>(VentCondition::new, VentCondition.CODEC)); + public static final RecipeConditionType CLEANROOM = GTRegistries.RECIPE_CONDITIONS + .register("cleanroom", new RecipeConditionType<>(CleanroomCondition::new, CleanroomCondition.CODEC)); + public static final RecipeConditionType EU_TO_START = GTRegistries.RECIPE_CONDITIONS + .register("eu_to_start", new RecipeConditionType<>(EUToStartCondition::new, EUToStartCondition.CODEC)); + public static final RecipeConditionType RESEARCH = GTRegistries.RECIPE_CONDITIONS + .register("research", new RecipeConditionType<>(ResearchCondition::new, ResearchCondition.CODEC)); + public static final RecipeConditionType ENVIRONMENTAL_HAZARD = GTRegistries.RECIPE_CONDITIONS + .register("environmental_hazard", + new RecipeConditionType<>(EnvironmentalHazardCondition::new, EnvironmentalHazardCondition.CODEC)); + public static final RecipeConditionType RPM; - GTRegistries.RECIPE_CONDITIONS.register(BiomeCondition.INSTANCE.getType(), BiomeCondition.class); - GTRegistries.RECIPE_CONDITIONS.register(DimensionCondition.INSTANCE.getType(), DimensionCondition.class); - GTRegistries.RECIPE_CONDITIONS.register(PositionYCondition.INSTANCE.getType(), PositionYCondition.class); - GTRegistries.RECIPE_CONDITIONS.register(RainingCondition.INSTANCE.getType(), RainingCondition.class); - GTRegistries.RECIPE_CONDITIONS.register(RockBreakerCondition.INSTANCE.getType(), RockBreakerCondition.class); - GTRegistries.RECIPE_CONDITIONS.register(AdjacentBlockCondition.INSTANCE.getType(), - AdjacentBlockCondition.class); - GTRegistries.RECIPE_CONDITIONS.register(ThunderCondition.INSTANCE.getType(), ThunderCondition.class); - GTRegistries.RECIPE_CONDITIONS.register(VentCondition.INSTANCE.getType(), VentCondition.class); - GTRegistries.RECIPE_CONDITIONS.register(CleanroomCondition.INSTANCE.getType(), CleanroomCondition.class); - GTRegistries.RECIPE_CONDITIONS.register(ResearchCondition.INSTANCE.getType(), ResearchCondition.class); - GTRegistries.RECIPE_CONDITIONS.register(EnvironmentalHazardCondition.INSTANCE.getType(), - EnvironmentalHazardCondition.class); + static { if (GTCEu.isCreateLoaded()) { - GTRegistries.RECIPE_CONDITIONS.register(RPMCondition.INSTANCE.getType(), RPMCondition.class); + RPM = GTRegistries.RECIPE_CONDITIONS.register("rpm", + new RecipeConditionType<>(RPMCondition::new, RPMCondition.CODEC)); + } else { + RPM = null; } + } - AddonFinder.getAddons().forEach(IGTAddon::registerRecipeConditions); + public static void init() { + // noinspection unchecked ModLoader.get().postEvent(new GTCEuAPI.RegisterEvent<>(GTRegistries.RECIPE_CONDITIONS, - (Class>) RecipeCondition.class.getClass())); + (Class>) (Class) RecipeConditionType.class)); GTRegistries.RECIPE_CONDITIONS.freeze(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java index b2b6b72ff3..84f8f6eae1 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java @@ -16,8 +16,8 @@ import com.gregtechceu.gtceu.api.sound.ExistingSoundEntry; import com.gregtechceu.gtceu.common.machine.trait.customlogic.CannerLogic; import com.gregtechceu.gtceu.common.machine.trait.customlogic.FormingPressLogic; -import com.gregtechceu.gtceu.common.recipe.RPMCondition; -import com.gregtechceu.gtceu.common.recipe.RockBreakerCondition; +import com.gregtechceu.gtceu.common.recipe.condition.RPMCondition; +import com.gregtechceu.gtceu.common.recipe.condition.RockBreakerCondition; import com.gregtechceu.gtceu.data.recipe.RecipeHelper; import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; import com.gregtechceu.gtceu.integration.kjs.GTRegistryInfo; diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTSyncedFieldAccessors.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTSyncedFieldAccessors.java index cd29691f99..0deb4a965f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTSyncedFieldAccessors.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTSyncedFieldAccessors.java @@ -1,7 +1,8 @@ package com.gregtechceu.gtceu.common.data; import com.gregtechceu.gtceu.api.data.chemical.material.Material; -import com.gregtechceu.gtceu.syncdata.GTRecipeAccessor; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.syncdata.GTRecipePayload; import com.gregtechceu.gtceu.syncdata.GTRecipeTypeAccessor; import com.gregtechceu.gtceu.syncdata.MaterialPayload; @@ -17,13 +18,12 @@ */ public class GTSyncedFieldAccessors { - public static final IAccessor GT_RECIPE_ACCESSOR = new GTRecipeAccessor(); public static final IAccessor GT_RECIPE_TYPE_ACCESSOR = new GTRecipeTypeAccessor(); public static void init() { - register(FriendlyBufPayload.class, FriendlyBufPayload::new, GT_RECIPE_ACCESSOR, 1000); register(FriendlyBufPayload.class, FriendlyBufPayload::new, GT_RECIPE_TYPE_ACCESSOR, 1000); registerSimple(MaterialPayload.class, MaterialPayload::new, Material.class, 1); + registerSimple(GTRecipePayload.class, GTRecipePayload::new, GTRecipe.class, 100); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java index 2b6ad191b0..1fea9651b7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java @@ -16,7 +16,7 @@ import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; import com.gregtechceu.gtceu.common.machine.multiblock.electric.research.DataBankMachine; -import com.gregtechceu.gtceu.common.recipe.ResearchCondition; +import com.gregtechceu.gtceu.common.recipe.condition.ResearchCondition; import com.gregtechceu.gtceu.utils.ItemStackHashStrategy; import com.gregtechceu.gtceu.utils.ResearchManager; diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/AdjacentBlockCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentBlockCondition.java similarity index 70% rename from src/main/java/com/gregtechceu/gtceu/common/recipe/AdjacentBlockCondition.java rename to src/main/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentBlockCondition.java index 6ae076a69b..5774deb674 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/AdjacentBlockCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentBlockCondition.java @@ -1,8 +1,10 @@ -package com.gregtechceu.gtceu.common.recipe; +package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.common.data.GTRecipeConditions; import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.core.Direction; @@ -10,15 +12,26 @@ import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; +@NoArgsConstructor public class AdjacentBlockCondition extends RecipeCondition { + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .apply(instance, AdjacentBlockCondition::new)); public final static AdjacentBlockCondition INSTANCE = new AdjacentBlockCondition(); + public AdjacentBlockCondition(boolean isReverse) { + super(isReverse); + } + @Override - public String getType() { - return "adjacent_block"; + public RecipeConditionType getType() { + return GTRecipeConditions.ADJACENT_BLOCK; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/BiomeCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/BiomeCondition.java similarity index 76% rename from src/main/java/com/gregtechceu/gtceu/common/recipe/BiomeCondition.java rename to src/main/java/com/gregtechceu/gtceu/common/recipe/condition/BiomeCondition.java index 6293fee73d..2f2755d17c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/BiomeCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/BiomeCondition.java @@ -1,8 +1,10 @@ -package com.gregtechceu.gtceu.common.recipe; +package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.common.data.GTRecipeConditions; import com.lowdragmc.lowdraglib.utils.LocalizationUtils; @@ -15,6 +17,8 @@ import net.minecraft.world.level.biome.Biome; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; @@ -26,16 +30,26 @@ @NoArgsConstructor public class BiomeCondition extends RecipeCondition { + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .and(ResourceLocation.CODEC.fieldOf("biome").forGetter(val -> val.biome)) + .apply(instance, BiomeCondition::new)); + public final static BiomeCondition INSTANCE = new BiomeCondition(); private ResourceLocation biome = new ResourceLocation("dummy"); + public BiomeCondition(boolean isReverse, ResourceLocation biome) { + super(isReverse); + this.biome = biome; + } + public BiomeCondition(ResourceLocation biome) { this.biome = biome; } @Override - public String getType() { - return "biome"; + public RecipeConditionType getType() { + return GTRecipeConditions.BIOME; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/CleanroomCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/CleanroomCondition.java similarity index 78% rename from src/main/java/com/gregtechceu/gtceu/common/recipe/CleanroomCondition.java rename to src/main/java/com/gregtechceu/gtceu/common/recipe/condition/CleanroomCondition.java index 2040782aea..9105335357 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/CleanroomCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/CleanroomCondition.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.common.recipe; +package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.capability.ICleanroomReceiver; import com.gregtechceu.gtceu.api.machine.MetaMachine; @@ -8,6 +8,8 @@ import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.common.data.GTRecipeConditions; import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.network.FriendlyByteBuf; @@ -15,6 +17,8 @@ import net.minecraft.util.GsonHelper; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -24,14 +28,23 @@ @NoArgsConstructor public class CleanroomCondition extends RecipeCondition { + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .and(CleanroomType.CODEC.fieldOf("cleanroom").forGetter(val -> val.cleanroom)) + .apply(instance, CleanroomCondition::new)); public final static CleanroomCondition INSTANCE = new CleanroomCondition(); @Getter private CleanroomType cleanroom = CleanroomType.CLEANROOM; + public CleanroomCondition(boolean isReverse, CleanroomType cleanroom) { + super(isReverse); + this.cleanroom = cleanroom; + } + @Override - public String getType() { - return "cleanroom"; + public RecipeConditionType getType() { + return GTRecipeConditions.CLEANROOM; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/DimensionCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DimensionCondition.java similarity index 81% rename from src/main/java/com/gregtechceu/gtceu/common/recipe/DimensionCondition.java rename to src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DimensionCondition.java index c7b648faba..931b4854d4 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/DimensionCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DimensionCondition.java @@ -1,10 +1,12 @@ -package com.gregtechceu.gtceu.common.recipe; +package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.data.DimensionMarker; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; import com.gregtechceu.gtceu.api.registry.GTRegistries; +import com.gregtechceu.gtceu.common.data.GTRecipeConditions; import com.gregtechceu.gtceu.config.ConfigHolder; import com.lowdragmc.lowdraglib.gui.texture.TextTexture; @@ -21,6 +23,8 @@ import net.minecraft.world.level.block.Blocks; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; @@ -32,6 +36,11 @@ @NoArgsConstructor public class DimensionCondition extends RecipeCondition { + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .and(ResourceLocation.CODEC.fieldOf("dimension").forGetter(val -> val.dimension)) + .apply(instance, DimensionCondition::new)); + public final static DimensionCondition INSTANCE = new DimensionCondition(); private ResourceLocation dimension = new ResourceLocation("dummy"); @@ -39,9 +48,14 @@ public DimensionCondition(ResourceLocation dimension) { this.dimension = dimension; } + public DimensionCondition(boolean isReverse, ResourceLocation dimension) { + super(isReverse); + this.dimension = dimension; + } + @Override - public String getType() { - return "dimension"; + public RecipeConditionType getType() { + return GTRecipeConditions.DIMENSION; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/EUToStartCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EUToStartCondition.java similarity index 72% rename from src/main/java/com/gregtechceu/gtceu/common/recipe/EUToStartCondition.java rename to src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EUToStartCondition.java index 063324e118..54f3c4efc8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/EUToStartCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EUToStartCondition.java @@ -1,15 +1,19 @@ -package com.gregtechceu.gtceu.common.recipe; +package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.capability.IEnergyContainer; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.common.data.GTRecipeConditions; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.util.GsonHelper; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; @@ -21,6 +25,10 @@ @NoArgsConstructor public class EUToStartCondition extends RecipeCondition { + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .and(Codec.LONG.fieldOf("eu_to_start").forGetter(val -> val.euToStart)) + .apply(instance, EUToStartCondition::new)); public static final EUToStartCondition INSTANCE = new EUToStartCondition(); private long euToStart; @@ -29,9 +37,14 @@ public EUToStartCondition(long euToStart) { this.euToStart = euToStart; } + public EUToStartCondition(boolean isReverse, long euToStart) { + super(isReverse); + this.euToStart = euToStart; + } + @Override - public String getType() { - return "eu_to_start"; + public RecipeConditionType getType() { + return GTRecipeConditions.EU_TO_START; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/EnvironmentalHazardCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EnvironmentalHazardCondition.java similarity index 76% rename from src/main/java/com/gregtechceu/gtceu/common/recipe/EnvironmentalHazardCondition.java rename to src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EnvironmentalHazardCondition.java index c97e925669..881b212113 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/EnvironmentalHazardCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EnvironmentalHazardCondition.java @@ -1,11 +1,13 @@ -package com.gregtechceu.gtceu.common.recipe; +package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.data.medicalcondition.MedicalCondition; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; import com.gregtechceu.gtceu.common.capability.EnvironmentalHazardSavedData; import com.gregtechceu.gtceu.common.data.GTMedicalConditions; +import com.gregtechceu.gtceu.common.data.GTRecipeConditions; import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.network.FriendlyByteBuf; @@ -14,6 +16,8 @@ import net.minecraft.util.GsonHelper; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -23,14 +27,23 @@ @AllArgsConstructor public class EnvironmentalHazardCondition extends RecipeCondition { - public final static EnvironmentalHazardCondition INSTANCE = new EnvironmentalHazardCondition(); + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .and( + MedicalCondition.CODEC.fieldOf("condition").forGetter(val -> val.condition)) + .apply(instance, EnvironmentalHazardCondition::new)); @Getter private MedicalCondition condition = GTMedicalConditions.CARBON_MONOXIDE_POISONING; + public EnvironmentalHazardCondition(boolean isReverse, MedicalCondition condition) { + super(isReverse); + this.condition = condition; + } + @Override - public String getType() { - return "environmental_hazard"; + public RecipeConditionType getType() { + return GTRecipeConditions.ENVIRONMENTAL_HAZARD; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/PositionYCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/PositionYCondition.java similarity index 71% rename from src/main/java/com/gregtechceu/gtceu/common/recipe/PositionYCondition.java rename to src/main/java/com/gregtechceu/gtceu/common/recipe/condition/PositionYCondition.java index 5b5dfd7e15..433c7944c3 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/PositionYCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/PositionYCondition.java @@ -1,14 +1,18 @@ -package com.gregtechceu.gtceu.common.recipe; +package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.common.data.GTRecipeConditions; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.util.GsonHelper; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; @@ -20,6 +24,13 @@ @NoArgsConstructor public class PositionYCondition extends RecipeCondition { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> RecipeCondition + .isReverse(instance) + .and(instance.group( + Codec.INT.fieldOf("min").forGetter(val -> val.min), + Codec.INT.fieldOf("max").forGetter(val -> val.max))) + .apply(instance, PositionYCondition::new)); + public final static PositionYCondition INSTANCE = new PositionYCondition(); private int min; private int max; @@ -29,9 +40,15 @@ public PositionYCondition(int min, int max) { this.max = max; } + public PositionYCondition(boolean isReverse, int min, int max) { + super(isReverse); + this.min = min; + this.max = max; + } + @Override - public String getType() { - return "pos_y"; + public RecipeConditionType getType() { + return GTRecipeConditions.POSITION_Y; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/RPMCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/RPMCondition.java similarity index 77% rename from src/main/java/com/gregtechceu/gtceu/common/recipe/RPMCondition.java rename to src/main/java/com/gregtechceu/gtceu/common/recipe/condition/RPMCondition.java index 71883ca34e..e6ae5c6cd1 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/RPMCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/RPMCondition.java @@ -1,10 +1,12 @@ -package com.gregtechceu.gtceu.common.recipe; +package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.common.data.GTRecipeConditions; import com.gregtechceu.gtceu.common.machine.kinetic.IKineticMachine; import net.minecraft.network.FriendlyByteBuf; @@ -12,6 +14,8 @@ import net.minecraft.util.GsonHelper; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; @@ -23,16 +27,26 @@ @NoArgsConstructor public class RPMCondition extends RecipeCondition { + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .and(Codec.FLOAT.fieldOf("rpm").forGetter(val -> val.rpm)) + .apply(instance, RPMCondition::new)); + public final static RPMCondition INSTANCE = new RPMCondition(); private float rpm; + public RPMCondition(boolean isReverse, float rpm) { + super(isReverse); + this.rpm = rpm; + } + public RPMCondition(float rpm) { this.rpm = rpm; } @Override - public String getType() { - return "rpm"; + public RecipeConditionType getType() { + return GTRecipeConditions.RPM; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/RainingCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/RainingCondition.java similarity index 72% rename from src/main/java/com/gregtechceu/gtceu/common/recipe/RainingCondition.java rename to src/main/java/com/gregtechceu/gtceu/common/recipe/condition/RainingCondition.java index 789e747cec..2df96806fb 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/RainingCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/RainingCondition.java @@ -1,8 +1,10 @@ -package com.gregtechceu.gtceu.common.recipe; +package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.common.data.GTRecipeConditions; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; @@ -10,6 +12,8 @@ import net.minecraft.world.level.Level; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; @@ -21,16 +25,26 @@ @NoArgsConstructor public class RainingCondition extends RecipeCondition { + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .and(Codec.FLOAT.fieldOf("level").forGetter(val -> val.level)) + .apply(instance, RainingCondition::new)); + public final static RainingCondition INSTANCE = new RainingCondition(); private float level; + public RainingCondition(boolean isReverse, float level) { + super(isReverse); + this.level = level; + } + public RainingCondition(float level) { this.level = level; } @Override - public String getType() { - return "rain"; + public RecipeConditionType getType() { + return GTRecipeConditions.RAINING; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/ResearchCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ResearchCondition.java similarity index 66% rename from src/main/java/com/gregtechceu/gtceu/common/recipe/ResearchCondition.java rename to src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ResearchCondition.java index f3ea02cb8a..d7327efff2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/ResearchCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ResearchCondition.java @@ -1,30 +1,43 @@ -package com.gregtechceu.gtceu.common.recipe; +package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; import com.gregtechceu.gtceu.api.recipe.ResearchData; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.common.data.GTRecipeConditions; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.AllArgsConstructor; import org.jetbrains.annotations.NotNull; @AllArgsConstructor public class ResearchCondition extends RecipeCondition { - public final static ResearchCondition INSTANCE = new ResearchCondition(); + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .and(ResearchData.CODEC.fieldOf("research").forGetter(val -> val.data)) + .apply(instance, ResearchCondition::new)); + public static final ResearchCondition INSTANCE = new ResearchCondition(); public ResearchData data; public ResearchCondition() { this.data = new ResearchData(); } + public ResearchCondition(boolean isReverse, ResearchData data) { + super(isReverse); + this.data = data; + } + @Override - public String getType() { - return "reseach"; + public RecipeConditionType getType() { + return GTRecipeConditions.RESEARCH; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/RockBreakerCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/RockBreakerCondition.java similarity index 73% rename from src/main/java/com/gregtechceu/gtceu/common/recipe/RockBreakerCondition.java rename to src/main/java/com/gregtechceu/gtceu/common/recipe/condition/RockBreakerCondition.java index c12afa914c..a81e10a3f0 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/RockBreakerCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/RockBreakerCondition.java @@ -1,8 +1,10 @@ -package com.gregtechceu.gtceu.common.recipe; +package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.common.data.GTRecipeConditions; import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.core.Direction; @@ -10,6 +12,8 @@ import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; @@ -21,11 +25,19 @@ @NoArgsConstructor public class RockBreakerCondition extends RecipeCondition { + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .apply(instance, RockBreakerCondition::new)); + public final static RockBreakerCondition INSTANCE = new RockBreakerCondition(); + public RockBreakerCondition(boolean isReverse) { + super(isReverse); + } + @Override - public String getType() { - return "rock_breaker"; + public RecipeConditionType getType() { + return GTRecipeConditions.ROCK_BREAKER; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/ThunderCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ThunderCondition.java similarity index 72% rename from src/main/java/com/gregtechceu/gtceu/common/recipe/ThunderCondition.java rename to src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ThunderCondition.java index 743616338b..be8cec0e5c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/ThunderCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ThunderCondition.java @@ -1,8 +1,10 @@ -package com.gregtechceu.gtceu.common.recipe; +package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.common.data.GTRecipeConditions; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; @@ -10,6 +12,8 @@ import net.minecraft.world.level.Level; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; @@ -21,16 +25,26 @@ @NoArgsConstructor public class ThunderCondition extends RecipeCondition { + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .and(Codec.FLOAT.fieldOf("level").forGetter(val -> val.level)) + .apply(instance, ThunderCondition::new)); + public final static ThunderCondition INSTANCE = new ThunderCondition(); private float level; + public ThunderCondition(boolean isReverse, float level) { + super(isReverse); + this.level = level; + } + public ThunderCondition(float level) { this.level = level; } @Override - public String getType() { - return "thunder"; + public RecipeConditionType getType() { + return GTRecipeConditions.THUNDER; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/VentCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/VentCondition.java similarity index 64% rename from src/main/java/com/gregtechceu/gtceu/common/recipe/VentCondition.java rename to src/main/java/com/gregtechceu/gtceu/common/recipe/condition/VentCondition.java index f15a83e872..45792aa7a7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/VentCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/VentCondition.java @@ -1,12 +1,16 @@ -package com.gregtechceu.gtceu.common.recipe; +package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.machine.feature.IExhaustVentMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.common.data.GTRecipeConditions; import net.minecraft.network.chat.Component; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; @@ -18,11 +22,18 @@ @NoArgsConstructor public class VentCondition extends RecipeCondition { + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .apply(instance, VentCondition::new)); public final static VentCondition INSTANCE = new VentCondition(); + public VentCondition(boolean isReverse) { + super(isReverse); + } + @Override - public String getType() { - return "steam_vent"; + public RecipeConditionType getType() { + return GTRecipeConditions.VENT; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/unification/material/MaterialRegistryImpl.java b/src/main/java/com/gregtechceu/gtceu/common/unification/material/MaterialRegistryImpl.java index d8bafbe58b..03e4081f63 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/unification/material/MaterialRegistryImpl.java +++ b/src/main/java/com/gregtechceu/gtceu/common/unification/material/MaterialRegistryImpl.java @@ -30,14 +30,15 @@ public void register(Material material) { } @Override - public void register(@NotNull java.lang.String key, @NotNull Material value) { + public T register(@NotNull java.lang.String key, @NotNull T value) { if (isRegistryClosed) { GTCEu.LOGGER.error( "Materials cannot be registered in the PostMaterialEvent (or after)! Must be added in the MaterialEvent. Skipping material {}...", key); - return; + return null; } super.register(key, value); + return value; } @NotNull diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/GTRecipeBuilder.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/GTRecipeBuilder.java index 5c1cc6e9a4..f20bc5bc6d 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/GTRecipeBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/GTRecipeBuilder.java @@ -20,7 +20,7 @@ import com.gregtechceu.gtceu.api.recipe.ingredient.SizedIngredient; import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; -import com.gregtechceu.gtceu.common.recipe.*; +import com.gregtechceu.gtceu.common.recipe.condition.*; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.ResearchManager; @@ -1085,7 +1085,7 @@ public void toJson(JsonObject json) { JsonArray array = new JsonArray(); for (RecipeCondition condition : conditions) { JsonObject cond = new JsonObject(); - cond.addProperty("type", GTRegistries.RECIPE_CONDITIONS.getKey(condition.getClass())); + cond.addProperty("type", GTRegistries.RECIPE_CONDITIONS.getKey(condition.getType())); cond.add("data", condition.serialize()); array.add(cond); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/GTRecipeWidget.java b/src/main/java/com/gregtechceu/gtceu/integration/GTRecipeWidget.java index ae1cae8529..8a34fcfd0c 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/GTRecipeWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/GTRecipeWidget.java @@ -15,7 +15,7 @@ import com.gregtechceu.gtceu.api.recipe.content.Content; import com.gregtechceu.gtceu.api.recipe.logic.OCParams; import com.gregtechceu.gtceu.api.recipe.logic.OCResult; -import com.gregtechceu.gtceu.common.recipe.DimensionCondition; +import com.gregtechceu.gtceu.common.recipe.condition.DimensionCondition; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.lowdragmc.lowdraglib.LDLib; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/GTRecipeSchema.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/GTRecipeSchema.java index 519f2d2e22..3c705384e6 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/GTRecipeSchema.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/GTRecipeSchema.java @@ -16,7 +16,7 @@ import com.gregtechceu.gtceu.api.recipe.chance.logic.ChanceLogic; import com.gregtechceu.gtceu.api.recipe.content.Content; import com.gregtechceu.gtceu.api.recipe.ingredient.*; -import com.gregtechceu.gtceu.common.recipe.*; +import com.gregtechceu.gtceu.common.recipe.condition.*; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; import com.gregtechceu.gtceu.integration.kjs.recipe.components.CapabilityMap; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/components/GTRecipeComponents.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/components/GTRecipeComponents.java index cb6a3d66bd..fc2524b1a2 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/components/GTRecipeComponents.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/components/GTRecipeComponents.java @@ -181,7 +181,7 @@ public Class componentClass() { @Override public JsonElement write(RecipeJS recipe, RecipeCondition value) { JsonObject object = new JsonObject(); - object.addProperty("type", GTRegistries.RECIPE_CONDITIONS.getKey(value.getClass())); + object.addProperty("type", GTRegistries.RECIPE_CONDITIONS.getKey(value.getType())); object.add("data", value.serialize()); return object; } @@ -190,22 +190,22 @@ public JsonElement write(RecipeJS recipe, RecipeCondition value) { public RecipeCondition read(RecipeJS recipe, Object from) { if (from instanceof CharSequence) { var conditionKey = from.toString(); - var clazz = GTRegistries.RECIPE_CONDITIONS.get(conditionKey); - if (clazz != null) { - return RecipeCondition.create(clazz); + var type = GTRegistries.RECIPE_CONDITIONS.get(conditionKey); + if (type != null) { + return type.factory.createDefault(); } } if (from instanceof JsonPrimitive primitive) { var conditionKey = primitive.getAsString(); - var clazz = GTRegistries.RECIPE_CONDITIONS.get(conditionKey); - if (clazz != null) { - return RecipeCondition.create(clazz); + var type = GTRegistries.RECIPE_CONDITIONS.get(conditionKey); + if (type != null) { + return type.factory.createDefault(); } } else if (from instanceof JsonObject jsonObject) { var conditionKey = GsonHelper.getAsString(jsonObject, "type", ""); - var clazz = GTRegistries.RECIPE_CONDITIONS.get(conditionKey); - if (clazz != null) { - RecipeCondition condition = RecipeCondition.create(clazz); + var type = GTRegistries.RECIPE_CONDITIONS.get(conditionKey); + if (type != null) { + RecipeCondition condition = type.factory.createDefault(); if (condition != null) { return condition.deserialize(GsonHelper.getAsJsonObject(jsonObject, "data", new JsonObject())); } diff --git a/src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipeAccessor.java b/src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipeAccessor.java deleted file mode 100644 index 7f16e440fc..0000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipeAccessor.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.gregtechceu.gtceu.syncdata; - -import com.gregtechceu.gtceu.api.recipe.GTRecipe; -import com.gregtechceu.gtceu.api.recipe.GTRecipeSerializer; - -import com.lowdragmc.lowdraglib.syncdata.AccessorOp; -import com.lowdragmc.lowdraglib.syncdata.accessor.CustomObjectAccessor; -import com.lowdragmc.lowdraglib.syncdata.payload.FriendlyBufPayload; -import com.lowdragmc.lowdraglib.syncdata.payload.ITypedPayload; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; - -import io.netty.buffer.Unpooled; - -/** - * @author KilaBash - * @date 2023/2/18 - * @implNote GTRecipeAccessor - */ -public class GTRecipeAccessor extends CustomObjectAccessor { - - public GTRecipeAccessor() { - super(GTRecipe.class, true); - } - - @Override - public ITypedPayload serialize(AccessorOp accessorOp, GTRecipe gtRecipe) { - FriendlyByteBuf serializedHolder = new FriendlyByteBuf(Unpooled.buffer()); - serializedHolder.writeUtf(gtRecipe.id.toString()); - GTRecipeSerializer.SERIALIZER.toNetwork(serializedHolder, gtRecipe); - return FriendlyBufPayload.of(serializedHolder); - } - - @Override - public GTRecipe deserialize(AccessorOp accessorOp, ITypedPayload payload) { - if (payload instanceof FriendlyBufPayload buffer) { - var id = new ResourceLocation(buffer.getPayload().readUtf()); - return GTRecipeSerializer.SERIALIZER.fromNetwork(id, buffer.getPayload()); - } - return null; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipePayload.java b/src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipePayload.java new file mode 100644 index 0000000000..7cb4dd877d --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipePayload.java @@ -0,0 +1,61 @@ +package com.gregtechceu.gtceu.syncdata; + +import com.gregtechceu.gtceu.api.recipe.GTRecipe; + +import com.lowdragmc.lowdraglib.Platform; +import com.lowdragmc.lowdraglib.syncdata.payload.ObjectTypedPayload; + +import net.minecraft.client.Minecraft; +import net.minecraft.nbt.ByteArrayTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.RecipeManager; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import org.jetbrains.annotations.Nullable; + +/** + * @author KilaBash + * @date 2023/2/18 + * @implNote GTRecipePayload + */ +public class GTRecipePayload extends ObjectTypedPayload { + + @Nullable + @Override + public Tag serializeNBT() { + return StringTag.valueOf(payload.id.toString()); + } + + @Override + public void deserializeNBT(Tag tag) { + RecipeManager recipeManager = Platform.getMinecraftServer().getRecipeManager(); + if (tag instanceof StringTag stringTag) { + payload = (GTRecipe) recipeManager.byKey(new ResourceLocation(stringTag.getAsString())).orElse(null); + } else if (tag instanceof ByteArrayTag byteArray) { + ByteBuf copiedDataBuffer = Unpooled.copiedBuffer(byteArray.getAsByteArray()); + FriendlyByteBuf buf = new FriendlyByteBuf(copiedDataBuffer); + payload = (GTRecipe) recipeManager.byKey(buf.readResourceLocation()).orElse(null); + buf.release(); + } + } + + @Override + public void writePayload(FriendlyByteBuf buf) { + buf.writeResourceLocation(this.payload.id); + } + + @Override + public void readPayload(FriendlyByteBuf buf) { + RecipeManager recipeManager; + if (!Platform.isClient()) { + recipeManager = Platform.getMinecraftServer().getRecipeManager(); + } else { + recipeManager = Minecraft.getInstance().getConnection().getRecipeManager(); + } + this.payload = (GTRecipe) recipeManager.byKey(buf.readResourceLocation()).orElse(null); + } +} From f4a01cb930dfbd34e8847bd6279931cf5aa02b9c Mon Sep 17 00:00:00 2001 From: KilaBash Date: Fri, 20 Sep 2024 14:51:39 +0900 Subject: [PATCH 10/10] Bump up the LDLib to fix XEI compat + fix pattern preview widget (#1987) --- settings.gradle | 2 +- .../gregtechceu/gtceu/api/gui/widget/PatternPreviewWidget.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/settings.gradle b/settings.gradle index bb51069f6e..f708b7a5ba 100644 --- a/settings.gradle +++ b/settings.gradle @@ -54,7 +54,7 @@ dependencyResolutionManagement { def vineFlowerVersion = "1.+" def macheteVersion = "1.+" def configurationVersion = "2.2.0" - def ldLibVersion = "1.0.27.b" + def ldLibVersion = "1.0.28.a" def mixinextrasVersion = "0.2.0" def shimmerVersion = "0.2.4" def lombokPluginVersion = "8.7.1" diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewWidget.java index 6d0c1b4937..b241dc872b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewWidget.java @@ -87,6 +87,7 @@ protected PatternPreviewWidget(MultiblockMachineDefinition controllerDefinition) .setXBarStyle(GuiTextures.SLIDER_BACKGROUND, GuiTextures.BUTTON) .setScrollable(true) .setDraggable(true); + scrollableWidgetGroup.setScrollWheelDirection(DraggableScrollableWidgetGroup.ScrollWheelDirection.HORIZONTAL); scrollableWidgetGroup.setScrollYOffset(0); addWidget(scrollableWidgetGroup); @@ -181,7 +182,7 @@ public void setPage(int index) { setupScene(pattern); if (slotWidgets != null) { for (SlotWidget slotWidget : slotWidgets) { - removeWidget(slotWidget); + scrollableWidgetGroup.removeWidget(slotWidget); } } slotWidgets = new SlotWidget[Math.min(pattern.parts.size(), 18)];