From 9427080d3bcb53d5b219358d616370f7c48d9fef Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Sun, 8 Sep 2024 23:58:41 -0600 Subject: [PATCH 001/141] Fix Chance Tier Boosting using the post overclock value in machines, giving less chance (#1908) Co-authored-by: YoungOnionMC --- .../api/machine/SimpleGeneratorMachine.java | 2 +- .../machine/feature/IRecipeLogicMachine.java | 9 +++++++-- .../api/machine/steam/SimpleSteamMachine.java | 4 ++-- .../api/machine/steam/SteamBoilerMachine.java | 2 +- .../gtceu/api/recipe/GTRecipe.java | 1 + .../gtceu/api/recipe/OverclockingLogic.java | 20 ++++++++++++++----- .../gtceu/api/recipe/RecipeHelper.java | 6 +++++- .../gtceu/api/recipe/RecipeRunner.java | 2 +- .../gtceu/api/recipe/logic/OCResult.java | 14 ++++++++----- .../recipe/modifier/RecipeModifierList.java | 1 + .../gtceu/common/data/GTRecipeModifiers.java | 4 ++-- .../data/materials/ElementMaterials.java | 2 +- .../LargeCombustionEngineMachine.java | 5 +++-- .../generator/LargeTurbineMachine.java | 2 +- .../steam/SteamParallelMultiblockMachine.java | 3 ++- 15 files changed, 52 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java index f14dae966f..895ca0b09a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java @@ -103,7 +103,7 @@ public static GTRecipe recipeModifier(MetaMachine machine, @NotNull GTRecipe rec GTValues.V[generator.getOverclockTier()]) / EUt); var paraRecipe = GTRecipeModifiers.fastParallel(generator, recipe, maxParallel, false); result.init(-RecipeHelper.getOutputEUt(paraRecipe.getFirst()), paraRecipe.getFirst().duration, - paraRecipe.getSecond()); + paraRecipe.getSecond(), params.getOcAmount()); return paraRecipe.getFirst(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IRecipeLogicMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IRecipeLogicMachine.java index f699069195..bd6329a148 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IRecipeLogicMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IRecipeLogicMachine.java @@ -24,8 +24,13 @@ public interface IRecipeLogicMachine extends IRecipeCapabilityHolder, IMachineFe @Override default int getChanceTier() { - return self() instanceof ITieredMachine tieredMachine ? tieredMachine.getTier() : - self().getDefinition().getTier(); + if (self() instanceof IOverclockMachine ocMachine) { + return ocMachine.getOverclockTier(); + } else if (self() instanceof ITieredMachine tieredMachine) { + return tieredMachine.getTier(); + } + + return self().getDefinition().getTier(); } /** 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 fd5337be50..ac4923b3a5 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 @@ -138,9 +138,9 @@ public static GTRecipe recipeModifier(MetaMachine machine, @NotNull GTRecipe rec modified.conditions.add(VentCondition.INSTANCE); if (steamMachine.isHighPressure) { - result.init(RecipeHelper.getInputEUt(recipe) * 2L, modified.duration); + result.init(RecipeHelper.getInputEUt(recipe) * 2L, modified.duration, params.getOcAmount()); } else { - result.init(RecipeHelper.getInputEUt(recipe), modified.duration * 2); + result.init(RecipeHelper.getInputEUt(recipe), modified.duration * 2, params.getOcAmount()); } return modified; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java index a4aa9798ec..6ab9e00ab7 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java @@ -260,7 +260,7 @@ public static GTRecipe recipeModifier(MetaMachine machine, @NotNull GTRecipe rec @NotNull OCResult result) { if (machine instanceof SteamBoilerMachine boilerMachine) { recipe = recipe.copy(); - result.init(0, recipe.duration); + result.init(0, recipe.duration, params.getOcAmount()); if (boilerMachine.isHighPressure) result.setDuration(result.getDuration() / 2); // recipe.duration *= 12; // maybe? 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 82c5f2efbd..e342465502 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipe.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipe.java @@ -58,6 +58,7 @@ public class GTRecipe implements net.minecraft.world.item.crafting.Recipe 0) { // it is important to do voltage first, @@ -112,8 +113,9 @@ public static void standardOverclockingLogic(@NotNull OCParams params, @NotNull // update the voltage for the next iteration after everything else // in case duration overclocking would waste energy eut = potentialVoltage; + ocLevel++; } - result.init((long) eut, (int) duration); + result.init((long) eut, (int) duration, ocLevel); } /** @@ -139,6 +141,7 @@ public static void subTickNonParallelOC(@NotNull OCParams params, @NotNull OCRes double duration = params.getDuration(); double eut = params.getEut(); int ocAmount = params.getOcAmount(); + int ocLevel = 0; while (ocAmount-- > 0) { double potentialEUt = eut * voltageFactor; @@ -153,9 +156,10 @@ public static void subTickNonParallelOC(@NotNull OCParams params, @NotNull OCRes } eut = potentialEUt; + ocLevel++; } - result.init((long) eut, (int) duration); + result.init((long) eut, (int) duration, ocLevel); } /** @@ -184,6 +188,7 @@ public static void subTickParallelOC(@NotNull OCParams params, @NotNull OCResult double parallel = 1; int parallelIterAmount = 0; boolean shouldParallel = false; + int ocLevel = 0; while (ocAmount-- > 0) { // it is important to do voltage first, @@ -207,9 +212,10 @@ public static void subTickParallelOC(@NotNull OCParams params, @NotNull OCResult duration = potentialDuration; } } + ocLevel++; } result.init((long) (eut / Math.pow(voltageFactor, parallelIterAmount)), (int) duration, (int) parallel, - (long) eut); + (long) eut, ocLevel); } /** @@ -243,6 +249,7 @@ public static void heatingCoilOC(@NotNull OCParams params, @NotNull OCResult res double parallel = 1; int parallelIterAmount = 0; boolean shouldParallel = false; + int ocLevel = 0; while (ocAmount-- > 0) { boolean perfect = perfectOCAmount-- > 0; @@ -279,10 +286,11 @@ public static void heatingCoilOC(@NotNull OCParams params, @NotNull OCResult res duration = potentialDuration; } } + ocLevel++; } result.init((long) (eut / Math.pow(STD_VOLTAGE_FACTOR, parallelIterAmount)), (int) duration, (int) parallel, - (long) eut); + (long) eut, ocLevel); } /** @@ -313,6 +321,7 @@ public static void heatingCoilNonSubTickOC(@NotNull OCParams params, @NotNull OC double duration = params.getDuration(); double eut = params.getEut(); double ocAmount = params.getOcAmount(); + int ocLevel = 0; while (ocAmount-- > 0) { boolean perfect = amountPerfectOC-- > 0; @@ -333,8 +342,9 @@ public static void heatingCoilNonSubTickOC(@NotNull OCParams params, @NotNull OC break; } duration = potentialDuration; + ocLevel++; } - result.init((long) eut, (int) duration); + result.init((long) eut, (int) duration, ocLevel); } /** diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java index d726432aae..dea79d0a00 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java @@ -59,6 +59,10 @@ public static int getRecipeEUtTier(GTRecipe recipe) { return GTUtil.getTierByVoltage(EUt); } + public static int getPreOCRecipeEuTier(GTRecipe recipe) { + return getRecipeEUtTier(recipe) - recipe.ocTier; + } + /** * Calculates the overclocked Recipe's final duration and EU/t * @@ -101,7 +105,7 @@ public static void performOverclocking(OverclockingLogic logic, @NotNull GTRecip params.initialize(EUt, recipe.duration, numberOfOCs); if (params.getOcAmount() <= 0) { // number of OCs is <=0, so do not overclock - result.init(params.getEut(), params.getDuration()); + result.init(params.getEut(), params.getDuration(), numberOfOCs); } else { logic.getLogic().runOverclockingLogic(params, result, maxOverclockVoltage); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeRunner.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeRunner.java index c01c913114..f95c4d4f31 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeRunner.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeRunner.java @@ -107,7 +107,7 @@ private void fillContent(IRecipeCapabilityHolder holder, Map.Entry Date: Mon, 9 Sep 2024 04:27:29 -0400 Subject: [PATCH 002/141] Changed Ingredient tree creation behavior (#1910) --- .../gtceu/api/recipe/lookup/GTRecipeLookup.java | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/GTRecipeLookup.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/GTRecipeLookup.java index c35a2c6e50..b3450ee4f2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/GTRecipeLookup.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/GTRecipeLookup.java @@ -11,7 +11,6 @@ import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Ingredient; import com.mojang.datafixers.util.Either; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -363,7 +362,6 @@ private GTRecipe diveIngredientTreeFindRecipeCollisions(@NotNull List> list, @NotNull List ingredients, @NotNull WeakHashMap> cache) { - boolean added = false; for (int i = 0; i < ingredients.size(); i++) { AbstractMapIngredient mappedIngredient = ingredients.get(i); // attempt to use the cached value if possible, otherwise cache for the next time @@ -373,19 +371,8 @@ protected static void retrieveCachedIngredient(@NotNull List(mappedIngredient)); } - - // hardcode a tree specialization for the intersection ingredient - if (mappedIngredient instanceof MapIntersectionIngredient intersection) { - for (Ingredient inner : intersection.ingredients) { - List converted = ItemRecipeCapability.CAP.convertToMapIngredient(inner); - retrieveCachedIngredient(list, converted, cache); - } - added = true; - } - } - if (!added) { - list.add(ingredients); } + list.add(ingredients); } /** From 02bc0419b65fa0b088743960b19129d7ffba73de Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Mon, 9 Sep 2024 16:00:49 -0400 Subject: [PATCH 003/141] Misc fixes (#1911) --- .../gtceu/api/recipe/RecipeRunner.java | 27 ++++++++++++------- .../gtceu/api/recipe/content/Content.java | 3 +-- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeRunner.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeRunner.java index f95c4d4f31..ff3c0daa89 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeRunner.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeRunner.java @@ -7,6 +7,7 @@ import com.gregtechceu.gtceu.api.recipe.chance.boost.ChanceBoostFunction; import com.gregtechceu.gtceu.api.recipe.chance.logic.ChanceLogic; import com.gregtechceu.gtceu.api.recipe.content.Content; +import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; import com.google.common.collect.Table; import it.unimi.dsi.fastutil.objects.Object2IntMap; @@ -104,19 +105,25 @@ private void fillContent(IRecipeCapabilityHolder holder, Map.Entry new ArrayList<>()).add(cont.content); } } else { - chancedContents.add(cont); + // unparallel the chanced contents - bandaid fix + chancedContents.add(cont.copy(cap, ContentModifier.multiplier(1.0 / recipe.parallels))); } } + + // Roll the dice for every parallel + List rolls = new ArrayList<>(); int recipeTier = RecipeHelper.getPreOCRecipeEuTier(recipe); - chancedContents = logic.roll(chancedContents, function, - recipeTier, holder.getChanceTier(), this.chanceCaches.get(cap)); - if (chancedContents != null) { - for (Content cont : chancedContents) { - if (cont.slotName == null) { - this.content.content.add(cont.content); - } else { - this.content.slots.computeIfAbsent(cont.slotName, s -> new ArrayList<>()).add(cont.content); - } + for (int parallels = recipe.parallels; parallels > 0; parallels--) { + List roll = logic.roll(chancedContents, function, + recipeTier, holder.getChanceTier(), this.chanceCaches.get(cap)); + if (roll != null) rolls.addAll(roll); + } + + for (Content cont : rolls) { + if (cont.slotName == null) { + this.content.content.add(cont.content); + } else { + this.content.slots.computeIfAbsent(cont.slotName, s -> new ArrayList<>()).add(cont.content); } } } 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 fcc1c49a86..4ae0183f9f 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 @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.recipe.chance.logic.ChanceLogic; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; import com.gregtechceu.gtceu.api.recipe.ingredient.IntProviderIngredient; -import com.gregtechceu.gtceu.api.recipe.ingredient.SizedIngredient; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; @@ -84,7 +83,7 @@ public void draw(GuiGraphics graphics, int mouseX, int mouseY, float x, float y, @OnlyIn(Dist.CLIENT) public void drawRangeAmount(GuiGraphics graphics, float x, float y, int width, int height) { - if (content instanceof SizedIngredient sized && sized.getInner() instanceof IntProviderIngredient ingredient) { + if (content instanceof IntProviderIngredient ingredient) { graphics.pose().pushPose(); graphics.pose().translate(0, 0, 400); graphics.pose().scale(0.5f, 0.5f, 1); From b0bae4275622d5a786824dddb89b8277c777999c Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 9 Sep 2024 23:01:21 +0300 Subject: [PATCH 004/141] command changes (#1889) --- .../resources/assets/gtceu/lang/en_ud.json | 4 + .../resources/assets/gtceu/lang/en_us.json | 4 + .../api/data/worldgen/ores/GeneratedVein.java | 5 + .../api/data/worldgen/ores/OreGenCache.java | 8 +- .../api/data/worldgen/ores/OreGenerator.java | 8 +- .../api/data/worldgen/ores/OrePlacer.java | 17 +- .../gtceu/common/commands/GTCommands.java | 152 ++++++++++ .../gtceu/common/commands/HazardCommands.java | 104 +++++++ .../commands/MedicalConditionCommands.java | 153 ++++++++++ .../gtceu/common/commands/ServerCommands.java | 261 ------------------ .../arguments/GTRegistryArgument.java | 175 ++++++++++++ .../gtceu/common/data/GTCommandArguments.java | 17 ++ .../core/mixins/ChunkGeneratorMixin.java | 4 +- .../gtceu/data/lang/LangHandler.java | 4 + .../gtceu/data/loader/BedrockFluidLoader.java | 2 +- .../gtceu/data/loader/BedrockOreLoader.java | 2 +- .../gtceu/data/loader/GTOreLoader.java | 2 +- .../gtceu/forge/ForgeCommonEventListener.java | 8 +- 18 files changed, 649 insertions(+), 281 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/common/commands/GTCommands.java create mode 100644 src/main/java/com/gregtechceu/gtceu/common/commands/HazardCommands.java create mode 100644 src/main/java/com/gregtechceu/gtceu/common/commands/MedicalConditionCommands.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/common/commands/ServerCommands.java create mode 100644 src/main/java/com/gregtechceu/gtceu/common/commands/arguments/GTRegistryArgument.java diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 473b5e7ab6..96b8b043d1 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -1730,10 +1730,13 @@ "block.gtceu.zpm_world_accelerator": "ɹ§III ɹoʇɐɹǝןǝɔɔⱯ pןɹoM ǝʇıןƎɔ§", "block.sterilizing_filter_casing.tooltip": "ʇuǝɯuoɹıʌuǝ ㄥ§pǝzıןıɹǝʇSɐ§ ɐ sǝʇɐǝɹƆ", "block.surface_rock": "ʞɔoᴚ ǝɔɐɟɹnS %s", + "command.gtceu.dump_data.success": "%s oʇ %s ʎɹʇsıbǝɹ ɯoɹɟ sǝɔɹnosǝɹ %s pǝdɯnᗡ", "command.gtceu.medical_condition.get": ":suoıʇıpuoɔ ןɐɔıpǝɯ ǝsǝɥʇ sɐɥ %s ɹǝʎɐןԀ", "command.gtceu.medical_condition.get.element": "spuoɔǝs %s :ɹ§%s uoıʇıpuoƆ", "command.gtceu.medical_condition.get.element.permanent": ")ʇuǝuɐɯɹǝd( spuoɔǝs %s :ɹ§%s uoıʇıpuoƆ", "command.gtceu.medical_condition.get.empty": "˙suoıʇıpuoɔ ןɐɔıpǝɯ ou sɐɥ %s ɹǝʎɐןԀ", + "command.gtceu.place_vein.failure": "%s uoıʇısod ʇɐ %s uıǝʌ ǝɔɐןd oʇ pǝןıɐℲ", + "command.gtceu.place_vein.success": "%s uoıʇısod ʇɐ %s uıǝʌ pǝɔɐןԀ", "compass.node.gtceu.batteries/energy_cluster": "ɹǝʇsnןƆ ʎbɹǝuƎ", "compass.node.gtceu.batteries/energy_crystal": "ןɐʇsʎɹƆ ʎbɹǝuƎ", "compass.node.gtceu.batteries/energy_module": "ǝןnpoW ʎbɹǝuƎ", @@ -5245,6 +5248,7 @@ "material.gtceu.einsteinium": "ɯnıuıǝʇsuıƎ", "material.gtceu.electrotine": "ǝuıʇoɹʇɔǝןƎ", "material.gtceu.electrum": "ɯnɹʇɔǝןƎ", + "material.gtceu.elementium": "ɯnıʇuǝɯǝןƎ", "material.gtceu.emerald": "pןɐɹǝɯƎ", "material.gtceu.ender_air": "ɹıⱯ ɹǝpuƎ", "material.gtceu.ender_eye": "ǝʎƎ ɹǝpuƎ", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index a76576de2e..12dcf6ed6c 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -1730,10 +1730,13 @@ "block.gtceu.zpm_world_accelerator": "§cElite World Accelerator III§r", "block.sterilizing_filter_casing.tooltip": "Creates a §aSterilized§7 environment", "block.surface_rock": "%s Surface Rock", + "command.gtceu.dump_data.success": "Dumped %s resources from registry %s to %s", "command.gtceu.medical_condition.get": "Player %s has these medical conditions:", "command.gtceu.medical_condition.get.element": "Condition %s§r: %s seconds", "command.gtceu.medical_condition.get.element.permanent": "Condition %s§r: %s seconds (permanent)", "command.gtceu.medical_condition.get.empty": "Player %s has no medical conditions.", + "command.gtceu.place_vein.failure": "Failed to place vein %s at position %s", + "command.gtceu.place_vein.success": "Placed vein %s at position %s", "compass.node.gtceu.batteries/energy_cluster": "Energy Cluster", "compass.node.gtceu.batteries/energy_crystal": "Energy Crystal", "compass.node.gtceu.batteries/energy_module": "Energy Module", @@ -5245,6 +5248,7 @@ "material.gtceu.einsteinium": "Einsteinium", "material.gtceu.electrotine": "Electrotine", "material.gtceu.electrum": "Electrum", + "material.gtceu.elementium": "Elementium", "material.gtceu.emerald": "Emerald", "material.gtceu.ender_air": "Ender Air", "material.gtceu.ender_eye": "Ender Eye", diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/GeneratedVein.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/GeneratedVein.java index 6643a9cc97..a6eeb4958e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/GeneratedVein.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/GeneratedVein.java @@ -10,6 +10,7 @@ import lombok.Getter; import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; import javax.annotation.ParametersAreNonnullByDefault; @@ -48,6 +49,10 @@ public Map consumeOres(ChunkPos chunk) { return this.generatedOres.getOrDefault(chunk, Map.of()); } + public Set getGeneratedChunks() { + return generatedOres.keySet(); + } + @Override public String toString() { return "GeneratedVein[origin=" + origin + ", chunks={" + diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OreGenCache.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OreGenCache.java index bb15cfbbe1..813b7e3c16 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OreGenCache.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OreGenCache.java @@ -11,6 +11,7 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; +import lombok.Getter; import org.apache.commons.lang3.mutable.MutableInt; import java.util.List; @@ -30,6 +31,7 @@ @ParametersAreNonnullByDefault public class OreGenCache { + @Getter private final OreGenerator oreGenerator = new OreGenerator(); private final int oreGenerationCacheSize = ConfigHolder.INSTANCE != null ? @@ -61,7 +63,7 @@ private List getOrCreateVeinMetadata(WorldGenLevel level, return veinMetadataByOrigin .get(chunkPos, () -> oreGenerator.generateMetadata(level, generator, chunkPos)); } catch (ExecutionException e) { - GTCEu.LOGGER.error("Cannot create vein position in chunk " + chunkPos, e); + GTCEu.LOGGER.error("Cannot create vein position in chunk {}", chunkPos, e); return List.of(); } } @@ -81,7 +83,7 @@ public List consumeChunkVeins(WorldGenLevel level, ChunkGenerator getOrCreateVeinMetadata(level, generator, chunkPos), chunkPos)) .stream(); } catch (ExecutionException e) { - GTCEu.LOGGER.error("Cannot create vein in chunk " + chunkPos, e); + GTCEu.LOGGER.error("Cannot create vein in chunk {}", chunkPos, e); return Stream.empty(); } }).filter(Objects::nonNull).toList(); @@ -103,7 +105,7 @@ public List consumeChunkIndicators(WorldGenLevel level, Chu getOrCreateVeinMetadata(level, generator, chunkPos), chunkPos)) .stream(); } catch (ExecutionException e) { - GTCEu.LOGGER.error("Cannot create vein in chunk " + chunkPos, e); + GTCEu.LOGGER.error("Cannot create vein in chunk {}", chunkPos, e); return Stream.empty(); } }).filter(Objects::nonNull).toList(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OreGenerator.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OreGenerator.java index 1c7e9cd7fa..2b79b8518c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OreGenerator.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OreGenerator.java @@ -39,7 +39,7 @@ @MethodsReturnNonnullByDefault public class OreGenerator { - private record VeinConfiguration(GeneratedVeinMetadata data, RandomSource random) { + public record VeinConfiguration(GeneratedVeinMetadata data, RandomSource random) { public RandomSource newRandom() { return new XoroshiroRandomSource(random.nextLong()); @@ -96,7 +96,7 @@ public List generateOres(WorldGenLevel level, List generateOres(VeinConfiguration config, WorldGenLevel level, ChunkPos chunkPos) { + public Optional generateOres(VeinConfiguration config, WorldGenLevel level, ChunkPos chunkPos) { GTOreDefinition definition = config.data.definition(); Map generatedVeins = definition.veinGenerator() .generate(level, config.newRandom(), definition, config.data.center()); @@ -162,7 +162,7 @@ private static Optional computeVeinOrigin(WorldGenLevel level, ChunkGe private static VeinConfiguration logVeinGeneration(VeinConfiguration config) { if (ConfigHolder.INSTANCE.dev.debugWorldgen) { - GTCEu.LOGGER.debug("Generating vein " + config.data.id() + " at " + config.data.center()); + GTCEu.LOGGER.debug("Generating vein {} at {}", config.data.id(), config.data.center()); } return config; @@ -170,7 +170,7 @@ private static VeinConfiguration logVeinGeneration(VeinConfiguration config) { private static void logEmptyVein(VeinConfiguration config) { if (ConfigHolder.INSTANCE.dev.debugWorldgen) { - GTCEu.LOGGER.debug("No blocks generated for vein " + config.data.id() + " at " + config.data.center()); + GTCEu.LOGGER.debug("No blocks generated for vein {} at {}", config.data.id(), config.data.center()); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OrePlacer.java b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OrePlacer.java index 9a769b1cac..14100bbdfa 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OrePlacer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/worldgen/ores/OrePlacer.java @@ -4,6 +4,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.chunk.BulkSectionAccess; import net.minecraft.world.level.chunk.ChunkAccess; @@ -12,9 +13,12 @@ import net.minecraft.world.level.levelgen.XoroshiroRandomSource; import net.minecraft.world.level.levelgen.structure.templatesystem.RuleTest; +import lombok.Getter; + import java.util.Map; import java.util.stream.Collectors; +import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; /** @@ -28,6 +32,7 @@ @ParametersAreNonnullByDefault public class OrePlacer { + @Getter private final OreGenCache oreGenCache = new OreGenCache(); /** @@ -43,14 +48,14 @@ public void placeOres(WorldGenLevel level, ChunkGenerator chunkGenerator, ChunkA var generatedIndicators = oreGenCache.consumeChunkIndicators(level, chunkGenerator, chunk); try (BulkSectionAccess access = new BulkSectionAccess(level)) { - generatedVeins.forEach(generatedVein -> placeVein(chunk, random, access, generatedVein)); + generatedVeins.forEach(generatedVein -> placeVein(chunk.getPos(), random, access, generatedVein, null)); generatedIndicators.forEach(generatedIndicator -> placeIndicators(chunk, access, generatedIndicator)); } } - private void placeVein(ChunkAccess chunk, RandomSource random, BulkSectionAccess access, - GeneratedVein generatedVein) { - RuleTest layerTarget = generatedVein.getLayer().getTarget(); + public void placeVein(ChunkPos chunk, RandomSource random, BulkSectionAccess access, + GeneratedVein generatedVein, @Nullable RuleTest targetOverride) { + RuleTest layerTarget = targetOverride != null ? targetOverride : generatedVein.getLayer().getTarget(); resolvePlacerLists(chunk, generatedVein).forEach(((sectionPos, placers) -> { LevelChunkSection section = access.getSection(sectionPos.origin()); @@ -70,8 +75,8 @@ private void placeVein(ChunkAccess chunk, RandomSource random, BulkSectionAccess })); } - private Map> resolvePlacerLists(ChunkAccess chunk, GeneratedVein vein) { - return vein.consumeOres(chunk.getPos()).entrySet().stream() + private Map> resolvePlacerLists(ChunkPos chunk, GeneratedVein vein) { + return vein.consumeOres(chunk).entrySet().stream() .collect(Collectors.groupingBy( entry -> SectionPos.of(entry.getKey()), Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))); diff --git a/src/main/java/com/gregtechceu/gtceu/common/commands/GTCommands.java b/src/main/java/com/gregtechceu/gtceu/common/commands/GTCommands.java new file mode 100644 index 0000000000..13d213bd4c --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/commands/GTCommands.java @@ -0,0 +1,152 @@ +package com.gregtechceu.gtceu.common.commands; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.worldgen.GTOreDefinition; +import com.gregtechceu.gtceu.api.data.worldgen.bedrockfluid.BedrockFluidDefinition; +import com.gregtechceu.gtceu.api.data.worldgen.bedrockore.BedrockOreDefinition; +import com.gregtechceu.gtceu.api.data.worldgen.ores.GeneratedVeinMetadata; +import com.gregtechceu.gtceu.api.data.worldgen.ores.OreGenerator; +import com.gregtechceu.gtceu.api.data.worldgen.ores.OrePlacer; +import com.gregtechceu.gtceu.api.gui.factory.GTUIEditorFactory; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.registry.GTRegistries; +import com.gregtechceu.gtceu.api.registry.GTRegistry; +import com.gregtechceu.gtceu.common.commands.arguments.GTRegistryArgument; +import com.gregtechceu.gtceu.data.loader.BedrockFluidLoader; +import com.gregtechceu.gtceu.data.loader.BedrockOreLoader; +import com.gregtechceu.gtceu.data.loader.GTOreLoader; +import com.gregtechceu.gtceu.data.pack.GTDynamicDataPack; + +import com.lowdragmc.lowdraglib.Platform; + +import net.minecraft.commands.CommandBuildContext; +import net.minecraft.commands.CommandRuntimeException; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.coordinates.BlockPosArgument; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.RegistryOps; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.chunk.BulkSectionAccess; +import net.minecraft.world.level.levelgen.structure.templatesystem.AlwaysTrueTest; + +import com.google.gson.JsonElement; +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.serialization.Codec; +import com.mojang.serialization.JsonOps; + +import java.nio.file.Path; + +import static net.minecraft.commands.Commands.*; + +/** + * @author KilaBash + * @date 2023/2/9 + * @implNote GTCommands + */ +public class GTCommands { + + public static void register(CommandDispatcher dispatcher, CommandBuildContext buildContext) { + dispatcher.register( + literal("gtceu") + .requires(source -> source.hasPermission(3)) + .then(literal("ui_editor") + .executes(context -> { + GTUIEditorFactory.INSTANCE.openUI(GTUIEditorFactory.INSTANCE, + context.getSource().getPlayerOrException()); + return 1; + })) + .then(literal("check_recipes_valid") + .executes(context -> { + for (Recipe recipe : context.getSource().getServer().getRecipeManager() + .getRecipes()) { + if (recipe instanceof GTRecipe gtRecipe && !gtRecipe.checkRecipeValid()) { + context.getSource().sendSuccess( + () -> Component + .literal("recipe %s is invalid".formatted(gtRecipe.id)), + false); + } + } + return 1; + })) + .then(literal("dump_data") + .then(literal("bedrock_fluid_veins") + .executes(context -> dumpDataRegistry(context, + GTRegistries.BEDROCK_FLUID_DEFINITIONS, + BedrockFluidDefinition.FULL_CODEC, + BedrockFluidLoader.FOLDER))) + .then(literal("bedrock_ore_veins") + .executes(context -> dumpDataRegistry(context, + GTRegistries.BEDROCK_ORE_DEFINITIONS, + BedrockOreDefinition.FULL_CODEC, + BedrockOreLoader.FOLDER))) + .then(literal("ore_veins") + .executes(context -> dumpDataRegistry(context, + GTRegistries.ORE_VEINS, + GTOreDefinition.FULL_CODEC, + GTOreLoader.FOLDER)))) + .then(literal("place_vein") + .then(argument("vein", + GTRegistryArgument.registry(GTRegistries.ORE_VEINS, ResourceLocation.class)) + .executes(context -> GTCommands.placeVein(context, + context.getSource().getEntityOrException().blockPosition())) + .then(argument("position", BlockPosArgument.blockPos()) + .executes(context -> GTCommands.placeVein(context, + BlockPosArgument.getBlockPos(context, "position"))))))); + } + + private static int dumpDataRegistry(CommandContext context, + GTRegistry registry, Codec codec, String folder) { + Path parent = Platform.getGamePath().resolve("gtceu/dumped/data"); + var ops = RegistryOps.create(JsonOps.INSTANCE, context.getSource().registryAccess()); + int dumpedCount = 0; + for (ResourceLocation id : registry.keys()) { + T entry = registry.get(id); + JsonElement json = codec.encodeStart(ops, entry).getOrThrow(false, GTCEu.LOGGER::error); + GTDynamicDataPack.writeJson(id, folder, parent, json); + dumpedCount++; + } + final int result = dumpedCount; + context.getSource().sendSuccess( + () -> Component.translatable("command.gtceu.dump_data.success", result, + registry.getRegistryName().toString(), parent.toString()), + true); + return result; + } + + private static int placeVein(CommandContext context, BlockPos sourcePos) { + GTOreDefinition vein = context.getArgument("vein", GTOreDefinition.class); + ResourceLocation id = GTRegistries.ORE_VEINS.getKey(vein); + + ChunkPos chunkPos = new ChunkPos(sourcePos); + ServerLevel level = context.getSource().getLevel(); + + GeneratedVeinMetadata metadata = new GeneratedVeinMetadata(id, chunkPos, sourcePos, vein); + RandomSource random = level.random; + + OrePlacer placer = new OrePlacer(); + OreGenerator generator = placer.getOreGenCache().getOreGenerator(); + + try (BulkSectionAccess access = new BulkSectionAccess(level)) { + var generated = generator.generateOres(new OreGenerator.VeinConfiguration(metadata, random), level, + chunkPos); + if (generated.isEmpty()) { + throw new CommandRuntimeException(Component.translatable("command.gtceu.place_vein.failure", + id.toString(), sourcePos.toString())); + } + for (ChunkPos pos : generated.get().getGeneratedChunks()) { + placer.placeVein(pos, random, access, generated.get(), AlwaysTrueTest.INSTANCE); + level.getChunk(pos.x, pos.z).setUnsaved(true); + } + context.getSource().sendSuccess(() -> Component.translatable("command.gtceu.place_vein.success", + id.toString(), sourcePos.toString()), true); + } + + return 1; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/commands/HazardCommands.java b/src/main/java/com/gregtechceu/gtceu/common/commands/HazardCommands.java new file mode 100644 index 0000000000..b622ef5e2a --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/commands/HazardCommands.java @@ -0,0 +1,104 @@ +package com.gregtechceu.gtceu.common.commands; + +import com.gregtechceu.gtceu.api.data.chemical.material.properties.HazardProperty; +import com.gregtechceu.gtceu.api.data.medicalcondition.MedicalCondition; +import com.gregtechceu.gtceu.common.capability.EnvironmentalHazardSavedData; +import com.gregtechceu.gtceu.common.capability.LocalizedHazardSavedData; +import com.gregtechceu.gtceu.common.commands.arguments.MedicalConditionArgument; + +import net.minecraft.commands.CommandBuildContext; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.commands.arguments.coordinates.BlockPosArgument; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.BoolArgumentType; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.brigadier.context.CommandContext; + +import static net.minecraft.commands.Commands.argument; +import static net.minecraft.commands.Commands.literal; + +public class HazardCommands { + + public static void register(CommandDispatcher dispatcher, CommandBuildContext buildContext) { + dispatcher.register( + literal("environmental_hazard") + .requires(source -> source.hasPermission(2)) + .then(argument("condition", MedicalConditionArgument.medicalCondition()) + .then(argument("can_spread", BoolArgumentType.bool()) + .then(argument("source", BlockPosArgument.blockPos()) + .then(literal("chunk") + .then(Commands + .argument("strength", + IntegerArgumentType.integer(1)) + .executes( + HazardCommands::spawnChunkEnvironmentalHazard))) + .then(literal("local") + .then(Commands + .argument("from", BlockPosArgument.blockPos()) + .then(Commands + .argument("to", + BlockPosArgument.blockPos()) + .executes( + HazardCommands::spawnLocalEnvironmentalHazard))))))) + .then(literal("clear") + .then(argument("source", BlockPosArgument.blockPos()) + .executes(context -> { + BlockPos source = BlockPosArgument.getBlockPos(context, "source"); + return clearEnvironmentalHazard(context, source, null); + }) + .then(argument("condition", MedicalConditionArgument.medicalCondition()) + .executes(context -> { + BlockPos source = BlockPosArgument.getBlockPos(context, + "source"); + MedicalCondition condition = MedicalConditionArgument + .getCondition(context, "condition"); + return clearEnvironmentalHazard(context, source, condition); + }))))); + } + + private static int spawnChunkEnvironmentalHazard(CommandContext context) { + ServerLevel serverLevel = context.getSource().getLevel(); + + BlockPos source = BlockPosArgument.getBlockPos(context, "source"); + int strength = IntegerArgumentType.getInteger(context, "strength"); + MedicalCondition condition = MedicalConditionArgument.getCondition(context, "condition"); + boolean canSpread = BoolArgumentType.getBool(context, "can_spread"); + + EnvironmentalHazardSavedData.getOrCreate(serverLevel) + .addZone(source, strength, canSpread, HazardProperty.HazardTrigger.INHALATION, condition); + + return 1; + } + + private static int spawnLocalEnvironmentalHazard(CommandContext context) { + ServerLevel serverLevel = context.getSource().getLevel(); + BlockPos source = BlockPosArgument.getBlockPos(context, "source"); + BlockPos from = BlockPosArgument.getBlockPos(context, "from"); + BlockPos to = BlockPosArgument.getBlockPos(context, "to"); + + MedicalCondition condition = MedicalConditionArgument.getCondition(context, "condition"); + boolean canSpread = BoolArgumentType.getBool(context, "can_spread"); + + LocalizedHazardSavedData.getOrCreate(serverLevel) + .addCuboidZone(source, from, to, canSpread, HazardProperty.HazardTrigger.INHALATION, condition); + + return 1; + } + + private static int clearEnvironmentalHazard(CommandContext context, + BlockPos clearAt, MedicalCondition condition) { + ServerLevel serverLevel = context.getSource().getLevel(); + if (condition == null) { + EnvironmentalHazardSavedData.getOrCreate(serverLevel).removeZone(clearAt); + LocalizedHazardSavedData.getOrCreate(serverLevel).removeZoneByPosition(clearAt); + } else { + EnvironmentalHazardSavedData.getOrCreate(serverLevel).removeZone(clearAt, condition); + LocalizedHazardSavedData.getOrCreate(serverLevel).removeZoneByPosition(clearAt, condition); + } + return 1; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/commands/MedicalConditionCommands.java b/src/main/java/com/gregtechceu/gtceu/common/commands/MedicalConditionCommands.java new file mode 100644 index 0000000000..10feb462a7 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/commands/MedicalConditionCommands.java @@ -0,0 +1,153 @@ +package com.gregtechceu.gtceu.common.commands; + +import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; +import com.gregtechceu.gtceu.api.capability.IMedicalConditionTracker; +import com.gregtechceu.gtceu.api.data.medicalcondition.MedicalCondition; +import com.gregtechceu.gtceu.common.commands.arguments.MedicalConditionArgument; + +import net.minecraft.commands.CommandBuildContext; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.EntityArgument; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.FloatArgumentType; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.Collections; + +import static net.minecraft.commands.Commands.argument; +import static net.minecraft.commands.Commands.literal; + +public class MedicalConditionCommands { + + private static final SimpleCommandExceptionType ERROR_CLEAR_EVERYTHING_FAILED = new SimpleCommandExceptionType( + Component.translatable("commands.effect.clear.everything.failed")); + private static final SimpleCommandExceptionType ERROR_GIVE_FAILED = new SimpleCommandExceptionType( + Component.translatable("commands.effect.give.failed")); + + public static void register(CommandDispatcher dispatcher, CommandBuildContext buildContext) { + dispatcher.register( + literal("medical_condition") + .then(literal("query") + .executes(context -> queryMedicalConditions( + context.getSource().getPlayerOrException())) + .then(argument("target", EntityArgument.player()) + .requires(source -> source.hasPermission(2)) + .executes(context -> queryMedicalConditions( + EntityArgument.getPlayer(context, "target"))))) + .then(literal("clear") + .requires(source -> source.hasPermission(2)) + .executes(context -> clearMedicalConditions( + Collections.singleton(context.getSource().getPlayerOrException()), + null)) + .then(argument("targets", EntityArgument.players()) + .executes(context -> clearMedicalConditions( + EntityArgument.getPlayers(context, "targets"), null)) + .then(argument("condition", + MedicalConditionArgument.medicalCondition()) + .executes(context -> { + Collection targets = EntityArgument + .getPlayers(context, "targets"); + MedicalCondition condition = MedicalConditionArgument + .getCondition(context, "condition"); + return clearMedicalConditions(targets, condition); + })))) + .then(literal("apply") + .requires(source -> source.hasPermission(2)) + .then(argument("targets", EntityArgument.players()) + .then(argument("condition", + MedicalConditionArgument.medicalCondition()) + .executes(context -> { + MedicalCondition condition = MedicalConditionArgument + .getCondition(context, "condition"); + Collection players = EntityArgument + .getPlayers(context, "targets"); + return applyMedicalConditions(players, condition, 1); + }).then(argument("progression_multiplier", + FloatArgumentType.floatArg(0)) + .executes(context -> { + MedicalCondition condition = MedicalConditionArgument + .getCondition(context, "condition"); + Collection players = EntityArgument + .getPlayers(context, "targets"); + float strength = FloatArgumentType.getFloat( + context, + "progression_multiplier"); + return applyMedicalConditions(players, + condition, strength); + })))))); + } + + private static int queryMedicalConditions(ServerPlayer target) throws CommandSyntaxException { + IMedicalConditionTracker tracker = GTCapabilityHelper.getMedicalConditionTracker(target); + if (tracker == null) { + throw EntityArgument.NO_PLAYERS_FOUND.create(); + } + int count = tracker.getMedicalConditions().size(); + if (count == 0) { + target.sendSystemMessage( + Component.translatable("command.gtceu.medical_condition.get.empty", target.getName())); + } else { + target.sendSystemMessage( + Component.translatable("command.gtceu.medical_condition.get", target.getName())); + } + for (var entry : tracker.getMedicalConditions().object2FloatEntrySet()) { + String langKey = "command.gtceu.medical_condition.get.element"; + if (entry.getKey().maxProgression * 2 <= entry.getFloatValue() && + entry.getKey().canBePermanent) { + langKey = "command.gtceu.medical_condition.get.element.permanent"; + } + target.sendSystemMessage( + Component.translatable(langKey, + Component.translatable("gtceu.medical_condition." + entry.getKey().name), + entry.getFloatValue() / 20f)); + } + return count; + } + + private static int clearMedicalConditions(Collection targets, + @Nullable MedicalCondition condition) throws CommandSyntaxException { + int count = 0; + for (ServerPlayer target : targets) { + IMedicalConditionTracker tracker = GTCapabilityHelper.getMedicalConditionTracker(target); + if (tracker == null) { + continue; + } + if (condition == null) { + count += tracker.getMedicalConditions().keySet().size(); + for (MedicalCondition medicalCondition : tracker.getMedicalConditions().keySet()) { + tracker.removeMedicalCondition(medicalCondition); + } + } else { + count++; + tracker.removeMedicalCondition(condition); + } + } + if (count == 0) { + throw ERROR_CLEAR_EVERYTHING_FAILED.create(); + } + return count; + } + + private static int applyMedicalConditions(Collection targets, MedicalCondition condition, + float strength) throws CommandSyntaxException { + int success = 0; + for (ServerPlayer player : targets) { + IMedicalConditionTracker tracker = GTCapabilityHelper.getMedicalConditionTracker(player); + if (tracker == null) { + continue; + } + tracker.progressCondition(condition, strength); + success++; + } + if (success == 0) { + throw ERROR_GIVE_FAILED.create(); + } + return success; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/commands/ServerCommands.java b/src/main/java/com/gregtechceu/gtceu/common/commands/ServerCommands.java deleted file mode 100644 index 90d5484782..0000000000 --- a/src/main/java/com/gregtechceu/gtceu/common/commands/ServerCommands.java +++ /dev/null @@ -1,261 +0,0 @@ -package com.gregtechceu.gtceu.common.commands; - -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.capability.IMedicalConditionTracker; -import com.gregtechceu.gtceu.api.data.chemical.material.properties.HazardProperty; -import com.gregtechceu.gtceu.api.data.medicalcondition.MedicalCondition; -import com.gregtechceu.gtceu.api.gui.factory.GTUIEditorFactory; -import com.gregtechceu.gtceu.api.recipe.GTRecipe; -import com.gregtechceu.gtceu.common.capability.EnvironmentalHazardSavedData; -import com.gregtechceu.gtceu.common.capability.LocalizedHazardSavedData; -import com.gregtechceu.gtceu.common.commands.arguments.MedicalConditionArgument; - -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.Commands; -import net.minecraft.commands.arguments.EntityArgument; -import net.minecraft.commands.arguments.coordinates.BlockPosArgument; -import net.minecraft.core.BlockPos; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.item.crafting.Recipe; - -import com.mojang.brigadier.arguments.*; -import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import com.mojang.brigadier.context.CommandContext; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; -import org.jetbrains.annotations.Nullable; - -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -import static net.minecraft.commands.Commands.*; - -/** - * @author KilaBash - * @date 2023/2/9 - * @implNote ServerCommands - */ -public class ServerCommands { - - private static final SimpleCommandExceptionType ERROR_CLEAR_EVERYTHING_FAILED = new SimpleCommandExceptionType( - Component.translatable("commands.effect.clear.everything.failed")); - private static final SimpleCommandExceptionType ERROR_GIVE_FAILED = new SimpleCommandExceptionType( - Component.translatable("commands.effect.give.failed")); - - public static List> createServerCommands() { - return List.of( - literal("gtceu") - .then(literal("ui_editor") - .executes(context -> { - GTUIEditorFactory.INSTANCE.openUI(GTUIEditorFactory.INSTANCE, - context.getSource().getPlayerOrException()); - return 1; - })) - .then(literal("check_recipes_valid") - .requires(cs -> cs.hasPermission(0)) - .executes(context -> { - for (Recipe recipe : context.getSource().getServer().getRecipeManager() - .getRecipes()) { - if (recipe instanceof GTRecipe gtRecipe && !gtRecipe.checkRecipeValid()) { - context.getSource().sendSuccess( - () -> Component - .literal("recipe %s is invalid".formatted(gtRecipe.id)), - false); - } - } - return 1; - })) - .then(literal("medical_condition") - .requires(source -> source.hasPermission(2)) - .then(literal("query") - .executes(context -> queryMedicalConditions( - context.getSource().getPlayerOrException())) - .then(argument("target", EntityArgument.player()) - .executes(context -> queryMedicalConditions( - EntityArgument.getPlayer(context, "target"))))) - .then(literal("clear") - .executes(context -> clearMedicalConditions( - Collections.singleton(context.getSource().getPlayerOrException()), - null)) - .then(argument("targets", EntityArgument.players()) - .executes(context -> clearMedicalConditions( - EntityArgument.getPlayers(context, "targets"), null)) - .then(argument("condition", - MedicalConditionArgument.medicalCondition()) - .executes(context -> { - Collection targets = EntityArgument - .getPlayers(context, "targets"); - MedicalCondition condition = MedicalConditionArgument - .getCondition(context, "condition"); - return clearMedicalConditions(targets, condition); - })))) - .then(literal("apply") - .then(argument("targets", EntityArgument.players()) - .then(argument("condition", - MedicalConditionArgument.medicalCondition()) - .executes(context -> { - MedicalCondition condition = MedicalConditionArgument - .getCondition(context, "condition"); - Collection players = EntityArgument - .getPlayers(context, "targets"); - return applyMedicalConditions(players, condition, 1); - }).then(argument("progression_multiplier", - FloatArgumentType.floatArg(0)) - .executes(context -> { - MedicalCondition condition = MedicalConditionArgument - .getCondition(context, "condition"); - Collection players = EntityArgument - .getPlayers(context, "targets"); - float strength = FloatArgumentType.getFloat( - context, - "progression_multiplier"); - return applyMedicalConditions(players, - condition, strength); - })))))) - .then(literal("environmental_hazard") - .then(argument("condition", MedicalConditionArgument.medicalCondition()) - .then(argument("can_spread", BoolArgumentType.bool()) - .then(argument("source", BlockPosArgument.blockPos()) - .then(literal("chunk") - .then(Commands - .argument("strength", - IntegerArgumentType.integer(1)) - .executes( - ServerCommands::spawnChunkEnvironmentalHazard))) - .then(literal("local") - .then(Commands - .argument("from", BlockPosArgument.blockPos()) - .then(Commands - .argument("to", - BlockPosArgument.blockPos()) - .executes( - ServerCommands::spawnLocalEnvironmentalHazard))))))) - .then(literal("clear") - .then(argument("source", BlockPosArgument.blockPos()) - .executes(context -> { - BlockPos source = BlockPosArgument.getBlockPos(context, "source"); - return clearEnvironmentalHazard(context, source, null); - }) - .then(argument("condition", MedicalConditionArgument.medicalCondition()) - .executes(context -> { - BlockPos source = BlockPosArgument.getBlockPos(context, - "source"); - MedicalCondition condition = MedicalConditionArgument - .getCondition(context, "condition"); - return clearEnvironmentalHazard(context, source, condition); - })))))); - } - - private static int queryMedicalConditions(ServerPlayer target) throws CommandSyntaxException { - IMedicalConditionTracker tracker = GTCapabilityHelper.getMedicalConditionTracker(target); - if (tracker == null) { - throw EntityArgument.NO_PLAYERS_FOUND.create(); - } - int count = tracker.getMedicalConditions().size(); - if (count == 0) { - target.sendSystemMessage( - Component.translatable("command.gtceu.medical_condition.get.empty", target.getName())); - } else { - target.sendSystemMessage( - Component.translatable("command.gtceu.medical_condition.get", target.getName())); - } - for (var entry : tracker.getMedicalConditions().object2FloatEntrySet()) { - String langKey = "command.gtceu.medical_condition.get.element"; - if (entry.getKey().maxProgression * 2 <= entry.getFloatValue() && - entry.getKey().canBePermanent) { - langKey = "command.gtceu.medical_condition.get.element.permanent"; - } - target.sendSystemMessage( - Component.translatable(langKey, - Component.translatable("gtceu.medical_condition." + entry.getKey().name), - entry.getFloatValue() / 20f)); - } - return count; - } - - private static int clearMedicalConditions(Collection targets, - @Nullable MedicalCondition condition) throws CommandSyntaxException { - int count = 0; - for (ServerPlayer target : targets) { - IMedicalConditionTracker tracker = GTCapabilityHelper.getMedicalConditionTracker(target); - if (tracker == null) { - continue; - } - if (condition == null) { - count += tracker.getMedicalConditions().keySet().size(); - for (MedicalCondition medicalCondition : tracker.getMedicalConditions().keySet()) { - tracker.removeMedicalCondition(medicalCondition); - } - } else { - count++; - tracker.removeMedicalCondition(condition); - } - } - if (count == 0) { - throw ERROR_CLEAR_EVERYTHING_FAILED.create(); - } - return count; - } - - private static int applyMedicalConditions(Collection targets, MedicalCondition condition, - float strength) throws CommandSyntaxException { - int success = 0; - for (ServerPlayer player : targets) { - IMedicalConditionTracker tracker = GTCapabilityHelper.getMedicalConditionTracker(player); - if (tracker == null) { - continue; - } - tracker.progressCondition(condition, strength); - success++; - } - if (success == 0) { - throw ERROR_GIVE_FAILED.create(); - } - return success; - } - - private static int spawnChunkEnvironmentalHazard(CommandContext context) { - ServerLevel serverLevel = context.getSource().getLevel(); - - BlockPos source = BlockPosArgument.getBlockPos(context, "source"); - int strength = IntegerArgumentType.getInteger(context, "strength"); - MedicalCondition condition = MedicalConditionArgument.getCondition(context, "condition"); - boolean canSpread = BoolArgumentType.getBool(context, "can_spread"); - - EnvironmentalHazardSavedData.getOrCreate(serverLevel) - .addZone(source, strength, canSpread, HazardProperty.HazardTrigger.INHALATION, condition); - - return 1; - } - - private static int spawnLocalEnvironmentalHazard(CommandContext context) { - ServerLevel serverLevel = context.getSource().getLevel(); - BlockPos source = BlockPosArgument.getBlockPos(context, "source"); - BlockPos from = BlockPosArgument.getBlockPos(context, "from"); - BlockPos to = BlockPosArgument.getBlockPos(context, "to"); - - MedicalCondition condition = MedicalConditionArgument.getCondition(context, "condition"); - boolean canSpread = BoolArgumentType.getBool(context, "can_spread"); - - LocalizedHazardSavedData.getOrCreate(serverLevel) - .addCuboidZone(source, from, to, canSpread, HazardProperty.HazardTrigger.INHALATION, condition); - - return 1; - } - - private static int clearEnvironmentalHazard(CommandContext context, - BlockPos clearAt, MedicalCondition condition) { - ServerLevel serverLevel = context.getSource().getLevel(); - if (condition == null) { - EnvironmentalHazardSavedData.getOrCreate(serverLevel).removeZone(clearAt); - LocalizedHazardSavedData.getOrCreate(serverLevel).removeZoneByPosition(clearAt); - } else { - EnvironmentalHazardSavedData.getOrCreate(serverLevel).removeZone(clearAt, condition); - LocalizedHazardSavedData.getOrCreate(serverLevel).removeZoneByPosition(clearAt, condition); - } - return 1; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/common/commands/arguments/GTRegistryArgument.java b/src/main/java/com/gregtechceu/gtceu/common/commands/arguments/GTRegistryArgument.java new file mode 100644 index 0000000000..50fb26a458 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/commands/arguments/GTRegistryArgument.java @@ -0,0 +1,175 @@ +package com.gregtechceu.gtceu.common.commands.arguments; + +import com.gregtechceu.gtceu.api.registry.GTRegistry; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.ResourceLocationException; +import net.minecraft.commands.CommandBuildContext; +import net.minecraft.commands.synchronization.ArgumentTypeInfo; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; + +import com.google.gson.JsonObject; +import com.mojang.brigadier.LiteralMessage; +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.arguments.ArgumentType; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import com.mojang.brigadier.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Locale; +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; +import java.util.function.Function; + +public class GTRegistryArgument implements ArgumentType { + + private static final SimpleCommandExceptionType ERROR_INVALID = new SimpleCommandExceptionType( + Component.translatable("argument.id.invalid")); + + private static final Collection EXAMPLES = Arrays.asList("gtceu:iron_vein", "gtceu:pitchblende_vein_end", + "gtceu:lava_deposit"); + + private final GTRegistry registry; + private final Class keyClass; + + public GTRegistryArgument(GTRegistry registry, Class keyClass) { + this.registry = registry; + this.keyClass = keyClass; + } + + public static GTRegistryArgument registry(GTRegistry registry, Class keyClass) { + return new GTRegistryArgument<>(registry, keyClass); + } + + @SuppressWarnings("unchecked") + public V parse(StringReader reader) throws CommandSyntaxException { + String id = readId(reader); + if (ResourceLocation.class.isAssignableFrom(keyClass)) { + K loc = (K) new ResourceLocation(id); + if (!registry.containKey(loc)) { + throw new SimpleCommandExceptionType(new LiteralMessage("Failed to find object" + id + " in registry")) + .createWithContext(reader); + } + + return registry.get(loc); + } else if (String.class.isAssignableFrom(keyClass)) { + K loc = (K) id; + if (!registry.containKey(loc)) { + throw new SimpleCommandExceptionType(Component.literal("Failed to find object " + id + " in registry")) + .createWithContext(reader); + } + return registry.get(loc); + } + throw new SimpleCommandExceptionType(Component.literal("Invalid key class! this should never happen!")) + .createWithContext(reader); + } + + public static String readId(StringReader reader) throws CommandSyntaxException { + int cursor = reader.getCursor(); + + while (reader.canRead() && ResourceLocation.isAllowedInResourceLocation(reader.peek())) { + reader.skip(); + } + + String s = reader.getString().substring(cursor, reader.getCursor()); + + try { + return s; + } catch (ResourceLocationException var4) { + reader.setCursor(cursor); + throw ERROR_INVALID.createWithContext(reader); + } + } + + @Override + public CompletableFuture listSuggestions(CommandContext commandContext, + SuggestionsBuilder builder) { + String string = builder.getRemaining().toLowerCase(Locale.ROOT); + filterResources(registry.keys(), string, Function.identity(), id -> builder.suggest(id.toString())); + return builder.buildFuture(); + } + + static void filterResources(Iterable resources, String input, Function locationFunction, + Consumer resourceConsumer) { + for (T object : resources) { + K id = locationFunction.apply(object); + String string = id.toString(); + if (matchesSubStr(input, string)) { + resourceConsumer.accept(object); + } + } + } + + static boolean matchesSubStr(String input, String substring) { + for (int i = 0; !substring.startsWith(input, i); ++i) { + i = substring.indexOf('_', i); + if (i < 0) { + return false; + } + } + return true; + } + + @Override + public Collection getExamples() { + return EXAMPLES; + } + + @MethodsReturnNonnullByDefault + public static class Info + implements + ArgumentTypeInfo, GTRegistryArgument.Info.Template> { + + public void serializeToNetwork(GTRegistryArgument.Info.Template template, FriendlyByteBuf buffer) { + buffer.writeResourceLocation(template.registryKey.getRegistryName()); + buffer.writeBoolean(ResourceLocation.class.isAssignableFrom(template.keyClass)); + } + + @SuppressWarnings("unchecked") + public GTRegistryArgument.Info.Template deserializeFromNetwork(FriendlyByteBuf buffer) { + ResourceLocation resourceLocation = buffer.readResourceLocation(); + Class keyClass = (Class) String.class; + if (buffer.readBoolean()) { + keyClass = (Class) ResourceLocation.class; + } + // noinspection unchecked + return new GTRegistryArgument.Info.Template( + (GTRegistry) GTRegistry.REGISTERED.get(resourceLocation), keyClass); + } + + public void serializeToJson(GTRegistryArgument.Info.Template template, JsonObject json) { + json.addProperty("registry", template.registryKey.getRegistryName().toString()); + } + + public GTRegistryArgument.Info.Template unpack(GTRegistryArgument argument) { + return new GTRegistryArgument.Info.Template(argument.registry, argument.keyClass); + } + + public final class Template implements ArgumentTypeInfo.Template> { + + final GTRegistry registryKey; + final Class keyClass; + + Template(GTRegistry registryKey, Class keyClass) { + this.registryKey = registryKey; + this.keyClass = keyClass; + } + + public GTRegistryArgument instantiate(@NotNull CommandBuildContext context) { + return new GTRegistryArgument<>(this.registryKey, keyClass); + } + + @Override + public ArgumentTypeInfo, ?> type() { + return GTRegistryArgument.Info.this; + } + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTCommandArguments.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTCommandArguments.java index ff24048674..44fb23eff9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTCommandArguments.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTCommandArguments.java @@ -1,6 +1,8 @@ package com.gregtechceu.gtceu.common.data; import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.registry.GTRegistry; +import com.gregtechceu.gtceu.common.commands.arguments.GTRegistryArgument; import com.gregtechceu.gtceu.common.commands.arguments.MaterialArgument; import com.gregtechceu.gtceu.common.commands.arguments.MedicalConditionArgument; @@ -12,6 +14,9 @@ import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.RegistryObject; +import com.mojang.brigadier.arguments.ArgumentType; + +@SuppressWarnings("unused") public class GTCommandArguments { private static final DeferredRegister> COMMAND_ARGUMENT_TYPES = DeferredRegister @@ -27,6 +32,18 @@ public class GTCommandArguments { () -> ArgumentTypeInfos.registerByClass(MedicalConditionArgument.class, SingletonArgumentInfo.contextFree(MedicalConditionArgument::medicalCondition))); + @SuppressWarnings({ "unchecked", "rawtypes" }) + private static final RegistryObject>> GT_REGISTRY_ARGUMENT_TYPE = COMMAND_ARGUMENT_TYPES + .register("gt_registry", + () -> ArgumentTypeInfos.registerByClass( + fixClassType(GTRegistryArgument.class), + new GTRegistryArgument.Info<>())); + + @SuppressWarnings({ "SameParameterValue", "unchecked" }) + private static > Class fixClassType(Class type) { + return (Class) type; + } + public static void init(IEventBus modBus) { COMMAND_ARGUMENT_TYPES.register(modBus); } diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/ChunkGeneratorMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/ChunkGeneratorMixin.java index 384ffe1a72..a1ea8bea91 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/ChunkGeneratorMixin.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/ChunkGeneratorMixin.java @@ -17,11 +17,11 @@ public class ChunkGeneratorMixin { @Unique - private final OrePlacer orePlacer = new OrePlacer(); + private final OrePlacer gtceu$orePlacer = new OrePlacer(); @Inject(method = "applyBiomeDecoration", at = @At("TAIL")) private void gtceu$applyBiomeDecoration(WorldGenLevel level, ChunkAccess chunk, StructureManager structureManager, CallbackInfo ci) { - orePlacer.placeOres(level, (ChunkGenerator) ((Object) this), chunk); + gtceu$orePlacer.placeOres(level, (ChunkGenerator) ((Object) this), chunk); } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index 77097d5b59..f2a7226c4a 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -125,6 +125,10 @@ public static void init(RegistrateLangProvider provider) { provider.add("command.gtceu.medical_condition.get.empty", "Player %s has no medical conditions."); provider.add("command.gtceu.medical_condition.get.element", "Condition %s§r: %s seconds"); provider.add("command.gtceu.medical_condition.get.element.permanent", "Condition %s§r: %s seconds (permanent)"); + provider.add("command.gtceu.dump_data.success", "Dumped %s resources from registry %s to %s"); + provider.add("command.gtceu.place_vein.failure", "Failed to place vein %s at position %s"); + provider.add("command.gtceu.place_vein.success", "Placed vein %s at position %s"); + provider.add("gtceu.medical_condition.description", "§l§cHAZARDOUS §7Hold Shift to show details"); provider.add("gtceu.medical_condition.description_shift", "§l§cHAZARDOUS:"); provider.add("gtceu.medical_condition.chemical_burns", "§5Chemical burns"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/loader/BedrockFluidLoader.java b/src/main/java/com/gregtechceu/gtceu/data/loader/BedrockFluidLoader.java index 296630d544..18ea0b582d 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/loader/BedrockFluidLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/loader/BedrockFluidLoader.java @@ -33,7 +33,7 @@ public class BedrockFluidLoader extends SimpleJsonResourceReloadListener { public static final Gson GSON_INSTANCE = Deserializers.createFunctionSerializer().create(); - private static final String FOLDER = "gtceu/fluid_veins"; + public static final String FOLDER = "gtceu/fluid_veins"; protected static final Logger LOGGER = LogManager.getLogger(); public BedrockFluidLoader() { diff --git a/src/main/java/com/gregtechceu/gtceu/data/loader/BedrockOreLoader.java b/src/main/java/com/gregtechceu/gtceu/data/loader/BedrockOreLoader.java index 99ff8a2d8b..a8f93b1da7 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/loader/BedrockOreLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/loader/BedrockOreLoader.java @@ -37,7 +37,7 @@ public class BedrockOreLoader extends SimpleJsonResourceReloadListener { public static final Gson GSON_INSTANCE = Deserializers.createFunctionSerializer().create(); - private static final String FOLDER = "gtceu/bedrock_ore_veins"; + public static final String FOLDER = "gtceu/bedrock_ore_veins"; protected static final Logger LOGGER = LogManager.getLogger(); public BedrockOreLoader() { diff --git a/src/main/java/com/gregtechceu/gtceu/data/loader/GTOreLoader.java b/src/main/java/com/gregtechceu/gtceu/data/loader/GTOreLoader.java index f4c45ffff6..27b65af9df 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/loader/GTOreLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/loader/GTOreLoader.java @@ -35,7 +35,7 @@ public class GTOreLoader extends SimpleJsonResourceReloadListener { public static final Gson GSON_INSTANCE = Deserializers.createFunctionSerializer().create(); - private static final String FOLDER = "gtceu/ore_veins"; + public static final String FOLDER = "gtceu/ore_veins"; protected static final Logger LOGGER = LogManager.getLogger(); public GTOreLoader() { diff --git a/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java b/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java index 1f85406430..38bc9b8849 100644 --- a/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java @@ -23,7 +23,9 @@ import com.gregtechceu.gtceu.common.capability.EnvironmentalHazardSavedData; import com.gregtechceu.gtceu.common.capability.LocalizedHazardSavedData; import com.gregtechceu.gtceu.common.capability.MedicalConditionTracker; -import com.gregtechceu.gtceu.common.commands.ServerCommands; +import com.gregtechceu.gtceu.common.commands.GTCommands; +import com.gregtechceu.gtceu.common.commands.HazardCommands; +import com.gregtechceu.gtceu.common.commands.MedicalConditionCommands; import com.gregtechceu.gtceu.common.data.GTBlocks; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.data.GTMachines; @@ -208,7 +210,9 @@ public static void onLeftClickBlock(PlayerInteractEvent.LeftClickBlock event) { @SubscribeEvent public static void registerCommand(RegisterCommandsEvent event) { - ServerCommands.createServerCommands().forEach(event.getDispatcher()::register); + GTCommands.register(event.getDispatcher(), event.getBuildContext()); + MedicalConditionCommands.register(event.getDispatcher(), event.getBuildContext()); + HazardCommands.register(event.getDispatcher(), event.getBuildContext()); } @SubscribeEvent From 4156ebb8997044dfd5a68bb6ecc7e94b1e57192b Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Mon, 9 Sep 2024 22:35:24 -0600 Subject: [PATCH 005/141] Minor Combustion Engine Recipe Logic Fixes (#1913) Co-authored-by: YoungOnionMC --- .../generator/LargeCombustionEngineMachine.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeCombustionEngineMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeCombustionEngineMachine.java index a5dc846cbf..cb903a0813 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeCombustionEngineMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeCombustionEngineMachine.java @@ -18,7 +18,6 @@ import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; -import com.lowdragmc.lowdraglib.side.fluid.FluidHelper; import com.lowdragmc.lowdraglib.side.fluid.FluidStack; import net.minecraft.ChatFormatting; @@ -45,10 +44,9 @@ @MethodsReturnNonnullByDefault public class LargeCombustionEngineMachine extends WorkableElectricMultiblockMachine implements ITieredMachine { - private static final FluidStack OXYGEN_STACK = GTMaterials.Oxygen.getFluid(20 * FluidHelper.getBucket() / 1000); - private static final FluidStack LIQUID_OXYGEN_STACK = GTMaterials.Oxygen.getFluid(FluidStorageKeys.LIQUID, - 80 * FluidHelper.getBucket() / 1000); - private static final FluidStack LUBRICANT_STACK = GTMaterials.Lubricant.getFluid(FluidHelper.getBucket() / 1000); + private static final FluidStack OXYGEN_STACK = GTMaterials.Oxygen.getFluid(20); + private static final FluidStack LIQUID_OXYGEN_STACK = GTMaterials.Oxygen.getFluid(FluidStorageKeys.LIQUID, 80); + private static final FluidStack LUBRICANT_STACK = GTMaterials.Lubricant.getFluid(1); @Getter private final int tier; @@ -118,12 +116,11 @@ public static GTRecipe recipeModifier(MetaMachine machine, @NotNull GTRecipe rec var parallelResult = GTRecipeModifiers.fastParallel(engineMachine, recipe, maxParallel, false); if (engineMachine.isOxygenBoosted) { // boost production long eut = (long) (EUt * parallelResult.getSecond() * (engineMachine.isExtreme() ? 2 : 1.5)); - result.init(-eut, recipe.duration, parallelResult.getSecond(), params.getOcAmount()); + result.init(-eut, recipe.duration, 1, params.getOcAmount()); } else { - result.init(-RecipeHelper.getOutputEUt(recipe), recipe.duration, parallelResult.getSecond(), - params.getOcAmount()); + long eut = (long) (EUt * parallelResult.getSecond()); + result.init(-eut, recipe.duration, 1, params.getOcAmount()); } - return recipe; } } From 6a1557422802de6c13238ab59145318beaece04a Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Tue, 10 Sep 2024 03:10:15 -0400 Subject: [PATCH 006/141] Fixed ME Output Bus/Hatch storage behavior (#1915) --- .../ae2/machine/MEOutputBusPartMachine.java | 180 ++++-------------- .../ae2/machine/MEOutputHatchPartMachine.java | 175 ++++++----------- 2 files changed, 96 insertions(+), 259 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java index 5b26de1738..73f5ed1b9d 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java @@ -6,31 +6,22 @@ import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.integration.ae2.gui.widget.list.AEListGridWidget; import com.gregtechceu.gtceu.integration.ae2.utils.KeyStorage; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; -import com.lowdragmc.lowdraglib.gui.widget.SlotWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; import com.lowdragmc.lowdraglib.misc.ItemStackTransfer; -import com.lowdragmc.lowdraglib.syncdata.ISubscription; import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Ingredient; import appeng.api.config.Actionable; import appeng.api.stacks.AEItemKey; -import appeng.items.materials.StorageComponentItem; -import lombok.Getter; import lombok.NoArgsConstructor; -import org.jetbrains.annotations.Nullable; - -import java.util.List; import javax.annotation.ParametersAreNonnullByDefault; @@ -48,14 +39,6 @@ public class MEOutputBusPartMachine extends MEBusPartMachine implements IMachine @Persisted private KeyStorage internalBuffer; // Do not use KeyCounter, use our simple implementation - @Getter - @Persisted - protected NotifiableItemStackHandler storageSlot; - - @Nullable - protected ISubscription storageSub; - - private long capacitySize = 0; public MEOutputBusPartMachine(IMachineBlockEntity holder, Object... args) { super(holder, IO.OUT, args); @@ -68,41 +51,9 @@ public MEOutputBusPartMachine(IMachineBlockEntity holder, Object... args) { @Override protected NotifiableItemStackHandler createInventory(Object... args) { this.internalBuffer = new KeyStorage(); - this.storageSlot = new NotifiableItemStackHandler(this, 1, io); - this.storageSlot.setFilter(item -> canInsertCell(item)); return new InaccessibleInfiniteHandler(this); } - @Override - public void onLoad() { - super.onLoad(); - if (isRemote()) return; - - storageSub = storageSlot.addChangedListener(this::updateStorageSize); - updateStorageSize(); - } - - private boolean canInsertCell(ItemStack item) { - var grid = getMainNode().getGrid(); - if (item.getItem() instanceof StorageComponentItem compItem) { - long newSize = (long) compItem.getBytes(item) * 8L; - if (newSize >= capacitySize) { - return true; - } else { - return ((InaccessibleInfiniteHandler) (getInventory())).getCachedAmount() >= newSize; - } - } - return false; - } - - private void updateStorageSize() { - if (this.storageSlot.getStackInSlot(0).getItem() instanceof StorageComponentItem compItem) { - capacitySize = (compItem.getBytes(this.storageSlot.getStackInSlot(0)) * 8L); - } else if (this.storageSlot.getStackInSlot(0).isEmpty()) { - capacitySize = 64L; - } - } - @Override public void onMachineRemoved() { var grid = getMainNode().getGrid(); @@ -131,7 +82,6 @@ protected boolean shouldSubscribe() { @Override public void autoIO() { if (!this.shouldSyncME()) return; - if (this.updateMEStatus()) { var grid = getMainNode().getGrid(); if (grid != null && !internalBuffer.isEmpty()) { @@ -154,7 +104,6 @@ public Widget createUIWidget() { "gtceu.gui.me_network.offline")); group.addWidget(new LabelWidget(5, 10, "gtceu.gui.waiting_list")); // display list - group.addWidget(new SlotWidget(storageSlot.storage, 0, 140, 0)); group.addWidget(new AEListGridWidget.Item(5, 20, 3, this.internalBuffer)); return group; @@ -162,39 +111,23 @@ public Widget createUIWidget() { private class InaccessibleInfiniteHandler extends NotifiableItemStackHandler { - private ItemStackTransfer itemTransfer; - public InaccessibleInfiniteHandler(MetaMachine holder) { - super(holder, 1, IO.OUT, IO.NONE); + super(holder, 1, IO.OUT, IO.NONE, ItemStackTransferDelegate::new); internalBuffer.setOnContentsChanged(this::onContentsChanged); } + } - public ItemStackTransfer getTransfer() { - if (this.itemTransfer == null) { - this.itemTransfer = new ItemStackTransferDelegate(); - } - return itemTransfer; - } - - @Override - public int getSize() { - return Integer.MAX_VALUE; - } + @NoArgsConstructor + private class ItemStackTransferDelegate extends ItemStackTransfer { - private long getCachedAmount() { - long itemAmount = 0; - var grid = getMainNode().getGrid(); - if (grid != null && !internalBuffer.isEmpty()) { - for (var slot : internalBuffer) { - itemAmount += grid.getStorageService().getInventory().getAvailableStacks() - .get(slot.getKey()); - } - } - return itemAmount; + // Necessary for InaccessibleInfiniteHandler + public ItemStackTransferDelegate(Integer integer) { + super(); } - private boolean canInsertItem() { - return getCachedAmount() < capacitySize; + @Override + public int getSlots() { + return Short.MAX_VALUE; } @Override @@ -203,76 +136,47 @@ public int getSlotLimit(int slot) { } @Override - public @Nullable List handleRecipeInner(IO io, GTRecipe recipe, List left, - @Nullable String slotName, boolean simulate) { - return handleIngredient(io, recipe, left, simulate, handlerIO, getTransfer()); + public ItemStack getStackInSlot(int slot) { + return ItemStack.EMPTY; } - @NoArgsConstructor - private class ItemStackTransferDelegate extends ItemStackTransfer { - - @Override - public int getSlots() { - return 1; - } - - @Override - public int getSlotLimit(int slot) { - return Integer.MAX_VALUE; // todo add me components for sizing - } - - @Override - public ItemStack getStackInSlot(int slot) { - return ItemStack.EMPTY; - } - - @Override - public void setStackInSlot(int slot, ItemStack stack) { - // NO-OP - } + @Override + public void setStackInSlot(int slot, ItemStack stack) { + // NO-OP + } - @Override - public ItemStack insertItem( - int slot, ItemStack stack, boolean simulate, boolean notifyChanges) { - var key = AEItemKey.of(stack); - int count = stack.getCount(); - long oldValue = internalBuffer.storage.getOrDefault(key, 0); - long changeValue = Math.min(Long.MAX_VALUE - oldValue, count); - if (canInsertItem()) { - if (changeValue > 0) { - if (!simulate) { - internalBuffer.storage.put(key, oldValue + changeValue); - internalBuffer.onChanged(); - } - return stack.copyWithCount((int) (count - changeValue)); - } else { - return ItemStack.EMPTY; - } + @Override + public ItemStack insertItem(int slot, ItemStack stack, boolean simulate, boolean notifyChanges) { + var key = AEItemKey.of(stack); + int count = stack.getCount(); + long oldValue = internalBuffer.storage.getOrDefault(key, 0); + long changeValue = Math.min(Long.MAX_VALUE - oldValue, count); + if (changeValue > 0) { + if (!simulate) { + internalBuffer.storage.put(key, oldValue + changeValue); + internalBuffer.onChanged(); } + return stack.copyWithCount((int) (count - changeValue)); + } else { return ItemStack.EMPTY; } + } - @Override - public ItemStack extractItem(int slot, int amount, boolean simulate, boolean notifyChanges) { - return ItemStack.EMPTY; - } - - @Override - public boolean isItemValid(int slot, ItemStack stack) { - return false; - } + @Override + public ItemStack extractItem(int slot, int amount, boolean simulate, boolean notifyChanges) { + return ItemStack.EMPTY; + } - @Override - public ItemStackTransfer copy() { - // because recipe testing uses copy transfer instead of simulated operations - return new ItemStackTransferDelegate() { + @Override + public ItemStackTransfer copy() { + // because recipe testing uses copy transfer instead of simulated operations + return new ItemStackTransferDelegate() { - @Override - public ItemStack insertItem(int slot, ItemStack stack, boolean simulate, boolean notifyChanges) { - return super.insertItem(slot, stack, true, notifyChanges); - } - }; - } + @Override + public ItemStack insertItem(int slot, ItemStack stack, boolean simulate, boolean notifyChanges) { + return super.insertItem(slot, stack, true, notifyChanges); + } + }; } } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java index 4e175847d3..31464cf294 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java @@ -5,30 +5,22 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.api.recipe.GTRecipe; -import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; import com.gregtechceu.gtceu.integration.ae2.gui.widget.list.AEListGridWidget; import com.gregtechceu.gtceu.integration.ae2.utils.KeyStorage; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; -import com.lowdragmc.lowdraglib.gui.widget.SlotWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; import com.lowdragmc.lowdraglib.misc.FluidStorage; import com.lowdragmc.lowdraglib.side.fluid.FluidStack; -import com.lowdragmc.lowdraglib.syncdata.ISubscription; import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.world.item.ItemStack; import appeng.api.config.Actionable; import appeng.api.stacks.AEFluidKey; -import appeng.items.materials.StorageComponentItem; -import lombok.Getter; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; import java.util.List; @@ -44,15 +36,6 @@ public class MEOutputHatchPartMachine extends MEHatchPartMachine implements IMac @Persisted private KeyStorage internalBuffer; // Do not use KeyCounter, use our simple implementation - @Getter - @Persisted - protected NotifiableItemStackHandler storageSlot; - - @Nullable - protected ISubscription storageSub; - - private long capacitySize = 0; - public MEOutputHatchPartMachine(IMachineBlockEntity holder, Object... args) { super(holder, IO.IN, args); } @@ -64,8 +47,6 @@ public MEOutputHatchPartMachine(IMachineBlockEntity holder, Object... args) { @Override protected NotifiableFluidTank createTank(long initialCapacity, int slots, Object... args) { this.internalBuffer = new KeyStorage(); - this.storageSlot = new NotifiableItemStackHandler(this, 1, io); - this.storageSlot.setFilter(item -> canInsertCell(item)); return new InaccessibleInfiniteTank(this); } @@ -73,30 +54,6 @@ protected NotifiableFluidTank createTank(long initialCapacity, int slots, Object public void onLoad() { super.onLoad(); if (isRemote()) return; - - storageSub = storageSlot.addChangedListener(this::updateStorageSize); - updateStorageSize(); - } - - private boolean canInsertCell(ItemStack item) { - var grid = getMainNode().getGrid(); - if (item.getItem() instanceof StorageComponentItem compItem) { - long newSize = (long) compItem.getBytes(item) * 8L; - if (newSize >= capacitySize) { - return true; - } else { - return ((MEOutputHatchPartMachine.InaccessibleInfiniteTank) (tank)).getCachedAmount() >= newSize; - } - } - return false; - } - - private void updateStorageSize() { - if (this.storageSlot.getStackInSlot(0).getItem() instanceof StorageComponentItem compItem) { - capacitySize = (compItem.getBytes(this.storageSlot.getStackInSlot(0)) * 8L); - } else if (this.storageSlot.getStackInSlot(0).isEmpty()) { - capacitySize = 64L; - } } @Override @@ -127,7 +84,6 @@ protected boolean shouldSubscribe() { @Override protected void autoIO() { if (!this.shouldSyncME()) return; - if (this.updateMEStatus()) { var grid = getMainNode().getGrid(); if (grid != null && !internalBuffer.isEmpty()) { @@ -142,7 +98,6 @@ protected void autoIO() { /////////////////////////////// @Override - public Widget createUIWidget() { WidgetGroup group = new WidgetGroup(0, 0, 170, 65); // ME Network status @@ -151,7 +106,6 @@ public Widget createUIWidget() { "gtceu.gui.me_network.offline")); group.addWidget(new LabelWidget(5, 10, "gtceu.gui.waiting_list")); // display list - group.addWidget(new SlotWidget(storageSlot.storage, 0, 140, 0)); group.addWidget(new AEListGridWidget.Fluid(5, 20, 3, this.internalBuffer)); return group; @@ -159,105 +113,84 @@ public Widget createUIWidget() { private class InaccessibleInfiniteTank extends NotifiableFluidTank { - private FluidStorage[] fluidStorages; + FluidStorage storage; public InaccessibleInfiniteTank(MetaMachine holder) { - super(holder, 0, 0, IO.OUT, IO.NONE); + super(holder, List.of(new FluidStorageDelegate()), IO.OUT, IO.NONE); internalBuffer.setOnContentsChanged(this::onContentsChanged); + storage = getStorages()[0]; } @Override - public FluidStorage[] getStorages() { - if (this.fluidStorages == null) { - this.fluidStorages = new FluidStorage[] { new FluidStorageDelegate() }; - } - return this.fluidStorages; + public int getTanks() { + return 128; } @Override - public int getSize() { - return Integer.MAX_VALUE; + public FluidStack getFluidInTank(int tank) { + return storage.getFluid(); } - private long getCachedAmount() { - long fluidAmount = 0; - var grid = getMainNode().getGrid(); - if (grid != null && internalBuffer.isEmpty()) { - for (var tank : internalBuffer) { - fluidAmount += grid.getStorageService().getInventory().getAvailableStacks() - .get(tank.getKey()); - } - } - return fluidAmount; - } - - private boolean canInsertFluid() { - return getCachedAmount() < capacitySize; + @Override + public long getTankCapacity(int tank) { + return storage.getCapacity(); } @Override - public @Nullable List handleRecipeInner(IO io, GTRecipe recipe, List left, - @Nullable String slotName, boolean simulate) { - return handleIngredient(io, recipe, left, simulate, this.handlerIO, getStorages()); + public boolean isFluidValid(int tank, @NotNull FluidStack stack) { + return storage.isFluidValid(stack); } + } - private class FluidStorageDelegate extends FluidStorage { - - public FluidStorageDelegate() { - super(0L); - } + private class FluidStorageDelegate extends FluidStorage { - @Override - public long getCapacity() { - return Long.MAX_VALUE; - } + public FluidStorageDelegate() { + super(0L); + } - @Override - public void setFluid(FluidStack fluid) { - // NO-OP - } + @Override + public long getCapacity() { + return Long.MAX_VALUE; + } - @Override - public long fill(int tank, FluidStack resource, boolean simulate, boolean notifyChanges) { - var key = AEFluidKey.of(resource.getFluid(), resource.getTag()); - long amount = resource.getAmount(); - long oldValue = internalBuffer.storage.getOrDefault(key, 0); - long changeValue = Math.min(Long.MAX_VALUE - oldValue, amount); - if (canInsertFluid()) { - if (changeValue > 0 && !simulate) { - internalBuffer.storage.put(key, oldValue + changeValue); - internalBuffer.onChanged(); - } - } - return changeValue; - } + @Override + public void setFluid(FluidStack fluid) { + // NO-OP + } - @Override - public boolean supportsFill(int tank) { - return false; + @Override + public long fill(int tank, FluidStack resource, boolean simulate, boolean notifyChanges) { + var key = AEFluidKey.of(resource.getFluid(), resource.getTag()); + long amount = resource.getAmount(); + long oldValue = internalBuffer.storage.getOrDefault(key, 0); + long changeValue = Math.min(Long.MAX_VALUE - oldValue, amount); + if (changeValue > 0 && !simulate) { + internalBuffer.storage.put(key, oldValue + changeValue); + internalBuffer.onChanged(); } + return changeValue; + } - @Override - public boolean supportsDrain(int tank) { - return false; - } + @Override + public boolean supportsFill(int tank) { + return false; + } - @Override - public boolean isFluidValid(FluidStack stack) { - return false; - } + @Override + public boolean supportsDrain(int tank) { + return false; + } - @Override - public FluidStorage copy() { - // because recipe testing uses copy transfer instead of simulated operations - return new FluidStorageDelegate() { + @Override + public FluidStorage copy() { + // because recipe testing uses copy transfer instead of simulated operations + return new FluidStorageDelegate() { - @Override - public long fill(int tank, FluidStack resource, boolean simulate, boolean notifyChanges) { - return super.fill(tank, resource, true, notifyChanges); - } - }; - } + @Override + public long fill(int tank, FluidStack resource, boolean simulate, boolean notifyChanges) { + return super.fill(tank, resource, true, notifyChanges); + } + }; } } } From e817fd0ad914aea2b39aba34d36f7a9a1392417a Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Tue, 10 Sep 2024 17:47:22 -0600 Subject: [PATCH 007/141] Assembly Line Structure fix (#1921) Co-authored-by: YoungOnionMC --- .../com/gregtechceu/gtceu/common/data/GTMachines.java | 11 ++++------- .../com/gregtechceu/gtceu/config/ConfigHolder.java | 2 +- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java index 940745a8cb..faa925ddd5 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java @@ -1110,9 +1110,7 @@ public static BiConsumer> createTankTooltips(String n (tier, builder) -> builder .langValue("%s Dual Input Hatch".formatted(VNF[tier])) .rotationState(RotationState.ALL) - .abilities( - ConfigHolder.INSTANCE.machines.enableMoreDualHatchAbility ? DUAL_INPUT_HATCH_ABILITIES : - new PartAbility[] { PartAbility.IMPORT_ITEMS }) + .abilities(DUAL_INPUT_HATCH_ABILITIES) .overlayTieredHullRenderer("dual_hatch.import") .tooltips( Component.translatable("gtceu.machine.dual_hatch.import.tooltip"), @@ -1135,9 +1133,7 @@ public static BiConsumer> createTankTooltips(String n (tier, builder) -> builder .langValue("%s Dual Output Hatch".formatted(VNF[tier])) .rotationState(RotationState.ALL) - .abilities( - ConfigHolder.INSTANCE.machines.enableMoreDualHatchAbility ? DUAL_OUTPUT_HATCH_ABILITIES : - new PartAbility[] { PartAbility.EXPORT_ITEMS }) + .abilities(DUAL_OUTPUT_HATCH_ABILITIES) .overlayTieredHullRenderer("dual_hatch.export") .tooltips( Component.translatable("gtceu.machine.dual_hatch.export.tooltip"), @@ -1686,7 +1682,8 @@ public static BiConsumer> createTankTooltips(String n .where('S', Predicates.controller(blocks(definition.getBlock()))) .where('F', blocks(CASING_STEEL_SOLID.get()) .or(!ConfigHolder.INSTANCE.machines.orderedAssemblyLineFluids ? - Predicates.abilities(PartAbility.IMPORT_FLUIDS) : + Predicates.abilities(PartAbility.IMPORT_FLUIDS_1X, + PartAbility.IMPORT_FLUIDS_4X, PartAbility.IMPORT_FLUIDS_9X) : Predicates.abilities(PartAbility.IMPORT_FLUIDS_1X).setMaxGlobalLimited(4))) .where('O', Predicates.abilities(PartAbility.EXPORT_ITEMS) diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index 5f469a6942..00e79c0fa2 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -412,7 +412,7 @@ public static class MachineConfigs { @Configurable @Configurable.Comment({ - "Let Dual Hatch has more ability.", + "Let Dual Hatch has more ability. (DEPRECATED: does nothing now)", "When enabled it, Dual Hatch will can used to assemble line and so on.", "Need restart Minecraft to apply." }) From 52474f8ac7306ed2d88774830442336bb8979013 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Tue, 10 Sep 2024 18:21:11 -0600 Subject: [PATCH 008/141] Fix chance outputs failing cause of parallel amount (#1920) Co-authored-by: YoungOnionMC --- src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipe.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 e342465502..bddbcd3714 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipe.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipe.java @@ -57,7 +57,7 @@ public class GTRecipe implements net.minecraft.world.item.crafting.Recipe Date: Tue, 10 Sep 2024 22:39:36 -0400 Subject: [PATCH 009/141] Fixed Forming Press recipe logic for naming (#1922) --- .../trait/customlogic/FormingPressLogic.java | 79 +++++++++++-------- 1 file changed, 47 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/customlogic/FormingPressLogic.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/customlogic/FormingPressLogic.java index 9e8f9cbef9..01c3fbbed3 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/customlogic/FormingPressLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/customlogic/FormingPressLogic.java @@ -3,64 +3,79 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.IRecipeCapabilityHolder; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableRecipeHandlerTrait; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; import com.gregtechceu.gtceu.utils.GTStringUtils; -import com.lowdragmc.lowdraglib.misc.ItemTransferList; -import com.lowdragmc.lowdraglib.side.item.IItemTransfer; - import net.minecraft.nbt.Tag; import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; +import java.util.Collections; import java.util.Objects; +import java.util.stream.Collectors; public class FormingPressLogic implements GTRecipeType.ICustomRecipeLogic { @Override public @Nullable GTRecipe createCustomRecipe(IRecipeCapabilityHolder holder) { - var itemInputs = Objects + var handlers = Objects .requireNonNullElseGet(holder.getCapabilitiesProxy().get(IO.IN, ItemRecipeCapability.CAP), - ArrayList::new) + Collections::emptyList) .stream() - .filter(IItemTransfer.class::isInstance).map(IItemTransfer.class::cast) - .toArray(IItemTransfer[]::new); + .filter(NotifiableItemStackHandler.class::isInstance) + .map(NotifiableItemStackHandler.class::cast) + .filter(i -> i.getSlots() > 1) + .collect(Collectors.groupingBy(NotifiableRecipeHandlerTrait::isDistinct)); + + if (handlers.isEmpty()) return null; - ItemTransferList inputs = new ItemTransferList(itemInputs); - if (inputs.getSlots() > 1) { - ItemStack moldStack = ItemStack.EMPTY; + // Distinct first, reset our stacks for every inventory + for (var handler : handlers.getOrDefault(true, Collections.emptyList())) { + ItemStack mold = ItemStack.EMPTY; ItemStack item = ItemStack.EMPTY; - for (int i = 0; i < inputs.getSlots(); i++) { - var inputStack = inputs.getStackInSlot(i); + GTRecipe recipe = findRecipe(mold, item, handler); + if (recipe != null) return recipe; + } + + // Non-distinct, return as soon as we find valid items + ItemStack mold = ItemStack.EMPTY; + ItemStack item = ItemStack.EMPTY; + for (var handler : handlers.getOrDefault(false, Collections.emptyList())) { + GTRecipe recipe = findRecipe(mold, item, handler); + if (recipe != null) return recipe; + } - if (!moldStack.isEmpty() && !item.isEmpty()) break; + return null; + } - if (moldStack.isEmpty() && inputStack.is(GTItems.SHAPE_MOLD_NAME.asItem())) { - if (inputStack.getTag() != null && - inputStack.getTag().contains(ItemStack.TAG_DISPLAY, Tag.TAG_COMPOUND)) { - moldStack = inputStack; - } - } else if (item.isEmpty()) { - item = inputStack; + private @Nullable GTRecipe findRecipe(ItemStack mold, ItemStack item, NotifiableItemStackHandler handler) { + for (int i = 0; i < handler.getSlots(); ++i) { + if (!mold.isEmpty() && !item.isEmpty()) break; + var input = handler.getStackInSlot(i); + if (mold.isEmpty() && input.is(GTItems.SHAPE_MOLD_NAME.asItem())) { + if (input.hasTag() && input.getTag().contains(ItemStack.TAG_DISPLAY, Tag.TAG_COMPOUND)) { + mold = input; } + } else if (item.isEmpty()) { + item = input; } + } - if (!moldStack.isEmpty() && moldStack.getTag() != null && !item.isEmpty()) { - ItemStack output = item.copyWithCount(1); - - output.setHoverName(moldStack.getHoverName()); - return GTRecipeTypes.FORMING_PRESS_RECIPES.recipeBuilder(GTStringUtils.itemStackToString(output)) - .notConsumable(moldStack) - .inputItems(item.copyWithCount(1)) - .outputItems(output) - .duration(40).EUt(4) - .buildRawRecipe(); - } + if (!mold.isEmpty() && !item.isEmpty()) { + ItemStack output = item.copyWithCount(1); + output.setHoverName(mold.getHoverName()); + return GTRecipeTypes.FORMING_PRESS_RECIPES.recipeBuilder(GTStringUtils.itemStackToString(output)) + .notConsumable(mold) + .inputItems(item.copyWithCount(1)) + .outputItems(output) + .duration(40).EUt(4) + .buildRawRecipe(); } return null; } From ffd51711c7727c0130f6b5772b324dc5296d9ee4 Mon Sep 17 00:00:00 2001 From: Ghostipedia <46772882+Ghostipedia@users.noreply.github.com> Date: Wed, 11 Sep 2024 01:46:50 -0400 Subject: [PATCH 010/141] RenderToggles (#1925) --- .../gtceu/api/machine/MachineDefinition.java | 6 ++++++ .../api/machine/MultiblockMachineDefinition.java | 3 +++ .../api/registry/registrate/MachineBuilder.java | 13 +++++++++++++ .../registrate/MultiblockMachineBuilder.java | 6 ++++++ .../renderer/MultiblockInWorldPreviewRenderer.java | 1 + .../emi/multipage/MultiblockInfoEmiCategory.java | 1 + .../jei/multipage/MultiblockInfoCategory.java | 1 + .../multipage/MultiblockInfoDisplayCategory.java | 1 + 8 files changed, 32 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineDefinition.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineDefinition.java index 5f4b5efbb4..2623c5fd21 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineDefinition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineDefinition.java @@ -91,6 +91,12 @@ public class MachineDefinition implements Supplier { private IRenderer renderer; @Setter private VoxelShape shape; + @Getter + @Setter + private boolean renderWorldPreview; + @Getter + @Setter + private boolean renderXEIPreview; private final Map cache = new EnumMap<>(Direction.class); @Getter @Setter diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MultiblockMachineDefinition.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MultiblockMachineDefinition.java index e9c5bdabc5..b2ce1af831 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MultiblockMachineDefinition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MultiblockMachineDefinition.java @@ -46,6 +46,9 @@ public class MultiblockMachineDefinition extends MachineDefinition { @Getter @Setter private boolean allowFlip; + @Getter + @Setter + private boolean renderXEIPreview; @Setter @Getter @Nullable diff --git a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java index c7499cf258..90998b8ef2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java @@ -95,6 +95,10 @@ public class MachineBuilder extends Builde @Setter private boolean hasTESR; @Setter + private boolean renderMultiblockWorldPreview = true; + @Setter + private boolean renderMultiblockXEIPreview = true; + @Setter private NonNullUnaryOperator blockProp = p -> p; @Setter private NonNullUnaryOperator itemProp = p -> p; @@ -293,6 +297,13 @@ public MachineBuilder addOutputLimit(RecipeCapability capability, return this; } + public MachineBuilder multiblockPreviewRenderer(boolean multiBlockWorldPreview, + boolean multiBlockXEIPreview) { + this.renderMultiblockWorldPreview = multiBlockWorldPreview; + this.renderMultiblockXEIPreview = multiBlockXEIPreview; + return this; + } + public MachineBuilder compassSections(CompassSection... sections) { this.compassSections.addAll(Arrays.stream(sections).toList()); return this; @@ -429,6 +440,8 @@ public DEFINITION register() { definition.setRenderer(LDLib.isClient() ? renderer.get() : IRenderer.EMPTY); definition.setShape(shape); definition.setDefaultPaintingColor(paintingColor); + definition.setRenderXEIPreview(renderMultiblockXEIPreview); + definition.setRenderWorldPreview(renderMultiblockWorldPreview); GTRegistries.MACHINES.register(definition.getId(), definition); return definition; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MultiblockMachineBuilder.java b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MultiblockMachineBuilder.java index 81795fc4b2..fcfe687752 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MultiblockMachineBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MultiblockMachineBuilder.java @@ -134,6 +134,12 @@ public MultiblockMachineBuilder shape(VoxelShape shape) { return (MultiblockMachineBuilder) super.shape(shape); } + @Override + public MultiblockMachineBuilder multiblockPreviewRenderer(boolean multiBlockWorldPreview, + boolean multiBlockXEIPreview) { + return (MultiblockMachineBuilder) super.multiblockPreviewRenderer(multiBlockWorldPreview, multiBlockXEIPreview); + } + @Override public MultiblockMachineBuilder rotationState(RotationState rotationState) { return (MultiblockMachineBuilder) super.rotationState(rotationState); diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/MultiblockInWorldPreviewRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/MultiblockInWorldPreviewRenderer.java index 04d9aea8ac..f5bc73abff 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/MultiblockInWorldPreviewRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/MultiblockInWorldPreviewRenderer.java @@ -108,6 +108,7 @@ public static void removePreview(BlockPos pos) { */ public static void showPreview(BlockPos pos, MultiblockControllerMachine controller, int duration) { + if (!controller.getDefinition().isRenderWorldPreview()) return; Direction front = controller.getFrontFacing(); Direction up = controller.getUpwardsFacing(); MultiblockShapeInfo shapeInfo = controller.getDefinition().getMatchingShapes().get(0); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/emi/multipage/MultiblockInfoEmiCategory.java b/src/main/java/com/gregtechceu/gtceu/integration/emi/multipage/MultiblockInfoEmiCategory.java index 69987295e7..f36d3eb110 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/emi/multipage/MultiblockInfoEmiCategory.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/emi/multipage/MultiblockInfoEmiCategory.java @@ -23,6 +23,7 @@ public static void registerDisplays(EmiRegistry registry) { GTRegistries.MACHINES.values().stream() .filter(MultiblockMachineDefinition.class::isInstance) .map(MultiblockMachineDefinition.class::cast) + .filter(MultiblockMachineDefinition::isRenderXEIPreview) .map(MultiblockInfoEmiRecipe::new) .forEach(registry::addRecipe); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jei/multipage/MultiblockInfoCategory.java b/src/main/java/com/gregtechceu/gtceu/integration/jei/multipage/MultiblockInfoCategory.java index d4aac504c9..1aec962337 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jei/multipage/MultiblockInfoCategory.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jei/multipage/MultiblockInfoCategory.java @@ -33,6 +33,7 @@ public static void registerRecipes(IRecipeRegistration registry) { registry.addRecipes(RECIPE_TYPE, GTRegistries.MACHINES.values().stream() .filter(MultiblockMachineDefinition.class::isInstance) .map(MultiblockMachineDefinition.class::cast) + .filter(MultiblockMachineDefinition::isRenderXEIPreview) .map(MultiblockInfoWrapper::new) .toList()); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/rei/multipage/MultiblockInfoDisplayCategory.java b/src/main/java/com/gregtechceu/gtceu/integration/rei/multipage/MultiblockInfoDisplayCategory.java index 56eed6c6a3..75a2c16c52 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/rei/multipage/MultiblockInfoDisplayCategory.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/rei/multipage/MultiblockInfoDisplayCategory.java @@ -29,6 +29,7 @@ public static void registerDisplays(DisplayRegistry registry) { GTRegistries.MACHINES.values().stream() .filter(MultiblockMachineDefinition.class::isInstance) .map(MultiblockMachineDefinition.class::cast) + .filter(MultiblockMachineDefinition::isRenderXEIPreview) .map(MultiblockInfoDisplay::new) .forEach(registry::add); } From 685d3285a72cec82f60d30eefa157a4162638fc5 Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Wed, 11 Sep 2024 01:55:57 -0400 Subject: [PATCH 011/141] Fixed Primitive Multiblock behavior (#1924) Co-authored-by: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> --- .../multiblock/primitive/PrimitiveWorkableMachine.java | 10 ++++++---- .../gtceu/data/recipe/misc/MetaTileEntityLoader.java | 3 ++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java index a100499d95..83bb310353 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java @@ -57,21 +57,23 @@ public ManagedFieldHolder getFieldHolder() { } protected NotifiableItemStackHandler createImportItemHandler(Object... args) { - return new NotifiableItemStackHandler(this, getRecipeType().getMaxInputs(ItemRecipeCapability.CAP), IO.IN); + return new NotifiableItemStackHandler(this, getRecipeType().getMaxInputs(ItemRecipeCapability.CAP), IO.IN, + IO.NONE); } protected NotifiableItemStackHandler createExportItemHandler(Object... args) { - return new NotifiableItemStackHandler(this, getRecipeType().getMaxOutputs(ItemRecipeCapability.CAP), IO.OUT); + return new NotifiableItemStackHandler(this, getRecipeType().getMaxOutputs(ItemRecipeCapability.CAP), IO.OUT, + IO.NONE); } protected NotifiableFluidTank createImportFluidHandler(Object... args) { return new NotifiableFluidTank(this, getRecipeType().getMaxInputs(FluidRecipeCapability.CAP), - 32 * FluidHelper.getBucket(), IO.IN); + 32 * FluidHelper.getBucket(), IO.IN, IO.NONE); } protected NotifiableFluidTank createExportFluidHandler(Object... args) { return new NotifiableFluidTank(this, getRecipeType().getMaxOutputs(FluidRecipeCapability.CAP), - 32 * FluidHelper.getBucket(), IO.OUT); + 32 * FluidHelper.getBucket(), IO.OUT, IO.NONE); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MetaTileEntityLoader.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MetaTileEntityLoader.java index 19d4704a04..d929fcd986 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MetaTileEntityLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MetaTileEntityLoader.java @@ -546,7 +546,8 @@ public static void init(Consumer provider) { "PIP", 'P', GTBlocks.CASING_COKE_BRICKS.asStack(), 'I', new UnificationEntry(TagPrefix.plate, GTMaterials.Iron)); VanillaRecipeHelper.addShapedRecipe(provider, true, "coke_oven_hatch", GTMachines.COKE_OVEN_HATCH.asStack(), - "CD", 'C', GTBlocks.CASING_COKE_BRICKS.asStack(), 'D', GTMachines.WOODEN_DRUM.asStack()); + "CBD", 'C', Tags.Items.CHESTS_WOODEN, 'B', GTBlocks.CASING_COKE_BRICKS.asStack(), 'D', + GTMachines.WOODEN_DRUM.asStack()); VanillaRecipeHelper.addShapedRecipe(provider, true, "charcoal_pile_igniter", GTMachines.CHARCOAL_PILE_IGNITER.asStack(), "ERE", "EHE", "FFF", From 70b010f354b37cf5c469384eae9e6627b9af4dce Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Tue, 10 Sep 2024 23:56:06 -0600 Subject: [PATCH 012/141] Charcoal Pile Ignitor Improvements (#1923) Co-authored-by: YoungOnionMC --- .../primitive/CharcoalPileIgniterMachine.java | 39 ++++++++++++++++--- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CharcoalPileIgniterMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CharcoalPileIgniterMachine.java index ea5078cb63..4ac149006d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CharcoalPileIgniterMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CharcoalPileIgniterMachine.java @@ -16,6 +16,7 @@ import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -57,6 +58,11 @@ public class CharcoalPileIgniterMachine extends WorkableMultiblockMachine implem WALL_BLOCKS.add(Blocks.RED_SAND); } + + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + CharcoalPileIgniterMachine.class, + WorkableMultiblockMachine.MANAGED_FIELD_HOLDER); + private final Collection logPos = new ObjectOpenHashSet<>(); private static final int MIN_RADIUS = 1; @@ -95,6 +101,11 @@ public void onStructureInvalid() { this.maxTime = 0; } + @Override + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + @Override public void onUnload() { super.onUnload(); @@ -121,6 +132,11 @@ public boolean isActive() { return isActive; } + @Override + public boolean isWorkingEnabled() { + return true; + } + @Override public BlockPattern getPattern() { updateDimensions(); @@ -273,15 +289,28 @@ private void updateMaxProgessTime() { @OnlyIn(Dist.CLIENT) public void clientTick() { super.clientTick(); - if (recipeLogic.isWorking()) { + if (isActive) { var pos = this.getPos(); var facing = Direction.UP; - float xPos = facing.getStepX() * 0.76F + pos.getX() + 0.5F; + float xPos = facing.getStepX() * 0.76F + pos.getX() + 0.25F + GTValues.RNG.nextFloat() / 2.0F; float yPos = facing.getStepY() * 0.76F + pos.getY() + 0.25F; - float zPos = facing.getStepZ() * 0.76F + pos.getZ() + 0.5F; + float zPos = facing.getStepZ() * 0.76F + pos.getZ() + 0.25F + GTValues.RNG.nextFloat() / 2.0F; + + float ySpd = facing.getStepY() * 0.1F + 0.01F * GTValues.RNG.nextFloat(); + float horSpd = 0.03F * GTValues.RNG.nextFloat(); + float horSpd2 = 0.03F * GTValues.RNG.nextFloat(); - float ySpd = facing.getStepY() * 0.1F + 0.2F + 0.1F * GTValues.RNG.nextFloat(); - getLevel().addParticle(ParticleTypes.LARGE_SMOKE, xPos, yPos, zPos, 0, ySpd, 0); + if (GTValues.RNG.nextFloat() < 0.1F) { + getLevel().playLocalSound(xPos, yPos, zPos, SoundEvents.CAMPFIRE_CRACKLE, SoundSource.BLOCKS, 1.0F, + 1.0F, false); + } + for (float xi = xPos - 1; xi <= xPos + 1; xi++) { + for (float zi = zPos - 1; zi <= zPos + 1; zi++) { + if (GTValues.RNG.nextFloat() < .9F) + continue; + getLevel().addParticle(ParticleTypes.LARGE_SMOKE, xi, yPos, zi, horSpd, ySpd, horSpd2); + } + } } } From 0d0bd73e7240868ff4b85a0512b95057e0857bd9 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Wed, 11 Sep 2024 00:21:24 -0600 Subject: [PATCH 013/141] Fix empty material fluid tag loop (#1926) Co-authored-by: YoungOnionMC --- src/generated/resources/assets/gtceu/lang/en_ud.json | 1 - src/generated/resources/assets/gtceu/lang/en_us.json | 1 - .../com/gregtechceu/gtceu/data/tags/FluidTagLoader.java | 6 ------ 3 files changed, 8 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 96b8b043d1..924a6dcb56 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -5248,7 +5248,6 @@ "material.gtceu.einsteinium": "ɯnıuıǝʇsuıƎ", "material.gtceu.electrotine": "ǝuıʇoɹʇɔǝןƎ", "material.gtceu.electrum": "ɯnɹʇɔǝןƎ", - "material.gtceu.elementium": "ɯnıʇuǝɯǝןƎ", "material.gtceu.emerald": "pןɐɹǝɯƎ", "material.gtceu.ender_air": "ɹıⱯ ɹǝpuƎ", "material.gtceu.ender_eye": "ǝʎƎ ɹǝpuƎ", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 12dcf6ed6c..a208391d87 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -5248,7 +5248,6 @@ "material.gtceu.einsteinium": "Einsteinium", "material.gtceu.electrotine": "Electrotine", "material.gtceu.electrum": "Electrum", - "material.gtceu.elementium": "Elementium", "material.gtceu.emerald": "Emerald", "material.gtceu.ender_air": "Ender Air", "material.gtceu.ender_eye": "Ender Eye", diff --git a/src/main/java/com/gregtechceu/gtceu/data/tags/FluidTagLoader.java b/src/main/java/com/gregtechceu/gtceu/data/tags/FluidTagLoader.java index 4c91f53a8d..7db3b089ff 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/tags/FluidTagLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/tags/FluidTagLoader.java @@ -1,7 +1,5 @@ package com.gregtechceu.gtceu.data.tags; -import com.gregtechceu.gtceu.api.GTCEuAPI; -import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.data.recipe.CustomTags; @@ -16,10 +14,6 @@ public class FluidTagLoader { public static void init(RegistrateTagsProvider provider) { create(provider, CustomTags.LIGHTER_FLUIDS, GTMaterials.Butane.getFluid(), GTMaterials.Propane.getFluid()); - - for (final Material material : GTCEuAPI.materialManager.getRegisteredMaterials()) { - - } } public static void create(RegistrateTagsProvider provider, TagKey tag, ResourceLocation... rls) { From d32dbde3c13e48c4d88eca98d0a26943f5d9287c Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Wed, 11 Sep 2024 00:24:10 -0600 Subject: [PATCH 014/141] Where were you when processing array was kil? (#1927) Co-authored-by: YoungOnionMC --- .../compass/nodes/iv/alloy_blast_smelter.json | 2 +- .../compass/nodes/iv/large_arc_smelter.json | 4 +- .../compass/nodes/iv/large_assembler.json | 2 +- .../compass/nodes/iv/large_autoclave.json | 2 +- .../gtceu/compass/nodes/iv/large_brewer.json | 2 +- .../compass/nodes/iv/large_centrifuge.json | 2 +- .../compass/nodes/iv/large_chemical_bath.json | 2 +- .../nodes/iv/large_circuit_assembler.json | 2 +- .../gtceu/compass/nodes/iv/large_cutter.json | 2 +- .../compass/nodes/iv/large_distillery.json | 2 +- .../compass/nodes/iv/large_electrolyzer.json | 2 +- .../compass/nodes/iv/large_electromagnet.json | 2 +- .../nodes/iv/large_engraving_laser.json | 2 +- .../compass/nodes/iv/large_extractor.json | 2 +- .../compass/nodes/iv/large_extruder.json | 4 +- .../nodes/iv/large_maceration_tower.json | 2 +- .../nodes/iv/large_material_press.json | 4 +- .../gtceu/compass/nodes/iv/large_mixer.json | 4 +- .../nodes/iv/large_sifting_funnel.json | 2 +- .../compass/nodes/iv/large_solidifier.json | 2 +- .../compass/nodes/iv/large_wiremill.json | 2 +- .../compass/nodes/iv/processing_array.json | 16 - .../nodes/multiblock/alloy_blast_smelter.json | 4 +- .../nodes/multiblock/assembly_line.json | 2 +- .../compass/nodes/multiblock/cleanroom.json | 4 +- .../compass/nodes/multiblock/coke_oven.json | 2 +- .../compass/nodes/multiblock/cracker.json | 2 +- .../nodes/multiblock/distillation_tower.json | 2 +- .../multiblock/electric_blast_furnace.json | 2 +- .../nodes/multiblock/fluid_drilling_rig.json | 2 +- .../multiblock/implosion_compressor.json | 4 +- .../nodes/multiblock/large_arc_smelter.json | 2 +- .../nodes/multiblock/large_assembler.json | 2 +- .../nodes/multiblock/large_autoclave.json | 4 +- .../nodes/multiblock/large_boiler.json | 2 +- .../nodes/multiblock/large_brewer.json | 2 +- .../nodes/multiblock/large_centrifuge.json | 2 +- .../nodes/multiblock/large_chemical_bath.json | 2 +- .../multiblock/large_chemical_reactor.json | 2 +- .../multiblock/large_circuit_assembler.json | 2 +- .../nodes/multiblock/large_combustion.json | 4 +- .../nodes/multiblock/large_cutter.json | 2 +- .../nodes/multiblock/large_distillery.json | 4 +- .../nodes/multiblock/large_electrolyzer.json | 4 +- .../nodes/multiblock/large_electromagnet.json | 4 +- .../multiblock/large_engraving_laser.json | 4 +- .../nodes/multiblock/large_extractor.json | 4 +- .../nodes/multiblock/large_extruder.json | 4 +- .../multiblock/large_maceration_tower.json | 2 +- .../multiblock/large_material_press.json | 2 +- .../compass/nodes/multiblock/large_miner.json | 4 +- .../compass/nodes/multiblock/large_mixer.json | 4 +- .../nodes/multiblock/large_packer.json | 2 +- .../multiblock/large_sifting_funnel.json | 4 +- .../nodes/multiblock/large_solidifier.json | 4 +- .../nodes/multiblock/large_turbine.json | 2 +- .../nodes/multiblock/large_wiremill.json | 4 +- .../nodes/multiblock/luv_fusion_reactor.json | 2 +- .../nodes/multiblock/mega_blast_furnace.json | 2 +- .../nodes/multiblock/mega_vacuum_freezer.json | 2 +- .../nodes/multiblock/multi_smelter.json | 2 +- .../nodes/multiblock/multiblock_tank.json | 2 +- .../multiblock/primitive_blast_furnace.json | 2 +- .../nodes/multiblock/primitive_pump.json | 4 +- .../nodes/multiblock/processing_array.json | 16 - .../nodes/multiblock/pyrolyse_oven.json | 2 +- .../nodes/multiblock/steam_grinder.json | 4 +- .../compass/nodes/multiblock/steam_oven.json | 2 +- .../compass/nodes/multiblock/tank_valve.json | 2 +- .../nodes/multiblock/uv_fusion_reactor.json | 2 +- .../nodes/multiblock/vacuum_freezer.json | 2 +- .../nodes/multiblock/zpm_fusion_reactor.json | 2 +- .../resources/assets/gtceu/lang/en_ud.json | 6 - .../resources/assets/gtceu/lang/en_us.json | 6 - .../gtceu/common/data/GTMachines.java | 41 --- .../electric/ProcessingArrayMachine.java | 282 ------------------ .../gtceu/data/lang/MachineLang.java | 5 +- 77 files changed, 93 insertions(+), 463 deletions(-) delete mode 100644 src/generated/resources/assets/gtceu/compass/nodes/iv/processing_array.json delete mode 100644 src/generated/resources/assets/gtceu/compass/nodes/multiblock/processing_array.json delete mode 100644 src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/ProcessingArrayMachine.java diff --git a/src/generated/resources/assets/gtceu/compass/nodes/iv/alloy_blast_smelter.json b/src/generated/resources/assets/gtceu/compass/nodes/iv/alloy_blast_smelter.json index 5391c58785..413f04b5fe 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/iv/alloy_blast_smelter.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/iv/alloy_blast_smelter.json @@ -8,7 +8,7 @@ ], "page": "gtceu:iv/alloy_blast_smelter", "position": [ - -100, + -150, 100 ], "section": "gtceu:iv" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_arc_smelter.json b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_arc_smelter.json index 02f56dcd88..12186640c5 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_arc_smelter.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_arc_smelter.json @@ -8,8 +8,8 @@ ], "page": "gtceu:iv/large_arc_smelter", "position": [ - -250, - 100 + -50, + 50 ], "section": "gtceu:iv" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_assembler.json b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_assembler.json index 7de21717d8..5bd16abc77 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_assembler.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_assembler.json @@ -8,7 +8,7 @@ ], "page": "gtceu:iv/large_assembler", "position": [ - -100, + -150, 50 ], "section": "gtceu:iv" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_autoclave.json b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_autoclave.json index 836c3a84b5..6970590645 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_autoclave.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_autoclave.json @@ -8,7 +8,7 @@ ], "page": "gtceu:iv/large_autoclave", "position": [ - -50, + -100, 100 ], "section": "gtceu:iv" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_brewer.json b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_brewer.json index e73d39c6b6..e1804c601d 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_brewer.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_brewer.json @@ -8,7 +8,7 @@ ], "page": "gtceu:iv/large_brewer", "position": [ - -200, + -250, 150 ], "section": "gtceu:iv" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_centrifuge.json b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_centrifuge.json index 55582ff1ba..d200a5d428 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_centrifuge.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_centrifuge.json @@ -8,7 +8,7 @@ ], "page": "gtceu:iv/large_centrifuge", "position": [ - -50, + -100, 0 ], "section": "gtceu:iv" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_chemical_bath.json b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_chemical_bath.json index 66c6af3a6c..a3bb138e75 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_chemical_bath.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_chemical_bath.json @@ -8,7 +8,7 @@ ], "page": "gtceu:iv/large_chemical_bath", "position": [ - -100, + -150, 0 ], "section": "gtceu:iv" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_circuit_assembler.json b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_circuit_assembler.json index 02c81463b0..54633821a0 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_circuit_assembler.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_circuit_assembler.json @@ -8,7 +8,7 @@ ], "page": "gtceu:iv/large_circuit_assembler", "position": [ - -50, + -100, 50 ], "section": "gtceu:iv" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_cutter.json b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_cutter.json index 1aca7baa8f..a217066675 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_cutter.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_cutter.json @@ -8,7 +8,7 @@ ], "page": "gtceu:iv/large_cutter", "position": [ - -150, + -200, 150 ], "section": "gtceu:iv" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_distillery.json b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_distillery.json index ad08fd5a1a..0ba09e90e4 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_distillery.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_distillery.json @@ -8,7 +8,7 @@ ], "page": "gtceu:iv/large_distillery", "position": [ - -100, + -150, 150 ], "section": "gtceu:iv" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_electrolyzer.json b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_electrolyzer.json index 7de0118f6c..9d2874f1ab 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_electrolyzer.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_electrolyzer.json @@ -8,7 +8,7 @@ ], "page": "gtceu:iv/large_electrolyzer", "position": [ - -200, + -250, 50 ], "section": "gtceu:iv" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_electromagnet.json b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_electromagnet.json index b286a9d8b8..ec390b4e49 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_electromagnet.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_electromagnet.json @@ -8,7 +8,7 @@ ], "page": "gtceu:iv/large_electromagnet", "position": [ - -150, + -200, 50 ], "section": "gtceu:iv" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_engraving_laser.json b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_engraving_laser.json index a9713dc4b2..3e21b9418a 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_engraving_laser.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_engraving_laser.json @@ -8,7 +8,7 @@ ], "page": "gtceu:iv/large_engraving_laser", "position": [ - -200, + -250, 100 ], "section": "gtceu:iv" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_extractor.json b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_extractor.json index 0b5ce4ff6d..5d1e356f25 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_extractor.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_extractor.json @@ -8,7 +8,7 @@ ], "page": "gtceu:iv/large_extractor", "position": [ - -50, + -100, 150 ], "section": "gtceu:iv" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_extruder.json b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_extruder.json index a919d4d608..ae409fc5a5 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_extruder.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_extruder.json @@ -8,8 +8,8 @@ ], "page": "gtceu:iv/large_extruder", "position": [ - -250, - 200 + -50, + 150 ], "section": "gtceu:iv" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_maceration_tower.json b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_maceration_tower.json index 40648c72f8..20102e480e 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_maceration_tower.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_maceration_tower.json @@ -8,7 +8,7 @@ ], "page": "gtceu:iv/large_maceration_tower", "position": [ - -150, + -200, 0 ], "section": "gtceu:iv" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_material_press.json b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_material_press.json index d853f7cb38..361151fd9c 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_material_press.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_material_press.json @@ -8,8 +8,8 @@ ], "page": "gtceu:iv/large_material_press", "position": [ - -250, - 150 + -50, + 100 ], "section": "gtceu:iv" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_mixer.json b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_mixer.json index a93a426b2a..5da014f5ce 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_mixer.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_mixer.json @@ -8,8 +8,8 @@ ], "page": "gtceu:iv/large_mixer", "position": [ - -250, - 50 + -50, + 0 ], "section": "gtceu:iv" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_sifting_funnel.json b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_sifting_funnel.json index 6b13a73849..a817959043 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_sifting_funnel.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_sifting_funnel.json @@ -8,7 +8,7 @@ ], "page": "gtceu:iv/large_sifting_funnel", "position": [ - -150, + -200, 100 ], "section": "gtceu:iv" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_solidifier.json b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_solidifier.json index b3e4b1084d..8648c63f74 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_solidifier.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_solidifier.json @@ -8,7 +8,7 @@ ], "page": "gtceu:iv/large_solidifier", "position": [ - -200, + -250, 200 ], "section": "gtceu:iv" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_wiremill.json b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_wiremill.json index 993682eb53..907f09d4d5 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/iv/large_wiremill.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/iv/large_wiremill.json @@ -8,7 +8,7 @@ ], "page": "gtceu:iv/large_wiremill", "position": [ - -150, + -200, 200 ], "section": "gtceu:iv" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/iv/processing_array.json b/src/generated/resources/assets/gtceu/compass/nodes/iv/processing_array.json deleted file mode 100644 index 2350d466bd..0000000000 --- a/src/generated/resources/assets/gtceu/compass/nodes/iv/processing_array.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "button_texture": { - "type": "item", - "res": "gtceu:iv_processing_array" - }, - "items": [ - "gtceu:iv_processing_array", - "gtceu:luv_processing_array" - ], - "page": "gtceu:iv/processing_array", - "position": [ - -200, - 0 - ], - "section": "gtceu:iv" -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/alloy_blast_smelter.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/alloy_blast_smelter.json index 447a56a80f..75b2138505 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/alloy_blast_smelter.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/alloy_blast_smelter.json @@ -8,8 +8,8 @@ ], "page": "gtceu:multiblock/alloy_blast_smelter", "position": [ - -100, - 200 + -250, + 250 ], "section": "gtceu:multiblock" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/assembly_line.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/assembly_line.json index 4ebcf9e620..ee1bcfcb19 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/assembly_line.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/assembly_line.json @@ -8,7 +8,7 @@ ], "page": "gtceu:multiblock/assembly_line", "position": [ - -150, + -50, 50 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/cleanroom.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/cleanroom.json index 6b20ca74d4..e079759038 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/cleanroom.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/cleanroom.json @@ -8,8 +8,8 @@ ], "page": "gtceu:multiblock/cleanroom", "position": [ - -100, - 100 + -300, + 150 ], "section": "gtceu:multiblock" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/coke_oven.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/coke_oven.json index fc217791e8..31668e83b1 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/coke_oven.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/coke_oven.json @@ -8,7 +8,7 @@ ], "page": "gtceu:multiblock/coke_oven", "position": [ - -250, + -200, 0 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/cracker.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/cracker.json index 14e31ee9df..a71395520c 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/cracker.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/cracker.json @@ -8,7 +8,7 @@ ], "page": "gtceu:multiblock/cracker", "position": [ - -300, + -200, 50 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/distillation_tower.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/distillation_tower.json index fd094b5c5c..229606349f 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/distillation_tower.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/distillation_tower.json @@ -8,7 +8,7 @@ ], "page": "gtceu:multiblock/distillation_tower", "position": [ - -250, + -150, 50 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/electric_blast_furnace.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/electric_blast_furnace.json index 94ca0b1f2a..12838f4b3a 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/electric_blast_furnace.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/electric_blast_furnace.json @@ -8,7 +8,7 @@ ], "page": "gtceu:multiblock/electric_blast_furnace", "position": [ - -150, + -100, 0 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/fluid_drilling_rig.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/fluid_drilling_rig.json index cd79d51ca0..4a2f288f9e 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/fluid_drilling_rig.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/fluid_drilling_rig.json @@ -10,7 +10,7 @@ ], "page": "gtceu:multiblock/fluid_drilling_rig", "position": [ - -200, + -50, 100 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/implosion_compressor.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/implosion_compressor.json index 240980fb8d..a42cb707f1 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/implosion_compressor.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/implosion_compressor.json @@ -8,8 +8,8 @@ ], "page": "gtceu:multiblock/implosion_compressor", "position": [ - -50, - 0 + -350, + 50 ], "section": "gtceu:multiblock" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_arc_smelter.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_arc_smelter.json index 80153aa476..bd1b23732e 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_arc_smelter.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_arc_smelter.json @@ -8,7 +8,7 @@ ], "page": "gtceu:multiblock/large_arc_smelter", "position": [ - -250, + -50, 200 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_assembler.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_assembler.json index 25b5f96b81..74b74ede4c 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_assembler.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_assembler.json @@ -8,7 +8,7 @@ ], "page": "gtceu:multiblock/large_assembler", "position": [ - -350, + -150, 200 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_autoclave.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_autoclave.json index 24694a83e3..e2b6106d1b 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_autoclave.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_autoclave.json @@ -8,8 +8,8 @@ ], "page": "gtceu:multiblock/large_autoclave", "position": [ - -50, - 200 + -200, + 250 ], "section": "gtceu:multiblock" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_boiler.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_boiler.json index d06895595a..ce8a42f332 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_boiler.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_boiler.json @@ -11,7 +11,7 @@ ], "page": "gtceu:multiblock/large_boiler", "position": [ - -300, + -250, 0 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_brewer.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_brewer.json index e81354979e..c1e729b8df 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_brewer.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_brewer.json @@ -8,7 +8,7 @@ ], "page": "gtceu:multiblock/large_brewer", "position": [ - -350, + -100, 250 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_centrifuge.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_centrifuge.json index dff8bbe014..413b2f98c8 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_centrifuge.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_centrifuge.json @@ -8,7 +8,7 @@ ], "page": "gtceu:multiblock/large_centrifuge", "position": [ - -200, + -50, 150 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_chemical_bath.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_chemical_bath.json index 57565b7108..264d50d0d9 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_chemical_bath.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_chemical_bath.json @@ -8,7 +8,7 @@ ], "page": "gtceu:multiblock/large_chemical_bath", "position": [ - -250, + -100, 150 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_chemical_reactor.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_chemical_reactor.json index 26bed4f225..7a2dfe9fcc 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_chemical_reactor.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_chemical_reactor.json @@ -8,7 +8,7 @@ ], "page": "gtceu:multiblock/large_chemical_reactor", "position": [ - -100, + -50, 0 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_circuit_assembler.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_circuit_assembler.json index af06dd9b97..aa15763e24 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_circuit_assembler.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_circuit_assembler.json @@ -8,7 +8,7 @@ ], "page": "gtceu:multiblock/large_circuit_assembler", "position": [ - -300, + -100, 200 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_combustion.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_combustion.json index c078ae0b76..da52abd7b9 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_combustion.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_combustion.json @@ -9,8 +9,8 @@ ], "page": "gtceu:multiblock/large_combustion", "position": [ - -50, - 100 + -250, + 150 ], "section": "gtceu:multiblock" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_cutter.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_cutter.json index fb2cd50e50..e4ccfee231 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_cutter.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_cutter.json @@ -8,7 +8,7 @@ ], "page": "gtceu:multiblock/large_cutter", "position": [ - -300, + -50, 250 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_distillery.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_distillery.json index 97ae54b848..4d50c6def6 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_distillery.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_distillery.json @@ -8,8 +8,8 @@ ], "page": "gtceu:multiblock/large_distillery", "position": [ - -250, - 250 + -350, + 300 ], "section": "gtceu:multiblock" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_electrolyzer.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_electrolyzer.json index 07fe0faeef..8e0d837873 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_electrolyzer.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_electrolyzer.json @@ -8,8 +8,8 @@ ], "page": "gtceu:multiblock/large_electrolyzer", "position": [ - -100, - 150 + -300, + 200 ], "section": "gtceu:multiblock" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_electromagnet.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_electromagnet.json index 0b134308b3..de54ac5302 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_electromagnet.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_electromagnet.json @@ -8,8 +8,8 @@ ], "page": "gtceu:multiblock/large_electromagnet", "position": [ - -50, - 150 + -250, + 200 ], "section": "gtceu:multiblock" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_engraving_laser.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_engraving_laser.json index f27357a48b..48d5d563b9 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_engraving_laser.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_engraving_laser.json @@ -8,8 +8,8 @@ ], "page": "gtceu:multiblock/large_engraving_laser", "position": [ - -200, - 200 + -350, + 250 ], "section": "gtceu:multiblock" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_extractor.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_extractor.json index 4064fffb6b..35a8e6b7aa 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_extractor.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_extractor.json @@ -8,8 +8,8 @@ ], "page": "gtceu:multiblock/large_extractor", "position": [ - -200, - 250 + -300, + 300 ], "section": "gtceu:multiblock" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_extruder.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_extruder.json index dc5a5ec70d..7c0cfa3a42 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_extruder.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_extruder.json @@ -8,8 +8,8 @@ ], "page": "gtceu:multiblock/large_extruder", "position": [ - -150, - 250 + -250, + 300 ], "section": "gtceu:multiblock" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_maceration_tower.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_maceration_tower.json index e3ffcdb819..7db06f071e 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_maceration_tower.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_maceration_tower.json @@ -8,7 +8,7 @@ ], "page": "gtceu:multiblock/large_maceration_tower", "position": [ - -300, + -150, 150 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_material_press.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_material_press.json index 51567443da..81fd5458f2 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_material_press.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_material_press.json @@ -8,7 +8,7 @@ ], "page": "gtceu:multiblock/large_material_press", "position": [ - -400, + -150, 250 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_miner.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_miner.json index eda6cac9ed..3a4cad93bf 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_miner.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_miner.json @@ -10,8 +10,8 @@ ], "page": "gtceu:multiblock/large_miner", "position": [ - -150, - 100 + -350, + 150 ], "section": "gtceu:multiblock" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_mixer.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_mixer.json index d4acf81cea..a698329012 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_mixer.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_mixer.json @@ -8,8 +8,8 @@ ], "page": "gtceu:multiblock/large_mixer", "position": [ - -150, - 150 + -350, + 200 ], "section": "gtceu:multiblock" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_packer.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_packer.json index 7a7987d942..fed8b67b5c 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_packer.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_packer.json @@ -8,7 +8,7 @@ ], "page": "gtceu:multiblock/large_packer", "position": [ - -400, + -200, 200 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_sifting_funnel.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_sifting_funnel.json index 04dbb55065..eceb858099 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_sifting_funnel.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_sifting_funnel.json @@ -8,8 +8,8 @@ ], "page": "gtceu:multiblock/large_sifting_funnel", "position": [ - -150, - 200 + -300, + 250 ], "section": "gtceu:multiblock" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_solidifier.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_solidifier.json index 79de255929..096499b5de 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_solidifier.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_solidifier.json @@ -8,8 +8,8 @@ ], "page": "gtceu:multiblock/large_solidifier", "position": [ - -100, - 250 + -200, + 300 ], "section": "gtceu:multiblock" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_turbine.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_turbine.json index c2d0a5827e..0c213c4f76 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_turbine.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_turbine.json @@ -10,7 +10,7 @@ ], "page": "gtceu:multiblock/large_turbine", "position": [ - -400, + -200, 150 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_wiremill.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_wiremill.json index df3341750c..2aa28c3001 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_wiremill.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/large_wiremill.json @@ -8,8 +8,8 @@ ], "page": "gtceu:multiblock/large_wiremill", "position": [ - -50, - 250 + -150, + 300 ], "section": "gtceu:multiblock" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/luv_fusion_reactor.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/luv_fusion_reactor.json index d2820bd6bc..15dd6e1f19 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/luv_fusion_reactor.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/luv_fusion_reactor.json @@ -8,7 +8,7 @@ ], "page": "gtceu:multiblock/luv_fusion_reactor", "position": [ - -350, + -200, 100 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/mega_blast_furnace.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/mega_blast_furnace.json index ceb8804a6c..95ab6f41d1 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/mega_blast_furnace.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/mega_blast_furnace.json @@ -8,7 +8,7 @@ ], "page": "gtceu:multiblock/mega_blast_furnace", "position": [ - -400, + -100, 300 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/mega_vacuum_freezer.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/mega_vacuum_freezer.json index c9f6decc09..0517260215 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/mega_vacuum_freezer.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/mega_vacuum_freezer.json @@ -8,7 +8,7 @@ ], "page": "gtceu:multiblock/mega_vacuum_freezer", "position": [ - -350, + -50, 300 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/multi_smelter.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/multi_smelter.json index c665fd7a28..c8e65e4db4 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/multi_smelter.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/multi_smelter.json @@ -8,7 +8,7 @@ ], "page": "gtceu:multiblock/multi_smelter", "position": [ - -350, + -250, 50 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/multiblock_tank.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/multiblock_tank.json index c735fd648f..1ce2f14862 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/multiblock_tank.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/multiblock_tank.json @@ -9,7 +9,7 @@ ], "page": "gtceu:multiblock/multiblock_tank", "position": [ - -350, + -300, 0 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/primitive_blast_furnace.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/primitive_blast_furnace.json index 9fa54e58d6..9f32bd3113 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/primitive_blast_furnace.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/primitive_blast_furnace.json @@ -8,7 +8,7 @@ ], "page": "gtceu:multiblock/primitive_blast_furnace", "position": [ - -200, + -150, 0 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/primitive_pump.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/primitive_pump.json index 04e67bb4d9..41b80a02a2 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/primitive_pump.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/primitive_pump.json @@ -8,8 +8,8 @@ ], "page": "gtceu:multiblock/primitive_pump", "position": [ - -100, - 50 + -350, + 100 ], "section": "gtceu:multiblock" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/processing_array.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/processing_array.json deleted file mode 100644 index 57066e9432..0000000000 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/processing_array.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "button_texture": { - "type": "item", - "res": "gtceu:iv_processing_array" - }, - "items": [ - "gtceu:iv_processing_array", - "gtceu:luv_processing_array" - ], - "page": "gtceu:multiblock/processing_array", - "position": [ - -350, - 150 - ], - "section": "gtceu:multiblock" -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/pyrolyse_oven.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/pyrolyse_oven.json index 1ca1ae8f5b..d5afe2c39a 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/pyrolyse_oven.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/pyrolyse_oven.json @@ -8,7 +8,7 @@ ], "page": "gtceu:multiblock/pyrolyse_oven", "position": [ - -400, + -300, 50 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/steam_grinder.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/steam_grinder.json index 4dd7cc07c9..b95fa6ed25 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/steam_grinder.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/steam_grinder.json @@ -8,8 +8,8 @@ ], "page": "gtceu:multiblock/steam_grinder", "position": [ - -50, - 50 + -300, + 100 ], "section": "gtceu:multiblock" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/steam_oven.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/steam_oven.json index 5265c1249d..19bd570ec6 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/steam_oven.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/steam_oven.json @@ -8,7 +8,7 @@ ], "page": "gtceu:multiblock/steam_oven", "position": [ - -400, + -250, 100 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/tank_valve.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/tank_valve.json index 657cfe4e08..ad7291e8d5 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/tank_valve.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/tank_valve.json @@ -9,7 +9,7 @@ ], "page": "gtceu:multiblock/tank_valve", "position": [ - -400, + -350, 0 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/uv_fusion_reactor.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/uv_fusion_reactor.json index b1fe0bfff9..e3e6911b30 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/uv_fusion_reactor.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/uv_fusion_reactor.json @@ -8,7 +8,7 @@ ], "page": "gtceu:multiblock/uv_fusion_reactor", "position": [ - -250, + -100, 100 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/vacuum_freezer.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/vacuum_freezer.json index 988ce75354..1cebd52b2f 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/vacuum_freezer.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/vacuum_freezer.json @@ -8,7 +8,7 @@ ], "page": "gtceu:multiblock/vacuum_freezer", "position": [ - -200, + -100, 50 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/zpm_fusion_reactor.json b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/zpm_fusion_reactor.json index 0528087807..3292a0db12 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/multiblock/zpm_fusion_reactor.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/multiblock/zpm_fusion_reactor.json @@ -8,7 +8,7 @@ ], "page": "gtceu:multiblock/zpm_fusion_reactor", "position": [ - -300, + -150, 100 ], "section": "gtceu:multiblock" diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 924a6dcb56..6ac271a75a 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -491,7 +491,6 @@ "block.gtceu.iv_packer": "ɹ§ ɹǝʞɔɐԀ ǝʇıןƎ6§", "block.gtceu.iv_parallel_hatch": "ɥɔʇɐH ןoɹʇuoƆ ןǝןןɐɹɐԀ ǝʇıןƎ", "block.gtceu.iv_polarizer": "ɹ§ ɹǝzıɹɐןoԀ ǝʇıןƎ6§", - "block.gtceu.iv_processing_array": "ʎɐɹɹⱯ buıssǝɔoɹԀ ΛI6§", "block.gtceu.iv_quantum_chest": "Λ ʇsǝɥƆ ɯnʇuɐnὉ", "block.gtceu.iv_quantum_tank": "Λ ʞuɐ⟘ ɯnʇuɐnὉ", "block.gtceu.iv_rock_crusher": "ɹ§ ɹǝɥsnɹƆ ʞɔoᴚ ǝʇıןƎ6§", @@ -657,7 +656,6 @@ "block.gtceu.luv_packer": "ɹ§II ɹǝʞɔɐԀ ǝʇıןƎp§", "block.gtceu.luv_parallel_hatch": "ɥɔʇɐH ןoɹʇuoƆ ןǝןןɐɹɐԀ ɹǝʇsɐW", "block.gtceu.luv_polarizer": "ɹ§II ɹǝzıɹɐןoԀ ǝʇıןƎp§", - "block.gtceu.luv_processing_array": "ʎɐɹɹⱯ buıssǝɔoɹԀ ΛnꞀp§", "block.gtceu.luv_quantum_chest": "IΛ ʇsǝɥƆ ɯnʇuɐnὉ", "block.gtceu.luv_quantum_tank": "IΛ ʞuɐ⟘ ɯnʇuɐnὉ", "block.gtceu.luv_rock_crusher": "ɹ§II ɹǝɥsnɹƆ ʞɔoᴚ ǝʇıןƎp§", @@ -1899,7 +1897,6 @@ "compass.node.gtceu.iv/large_sifting_funnel": "ןǝuunℲ buıʇɟıS ǝbɹɐꞀ", "compass.node.gtceu.iv/large_solidifier": "ɹǝıɟıpıןoS ǝbɹɐꞀ", "compass.node.gtceu.iv/large_wiremill": "ןןıɯǝɹıM ǝbɹɐꞀ", - "compass.node.gtceu.iv/processing_array": "ʎɐɹɹⱯ buıssǝɔoɹԀ", "compass.node.gtceu.luv/luv_fusion_reactor": "ɹoʇɔɐǝᴚ uoısnℲ ʌnꞀ", "compass.node.gtceu.luv/mega_blast_furnace": "ǝɔɐuɹnℲ ʇsɐןᗺ ɐbǝW", "compass.node.gtceu.luv/mega_vacuum_freezer": "ɹǝzǝǝɹℲ ɯnnɔɐΛ ɐbǝW", @@ -2104,7 +2101,6 @@ "compass.node.gtceu.multiblock/multiblock_tank": "ʞuɐ⟘ ʞɔoןqıʇןnW", "compass.node.gtceu.multiblock/primitive_blast_furnace": "ǝɔɐuɹnℲ ʇsɐןᗺ ǝʌıʇıɯıɹԀ", "compass.node.gtceu.multiblock/primitive_pump": "dɯnԀ ǝʌıʇıɯıɹԀ", - "compass.node.gtceu.multiblock/processing_array": "ʎɐɹɹⱯ buıssǝɔoɹԀ", "compass.node.gtceu.multiblock/pyrolyse_oven": "uǝʌO ǝsʎןoɹʎԀ", "compass.node.gtceu.multiblock/steam_grinder": "ɹǝpuıɹ⅁ ɯɐǝʇS", "compass.node.gtceu.multiblock/steam_oven": "uǝʌO ɯɐǝʇS", @@ -3588,7 +3584,6 @@ "gtceu.multiblock.active_transformer.danger_enabled": "ǝʌısoןdxƎ :ᴚƎ⅁NⱯᗡq§ɔ§", "gtceu.multiblock.active_transformer.max_input": "ʇ/∩Ǝ %sɟ§ :ʇnduI xɐWɐ§", "gtceu.multiblock.active_transformer.max_output": "ʇ/∩Ǝ %sɟ§ :ʇndʇnO xɐWɔ§", - "gtceu.multiblock.advanced_processing_array.description": "˙uoıʇɐɯoʇnɐ buısɐǝ ʎןǝʌıʇɔǝɟɟǝ 'ʞɔoןqıʇןnɯ ǝןbuıs ɐ uı )s(ǝuıɥɔɐɯ ʞɔoןq ǝןbuıs ㄣ9 oʇ dn sǝuıqɯoɔ ʎɐɹɹⱯ buıssǝɔoɹԀ ǝɥ⟘", "gtceu.multiblock.assembly_line.description": "˙sʇuǝuodɯoɔ buıʇɟɐɹɔ pǝɔuɐʌpɐ buıʇɐǝɹɔ ɹoɟ pǝsn 'ǝuıɥɔɐW buıןqɯǝssⱯ ǝbɹɐן s,ʇı 'ʎɹoǝɥʇ uI ˙\"sǝɔıןs\" 9Ɩ oʇ ϛ ɟo buıʇsısuoɔ ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ǝbɹɐן ɐ sı ǝuıꞀ ʎןqɯǝssⱯ ǝɥ⟘", "gtceu.multiblock.blast_furnace.max_temperature": "%s :ʎʇıɔɐdɐƆ ʇɐǝH", "gtceu.multiblock.central_monitor.height": ":ʇɥbıǝH uǝǝɹɔS", @@ -3765,7 +3760,6 @@ "gtceu.multiblock.primitive_water_pump.extra2.3": "xㄣ :ɥɔʇɐH ʇndʇnO ΛꞀ ", "gtceu.multiblock.primitive_water_pump.extra2.4": "", "gtceu.multiblock.primitive_water_pump.extra2.5": "˙%%0ϛ ʎq pǝsɐǝɹɔuı ǝq ןןıʍ uoıʇɔnpoɹd ɹǝʇɐʍ ןɐʇoʇ ǝɥʇ 'ǝɯoıᗺ s,dɯnԀ ǝɥʇ uı buıuıɐɹ ǝןıɥM", - "gtceu.multiblock.processing_array.description": "˙uoıʇɐɯoʇnɐ buısɐǝ ʎןǝʌıʇɔǝɟɟǝ 'ʞɔoןqıʇןnɯ ǝןbuıs ɐ uı )s(ǝuıɥɔɐɯ ʞɔoןq ǝןbuıs 9Ɩ oʇ dn sǝuıqɯoɔ ʎɐɹɹⱯ buıssǝɔoɹԀ ǝɥ⟘", "gtceu.multiblock.progress": "%s%% :ssǝɹboɹԀ", "gtceu.multiblock.pyrolyse_oven.description": "˙ןıO ʎʌɐǝH puɐ ɥsⱯ ɹo 'ןıO ǝʇosoǝɹƆ puɐ ןɐoɔɹɐɥƆ oʇuı sboꞀ buıuɹnʇ ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı uǝʌO ǝsʎןoɹʎԀ ǝɥ⟘", "gtceu.multiblock.pyrolyse_oven.speed": "%s%% :pǝǝdS buıssǝɔoɹԀ", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index a208391d87..fe52f32cfc 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -491,7 +491,6 @@ "block.gtceu.iv_packer": "§9Elite Packer §r", "block.gtceu.iv_parallel_hatch": "Elite Parallel Control Hatch", "block.gtceu.iv_polarizer": "§9Elite Polarizer §r", - "block.gtceu.iv_processing_array": "§9IV Processing Array", "block.gtceu.iv_quantum_chest": "Quantum Chest V", "block.gtceu.iv_quantum_tank": "Quantum Tank V", "block.gtceu.iv_rock_crusher": "§9Elite Rock Crusher §r", @@ -657,7 +656,6 @@ "block.gtceu.luv_packer": "§dElite Packer II§r", "block.gtceu.luv_parallel_hatch": "Master Parallel Control Hatch", "block.gtceu.luv_polarizer": "§dElite Polarizer II§r", - "block.gtceu.luv_processing_array": "§dLuV Processing Array", "block.gtceu.luv_quantum_chest": "Quantum Chest VI", "block.gtceu.luv_quantum_tank": "Quantum Tank VI", "block.gtceu.luv_rock_crusher": "§dElite Rock Crusher II§r", @@ -1899,7 +1897,6 @@ "compass.node.gtceu.iv/large_sifting_funnel": "Large Sifting Funnel", "compass.node.gtceu.iv/large_solidifier": "Large Solidifier", "compass.node.gtceu.iv/large_wiremill": "Large Wiremill", - "compass.node.gtceu.iv/processing_array": "Processing Array", "compass.node.gtceu.luv/luv_fusion_reactor": "Luv Fusion Reactor", "compass.node.gtceu.luv/mega_blast_furnace": "Mega Blast Furnace", "compass.node.gtceu.luv/mega_vacuum_freezer": "Mega Vacuum Freezer", @@ -2104,7 +2101,6 @@ "compass.node.gtceu.multiblock/multiblock_tank": "Multiblock Tank", "compass.node.gtceu.multiblock/primitive_blast_furnace": "Primitive Blast Furnace", "compass.node.gtceu.multiblock/primitive_pump": "Primitive Pump", - "compass.node.gtceu.multiblock/processing_array": "Processing Array", "compass.node.gtceu.multiblock/pyrolyse_oven": "Pyrolyse Oven", "compass.node.gtceu.multiblock/steam_grinder": "Steam Grinder", "compass.node.gtceu.multiblock/steam_oven": "Steam Oven", @@ -3588,7 +3584,6 @@ "gtceu.multiblock.active_transformer.danger_enabled": "§c§bDANGER: Explosive", "gtceu.multiblock.active_transformer.max_input": "§aMax Input: §f%s EU/t", "gtceu.multiblock.active_transformer.max_output": "§cMax Output: §f%s EU/t", - "gtceu.multiblock.advanced_processing_array.description": "The Processing Array combines up to 64 single block machine(s) in a single multiblock, effectively easing automation.", "gtceu.multiblock.assembly_line.description": "The Assembly Line is a large multiblock structure consisting of 5 to 16 \"slices\". In theory, it's large Assembling Machine, used for creating advanced crafting components.", "gtceu.multiblock.blast_furnace.max_temperature": "Heat Capacity: %s", "gtceu.multiblock.central_monitor.height": "Screen Height:", @@ -3765,7 +3760,6 @@ "gtceu.multiblock.primitive_water_pump.extra2.3": " LV Output Hatch: 4x", "gtceu.multiblock.primitive_water_pump.extra2.4": "", "gtceu.multiblock.primitive_water_pump.extra2.5": "While raining in the Pump's Biome, the total water production will be increased by 50%%.", - "gtceu.multiblock.processing_array.description": "The Processing Array combines up to 16 single block machine(s) in a single multiblock, effectively easing automation.", "gtceu.multiblock.progress": "Progress: %s%%", "gtceu.multiblock.pyrolyse_oven.description": "The Pyrolyse Oven is a multiblock structure used for turning Logs into Charcoal and Creosote Oil, or Ash and Heavy Oil.", "gtceu.multiblock.pyrolyse_oven.speed": "Processing Speed: %s%%", diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java index faa925ddd5..f930262e36 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java @@ -81,7 +81,6 @@ import net.minecraft.world.level.block.DoorBlock; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; -import net.minecraft.world.phys.shapes.Shapes; import net.minecraftforge.fml.ModLoader; import appeng.api.networking.pathing.ChannelMode; @@ -2072,46 +2071,6 @@ public static BiConsumer> createTankTooltips(String n GTCEu.id("block/casings/mechanic/machine_casing_turbine_tungstensteel"), GTCEu.id("block/multiblock/generator/large_plasma_turbine")); - @SuppressWarnings("removal") - public static final MultiblockMachineDefinition[] PROCESSING_ARRAY = ConfigHolder.INSTANCE.machines.doProcessingArray ? - registerTieredMultis("processing_array", ProcessingArrayMachine::new, - (tier, builder) -> builder - .langValue(VNF[tier] + " Processing Array") - .rotationState(RotationState.ALL) - .blockProp(p -> p.noOcclusion().isViewBlocking((state, level, pos) -> false)) - .shape(Shapes.box(0.001, 0.001, 0.001, 0.999, 0.999, 0.999)) - .appearanceBlock(() -> ProcessingArrayMachine.getCasingState(tier)) - .recipeType(DUMMY_RECIPES) - // .recipeModifier(ProcessingArrayMachine::recipeModifier, true) - .pattern(definition -> FactoryBlockPattern.start() - .aisle("XXX", "CCC", "XXX") - .aisle("XXX", "C#C", "XXX") - .aisle("XSX", "CCC", "XXX") - .where('S', Predicates.controller(blocks(definition.getBlock()))) - .where('X', blocks(ProcessingArrayMachine.getCasingState(tier)) - .or(Predicates.abilities(PartAbility.IMPORT_ITEMS).setPreviewCount(1)) - .or(Predicates.abilities(PartAbility.EXPORT_ITEMS).setPreviewCount(1)) - .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setPreviewCount(1)) - .or(Predicates.abilities(PartAbility.EXPORT_FLUIDS).setPreviewCount(1)) - .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1) - .setMaxGlobalLimited(4).setPreviewCount(1)) - .or(Predicates.autoAbilities(true, false, false))) - .where('C', blocks(CLEANROOM_GLASS.get())) - .where('#', Predicates.air()) - .build()) - .tooltips(Component.translatable("gtceu.universal.tooltip.parallel", - ProcessingArrayMachine.getMachineLimit(tier))) - .workableCasingRenderer(tier == IV ? - GTCEu.id("block/casings/solid/machine_casing_robust_tungstensteel") : - GTCEu.id("block/casings/solid/machine_casing_sturdy_hsse"), - GTCEu.id("block/multiblock/processing_array")) - .compassSections(GTCompassSections.TIER[IV]) - .compassNode("processing_array") - .tooltips(Component.translatable("gtceu.universal.tooltip.deprecated")) - .register(), - IV, LuV) : - null; - public static final MultiblockMachineDefinition ACTIVE_TRANSFORMER = REGISTRATE .multiblock("active_transformer", ActiveTransformerMachine::new) .rotationState(RotationState.ALL) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/ProcessingArrayMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/ProcessingArrayMachine.java deleted file mode 100644 index 5b1ed51585..0000000000 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/ProcessingArrayMachine.java +++ /dev/null @@ -1,282 +0,0 @@ -package com.gregtechceu.gtceu.common.machine.multiblock.electric; - -import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.item.MetaMachineItem; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; -import com.gregtechceu.gtceu.api.machine.MachineDefinition; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; -import com.gregtechceu.gtceu.api.machine.multiblock.TieredWorkableElectricMultiblockMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.api.recipe.GTRecipe; -import com.gregtechceu.gtceu.api.recipe.GTRecipeType; -import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; -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.api.registry.GTRegistries; -import com.gregtechceu.gtceu.common.data.GTBlocks; -import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; -import com.gregtechceu.gtceu.common.data.GTRecipeTypes; -import com.gregtechceu.gtceu.utils.GTUtil; - -import com.lowdragmc.lowdraglib.gui.widget.SlotWidget; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; -import com.lowdragmc.lowdraglib.misc.ItemStackTransfer; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; - -import net.minecraft.ChatFormatting; -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.Style; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.Block; - -import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.stream.Collectors; - -import javax.annotation.ParametersAreNonnullByDefault; - -/** - * @author KilaBash - * @date 2023/7/23 - * @implNote ProcessingArrayMachine - */ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -@Deprecated(forRemoval = true) -@ApiStatus.ScheduledForRemoval(inVersion = "1.3.0") -public class ProcessingArrayMachine extends TieredWorkableElectricMultiblockMachine implements IMachineLife { - - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( - ProcessingArrayMachine.class, TieredWorkableElectricMultiblockMachine.MANAGED_FIELD_HOLDER); - - @Persisted - @DescSynced - public final NotifiableItemStackHandler machineStorage; - // runtime - @Nullable - private GTRecipeType[] recipeTypeCache; - - public ProcessingArrayMachine(IMachineBlockEntity holder, int tier, Object... args) { - super(holder, tier, args); - this.machineStorage = createMachineStorage(args); - } - - ////////////////////////////////////// - // ***** Initialization ******// - ////////////////////////////////////// - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } - - protected NotifiableItemStackHandler createMachineStorage(Object... args) { - var storage = new NotifiableItemStackHandler(this, 1, IO.NONE, IO.NONE, slots -> new ItemStackTransfer(1) { - - @Override - public int getSlotLimit(int slot) { - return getMachineLimit(getDefinition().getTier()); - } - }); - storage.setFilter(this::isMachineStack); - return storage; - } - - protected boolean isMachineStack(ItemStack itemStack) { - if (itemStack.getItem() instanceof MetaMachineItem metaMachineItem) { - MachineDefinition definition = metaMachineItem.getDefinition(); - - if (definition instanceof MultiblockMachineDefinition) { - return false; - } - - var recipeTypes = definition.getRecipeTypes(); - if (recipeTypes == null) { - return false; - } - for (GTRecipeType type : recipeTypes) { - if (type != GTRecipeTypes.DUMMY_RECIPES) { - return true; - } - } - } - return false; - } - - @Nullable - public MachineDefinition getMachineDefinition() { - if (machineStorage.storage.getStackInSlot(0).getItem() instanceof MetaMachineItem metaMachineItem) { - return metaMachineItem.getDefinition(); - } - return null; - } - - @Override - @NotNull - public GTRecipeType[] getRecipeTypes() { - if (recipeTypeCache == null) { - var definition = getMachineDefinition(); - recipeTypeCache = definition == null ? null : definition.getRecipeTypes(); - } - if (recipeTypeCache == null) { - recipeTypeCache = new GTRecipeType[] { GTRecipeTypes.DUMMY_RECIPES }; - } - return recipeTypeCache; - } - - @NotNull - @Override - public GTRecipeType getRecipeType() { - return getRecipeTypes()[getActiveRecipeType()]; - } - - @Override - public void onLoad() { - super.onLoad(); - if (!isRemote()) { - machineStorage.addChangedListener(this::onMachineChanged); - } - } - - protected void onMachineChanged() { - recipeTypeCache = null; - if (isFormed) { - if (getRecipeLogic().getLastRecipe() != null) { - getRecipeLogic().markLastRecipeDirty(); - } - getRecipeLogic().updateTickSubscription(); - } - } - - @Override - public void onMachineRemoved() { - clearInventory(machineStorage.storage); - } - - ////////////////////////////////////// - // ******* Recipe Logic *******// - ////////////////////////////////////// - - /** - * For available recipe tier, decided by the held machine. - */ - @Override - public int getTier() { - var definition = getMachineDefinition(); - return definition == null ? 0 : definition.getTier(); - } - - @Override - public int getOverclockTier() { - MachineDefinition machineDefinition = getMachineDefinition(); - int machineTier = machineDefinition == null ? getDefinition().getTier() : - Math.min(getDefinition().getTier(), machineDefinition.getTier()); - return Math.min(machineTier, GTUtil.getTierByVoltage(getMaxVoltage())); - } - - @Override - public int getMinOverclockTier() { - return getOverclockTier(); - } - - @Override - public int getMaxOverclockTier() { - return getOverclockTier(); - } - - @Nullable - public static GTRecipe recipeModifier(MetaMachine machine, @NotNull GTRecipe recipe, @NotNull OCParams params, - @NotNull OCResult result) { - if (machine instanceof ProcessingArrayMachine processingArray && - processingArray.machineStorage.storage.getStackInSlot(0).getCount() > 0) { - if (RecipeHelper.getRecipeEUtTier(recipe) > processingArray.getTier()) - return null; - - int parallelLimit = Math.min( - processingArray.machineStorage.storage.getStackInSlot(0).getCount(), - (int) (processingArray.getMaxVoltage() / RecipeHelper.getInputEUt(recipe))); - - if (parallelLimit <= 0) - return null; - - // apply parallel first - var parallel = Objects.requireNonNull(GTRecipeModifiers.accurateParallel( - machine, recipe, Math.min(parallelLimit, getMachineLimit(machine.getDefinition().getTier())), - false)); - int parallelCount = parallel.getSecond(); - recipe = parallel.getFirst(); - - // apply overclock afterward - long maxVoltage = Math.min(processingArray.getOverclockVoltage() * parallelCount, - processingArray.getMaxVoltage()); - recipe = RecipeHelper.applyOverclock(OverclockingLogic.NON_PERFECT_OVERCLOCK, recipe, maxVoltage, params, - result); - - return recipe; - } - return null; - } - - @Override - public Map, Integer> getOutputLimits() { - if (getMachineDefinition() != null) { - return getMachineDefinition().getRecipeOutputLimits(); - } - return GTRegistries.RECIPE_CAPABILITIES.values().stream().map(key -> Map.entry(key, 0)) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - } - - ////////////////////////////////////// - // ******** Gui ********// - ////////////////////////////////////// - - @Override - public void addDisplayText(List textList) { - textList.add(Component.translatable("gtceu.universal.tooltip.deprecated")); - super.addDisplayText(textList); - if (isActive()) { - textList.add(Component.translatable("gtceu.machine.machine_hatch.locked") - .withStyle(Style.EMPTY.withColor(ChatFormatting.RED))); - } - } - - @Override - public Widget createUIWidget() { - var widget = super.createUIWidget(); - if (widget instanceof WidgetGroup group) { - var size = group.getSize(); - group.addWidget(new SlotWidget(machineStorage.storage, 0, size.width - 30, size.height - 30, true, true) - .setBackground(GuiTextures.SLOT)); - } - return widget; - } - - ////////////////////////////////////// - // ******** Structure ********// - ////////////////////////////////////// - public static Block getCasingState(int tier) { - if (tier <= GTValues.IV) { - return GTBlocks.CASING_TUNGSTENSTEEL_ROBUST.get(); - } else { - return GTBlocks.CASING_HSSE_STURDY.get(); - } - } - - public static int getMachineLimit(Integer tier) { - return tier <= GTValues.IV ? 16 : 64; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java index e27b09b8ef..92f878d096 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/MachineLang.java @@ -584,10 +584,7 @@ protected static void init(RegistrateLangProvider provider) { "Biome Coefficient:\n Ocean, River: 1000 mB/s\n Swamp: 800 mB/s\n Jungle: 350 mB/s\n Snowy: 300 mB/s\n Plains, Forest: 250 mB/s\n Taiga: 175 mB/s\n Beach: 170 mB/s\n Other: 100 mB/s"); multilineLang(provider, "gtceu.multiblock.primitive_water_pump.extra2", "Hatch Multipliers:\n Pump Hatch: 1x\n ULV Output Hatch: 2x\n LV Output Hatch: 4x\n\nWhile raining in the Pump's Biome, the total water production will be increased by 50%%."); - provider.add("gtceu.multiblock.processing_array.description", - "The Processing Array combines up to 16 single block machine(s) in a single multiblock, effectively easing automation."); - provider.add("gtceu.multiblock.advanced_processing_array.description", - "The Processing Array combines up to 64 single block machine(s) in a single multiblock, effectively easing automation."); + // Parallel provider.add("gtceu.multiblock.parallelizable.tooltip", "Can parallelize with Parallel Control Hatches."); From 12d32a796e5a8033c7c3f6903bd08bcbc2825473 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Wed, 11 Sep 2024 09:48:56 +0300 Subject: [PATCH 015/141] move to legacy MDG because loom sucks (#1919) --- .github/actions/build_setup/action.yml | 1 + .github/workflows/auto-build.yml | 17 ++-- .github/workflows/auto-publish.yml | 15 +--- .github/workflows/build-on-push.yml | 4 +- .github/workflows/format-java.yml | 2 +- .github/workflows/update-gradle-cache.yml | 2 +- build.gradle | 32 ++----- dependencies.gradle | 41 +++------ gradle.properties | 1 + gradle/scripts/architectury_loom.gradle | 51 ----------- gradle/scripts/capabilities.gradle | 12 --- gradle/scripts/jars.gradle | 35 +++----- gradle/scripts/moddevgradle.gradle | 86 +++++++++++++++++++ gradle/scripts/publishing.gradle | 25 +++--- gradle/scripts/repositories.gradle | 3 +- gradle/scripts/resources.gradle | 55 +++++++----- gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle | 36 ++++---- .../recipe/components/ExtendedOutputItem.java | 3 +- src/main/resources/gtceu.mixins.json | 3 +- .../META-INF/mods.toml | 2 +- 21 files changed, 207 insertions(+), 221 deletions(-) delete mode 100644 gradle/scripts/architectury_loom.gradle delete mode 100644 gradle/scripts/capabilities.gradle create mode 100644 gradle/scripts/moddevgradle.gradle rename src/main/{resources => templates}/META-INF/mods.toml (95%) diff --git a/.github/actions/build_setup/action.yml b/.github/actions/build_setup/action.yml index 40e38cd7df..00d312ece4 100644 --- a/.github/actions/build_setup/action.yml +++ b/.github/actions/build_setup/action.yml @@ -31,6 +31,7 @@ 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/.github/workflows/auto-build.yml b/.github/workflows/auto-build.yml index 5851a1f90a..dae0ab2a6c 100644 --- a/.github/workflows/auto-build.yml +++ b/.github/workflows/auto-build.yml @@ -5,6 +5,10 @@ on: branches: - '1.20.1' +concurrency: + group: auto-build-${{ github.head_ref || github.ref }} + cancel-in-progress: true + jobs: build: runs-on: ubuntu-latest @@ -23,19 +27,15 @@ jobs: uses: ./.github/actions/build_setup - name: Build - uses: gradle/gradle-build-action@v2 - with: - arguments: build + run: ./gradlew build --build-cache - name: Publish to Maven - uses: gradle/gradle-build-action@v2 - with: - arguments: publish + run: ./gradlew publish --build-cache - name: Get Version id: var run: | - MESSAGE=$(ls build/libs/* | grep sources.jar -v | grep shadow.jar -v | grep slim.jar -v | awk -F 'gtceu-|-SNAPSHOT.jar' '{print $2}') + MESSAGE=$(ls build/libs/* | grep sources.jar -v | grep slim.jar -v | awk -F 'gtceu-|-SNAPSHOT.jar' '{print $2}') mv "build/libs/gtceu-$MESSAGE-SNAPSHOT.jar" "build/libs/gtceu-$MESSAGE-build_${{ github.run_number }}-SNAPSHOT.jar" mv "build/libs/gtceu-$MESSAGE-SNAPSHOT-slim.jar" "build/libs/gtceu-$MESSAGE-build_${{ github.run_number }}-SNAPSHOT-slim.jar" mv "build/libs/gtceu-$MESSAGE-SNAPSHOT-dev-shadow.jar" "build/libs/gtceu-$MESSAGE-build_${{ github.run_number }}-SNAPSHOT-dev-shadow.jar" @@ -45,11 +45,10 @@ jobs: id: release uses: Kir-Antipov/mc-publish@v3.3.0 with: - name: ${{ steps.var.outputs.version }} github-tag: ${{ steps.var.outputs.version }} github-token: ${{ secrets.GITHUB_TOKEN }} files: | - build/libs/!(*-@(dev|sources|javadoc)).jar + build/libs/!(*-@(dev|dev-all|dev-slim|javadoc)).jar - name: Print Output run: | diff --git a/.github/workflows/auto-publish.yml b/.github/workflows/auto-publish.yml index c2a9a5c259..69974800b8 100644 --- a/.github/workflows/auto-publish.yml +++ b/.github/workflows/auto-publish.yml @@ -36,24 +36,15 @@ jobs: with: submodules: true - - uses: actions/setup-java@v4 - with: - java-version: '17' - distribution: 'adopt' - - name: Setup Build uses: ./.github/actions/build_setup - name: Build - uses: gradle/gradle-build-action@v2 - with: - arguments: build + run: ./gradlew build --build-cache - if: ${{ inputs.publishMaven }} name: Publish to Maven - uses: gradle/gradle-build-action@v2 - with: - arguments: publish + run: ./gradlew publish --build-cache - if: ${{ inputs.publishCurseForgeAndModrinth }} name: Get Version @@ -80,7 +71,7 @@ jobs: curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }} files: | - build/libs/!(*-@(dev|sources|javadoc|dev-shadow|slim)).jar + build/libs/!(*-@(dev|dev-all|dev-slim|sources|javadoc|dev-shadow|slim)).jar build/libs/*-@(dev|sources|javadoc|dev-shadow|slim).jar name: GregTechCEu ${{ steps.var.outputs.version }} diff --git a/.github/workflows/build-on-push.yml b/.github/workflows/build-on-push.yml index ea64d24324..cde92e010b 100644 --- a/.github/workflows/build-on-push.yml +++ b/.github/workflows/build-on-push.yml @@ -32,9 +32,7 @@ jobs: - name: Build if: steps.filter.outputs.code == 'true' - uses: gradle/gradle-build-action@v2 - with: - arguments: assemble + run: ./gradlew assemble --build-cache - name: Upload Artifact if: steps.filter.outputs.code == 'true' diff --git a/.github/workflows/format-java.yml b/.github/workflows/format-java.yml index 5c5184ac15..80962a65c6 100644 --- a/.github/workflows/format-java.yml +++ b/.github/workflows/format-java.yml @@ -4,7 +4,7 @@ name: Java Formatting on: push: branches: - - 1.20.1 + - '1.20.1' paths: ['src/main/java/**', 'src/test/**'] pull_request: paths: ['**'] diff --git a/.github/workflows/update-gradle-cache.yml b/.github/workflows/update-gradle-cache.yml index 45fdf46591..2c34a06f48 100644 --- a/.github/workflows/update-gradle-cache.yml +++ b/.github/workflows/update-gradle-cache.yml @@ -4,7 +4,7 @@ name: Update Gradle Cache on: push: branches: - - 1.20.1 + - '1.20.1' paths: ['gradle/**', '**.gradle', 'gradle.properties', 'gradlew**', 'src/main/resources/accesstransformer.cfg'] workflow_dispatch: diff --git a/build.gradle b/build.gradle index d80edf8de1..7af61c8314 100644 --- a/build.gradle +++ b/build.gradle @@ -1,39 +1,22 @@ -import net.fabricmc.loom.task.RemapJarTask; - plugins { - alias libs.plugins.architectury - alias libs.plugins.architectury.loom - alias libs.plugins.vineFlower // VineFlower, a better decompiler + id 'java-library' + id 'eclipse' + id 'idea' + id 'maven-publish' + alias libs.plugins.modDevGradle alias libs.plugins.machete // automatic jar compressing on build alias libs.plugins.shadow alias libs.plugins.spotless alias libs.plugins.lombok } -apply plugin: "dev.architectury.loom" -apply plugin: "io.github.juuxel.loom-vineflower" -apply plugin: "java" -apply plugin: "architectury-plugin" -apply plugin: "maven-publish" - - -architectury { - minecraft = libs.versions.minecraft -} - -tasks.register('remapSlimJar', RemapJarTask) { - dependsOn(jar) - inputFile.set jar.archiveFile -} - group = maven_group // Formats the mod version to include the loader, Minecraft version, build number (if present), and '-SNAPSHOT-' if enabled. boolean isSnapshot = System.getenv("SNAPSHOT") version = "${mod_version}" + (isSnapshot ? "-SNAPSHOT" : "") -apply from: "$rootDir/gradle/scripts/architectury_loom.gradle" -apply from: "$rootDir/gradle/scripts/capabilities.gradle" +apply from: "$rootDir/gradle/scripts/moddevgradle.gradle" apply from: "$rootDir/gradle/scripts/repositories.gradle" apply from: "$rootDir/dependencies.gradle" apply from: "$rootDir/gradle/scripts/resources.gradle" @@ -41,6 +24,9 @@ apply from: "$rootDir/gradle/scripts/jars.gradle" apply from: "$rootDir/gradle/scripts/publishing.gradle" apply from: "$rootDir/gradle/scripts/spotless.gradle" +// Include resources generated by data generators. +sourceSets.main.resources { srcDir 'src/generated/resources' } + tasks.withType(JavaCompile) { options.encoding = "UTF-8" } diff --git a/dependencies.gradle b/dependencies.gradle index 56d845cd17..e1427063a8 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -1,32 +1,15 @@ dependencies { - minecraft "com.mojang:minecraft:${libs.versions.minecraft.get()}" - mappings loom.layered { - it.mappings("org.quiltmc:quilt-mappings:${libs.versions.minecraft.get()}+build.${libs.versions.quiltMappings.get()}:intermediary-v2") - it.parchment("org.parchmentmc.data:parchment-${libs.versions.minecraft.get()}:${libs.versions.parchment.get()}@zip") - it.officialMojangMappings { nameSyntheticMembers = false } - } - - forge forge.minecraftForge - - implementation 'com.google.code.findbugs:jsr305:3.0.2' - - // tests - testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.9.2' - testImplementation 'io.javalin:javalin:5.4.2' - testImplementation 'org.mockito:mockito-core:5.2.0' - - - // From Forge + compileOnly 'org.jetbrains:annotations:24.1.0' // LDLib modApi(forge.ldlib.forge) { transitive = false } - include(forge.ldlib.forge) + jarJar(forge.ldlib.forge) // Registrate - modApi(include("com.tterrag.registrate:Registrate:${forge.versions.registrate.get()}")) + modImplementation(jarJar("com.tterrag.registrate:Registrate:${forge.versions.registrate.get()}")) // Create and its dependencies - modImplementation("com.simibubi.create:create-${libs.versions.minecraft.get()}:${forge.versions.createForge.get()}:all") { transitive = false } + modImplementation("com.simibubi.create:create-${libs.versions.minecraft.get()}:${forge.versions.createForge.get()}:slim") { transitive = false } modImplementation forge.flywheel // JEI @@ -40,8 +23,7 @@ dependencies { modCompileOnly forge.rei.forge // EMI - modCompileOnly("dev.emi:emi-forge:${forge.versions.emi.get()}:api") - + //modCompileOnly("dev.emi:emi-forge:${forge.versions.emi.get()}:api") modImplementation forge.emi // TOP @@ -61,15 +43,18 @@ dependencies { modCompileOnly(forge.almostUnified.forge) // KJS - modImplementation forge.kubejs + modImplementation(forge.kubejs) { transitive = false } + modImplementation(forge.architectury) + modImplementation(forge.rhino) - // Mixin Extras - implementation(annotationProcessor("io.github.llamalad7:mixinextras-common:${this.forge.versions.mixinextras.get()}")) - api(include("io.github.llamalad7:mixinextras-forge:${this.forge.versions.mixinextras.get()}")) + // Mixin (& Extras) + api(annotationProcessor("io.github.llamalad7:mixinextras-common:${this.forge.versions.mixinextras.get()}")) + jarJar("io.github.llamalad7:mixinextras-forge:${this.forge.versions.mixinextras.get()}") + annotationProcessor 'org.spongepowered:mixin:0.8.7:processor' // Configuration modApi(forge.configuration) - include(forge.configuration) + jarJar(forge.configuration) // Shimmer modCompileOnly(forge.shimmer.forge) { transitive = false } diff --git a/gradle.properties b/gradle.properties index 3a7aada436..91d2a3403c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,6 +7,7 @@ mod_version = 1.4.0 mod_description = GregTech CE Unofficial, ported from 1.12.2 mod_license = LGPL-3.0 license mod_url = https://github.com/GregTechCEu/GregTech-Modern/ +mod_issue_tracker = https://github.com/GregTechCEu/GregTech-Modern/issues/ maven_group = com.gregtechceu.gtceu diff --git a/gradle/scripts/architectury_loom.gradle b/gradle/scripts/architectury_loom.gradle deleted file mode 100644 index 2e319a22c1..0000000000 --- a/gradle/scripts/architectury_loom.gradle +++ /dev/null @@ -1,51 +0,0 @@ -architectury { - platformSetupLoomIde() - forge() -} - -static def isJetBrainsRuntime() { - return System.getProperty('java.vm.vendor').contains('JetBrains') -} - -loom { - silentMojangMappingsLicense() - - forge { - mixinConfig( - "${mod_id}.mixins.json", - ) - - dataGen{ - mod(mod_id) - } - } - - runConfigs.named("data").configure { - programArg("--existing=" + file("src/main/resources").absolutePath) - } - - if (isJetBrainsRuntime()) { - runs { - client { - vmArgs '-XX:+AllowEnhancedClassRedefinition' - vmArgs '-XX:HotswapAgent=fatjar' - } - } - } - runs { - create("gameTestServer") { - server() - name("Minecraft Game Test") - source("main") - - property("forge.enabledGameTestNamespaces", mod_id) - property("forge.gameTestServer", "true") - - mods { - create(mod_id) { - sourceSet("main") - } - } - } - } -} \ No newline at end of file diff --git a/gradle/scripts/capabilities.gradle b/gradle/scripts/capabilities.gradle deleted file mode 100644 index b03d7206a5..0000000000 --- a/gradle/scripts/capabilities.gradle +++ /dev/null @@ -1,12 +0,0 @@ -configurations { - /* TODO fix? - modImplementation { - outgoing { - capability("com.lowdragmc.ldlib:ldlib-forge-${this.libs.versions.minecraft.get()}:${this.forge.versions.ldlib.get()}") - capability("com.tterrag.registrate:Registrate:${this.forge.versions.registrate.get()}") - capability("dev.toma.configuration:configuration-forge-${this.libs.versions.minecraft.get()}:${this.forge.versions.configuration.get()}") - capability("io.github.llamalad7:mixinextras-forge:${this.forge.versions.mixinextras.get()}") - } - } - */ -} \ No newline at end of file diff --git a/gradle/scripts/jars.gradle b/gradle/scripts/jars.gradle index 7bf1c1792c..1a96079d51 100644 --- a/gradle/scripts/jars.gradle +++ b/gradle/scripts/jars.gradle @@ -1,26 +1,12 @@ -apply plugin: "dev.architectury.loom" - -shadowJar { - exclude "fabric.mod.json" - exclude "architectury.common.json" - - configurations = [project.configurations.shadow] - archiveClassifier = "dev-shadow" +tasks.register('slimJar', Jar) { + archiveClassifier = "dev-slim" + from sourceSets.main.output } -remapJar { - inputFile.set shadowJar.archiveFile - dependsOn shadowJar - archiveClassifier = null -} - -jar { - archiveClassifier = "dev" -} - -remapSlimJar { - addNestedDependencies = false - archiveClassifier = "slim" +obfuscation { + reobfuscate(tasks.named('slimJar'), sourceSets.main) { + archiveClassifier = "slim" + } } tasks.register('sourcesJar', Jar) { @@ -29,7 +15,6 @@ tasks.register('sourcesJar', Jar) { archiveClassifier = "sources" } -tasks.remapJar.dependsOn('remapSlimJar') - - -archivesBaseName = "${project.name}-${libs.versions.minecraft.get()}" \ No newline at end of file +base { + archivesName = "${project.name}-${libs.versions.minecraft.get()}" +} diff --git a/gradle/scripts/moddevgradle.gradle b/gradle/scripts/moddevgradle.gradle new file mode 100644 index 0000000000..d5c5545250 --- /dev/null +++ b/gradle/scripts/moddevgradle.gradle @@ -0,0 +1,86 @@ + +mixin { + add sourceSets.main, "gtceu.refmap.json" + config 'gtceu.mixins.json' +} + +neoForge { + // Specify the version of NeoForge to use. + version = forge.versions.minecraftForge.get() + + parchment { + minecraftVersion = libs.versions.minecraft.get() + mappingsVersion = libs.versions.parchment.get() + } + + // This line is optional. Access Transformers are automatically detected + accessTransformers = project.files('src/main/resources/META-INF/accesstransformer.cfg') + + // Default run configurations. + // These can be tweaked, removed, or duplicated as needed. + runs { + client { + client() + + // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. + systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id + } + + server { + server() + programArgument '--nogui' + systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id + } + + // This run config launches GameTestServer and runs all registered gametests, then exits. + // By default, the server will crash when no gametests are provided. + // The gametest system is also enabled by default for other run configs under the /test command. + gameTestServer { + type = "gameTestServer" + systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id + } + + data { + data() + + // example of overriding the workingDirectory set in configureEach above, uncomment if you want to use it + // gameDirectory = project.file('run-data') + + // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. + programArguments.addAll '--mod', project.mod_id, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath() + } + + // applies to all the run configs above + configureEach { + // Recommended logging data for a userdev environment + // The markers can be added/remove as needed separated by commas. + // "SCAN": For mods scan. + // "REGISTRIES": For firing of registry events. + // "REGISTRYDUMP": For getting the contents of all registries. + systemProperty 'forge.logging.markers', 'REGISTRIES' + + // Recommended logging level for the console + // You can set various levels here. + // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels + logLevel = org.slf4j.event.Level.INFO + } + } + + mods { + // define mod <-> source bindings + // these are used to tell the game which sources are for which mod + // mostly optional in a single mod project + // but multi mod projects should define one per mod + "${mod_id}" { + sourceSet(sourceSets.main) + } + } +} + +// IDEA no longer automatically downloads sources/javadoc jars for dependencies, so we need to explicitly enable the behavior. +idea { + module { + downloadSources = true + downloadJavadoc = true + } +} diff --git a/gradle/scripts/publishing.gradle b/gradle/scripts/publishing.gradle index 9ebbc13b03..c14a393b79 100644 --- a/gradle/scripts/publishing.gradle +++ b/gradle/scripts/publishing.gradle @@ -1,18 +1,17 @@ +artifacts { + archives tasks.reobfJar + archives tasks.reobfSlimJar + archives tasks.sourcesJar +} + publishing { publications { - mavenForge(MavenPublication) { - artifact(remapJar) { - artifactId = archivesBaseName - builtBy remapJar - } - artifact(remapSourcesJar) { - artifactId = archivesBaseName - builtBy remapSourcesJar - } - artifact(remapSlimJar) { - artifactId = archivesBaseName - builtBy remapSlimJar - } + mavenJava(MavenPublication) { + groupId = project.maven_group + artifactId = project.archivesBaseName + version = project.mod_version + + from components.java } } diff --git a/gradle/scripts/repositories.gradle b/gradle/scripts/repositories.gradle index f893dabab4..63396337d9 100644 --- a/gradle/scripts/repositories.gradle +++ b/gradle/scripts/repositories.gradle @@ -42,6 +42,7 @@ repositories { includeGroup "dev.latvian.mods" } } + maven { url "https://maven.architectury.dev/" } maven { url = "https://maven.jamieswhiteshirt.com/libs-release" } // Reach Entity Attributes maven { url 'https://jitpack.io' } // Mixin Extras, Fabric ASM -} \ No newline at end of file +} diff --git a/gradle/scripts/resources.gradle b/gradle/scripts/resources.gradle index 06440b50dc..a2e47c2257 100644 --- a/gradle/scripts/resources.gradle +++ b/gradle/scripts/resources.gradle @@ -8,29 +8,38 @@ def mod_license = getConfig("mod_license") def mod_name = getConfig("mod_name") def mod_description = getConfig("mod_description") def mod_url = getConfig("mod_url") +def mod_issue_tracker = getConfig("mod_issue_tracker") -processResources { - // set up properties for filling into metadata - var properties = [ - "version": version, - "mod_id": mod_id, - "minecraft_version": libs.versions.minecraft.get(), - "forge_version": forge.versions.forgeShortVersion.get().split("\\.")[0], // only specify major version of forge - "configuration_version": forge.versions.configuration.get(), - "kjs_version": forge.versions.kubejs.get().split("\\.")[0], // only specify major version of kjs - "ldlib_version": forge.versions.ldlib.get(), - "jei_version": forge.versions.jei.get(), - "emi_version": forge.versions.emi.get(), - "top_version": forge.versions.theoneprobe.get(), - "jade_version": forge.versions.jade.get(), - "mod_license": mod_license, - "mod_name": mod_name, - "mod_description": mod_description, - "mod_url": mod_url +// This block of code expands all declared replace properties in the specified resource targets. +// A missing property will result in an error. Properties are expanded using ${} Groovy notation. +var generateModMetadata = tasks.register("generateModMetadata", ProcessResources) { + var forgeVers = forge.versions.forgeShortVersion.get().split("\\.")[0] + var replaceProperties = [ + version : version, + mod_id : mod_id, + minecraft_version : libs.versions.minecraft.get(), + loader_version : forgeVers, + forge_version : forgeVers, // only specify major version of forge + configuration_version: forge.versions.configuration.get(), + kjs_version : forge.versions.kubejs.get().split("\\.")[0], // only specify major version of kjs + ldlib_version : forge.versions.ldlib.get(), + jei_version : forge.versions.jei.get(), + emi_version : forge.versions.emi.get(), + top_version : forge.versions.theoneprobe.get(), + jade_version : forge.versions.jade.get(), + mod_license : mod_license, + mod_name : mod_name, + mod_description : mod_description, + mod_url : mod_url, + mod_issue_tracker : mod_issue_tracker ] - inputs.properties(properties) - - filesMatching("META-INF/mods.toml") { - expand properties - } + inputs.properties replaceProperties + expand replaceProperties + from "src/main/templates" + into "build/generated/sources/modMetadata" } +// Include the output of "generateModMetadata" as an input directory for the build +// this works with both building through Gradle and the IDE. +sourceSets.main.resources.srcDir generateModMetadata +// To avoid having to run "generateModMetadata" manually, make it run on every project reload +neoForge.ideSyncTask generateModMetadata diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 48c0a02ca4..0d1842103b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle b/settings.gradle index abc49a273e..bb51069f6e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,9 +1,16 @@ pluginManagement { repositories { - maven { url = "https://maven.fabricmc.net/" } - maven { url = "https://maven.architectury.dev/" } maven { url = "https://maven.minecraftforge.net/" } - maven { url = "https://maven.quiltmc.org/repository/release" } + maven { + name 'Maven for PR #118' // https://github.com/neoforged/ModDevGradle/pull/118 + url 'https://prmaven.neoforged.net/ModDevGradle/pr118' + content { + includeModule('net.neoforged.moddev.legacy', 'net.neoforged.moddev.legacy.gradle.plugin') + includeModule('net.neoforged.moddev', 'net.neoforged.moddev.gradle.plugin') + includeModule('net.neoforged.moddev.repositories', 'net.neoforged.moddev.repositories.gradle.plugin') + includeModule('net.neoforged', 'moddev-gradle') + } + } gradlePluginPortal() } } @@ -20,9 +27,11 @@ dependencyResolutionManagement { // Common def jeiVersion = "15.12.1.46" def reiVersion = "12.1.725" - def emiVersion = "1.1.12" + def emiVersion = "1.1.13" def ae2Version = "15.0.18" def kjsVersion = "2001.6.4-build.120" + def architecturyVersion = "9.2.14" + def rhinoVersion = "2001.2.3-build.6" def auVersion = "1.20.1-0.6.0" // Forge @@ -41,8 +50,7 @@ dependencyResolutionManagement { def parchmentVersion = "2023.09.03" // https://parchmentmc.org/docs/getting-started def shadowVersion = "7.1.2" def spotlessVersion = "6.25.0" - def architecturyPluginVersion = "3.4-SNAPSHOT" - def architecturyLoomVersion = "1.3-SNAPSHOT" + def modDevGradleVersion = "2.0.61-beta-pr-118-legacy" def vineFlowerVersion = "1.+" def macheteVersion = "1.+" def configurationVersion = "2.2.0" @@ -53,7 +61,7 @@ dependencyResolutionManagement { forge { version("forgeShortVersion", forgeVersion) - def minecraftForge = version("minecratfForge", "${minecraftVersion}-${forgeVersion}") + def minecraftForge = version("minecraftForge", "${minecraftVersion}-${forgeVersion}") library("minecraftForge", "net.minecraftforge", "forge").versionRef(minecraftForge) def ldLib = version("ldlib", ldLibVersion) @@ -95,6 +103,10 @@ dependencyResolutionManagement { def kubejs = version("kubejs", kjsVersion) library("kubejs", "dev.latvian.mods", "kubejs-forge").versionRef(kubejs) + def architectury = version("architectury", architecturyVersion) + library("architectury", "dev.architectury", "architectury-forge").versionRef(architectury) + def rhino = version("rhino", rhinoVersion) + library("rhino", "dev.latvian.mods", "rhino-forge").versionRef(rhino) def mixinextras = version("mixinextras", mixinextrasVersion) library("mixinextras-forge", "io.github.llamalad7", "mixinextras-forge").versionRef(mixinextras) @@ -128,14 +140,8 @@ dependencyResolutionManagement { def spotless = version("spotless", spotlessVersion) plugin("spotless", "com.diffplug.spotless").versionRef(spotless) - def architecturyPlugin = version("architectury", architecturyPluginVersion) - plugin("architectury", "architectury-plugin").versionRef(architecturyPlugin) - - def architecturyLoom = version("architectury-loom", architecturyLoomVersion) - plugin("architectury-loom", "dev.architectury.loom").versionRef(architecturyLoom) - - def vineFlower = version("vineFlower", vineFlowerVersion) - plugin("vineFlower", "io.github.juuxel.loom-vineflower").versionRef(vineFlower) + def modDevGradle = version("modDevGradleLegacy", modDevGradleVersion) + plugin("modDevGradle", "net.neoforged.moddev.legacy").versionRef(modDevGradle) def machete = version("machete", macheteVersion) plugin("machete", "io.github.p03w.machete").versionRef(machete) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/components/ExtendedOutputItem.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/components/ExtendedOutputItem.java index e13da0b3ca..749684ebf7 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/components/ExtendedOutputItem.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/components/ExtendedOutputItem.java @@ -10,6 +10,7 @@ import net.minecraftforge.common.crafting.StrictNBTIngredient; import com.google.gson.JsonElement; +import dev.latvian.mods.kubejs.core.IngredientKJS; import dev.latvian.mods.kubejs.item.InputItem; import dev.latvian.mods.kubejs.item.OutputItem; import dev.latvian.mods.kubejs.recipe.OutputReplacement; @@ -25,7 +26,7 @@ public class ExtendedOutputItem extends OutputItem implements OutputReplacement public SizedIngredient ingredient; public ExtendedOutputItem(Ingredient ingredient, int count) { - super(ingredient.kjs$getFirst().kjs$withCount(count), Double.NaN, null); + super(((IngredientKJS) ingredient).kjs$getFirst().copyWithCount(count), Double.NaN, null); // reset the ingredient if it's an int provider. if (ingredient instanceof IntProviderIngredient intProvider) { intProvider.setItemStacks(null); diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 7e2c49ed88..ec71dfef3b 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -1,6 +1,7 @@ { "required": true, "minVersion": "0.8", + "refmap": "gtceu.refmap.json", "package": "com.gregtechceu.gtceu.core.mixins", "compatibilityLevel": "JAVA_17", "plugin": "com.gregtechceu.gtceu.core.mixins.GregTechMixinPlugin", @@ -66,5 +67,5 @@ "injectors": { "defaultRequire": 1, "maxShiftBy": 5 - } + } } diff --git a/src/main/resources/META-INF/mods.toml b/src/main/templates/META-INF/mods.toml similarity index 95% rename from src/main/resources/META-INF/mods.toml rename to src/main/templates/META-INF/mods.toml index 6bcd330df8..60058b0e04 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/templates/META-INF/mods.toml @@ -1,6 +1,6 @@ modLoader = "javafml" loaderVersion = "[${forge_version},)" -issueTrackerURL = "https://github.com/GregTechCEu/GregTech-Modern/issues" +issueTrackerURL = "${mod_issue_tracker}" license = "${mod_license}" [[mods]] From da5a26d2363d8b94b6272b0e21c253724784eb09 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Wed, 11 Sep 2024 00:58:17 -0600 Subject: [PATCH 016/141] Update TOML list (#1928) Co-authored-by: YoungOnionMC --- src/main/templates/META-INF/mods.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/templates/META-INF/mods.toml b/src/main/templates/META-INF/mods.toml index 60058b0e04..b6a9c1df9d 100644 --- a/src/main/templates/META-INF/mods.toml +++ b/src/main/templates/META-INF/mods.toml @@ -7,7 +7,7 @@ license = "${mod_license}" modId = "${mod_id}" version = "${version}" displayName = "${mod_name}" -authors = "KilaBash, screret, serenibyss, Tech22" +authors = "KilaBash, screret, serenibyss, Tech22, YoungOnion, Mikerooni, Ghostipedia" description = "${mod_description}" logoFile = "icon.png" displayURL = "${mod_url}" From e56a05377a85ef429a071ffd9d259cb891f46410 Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Wed, 11 Sep 2024 03:13:12 -0400 Subject: [PATCH 017/141] Fixed item pipe cover grid (#1929) --- .../gtceu/api/pipenet/PipeCoverContainer.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeCoverContainer.java b/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeCoverContainer.java index 05574408da..95ceb763f7 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeCoverContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pipenet/PipeCoverContainer.java @@ -6,8 +6,6 @@ import com.gregtechceu.gtceu.api.cover.CoverDefinition; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.registry.GTRegistries; -import com.gregtechceu.gtceu.api.transfer.fluid.NoOpFluidTransfer; -import com.gregtechceu.gtceu.api.transfer.item.NoOpItemTransfer; import com.gregtechceu.gtceu.common.blockentity.FluidPipeBlockEntity; import com.gregtechceu.gtceu.common.blockentity.ItemPipeBlockEntity; import com.gregtechceu.gtceu.utils.GTUtil; @@ -26,6 +24,7 @@ import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.Level; import lombok.Getter; @@ -118,7 +117,7 @@ public boolean isInValid() { @Override public boolean canPlaceCoverOnSide(CoverDefinition definition, Direction side) { - return true; + return getCoverAtSide(side) == null; } @Override @@ -157,9 +156,10 @@ public void unsubscribe(@Nullable TickableSubscription current) { @Override public IItemTransfer getItemTransferCap(@Nullable Direction side, boolean useCoverCapability) { if (pipeTile instanceof ItemPipeBlockEntity itemPipe) { - return itemPipe.getHandler(side, useCoverCapability); + return getLevel() instanceof ServerLevel ? itemPipe.getHandler(side, useCoverCapability) : + IItemTransfer.EMPTY; } else { - return NoOpItemTransfer.INSTANCE; + return null; } } @@ -168,7 +168,7 @@ public IFluidTransfer getFluidTransferCap(@Nullable Direction side, boolean useC if (pipeTile instanceof FluidPipeBlockEntity fluidPipe) { return fluidPipe.getTankList(side); } else { - return NoOpFluidTransfer.INSTANCE; + return null; } } From 823a9b78e512d3743ef07a3e02a094af9f9350c8 Mon Sep 17 00:00:00 2001 From: Ghostipedia <46772882+Ghostipedia@users.noreply.github.com> Date: Wed, 11 Sep 2024 03:29:50 -0400 Subject: [PATCH 018/141] 1.4.1 (#1930) Co-authored-by: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> --- CHANGELOG.md | 54 ++++++++++++++++++++++------------------------- gradle.properties | 2 +- 2 files changed, 26 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 70421b5793..e7da322a4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,39 +1,35 @@ # ChangeLog -Version: 1.4.0 +Version: 1.4.1 ### ADDITIONS: - - Added Dual Hatches for LuV+ - - Added Reservoir Hatch - - Added Charcoal Pile Igniter and Lighters - - Added a Variety of Decor Blocks - - Added Creative Computation Provider - - Added a variety of Jade tooltip support - - Added forge:siftables for all siftable materials - - Added a Variety of new recipes for minecraft related items - - Added the ME Pattern Buffer and Me Pattern Buffer Proxy - - Added Electric Wire Cutters - - Added More RecipeSchema's For KubeJS - - Added the capability to tape crates - - Added the ability to clear data from items by crafting + +- Added Textures for Computer Casings styled around the new texture standard +- Fluid Tags for Molten Fluids & Plasmas +- Datasticks will now render the primary item within contained data when holding SHIFT ### CHANGES: - - Modified how fluids are registered in KubeJS & Java - **ADDON & PACKDEVS WILL NEED TO UPDATE MODS/SCRIPTS** - - Modified a variety of colors for GTMaterials - - Batteries now display charge in tooltip - - Better Fluid Tooltips - - Switched from Zedtech to Gregtech:Refreshed for base textures, this is still a WIP. +- Parallel Hatches can no longer be shared. +- SI Formatting for large fluid amounts +- Updated all hatches and busses recipes to match GTCEU : 1.12.2 +- Hazard gear works in curios slots +- Changed the location of the dimension icon for dimension based recipes +- KubeJS Support for research methods +- Research recipes now display CWU total in JADE and use the proper EU values. +- PACK DEVS ! - Can now define render toggles for multiblocks +- ADDON DEVS ! - OCLogic has been modified, please verify your addons reflect these new changes. ### FIXES: -- AE2 Busses and Hatches now properly work -- Fix Fusion Ring Rendering -- Fix miners destroying batteries -- Fix lighters destroying blocks -- Fix GTArmors from destroying selected items in creative -- Fix Quarktech Armor lang -- Fix CTM not working with computer casings -- Fixed Multi Rotation Render & Multi Rotation -- Fixed Infinite Item Duping with the assemblyline + +- Fixed Rubber Leaves and Saplings not being able to compost. +- Fix fluid output slots accepting manual inputs +- Large variety of recipe logic and OC logic fixes +- Fixed AEParts in assembly lines having wrong recipe voltages +- Fixes Crashes due to null recipes caused by HighTier being disabled +- Fixed PartialNBT usage in recipes +- Various KubeJS recipe fixes +- ME Export Bus is now considered an "EXPORT_ITEMS" part ability +- Fix bedrock ore miner not overclocking +- Assembly line Structure no longer allows MEBufferParts diff --git a/gradle.properties b/gradle.properties index 91d2a3403c..2c8c62de06 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs = -Xmx6G # Mod Info mod_id = gtceu mod_name = GregTech -mod_version = 1.4.0 +mod_version = 1.4.1 mod_description = GregTech CE Unofficial, ported from 1.12.2 mod_license = LGPL-3.0 license mod_url = https://github.com/GregTechCEu/GregTech-Modern/ From 54153aff4ab1a3b84f0d0d3f44f76f3cea94b4a3 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Wed, 11 Sep 2024 01:51:28 -0600 Subject: [PATCH 019/141] remove shadow (#1932) Co-authored-by: YoungOnionMC --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 7af61c8314..821a8e90b0 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { id 'maven-publish' alias libs.plugins.modDevGradle alias libs.plugins.machete // automatic jar compressing on build - alias libs.plugins.shadow + //alias libs.plugins.shadow alias libs.plugins.spotless alias libs.plugins.lombok } From 6048e7d7bfa90335fcabda76785dedcb2adf5875 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Wed, 11 Sep 2024 11:40:02 +0300 Subject: [PATCH 020/141] fix release action (#1933) --- .github/workflows/auto-publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/auto-publish.yml b/.github/workflows/auto-publish.yml index 69974800b8..dee32fe55e 100644 --- a/.github/workflows/auto-publish.yml +++ b/.github/workflows/auto-publish.yml @@ -50,7 +50,7 @@ jobs: name: Get Version id: var run: | - MESSAGE=$(ls build/libs/* | grep sources.jar -v | grep shadow.jar -v | grep slim.jar -v | awk -F 'gtceu-|.jar' '{print $2}') + MESSAGE=$(ls build/libs/* | grep dev.jar -v | grep sources.jar -v | grep shadow.jar -v | grep slim.jar -v | awk -F 'gtceu-|.jar' '{print $2}') echo version=$MESSAGE >> $GITHUB_OUTPUT - if: ${{ inputs.publishCurseForgeAndModrinth }} From e06b5216aa4fea539bc72018b421d64e5e65a9ab Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Wed, 11 Sep 2024 05:40:56 -0400 Subject: [PATCH 021/141] Bruh (#1934) --- build.gradle | 2 ++ gradle.properties | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 821a8e90b0..fe33d4561d 100644 --- a/build.gradle +++ b/build.gradle @@ -12,6 +12,8 @@ plugins { group = maven_group +java.toolchain.languageVersion = JavaLanguageVersion.of(17) + // Formats the mod version to include the loader, Minecraft version, build number (if present), and '-SNAPSHOT-' if enabled. boolean isSnapshot = System.getenv("SNAPSHOT") version = "${mod_version}" + (isSnapshot ? "-SNAPSHOT" : "") diff --git a/gradle.properties b/gradle.properties index 2c8c62de06..da9f8fc242 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs = -Xmx6G # Mod Info mod_id = gtceu mod_name = GregTech -mod_version = 1.4.1 +mod_version = 1.4.1+patch.1 mod_description = GregTech CE Unofficial, ported from 1.12.2 mod_license = LGPL-3.0 license mod_url = https://github.com/GregTechCEu/GregTech-Modern/ From d9759198c8c671e1691111347cb241bd1b97586e Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Wed, 11 Sep 2024 05:53:25 -0400 Subject: [PATCH 022/141] Grep (#1935) --- .github/workflows/auto-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/auto-build.yml b/.github/workflows/auto-build.yml index dae0ab2a6c..42f4417cab 100644 --- a/.github/workflows/auto-build.yml +++ b/.github/workflows/auto-build.yml @@ -35,7 +35,7 @@ jobs: - name: Get Version id: var run: | - MESSAGE=$(ls build/libs/* | grep sources.jar -v | grep slim.jar -v | awk -F 'gtceu-|-SNAPSHOT.jar' '{print $2}') + MESSAGE=$(ls build/libs/* | grep dev.jar -v | grep sources.jar -v | grep slim.jar -v | awk -F 'gtceu-|-SNAPSHOT.jar' '{print $2}') mv "build/libs/gtceu-$MESSAGE-SNAPSHOT.jar" "build/libs/gtceu-$MESSAGE-build_${{ github.run_number }}-SNAPSHOT.jar" mv "build/libs/gtceu-$MESSAGE-SNAPSHOT-slim.jar" "build/libs/gtceu-$MESSAGE-build_${{ github.run_number }}-SNAPSHOT-slim.jar" mv "build/libs/gtceu-$MESSAGE-SNAPSHOT-dev-shadow.jar" "build/libs/gtceu-$MESSAGE-build_${{ github.run_number }}-SNAPSHOT-dev-shadow.jar" From 67c0cb8f4dbd1a3eb2e6977bef3f0d60b6661fd5 Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Wed, 11 Sep 2024 06:01:21 -0400 Subject: [PATCH 023/141] Grep 2: Electric Boogaloo (#1936) --- .github/workflows/auto-build.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/auto-build.yml b/.github/workflows/auto-build.yml index 42f4417cab..afbfb56082 100644 --- a/.github/workflows/auto-build.yml +++ b/.github/workflows/auto-build.yml @@ -38,7 +38,6 @@ jobs: MESSAGE=$(ls build/libs/* | grep dev.jar -v | grep sources.jar -v | grep slim.jar -v | awk -F 'gtceu-|-SNAPSHOT.jar' '{print $2}') mv "build/libs/gtceu-$MESSAGE-SNAPSHOT.jar" "build/libs/gtceu-$MESSAGE-build_${{ github.run_number }}-SNAPSHOT.jar" mv "build/libs/gtceu-$MESSAGE-SNAPSHOT-slim.jar" "build/libs/gtceu-$MESSAGE-build_${{ github.run_number }}-SNAPSHOT-slim.jar" - mv "build/libs/gtceu-$MESSAGE-SNAPSHOT-dev-shadow.jar" "build/libs/gtceu-$MESSAGE-build_${{ github.run_number }}-SNAPSHOT-dev-shadow.jar" echo "version=$MESSAGE-build_${{ github.run_number }}" >> $GITHUB_OUTPUT - name: Release From b07b0a789f1cc8f7b49a02dcfe029adc65d85a7f Mon Sep 17 00:00:00 2001 From: Karthi Suresh <75553966+JuiceyBeans@users.noreply.github.com> Date: Wed, 11 Sep 2024 14:15:47 +0400 Subject: [PATCH 024/141] change mod version to 1.4.2 for snapshot builds (#1938) --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index da9f8fc242..722d880041 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs = -Xmx6G # Mod Info mod_id = gtceu mod_name = GregTech -mod_version = 1.4.1+patch.1 +mod_version = 1.4.2 mod_description = GregTech CE Unofficial, ported from 1.12.2 mod_license = LGPL-3.0 license mod_url = https://github.com/GregTechCEu/GregTech-Modern/ From da947d9c496c1da165d4381c331ed794bde3ed6e Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Wed, 11 Sep 2024 15:52:44 +0300 Subject: [PATCH 025/141] add mixin config to manifest so prod works (#1941) --- gradle.properties | 2 +- gradle/scripts/jars.gradle | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 722d880041..255fcaeece 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs = -Xmx6G # Mod Info mod_id = gtceu mod_name = GregTech -mod_version = 1.4.2 +mod_version = 1.4.1+patch.2 mod_description = GregTech CE Unofficial, ported from 1.12.2 mod_license = LGPL-3.0 license mod_url = https://github.com/GregTechCEu/GregTech-Modern/ diff --git a/gradle/scripts/jars.gradle b/gradle/scripts/jars.gradle index 1a96079d51..8b6678ee2e 100644 --- a/gradle/scripts/jars.gradle +++ b/gradle/scripts/jars.gradle @@ -18,3 +18,17 @@ tasks.register('sourcesJar', Jar) { base { archivesName = "${project.name}-${libs.versions.minecraft.get()}" } + +afterEvaluate { + tasks.withType(org.gradle.jvm.tasks.Jar).configureEach { + manifest.attributes([ + 'MixinConfigs': 'gtceu.mixins.json', + 'Specification-Title': project.name, + 'Specification-Version': mod_version, + 'Specification-Vendor': 'GregTechCEu Team', + 'Implementation-Title': base.archivesName, + 'Implementation-Version': version, + 'Implementation-Vendor': 'GregTechCEu Team', + ]) + } +} From 193f8d273ca75efac5d635630930600f3a781e49 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Wed, 11 Sep 2024 19:51:13 +0300 Subject: [PATCH 026/141] change version mod version to 1.4.2... again. (#1943) --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 255fcaeece..722d880041 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs = -Xmx6G # Mod Info mod_id = gtceu mod_name = GregTech -mod_version = 1.4.1+patch.2 +mod_version = 1.4.2 mod_description = GregTech CE Unofficial, ported from 1.12.2 mod_license = LGPL-3.0 license mod_url = https://github.com/GregTechCEu/GregTech-Modern/ From ec4b765f95efe50fb38a818a0599fdf6b865a29a Mon Sep 17 00:00:00 2001 From: DancingSnow <60736156+DancingSnow0517@users.noreply.github.com> Date: Sat, 14 Sep 2024 04:53:06 +0800 Subject: [PATCH 027/141] add sources to publishing (#1947) --- gradle/scripts/publishing.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gradle/scripts/publishing.gradle b/gradle/scripts/publishing.gradle index c14a393b79..fe29446cc9 100644 --- a/gradle/scripts/publishing.gradle +++ b/gradle/scripts/publishing.gradle @@ -12,6 +12,8 @@ publishing { version = project.mod_version from components.java + + artifact sourcesJar } } From 3ee506c7439e39dac9ad0995258192f4d10fcb67 Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Fri, 13 Sep 2024 16:53:42 -0400 Subject: [PATCH 028/141] Fixed improper behaviors (#1948) --- .../WorkableElectricMultiblockMachine.java | 17 +++++----- .../gtceu/api/recipe/RecipeHelper.java | 6 +++- .../gtceu/api/recipe/RecipeRunner.java | 13 +++---- .../api/recipe/chance/logic/ChanceLogic.java | 34 +++++++++++++------ .../PrimitiveBlastFurnaceMachine.java | 15 ++++++++ .../primitive/PrimitiveWorkableMachine.java | 10 +++--- 6 files changed, 61 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java index baaf9961fb..15c8109cfa 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java @@ -26,6 +26,8 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; +import lombok.Getter; + import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -45,6 +47,8 @@ public class WorkableElectricMultiblockMachine extends WorkableMultiblockMachine // runtime protected EnergyContainerList energyContainer; + @Getter + protected int tier; public WorkableElectricMultiblockMachine(IMachineBlockEntity holder, Object... args) { super(holder, args); @@ -57,18 +61,21 @@ public WorkableElectricMultiblockMachine(IMachineBlockEntity holder, Object... a public void onStructureInvalid() { super.onStructureInvalid(); this.energyContainer = null; + this.tier = 0; } @Override public void onStructureFormed() { super.onStructureFormed(); this.energyContainer = getEnergyContainer(); + this.tier = GTUtil.getFloorTierByVoltage(getMaxVoltage()); } @Override public void onPartUnload() { super.onPartUnload(); this.energyContainer = null; + this.tier = 0; } ////////////////////////////////////// @@ -87,7 +94,7 @@ public void addDisplayText(List textList) { MultiblockDisplayText.builder(textList, isFormed()) .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) .addEnergyUsageLine(energyContainer) - .addEnergyTierLine(GTUtil.getTierByVoltage(getMaxVoltage())) + .addEnergyTierLine(tier) .addMachineModeLine(getRecipeType()) .addParallelsLine(numParallels) .addWorkingStatusLine() @@ -179,14 +186,6 @@ public long getOverclockVoltage() { // ****** RECIPE LOGIC *******// ////////////////////////////////////// - /** - * Get energy tier. - */ - @Override - public int getTier() { - return GTUtil.getFloorTierByVoltage(getMaxVoltage()); - } - public EnergyContainerList getEnergyContainer() { List containers = new ArrayList<>(); var capabilities = capabilitiesProxy.get(IO.IN, EURecipeCapability.CAP); diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java index dea79d0a00..75550ea8e9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java @@ -60,7 +60,11 @@ public static int getRecipeEUtTier(GTRecipe recipe) { } public static int getPreOCRecipeEuTier(GTRecipe recipe) { - return getRecipeEUtTier(recipe) - recipe.ocTier; + long EUt = getInputEUt(recipe); + if (EUt == 0) EUt = getOutputEUt(recipe); + if (recipe.parallels > 1) EUt /= recipe.parallels; + EUt >>= (recipe.ocTier * 2); + return GTUtil.getTierByVoltage(EUt); } /** diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeRunner.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeRunner.java index ff3c0daa89..599c2b861c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeRunner.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeRunner.java @@ -110,16 +110,13 @@ private void fillContent(IRecipeCapabilityHolder holder, Map.Entry rolls = new ArrayList<>(); int recipeTier = RecipeHelper.getPreOCRecipeEuTier(recipe); - for (int parallels = recipe.parallels; parallels > 0; parallels--) { - List roll = logic.roll(chancedContents, function, - recipeTier, holder.getChanceTier(), this.chanceCaches.get(cap)); - if (roll != null) rolls.addAll(roll); - } + int holderTier = holder.getChanceTier(); + var cache = this.chanceCaches.get(cap); + chancedContents = logic.roll(chancedContents, function, recipeTier, holderTier, cache, recipe.parallels, cap); - for (Content cont : rolls) { + if (chancedContents == null) return; + for (Content cont : chancedContents) { if (cont.slotName == null) { this.content.content.add(cont.content); } else { diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/chance/logic/ChanceLogic.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/chance/logic/ChanceLogic.java index 7422404398..50bf17b8b8 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/chance/logic/ChanceLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/chance/logic/ChanceLogic.java @@ -2,8 +2,10 @@ import com.gregtechceu.gtceu.api.GTCEuAPI; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; import com.gregtechceu.gtceu.api.recipe.chance.boost.ChanceBoostFunction; import com.gregtechceu.gtceu.api.recipe.content.Content; +import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; import com.gregtechceu.gtceu.api.registry.GTRegistries; import net.minecraft.network.chat.Component; @@ -37,14 +39,21 @@ public abstract class ChanceLogic { public @Nullable @Unmodifiable List<@NotNull Content> roll(@NotNull @Unmodifiable List<@NotNull Content> chancedEntries, @NotNull ChanceBoostFunction boostFunction, int baseTier, int machineTier, - @Nullable Object2IntMap cache) { + @Nullable Object2IntMap cache, int times, + RecipeCapability cap) { ImmutableList.Builder builder = ImmutableList.builder(); for (Content entry : chancedEntries) { - int cached = getCachedChance(entry, cache); - int newChance = getChance(entry, boostFunction, baseTier, machineTier); - int chance = newChance + cached; int maxChance = entry.maxChance; + + // Chanced outputs are deterministic, if a large batch is being done we can calculate how many we expect + // to get. + // Add the whole part of that to the list, then roll for the decimal part. + double expected = (double) times * newChance / maxChance; + if (expected > 1) builder.add(entry.copy(cap, ContentModifier.multiplier((int) expected))); + + int cached = getCachedChance(entry, cache); + int chance = newChance + cached; if (passesChance(chance, maxChance)) { do { builder.add(entry); @@ -79,7 +88,8 @@ public String toString() { public @Nullable @Unmodifiable List<@NotNull Content> roll(@NotNull @Unmodifiable List<@NotNull Content> chancedEntries, @NotNull ChanceBoostFunction boostFunction, int baseTier, int machineTier, - @Nullable Object2IntMap cache) { + @Nullable Object2IntMap cache, int times, + RecipeCapability cap) { boolean failed = false; for (Content entry : chancedEntries) { int cached = getCachedChance(entry, cache); @@ -114,7 +124,8 @@ public String toString() { public @Nullable @Unmodifiable List<@NotNull Content> roll(@NotNull @Unmodifiable List<@NotNull Content> chancedEntries, @NotNull ChanceBoostFunction boostFunction, int baseTier, int machineTier, - @Nullable Object2IntMap cache) { + @Nullable Object2IntMap cache, int times, + RecipeCapability cap) { Content selected = null; for (Content entry : chancedEntries) { int cached = getCachedChance(entry, cache); @@ -149,7 +160,8 @@ public String toString() { public @Nullable @Unmodifiable List<@NotNull Content> roll(@NotNull @Unmodifiable List<@NotNull Content> chancedEntries, @NotNull ChanceBoostFunction boostFunction, int baseTier, int machineTier, - @Nullable Object2IntMap cache) { + @Nullable Object2IntMap cache, int times, + RecipeCapability cap) { return null; } @@ -227,13 +239,15 @@ static void updateCachedChance(Object ingredient, @Nullable Object2IntMap cac * @param baseTier the base tier of the recipe * @param machineTier the tier the recipe is run at * @param cache the cache of previously rolled chances, can be null + * @param cap * @return a list of the produced outputs, or null if failed */ public abstract @Nullable @Unmodifiable List<@NotNull Content> roll( @NotNull @Unmodifiable List<@NotNull Content> chancedEntries, @NotNull ChanceBoostFunction boostFunction, int baseTier, int machineTier, - @Nullable Object2IntMap cache); + @Nullable Object2IntMap cache, int times, + RecipeCapability cap); /** * Roll the chance and attempt to produce the output @@ -249,8 +263,8 @@ static void updateCachedChance(Object ingredient, @Nullable Object2IntMap cac public List<@NotNull Content> roll( @NotNull @Unmodifiable List<@NotNull Content> chancedEntries, @NotNull ChanceBoostFunction boostFunction, - int baseTier, int machineTier) { - return roll(chancedEntries, boostFunction, baseTier, machineTier, null); + int baseTier, int machineTier, int times, RecipeCapability cap) { + return roll(chancedEntries, boostFunction, baseTier, machineTier, null, times, cap); } @NotNull diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveBlastFurnaceMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveBlastFurnaceMachine.java index 6c465dcbcb..02bfdf997f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveBlastFurnaceMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveBlastFurnaceMachine.java @@ -1,10 +1,13 @@ package com.gregtechceu.gtceu.common.machine.multiblock.primitive; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.UITemplate; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.config.ConfigHolder; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; @@ -39,6 +42,18 @@ public PrimitiveBlastFurnaceMachine(IMachineBlockEntity holder, Object... args) super(holder, args); } + @Override + protected NotifiableItemStackHandler createImportItemHandler(Object... args) { + return new NotifiableItemStackHandler(this, getRecipeType().getMaxInputs(ItemRecipeCapability.CAP), IO.IN, + IO.NONE); + } + + @Override + protected NotifiableItemStackHandler createExportItemHandler(Object... args) { + return new NotifiableItemStackHandler(this, getRecipeType().getMaxOutputs(ItemRecipeCapability.CAP), IO.OUT, + IO.NONE); + } + @Override @OnlyIn(Dist.CLIENT) public void clientTick() { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java index 83bb310353..a100499d95 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java @@ -57,23 +57,21 @@ public ManagedFieldHolder getFieldHolder() { } protected NotifiableItemStackHandler createImportItemHandler(Object... args) { - return new NotifiableItemStackHandler(this, getRecipeType().getMaxInputs(ItemRecipeCapability.CAP), IO.IN, - IO.NONE); + return new NotifiableItemStackHandler(this, getRecipeType().getMaxInputs(ItemRecipeCapability.CAP), IO.IN); } protected NotifiableItemStackHandler createExportItemHandler(Object... args) { - return new NotifiableItemStackHandler(this, getRecipeType().getMaxOutputs(ItemRecipeCapability.CAP), IO.OUT, - IO.NONE); + return new NotifiableItemStackHandler(this, getRecipeType().getMaxOutputs(ItemRecipeCapability.CAP), IO.OUT); } protected NotifiableFluidTank createImportFluidHandler(Object... args) { return new NotifiableFluidTank(this, getRecipeType().getMaxInputs(FluidRecipeCapability.CAP), - 32 * FluidHelper.getBucket(), IO.IN, IO.NONE); + 32 * FluidHelper.getBucket(), IO.IN); } protected NotifiableFluidTank createExportFluidHandler(Object... args) { return new NotifiableFluidTank(this, getRecipeType().getMaxOutputs(FluidRecipeCapability.CAP), - 32 * FluidHelper.getBucket(), IO.OUT, IO.NONE); + 32 * FluidHelper.getBucket(), IO.OUT); } @Override From 31144106149360577f2a6547c04da518dcfc4a3a Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Fri, 13 Sep 2024 16:53:54 -0400 Subject: [PATCH 029/141] Tuned Tool Highlight Grid behavior (#1949) --- .../api/blockentity/PipeBlockEntity.java | 2 +- .../gtceu/api/machine/MetaMachine.java | 5 ++- .../renderer/BlockHighLightRenderer.java | 32 +++++++++---------- .../tool/rotation/CustomBlockRotations.java | 12 +++---- .../rotation/ICustomRotationBehavior.java | 2 +- .../machine/electric/BlockBreakerMachine.java | 4 +++ 6 files changed, 31 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java index 8365ef2098..b02b8c1add 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java @@ -334,7 +334,7 @@ public void setChanged() { @Override public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, ItemStack held, Set toolTypes) { - if (toolTypes.contains(getPipeTuneTool()) || toolTypes.contains(GTToolType.SCREWDRIVER)) return true; + if (toolTypes.contains(getPipeTuneTool())) return true; for (CoverBehavior cover : coverContainer.getCovers()) { if (cover.shouldRenderGrid(player, pos, state, held, toolTypes)) return true; } 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 6d8eebe30c..85af6710fe 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -505,8 +505,11 @@ public void clearInventory(IItemTransfer inventory) { @Override public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, ItemStack held, Set toolTypes) { - if (toolTypes.contains(GTToolType.WRENCH) || toolTypes.contains(GTToolType.SCREWDRIVER)) return true; + if (toolTypes.contains(GTToolType.WRENCH)) return true; if (toolTypes.contains(GTToolType.HARD_HAMMER) && this instanceof IMufflableMachine) return true; + if (toolTypes.contains(GTToolType.SCREWDRIVER) && + (this instanceof IAutoOutputItem || this instanceof IAutoOutputFluid)) + return true; for (CoverBehavior cover : coverContainer.getCovers()) { if (cover.shouldRenderGrid(player, pos, state, held, toolTypes)) return true; } diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/BlockHighLightRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/BlockHighLightRenderer.java index 6dbc179a36..86c994cdbe 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/BlockHighLightRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/BlockHighLightRenderer.java @@ -11,7 +11,6 @@ import com.gregtechceu.gtceu.api.pipenet.IPipeType; import com.gregtechceu.gtceu.common.item.CoverPlaceBehavior; import com.gregtechceu.gtceu.common.item.tool.rotation.CustomBlockRotations; -import com.gregtechceu.gtceu.common.item.tool.rotation.ICustomRotationBehavior; import com.gregtechceu.gtceu.core.mixins.GuiGraphicsAccessor; import com.lowdragmc.lowdraglib.client.utils.RenderUtils; @@ -24,8 +23,10 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; @@ -70,6 +71,19 @@ public static void renderBlockHighLight(PoseStack poseStack, Camera camera, Bloc gridHighLight = highLight; } else if (level.getBlockState(blockPos).getBlock() instanceof IToolGridHighLight highLight) { gridHighLight = highLight; + } else if (toolType.contains(GTToolType.WRENCH)) { + var behavior = CustomBlockRotations.getCustomRotation(level.getBlockState(blockPos).getBlock()); + if (behavior != null && behavior.showGrid()) { + gridHighLight = new IToolGridHighLight() { + + @Override + public ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, + Set toolTypes, Direction side) { + return behavior.showSideTip(state, side) ? GuiTextures.TOOL_FRONT_FACING_ROTATION : + null; + } + }; + } } if (gridHighLight == null) { return; @@ -113,22 +127,6 @@ public static void renderBlockHighLight(PoseStack poseStack, Camera camera, Bloc return; } - if (toolType.contains(GTToolType.WRENCH)) { - ICustomRotationBehavior behavior = CustomBlockRotations - .getCustomRotation(level.getBlockState(blockPos).getBlock()); - if (behavior != null && behavior.showGrid()) { - Vec3 pos = camera.getPosition(); - poseStack.pushPose(); - poseStack.translate(-pos.x, -pos.y, -pos.z); - var buffer = multiBufferSource.getBuffer(RenderType.lines()); - RenderSystem.lineWidth(3); - - drawGridOverlays(poseStack, buffer, target, side -> GuiTextures.TOOL_FRONT_FACING_ROTATION); - - poseStack.popPose(); - } - } - // draw cover grid highlight ICoverable coverable = GTCapabilityHelper.getCoverable(level, blockPos, target.getDirection()); if (coverable != null && CoverPlaceBehavior.isCoverBehaviorItem(held, coverable::hasAnyCover, diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/rotation/CustomBlockRotations.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/rotation/CustomBlockRotations.java index 7b8a784bde..349c100d7a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/rotation/CustomBlockRotations.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/rotation/CustomBlockRotations.java @@ -49,8 +49,8 @@ public boolean customRotate(BlockState state, Level world, BlockPos pos, BlockHi } @Override - public boolean showXOnSide(BlockState state, Direction facing) { - return state.getValue(HorizontalDirectionalBlock.FACING) == facing; + public boolean showSideTip(BlockState state, Direction side) { + return side.getAxis() != Direction.Axis.Y && state.getValue(HorizontalDirectionalBlock.FACING) != side; } }; @@ -70,8 +70,8 @@ public boolean customRotate(BlockState state, Level world, BlockPos pos, BlockHi } @Override - public boolean showXOnSide(BlockState state, Direction facing) { - return state.getValue(DirectionalBlock.FACING) == facing; + public boolean showSideTip(BlockState state, Direction side) { + return state.getValue(DirectionalBlock.FACING) != side; } }; @@ -111,8 +111,8 @@ public boolean customRotate(BlockState state, Level world, BlockPos pos, BlockHi } @Override - public boolean showXOnSide(BlockState state, Direction facing) { - return state.getValue(HopperBlock.FACING) == facing; + public boolean showSideTip(BlockState state, Direction side) { + return side != Direction.UP && state.getValue(HopperBlock.FACING) != side; } }), diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/rotation/ICustomRotationBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/rotation/ICustomRotationBehavior.java index c9ad8e703c..2ec52ef6d6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/rotation/ICustomRotationBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/rotation/ICustomRotationBehavior.java @@ -21,7 +21,7 @@ default boolean showGrid() { } /** Whether to draw an X on a provided side in the 9-sectioned highlight grid. */ - default boolean showXOnSide(BlockState state, Direction facing) { + default boolean showSideTip(BlockState state, Direction side) { return false; } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java index a2fe57754d..2cbc121b2a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java @@ -448,6 +448,10 @@ public ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, S } } else if (toolTypes.contains(GTToolType.SOFT_MALLET)) { return isWorkingEnabled ? GuiTextures.TOOL_PAUSE : GuiTextures.TOOL_START; + } else if (toolTypes.contains(GTToolType.SCREWDRIVER)) { + if (side == getOutputFacingItems()) { + return GuiTextures.TOOL_ALLOW_INPUT; + } } return super.sideTips(player, pos, state, toolTypes, side); } From 681f877c7b1ce2cbe0bdf00858a243a6077d7ebf Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Sat, 14 Sep 2024 04:28:54 -0600 Subject: [PATCH 030/141] Optical pipes can now hold covers (#1953) Co-authored-by: YoungOnionMC --- .../gtceu/common/blockentity/OpticalPipeBlockEntity.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/OpticalPipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/OpticalPipeBlockEntity.java index cccf3dd060..d366aaea2e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/OpticalPipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/OpticalPipeBlockEntity.java @@ -96,6 +96,11 @@ public LazyOptional getCapability(Capability capability, @Nullable Dir return GTCapability.CAPABILITY_COMPUTATION_PROVIDER.orEmpty(capability, LazyOptional.of(() -> handlers.getOrDefault(facing, defaultHandler))); } + + if (capability == GTCapability.CAPABILITY_COVERABLE) { + return GTCapability.CAPABILITY_COVERABLE.orEmpty(capability, LazyOptional.of(this::getCoverContainer)); + } + return super.getCapability(capability, facing); } From ef8a0cef0f5a66775d5f5052c642ee5b72bec6cd Mon Sep 17 00:00:00 2001 From: Spicierspace153 Date: Sat, 14 Sep 2024 16:44:37 -0600 Subject: [PATCH 031/141] Disables unimplemented covers (#1961) --- .../gtceu/common/data/GTItems.java | 13 ----------- .../data/recipe/misc/MiscRecipeLoader.java | 22 ++++++++++--------- 2 files changed, 12 insertions(+), 23 deletions(-) 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 38aa18f060..92ed72be06 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java @@ -2076,11 +2076,6 @@ public Component getItemName(ItemStack stack) { .onRegister(attach(new CoverPlaceBehavior(GTCovers.COMPUTER_MONITOR))) .onRegister(compassNode(GTCompassSections.COVERS, GTCompassNodes.COVER)) .register(); - public static ItemEntry COVER_CRAFTING = REGISTRATE - .item("crafting_table_cover", ComponentItem::create) - .lang("Crafting Table Cover") - .onRegister(compassNode(GTCompassSections.COVERS, GTCompassNodes.COVER)) - .register(); public static ItemEntry COVER_SHUTTER = REGISTRATE .item("shutter_module_cover", ComponentItem::create) .lang("Shutter Module") @@ -2101,14 +2096,6 @@ public Component getItemName(ItemStack stack) { .lang("Ender Fluid Link") .onRegister(compassNode(GTCompassSections.COVERS, GTCompassNodes.COVER)) .register(); - public static ItemEntry COVER_DIGITAL_INTERFACE = REGISTRATE - .item("digital_interface_cover", ComponentItem::create) - .lang("Digital Interface") - .register(); - public static ItemEntry COVER_DIGITAL_INTERFACE_WIRELESS = REGISTRATE - .item("wireless_digital_interface_cover", ComponentItem::create) - .lang("Wireless Digital Interface") - .register(); public static ItemEntry COVER_FLUID_VOIDING = REGISTRATE .item("fluid_voiding_cover", ComponentItem::create) .lang("Fluid Voiding Cover") diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MiscRecipeLoader.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MiscRecipeLoader.java index 14edeecd1f..c774185737 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MiscRecipeLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MiscRecipeLoader.java @@ -296,16 +296,18 @@ public static void init(Consumer provider) { * .outputItems(GTMachines.CENTRAL_MONITOR) * .save(provider); */ - - ASSEMBLER_RECIPES.recipeBuilder("cover_digital_interface").duration(100).EUt(VA[HV]) - .inputItems(COVER_SCREEN) - .inputItems(plate, Aluminium) - .inputItems(CustomTags.MV_CIRCUITS) - .inputItems(screw, StainlessSteel, 4) - .inputFluids(Polyethylene.getFluid(L)) - .outputItems(COVER_DIGITAL_INTERFACE) - .save(provider); - + /* + * ASSEMBLER_RECIPES.recipeBuilder("cover_digital_interface").duration(100).EUt(VA[HV]) + * .inputItems(COVER_SCREEN) + * .inputItems(plate, Aluminium) + * .inputItems(CustomTags.MV_CIRCUITS) + * .inputItems(screw, StainlessSteel, 4) + * .inputFluids(Polyethylene.getFluid(L)) + * .outputItems(COVER_DIGITAL_INTERFACE) + * .save(provider); + * \ + * + */ // todo digital interface cover /* * ASSEMBLER_RECIPES.recipeBuilder("cover_wireless_digital_interface").duration(100).EUt(VA[HV]) From 8fa4cc4cb5845113302d6e25cd6b8e8892e379a1 Mon Sep 17 00:00:00 2001 From: Karthi Suresh <75553966+JuiceyBeans@users.noreply.github.com> Date: Mon, 16 Sep 2024 22:43:13 +0400 Subject: [PATCH 032/141] Convert all stereo sounds to mono (#1966) --- .../assets/gtceu/sounds/computation.ogg | Bin 71556 -> 49498 bytes .../assets/gtceu/sounds/jet_engine.ogg.sfk | Bin 144 -> 0 bytes .../assets/gtceu/sounds/metal_pipe.ogg | Bin 28452 -> 17119 bytes .../assets/gtceu/sounds/portal_closing.ogg | Bin 14673 -> 10223 bytes .../assets/gtceu/sounds/portal_opening.ogg | Bin 18248 -> 11897 bytes 5 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/resources/assets/gtceu/sounds/jet_engine.ogg.sfk diff --git a/src/main/resources/assets/gtceu/sounds/computation.ogg b/src/main/resources/assets/gtceu/sounds/computation.ogg index b80c204601f000e66bf40464c0ea2e6a3a198367..f4a2ca0f0258985affbbbf88b6a565088c2e4da7 100644 GIT binary patch literal 49498 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 z%0D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 literal 71556 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 diff --git a/src/main/resources/assets/gtceu/sounds/metal_pipe.ogg b/src/main/resources/assets/gtceu/sounds/metal_pipe.ogg index e218c149fa23bb8f4b58c8b8d570b5278b2206a2..58d4ce35975841b0ffb310a6a0587d485cba7ab5 100644 GIT binary patch delta 15763 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 Q`O&`U&-haMC+@KS1%HV@1^@s6 literal 28452 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 BqvZeq diff --git a/src/main/resources/assets/gtceu/sounds/portal_opening.ogg b/src/main/resources/assets/gtceu/sounds/portal_opening.ogg index 1df6eb2e074c47209e1c659e64112e5ac9285469..77858b5fabd607e00048cafc95d97f37d9297c19 100644 GIT binary patch delta 10278 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 PVA(l2Hqy{?Y~cR@K#8!Z literal 18248 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 KxKOz|rvC Date: Mon, 16 Sep 2024 12:49:53 -0600 Subject: [PATCH 033/141] Update EnergyNetWalker.java (#1967) --- .../gtceu/common/pipelike/cable/EnergyNetWalker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/pipelike/cable/EnergyNetWalker.java b/src/main/java/com/gregtechceu/gtceu/common/pipelike/cable/EnergyNetWalker.java index 6f1b5fd9cf..a81994d1f2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/pipelike/cable/EnergyNetWalker.java +++ b/src/main/java/com/gregtechceu/gtceu/common/pipelike/cable/EnergyNetWalker.java @@ -12,7 +12,7 @@ import net.minecraft.core.Direction; import net.minecraft.world.level.block.entity.BlockEntity; -import com.llamalad7.mixinextras.lib.apache.commons.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; From 57400d0c042616a111b0204b088822f505040a5b Mon Sep 17 00:00:00 2001 From: Karthi Suresh <75553966+JuiceyBeans@users.noreply.github.com> Date: Tue, 17 Sep 2024 21:20:49 +0400 Subject: [PATCH 034/141] Sculk fixes + datagen (#1968) --- src/generated/resources/assets/gtceu/lang/en_ud.json | 6 +----- src/generated/resources/assets/gtceu/lang/en_us.json | 6 +----- .../assets/gtceu/models/item/crafting_table_cover.json | 6 ------ .../assets/gtceu/models/item/digital_interface_cover.json | 6 ------ .../models/item/wireless_digital_interface_cover.json | 6 ------ .../com/gregtechceu/gtceu/common/data/GTMaterials.java | 8 ++++---- .../common/data/materials/SecondDegreeMaterials.java | 2 +- .../gtceu/data/recipe/configurable/RecipeAddition.java | 4 ++-- 8 files changed, 9 insertions(+), 35 deletions(-) delete mode 100644 src/generated/resources/assets/gtceu/models/item/crafting_table_cover.json delete mode 100644 src/generated/resources/assets/gtceu/models/item/digital_interface_cover.json delete mode 100644 src/generated/resources/assets/gtceu/models/item/wireless_digital_interface_cover.json diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 6ac271a75a..add14c8f1b 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -1815,7 +1815,6 @@ "compass.node.gtceu.covers/computer_monitor_cover": "ɹǝʌoƆ ɹoʇıuoW ɹǝʇndɯoƆ", "compass.node.gtceu.covers/conveyor": "ɹoʎǝʌuoƆ", "compass.node.gtceu.covers/cover": "¿ɹǝʌoƆ sı ʇɐɥM", - "compass.node.gtceu.covers/crafting_table_cover": "ɹǝʌoƆ ǝןqɐ⟘ buıʇɟɐɹƆ", "compass.node.gtceu.covers/ender_fluid_link_cover": "ɹǝʌoƆ ʞuıꞀ pınןℲ ɹǝpuƎ", "compass.node.gtceu.covers/energy_detector_cover": "ɹǝʌoƆ ɹoʇɔǝʇǝᗡ ʎbɹǝuƎ", "compass.node.gtceu.covers/facade_cover": "ɹǝʌoƆ ǝpɐɔɐℲ", @@ -4173,7 +4172,6 @@ "item.gtceu.cpu_chip.tooltip": "ʇıu∩ buıssǝɔoɹԀ ןɐɹʇuǝƆㄥ§", "item.gtceu.cpu_wafer": "ɹǝɟɐM ∩ԀƆ", "item.gtceu.cpu_wafer.tooltip": "ʇıu∩ buıssǝɔoɹԀ ʍɐᴚㄥ§", - "item.gtceu.crafting_table_cover": "ɹǝʌoƆ ǝןqɐ⟘ buıʇɟɐɹƆ", "item.gtceu.crafting_table_cover.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ǝuıɥɔɐW ɐ uo ㄥ§ɥɔuǝqʞɹoM pǝɔuɐʌpⱯɟ§", "item.gtceu.credit_casting_mold": ")ǝbɐuıoƆ( pןoW buıʇsɐƆ", "item.gtceu.credit_casting_mold.tooltip": ")¡ʇı ǝsoן ʇ,uoᗡ( suıoƆ buıʞɐɯ ɹoɟ pןoW ǝɹnɔǝSㄥ§", @@ -4210,7 +4208,6 @@ "item.gtceu.data_stick": "ʞɔıʇS ɐʇɐᗡ", "item.gtceu.data_stick.tooltip": "ǝbɐɹoʇS ɐʇɐᗡ ʎʇıɔɐdɐƆ ʍoꞀ Ɐㄥ§", "item.gtceu.diamond_grinding_head": "pɐǝH buıpuıɹ⅁ puoɯɐıᗡ", - "item.gtceu.digital_interface_cover": "ǝɔɐɟɹǝʇuI ןɐʇıbıᗡ", "item.gtceu.diode": "ǝpoıᗡ", "item.gtceu.diode.tooltip": "ʇuǝuodɯoƆ ɔıuoɹʇɔǝןƎ ɔısɐᗺㄥ§", "item.gtceu.doge_coin": "uıoƆ ǝboᗡ", @@ -5031,7 +5028,6 @@ "item.gtceu.white_dye_spray_can": ")ǝʇıɥM( uɐƆ ʎɐɹdS", "item.gtceu.wire_extruder_mold": ")ǝɹıM( pןoW ɹǝpnɹʇxƎ", "item.gtceu.wire_extruder_mold.tooltip": "sǝɹıM buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.wireless_digital_interface_cover": "ǝɔɐɟɹǝʇuI ןɐʇıbıᗡ ssǝןǝɹıM", "item.gtceu.wood_bolt": "ʞɔıʇS pooM ʇɹoɥS", "item.gtceu.wood_dust": "dןnԀ pooM", "item.gtceu.wood_plate": "ʞuɐןԀ pooM", @@ -5238,7 +5234,7 @@ "material.gtceu.dubnium": "ɯnıuqnᗡ", "material.gtceu.duranium": "ɯnıuɐɹnᗡ", "material.gtceu.dysprosium": "ɯnısoɹdsʎᗡ", - "material.gtceu.echo": "oɥɔƎ", + "material.gtceu.echo_shard": "pɹɐɥS oɥɔƎ", "material.gtceu.einsteinium": "ɯnıuıǝʇsuıƎ", "material.gtceu.electrotine": "ǝuıʇoɹʇɔǝןƎ", "material.gtceu.electrum": "ɯnɹʇɔǝןƎ", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index fe52f32cfc..7c1eb46ed9 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -1815,7 +1815,6 @@ "compass.node.gtceu.covers/computer_monitor_cover": "Computer Monitor Cover", "compass.node.gtceu.covers/conveyor": "Conveyor", "compass.node.gtceu.covers/cover": "What is Cover?", - "compass.node.gtceu.covers/crafting_table_cover": "Crafting Table Cover", "compass.node.gtceu.covers/ender_fluid_link_cover": "Ender Fluid Link Cover", "compass.node.gtceu.covers/energy_detector_cover": "Energy Detector Cover", "compass.node.gtceu.covers/facade_cover": "Facade Cover", @@ -4173,7 +4172,6 @@ "item.gtceu.cpu_chip.tooltip": "§7Central Processing Unit", "item.gtceu.cpu_wafer": "CPU Wafer", "item.gtceu.cpu_wafer.tooltip": "§7Raw Processing Unit", - "item.gtceu.crafting_table_cover": "Crafting Table Cover", "item.gtceu.crafting_table_cover.tooltip": "§fAdvanced Workbench§7 on a Machine as §fCover§7.", "item.gtceu.credit_casting_mold": "Casting Mold (Coinage)", "item.gtceu.credit_casting_mold.tooltip": "§7Secure Mold for making Coins (Don't lose it!)", @@ -4210,7 +4208,6 @@ "item.gtceu.data_stick": "Data Stick", "item.gtceu.data_stick.tooltip": "§7A Low Capacity Data Storage", "item.gtceu.diamond_grinding_head": "Diamond Grinding Head", - "item.gtceu.digital_interface_cover": "Digital Interface", "item.gtceu.diode": "Diode", "item.gtceu.diode.tooltip": "§7Basic Electronic Component", "item.gtceu.doge_coin": "Doge Coin", @@ -5031,7 +5028,6 @@ "item.gtceu.white_dye_spray_can": "Spray Can (White)", "item.gtceu.wire_extruder_mold": "Extruder Mold (Wire)", "item.gtceu.wire_extruder_mold.tooltip": "§7Extruder Shape for making Wires", - "item.gtceu.wireless_digital_interface_cover": "Wireless Digital Interface", "item.gtceu.wood_bolt": "Short Wood Stick", "item.gtceu.wood_dust": "Wood Pulp", "item.gtceu.wood_plate": "Wood Plank", @@ -5238,7 +5234,7 @@ "material.gtceu.dubnium": "Dubnium", "material.gtceu.duranium": "Duranium", "material.gtceu.dysprosium": "Dysprosium", - "material.gtceu.echo": "Echo", + "material.gtceu.echo_shard": "Echo Shard", "material.gtceu.einsteinium": "Einsteinium", "material.gtceu.electrotine": "Electrotine", "material.gtceu.electrum": "Electrum", diff --git a/src/generated/resources/assets/gtceu/models/item/crafting_table_cover.json b/src/generated/resources/assets/gtceu/models/item/crafting_table_cover.json deleted file mode 100644 index 5b36968e69..0000000000 --- a/src/generated/resources/assets/gtceu/models/item/crafting_table_cover.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "gtceu:item/crafting_table_cover" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/digital_interface_cover.json b/src/generated/resources/assets/gtceu/models/item/digital_interface_cover.json deleted file mode 100644 index d27ed8fa80..0000000000 --- a/src/generated/resources/assets/gtceu/models/item/digital_interface_cover.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "gtceu:item/digital_interface_cover" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/wireless_digital_interface_cover.json b/src/generated/resources/assets/gtceu/models/item/wireless_digital_interface_cover.json deleted file mode 100644 index 92a8329526..0000000000 --- a/src/generated/resources/assets/gtceu/models/item/wireless_digital_interface_cover.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "gtceu:item/wireless_digital_interface_cover" - } -} \ No newline at end of file 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 a81c3a9756..224eaf27af 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTMaterials.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTMaterials.java @@ -100,7 +100,7 @@ public static void init() { gem.setIgnored(NetherQuartz, Items.QUARTZ); gem.setIgnored(Coal, Items.COAL); gem.setIgnored(Amethyst, Items.AMETHYST_SHARD); - gem.setIgnored(Echo, Items.ECHO_SHARD); + gem.setIgnored(EchoShard, Items.ECHO_SHARD); excludeAllGems(Charcoal, Items.CHARCOAL); excludeAllGems(Flint, Items.FLINT); excludeAllGems(EnderPearl, Items.ENDER_PEARL); @@ -174,7 +174,7 @@ public static void init() { rock.setIgnored(Endstone, Blocks.END_STONE); rock.setIgnored(Deepslate, Blocks.DEEPSLATE); rock.setIgnored(Basalt, Blocks.BASALT); - rock.setIgnored(Sculk, Blocks.SCULK); + block.setIgnored(Sculk, Blocks.SCULK); block.setIgnored(Concrete, SupplierMemoizer.memoizeBlockSupplier(() -> GTBlocks.LIGHT_CONCRETE.get())); block.setIgnored(Concrete, SupplierMemoizer.memoizeBlockSupplier(() -> GTBlocks.DARK_CONCRETE.get())); @@ -251,7 +251,7 @@ public static void init() { rawOreBlock.setIgnored(Copper, Blocks.RAW_COPPER_BLOCK); block.modifyMaterialAmount(Amethyst, 4); - block.modifyMaterialAmount(Echo, 4); + block.modifyMaterialAmount(EchoShard, 4); block.modifyMaterialAmount(Glowstone, 4); block.modifyMaterialAmount(NetherQuartz, 4); block.modifyMaterialAmount(CertusQuartz, 4); @@ -893,7 +893,7 @@ private static void excludeAllGemsButNormal(Material material) { public static Material Olivine; public static Material Opal; public static Material Amethyst; - public static Material Echo; + public static Material EchoShard; public static Material Lapis; public static Material Blaze; public static Material Apatite; diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/materials/SecondDegreeMaterials.java b/src/main/java/com/gregtechceu/gtceu/common/data/materials/SecondDegreeMaterials.java index 88c7a52eba..e273ceb8e7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/materials/SecondDegreeMaterials.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/materials/SecondDegreeMaterials.java @@ -78,7 +78,7 @@ public static void register() { .components(SiliconDioxide, 4, Iron, 1) .buildAndRegister(); - Echo = new Material.Builder(GTCEu.id("echo")) + EchoShard = new Material.Builder(GTCEu.id("echo_shard")) .gem(3) .color(0x002b2d).iconSet(RUBY) .appendFlags(EXT_METAL, NO_SMASHING, NO_SMELTING, GENERATE_ROD) diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java index 6eac08e629..717efc1239 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java @@ -1307,8 +1307,8 @@ private static void hardMiscRecipes(Consumer provider) { ASSEMBLER_RECIPES.recipeBuilder("recovery_compass") .inputItems(new ItemStack(Items.COMPASS)) - .inputItems(plate, Echo, 8) - .inputItems(rod, Echo) + .inputItems(plate, EchoShard, 8) + .inputItems(rod, EchoShard) .outputItems(new ItemStack(Items.RECOVERY_COMPASS)) .duration(400).EUt(30).save(provider); From bbe7590992ebf0a8e25e69ef14fae03ef2f77eca Mon Sep 17 00:00:00 2001 From: Karthi Suresh <75553966+JuiceyBeans@users.noreply.github.com> Date: Tue, 17 Sep 2024 21:20:59 +0400 Subject: [PATCH 035/141] Remove border lines from Laminated Glass CTM (#1972) --- .../casings/transparent/laminated_glass_ctm.png | Bin 483 -> 870 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/gtceu/textures/block/casings/transparent/laminated_glass_ctm.png b/src/main/resources/assets/gtceu/textures/block/casings/transparent/laminated_glass_ctm.png index 53e745d49847ca20f26564d09b27eeff2994ef8e..b3096f552e44ba1ea85d1c4b6072e4dfefd12ff1 100644 GIT binary patch delta 848 zcmV-W1F!t!1Lg*hBYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmP!xqvQ>7{u5j%)D zWT-A$5Eao)t5Adrp;lE=X9p)m7b)?+ zq|hSP2bcG8-aCi;?gNBsk!e=j7@+C4nTSQjRC-kmyrL7mRDUCwk(p)8Nm3jw*VjFK ze7}qEtk(DbT-|EMVt`L1o@It<6K@btZQ2Isec}+y%PR3X@u*1+5HHa7%u>=Vs z6qHdw5jG;U>wlzJNYHt-g@3^HOXO0>RRAN$0!q*zyMFLL_&r-IJ2CDh1*1Uwi{pF@ z0fAkhR&ku~W5=nT0RCs-N^kf}Rbcv)^h!eu9|1kvz{Pb#Q}%$%9iacokWJZ@{8U0V z3%sAvH>H8TTcB&rn_K-Hrw>4qW);5y4i16g9A&S!cz<_C^W6TuQ=i`t#ZGd_f9-Vo z00006VoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru=m`-D z4H*w4GM@kd02y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00BKoL_t(o z!|hiw4u8Th40NKde1Iin0`UR%E_nzNk3!-hEbRRNYnp`*@PII-1dBFt;}(SQl&W@o zK09_Ipiqpdef)hsUqr6HYb^jL01PIjzgcT9vBK?s^Dv<(rJw7S28o?77fS&%N(Z31 zHlv)sL=>%am{claV7J||MNVN-a?6r|((|RrpX!cN7j4))<<5 z3wWjJ=y4<^_W@&SKYJ&{I#rA+MSb{>(_l>PDQ)<0*!yHEOK(O+_8)cLT$>{2rS^aM zZb|vclOf{P7&jW~JP7*7<4L5N(90g2vmk7q17MO_kTWTS2IB*eBYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!~g&e!~vBn4jTXf0eDG7K~z{r#g@Hs!!QhmCG}arjiM^PEZ{zk2g#j>@|_3r0&X2O zULXTFdOAY~L;L{9n!!f)V~hRlLJ_M^Rj6lKmUY|JUU;_=Eb3X+7TOTA_@B? z0=xHJwVhicxyk_#$Z%^Ut2zL3k(6cZazIYTb3g<1)gzEYI_Y*mMj=J0GTaVm!yc=Q z&awkSQ{xg^+<%>fawmMklFgVMu+(@C+=eY~B>cd|z>#MwcQ;?96H;ekc7U!&EJ%x_ z5-S(xTvD#|nmarOv|O*5OWId$M4FP6Hp>x!TEZA>ueZ!We@Ha7 z4y{KYJ%U)*(qhrC94L7iaoq0#@5{)lcU3{ICupczhC?No9MEKTijZFIz;9JXuo3a5 z6QXJ(;tp7Wmg{3piNkH8ji?k&RY;qEeh*xmAIhidPxEvePXGV_07*qoM6N<$f|HEL A8~^|S 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 036/141] 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 037/141] 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 038/141] 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 039/141] 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 zcmV-83&-?{P)PbXFRCt{2TuqPL#um{ zIkf08K$C0Fximkc{RKU@J@?Q<(H@#pKMn`NP$NS@7{@2>1pU*#e zF9U#I{N`_K>wo&uqii(jB2Jc=U!?f;AO5w`7&irNd2xT(cPh*;Qp75s+%W7S3W3gH zP~7AHo3>fk4uI1ZfKy-g;Tz9x!@jqTLDU0Kx^Heg3<2Pza=zR&cglIJ|L^tth!qg4@||Sg zv)gcI%0--Cq&WL#YP37(1UTpfmE-x!%YLI$3Gh6@2k+h~w(6h%c~+{b)61)A@t~an z2zI7rc8NA%?)*X2!$PGv3ImMVu4+p!TdN0l%O~*+qd|A0`sb4bKrRFaouIJaVVJi+ z9=f}VzspyC9;Z$lUB8Eu@eEi!i zwaUp)FI!lwb{WeSDlI01eOA>6Ox4WAA4Rz!PU0EH&lAUoSg6!%N}>=r8P5Q~Tc2g; z@%l+&KbvAS=w4ZC+!V9{y~u#xHC(7sqy=IU=MxhvJ;|~@gu`*!`lBeo={VWi1m@3@iT~?`_Hv$LInN!aUcZk)6d-74IG-dK4Y~;02LQ6w zUm)rpV6(y8yIv_R96$cxQ3hypBuyDZ#Dz)`v=2(n(@jTPs^0TB#nb;j1CTEWRj|)) z%6OY~&c2xz)A9vo!oi^^$uTH-$>OGxKi@JpEEXw}An!07a`amw|fN7ed zP=}uq!&}{=4iGs0%uyI1z0Ci=s_D21XagwhZWIEe`?n3dKEFuOiTZ|zOBHQOe9z+- zXmbE)?|*Rbc3~c*O1|?(--+#qx4MXx9;GTTAj|ELmVHpr<>Hrl@5_0LF#tTze_x&_ zafKjgXILox+v)@(3drqdT3mA>rL!g%eG<=%Nd{1uf%LM4sH@EfO$ws|s%_bpA)I#N z(!zfL%tfc)B87uyV4>0?HkT$vt7&t=*@smBgwzP9<0-y-@3wJ27ouRNxrSZBi2}48 zN1@te8ITo=$dE7U9vJq0q0Ak56z29_*U>+qa~KpmOxkhoPFcqCqcFhnFfSXxwC~g$ zfEJ`EbbSEE?i|Or_%?>Oy3X#OU!*HRuc;F#FSyg#unVc)VnwE;bRsR5Kq3Ui@UQlz!n&X+i%5F8H!oQ&5`mYw5}VE&|TFv7rC z0cXMqWKza<=6H`8HbYG+-R{e0-+J54rc?C#ePb~J7)~IaN!ux#K|6W2%XKCWgJfT_ zPdcER9Q14gYBpeZ=MB4r69zthc-PqN0MLp0hHBQ1-D>yW>S7S}oJ?SP*>hB8dfCE+ z!e)8t@4R)-*zG{BcD;_Ba1QC%$xNUxEMvxS6Lr5Sj>5puT6IGa21*Z>2OP9*wE62C zJN_?)q|8)AArOf$kT{R?WX&LQ1+L1mJ01pxiIT}6+f-~5eC{||)=~(JFc5(8Ak6Or z(jIHSz;^7U-(c^+A_R|27YU=ty!->W0=2 zpWM%AXKg1&#@O3{FHzDt3>=3|W)rso?s&QIbV3>8{^#oi$3xd=0jf_xX&M1-uCCh0 z$#{mh-^@42m(TLK*p$8WvS^VK_UT8DieGnCf`cSQ@Bv;HoPbtqH}mkbpL{Q~GoFBc zcHilx)P$o*n>$+w0RJhfuU~0mkHX;E1)wki^xn@WiC0qBfo-;_UU!LK{q7&76a4un z?`1*z;7Xi83Pb^n}))6KJZgoQ5@6-DE~k9-IJXb`Z#Yg+WnAt5p(8WK_U@7&XWULaNVEgrcvT zjM{So<%M1x*Z$epw#O^4%kKI5)k5H!j#uSX?-eIdI&DnvYTA^3AfDO#z&5@*W`AzK zRsGcgwdVxB`(OwF#X}s0ZaOtj%D6;LNxICPAfMOkp750sJ7tRbRVG&UiW3+oO8_X2 zP;E8FYo!uQJiF39&#&sE?Alje7j;^DP9Vdf&pv*V0p(7Ougn+!k6$u*wCnhvXgGm6 z3MWuL+*R@b+m8Qtz3>t?Cva>XZS#=qwdMqtUc@8(G@aNN_eK9VjIVxDo(KY6VS zJU!&8-*v0d)A6)Yb19V|Mjq944*hlN&I$aEuh93_k1r7>LUl0Jd&pl5!O7G<^c0gOC=k}@ zJU|^M%tqZgfdwCcc>o(Pdf2h9-L`lGo8nJ@JvDZ`{4~zXfKe1TQq?i@O@xyNuvsqh z9`Bcx+2v(nWzf!Q!y8zK+H(T!Jb>f?*k}E`&uakQG70;(72YT4*MZiLe(*2@%Fp}P@c>?gxw}cbU5pC=zyIRjwQ$n5<)p4d`|USL1~sKs ztL(tLQ^^q^ci;ZJ8~{&W4FB9+Pv{-u<|8y^4A$%3`u@7>1|}-`0KWKrll*`$&fkPL zV2|bd4IG!;gcs!=G{~{Hd4QXaYcm1-M}~dA<4&MD2jHWSSLGI7mpnk-(favMzh5b8 ze6R1Sc+qx*e4k*O?Y5l<*cGl#14urA{7NVQC!QzDGGDTs`2%^6u+PqIXAv;t`6@E0 z-M`H(XdJ(4ID7!AABF8@Qux~1}-+@1C(7e53mW(UtV7&58&&^9(NNCLIXcq*X3@q7(sxq9t zdLQNQ=?Ex){%duZQmArv~jnTl=EYP_AtGGK?W+&q|%OGyx3^+hhtxuJd;L+Q+iO|YR zv6cJL>!^bINQ~5nlba@JWg;5RP-+30g!dj?Zy+BWC@4J;- zHkl{3D7Deml`wM6mtv4lL^pSA9XCu@UlWb|cZc2y>2zm1lp4Y}MfK3osM*90&86BQ zCMDAAmz^si1692Te_-rZDmSw;lFR%eeWgd*oatu8nzmK zo~E_mJjw#Wf26UvZ3p3B2O&Lt>|sfek*I2=d`~5x8IPDUKRC8d%4d>};|7&3x%z2` z*Zmi>iuilUb3v`evZTj4B-Po|x&(e+LZ2DC%KZD2s2qOY_`<8rBa=#3=w=?wFyrZs zUmGdpdUR}vecr=5wsL`nLi!)Na|^R+!JEC-{mcm(sE8k00pVdMs{_CcZk$tQUWFW* z?^YBM#@9mlsUmRlS}8x2%o8~0nWG(gXe{%4dCyw`ZYMt?3`IYr@!+iF(SpNIA^P|hP-N*#iyO`CbC!})CGPnoQz5&R ze)3x?P!1_P`-`aR$qRcN!IytvYto3SgcJnr;t^4fP=Vl-Jv`*@t&KeB?1NFITCO}v z!Px<*tZx`E$EPRPg&fPgUmgE`nOl_Z9=Ah!hT6X%C8km2e5P&Il=-mixY2dhBme#T zG~%MyI>4##t!e|uxjbr1@!2(e_ozB=76BvQ(qFWcNJEt5eLo)XienmzFwP+cPY&?` zRW>`1pB;#5hqdMSOpRCTwUH_Bc+%ns^+3^dY6~-AYrxC*r-UhAI`o^*eCSLbwV|I6 z!aiK=!)xhWvIR0%lSs>uFI6zwknGF3C*D!Mm?{t{yfdw#jjWqRv5MoexUP?tZ)P2( zsbWg;M_JO~y|&Q8HQY7JO&f-Hji9X>6tJ)?_^V zU{_@{G+4U!y^h~paB6G86ZX6 zx+-W3j_?|X`g()nc*M!it@P)63>nzmJF?_#bbY$dqf#iaFIA0_?fR6%k6i_GJOr(E zz=KaMO$#AEn}*ke3r`NP)QnTyBIP(&c>Z0^3PXl}Z35SaE6>C3$P59ESV8=E*64cd zL5}$b@k0l@L-9PkvXrs2KGa@a;IVe+Y2C+(cjv7UCAI`cl&pPH?AI4X zq^><(Vfcc(c_V)xSi$q1b>I591I0`$f!^ml=lxx0?1LTQR;!Ptu62@}727?YIJr>_2by2dL7- z4Gb(b^64DEGEJa<8eW#)qq=`Or;T>?O7b^gPwSIS=fqS1ojV4YC<~u4zT3rFzDhkL zZ)53n)QKDJKfYCzs7A50VgQPVW_@bU#k>%@qfw3GT*%C4h`0;w$z23=45oM79b!2q zGTx0!XRPgke-T^X=6sn$oG(q>vkaDHkl+~1x$pkUR=s#yym{kkcJpOl)`w04G@vEF zgF@MG)?1YaK`c6RpY>~hXA-9!v<6|&NEC)4@0ShO_>6vHlg2MNsJr-lw5vWyY$n94 zWC&rcjp;iDyVMm6e(A*g!fk;rMVaf2!8=T@?X!fQCv7~e?Bvo7Gc_JT3`RVUCTIXM zqaS(9oZ6B_8f9u%<<+A0rX~D%a3>J>>l?@}@ykVnJzD^$L~3qX^S_A_YVB(27#RoK zcJQKk`Rha$4@#ka3j*0^e0tS|p^ulJz*s&~f|wXP!b{obS}eQAb~1W)9ptx&2zC(> zsSvcl_g}*2Q~vhAN!)J=R{CeN#kAI6sFJxw$gDNrKpn%!GJGo+UdLdwCx^EH zM9@*Sd!$b5)c+fDVTlZ!)yL2c_8-KwkNmx8My99m>DCq|jtQrwY}`*bHar(@(NT+N zN?)emCAOU?{G*ezD!V0}x$OGLhIi5EGjvcvm2y`5Xm>w|n_t{K7BzjyrHm$$HbRMe zBcTNm!7}sp>~S@M!@-Hug-0oR_ssX36iOrB^Telp2ld|zcL=+o8HJe#MHc*~=rljn zF2?P%H^NKP?DOZi8?EEn(;lHPIKxoN*`7QG$P?IWOGI;Uugx%}eu$sB%`GVQREiri z3^1{|0~g}tanbshb$VX1lq}r@-$XwLc6%UjgWsgZfjZk3G?fzGel%sl8|d3r-2fUKksqYm)wS4A1xb(P6t!}wr@tu@HA$u+=f56?F~wGdl;7yn zR8#9&9Z2;L2%rP12=be4U===n-lo~Mu8+(>Xh1;p`GP&|3}{JT;pg}vzyql8^}PsC zw1a!jY|8?-6?G<~#?d7|denbeID=6@=<&AAx9-RsXU>MGF3UFnph<{RsB6a*!CMfU zDRPV~Z{SWmLmS=!Oy@XXk#^ekojMQ3G)&d(D_)k_%hKD=CmDv-f^U)!3{gN^yu=6^P1xy%r3`KU2=lAbS*Sb*!AmY&$aErmY zXlJ;q-;jBhkRN;Ov-aNa4evmnZER(B$ks8<55`n(c&h$3X`9Yz9_L3F`&}?TR*qGi zofT%Fn7_=_wUx8dQX6*Byh?V&aIsAinUuYNRgkp>t?eH90w1@sm0%O0$>CCI**s4 z`k@63GH@U%w-fX-=DJxc?p^goUf86J=C^vIjYB@5<69<(^n zXTtk*prC6}<<6UTmA3YK3M(#z zBwG^+CI9`^N%@c8(p|?>Om%vOnop|v{z2q^i^#i>t&=|4n8_q~rq*_n)BIn4c30`0 z(xYq^(uZk*MeV(xoMN5hbNu?`GoA}@9Xm-(cCB{DxT8uQ=)huOMQke{sJoloh%g@D zKj8VFzhVNoHj7QxbH5_Y9hP0>g6#*)A44S>R{7tBbSSeDgcS>=6zkX>I_>Lwl4Ak8 ze_5B#D?xtq(1XnZGh~F#dE%h79m{vsi@T{*XMpEMB~;^JSh8Hn!X?)@6 zSxu${Z-4) zL_C5arzx!SH0H~X&HXBkKx5u(Sm#qd3J-{rFHlIbUwA#RPQktErvx>Z!j<+8LHQLLM9lV6LHdD=X+s{ ztv(Gj0{f*4W7=-7r77!|txtJ6Cc!Vz#ZtyJ{(z{Wx=Nj1a4b>w5q%xBF@S z4oX}IrNG!{W@L5a&p)4pOX1nWH+A19Sh9U z#Ga&H;BKLi;MwYGE`BINlaclC3{)y08+}~@l)}!tAhaGO>)}* z($2drDkQV6G^;wCHq40p4|1i)vEbf|<3aSYN+Z@*(yVVIwcZvB`pxhocOO{@%Cr_VlH4I-55;sik$RSk*cU+52-H3L zzigX%?EpA!0XX$}AHMPIHq`gB(P>2ha`(;J!w>+PRGO@)5zHnr!3b~`k}m+i&TC`W zvjsu_?;p?CN6~opd#wW9;dmwl)kOWHvsQX`*j5wEcgodJ|KHqeqc4HJ%->1&J-ZF< zOumTYX@X}jZj5$87$69P!ts3NdCxeNF))hp`1sputA6#(|8iBeyj@I-i=7mJSecet zCF+2=^E<5wv6Kjfz{!rQ+T?9*_QGy?cR0q$!EUMg&tFaeWI_;xfwJEX5dr|t58Yiw z&*dw>8YWH~T|dG_Z;XZrF_kfrczFvIH3B?;Ia!&8SvBf_t1?3&5KDvf|G+?h@AjHI{ORk z?FKlRHKv_SyR6fSX6k-^{k{Z718w_*Fi^sC(HrCZFj5m53IQl*D^v3{CPe_Jt)O&$ zK!Jn^ck@xp>;FkI71DT)$rfJ$2 zI{f4~YKE!~ARK=t6aw-#`+rf>u@0yMP!K-hqTlO2|8c=Jnub;6I=tpD0{vvPvQ!J z*hvvf{cKf&5d~y+Gf~&Hklb10i{2fMjY$Te%z(VDVQ*KP4>Bnf6_DEIZ7GD)PF$k= z2f$o(@>{rYkQs=jRIxcXDOydN3r>A-^-tg$;j(vw9~^g#`)6|}u1N$(ELWDWphSNElMp6tn| zv3$FRvWz>CHghCivt7=eTAopPDfP-us+5CBq9sSRRB+pdr z3t*pxfrP7JmaOTtT!AZc?9LB`VWN04$Tk(r1iklQQeh{Md*l2?D8CPId#wEe+p*(* zgS`V)2-u1Mqt67_v&FgSjg5??UO;_NMbBY7cHD2!*S-*NxkA7NzKT#zAm5>UQpvd~ zXpGY>!i(Mif3Tf;;_?`As(!OtG( zzAXfR{}k2NFE_EF5O*#B$^?-2{`}>{E2;B9ZI-ECSBc;J@hW$MKmX*tRO|!`aRNy= zDi;RwQ!$+Z%-(?{n+pU#_vVsM_ntgD2Jde$NsMTMx3$Nm>sU&B_VL4XR=(B~T6s>O zsk#LEGE1)lIwQyrP5?7I2xPuON7d14l?Wv~DxiKSYTywBSD&XXsJ_-2mFEQV3%xk5 z{j;xakC$KP-ShRUg~0VV-;`IqQJg^Tv{8Cj)28$bQM%R#YU8V8_UHCn)L#`)c~0OD zzw-_NsFw(Zn@-J=GA>b*lP)tS$mjLCCwzItPM%_>I$z+$GT*lpHi{ECnDA^_;;1pY zp2`?q&#tu3^Nae(yY`h=MV(fj6G-9EXCFUIfqbXNSLTcVuV2$_uR8uGY&n4$loQBb zZjn5|vg7|%FFc3M3A`SeX<|Agd#gEtd3gX|PJmw%s4g8NQ$0>9@#PVCf3cK`RrHsC zf4!PFwLs%u_Vkf-o)FU+2ZgzB6(^7ugwC`n4`6@H!55y&`x1y|N516zQ9X*~^V;&$ zLpt@lYZZFgyD8LMQyHU=EUJkb{yJ6X1b)j`==tE+i}{@i*|{$Q05J1LHu z^ADT2PvAS~8BY^cR!JYg$OA|ogZpv-?njpt|Jx^ri^TtLD(*iy*v0iIpBrF*r zRh1Ly%>&pT?M2T#{n9YwfAhZkod96Q`@AmQyDOAA=qUpt#Q@a_T{&{|0Q_a9GRAlc zr<_1-^X}*60jfA*Hmc4ERD1x+1K4=g!;X3Fmc<(=i$DKkWbAnU(>SjKilS&E6&*9L zBb+>d&2r)Q=zdwIE)@`n2c_E|r{rhRknKwkop#U~)= zk3J>0c?P`yjOQd6&ZpG|L!~rF0)}k`t&*0CCd*s2_Zw zG9Ue#>Tn_l?*q_I9#b^!Q0ssb(_J=zd0OCGX5U-TkHsi3mxYK zQf5%z)?VqCRl38B3hxv2yFl$H-@BIr`RD!fcmS`$+%3~?72^WH7f)YQ!bw|}lR6Le z_m7ASYD%kC*@1Vb5=Vfz`}WVv0r2!i-{ZTxo}hP#n~%_xF<75_>-+Prw=hx22k^!3 zW%2{QIKK>Uz#hx@3^Xor6JC{jutkQA%>%4E?#u+xKRoR79d`o7IRGDpyePNuw&Ve- zj@mDO_T55Jqwo3_#jCa>@b3wh*>2f+fK}nnGyvxV@Lvf9;KcKUyv!Fbr~CoGN3hS% zZD$cMosolTLE!aAK#c=ol+*`MQCI)ah{=T-pIy`pwmGL${jzFHk@%u&J;N|tP z>DcB0))a3v4`83w=f&5=6PRZX_;ud*18&=VJ^|$)d_P3t8=K0ua8Zg6kataafHFLP ze!WN@z}JsGZW#{37Jk(3O4V$!p74@Fx7ZwP1z^Lm6@U%LRsc2}TLIW`Yz1J$u@!&~ v$5sF~99sd{aBKx&!?6{B4aZghHXQ#4T$l*>l?l7A00000NkvXXu0mjfwl#9M 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 zcmc&&cQhMrxQCZ}u znOLRv3PG;lz4zR6|G59(Kc4qF-+ABXJ>Pl0bZco7Exz|5_uscs%tv{gKsiCu^EgIVsGI=|K~xn&1x z+)59P+u{re#kQ~W+q>Y)w9-H!5kGvmSaf|=WYl6nX%5#Yf0L8VfcfMcXUM6>018y@ zX>9khf=$IdpN;t}7XNM#u3byg9@EX$Y@*rVcf9=7Sn#Ir!Rgm@!al??HL~<1Dmtp> zpAs-MW6|qmVV@(`p(DxWp-!=Co9Y2-9(;Z<+Tzi7x-B<<0O-8<3N5}%LNIPauvV4| z?nmw+5$8Wopo){ScbVa7bu$I? z{ll(1Q0H7>e}7)5Pu0)cLbQ7z_+U)nJz(E><++9a>MsAWeByV_T3{I{a|4*4CaOVD zxCr-fPVaCy?_7=jsvT5KIYfv5cc$ADQ*ktP4Y{M7OKUB!gO7cFx9K!i5I%?T+7xUE zKI~8dfx+pA(nEJ%OmjzkMIM_heDZ2rYX3>obrJs2yo;36FVN=M0me%BvZ{2$u@cfo z98C77c9Yk9u$A66-t0Mcg>#rhxgzfcFPZ7iCPmo!b{gBFXspdc3Zi|}AYc|DWCe?C zL>`ZFe$^~B?)+9Bo|A1+>DBh9Wz_Gzh)~WPJL2<}CNR>(&l=6JikE zM&$It-f-!G{@#~#84lQInuELU`&mV4&3ef|LS_vKOg>mcS)oEUj4DR3*`R;&*N)kf|Sr!nJS02k$wFN0kesZ)w;|GGb zjPGg2YHBw~8D54=x>U`pw$ZFFq*X;aNN{`&$#lSmmQ6jJny$6A*2cVd0g z&2^dZ+9GG`xtq;&(_m{YY$*h66TOg#kNb68=qhboqH}a7)C;y4n*=Skau)=^lV`owf=@TW6MqLGsD`O zv~*-UvvKV4s{oB1=;oB=Gth+i>Cxt9%J0iQ+kz-1)L=U*W(LIQ;Yx4vGI(DHvU6pQ z8=(L4;L+v1$!o2TO55GyAZ!H&X^0qP8uQec0i3mwsKd!YLCeMUUEAW|DJQ4jvq5D??qgQw??^_Q8)^$y9F|bDI6{{VoSKoP@Z*eh(X6psiP0c;$8w>}Ux9L%&W5j?bO|>~j zz%FS0H-i<)wgBNN^o9;egniHRIFUWpoOW_J%ioTaXqxF+2r=VP>Q!LrH~dLinc$i& zRrI2xl+AT0^{?$vA|JiEiuFDJWFKH5_{XQ5(c0|v2dsr`-XhP-7Ml}G>!)k)u=*A` zhqk@YGRTF~rxvCj#Lu3nd!-bsO>$ZJY3>utX7Io6Co6^2E-*R9s?%B{)Le!^qlq~O z)${2tf@nJW>lXVexQyZrx%hq${>4*~*xKEpVnpUlwxdP)hl(#99b zQG@Dts}*x|xRqoh4Y2n>lZ8FU(2`!h0Kt_4F)n22g6+Zgk-p-$7eSq+NKL&DE_b*e z$`*!!vRE4pQS$GYahHcSX&o&UqvUweGAB-c8LQ@uz3Tbpc?M{#a%2-tch{B-o2mU+ zJoE9@O-!}mYxycpKQ)U>UNpWl_~Ps+=+^xVzi0?H%}tpfb%NaZ@C7*EkoXDul#cIf zD*R!Cr_)egi$4{uK}^_A$9>xxxFX%ynsOTkf@{3o25YM>?nL8NMn&M#0pwZ=BWb|) zyBwYtV#9#56FxXXB;NMKQr2-~4oYO(2%|wb2*QnteT}01KG;0h>rnpwVBH9duyOE=;8(7(%5PlR@F>m-Be=m!)N(t%&yHG5 zMR+%KzMYzBR&!dv((IzbAiKIITOvyM?$6C9mIUpaN|P+j1Lw(Wbkh(4v!d>}Jh=F# zP^*-}_KeT5siiBb1niq`((kb~)Kn~?B5eHa-A?3%C@4L|b8Kb|M{;wM!5(Cgs1$^M z=`2##%E>(jEu!!wh!HAPUU=809x1NXWCaJxi!f&80gW@MZi~9QyfM=g@_fe_tU+kRDde8^X6^C1AgFbvW#b-&Lz;Kj<@w!j!_5pkO3KJ>$$5C7&=tRA5~2*} zVuBh46!{^MMcqhcwb}A0^GwSw4NW|0{d75koayz6g^fbn-DGysmUKq*VNtgU1aS1? zOGx31e9aEEvkXPB2;;|eMzM?!Ym|KlfPlZU@RWRhoUW2mjqZa~x!r9$ub_K~3*uG*k~opcjdggHH=vOaZDuqF`Dab{C}xMX!sm9^A7^)D_U!kF+|td`*WvH zHBu&=e+X2(Rx#vHfHGNqA^Jstx*bWo<3V$DS5CNBGg>~GukKVwP2Eo(@3h$N?qq;* zl&TehAu#0;Y2*GA$ff175*^O(Uhe^;2iV}(sk z>3lH``Qe{NEp4H|YG<|e<(j}THprd}rJuxza)zT)G((GH(R+}aWZe!o2pM@oxLQ}qZkrM`}dcJKq?gzq95&jV#&42H^ z2}yfbaO=dE_LfX7Vkyt3vcY_bmNpc8c@U^JXuYo*9XNUY8*BEkPJFJEQ)5KZnlR5= zvXdAupLlfX9dH)gnh}~S*->;$X&^YE(BF1j{RVGO1Q~uGP{prO@{m#T{;=p(5F4f( zpppIiSTyt-fm@9;A@Zs3lEn`SF(o9JgqG{Cg`+TXqJ~(bvQ8ual8X_geGjwyL$DG@k*=7h+%2OFJqpWHR-2LE+cZS054_3v@cTw{vQ|Nixv6``Up}jt zbbVCpZ=G7Ng4aK zT>VvR1&io4Xvy;D6sm7wyNl{s0Zc+y94n_!XE`J^PjX6;MI_V_|4cpVsMD1PupC_@ z5k958V-F*x30c05uATj2f%~;hy|2J_-8nQg->%K~Q%A>jrqd#7%u)MtaQhcU05#xg z+E>N7Q2LB7;x7?Q1Ele;3e-uXV8`Y9P^k_kFb(O>p`)Xt4B3w_FBgazSd(G7#>vo@ zIdx*S`Ew|rEG+!x_bY~kzob0;b$HFTN1cMxw-lEJURYP3JS34n9a9sHsk3vZas!>b zb*86}VZZM{$*{2|L(dJxH8wmY?{1B-&bt+vcWiXhLC9gr7zk)hy&8%nZs$Mqg2A5c_mukYT0uY2TJU(nCe>8? zanB6cQoaS*7a4M4;xbfdXWCNVU2H2+8@9b(JM%HDdg3^}kM5zJDK@-Y>KyRah774e z7Uh}%OWo;VnCbs}WbfNxPaP?3EUAVO<8F+5N8ES!$EgReU#DjY@>?%!%nd+|6!_ik z_r8)+XFUEo{eF$m^*ZEW-?d>z#k+(3Eg+^mN41P*zxQ@74-|(TTy`7-@NE3dBk}iZ zNHvplgvSQg4ZvVdixkyB#?H8E1;t;C%lwLaOp324`bTNhpsQR10S|}k0RV*h8}x<5 zuPRHM-U&>NoZW^Kwd?a;utk9QegcH@C^o?2NvXFKy8zOEIJ+&wNV@;lm9uqt*_Lk*HveIo4 z{JUq@Z$awr2E{eb_J+r61i@rtXesYOv)hedJ%5l8A3XCjHKP3gXwx;`b>FuIF~6$0 zVT))|q#sqDLOg&^X~P;VEIq<_%G9-zGD{U^WmOi+ckJj+ZTd^KRr{x(9r7gcURK?J zi&aU$E2aEj9%``Dv2eE;ZB{&92q5%~zC3(I{Zir2Va!Kv!jLmX{}K9g#d$s6C~x%2 zeN@V7d{*zXB`}kec%a5WT|xn?8Z8KV{M9iXM#TC>t7_1Gwrny>5qQ>YGC@wRm(lCA zD!dKUpa!l)zS7~(k{k5mSdl$G^W6o;8JG|7#gPIXOA}n zYTQw$1=U7!27D*u?#REYrM+r$zEX-J6AU`q|15h~o0k8mGGCwjriQLp)>WQdfqz-3 z_Zuz0W7LTpDr8gh9<`KMXS=>SH8%#|+au-Y?H4esOgB>e(t9ElC4tEGe@c>n@}KLz zqk1tZS|fSAj*2C?xN%-wnxmaVn1vbmHgGsP%d(n(7) z8}RepWHIQ{E*l(GyhQFRj8LP4cp7Yq30)MpK7IF0ng+wV&{u1p!y3@9VQdtblixHi z*ex$6{1Kjk2pm8d8D8X) z$|l-+wg*M`tI+y2Z9uUtbARc!P12&Ui}p;Qs|A 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 040/141] 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 041/141] 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 042/141] 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 043/141] 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 044/141] 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 045/141] 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)]; From f315e99181528c920d28d2855a8697c9a00d4ccf Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Fri, 20 Sep 2024 13:12:30 -0400 Subject: [PATCH 046/141] Added gradle task for versioning and edited workflows (#1986) --- .github/workflows/auto-build.yml | 8 ++++---- .github/workflows/auto-publish.yml | 4 +--- gradle/scripts/publishing.gradle | 2 +- gradle/scripts/resources.gradle | 6 ++++++ 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/.github/workflows/auto-build.yml b/.github/workflows/auto-build.yml index afbfb56082..e96540aea7 100644 --- a/.github/workflows/auto-build.yml +++ b/.github/workflows/auto-build.yml @@ -35,10 +35,10 @@ jobs: - name: Get Version id: var run: | - MESSAGE=$(ls build/libs/* | grep dev.jar -v | grep sources.jar -v | grep slim.jar -v | awk -F 'gtceu-|-SNAPSHOT.jar' '{print $2}') - mv "build/libs/gtceu-$MESSAGE-SNAPSHOT.jar" "build/libs/gtceu-$MESSAGE-build_${{ github.run_number }}-SNAPSHOT.jar" - mv "build/libs/gtceu-$MESSAGE-SNAPSHOT-slim.jar" "build/libs/gtceu-$MESSAGE-build_${{ github.run_number }}-SNAPSHOT-slim.jar" - echo "version=$MESSAGE-build_${{ github.run_number }}" >> $GITHUB_OUTPUT + VER=$(./gradlew -q printVersion) + BUILD_VER=$VER-build_${{ github.run_number }} + for jar in ./build/libs/*; do mv "$jar" "${jar/${VER}-SNAPSHOT/${BUILD_VER}-SNAPSHOT}";done 2>/dev/null + echo "version=$BUILD_VER" >> $GITHUB_OUTPUT - name: Release id: release diff --git a/.github/workflows/auto-publish.yml b/.github/workflows/auto-publish.yml index dee32fe55e..8e24226eba 100644 --- a/.github/workflows/auto-publish.yml +++ b/.github/workflows/auto-publish.yml @@ -49,9 +49,7 @@ jobs: - if: ${{ inputs.publishCurseForgeAndModrinth }} name: Get Version id: var - run: | - MESSAGE=$(ls build/libs/* | grep dev.jar -v | grep sources.jar -v | grep shadow.jar -v | grep slim.jar -v | awk -F 'gtceu-|.jar' '{print $2}') - echo version=$MESSAGE >> $GITHUB_OUTPUT + run: echo "version=$(./gradlew -q printVersion)" >> $GITHUB_OUTPUT - if: ${{ inputs.publishCurseForgeAndModrinth }} name: mc-publish-forge diff --git a/gradle/scripts/publishing.gradle b/gradle/scripts/publishing.gradle index fe29446cc9..5579fc7767 100644 --- a/gradle/scripts/publishing.gradle +++ b/gradle/scripts/publishing.gradle @@ -9,7 +9,7 @@ publishing { mavenJava(MavenPublication) { groupId = project.maven_group artifactId = project.archivesBaseName - version = project.mod_version + version = project.version from components.java diff --git a/gradle/scripts/resources.gradle b/gradle/scripts/resources.gradle index a2e47c2257..77b7d60455 100644 --- a/gradle/scripts/resources.gradle +++ b/gradle/scripts/resources.gradle @@ -10,6 +10,12 @@ def mod_description = getConfig("mod_description") def mod_url = getConfig("mod_url") def mod_issue_tracker = getConfig("mod_issue_tracker") +task printVersion { + doLast { + println libs.versions.minecraft.get() + "-" + mod_version + } +} + // This block of code expands all declared replace properties in the specified resource targets. // A missing property will result in an error. Properties are expanded using ${} Groovy notation. var generateModMetadata = tasks.register("generateModMetadata", ProcessResources) { From c829115776ea4f52299603902de2a82bcc974582 Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Sat, 21 Sep 2024 04:55:10 -0400 Subject: [PATCH 047/141] Fixed recipe condition encoding (#1992) --- .../com/gregtechceu/gtceu/api/recipe/RecipeCondition.java | 2 +- .../gtceu/common/recipe/condition/DimensionCondition.java | 2 +- .../gtceu/data/recipe/builder/GTRecipeBuilder.java | 7 +++---- 3 files changed, 5 insertions(+), 6 deletions(-) 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 5a0b7c052b..e8d6ecdeb4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeCondition.java @@ -33,7 +33,7 @@ public abstract class RecipeCondition { public static < RC extends RecipeCondition> Products.P1, Boolean> isReverse(RecordCodecBuilder.Instance instance) { - return instance.group(Codec.BOOL.fieldOf("reverse").forGetter(val -> val.isReverse)); + return instance.group(Codec.BOOL.optionalFieldOf("reverse", false).forGetter(val -> val.isReverse)); } @Getter diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DimensionCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DimensionCondition.java index 931b4854d4..31226a2f17 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DimensionCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DimensionCondition.java @@ -103,7 +103,7 @@ public RecipeCondition createTemplate() { @Override public JsonObject serialize() { JsonObject config = super.serialize(); - config.addProperty("dim", dimension.toString()); + config.addProperty("dimension", dimension.toString()); return config; } 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 f20bc5bc6d..3292ec89e5 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 @@ -1084,10 +1084,9 @@ public void toJson(JsonObject json) { if (!conditions.isEmpty()) { JsonArray array = new JsonArray(); for (RecipeCondition condition : conditions) { - JsonObject cond = new JsonObject(); - cond.addProperty("type", GTRegistries.RECIPE_CONDITIONS.getKey(condition.getType())); - cond.add("data", condition.serialize()); - array.add(cond); + var condJson = condition.serialize(); + condJson.addProperty("type", GTRegistries.RECIPE_CONDITIONS.getKey(condition.getType())); + array.add(condJson); } json.add("recipeConditions", array); } From eb89f6ea33f5996e5d7d9bde93d222daec6c9536 Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Sat, 21 Sep 2024 21:36:53 -0400 Subject: [PATCH 048/141] Changed recipe decoding to not return immutables (#1995) --- gradle/scripts/publishing.gradle | 2 +- .../gtceu/api/codec/DispatchedMapCodec.java | 3 +-- .../gtceu/api/recipe/RecipeRunner.java | 26 +++++++++++-------- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/gradle/scripts/publishing.gradle b/gradle/scripts/publishing.gradle index 5579fc7767..44e01da103 100644 --- a/gradle/scripts/publishing.gradle +++ b/gradle/scripts/publishing.gradle @@ -21,7 +21,7 @@ publishing { repositories { // Add repositories to publish to here. maven { - url "https://maven.firstdarkdev.xyz/snapshots" + url "https://maven.gtceu.com" credentials { username System.getenv("MAVEN_USER") password System.getenv("MAVEN_PASS") diff --git a/src/main/java/com/gregtechceu/gtceu/api/codec/DispatchedMapCodec.java b/src/main/java/com/gregtechceu/gtceu/api/codec/DispatchedMapCodec.java index f5e2b7b968..7d8abeda93 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/codec/DispatchedMapCodec.java +++ b/src/main/java/com/gregtechceu/gtceu/api/codec/DispatchedMapCodec.java @@ -2,7 +2,6 @@ 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.*; @@ -44,7 +43,7 @@ public DataResult, T>> decode(final DynamicOps ops, final (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 Pair, T> pair = Pair.of(new Object2ObjectArrayMap<>(entries), input); final T errors = ops.createMap(failed.build()); return finalResult.map(ignored -> pair).setPartial(pair) diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeRunner.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeRunner.java index 599c2b861c..fb4c072e80 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeRunner.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeRunner.java @@ -110,17 +110,21 @@ private void fillContent(IRecipeCapabilityHolder holder, Map.Entry new ArrayList<>()).add(cont.content); + // Only roll if there's anything to roll for + if (!chancedContents.isEmpty()) { + int recipeTier = RecipeHelper.getPreOCRecipeEuTier(recipe); + int holderTier = holder.getChanceTier(); + var cache = this.chanceCaches.get(cap); + chancedContents = logic.roll(chancedContents, function, recipeTier, holderTier, cache, recipe.parallels, + cap); + + if (chancedContents == null) return; + for (Content cont : chancedContents) { + if (cont.slotName == null) { + this.content.content.add(cont.content); + } else { + this.content.slots.computeIfAbsent(cont.slotName, s -> new ArrayList<>()).add(cont.content); + } } } } From 09cf556b7e5a3daeb713f05df8c1c50207baac11 Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Sat, 21 Sep 2024 21:43:28 -0400 Subject: [PATCH 049/141] Update publishing.gradle (#1996) --- gradle/scripts/publishing.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/scripts/publishing.gradle b/gradle/scripts/publishing.gradle index 44e01da103..76e7650e0a 100644 --- a/gradle/scripts/publishing.gradle +++ b/gradle/scripts/publishing.gradle @@ -24,7 +24,7 @@ publishing { url "https://maven.gtceu.com" credentials { username System.getenv("MAVEN_USER") - password System.getenv("MAVEN_PASS") + password System.getenv("MAVEN_PASSWORD") } } } From 32397c0ed9acc15fe254002414fca14e717039e0 Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Sat, 21 Sep 2024 21:51:39 -0400 Subject: [PATCH 050/141] Fixed Publishing Workflows (#1997) --- .github/workflows/auto-build.yml | 2 +- .github/workflows/auto-publish.yml | 2 +- .github/workflows/changelog.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/auto-build.yml b/.github/workflows/auto-build.yml index e96540aea7..fbd05675b6 100644 --- a/.github/workflows/auto-build.yml +++ b/.github/workflows/auto-build.yml @@ -13,7 +13,7 @@ jobs: build: runs-on: ubuntu-latest env: - MAVEN_PASS: ${{ secrets.MAVEN_PASS }} + MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} MAVEN_USER: ${{ secrets.MAVEN_USER }} SNAPSHOT: true permissions: diff --git a/.github/workflows/auto-publish.yml b/.github/workflows/auto-publish.yml index 8e24226eba..5452b92798 100644 --- a/.github/workflows/auto-publish.yml +++ b/.github/workflows/auto-publish.yml @@ -27,7 +27,7 @@ jobs: build: runs-on: ubuntu-latest env: - MAVEN_PASS: ${{ secrets.MAVEN_PASS }} + MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} MAVEN_USER: ${{ secrets.MAVEN_USER }} permissions: contents: write diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index fe09d26cf6..674911db19 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -12,7 +12,7 @@ jobs: build: runs-on: ubuntu-latest env: - MAVEN_PASS: ${{ secrets.MAVEN_PASS }} + MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} MAVEN_USER: ${{ secrets.MAVEN_USER }} permissions: contents: write From 04e90efa3b6949a07a6bce74396d28b1a2fa9bf0 Mon Sep 17 00:00:00 2001 From: EasterFG <31056634+EasterFG@users.noreply.github.com> Date: Sun, 22 Sep 2024 12:46:34 +0800 Subject: [PATCH 051/141] fix MEInputHatch not showing tooltip (#1993) --- .../gui/widget/slot/AEConfigSlotWidget.java | 37 +++++++++++++------ .../widget/slot/AEItemConfigSlotWidget.java | 17 --------- 2 files changed, 25 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/widget/slot/AEConfigSlotWidget.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/widget/slot/AEConfigSlotWidget.java index 25066b3d5f..71c10c62e2 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/widget/slot/AEConfigSlotWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/widget/slot/AEConfigSlotWidget.java @@ -49,21 +49,34 @@ public AEConfigSlotWidget(Position pos, Size size, ConfigWidget widget, int inde public void drawInForeground(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { super.drawInForeground(graphics, mouseX, mouseY, partialTicks); IConfigurableSlot slot = this.parentWidget.getDisplay(this.index); - if (slot.getConfig() == null && mouseOverConfig(mouseX, mouseY)) { - List hoverStringList = new ArrayList<>(); - hoverStringList.add(Component.translatable("gtceu.gui.config_slot")); - if (parentWidget.isAutoPull()) { - hoverStringList.add(Component.translatable("gtceu.gui.config_slot.auto_pull_managed")); - } else { - if (!parentWidget.isStocking()) { - hoverStringList.add(Component.translatable("gtceu.gui.config_slot.set")); - hoverStringList.add(Component.translatable("gtceu.gui.config_slot.scroll")); + if (slot.getConfig() == null) { + if (mouseOverConfig(mouseX, mouseY)) { + List hoverStringList = new ArrayList<>(); + hoverStringList.add(Component.translatable("gtceu.gui.config_slot")); + if (parentWidget.isAutoPull()) { + hoverStringList.add(Component.translatable("gtceu.gui.config_slot.auto_pull_managed")); } else { - hoverStringList.add(Component.translatable("gtceu.gui.config_slot.set_only")); + if (!parentWidget.isStocking()) { + hoverStringList.add(Component.translatable("gtceu.gui.config_slot.set")); + hoverStringList.add(Component.translatable("gtceu.gui.config_slot.scroll")); + } else { + hoverStringList.add(Component.translatable("gtceu.gui.config_slot.set_only")); + } + hoverStringList.add(Component.translatable("gtceu.gui.config_slot.remove")); } - hoverStringList.add(Component.translatable("gtceu.gui.config_slot.remove")); + graphics.renderTooltip(Minecraft.getInstance().font, hoverStringList, Optional.empty(), mouseX, mouseY); + } + } else { + GenericStack item = null; + if (mouseOverConfig(mouseX, mouseY)) { + item = slot.getConfig(); + } else if (mouseOverStock(mouseX, mouseY)) { + item = slot.getStock(); + } + if (item != null) { + graphics.renderTooltip(Minecraft.getInstance().font, GenericStack.wrapInItemStack(item), mouseX, + mouseY); } - graphics.renderTooltip(Minecraft.getInstance().font, hoverStringList, Optional.empty(), mouseX, mouseY); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/widget/slot/AEItemConfigSlotWidget.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/widget/slot/AEItemConfigSlotWidget.java index f9ed18b26d..ab122dbfb5 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/widget/slot/AEItemConfigSlotWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/gui/widget/slot/AEItemConfigSlotWidget.java @@ -10,7 +10,6 @@ import com.lowdragmc.lowdraglib.utils.Position; import com.lowdragmc.lowdraglib.utils.Size; -import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.FriendlyByteBuf; @@ -88,22 +87,6 @@ private void drawSlots(GuiGraphics graphics, int mouseX, int mouseY, int x, int GuiTextures.SLOT_DARK.draw(graphics, mouseX, mouseY, x, y + 18, 18, 18); } - @OnlyIn(Dist.CLIENT) - @Override - public void drawInForeground(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - super.drawInForeground(graphics, mouseX, mouseY, partialTicks); - GenericStack item = null; - IConfigurableSlot slot = this.parentWidget.getDisplay(this.index); - if (mouseOverConfig(mouseX, mouseY)) { - item = slot.getConfig(); - } else if (mouseOverStock(mouseX, mouseY)) { - item = slot.getStock(); - } - if (item != null) { - graphics.renderTooltip(Minecraft.getInstance().font, GenericStack.wrapInItemStack(item), mouseX, mouseY); - } - } - @OnlyIn(Dist.CLIENT) @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { From 1ac9b94efc35679d5b2242ec04228c07f7307ca4 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Sat, 21 Sep 2024 22:48:15 -0600 Subject: [PATCH 052/141] Boiler Burnables, Chain Recipe and Crate Tags (#1998) --- .../gtceu/common/machine/storage/CrateMachine.java | 3 ++- .../gtceu/data/recipe/configurable/RecipeRemoval.java | 2 +- .../gregtechceu/gtceu/data/recipe/misc/FuelRecipes.java | 7 +++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java index 8b8df88dce..fcbe89b3f6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java @@ -127,12 +127,13 @@ public void onMachinePlaced(@Nullable LivingEntity player, ItemStack stack) { tag.remove("taped"); this.isTaped = false; } + stack.setTag(null); } @Override public void saveToItem(CompoundTag tag) { - IDropSaveMachine.super.saveToItem(tag); if (isTaped) { + IDropSaveMachine.super.saveToItem(tag); tag.putBoolean("taped", isTaped); tag.put("inventory", inventory.storage.serializeNBT()); } diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeRemoval.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeRemoval.java index 614abe84ed..9e44650774 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeRemoval.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeRemoval.java @@ -129,7 +129,6 @@ private static void hardIronRecipes(Consumer registry) { registry.accept(new ResourceLocation("minecraft:hopper")); registry.accept(new ResourceLocation("minecraft:iron_bars")); registry.accept(new ResourceLocation("minecraft:bucket")); - registry.accept(new ResourceLocation("minecraft:chain")); } private static void hardRedstoneRecipes(Consumer registry) { @@ -265,6 +264,7 @@ private static void hardMiscRecipes(Consumer registry) { registry.accept(new ResourceLocation("minecraft:brush")); registry.accept(new ResourceLocation("minecraft:recovery_compass")); registry.accept(new ResourceLocation("minecraft:spyglass")); + registry.accept(new ResourceLocation("minecraft:chain")); } private static void hardGlassRecipes(Consumer registry) { diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/FuelRecipes.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/FuelRecipes.java index 4a5177b97d..6f120c7a9d 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/FuelRecipes.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/FuelRecipes.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.data.recipe.misc; +import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.fluids.store.FluidStorageKeys; import com.gregtechceu.gtceu.utils.GTUtil; @@ -27,7 +28,8 @@ public static void init(Consumer provider) { Set addedItems = new HashSet<>(); for (var fuelEntry : FurnaceBlockEntity.getFuel().entrySet()) { addedItems.add(fuelEntry.getKey()); - STEAM_BOILER_RECIPES.recipeBuilder(BuiltInRegistries.ITEM.getKey(fuelEntry.getKey())) + var resLoc = BuiltInRegistries.ITEM.getKey(fuelEntry.getKey()); + STEAM_BOILER_RECIPES.recipeBuilder(GTCEu.id(resLoc.getNamespace() + "_" + resLoc.getPath())) .inputItems(fuelEntry.getKey()) .duration(fuelEntry.getValue() * 12) // remove the * 12 if SteamBoilerMachine:240 is uncommented .save(provider); @@ -35,7 +37,8 @@ public static void init(Consumer provider) { for (Item item : BuiltInRegistries.ITEM) { var burnTime = GTUtil.getItemBurnTime(item); if (burnTime > 0 && !addedItems.contains(item)) { - STEAM_BOILER_RECIPES.recipeBuilder(BuiltInRegistries.ITEM.getKey(item)) + var resLoc = BuiltInRegistries.ITEM.getKey(item); + STEAM_BOILER_RECIPES.recipeBuilder(GTCEu.id(resLoc.getNamespace() + "_" + resLoc.getPath())) .inputItems(item) .duration(burnTime * 12) .save(provider); From 2d15bb6c37c8163a780723c7a61876a1af2d40a9 Mon Sep 17 00:00:00 2001 From: Spicierspace153 Date: Sun, 22 Sep 2024 20:34:21 -0600 Subject: [PATCH 053/141] fixes parallel for alloy smelters (#2004) Co-authored-by: Spicierspace153 <21964509+Spicierspace153@users.noreply.github.com> --- .../com/gregtechceu/gtceu/common/data/GTRecipeModifiers.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeModifiers.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeModifiers.java index f935a43f1c..dbfa858207 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeModifiers.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeModifiers.java @@ -246,8 +246,6 @@ public static GTRecipe multiSmelterParallel(MetaMachine machine, @NotNull GTReci // double durationForParallel = Math.max(1.0, FURNACE_DURATION * 2 * parallel.getSecond() / Math.max(1, // maxParallel * 1.0)); - recipe = parallel.getFirst() == recipe ? parallel.getFirst().copy() : parallel.getFirst(); - int parallelValue = parallel.getSecond(); long eut = 4 * (parallelValue / 8) / coilMachine.getCoilType().getEnergyDiscount(); result.init(eut, Math.max(1, 256 * parallelValue / maxParallel), parallelValue, params.getOcAmount()); From 5b2c4afe780969853e60cdbacdb456aff3517ea4 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sun, 22 Sep 2024 23:23:39 -0400 Subject: [PATCH 054/141] Fix ME Pattern Buffer Proxies not having the hand animation when opening the GUI (#2005) --- .../ae2/machine/MEPatternBufferProxyPartMachine.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java index 2aee129f0d..aa3ada0532 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java @@ -14,6 +14,7 @@ import com.gregtechceu.gtceu.integration.ae2.machine.trait.MEPatternBufferProxyRecipeHandler; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; @@ -49,6 +50,7 @@ public class MEPatternBufferProxyPartMachine extends TieredIOPartMachine impleme @Persisted @Getter + @DescSynced private BlockPos bufferPos; public MEPatternBufferProxyPartMachine(IMachineBlockEntity holder) { @@ -114,7 +116,7 @@ public MetaMachine self() { @Override public boolean shouldOpenUI(Player player, InteractionHand hand, BlockHitResult hit) { var buffer = getBuffer(); - return buffer != null && super.shouldOpenUI(player, hand, hit); + return buffer != null; } @Override From ebad95f45d339fbaa0e0fa598b53ee9b2707900c Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Mon, 23 Sep 2024 01:46:35 -0600 Subject: [PATCH 055/141] Wirecutter/wrench tool sounds (#2006) --- .../com/gregtechceu/gtceu/api/item/tool/GTToolType.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolType.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolType.java index 6e80b727e6..3f189c7c38 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolType.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolType.java @@ -148,7 +148,7 @@ public class GTToolType { .attackDamage(1.0F).attackSpeed(-2.8F) .behaviors(BlockRotatingBehavior.INSTANCE, new EntityDamageBehavior(3.0F, IronGolem.class), ToolModeSwitchBehavior.INSTANCE)) - .sound(GTSoundEntries.WRENCH_TOOL) + .sound(GTSoundEntries.WRENCH_TOOL, true) .symbol('w') .build(); public static final GTToolType FILE = GTToolType.builder("file") @@ -164,7 +164,7 @@ public class GTToolType { .toolStats(b -> b.blockBreaking().crafting() .attackDamage(2.0F).attackSpeed(-2.4F) .sneakBypassUse().behaviors(RotateRailBehavior.INSTANCE)) - .sound(new ExistingSoundEntry(SoundEvents.ITEM_BREAK, SoundSource.BLOCKS)) + .sound(new ExistingSoundEntry(SoundEvents.ITEM_BREAK, SoundSource.BLOCKS), true) .symbol('c') .build(); public static final GTToolType SCREWDRIVER = GTToolType.builder("screwdriver") @@ -186,7 +186,7 @@ public class GTToolType { .harvestTag(TagUtil.createBlockTag("mineable/wire_cutter", false)) .toolStats(b -> b.blockBreaking().crafting().sneakBypassUse() .damagePerCraftingAction(4).attackDamage(-1.0F).attackSpeed(-2.4F)) - .sound(GTSoundEntries.WIRECUTTER_TOOL) + .sound(GTSoundEntries.WIRECUTTER_TOOL, true) .symbol('x') .build(); public static final GTToolType KNIFE = GTToolType.builder("knife") From 8ba38e19f13cf3fb7bab71a764ad933da28d4b4e Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Mon, 23 Sep 2024 14:49:10 -0600 Subject: [PATCH 056/141] I fix turbine (#2010) --- .../machine/multiblock/generator/LargeTurbineMachine.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 3aa735944d..33fca4e163 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 @@ -123,7 +123,7 @@ public static GTRecipe recipeModifier(MetaMachine machine, @NotNull GTRecipe rec recipe.ingredientActions, recipe.data, recipe.duration, recipe.isFuel); - result.init(-eut, recipe.duration, parallelResult.getSecond(), params.getOcAmount()); + result.init(-eut, recipe.duration, 1, params.getOcAmount()); return recipe; } From b147de9c94e33be3d142da870bb422b9f56436dd Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Mon, 23 Sep 2024 17:02:16 -0600 Subject: [PATCH 057/141] Fix Multi smelter not overclocking (#2008) --- .../gtceu/common/data/GTRecipeModifiers.java | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeModifiers.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeModifiers.java index dbfa858207..03bb1057e1 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeModifiers.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeModifiers.java @@ -2,6 +2,7 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.capability.IParallelHatch; +import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IRecipeCapabilityHolder; import com.gregtechceu.gtceu.api.data.medicalcondition.MedicalCondition; import com.gregtechceu.gtceu.api.machine.MetaMachine; @@ -12,6 +13,8 @@ import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; +import com.gregtechceu.gtceu.api.recipe.chance.logic.ChanceLogic; +import com.gregtechceu.gtceu.api.recipe.content.Content; import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; import com.gregtechceu.gtceu.api.recipe.logic.OCParams; import com.gregtechceu.gtceu.api.recipe.logic.OCResult; @@ -30,6 +33,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; import java.util.Optional; import java.util.function.BiFunction; import java.util.function.Function; @@ -243,17 +247,22 @@ public static GTRecipe multiSmelterParallel(MetaMachine machine, @NotNull GTReci var maxParallel = 32 * coilMachine.getCoilType().getLevel(); final int FURNACE_DURATION = 128; var parallel = GTRecipeModifiers.accurateParallel(machine, recipe, maxParallel, false); - // double durationForParallel = Math.max(1.0, FURNACE_DURATION * 2 * parallel.getSecond() / Math.max(1, - // maxParallel * 1.0)); int parallelValue = parallel.getSecond(); - long eut = 4 * (parallelValue / 8) / coilMachine.getCoilType().getEnergyDiscount(); - result.init(eut, Math.max(1, 256 * parallelValue / maxParallel), parallelValue, params.getOcAmount()); - /* - * recipe.duration = Math.max(1, 256 * parallelValue / maxParallel); - * recipe.tickInputs.put(EURecipeCapability.CAP, List.of(new Content(eut, - * ChanceLogic.getMaxChancedValue(), ChanceLogic.getMaxChancedValue(), 0, null, null))); - */ + long eut = 4 * Math.max(1, (parallelValue / 8) / coilMachine.getCoilType().getEnergyDiscount()); + int duration = (int) Math.max(1, FURNACE_DURATION * 2 * parallelValue / Math.max(1, maxParallel * 1.0)); + + recipe.duration = duration; + recipe.tickInputs.put(EURecipeCapability.CAP, List.of(new Content(eut, + ChanceLogic.getMaxChancedValue(), ChanceLogic.getMaxChancedValue(), + 0, null, null))); + + var re = RecipeHelper.applyOverclock(new OverclockingLogic((p, r, maxVoltage) -> { + OverclockingLogic.NON_PERFECT_OVERCLOCK.getLogic() + .runOverclockingLogic(params, result, maxVoltage); + }), recipe, coilMachine.getOverclockVoltage(), params, result); + recipe = recipe.copy(ContentModifier.multiplier(parallelValue), false); + return recipe; } return null; From 0acd903a7e62e5ca33ef852225e013ef44db0ac9 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Mon, 23 Sep 2024 17:14:22 -0600 Subject: [PATCH 058/141] Optimized voltage tier lookups (#2007) --- .../com/gregtechceu/gtceu/api/GTValues.java | 12 ++++++- .../WorkableElectricMultiblockMachine.java | 3 +- .../gtceu/api/recipe/RecipeHelper.java | 4 +-- .../com/gregtechceu/gtceu/utils/GTUtil.java | 31 ++++++++++--------- 4 files changed, 29 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/GTValues.java b/src/main/java/com/gregtechceu/gtceu/api/GTValues.java index a578c17d0d..a69521b6ee 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/GTValues.java +++ b/src/main/java/com/gregtechceu/gtceu/api/GTValues.java @@ -55,7 +55,7 @@ public class GTValues { * The Voltage Tiers. Use this Array instead of the old named Voltage Variables */ public static final long[] V = new long[] { 8, 32, 128, 512, 2048, 8192, 32768, 131072, 524288, 2097152, 8388608, - 33554432, 134217728, 536870912, Integer.MAX_VALUE }; + 33554432, 134217728, 536870912, 2147483648L }; /** * The Voltage Tiers divided by 2. @@ -75,6 +75,15 @@ public class GTValues { public static final int[] VHA = { 7, 16, 60, 240, 960, 3840, 15360, 61440, 245760, 983040, 3932160, 15728640, 62914560, 251658240, 1006632960 }; + /** + * The Voltage Tiers. Use this Array instead of the old named Voltage Variables + */ + public static final long[] VEX = new long[] { 8, 32, 128, 512, 2048, 8192, 32768, 131072, 524288, 2097152, 8388608, + 33554432, 134217728, 536870912, 2147483648L, 8589934592L, 34359738368L, 137438953472L, 549755813888L, + 2199023255552L, 8796093022208L, 35184372088832L, 140737488355328L, 562949953421312L, 2251799813685248L, + 9007199254740992L, 36028797018963968L, 144115188075855872L, 576460752303423488L, 2305843009213693952L, + Long.MAX_VALUE }; + public static final int ULV = 0; public static final int LV = 1; public static final int MV = 2; @@ -90,6 +99,7 @@ public class GTValues { public static final int UXV = 12; public static final int OpV = 13; public static final int MAX = 14; + public static final int MAX_TRUE = 30; public static final int[] ALL_TIERS = new int[] { ULV, LV, MV, HV, EV, IV, LuV, ZPM, UV, UHV, UEV, UIV, UXV, OpV, MAX }; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java index 15c8109cfa..e518d25895 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java @@ -172,8 +172,7 @@ public long getOverclockVoltage() { if (amperage == 1) { // amperage is 1 when the energy is not exactly on a tier // the voltage for recipe search is always on tier, so take the closest lower tier - if (voltage > Integer.MAX_VALUE) return GTUtil.getVoltageFromFakeTier(GTUtil.getFakeVoltageTier(voltage)); - return GTValues.V[GTUtil.getFloorTierByVoltage(voltage)]; + return GTValues.VEX[GTUtil.getFloorTierByVoltage(voltage)]; } else { // amperage != 1 means the voltage is exactly on a tier // ignore amperage, since only the voltage is relevant for recipe search diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java index 75550ea8e9..565abf70d9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java @@ -91,14 +91,12 @@ public static GTRecipe applyOverclock(OverclockingLogic logic, @NotNull GTRecipe * Then performs overclocking on the Recipe. * * @param recipe the recipe to overclock - * @return an int array of {OverclockedEUt, OverclockedDuration} */ public static void performOverclocking(OverclockingLogic logic, @NotNull GTRecipe recipe, long EUt, long maxOverclockVoltage, @NotNull OCParams params, @NotNull OCResult result) { int recipeTier = GTUtil.getTierByVoltage(EUt); - int maximumTier = maxOverclockVoltage < Integer.MAX_VALUE ? logic.getOverclockForTier(maxOverclockVoltage) : - GTUtil.getFakeVoltageTier(maxOverclockVoltage); + int maximumTier = logic.getOverclockForTier(maxOverclockVoltage); // The maximum number of overclocks is determined by the difference between the tier the recipe is running at, // and the maximum tier that the machine can overclock to. int numberOfOCs = maximumTier - recipeTier; diff --git a/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java b/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java index 81be0cd92e..9f20eec2e2 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java @@ -41,7 +41,6 @@ import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.Tags; -import com.google.common.math.LongMath; import com.mojang.blaze3d.platform.InputConstants; import com.mojang.datafixers.util.Pair; import org.jetbrains.annotations.NotNull; @@ -197,22 +196,17 @@ public static int nearestLesser(@NotNull long[] array, long value) { * tier that can handle it, {@code MAX} is returned. */ public static byte getTierByVoltage(long voltage) { - // Yes, yes we do need UHV+. - return (byte) Math.min(GTValues.MAX, nearestLesser(GTValues.V, voltage) + 1); - } - - public static int getFakeVoltageTier(long voltage) { - long a = voltage; - int b = 0; - while (a / 4L >= 8L) { - b++; - a /= 4L; + if (voltage > Integer.MAX_VALUE) { + return GTValues.MAX; } - return b; + return getOCTierByVoltage(voltage); } - public static long getVoltageFromFakeTier(int tier) { - return LongMath.pow(4L, tier + 1) * 2; + public static byte getOCTierByVoltage(long voltage) { + if (voltage <= GTValues.V[GTValues.ULV]) { + return GTValues.ULV; + } + return (byte) ((62 - Long.numberOfLeadingZeros(voltage - 1)) >> 1); } /** @@ -222,7 +216,14 @@ public static long getVoltageFromFakeTier(int tier) { * {@code ULV} if there's no tier below */ public static byte getFloorTierByVoltage(long voltage) { - return (byte) Math.max(GTValues.ULV, nearestLesserOrEqual(GTValues.V, voltage)); + if (voltage < GTValues.V[GTValues.ULV]) { + return GTValues.ULV; + } + if (voltage == GTValues.VEX[GTValues.MAX_TRUE]) { + return GTValues.MAX_TRUE; + } + + return (byte) ((60 - Long.numberOfLeadingZeros(voltage - 1)) >> 1); } public static ItemStack copy(ItemStack... stacks) { From 1a23c4ebf99e52057198cb511384acfa9ceb247d Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Mon, 23 Sep 2024 21:05:11 -0400 Subject: [PATCH 059/141] 1.4.2 Release (#2011) --- .github/workflows/auto-publish.yml | 2 +- RELEASE.md | 34 ++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 RELEASE.md diff --git a/.github/workflows/auto-publish.yml b/.github/workflows/auto-publish.yml index 5452b92798..d531bc1dcd 100644 --- a/.github/workflows/auto-publish.yml +++ b/.github/workflows/auto-publish.yml @@ -75,7 +75,7 @@ jobs: name: GregTechCEu ${{ steps.var.outputs.version }} version: mc${{ steps.var.outputs.version }} version-type: ${{ inputs.releaseType }} - changelog-file: CHANGELOG.* + changelog-file: RELEASE.* loaders: | forge diff --git a/RELEASE.md b/RELEASE.md new file mode 100644 index 0000000000..40f3213df7 --- /dev/null +++ b/RELEASE.md @@ -0,0 +1,34 @@ +## What's Changed + +### Added +- Compressor recipe for snowballs to snow blocks ([#1969](https://github.com/GregTechCEu/GregTech-Modern/pull/1969)) +- Rubber Wood and Treated Wood boats ([#1980](https://github.com/GregTechCEu/GregTech-Modern/pull/1980)) + +### Fixed +- Coke Oven Hatches are now able to be automated again ([#1948](https://github.com/GregTechCEu/GregTech-Modern/pull/1948)) +- All sounds are now mono-audio (you will no longer be haunted by the global Research Station sound) ([#1966](https://github.com/GregTechCEu/GregTech-Modern/pull/1966)) +- Fixed Large Turbine logic which stopped them from running properly ([#1983](https://github.com/GregTechCEu/GregTech-Modern/pull/1983) and [#2010](https://github.com/GregTechCEu/GregTech-Modern/pull/2010)) +- Machine auto-export will now respect attached filter covers ([#1982](https://github.com/GregTechCEu/GregTech-Modern/pull/1982)) +- Quantum Tanks will no longer void fluids that don't match the stored fluid ([#1976](https://github.com/GregTechCEu/GregTech-Modern/pull/1976)) +- Quantum Chests will now properly drop items if your inventory is full rather than just voiding them ([#1976](https://github.com/GregTechCEu/GregTech-Modern/pull/1976)) +- The Multi Smelter now applies overclocks properly ([#2004](https://github.com/GregTechCEu/GregTech-Modern/pull/2004) and [#2008](https://github.com/GregTechCEu/GregTech-Modern/pull/2008)) +- ME Pattern Buffer Proxies now show a hand animation when opened ([#2005](https://github.com/GregTechCEu/GregTech-Modern/pull/2005)) +- Fixed ME parts not showing tooltips ([#1993](https://github.com/GregTechCEu/GregTech-Modern/pull/1993)) +- Rubber log variants now have the burnable tag ([#1914](https://github.com/GregTechCEu/GregTech-Modern/pull/1914)) +- Fixed solid boilers not being able to burn some vanilla furnace fuels ([#1998](https://github.com/GregTechCEu/GregTech-Modern/pull/1998)) +- Various texture fixes ([#1974](https://github.com/GregTechCEu/GregTech-Modern/pull/1974)) +- Other miscellaneous fixes + +### Changed +- **ADDON DEVS:** Recipe Conditions and the GTRegistry class have changed slightly - please take note ([#1955](https://github.com/GregTechCEu/GregTech-Modern/pull/1955)) +- **ADDON DEVS:** We now publish to the official GTCEu Maven - check the updated README for further information +- Chanced outputs for parallel recipes are now deterministic and guaranteed a minimum amount ([#1948](https://github.com/GregTechCEu/GregTech-Modern/pull/1948)) +- The highlight grid for tools and covers will now only appear if a possible interaction exists ([#1949](https://github.com/GregTechCEu/GregTech-Modern/pull/1949)) +- Optical Pipes can now hold covers ([#1953](https://github.com/GregTechCEu/GregTech-Modern/pull/1953)) + + +### Removed +- Covers that have no plan to be implemented have been removed ([#1961](https://github.com/GregTechCEu/GregTech-Modern/pull/1961)) + +\ +**Full Changelog found [here](https://github.com/GregTechCEu/GregTech-Modern/compare/1.20.1-1.4.1+patch.2...1.20.1-1.4.2)** \ No newline at end of file From 0eb17698c1db593eb059a35fbf7f3f574d4a698b Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Mon, 23 Sep 2024 21:52:29 -0400 Subject: [PATCH 060/141] Version bump to 1.4.3 (#2014) --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 722d880041..e4d6257a80 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs = -Xmx6G # Mod Info mod_id = gtceu mod_name = GregTech -mod_version = 1.4.2 +mod_version = 1.4.3 mod_description = GregTech CE Unofficial, ported from 1.12.2 mod_license = LGPL-3.0 license mod_url = https://github.com/GregTechCEu/GregTech-Modern/ From 54bc84838bc54a2c9bfb392525c342ac0adc8f14 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Tue, 24 Sep 2024 09:31:41 -0600 Subject: [PATCH 061/141] fix off by one in oc finding (#2019) --- src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java b/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java index 9f20eec2e2..3a065f4742 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java @@ -223,7 +223,7 @@ public static byte getFloorTierByVoltage(long voltage) { return GTValues.MAX_TRUE; } - return (byte) ((60 - Long.numberOfLeadingZeros(voltage - 1)) >> 1); + return (byte) ((60 - Long.numberOfLeadingZeros(voltage)) >> 1); } public static ItemStack copy(ItemStack... stacks) { From ad1113c5a960af788ff675b3bc67005e61d25630 Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Tue, 24 Sep 2024 17:27:05 -0400 Subject: [PATCH 062/141] Fix KubeJS deserialization for conditions (#2022) --- .../integration/kjs/recipe/components/GTRecipeComponents.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 fc2524b1a2..6bc51fa278 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 @@ -207,7 +207,7 @@ public RecipeCondition read(RecipeJS recipe, Object from) { if (type != null) { RecipeCondition condition = type.factory.createDefault(); if (condition != null) { - return condition.deserialize(GsonHelper.getAsJsonObject(jsonObject, "data", new JsonObject())); + return condition.deserialize(jsonObject); } } } else if (from instanceof Tag tag) { From c5764e576ee8e34ecf9ca351b65f6056588df3d6 Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Tue, 24 Sep 2024 19:29:05 -0400 Subject: [PATCH 063/141] Fix standard OC modifier for EUt outputs (#2023) --- .../java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java index 565abf70d9..11a0349b0b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java @@ -81,7 +81,7 @@ public static GTRecipe applyOverclock(OverclockingLogic logic, @NotNull GTRecipe } EUt = getOutputEUt(recipe); if (EUt > 0) { - performOverclocking(logic, recipe, EUt, maxOverclockVoltage, params, result); + performOverclocking(logic, recipe, -EUt, maxOverclockVoltage, params, result); } return recipe; } @@ -95,7 +95,7 @@ public static GTRecipe applyOverclock(OverclockingLogic logic, @NotNull GTRecipe public static void performOverclocking(OverclockingLogic logic, @NotNull GTRecipe recipe, long EUt, long maxOverclockVoltage, @NotNull OCParams params, @NotNull OCResult result) { - int recipeTier = GTUtil.getTierByVoltage(EUt); + int recipeTier = GTUtil.getTierByVoltage(Math.abs(EUt)); int maximumTier = logic.getOverclockForTier(maxOverclockVoltage); // The maximum number of overclocks is determined by the difference between the tier the recipe is running at, // and the maximum tier that the machine can overclock to. From 089dc2e9e9ca2484df374efc182a1f19a09d4cd8 Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Tue, 24 Sep 2024 19:56:34 -0400 Subject: [PATCH 064/141] 1.4.3 Release (#2025) --- RELEASE.md | 33 +++------------------------------ 1 file changed, 3 insertions(+), 30 deletions(-) diff --git a/RELEASE.md b/RELEASE.md index 40f3213df7..518d151488 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,34 +1,7 @@ ## What's Changed -### Added -- Compressor recipe for snowballs to snow blocks ([#1969](https://github.com/GregTechCEu/GregTech-Modern/pull/1969)) -- Rubber Wood and Treated Wood boats ([#1980](https://github.com/GregTechCEu/GregTech-Modern/pull/1980)) - ### Fixed -- Coke Oven Hatches are now able to be automated again ([#1948](https://github.com/GregTechCEu/GregTech-Modern/pull/1948)) -- All sounds are now mono-audio (you will no longer be haunted by the global Research Station sound) ([#1966](https://github.com/GregTechCEu/GregTech-Modern/pull/1966)) -- Fixed Large Turbine logic which stopped them from running properly ([#1983](https://github.com/GregTechCEu/GregTech-Modern/pull/1983) and [#2010](https://github.com/GregTechCEu/GregTech-Modern/pull/2010)) -- Machine auto-export will now respect attached filter covers ([#1982](https://github.com/GregTechCEu/GregTech-Modern/pull/1982)) -- Quantum Tanks will no longer void fluids that don't match the stored fluid ([#1976](https://github.com/GregTechCEu/GregTech-Modern/pull/1976)) -- Quantum Chests will now properly drop items if your inventory is full rather than just voiding them ([#1976](https://github.com/GregTechCEu/GregTech-Modern/pull/1976)) -- The Multi Smelter now applies overclocks properly ([#2004](https://github.com/GregTechCEu/GregTech-Modern/pull/2004) and [#2008](https://github.com/GregTechCEu/GregTech-Modern/pull/2008)) -- ME Pattern Buffer Proxies now show a hand animation when opened ([#2005](https://github.com/GregTechCEu/GregTech-Modern/pull/2005)) -- Fixed ME parts not showing tooltips ([#1993](https://github.com/GregTechCEu/GregTech-Modern/pull/1993)) -- Rubber log variants now have the burnable tag ([#1914](https://github.com/GregTechCEu/GregTech-Modern/pull/1914)) -- Fixed solid boilers not being able to burn some vanilla furnace fuels ([#1998](https://github.com/GregTechCEu/GregTech-Modern/pull/1998)) -- Various texture fixes ([#1974](https://github.com/GregTechCEu/GregTech-Modern/pull/1974)) -- Other miscellaneous fixes - -### Changed -- **ADDON DEVS:** Recipe Conditions and the GTRegistry class have changed slightly - please take note ([#1955](https://github.com/GregTechCEu/GregTech-Modern/pull/1955)) -- **ADDON DEVS:** We now publish to the official GTCEu Maven - check the updated README for further information -- Chanced outputs for parallel recipes are now deterministic and guaranteed a minimum amount ([#1948](https://github.com/GregTechCEu/GregTech-Modern/pull/1948)) -- The highlight grid for tools and covers will now only appear if a possible interaction exists ([#1949](https://github.com/GregTechCEu/GregTech-Modern/pull/1949)) -- Optical Pipes can now hold covers ([#1953](https://github.com/GregTechCEu/GregTech-Modern/pull/1953)) - - -### Removed -- Covers that have no plan to be implemented have been removed ([#1961](https://github.com/GregTechCEu/GregTech-Modern/pull/1961)) +- Multiblock machines now calculate their tier correctly ([#2019](https://github.com/GregTechCEu/GregTech-Modern/pull/2019)) +- Recipe fixes 🔥 ([#2022](https://github.com/GregTechCEu/GregTech-Modern/pull/2022) and [#2023](https://github.com/GregTechCEu/GregTech-Modern/pull/2023)) -\ -**Full Changelog found [here](https://github.com/GregTechCEu/GregTech-Modern/compare/1.20.1-1.4.1+patch.2...1.20.1-1.4.2)** \ No newline at end of file +**Full Changelog found [here](https://github.com/GregTechCEu/GregTech-Modern/compare/1.20.1-1.4.2...1.20.1-1.4.3)** \ No newline at end of file From e3844ba943e2388c0856617ae4f8b473a0ae1b64 Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Tue, 24 Sep 2024 19:57:29 -0400 Subject: [PATCH 065/141] Version bump to 1.4.4 (#2027) --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index e4d6257a80..a39c79f3ee 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs = -Xmx6G # Mod Info mod_id = gtceu mod_name = GregTech -mod_version = 1.4.3 +mod_version = 1.4.4 mod_description = GregTech CE Unofficial, ported from 1.12.2 mod_license = LGPL-3.0 license mod_url = https://github.com/GregTechCEu/GregTech-Modern/ From cb82c66cc278ec132a03eea1edaf66c8bce570bc Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Tue, 24 Sep 2024 21:04:57 -0400 Subject: [PATCH 066/141] Version bump to 1.4.5 (#2029) --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index a39c79f3ee..b9016ca249 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs = -Xmx6G # Mod Info mod_id = gtceu mod_name = GregTech -mod_version = 1.4.4 +mod_version = 1.4.5 mod_description = GregTech CE Unofficial, ported from 1.12.2 mod_license = LGPL-3.0 license mod_url = https://github.com/GregTechCEu/GregTech-Modern/ From 5e2f192b1990ec5e0f8293b1a1d30be6d00c6f13 Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Thu, 26 Sep 2024 13:38:28 -0400 Subject: [PATCH 067/141] README changes (#2033) --- README.md | 45 +++++++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index feb68c2f6b..579a95af16 100644 --- a/README.md +++ b/README.md @@ -11,18 +11,39 @@ GitHub -## Documentation / Wiki -[`Wiki`](https://gregtechceu.github.io/gtceu-modern-docs/) - - -## Dev Q&A -* [Todo List](https://github.com/GregTechCEu/GregTechCEu-1.19/issues/125) for potential contributors who are interested in this project -* [Dev Q&A](https://github.com/GregTechCEu/GregTechCEu-1.19/wiki/Dev-Q&A) illustrates common questions and answers related to development. - -## -## IDE Requirements (when using IntelliJ IDEA) - -For developing this mod, the [Lombok plugin](https://plugins.jetbrains.com/plugin/6317-lombok) for IntelliJ IDEA is strictly required. +### [Wiki](https://gregtechceu.github.io/gtceu-modern-docs/) + +## Developers + +To add GTCEu: Modern (GTM) to your project as a dependency, add the following to your `build.gradle`: +```groovy +repositories { + maven { + name = 'GTCEu Maven' + url = 'https://maven.gtceu.com' + content { + includeGroup 'com.gregtechceu.gtceu' + } + } +} +``` +Then, you can add it as a dependency, with `${mc_version}` being your Minecraft version target and `${gtm_version}` being the version of GTM you want to use. +```groovy +dependencies { + // Forge (see below block as well if you use Forge Gradle) + implementation fg.deobf("com.gregtechceu.gtceu:gtceu-${mc_version}:${gtm_version}") + + // NeoForge + implementation "com.gregtechceu.gtceu:gtceu-${mc_version}:${gtm_version}" + + // Architectury + modImplementation "com.gregtechceu.gtceu:gtceu-${mc_version}:${gtm_version}" +} +``` + +### IDE Requirements (when using IntelliJ IDEA) + +For contributing to this mod, the [Lombok plugin](https://plugins.jetbrains.com/plugin/6317-lombok) for IntelliJ IDEA is strictly required. Additionally, the [Minecraft Development plugin](https://plugins.jetbrains.com/plugin/8327-minecraft-development) is recommended. From ce41df161f689d6daeb284027939e1d9e7be901b Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Thu, 26 Sep 2024 22:02:16 +0300 Subject: [PATCH 068/141] add some actions that'll come in handy later (#2034) --- .github/workflows/clean.yml | 22 +++++++++++++++ .github/workflows/manage-pr-labels.yml | 39 ++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 .github/workflows/clean.yml create mode 100644 .github/workflows/manage-pr-labels.yml diff --git a/.github/workflows/clean.yml b/.github/workflows/clean.yml new file mode 100644 index 0000000000..c18a35af0a --- /dev/null +++ b/.github/workflows/clean.yml @@ -0,0 +1,22 @@ +name: Clean Gradle + +on: + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + with: + submodules: true + + - name: Setup Build + uses: ./.github/actions/build_setup + with: + update-cache: true + + - name: Clean + run: ./gradlew clean --build-cache diff --git a/.github/workflows/manage-pr-labels.yml b/.github/workflows/manage-pr-labels.yml new file mode 100644 index 0000000000..7dcddd620b --- /dev/null +++ b/.github/workflows/manage-pr-labels.yml @@ -0,0 +1,39 @@ +# Manages labels on PRs before allowing merging +name: Pull Request Labels + +on: + pull_request: + types: + - opened + - labeled + - unlabeled + - synchronize + +# if a second commit is pushed quickly after the first, cancel the first one's build +concurrency: + group: pr-labels-${{ github.head_ref }} + cancel-in-progress: true + +jobs: + Labels: + runs-on: ubuntu-latest + + permissions: + pull-requests: read # needed to utilize required-labels + + steps: + - name: Check for Merge-Blocking Labels # blocks merge if present + uses: mheap/github-action-required-labels@v5 + with: + mode: exactly + count: 0 + labels: 'status: do not merge' + exit_type: failure + + - name: Check for Required Labels # require at least one of these labels + uses: mheap/github-action-required-labels@v5 + with: + mode: minimum + count: 1 + labels: 'type: feature, type: bug, type: refactor, type: translation, ignore changelog' + exit_type: failure From 12462d69e5f60a2b43e753d2c63f4ec68479b5ba Mon Sep 17 00:00:00 2001 From: marisathewitch Date: Thu, 26 Sep 2024 23:03:47 +0400 Subject: [PATCH 069/141] Update for ru_RU (#2031) Co-authored-by: Western01 Co-authored-by: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> --- .../resources/assets/gtceu/lang/ru_ru.json | 116 ++++++++++++++++-- 1 file changed, 104 insertions(+), 12 deletions(-) diff --git a/src/main/resources/assets/gtceu/lang/ru_ru.json b/src/main/resources/assets/gtceu/lang/ru_ru.json index 125c39813a..cdbaa1028a 100644 --- a/src/main/resources/assets/gtceu/lang/ru_ru.json +++ b/src/main/resources/assets/gtceu/lang/ru_ru.json @@ -598,7 +598,7 @@ "block.gtceu.lv_output_hatch": "§7Жидкостный выходной люк (LV)§r", "block.gtceu.lv_packer": "Обычный упаковщик §r", "block.gtceu.lv_polarizer": "Обычный поляризатор §r", - "block.gtceu.lv_pump": "Обычная пампа §r", + "block.gtceu.lv_pump": "Обычная помпа §r", "block.gtceu.lv_rock_crusher": "Обычный камнелом §r", "block.gtceu.lv_sifter": "Обычный просеиватель §r", "block.gtceu.lv_steam_turbine": "Обычная паровая турбина §r", @@ -627,8 +627,8 @@ "block.gtceu.max_machine_hull": "Оболочка машины (§c§iMAX§r)", "block.gtceu.max_output_bus": "Предметный выходной люк (§c§lMAX§r)", "block.gtceu.max_output_hatch": "Жидкостный выходной люк (§c§lMAX§r)", - "block.gtceu.me_input_bus": "ME Накопительный предметный люк", - "block.gtceu.me_input_hatch": "ME Накопительный жидкостный люк", + "block.gtceu.me_input_bus": "ME предметный люк", + "block.gtceu.me_input_hatch": "ME жидкостный люк", "block.gtceu.me_output_bus": "ME Выходной предметный люк", "block.gtceu.me_output_hatch": "ME Выходной жидкостный люк", "block.gtceu.mega_blast_furnace": "Карусельная печь", @@ -2913,7 +2913,7 @@ "gtceu.multiblock.fusion_reactor.uv.description": "Термоядерный реактор модель 3 - это большая многоблочная структура использующаяся для термоядерного синтеза двух элементов в один. Может использовать UV+ энерг. разъемы. За каждый энерг. разъём, внутренний буфер увеличивается на 40млн. EU, максимум энергии для старта 640млн. EU.", "gtceu.multiblock.fusion_reactor.zpm.description": "Термоядерный реактор модель 2 - это большая многоблочная структура использующаяся для термоядерного синтеза двух элементов в один. Может использовать ZPM+ энерг. разъемы. За каждый энерг. разъём, внутренний буфер увеличивается на 20млн. EU, максимум энергии для старта 320млн. EU.", "gtceu.multiblock.generation_eu": "Генерирует:§a%s EU/t", - "gtceu.multiblock.idling": "Холостой ход.", + "gtceu.multiblock.idling": "§6Холостой ход.", "gtceu.multiblock.implosion_compressor.description": "Детонационный компрессор - это многоблочная структура, в которой используются взрывчатые вещества для превращения пыли в соответствующие камни.", "gtceu.multiblock.invalid_structure": "Неверная структура.", "gtceu.multiblock.invalid_structure.tooltip": "Этот блок является контроллером многоблочной структуры. для получения справки по созданию см. шаблон структуры в JEI.", @@ -3168,7 +3168,7 @@ "gtceu.universal.tooltip.requires_redstone": "§4Требуется сигнал Красного камня", "gtceu.universal.tooltip.silk_touch": "Шелковое касание: ", "gtceu.universal.tooltip.terrain_resist": "Эта машина не взорвется", - "gtceu.universal.tooltip.uses_per_hour_lubricant": "Использует §f%d мВ/ч §7Смазки когда работает", + "gtceu.universal.tooltip.uses_per_hour_lubricant": "Использует §f%d мВ/ч §6Смазки §7когда работает", "gtceu.universal.tooltip.uses_per_op": "Использует §f%d EU/операцию", "gtceu.universal.tooltip.uses_per_second": "Потребляет §f%d EU/с §7когда работает", "gtceu.universal.tooltip.uses_per_tick": "Потребляет §f%d EU/т §7когда работает", @@ -6567,8 +6567,8 @@ "behavior.portable_scanner.workable_progress": "Прогресс: %s с / %s с", "behavior.portable_scanner.workable_stored_energy": "Накопленная энергия: %s EU / %s EU", "block.gtceu.advanced_data_access_hatch": "Улучшенный люк доступа к данным", - "block.gtceu.computation_receiver_hatch": "Люк приема Данных Вычислений", - "block.gtceu.computation_transmitter_hatch": "Люк передачи Данных Вычислений", + "block.gtceu.computation_receiver_hatch": "Люк приема Данных вычислений", + "block.gtceu.computation_transmitter_hatch": "Люк передачи Данных вычислений", "block.gtceu.computer_casing": "Корпус компьютера", "block.gtceu.computer_heat_vent": "Компьютерный воздуходув", "block.gtceu.creative_data_access_hatch": "Творческий люк доступа к данным", @@ -6665,10 +6665,10 @@ "death.attack.gtceu.crowbar": "Произошёл полураспад %s благодаря %s", "death.attack.gtceu.drill_lv": "%s был засверлен 32V дрелью %s", "gtceu.jade.energy_stored": "%d / %d EU", - "gtceu.jade.progress_computation": "Вычисление: %s / %s", + "gtceu.jade.progress_computation": "%s / %s", "gtceu.jade.progress_sec": "%s / %s s", "gtceu.jade.progress_tick": "%s / %s т", - "gtceu.machine.computation_transmitter_hatch.tooltip": "Выход Данных Вычислений для многоблочной структуры", + "gtceu.machine.computation_transmitter_hatch.tooltip": "Выход Данных вычислений для многоблочной структуры", "gtceu.machine.data_access_hatch.tooltip.0": "Люк для данных для Многоблочной структуры", "gtceu.machine.data_access_hatch.tooltip.1": "Добавляет §a%s§7 слотов для Данных", "gtceu.machine.data_bank.tooltip.0": "Твой личный NAS", @@ -6678,7 +6678,7 @@ "gtceu.machine.data_receiver_hatch.tooltip": "Вход для Данных Исследований для многоблочной структуры", "gtceu.machine.data_transmitter_hatch.tooltip": "Выход для Данных Исследований для многоблочной структуры", "gtceu.machine.electric_blast_furnace.tooltip.0": "На каждые §f900K§7, превышающих температуру рецепта, перед разгоном используется §f95%%§7 энергии.", - "gtceu.machine.computation_receiver_hatch.tooltip": "Вход Данных Вычислений для многоблочной структуры", + "gtceu.machine.computation_receiver_hatch.tooltip": "Вход Данных вычислений для многоблочной структуры", "gtceu.machine.data_bank.tooltip.4": "Использует §f%s EU/t§7 для каждого Люка Данных/Опт. Данных когда они в цепочке.", "item.gtceu.opv_emitter": "Эмиттер (§9§lOpV§r)", "item.gtceu.portable_debug_scanner": "Портативный сканер", @@ -6708,7 +6708,7 @@ "gtceu.machine.network_switch.tooltip.0": "Ethernet-концентратор", "gtceu.machine.network_switch.tooltip.1": "Используется для маршрутизации и распределения §fВычислений§7.", "gtceu.machine.network_switch.tooltip.2": "Можно объединить любое кол-во §fПриемников§7 Вычислений в любое кол-во §fПередатчиков§7 Вычислений.", - "gtceu.machine.network_switch.tooltip.3": "Использует §f%s ЕУ/т за каждый Люк Данных Вычислений.", + "gtceu.machine.network_switch.tooltip.3": "Использует §f%s ЕУ/т за каждый Люк Данных вычислений.", "gtceu.machine.object_holder.tooltip": "Улучшенный держатель объекта для Станций исследований", "gtceu.machine.parallel_hatch_mk5.tooltip": "Позволяет запускать до 4 рецептов параллельно.", "gtceu.machine.parallel_hatch_mk6.tooltip": "Позволяет запускать до 16 рецептов параллельно.", @@ -7401,5 +7401,97 @@ "gtceu.tooltip.potion.each": " §e%s %s§r на §c%s§r тиков с §a%s%%§r шансом", "metaarmor.jetpack.flight.disable": "Джетпак: Полет выкл", "metaarmor.jetpack.flight.enable": "Джетпак: Полет вкл", - "config.jade.plugin_gtceu.primitive_pump": "[GTCEu] Примитивная помпа" + "config.jade.plugin_gtceu.primitive_pump": "[GTCEu] Примитивная помпа", + "block.gtceu.uiv_dual_input_hatch": "Двойной входной люк (§2UIV§r)", + "block.gtceu.uv_dual_input_hatch": "Двойной входной люк (§3UV§r)", + "block.gtceu.zpm_dual_input_hatch": "Двойной входной люк (§cZPM§r)", + "block.gtceu.uhv_dual_input_hatch": "Двойной входной люк (§4UHV§r)", + "block.gtceu.uxv_dual_input_hatch": "Двойной входной люк (§eUXV§r)", + "compass.node.gtceu.parts/dual_hatch": "Двойной люк", + "config.gtceu.option.enableMoreDualHatchAbility": "enableMoreDualHatchAbility", + "gtceu.gui.me_bus.auto_pull_button": "Нажмите для переключения авто. вытягивания предметов из МЕ сети", + "gtceu.gui.waiting_list": "Очередь на отправку:", + "gtceu.key.enable_boots": "Включить Прыгучесть", + "block.gtceu.luv_dual_input_hatch": "Двойной входной люк (§dLuV§r)", + "block.gtceu.luv_dual_output_hatch": "Двойной выходной люк (§dLuV§r)", + "block.gtceu.max_dual_input_hatch": "Двойной входной люк (§c§lMAX§r)", + "block.gtceu.max_dual_output_hatch": "Двойной выходной люк (§c§lMAX§r)", + "block.gtceu.me_stocking_input_bus": "ME Накопительный предметный люк", + "block.gtceu.me_pattern_buffer": "Буфер ME Шаблонов", + "block.gtceu.me_pattern_buffer_proxy": "Прокси-буфер МЕ Шаблонов", + "block.gtceu.me_stocking_input_hatch": "ME Накопительный жидкостный люк", + "block.gtceu.opv_dual_input_hatch": "Двойной входной люк (§9§lOpV§r)", + "block.gtceu.opv_dual_output_hatch": "Двойной выходной люк (§9§lOpV§r)", + "block.gtceu.uev_dual_input_hatch": "Двойной входной люк (§aUEV§r)", + "block.gtceu.uev_dual_output_hatch": "Двойной выходной люк (§aUEV§r)", + "block.gtceu.uhv_dual_output_hatch": "Двойной выходной люк (§4UHV§r)", + "block.gtceu.uiv_dual_output_hatch": "Двойной выходной люк (§2UIV§r)", + "block.gtceu.uv_dual_output_hatch": "Двойной выходной люк (§3UV§r)", + "block.gtceu.uxv_dual_output_hatch": "Двойной выходной люк (§eUXV§r)", + "block.gtceu.zpm_dual_output_hatch": "Двойной выходной люк (§cZPM§r)", + "compass.node.gtceu.items/basic_tape": "Обычная лента", + "compass.node.gtceu.misc/basic_tape": "Обычная лента", + "config.jade.plugin_gtceu.me_pattern_buffer": "[GTCEu] Буфер шаблонов", + "config.jade.plugin_gtceu.me_pattern_buffer_proxy": "[GTCEu] Прокси буфер шаблонов", + "gtceu.gui.config_slot.auto_pull_managed": "§4Отключено:§7 Управляется Авто-вытягиванием", + "gtceu.gui.config_slot.set_only": "§7Нажмите для §bНастройки§7.§r", + "gtceu.key.enable_jetpack": "Включить Реактивный ранец", + "gtceu.machine.dual_hatch.export.tooltip": "Предметный и Жидкостный вывод для Многоблочных структур", + "gtceu.machine.dual_hatch.import.tooltip": "Предметный и Жидкостный ввод для Многоблочных структур", + "gtceu.machine.me.copy_paste.tooltip": "ЛКМ с Флешкой для копирования, ПКМ для применения", + "gtceu.machine.me.fluid_import.data_stick.name": "§oНастройки ME жидкостного люка", + "gtceu.machine.me.import_copy_settings": "Настройки сохранены в Флешку", + "gtceu.machine.me.import_paste_settings": "Настройки из Флешки применены", + "gtceu.machine.me.item_import.data_stick.name": "§oНастройки ME предметного люка", + "gtceu.machine.me.stocking_auto_pull_disabled": "Авто-вытягивание выкл", + "gtceu.machine.me.stocking_auto_pull_enabled": "Авто-вытягивание вкл", + "gtceu.machine.me.stocking_fluid.tooltip.0": "Извлекает жидкости непосредственно из сети ME", + "gtceu.machine.me.stocking_fluid.tooltip.1": "Авто-вытягивание из МЕ сети будет автоматически пополнять первые 16 слотов жидкости в МЕ сети, обновляясь раз в 5 сек.", + "gtceu.machine.me.stocking_item.tooltip.0": "Извлекает предметы непосредственно из сети ME", + "gtceu.machine.me.stocking_item.tooltip.1": "Авто-вытягивание из МЕ сети будет автоматически пополнять первые 16 предметов в МЕ сети, обновляясь раз в 5 сек.", + "gtceu.machine.me_import_fluid_hatch.configs.tooltip": "Держит 16 жидкостей в наличии", + "gtceu.machine.me_import_item_hatch.configs.tooltip": "Держит 16 предметов в наличии", + "block.gtceu.pattern_buffer.desc.0": "§fПозволяет прямое использование §66AE2 хранилища шаблонов§f в Gregtech структурах.", + "block.gtceu.pattern_buffer_proxy.desc.2": "§fПусть фабрика растет!", + "gtceu.jei.bedrock_ore_diagram": "Схема руды коренной породы", + "entity.gtceu.chest_boat": "Лодка с сундуком", + "gtceu.dummy": "Заглушка", + "block.gtceu.pattern_buffer.desc.1": "§6Шаблоны AE2 могут использовать все что хранится в §6общих инвентарях§f.", + "block.gtceu.pattern_buffer.desc.2": "§fСоедини §6Прокси-буфер МЕ Шаблонов§f с помощью §bФлешки§f с другими машинами!", + "command.gtceu.dump_data.success": "Ресурсы %s скопированы из реестра %s в %s", + "command.gtceu.place_vein.failure": "Не удалось разместить жилу %s в позиции %s", + "block.gtceu.pattern_buffer_proxy.desc.0": "§fПозволяет соединить множество машин с одним §6Буфером ME Шаблонов§f.", + "block.gtceu.pattern_buffer_proxy.desc.1": "§fВсе подключенные прокси будут использовать шаблоны, хранящиеся в §6Исходном буфере§f.", + "command.gtceu.place_vein.success": "Жила %s размещена в позиции %s", + "gtceu.multiblock.active_transformer.average_in": "§bСред. Ввод: §f%s EU/т", + "material.gtceu.wax": "Воск", + "gtceu.multiblock.active_transformer.average_out": "§bСред. Вывод: §f%s EU/т", + "gtceu.multiblock.active_transformer.danger_enabled": "§c§bОПАСНО: Взрыв", + "gtceu.multiblock.active_transformer.max_input": "§аМакс. ввод: §f%s EU/т", + "gtceu.multiblock.active_transformer.max_output": "§аМакс. вывод: §f%s EU/т", + "gui.gtceu.refund_all.desc": "Вернуть хранимое содержимое в AE2", + "entity.gtceu.boat": "Лодка", + "gtceu.multiblock.exact_hatch_1.tooltip": "§fПринимает только §6Один§f Энергетический разьем.", + "gtceu.multiblock.universal.rotor_obstructed": "Ротор заблокирован!", + "gtceu.tooltip.proxy_bind": "§fПривязка Буфера Шаблонов к %s %s %s", + "gtceu.top.buffer_bound_pos": "Привязано к - X: %s, Y: %s, Z: %s", + "gtceu.top.proxies_bound": "Прокси буферов привязано: %s", + "gui.gtceu.rename.desc": "Переименовать Буфер шаблонов", + "gui.gtceu.share_inventory.desc.1": "Обеспечивает мощную автоматизацию за счет хранения катализаторов", + "gui.gtceu.share_inventory.desc.0": "Объединяет введенные предметы со всеми шаблонами в буфере!", + "gui.gtceu.share_inventory.title": "Общий инвентарь предметов", + "gui.gtceu.share_tank.desc.0": "Объединяет введенные жидкости, газы и прочее со всеми шаблонами в буфере!", + "gui.gtceu.share_tank.title": "Общий инвентарь емкостей", + "item.gtceu.basic_tape": "Лента", + "item.gtceu.basic_tape.tooltip": "Недостаточно крепкая для решения механических проблем", + "item.gtceu.rubber_chest_boat": "Каучуковая лодка с сундуком", + "item.gtceu.rubber_boat": "Каучуковая лодка", + "item.gtceu.treated_wood_boat": "Обработанная деревянная лодка", + "item.gtceu.treated_wood_chest_boat": "Обработанная деревянная лодка с сундуком", + "material.gtceu.echo_shard": "Осколок эха", + "material.gtceu.sculk": "Скалк", + "material.gtceu.hydrogen_iodide": "Йодид водорода", + "metaarmor.nms.boosted_jump.enabled": "NanoMuscle™ Suite: Прыгучесть включена", + "recipe.condition.adjacent_block.tooltip": "Блоки вокруг", + "metaarmor.nms.boosted_jump.disabled": "NanoMuscle™ Suite: Прыгучесть выключена" } From 41283f3ed6ea719f71abd6315d76fa6e6a874a95 Mon Sep 17 00:00:00 2001 From: iouter <62897714+iouter@users.noreply.github.com> Date: Fri, 27 Sep 2024 03:04:22 +0800 Subject: [PATCH 070/141] Update zh_cn.json (#2035) --- .../resources/assets/gtceu/lang/zh_cn.json | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/main/resources/assets/gtceu/lang/zh_cn.json b/src/main/resources/assets/gtceu/lang/zh_cn.json index e7e673caba..a4bc7f0631 100644 --- a/src/main/resources/assets/gtceu/lang/zh_cn.json +++ b/src/main/resources/assets/gtceu/lang/zh_cn.json @@ -491,7 +491,6 @@ "block.gtceu.iv_packer":"§9精英打包机§r", "block.gtceu.iv_parallel_hatch":"§9IV§r并行控制仓", "block.gtceu.iv_polarizer":"§9精英两极磁化机§r", - "block.gtceu.iv_processing_array":"§9IV§r处理阵列", "block.gtceu.iv_quantum_chest":"量子箱 V", "block.gtceu.iv_quantum_tank":"量子缸 V", "block.gtceu.iv_rock_crusher":"§9精英碎岩机§r", @@ -657,7 +656,6 @@ "block.gtceu.luv_packer":"§d精英打包机 II§r", "block.gtceu.luv_parallel_hatch":"§dLuV§r并行控制仓", "block.gtceu.luv_polarizer":"§d精英两极磁化机 II§r", - "block.gtceu.luv_processing_array":"§dLuV§r处理阵列", "block.gtceu.luv_quantum_chest":"量子箱 VI", "block.gtceu.luv_quantum_tank":"量子缸 VI", "block.gtceu.luv_rock_crusher":"§d精英碎岩机 II§r", @@ -1009,7 +1007,7 @@ "block.gtceu.orange_studs":"橙色橡胶混凝土", "block.gtceu.overworld_marker":"主世界", "block.gtceu.palladium_substation":"镀钯变电站", - "block.gtceu.pattern_buffer.desc.0":"§f多方块结构的集成式§6AE2样板供应器§f。", + "block.gtceu.pattern_buffer.desc.0":"§f对于GT多方块结构的集成式§6AE2样板供应器§f。", "block.gtceu.pattern_buffer.desc.1":"§fAE2样板可以利用§6共享库存§f中的一切。", "block.gtceu.pattern_buffer.desc.2":"§f使用§b闪存§f绑定§6ME样板总成镜像§f,以使机器相互连接!", "block.gtceu.pattern_buffer_proxy.desc.0":"§f可以将单单一个§6ME样板总成§f连接到众多机器。", @@ -1730,10 +1728,13 @@ "block.gtceu.zpm_world_accelerator":"§c精英世界加速器 III§r", "block.sterilizing_filter_casing.tooltip":"创造一个§a无菌§r环境", "block.surface_rock":"地表岩石(%s)", + "command.gtceu.dump_data.success":"已将注册表%2$s中的%1$s个资源转储到%3$s", "command.gtceu.medical_condition.get":"玩家%s有以下疾病:", "command.gtceu.medical_condition.get.element":"症状:%s§r %s秒", "command.gtceu.medical_condition.get.element.permanent":"症状:%s§r %s秒(永久)", "command.gtceu.medical_condition.get.empty":"玩家%s没有疾病。", + "command.gtceu.place_vein.failure":"无法放置%s矿脉于%s", + "command.gtceu.place_vein.success":"成功放置%s矿脉于%s", "compass.node.gtceu.batteries/energy_cluster":"能量簇", "compass.node.gtceu.batteries/energy_crystal":"能量水晶", "compass.node.gtceu.batteries/energy_module":"能量模块", @@ -1814,7 +1815,6 @@ "compass.node.gtceu.covers/computer_monitor_cover":"电脑屏幕覆盖板", "compass.node.gtceu.covers/conveyor":"传送带", "compass.node.gtceu.covers/cover":"什么是覆盖板?", - "compass.node.gtceu.covers/crafting_table_cover":"工作台覆盖板", "compass.node.gtceu.covers/ender_fluid_link_cover":"末影流体连接覆盖板", "compass.node.gtceu.covers/energy_detector_cover":"能量探测覆盖板", "compass.node.gtceu.covers/facade_cover":"伪装板", @@ -1896,7 +1896,6 @@ "compass.node.gtceu.iv/large_sifting_funnel":"大型筛选漏斗", "compass.node.gtceu.iv/large_solidifier":"大型固化器", "compass.node.gtceu.iv/large_wiremill":"大型线材轧机", - "compass.node.gtceu.iv/processing_array":"处理阵列", "compass.node.gtceu.luv/luv_fusion_reactor":"§dLuV§r核聚变反应堆", "compass.node.gtceu.luv/mega_blast_furnace":"巨型高炉", "compass.node.gtceu.luv/mega_vacuum_freezer":"巨型真空冷冻机", @@ -2101,7 +2100,6 @@ "compass.node.gtceu.multiblock/multiblock_tank":"多方块储罐", "compass.node.gtceu.multiblock/primitive_blast_furnace":"土高炉", "compass.node.gtceu.multiblock/primitive_pump":"原始水泵", - "compass.node.gtceu.multiblock/processing_array":"处理阵列", "compass.node.gtceu.multiblock/pyrolyse_oven":"热解炉", "compass.node.gtceu.multiblock/steam_grinder":"蒸汽碾磨机", "compass.node.gtceu.multiblock/steam_oven":"蒸汽熔炼炉", @@ -2588,6 +2586,8 @@ "enchantment.gtceu.disjunction.desc":"对末影生物施加虚弱和缓慢效果。", "enchantment.gtceu.hard_hammer.desc":"像格雷科技的锻造锤一样粉碎所采掘的方块。", "enchantment.hard_hammer":"锤碎", + "entity.gtceu.boat":"船", + "entity.gtceu.chest_boat":"运输船", "entity.gtceu.dynamite":"炸药", "entity.gtceu.industrial_tnt":"工业TNT", "entity.gtceu.powderbarrel":"火药桶", @@ -2835,7 +2835,7 @@ "gtceu.item_pipe.priority":"§9优先级:§f%d", "gtceu.jade.cleaned_this_second":"污染清理速率:%s/s", "gtceu.jade.energy_stored":"%d / %d EU", - "gtceu.jade.progress_computation":"计算进度:%s / %s", + "gtceu.jade.progress_computation":"%s / %s CWU", "gtceu.jade.progress_sec":"%s / %s s", "gtceu.jade.progress_tick":"%s / %s t", "gtceu.jei.bedrock_fluid.heavy_oil_deposit":"重油矿藏", @@ -2847,6 +2847,7 @@ "gtceu.jei.bedrock_fluid.raw_oil_deposit":"原油矿藏", "gtceu.jei.bedrock_fluid.salt_water_deposit":"盐水矿藏", "gtceu.jei.bedrock_fluid_diagram":"基岩流体生成信息", + "gtceu.jei.bedrock_ore_diagram":"基岩矿脉生成信息", "gtceu.jei.fluid.dep_amount_hover":"消耗后消耗的量", "gtceu.jei.fluid.dep_chance_hover":"开采流体矿脉时消耗的概率", "gtceu.jei.fluid.dep_yield_hover":"流体矿脉殆尽后能开采的最大流体量", @@ -3579,7 +3580,11 @@ "gtceu.mode.fluid":"§9流体§r", "gtceu.mode.item":"§6物品§r", "gtceu.muffler.recovery_tooltip":"§b回收概率:§f%d%%", - "gtceu.multiblock.advanced_processing_array.description":"处理阵列可将最多 64 个单方块机器集成在一个多方块结构中,以实现更高效的自动化。", + "gtceu.multiblock.active_transformer.average_in":"§b平均输入:§f%s EU/t", + "gtceu.multiblock.active_transformer.average_out":"§b平均输出:§f%s EU/t", + "gtceu.multiblock.active_transformer.danger_enabled":"§c§b危险:易爆", + "gtceu.multiblock.active_transformer.max_input":"§a最大输入:§f%s EU/t", + "gtceu.multiblock.active_transformer.max_output":"§c最大输出:§f%s EU/t", "gtceu.multiblock.assembly_line.description":"装配线是由5到16“片”组成的大型多方块结构。理论上,它是一个大型组装机,用于生产高级元件。", "gtceu.multiblock.blast_furnace.max_temperature":"热容:%s", "gtceu.multiblock.central_monitor.height":"屏幕高度:%d", @@ -3642,7 +3647,7 @@ "gtceu.multiblock.hpca.warning_structure_header":"结构警告:", "gtceu.multiblock.hpca.warning_temperature":"温度超过50℃,超过100℃时可能导致计算组件损坏!", "gtceu.multiblock.hpca.warning_temperature_active_cool":"充分利用主动冷却组件", - "gtceu.multiblock.idling":"待机。", + "gtceu.multiblock.idling":"§6待机。", "gtceu.multiblock.implosion_compressor.description":"聚爆压缩机是一种多方块结构,能够借助炸药将宝石粉转化为相应的宝石。", "gtceu.multiblock.invalid_structure":"结构无效。", "gtceu.multiblock.invalid_structure.tooltip":"该方块是多方块结构的控制器,请查看该方块的JEI界面以获取搭建图示。", @@ -3756,7 +3761,6 @@ "gtceu.multiblock.primitive_water_pump.extra2.3":"§7LV§r输出仓:4x", "gtceu.multiblock.primitive_water_pump.extra2.4":"", "gtceu.multiblock.primitive_water_pump.extra2.5":"当水泵所处的生物群系下雨时,总产水量将增加50%%。", - "gtceu.multiblock.processing_array.description":"处理阵列可将最多 16 个单方块机器集成在一个多方块结构中,以实现更高效的自动化。", "gtceu.multiblock.progress":"进度:%s%%", "gtceu.multiblock.pyrolyse_oven.description":"热解炉是一种用于将原木处理为木炭、杂酚油、灰烬或重油的多方块结构。", "gtceu.multiblock.pyrolyse_oven.speed":"处理速度:%s%%", @@ -3793,6 +3797,7 @@ "gtceu.multiblock.universal.problem.soft_mallet":"%s§7有什么东西卡住了。(§a软锤§r)", "gtceu.multiblock.universal.problem.wire_cutter":"%s§7有几根线烧焦了(§a剪线钳§r)", "gtceu.multiblock.universal.problem.wrench":"%s§7管道松动了。(§a扳手§r)", + "gtceu.multiblock.universal.rotor_obstructed":"转子进气口受阻!", "gtceu.multiblock.uv_fusion_reactor.description":"核聚变反应堆MK-III是台大型多方块结构,用于融合元素形成更重的元素。它仅可使用UV等级的能源仓。每个能源仓可增加40MEU的能量缓存,最大能量缓存为640MEU。", "gtceu.multiblock.vacuum_freezer.description":"真空冷冻机是一种多方块结构,主要用于将热锭冷却为成品锭。此外,它还可以冻结水等其他物质。", "gtceu.multiblock.validation_failed":"输入仓/输出仓数量无效。", @@ -4169,7 +4174,6 @@ "item.gtceu.cpu_chip.tooltip":"§7中央处理器", "item.gtceu.cpu_wafer":"CPU晶圆", "item.gtceu.cpu_wafer.tooltip":"§7中央处理器原料", - "item.gtceu.crafting_table_cover":"工作台覆盖板", "item.gtceu.crafting_table_cover.tooltip":"§7安装在机器侧面的§f覆盖板§7式§f高级工作台§7。", "item.gtceu.credit_casting_mold":"模具(硬币)", "item.gtceu.credit_casting_mold.tooltip":"§7用来制作硬币的安全模具(别把它弄丢了!)", @@ -4206,7 +4210,6 @@ "item.gtceu.data_stick":"闪存", "item.gtceu.data_stick.tooltip":"§7小容量的数据存储器", "item.gtceu.diamond_grinding_head":"钻石研磨头", - "item.gtceu.digital_interface_cover":"数字接口覆盖板", "item.gtceu.diode":"二极管", "item.gtceu.diode.tooltip":"§7基础电子元件", "item.gtceu.doge_coin":"狗狗币", @@ -4715,6 +4718,8 @@ "item.gtceu.rotor_casting_mold.tooltip":"§7用来制作转子的模具", "item.gtceu.rotor_extruder_mold":"模头(转子)", "item.gtceu.rotor_extruder_mold.tooltip":"§7用来制作转子的模头", + "item.gtceu.rubber_boat":"橡胶木船", + "item.gtceu.rubber_chest_boat":"橡胶木运输船", "item.gtceu.rubber_gloves":"橡胶手套", "item.gtceu.salt_dust":"盐", "item.gtceu.saw_extruder_mold.tooltip":"§7用来制作锯的模头", @@ -4927,7 +4932,9 @@ "item.gtceu.tool.wrench.tooltip":"§8按住左键以拆卸机器", "item.gtceu.transistor":"晶体管", "item.gtceu.transistor.tooltip":"§7基础电子元件", + "item.gtceu.treated_wood_boat":"防腐木船", "item.gtceu.treated_wood_bolt":"短防腐木棍", + "item.gtceu.treated_wood_chest_boat":"防腐木运输船", "item.gtceu.treated_wood_dust":"防腐木浆", "item.gtceu.treated_wood_plate":"防腐木板", "item.gtceu.treated_wood_rod":"防腐木棍", @@ -5027,7 +5034,6 @@ "item.gtceu.white_dye_spray_can":"喷漆罐(白色)", "item.gtceu.wire_extruder_mold":"模头(导线)", "item.gtceu.wire_extruder_mold.tooltip":"§7用来制作导线的模头", - "item.gtceu.wireless_digital_interface_cover":"无线数字接口覆盖板", "item.gtceu.wood_bolt":"短木棍", "item.gtceu.wood_dust":"木浆", "item.gtceu.wood_plate":"木板", @@ -5234,7 +5240,7 @@ "material.gtceu.dubnium":"钅杜", "material.gtceu.duranium":"铿铀", "material.gtceu.dysprosium":"镝", - "material.gtceu.echo":"回响", + "material.gtceu.echo_shard":"回响碎片", "material.gtceu.einsteinium":"锿", "material.gtceu.electrotine":"蓝石", "material.gtceu.electrum":"琥珀金", From c6432e78722a383800de2a32bf2bd99fbe480de8 Mon Sep 17 00:00:00 2001 From: Karthi Suresh <75553966+JuiceyBeans@users.noreply.github.com> Date: Sun, 29 Sep 2024 02:22:51 +0100 Subject: [PATCH 071/141] Change iron rounds -> iron rings for a few recipes (#2026) --- .../data/recipe/configurable/RecipeAddition.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java index 717efc1239..3ce88c9b1a 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java @@ -1042,22 +1042,22 @@ private static void hardMiscRecipes(Consumer provider) { VanillaRecipeHelper.addShapedRecipe(provider, "lantern", new ItemStack(Blocks.LANTERN), "hRf", "RFR", " R ", 'F', new ItemStack(Blocks.TORCH), - 'R', new UnificationEntry(TagPrefix.round, GTMaterials.Iron)); + 'R', new UnificationEntry(ring, Iron)); ASSEMBLER_RECIPES.recipeBuilder("lantern") .inputItems(new ItemStack(Blocks.TORCH)) - .inputItems(round, Iron, 4) + .inputItems(ring, Iron, 4) .outputItems(new ItemStack(Blocks.LANTERN)) .duration(100).EUt(1).save(provider); VanillaRecipeHelper.addShapedRecipe(provider, "soul_lantern", new ItemStack(Blocks.SOUL_LANTERN), "hRf", "RFR", " R ", 'F', new ItemStack(Blocks.SOUL_TORCH), - 'R', new UnificationEntry(TagPrefix.round, GTMaterials.Iron)); + 'R', new UnificationEntry(ring, Iron)); ASSEMBLER_RECIPES.recipeBuilder("soul_lantern") .inputItems(new ItemStack(Blocks.SOUL_TORCH)) - .inputItems(round, Iron, 4) + .inputItems(ring, Iron, 4) .outputItems(new ItemStack(Blocks.SOUL_LANTERN)) .duration(100).EUt(1).save(provider); @@ -1331,10 +1331,10 @@ private static void hardMiscRecipes(Consumer provider) { VanillaRecipeHelper.addShapedRecipe(provider, "chain", new ItemStack(Items.CHAIN), " R ", "wR ", " R ", - 'R', new UnificationEntry(round, Iron)); + 'R', new UnificationEntry(ring, Iron)); ASSEMBLER_RECIPES.recipeBuilder("chain") - .inputItems(round, Iron, 3) + .inputItems(ring, Iron, 3) .outputItems(new ItemStack(Items.CHAIN)) .duration(40).EUt(10).save(provider); From 4d65ba50806de9db86cc26eb37ef132f0c22d87b Mon Sep 17 00:00:00 2001 From: Karthi Suresh <75553966+JuiceyBeans@users.noreply.github.com> Date: Sun, 29 Sep 2024 02:23:16 +0100 Subject: [PATCH 072/141] Replace wrench with plate in bender recipe (#2057) --- .../gtceu/data/recipe/misc/MetaTileEntityLoader.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MetaTileEntityLoader.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MetaTileEntityLoader.java index d929fcd986..93bcbf9ccd 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MetaTileEntityLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MetaTileEntityLoader.java @@ -743,8 +743,8 @@ public static void init(Consumer provider) { CABLE, 'C', COIL_HEATING_DOUBLE); registerMachineRecipe(provider, GTMachines.ASSEMBLER, "ACA", "VMV", "WCW", 'M', HULL, 'V', CONVEYOR, 'A', ROBOT_ARM, 'C', CIRCUIT, 'W', CABLE); - registerMachineRecipe(provider, GTMachines.BENDER, "PwP", "CMC", "EWE", 'M', HULL, 'E', MOTOR, 'P', PISTON, 'C', - CIRCUIT, 'W', CABLE); + registerMachineRecipe(provider, GTMachines.BENDER, "PBP", "CMC", "EWE", 'M', HULL, 'E', MOTOR, 'P', PISTON, 'C', + CIRCUIT, 'W', CABLE, 'B', PLATE); registerMachineRecipe(provider, GTMachines.CANNER, "WPW", "CMC", "GGG", 'M', HULL, 'P', PUMP, 'C', CIRCUIT, 'W', CABLE, 'G', GLASS); registerMachineRecipe(provider, GTMachines.COMPRESSOR, " C ", "PMP", "WCW", 'M', HULL, 'P', PISTON, 'C', From c0c03b10ca7f62f7649f5321a69e19099c002fb5 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Sat, 28 Sep 2024 19:27:44 -0600 Subject: [PATCH 073/141] Machine Ownership (#1970) Co-authored-by: mikerooni <139889766+mikerooni@users.noreply.github.com> --- dependencies.gradle | 6 ++ settings.gradle | 20 ++++- .../gtceu/compass/nodes/materials/frame.json | 4 +- .../resources/assets/gtceu/lang/en_ud.json | 6 ++ .../resources/assets/gtceu/lang/en_us.json | 6 ++ .../minecraft/tags/blocks/logs_that_burn.json | 2 +- .../minecraft/tags/items/logs_that_burn.json | 5 +- .../java/com/gregtechceu/gtceu/GTCEu.java | 8 ++ .../com/gregtechceu/gtceu/api/GTValues.java | 4 +- .../gtceu/api/block/IMachineBlock.java | 29 ++++++ .../gtceu/api/block/MetaMachineBlock.java | 27 +++++- .../blockentity/MetaMachineBlockEntity.java | 29 +++++- .../api/machine/IMachineBlockEntity.java | 7 ++ .../KineticMachineBlockEntity.java | 8 ++ .../common/item/PortableScannerBehavior.java | 3 + .../common/machine/owner/ArgonautsOwner.java | 89 +++++++++++++++++++ .../gtceu/common/machine/owner/FTBOwner.java | 79 ++++++++++++++++ .../common/machine/owner/IMachineOwner.java | 82 +++++++++++++++++ .../common/machine/owner/PlayerOwner.java | 67 ++++++++++++++ .../gtceu/config/ConfigHolder.java | 7 ++ .../gtceu/data/lang/LangHandler.java | 4 + .../gtceu/forge/ForgeCommonEventListener.java | 12 +++ 22 files changed, 492 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/common/machine/owner/ArgonautsOwner.java create mode 100644 src/main/java/com/gregtechceu/gtceu/common/machine/owner/FTBOwner.java create mode 100644 src/main/java/com/gregtechceu/gtceu/common/machine/owner/IMachineOwner.java create mode 100644 src/main/java/com/gregtechceu/gtceu/common/machine/owner/PlayerOwner.java diff --git a/dependencies.gradle b/dependencies.gradle index e1427063a8..449dd14302 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -65,6 +65,12 @@ dependencies { modImplementation(forge.javd) { transitive = false } modRuntimeOnly("curse.maven:trenzalore-870210:4848244") + modCompileOnly(forge.ftbteams) + modCompileOnly(forge.ftblibrary) + + modCompileOnly(forge.argonauts) + modCompileOnly(forge.resourceful) + // Runtime only testing mods //modRuntimeOnly(forge.worldStripper) } diff --git a/settings.gradle b/settings.gradle index f708b7a5ba..5d5dc8d938 100644 --- a/settings.gradle +++ b/settings.gradle @@ -35,7 +35,7 @@ dependencyResolutionManagement { def auVersion = "1.20.1-0.6.0" // Forge - def forgeVersion = "47.1.3" + def forgeVersion = "47.1.47" def registrateForgeVersion = "MC1.20-1.3.3" def createForgeVersion = "0.5.1.f-33" def flywheelForgeVersion = "0.6.10-10" @@ -44,6 +44,10 @@ dependencyResolutionManagement { def curiosForgeVersion = "5.9.1" def worldStripperForgeFile = "4578579" def javdVersion = "4803995" + def ftbteamsForgeFile = "5267190" + def ftblibraryForgeFile = "5567591" + def argonautsForgeFile = "5263580" + def resourcefulForgeFile = "5659871" // Libs def quiltMappingsVersion = "5" // https://lambdaurora.dev/tools/import_quilt.html @@ -58,7 +62,7 @@ dependencyResolutionManagement { def mixinextrasVersion = "0.2.0" def shimmerVersion = "0.2.4" def lombokPluginVersion = "8.7.1" - + forge { version("forgeShortVersion", forgeVersion) def minecraftForge = version("minecraftForge", "${minecraftVersion}-${forgeVersion}") @@ -125,6 +129,18 @@ dependencyResolutionManagement { def javd = version("javd", javdVersion) library("javd", "curse.maven", "javd-370890").versionRef(javd) + + def ftbteams = version("ftbteams", ftbteamsForgeFile) + library("ftbteams", "curse.maven", "ftb-teams-forge-404468").versionRef(ftbteams) + + def ftblibrary = version("ftblibrary", ftblibraryForgeFile) + library("ftblibrary", "curse.maven", "ftb-library-forge-404465").versionRef(ftblibrary) + + def argonautslib = version("argonauts", argonautsForgeFile) + library("argonauts", "curse.maven", "argonauts-845833").versionRef(argonautslib) + + def resourceful = version("resourceful", resourcefulForgeFile) + library("resourceful", "curse.maven", "resourceful-lib-570073").versionRef(resourceful) } libs { diff --git a/src/generated/resources/assets/gtceu/compass/nodes/materials/frame.json b/src/generated/resources/assets/gtceu/compass/nodes/materials/frame.json index 01d8df4995..39cfd375c8 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/materials/frame.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/materials/frame.json @@ -4,8 +4,8 @@ "res": "gtceu:aluminium_frame" }, "items": [ - "#forge:frames", - "#minecraft:climbable" + "#minecraft:climbable", + "#forge:frames" ], "page": "gtceu:materials/frame", "position": [ diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index f0ccff0fc4..a0ddc38c98 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -23,10 +23,12 @@ "behavior.portable_scanner.environmental_hazard": "ɯdd %s - ɹ§%s :ʞunɥƆ uI pɹɐzɐH ןɐʇuǝɯuoɹıʌuƎ", "behavior.portable_scanner.environmental_hazard.nothing": "ɹ§buıɥʇoN9§ :ʞunɥƆ uI pɹɐzɐH ןɐʇuǝɯuoɹıʌuƎ", "behavior.portable_scanner.eu_per_sec": "ʇ/∩Ǝ %s :)puoɔǝs ʇsɐן( ǝbɐɹǝʌⱯ", + "behavior.portable_scanner.guild_name": "ɹ§%s :ǝɯɐN pןın⅁ᄅ§", "behavior.portable_scanner.local_hazard": "ɯdd %s - ɹ§%s :ɐǝɹⱯ uI pɹɐzɐH ןɐɔoꞀ", "behavior.portable_scanner.local_hazard.nothing": "ɹ§buıɥʇoN9§ :ɐǝɹⱯ uI pɹɐzɐH ןɐɔoꞀ", "behavior.portable_scanner.machine_disabled": "˙pǝןqɐsıᗡ", "behavior.portable_scanner.machine_front_facing": "%s :buıɔɐℲ ʇuoɹℲ", + "behavior.portable_scanner.machine_ownership": "ɹ§%s :ǝdʎ⟘ ɹǝuʍO ǝuıɥɔɐWᄅ§", "behavior.portable_scanner.machine_power_loss": "˙ssoן ɹǝʍod oʇ ǝnp uʍop ʇnɥS", "behavior.portable_scanner.machine_progress": "%s / %s :pɐoꞀ/ssǝɹboɹԀ", "behavior.portable_scanner.machine_upwards_facing": "%s :buıɔɐℲ spɹɐʍd∩", @@ -42,10 +44,12 @@ "behavior.portable_scanner.multiblock_energy_output": "%s :ɹǝı⟘ ʇ/∩Ǝ %s :ʇndʇnO ʎbɹǝuƎ xɐW", "behavior.portable_scanner.multiblock_maintenance": "%s :sɯǝןqoɹԀ", "behavior.portable_scanner.multiblock_parallel": "%s :buıssǝɔoɹԀ ıʇןnW", + "behavior.portable_scanner.player_name": "ɹ§%s :ǝuıןuO ɹǝʎɐןԀㄥ§ 'ɹ§%s :ǝɯɐN ɹǝʎɐןԀᄅ§", "behavior.portable_scanner.position": "----- %s :ᗡ %s :Z %s :ʎ %s :X -----", "behavior.portable_scanner.state": "%s :%s", "behavior.portable_scanner.tank": "%s ᗺɯ %s / ᗺɯ %s :%s ʞuɐ⟘", "behavior.portable_scanner.tanks_empty": "ʎʇdɯƎ sʞuɐ⟘ ןןⱯ", + "behavior.portable_scanner.team_name": "ɹ§%s :ǝɯɐN ɯɐǝ⟘ᄅ§", "behavior.portable_scanner.workable_consumption": "Ɐ %s ʇɐ ʇ/∩Ǝ %s :sǝs∩ ʎןqɐqoɹԀ", "behavior.portable_scanner.workable_production": "Ɐ %s ʇɐ ʇ/∩Ǝ %s :sǝɔnpoɹԀ ʎןqɐqoɹԀ", "behavior.portable_scanner.workable_progress": "s %s / s %s :ssǝɹboɹԀ", @@ -2287,6 +2291,8 @@ "config.gtceu.option.ldFluidPipeMinDistance": "ǝɔuɐʇsıᗡuıWǝdıԀpınןℲpן", "config.gtceu.option.ldItemPipeMinDistance": "ǝɔuɐʇsıᗡuıWǝdıԀɯǝʇIpן", "config.gtceu.option.liquidBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺpınbıן", + "config.gtceu.option.machineOwnerBreak": "ʞɐǝɹᗺɹǝuʍOǝuıɥɔɐɯ", + "config.gtceu.option.machineOwnerGUI": "I∩⅁ɹǝuʍOǝuıɥɔɐɯ", "config.gtceu.option.machineSounds": "spunoSǝuıɥɔɐɯ", "config.gtceu.option.machines": "sǝuıɥɔɐɯ", "config.gtceu.option.machinesEmissiveTextures": "sǝɹnʇxǝ⟘ǝʌıssıɯƎsǝuıɥɔɐɯ", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 08b1471817..a885320d34 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -23,10 +23,12 @@ "behavior.portable_scanner.environmental_hazard": "Environmental Hazard In Chunk: %s§r - %s ppm", "behavior.portable_scanner.environmental_hazard.nothing": "Environmental Hazard In Chunk: §6Nothing§r", "behavior.portable_scanner.eu_per_sec": "Average (last second): %s EU/t", + "behavior.portable_scanner.guild_name": "§2Guild Name: %s§r", "behavior.portable_scanner.local_hazard": "Local Hazard In Area: %s§r - %s ppm", "behavior.portable_scanner.local_hazard.nothing": "Local Hazard In Area: §6Nothing§r", "behavior.portable_scanner.machine_disabled": "Disabled.", "behavior.portable_scanner.machine_front_facing": "Front Facing: %s", + "behavior.portable_scanner.machine_ownership": "§2Machine Owner Type: %s§r", "behavior.portable_scanner.machine_power_loss": "Shut down due to power loss.", "behavior.portable_scanner.machine_progress": "Progress/Load: %s / %s", "behavior.portable_scanner.machine_upwards_facing": "Upwards Facing: %s", @@ -42,10 +44,12 @@ "behavior.portable_scanner.multiblock_energy_output": "Max Energy Output: %s EU/t Tier: %s", "behavior.portable_scanner.multiblock_maintenance": "Problems: %s", "behavior.portable_scanner.multiblock_parallel": "Multi Processing: %s", + "behavior.portable_scanner.player_name": "§2Player Name: %s§r, §7Player Online: %s§r", "behavior.portable_scanner.position": "----- X: %s Y: %s Z: %s D: %s -----", "behavior.portable_scanner.state": "%s: %s", "behavior.portable_scanner.tank": "Tank %s: %s mB / %s mB %s", "behavior.portable_scanner.tanks_empty": "All Tanks Empty", + "behavior.portable_scanner.team_name": "§2Team Name: %s§r", "behavior.portable_scanner.workable_consumption": "Probably Uses: %s EU/t at %s A", "behavior.portable_scanner.workable_production": "Probably Produces: %s EU/t at %s A", "behavior.portable_scanner.workable_progress": "Progress: %s s / %s s", @@ -2287,6 +2291,8 @@ "config.gtceu.option.ldFluidPipeMinDistance": "ldFluidPipeMinDistance", "config.gtceu.option.ldItemPipeMinDistance": "ldItemPipeMinDistance", "config.gtceu.option.liquidBoilerBaseOutput": "liquidBoilerBaseOutput", + "config.gtceu.option.machineOwnerBreak": "machineOwnerBreak", + "config.gtceu.option.machineOwnerGUI": "machineOwnerGUI", "config.gtceu.option.machineSounds": "machineSounds", "config.gtceu.option.machines": "machines", "config.gtceu.option.machinesEmissiveTextures": "machinesEmissiveTextures", 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 39f4a40dc7..9598805d7d 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 @@ -5,4 +5,4 @@ "gtceu:rubber_wood", "gtceu:stripped_rubber_wood" ] -} +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/logs_that_burn.json b/src/generated/resources/data/minecraft/tags/items/logs_that_burn.json index 0e9a2d0809..9598805d7d 100644 --- a/src/generated/resources/data/minecraft/tags/items/logs_that_burn.json +++ b/src/generated/resources/data/minecraft/tags/items/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/GTCEu.java b/src/main/java/com/gregtechceu/gtceu/GTCEu.java index 2fd290325e..8f3f8a66ac 100644 --- a/src/main/java/com/gregtechceu/gtceu/GTCEu.java +++ b/src/main/java/com/gregtechceu/gtceu/GTCEu.java @@ -86,6 +86,14 @@ public static boolean isJAVDLoaded() { return LDLib.isModLoaded(GTValues.MODID_JAVD); } + public static boolean isFTBTeamsLoaded() { + return LDLib.isModLoaded(GTValues.MODID_FTBTEAMS); + } + + public static boolean isArgonautsLoaded() { + return LDLib.isModLoaded(GTValues.MODID_ARGONAUTS); + } + @Deprecated(forRemoval = true, since = "1.0.21") public static boolean isHighTier() { return GTCEuAPI.isHighTier(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/GTValues.java b/src/main/java/com/gregtechceu/gtceu/api/GTValues.java index a69521b6ee..646b212921 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/GTValues.java +++ b/src/main/java/com/gregtechceu/gtceu/api/GTValues.java @@ -125,7 +125,9 @@ public static int[] tiersBetween(int minInclusive, int maxInclusive) { MODID_CURIOS = "curios", MODID_AE2WTLIB = "ae2wtlib", MODID_SHIMMER = "shimmer", - MODID_JAVD = "javd"; + MODID_JAVD = "javd", + MODID_FTBTEAMS = "ftbteams", + MODID_ARGONAUTS = "argonauts"; /** * Spray painting compat modids diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/IMachineBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/IMachineBlock.java index 4054009335..83f3798d64 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/IMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/IMachineBlock.java @@ -4,11 +4,16 @@ import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.common.machine.owner.ArgonautsOwner; +import com.gregtechceu.gtceu.common.machine.owner.FTBOwner; +import com.gregtechceu.gtceu.common.machine.owner.IMachineOwner; +import com.gregtechceu.gtceu.common.machine.owner.PlayerOwner; import com.lowdragmc.lowdraglib.client.renderer.IBlockRendererProvider; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -19,8 +24,14 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.DirectionProperty; +import dev.ftb.mods.ftbteams.FTBTeamsAPIImpl; +import dev.ftb.mods.ftbteams.api.Team; +import earth.terrarium.argonauts.api.guild.Guild; +import earth.terrarium.argonauts.common.handlers.guild.GuildHandler; import org.jetbrains.annotations.Nullable; +import java.util.Optional; + /** * @author KilaBash * @date 2023/3/31 @@ -77,4 +88,22 @@ default BlockEntityTicker getTicker(Level level, Bloc } return null; } + + default void setMachineOwner(MetaMachine machine, ServerPlayer player) { + if (IMachineOwner.MachineOwnerType.FTB.isAvailable()) { + Optional team = FTBTeamsAPIImpl.INSTANCE.getManager().getTeamForPlayerID(player.getUUID()); + if (team.isPresent()) { + machine.holder.setOwner(new FTBOwner(team.get(), player.getUUID())); + return; + } + } + if (IMachineOwner.MachineOwnerType.ARGONAUTS.isAvailable()) { + Guild guild = GuildHandler.read(player.server).get(player); + if (guild != null) { + machine.holder.setOwner(new ArgonautsOwner(guild, player.getUUID())); + return; + } + } + machine.holder.setOwner(new PlayerOwner(player.getUUID())); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java index f0328c80dd..f2cffcfaa9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -11,6 +11,7 @@ import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.machine.feature.*; import com.gregtechceu.gtceu.common.data.GTItems; +import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.client.renderer.IRenderer; @@ -127,6 +128,12 @@ public void setPlacedBy(Level pLevel, BlockPos pPos, BlockState pState, @Nullabl ItemStack pStack) { if (!pLevel.isClientSide) { var machine = getMachine(pLevel, pPos); + if (machine != null) { + if (player instanceof ServerPlayer sPlayer) { + setMachineOwner(machine, sPlayer); + machine.markDirty(); + } + } if (machine instanceof IDropSaveMachine dropSaveMachine) { CompoundTag tag = pStack.getTag(); if (tag != null) { @@ -282,6 +289,11 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player ItemStack itemStack = player.getItemInHand(hand); boolean shouldOpenUi = true; + if (machine != null && machine.holder.getOwner() == null && player instanceof ServerPlayer) { + setMachineOwner(machine, (ServerPlayer) player); + machine.markDirty(); + } + Set types = ToolHelper.getToolTypes(itemStack); if (machine != null && !types.isEmpty() && ToolHelper.canUse(itemStack)) { var result = machine.onToolClick(types, itemStack, new UseOnContext(player, hand, hit)); @@ -307,12 +319,25 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player var result = interactedMachine.onUse(state, world, pos, player, hand, hit); if (result != InteractionResult.PASS) return result; } - if (shouldOpenUi && machine instanceof IUIMachine uiMachine) { + if (shouldOpenUi && machine instanceof IUIMachine uiMachine && + canOpenOwnerMachine(player, machine.getHolder())) { return uiMachine.tryToOpenUI(player, hand, hit); } return shouldOpenUi ? InteractionResult.PASS : InteractionResult.CONSUME; } + public boolean canOpenOwnerMachine(Player player, IMachineBlockEntity machine) { + if (!ConfigHolder.INSTANCE.machines.machineOwnerGUI) return true; + if (machine.getOwner() == null) return true; + return machine.getOwner().isPlayerInTeam(player) || machine.getOwner().isPlayerFriendly(player); + } + + public static boolean canBreakOwnerMachine(Player player, IMachineBlockEntity machine) { + if (!ConfigHolder.INSTANCE.machines.machineOwnerBreak) return true; + if (machine.getOwner() == null) return true; + return machine.getOwner().isPlayerInTeam(player); + } + public boolean canConnectRedstone(BlockGetter level, BlockPos pos, Direction side) { return getMachine(level, pos).canConnectRedstone(side); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java index fc64c16e70..0047290076 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java @@ -15,6 +15,7 @@ import com.gregtechceu.gtceu.api.misc.LaserContainerList; import com.gregtechceu.gtceu.api.pipenet.longdistance.ILDEndpoint; import com.gregtechceu.gtceu.client.renderer.GTRendererProvider; +import com.gregtechceu.gtceu.common.machine.owner.IMachineOwner; import com.gregtechceu.gtceu.common.pipelike.fluidpipe.longdistance.LDFluidEndpointMachine; import com.gregtechceu.gtceu.common.pipelike.item.longdistance.LDItemEndpointMachine; @@ -25,10 +26,12 @@ import com.lowdragmc.lowdraglib.side.fluid.forge.FluidTransferHelperImpl; import com.lowdragmc.lowdraglib.side.item.IItemTransfer; import com.lowdragmc.lowdraglib.side.item.forge.ItemTransferHelperImpl; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; import com.lowdragmc.lowdraglib.syncdata.managed.MultiManagedStorage; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; @@ -45,13 +48,11 @@ import appeng.api.networking.IInWorldGridNodeHost; import appeng.capabilities.Capabilities; import lombok.Getter; +import lombok.Setter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Set; +import java.util.*; /** * @author KilaBash @@ -63,6 +64,10 @@ public class MetaMachineBlockEntity extends BlockEntity implements IMachineBlock public final MultiManagedStorage managedStorage = new MultiManagedStorage(); @Getter public final MetaMachine metaMachine; + @Setter + @Getter + @Persisted + private IMachineOwner owner; private final long offset = GTValues.RNG.nextInt(20); protected MetaMachineBlockEntity(BlockEntityType type, BlockPos pos, BlockState blockState) { @@ -317,4 +322,20 @@ public AABB getRenderBoundingBox() { } return new AABB(worldPosition.offset(-1, 0, -1), worldPosition.offset(2, 2, 2)); } + + @Override + protected void saveAdditional(CompoundTag tag) { + super.saveAdditional(tag); + if (owner != null) { + tag.put("owner", owner.write()); + } + } + + @Override + public void load(CompoundTag tag) { + super.load(tag); + if (tag.contains("owner")) { + this.owner = IMachineOwner.create(tag.getCompound("owner")); + } + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/IMachineBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/machine/IMachineBlockEntity.java index 9da6b13811..0f59590c2c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/IMachineBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/IMachineBlockEntity.java @@ -2,6 +2,7 @@ import com.gregtechceu.gtceu.api.block.IMachineBlock; import com.gregtechceu.gtceu.api.item.tool.IToolGridHighLight; +import com.gregtechceu.gtceu.common.machine.owner.IMachineOwner; import com.lowdragmc.lowdraglib.syncdata.blockentity.IAsyncAutoSyncBlockEntity; import com.lowdragmc.lowdraglib.syncdata.blockentity.IAutoPersistBlockEntity; @@ -81,4 +82,10 @@ default void loadCustomPersistedData(CompoundTag tag) { IAutoPersistBlockEntity.super.loadCustomPersistedData(tag); getMetaMachine().loadCustomPersistedData(tag); } + + default void setOwner(IMachineOwner owner) {} + + default IMachineOwner getOwner() { + return null; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/KineticMachineBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/KineticMachineBlockEntity.java index 4fb38f54b4..1d46782939 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/KineticMachineBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/KineticMachineBlockEntity.java @@ -10,6 +10,7 @@ import com.lowdragmc.lowdraglib.LDLib; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; import com.lowdragmc.lowdraglib.syncdata.managed.MultiManagedStorage; import net.minecraft.ChatFormatting; @@ -44,6 +45,7 @@ import java.util.List; import java.util.Set; +import java.util.UUID; import java.util.function.BiFunction; /** @@ -59,6 +61,12 @@ public class KineticMachineBlockEntity extends KineticBlockEntity implements IMa private final long offset = GTValues.RNG.nextInt(20); public float workingSpeed; public boolean reActivateSource; + @DescSynced + private UUID owner; + @Getter + @DescSynced + private String ownerName; + private Class ownerType; protected KineticMachineBlockEntity(BlockEntityType typeIn, BlockPos pos, BlockState state) { super(typeIn, pos, state); diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java index 641e7c225a..3d0b3c16a4 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/PortableScannerBehavior.java @@ -200,6 +200,9 @@ public int addScannerInfo(Player player, Level level, BlockPos pos, DisplayMode // General machine information if (mode == DisplayMode.SHOW_ALL || mode == DisplayMode.SHOW_MACHINE_INFO) { + if (machineBlockEntity.getOwner() != null) { + machineBlockEntity.getOwner().displayInfo(list); + } if (machine.getDefinition() instanceof MultiblockMachineDefinition multi && multi.isAllowExtendedFacing()) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/owner/ArgonautsOwner.java b/src/main/java/com/gregtechceu/gtceu/common/machine/owner/ArgonautsOwner.java new file mode 100644 index 0000000000..c4019391d5 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/owner/ArgonautsOwner.java @@ -0,0 +1,89 @@ +package com.gregtechceu.gtceu.common.machine.owner; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.server.ServerLifecycleHooks; + +import earth.terrarium.argonauts.api.guild.Guild; +import earth.terrarium.argonauts.common.handlers.guild.GuildHandler; +import lombok.Getter; + +import java.util.List; +import java.util.UUID; + +public final class ArgonautsOwner implements IMachineOwner { + + @Getter + private Guild guild; + @Getter + private UUID playerUUID; + private MinecraftServer server; + + public ArgonautsOwner() {} + + public ArgonautsOwner(Guild guild, UUID player) { + this.guild = guild; + this.playerUUID = player; + this.server = ServerLifecycleHooks.getCurrentServer(); + } + + @Override + public void save(CompoundTag tag) { + tag.putUUID("guildUUID", guild.id()); + tag.putUUID("playerUUID", playerUUID); + } + + @Override + public void load(CompoundTag tag) { + this.playerUUID = tag.getUUID("playerUUID"); + this.server = ServerLifecycleHooks.getCurrentServer(); + var handler = GuildHandler.read(server); + this.guild = GuildHandler.API.get(server, tag.getUUID("guildUUID")); + } + + @Override + public boolean isPlayerInTeam(Player player) { + if (player.getUUID().equals(this.playerUUID)) return true; + var otherGuild = GuildHandler.read(server).get(server, player.getUUID()); + if (otherGuild != null && otherGuild.equals(this.guild)) return true; + + return false; + } + + @Override + public boolean isPlayerFriendly(Player player) { + if (guild.isPublic()) return true; + + if (guild.members().isMember(player.getUUID())) return true; + if (guild.members().isInvited(player.getUUID())) return true; + if (guild.members().isAllied(player.getUUID())) return true; + return false; + } + + @Override + public void displayInfo(List compList) { + compList.add(Component.translatable("behavior.portable_scanner.machine_ownership", type().getName())); + compList.add(Component.translatable("behavior.portable_scanner.guild_name", guild.displayName().getString())); + var serverPlayer = ServerLifecycleHooks.getCurrentServer().getPlayerList().getPlayer(playerUUID); + final String[] playerName = new String[1]; + boolean isOnline; + if (serverPlayer != null) { + playerName[0] = serverPlayer.getDisplayName().getString(); + isOnline = true; + } else { + var cache = ServerLifecycleHooks.getCurrentServer().getProfileCache(); + if (cache != null) { + cache.get(playerUUID).ifPresent(value -> playerName[0] = value.getName()); + } + isOnline = false; + } + compList.add(Component.translatable("behavior.portable_scanner.player_name", playerName[0], isOnline)); + } + + @Override + public MachineOwnerType type() { + return MachineOwnerType.ARGONAUTS; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/owner/FTBOwner.java b/src/main/java/com/gregtechceu/gtceu/common/machine/owner/FTBOwner.java new file mode 100644 index 0000000000..d094d87457 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/owner/FTBOwner.java @@ -0,0 +1,79 @@ +package com.gregtechceu.gtceu.common.machine.owner; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.server.ServerLifecycleHooks; + +import dev.ftb.mods.ftbteams.FTBTeamsAPIImpl; +import dev.ftb.mods.ftbteams.api.Team; +import lombok.Getter; + +import java.util.List; +import java.util.UUID; + +public final class FTBOwner implements IMachineOwner { + + @Getter + private Team team; + @Getter + private UUID playerUUID; + + public FTBOwner() {} + + public FTBOwner(Team team, UUID player) { + this.team = team; + this.playerUUID = player; + } + + @Override + public void save(CompoundTag tag) { + tag.putUUID("teamUUID", team.getTeamId()); + tag.putUUID("playerUUID", playerUUID); + } + + @Override + public void load(CompoundTag tag) { + this.team = FTBTeamsAPIImpl.INSTANCE.getManager().getTeamByID(tag.getUUID("teamUUID")).orElse(null); + this.playerUUID = tag.getUUID("playerUUID"); + } + + @Override + public boolean isPlayerInTeam(Player player) { + if (player.getUUID().equals(this.playerUUID)) return true; + if (FTBTeamsAPIImpl.INSTANCE.getManager().arePlayersInSameTeam(player.getUUID(), this.playerUUID)) return true; + + return false; + } + + @Override + public boolean isPlayerFriendly(Player player) { + if (team.getRankForPlayer(player.getUUID()).isAllyOrBetter()) return true; + return false; + } + + @Override + public void displayInfo(List compList) { + compList.add(Component.translatable("behavior.portable_scanner.machine_ownership", type().getName())); + compList.add(Component.translatable("behavior.portable_scanner.team_name", team.getName())); + var serverPlayer = ServerLifecycleHooks.getCurrentServer().getPlayerList().getPlayer(playerUUID); + final String[] playerName = new String[1]; + boolean isOnline; + if (serverPlayer != null) { + playerName[0] = serverPlayer.getDisplayName().getString(); + isOnline = true; + } else { + var cache = ServerLifecycleHooks.getCurrentServer().getProfileCache(); + if (cache != null) { + cache.get(playerUUID).ifPresent(value -> playerName[0] = value.getName()); + } + isOnline = false; + } + compList.add(Component.translatable("behavior.portable_scanner.player_name", playerName[0], isOnline)); + } + + @Override + public MachineOwnerType type() { + return MachineOwnerType.FTB; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/owner/IMachineOwner.java b/src/main/java/com/gregtechceu/gtceu/common/machine/owner/IMachineOwner.java new file mode 100644 index 0000000000..9f90afd18f --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/owner/IMachineOwner.java @@ -0,0 +1,82 @@ +package com.gregtechceu.gtceu.common.machine.owner; + +import com.gregtechceu.gtceu.GTCEu; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; + +import lombok.Getter; + +import java.util.List; +import java.util.function.BooleanSupplier; + +public sealed interface IMachineOwner permits PlayerOwner, ArgonautsOwner, FTBOwner { + + void save(CompoundTag tag); + + void load(CompoundTag tag); + + MachineOwnerType type(); + + void displayInfo(List compList); + + static IMachineOwner create(CompoundTag tag) { + MachineOwnerType type = MachineOwnerType.VALUES[tag.getInt("type")]; + if (!type.isAvailable()) { + GTCEu.LOGGER.warn("Machine ownership system: {} is not available", type.name()); + return null; + } + IMachineOwner owner = switch (type) { + case PLAYER -> new PlayerOwner(); + case FTB -> new FTBOwner(); + case ARGONAUTS -> new ArgonautsOwner(); + }; + owner.load(tag); + return owner; + } + + default CompoundTag write() { + var tag = new CompoundTag(); + tag.putInt("type", type().ordinal()); + save(tag); + return tag; + } + + boolean isPlayerInTeam(Player player); + + boolean isPlayerFriendly(Player player); + + enum MachineOwnerType { + + PLAYER, + FTB(GTCEu::isFTBTeamsLoaded, "FTB Teams"), + ARGONAUTS(GTCEu::isArgonautsLoaded, "Argonauts Guild"); + + public static final MachineOwnerType[] VALUES = values(); + + private BooleanSupplier availabilitySupplier; + private boolean available; + + @Getter + private final String name; + + private MachineOwnerType(BooleanSupplier availabilitySupplier, String name) { + this.availabilitySupplier = availabilitySupplier; + this.name = name; + } + + private MachineOwnerType() { + this.available = true; + this.name = "Player"; + } + + public boolean isAvailable() { + if (availabilitySupplier != null) { + this.available = availabilitySupplier.getAsBoolean(); + this.availabilitySupplier = null; + } + return available; + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/owner/PlayerOwner.java b/src/main/java/com/gregtechceu/gtceu/common/machine/owner/PlayerOwner.java new file mode 100644 index 0000000000..062e8402af --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/owner/PlayerOwner.java @@ -0,0 +1,67 @@ +package com.gregtechceu.gtceu.common.machine.owner; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.server.ServerLifecycleHooks; + +import lombok.Getter; + +import java.util.List; +import java.util.UUID; + +public final class PlayerOwner implements IMachineOwner { + + @Getter + private UUID playerUUID; + + public PlayerOwner() {} + + public PlayerOwner(UUID player) { + this.playerUUID = player; + } + + @Override + public void save(CompoundTag tag) { + tag.putUUID("UUID", playerUUID); + } + + @Override + public void load(CompoundTag tag) { + this.playerUUID = tag.getUUID("UUID"); + } + + @Override + public boolean isPlayerInTeam(Player player) { + return true; + } + + @Override + public boolean isPlayerFriendly(Player player) { + return true; + } + + @Override + public void displayInfo(List compList) { + compList.add(Component.translatable("behavior.portable_scanner.machine_ownership", type().getName())); + var serverPlayer = ServerLifecycleHooks.getCurrentServer().getPlayerList().getPlayer(playerUUID); + final String[] playerName = new String[1]; + boolean isOnline; + if (serverPlayer != null) { + playerName[0] = serverPlayer.getDisplayName().getString(); + isOnline = true; + } else { + var cache = ServerLifecycleHooks.getCurrentServer().getProfileCache(); + if (cache != null) { + cache.get(playerUUID).ifPresent(value -> playerName[0] = value.getName()); + } + isOnline = false; + } + compList.add(Component.translatable("behavior.portable_scanner.player_name", playerName[0], isOnline)); + } + + @Override + public MachineOwnerType type() { + return MachineOwnerType.PLAYER; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index 00e79c0fa2..d2595fab50 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -389,6 +389,13 @@ public static class MachineConfigs { @Configurable.Comment({ "Minimum distance betweeb Long Distance Fluid Pipe Endpoints", "Default: 50" }) public int ldFluidPipeMinDistance = 50; + @Configurable + @Configurable.Comment({ "Whether non owners can open a machine gui", "Default: false" }) + public boolean machineOwnerGUI = true; + @Configurable + @Configurable.Comment({ "Whether non owners can break a machine", "Default: false" }) + public boolean machineOwnerBreak = true; + /** * Addons mods should not reference this config directly. * Use {@link GTCEuAPI#isHighTier()} instead. diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index f2a7226c4a..3350d6555c 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -771,6 +771,10 @@ public static void init(RegistrateLangProvider provider) { provider.add("behavior.portable_scanner.amp_per_sec", "Average (last second): %s A"); provider.add("behavior.portable_scanner.machine_disabled", "Disabled."); provider.add("behavior.portable_scanner.machine_front_facing", "Front Facing: %s"); + provider.add("behavior.portable_scanner.machine_ownership", "§2Machine Owner Type: %s§r"); + provider.add("behavior.portable_scanner.guild_name", "§2Guild Name: %s§r"); + provider.add("behavior.portable_scanner.team_name", "§2Team Name: %s§r"); + provider.add("behavior.portable_scanner.player_name", "§2Player Name: %s§r, §7Player Online: %s§r"); provider.add("behavior.portable_scanner.machine_power_loss", "Shut down due to power loss."); provider.add("behavior.portable_scanner.machine_progress", "Progress/Load: %s / %s"); provider.add("behavior.portable_scanner.machine_upwards_facing", "Upwards Facing: %s"); diff --git a/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java b/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java index 38bc9b8849..2cf95924d5 100644 --- a/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java @@ -18,6 +18,7 @@ import com.gregtechceu.gtceu.api.item.IComponentItem; import com.gregtechceu.gtceu.api.item.TagPrefixItem; import com.gregtechceu.gtceu.api.item.armor.ArmorComponentItem; +import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.common.capability.EnvironmentalHazardSavedData; @@ -71,6 +72,7 @@ import net.minecraftforge.event.entity.living.MobSpawnEvent; import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.event.level.BlockEvent; import net.minecraftforge.event.level.ChunkWatchEvent; import net.minecraftforge.event.level.LevelEvent; import net.minecraftforge.eventbus.api.EventPriority; @@ -208,6 +210,16 @@ public static void onLeftClickBlock(PlayerInteractEvent.LeftClickBlock event) { } } + @SubscribeEvent + public static void onBreakEvent(BlockEvent.BreakEvent event) { + var machine = MetaMachine.getMachine(event.getLevel(), event.getPos()); + if (machine != null) { + if (!MetaMachineBlock.canBreakOwnerMachine(event.getPlayer(), machine.holder)) { + event.setCanceled(true); + } + } + } + @SubscribeEvent public static void registerCommand(RegisterCommandsEvent event) { GTCommands.register(event.getDispatcher(), event.getBuildContext()); From 084df879a71f72d285520447014a1144e53fb604 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Sat, 28 Sep 2024 19:31:47 -0600 Subject: [PATCH 074/141] Give coils an actual EU discount in EBF (#2055) --- .../gregtechceu/gtceu/common/data/GTRecipeModifiers.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeModifiers.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeModifiers.java index 03bb1057e1..466aa4dd91 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeModifiers.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeModifiers.java @@ -40,6 +40,8 @@ import javax.annotation.ParametersAreNonnullByDefault; +import static com.gregtechceu.gtceu.api.recipe.OverclockingLogic.applyCoilEUtDiscount; + /** * @author KilaBash * @date 2023/7/9 @@ -205,6 +207,13 @@ public static GTRecipe ebfOverclock(MetaMachine machine, @NotNull GTRecipe recip if (RecipeHelper.getRecipeEUtTier(recipe) > coilMachine.getTier()) { return null; } + + recipe.tickInputs.put(EURecipeCapability.CAP, List.of(new Content( + applyCoilEUtDiscount(RecipeHelper.getInputEUt(recipe), + blastFurnaceTemperature, recipe.data.getInt("ebf_temp")), + ChanceLogic.getMaxChancedValue(), ChanceLogic.getMaxChancedValue(), + 0, null, null))); + return RecipeHelper.applyOverclock( new OverclockingLogic((p, r, maxVoltage) -> OverclockingLogic.heatingCoilOC( params, result, maxVoltage, From 2f22a3ecb2301afc0bce725f3f0ef0131339eb5c Mon Sep 17 00:00:00 2001 From: Ghostipedia <46772882+Ghostipedia@users.noreply.github.com> Date: Sat, 28 Sep 2024 21:32:15 -0400 Subject: [PATCH 075/141] Fix Steam Multiblocks allowing greater than LV recipes (#2058) --- .../steam/SteamParallelMultiblockMachine.java | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/SteamParallelMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/SteamParallelMultiblockMachine.java index 2d45719165..40d8aabd55 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/SteamParallelMultiblockMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/SteamParallelMultiblockMachine.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.common.machine.multiblock.steam; +import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; @@ -32,6 +33,7 @@ import net.minecraft.world.entity.player.Player; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -73,17 +75,24 @@ public void onStructureFormed() { } } + @Nullable public static GTRecipe recipeModifier(MetaMachine machine, @NotNull GTRecipe recipe, @NotNull OCParams params, @NotNull OCResult result) { - int duration = recipe.duration; - var eut = RecipeHelper.getInputEUt(recipe); - var parallelRecipe = GTRecipeModifiers.accurateParallel(machine, recipe, MAX_PARALLELS, false); - - // we remove tick inputs, as our "cost" is just steam now, just stored as EU/t - // also set the duration to just 1.5x the original, instead of fully multiplied - result.init((long) Math.min(32, Math.ceil(eut * 1.33)), (int) (duration * 1.5), parallelRecipe.getSecond(), - params.getOcAmount()); - return recipe; + if (machine instanceof SteamParallelMultiblockMachine) { + if (RecipeHelper.getRecipeEUtTier(recipe) > GTValues.LV) { + return null; + } + int duration = recipe.duration; + var eut = RecipeHelper.getInputEUt(recipe); + var parallelRecipe = GTRecipeModifiers.accurateParallel(machine, recipe, MAX_PARALLELS, false); + + // we remove tick inputs, as our "cost" is just steam now, just stored as EU/t + // also set the duration to just 1.5x the original, instead of fully multiplied + result.init((long) Math.min(32, Math.ceil(eut * 1.33)), (int) (duration * 1.5), parallelRecipe.getSecond(), + params.getOcAmount()); + return recipe; + } + return null; } @Override From 4249d36804ec4f34d69d1a9af5bd71377f49086a Mon Sep 17 00:00:00 2001 From: Karthi Suresh <75553966+JuiceyBeans@users.noreply.github.com> Date: Sun, 29 Sep 2024 05:44:13 +0100 Subject: [PATCH 076/141] Update tooltip capitalization for consistency (#2061) --- src/generated/resources/assets/gtceu/lang/en_ud.json | 4 ++-- src/generated/resources/assets/gtceu/lang/en_us.json | 4 ++-- src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index a0ddc38c98..c21619d9b5 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -5019,7 +5019,7 @@ "item.gtceu.uxv_voltage_coil.tooltip": "ןıoƆ ɔıdƎ", "item.gtceu.vacuum_tube": "ǝqn⟘ ɯnnɔɐΛ", "item.gtceu.vacuum_tube.tooltip.0": "ǝpoıᗡ ɐ ʎןןɐɔıuɥɔǝ⟘ㄥ§", - "item.gtceu.vacuum_tube.tooltip.1": "ɹǝıʇ-ΛꞀ∩ɔ§", + "item.gtceu.vacuum_tube.tooltip.1": "ɹǝı⟘-ΛꞀ∩ɔ§", "item.gtceu.wetware_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ ǝɹɐʍʇǝM", "item.gtceu.wetware_circuit_board.tooltip": "ǝɟıן sdǝǝʞ ʇɐɥʇ pɹɐoᗺ ǝɥ⟘ㄥ§", "item.gtceu.wetware_printed_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ pǝʇuıɹԀ ǝɹɐʍʇǝM", @@ -5029,7 +5029,7 @@ "item.gtceu.wetware_processor.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-ΛnꞀㄣ§", "item.gtceu.wetware_processor_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ ǝɹɐʍʇǝM", "item.gtceu.wetware_processor_assembly.tooltip.0": "ʇɟɐɹɔǝuıW unɹ uɐƆㄥ§", - "item.gtceu.wetware_processor_assembly.tooltip.1": "ʇınɔɹıƆ ɹǝıʇ-WԀZㄣ§", + "item.gtceu.wetware_processor_assembly.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-WԀZㄣ§", "item.gtceu.wetware_processor_computer": "ɹǝʇndɯoɔɹǝdnS ɹossǝɔoɹԀ ǝɹɐʍʇǝM", "item.gtceu.wetware_processor_computer.tooltip.0": "ǝuıɥɔɐW puɐ ɥsǝןℲ ɟo uoısnɟ ǝʇɐɯıʇן∩ㄥ§", "item.gtceu.wetware_processor_computer.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-Λ∩ㄣ§", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index a885320d34..77f89e759f 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -5019,7 +5019,7 @@ "item.gtceu.uxv_voltage_coil.tooltip": "Epic Coil", "item.gtceu.vacuum_tube": "Vacuum Tube", "item.gtceu.vacuum_tube.tooltip.0": "§7Technically a Diode", - "item.gtceu.vacuum_tube.tooltip.1": "§cULV-tier", + "item.gtceu.vacuum_tube.tooltip.1": "§cULV-Tier", "item.gtceu.wetware_circuit_board": "Wetware Circuit Board", "item.gtceu.wetware_circuit_board.tooltip": "§7The Board that keeps life", "item.gtceu.wetware_printed_circuit_board": "Wetware Printed Circuit Board", @@ -5029,7 +5029,7 @@ "item.gtceu.wetware_processor.tooltip.1": "§4LuV-Tier Circuit", "item.gtceu.wetware_processor_assembly": "Wetware Processor Assembly", "item.gtceu.wetware_processor_assembly.tooltip.0": "§7Can run Minecraft", - "item.gtceu.wetware_processor_assembly.tooltip.1": "§4ZPM-tier Circuit", + "item.gtceu.wetware_processor_assembly.tooltip.1": "§4ZPM-Tier Circuit", "item.gtceu.wetware_processor_computer": "Wetware Processor Supercomputer", "item.gtceu.wetware_processor_computer.tooltip.0": "§7Ultimate fusion of Flesh and Machine", "item.gtceu.wetware_processor_computer.tooltip.1": "§4UV-Tier Circuit", diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java index 89a497c2de..44432f61f7 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java @@ -178,7 +178,7 @@ private static void initItemTooltips(RegistrateLangProvider provider) { provider.add("item.gtceu.multilayer_fiber_reinforced_printed_circuit_board.tooltip", "§7An Elite Circuit Board"); provider.add("item.gtceu.wetware_printed_circuit_board.tooltip", "§7The Board that keeps life"); - multilineLang(provider, "item.gtceu.vacuum_tube.tooltip", "§7Technically a Diode\n§cULV-tier"); + multilineLang(provider, "item.gtceu.vacuum_tube.tooltip", "§7Technically a Diode\n§cULV-Tier"); provider.add("item.gtceu.diode.tooltip", "§7Basic Electronic Component"); provider.add("item.gtceu.resistor.tooltip", "§7Basic Electronic Component"); provider.add("item.gtceu.transistor.tooltip", "§7Basic Electronic Component"); @@ -276,7 +276,7 @@ private static void initItemTooltips(RegistrateLangProvider provider) { multilineLang(provider, "item.gtceu.wetware_processor.tooltip", "§7You have a feeling like it's watching you\n§4LuV-Tier Circuit"); multilineLang(provider, "item.gtceu.wetware_processor_assembly.tooltip", - "§7Can run Minecraft\n§4ZPM-tier Circuit"); + "§7Can run Minecraft\n§4ZPM-Tier Circuit"); multilineLang(provider, "item.gtceu.wetware_processor_computer.tooltip", "§7Ultimate fusion of Flesh and Machine\n§4UV-Tier Circuit"); multilineLang(provider, "item.gtceu.wetware_processor_mainframe.tooltip", From 07567b5afc60a039a54b22bdfa36c030a1b4610d Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Sun, 29 Sep 2024 00:49:25 -0400 Subject: [PATCH 077/141] Update manage-pr-labels.yml (#2062) --- .github/workflows/manage-pr-labels.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/manage-pr-labels.yml b/.github/workflows/manage-pr-labels.yml index 7dcddd620b..f396fccdea 100644 --- a/.github/workflows/manage-pr-labels.yml +++ b/.github/workflows/manage-pr-labels.yml @@ -35,5 +35,5 @@ jobs: with: mode: minimum count: 1 - labels: 'type: feature, type: bug, type: refactor, type: translation, ignore changelog' + labels: 'type: feature, type: bugfix, type: refactor, type: translation, ignore changelog' exit_type: failure From 0081b18a21b8b650a2566d5e572313901a5d9db3 Mon Sep 17 00:00:00 2001 From: Karthi Suresh <75553966+JuiceyBeans@users.noreply.github.com> Date: Sun, 29 Sep 2024 05:50:34 +0100 Subject: [PATCH 078/141] Misc recipe fixes (#2056) --- .../recipe/configurable/RecipeAddition.java | 9 ++---- .../recipe/misc/VanillaStandardRecipes.java | 29 +++++++++++-------- .../data/recipe/misc/WoodMachineRecipes.java | 2 +- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java index 3ce88c9b1a..fa8be29532 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java @@ -145,11 +145,6 @@ private static void hardWoodRecipes(Consumer provider) { "PsP", "PSP", 'P', ItemTags.PLANKS, 'S', ItemTags.WOODEN_SLABS); - - ASSEMBLER_RECIPES.recipeBuilder("barrel") - .inputItems(ItemTags.PLANKS, 7) - .outputItems(new ItemStack(Blocks.BARREL)) - .duration(100).EUt(4).save(provider); } private static void hardIronRecipes(Consumer provider) { @@ -1181,7 +1176,7 @@ private static void hardMiscRecipes(Consumer provider) { ASSEMBLER_RECIPES.recipeBuilder("composter") .inputItems(ItemTags.PLANKS, 4) - .circuitMeta(1) + .circuitMeta(23) .outputItems(new ItemStack(Blocks.COMPOSTER)) .duration(80).EUt(6).save(provider); @@ -1533,7 +1528,7 @@ private static void removeVanillaBlockRecipes(Consumer provider) VanillaRecipeHelper.addShapedRecipe(provider, "polished_deepslate_slab_saw", new ItemStack(Blocks.POLISHED_DEEPSLATE_SLAB), "sS", 'S', new ItemStack(Blocks.POLISHED_DEEPSLATE)); VanillaRecipeHelper.addShapedRecipe(provider, "deepslate_brick_slab_saw", - new ItemStack(Blocks.DEEPSLATE_BRICKS), "sS", 'S', new ItemStack(Blocks.DEEPSLATE_BRICK_SLAB)); + new ItemStack(Blocks.DEEPSLATE_BRICK_SLAB), "sS", 'S', new ItemStack(Blocks.DEEPSLATE_BRICKS)); VanillaRecipeHelper.addShapedRecipe(provider, "deepslate_tile_slab_saw", new ItemStack(Blocks.DEEPSLATE_TILE_SLAB), "sS", 'S', new ItemStack(Blocks.DEEPSLATE_TILES)); } 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 b3e856005a..ed30b06f44 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 @@ -578,16 +578,12 @@ private static void woodRecipes(Consumer provider) { ASSEMBLER_RECIPES.recipeBuilder("ladder").EUt(4).duration(40).circuitMeta(7) .inputItems(new ItemStack(Items.STICK, 7)).outputItems(new ItemStack(Blocks.LADDER, 2)).save(provider); - ASSEMBLER_RECIPES.recipeBuilder("chest_minecart").EUt(4).duration(100).inputItems(new ItemStack(Items.MINECART)) - .inputItems(Tags.Items.CHESTS_WOODEN).outputItems(new ItemStack(Items.CHEST_MINECART)).save(provider); - ASSEMBLER_RECIPES.recipeBuilder("furnace_minecart").EUt(4).duration(100) - .inputItems(new ItemStack(Items.MINECART)).inputItems(new ItemStack(Blocks.FURNACE)) - .outputItems(new ItemStack(Items.FURNACE_MINECART)).save(provider); - ASSEMBLER_RECIPES.recipeBuilder("tnt_minecart").EUt(4).duration(100).inputItems(new ItemStack(Items.MINECART)) - .inputItems(new ItemStack(Blocks.TNT)).outputItems(new ItemStack(Items.TNT_MINECART)).save(provider); - ASSEMBLER_RECIPES.recipeBuilder("hopper_minecart").EUt(4).duration(100) - .inputItems(new ItemStack(Items.MINECART)).inputItems(new ItemStack(Blocks.HOPPER)) - .outputItems(new ItemStack(Items.HOPPER_MINECART)).save(provider); + ASSEMBLER_RECIPES.recipeBuilder("barrel") + .inputItems(ItemTags.PLANKS, 7) + .outputItems(new ItemStack(Blocks.BARREL)) + .circuitMeta(24) + .duration(100).EUt(4) + .save(provider); } /** @@ -1228,12 +1224,21 @@ private static void miscRecipes(Consumer provider) { .outputItems(new ItemStack(Blocks.CANDLE, 2)) .duration(20).EUt(1).save(provider); - // I realise this recipe may genuinely NEVER be used by someone, so feel free to remove them. - // At the same time, they don't really change anything by being there? Idk FORGE_HAMMER_RECIPES.recipeBuilder("disc_fragment_5") .inputItems(new ItemStack(Items.MUSIC_DISC_5)) .outputItems(new ItemStack(Items.DISC_FRAGMENT_5, 9)) .duration(100).EUt(6).save(provider); + + ASSEMBLER_RECIPES.recipeBuilder("chest_minecart").EUt(4).duration(100).inputItems(new ItemStack(Items.MINECART)) + .inputItems(Tags.Items.CHESTS_WOODEN).outputItems(new ItemStack(Items.CHEST_MINECART)).save(provider); + ASSEMBLER_RECIPES.recipeBuilder("furnace_minecart").EUt(4).duration(100) + .inputItems(new ItemStack(Items.MINECART)).inputItems(new ItemStack(Blocks.FURNACE)) + .outputItems(new ItemStack(Items.FURNACE_MINECART)).save(provider); + ASSEMBLER_RECIPES.recipeBuilder("tnt_minecart").EUt(4).duration(100).inputItems(new ItemStack(Items.MINECART)) + .inputItems(new ItemStack(Blocks.TNT)).outputItems(new ItemStack(Items.TNT_MINECART)).save(provider); + ASSEMBLER_RECIPES.recipeBuilder("hopper_minecart").EUt(4).duration(100) + .inputItems(new ItemStack(Items.MINECART)).inputItems(new ItemStack(Blocks.HOPPER)) + .outputItems(new ItemStack(Items.HOPPER_MINECART)).save(provider); } /** 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 6674b5b159..f76ee0b6d4 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 @@ -643,7 +643,7 @@ public static void registerWoodTypeRecipe(Consumer provider, @No ASSEMBLER_RECIPES.recipeBuilder(name + "_fence") .inputItems(entry.planks) .outputItems(entry.fence) - .circuitMeta(1) + .circuitMeta(13) .duration(100).EUt(4) .save(provider); } From 5f083160bc5ca7234e4f752683b6f7e57a8854ed Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Mon, 30 Sep 2024 13:30:36 -0600 Subject: [PATCH 079/141] Torch Behaviour, now with less duping (#2067) --- .../gtceu/api/item/tool/GTToolType.java | 16 +-- .../tool/behavior/TorchPlaceBehavior.java | 120 +++++++++--------- 2 files changed, 68 insertions(+), 68 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolType.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolType.java index 3f189c7c38..4d1f7cd944 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolType.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/GTToolType.java @@ -53,8 +53,8 @@ public class GTToolType { .toolTag(TagUtil.createItemTag("pickaxes", true)) .toolTag(ItemTags.CLUSTER_MAX_HARVESTABLES) .harvestTag(TagUtil.createBlockTag("mineable/pickaxe", true)) - .toolStats(b -> b.blockBreaking().attackDamage(1.0F).attackSpeed(-2.8F)) - /* .behaviors(TorchPlaceBehavior.INSTANCE) */ + .toolStats(b -> b.blockBreaking().attackDamage(1.0F).attackSpeed(-2.8F) + .behaviors(TorchPlaceBehavior.INSTANCE)) .toolClassNames("pickaxe") .build(); public static final GTToolType SHOVEL = GTToolType.builder("shovel") @@ -89,7 +89,7 @@ public class GTToolType { .toolStats(b -> b.blockBreaking().aoe(1, 1, 0) .efficiencyMultiplier(0.4F).attackDamage(1.5F).attackSpeed(-3.2F) .durabilityMultiplier(3.0F) - /* .behaviors(TorchPlaceBehavior.INSTANCE) */) + .behaviors(TorchPlaceBehavior.INSTANCE)) .toolClasses(GTToolType.PICKAXE) .build(); public static final GTToolType SPADE = GTToolType.builder("spade") @@ -227,7 +227,7 @@ public class GTToolType { .toolStats(b -> b.blockBreaking().aoe(1, 1, 0) .attackDamage(1.0F).attackSpeed(-3.2F).durabilityMultiplier(3.0F) .brokenStack(ToolHelper.SUPPLY_POWER_UNIT_LV) - /* .behaviors(TorchPlaceBehavior.INSTANCE) */) + .behaviors(TorchPlaceBehavior.INSTANCE)) .sound(GTSoundEntries.DRILL_TOOL, true) .electric(GTValues.LV) .toolClassNames("drill") @@ -243,7 +243,7 @@ public class GTToolType { .toolStats(b -> b.blockBreaking().aoe(1, 1, 2) .attackDamage(1.0F).attackSpeed(-3.2F).durabilityMultiplier(4.0F) .brokenStack(ToolHelper.SUPPLY_POWER_UNIT_MV) - /* .behaviors(TorchPlaceBehavior.INSTANCE) */) + .behaviors(TorchPlaceBehavior.INSTANCE)) .sound(GTSoundEntries.DRILL_TOOL, true) .electric(GTValues.MV) .toolClassNames("drill") @@ -259,7 +259,7 @@ public class GTToolType { .toolStats(b -> b.blockBreaking().aoe(2, 2, 4) .attackDamage(1.0F).attackSpeed(-3.2F).durabilityMultiplier(5.0F) .brokenStack(ToolHelper.SUPPLY_POWER_UNIT_HV) - /* .behaviors(TorchPlaceBehavior.INSTANCE) */) + .behaviors(TorchPlaceBehavior.INSTANCE)) .sound(GTSoundEntries.DRILL_TOOL, true) .electric(GTValues.HV) .toolClassNames("drill") @@ -275,7 +275,7 @@ public class GTToolType { .toolStats(b -> b.blockBreaking().aoe(3, 3, 6) .attackDamage(1.0F).attackSpeed(-3.2F).durabilityMultiplier(6.0F) .brokenStack(ToolHelper.SUPPLY_POWER_UNIT_EV) - /* .behaviors(TorchPlaceBehavior.INSTANCE) */) + .behaviors(TorchPlaceBehavior.INSTANCE)) .sound(GTSoundEntries.DRILL_TOOL, true) .electric(GTValues.EV) .toolClassNames("drill") @@ -291,7 +291,7 @@ public class GTToolType { .toolStats(b -> b.blockBreaking().aoe(4, 4, 8) .attackDamage(1.0F).attackSpeed(-3.2F).durabilityMultiplier(7.0F) .brokenStack(ToolHelper.SUPPLY_POWER_UNIT_IV) - /* .behaviors(TorchPlaceBehavior.INSTANCE) */) + .behaviors(TorchPlaceBehavior.INSTANCE)) .sound(GTSoundEntries.DRILL_TOOL, true) .electric(GTValues.IV) .toolClassNames("drill") diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/TorchPlaceBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/TorchPlaceBehavior.java index fed5c13a0f..41266b1449 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/TorchPlaceBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/TorchPlaceBehavior.java @@ -7,20 +7,13 @@ import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; -import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.*; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.NotNull; @@ -30,7 +23,6 @@ import static com.gregtechceu.gtceu.api.item.tool.ToolHelper.TORCH_PLACING_KEY; -// TODO this currently voids the used tool as well as a torch. how fix? public class TorchPlaceBehavior implements IToolBehavior { public static final TorchPlaceBehavior INSTANCE = new TorchPlaceBehavior(); @@ -44,65 +36,73 @@ protected TorchPlaceBehavior() {/**/} ItemStack stack = player.getItemInHand(hand); CompoundTag behaviourTag = ToolHelper.getBehaviorsTag(stack); - if (behaviourTag.getBoolean(TORCH_PLACING_KEY)) { - int cachedTorchSlot; - ItemStack slotStack; - if (behaviourTag.getBoolean(ToolHelper.TORCH_PLACING_CACHE_SLOT_KEY)) { - cachedTorchSlot = behaviourTag.getInt(ToolHelper.TORCH_PLACING_CACHE_SLOT_KEY); - if (cachedTorchSlot < 0) { - slotStack = player.getInventory().offhand.get(0); - } else { - slotStack = player.getInventory().items.get(cachedTorchSlot); - } - if (checkAndPlaceTorch(context, slotStack)) { - return InteractionResult.SUCCESS; - } + + if (!behaviourTag.getBoolean(TORCH_PLACING_KEY)) { + return InteractionResult.PASS; + } + + int cachedTorchSlot; + ItemStack slotStack; + if (behaviourTag.getBoolean(ToolHelper.TORCH_PLACING_CACHE_SLOT_KEY)) { + cachedTorchSlot = behaviourTag.getInt(ToolHelper.TORCH_PLACING_CACHE_SLOT_KEY); + if (cachedTorchSlot < 0) { + slotStack = player.getInventory().offhand.get(0); + } else { + slotStack = player.getInventory().items.get(cachedTorchSlot); } - for (int i = 0; i < player.getInventory().offhand.size(); i++) { - slotStack = player.getInventory().offhand.get(i); - if (checkAndPlaceTorch(context, slotStack)) { - behaviourTag.putInt(ToolHelper.TORCH_PLACING_CACHE_SLOT_KEY, -(i + 1)); - return InteractionResult.SUCCESS; - } + if (checkAndPlaceTorch(context, slotStack)) { + return InteractionResult.SUCCESS; } - for (int i = 0; i < player.getInventory().items.size(); i++) { - slotStack = player.getInventory().items.get(i); - if (checkAndPlaceTorch(context, slotStack)) { - behaviourTag.putInt(ToolHelper.TORCH_PLACING_CACHE_SLOT_KEY, i); - return InteractionResult.SUCCESS; - } + } + for (int i = 0; i < player.getInventory().offhand.size(); i++) { + slotStack = player.getInventory().offhand.get(i); + if (checkAndPlaceTorch(context, slotStack)) { + behaviourTag.putInt(ToolHelper.TORCH_PLACING_CACHE_SLOT_KEY, -(i + 1)); + return InteractionResult.SUCCESS; + } + } + for (int i = 0; i < player.getInventory().items.size(); i++) { + slotStack = player.getInventory().items.get(i); + if (checkAndPlaceTorch(context, slotStack)) { + behaviourTag.putInt(ToolHelper.TORCH_PLACING_CACHE_SLOT_KEY, i); + return InteractionResult.SUCCESS; } } return InteractionResult.PASS; } private static boolean checkAndPlaceTorch(UseOnContext context, ItemStack slotStack) { - if (!slotStack.isEmpty()) { - Item slotItem = slotStack.getItem(); - if (slotItem instanceof BlockItem slotItemBlock) { - Block slotBlock = slotItemBlock.getBlock(); - if (slotBlock == Blocks.TORCH || - slotStack.is(TagUtil.createItemTag("torches"))) { - BlockPos pos = context.getClickedPos(); - BlockState state = context.getLevel().getBlockState(pos); - if (!state.canBeReplaced()) { - pos = pos.relative(context.getClickedFace()); - } - if (context.getPlayer().mayUseItemAt(pos, context.getClickedFace(), slotStack)) { - var blockPlaceContext = new BlockPlaceContext(context); - BlockState slotState = slotBlock.getStateForPlacement(blockPlaceContext); - if (slotItemBlock.place(blockPlaceContext).consumesAction()) { - slotState = context.getLevel().getBlockState(pos); - SoundType soundtype = slotState.getBlock().getSoundType(slotState); - context.getLevel().playSound(context.getPlayer(), pos, soundtype.getPlaceSound(), - SoundSource.BLOCKS, - (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); - if (!context.getPlayer().isCreative()) slotStack.shrink(1); - return true; - } - } - } - } + if (context.getLevel().isClientSide) + return false; + + if (slotStack.isEmpty()) + return false; + + Item slotItem = slotStack.getItem(); + + if (slotItem != Items.TORCH && !slotStack.is(TagUtil.createItemTag("torches"))) + return false; + + if (context.getPlayer() == null) + return false; + + if (!(slotItem instanceof BlockItem slotItemBlock)) { + return false; + } + + BlockPos pos = context.getClickedPos(); + BlockState state = context.getLevel().getBlockState(pos); + + if (!state.canBeReplaced()) { + pos = pos.relative(context.getClickedFace()); + } + + if (context.getPlayer().mayUseItemAt(pos, context.getClickedFace(), slotStack)) { + var torchContext = new UseOnContext(context.getLevel(), context.getPlayer(), context.getHand(), slotStack, + context.getHitResult()); + var blockPlaceContext = new BlockPlaceContext(torchContext); + InteractionResult placed = slotItemBlock.place(blockPlaceContext); + return placed.consumesAction(); } return false; } From 0f2c997792b4176a0bb1d9b7fbac7e7bc84afb92 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Mon, 30 Sep 2024 13:30:58 -0600 Subject: [PATCH 080/141] Multiblock Display Text for Outputs (#2048) --- .../resources/assets/gtceu/lang/en_ud.json | 6 +- .../resources/assets/gtceu/lang/en_us.json | 6 +- .../feature/multiblock/IDisplayUIMachine.java | 2 +- .../multiblock/MultiblockDisplayText.java | 93 +++++++++++++++++-- .../WorkableElectricMultiblockMachine.java | 8 +- .../gtceu/data/lang/LangHandler.java | 6 +- .../gtceu/utils/FormattingUtil.java | 5 + 7 files changed, 111 insertions(+), 15 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index c21619d9b5..d7d5df66ee 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -3711,6 +3711,10 @@ "gtceu.multiblock.ore_rig.drilled_ore_entry": "%s - ", "gtceu.multiblock.ore_rig.drilled_ores_list": ":sǝɹO", "gtceu.multiblock.ore_rig.ore_amount": "%s :ǝʇɐᴚ buıןןıɹᗡ", + "gtceu.multiblock.output_line.0": ")ɐǝ/%ss( ɹ§%sǝ§ x %s", + "gtceu.multiblock.output_line.1": ")s/%s( ɹ§%sǝ§ x %s", + "gtceu.multiblock.output_line.2": ")ɐǝ/%ss( ɹ§%sǝ§ ≈ %s", + "gtceu.multiblock.output_line.3": ")s/%s( ɹ§%sǝ§ ≈ %s", "gtceu.multiblock.page_switcher.io.both": "sʇndʇnO + sʇnduI pǝuıqɯoƆϛ§", "gtceu.multiblock.page_switcher.io.export": "sʇndʇnOㄣ§", "gtceu.multiblock.page_switcher.io.import": "sʇnduIᄅ§", @@ -3767,7 +3771,7 @@ "gtceu.multiblock.primitive_water_pump.extra2.3": "xㄣ :ɥɔʇɐH ʇndʇnO ΛꞀ ", "gtceu.multiblock.primitive_water_pump.extra2.4": "", "gtceu.multiblock.primitive_water_pump.extra2.5": "˙%%0ϛ ʎq pǝsɐǝɹɔuı ǝq ןןıʍ uoıʇɔnpoɹd ɹǝʇɐʍ ןɐʇoʇ ǝɥʇ 'ǝɯoıᗺ s,dɯnԀ ǝɥʇ uı buıuıɐɹ ǝןıɥM", - "gtceu.multiblock.progress": "%s%% :ssǝɹboɹԀ", + "gtceu.multiblock.progress": ")%s%%( %ss / %ss :ssǝɹboɹԀ", "gtceu.multiblock.pyrolyse_oven.description": "˙ןıO ʎʌɐǝH puɐ ɥsⱯ ɹo 'ןıO ǝʇosoǝɹƆ puɐ ןɐoɔɹɐɥƆ oʇuı sboꞀ buıuɹnʇ ɹoɟ pǝsn ǝɹnʇɔnɹʇs ʞɔoןqıʇןnɯ ɐ sı uǝʌO ǝsʎןoɹʎԀ ǝɥ⟘", "gtceu.multiblock.pyrolyse_oven.speed": "%s%% :pǝǝdS buıssǝɔoɹԀ", "gtceu.multiblock.require_steam_parts": "¡sǝsnᗺ puɐ sǝɥɔʇɐH ɯɐǝʇS sǝɹınbǝᴚ", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 77f89e759f..aecc901d79 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -3711,6 +3711,10 @@ "gtceu.multiblock.ore_rig.drilled_ore_entry": " - %s", "gtceu.multiblock.ore_rig.drilled_ores_list": "Ores:", "gtceu.multiblock.ore_rig.ore_amount": "Drilling Rate: %s", + "gtceu.multiblock.output_line.0": "%s x §e%s§r (%ss/ea)", + "gtceu.multiblock.output_line.1": "%s x §e%s§r (%s/s)", + "gtceu.multiblock.output_line.2": "%s ≈ §e%s§r (%ss/ea)", + "gtceu.multiblock.output_line.3": "%s ≈ §e%s§r (%s/s)", "gtceu.multiblock.page_switcher.io.both": "§5Combined Inputs + Outputs", "gtceu.multiblock.page_switcher.io.export": "§4Outputs", "gtceu.multiblock.page_switcher.io.import": "§2Inputs", @@ -3767,7 +3771,7 @@ "gtceu.multiblock.primitive_water_pump.extra2.3": " LV Output Hatch: 4x", "gtceu.multiblock.primitive_water_pump.extra2.4": "", "gtceu.multiblock.primitive_water_pump.extra2.5": "While raining in the Pump's Biome, the total water production will be increased by 50%%.", - "gtceu.multiblock.progress": "Progress: %s%%", + "gtceu.multiblock.progress": "Progress: %ss / %ss (%s%%)", "gtceu.multiblock.pyrolyse_oven.description": "The Pyrolyse Oven is a multiblock structure used for turning Logs into Charcoal and Creosote Oil, or Ash and Heavy Oil.", "gtceu.multiblock.pyrolyse_oven.speed": "Processing Speed: %s%%", "gtceu.multiblock.require_steam_parts": "Requires Steam Hatches and Buses!", diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IDisplayUIMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IDisplayUIMachine.java index 4ea74e60c9..365106eca2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IDisplayUIMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IDisplayUIMachine.java @@ -42,7 +42,7 @@ default ModularUI createUI(Player entityPlayer) { screen.addWidget(new ComponentPanelWidget(4, 17, this::addDisplayText) .textSupplier(this.self().getLevel().isClientSide ? null : this::addDisplayText) .setMaxWidthLimit(150) - .clickHandler(this::handleDisplayClick)); + .clickHandler(this::handleDisplayClick)).setSizeHeight(8); return new ModularUI(176, 216, this, entityPlayer) .background(GuiTextures.BACKGROUND) .widget(screen) diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockDisplayText.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockDisplayText.java index d229164d60..cd2637cb83 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockDisplayText.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockDisplayText.java @@ -2,7 +2,11 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.capability.IEnergyContainer; +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; +import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTUtil; @@ -299,27 +303,100 @@ public Builder addIdlingLine(boolean checkState) { } /** - * Adds a simple progress line that displays progress as a percentage. + * Adds a simple progress line that displays the current time of a recipe and its progress as a percentage. *
* Added if structure is formed and the machine is active. * + * @param currentDuration The current duration of the recipe in ticks + * @param maxDuration The max duration of the recipe in ticks * @param progressPercent Progress formatted as a range of [0,1] representing the progress of the recipe. */ - public Builder addProgressLine(double progressPercent) { // todo + public Builder addProgressLine(double currentDuration, double maxDuration, double progressPercent) { if (!isStructureFormed || !isActive) return this; int currentProgress = (int) (progressPercent * 100); - textList.add(Component.translatable("gtceu.multiblock.progress", currentProgress)); + double currentInSec = currentDuration / 20.0; + double maxInSec = maxDuration / 20.0; + textList.add(Component.translatable("gtceu.multiblock.progress", + String.format("%.2f", (float) currentInSec), + String.format("%.2f", (float) maxInSec), currentProgress)); + return this; + } + + public Builder addOutputLines(GTRecipe recipe, int chanceTier) { + if (!isStructureFormed || !isActive) + return this; + if (recipe != null) { + var function = recipe.getType().getChanceFunction(); + double maxDurationSec = (double) recipe.duration / 20.0; + var itemOutputs = recipe.getOutputContents(ItemRecipeCapability.CAP); + var fluidOutputs = recipe.getOutputContents(FluidRecipeCapability.CAP); + + for (var item : itemOutputs) { + var stack = (ItemRecipeCapability.CAP.of(item.content).getItems()[0]); + if (stack.getCount() < maxDurationSec) { + if (item.chance < item.maxChance) { + double averageDurationforRoll = (double) item.maxChance / (double) function + .getBoostedChance(item, RecipeHelper.getPreOCRecipeEuTier(recipe), chanceTier); + textList.add(Component.translatable("gtceu.multiblock.output_line.2", stack.getHoverName(), + stack.getCount(), + FormattingUtil.formatNumber2Places(averageDurationforRoll * maxDurationSec))); + } else { + textList.add(Component.translatable("gtceu.multiblock.output_line.0", stack.getHoverName(), + stack.getCount(), maxDurationSec)); + } + } else { + double countPerSec = (double) stack.getCount() / maxDurationSec; + if (item.chance < item.maxChance) { + double averageDurationforRoll = (double) item.maxChance / (double) function + .getBoostedChance(item, RecipeHelper.getPreOCRecipeEuTier(recipe), chanceTier); + textList.add(Component.translatable("gtceu.multiblock.output_line.3", + stack.getHoverName(), stack.getCount(), + FormattingUtil.formatNumber2Places(averageDurationforRoll * countPerSec))); + } else { + textList.add(Component.translatable("gtceu.multiblock.output_line.1", + stack.getHoverName(), stack.getCount(), countPerSec)); + } + } + } + for (var fluid : fluidOutputs) { + var stack = (FluidRecipeCapability.CAP.of(fluid.content).getStacks()[0]); + if (stack.getAmount() < maxDurationSec) { + if (fluid.chance < fluid.maxChance) { + double averageDurationforRoll = (double) fluid.maxChance / (double) function + .getBoostedChance(fluid, RecipeHelper.getPreOCRecipeEuTier(recipe), chanceTier); + textList.add(Component.translatable("gtceu.multiblock.output_line.2", + stack.getDisplayName(), stack.getAmount(), + FormattingUtil.formatNumber2Places(averageDurationforRoll * maxDurationSec))); + } else { + textList.add(Component.translatable("gtceu.multiblock.output_line.0", + stack.getDisplayName(), stack.getAmount(), + FormattingUtil.formatNumber2Places(maxDurationSec))); + } + } else { + double countPerSec = (double) stack.getAmount() / maxDurationSec; + if (fluid.chance < fluid.maxChance) { + double averageDurationforRoll = (double) fluid.maxChance / (double) function + .getBoostedChance(fluid, RecipeHelper.getPreOCRecipeEuTier(recipe), chanceTier); + textList.add(Component.translatable("gtceu.multiblock.output_line.3", + stack.getDisplayName(), stack.getAmount(), + FormattingUtil.formatNumber2Places(averageDurationforRoll * countPerSec))); + } else { + textList.add(Component.translatable("gtceu.multiblock.output_line.1", + stack.getDisplayName(), stack.getAmount(), + FormattingUtil.formatNumber2Places(countPerSec))); + } + } + } + } return this; } /** - * Adds a line indicating how many parallels this multi can potentially perform. - *
- * Added if structure is formed and the number of parallels is greater than one. + * Adds a line indicating the current mode of the multi */ - public Builder addMachineModeLine(GTRecipeType recipeType) { - if (!isStructureFormed) + public Builder addMachineModeLine(GTRecipeType recipeType, boolean hasMultipleModes) { + if (!isStructureFormed || !hasMultipleModes) return this; textList.add(Component .translatable("gtceu.gui.machinemode", diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java index e518d25895..3462a2b0b7 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java @@ -95,10 +95,12 @@ public void addDisplayText(List textList) { .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) .addEnergyUsageLine(energyContainer) .addEnergyTierLine(tier) - .addMachineModeLine(getRecipeType()) + .addMachineModeLine(getRecipeType(), getRecipeTypes().length > 1) .addParallelsLine(numParallels) .addWorkingStatusLine() - .addProgressLine(recipeLogic.getProgressPercent()); + .addProgressLine(recipeLogic.getProgress(), recipeLogic.getMaxProgress(), + recipeLogic.getProgressPercent()) + .addOutputLines(recipeLogic.getLastRecipe(), this.getChanceTier()); getDefinition().getAdditionalDisplay().accept(this, textList); IDisplayUIMachine.super.addDisplayText(textList); } @@ -110,7 +112,7 @@ public Widget createUIWidget() { .addWidget(new LabelWidget(4, 5, self().getBlockState().getBlock().getDescriptionId())) .addWidget(new ComponentPanelWidget(4, 17, this::addDisplayText) .textSupplier(this.getLevel().isClientSide ? null : this::addDisplayText) - .setMaxWidthLimit(150) + .setMaxWidthLimit(200) .clickHandler(this::handleDisplayClick))); group.setBackground(GuiTextures.BACKGROUND_INVERSE); return group; diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index 3350d6555c..84a39d84d5 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -1067,7 +1067,11 @@ public static void init(RegistrateLangProvider provider) { provider.add("gtceu.multiblock.not_enough_energy", "WARNING: Machine needs more energy."); provider.add("gtceu.multiblock.not_enough_energy_output", "WARNING: Energy Dynamo Tier Too Low!"); provider.add("gtceu.multiblock.waiting", "WARNING: Machine is waiting."); - provider.add("gtceu.multiblock.progress", "Progress: %s%%"); + provider.add("gtceu.multiblock.progress", "Progress: %ss / %ss (%s%%)"); + provider.add("gtceu.multiblock.output_line.0", "%s x §e%s§r (%ss/ea)"); + provider.add("gtceu.multiblock.output_line.1", "%s x §e%s§r (%s/s)"); + provider.add("gtceu.multiblock.output_line.2", "%s ≈ §e%s§r (%ss/ea)"); + provider.add("gtceu.multiblock.output_line.3", "%s ≈ §e%s§r (%s/s)"); provider.add("gtceu.multiblock.invalid_structure", "Invalid structure."); provider.add("gtceu.multiblock.invalid_structure.tooltip", "This block is a controller of the multiblock structure. For building help, see structure template in JEI."); diff --git a/src/main/java/com/gregtechceu/gtceu/utils/FormattingUtil.java b/src/main/java/com/gregtechceu/gtceu/utils/FormattingUtil.java index 95d3974d75..3d4320f6d7 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/FormattingUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/FormattingUtil.java @@ -179,6 +179,11 @@ public static String formatNumber2Places(float number) { return DECIMAL_FORMAT_2F.format(number); } + @NotNull + public static String formatNumber2Places(double number) { + return DECIMAL_FORMAT_2F.format(number); + } + public static Component formatPercentage2Places(String langKey, float percentage) { return Component.translatable(langKey, formatNumber2Places(percentage)).withStyle(YELLOW); } From 6e6de8b7f498420defb8a073f57d1feac0199706 Mon Sep 17 00:00:00 2001 From: Karthi Suresh <75553966+JuiceyBeans@users.noreply.github.com> Date: Mon, 30 Sep 2024 20:31:28 +0100 Subject: [PATCH 081/141] Make magnetic tool property pull mob drops too (#2037) --- .../resources/assets/gtceu/lang/en_ud.json | 2 +- .../resources/assets/gtceu/lang/en_us.json | 2 +- .../gregtechceu/gtceu/api/item/IGTTool.java | 1 + .../gtceu/api/item/tool/ToolHelper.java | 1 + .../common/item/tool/ToolEventHandlers.java | 29 +++++++++++++++++++ .../gtceu/data/lang/LangHandler.java | 2 +- 6 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index d7d5df66ee..2b901d21ea 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -4860,7 +4860,7 @@ "item.gtceu.tool.behavior.ground_tilling": "punoɹ⅁ sןןı⟘ɟ§ :ɹǝɯɹɐℲǝ§", "item.gtceu.tool.behavior.plunger": "spınןℲ suıɐɹᗡɟ§ :ɹǝqɯnןԀ6§", "item.gtceu.tool.behavior.rail_rotation": "sןıɐᴚ sǝʇɐʇoᴚɟ§ :ɹǝǝuıbuƎ pɐoɹןıɐᴚǝ§", - "item.gtceu.tool.behavior.relocate_mining": "sʞɔoןᗺ pǝuıW sǝʇɐɔoןǝᴚɟ§ :ɔıʇǝubɐWᄅ§", + "item.gtceu.tool.behavior.relocate_mining": "sdoɹᗡ qoW puɐ sʞɔoןᗺ pǝuıW sǝʇɐɔoןǝᴚɟ§ :ɔıʇǝubɐWᄅ§", "item.gtceu.tool.behavior.remove_wax": "xɐM sǝʌoɯǝᴚɟ§ :ɹǝuɐǝןƆ9§", "item.gtceu.tool.behavior.scrape": "uoıʇɐpıxO sǝʌoɯǝᴚɟ§ :ɹǝɥsıןoԀq§", "item.gtceu.tool.behavior.shield_disable": "spןǝıɥS sǝןqɐsıᗡɟ§ :ǝʇnɹᗺɔ§", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index aecc901d79..7513de071c 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -4860,7 +4860,7 @@ "item.gtceu.tool.behavior.ground_tilling": "§eFarmer: §fTills Ground", "item.gtceu.tool.behavior.plunger": "§9Plumber: §fDrains Fluids", "item.gtceu.tool.behavior.rail_rotation": "§eRailroad Engineer: §fRotates Rails", - "item.gtceu.tool.behavior.relocate_mining": "§2Magnetic: §fRelocates Mined Blocks", + "item.gtceu.tool.behavior.relocate_mining": "§2Magnetic: §fRelocates Mined Blocks and Mob Drops", "item.gtceu.tool.behavior.remove_wax": "§6Cleaner: §fRemoves Wax", "item.gtceu.tool.behavior.scrape": "§bPolisher: §fRemoves Oxidation", "item.gtceu.tool.behavior.shield_disable": "§cBrute: §fDisables Shields", diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java b/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java index 61bdda5049..38025bfad0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java @@ -175,6 +175,7 @@ default ItemStack get() { if (toolProperty.isMagnetic()) { behaviourTag.putBoolean(RELOCATE_MINED_BLOCKS_KEY, true); + behaviourTag.putBoolean(RELOCATE_MOB_DROPS_KEY, true); } return stack; diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java index 1006c45126..1dc053d821 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java @@ -124,6 +124,7 @@ public class ToolHelper { public static final String TREE_FELLING_KEY = "TreeFelling"; public static final String DISABLE_SHIELDS_KEY = "DisableShields"; public static final String RELOCATE_MINED_BLOCKS_KEY = "RelocateMinedBlocks"; + public static final String RELOCATE_MOB_DROPS_KEY = "RelocateMobDrops"; // Crafting Symbols private static final BiMap symbols = HashBiMap.create(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/ToolEventHandlers.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/ToolEventHandlers.java index 0765fd6f73..90d83bd5fc 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/ToolEventHandlers.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/ToolEventHandlers.java @@ -28,6 +28,7 @@ import net.minecraft.world.level.material.Fluids; import net.minecraftforge.event.AnvilUpdateEvent; import net.minecraftforge.event.ForgeEventFactory; +import net.minecraftforge.event.entity.living.LivingDropsEvent; import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -35,6 +36,7 @@ import org.jetbrains.annotations.NotNull; +import java.util.Collection; import java.util.Iterator; import java.util.List; @@ -189,4 +191,31 @@ public static void onAnvilUpdateEvent(AnvilUpdateEvent event) { event.setCanceled(true); } } + + public static Collection onPlayerKilledEntity(ItemStack tool, Player player, + Collection drops) { + CompoundTag behaviorTag = ToolHelper.getBehaviorsTag(tool); + + if (behaviorTag.getBoolean(ToolHelper.RELOCATE_MOB_DROPS_KEY)) { + Iterator dropItr = drops.iterator(); + + while (dropItr.hasNext()) { + ItemEntity drop = dropItr.next(); + ItemStack dropStack = drop.getItem(); + + if (fireItemPickupEvent(drop, player) == -1 || player.addItem(dropStack)) { + dropItr.remove(); + } + } + } + return drops; + } + + @SubscribeEvent + public static void onPlayerKilledEntity(LivingDropsEvent event) { + Entity entity = event.getSource().getEntity(); + if (entity instanceof Player player) { + ToolEventHandlers.onPlayerKilledEntity(player.getMainHandItem(), player, event.getDrops()); + } + } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index 84a39d84d5..63d5169664 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -166,7 +166,7 @@ public static void init(RegistrateLangProvider provider) { provider.add("item.gtceu.tool.behavior.scrape", "§bPolisher: §fRemoves Oxidation"); provider.add("item.gtceu.tool.behavior.remove_wax", "§6Cleaner: §fRemoves Wax"); provider.add("item.gtceu.tool.behavior.shield_disable", "§cBrute: §fDisables Shields"); - provider.add("item.gtceu.tool.behavior.relocate_mining", "§2Magnetic: §fRelocates Mined Blocks"); + provider.add("item.gtceu.tool.behavior.relocate_mining", "§2Magnetic: §fRelocates Mined Blocks and Mob Drops"); provider.add("item.gtceu.tool.behavior.aoe_mining", "§5Area-of-Effect: §f%sx%sx%s"); provider.add("item.gtceu.tool.behavior.ground_tilling", "§eFarmer: §fTills Ground"); provider.add("item.gtceu.tool.behavior.grass_path", "§eLandscaper: §fCreates Grass Paths"); From 45a4800ab0f6e5c79f409d3cbda66305fa387140 Mon Sep 17 00:00:00 2001 From: Electrolyte <21316184+Electrolyte220@users.noreply.github.com> Date: Mon, 30 Sep 2024 15:32:05 -0400 Subject: [PATCH 082/141] Fix broken treated wood recipes (#2045) --- .../gregtechceu/gtceu/data/recipe/misc/WoodMachineRecipes.java | 1 + 1 file changed, 1 insertion(+) 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 f76ee0b6d4..44ef34d4be 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 @@ -280,6 +280,7 @@ private static List getDefaultEntries() { .sign(GTBlocks.TREATED_WOOD_SIGN.asItem(), null) .hangingSign(GTBlocks.TREATED_WOOD_HANGING_SIGN.asItem(), null) .material(TreatedWood) + .generateLogToPlankRecipe(false) .registerUnificationInfo(false, true, true, true, true, true, true, true) .build()); } From ce288290260f5c150307709ff84d5447d8d3e00c Mon Sep 17 00:00:00 2001 From: Karthi Suresh <75553966+JuiceyBeans@users.noreply.github.com> Date: Mon, 30 Sep 2024 20:32:41 +0100 Subject: [PATCH 083/141] Remove #forge:seeds seed oil recipe (#2041) --- .../serialized/chemistry/SeparationRecipes.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/serialized/chemistry/SeparationRecipes.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/serialized/chemistry/SeparationRecipes.java index 7b35f89812..d9a22a273d 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/serialized/chemistry/SeparationRecipes.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/serialized/chemistry/SeparationRecipes.java @@ -6,7 +6,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.block.Blocks; -import net.minecraftforge.common.Tags; import java.util.function.Consumer; @@ -485,9 +484,19 @@ public static void init(Consumer provider) { .outputFluids(Helium.getFluid(200)) .duration(64).EUt(64).save(provider); - EXTRACTOR_RECIPES.recipeBuilder("seed_oil_from_tag_seeds") + // Disabling because it conflicts with the below recipes + // Pack devs should make their own recipes instead + /* + * EXTRACTOR_RECIPES.recipeBuilder("seed_oil_from_tag_seeds") + * .duration(32).EUt(2) + * .inputItems(Tags.Items.SEEDS) + * .outputFluids(SeedOil.getFluid(10)) + * .save(provider); + */ + + EXTRACTOR_RECIPES.recipeBuilder("seed_oil_from_wheat_seeds") .duration(32).EUt(2) - .inputItems(Tags.Items.SEEDS) + .inputItems(new ItemStack(Items.WHEAT_SEEDS)) .outputFluids(SeedOil.getFluid(10)) .save(provider); From f105578eb85b588157bff2a273c188dc380b36c2 Mon Sep 17 00:00:00 2001 From: Austin <31421419+Vextin@users.noreply.github.com> Date: Tue, 1 Oct 2024 03:40:33 -0400 Subject: [PATCH 084/141] Remove any connected miner pipes when the machine is removed (#2064) --- .../gregtechceu/gtceu/common/machine/electric/MinerMachine.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java index 530f7d5b97..aa73ba8b71 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java @@ -130,6 +130,8 @@ protected RecipeLogic createRecipeLogic(Object... args) { @Override public void onMachineRemoved() { + // Remove the miner pipes below this miner + getRecipeLogic().onRemove(); clearInventory(exportItems.storage); clearInventory(chargerInventory); } From afd65ab04dae864a9123b227614f067c8c331167 Mon Sep 17 00:00:00 2001 From: Karthi Suresh <75553966+JuiceyBeans@users.noreply.github.com> Date: Tue, 1 Oct 2024 08:41:45 +0100 Subject: [PATCH 085/141] Add missing flags for materials (#2024) --- .../data/materials/ElementMaterials.java | 4 +-- .../data/materials/FirstDegreeMaterials.java | 7 ++-- .../data/materials/HigherDegreeMaterials.java | 6 ++-- .../data/materials/SecondDegreeMaterials.java | 2 +- .../UnknownCompositionMaterials.java | 6 ---- .../recipe/generated/ToolRecipeHandler.java | 32 ++++++++++++++++--- 6 files changed, 37 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/materials/ElementMaterials.java b/src/main/java/com/gregtechceu/gtceu/common/data/materials/ElementMaterials.java index cb93f793f0..ffc027f95f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/materials/ElementMaterials.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/materials/ElementMaterials.java @@ -962,7 +962,7 @@ public static void register() { .ingot(6) .liquid(new FluidBuilder().temperature(100_000)) .color(0xFFFFFF).secondaryColor(0x000000) - .appendFlags(EXT_METAL, GENERATE_BOLT_SCREW, GENERATE_FRAME) + .appendFlags(EXT_METAL, GENERATE_BOLT_SCREW, GENERATE_FRAME, GENERATE_GEAR, GENERATE_LONG_ROD) .element(GTElements.Nt) .toolStats(ToolProperty.Builder.of(180.0F, 100.0F, 65535, 6) .attackSpeed(0.5F).enchantability(33).magnetic().unbreakable().build()) @@ -986,7 +986,7 @@ public static void register() { .ingot(5) .liquid(new FluidBuilder().temperature(7500)) .color(0xf3e7a9).secondaryColor(0x9c9487).iconSet(BRIGHT) - .appendFlags(EXT_METAL, GENERATE_FOIL, GENERATE_GEAR) + .appendFlags(EXT_METAL, GENERATE_FOIL, GENERATE_GEAR, GENERATE_BOLT_SCREW, GENERATE_LONG_ROD) .element(GTElements.Dr) .toolStats(ToolProperty.Builder.of(14.0F, 12.0F, 8192, 5) .attackSpeed(0.3F).enchantability(33).magnetic().build()) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/materials/FirstDegreeMaterials.java b/src/main/java/com/gregtechceu/gtceu/common/data/materials/FirstDegreeMaterials.java index 62ebfa24a0..109ccc809f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/materials/FirstDegreeMaterials.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/materials/FirstDegreeMaterials.java @@ -209,7 +209,8 @@ public static void register() { .gem(3).ore() .color(0xC8FFFF).iconSet(DIAMOND) .flags(GENERATE_BOLT_SCREW, GENERATE_LENS, GENERATE_GEAR, NO_SMASHING, NO_SMELTING, - HIGH_SIFTER_OUTPUT, DISABLE_DECOMPOSITION, EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES) + HIGH_SIFTER_OUTPUT, DISABLE_DECOMPOSITION, EXCLUDE_BLOCK_CRAFTING_BY_HAND_RECIPES, + GENERATE_LONG_ROD) .components(Carbon, 1) .toolStats(ToolProperty.Builder.of(6.0F, 7.0F, 768, 3) .attackSpeed(0.1F).enchantability(18).build()) @@ -405,7 +406,7 @@ public static void register() { .ingot() .liquid(new FluidBuilder().temperature(1258)) .color(0xfaf4dc).secondaryColor(0x484434).iconSet(SHINY) - .appendFlags(EXT2_METAL) + .appendFlags(EXT2_METAL, GENERATE_GEAR) .components(Copper, 1, Silver, 4) .toolStats(ToolProperty.Builder.of(3.0F, 8.0F, 768, 2) .attackSpeed(0.3F).enchantability(33) @@ -419,7 +420,7 @@ public static void register() { .ingot() .liquid(new FluidBuilder().temperature(1341)) .color(0xecd5b8).secondaryColor(0xd85f2d).iconSet(SHINY) - .appendFlags(EXT2_METAL, GENERATE_RING) + .appendFlags(EXT2_METAL, GENERATE_RING, GENERATE_GEAR) .components(Copper, 1, Gold, 4) .toolStats(ToolProperty.Builder.of(12.0F, 2.0F, 768, 2) .enchantability(33) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/materials/HigherDegreeMaterials.java b/src/main/java/com/gregtechceu/gtceu/common/data/materials/HigherDegreeMaterials.java index 417093f558..25fd9ca98e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/materials/HigherDegreeMaterials.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/materials/HigherDegreeMaterials.java @@ -37,7 +37,7 @@ public static void register() { RedSteel = new Material.Builder(GTCEu.id("red_steel")) .ingot(3).fluid() .color(0xa09191).secondaryColor(0x500404).iconSet(METALLIC) - .appendFlags(EXT_METAL, GENERATE_GEAR) + .appendFlags(EXT_METAL, GENERATE_GEAR, GENERATE_BOLT_SCREW, GENERATE_LONG_ROD) .components(SterlingSilver, 1, BismuthBronze, 1, Steel, 2, BlackSteel, 4) .toolStats(ToolProperty.Builder.of(7.0F, 6.0F, 2560, 3) .attackSpeed(0.1F).enchantability(21).build()) @@ -47,7 +47,7 @@ public static void register() { BlueSteel = new Material.Builder(GTCEu.id("blue_steel")) .ingot(3).fluid() .color(0x779ac6).secondaryColor(0x191948).iconSet(METALLIC) - .appendFlags(EXT_METAL, GENERATE_FRAME, GENERATE_GEAR) + .appendFlags(EXT_METAL, GENERATE_FRAME, GENERATE_GEAR, GENERATE_BOLT_SCREW, GENERATE_LONG_ROD) .components(RoseGold, 1, Brass, 1, Steel, 2, BlackSteel, 4) .toolStats(ToolProperty.Builder.of(15.0F, 6.0F, 1024, 3) .attackSpeed(0.1F).enchantability(33).build()) @@ -112,7 +112,7 @@ public static void register() { HSSE = new Material.Builder(GTCEu.id("hsse")) .ingot(4).fluid() .color(0x9d9cbe).secondaryColor(0x2b0350).iconSet(METALLIC) - .appendFlags(EXT2_METAL, GENERATE_FRAME, GENERATE_RING) + .appendFlags(EXT2_METAL, GENERATE_FRAME, GENERATE_RING, GENERATE_GEAR) .components(HSSG, 6, Cobalt, 1, Manganese, 1, Silicon, 1) .toolStats(ToolProperty.Builder.of(5.0F, 10.0F, 3072, 4) .attackSpeed(0.3F).enchantability(33).build()) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/materials/SecondDegreeMaterials.java b/src/main/java/com/gregtechceu/gtceu/common/data/materials/SecondDegreeMaterials.java index e273ceb8e7..e84809d2b4 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/materials/SecondDegreeMaterials.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/materials/SecondDegreeMaterials.java @@ -123,7 +123,7 @@ public static void register() { DamascusSteel = new Material.Builder(GTCEu.id("damascus_steel")) .ingot(3).fluid() .color(0x6E6E6E).secondaryColor(0x302222).iconSet(METALLIC) - .appendFlags(EXT_METAL) + .appendFlags(EXT_METAL, GENERATE_BOLT_SCREW, GENERATE_LONG_ROD, GENERATE_GEAR) .components(Steel, 1) .toolStats(ToolProperty.Builder.of(6.0F, 4.0F, 1024, 3) .addTypes(GTToolType.MORTAR) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/materials/UnknownCompositionMaterials.java b/src/main/java/com/gregtechceu/gtceu/common/data/materials/UnknownCompositionMaterials.java index ac55bacc3c..7b17c82f3d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/materials/UnknownCompositionMaterials.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/materials/UnknownCompositionMaterials.java @@ -80,8 +80,6 @@ public static void register() { ConstructionFoam = new Material.Builder(GTCEu.id("construction_foam")) .fluid().color(0x808080).buildAndRegister(); - // Free IDs 1517-1521 - SulfuricHeavyFuel = new Material.Builder(GTCEu.id("sulfuric_heavy_fuel")) .liquid(new FluidBuilder().customStill()).flags(FLAMMABLE).buildAndRegister(); @@ -310,8 +308,6 @@ public static void register() { EnrichedBacterialSludge = new Material.Builder(GTCEu.id("enriched_bacterial_sludge")) .fluid().color(0x7FFF00).buildAndRegister(); - // free id: 1587 - Mutagen = new Material.Builder(GTCEu.id("mutagen")) .fluid().color(0x00FF7F).buildAndRegister(); @@ -327,8 +323,6 @@ public static void register() { HighOctaneGasoline = new Material.Builder(GTCEu.id("high_octane_gasoline")) .fluid().color(0xFFA500).flags(FLAMMABLE, EXPLOSIVE).buildAndRegister(); - // free id: 1593 - CoalGas = new Material.Builder(GTCEu.id("coal_gas")) .gas().color(0x333333).buildAndRegister(); diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/generated/ToolRecipeHandler.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/generated/ToolRecipeHandler.java index 0ea9a2e822..b9542d3c7a 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/generated/ToolRecipeHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/generated/ToolRecipeHandler.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.data.recipe.generated; +import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.IElectricItem; @@ -51,6 +52,11 @@ public class ToolRecipeHandler { public static Map baseMaterials = new HashMap<>(); public static Map>> batteryItems = new HashMap<>(); public static Map> powerUnitItems = new HashMap<>(); + private static final Material[] softMaterials = new Material[] { + GTMaterials.Wood, GTMaterials.Rubber, GTMaterials.Polyethylene, + GTMaterials.Polytetrafluoroethylene, GTMaterials.Polybenzimidazole, + GTMaterials.SiliconeRubber, GTMaterials.StyreneButadieneRubber + }; public static void init(Consumer provider) { initializeGTItems(); @@ -211,6 +217,9 @@ private static void processTool(TagPrefix prefix, Material material, ToolPropert addToolRecipe(provider, material, GTToolType.WRENCH, false, "PhP", " P ", " P ", 'P', plate); + } else { + GTCEu.LOGGER.info("Did not find plate for " + material.getName() + + ", skipping mining hammer, spade, saw, axe, hoe, pickaxe, scythe, shovel, sword, hammer, file, knife, wrench recipes"); } if (material.hasFlag(GENERATE_ROD)) { @@ -228,7 +237,13 @@ private static void processTool(TagPrefix prefix, Material material, ToolPropert 'P', plate, 'T', new UnificationEntry(TagPrefix.screw, material), 'S', rod); + } else if (!ArrayUtils.contains(softMaterials, material)) { + GTCEu.LOGGER + .info("Did not find bolt for " + material.getName() + ", skipping wirecutter recipe"); } + } else { + GTCEu.LOGGER.info("Did not find plate for " + material.getName() + + ", skipping wirecutter, butchery knife recipes"); } addToolRecipe(provider, material, GTToolType.SCREWDRIVER, true, @@ -239,6 +254,9 @@ private static void processTool(TagPrefix prefix, Material material, ToolPropert addDyeableToolRecipe(provider, material, GTToolType.CROWBAR, true, "hDS", "DSD", "SDf", 'S', rod); + } else if (!ArrayUtils.contains(softMaterials, material)) { + GTCEu.LOGGER.info("Did not find rod for " + material.getName() + + ", skipping wirecutter, butchery knife, screwdriver, crowbar recipes"); } } @@ -327,8 +345,14 @@ private static void processElectricTool(TagPrefix prefix, Material material, Too .duration((int) material.getMass() * 4) .EUt(8L * voltageMultiplier) .save(provider); + } else { + GTCEu.LOGGER.info("Did not find gear for " + material.getName() + + ", skipping gear -> buzzsaw blade recipe"); } } + } else { + GTCEu.LOGGER.info("Did not find plate for " + material.getName() + + ", skipping electric drill, chainsaw, wrench, wirecutter, buzzsaw recipe"); } // screwdriver @@ -341,6 +365,9 @@ private static void processElectricTool(TagPrefix prefix, Material material, Too ChemicalHelper.get(toolPrefix, material), "fR", " h", 'R', new UnificationEntry(TagPrefix.rodLong, material)); + } else { + GTCEu.LOGGER.info("Did not find long rod for " + material.getName() + + ", skipping electric screwdriver recipe"); } } } @@ -467,11 +494,6 @@ private static void registerMortarRecipes(Consumer provider) { } private static void registerSoftToolRecipes(Consumer provider) { - final Material[] softMaterials = new Material[] { - GTMaterials.Wood, GTMaterials.Rubber, GTMaterials.Polyethylene, - GTMaterials.Polytetrafluoroethylene, GTMaterials.Polybenzimidazole - }; - final ItemStack stick = new ItemStack(Items.STICK); for (int i = 0; i < softMaterials.length; i++) { From c096c625a1ca59bbcf7285ff21be961e4054134c Mon Sep 17 00:00:00 2001 From: Ghostipedia <46772882+Ghostipedia@users.noreply.github.com> Date: Tue, 1 Oct 2024 23:21:20 -0400 Subject: [PATCH 086/141] Yeet Sand from OreVeins (#2078) --- .../gregtechceu/gtceu/common/data/GTOres.java | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTOres.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTOres.java index dc1cf31140..b3b0e7c328 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTOres.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTOres.java @@ -232,7 +232,6 @@ public class GTOres { .biomes(BiomeTags.IS_NETHER) .layeredVeinGenerator(generator -> generator .withLayerPattern(() -> GTLayerPattern.builder(NETHER_RULES) - // .layer(l -> l.weight(2).state(Blocks.NETHERRACK::defaultBlockState)) .layer(l -> l.weight(3).mat(Wulfenite).size(2, 4)) .layer(l -> l.weight(2).mat(Molybdenite).size(1, 1)) .layer(l -> l.weight(1).mat(Molybdenum).size(1, 1)) @@ -249,7 +248,6 @@ public class GTOres { .biomes(BiomeTags.IS_NETHER) .layeredVeinGenerator(generator -> generator .withLayerPattern(() -> GTLayerPattern.builder(NETHER_RULES) - // .layer(l -> l.weight(2).state(Blocks.NETHERRACK::defaultBlockState)) .layer(l -> l.weight(3).mat(Bastnasite).size(2, 4)) .layer(l -> l.weight(1).mat(Monazite).size(1, 1)) .layer(l -> l.weight(1).mat(Neodymium).size(1, 1)) @@ -265,7 +263,6 @@ public class GTOres { .biomes(BiomeTags.IS_NETHER) .layeredVeinGenerator(generator -> generator .withLayerPattern(() -> GTLayerPattern.builder(NETHER_RULES) - // .layer(l -> l.weight(2).state(Blocks.NETHERRACK::defaultBlockState).size(2, 4)) .layer(l -> l.weight(3).mat(NetherQuartz).size(2, 4)) .layer(l -> l.weight(1).mat(Quartzite).size(1, 1)) .build())) @@ -280,7 +277,6 @@ public class GTOres { .biomes(BiomeTags.IS_NETHER) .layeredVeinGenerator(generator -> generator .withLayerPattern(() -> GTLayerPattern.builder(NETHER_RULES) - // .layer(l -> l.weight(2).state(Blocks.NETHERRACK::defaultBlockState)) .layer(l -> l.weight(3).mat(Redstone).size(2, 4)) .layer(l -> l.weight(2).mat(Ruby).size(1, 1)) .layer(l -> l.weight(1).mat(Cinnabar).size(1, 1)) @@ -296,7 +292,6 @@ public class GTOres { .biomes(BiomeTags.IS_NETHER) .layeredVeinGenerator(generator -> generator .withLayerPattern(() -> GTLayerPattern.builder(NETHER_RULES) - .layer(l -> l.weight(2).state(Blocks.NETHERRACK::defaultBlockState)) .layer(l -> l.weight(3).mat(Saltpeter).size(2, 4)) .layer(l -> l.weight(2).mat(Diatomite).size(1, 1)) .layer(l -> l.weight(2).mat(Electrotine).size(1, 1)) @@ -313,7 +308,6 @@ public class GTOres { .biomes(BiomeTags.IS_NETHER) .layeredVeinGenerator(generator -> generator .withLayerPattern(() -> GTLayerPattern.builder(NETHER_RULES) - // .layer(l -> l.weight(2).state(Blocks.NETHERRACK::defaultBlockState)) .layer(l -> l.weight(3).mat(Sulfur).size(2, 4)) .layer(l -> l.weight(2).mat(Pyrite).size(1, 1)) .layer(l -> l.weight(1).mat(Sphalerite).size(1, 1)) @@ -349,7 +343,6 @@ public class GTOres { .biomes(BiomeTags.IS_NETHER) .layeredVeinGenerator(generator -> generator .withLayerPattern(() -> GTLayerPattern.builder(NETHER_RULES) - // .layer(l -> l.weight(2).state(Blocks.NETHERRACK::defaultBlockState)) .layer(l -> l.weight(3).mat(BlueTopaz).size(2, 4)) .layer(l -> l.weight(2).mat(Topaz).size(1, 1)) .layer(l -> l.weight(2).mat(Chalcocite).size(1, 1)) @@ -375,7 +368,6 @@ public class GTOres { .biomes(BiomeTags.IS_OVERWORLD) .layeredVeinGenerator(generator -> generator .withLayerPattern(() -> GTLayerPattern.builder(OVERWORLD_RULES) - // .layer(l -> l.weight(2).state(Blocks.STONE::defaultBlockState)) .layer(l -> l.weight(3).mat(Apatite).size(2, 4)) .layer(l -> l.weight(2).mat(TricalciumPhosphate).size(1, 1)) .layer(l -> l.weight(1).mat(Pyrochlore).size(1, 1)) @@ -442,7 +434,6 @@ public class GTOres { .biomes(BiomeTags.IS_OVERWORLD) .layeredVeinGenerator(generator -> generator .withLayerPattern(() -> GTLayerPattern.builder(OVERWORLD_RULES) - // .layer(l -> l.weight(2).state(Blocks.STONE::defaultBlockState)) .layer(l -> l.weight(3).mat(Galena).size(2, 4)) .layer(l -> l.weight(2).mat(Silver).size(1, 1)) .layer(l -> l.weight(1).mat(Lead).size(1, 1)) @@ -457,7 +448,6 @@ public class GTOres { .biomes(BiomeTags.IS_OVERWORLD) .layeredVeinGenerator(generator -> generator .withLayerPattern(() -> GTLayerPattern.builder(OVERWORLD_RULES) - .layer(l -> l.weight(2).state(Blocks.SAND::defaultBlockState)) .layer(l -> l.weight(3).mat(CassiteriteSand).size(2, 4)) .layer(l -> l.weight(2).mat(GarnetSand).size(1, 1)) .layer(l -> l.weight(2).mat(Asbestos).size(1, 1)) @@ -535,7 +525,6 @@ public class GTOres { .biomes(BiomeTags.IS_OVERWORLD) .layeredVeinGenerator(generator -> generator .withLayerPattern(() -> GTLayerPattern.builder(OVERWORLD_RULES) - .layer(l -> l.weight(2).state(Blocks.SAND::defaultBlockState)) .layer(l -> l.weight(3).mat(BasalticMineralSand).size(2, 4)) .layer(l -> l.weight(2).mat(GraniticMineralSand).size(1, 1)) .layer(l -> l.weight(2).mat(FullersEarth).size(1, 1)) @@ -551,7 +540,6 @@ public class GTOres { .biomes(BiomeTags.IS_OVERWORLD) .layeredVeinGenerator(generator -> generator .withLayerPattern(() -> GTLayerPattern.builder(OVERWORLD_RULES) - // .layer(l -> l.weight(2).state(Blocks.STONE::defaultBlockState)) .layer(l -> l.weight(3).mat(Garnierite).size(2, 4)) .layer(l -> l.weight(2).mat(Nickel).size(1, 1)) .layer(l -> l.weight(2).mat(Cobaltite).size(1, 1)) @@ -567,7 +555,6 @@ public class GTOres { .biomes(BiomeTags.IS_OVERWORLD) .layeredVeinGenerator(generator -> generator .withLayerPattern(() -> GTLayerPattern.builder(OVERWORLD_RULES) - // .layer(l -> l.weight(2).state(Blocks.STONE::defaultBlockState)) .layer(l -> l.weight(3).mat(RockSalt).size(2, 4)) .layer(l -> l.weight(2).mat(Salt).size(1, 1)) .layer(l -> l.weight(1).mat(Lepidolite).size(1, 1)) @@ -671,7 +658,6 @@ public class GTOres { .biomes(BiomeTags.IS_OVERWORLD) .layeredVeinGenerator(generator -> generator .withLayerPattern(() -> GTLayerPattern.builder(OVERWORLD_RULES) - // .layer(l -> l.weight(2).state(Blocks.STONE::defaultBlockState)) .layer(l -> l.weight(3).mat(Kyanite).size(2, 4)) .layer(l -> l.weight(2).mat(Mica).size(1, 1)) .layer(l -> l.weight(2).mat(Bauxite).size(1, 1)) @@ -688,7 +674,6 @@ public class GTOres { .biomes(BiomeTags.IS_OVERWORLD) .layeredVeinGenerator(generator -> generator .withLayerPattern(() -> GTLayerPattern.builder(OVERWORLD_RULES) - // .layer(l -> l.weight(2).state(Blocks.STONE::defaultBlockState)) .layer(l -> l.weight(3).mat(Bentonite).size(2, 4)) .layer(l -> l.weight(2).mat(Magnetite).size(1, 1)) .layer(l -> l.weight(2).mat(Olivine).size(1, 1)) @@ -720,7 +705,6 @@ public class GTOres { .biomes(BiomeTags.IS_OVERWORLD) .layeredVeinGenerator(generator -> generator .withLayerPattern(() -> GTLayerPattern.builder(OVERWORLD_RULES) - // .layer(l -> l.weight(2).state(Blocks.STONE::defaultBlockState)) .layer(l -> l.weight(3).mat(Almandine).size(2, 4)) .layer(l -> l.weight(2).mat(Pyrope).size(1, 1)) .layer(l -> l.weight(1).mat(Sapphire).size(1, 1)) From 3279b62394851a61da63e971439bf630dc209b15 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Wed, 2 Oct 2024 11:45:36 -0600 Subject: [PATCH 087/141] Output Line Infinite formatting (#2082) --- .../gtceu/api/machine/multiblock/MultiblockDisplayText.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockDisplayText.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockDisplayText.java index cd2637cb83..8521282fd3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockDisplayText.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockDisplayText.java @@ -355,7 +355,8 @@ public Builder addOutputLines(GTRecipe recipe, int chanceTier) { FormattingUtil.formatNumber2Places(averageDurationforRoll * countPerSec))); } else { textList.add(Component.translatable("gtceu.multiblock.output_line.1", - stack.getHoverName(), stack.getCount(), countPerSec)); + stack.getHoverName(), stack.getCount(), + FormattingUtil.formatNumber2Places(countPerSec))); } } } From aa85afa2d0510c2bf75d46119b625a7161360512 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dumitru=20Mi=C8=9Bca?= Date: Thu, 3 Oct 2024 22:34:03 +0300 Subject: [PATCH 088/141] Use smart cable connection type for ME Parts (#2087) --- gradlew | 0 .../ae2/machine/feature/IGridConnectedMachine.java | 7 +++++++ 2 files changed, 7 insertions(+) mode change 100644 => 100755 gradlew diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/feature/IGridConnectedMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/feature/IGridConnectedMachine.java index 898cdd29e5..8285d76663 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/feature/IGridConnectedMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/feature/IGridConnectedMachine.java @@ -3,7 +3,10 @@ import com.gregtechceu.gtceu.api.machine.feature.IMachineFeature; import com.gregtechceu.gtceu.config.ConfigHolder; +import net.minecraft.core.Direction; + import appeng.api.networking.IGridNodeListener; +import appeng.api.util.AECableType; import appeng.me.helpers.IGridConnectedBlockEntity; /** @@ -30,6 +33,10 @@ default boolean shouldSyncME() { return self().getOffsetTimer() % ME_UPDATE_INTERVAL == 0; } + default AECableType getCableConnectionType(Direction dir) { + return AECableType.SMART; + } + /** * Update me network connection status. * From c525486a5980f730aeb5da3e4c433f167d02e60a Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Sun, 6 Oct 2024 01:52:38 -0600 Subject: [PATCH 089/141] Missing progress lang for some multis (#2090) --- .../machine/multiblock/electric/CleanroomMachine.java | 6 +++++- .../multiblock/electric/PowerSubstationMachine.java | 10 +++++----- .../steam/SteamParallelMultiblockMachine.java | 8 ++++++-- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java index 560a41dd59..f827c32501 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java @@ -482,7 +482,11 @@ public void addDisplayText(List textList) { } else if (isActive()) { textList.add(Component.translatable("gtceu.multiblock.running")); int currentProgress = (int) (recipeLogic.getProgressPercent() * 100); - textList.add(Component.translatable("gtceu.multiblock.progress", currentProgress)); + double maxInSec = (float) recipeLogic.getDuration() / 20.0f; + double currentInSec = (float) recipeLogic.getProgress() / 20.0f; + textList.add( + Component.translatable("gtceu.multiblock.progress", String.format("%.2f", (float) currentInSec), + String.format("%.2f", (float) maxInSec), currentProgress)); } else { textList.add(Component.translatable("gtceu.multiblock.idling")); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java index c2fddb863e..56baa7e918 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java @@ -196,11 +196,11 @@ public void addDisplayText(List textList) { } else if (isActive()) { textList.add(Component.translatable("gtceu.multiblock.running")); int currentProgress = (int) (recipeLogic.getProgressPercent() * 100); - // if (this.recipeMapWorkable.getParallelLimit() != 1) { - // textList.add(Component.translatable("gtceu.multiblock.parallel", - // this.recipeMapWorkable.getParallelLimit())); - // } - textList.add(Component.translatable("gtceu.multiblock.progress", currentProgress)); + double maxInSec = (float) recipeLogic.getDuration() / 20.0f; + double currentInSec = (float) recipeLogic.getProgress() / 20.0f; + textList.add( + Component.translatable("gtceu.multiblock.progress", String.format("%.2f", (float) currentInSec), + String.format("%.2f", (float) maxInSec), currentProgress)); } else { textList.add(Component.translatable("gtceu.multiblock.idling")); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/SteamParallelMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/SteamParallelMultiblockMachine.java index 40d8aabd55..71a7a509ca 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/SteamParallelMultiblockMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/SteamParallelMultiblockMachine.java @@ -114,9 +114,13 @@ public void addDisplayText(List textList) { } else if (isActive()) { textList.add(Component.translatable("gtceu.multiblock.running")); - int currentProgress = (int) (recipeLogic.getProgressPercent() * 100); textList.add(Component.translatable("gtceu.multiblock.parallel", MAX_PARALLELS)); - textList.add(Component.translatable("gtceu.multiblock.progress", currentProgress)); + int currentProgress = (int) (recipeLogic.getProgressPercent() * 100); + double maxInSec = (float) recipeLogic.getDuration() / 20.0f; + double currentInSec = (float) recipeLogic.getProgress() / 20.0f; + textList.add( + Component.translatable("gtceu.multiblock.progress", String.format("%.2f", (float) currentInSec), + String.format("%.2f", (float) maxInSec), currentProgress)); } else { textList.add(Component.translatable("gtceu.multiblock.idling")); } From 0abf38404754bfef7890815fda0a1b966ea4c56b Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Sun, 6 Oct 2024 01:54:46 -0600 Subject: [PATCH 090/141] Give torch placing a sound (#2091) --- .../item/tool/behavior/TorchPlaceBehavior.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/TorchPlaceBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/TorchPlaceBehavior.java index 41266b1449..31596c52ae 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/TorchPlaceBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/TorchPlaceBehavior.java @@ -7,6 +7,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; @@ -14,6 +15,7 @@ import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.NotNull; @@ -72,9 +74,6 @@ protected TorchPlaceBehavior() {/**/} } private static boolean checkAndPlaceTorch(UseOnContext context, ItemStack slotStack) { - if (context.getLevel().isClientSide) - return false; - if (slotStack.isEmpty()) return false; @@ -102,7 +101,13 @@ private static boolean checkAndPlaceTorch(UseOnContext context, ItemStack slotSt context.getHitResult()); var blockPlaceContext = new BlockPlaceContext(torchContext); InteractionResult placed = slotItemBlock.place(blockPlaceContext); - return placed.consumesAction(); + boolean wasPlaced = placed.consumesAction(); + if (wasPlaced) { + SoundType sound = slotItemBlock.getBlock().getSoundType(slotItemBlock.getBlock().defaultBlockState()); + context.getLevel().playSound(context.getPlayer(), pos, sound.getPlaceSound(), SoundSource.BLOCKS, + (sound.getVolume() + 1.0F) / 2.0F, sound.getPitch() * 0.8F); + } + return wasPlaced; } return false; } From 2d7f51522268fad19c8fe3971a122b92cc9d4d04 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Sun, 6 Oct 2024 01:55:30 -0600 Subject: [PATCH 091/141] Fix fluid drilling rig not working with 2 hatches (#2092) --- .../gtceu/common/machine/trait/FluidDrillLogic.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/FluidDrillLogic.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/FluidDrillLogic.java index cb878dacbe..1d0eb4a2c7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/FluidDrillLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/FluidDrillLogic.java @@ -60,7 +60,7 @@ public void findAndHandleRecipe() { var match = getFluidDrillRecipe(); if (match != null) { var copied = match.copy(new ContentModifier(match.duration, 0)); - if (match.matchRecipe(this.machine).isSuccess() && copied.matchTickRecipe(this.machine).isSuccess()) { + if (match.matchRecipe(this.machine).isSuccess() && match.matchTickRecipe(this.machine).isSuccess()) { setupRecipe(match); } } @@ -124,7 +124,7 @@ public void onRecipeFinish() { var match = getFluidDrillRecipe(); if (match != null) { var copied = match.copy(new ContentModifier(match.duration, 0)); - if (match.matchRecipe(this.machine).isSuccess() && copied.matchTickRecipe(this.machine).isSuccess()) { + if (match.matchRecipe(this.machine).isSuccess() && match.matchTickRecipe(this.machine).isSuccess()) { setupRecipe(match); return; } From 44de8a0e96e529db85d3bc8c78ef62daa2e1c60e Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Sun, 6 Oct 2024 01:56:35 -0600 Subject: [PATCH 092/141] Port of 1.12 hard ebf recipe (#2093) --- .../gregtechceu/gtceu/config/ConfigHolder.java | 3 +++ .../data/recipe/misc/MetaTileEntityLoader.java | 17 +++++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index d2595fab50..8bceb81484 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -125,6 +125,9 @@ public static class RecipeConfigs { "Default: false" }) public boolean harderCircuitRecipes = false; @Configurable + @Configurable.Comment({ "Whether to nerf machine controller recipes.", "Default: false" }) + public boolean hardMultiRecipes = false; // default false + @Configurable @Configurable.Comment({ "Whether tools should have enchants or not. Like the flint sword getting fire aspect.", "Default: true" }) diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MetaTileEntityLoader.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MetaTileEntityLoader.java index 93bcbf9ccd..36736a40d6 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MetaTileEntityLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MetaTileEntityLoader.java @@ -555,10 +555,19 @@ public static void init(Consumer provider) { 'R', new UnificationEntry(TagPrefix.rotor, GTMaterials.Iron), 'H', GTBlocks.BRONZE_BRICKS_HULL, 'F', Items.FLINT_AND_STEEL); - VanillaRecipeHelper.addShapedRecipe(provider, true, "electric_blast_furnace", - GTMachines.ELECTRIC_BLAST_FURNACE.asStack(), "FFF", "CMC", "WCW", 'M', - GTBlocks.CASING_INVAR_HEATPROOF.asStack(), 'F', Blocks.FURNACE.asItem(), 'C', CustomTags.LV_CIRCUITS, - 'W', new UnificationEntry(TagPrefix.cableGtSingle, GTMaterials.Tin)); + if (!ConfigHolder.INSTANCE.recipes.hardMultiRecipes) { + VanillaRecipeHelper.addShapedRecipe(provider, true, "electric_blast_furnace", + GTMachines.ELECTRIC_BLAST_FURNACE.asStack(), "FFF", "CMC", "WCW", 'M', + GTBlocks.CASING_INVAR_HEATPROOF.asStack(), 'F', Blocks.FURNACE.asItem(), 'C', + CustomTags.LV_CIRCUITS, + 'W', new UnificationEntry(TagPrefix.cableGtSingle, GTMaterials.Tin)); + } else { + VanillaRecipeHelper.addShapedRecipe(provider, true, "electric_blast_furnace", + GTMachines.ELECTRIC_BLAST_FURNACE.asStack(), "FFF", "CMC", "WCW", 'M', + GTBlocks.CASING_INVAR_HEATPROOF.asStack(), 'F', GTMachines.ELECTRIC_FURNACE[LV].asStack(), 'C', + CustomTags.LV_CIRCUITS, + 'W', new UnificationEntry(TagPrefix.cableGtSingle, GTMaterials.Tin)); + } VanillaRecipeHelper.addShapedRecipe(provider, true, "vacuum_freezer", GTMachines.VACUUM_FREEZER.asStack(), "PPP", "CMC", "WCW", 'M', GTBlocks.CASING_ALUMINIUM_FROSTPROOF.asStack(), 'P', GTItems.ELECTRIC_PUMP_HV, 'C', CustomTags.EV_CIRCUITS, 'W', new UnificationEntry(TagPrefix.cableGtSingle, GTMaterials.Gold)); From f6ea016634bfa6df564d6fd6ad211008e3d917f6 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Sun, 6 Oct 2024 01:57:01 -0600 Subject: [PATCH 093/141] Fix Wooden sign recipes (#2094) --- .../data/recipe/misc/WoodMachineRecipes.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) 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 44ef34d4be..fbb0d0db3c 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 @@ -493,9 +493,9 @@ public static void registerWoodTypeRecipe(Consumer provider, @No String recipeName = hasSignRecipe ? entry.signRecipeName : name + "_sign"; if (ConfigHolder.INSTANCE.recipes.hardWoodRecipes) { VanillaRecipeHelper.addShapedRecipe(provider, recipeName + "_iron", new ItemStack(entry.sign), - "LLL", "rPr", "sSd", + "LLL", "RPR", "sSd", 'P', entry.planks, - 'r', new UnificationEntry(screw, Iron), + 'R', new UnificationEntry(screw, Iron), 'L', entry.slab, 'S', entry.getStick()); @@ -509,9 +509,9 @@ public static void registerWoodTypeRecipe(Consumer provider, @No .duration(200).EUt(4).save(provider); VanillaRecipeHelper.addShapedRecipe(provider, recipeName + "_steel", new ItemStack(entry.sign, 2), - "LLL", "rPr", "sSd", + "LLL", "RPR", "sSd", 'P', entry.planks, - 'r', new UnificationEntry(screw, Steel), + 'R', new UnificationEntry(screw, Steel), 'L', entry.slab, 'S', entry.getStick()); @@ -550,9 +550,9 @@ public static void registerWoodTypeRecipe(Consumer provider, @No String recipeName = hasTrapdoorRecipe ? entry.trapdoorRecipeName : name + "_trapdoor"; if (ConfigHolder.INSTANCE.recipes.hardWoodRecipes) { VanillaRecipeHelper.addShapedRecipe(provider, recipeName + "_iron", new ItemStack(entry.trapdoor), - "bPS", "PdP", "SPb", + "BPS", "PdP", "SPB", 'P', entry.planks, - 'b', new UnificationEntry(bolt, Iron), + 'B', new UnificationEntry(bolt, Iron), 'S', entry.getStick()); // plank -> trapdoor assembling @@ -564,9 +564,9 @@ public static void registerWoodTypeRecipe(Consumer provider, @No .duration(200).EUt(4).save(provider); VanillaRecipeHelper.addShapedRecipe(provider, recipeName + "_steel", new ItemStack(entry.trapdoor, 2), - "bPS", "PdP", "SPb", + "BPS", "PdP", "SPB", 'P', entry.planks, - 'b', new UnificationEntry(bolt, Steel), + 'B', new UnificationEntry(bolt, Steel), 'S', entry.getStick()); // plank -> trapdoor assembling From 6e4e1c3616fbd9c430c0eea5a66933bf16a4e34e Mon Sep 17 00:00:00 2001 From: Karthi Suresh <75553966+JuiceyBeans@users.noreply.github.com> Date: Sun, 6 Oct 2024 08:58:40 +0100 Subject: [PATCH 094/141] Stone tags and LPG localisation (#2095) --- src/generated/resources/assets/gtceu/lang/en_ud.json | 2 +- src/generated/resources/assets/gtceu/lang/en_us.json | 2 +- .../resources/data/forge/tags/blocks/cobblestone.json | 8 ++++++++ src/generated/resources/data/forge/tags/blocks/stone.json | 8 ++++++++ .../java/com/gregtechceu/gtceu/common/data/GTBlocks.java | 7 +++++++ .../java/com/gregtechceu/gtceu/data/lang/LangHandler.java | 1 + 6 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 src/generated/resources/data/forge/tags/blocks/cobblestone.json create mode 100644 src/generated/resources/data/forge/tags/blocks/stone.json diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 2b901d21ea..e32c3a1321 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -5405,7 +5405,7 @@ "material.gtceu.lithium": "ɯnıɥʇıꞀ", "material.gtceu.lithium_chloride": "ǝpıɹoןɥƆ ɯnıɥʇıꞀ", "material.gtceu.livermorium": "ɯnıɹoɯɹǝʌıꞀ", - "material.gtceu.lpg": "bdꞀ", + "material.gtceu.lpg": "⅁ԀꞀ", "material.gtceu.lubricant": "ʇuɐɔıɹqnꞀ", "material.gtceu.lutetium": "ɯnıʇǝʇnꞀ", "material.gtceu.magenta_dye": "ǝʎᗡ ɐʇuǝbɐW", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 7513de071c..96a5203a35 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -5405,7 +5405,7 @@ "material.gtceu.lithium": "Lithium", "material.gtceu.lithium_chloride": "Lithium Chloride", "material.gtceu.livermorium": "Livermorium", - "material.gtceu.lpg": "Lpg", + "material.gtceu.lpg": "LPG", "material.gtceu.lubricant": "Lubricant", "material.gtceu.lutetium": "Lutetium", "material.gtceu.magenta_dye": "Magenta Dye", diff --git a/src/generated/resources/data/forge/tags/blocks/cobblestone.json b/src/generated/resources/data/forge/tags/blocks/cobblestone.json new file mode 100644 index 0000000000..8392a73321 --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/cobblestone.json @@ -0,0 +1,8 @@ +{ + "values": [ + "gtceu:red_granite_cobblestone", + "gtceu:marble_cobblestone", + "gtceu:light_concrete_cobblestone", + "gtceu:dark_concrete_cobblestone" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/stone.json b/src/generated/resources/data/forge/tags/blocks/stone.json new file mode 100644 index 0000000000..136517d869 --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/stone.json @@ -0,0 +1,8 @@ +{ + "values": [ + "gtceu:red_granite", + "gtceu:marble", + "gtceu:light_concrete", + "gtceu:dark_concrete" + ] +} \ 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 c123384a66..2d138d3821 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java @@ -73,6 +73,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.model.generators.ModelFile; import net.minecraftforge.client.model.generators.ModelProvider; +import net.minecraftforge.common.Tags; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableTable; @@ -1544,6 +1545,12 @@ public static void generateStoneBlocks() { prov.modLoc(ModelProvider.BLOCK_FOLDER + "/stones/" + strata.getSerializedName() + "/" + type.id)))); } + if (type == StoneBlockType.STONE) { + entry.tag(Tags.Blocks.STONE); + } + if (type == StoneBlockType.COBBLE) { + entry.tag(Tags.Blocks.COBBLESTONE); + } builder.put(type, strata, entry.register()); } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index 63d5169664..4ebf468420 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -536,6 +536,7 @@ public static void init(RegistrateLangProvider provider) { "Severely Steam-Cracked Light Fuel"); replace(provider, GTMaterials.SeverelySteamCrackedNaphtha.getUnlocalizedName(), "Severely Steam-Cracked Naphtha"); + replace(provider, GTMaterials.LPG.getUnlocalizedName(), "LPG"); replace(provider, GTMaterials.Zeron100.getUnlocalizedName(), "Zeron-100"); replace(provider, GTMaterials.IncoloyMA956.getUnlocalizedName(), "Incoloy MA-956"); From b312167dddcbc199fe86f93fb6b724be1299478b Mon Sep 17 00:00:00 2001 From: Karthi Suresh <75553966+JuiceyBeans@users.noreply.github.com> Date: Sun, 6 Oct 2024 08:59:18 +0100 Subject: [PATCH 095/141] Add more interactions + fixes for Lighter (#2075) --- .../resources/assets/gtceu/lang/en_ud.json | 7 +- .../resources/assets/gtceu/lang/en_us.json | 7 +- .../item/tool/behavior/LighterBehavior.java | 101 ++++++++++++++---- .../gtceu/data/lang/LangHandler.java | 7 +- 4 files changed, 92 insertions(+), 30 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index e32c3a1321..f1fbfd262b 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -60,7 +60,8 @@ "behaviour.hammer": ")ɯǝɥʇ buıʇʇıɥ ʎq( sǝuıɥɔɐW ɹoɟ buıןɟɟnW ɟɟo puɐ uo suɹn⟘", "behaviour.hoe": "ʇɹıp ןןıʇ uɐƆ", "behaviour.lighter.fluid.tooltip": "ǝuɐdoɹԀ ɹo ǝuɐʇnᗺ ɥʇıʍ ǝɹıɟ uo sbuıɥʇ ʇɥbıן uɐƆ", - "behaviour.lighter.tooltip": "ǝɹıɟ uo sbuıɥʇ ʇɥbıן uɐƆ", + "behaviour.lighter.tooltip.description": "ǝɹıɟ uo sbuıɥʇ ʇɥbıן uɐƆ", + "behaviour.lighter.tooltip.usage": "ǝsoןɔ/uǝdo oʇ ʞɔıןɔ ʇɥbıɹ-ʇɟıɥS", "behaviour.lighter.uses": "%d :sǝsn buıuıɐɯǝᴚ", "behaviour.paintspray.black.tooltip": "ʞɔɐןᗺ uı sbuıɥʇ ʇuıɐd uɐƆ", "behaviour.paintspray.blue.tooltip": "ǝnןᗺ uı sbuıɥʇ ʇuıɐd uɐƆ", @@ -2589,8 +2590,8 @@ "effect.gtceu.weak_poison": "uosıoԀ ʞɐǝM", "enchantment.damage.disjunction": "uoıʇɔunظsıᗡ", "enchantment.disjunction": "uoıʇɔunظsıᗡ", - "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.gtceu.disjunction.description": "˙sqoɯ pǝʇɐןǝɹ-ɹǝpuƎ oʇ ssǝuʍoןS puɐ ssǝuʞɐǝM sǝıןddⱯ", + "enchantment.gtceu.hard_hammer.description": "˙ɹǝɯɯɐH ɥɔǝ⟘bǝɹ⅁ ɐ ɥʇıʍ pǝuıɯ ǝɹǝʍ ʎǝɥʇ ɟı sɐ sʞɔoןq sʞɐǝɹᗺ", "enchantment.hard_hammer": "buıɹǝɯɯɐH", "entity.gtceu.boat": "ʇɐoᗺ", "entity.gtceu.chest_boat": "ʇɐoᗺ ʇsǝɥƆ", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 96a5203a35..aea3d283dd 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -60,7 +60,8 @@ "behaviour.hammer": "Turns on and off Muffling for Machines (by hitting them)", "behaviour.hoe": "Can till dirt", "behaviour.lighter.fluid.tooltip": "Can light things on fire with Butane or Propane", - "behaviour.lighter.tooltip": "Can light things on fire", + "behaviour.lighter.tooltip.description": "Can light things on fire", + "behaviour.lighter.tooltip.usage": "Shift-right click to open/close", "behaviour.lighter.uses": "Remaining uses: %d", "behaviour.paintspray.black.tooltip": "Can paint things in Black", "behaviour.paintspray.blue.tooltip": "Can paint things in Blue", @@ -2589,8 +2590,8 @@ "effect.gtceu.weak_poison": "Weak Poison", "enchantment.damage.disjunction": "Disjunction", "enchantment.disjunction": "Disjunction", - "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.gtceu.disjunction.description": "Applies Weakness and Slowness to Ender-related mobs.", + "enchantment.gtceu.hard_hammer.description": "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", diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/LighterBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/LighterBehavior.java index 62baca9c53..e4b53bb986 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/LighterBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/LighterBehavior.java @@ -25,9 +25,7 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.TntBlock; +import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.fluids.capability.IFluidHandler; @@ -36,11 +34,12 @@ import org.apache.commons.lang3.tuple.Pair; import org.jetbrains.annotations.NotNull; -import java.awt.*; import java.util.List; import javax.annotation.Nullable; +import static net.minecraft.world.level.block.AbstractCandleBlock.LIT; + public class LighterBehavior implements IDurabilityBar, IInteractionItem, IAddInformation { public static final String LIGHTER_OPEN = "lighterOpen"; @@ -88,34 +87,93 @@ public InteractionResult onItemUseFirst(ItemStack itemStack, UseOnContext contex // ItemStack itemStack = player.getItemInHand(usedHand); CompoundTag tag = itemStack.getOrCreateTag(); Player player = context.getPlayer(); - if ((!canOpen || (tag.getBoolean(LIGHTER_OPEN)) && !player.isCrouching()) && consumeFuel(player, itemStack)) { - player.level().playSound(null, player.getOnPos(), SoundEvents.FLINTANDSTEEL_USE, SoundSource.PLAYERS, 1.0F, - GTValues.RNG.nextFloat() * 0.4F + 0.8F); - BlockState state = context.getLevel().getBlockState(context.getClickedPos()); - Block block = state.getBlock(); - if (block instanceof TntBlock tnt) { - tnt.onCaughtFire(null, context.getLevel(), context.getClickedPos(), null, player); - context.getLevel().setBlock(context.getClickedPos(), Blocks.AIR.defaultBlockState(), + BlockPos pos = context.getClickedPos(); + BlockState state = context.getLevel().getBlockState(pos); + Block block = state.getBlock(); + BlockPos offset = pos.offset(context.getClickedFace().getNormal()); + + if ((!canOpen || (tag.getBoolean(LIGHTER_OPEN)) && !player.isCrouching())) { + if (block instanceof TntBlock tnt && consumeFuel(player, itemStack)) { + tnt.onCaughtFire(null, context.getLevel(), pos, null, player); + context.getLevel().setBlock(pos, Blocks.AIR.defaultBlockState(), Block.UPDATE_ALL_IMMEDIATE); + player.level().playSound(null, player.getOnPos(), SoundEvents.FLINTANDSTEEL_USE, SoundSource.PLAYERS, + 1.0F, + GTValues.RNG.nextFloat() * 0.4F + 0.8F); return InteractionResult.SUCCESS; } - if (block instanceof GTExplosiveBlock explosive) { - explosive.explode(context.getLevel(), context.getClickedPos(), player); - context.getLevel().setBlock(context.getClickedPos(), Blocks.AIR.defaultBlockState(), + if (block instanceof GTExplosiveBlock explosive && consumeFuel(player, itemStack)) { + explosive.explode(context.getLevel(), pos, player); + context.getLevel().setBlock(pos, Blocks.AIR.defaultBlockState(), Block.UPDATE_ALL_IMMEDIATE); + player.level().playSound(null, player.getOnPos(), SoundEvents.FLINTANDSTEEL_USE, SoundSource.PLAYERS, + 1.0F, + GTValues.RNG.nextFloat() * 0.4F + 0.8F); return InteractionResult.SUCCESS; } + if (block instanceof CandleBlock) { + if (CandleBlock.canLight(state) && !CandleBlock.isLit(state) && consumeFuel(player, itemStack)) { + context.getLevel().setBlock(pos, state.setValue(LIT, true), Block.UPDATE_ALL_IMMEDIATE); + player.level().playSound(null, player.getOnPos(), SoundEvents.FLINTANDSTEEL_USE, + SoundSource.PLAYERS, 1.0F, + GTValues.RNG.nextFloat() * 0.4F + 0.8F); + return InteractionResult.SUCCESS; + } else return InteractionResult.PASS; + } + if (block instanceof CandleCakeBlock) { + if (CandleCakeBlock.canLight(state) && !CandleCakeBlock.isLit(state) && + consumeFuel(player, itemStack)) { + context.getLevel().setBlock(pos, state.setValue(LIT, true), Block.UPDATE_ALL_IMMEDIATE); + player.level().playSound(null, player.getOnPos(), SoundEvents.FLINTANDSTEEL_USE, + SoundSource.PLAYERS, 1.0F, + GTValues.RNG.nextFloat() * 0.4F + 0.8F); + return InteractionResult.SUCCESS; + } else return InteractionResult.PASS; + } + if (block instanceof CampfireBlock) { + if (CampfireBlock.canLight(state) && !CampfireBlock.isLitCampfire(state) && + consumeFuel(player, itemStack)) { + context.getLevel().setBlock(pos, state.setValue(LIT, true), Block.UPDATE_ALL_IMMEDIATE); + player.level().playSound(null, player.getOnPos(), SoundEvents.FLINTANDSTEEL_USE, + SoundSource.PLAYERS, 1.0F, + GTValues.RNG.nextFloat() * 0.4F + 0.8F); + return InteractionResult.SUCCESS; + } else return InteractionResult.PASS; + } + if (block instanceof SoulSandBlock && block != Blocks.SOUL_FIRE && consumeFuel(player, itemStack)) { + context.getLevel().setBlock(offset, Blocks.SOUL_FIRE.defaultBlockState(), Block.UPDATE_ALL_IMMEDIATE); + if (!context.getLevel().isClientSide) { + CriteriaTriggers.PLACED_BLOCK.trigger((ServerPlayer) player, offset, itemStack); + } + player.level().playSound(null, player.getOnPos(), SoundEvents.FLINTANDSTEEL_USE, SoundSource.PLAYERS, + 1.0F, + GTValues.RNG.nextFloat() * 0.4F + 0.8F); + return InteractionResult.PASS; + } + if (block == Blocks.SOUL_SOIL && block != Blocks.SOUL_FIRE && consumeFuel(player, itemStack)) { + context.getLevel().setBlock(offset, Blocks.SOUL_FIRE.defaultBlockState(), Block.UPDATE_ALL_IMMEDIATE); + if (!context.getLevel().isClientSide) { + CriteriaTriggers.PLACED_BLOCK.trigger((ServerPlayer) player, offset, itemStack); + } + player.level().playSound(null, player.getOnPos(), SoundEvents.FLINTANDSTEEL_USE, SoundSource.PLAYERS, + 1.0F, + GTValues.RNG.nextFloat() * 0.4F + 0.8F); + return InteractionResult.PASS; + } - BlockPos offset = context.getClickedPos().offset(context.getClickedFace().getNormal()); - if (context.getLevel().isEmptyBlock(offset)) { + if (context.getLevel().isEmptyBlock(offset) && + BaseFireBlock.canBePlacedAt(context.getLevel(), offset, context.getHorizontalDirection()) && + block != Blocks.FIRE && block != Blocks.SOUL_FIRE && consumeFuel(player, itemStack)) { context.getLevel().setBlock(offset, Blocks.FIRE.defaultBlockState(), Block.UPDATE_ALL_IMMEDIATE); if (!context.getLevel().isClientSide) { CriteriaTriggers.PLACED_BLOCK.trigger((ServerPlayer) player, offset, itemStack); } + player.level().playSound(null, player.getOnPos(), SoundEvents.FLINTANDSTEEL_USE, SoundSource.PLAYERS, + 1.0F, + GTValues.RNG.nextFloat() * 0.4F + 0.8F); + return InteractionResult.SUCCESS; } - return InteractionResult.PASS; } - return InteractionResult.FAIL; } @@ -216,8 +274,9 @@ public boolean showEmptyBar(ItemStack itemStack) { @Override public void appendHoverText(ItemStack stack, @org.jetbrains.annotations.Nullable Level level, List tooltipComponents, TooltipFlag isAdvanced) { - tooltipComponents.add( - Component.translatable(usesFluid ? "behaviour.lighter.fluid.tooltip" : "behaviour.lighter.tooltip")); + tooltipComponents.add(Component + .translatable(usesFluid ? "behaviour.lighter.fluid.tooltip" : "behaviour.lighter.tooltip.description")); + tooltipComponents.add(Component.translatable("behaviour.lighter.tooltip.usage")); if (hasMultipleUses && !usesFluid) { tooltipComponents.add(Component.translatable("behaviour.lighter.uses", getUsesLeft(stack))); } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index 4ebf468420..a3cc3744a8 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -696,7 +696,8 @@ public static void init(RegistrateLangProvider provider) { provider.add("behaviour.soft_hammer", "Activates and Deactivates Machines"); provider.add("behaviour.soft_hammer.enabled", "Working Enabled"); provider.add("behaviour.soft_hammer.disabled", "Working Disabled"); - provider.add("behaviour.lighter.tooltip", "Can light things on fire"); + provider.add("behaviour.lighter.tooltip.description", "Can light things on fire"); + provider.add("behaviour.lighter.tooltip.usage", "Shift-right click to open/close"); provider.add("behaviour.lighter.fluid.tooltip", "Can light things on fire with Butane or Propane"); provider.add("behaviour.lighter.uses", "Remaining uses: %d"); provider.add("behavior.toggle_energy_consumer.tooltip", "Use to toggle mode"); @@ -723,10 +724,10 @@ public static void init(RegistrateLangProvider provider) { provider.add("behaviour.paintspray.uses", "Remaining Uses: %d"); provider.add("behaviour.prospecting", "Usable for Prospecting"); provider.add("enchantment.damage.disjunction", "Disjunction"); - provider.add("enchantment.gtceu.disjunction.desc", + provider.add("enchantment.gtceu.disjunction.description", "Applies Weakness and Slowness to Ender-related mobs."); provider.add("enchantment.hard_hammer", "Hammering"); - provider.add("enchantment.gtceu.hard_hammer.desc", + provider.add("enchantment.gtceu.hard_hammer.description", "Breaks blocks as if they were mined with a GregTech Hammer."); provider.add("tile.gtceu.seal.name", "Sealed Block"); provider.add("tile.gtceu.foam.name", "Foam"); From 97f2dbb57129b69bb0f7b94ba641c9e77efd321d Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Wed, 9 Oct 2024 15:40:09 -0400 Subject: [PATCH 096/141] Revamp Workflows for Optimal Productivity (#2112) --- .github/actions/build_setup/action.yml | 15 ++- .github/json/config-latest.json | 22 ++++ .github/json/config.json | 35 ++++++ .github/workflows/auto-build.yml | 66 +++++----- .github/workflows/build-on-push.yml | 19 ++- .github/workflows/changelog.yml | 30 ----- .github/workflows/clean.yml | 4 - .github/workflows/format-java.yml | 11 +- .github/workflows/manage-pr-labels.yml | 16 +-- .github/workflows/publish-on-release.yml | 51 ++++++++ .github/workflows/publish.yml | 142 ++++++++++++++++++++++ .github/workflows/sync.yml | 25 ++++ .github/workflows/update-gradle-cache.yml | 8 +- gradle/scripts/resources.gradle | 2 +- src/main/templates/META-INF/mods.toml | 11 ++ 15 files changed, 351 insertions(+), 106 deletions(-) create mode 100644 .github/json/config-latest.json create mode 100644 .github/json/config.json delete mode 100644 .github/workflows/changelog.yml create mode 100644 .github/workflows/publish-on-release.yml create mode 100644 .github/workflows/publish.yml create mode 100644 .github/workflows/sync.yml diff --git a/.github/actions/build_setup/action.yml b/.github/actions/build_setup/action.yml index 40e38cd7df..a19adcdf6a 100644 --- a/.github/actions/build_setup/action.yml +++ b/.github/actions/build_setup/action.yml @@ -6,20 +6,23 @@ inputs: description: If cache should be updated required: false default: 'false' + ref: + description: 'Ref to checkout' + required: false runs: using: 'composite' - steps: - uses: actions/checkout@v4 with: - submodules: true - - - name: Set up JDK 17 + ref: ${{ inputs.ref || github.ref }} + - name: Set up JDK uses: actions/setup-java@v4 + env: + REF: ${{ inputs.ref || github.ref }} with: - distribution: adopt - java-version: 17 + distribution: temurin + java-version: ${{ contains(env.REF, '1.20.1') && '17' || '21' }} - name: Validate Gradle wrapper uses: gradle/actions/wrapper-validation@v3 diff --git a/.github/json/config-latest.json b/.github/json/config-latest.json new file mode 100644 index 0000000000..39ed43ea07 --- /dev/null +++ b/.github/json/config-latest.json @@ -0,0 +1,22 @@ +{ + "categories": [ + { + "title": "### Added", + "labels": ["type: feature"] + }, + { + "title": "### Fixed", + "labels": ["type: bugfix"] + }, + { + "title": "### Changed", + "labels": ["type: refactor", "type: translation"] + } + ], + "sort": "ASC", + "template": "## Changes\n#{{CHANGELOG}}", + "pr_template": "- #{{TITLE}} by #{{AUTHOR}} in [##{{NUMBER}}](#{{URL}})", + "ignore_labels": ["ignore changelog"], + "max_pull_requests": 1000, + "max_back_track_time_days": 90 +} diff --git a/.github/json/config.json b/.github/json/config.json new file mode 100644 index 0000000000..f1ba8dfe99 --- /dev/null +++ b/.github/json/config.json @@ -0,0 +1,35 @@ +{ + "categories": [ + { + "title": "### Added", + "labels": ["type: feature"] + }, + { + "title": "### Fixed", + "labels": ["type: bugfix"] + }, + { + "title": "### Changed", + "labels": ["type: refactor", "type: translation"] + } + ], + "sort": "ASC", + "template": "## Version [#{{TO_TAG}}](#{{RELEASE_DIFF}})\n#{{CHANGELOG}} ", + "pr_template": "- #{{TITLE}} by #{{AUTHOR}} in [##{{NUMBER}}](#{{URL}})", + "empty_template": "- No changes", + "ignore_labels": ["ignore changelog"], + "tag_resolver": { + "method": "semver", + "filter": { + "pattern": "^(?!v?(1\\.20\\.1-)?[0-9\\.]+$).+$", + "flags": "gu" + }, + "transformer": { + "pattern": "v?([0-9\\.]+-)?([0-9\\.]+)", + "target": "$2" + } + }, + "max_pull_requests": 1000, + "max_back_track_time_days": 90, + "base_branches": ["1.20.1"] +} diff --git a/.github/workflows/auto-build.yml b/.github/workflows/auto-build.yml index fbd05675b6..af2231e3a3 100644 --- a/.github/workflows/auto-build.yml +++ b/.github/workflows/auto-build.yml @@ -1,12 +1,12 @@ -name: auto-build +name: Latest Build on: push: - branches: - - '1.20.1' + branches: ['1.20.1', '1.21'] + paths-ignore: ['.github/**', '**/*.md'] concurrency: - group: auto-build-${{ github.head_ref || github.ref }} + group: auto-build-${{ github.ref }} cancel-in-progress: true jobs: @@ -16,41 +16,45 @@ jobs: MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} MAVEN_USER: ${{ secrets.MAVEN_USER }} SNAPSHOT: true + GITHUB_TOKEN: ${{ github.token }} permissions: contents: write steps: - uses: actions/checkout@v4 - with: - submodules: true - - name: Setup Build uses: ./.github/actions/build_setup - + - name: Get Version + id: ver + run: echo "version=$(./gradlew -q printVersion)" >> $GITHUB_OUTPUT - name: Build run: ./gradlew build --build-cache - - name: Publish to Maven + if: github.repository_owner == 'GregTechCEu' run: ./gradlew publish --build-cache - - - name: Get Version - id: var - run: | - VER=$(./gradlew -q printVersion) - BUILD_VER=$VER-build_${{ github.run_number }} - for jar in ./build/libs/*; do mv "$jar" "${jar/${VER}-SNAPSHOT/${BUILD_VER}-SNAPSHOT}";done 2>/dev/null - echo "version=$BUILD_VER" >> $GITHUB_OUTPUT - - - name: Release - id: release - uses: Kir-Antipov/mc-publish@v3.3.0 + - name: Upload Artifacts + uses: actions/upload-artifact@v4 with: - github-tag: ${{ steps.var.outputs.version }} - github-token: ${{ secrets.GITHUB_TOKEN }} - files: | - build/libs/!(*-@(dev|dev-all|dev-slim|javadoc)).jar - - - name: Print Output - run: | - echo "Release tag: ${{ steps.release.outputs.github-tag }}" - echo "Release URL: ${{ steps.release.outputs.github-url }}" - echo "Released files: ${{ steps.release.outputs.github-files }}" + name: build-artifacts + path: build/libs/* + if-no-files-found: error + retention-days: 90 + - name: Changelog + id: changelog + uses: mikepenz/release-changelog-builder-action@v5 + with: + configuration: ./.github/json/config-latest.json + fromTag: latest-${{ github.ref_name }} + toTag: ${{ github.ref }} + fetchViaCommits: true + failOnError: false + - name: Release Latest + uses: andelf/nightly-release@46e2d5f80828ecc5c2c3c819eb31186a7cf2156c + with: + tag_name: latest-${{ github.ref_name }} + name: '${{ github.ref_name }}-${{ steps.ver.outputs.version}} SNAPSHOT $$' + prerelease: true + body: | + The latest build of GTM for Minecraft ${{ github.ref_name }}. + Please report any [issues](https://github.com/GregTechCEu/GregTech-Modern/issues). + ${{ steps.changelog.outputs.changelog }} + files: build/libs/*.jar \ No newline at end of file diff --git a/.github/workflows/build-on-push.yml b/.github/workflows/build-on-push.yml index cde92e010b..451fc40a64 100644 --- a/.github/workflows/build-on-push.yml +++ b/.github/workflows/build-on-push.yml @@ -4,16 +4,16 @@ on: pull_request: paths: ['**'] +# Cancel previous jobs if PR gets another push +concurrency: + group: PR-build-${{ github.ref }} + cancel-in-progress: true + jobs: build: runs-on: ubuntu-latest - env: - GITHUB_RUN_NUMBER: ${{ vars.GITHUB_RUN_NUMBER }} steps: - uses: actions/checkout@v4 - with: - submodules: true - - name: Check Path Filter uses: dorny/paths-filter@v3 id: filter @@ -21,23 +21,20 @@ jobs: filters: | code: - 'src/**' - - '**.gradle' + - '*.gradle' - 'gradle.properties' - - 'gradlew**' + - 'gradlew*' - 'gradle/**' - - name: Setup Build if: steps.filter.outputs.code == 'true' uses: ./.github/actions/build_setup - - name: Build if: steps.filter.outputs.code == 'true' run: ./gradlew assemble --build-cache - - name: Upload Artifact if: steps.filter.outputs.code == 'true' uses: actions/upload-artifact@v4.0.0 with: name: build output path: build/libs/* - retention-days: 30 + retention-days: 15 diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml deleted file mode 100644 index 674911db19..0000000000 --- a/.github/workflows/changelog.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Generate Changelog - -on: - workflow_dispatch: - inputs: - lastReleaseTag: - description: 'tag of the last full release.' - required: true - type: string - -jobs: - build: - runs-on: ubuntu-latest - env: - MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} - MAVEN_USER: ${{ secrets.MAVEN_USER }} - permissions: - contents: write - steps: - - uses: actions/checkout@v4 - with: - submodules: true - - - name: Update CHANGELOG - id: changelog - uses: requarks/changelog-action@v1 - with: - token: ${{ secrets.GITHUB_TOKEN }} - fromTag: ${{ github.ref_name }} - toTag: ${{ inputs.lastReleaseTag }} diff --git a/.github/workflows/clean.yml b/.github/workflows/clean.yml index c18a35af0a..14745c05e7 100644 --- a/.github/workflows/clean.yml +++ b/.github/workflows/clean.yml @@ -10,13 +10,9 @@ jobs: contents: write steps: - uses: actions/checkout@v4 - with: - submodules: true - - name: Setup Build uses: ./.github/actions/build_setup with: update-cache: true - - name: Clean run: ./gradlew clean --build-cache diff --git a/.github/workflows/format-java.yml b/.github/workflows/format-java.yml index 80962a65c6..44ec187744 100644 --- a/.github/workflows/format-java.yml +++ b/.github/workflows/format-java.yml @@ -3,25 +3,24 @@ name: Java Formatting on: push: - branches: - - '1.20.1' + branches: ['1.20.1', '1.21'] paths: ['src/main/java/**', 'src/test/**'] pull_request: paths: ['**'] concurrency: - group: formatting-${{ github.head_ref || github.ref }} + group: formatting-${{ github.ref }} cancel-in-progress: true jobs: formatting: name: Formatting runs-on: ubuntu-latest - + permissions: + pull-requests: read steps: - name: Checkout Repository uses: actions/checkout@v4 - - name: Check Path Filter uses: dorny/paths-filter@v3 id: filter @@ -30,11 +29,9 @@ jobs: code: - 'src/main/java/**' - 'src/test/**' - - name: Setup Build if: steps.filter.outputs.code == 'true' uses: ./.github/actions/build_setup - - name: Run Spotless Formatting Check with Gradle if: steps.filter.outputs.code == 'true' run: ./gradlew spotlessCheck --warning-mode all --build-cache diff --git a/.github/workflows/manage-pr-labels.yml b/.github/workflows/manage-pr-labels.yml index f396fccdea..5757945724 100644 --- a/.github/workflows/manage-pr-labels.yml +++ b/.github/workflows/manage-pr-labels.yml @@ -1,33 +1,29 @@ # Manages labels on PRs before allowing merging name: Pull Request Labels +# Checks for label once PR has been reviewed on: - pull_request: - types: - - opened - - labeled - - unlabeled - - synchronize + pull_request_review: + types: [submitted] -# if a second commit is pushed quickly after the first, cancel the first one's build concurrency: group: pr-labels-${{ github.head_ref }} cancel-in-progress: true jobs: Labels: + name: On Approval + if: github.event.review.state == 'approved' runs-on: ubuntu-latest - permissions: pull-requests: read # needed to utilize required-labels - steps: - name: Check for Merge-Blocking Labels # blocks merge if present uses: mheap/github-action-required-labels@v5 with: mode: exactly count: 0 - labels: 'status: do not merge' + labels: 'do not merge' exit_type: failure - name: Check for Required Labels # require at least one of these labels diff --git a/.github/workflows/publish-on-release.yml b/.github/workflows/publish-on-release.yml new file mode 100644 index 0000000000..14bed3d65c --- /dev/null +++ b/.github/workflows/publish-on-release.yml @@ -0,0 +1,51 @@ +name: Publish on Release + +on: + release: + types: [released] + +# TODO: Make it so you can publish releases for each mc-ver individually + +jobs: + meta: + name: Metadata + runs-on: ubuntu-latest + outputs: + CHANGELOG: ${{ steps.changelog.outputs.changelog }} + permissions: + contents: write + pull-requests: write + steps: + - name: Generate changelog + id: changelog + env: + GITHUB_TOKEN: ${{ github.token }} + uses: mikepenz/release-changelog-builder-action@v5 + with: + configuration: ./.github/json/config.json + toTag: ${{ github.event.release.tag }} + ignorePreReleases: true + fetchViaCommits: true + failOnError: true + + publish-20: + name: 1.20.1 + needs: [ meta ] + secrets: inherit + uses: ./.github/workflows/publish.yml + with: + simulate: ${{ startsWith(github.event.release.name, 'simulate') || github.repository_owner != 'GregTechCEu' }} + branch: '1.20.1' + tag-name: ${{ github.event.release.tag }} + release-body: ${{ github.event.release.description }} + changelog-body: ${{ needs.meta.outputs.CHANGELOG }} + + publish-21: + name: 1.21.1 + needs: [ meta ] + secrets: inherit + uses: ./.github/workflows/publish.yml + with: + simulate: ${{ startsWith(github.event.release.name, 'simulate') || github.repository_owner != 'GregTechCEu' }} + branch: '1.21' + tag-name: ${{ github.event.release.tag }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000000..be5be01598 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,142 @@ +name: Publish Version + +on: + workflow_call: + inputs: + simulate: + required: false + type: boolean + branch: + description: 'Branch to checkout; 1.20.1 or 1.21' + required: true + type: string + tag-name: + description: 'Tag to upload to' + required: true + type: string + release-body: + description: 'Body for published release notes' + required: false + type: string + changelog-body: + description: 'Body of change notes to insert into CHANGELOG.md' + required: false + type: string + +jobs: + build: + name: Build and Publish to Maven + runs-on: ubuntu-latest + permissions: + contents: write + outputs: + ver: ${{ steps.ver.outputs.version }} + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.branch }} + - name: Setup Build + uses: ./.github/actions/build_setup + with: + ref: ${{ inputs.branch }} + - name: Get Version + id: ver + run: echo "version=$(./gradlew -q printVersion)" >> $GITHUB_OUTPUT + - name: Build + run: ./gradlew assemble --build-cache + - name: Upload Build Artifacts + uses: actions/upload-artifact@v4 + with: + name: build-artifacts-${{ inputs.branch }} + path: build/libs/* + if-no-files-found: error + retention-days: 3 + - name: Publish + if: ${{ !inputs.simulate }} + env: + MAVEN_USER: ${{ secrets.MAVEN_USER }} + MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} + run: ./gradlew publish --build-cache + + upload-release-artifacts: + name: Upload Artifacts + needs: build + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Download artifacts + uses: actions/download-artifact@v4 + with: + name: build-artifacts-${{ inputs.branch }} + - name: Upload artifacts to release + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ inputs.tag-name }} + files: ./!(*-@(dev|dev-all|dev-slim|javadoc)).jar + fail_on_unmatched_files: true + + publish-cf-modrinth: + name: Publish Mod + needs: build + if: ${{ !inputs.simulate }} + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Download artifacts + uses: actions/download-artifact@v4 + with: + name: build-artifacts-${{ inputs.branch }} + - name: Publish Mod + env: + MC_VERSION: ${{ inputs.branch == '1.21' && '1.21.1' || '1.20.1' }} + LOADER: ${{ inputs.branch == '1.21' && 'neoforge' || 'forge' }} + JAVA: ${{ inputs.branch == '1.21' && '21' || '17' }} + uses: Kir-Antipov/mc-publish@v3.3.0 + with: + modrinth-id: 7tG215v7 + modrinth-token: ${{ secrets.MODRINTH_TOKEN }} + curseforge-id: 890405 + curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }} + files: ./*.jar + name: 'GregTechCEu ${{ env.MC_VERSION }}-${{ needs.build.outputs.ver }}' + version: 'mc${{ env.MC_VERSION }}-${{ needs.build.outputs.ver }}' + version-type: beta + changelog: ${{ inputs.release-body }} + loaders: ${{ env.LOADER }} + java: ${{ env.JAVA }} + fail-mode: fail + + # After successful release, PR version bump and changelog + bump-version-and-changelog: + name: Bump Version and Build Changelog + needs: [ build, upload-release-artifacts, publish-cf-modrinth ] + if: ${{ always() && !failure() && !cancelled() }} + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.branch }} + - name: Bump Version + run: | + git config user.name 'github-actions[bot]' + git config user.email '41898282+github-actions[bot]@users.noreply.github.com' + git switch -C gh/release-${{ inputs.branch }} + BUMPED=$(echo ${{ needs.build.outputs.ver }} | awk -F. '/[0-9]+\./{$NF++;print}' OFS=.) + sed -i "s/= ${{ needs.build.outputs.ver }}/= ${BUMPED}/" gradle.properties + git commit -am "Bump version to ${BUMPED}" + - name: Prepend to CHANGELOG + if: inputs.changelog-body + run: | + { head -n 2 CHANGELOG.md; echo -e "${{ inputs.changelog-body }}"; tail -n +3 CHANGELOG.md; } > temp.md && mv temp.md CHANGELOG.md + git commit -am "Updated CHANGELOG" + - name: Push and PR + env: + GH_TOKEN: ${{ github.token }} + run: | + git push --force --set-upstream origin gh/release-${{ inputs.branch }} + gh pr create -B ${{ inputs.branch }} -H gh/release-${{ inputs.branch }} --title "RELEASE for ${{ inputs.branch }}" --body "Created by GH Workflow" --label "ignore changelog" diff --git a/.github/workflows/sync.yml b/.github/workflows/sync.yml new file mode 100644 index 0000000000..633161fae6 --- /dev/null +++ b/.github/workflows/sync.yml @@ -0,0 +1,25 @@ +name: Sync Github Folder + +on: + push: + branches: ['1.20.1'] + paths: ['.github/**'] + +jobs: + sync: + runs-on: ubuntu-latest + env: + GH_TOKEN: ${{ github.token }} + steps: + - uses: actions/checkout@v4 + with: + ref: '1.21' + - run: | + git config user.name 'github-actions[bot]' + git config user.email '41898282+github-actions[bot]@users.noreply.github.com' + git switch -C gh/workflow-sync + git fetch origin + git checkout origin/1.20.1 -- .github + git commit -am "Sync Workflows" + git push --force --set-upstream origin gh/workflow-sync + gh pr create -B 1.21 -H gh/workflow-sync --title "Sync Workflows with 1.20.1" --body "Created by GH Workflow" --label "ignore changelog" diff --git a/.github/workflows/update-gradle-cache.yml b/.github/workflows/update-gradle-cache.yml index 2c34a06f48..103920ce14 100644 --- a/.github/workflows/update-gradle-cache.yml +++ b/.github/workflows/update-gradle-cache.yml @@ -3,9 +3,8 @@ name: Update Gradle Cache on: push: - branches: - - '1.20.1' - paths: ['gradle/**', '**.gradle', 'gradle.properties', 'gradlew**', 'src/main/resources/accesstransformer.cfg'] + branches: ['1.20.1', '1.21'] + paths: ['gradle/**', '**/*.gradle', 'gradle.properties', 'gradlew*', 'src/main/resources/accesstransformer.cfg'] workflow_dispatch: concurrency: @@ -16,15 +15,12 @@ jobs: update-cache: name: Update Grade Cache runs-on: ubuntu-latest - steps: - name: Checkout Repository uses: actions/checkout@v4 - - name: Setup Build uses: ./.github/actions/build_setup with: update-cache: true - - name: Build Project with Gradle run: ./gradlew assemble --warning-mode all --build-cache diff --git a/gradle/scripts/resources.gradle b/gradle/scripts/resources.gradle index 77b7d60455..7ff46fe72c 100644 --- a/gradle/scripts/resources.gradle +++ b/gradle/scripts/resources.gradle @@ -12,7 +12,7 @@ def mod_issue_tracker = getConfig("mod_issue_tracker") task printVersion { doLast { - println libs.versions.minecraft.get() + "-" + mod_version + println mod_version } } diff --git a/src/main/templates/META-INF/mods.toml b/src/main/templates/META-INF/mods.toml index b6a9c1df9d..c77d25b4bf 100644 --- a/src/main/templates/META-INF/mods.toml +++ b/src/main/templates/META-INF/mods.toml @@ -30,16 +30,27 @@ side = "BOTH" [[dependencies.${mod_id}]] modId = "ldlib" mandatory = true +embedded = true versionRange = "[${ldlib_version},)" ordering = "AFTER" side = "BOTH" +[dependencies.${mod_id}.mc-publish] + ignore = false + modrinth = "ldlib" + curseforge = "ldlib" [[dependencies.${mod_id}]] modId = "configuration" mandatory = true +embedded = true versionRange = "[${configuration_version},)" ordering = "AFTER" side = "BOTH" +[dependencies.${mod_id}.mc-publish] + ignore = false + modrinth = "configuration" + curseforge = "configuration" + [[dependencies.${mod_id}]] modId = "kubejs" From 8d032f212659ff660056ab29cf165f3689c3a867 Mon Sep 17 00:00:00 2001 From: Karthi Suresh <75553966+JuiceyBeans@users.noreply.github.com> Date: Wed, 9 Oct 2024 21:22:58 +0100 Subject: [PATCH 097/141] Change Wooden Multiblock Tank recipe to use copper instead of lead (#2107) --- .../gtceu/data/recipe/misc/MetaTileEntityLoader.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MetaTileEntityLoader.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MetaTileEntityLoader.java index 36736a40d6..73a0810cd4 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MetaTileEntityLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MetaTileEntityLoader.java @@ -733,19 +733,19 @@ public static void init(Consumer provider) { VanillaRecipeHelper.addShapedRecipe(provider, true, "wood_multiblock_tank", GTMachines.WOODEN_MULTIBLOCK_TANK.asStack(), " R ", "rCs", " R ", 'R', - new UnificationEntry(TagPrefix.ring, GTMaterials.Lead), 'C', GTBlocks.CASING_WOOD_WALL.asStack()); + new UnificationEntry(TagPrefix.ring, GTMaterials.Copper), 'C', GTBlocks.CASING_WOOD_WALL.asStack()); VanillaRecipeHelper.addShapedRecipe(provider, true, "steel_multiblock_tank", GTMachines.STEEL_MULTIBLOCK_TANK.asStack(), " R ", "hCw", " R ", 'R', new UnificationEntry(TagPrefix.ring, GTMaterials.Steel), 'C', GTBlocks.CASING_STEEL_SOLID.asStack()); VanillaRecipeHelper.addShapedRecipe(provider, true, "wood_tank_valve", GTMachines.WOODEN_TANK_VALVE.asStack(), " R ", "rCs", " O ", 'O', new UnificationEntry(TagPrefix.rotor, GTMaterials.Lead), 'R', - new UnificationEntry(TagPrefix.ring, GTMaterials.Lead), 'C', GTBlocks.CASING_WOOD_WALL.asStack()); + new UnificationEntry(TagPrefix.ring, GTMaterials.Copper), 'C', GTBlocks.CASING_WOOD_WALL.asStack()); VanillaRecipeHelper.addShapedRecipe(provider, true, "steel_tank_valve", GTMachines.STEEL_TANK_VALVE.asStack(), " R ", "hCw", " O ", 'O', new UnificationEntry(TagPrefix.rotor, GTMaterials.Steel), 'R', new UnificationEntry(TagPrefix.ring, GTMaterials.Steel), 'C', GTBlocks.CASING_STEEL_SOLID.asStack()); VanillaRecipeHelper.addShapedRecipe(provider, true, "wood_wall", GTBlocks.CASING_WOOD_WALL.asStack(), "W W", "sPh", "W W", 'W', GTBlocks.TREATED_WOOD_PLANK.asStack(), 'P', - new UnificationEntry(TagPrefix.plate, GTMaterials.Lead)); + new UnificationEntry(TagPrefix.plate, GTMaterials.Copper)); // MACHINES registerMachineRecipe(provider, GTMachines.ALLOY_SMELTER, "ECE", "CMC", "WCW", 'M', HULL, 'E', CIRCUIT, 'W', From ed7a599743323d03b9acd7672d76772d129da7f7 Mon Sep 17 00:00:00 2001 From: Deepa <52133154+Deepacat@users.noreply.github.com> Date: Thu, 10 Oct 2024 02:21:25 -0500 Subject: [PATCH 098/141] Allow Steam Multiblocks to have variable parallel amounts (#2108) --- .../steam/SteamParallelMultiblockMachine.java | 18 ++++++++++++------ .../gregtechceu/gtceu/config/ConfigHolder.java | 7 +++++++ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/SteamParallelMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/SteamParallelMultiblockMachine.java index 71a7a509ca..65ab2b3800 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/SteamParallelMultiblockMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/SteamParallelMultiblockMachine.java @@ -44,13 +44,18 @@ @MethodsReturnNonnullByDefault public class SteamParallelMultiblockMachine extends WorkableMultiblockMachine implements IDisplayUIMachine { - public static final int MAX_PARALLELS = 8; + public int maxParallels = ConfigHolder.INSTANCE.machines.steamMultiParallelAmount; // if in millibuckets, this is 0.5, Meaning 2mb of steam -> 1 EU private static final double CONVERSION_RATE = 0.5D; - public SteamParallelMultiblockMachine(IMachineBlockEntity holder, Object... args) { - super(holder, args); + public SteamParallelMultiblockMachine(IMachineBlockEntity holder) { + this(holder, ConfigHolder.INSTANCE.machines.steamMultiParallelAmount); + } + + public SteamParallelMultiblockMachine(IMachineBlockEntity holder, int parallelAmount) { + super(holder); + maxParallels = parallelAmount; } @Override @@ -78,13 +83,13 @@ public void onStructureFormed() { @Nullable public static GTRecipe recipeModifier(MetaMachine machine, @NotNull GTRecipe recipe, @NotNull OCParams params, @NotNull OCResult result) { - if (machine instanceof SteamParallelMultiblockMachine) { + if (machine instanceof SteamParallelMultiblockMachine steamMachine) { if (RecipeHelper.getRecipeEUtTier(recipe) > GTValues.LV) { return null; } int duration = recipe.duration; var eut = RecipeHelper.getInputEUt(recipe); - var parallelRecipe = GTRecipeModifiers.accurateParallel(machine, recipe, MAX_PARALLELS, false); + var parallelRecipe = GTRecipeModifiers.accurateParallel(machine, recipe, steamMachine.maxParallels, false); // we remove tick inputs, as our "cost" is just steam now, just stored as EU/t // also set the duration to just 1.5x the original, instead of fully multiplied @@ -114,7 +119,8 @@ public void addDisplayText(List textList) { } else if (isActive()) { textList.add(Component.translatable("gtceu.multiblock.running")); - textList.add(Component.translatable("gtceu.multiblock.parallel", MAX_PARALLELS)); + if (maxParallels > 1) + textList.add(Component.translatable("gtceu.multiblock.parallel", maxParallels)); int currentProgress = (int) (recipeLogic.getProgressPercent() * 100); double maxInSec = (float) recipeLogic.getDuration() / 20.0f; double currentInSec = (float) recipeLogic.getProgress() / 20.0f; diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index 8bceb81484..8d3e66b0cf 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -428,6 +428,13 @@ public static class MachineConfigs { }) public boolean enableMoreDualHatchAbility = false; + @Configurable + @Configurable.Comment({ + "Default maximum parallel of steam multiblocks", + "Default: 8" + }) + public int steamMultiParallelAmount = 8; + @Configurable @Configurable.Comment("Small Steam Boiler Options") public SmallBoilers smallBoilers = new SmallBoilers(); From 1bd52a9861e3571a8eb4dd6241b1cbecca852c15 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Thu, 10 Oct 2024 01:29:16 -0600 Subject: [PATCH 099/141] Fix Large Miner bus requirement (#2121) --- src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java index f930262e36..4a2790559a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java @@ -1919,7 +1919,7 @@ public static BiConsumer> createTankTooltips(String n .aisle("XSX", "#F#", "#F#", "#F#", "###", "###", "###") .where('S', controller(blocks(definition.getBlock()))) .where('X', blocks(LargeMinerMachine.getCasingState(tier)) - .or(abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(1).setPreviewCount(1)) + .or(abilities(PartAbility.EXPORT_ITEMS).setExactLimit(1).setPreviewCount(1)) .or(abilities(PartAbility.IMPORT_FLUIDS).setExactLimit(1).setPreviewCount(1)) .or(abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1) .setMaxGlobalLimited(2).setPreviewCount(1))) From 5a189538ebf1ef484e1dfa286a200994069aaadb Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Thu, 10 Oct 2024 01:30:00 -0600 Subject: [PATCH 100/141] Fix Assembly Line ordering for certain orientations (#2119) --- .../gtceu/api/pattern/util/RelativeDirection.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/util/RelativeDirection.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/util/RelativeDirection.java index e9e08e77e0..7f442b7cb8 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/util/RelativeDirection.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pattern/util/RelativeDirection.java @@ -72,7 +72,8 @@ yield switch (upwardsFacing) { case LEFT -> { Direction facing; if (frontAxis == Direction.Axis.Y) { - facing = upwardsFacing.getClockWise(); + facing = frontFacing.getStepY() > 0 ? upwardsFacing.getClockWise() : + upwardsFacing.getCounterClockWise(); } else { facing = switch (upwardsFacing) { case NORTH -> frontFacing.getCounterClockWise(); @@ -86,7 +87,8 @@ yield switch (upwardsFacing) { case RIGHT -> { Direction facing; if (frontAxis == Direction.Axis.Y) { - facing = upwardsFacing.getCounterClockWise(); + facing = frontFacing.getStepY() > 0 ? upwardsFacing.getCounterClockWise() : + upwardsFacing.getClockWise(); } else { facing = switch (upwardsFacing) { case NORTH -> frontFacing.getClockWise(); From 2fa7acd1fc230c9698b1bfa360db66d33c70cc48 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Thu, 10 Oct 2024 01:30:42 -0600 Subject: [PATCH 101/141] Fix Gem downcrafting recipes (#2102) --- .../gtceu/data/recipe/generated/MaterialRecipeHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/generated/MaterialRecipeHandler.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/generated/MaterialRecipeHandler.java index 4456f40fda..abbd056524 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/generated/MaterialRecipeHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/generated/MaterialRecipeHandler.java @@ -409,7 +409,7 @@ public static void processGemConversion(TagPrefix gemPrefix, Material material, String.format("gem_to_gem_%s_%s", FormattingUtil.toLowerCaseUnder(prevPrefix.name), material.getName()), prevStack, - "h", new UnificationEntry(gemPrefix, material)); + 'h', new UnificationEntry(gemPrefix, material)); CUTTER_RECIPES .recipeBuilder("cut_" + material.getName() + "_" + FormattingUtil.toLowerCaseUnder(gemPrefix.name) + From b2de459b98d464fe7eb6b929c3d842cd6c64b8d5 Mon Sep 17 00:00:00 2001 From: Electrolyte <21316184+Electrolyte220@users.noreply.github.com> Date: Thu, 10 Oct 2024 03:51:52 -0400 Subject: [PATCH 102/141] Refactor and add missing sign & trapdoor recipes (#2098) --- .../recipe/misc/VanillaStandardRecipes.java | 62 ---------- .../data/recipe/misc/WoodMachineRecipes.java | 112 +++++++++++++++--- 2 files changed, 96 insertions(+), 78 deletions(-) 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 ed30b06f44..e9df7538a8 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 @@ -1028,68 +1028,6 @@ private static void miscRecipes(Consumer provider) { ASSEMBLER_RECIPES.recipeBuilder("item_frame").duration(100).EUt(4).inputItems(new ItemStack(Items.LEATHER)) .inputItems(new ItemStack(Items.STICK, 8)).outputItems(new ItemStack(Items.ITEM_FRAME)).save(provider); - ASSEMBLER_RECIPES.recipeBuilder("oak_sign").duration(100).EUt(4).inputItems(Items.OAK_PLANKS, 6) - .inputItems(new ItemStack(Items.STICK)).circuitMeta(3).outputItems(Items.OAK_SIGN, 3).save(provider); - ASSEMBLER_RECIPES.recipeBuilder("spruce_sign").duration(100).EUt(4).inputItems(Items.SPRUCE_PLANKS, 6) - .inputItems(new ItemStack(Items.STICK)).circuitMeta(3).outputItems(Items.SPRUCE_SIGN, 3).save(provider); - ASSEMBLER_RECIPES.recipeBuilder("birch_sign").duration(100).EUt(4).inputItems(Items.BIRCH_PLANKS, 6) - .inputItems(new ItemStack(Items.STICK)).circuitMeta(3).outputItems(Items.BIRCH_SIGN, 3).save(provider); - ASSEMBLER_RECIPES.recipeBuilder("jungle_sign").duration(100).EUt(4).inputItems(Items.JUNGLE_PLANKS, 6) - .inputItems(new ItemStack(Items.STICK)).circuitMeta(3).outputItems(Items.JUNGLE_SIGN, 3).save(provider); - ASSEMBLER_RECIPES.recipeBuilder("acacia_sign").duration(100).EUt(4).inputItems(Items.ACACIA_PLANKS, 6) - .inputItems(new ItemStack(Items.STICK)).circuitMeta(3).outputItems(Items.ACACIA_SIGN, 3).save(provider); - ASSEMBLER_RECIPES.recipeBuilder("cherry_sign").duration(100).EUt(4).inputItems(Items.CHERRY_PLANKS, 6) - .inputItems(new ItemStack(Items.STICK)).circuitMeta(3).outputItems(Items.CHERRY_SIGN, 3).save(provider); - ASSEMBLER_RECIPES.recipeBuilder("dark_oak_sign").duration(100).EUt(4).inputItems(Items.DARK_OAK_PLANKS, 6) - .inputItems(new ItemStack(Items.STICK)).circuitMeta(3).outputItems(Items.DARK_OAK_SIGN, 3) - .save(provider); - ASSEMBLER_RECIPES.recipeBuilder("mangrove_sign").duration(100).EUt(4).inputItems(Items.MANGROVE_PLANKS, 6) - .inputItems(new ItemStack(Items.STICK)).circuitMeta(3).outputItems(Items.MANGROVE_SIGN, 3) - .save(provider); - ASSEMBLER_RECIPES.recipeBuilder("bamboo_sign").duration(100).EUt(4).inputItems(Items.BAMBOO_PLANKS, 6) - .inputItems(new ItemStack(Items.STICK)).circuitMeta(3).outputItems(Items.BAMBOO_SIGN, 3).save(provider); - ASSEMBLER_RECIPES.recipeBuilder("crimson_sign").duration(100).EUt(4).inputItems(Items.CRIMSON_PLANKS, 6) - .inputItems(new ItemStack(Items.STICK)).circuitMeta(3).outputItems(Items.CRIMSON_SIGN, 3) - .save(provider); - ASSEMBLER_RECIPES.recipeBuilder("warped_sign").duration(100).EUt(4).inputItems(Items.WARPED_PLANKS, 6) - .inputItems(new ItemStack(Items.STICK)).circuitMeta(3).outputItems(Items.WARPED_SIGN, 3).save(provider); - - ASSEMBLER_RECIPES.recipeBuilder("oak_hanging_sign").duration(100).EUt(4).inputItems(Items.STRIPPED_OAK_LOG, 6) - .inputItems(new ItemStack(Items.CHAIN, 2)).outputItems(Items.OAK_HANGING_SIGN, 6).save(provider); - ASSEMBLER_RECIPES.recipeBuilder("spruce_hanging_sign").duration(100).EUt(4) - .inputItems(Items.STRIPPED_SPRUCE_LOG, 6) - .inputItems(new ItemStack(Items.CHAIN, 2)).outputItems(Items.SPRUCE_HANGING_SIGN, 5).save(provider); - ASSEMBLER_RECIPES.recipeBuilder("birch_hanging_sign").duration(100).EUt(4) - .inputItems(Items.STRIPPED_BIRCH_LOG, 6) - .inputItems(new ItemStack(Items.CHAIN, 2)).outputItems(Items.BIRCH_HANGING_SIGN, 6).save(provider); - ASSEMBLER_RECIPES.recipeBuilder("jungle_hanging_sign").duration(100).EUt(4) - .inputItems(Items.STRIPPED_JUNGLE_LOG, 6) - .inputItems(new ItemStack(Items.CHAIN, 2)).outputItems(Items.JUNGLE_HANGING_SIGN, 6).save(provider); - ASSEMBLER_RECIPES.recipeBuilder("acacia_hanging_sign").duration(100).EUt(4) - .inputItems(Items.STRIPPED_ACACIA_LOG, 6) - .inputItems(new ItemStack(Items.CHAIN, 2)).outputItems(Items.ACACIA_HANGING_SIGN, 6).save(provider); - ASSEMBLER_RECIPES.recipeBuilder("cherry_hanging_sign").duration(100).EUt(4) - .inputItems(Items.STRIPPED_CHERRY_LOG, 6) - .inputItems(new ItemStack(Items.CHAIN, 2)).outputItems(Items.CHERRY_HANGING_SIGN, 6).save(provider); - ASSEMBLER_RECIPES.recipeBuilder("dark_oak_hanging_sign").duration(100).EUt(4) - .inputItems(Items.STRIPPED_DARK_OAK_LOG, 6) - .inputItems(new ItemStack(Items.CHAIN, 2)).outputItems(Items.DARK_OAK_HANGING_SIGN, 6) - .save(provider); - ASSEMBLER_RECIPES.recipeBuilder("mangrove_hanging_sign").duration(100).EUt(4) - .inputItems(Items.STRIPPED_MANGROVE_LOG, 6) - .inputItems(new ItemStack(Items.CHAIN, 2)).outputItems(Items.MANGROVE_HANGING_SIGN, 6) - .save(provider); - ASSEMBLER_RECIPES.recipeBuilder("bamboo_hanging_sign").duration(100).EUt(4) - .inputItems(Items.STRIPPED_BAMBOO_BLOCK, 6) - .inputItems(new ItemStack(Items.CHAIN, 2)).outputItems(Items.BAMBOO_HANGING_SIGN, 6).save(provider); - ASSEMBLER_RECIPES.recipeBuilder("crimson_hanging_sign").duration(100).EUt(4) - .inputItems(Items.STRIPPED_CRIMSON_HYPHAE, 6) - .inputItems(new ItemStack(Items.CHAIN, 2)).outputItems(Items.CRIMSON_HANGING_SIGN, 6) - .save(provider); - ASSEMBLER_RECIPES.recipeBuilder("warped_hanging_sign").duration(100).EUt(4) - .inputItems(Items.STRIPPED_WARPED_HYPHAE, 6) - .inputItems(new ItemStack(Items.CHAIN, 2)).outputItems(Items.WARPED_HANGING_SIGN, 6).save(provider); - ASSEMBLER_RECIPES.recipeBuilder("flower_pot").duration(10).EUt(2).inputItems(new ItemStack(Items.BRICK, 3)) .outputItems(new ItemStack(Items.FLOWER_POT)).save(provider); 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 fbb0d0db3c..8c5c442418 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 @@ -254,7 +254,7 @@ 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(), "rubber_trapdoor") + .trapdoor(GTBlocks.RUBBER_TRAPDOOR.asItem(), null) .slab(GTBlocks.RUBBER_SLAB.asItem(), null).addSlabRecipe() .fence(GTBlocks.RUBBER_FENCE.asItem(), null) .fenceGate(GTBlocks.RUBBER_FENCE_GATE.asItem(), null) @@ -524,23 +524,77 @@ public static void registerWoodTypeRecipe(Consumer provider, @No .outputItems(entry.sign, 5) .duration(200).EUt(4).save(provider); } else { - VanillaRecipeHelper.addShapedRecipe(provider, recipeName, new ItemStack(entry.sign, 3), + VanillaRecipeHelper.addShapedRecipe(provider, recipeName + "_saw", new ItemStack(entry.sign, 3), "PPP", "PPP", " s ", - 'P', entry.planks, - 's', entry.getStick()); + 'P', entry.planks); + + if (!hasSignRecipe) { + VanillaRecipeHelper.addShapedRecipe(provider, recipeName + "_stick", new ItemStack(entry.sign, 3), + "PPP", "PPP", " S ", + 'P', entry.planks, + 'S', entry.getStick()); + } + + ASSEMBLER_RECIPES.recipeBuilder(name + "_sign") + .inputItems(new ItemStack(entry.planks), 6) + .inputItems(entry.getStick()) + .outputItems(new ItemStack(entry.sign), 3) + .circuitMeta(3) + .duration(100).EUt(4).save(provider); } - if (entry.hangingSign != null) { + if (entry.hangingSign != null && entry.strippedLog != 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); + if (ConfigHolder.INSTANCE.recipes.hardWoodRecipes) { + VanillaRecipeHelper.addShapedRecipe(provider, recipeNameHanging, new ItemStack(entry.hangingSign), + "LLL", "C C", "RSR", + 'C', Items.CHAIN, + 'R', new UnificationEntry(ring, Iron), + 'S', new ItemStack(entry.sign), + 'L', new ItemStack(entry.slab)); + + ASSEMBLER_RECIPES.recipeBuilder(name + "_hanging_sign_iron") + .inputItems(entry.slab, 3) + .inputItems(entry.sign) + .inputItems(Items.CHAIN, 2) + .inputFluids(Iron.getFluid(GTValues.L / 9)) + .outputItems(entry.hangingSign) + .circuitMeta(5) + .duration(150).EUt(4).save(provider); + + VanillaRecipeHelper.addShapedRecipe(provider, recipeNameHanging + "_steel", + new ItemStack(entry.hangingSign, 2), + "LLL", "C C", "RSR", + 'C', Items.CHAIN, + 'R', new UnificationEntry(ring, Steel), + 'S', new ItemStack(entry.sign), + 'L', new ItemStack(entry.slab)); + + ASSEMBLER_RECIPES.recipeBuilder(name + "_hanging_sign_steel") + .inputItems(entry.slab, 3) + .inputItems(entry.sign) + .inputItems(Items.CHAIN, 2) + .inputFluids(Steel.getFluid(GTValues.L / 9)) + .outputItems(entry.hangingSign, 2) + .circuitMeta(5) + .duration(150).EUt(4).save(provider); + } else { + if (!hasHangingSignRecipe) { + VanillaRecipeHelper.addShapedRecipe(provider, recipeNameHanging, + new ItemStack(entry.hangingSign, 6), + "C C", "LLL", "LLL", + 'C', Items.CHAIN, + 'L', entry.strippedLog); + } + + ASSEMBLER_RECIPES.recipeBuilder(name + "_hanging_sign") + .inputItems(entry.strippedLog, 6) + .inputItems(new ItemStack(Items.CHAIN, 2)) + .outputItems(entry.hangingSign, 6) + .circuitMeta(5) + .duration(100).EUt(4).save(provider); + } } } @@ -577,9 +631,17 @@ public static void registerWoodTypeRecipe(Consumer provider, @No .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); + if (!hasTrapdoorRecipe) { + VanillaRecipeHelper.addShapedRecipe(provider, recipeName, new ItemStack(entry.trapdoor, 2), + "PPP", "PPP", + 'P', entry.planks); + } + + ASSEMBLER_RECIPES.recipeBuilder(name + "_trapdoor") + .circuitMeta(3) + .inputItems(new ItemStack(entry.planks), 6) + .outputItems(new ItemStack(entry.trapdoor), 2) + .duration(100).EUt(4).save(provider); } } @@ -846,6 +908,24 @@ private static void hardWoodTypeRecipes(Consumer registry, @No registry.accept(new ResourceLocation(entry.modid, entry.fenceGateRecipeName)); } } + if (entry.trapdoor != null) { + // hard plank -> trapdoor crafting + if (entry.trapdoorRecipeName != null) { + registry.accept(new ResourceLocation(entry.modid, entry.trapdoorRecipeName)); + } + } + if (entry.sign != null) { + // hard plank -> sign crafting + if (entry.signRecipeName != null) { + registry.accept(new ResourceLocation(entry.modid, entry.signRecipeName)); + } + } + if (entry.hangingSign != null) { + // hard plank -> hanging sign crafting + if (entry.hangingSignRecipeName != null) { + registry.accept(new ResourceLocation(entry.modid, entry.hangingSignRecipeName)); + } + } } } From 6617809fb3367f7fc47c8d9e681d5942f80e5b43 Mon Sep 17 00:00:00 2001 From: Karthi Suresh <75553966+JuiceyBeans@users.noreply.github.com> Date: Thu, 10 Oct 2024 09:42:23 +0100 Subject: [PATCH 103/141] Add tags for GT components (#2111) --- .../gtceu/tags/items/conveyor_modules.json | 32 +++ .../gtceu/tags/items/electric_motors.json | 32 +++ .../gtceu/tags/items/electric_pistons.json | 32 +++ .../data/gtceu/tags/items/electric_pumps.json | 32 +++ .../data/gtceu/tags/items/emitters.json | 32 +++ .../gtceu/tags/items/field_generators.json | 32 +++ .../gtceu/tags/items/fluid_regulators.json | 32 +++ .../data/gtceu/tags/items/robot_arms.json | 32 +++ .../data/gtceu/tags/items/sensors.json | 32 +++ .../gtceu/common/data/GTItems.java | 247 +++++++++++++----- .../gtceu/data/recipe/CustomTags.java | 10 + .../gtceu/data/tags/ItemTagLoader.java | 64 +++++ 12 files changed, 549 insertions(+), 60 deletions(-) create mode 100644 src/generated/resources/data/gtceu/tags/items/conveyor_modules.json create mode 100644 src/generated/resources/data/gtceu/tags/items/electric_motors.json create mode 100644 src/generated/resources/data/gtceu/tags/items/electric_pistons.json create mode 100644 src/generated/resources/data/gtceu/tags/items/electric_pumps.json create mode 100644 src/generated/resources/data/gtceu/tags/items/emitters.json create mode 100644 src/generated/resources/data/gtceu/tags/items/field_generators.json create mode 100644 src/generated/resources/data/gtceu/tags/items/fluid_regulators.json create mode 100644 src/generated/resources/data/gtceu/tags/items/robot_arms.json create mode 100644 src/generated/resources/data/gtceu/tags/items/sensors.json diff --git a/src/generated/resources/data/gtceu/tags/items/conveyor_modules.json b/src/generated/resources/data/gtceu/tags/items/conveyor_modules.json new file mode 100644 index 0000000000..da3763750c --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/items/conveyor_modules.json @@ -0,0 +1,32 @@ +{ + "values": [ + "gtceu:lv_conveyor_module", + "gtceu:mv_conveyor_module", + "gtceu:hv_conveyor_module", + "gtceu:ev_conveyor_module", + "gtceu:iv_conveyor_module", + "gtceu:luv_conveyor_module", + "gtceu:zpm_conveyor_module", + "gtceu:uv_conveyor_module", + { + "id": "gtceu:uhv_conveyor_module", + "required": false + }, + { + "id": "gtceu:uev_conveyor_module", + "required": false + }, + { + "id": "gtceu:uiv_conveyor_module", + "required": false + }, + { + "id": "gtceu:uxv_conveyor_module", + "required": false + }, + { + "id": "gtceu:opv_conveyor_module", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/items/electric_motors.json b/src/generated/resources/data/gtceu/tags/items/electric_motors.json new file mode 100644 index 0000000000..05904c9c33 --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/items/electric_motors.json @@ -0,0 +1,32 @@ +{ + "values": [ + "gtceu:lv_electric_motor", + "gtceu:mv_electric_motor", + "gtceu:hv_electric_motor", + "gtceu:ev_electric_motor", + "gtceu:iv_electric_motor", + "gtceu:luv_electric_motor", + "gtceu:zpm_electric_motor", + "gtceu:uv_electric_motor", + { + "id": "gtceu:uhv_electric_motor", + "required": false + }, + { + "id": "gtceu:uev_electric_motor", + "required": false + }, + { + "id": "gtceu:uiv_electric_motor", + "required": false + }, + { + "id": "gtceu:uxv_electric_motor", + "required": false + }, + { + "id": "gtceu:opv_electric_motor", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/items/electric_pistons.json b/src/generated/resources/data/gtceu/tags/items/electric_pistons.json new file mode 100644 index 0000000000..8eb2dc2b2c --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/items/electric_pistons.json @@ -0,0 +1,32 @@ +{ + "values": [ + "gtceu:lv_electric_piston", + "gtceu:mv_electric_piston", + "gtceu:hv_electric_piston", + "gtceu:ev_electric_piston", + "gtceu:iv_electric_piston", + "gtceu:luv_electric_piston", + "gtceu:zpm_electric_piston", + "gtceu:uv_electric_piston", + { + "id": "gtceu:uhv_electric_piston", + "required": false + }, + { + "id": "gtceu:uev_electric_piston", + "required": false + }, + { + "id": "gtceu:uiv_electric_piston", + "required": false + }, + { + "id": "gtceu:uxv_electric_piston", + "required": false + }, + { + "id": "gtceu:opv_electric_piston", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/items/electric_pumps.json b/src/generated/resources/data/gtceu/tags/items/electric_pumps.json new file mode 100644 index 0000000000..2fb3023fbd --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/items/electric_pumps.json @@ -0,0 +1,32 @@ +{ + "values": [ + "gtceu:lv_electric_pump", + "gtceu:mv_electric_pump", + "gtceu:hv_electric_pump", + "gtceu:ev_electric_pump", + "gtceu:iv_electric_pump", + "gtceu:luv_electric_pump", + "gtceu:zpm_electric_pump", + "gtceu:uv_electric_pump", + { + "id": "gtceu:uhv_electric_pump", + "required": false + }, + { + "id": "gtceu:uev_electric_pump", + "required": false + }, + { + "id": "gtceu:uiv_electric_pump", + "required": false + }, + { + "id": "gtceu:uxv_electric_pump", + "required": false + }, + { + "id": "gtceu:opv_electric_pump", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/items/emitters.json b/src/generated/resources/data/gtceu/tags/items/emitters.json new file mode 100644 index 0000000000..c2a1c2d311 --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/items/emitters.json @@ -0,0 +1,32 @@ +{ + "values": [ + "gtceu:lv_emitter", + "gtceu:mv_emitter", + "gtceu:hv_emitter", + "gtceu:ev_emitter", + "gtceu:iv_emitter", + "gtceu:luv_emitter", + "gtceu:zpm_emitter", + "gtceu:uv_emitter", + { + "id": "gtceu:uhv_emitter", + "required": false + }, + { + "id": "gtceu:uev_emitter", + "required": false + }, + { + "id": "gtceu:uiv_emitter", + "required": false + }, + { + "id": "gtceu:uxv_emitter", + "required": false + }, + { + "id": "gtceu:opv_emitter", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/items/field_generators.json b/src/generated/resources/data/gtceu/tags/items/field_generators.json new file mode 100644 index 0000000000..1115eb797c --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/items/field_generators.json @@ -0,0 +1,32 @@ +{ + "values": [ + "gtceu:lv_field_generator", + "gtceu:mv_field_generator", + "gtceu:hv_field_generator", + "gtceu:ev_field_generator", + "gtceu:iv_field_generator", + "gtceu:luv_field_generator", + "gtceu:zpm_field_generator", + "gtceu:uv_field_generator", + { + "id": "gtceu:uhv_field_generator", + "required": false + }, + { + "id": "gtceu:uev_field_generator", + "required": false + }, + { + "id": "gtceu:uiv_field_generator", + "required": false + }, + { + "id": "gtceu:uxv_field_generator", + "required": false + }, + { + "id": "gtceu:opv_field_generator", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/items/fluid_regulators.json b/src/generated/resources/data/gtceu/tags/items/fluid_regulators.json new file mode 100644 index 0000000000..cb9819e08a --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/items/fluid_regulators.json @@ -0,0 +1,32 @@ +{ + "values": [ + "gtceu:lv_fluid_regulator", + "gtceu:mv_fluid_regulator", + "gtceu:hv_fluid_regulator", + "gtceu:ev_fluid_regulator", + "gtceu:iv_fluid_regulator", + "gtceu:luv_fluid_regulator", + "gtceu:zpm_fluid_regulator", + "gtceu:uv_fluid_regulator", + { + "id": "gtceu:uhv_fluid_regulator", + "required": false + }, + { + "id": "gtceu:uev_fluid_regulator", + "required": false + }, + { + "id": "gtceu:uiv_fluid_regulator", + "required": false + }, + { + "id": "gtceu:uxv_fluid_regulator", + "required": false + }, + { + "id": "gtceu:opv_fluid_regulator", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/items/robot_arms.json b/src/generated/resources/data/gtceu/tags/items/robot_arms.json new file mode 100644 index 0000000000..ae31ab35e3 --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/items/robot_arms.json @@ -0,0 +1,32 @@ +{ + "values": [ + "gtceu:lv_robot_arm", + "gtceu:mv_robot_arm", + "gtceu:hv_robot_arm", + "gtceu:ev_robot_arm", + "gtceu:iv_robot_arm", + "gtceu:luv_robot_arm", + "gtceu:zpm_robot_arm", + "gtceu:uv_robot_arm", + { + "id": "gtceu:uhv_robot_arm", + "required": false + }, + { + "id": "gtceu:uev_robot_arm", + "required": false + }, + { + "id": "gtceu:uiv_robot_arm", + "required": false + }, + { + "id": "gtceu:uxv_robot_arm", + "required": false + }, + { + "id": "gtceu:opv_robot_arm", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/items/sensors.json b/src/generated/resources/data/gtceu/tags/items/sensors.json new file mode 100644 index 0000000000..d1b9265f98 --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/items/sensors.json @@ -0,0 +1,32 @@ +{ + "values": [ + "gtceu:lv_sensor", + "gtceu:mv_sensor", + "gtceu:hv_sensor", + "gtceu:ev_sensor", + "gtceu:iv_sensor", + "gtceu:luv_sensor", + "gtceu:zpm_sensor", + "gtceu:uv_sensor", + { + "id": "gtceu:uhv_sensor", + "required": false + }, + { + "id": "gtceu:uev_sensor", + "required": false + }, + { + "id": "gtceu:uiv_sensor", + "required": false + }, + { + "id": "gtceu:uxv_sensor", + "required": false + }, + { + "id": "gtceu:opv_sensor", + "required": false + } + ] +} \ No newline at end of file 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 167fa50dd5..b0fb04aa66 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java @@ -901,47 +901,60 @@ public Component getItemName(ItemStack stack) { public static ItemEntry ELECTRIC_MOTOR_LV = REGISTRATE.item("lv_electric_motor", Item::new) .lang("LV Electric Motor").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "electric_motor")) + .tag(CustomTags.ELECTRIC_MOTORS) .register(); public static ItemEntry ELECTRIC_MOTOR_MV = REGISTRATE.item("mv_electric_motor", Item::new) .lang("MV Electric Motor").onRegister(compassNodeExist(GTCompassSections.MISC, "electric_motor")) + .tag(CustomTags.ELECTRIC_MOTORS) .register(); public static ItemEntry ELECTRIC_MOTOR_HV = REGISTRATE.item("hv_electric_motor", Item::new) .lang("HV Electric Motor").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "electric_motor")) + .tag(CustomTags.ELECTRIC_MOTORS) .register(); public static ItemEntry ELECTRIC_MOTOR_EV = REGISTRATE.item("ev_electric_motor", Item::new) .lang("EV Electric Motor").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "electric_motor")) + .tag(CustomTags.ELECTRIC_MOTORS) .register(); public static ItemEntry ELECTRIC_MOTOR_IV = REGISTRATE.item("iv_electric_motor", Item::new) .lang("IV Electric Motor").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "electric_motor")) + .tag(CustomTags.ELECTRIC_MOTORS) .register(); public static ItemEntry ELECTRIC_MOTOR_LuV = REGISTRATE.item("luv_electric_motor", Item::new) .lang("LuV Electric Motor").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "electric_motor")) + .tag(CustomTags.ELECTRIC_MOTORS) .register(); public static ItemEntry ELECTRIC_MOTOR_ZPM = REGISTRATE.item("zpm_electric_motor", Item::new) .lang("ZPM Electric Motor").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "electric_motor")) + .tag(CustomTags.ELECTRIC_MOTORS) .register(); public static ItemEntry ELECTRIC_MOTOR_UV = REGISTRATE.item("uv_electric_motor", Item::new) .lang("UV Electric Motor").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "electric_motor")) + .tag(CustomTags.ELECTRIC_MOTORS) .register(); public static ItemEntry ELECTRIC_MOTOR_UHV = GTCEuAPI.isHighTier() ? REGISTRATE.item("uhv_electric_motor", Item::new).lang("UHV Electric Motor") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "electric_motor")).register() : + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "electric_motor")) + .register() : null; public static ItemEntry ELECTRIC_MOTOR_UEV = GTCEuAPI.isHighTier() ? REGISTRATE.item("uev_electric_motor", Item::new).lang("UEV Electric Motor") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "electric_motor")).register() : + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "electric_motor")) + .register() : null; public static ItemEntry ELECTRIC_MOTOR_UIV = GTCEuAPI.isHighTier() ? REGISTRATE.item("uiv_electric_motor", Item::new).lang("UIV Electric Motor") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "electric_motor")).register() : + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "electric_motor")) + .register() : null; public static ItemEntry ELECTRIC_MOTOR_UXV = GTCEuAPI.isHighTier() ? REGISTRATE.item("uxv_electric_motor", Item::new).lang("UXV Electric Motor") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "electric_motor")).register() : + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "electric_motor")) + .register() : null; public static ItemEntry ELECTRIC_MOTOR_OpV = GTCEuAPI.isHighTier() ? REGISTRATE.item("opv_electric_motor", Item::new).lang("OpV Electric Motor") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "electric_motor")).register() : + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "electric_motor")) + .register() : null; public static ItemEntry ELECTRIC_PUMP_LV = REGISTRATE.item("lv_electric_pump", ComponentItem::create) @@ -953,6 +966,7 @@ public Component getItemName(ItemStack stack) { FormattingUtil.formatNumbers(1280 / 20))); }))) .onRegister(compassNodeExist(GTCompassSections.COVERS, "pump", GTCompassNodes.COVER)) + .tag(CustomTags.ELECTRIC_PUMPS) .register(); public static ItemEntry ELECTRIC_PUMP_MV = REGISTRATE.item("mv_electric_pump", ComponentItem::create) @@ -964,7 +978,8 @@ public Component getItemName(ItemStack stack) { FormattingUtil.formatNumbers(1280 * 4 / 20))); }))) .onRegister(compassNodeExist(GTCompassSections.COVERS, "pump", GTCompassNodes.COVER)) - .register(); + .tag(CustomTags.ELECTRIC_PUMPS) + .register();; public static ItemEntry ELECTRIC_PUMP_HV = REGISTRATE.item("hv_electric_pump", ComponentItem::create) .lang("HV Electric Pump") .onRegister(attach(new CoverPlaceBehavior(GTCovers.PUMPS[2]))) @@ -974,7 +989,8 @@ public Component getItemName(ItemStack stack) { FormattingUtil.formatNumbers(1280 * 16 / 20))); }))) .onRegister(compassNodeExist(GTCompassSections.COVERS, "pump", GTCompassNodes.COVER)) - .register(); + .tag(CustomTags.ELECTRIC_PUMPS) + .register();; public static ItemEntry ELECTRIC_PUMP_EV = REGISTRATE.item("ev_electric_pump", ComponentItem::create) .lang("EV Electric Pump") .onRegister(attach(new CoverPlaceBehavior(GTCovers.PUMPS[3]))) @@ -984,7 +1000,8 @@ public Component getItemName(ItemStack stack) { FormattingUtil.formatNumbers(1280 * 64 / 20))); }))) .onRegister(compassNodeExist(GTCompassSections.COVERS, "pump", GTCompassNodes.COVER)) - .register(); + .tag(CustomTags.ELECTRIC_PUMPS) + .register();; public static ItemEntry ELECTRIC_PUMP_IV = REGISTRATE.item("iv_electric_pump", ComponentItem::create) .lang("IV Electric Pump") .onRegister(attach(new CoverPlaceBehavior(GTCovers.PUMPS[4]))) @@ -994,7 +1011,8 @@ public Component getItemName(ItemStack stack) { FormattingUtil.formatNumbers(1280 * 64 * 4 / 20))); }))) .onRegister(compassNodeExist(GTCompassSections.COVERS, "pump", GTCompassNodes.COVER)) - .register(); + .tag(CustomTags.ELECTRIC_PUMPS) + .register();; public static ItemEntry ELECTRIC_PUMP_LuV = REGISTRATE .item("luv_electric_pump", ComponentItem::create) .lang("LuV Electric Pump") @@ -1005,7 +1023,8 @@ public Component getItemName(ItemStack stack) { FormattingUtil.formatNumbers(1280 * 64 * 16 / 20))); }))) .onRegister(compassNodeExist(GTCompassSections.COVERS, "pump", GTCompassNodes.COVER)) - .register(); + .tag(CustomTags.ELECTRIC_PUMPS) + .register();; public static ItemEntry ELECTRIC_PUMP_ZPM = REGISTRATE .item("zpm_electric_pump", ComponentItem::create) .lang("ZPM Electric Pump") @@ -1016,7 +1035,8 @@ public Component getItemName(ItemStack stack) { FormattingUtil.formatNumbers(1280 * 64 * 64 / 20))); }))) .onRegister(compassNodeExist(GTCompassSections.COVERS, "pump", GTCompassNodes.COVER)) - .register(); + .tag(CustomTags.ELECTRIC_PUMPS) + .register();; public static ItemEntry ELECTRIC_PUMP_UV = REGISTRATE.item("uv_electric_pump", ComponentItem::create) .lang("UV Electric Pump") .onRegister(attach(new CoverPlaceBehavior(GTCovers.PUMPS[7]))) @@ -1027,7 +1047,8 @@ public Component getItemName(ItemStack stack) { FormattingUtil.formatNumbers(1280 * 64 * 64 * 4 / 20))); }))) .onRegister(compassNodeExist(GTCompassSections.COVERS, "pump", GTCompassNodes.COVER)) - .register(); + .tag(CustomTags.ELECTRIC_PUMPS) + .register();; public static ItemEntry ELECTRIC_PUMP_UHV = GTCEuAPI.isHighTier() ? REGISTRATE.item("uhv_electric_pump", ComponentItem::create) @@ -1103,6 +1124,7 @@ public Component getItemName(ItemStack stack) { lines.add(Component.translatable("gtceu.universal.tooltip.fluid_transfer_rate", 1280 / 20)); }))) .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "fluid_regulator")) + .tag(CustomTags.FLUID_REGULATORS) .register(); public static ItemEntry FLUID_REGULATOR_MV = REGISTRATE .item("mv_fluid_regulator", ComponentItem::create) @@ -1113,6 +1135,7 @@ public Component getItemName(ItemStack stack) { lines.add(Component.translatable("gtceu.universal.tooltip.fluid_transfer_rate", 1280 * 4 / 20)); }))) .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "fluid_regulator")) + .tag(CustomTags.FLUID_REGULATORS) .register(); public static ItemEntry FLUID_REGULATOR_HV = REGISTRATE .item("hv_fluid_regulator", ComponentItem::create) @@ -1123,6 +1146,7 @@ public Component getItemName(ItemStack stack) { lines.add(Component.translatable("gtceu.universal.tooltip.fluid_transfer_rate", 1280 * 16 / 20)); }))) .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "fluid_regulator")) + .tag(CustomTags.FLUID_REGULATORS) .register(); public static ItemEntry FLUID_REGULATOR_EV = REGISTRATE .item("ev_fluid_regulator", ComponentItem::create) @@ -1133,6 +1157,7 @@ public Component getItemName(ItemStack stack) { lines.add(Component.translatable("gtceu.universal.tooltip.fluid_transfer_rate", 1280 * 64 / 20)); }))) .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "fluid_regulator")) + .tag(CustomTags.FLUID_REGULATORS) .register(); public static ItemEntry FLUID_REGULATOR_IV = REGISTRATE .item("iv_fluid_regulator", ComponentItem::create) @@ -1143,6 +1168,7 @@ public Component getItemName(ItemStack stack) { lines.add(Component.translatable("gtceu.universal.tooltip.fluid_transfer_rate", 1280 * 64 * 4 / 20)); }))) .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "fluid_regulator")) + .tag(CustomTags.FLUID_REGULATORS) .register(); public static ItemEntry FLUID_REGULATOR_LUV = REGISTRATE .item("luv_fluid_regulator", ComponentItem::create) @@ -1153,6 +1179,7 @@ public Component getItemName(ItemStack stack) { lines.add(Component.translatable("gtceu.universal.tooltip.fluid_transfer_rate", 1280 * 64 * 16 / 20)); }))) .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "fluid_regulator")) + .tag(CustomTags.FLUID_REGULATORS) .register(); public static ItemEntry FLUID_REGULATOR_ZPM = REGISTRATE .item("zpm_fluid_regulator", ComponentItem::create) @@ -1163,6 +1190,7 @@ public Component getItemName(ItemStack stack) { lines.add(Component.translatable("gtceu.universal.tooltip.fluid_transfer_rate", 1280 * 64 * 64 / 20)); }))) .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "fluid_regulator")) + .tag(CustomTags.FLUID_REGULATORS) .register(); public static ItemEntry FLUID_REGULATOR_UV = REGISTRATE .item("uv_fluid_regulator", ComponentItem::create) @@ -1174,6 +1202,7 @@ public Component getItemName(ItemStack stack) { Component.translatable("gtceu.universal.tooltip.fluid_transfer_rate", 1280 * 64 * 64 * 4 / 20)); }))) .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "fluid_regulator")) + .tag(CustomTags.FLUID_REGULATORS) .register(); public static ItemEntry FLUID_REGULATOR_UHV = GTCEuAPI.isHighTier() ? REGISTRATE.item("uhv_fluid_regulator", ComponentItem::create) @@ -1246,6 +1275,7 @@ public Component getItemName(ItemStack stack) { lines.add(Component.translatable("gtceu.universal.tooltip.item_transfer_rate", 8)); }))) .onRegister(compassNodeExist(GTCompassSections.COVERS, "conveyor", GTCompassNodes.COVER)) + .tag(CustomTags.CONVEYOR_MODULES) .register(); public static ItemEntry CONVEYOR_MODULE_MV = REGISTRATE .item("mv_conveyor_module", ComponentItem::create) @@ -1256,6 +1286,7 @@ public Component getItemName(ItemStack stack) { lines.add(Component.translatable("gtceu.universal.tooltip.item_transfer_rate", 32)); }))) .onRegister(compassNodeExist(GTCompassSections.COVERS, "conveyor", GTCompassNodes.COVER)) + .tag(CustomTags.CONVEYOR_MODULES) .register(); public static ItemEntry CONVEYOR_MODULE_HV = REGISTRATE .item("hv_conveyor_module", ComponentItem::create) @@ -1266,6 +1297,7 @@ public Component getItemName(ItemStack stack) { lines.add(Component.translatable("gtceu.universal.tooltip.item_transfer_rate", 64)); }))) .onRegister(compassNodeExist(GTCompassSections.COVERS, "conveyor", GTCompassNodes.COVER)) + .tag(CustomTags.CONVEYOR_MODULES) .register(); public static ItemEntry CONVEYOR_MODULE_EV = REGISTRATE .item("ev_conveyor_module", ComponentItem::create) @@ -1276,6 +1308,7 @@ public Component getItemName(ItemStack stack) { lines.add(Component.translatable("gtceu.universal.tooltip.item_transfer_rate_stacks", 3)); }))) .onRegister(compassNodeExist(GTCompassSections.COVERS, "conveyor", GTCompassNodes.COVER)) + .tag(CustomTags.CONVEYOR_MODULES) .register(); public static ItemEntry CONVEYOR_MODULE_IV = REGISTRATE .item("iv_conveyor_module", ComponentItem::create) @@ -1286,6 +1319,7 @@ public Component getItemName(ItemStack stack) { lines.add(Component.translatable("gtceu.universal.tooltip.item_transfer_rate_stacks", 8)); }))) .onRegister(compassNodeExist(GTCompassSections.COVERS, "conveyor", GTCompassNodes.COVER)) + .tag(CustomTags.CONVEYOR_MODULES) .register(); public static ItemEntry CONVEYOR_MODULE_LuV = REGISTRATE .item("luv_conveyor_module", ComponentItem::create) @@ -1296,6 +1330,7 @@ public Component getItemName(ItemStack stack) { lines.add(Component.translatable("gtceu.universal.tooltip.item_transfer_rate_stacks", 16)); }))) .onRegister(compassNodeExist(GTCompassSections.COVERS, "conveyor", GTCompassNodes.COVER)) + .tag(CustomTags.CONVEYOR_MODULES) .register(); public static ItemEntry CONVEYOR_MODULE_ZPM = REGISTRATE .item("zpm_conveyor_module", ComponentItem::create) @@ -1306,6 +1341,7 @@ public Component getItemName(ItemStack stack) { lines.add(Component.translatable("gtceu.universal.tooltip.item_transfer_rate_stacks", 16)); }))) .onRegister(compassNodeExist(GTCompassSections.COVERS, "conveyor", GTCompassNodes.COVER)) + .tag(CustomTags.CONVEYOR_MODULES) .register(); public static ItemEntry CONVEYOR_MODULE_UV = REGISTRATE .item("uv_conveyor_module", ComponentItem::create) @@ -1316,6 +1352,7 @@ public Component getItemName(ItemStack stack) { lines.add(Component.translatable("gtceu.universal.tooltip.item_transfer_rate_stacks", 16)); }))) .onRegister(compassNodeExist(GTCompassSections.COVERS, "conveyor", GTCompassNodes.COVER)) + .tag(CustomTags.CONVEYOR_MODULES) .register(); public static ItemEntry CONVEYOR_MODULE_UHV = GTCEuAPI.isHighTier() ? REGISTRATE.item("uhv_conveyor_module", ComponentItem::create) @@ -1374,42 +1411,69 @@ public Component getItemName(ItemStack stack) { null; public static ItemEntry ELECTRIC_PISTON_LV = REGISTRATE.item("lv_electric_piston", Item::new) - .lang("LV Electric Piston").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "piston")).register(); + .lang("LV Electric Piston") + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "piston")) + .tag(CustomTags.ELECTRIC_PISTONS) + .register(); public static ItemEntry ELECTRIC_PISTON_MV = REGISTRATE.item("mv_electric_piston", Item::new) - .lang("MV Electric Piston").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "piston")).register(); + .lang("MV Electric Piston") + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "piston")) + .tag(CustomTags.ELECTRIC_PISTONS) + .register(); public static ItemEntry ELECTRIC_PISTON_HV = REGISTRATE.item("hv_electric_piston", Item::new) - .lang("HV Electric Piston").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "piston")).register(); + .lang("HV Electric Piston") + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "piston")) + .tag(CustomTags.ELECTRIC_PISTONS) + .register(); public static ItemEntry ELECTRIC_PISTON_EV = REGISTRATE.item("ev_electric_piston", Item::new) - .lang("EV Electric Piston").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "piston")).register(); + .lang("EV Electric Piston") + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "piston")) + .tag(CustomTags.ELECTRIC_PISTONS) + .register(); public static ItemEntry ELECTRIC_PISTON_IV = REGISTRATE.item("iv_electric_piston", Item::new) - .lang("IV Electric Piston").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "piston")).register(); + .lang("IV Electric Piston") + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "piston")) + .tag(CustomTags.ELECTRIC_PISTONS) + .register(); public static ItemEntry ELECTRIC_PISTON_LUV = REGISTRATE.item("luv_electric_piston", Item::new) - .lang("LuV Electric Piston").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "piston")) + .lang("LuV Electric Piston") + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "piston")) + .tag(CustomTags.ELECTRIC_PISTONS) .register(); public static ItemEntry ELECTRIC_PISTON_ZPM = REGISTRATE.item("zpm_electric_piston", Item::new) - .lang("ZPM Electric Piston").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "piston")) + .lang("ZPM Electric Piston") + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "piston")) + .tag(CustomTags.ELECTRIC_PISTONS) .register(); public static ItemEntry ELECTRIC_PISTON_UV = REGISTRATE.item("uv_electric_piston", Item::new) - .lang("UV Electric Piston").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "piston")).register(); + .lang("UV Electric Piston") + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "piston")) + .tag(CustomTags.ELECTRIC_PISTONS) + .register(); public static ItemEntry ELECTRIC_PISTON_UHV = GTCEuAPI.isHighTier() ? REGISTRATE.item("uhv_electric_piston", Item::new).lang("UHV Electric Piston") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "piston")).register() : + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "piston")) + .register() : null; public static ItemEntry ELECTRIC_PISTON_UEV = GTCEuAPI.isHighTier() ? REGISTRATE.item("uev_electric_piston", Item::new).lang("UEV Electric Piston") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "piston")).register() : + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "piston")) + .register() : null; public static ItemEntry ELECTRIC_PISTON_UIV = GTCEuAPI.isHighTier() ? REGISTRATE.item("uiv_electric_piston", Item::new).lang("UIV Electric Piston") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "piston")).register() : + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "piston")) + .register() : null; public static ItemEntry ELECTRIC_PISTON_UXV = GTCEuAPI.isHighTier() ? REGISTRATE.item("uxv_electric_piston", Item::new).lang("UXV Electric Piston") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "piston")).register() : + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "piston")) + .register() : null; public static ItemEntry ELECTRIC_PISTON_OpV = GTCEuAPI.isHighTier() ? REGISTRATE.item("opv_electric_piston", Item::new).lang("OpV Electric Piston") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "piston")).register() : + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "piston")) + .register() : null; public static ItemEntry ROBOT_ARM_LV = REGISTRATE.item("lv_robot_arm", ComponentItem::create) @@ -1420,6 +1484,8 @@ public Component getItemName(ItemStack stack) { lines.add(Component.translatable("gtceu.universal.tooltip.item_transfer_rate", 8)); }))) .onRegister(compassNodeExist(GTCompassSections.COVERS, "robot_arm", GTCompassNodes.COVER)) + .tag(CustomTags.ROBOT_ARMS) + .tag(CustomTags.ROBOT_ARMS) .register(); public static ItemEntry ROBOT_ARM_MV = REGISTRATE.item("mv_robot_arm", ComponentItem::create) .lang("MV Robot Arm") @@ -1429,6 +1495,7 @@ public Component getItemName(ItemStack stack) { lines.add(Component.translatable("gtceu.universal.tooltip.item_transfer_rate", 32)); }))) .onRegister(compassNodeExist(GTCompassSections.COVERS, "robot_arm", GTCompassNodes.COVER)) + .tag(CustomTags.ROBOT_ARMS) .register(); public static ItemEntry ROBOT_ARM_HV = REGISTRATE.item("hv_robot_arm", ComponentItem::create) .lang("HV Robot Arm") @@ -1438,6 +1505,7 @@ public Component getItemName(ItemStack stack) { lines.add(Component.translatable("gtceu.universal.tooltip.item_transfer_rate", 64)); }))) .onRegister(compassNodeExist(GTCompassSections.COVERS, "robot_arm", GTCompassNodes.COVER)) + .tag(CustomTags.ROBOT_ARMS) .register(); public static ItemEntry ROBOT_ARM_EV = REGISTRATE.item("ev_robot_arm", ComponentItem::create) .lang("EV Robot Arm") @@ -1447,6 +1515,7 @@ public Component getItemName(ItemStack stack) { lines.add(Component.translatable("gtceu.universal.tooltip.item_transfer_rate_stacks", 3)); }))) .onRegister(compassNodeExist(GTCompassSections.COVERS, "robot_arm", GTCompassNodes.COVER)) + .tag(CustomTags.ROBOT_ARMS) .register(); public static ItemEntry ROBOT_ARM_IV = REGISTRATE.item("iv_robot_arm", ComponentItem::create) .lang("IV Robot Arm") @@ -1456,6 +1525,7 @@ public Component getItemName(ItemStack stack) { lines.add(Component.translatable("gtceu.universal.tooltip.item_transfer_rate_stacks", 8)); }))) .onRegister(compassNodeExist(GTCompassSections.COVERS, "robot_arm", GTCompassNodes.COVER)) + .tag(CustomTags.ROBOT_ARMS) .register(); public static ItemEntry ROBOT_ARM_LuV = REGISTRATE.item("luv_robot_arm", ComponentItem::create) .lang("LuV Robot Arm") @@ -1465,6 +1535,7 @@ public Component getItemName(ItemStack stack) { lines.add(Component.translatable("gtceu.universal.tooltip.item_transfer_rate_stacks", 16)); }))) .onRegister(compassNodeExist(GTCompassSections.COVERS, "robot_arm", GTCompassNodes.COVER)) + .tag(CustomTags.ROBOT_ARMS) .register(); public static ItemEntry ROBOT_ARM_ZPM = REGISTRATE.item("zpm_robot_arm", ComponentItem::create) .lang("ZPM Robot Arm") @@ -1474,6 +1545,7 @@ public Component getItemName(ItemStack stack) { lines.add(Component.translatable("gtceu.universal.tooltip.item_transfer_rate_stacks", 16)); }))) .onRegister(compassNodeExist(GTCompassSections.COVERS, "robot_arm", GTCompassNodes.COVER)) + .tag(CustomTags.ROBOT_ARMS) .register(); public static ItemEntry ROBOT_ARM_UV = REGISTRATE.item("uv_robot_arm", ComponentItem::create) .lang("UV Robot Arm") @@ -1483,6 +1555,7 @@ public Component getItemName(ItemStack stack) { lines.add(Component.translatable("gtceu.universal.tooltip.item_transfer_rate_stacks", 16)); }))) .onRegister(compassNodeExist(GTCompassSections.COVERS, "robot_arm", GTCompassNodes.COVER)) + .tag(CustomTags.ROBOT_ARMS) .register(); public static ItemEntry ROBOT_ARM_UHV = GTCEuAPI.isHighTier() ? REGISTRATE.item("uhv_robot_arm", ComponentItem::create) @@ -1542,35 +1615,45 @@ public Component getItemName(ItemStack stack) { public static ItemEntry FIELD_GENERATOR_LV = REGISTRATE.item("lv_field_generator", Item::new) .lang("LV Field Generator").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "field_generator")) + .tag(CustomTags.FIELD_GENERATORS) .register(); public static ItemEntry FIELD_GENERATOR_MV = REGISTRATE.item("mv_field_generator", Item::new) .lang("MV Field Generator").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "field_generator")) + .tag(CustomTags.FIELD_GENERATORS) .register(); public static ItemEntry FIELD_GENERATOR_HV = REGISTRATE.item("hv_field_generator", Item::new) .lang("HV Field Generator").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "field_generator")) + .tag(CustomTags.FIELD_GENERATORS) .register(); public static ItemEntry FIELD_GENERATOR_EV = REGISTRATE.item("ev_field_generator", Item::new) .lang("EV Field Generator").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "field_generator")) + .tag(CustomTags.FIELD_GENERATORS) .register(); public static ItemEntry FIELD_GENERATOR_IV = REGISTRATE.item("iv_field_generator", Item::new) .lang("IV Field Generator").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "field_generator")) + .tag(CustomTags.FIELD_GENERATORS) .register(); public static ItemEntry FIELD_GENERATOR_LuV = REGISTRATE.item("luv_field_generator", Item::new) .lang("LuV Field Generator").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "field_generator")) + .tag(CustomTags.FIELD_GENERATORS) .register(); public static ItemEntry FIELD_GENERATOR_ZPM = REGISTRATE.item("zpm_field_generator", Item::new) .lang("ZPM Field Generator").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "field_generator")) + .tag(CustomTags.FIELD_GENERATORS) .register(); public static ItemEntry FIELD_GENERATOR_UV = REGISTRATE.item("uv_field_generator", Item::new) .lang("UV Field Generator").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "field_generator")) + .tag(CustomTags.FIELD_GENERATORS) .register(); public static ItemEntry FIELD_GENERATOR_UHV = GTCEuAPI.isHighTier() ? REGISTRATE.item("uhv_field_generator", Item::new).lang("UHV Field Generator") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "field_generator")).register() : + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "field_generator")) + .register() : null; public static ItemEntry FIELD_GENERATOR_UEV = GTCEuAPI.isHighTier() ? REGISTRATE.item("uev_field_generator", Item::new).lang("UEV Field Generator") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "field_generator")).register() : + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "field_generator")) + .register() : null; public static ItemEntry FIELD_GENERATOR_UIV = GTCEuAPI.isHighTier() ? REGISTRATE.item("uiv_field_generator", Item::new).lang("UIV Field Generator") @@ -1578,71 +1661,115 @@ public Component getItemName(ItemStack stack) { null; public static ItemEntry FIELD_GENERATOR_UXV = GTCEuAPI.isHighTier() ? REGISTRATE.item("uxv_field_generator", Item::new).lang("UXV Field Generator") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "field_generator")).register() : + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "field_generator")) + .register() : null; public static ItemEntry FIELD_GENERATOR_OpV = GTCEuAPI.isHighTier() ? REGISTRATE.item("opv_field_generator", Item::new).lang("OpV Field Generator") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "field_generator")).register() : + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "field_generator")) + .register() : null; public static ItemEntry EMITTER_LV = REGISTRATE.item("lv_emitter", Item::new).lang("LV Emitter") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "emitter")).register(); + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "emitter")) + .tag(CustomTags.EMITTERS) + .register(); public static ItemEntry EMITTER_MV = REGISTRATE.item("mv_emitter", Item::new).lang("MV Emitter") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "emitter")).register(); + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "emitter")) + .tag(CustomTags.EMITTERS) + .register(); public static ItemEntry EMITTER_HV = REGISTRATE.item("hv_emitter", Item::new).lang("HV Emitter") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "emitter")).register(); + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "emitter")) + .tag(CustomTags.EMITTERS) + .register(); public static ItemEntry EMITTER_EV = REGISTRATE.item("ev_emitter", Item::new).lang("EV Emitter") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "emitter")).register(); + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "emitter")) + .tag(CustomTags.EMITTERS) + .register(); public static ItemEntry EMITTER_IV = REGISTRATE.item("iv_emitter", Item::new).lang("IV Emitter") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "emitter")).register(); + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "emitter")) + .tag(CustomTags.EMITTERS) + .register(); public static ItemEntry EMITTER_LuV = REGISTRATE.item("luv_emitter", Item::new).lang("LuV Emitter") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "emitter")).register(); + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "emitter")) + .tag(CustomTags.EMITTERS) + .register(); public static ItemEntry EMITTER_ZPM = REGISTRATE.item("zpm_emitter", Item::new).lang("ZPM Emitter") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "emitter")).register(); + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "emitter")) + .tag(CustomTags.EMITTERS) + .register(); public static ItemEntry EMITTER_UV = REGISTRATE.item("uv_emitter", Item::new).lang("UV Emitter") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "emitter")).register(); + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "emitter")) + .tag(CustomTags.EMITTERS) + .register(); public static ItemEntry EMITTER_UHV = GTCEuAPI.isHighTier() ? REGISTRATE.item("uhv_emitter", Item::new) - .lang("UHV Emitter").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "emitter")).register() : - null; + .lang("UHV Emitter").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "emitter")) + .register() : null; public static ItemEntry EMITTER_UEV = GTCEuAPI.isHighTier() ? REGISTRATE.item("uev_emitter", Item::new) - .lang("UEV Emitter").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "emitter")).register() : - null; + .lang("UEV Emitter").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "emitter")) + .register() : null; public static ItemEntry EMITTER_UIV = GTCEuAPI.isHighTier() ? REGISTRATE.item("uiv_emitter", Item::new) - .lang("UIV Emitter").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "emitter")).register() : - null; + .lang("UIV Emitter").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "emitter")) + .register() : null; public static ItemEntry EMITTER_UXV = GTCEuAPI.isHighTier() ? REGISTRATE.item("uxv_emitter", Item::new) - .lang("UXV Emitter").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "emitter")).register() : - null; + .lang("UXV Emitter").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "emitter")) + .register() : null; public static ItemEntry EMITTER_OpV = GTCEuAPI.isHighTier() ? REGISTRATE.item("opv_emitter", Item::new) - .lang("OpV Emitter").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "emitter")).register() : - null; + .lang("OpV Emitter").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "emitter")) + .register() : null; public static ItemEntry SENSOR_LV = REGISTRATE.item("lv_sensor", Item::new).lang("LV Sensor") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "sensor")).register(); + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "sensor")) + .tag(CustomTags.SENSORS) + .register(); public static ItemEntry SENSOR_MV = REGISTRATE.item("mv_sensor", Item::new).lang("MV Sensor") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "sensor")).register(); + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "sensor")) + .tag(CustomTags.SENSORS) + .register(); public static ItemEntry SENSOR_HV = REGISTRATE.item("hv_sensor", Item::new).lang("HV Sensor") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "sensor")).register(); + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "sensor")) + .tag(CustomTags.SENSORS) + .register(); public static ItemEntry SENSOR_EV = REGISTRATE.item("ev_sensor", Item::new).lang("EV Sensor") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "sensor")).register(); + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "sensor")) + .tag(CustomTags.SENSORS) + .register(); public static ItemEntry SENSOR_IV = REGISTRATE.item("iv_sensor", Item::new).lang("IV Sensor") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "sensor")).register(); + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "sensor")) + .tag(CustomTags.SENSORS) + .register(); public static ItemEntry SENSOR_LuV = REGISTRATE.item("luv_sensor", Item::new).lang("LuV Sensor") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "sensor")).register(); + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "sensor")) + .tag(CustomTags.SENSORS) + .register(); public static ItemEntry SENSOR_ZPM = REGISTRATE.item("zpm_sensor", Item::new).lang("ZPM Sensor") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "sensor")).register(); + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "sensor")) + .tag(CustomTags.SENSORS) + .register(); public static ItemEntry SENSOR_UV = REGISTRATE.item("uv_sensor", Item::new).lang("UV Sensor") - .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "sensor")).register(); + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "sensor")) + .tag(CustomTags.SENSORS) + .register(); public static ItemEntry SENSOR_UHV = GTCEuAPI.isHighTier() ? REGISTRATE.item("uhv_sensor", Item::new) - .lang("UHV Sensor").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "sensor")).register() : null; + .lang("UHV Sensor") + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "sensor")) + .register() : null; public static ItemEntry SENSOR_UEV = GTCEuAPI.isHighTier() ? REGISTRATE.item("uev_sensor", Item::new) - .lang("UEV Sensor").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "sensor")).register() : null; + .lang("UEV Sensor") + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "sensor")) + .register() : null; public static ItemEntry SENSOR_UIV = GTCEuAPI.isHighTier() ? REGISTRATE.item("uiv_sensor", Item::new) - .lang("UIV Sensor").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "sensor")).register() : null; + .lang("UIV Sensor") + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "sensor")) + .register() : null; public static ItemEntry SENSOR_UXV = GTCEuAPI.isHighTier() ? REGISTRATE.item("uxv_sensor", Item::new) - .lang("UXV Sensor").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "sensor")).register() : null; + .lang("UXV Sensor") + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "sensor")) + .register() : null; public static ItemEntry SENSOR_OpV = GTCEuAPI.isHighTier() ? REGISTRATE.item("opv_sensor", Item::new) - .lang("OpV Sensor").onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "sensor")).register() : null; + .lang("OpV Sensor") + .onRegister(compassNodeExist(GTCompassSections.COMPONENTS, "sensor")) + .register() : null; public static ItemEntry TOOL_DATA_STICK = REGISTRATE.item("data_stick", ComponentItem::create) .lang("Data Stick").onRegister(attach(new DataItemBehavior())) diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/CustomTags.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/CustomTags.java index 04e1d1cdc4..579c7a25ae 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/CustomTags.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/CustomTags.java @@ -89,6 +89,16 @@ public class CustomTags { UHV_BATTERIES }; + public static final TagKey ELECTRIC_MOTORS = TagUtil.createModItemTag("electric_motors"); + public static final TagKey ELECTRIC_PUMPS = TagUtil.createModItemTag("electric_pumps"); + public static final TagKey FLUID_REGULATORS = TagUtil.createModItemTag("fluid_regulators"); + public static final TagKey CONVEYOR_MODULES = TagUtil.createModItemTag("conveyor_modules"); + public static final TagKey ELECTRIC_PISTONS = TagUtil.createModItemTag("electric_pistons"); + public static final TagKey ROBOT_ARMS = TagUtil.createModItemTag("robot_arms"); + public static final TagKey FIELD_GENERATORS = TagUtil.createModItemTag("field_generators"); + public static final TagKey EMITTERS = TagUtil.createModItemTag("emitters"); + public static final TagKey SENSORS = TagUtil.createModItemTag("sensors"); + public static final TagKey PPE_ARMOR = TagUtil.createModItemTag("ppe_armor"); public static final TagKey STEP_BOOTS = TagUtil.createModItemTag("step_boots"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/tags/ItemTagLoader.java b/src/main/java/com/gregtechceu/gtceu/data/tags/ItemTagLoader.java index 46195a565e..ea03bc5ae0 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/tags/ItemTagLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/tags/ItemTagLoader.java @@ -89,6 +89,70 @@ public static void init(RegistrateTagsProvider provider) { .addTag(CustomTags.ZPM_BATTERIES) .addTag(CustomTags.UV_BATTERIES) .addTag(CustomTags.UHV_BATTERIES); + + // Add highTierContent items as optional entries so it doesn't error + provider.addTag(CustomTags.ELECTRIC_MOTORS) + .addOptional(GTItems.ELECTRIC_MOTOR_UHV.getId()) + .addOptional(GTItems.ELECTRIC_MOTOR_UEV.getId()) + .addOptional(GTItems.ELECTRIC_MOTOR_UIV.getId()) + .addOptional(GTItems.ELECTRIC_MOTOR_UXV.getId()) + .addOptional(GTItems.ELECTRIC_MOTOR_OpV.getId()); + + provider.addTag(CustomTags.ELECTRIC_PUMPS) + .addOptional(GTItems.ELECTRIC_PUMP_UHV.getId()) + .addOptional(GTItems.ELECTRIC_PUMP_UEV.getId()) + .addOptional(GTItems.ELECTRIC_PUMP_UIV.getId()) + .addOptional(GTItems.ELECTRIC_PUMP_UXV.getId()) + .addOptional(GTItems.ELECTRIC_PUMP_OpV.getId()); + + provider.addTag(CustomTags.FLUID_REGULATORS) + .addOptional(GTItems.FLUID_REGULATOR_UHV.getId()) + .addOptional(GTItems.FLUID_REGULATOR_UEV.getId()) + .addOptional(GTItems.FLUID_REGULATOR_UIV.getId()) + .addOptional(GTItems.FLUID_REGULATOR_UXV.getId()) + .addOptional(GTItems.FLUID_REGULATOR_OpV.getId()); + + provider.addTag(CustomTags.CONVEYOR_MODULES) + .addOptional(GTItems.CONVEYOR_MODULE_UHV.getId()) + .addOptional(GTItems.CONVEYOR_MODULE_UEV.getId()) + .addOptional(GTItems.CONVEYOR_MODULE_UIV.getId()) + .addOptional(GTItems.CONVEYOR_MODULE_UXV.getId()) + .addOptional(GTItems.CONVEYOR_MODULE_OpV.getId()); + + provider.addTag(CustomTags.ELECTRIC_PISTONS) + .addOptional(GTItems.ELECTRIC_PISTON_UHV.getId()) + .addOptional(GTItems.ELECTRIC_PISTON_UEV.getId()) + .addOptional(GTItems.ELECTRIC_PISTON_UIV.getId()) + .addOptional(GTItems.ELECTRIC_PISTON_UXV.getId()) + .addOptional(GTItems.ELECTRIC_PISTON_OpV.getId()); + + provider.addTag(CustomTags.ROBOT_ARMS) + .addOptional(GTItems.ROBOT_ARM_UHV.getId()) + .addOptional(GTItems.ROBOT_ARM_UEV.getId()) + .addOptional(GTItems.ROBOT_ARM_UIV.getId()) + .addOptional(GTItems.ROBOT_ARM_UXV.getId()) + .addOptional(GTItems.ROBOT_ARM_OpV.getId()); + + provider.addTag(CustomTags.FIELD_GENERATORS) + .addOptional(GTItems.FIELD_GENERATOR_UHV.getId()) + .addOptional(GTItems.FIELD_GENERATOR_UEV.getId()) + .addOptional(GTItems.FIELD_GENERATOR_UIV.getId()) + .addOptional(GTItems.FIELD_GENERATOR_UXV.getId()) + .addOptional(GTItems.FIELD_GENERATOR_OpV.getId()); + + provider.addTag(CustomTags.EMITTERS) + .addOptional(GTItems.EMITTER_UHV.getId()) + .addOptional(GTItems.EMITTER_UEV.getId()) + .addOptional(GTItems.EMITTER_UIV.getId()) + .addOptional(GTItems.EMITTER_UXV.getId()) + .addOptional(GTItems.EMITTER_OpV.getId()); + + provider.addTag(CustomTags.SENSORS) + .addOptional(GTItems.SENSOR_UHV.getId()) + .addOptional(GTItems.SENSOR_UEV.getId()) + .addOptional(GTItems.SENSOR_UIV.getId()) + .addOptional(GTItems.SENSOR_UXV.getId()) + .addOptional(GTItems.SENSOR_OpV.getId()); } private static void create(RegistrateTagsProvider provider, TagPrefix prefix, Material material, From 7bfc09b17c66cf985c3c656bf96ff19cf9ddce1f Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Thu, 10 Oct 2024 02:42:33 -0600 Subject: [PATCH 104/141] Fix Recipe NBT Serialization (#2105) Co-authored-by: kross <135918757+krossgg@users.noreply.github.com> --- .../gtceu/syncdata/GTRecipePayload.java | 50 ++++++++++++++----- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipePayload.java b/src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipePayload.java index 7cb4dd877d..85150c6b47 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipePayload.java +++ b/src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipePayload.java @@ -1,17 +1,18 @@ package com.gregtechceu.gtceu.syncdata; import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.GTRecipeSerializer; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; 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.nbt.*; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.item.crafting.SmeltingRecipe; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; @@ -27,15 +28,32 @@ public class GTRecipePayload extends ObjectTypedPayload { @Nullable @Override public Tag serializeNBT() { - return StringTag.valueOf(payload.id.toString()); + CompoundTag tag = new CompoundTag(); + tag.putString("id", payload.id.toString()); + tag.put("recipe", + GTRecipeSerializer.CODEC.encodeStart(NbtOps.INSTANCE, payload).result().orElse(new CompoundTag())); + return tag; } @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) { + if (tag instanceof CompoundTag compoundTag) { + payload = GTRecipeSerializer.CODEC.parse(NbtOps.INSTANCE, compoundTag.get("recipe")).result().orElse(null); + if (payload != null) { + payload.id = new ResourceLocation(compoundTag.getString("id")); + } + } else if (tag instanceof StringTag stringTag) { // Backwards Compatibility + var recipe = recipeManager.byKey(new ResourceLocation(stringTag.getAsString())).orElse(null); + if (recipe instanceof GTRecipe gtRecipe) { + payload = gtRecipe; + } else if (recipe instanceof SmeltingRecipe smeltingRecipe) { + payload = GTRecipeTypes.FURNACE_RECIPES.toGTrecipe(new ResourceLocation(stringTag.getAsString()), + smeltingRecipe); + } else { + payload = null; + } + } else if (tag instanceof ByteArrayTag byteArray) { // Backwards Compatibility ByteBuf copiedDataBuffer = Unpooled.copiedBuffer(byteArray.getAsByteArray()); FriendlyByteBuf buf = new FriendlyByteBuf(copiedDataBuffer); payload = (GTRecipe) recipeManager.byKey(buf.readResourceLocation()).orElse(null); @@ -46,16 +64,22 @@ public void deserializeNBT(Tag tag) { @Override public void writePayload(FriendlyByteBuf buf) { buf.writeResourceLocation(this.payload.id); + GTRecipeSerializer.SERIALIZER.toNetwork(buf, this.payload); } @Override public void readPayload(FriendlyByteBuf buf) { - RecipeManager recipeManager; - if (!Platform.isClient()) { - recipeManager = Platform.getMinecraftServer().getRecipeManager(); - } else { - recipeManager = Minecraft.getInstance().getConnection().getRecipeManager(); + var id = buf.readResourceLocation(); + if (buf.isReadable()) { + this.payload = GTRecipeSerializer.SERIALIZER.fromNetwork(id, buf); + } else { // Backwards Compatibility + RecipeManager recipeManager; + if (!Platform.isClient()) { + recipeManager = Platform.getMinecraftServer().getRecipeManager(); + } else { + recipeManager = Minecraft.getInstance().getConnection().getRecipeManager(); + } + this.payload = (GTRecipe) recipeManager.byKey(id).orElse(null); } - this.payload = (GTRecipe) recipeManager.byKey(buf.readResourceLocation()).orElse(null); } } From 557d3ed1465bae996e73433e864892398b63f0df Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Fri, 11 Oct 2024 02:24:36 -0400 Subject: [PATCH 105/141] Workflow fix (#2129) --- .github/json/config-latest.json | 2 +- .github/workflows/publish-on-release.yml | 15 +++++++++++---- .github/workflows/publish.yml | 2 +- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/.github/json/config-latest.json b/.github/json/config-latest.json index 39ed43ea07..a99cc69eb3 100644 --- a/.github/json/config-latest.json +++ b/.github/json/config-latest.json @@ -14,7 +14,7 @@ } ], "sort": "ASC", - "template": "## Changes\n#{{CHANGELOG}}", + "template": "## What's Changed\n#{{CHANGELOG}}", "pr_template": "- #{{TITLE}} by #{{AUTHOR}} in [##{{NUMBER}}](#{{URL}})", "ignore_labels": ["ignore changelog"], "max_pull_requests": 1000, diff --git a/.github/workflows/publish-on-release.yml b/.github/workflows/publish-on-release.yml index 14bed3d65c..ef7c8f892f 100644 --- a/.github/workflows/publish-on-release.yml +++ b/.github/workflows/publish-on-release.yml @@ -14,8 +14,13 @@ jobs: CHANGELOG: ${{ steps.changelog.outputs.changelog }} permissions: contents: write - pull-requests: write + pull-requests: read steps: + - name: Get Config + uses: actions/checkout@v4 + with: + ref: '1.20.1' + sparse-checkout: '.github/json' - name: Generate changelog id: changelog env: @@ -36,8 +41,8 @@ jobs: with: simulate: ${{ startsWith(github.event.release.name, 'simulate') || github.repository_owner != 'GregTechCEu' }} branch: '1.20.1' - tag-name: ${{ github.event.release.tag }} - release-body: ${{ github.event.release.description }} + tag-name: ${{ github.ref_name }} + release-body: ${{ github.event.release.body }} changelog-body: ${{ needs.meta.outputs.CHANGELOG }} publish-21: @@ -48,4 +53,6 @@ jobs: with: simulate: ${{ startsWith(github.event.release.name, 'simulate') || github.repository_owner != 'GregTechCEu' }} branch: '1.21' - tag-name: ${{ github.event.release.tag }} + tag-name: ${{ github.ref_name }} + release-body: ${{ github.event.release.body }} + changelog-body: ${{ needs.meta.outputs.CHANGELOG }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index be5be01598..c50ab3f14a 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -73,7 +73,7 @@ jobs: uses: softprops/action-gh-release@v2 with: tag_name: ${{ inputs.tag-name }} - files: ./!(*-@(dev|dev-all|dev-slim|javadoc)).jar + files: ./*.jar fail_on_unmatched_files: true publish-cf-modrinth: From 51a5a4a751ee45671e93c6e9134fa1370c241254 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Fri, 11 Oct 2024 00:32:08 -0600 Subject: [PATCH 106/141] Fix Drum Item fluid property handling (#2128) --- .../gtceu/api/item/DrumMachineItem.java | 27 ++++++++++++++----- .../gtceu/common/data/GTMachines.java | 3 ++- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/DrumMachineItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/DrumMachineItem.java index 0873130e8e..ee49ff7a05 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/DrumMachineItem.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/DrumMachineItem.java @@ -1,13 +1,16 @@ package com.gregtechceu.gtceu.api.item; import com.gregtechceu.gtceu.api.block.IMachineBlock; +import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.gregtechceu.gtceu.api.data.chemical.material.properties.FluidPipeProperties; +import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; +import com.gregtechceu.gtceu.api.misc.forge.ThermalFluidHandlerItemStack; import com.gregtechceu.gtceu.common.data.GTMachines; import net.minecraft.world.item.ItemStack; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.fluids.capability.templates.FluidHandlerItemStack; import org.jetbrains.annotations.NotNull; @@ -18,20 +21,30 @@ */ public class DrumMachineItem extends MetaMachineItem { - protected DrumMachineItem(IMachineBlock block, Properties properties) { + private Material mat; + + protected DrumMachineItem(IMachineBlock block, Properties properties, Material mat) { super(block, properties); + this.mat = mat; } - public static DrumMachineItem create(IMachineBlock block, Properties properties) { - return new DrumMachineItem(block, properties); + public static DrumMachineItem create(IMachineBlock block, Properties properties, Material mat) { + return new DrumMachineItem(block, properties, mat); } public @NotNull LazyOptional getCapability(ItemStack itemStack, @NotNull Capability cap) { - if (cap == ForgeCapabilities.FLUID_HANDLER_ITEM) { + FluidPipeProperties property; + if (mat.hasProperty(PropertyKey.FLUID_PIPE)) + property = mat.getProperty(PropertyKey.FLUID_PIPE); + else property = null; + + if (cap == ForgeCapabilities.FLUID_HANDLER_ITEM && property != null) { return ForgeCapabilities.FLUID_HANDLER_ITEM.orEmpty(cap, LazyOptional.of( - () -> new FluidHandlerItemStack( + () -> new ThermalFluidHandlerItemStack( itemStack, - Math.toIntExact(GTMachines.DRUM_CAPACITY.get(getDefinition()))))); + Math.toIntExact(GTMachines.DRUM_CAPACITY.get(getDefinition())), + property.getMaxFluidTemperature(), property.isGasProof(), property.isAcidProof(), + property.isCryoProof(), property.isPlasmaProof()))); } return LazyOptional.empty(); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java index 4a2790559a..93d777ba30 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java @@ -2655,7 +2655,8 @@ public static MachineDefinition registerDrum(Material material, int capacity, St var definition = REGISTRATE .machine(material.getName() + "_drum", MachineDefinition::createDefinition, holder -> new DrumMachine(holder, material, capacity), MetaMachineBlock::new, - DrumMachineItem::create, MetaMachineBlockEntity::createBlockEntity) + (holder, prop) -> DrumMachineItem.create(holder, prop, material), + MetaMachineBlockEntity::createBlockEntity) .langValue(lang) .rotationState(RotationState.NONE) .renderer( From 29f21a8cfefa6a0af7ccd228c37020d2359b3c4d Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Fri, 11 Oct 2024 00:33:43 -0600 Subject: [PATCH 107/141] Add in-line filtering for item and fluid pipes (#2126) --- .../gtceu/common/cover/FluidFilterCover.java | 40 ++++++++++++++++++ .../gtceu/common/cover/ItemFilterCover.java | 41 +++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java index 19232c0cf6..757c6b378d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java @@ -5,15 +5,20 @@ import com.gregtechceu.gtceu.api.cover.CoverDefinition; import com.gregtechceu.gtceu.api.cover.IUICover; import com.gregtechceu.gtceu.api.cover.filter.FluidFilter; +import com.gregtechceu.gtceu.api.transfer.fluid.FluidTransferDelegate; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.lowdragmc.lowdraglib.side.fluid.FluidStack; import com.lowdragmc.lowdraglib.side.fluid.FluidTransferHelper; +import com.lowdragmc.lowdraglib.side.fluid.IFluidTransfer; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; +import org.jetbrains.annotations.Nullable; + import javax.annotation.ParametersAreNonnullByDefault; /** @@ -26,6 +31,7 @@ public class FluidFilterCover extends CoverBehavior implements IUICover { protected FluidFilter fluidFilter; + private FilteredFluidTransferWrapper fluidFilterWrapper; public FluidFilterCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) { super(definition, coverHolder, attachedSide); @@ -43,6 +49,19 @@ public FluidFilter getFluidFilter() { return fluidFilter; } + @Override + public @Nullable IFluidTransfer getFluidTransferCap(@Nullable IFluidTransfer defaultValue) { + if (defaultValue == null) { + return null; + } + + if (fluidFilterWrapper == null || fluidFilterWrapper.delegate != defaultValue) { + this.fluidFilterWrapper = new FilteredFluidTransferWrapper(defaultValue); + } + + return fluidFilterWrapper; + } + @Override public Widget createUIWidget() { final var group = new WidgetGroup(0, 0, 176, 80); @@ -50,4 +69,25 @@ public Widget createUIWidget() { group.addWidget(getFluidFilter().openConfigurator((176 - 80) / 2, (60 - 55) / 2 + 15)); return group; } + + private class FilteredFluidTransferWrapper extends FluidTransferDelegate { + + public FilteredFluidTransferWrapper(IFluidTransfer delegate) { + super(delegate); + } + + @Override + public long fill(int tank, FluidStack resource, boolean simulate, boolean notifyChanges) { + if (!fluidFilter.test(resource)) + return 0; + return super.fill(tank, resource, simulate, notifyChanges); + } + + @Override + public FluidStack drain(int tank, FluidStack resource, boolean simulate, boolean notifyChanges) { + if (!fluidFilter.test(resource)) + return FluidStack.empty(); + return super.drain(tank, resource, simulate, notifyChanges); + } + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java index 4dfd227b83..b6b8274d64 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java @@ -6,11 +6,13 @@ import com.gregtechceu.gtceu.api.cover.IUICover; import com.gregtechceu.gtceu.api.cover.filter.ItemFilter; import com.gregtechceu.gtceu.api.gui.widget.EnumSelectorWidget; +import com.gregtechceu.gtceu.api.transfer.item.ItemTransferDelegate; import com.gregtechceu.gtceu.common.cover.data.ItemFilterMode; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.lowdragmc.lowdraglib.side.item.IItemTransfer; import com.lowdragmc.lowdraglib.side.item.ItemTransferHelper; import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; @@ -18,8 +20,11 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; import lombok.Getter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -40,6 +45,7 @@ public class ItemFilterCover extends CoverBehavior implements IUICover { @DescSynced @Getter protected ItemFilterMode filterMode = ItemFilterMode.FILTER_INSERT; + private FilteredItemTransferWrapper itemFilterWrapper; public ItemFilterCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) { super(definition, coverHolder, attachedSide); @@ -62,6 +68,17 @@ public boolean canAttach() { return ItemTransferHelper.getItemTransfer(coverHolder.getLevel(), coverHolder.getPos(), attachedSide) != null; } + @Override + public @Nullable IItemTransfer getItemTransferCap(IItemTransfer defaultValue) { + if (defaultValue == null) { + return null; + } + if (itemFilterWrapper == null || itemFilterWrapper.delegate != defaultValue) { + this.itemFilterWrapper = new ItemFilterCover.FilteredItemTransferWrapper(defaultValue); + } + return itemFilterWrapper; + } + @Override public Widget createUIWidget() { final var group = new WidgetGroup(0, 0, 176, 85); @@ -76,4 +93,28 @@ public Widget createUIWidget() { public ManagedFieldHolder getFieldHolder() { return MANAGED_FIELD_HOLDER; } + + private class FilteredItemTransferWrapper extends ItemTransferDelegate { + + public FilteredItemTransferWrapper(IItemTransfer delegate) { + super(delegate); + } + + @Override + public @NotNull ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate, + boolean notifyChanges) { + if (filterMode != ItemFilterMode.FILTER_EXTRACT && !itemFilter.test(stack)) + return stack; + return super.insertItem(slot, stack, simulate, notifyChanges); + } + + @Override + public @NotNull ItemStack extractItem(int slot, int amount, boolean simulate, boolean notifyChanges) { + ItemStack result = super.extractItem(slot, amount, true, notifyChanges); + if (result.isEmpty() || (filterMode != ItemFilterMode.FILTER_INSERT && !itemFilter.test(result))) { + return ItemStack.EMPTY; + } + return simulate ? result : super.extractItem(slot, amount, false, notifyChanges); + } + } } From c2e2796d957caaf6b7f77537dd017fc779cdaf35 Mon Sep 17 00:00:00 2001 From: Electrolyte <21316184+Electrolyte220@users.noreply.github.com> Date: Fri, 11 Oct 2024 02:36:35 -0400 Subject: [PATCH 108/141] Misc Recipe Fixes (#2125) --- .../recipe/configurable/RecipeAddition.java | 171 +++++++++++++++--- .../recipe/configurable/RecipeRemoval.java | 12 +- .../data/recipe/misc/MachineRecipeLoader.java | 6 + .../recipe/misc/VanillaStandardRecipes.java | 128 +++---------- .../data/recipe/misc/WoodMachineRecipes.java | 23 ++- .../serialized/chemistry/BrewingRecipes.java | 20 +- 6 files changed, 219 insertions(+), 141 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java index fa8be29532..53d5071413 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java @@ -303,6 +303,30 @@ private static void hardRedstoneRecipes(Consumer provider) { 'L', Blocks.MANGROVE_SLAB.asItem(), 'C', new UnificationEntry(TagPrefix.spring, GTMaterials.Iron)); + VanillaRecipeHelper.addShapedRecipe(provider, "cherry_pressure_plate", + new ItemStack(Blocks.CHERRY_PRESSURE_PLATE, 2), "SrS", "LCL", "SdS", + 'S', new UnificationEntry(TagPrefix.bolt, GTMaterials.Wood), + 'L', Blocks.CHERRY_SLAB.asItem(), + 'C', new UnificationEntry(TagPrefix.spring, GTMaterials.Iron)); + + VanillaRecipeHelper.addShapedRecipe(provider, "bamboo_pressure_plate", + new ItemStack(Blocks.BAMBOO_PRESSURE_PLATE, 2), "SrS", "LCL", "SdS", + 'S', new UnificationEntry(TagPrefix.bolt, GTMaterials.Wood), + 'L', Blocks.BAMBOO_SLAB.asItem(), + 'C', new UnificationEntry(TagPrefix.spring, GTMaterials.Iron)); + + VanillaRecipeHelper.addShapedRecipe(provider, "rubber_pressure_plate", + new ItemStack(GTBlocks.RUBBER_PRESSURE_PLATE, 2), "SrS", "LCL", "SdS", + 'S', new UnificationEntry(TagPrefix.bolt, GTMaterials.Wood), + 'L', GTBlocks.RUBBER_SLAB.asItem(), + 'C', new UnificationEntry(TagPrefix.spring, GTMaterials.Iron)); + + VanillaRecipeHelper.addShapedRecipe(provider, "treated_wood_pressure_plate", + new ItemStack(GTBlocks.TREATED_WOOD_PRESSURE_PLATE, 2), "SrS", "LCL", "SdS", + 'S', new UnificationEntry(TagPrefix.bolt, GTMaterials.Wood), + 'L', GTBlocks.TREATED_WOOD_SLAB.asItem(), + 'C', new UnificationEntry(TagPrefix.spring, GTMaterials.Iron)); + VanillaRecipeHelper.addShapedRecipe(provider, "heavy_weighted_pressure_plate", new ItemStack(Blocks.LIGHT_WEIGHTED_PRESSURE_PLATE), "ShS", "LCL", "SdS", 'S', new UnificationEntry(TagPrefix.screw, GTMaterials.Steel), @@ -375,6 +399,30 @@ private static void hardRedstoneRecipes(Consumer provider) { .outputItems(new ItemStack(Blocks.MANGROVE_PRESSURE_PLATE, 2)) .duration(100).EUt(VA[ULV]).save(provider); + GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("cherry_pressure_plate") + .inputItems(TagPrefix.spring, GTMaterials.Iron) + .inputItems(new ItemStack(Blocks.CHERRY_SLAB, 2)) + .outputItems(new ItemStack(Blocks.CHERRY_PRESSURE_PLATE, 2)) + .duration(100).EUt(VA[ULV]).save(provider); + + GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("bamboo_pressure_plate") + .inputItems(TagPrefix.spring, GTMaterials.Iron) + .inputItems(new ItemStack(Blocks.BAMBOO_SLAB, 2)) + .outputItems(new ItemStack(Blocks.BAMBOO_PRESSURE_PLATE, 2)) + .duration(100).EUt(VA[ULV]).save(provider); + + GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("rubber_pressure_plate") + .inputItems(TagPrefix.spring, GTMaterials.Iron) + .inputItems(new ItemStack(GTBlocks.RUBBER_SLAB, 2)) + .outputItems(new ItemStack(GTBlocks.RUBBER_PRESSURE_PLATE, 2)) + .duration(100).EUt(VA[ULV]).save(provider); + + GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("treated_wood_pressure_plate") + .inputItems(TagPrefix.spring, GTMaterials.Iron) + .inputItems(new ItemStack(GTBlocks.TREATED_WOOD_SLAB, 2)) + .outputItems(new ItemStack(GTBlocks.TREATED_WOOD_PRESSURE_PLATE, 2)) + .duration(100).EUt(VA[ULV]).save(provider); + GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("light_weighted_pressure_plate") .inputItems(TagPrefix.spring, GTMaterials.Steel) .inputItems(TagPrefix.plate, GTMaterials.Gold) @@ -426,6 +474,14 @@ private static void hardRedstoneRecipes(Consumer provider) { VanillaRecipeHelper.addShapedRecipe(provider, "bamboo_button", new ItemStack(Blocks.BAMBOO_BUTTON, 6), "sP", 'P', new ItemStack(Blocks.BAMBOO_PRESSURE_PLATE)); + VanillaRecipeHelper.addShapedRecipe(provider, "rubber_button", new ItemStack(GTBlocks.RUBBER_BUTTON, 6), + "sP", + 'P', new ItemStack(GTBlocks.RUBBER_PRESSURE_PLATE)); + + VanillaRecipeHelper.addShapedRecipe(provider, "treated_wood_button", + new ItemStack(GTBlocks.TREATED_WOOD_BUTTON, 6), "sP", + 'P', new ItemStack(GTBlocks.TREATED_WOOD_PRESSURE_PLATE)); + GTRecipeTypes.CUTTER_RECIPES.recipeBuilder("stone_button") .inputItems(new ItemStack(Blocks.STONE_PRESSURE_PLATE)) .outputItems(new ItemStack(Blocks.STONE_BUTTON, 12)) @@ -476,6 +532,26 @@ private static void hardRedstoneRecipes(Consumer provider) { .outputItems(new ItemStack(Blocks.MANGROVE_BUTTON, 12)) .duration(25).EUt(VA[ULV]).save(provider); + GTRecipeTypes.CUTTER_RECIPES.recipeBuilder("cherry_button") + .inputItems(new ItemStack(Blocks.CHERRY_PRESSURE_PLATE)) + .outputItems(new ItemStack(Blocks.CHERRY_BUTTON, 12)) + .duration(25).EUt(VA[ULV]).save(provider); + + GTRecipeTypes.CUTTER_RECIPES.recipeBuilder("bamboo_button") + .inputItems(new ItemStack(Blocks.BAMBOO_PRESSURE_PLATE)) + .outputItems(new ItemStack(Blocks.BAMBOO_BUTTON, 12)) + .duration(25).EUt(VA[ULV]).save(provider); + + GTRecipeTypes.CUTTER_RECIPES.recipeBuilder("rubber_button") + .inputItems(new ItemStack(GTBlocks.RUBBER_PRESSURE_PLATE)) + .outputItems(new ItemStack(GTBlocks.RUBBER_BUTTON, 12)) + .duration(25).EUt(VA[ULV]).save(provider); + + GTRecipeTypes.CUTTER_RECIPES.recipeBuilder("treated_wood_button") + .inputItems(new ItemStack(GTBlocks.TREATED_WOOD_PRESSURE_PLATE)) + .outputItems(new ItemStack(GTBlocks.TREATED_WOOD_BUTTON, 12)) + .duration(25).EUt(VA[ULV]).save(provider); + VanillaRecipeHelper.addShapedRecipe(provider, "lever", new ItemStack(Blocks.LEVER), "B", "S", 'B', new ItemStack(Blocks.STONE_BUTTON), 'S', new UnificationEntry(TagPrefix.rod, GTMaterials.Wood)); @@ -504,7 +580,7 @@ private static void hardRedstoneRecipes(Consumer provider) { GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("daylight_detector") .inputItems(rod, RedAlloy) .inputItems(new ItemStack(Blocks.GLASS, 3)) - .inputItems(ingot, NetherQuartz, 3) + .inputItems(gem, NetherQuartz, 3) .inputItems(ItemTags.PLANKS) .outputItems(new ItemStack(Blocks.DAYLIGHT_DETECTOR)) .duration(200).EUt(16).save(provider); @@ -512,7 +588,7 @@ private static void hardRedstoneRecipes(Consumer provider) { GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("daylight_detector_certus") .inputItems(rod, RedAlloy) .inputItems(new ItemStack(Blocks.GLASS, 3)) - .inputItems(ingot, CertusQuartz, 3) + .inputItems(gem, CertusQuartz, 3) .inputItems(ItemTags.PLANKS) .outputItems(new ItemStack(Blocks.DAYLIGHT_DETECTOR)) .duration(200).EUt(16).save(provider); @@ -520,7 +596,7 @@ private static void hardRedstoneRecipes(Consumer provider) { GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("daylight_detector_quartzite") .inputItems(rod, RedAlloy) .inputItems(new ItemStack(Blocks.GLASS, 3)) - .inputItems(ingot, Quartzite, 3) + .inputItems(gem, Quartzite, 3) .inputItems(ItemTags.PLANKS) .outputItems(new ItemStack(Blocks.DAYLIGHT_DETECTOR)) .duration(200).EUt(16).save(provider); @@ -631,7 +707,7 @@ private static void hardRedstoneRecipes(Consumer provider) { ASSEMBLER_RECIPES.recipeBuilder("calibrated_sculk_sensor") .inputItems(new ItemStack(Blocks.SCULK_SENSOR)) - .inputItems(ingot, Amethyst) + .inputItems(gem, Amethyst) .inputItems(plate, Amethyst) .outputItems(new ItemStack(Blocks.CALIBRATED_SCULK_SENSOR)) .duration(200).EUt(16).save(provider); @@ -818,6 +894,18 @@ private static void hardToolArmorRecipes(Consumer provider) { 'R', new UnificationEntry(TagPrefix.rod, GTMaterials.Iron), 'L', new UnificationEntry(TagPrefix.rodLong, GTMaterials.Iron), 'P', new UnificationEntry(TagPrefix.plate, GTMaterials.Wood)); + + VanillaRecipeHelper.addShapedRecipe(provider, "bow", new ItemStack(Items.BOW), "hLS", "LRS", "fLS", + 'L', new UnificationEntry(TagPrefix.rodLong, GTMaterials.Wood), + 'S', new ItemStack(Items.STRING), + 'R', new UnificationEntry(TagPrefix.ring, GTMaterials.Iron)); + + VanillaRecipeHelper.addShapedRecipe(provider, "crossbow", new ItemStack(Items.CROSSBOW), "RIR", "STS", + "sRf", + 'R', new UnificationEntry(TagPrefix.rodLong, GTMaterials.Wood), + 'S', new ItemStack(Items.STRING), + 'T', new ItemStack(Items.TRIPWIRE_HOOK), + 'I', new UnificationEntry(ring, Iron)); } else { ASSEMBLER_RECIPES.recipeBuilder("compass") .inputItems(dust, Redstone) @@ -970,18 +1058,6 @@ private static void hardMiscRecipes(Consumer provider) { 'S', new ItemStack(Items.STRING), 'B', new ItemStack(Items.SLIME_BALL)); - VanillaRecipeHelper.addShapedRecipe(provider, "bow", new ItemStack(Items.BOW), "hLS", "LRS", "fLS", - 'L', new UnificationEntry(TagPrefix.rodLong, GTMaterials.Wood), - 'S', new ItemStack(Items.STRING), - 'R', new UnificationEntry(TagPrefix.ring, GTMaterials.Iron)); - - VanillaRecipeHelper.addShapedRecipe(provider, "crossbow", new ItemStack(Items.CROSSBOW), "RIR", "STS", - "sRf", - 'R', new UnificationEntry(TagPrefix.rodLong, GTMaterials.Wood), - 'S', new ItemStack(Items.STRING), - 'T', new ItemStack(Items.TRIPWIRE_HOOK), - 'I', new UnificationEntry(ring, Iron)); - VanillaRecipeHelper.addShapedRecipe(provider, "item_frame", new ItemStack(Items.ITEM_FRAME), "SRS", "TLT", "TTT", 'S', new ItemStack(Items.STRING), @@ -1188,12 +1264,6 @@ private static void hardMiscRecipes(Consumer provider) { .outputItems(new ItemStack(Blocks.BELL)) .duration(200).EUt(16).save(provider); - ASSEMBLER_RECIPES.recipeBuilder("conduit") - .inputItems(new ItemStack(Items.HEART_OF_THE_SEA)) - .inputItems(new ItemStack(Items.NAUTILUS_SHELL, 8)) - .outputItems(new ItemStack(Blocks.CONDUIT)) - .duration(200).EUt(16).save(provider); - VanillaRecipeHelper.addShapedRecipe(provider, "candle", new ItemStack(Blocks.CANDLE), "r", "S", "W", 'S', new ItemStack(Items.STRING), @@ -1242,8 +1312,8 @@ private static void hardMiscRecipes(Consumer provider) { VanillaRecipeHelper.addShapedRecipe(provider, "lightning_rod", new ItemStack(Blocks.LIGHTNING_ROD), " B ", "fRh", " R ", - 'R', rod, Copper, - 'B', plateDouble, Copper); + 'R', new UnificationEntry(rod, Copper), + 'B', new UnificationEntry(plateDouble, Copper)); ASSEMBLER_RECIPES.recipeBuilder("lightning_rod") .inputItems(rod, Copper, 2) @@ -1338,7 +1408,6 @@ private static void hardMiscRecipes(Consumer provider) { } } else { - // TODO: add non-harderMiscRecipes assembler recipes for 1.14 blocks ASSEMBLER_RECIPES.recipeBuilder("crafting_table").duration(80).EUt(6).circuitMeta(4) .inputItems(ItemTags.PLANKS, 4).outputItems(new ItemStack(Blocks.CRAFTING_TABLE)).save(provider); ASSEMBLER_RECIPES.recipeBuilder("furnace").circuitMeta(8).inputItems(ItemTags.STONE_CRAFTING_MATERIALS, 8) @@ -1361,6 +1430,58 @@ private static void hardMiscRecipes(Consumer provider) { ASSEMBLER_RECIPES.recipeBuilder("observer_quartzite").duration(100).EUt(VA[LV]) .inputItems(ItemTags.STONE_CRAFTING_MATERIALS, 6).inputItems(dust, Redstone, 2) .inputItems(plate, Quartzite).outputItems(new ItemStack(Blocks.OBSERVER)).save(provider); + ASSEMBLER_RECIPES.recipeBuilder("lantern").duration(100).EUt(VA[LV]) + .inputItems(Items.TORCH).inputFluids(Iron.getFluid(GTValues.L / 9 * 8)) + .outputItems(new ItemStack(Blocks.LANTERN)).save(provider); + ASSEMBLER_RECIPES.recipeBuilder("tinted_glass").duration(100).EUt(VA[LV]) + .inputItems(Items.AMETHYST_SHARD, 2).inputItems(Items.GLASS) + .outputItems(new ItemStack(Blocks.TINTED_GLASS)).save(provider); + ASSEMBLER_RECIPES.recipeBuilder("stonecutter").duration(100).EUt(VA[LV]) + .inputItems(Items.STONE, 3).inputFluids(Iron.getFluid(GTValues.L)) + .outputItems(new ItemStack(Blocks.STONECUTTER)).save(provider); + ASSEMBLER_RECIPES.recipeBuilder("cartography_table").duration(100).EUt(VA[LV]) + .inputItems(ItemTags.PLANKS, 4).inputItems(Items.PAPER, 2) + .outputItems(new ItemStack(Blocks.CARTOGRAPHY_TABLE)).circuitMeta(7).save(provider); + ASSEMBLER_RECIPES.recipeBuilder("fletching_table").duration(100).EUt(VA[LV]) + .inputItems(ItemTags.PLANKS, 4).inputItems(Items.FLINT, 2) + .outputItems(new ItemStack(Blocks.FLETCHING_TABLE)).circuitMeta(7).save(provider); + ASSEMBLER_RECIPES.recipeBuilder("smithing_table").duration(100).EUt(VA[LV]) + .inputItems(ItemTags.PLANKS, 4).inputFluids(Iron.getFluid(GTValues.L * 2)) + .outputItems(new ItemStack(Blocks.SMITHING_TABLE)).circuitMeta(7).save(provider); + ASSEMBLER_RECIPES.recipeBuilder("grindstone").duration(100).EUt(VA[LV]) + .inputItems(Tags.Items.RODS_WOODEN, 2).inputItems(Items.STONE_SLAB).inputItems(ItemTags.PLANKS, 2) + .outputItems(new ItemStack(Blocks.GRINDSTONE)).circuitMeta(7).save(provider); + ASSEMBLER_RECIPES.recipeBuilder("loom").duration(100).EUt(VA[LV]) + .inputItems(ItemTags.PLANKS, 2).inputItems(Items.STRING, 2).outputItems(new ItemStack(Blocks.LOOM)) + .circuitMeta(7).save(provider); + ASSEMBLER_RECIPES.recipeBuilder("smoker").duration(100).EUt(VA[LV]) + .inputItems(ItemTags.LOGS, 4).inputItems(Items.FURNACE).outputItems(new ItemStack(Blocks.SMOKER)) + .circuitMeta(7).save(provider); + ASSEMBLER_RECIPES.recipeBuilder("blast_furnace").duration(100).EUt(VA[LV]) + .inputItems(Items.SMOOTH_STONE, 3).inputItems(Items.FURNACE) + .inputFluids(Iron.getFluid(GTValues.L * 5)).outputItems(new ItemStack(Blocks.BLAST_FURNACE)) + .save(provider); + ASSEMBLER_RECIPES.recipeBuilder("composter").duration(100).EUt(VA[LV]) + .inputItems(ItemTags.WOODEN_SLABS, 7).outputItems(new ItemStack(Blocks.COMPOSTER)).circuitMeta(7) + .save(provider); + ASSEMBLER_RECIPES.recipeBuilder("lodestone").duration(100).EUt(VA[LV]) + .inputItems(Items.CHISELED_STONE_BRICKS, 8).inputItems(Items.NETHERITE_INGOT) + .outputItems(new ItemStack(Blocks.LODESTONE)).save(provider); + ASSEMBLER_RECIPES.recipeBuilder("scaffolding").duration(100).EUt(VA[LV]) + .inputItems(Items.BAMBOO, 6).inputItems(Items.STRING) + .outputItems(new ItemStack(Blocks.SCAFFOLDING, 6)).circuitMeta(7).save(provider); + ASSEMBLER_RECIPES.recipeBuilder("beehive").duration(100).EUt(VA[LV]) + .inputItems(ItemTags.PLANKS, 6).inputItems(Items.HONEYCOMB, 3) + .outputItems(new ItemStack(Blocks.BEEHIVE)).circuitMeta(7).save(provider); + ASSEMBLER_RECIPES.recipeBuilder("chiseled_bookshelf").duration(100).EUt(VA[LV]) + .inputItems(ItemTags.PLANKS, 6).inputItems(ItemTags.WOODEN_SLABS, 3) + .outputItems(new ItemStack(Blocks.CHISELED_BOOKSHELF)).circuitMeta(9).save(provider); + ASSEMBLER_RECIPES.recipeBuilder("lectern").duration(100).EUt(VA[LV]) + .inputItems(ItemTags.WOODEN_SLABS, 4).inputItems(Items.BOOKSHELF) + .outputItems(new ItemStack(Blocks.LECTERN)).circuitMeta(10).save(provider); + ASSEMBLER_RECIPES.recipeBuilder("respawn_anchor").duration(100).EUt(VA[LV]) + .inputItems(Items.CRYING_OBSIDIAN, 6).inputItems(Items.GLOWSTONE, 3) + .outputItems(new ItemStack(Blocks.RESPAWN_ANCHOR)).save(provider); } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeRemoval.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeRemoval.java index 9e44650774..0993ac8346 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeRemoval.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeRemoval.java @@ -74,6 +74,7 @@ private static void generalRemovals(Consumer registry) { // removed these for parity with the other torch recipes registry.accept(new ResourceLocation("minecraft:soul_torch")); registry.accept(new ResourceLocation("minecraft:soul_lantern")); + registry.accept(new ResourceLocation("minecraft:leather_horse_armor")); } private static void disableManualCompression(Consumer registry) { @@ -96,7 +97,6 @@ private static void disableManualCompression(Consumer registry registry.accept(new ResourceLocation("minecraft:lapis_block")); registry.accept(new ResourceLocation("minecraft:lapis_lazuli")); registry.accept(new ResourceLocation("minecraft:quartz_block")); - registry.accept(new ResourceLocation("minecraft:quartz_block")); registry.accept(new ResourceLocation("minecraft:clay")); registry.accept(new ResourceLocation("minecraft:nether_brick")); registry.accept(new ResourceLocation("minecraft:glowstone")); @@ -107,6 +107,7 @@ private static void disableManualCompression(Consumer registry registry.accept(new ResourceLocation("minecraft:snow_block")); registry.accept(new ResourceLocation("minecraft:netherite_block")); registry.accept(new ResourceLocation("minecraft:netherite_ingot_from_netherite_block")); + registry.accept(new ResourceLocation("minecraft:dripstone_block")); } private static void harderBrickRecipes(Consumer registry) { @@ -158,6 +159,8 @@ private static void hardRedstoneRecipes(Consumer registry) { registry.accept(new ResourceLocation("minecraft:crimson_pressure_plate")); registry.accept(new ResourceLocation("minecraft:warped_pressure_plate")); registry.accept(new ResourceLocation("minecraft:mangrove_pressure_plate")); + registry.accept(new ResourceLocation("minecraft:cherry_pressure_plate")); + registry.accept(new ResourceLocation("minecraft:bamboo_pressure_plate")); registry.accept(new ResourceLocation("minecraft:heavy_weighted_pressure_plate")); registry.accept(new ResourceLocation("minecraft:light_weighted_pressure_plate")); registry.accept(new ResourceLocation("minecraft:stone_button")); @@ -180,6 +183,8 @@ private static void hardToolArmorRecipes(Consumer registry) { registry.accept(new ResourceLocation("minecraft:clock")); registry.accept(new ResourceLocation("minecraft:shears")); registry.accept(new ResourceLocation("minecraft:shield")); + registry.accept(new ResourceLocation("minecraft:crossbow")); + registry.accept(new ResourceLocation("minecraft:bow")); for (String type : new String[] { "iron", "golden", "diamond" }) { registry.accept(new ResourceLocation("minecraft:" + type + "_shovel")); registry.accept(new ResourceLocation("minecraft:" + type + "_pickaxe")); @@ -223,7 +228,6 @@ private static void hardMiscRecipes(Consumer registry) { registry.accept(new ResourceLocation("minecraft:polished_diorite")); registry.accept(new ResourceLocation("minecraft:polished_andesite")); registry.accept(new ResourceLocation("minecraft:lead")); - registry.accept(new ResourceLocation("minecraft:bow")); registry.accept(new ResourceLocation("minecraft:item_frame")); registry.accept(new ResourceLocation("minecraft:painting")); registry.accept(new ResourceLocation("minecraft:chest_minecart")); @@ -265,6 +269,9 @@ private static void hardMiscRecipes(Consumer registry) { registry.accept(new ResourceLocation("minecraft:recovery_compass")); registry.accept(new ResourceLocation("minecraft:spyglass")); registry.accept(new ResourceLocation("minecraft:chain")); + registry.accept(new ResourceLocation("minecraft:respawn_anchor")); + registry.accept(new ResourceLocation("minecraft:lodestone")); + registry.accept(new ResourceLocation("minecraft:chiseled_bookshelf")); } private static void hardGlassRecipes(Consumer registry) { @@ -341,7 +348,6 @@ private static void removeVanillaBlockRecipes(Consumer registr registry.accept(new ResourceLocation("minecraft:chiseled_red_sandstone")); registry.accept(new ResourceLocation("minecraft:smooth_red_sandstone")); registry.accept(new ResourceLocation("minecraft:bookshelf")); - registry.accept(new ResourceLocation("minecraft:chiseled_bookshelf")); registry.accept(new ResourceLocation("minecraft:quartz_pillar")); registry.accept(new ResourceLocation("minecraft:sea_lantern")); registry.accept(new ResourceLocation("minecraft:white_wool_from_string")); diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MachineRecipeLoader.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MachineRecipeLoader.java index 66939e196d..d6eda43c39 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MachineRecipeLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MachineRecipeLoader.java @@ -1119,6 +1119,12 @@ private static void registerRecyclingRecipes(Consumer provider) .duration(150).EUt(2) .save(provider); + MACERATOR_RECIPES.recipeBuilder("macerate_obsidian") + .inputItems(new ItemStack(Blocks.OBSIDIAN)) + .outputItems(dust, Obsidian) + .duration(150).EUt(2) + .save(provider); + // TODO Stone-type tags? // if (!OreDictionary.getOres("stoneSoapstone").isEmpty()) // MACERATOR_RECIPES.recipeBuilder() 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 e9df7538a8..d85ddcb986 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 @@ -396,13 +396,6 @@ private static void woodRecipes(Consumer provider) { .duration(100).EUt(4) .save(provider); - // todo trapdoors - // ASSEMBLER_RECIPES.recipeBuilder() - // .inputItems(ItemTags.PLANKS, 3).circuitMeta(3) - // .outputItems(new ItemStack(Blocks.TRAPDOOR, 2)) - // .duration(100).EUt(4) - // .save(provider); - ASSEMBLER_RECIPES.recipeBuilder("chest") .inputItems(ItemTags.PLANKS, 8) .outputItems(new ItemStack(Blocks.CHEST)) @@ -451,84 +444,6 @@ private static void woodRecipes(Consumer provider) { .outputItems(new ItemStack(Blocks.SOUL_LANTERN)) .duration(100).EUt(1).save(provider); - ASSEMBLER_RECIPES.recipeBuilder("oak_fence") - .inputItems(new ItemStack(Blocks.OAK_PLANKS, 1)) - .outputItems(new ItemStack(Blocks.OAK_FENCE)) - .circuitMeta(1) - .duration(100).EUt(4).save(provider); - - ASSEMBLER_RECIPES.recipeBuilder("spruce_fence") - .inputItems(new ItemStack(Blocks.SPRUCE_PLANKS, 1)) - .outputItems(new ItemStack(Blocks.SPRUCE_FENCE)) - .circuitMeta(1) - .duration(100).EUt(4).save(provider); - - ASSEMBLER_RECIPES.recipeBuilder("birch_fence") - .inputItems(new ItemStack(Blocks.BIRCH_PLANKS, 1)) - .outputItems(new ItemStack(Blocks.BIRCH_FENCE)) - .circuitMeta(1) - .duration(100).EUt(4).save(provider); - - ASSEMBLER_RECIPES.recipeBuilder("jungle_fence") - .inputItems(new ItemStack(Blocks.JUNGLE_PLANKS, 1)) - .outputItems(new ItemStack(Blocks.JUNGLE_FENCE)) - .circuitMeta(1) - .duration(100).EUt(4).save(provider); - - ASSEMBLER_RECIPES.recipeBuilder("acacia_fence") - .inputItems(new ItemStack(Blocks.ACACIA_PLANKS, 1)) - .outputItems(new ItemStack(Blocks.ACACIA_FENCE)) - .circuitMeta(1) - .duration(100).EUt(4).save(provider); - - ASSEMBLER_RECIPES.recipeBuilder("dark_oak_fence") - .inputItems(new ItemStack(Blocks.DARK_OAK_PLANKS, 1)) - .outputItems(new ItemStack(Blocks.DARK_OAK_FENCE)) - .circuitMeta(1) - .duration(100).EUt(4).save(provider); - - ASSEMBLER_RECIPES.recipeBuilder("oak_fence_gate") - .inputItems(new ItemStack(Blocks.OAK_PLANKS, 2)) - .inputItems(Items.STICK, 2) - .outputItems(new ItemStack(Blocks.OAK_FENCE_GATE)) - .circuitMeta(2) - .duration(100).EUt(4).save(provider); - - ASSEMBLER_RECIPES.recipeBuilder("spruce_fence_gate") - .inputItems(new ItemStack(Blocks.SPRUCE_PLANKS, 2)) - .inputItems(Items.STICK, 2) - .outputItems(new ItemStack(Blocks.SPRUCE_FENCE_GATE)) - .circuitMeta(2) - .duration(100).EUt(4).save(provider); - - ASSEMBLER_RECIPES.recipeBuilder("birch_fence_gate") - .inputItems(new ItemStack(Blocks.BIRCH_PLANKS, 2)) - .inputItems(Items.STICK, 2) - .outputItems(new ItemStack(Blocks.BIRCH_FENCE_GATE)) - .circuitMeta(2) - .duration(100).EUt(4).save(provider); - - ASSEMBLER_RECIPES.recipeBuilder("jungle_fence_gate") - .inputItems(new ItemStack(Blocks.JUNGLE_PLANKS, 2)) - .inputItems(Items.STICK, 2) - .outputItems(new ItemStack(Blocks.JUNGLE_FENCE_GATE)) - .circuitMeta(2) - .duration(100).EUt(4).save(provider); - - ASSEMBLER_RECIPES.recipeBuilder("acacia_fence_gate") - .inputItems(new ItemStack(Blocks.ACACIA_PLANKS, 2)) - .inputItems(Items.STICK, 2) - .outputItems(new ItemStack(Blocks.ACACIA_FENCE_GATE)) - .circuitMeta(2) - .duration(100).EUt(4).save(provider); - - ASSEMBLER_RECIPES.recipeBuilder("dark_oak_fence_gate") - .inputItems(new ItemStack(Blocks.DARK_OAK_PLANKS, 2)) - .inputItems(Items.STICK, 2) - .outputItems(new ItemStack(Blocks.DARK_OAK_FENCE_GATE)) - .circuitMeta(2) - .duration(100).EUt(4).save(provider); - VanillaRecipeHelper.addShapedRecipe(provider, "sticky_resin_torch", new ItemStack(Blocks.TORCH, 3), "X", "Y", 'X', STICKY_RESIN, 'Y', new ItemStack(Items.STICK)); VanillaRecipeHelper.addShapedRecipe(provider, "torch_sulfur", new ItemStack(Blocks.TORCH, 2), "C", "S", 'C', @@ -556,25 +471,6 @@ private static void woodRecipes(Consumer provider) { ASSEMBLER_RECIPES.recipeBuilder("torch_phosphorus").EUt(4).inputItems(new ItemStack(Items.STICK)) .inputItems(dust, Phosphorus).outputItems(new ItemStack(Blocks.TORCH, 6)).duration(100).save(provider); - ASSEMBLER_RECIPES.recipeBuilder("oak_stairs").EUt(4).duration(100).circuitMeta(7) - .inputItems(new ItemStack(Blocks.OAK_PLANKS, 6)).outputItems(new ItemStack(Blocks.OAK_STAIRS, 4)) - .save(provider); - ASSEMBLER_RECIPES.recipeBuilder("spruce_stairs").EUt(4).duration(100).circuitMeta(7) - .inputItems(new ItemStack(Blocks.SPRUCE_PLANKS, 6)).outputItems(new ItemStack(Blocks.SPRUCE_STAIRS, 4)) - .save(provider); - ASSEMBLER_RECIPES.recipeBuilder("birch_stairs").EUt(4).duration(100).circuitMeta(7) - .inputItems(new ItemStack(Blocks.BIRCH_PLANKS, 6)).outputItems(new ItemStack(Blocks.BIRCH_STAIRS, 4)) - .save(provider); - ASSEMBLER_RECIPES.recipeBuilder("jungle_stairs").EUt(4).duration(100).circuitMeta(7) - .inputItems(new ItemStack(Blocks.JUNGLE_PLANKS, 6)).outputItems(new ItemStack(Blocks.JUNGLE_STAIRS, 4)) - .save(provider); - ASSEMBLER_RECIPES.recipeBuilder("acacia_stairs").EUt(4).duration(100).circuitMeta(7) - .inputItems(new ItemStack(Blocks.ACACIA_PLANKS, 6)).outputItems(new ItemStack(Blocks.ACACIA_STAIRS, 4)) - .save(provider); - ASSEMBLER_RECIPES.recipeBuilder("dark_oak_stairs").EUt(4).duration(100).circuitMeta(7) - .inputItems(new ItemStack(Blocks.DARK_OAK_PLANKS, 6)) - .outputItems(new ItemStack(Blocks.DARK_OAK_STAIRS, 4)).save(provider); - ASSEMBLER_RECIPES.recipeBuilder("ladder").EUt(4).duration(40).circuitMeta(7) .inputItems(new ItemStack(Items.STICK, 7)).outputItems(new ItemStack(Blocks.LADDER, 2)).save(provider); @@ -819,6 +715,15 @@ private static void metalRecipes(Consumer provider) { .duration(100).EUt(4) .save(provider); + VanillaRecipeHelper.addShapedRecipe(provider, "leather_horse_armor", new ItemStack(Items.LEATHER_HORSE_ARMOR), + "hdH", + "PCP", "LSL", + 'H', new ItemStack(Items.LEATHER_HELMET), + 'P', new ItemStack(Items.LEATHER), + 'C', new ItemStack(Items.LEATHER_CHESTPLATE), + 'L', new ItemStack(Items.LEATHER_LEGGINGS), + 'S', new UnificationEntry(screw, Iron)); + VanillaRecipeHelper.addShapedRecipe(provider, "iron_horse_armor", new ItemStack(Items.IRON_HORSE_ARMOR), "hdH", "PCP", "LSL", 'H', new ItemStack(Items.IRON_HELMET), @@ -944,6 +849,15 @@ private static void miscRecipes(Consumer provider) { .inputItems(new ItemStack(Items.STRING, 3)) .inputItems(Items.STICK, 3) .outputItems(new ItemStack(Items.BOW, 1)) + .circuitMeta(10) + .duration(100).EUt(4).save(provider); + + ASSEMBLER_RECIPES.recipeBuilder("crossbow") + .inputItems(new ItemStack(Items.STRING, 2)) + .inputItems(Items.STICK, 3) + .inputItems(Items.TRIPWIRE_HOOK) + .outputItems(new ItemStack(Items.CROSSBOW, 1)) + .circuitMeta(11) .duration(100).EUt(4).save(provider); FLUID_SOLIDFICATION_RECIPES.recipeBuilder("snowball").duration(128).EUt(4).notConsumable(SHAPE_MOLD_BALL) @@ -1177,6 +1091,12 @@ private static void miscRecipes(Consumer provider) { ASSEMBLER_RECIPES.recipeBuilder("hopper_minecart").EUt(4).duration(100) .inputItems(new ItemStack(Items.MINECART)).inputItems(new ItemStack(Blocks.HOPPER)) .outputItems(new ItemStack(Items.HOPPER_MINECART)).save(provider); + + ASSEMBLER_RECIPES.recipeBuilder("conduit") + .inputItems(new ItemStack(Items.HEART_OF_THE_SEA)) + .inputItems(new ItemStack(Items.NAUTILUS_SHELL, 8)) + .outputItems(new ItemStack(Blocks.CONDUIT)) + .duration(200).EUt(16).save(provider); } /** 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 8c5c442418..7b4c93c92e 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 @@ -825,14 +825,18 @@ private static void registerGTWoodRecipes(Consumer provider) { 'L', GTBlocks.TREATED_WOOD_PLANK.asItem()); } - VanillaRecipeHelper.addShapelessRecipe(provider, "rubber_button", GTBlocks.RUBBER_BUTTON.asStack(), - GTBlocks.RUBBER_PLANK.asStack()); - VanillaRecipeHelper.addShapelessRecipe(provider, "treated_wood_button", GTBlocks.TREATED_WOOD_BUTTON.asStack(), - GTBlocks.TREATED_WOOD_PLANK.asStack()); - VanillaRecipeHelper.addShapedRecipe(provider, "rubber_pressure_plate", GTBlocks.RUBBER_PRESSURE_PLATE.asStack(), - "aa", 'a', GTBlocks.RUBBER_PLANK.asStack()); - VanillaRecipeHelper.addShapedRecipe(provider, "treated_wood_plate", - GTBlocks.TREATED_WOOD_PRESSURE_PLATE.asStack(), "aa", 'a', GTBlocks.TREATED_WOOD_PLANK.asStack()); + if (!ConfigHolder.INSTANCE.recipes.hardRedstoneRecipes) { + VanillaRecipeHelper.addShapelessRecipe(provider, "rubber_button", GTBlocks.RUBBER_BUTTON.asStack(), + GTBlocks.RUBBER_PLANK.asStack()); + VanillaRecipeHelper.addShapelessRecipe(provider, "treated_wood_button", + GTBlocks.TREATED_WOOD_BUTTON.asStack(), + GTBlocks.TREATED_WOOD_PLANK.asStack()); + VanillaRecipeHelper.addShapedRecipe(provider, "rubber_pressure_plate", + GTBlocks.RUBBER_PRESSURE_PLATE.asStack(), + "aa", 'a', GTBlocks.RUBBER_PLANK.asStack()); + VanillaRecipeHelper.addShapedRecipe(provider, "treated_wood_plate", + GTBlocks.TREATED_WOOD_PRESSURE_PLATE.asStack(), "aa", 'a', GTBlocks.TREATED_WOOD_PLANK.asStack()); + } // add Recipes for rubber log if (ConfigHolder.INSTANCE.recipes.nerfWoodCrafting) { @@ -894,6 +898,9 @@ private static void hardWoodTypeRecipes(Consumer registry, @No if (entry.boatRecipeName != null) { registry.accept(new ResourceLocation(entry.modid, entry.boatRecipeName)); } + if (entry.chestBoatRecipeName != null) { + registry.accept(new ResourceLocation(entry.modid, entry.chestBoatRecipeName)); + } } } if (entry.fence != null) { diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/serialized/chemistry/BrewingRecipes.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/serialized/chemistry/BrewingRecipes.java index 925df7f9a8..b870cad00a 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/serialized/chemistry/BrewingRecipes.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/serialized/chemistry/BrewingRecipes.java @@ -58,6 +58,24 @@ public static void init(Consumer provider) { .inputFluids(Water.getFluid(20)).outputFluids(Biomass.getFluid(20)).save(provider); BREWING_RECIPES.recipeBuilder("biomass_from_bio_chaff").EUt(4).duration(128).inputItems(BIO_CHAFF) .inputFluids(Water.getFluid(750)).outputFluids(Biomass.getFluid(750)).save(provider); - // TODO 1.13+ plants + BREWING_RECIPES.recipeBuilder("biomass_from_kelp").duration(160).EUt(3).inputItems(Blocks.KELP.asItem()) + .inputFluids(Water.getFluid(20)).outputFluids(Biomass.getFluid(20)).save(provider); + BREWING_RECIPES.recipeBuilder("biomass_from_sea_pickle").duration(160).EUt(3) + .inputItems(Blocks.SEA_PICKLE.asItem()) + .inputFluids(Water.getFluid(20)).outputFluids(Biomass.getFluid(20)).save(provider); + BREWING_RECIPES.recipeBuilder("biomass_from_sweet_berries").duration(160).EUt(3).inputItems(Items.SWEET_BERRIES) + .inputFluids(Water.getFluid(20)).outputFluids(Biomass.getFluid(20)).save(provider); + BREWING_RECIPES.recipeBuilder("biomass_from_crimson_fungus").duration(160).EUt(3) + .inputItems(Items.CRIMSON_FUNGUS) + .inputFluids(Water.getFluid(20)).outputFluids(Biomass.getFluid(20)).save(provider); + BREWING_RECIPES.recipeBuilder("biomass_from_warped_fungus").duration(160).EUt(3).inputItems(Items.WARPED_FUNGUS) + .inputFluids(Water.getFluid(20)).outputFluids(Biomass.getFluid(20)).save(provider); + BREWING_RECIPES.recipeBuilder("biomass_from_glow_berries").duration(160).EUt(3).inputItems(Items.GLOW_BERRIES) + .inputFluids(Water.getFluid(20)).outputFluids(Biomass.getFluid(20)).save(provider); + BREWING_RECIPES.recipeBuilder("biomass_from_pitcher_pod").duration(160).EUt(3).inputItems(Items.PITCHER_POD) + .inputFluids(Water.getFluid(20)).outputFluids(Biomass.getFluid(20)).save(provider); + BREWING_RECIPES.recipeBuilder("biomass_from_torchflower_seeds").duration(160).EUt(3) + .inputItems(Items.TORCHFLOWER_SEEDS) + .inputFluids(Water.getFluid(20)).outputFluids(Biomass.getFluid(20)).save(provider); } } From e395e90143804355e6706d91a77983df4662d5a8 Mon Sep 17 00:00:00 2001 From: Electrolyte <21316184+Electrolyte220@users.noreply.github.com> Date: Fri, 11 Oct 2024 02:38:37 -0400 Subject: [PATCH 109/141] Rubber Wood/Log Fixes (#2097) --- .../data/gtceu/tags/items/rubber_logs.json | 8 ++++++ .../gtceu/common/block/RubberLogBlock.java | 17 +++++++++++ .../gtceu/common/block/RubberWoodBlock.java | 28 +++++++++++++++++++ .../gtceu/common/data/GTBlocks.java | 12 ++++---- .../gtceu/data/recipe/CustomTags.java | 2 +- .../recipe/misc/CraftingRecipeLoader.java | 2 -- .../data/recipe/misc/WoodMachineRecipes.java | 26 ++++------------- 7 files changed, 66 insertions(+), 29 deletions(-) create mode 100644 src/generated/resources/data/gtceu/tags/items/rubber_logs.json create mode 100644 src/main/java/com/gregtechceu/gtceu/common/block/RubberWoodBlock.java diff --git a/src/generated/resources/data/gtceu/tags/items/rubber_logs.json b/src/generated/resources/data/gtceu/tags/items/rubber_logs.json new file mode 100644 index 0000000000..9598805d7d --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/items/rubber_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "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/block/RubberLogBlock.java b/src/main/java/com/gregtechceu/gtceu/common/block/RubberLogBlock.java index 4573241aa7..57c4ccbc1d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/block/RubberLogBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/common/block/RubberLogBlock.java @@ -1,11 +1,18 @@ package com.gregtechceu.gtceu.common.block; +import com.gregtechceu.gtceu.common.data.GTBlocks; + import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.RotatedPillarBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraftforge.common.ToolAction; +import net.minecraftforge.common.ToolActions; + +import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -36,4 +43,14 @@ public BlockState changeNatural(BlockState state, boolean natural) { } return state; } + + @Override + public @Nullable BlockState getToolModifiedState(BlockState state, UseOnContext context, ToolAction toolAction, + boolean simulate) { + if (toolAction == ToolActions.AXE_STRIP) { + return GTBlocks.STRIPPED_RUBBER_LOG.getDefaultState().setValue(RotatedPillarBlock.AXIS, + state.getValue(RotatedPillarBlock.AXIS)); + } + return super.getToolModifiedState(state, context, toolAction, simulate); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/block/RubberWoodBlock.java b/src/main/java/com/gregtechceu/gtceu/common/block/RubberWoodBlock.java new file mode 100644 index 0000000000..afcdb28b48 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/block/RubberWoodBlock.java @@ -0,0 +1,28 @@ +package com.gregtechceu.gtceu.common.block; + +import com.gregtechceu.gtceu.common.data.GTBlocks; + +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.ToolAction; +import net.minecraftforge.common.ToolActions; + +import org.jetbrains.annotations.Nullable; + +public class RubberWoodBlock extends RotatedPillarBlock { + + public RubberWoodBlock(Properties properties) { + super(properties); + } + + @Override + public @Nullable BlockState getToolModifiedState(BlockState state, UseOnContext context, ToolAction toolAction, + boolean simulate) { + if (toolAction == ToolActions.AXE_STRIP) { + return GTBlocks.STRIPPED_RUBBER_WOOD.getDefaultState().setValue(RotatedPillarBlock.AXIS, + state.getValue(RotatedPillarBlock.AXIS)); + } + return super.getToolModifiedState(state, context, toolAction, simulate); + } +} 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 2d138d3821..a52c55369b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java @@ -1024,7 +1024,7 @@ private static BlockEntry createFireboxCasing(BoilerFireboxType typ .tag(BlockTags.LOGS_THAT_BURN, BlockTags.OVERWORLD_NATURAL_LOGS) .blockstate((ctx, provider) -> provider.logBlock(ctx.get())) .item() - .tag(ItemTags.LOGS_THAT_BURN) + .tag(ItemTags.LOGS_THAT_BURN, CustomTags.RUBBER_LOGS) .onRegister(compassNode(GTCompassSections.GENERATIONS)) .build() .register(); @@ -1076,18 +1076,18 @@ public static ItemColor leavesItemColor() { .blockstate((ctx, provider) -> provider.logBlock(ctx.get())) .tag(BlockTags.LOGS_THAT_BURN, BlockTags.MINEABLE_WITH_AXE) .item() - .tag(ItemTags.LOGS_THAT_BURN) + .tag(ItemTags.LOGS_THAT_BURN, CustomTags.RUBBER_LOGS) .build() .register(); - public static final BlockEntry RUBBER_WOOD = REGISTRATE - .block("rubber_wood", RotatedPillarBlock::new) + public static final BlockEntry RUBBER_WOOD = REGISTRATE + .block("rubber_wood", RubberWoodBlock::new) .initialProperties(() -> Blocks.SPRUCE_WOOD) .lang("Rubber Wood") .blockstate((ctx, provider) -> provider.axisBlock(ctx.get(), provider.blockTexture(GTBlocks.RUBBER_LOG.get()), provider.blockTexture(GTBlocks.RUBBER_LOG.get()))) .tag(BlockTags.LOGS_THAT_BURN, BlockTags.MINEABLE_WITH_AXE) .item() - .tag(ItemTags.LOGS_THAT_BURN) + .tag(ItemTags.LOGS_THAT_BURN, CustomTags.RUBBER_LOGS) .build() .register(); public static final BlockEntry STRIPPED_RUBBER_WOOD = REGISTRATE @@ -1098,7 +1098,7 @@ public static ItemColor leavesItemColor() { provider.blockTexture(ctx.get()))) .tag(BlockTags.LOGS_THAT_BURN, BlockTags.MINEABLE_WITH_AXE) .item() - .tag(ItemTags.LOGS_THAT_BURN) + .tag(ItemTags.LOGS_THAT_BURN, CustomTags.RUBBER_LOGS) .build() .register(); diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/CustomTags.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/CustomTags.java index 579c7a25ae..547e632ad6 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/CustomTags.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/CustomTags.java @@ -101,7 +101,7 @@ public class CustomTags { public static final TagKey PPE_ARMOR = TagUtil.createModItemTag("ppe_armor"); public static final TagKey STEP_BOOTS = TagUtil.createModItemTag("step_boots"); - + public static final TagKey RUBBER_LOGS = TagUtil.createModItemTag("rubber_logs"); // Platform-dependent tags public static final TagKey NEEDS_WOOD_TOOL = TagUtil.createBlockTag("needs_wood_tool"); public static final TagKey NEEDS_GOLD_TOOL = TagUtil.createBlockTag("needs_gold_tool"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CraftingRecipeLoader.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CraftingRecipeLoader.java index 62554759b5..c3e07eb44b 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CraftingRecipeLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CraftingRecipeLoader.java @@ -94,8 +94,6 @@ public static void init(Consumer provider) { // Items.PAPER, 'R', new UnificationEntry(springSmall, Iron), 'B', new UnificationEntry(bolt, Iron), 'S', new // UnificationEntry(screw, Iron), 'W', new UnificationEntry(plate, Wood)); - VanillaRecipeHelper.addShapelessRecipe(provider, "rubber_wood_planks", GTBlocks.RUBBER_PLANK.asStack(4), - GTBlocks.RUBBER_LOG.asStack()); VanillaRecipeHelper.addShapedRecipe(provider, "treated_wood_planks", GTBlocks.TREATED_WOOD_PLANK.asStack(8), "PPP", "PBP", "PPP", 'P', ItemTags.PLANKS, 'B', Creosote.getBucket()); 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 7b4c93c92e..654b938704 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 @@ -263,7 +263,6 @@ private static List getDefaultEntries() { .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() .build(), @@ -838,26 +837,13 @@ private static void registerGTWoodRecipes(Consumer provider) { GTBlocks.TREATED_WOOD_PRESSURE_PLATE.asStack(), "aa", 'a', GTBlocks.TREATED_WOOD_PLANK.asStack()); } - // add Recipes for rubber log - if (ConfigHolder.INSTANCE.recipes.nerfWoodCrafting) { - VanillaRecipeHelper.addShapelessRecipe(provider, "rubber_planks", - GTBlocks.RUBBER_PLANK.asStack(2), GTBlocks.RUBBER_LOG.asItem()); - } else { - VanillaRecipeHelper.addShapelessRecipe(provider, "rubber_planks", - GTBlocks.RUBBER_PLANK.asStack(4), GTBlocks.RUBBER_LOG.asItem()); - } + VanillaRecipeHelper.addShapedRecipe(provider, "rubber_wood", + GTBlocks.RUBBER_WOOD.asStack(3), + "LL", "LL", 'L', GTBlocks.RUBBER_LOG.asStack()); - VanillaRecipeHelper.addShapedRecipe(provider, "rubber_planks_saw", - GTBlocks.RUBBER_PLANK.asStack(ConfigHolder.INSTANCE.recipes.nerfWoodCrafting ? 4 : 6), - "s", "L", 'L', GTBlocks.RUBBER_LOG.asItem()); - - CUTTER_RECIPES.recipeBuilder("rubber_planks") - .inputItems(GTBlocks.RUBBER_LOG.asItem()) - .outputItems(GTBlocks.RUBBER_PLANK.asStack(6)) - .outputItems(dust, Wood, 2) - .duration(200) - .EUt(VA[ULV]) - .save(provider); + VanillaRecipeHelper.addShapedRecipe(provider, "stripped_rubber_wood", + GTBlocks.STRIPPED_RUBBER_WOOD.asStack(3), + "LL", "LL", 'L', GTBlocks.STRIPPED_RUBBER_LOG.asStack()); } public static void hardWoodRecipes(Consumer registry) { From 64c99e9081b73c448727daa967a4fab8f2b1b54e Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Fri, 11 Oct 2024 01:58:24 -0600 Subject: [PATCH 110/141] Fix Frame Block being deleted upon shift-click with pipe (#2131) --- .../java/com/gregtechceu/gtceu/api/block/MaterialBlock.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/MaterialBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/MaterialBlock.java index 7aa8bfc7e9..aaebc50944 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MaterialBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MaterialBlock.java @@ -240,7 +240,8 @@ public boolean removeFrame(Level level, BlockPos pos, Player player, ItemStack s @Override public boolean canBeReplaced(BlockState state, BlockPlaceContext useContext) { - if (this.tagPrefix == TagPrefix.frameGt && useContext.getItemInHand().getItem() instanceof PipeBlockItem) + if (this.tagPrefix == TagPrefix.frameGt && useContext.getItemInHand().getItem() instanceof PipeBlockItem && + !useContext.getPlayer().isCrouching()) return true; return super.canBeReplaced(state, useContext); } From e34c72ed88e4445f1a14bcde00760547f03fbe76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dumitru=20Mi=C8=9Bca?= Date: Sat, 12 Oct 2024 01:18:27 +0300 Subject: [PATCH 111/141] Fix Heat Capacity not showing in ABS and EBF (#2134) --- .../common/data/machines/GCyMMachines.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GCyMMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GCyMMachines.java index 483156618c..3ea4db81d4 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GCyMMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GCyMMachines.java @@ -18,9 +18,12 @@ import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; import com.gregtechceu.gtceu.common.data.*; import com.gregtechceu.gtceu.common.machine.multiblock.part.ParallelHatchPartMachine; +import com.gregtechceu.gtceu.utils.FormattingUtil; +import net.minecraft.ChatFormatting; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; import net.minecraft.world.level.block.Blocks; import java.util.ArrayList; @@ -495,6 +498,18 @@ public static void init() {} }) .workableCasingRenderer(GTCEu.id("block/casings/gcym/high_temperature_smelting_casing"), GTCEu.id("block/multiblock/gcym/blast_alloy_smelter")) + .additionalDisplay((controller, components) -> { + if (controller instanceof CoilWorkableElectricMultiblockMachine coilMachine && controller.isFormed()) { + components.add(Component.translatable("gtceu.multiblock.blast_furnace.max_temperature", + Component + .translatable( + FormattingUtil + .formatNumbers(coilMachine.getCoilType().getCoilTemperature() + + 100L * Math.max(0, coilMachine.getTier() - GTValues.MV)) + + "K") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED)))); + } + }) .compassSections(GTCompassSections.TIER[IV]) .compassNodeSelf() .register(); @@ -945,6 +960,18 @@ public static void init() {} }) .workableCasingRenderer(GTCEu.id("block/casings/gcym/high_temperature_smelting_casing"), GTCEu.id("block/multiblock/gcym/mega_blast_furnace")) + .additionalDisplay((controller, components) -> { + if (controller instanceof CoilWorkableElectricMultiblockMachine coilMachine && controller.isFormed()) { + components.add(Component.translatable("gtceu.multiblock.blast_furnace.max_temperature", + Component + .translatable( + FormattingUtil + .formatNumbers(coilMachine.getCoilType().getCoilTemperature() + + 100L * Math.max(0, coilMachine.getTier() - GTValues.MV)) + + "K") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED)))); + } + }) .compassSections(GTCompassSections.TIER[LuV]) .compassNodeSelf() .register(); From 48e2f378ead0b1868d254625396375779fe074b1 Mon Sep 17 00:00:00 2001 From: Spicierspace153 Date: Fri, 11 Oct 2024 16:19:26 -0600 Subject: [PATCH 112/141] Add Storage Cover (#1990) Co-authored-by: Spicierspace153 <21964509+Spicierspace153@users.noreply.github.com> Co-authored-by: JuiceyBeans <75553966+JuiceyBeans@users.noreply.github.com> Co-authored-by: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> --- .../compass/nodes/covers/storage_cover.json | 18 +++ .../gtceu/compass/nodes/materials/frame.json | 1 - .../resources/assets/gtceu/lang/en_ud.json | 4 + .../resources/assets/gtceu/lang/en_us.json | 4 + .../gtceu/models/item/storage_cover.json | 6 + .../gtceu/api/cover/CoverBehavior.java | 5 + .../gtceu/api/data/tag/TagPrefix.java | 1 - .../api/machine/feature/IFancyUIMachine.java | 11 ++ .../gtceu/common/cover/StorageCover.java | 120 ++++++++++++++++++ .../gtceu/common/data/GTCovers.java | 3 + .../gtceu/common/data/GTItems.java | 6 + .../gtceu/data/lang/LangHandler.java | 1 + .../data/recipe/misc/MachineRecipeLoader.java | 27 ++-- .../textures/block/cover/storage_cover.png | Bin 0 -> 821 bytes .../gtceu/textures/item/storage_cover.png | Bin 0 -> 862 bytes 15 files changed, 187 insertions(+), 20 deletions(-) create mode 100644 src/generated/resources/assets/gtceu/compass/nodes/covers/storage_cover.json create mode 100644 src/generated/resources/assets/gtceu/models/item/storage_cover.json create mode 100644 src/main/java/com/gregtechceu/gtceu/common/cover/StorageCover.java create mode 100644 src/main/resources/assets/gtceu/textures/block/cover/storage_cover.png create mode 100644 src/main/resources/assets/gtceu/textures/item/storage_cover.png diff --git a/src/generated/resources/assets/gtceu/compass/nodes/covers/storage_cover.json b/src/generated/resources/assets/gtceu/compass/nodes/covers/storage_cover.json new file mode 100644 index 0000000000..64b589ad73 --- /dev/null +++ b/src/generated/resources/assets/gtceu/compass/nodes/covers/storage_cover.json @@ -0,0 +1,18 @@ +{ + "button_texture": { + "type": "item", + "res": "gtceu:storage_cover" + }, + "items": [ + "gtceu:storage_cover" + ], + "page": "gtceu:covers/storage_cover", + "position": [ + -300, + 150 + ], + "pre_nodes": [ + "gtceu:covers/cover" + ], + "section": "gtceu:covers" +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/compass/nodes/materials/frame.json b/src/generated/resources/assets/gtceu/compass/nodes/materials/frame.json index 39cfd375c8..c21b6fad61 100644 --- a/src/generated/resources/assets/gtceu/compass/nodes/materials/frame.json +++ b/src/generated/resources/assets/gtceu/compass/nodes/materials/frame.json @@ -4,7 +4,6 @@ "res": "gtceu:aluminium_frame" }, "items": [ - "#minecraft:climbable", "#forge:frames" ], "page": "gtceu:materials/frame", diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index f1fbfd262b..dc93d564a0 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -1838,6 +1838,7 @@ "compass.node.gtceu.covers/robot_arm": "ɯɹⱯ ʇoqoᴚ", "compass.node.gtceu.covers/shutter_module_cover": "ɹǝʌoƆ ǝןnpoW ɹǝʇʇnɥS", "compass.node.gtceu.covers/solar_panel": "ןǝuɐԀ ɹɐןoS", + "compass.node.gtceu.covers/storage_cover": "ɹǝʌoƆ ǝbɐɹoʇS", "compass.node.gtceu.ev/cracker": "ɹǝʞɔɐɹƆ", "compass.node.gtceu.ev/distillation_tower": "ɹǝʍo⟘ uoıʇɐןןıʇsıᗡ", "compass.node.gtceu.ev/large_combustion": "uoıʇsnqɯoƆ ǝbɹɐꞀ", @@ -2266,6 +2267,7 @@ "config.gtceu.option.hardGlassRecipes": "sǝdıɔǝᴚssɐן⅁pɹɐɥ", "config.gtceu.option.hardIronRecipes": "sǝdıɔǝᴚuoɹIpɹɐɥ", "config.gtceu.option.hardMiscRecipes": "sǝdıɔǝᴚɔsıWpɹɐɥ", + "config.gtceu.option.hardMultiRecipes": "sǝdıɔǝᴚıʇןnWpɹɐɥ", "config.gtceu.option.hardRedstoneRecipes": "sǝdıɔǝᴚǝuoʇspǝᴚpɹɐɥ", "config.gtceu.option.hardToolArmorRecipes": "sǝdıɔǝᴚɹoɯɹⱯןoo⟘pɹɐɥ", "config.gtceu.option.hardWoodRecipes": "sǝdıɔǝᴚpooMpɹɐɥ", @@ -2521,6 +2523,7 @@ "cover.smart_item_filter.filtering_mode.electrolyzer": "ɹǝzʎןoɹʇɔǝןƎ", "cover.smart_item_filter.filtering_mode.sifter": "ɹǝʇɟıS", "cover.smart_item_filter.title": "ɹǝʇןıℲ ɯǝʇI ʇɹɐɯS", + "cover.storage.title": "ɹǝʌoƆ ǝbɐɹoʇS", "cover.universal.manual_import_export.mode.description.0": " ˙ɹǝʇןıɟ sʇı puɐ ɹǝʌoɔ ǝɥʇ ʎq pǝıɟıɔǝds sɐ ǝʌoɯ ʎןuo ןןıʍ spınןɟ/sɯǝʇI - ɹ§pǝןqɐsıᗡǝ§", "cover.universal.manual_import_export.mode.description.1": " ˙)ʎuɐ ɟı( sǝɥɔʇɐɯ ɹǝʇןıɟ sʇı sɐ buoן sɐ 'ǝpoɯ ɹǝʌoɔ ǝɥʇ ɟo ʎןʇuǝpuǝdǝpuı pǝʇɹǝsuı puɐ pǝʇɔɐɹʇxǝ ǝq uɐɔ spınןɟ/sɯǝʇI - ɹ§pǝɹǝʇןıℲ ʍoןןⱯǝ§", "cover.universal.manual_import_export.mode.description.2": "ɹǝʌoɔ sıɥʇ ʎq pǝʇɔɐɹʇxǝ ɹo pǝʇɹǝsuı sɯǝʇı ǝɥʇ oʇ sǝıןddɐ ɹǝʇןıℲ ˙ǝpoɯ ɹǝʌoɔ ǝɥʇ ɟo ʎןʇuǝpuǝdǝpuı pǝʌoɯ ǝq uɐɔ spınןɟ/sɯǝʇI - ɹ§pǝɹǝʇןıɟu∩ ʍoןןⱯǝ§", @@ -4808,6 +4811,7 @@ "item.gtceu.stem_cells": "sןןǝƆ ɯǝʇS", "item.gtceu.stem_cells.tooltip": "ǝɔuǝbıןןǝʇuI ʍɐᴚㄥ§", "item.gtceu.sticky_resin": "uısǝᴚ ʎʞɔıʇS", + "item.gtceu.storage_cover": "ɹǝʌoƆ ǝbɐɹoʇS", "item.gtceu.sugar_gem": "ǝqnƆ ɹɐbnS", "item.gtceu.sus_record": "ɔsıᗡ ɔısnW", "item.gtceu.sus_record.desc": "¡ʎssns", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index aea3d283dd..8809e4ffb1 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -1838,6 +1838,7 @@ "compass.node.gtceu.covers/robot_arm": "Robot Arm", "compass.node.gtceu.covers/shutter_module_cover": "Shutter Module Cover", "compass.node.gtceu.covers/solar_panel": "Solar Panel", + "compass.node.gtceu.covers/storage_cover": "Storage Cover", "compass.node.gtceu.ev/cracker": "Cracker", "compass.node.gtceu.ev/distillation_tower": "Distillation Tower", "compass.node.gtceu.ev/large_combustion": "Large Combustion", @@ -2266,6 +2267,7 @@ "config.gtceu.option.hardGlassRecipes": "hardGlassRecipes", "config.gtceu.option.hardIronRecipes": "hardIronRecipes", "config.gtceu.option.hardMiscRecipes": "hardMiscRecipes", + "config.gtceu.option.hardMultiRecipes": "hardMultiRecipes", "config.gtceu.option.hardRedstoneRecipes": "hardRedstoneRecipes", "config.gtceu.option.hardToolArmorRecipes": "hardToolArmorRecipes", "config.gtceu.option.hardWoodRecipes": "hardWoodRecipes", @@ -2521,6 +2523,7 @@ "cover.smart_item_filter.filtering_mode.electrolyzer": "Electrolyzer", "cover.smart_item_filter.filtering_mode.sifter": "Sifter", "cover.smart_item_filter.title": "Smart Item Filter", + "cover.storage.title": "Storage Cover", "cover.universal.manual_import_export.mode.description.0": "§eDisabled§r - Items/fluids will only move as specified by the cover and its filter. ", "cover.universal.manual_import_export.mode.description.1": "§eAllow Filtered§r - Items/fluids can be extracted and inserted independently of the cover mode, as long as its filter matches (if any). ", "cover.universal.manual_import_export.mode.description.2": "§eAllow Unfiltered§r - Items/fluids can be moved independently of the cover mode. Filter applies to the items inserted or extracted by this cover", @@ -4808,6 +4811,7 @@ "item.gtceu.stem_cells": "Stem Cells", "item.gtceu.stem_cells.tooltip": "§7Raw Intelligence", "item.gtceu.sticky_resin": "Sticky Resin", + "item.gtceu.storage_cover": "Storage Cover", "item.gtceu.sugar_gem": "Sugar Cube", "item.gtceu.sus_record": "Music Disc", "item.gtceu.sus_record.desc": "sussy!", diff --git a/src/generated/resources/assets/gtceu/models/item/storage_cover.json b/src/generated/resources/assets/gtceu/models/item/storage_cover.json new file mode 100644 index 0000000000..cd96978a8d --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/item/storage_cover.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "gtceu:item/storage_cover" + } +} \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java index 29587d813e..ce5c89e6ee 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java @@ -3,6 +3,7 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.factory.CoverUIFactory; +import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfigurator; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.item.tool.IToolGridHighLight; import com.gregtechceu.gtceu.client.renderer.cover.ICoverRenderer; @@ -180,6 +181,10 @@ public ICoverRenderer getCoverRenderer() { return coverDefinition.getCoverRenderer(); } + public @Nullable IFancyConfigurator getConfigurator() { + return null; + } + @Override public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, ItemStack held, Set toolTypes) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java b/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java index e644041030..4473a1d12f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java @@ -717,7 +717,6 @@ public static TagPrefix get(String name) { public static final TagPrefix frameGt = new TagPrefix("frame") .defaultTagPath("frames/%s") .unformattedTagPath("frames") - .unformattedTagPath("climbable", true) .langValue("%s Frame") .materialAmount(GTValues.M * 2) .materialIconType(MaterialIconType.frameGt) diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java index 97ecb6fcd6..5f8b568fec 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java @@ -3,6 +3,7 @@ import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.fancy.*; +import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.fancyconfigurator.CombinedDirectionalFancyConfigurator; import com.gregtechceu.gtceu.api.machine.fancyconfigurator.MachineModeFancyConfigurator; import com.gregtechceu.gtceu.api.machine.fancyconfigurator.OverclockFancyConfigurator; @@ -19,6 +20,7 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; import net.minecraftforge.api.distmarker.Dist; @@ -126,6 +128,15 @@ default void attachConfigurators(ConfiguratorPanel configuratorPanel) { if (this instanceof IOverclockMachine overclockMachine) { configuratorPanel.attachConfigurators(new OverclockFancyConfigurator(overclockMachine)); } + if (this instanceof MetaMachine machine) { + for (var direction : Direction.values()) { + if (machine.getCoverContainer().hasCover(direction)) { + var configurator = machine.getCoverContainer().getCoverAtSide(direction).getConfigurator(); + if (configurator != null) + configuratorPanel.attachConfigurators(configurator); + } + } + } } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/StorageCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/StorageCover.java new file mode 100644 index 0000000000..4b92b68965 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/StorageCover.java @@ -0,0 +1,120 @@ +package com.gregtechceu.gtceu.common.cover; + +import com.gregtechceu.gtceu.api.capability.ICoverable; +import com.gregtechceu.gtceu.api.cover.CoverBehavior; +import com.gregtechceu.gtceu.api.cover.CoverDefinition; +import com.gregtechceu.gtceu.api.cover.IUICover; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfigurator; + +import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; +import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; +import com.lowdragmc.lowdraglib.gui.widget.SlotWidget; +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.lowdragmc.lowdraglib.misc.ItemStackTransfer; +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.lowdragmc.lowdraglib.utils.LocalizationUtils; + +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class StorageCover extends CoverBehavior implements IUICover { + + @Persisted + @DescSynced + public final ItemStackTransfer inventory; + private final int SIZE = 18; + + public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(StorageCover.class, + CoverBehavior.MANAGED_FIELD_HOLDER); + + public StorageCover(@NotNull CoverDefinition definition, @NotNull ICoverable coverableView, + @NotNull Direction attachedSide) { + super(definition, coverableView, attachedSide); + inventory = new ItemStackTransfer(SIZE) { + + @Override + public int getSlotLimit(int slot) { + return 1; + } + }; + } + + @Override + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + @Override + public List getAdditionalDrops() { + var list = super.getAdditionalDrops(); + for (int slot = 0; slot < SIZE; slot++) { + list.add(inventory.getStackInSlot(slot)); + } + return list; + } + + @Override + public boolean canAttach() { + for (var dir : Direction.values()) { + if (coverHolder.hasCover(dir) && coverHolder.getCoverAtSide(dir) instanceof StorageCover) + return false; + } + return super.canAttach(); + } + + @Override + public Widget createUIWidget() { + final var group = new WidgetGroup(0, 0, 126, 87); + + group.addWidget(new LabelWidget(10, 5, LocalizationUtils.format(getUITitle()))); + + for (int slot = 0; slot < SIZE; slot++) { + group.addWidget(new SlotWidget(inventory, slot, 7 + (slot % 6) * 18, 21 + (slot / 6) * 18)); + } + + return group; + } + + private String getUITitle() { + return "cover.storage.title"; + } + + @Override + public @Nullable IFancyConfigurator getConfigurator() { + return new StorageCoverConfigurator(); + } + + private class StorageCoverConfigurator implements IFancyConfigurator { + + @Override + public Component getTitle() { + return Component.translatable("cover.storage.title"); + } + + @Override + public IGuiTexture getIcon() { + return GuiTextures.MAINTENANCE_ICON; + } + + @Override + public Widget createConfigurator() { + final var group = new WidgetGroup(0, 0, 126, 87); + + for (int slot = 0; slot < SIZE; slot++) { + group.addWidget(new SlotWidget(inventory, slot, 7 + (slot % 6) * 18, 21 + (slot / 6) * 18)); + } + + return group; + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTCovers.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTCovers.java index d743e72068..36fb5c432c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTCovers.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTCovers.java @@ -57,6 +57,9 @@ public class GTCovers { public final static CoverDefinition SHUTTER = register( "shutter", ShutterCover::new, new SimpleCoverRenderer(GTCEu.id("block/cover/overlay_shutter"))); + public final static CoverDefinition COVER_STORAGE = register( + "storage", StorageCover::new, + new SimpleCoverRenderer(GTCEu.id("block/cover/storage_cover"))); public final static CoverDefinition[] CONVEYORS = registerTiered( "conveyor", ConveyorCover::new, 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 b0fb04aa66..ca7e462a88 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java @@ -2204,6 +2204,12 @@ public Component getItemName(ItemStack stack) { .onRegister(attach(new CoverPlaceBehavior(GTCovers.COMPUTER_MONITOR))) .onRegister(compassNode(GTCompassSections.COVERS, GTCompassNodes.COVER)) .register(); + public static ItemEntry COVER_STORAGE = REGISTRATE + .item("storage_cover", ComponentItem::create) + .lang("Storage Cover") + .onRegister(compassNode(GTCompassSections.COVERS, GTCompassNodes.COVER)) + .onRegister(attach(new CoverPlaceBehavior(GTCovers.COVER_STORAGE))) + .register(); public static ItemEntry COVER_SHUTTER = REGISTRATE .item("shutter_module_cover", ComponentItem::create) .lang("Shutter Module") diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index a3cc3744a8..fb2575736f 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -338,6 +338,7 @@ public static void init(RegistrateLangProvider provider) { provider.add("cover.fluid_filter.mode.filter_drain", "Filter Drain"); provider.add("cover.fluid_filter.mode.filter_both", "Filter Fill & Drain"); provider.add("cover.item_filter.title", "Item Filter"); + provider.add("cover.storage.title", "Storage Cover"); provider.add("cover.filter.mode.filter_insert", "Filter Insert"); provider.add("cover.filter.mode.filter_extract", "Filter Extract"); provider.add("cover.filter.mode.filter_both", "Filter Insert/Extract"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MachineRecipeLoader.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MachineRecipeLoader.java index d6eda43c39..79679a8450 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MachineRecipeLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MachineRecipeLoader.java @@ -508,14 +508,6 @@ private static void registerAssemblerRecipes(Consumer provider) .EUt(16).duration(100) .save(provider); - // TODO Crafting station, crafting cover - // ASSEMBLER_RECIPES.recipeBuilder("cover_crafting") - // .inputItems(WORKBENCH) - // .inputItems(plate, material) - // .outputItems(COVER_CRAFTING) - // .EUt(16).duration(100) - // .save(provider); - FluidStack solder = SolderingAlloy.getFluid(L / 2); ASSEMBLER_RECIPES.recipeBuilder("cover_machine_controller") @@ -628,16 +620,15 @@ private static void registerAssemblerRecipes(Consumer provider) .EUt(VA[HV]).duration(320) .save(provider); - // TODO Storage cover - // ASSEMBLER_RECIPES.recipeBuilder() - // .inputItems(OreDictNames.chestWood.toString()) - // .inputItems(ELECTRIC_PISTON_LV) - // .inputItems(plate, Iron) - // .inputFluids(SolderingAlloy.getFluid(72)) - // .outputItems(COVER_STORAGE) - // .EUt(16) - // .duration(100) - // .save(provider); + ASSEMBLER_RECIPES.recipeBuilder("cover_storage") + .inputItems(Tags.Blocks.CHESTS_WOODEN) + .inputItems(ELECTRIC_PISTON_LV) + .inputItems(plate, Iron) + .inputFluids(SolderingAlloy.getFluid(72)) + .outputItems(COVER_STORAGE) + .EUt(16) + .duration(100) + .save(provider); ASSEMBLER_RECIPES.recipeBuilder("casing_ulv").EUt(16).inputItems(plate, WroughtIron, 8) .outputItems(GTBlocks.MACHINE_CASING_ULV.asStack()).circuitMeta(8).duration(25).save(provider); diff --git a/src/main/resources/assets/gtceu/textures/block/cover/storage_cover.png b/src/main/resources/assets/gtceu/textures/block/cover/storage_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..ad3eddc72fd27e4c697cd3f072754055e0d1affa GIT binary patch literal 821 zcmV-51Iqk~P)EX>4Tx04R}tkv&MmKpe$iQ>7{u2Rn!;W~eS&5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|?BJy6A|?JWEwqU7;J6>}?mh0_0YbING^=eK&~)2O z#G+yN)r`depGZ8*4AUmwAfDc| z4bJ<-A(od_;&b9LlP*a7$aSU8Z=7>33p_JqCKL0-A!0Gt!b%IXyr~gS5rteDHam6ANBC}yMBpW3b_hk zk6|FN3)Cu(^L^|%wG+Vq3|#3=f2j)0e3D*i zYT+ZGXB)VeSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{009k2L_t(I%iWT_N&`U<$A9;=d%@(uAeI(_g=N6b%4hHi zd;`TtNMmg++S&OSc0%k#6bnIAg2*P>>~VK{YjJRx1kbcO%`nV=e#3mgpEvJ&u+!Ui z%M{%V?&`X5KDpl$P>xC3ZAOzx?OP(o6cJa0Y(~ETkj}8S;(^n26ALK134rExEPzv037a>0H{oIah*2sVWdQo0!cFf>!7tU5_47@8?TkoTn;Mts) z4@;UwJQ@u|yxZ!GjgPdoxv|tEJv=>o{2%)Qc!OZJz|Nso00000NkvXXu0mjf9g$@U literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/item/storage_cover.png b/src/main/resources/assets/gtceu/textures/item/storage_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..a5726cfe95cfe3fb1f85981120c9b05ab478a6ad GIT binary patch literal 862 zcmV-k1EKthP)EX>4Tx04R}tkv&MmKpe$iQ>7{u2Rn!;W~eS&5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|?BJy6A|?JWEwqU7;J6>}?mh0_0YbING^=eK&~)2O z#G+yN)r`depGZ8*4AUmwAfDc| z4bJ<-A(od_;&b9LlP*a7$aSU8Z=7>33p_JqCKL0-A!0Gt!b%IXyr~gS5rteDHam6ANBC}yMBpW3b_hk zk6|FN3)Cu(^L^|%wG+Vq3|#3=f2j)0e3D*i zYT+ZGXB)VeSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00A~hL_t(I%dL{VN&`U@g}?layBlVf5D-bVR(SxcU~8Ma zg0+<(K7!x_Sc_%)KprBcg{BWe(pb38EE_ioV-a@AlHC=>Q_b9S_~zc>!hb3V0viN@ z{f%D(==b~fFAq+q(^@mV42Q$gpw=1yr4(9gwAM@}69Ag~!Np>c8D$y_1{p91*e_mP zwDDV(Ph;?2>Jjok zqj)!KR*B#(UgI6PP`E|(mva@GD< oX+EFVas?rT6+)E4e)9jMZ{kIGMuJH$BLDyZ07*qoM6N<$f}3G()c^nh literal 0 HcmV?d00001 From 9e941fb51af168262245ca56c9fb157c6bfa4e9f Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Fri, 11 Oct 2024 16:20:18 -0600 Subject: [PATCH 113/141] Fix Debrominated brine not having any usage (#2133) --- .../gtceu/data/recipe/serialized/chemistry/BrineRecipes.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/serialized/chemistry/BrineRecipes.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/serialized/chemistry/BrineRecipes.java index bc7c31dbb4..c39619ba60 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/serialized/chemistry/BrineRecipes.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/serialized/chemistry/BrineRecipes.java @@ -81,7 +81,7 @@ private static void bromineProcess(Consumer provider) { CENTRIFUGE_RECIPES.recipeBuilder("debrominated_brine_decomposition") .inputFluids(DebrominatedBrine.getFluid(2000)) .outputFluids(SaltWater.getFluid(1000)) - .duration(60).EUt(VA[MV]); + .duration(60).EUt(VA[MV]).save(provider); } public static void iodineProcess(Consumer provider) { From 2b81b4af980e40313c91a61f8ddb8041e7cc9959 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Fri, 11 Oct 2024 16:21:30 -0600 Subject: [PATCH 114/141] Add placable surface rock items (#2132) Co-authored-by: screret <68943070+screret@users.noreply.github.com> --- .../resources/assets/gtceu/lang/en_ud.json | 1 + .../resources/assets/gtceu/lang/en_us.json | 1 + .../gtceu/api/item/SurfaceRockBlockItem.java | 40 ++++++ .../renderer/block/SurfaceRockRenderer.java | 18 ++- .../gtceu/common/block/SurfaceRockBlock.java | 14 +- .../gtceu/common/data/GTBlocks.java | 8 +- .../generated/MaterialRecipeHandler.java | 19 +++ .../gtceu/models/block/surface_rock.json | 135 +++++++++--------- 8 files changed, 164 insertions(+), 72 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/api/item/SurfaceRockBlockItem.java diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index dc93d564a0..9ddcad58dc 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -2333,6 +2333,7 @@ "config.gtceu.option.solarBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺɹɐןos", "config.gtceu.option.solidBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺpıןos", "config.gtceu.option.sprayCanChainLength": "ɥʇbuǝꞀuıɐɥƆuɐƆʎɐɹds", + "config.gtceu.option.steamMultiParallelAmount": "ʇunoɯⱯןǝןןɐɹɐԀıʇןnWɯɐǝʇs", "config.gtceu.option.steamPerWater": "ɹǝʇɐMɹǝԀɯɐǝʇs", "config.gtceu.option.steelBoilerHeatSpeed": "pǝǝdSʇɐǝHɹǝןıoᗺןǝǝʇs", "config.gtceu.option.steelBoilerMaxTemperature": "ǝɹnʇɐɹǝdɯǝ⟘xɐWɹǝןıoᗺןǝǝʇs", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 8809e4ffb1..a722ff62ca 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -2333,6 +2333,7 @@ "config.gtceu.option.solarBoilerBaseOutput": "solarBoilerBaseOutput", "config.gtceu.option.solidBoilerBaseOutput": "solidBoilerBaseOutput", "config.gtceu.option.sprayCanChainLength": "sprayCanChainLength", + "config.gtceu.option.steamMultiParallelAmount": "steamMultiParallelAmount", "config.gtceu.option.steamPerWater": "steamPerWater", "config.gtceu.option.steelBoilerHeatSpeed": "steelBoilerHeatSpeed", "config.gtceu.option.steelBoilerMaxTemperature": "steelBoilerMaxTemperature", diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/SurfaceRockBlockItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/SurfaceRockBlockItem.java new file mode 100644 index 0000000000..dfc6891618 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/item/SurfaceRockBlockItem.java @@ -0,0 +1,40 @@ +package com.gregtechceu.gtceu.api.item; + +import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.gregtechceu.gtceu.common.block.SurfaceRockBlock; + +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; + +import lombok.Getter; + +public class SurfaceRockBlockItem extends BlockItem { + + @Getter + private Material mat; + + public SurfaceRockBlockItem(SurfaceRockBlock block, Properties props, Material mat) { + super(block, props); + this.mat = mat; + } + + public static SurfaceRockBlockItem create(SurfaceRockBlock block, Properties props, Material mat) { + return new SurfaceRockBlockItem(block, props, mat); + } + + @Override + public SurfaceRockBlock getBlock() { + return (SurfaceRockBlock) super.getBlock(); + } + + @Override + public Component getDescription() { + return this.getBlock().getName(); + } + + @Override + public Component getName(ItemStack stack) { + return getDescription(); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/block/SurfaceRockRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/block/SurfaceRockRenderer.java index a3e88ad2fd..c77cba559f 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/block/SurfaceRockRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/block/SurfaceRockRenderer.java @@ -4,14 +4,16 @@ import com.gregtechceu.gtceu.data.pack.GTDynamicResourcePack; import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.core.Direction; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.data.models.BlockModelGenerators; import net.minecraft.data.models.blockstates.MultiVariantGenerator; +import net.minecraft.data.models.blockstates.PropertyDispatch; import net.minecraft.data.models.blockstates.Variant; import net.minecraft.data.models.blockstates.VariantProperties; import net.minecraft.data.models.model.DelegatedModel; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; import java.util.HashSet; import java.util.Set; @@ -36,7 +38,19 @@ public static void reinitModels() { GTDynamicResourcePack.addBlockModel(modelId, new DelegatedModel(GTCEu.id("block/surface_rock"))); GTDynamicResourcePack.addBlockState(blockId, MultiVariantGenerator .multiVariant(model.block, Variant.variant().with(VariantProperties.MODEL, modelId)) - .with(BlockModelGenerators.createFacingDispatch())); + .with(PropertyDispatch.property(BlockStateProperties.FACING) + .select(Direction.DOWN, Variant.variant()) + .select(Direction.UP, + Variant.variant().with(VariantProperties.X_ROT, VariantProperties.Rotation.R180)) + .select(Direction.NORTH, + Variant.variant().with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)) + .select(Direction.SOUTH, + Variant.variant().with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)) + .select(Direction.WEST, + Variant.variant().with(VariantProperties.X_ROT, VariantProperties.Rotation.R270)) + .select(Direction.EAST, + Variant.variant().with(VariantProperties.X_ROT, VariantProperties.Rotation.R90)))); + GTDynamicResourcePack.addItemModel(blockId, new DelegatedModel(modelId)); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/block/SurfaceRockBlock.java b/src/main/java/com/gregtechceu/gtceu/common/block/SurfaceRockBlock.java index eaac0660ba..87675c24f6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/block/SurfaceRockBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/common/block/SurfaceRockBlock.java @@ -1,12 +1,14 @@ package com.gregtechceu.gtceu.common.block; import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.gregtechceu.gtceu.api.item.SurfaceRockBlockItem; import com.gregtechceu.gtceu.client.renderer.block.SurfaceRockRenderer; import com.lowdragmc.lowdraglib.Platform; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.color.block.BlockColor; +import net.minecraft.client.color.item.ItemColor; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; @@ -127,7 +129,7 @@ public BlockState getStateForDirection(Direction direction) { } @OnlyIn(Dist.CLIENT) - public static BlockColor tintedColor() { + public static BlockColor tintedBlockColor() { return (state, reader, pos, tintIndex) -> { if (state.getBlock() instanceof SurfaceRockBlock block) { return block.material.getMaterialRGB(); @@ -136,6 +138,16 @@ public static BlockColor tintedColor() { }; } + @OnlyIn(Dist.CLIENT) + public static ItemColor tintedItemColor() { + return (stack, tintIndex) -> { + if (stack.getItem() instanceof SurfaceRockBlockItem surfaceRock) { + return surfaceRock.getMat().getMaterialRGB(); + } + return -1; + }; + } + @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { super.createBlockStateDefinition(builder); 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 a52c55369b..d170ff758b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java @@ -255,11 +255,15 @@ private static void registerOreIndicator(Material material, GTRegistrate registr .block("%s_indicator".formatted(material.getName()), p -> new SurfaceRockBlock(p, material)) .initialProperties(() -> Blocks.GRAVEL) .properties(p -> p.noLootTable().strength(0.25f)) - .blockstate(NonNullBiConsumer.noop()) .setData(ProviderType.LANG, NonNullBiConsumer.noop()) .setData(ProviderType.LOOT, NonNullBiConsumer.noop()) + .setData(ProviderType.BLOCKSTATE, NonNullBiConsumer.noop()) .addLayer(() -> RenderType::cutoutMipped) - .color(() -> SurfaceRockBlock::tintedColor) + .color(() -> SurfaceRockBlock::tintedBlockColor) + .item((b, p) -> SurfaceRockBlockItem.create(b, p, material)) + .color(() -> SurfaceRockBlock::tintedItemColor) + .setData(ProviderType.ITEM_MODEL, NonNullBiConsumer.noop()) + .build() .register(); SURFACE_ROCK_BLOCKS_BUILDER.put(material, entry); } diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/generated/MaterialRecipeHandler.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/generated/MaterialRecipeHandler.java index abbd056524..7aaf0d2050 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/generated/MaterialRecipeHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/generated/MaterialRecipeHandler.java @@ -1,10 +1,12 @@ package com.gregtechceu.gtceu.data.recipe.generated; +import com.gregtechceu.gtceu.api.GTCEuAPI; import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; import com.gregtechceu.gtceu.api.data.chemical.material.MarkerMaterials; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.chemical.material.properties.*; import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; +import com.gregtechceu.gtceu.api.data.chemical.material.registry.MaterialRegistry; import com.gregtechceu.gtceu.api.data.chemical.material.stack.UnificationEntry; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.fluids.store.FluidStorageKeys; @@ -22,6 +24,7 @@ import net.minecraft.data.recipes.FinishedRecipe; import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import java.util.Arrays; import java.util.List; @@ -55,6 +58,8 @@ public static void init(Consumer provider) { for (TagPrefix orePrefix : GEM_ORDER) { orePrefix.executeHandler(provider, PropertyKey.GEM, MaterialRecipeHandler::processGemConversion); } + + generateSurfaceRockRecipe(provider); } public static void processDust(TagPrefix dustPrefix, Material mat, DustProperty property, @@ -593,6 +598,20 @@ public static void processBlock(TagPrefix blockPrefix, Material material, DustPr } } + private static void generateSurfaceRockRecipe(Consumer provider) { + for (MaterialRegistry registry : GTCEuAPI.materialManager.getRegistries()) { + for (Material material : registry.getAllMaterials()) { + if (material.hasProperty(PropertyKey.ORE)) { + VanillaRecipeHelper.addShapedRecipe(provider, "%s_surface_indicator".formatted(material.getName()), + GTBlocks.SURFACE_ROCK_BLOCKS.get(material).asStack(2), + "DDD", "DGD", "DDD", + 'D', ChemicalHelper.get(dustSmall, material), + 'G', Items.GRAVEL); + } + } + } + } + private static int getVoltageMultiplier(Material material) { return material.getBlastTemperature() >= 2800 ? VA[LV] : VA[ULV]; } diff --git a/src/main/resources/assets/gtceu/models/block/surface_rock.json b/src/main/resources/assets/gtceu/models/block/surface_rock.json index 9f916492df..3127da2c8c 100644 --- a/src/main/resources/assets/gtceu/models/block/surface_rock.json +++ b/src/main/resources/assets/gtceu/models/block/surface_rock.json @@ -1,4 +1,5 @@ { + "parent" : "block/block", "credit": "Made with Blockbench", "textures": { "1": "gtceu:block/stones/gravel", @@ -8,108 +9,108 @@ "elements": [ { "name": "ore_bit", - "from": [10, 6, 0], - "to": [12, 8, 1], - "rotation": {"angle": 22.5, "axis": "z", "origin": [12, 4.5, 0.5]}, + "from": [12, 0, 4], + "to": [14, 1, 6], + "rotation": {"angle": -22.5, "axis": "y", "origin": [0, 0, 0]}, "faces": { - "north": {"uv": [6, 3, 8, 5], "texture": "#2", "tintindex": 1}, - "east": {"uv": [4, 2, 5, 4], "texture": "#2", "tintindex": 1}, - "south": {"uv": [1, 1, 3, 3], "texture": "#2", "tintindex": 1}, - "west": {"uv": [10, 4, 11, 6], "texture": "#2", "tintindex": 1}, - "up": {"uv": [0, 0, 2, 1], "texture": "#2", "tintindex": 1}, - "down": {"uv": [0, 0, 2, 1], "texture": "#2", "tintindex": 1} + "north": {"uv": [0, 0, 2, 1], "rotation": 180, "texture": "#2", "tintindex": 1}, + "east": {"uv": [4, 2, 5, 4], "rotation": 90, "texture": "#2", "tintindex": 1}, + "south": {"uv": [0, 0, 2, 1], "texture": "#2", "tintindex": 1}, + "west": {"uv": [10, 4, 11, 6], "rotation": 270, "texture": "#2", "tintindex": 1}, + "up": {"uv": [1, 1, 3, 3], "texture": "#2", "tintindex": 1}, + "down": {"uv": [6, 3, 8, 5], "rotation": 180, "texture": "#2", "tintindex": 1} } }, { "name": "ore_bit", - "from": [7, 11, -0.25], - "to": [8, 12, 0.75], - "rotation": {"angle": 22.5, "axis": "z", "origin": [12, 4.5, 0.5]}, + "from": [6.85, -0.25, 3.75], + "to": [7.85, 0.75, 4.75], + "rotation": {"angle": -22.5, "axis": "y", "origin": [0, 0, 0]}, "faces": { - "north": {"uv": [7, 4, 8, 5], "texture": "#2", "tintindex": 1}, - "east": {"uv": [4, 3, 5, 4], "texture": "#2", "tintindex": 1}, - "south": {"uv": [1, 1, 2, 2], "texture": "#2", "tintindex": 1}, - "west": {"uv": [10, 5, 11, 6], "texture": "#2", "tintindex": 1}, - "up": {"uv": [0, 0, 1, 1], "texture": "#2", "tintindex": 1}, - "down": {"uv": [0, 0, 1, 1], "texture": "#2", "tintindex": 1} + "north": {"uv": [0, 0, 1, 1], "rotation": 180, "texture": "#2", "tintindex": 1}, + "east": {"uv": [4, 3, 5, 4], "rotation": 90, "texture": "#2", "tintindex": 1}, + "south": {"uv": [0, 0, 1, 1], "texture": "#2", "tintindex": 1}, + "west": {"uv": [10, 5, 11, 6], "rotation": 270, "texture": "#2", "tintindex": 1}, + "up": {"uv": [1, 1, 2, 2], "texture": "#2", "tintindex": 1}, + "down": {"uv": [7, 4, 8, 5], "rotation": 180, "texture": "#2", "tintindex": 1} } }, { "name": "ore_bit", - "from": [9, 8, -0.25], - "to": [10, 9, 0.75], - "rotation": {"angle": -22.5, "axis": "z", "origin": [12, 4.5, 0.5]}, + "from": [7.25, -0.25, 10], + "to": [8.25, 0.75, 11], + "rotation": {"angle": 22.5, "axis": "y", "origin": [0, 0, 0]}, "faces": { - "north": {"uv": [7, 4, 8, 5], "texture": "#2", "tintindex": 1}, - "east": {"uv": [4, 3, 5, 4], "texture": "#2", "tintindex": 1}, - "south": {"uv": [1, 1, 2, 2], "texture": "#2", "tintindex": 1}, - "west": {"uv": [10, 5, 11, 6], "texture": "#2", "tintindex": 1}, - "up": {"uv": [0, 0, 1, 1], "texture": "#2", "tintindex": 1}, - "down": {"uv": [0, 0, 1, 1], "texture": "#2", "tintindex": 1} + "north": {"uv": [0, 0, 1, 1], "rotation": 180, "texture": "#2", "tintindex": 1}, + "east": {"uv": [4, 3, 5, 4], "rotation": 90, "texture": "#2", "tintindex": 1}, + "south": {"uv": [0, 0, 1, 1], "texture": "#2", "tintindex": 1}, + "west": {"uv": [10, 5, 11, 6], "rotation": 270, "texture": "#2", "tintindex": 1}, + "up": {"uv": [1, 1, 2, 2], "texture": "#2", "tintindex": 1}, + "down": {"uv": [7, 4, 8, 5], "rotation": 180, "texture": "#2", "tintindex": 1} } }, { "name": "ore_bit", - "from": [10, 10, -0.5], - "to": [11, 11, 0.5], - "rotation": {"angle": 22.5, "axis": "y", "origin": [10, 11, 2]}, + "from": [8.5, -4.25, 5], + "to": [9.5, -3.25, 6], + "rotation": {"angle": 22.5, "axis": "z", "origin": [0, 0, 0]}, "faces": { - "north": {"uv": [2, 1, 3, 2], "texture": "#2", "tintindex": 1}, - "east": {"uv": [0, 0, 1, 1], "texture": "#2", "tintindex": 1}, - "south": {"uv": [3, 8, 4, 9], "texture": "#2", "tintindex": 1}, - "west": {"uv": [6, 2, 7, 3], "texture": "#2", "tintindex": 1}, - "up": {"uv": [8, 4, 9, 5], "texture": "#2", "tintindex": 1}, - "down": {"uv": [11, 4, 12, 5], "texture": "#2", "tintindex": 1} + "north": {"uv": [8, 4, 9, 5], "rotation": 180, "texture": "#2", "tintindex": 1}, + "east": {"uv": [0, 0, 1, 1], "rotation": 90, "texture": "#2", "tintindex": 1}, + "south": {"uv": [11, 4, 12, 5], "texture": "#2", "tintindex": 1}, + "west": {"uv": [6, 2, 7, 3], "rotation": 270, "texture": "#2", "tintindex": 1}, + "up": {"uv": [3, 8, 4, 9], "texture": "#2", "tintindex": 1}, + "down": {"uv": [2, 1, 3, 2], "rotation": 180, "texture": "#2", "tintindex": 1} } }, { "name": "ore_bit", - "from": [7, 5, 0.5], - "to": [8, 6, 1.5], - "rotation": {"angle": -22.5, "axis": "y", "origin": [10, 11, 2]}, + "from": [7, 2.75, 10], + "to": [8, 3.75, 11], + "rotation": {"angle": -22.5, "axis": "z", "origin": [0, 0, 0]}, "faces": { - "north": {"uv": [0, 0, 1, 1], "texture": "#2", "tintindex": 1}, - "east": {"uv": [1, 1, 2, 2], "texture": "#2", "tintindex": 1}, - "south": {"uv": [2, 8, 3, 9], "texture": "#2", "tintindex": 1}, - "west": {"uv": [0, 0, 1, 1], "texture": "#2", "tintindex": 1}, - "up": {"uv": [0, 0, 1, 1], "texture": "#2", "tintindex": 1}, - "down": {"uv": [0, 0, 1, 1], "texture": "#2", "tintindex": 1} + "north": {"uv": [0, 0, 1, 1], "rotation": 180, "texture": "#2", "tintindex": 1}, + "east": {"uv": [1, 1, 2, 2], "rotation": 90, "texture": "#2", "tintindex": 1}, + "south": {"uv": [0, 0, 1, 1], "texture": "#2", "tintindex": 1}, + "west": {"uv": [0, 0, 1, 1], "rotation": 270, "texture": "#2", "tintindex": 1}, + "up": {"uv": [2, 8, 3, 9], "texture": "#2", "tintindex": 1}, + "down": {"uv": [0, 0, 1, 1], "rotation": 180, "texture": "#2", "tintindex": 1} } }, { "name": "ore_bit", - "from": [5, 6, 0], - "to": [7, 8, 1], - "rotation": {"angle": -22.5, "axis": "y", "origin": [7, 6.5, 1]}, + "from": [4.75, 2, 8], + "to": [6.75, 3, 10], + "rotation": {"angle": -22.5, "axis": "z", "origin": [0, 0, 0]}, "faces": { - "north": {"uv": [0, 0, 2, 2], "texture": "#2", "tintindex": 1}, - "east": {"uv": [10, 1, 11, 3], "texture": "#2", "tintindex": 1}, - "south": {"uv": [9, 2, 11, 3], "texture": "#2", "tintindex": 1}, - "west": {"uv": [5, 2, 6, 4], "texture": "#2", "tintindex": 1}, - "up": {"uv": [0, 0, 2, 1], "texture": "#2", "tintindex": 1}, - "down": {"uv": [5, 1, 7, 2], "texture": "#2", "tintindex": 1} + "north": {"uv": [0, 0, 2, 1], "rotation": 180, "texture": "#2", "tintindex": 1}, + "east": {"uv": [10, 1, 11, 3], "rotation": 90, "texture": "#2", "tintindex": 1}, + "south": {"uv": [5, 1, 7, 2], "texture": "#2", "tintindex": 1}, + "west": {"uv": [5, 2, 6, 4], "rotation": 270, "texture": "#2", "tintindex": 1}, + "up": {"uv": [9, 2, 11, 3], "texture": "#2", "tintindex": 1}, + "down": {"uv": [0, 0, 2, 2], "rotation": 180, "texture": "#2", "tintindex": 1} } }, { "name": "ore_bit", - "from": [6, 9, -0.5], - "to": [8, 11, 0.5], - "rotation": {"angle": -22.5, "axis": "z", "origin": [7, 9, 0]}, + "from": [3.5, -0.5, 7.5], + "to": [5.5, 0.5, 9.5], + "rotation": {"angle": 22.5, "axis": "y", "origin": [0, 0, 0]}, "faces": { - "north": {"uv": [0, 0, 2, 2], "texture": "#2", "tintindex": 1}, - "east": {"uv": [0, 0, 2, 1], "texture": "#2", "tintindex": 1}, - "south": {"uv": [7, 6, 9, 8], "texture": "#2", "tintindex": 1}, - "west": {"uv": [0, 0, 2, 1], "texture": "#2", "tintindex": 1}, - "up": {"uv": [0, 0, 2, 1], "texture": "#2", "tintindex": 1}, - "down": {"uv": [0, 0, 2, 1], "texture": "#2", "tintindex": 1} + "north": {"uv": [0, 0, 2, 1], "rotation": 180, "texture": "#2", "tintindex": 1}, + "east": {"uv": [0, 0, 2, 1], "rotation": 90, "texture": "#2", "tintindex": 1}, + "south": {"uv": [0, 0, 2, 1], "texture": "#2", "tintindex": 1}, + "west": {"uv": [0, 0, 2, 1], "rotation": 270, "texture": "#2", "tintindex": 1}, + "up": {"uv": [7, 6, 9, 8], "texture": "#2", "tintindex": 1}, + "down": {"uv": [0, 0, 2, 2], "rotation": 180, "texture": "#2", "tintindex": 1} } }, { "name": "gravel", - "from": [0, 0, 0.05], - "to": [16, 16, 0.05], + "from": [0, 0.05, 0], + "to": [16, 0.05, 16], "faces": { - "south": {"uv": [0, 0, 16, 16], "texture": "#1", "tintindex": 1} + "up": {"uv": [0, 0, 16, 16], "texture": "#1", "tintindex": 1} } } ], @@ -122,4 +123,4 @@ }, 7 ] -} \ No newline at end of file +} From 508374cd0a94723074b6c0bb80281087d37217d5 Mon Sep 17 00:00:00 2001 From: eragaxshim Date: Sat, 12 Oct 2024 00:22:51 +0200 Subject: [PATCH 115/141] Rework Pump Machine logic to fix issues (#2003) --- .../gtceu/common/data/GTMachines.java | 4 +- .../common/machine/electric/PumpMachine.java | 481 ++++++++++++++---- 2 files changed, 396 insertions(+), 89 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java index 93d777ba30..de81ca4801 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java @@ -442,8 +442,8 @@ public class GTMachines { Component.translatable("gtceu.universal.tooltip.fluid_storage_capacity", FormattingUtil.formatNumbers(16 * FluidHelper.getBucket() * Math.max(1, tier))), Component.translatable("gtceu.universal.tooltip.working_area", - PumpMachine.BASE_PUMP_RANGE + PumpMachine.EXTRA_PUMP_RANGE * tier, - PumpMachine.BASE_PUMP_RANGE + PumpMachine.EXTRA_PUMP_RANGE * tier)) + PumpMachine.getMaxPumpRadius(tier) * 2, + PumpMachine.getMaxPumpRadius(tier) * 2)) .compassNode("pump") .register(), LV, MV, HV, EV); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java index 87eb128b87..405f728d0f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java @@ -13,7 +13,6 @@ import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.common.data.GTBlocks; -import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -28,21 +27,33 @@ import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.Util; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.LiquidBlock; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FluidState; +import net.minecraftforge.fluids.FluidType; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import lombok.Getter; import lombok.Setter; import java.util.ArrayDeque; +import java.util.ArrayList; import java.util.Deque; +import java.util.List; +import java.util.Queue; import java.util.Set; +import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; /** @@ -56,12 +67,11 @@ public class PumpMachine extends TieredEnergyMachine implements IAutoOutputFluid protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(PumpMachine.class, TieredEnergyMachine.MANAGED_FIELD_HOLDER); - public static final int BASE_PUMP_RANGE = 32; - public static final int EXTRA_PUMP_RANGE = 8; + public static final int BASE_PUMP_RADIUS = 16; + public static final int EXTRA_PUMP_RADIUS = 4; public static final int PUMP_SPEED_BASE = 80; - private final Deque fluidSourceBlocks = new ArrayDeque<>(); - private final Deque blocksToCheck = new ArrayDeque<>(); - private boolean initializedQueue = false; + private final Set forbiddenBlocks = new ObjectOpenHashSet<>(); + private PumpQueue pumpQueue = null; @Getter @Persisted private int pumpHeadY; @@ -124,63 +134,285 @@ public boolean shouldWeatherOrTerrainExplosion() { ////////////////////////////////////// // ********* Logic **********// ////////////////////////////////////// - private int getMaxPumpRange() { - return BASE_PUMP_RANGE + EXTRA_PUMP_RANGE * getTier(); + public static int getMaxPumpRadius(int tier) { + return BASE_PUMP_RADIUS + EXTRA_PUMP_RADIUS * tier; } - private boolean isStraightInPumpRange(BlockPos checkPos) { - BlockPos pos = getPos(); - return checkPos.getX() == pos.getX() && - checkPos.getZ() == pos.getZ() && - pos.getY() < checkPos.getY() && - pos.getY() + pumpHeadY >= checkPos.getY(); + /** + * Returns a list of directions, starting with Up and then horizontal directions with the directions most matching + * the vector first. + */ + private List biasedInVecDirections(RandomSource randomSource, Vec3i vec, boolean goUp) { + List searchList = new ArrayList<>(); + if (goUp) { + searchList.add(Direction.UP); + } + + ObjectArrayList axes = new ObjectArrayList<>(); + int zValue = Math.abs(vec.getZ()); + int xValue = Math.abs(vec.getX()); + if (zValue > xValue) { + axes.add(Direction.Axis.Z); + axes.add(Direction.Axis.X); + } else if (zValue < xValue) { + axes.add(Direction.Axis.X); + axes.add(Direction.Axis.Z); + } else { + axes.add(Direction.Axis.Z); + axes.add(Direction.Axis.X); + Util.shuffle(axes, randomSource); + } + + Direction lastDirection = null; + for (int i = 0; i < 2; i++) { + Direction.Axis axis = axes.get(i); + int value; + if (axis.equals(Direction.Axis.Z)) { + value = vec.getZ(); + } else { + value = vec.getX(); + } + + Direction direction; + if (value < 0) { + direction = Direction.fromAxisAndDirection(axis, Direction.AxisDirection.NEGATIVE); + } else if (value > 0) { + direction = Direction.fromAxisAndDirection(axis, Direction.AxisDirection.POSITIVE); + } else { + direction = Direction.fromAxisAndDirection(axis, + Util.getRandom(Direction.AxisDirection.values(), randomSource)); + } + searchList.add(direction); + if (i == 0) { + lastDirection = direction.getOpposite(); + } else { + searchList.add(direction.getOpposite()); + } + + } + searchList.add(lastDirection); + + return searchList; } - private void updateQueueState(int blocksToCheckAmount) { - BlockPos selfPos = getPos().below(pumpHeadY); + protected record PumpQueue(Queue> queue, FluidType fluidType) {} - for (int i = 0; i < blocksToCheckAmount; i++) { - BlockPos checkPos = null; - int amountIterated = 0; - do { - if (checkPos != null) { - blocksToCheck.push(checkPos); - amountIterated++; + protected record SearchResult(BlockPos pos, boolean isSource) {} + + /** + * Returns the next block to search at. + */ + @Nullable + private SearchResult searchNext(Level level, BlockPos headPosBelow, BlockPos searchHead, FluidType fluidType, + int maxPumpRange, boolean goUp, Set checked) { + // Vector from the pump head to the search head, so points in the direction away from the pump head + Vec3i subVec = searchHead.subtract(headPosBelow); + + List searchList = biasedInVecDirections(level.getRandom(), subVec, goUp); + + for (Direction direction : searchList) { + BlockPos check = searchHead.relative(direction); + // The pos at the same y-level as the spot to check, but the x and z of the pump + // This is to compute the square distance only in the horizontal plane + BlockPos pumpY = headPosBelow.atY(check.getY()); + + // Skip if outside pump range or not loaded or already checked + if (check.distSqr(pumpY) > maxPumpRange * maxPumpRange || checked.contains(check) || + !level.isLoaded(check) || forbiddenBlocks.contains(check)) { + continue; + } + + // Make sure we don't look at it again + checked.add(check); + + BlockState state = level.getBlockState(check); + FluidState fluidState; + + // If it's not a fluid of the right type, we stop + if ((fluidState = state.getFluidState()).getFluidType() == fluidType && + state.getBlock() instanceof LiquidBlock liquidBlock) { + // Remember all the sources we find + boolean isSource = fluidState.isSource(); + if (isSource) { + var fluidHandler = new FluidBlockTransfer(liquidBlock, level, check); + FluidStack drainStack = fluidHandler.drain(Integer.MAX_VALUE, true); + if (!drainStack.isEmpty()) { + return new SearchResult(check, true); + } } - checkPos = blocksToCheck.poll(); - - } while (checkPos != null && - !getLevel().isLoaded(checkPos) && - amountIterated < blocksToCheck.size()); - if (checkPos != null) { - checkFluidBlockAt(selfPos, checkPos); - } else break; + return new SearchResult(check, false); + } + } + + return null; + } + + /** + * Update the pump queue if it is empty. + * + * @param fluidType Use this if the pump queue must have the same fluid type because it was already decided in the + * pump cycle. + */ + private void updatePumpQueue(@Nullable FluidType fluidType) { + if (getLevel() == null) return; + + if (pumpQueue != null && !pumpQueue.queue().isEmpty()) { + return; + } + + BlockPos headPos = getPos().below(pumpHeadY); + + BlockPos downPos = headPos.below(1); + var downBlock = getLevel().getBlockState(downPos); + + if (!(downBlock.getBlock() instanceof LiquidBlock)) { + pumpQueue = null; + return; + } + + if (fluidType != null && downBlock.getFluidState().getFluidType() != fluidType) { + pumpQueue = null; + return; } - if (fluidSourceBlocks.isEmpty()) { - if (getOffsetTimer() % 20 == 0) { - BlockPos downPos = selfPos.below(1); - if (downPos.getY() >= getLevel().getMinBuildHeight()) { - var downBlock = getLevel().getBlockState(downPos); - if (downBlock.getBlock() instanceof LiquidBlock) { - this.pumpHeadY++; - if (getLevel() instanceof ServerLevel serverLevel && - serverLevel.getBlockState(selfPos).isAir()) { - serverLevel.setBlockAndUpdate(selfPos, GTBlocks.MINER_PIPE.getDefaultState()); + pumpQueue = buildPumpQueue(getLevel(), headPos, downBlock.getFluidState().getFluidType(), queueSize(), true); + } + + /** + * Does a "depth-first"-ish search to find a path to a source. It prioritizes going up and away from the pump head. + * If the path it finds only contains sources at the level below the pump head, it will keep looking until it finds + * one that has a source at a higher location. If it cannot find one, it will return the original path. + */ + private PumpQueue buildPumpQueue(Level level, BlockPos headPos, FluidType fluidType, int queueSourceAmount, + boolean upSources) { + Set checked = new ObjectOpenHashSet<>(); + + BlockPos headPosBelow = headPos.below(); + + checked.add(headPos); + checked.add(headPosBelow); + + int maxPumpRange = getMaxPumpRadius(getTier()); + + List pathStack = new ArrayList<>(); + + Deque nonSources = new ArrayDeque<>(); + Deque pathToLastSource = new ArrayDeque<>(); + Deque sourceStack = new ArrayDeque<>(); + + pathStack.add(headPosBelow); + nonSources.add(headPosBelow); + + int iterations = 0; + int previousSources = 0; + Queue> paths = new ArrayDeque<>(); + List sources = new ArrayList<>(); + // We do at most 1000 iterations to try and find source blocks + while (!pathStack.isEmpty() && iterations < 1000) { + // Peeks at the tail + BlockPos searchHead = pathStack.get(pathStack.size() - 1); + + SearchResult next = searchNext(level, headPosBelow, searchHead, fluidType, maxPumpRange, upSources, + checked); + + iterations++; + + if (next == null) { + boolean continueSearch = sources.size() < queueSourceAmount; + + int addedSources = sources.size() - previousSources; + previousSources = sources.size(); + if (addedSources > 0) { + var toAdd = new ArrayDeque<>(pathToLastSource); + // This is always the headPosBelow, which we do not want to include + toAdd.removeFirst(); + paths.add(toAdd); + } + + if (!continueSearch) { + return new PumpQueue(paths, fluidType); + } + + // Now we need to rewind our stack + BlockPos last = pathStack.remove(pathStack.size() - 1); + BlockPos lastSource = sourceStack.peekLast(); + if (last.equals(lastSource)) { + BlockPos prevSource = sourceStack.removeLast(); + // Rebuild nonSources until previous source + for (int i = pathStack.size() - 1; i >= 0; i--) { + BlockPos p = pathStack.get(i); + if (!p.equals(prevSource)) { + nonSources.addFirst(p); + } else { + break; } } + // If the last is a source, then nonSources will be empty regardless + } else if (!nonSources.isEmpty()) { + nonSources.removeLast(); + } + } else { + // Add the next + pathStack.add(next.pos()); + // If we are in search up mode, we only count it as a source if it's up + if (next.isSource() && (!upSources || next.pos().getY() > headPosBelow.getY())) { + sources.add(next.pos()); + // Found a source, so add all the non-source blocks we passed since the last one + pathToLastSource.addAll(nonSources); + // Also add the source itself + pathToLastSource.add(next.pos()); + // Reset non-sources because we just added them and found a source + nonSources.clear(); + sources.add(next.pos()); + } else { + // Not a source, but we want to track it + nonSources.add(next.pos()); } - // schedule queue rebuild because we changed our position and no fluid is available - this.initializedQueue = false; } + } + if (upSources) { + // If we found none, we try again without the restriction + if (paths.isEmpty()) { + return buildPumpQueue(level, headPos, fluidType, queueSourceAmount, false); + } + + return new PumpQueue(paths, fluidType); + } - if (!initializedQueue || getOffsetTimer() % 6000 == 0) { - this.initializedQueue = true; - // just add ourselves to check list and see how this will go - this.blocksToCheck.add(selfPos); + // Only after everything except the block directly below the pipe is pumped, do we want to pump it + // Otherwise we might advance the pump head prematurely + if (paths.isEmpty() && level.getBlockState(headPosBelow).getFluidState().isSource()) { + return new PumpQueue(new ArrayDeque<>(List.of(new ArrayDeque<>(List.of(headPosBelow)))), fluidType); + } + + return new PumpQueue(paths, fluidType); + } + + /** + * Advances the pump head if the block below is air and the pump queue is empty. + */ + private boolean canAdvancePumpHead() { + // position of the pump head, i.e. the position of the lowest mining pipe + BlockPos headPos = getPos().below(pumpHeadY); + + if (pumpQueue == null || pumpQueue.queue.isEmpty()) { + Level level; + if ((level = getLevel()) != null) { + BlockPos downPos = headPos.below(1); + var downBlock = level.getBlockState(downPos); + + if (downBlock.isAir()) { + this.pumpHeadY++; + + if (level instanceof ServerLevel serverLevel) { + serverLevel.setBlockAndUpdate(downPos, GTBlocks.MINER_PIPE.getDefaultState()); + } + return true; + } } } + return false; } @Override @@ -194,50 +426,95 @@ public void onMachineRemoved() { } } - private void checkFluidBlockAt(BlockPos pumpHeadPos, BlockPos checkPos) { - var blockHere = getLevel().getBlockState(checkPos); - boolean shouldCheckNeighbours = isStraightInPumpRange(checkPos); + protected record SourceState(BlockState state, BlockPos pos) {} - if (blockHere.getBlock() instanceof LiquidBlock liquidBlock && - liquidBlock.getFluidState(blockHere).isSource()) { - var fluidHandler = new FluidBlockTransfer(liquidBlock, getLevel(), checkPos); - FluidStack drainStack = fluidHandler.drain(Integer.MAX_VALUE, true); - if (!drainStack.isEmpty()) { - this.fluidSourceBlocks.add(checkPos); - } - shouldCheckNeighbours = true; + /** + * Does a full pump cycle, trying to do the required number of pumps. It will rebuild the queue if it becomes + * empty without having fulfilled its required number of pumps. All paths computed in the queue are checked + * if they are still valid and consist only of the right fluid. + */ + private void pumpCycle() { + Level level; + if ((level = getLevel()) == null) { + return; } + // Will only update if the queue is empty + updatePumpQueue(null); + int pumps = pumpsPerCycle(); + + // We try to pump `pumps` amount of source blocks, using multiple paths if necessary + boolean pumped = false; + int iterations = 0; + // We keep looking at paths as long as we still have pumps to go + // We put the iterations at max 10 just to be sure + while (pumps > 0 && pumpQueue != null && !pumpQueue.queue().isEmpty() && iterations < 10) { + iterations++; + + Deque pumpPath = pumpQueue.queue().peek(); + Deque states = new ArrayDeque<>(); + + // We iterate through the positions to check if it is still a valid path, saving the states + for (BlockPos pos : pumpPath) { + // Stop once an unloaded block is found + if (!level.isLoaded(pos)) { + break; + } + BlockState state = level.getBlockState(pos); + if (state.getBlock() instanceof LiquidBlock liquidBlock && + (liquidBlock.getFluidState(state)).getFluidType() == pumpQueue.fluidType()) { + states.add(new SourceState(state, pos)); + } else { + break; + } + } - if (shouldCheckNeighbours) { - int maxPumpRange = getMaxPumpRange(); - for (var facing : GTUtil.DIRECTIONS) { - BlockPos offsetPos = checkPos.relative(facing); - if (offsetPos.distSqr(pumpHeadPos) > maxPumpRange * maxPumpRange) - continue; // do not add blocks outside bounds - if (!fluidSourceBlocks.contains(offsetPos) && - !blocksToCheck.contains(offsetPos)) { - this.blocksToCheck.add(offsetPos); + // We remove from the end until we find a matching state, everything after must be no longer valid + while (pumps > 0 && !pumpPath.isEmpty()) { + BlockPos pos = pumpPath.removeLast(); + SourceState sourceState = states.peekLast(); + if (sourceState != null && pos.equals(sourceState.pos())) { + states.removeLast(); + FluidState fluidState = sourceState.state().getFluidState(); + if (sourceState.state().getBlock() instanceof LiquidBlock liquidBlock && fluidState.isSource()) { + var fluidHandler = new FluidBlockTransfer(liquidBlock, getLevel(), pos); + FluidStack drainStack = fluidHandler.drain(Integer.MAX_VALUE, true); + if (!drainStack.isEmpty() && cache.fillInternal(drainStack, true) == drainStack.getAmount()) { + cache.fillInternal(drainStack, false); + fluidHandler.drain(drainStack, false); + getLevel().setBlockAndUpdate(pos, Blocks.AIR.defaultBlockState()); + pumped = true; + pumps--; + } else if (!drainStack.isEmpty()) { + // In this case we just couldn't fill the internal tank, it's most likely full + // So we add back to the pump path and return + pumpPath.add(pos); + return; + } else { + // drain stack is empty even though it's a fluid source, probably something went wrong + // ignore block for a while + forbiddenBlocks.add(pos); + return; + } + } } } - } - } - private void tryPumpFirstBlock() { - BlockPos fluidBlockPos = fluidSourceBlocks.poll(); - if (fluidBlockPos == null) return; - var blockHere = getLevel().getBlockState(fluidBlockPos); - if (blockHere.getBlock() instanceof LiquidBlock liquidBlock && - liquidBlock.getFluidState(blockHere).isSource()) { - var fluidHandler = new FluidBlockTransfer(liquidBlock, getLevel(), fluidBlockPos); - FluidStack drainStack = fluidHandler.drain(Integer.MAX_VALUE, true); - if (!drainStack.isEmpty() && cache.fillInternal(drainStack, true) == drainStack.getAmount()) { - cache.fillInternal(drainStack, false); - fluidHandler.drain(drainStack, false); - getLevel().setBlockAndUpdate(fluidBlockPos, Blocks.AIR.defaultBlockState()); - this.fluidSourceBlocks.remove(fluidBlockPos); - energyContainer.changeEnergy(-GTValues.V[getTier()] * 2); + if (pumpPath.isEmpty()) { + pumpQueue.queue().remove(); + } + + // If we have pumps left over and there is still more to be pumped at the current level + // (But it wasn't in the queue because maybe it's the final source block below the pump head) + // We still want to be able to pump + if (pumps > 0 && pumpQueue.queue().isEmpty()) { + updatePumpQueue(pumpQueue.fluidType()); } } + + // Use energy if any pumps happened at all + if (pumped) { + energyContainer.changeEnergy(-GTValues.V[getTier()] * 2); + } } public void update() { @@ -249,14 +526,44 @@ public void update() { if (energyContainer.getEnergyStored() < GTValues.V[getTier()] * 2) { return; } - updateQueueState(getTier()); - if (getOffsetTimer() % getPumpingCycleLength() == 0 && !fluidSourceBlocks.isEmpty()) { - tryPumpFirstBlock(); + // Try to put 5 times as many in the queue as there are pumps in the cycle + // In practice only EV tier has more than 1 pump per cycle + // The queue can contain at most the y-levels at the pump head or just the y-level below, so for many oil veins + // It will not be the ideal size + boolean advanced = false; + if (getOffsetTimer() % (getPumpingCycleLength() * 2L) == 0) { + advanced = canAdvancePumpHead(); + } + if (!advanced && getOffsetTimer() % getPumpingCycleLength() == 0) { + pumpCycle(); + } + if (getOffsetTimer() % (20 * 60) == 0) { + forbiddenBlocks.clear(); } } + private int queueSize() { + return 5 * pumpsPerCycle(); + } + + private float ticksPerPump() { + // How many ticks pass per pump. This is the ideal amount and thus can be less than 1 + // For LV this is 80/1 = 80 + float tierMultiplier = (float) (1 << (getTier() - 1)); + return PUMP_SPEED_BASE / tierMultiplier; + } + + private int pumpsPerCycle() { + // The pumping cycle length can not be less than 20, so to ensure we still have the right amount of pumps + // We need to compensate with pumps per cycle + + return (int) (getPumpingCycleLength() / ticksPerPump()); + } + private int getPumpingCycleLength() { - return PUMP_SPEED_BASE / (1 << (getTier() - 1)); + // For basic pumps this means once every 80 ticks + // It never pumps more than once every 20 ticks, but pumps more per cycle to compensate + return Math.max(20, (int) ticksPerPump()); } ////////////////////////////////////// From 034113ba0e1759c44a66be6dcc429cc4d4163e69 Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Fri, 11 Oct 2024 18:50:50 -0400 Subject: [PATCH 116/141] Change changelog configs to use @s (#2135) --- .github/json/config-latest.json | 2 +- .github/json/config.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/json/config-latest.json b/.github/json/config-latest.json index a99cc69eb3..34a6f70b0f 100644 --- a/.github/json/config-latest.json +++ b/.github/json/config-latest.json @@ -15,7 +15,7 @@ ], "sort": "ASC", "template": "## What's Changed\n#{{CHANGELOG}}", - "pr_template": "- #{{TITLE}} by #{{AUTHOR}} in [##{{NUMBER}}](#{{URL}})", + "pr_template": "- #{{TITLE}} by @#{{AUTHOR}} in [##{{NUMBER}}](#{{URL}})", "ignore_labels": ["ignore changelog"], "max_pull_requests": 1000, "max_back_track_time_days": 90 diff --git a/.github/json/config.json b/.github/json/config.json index f1ba8dfe99..86d9143508 100644 --- a/.github/json/config.json +++ b/.github/json/config.json @@ -15,7 +15,7 @@ ], "sort": "ASC", "template": "## Version [#{{TO_TAG}}](#{{RELEASE_DIFF}})\n#{{CHANGELOG}} ", - "pr_template": "- #{{TITLE}} by #{{AUTHOR}} in [##{{NUMBER}}](#{{URL}})", + "pr_template": "- #{{TITLE}} by @#{{AUTHOR}} in [##{{NUMBER}}](#{{URL}})", "empty_template": "- No changes", "ignore_labels": ["ignore changelog"], "tag_resolver": { From 660a48adbdc15b9eb68fdc25653588bfff6e0348 Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Fri, 11 Oct 2024 21:45:04 -0400 Subject: [PATCH 117/141] Add back backwards compatibility for the SteamParallelMultiblock constructor (#2139) --- .../multiblock/steam/SteamParallelMultiblockMachine.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/SteamParallelMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/SteamParallelMultiblockMachine.java index 65ab2b3800..3b2a55341b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/SteamParallelMultiblockMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/SteamParallelMultiblockMachine.java @@ -49,12 +49,12 @@ public class SteamParallelMultiblockMachine extends WorkableMultiblockMachine im // if in millibuckets, this is 0.5, Meaning 2mb of steam -> 1 EU private static final double CONVERSION_RATE = 0.5D; - public SteamParallelMultiblockMachine(IMachineBlockEntity holder) { - this(holder, ConfigHolder.INSTANCE.machines.steamMultiParallelAmount); + public SteamParallelMultiblockMachine(IMachineBlockEntity holder, Object... args) { + this(holder, ConfigHolder.INSTANCE.machines.steamMultiParallelAmount, args); } - public SteamParallelMultiblockMachine(IMachineBlockEntity holder, int parallelAmount) { - super(holder); + public SteamParallelMultiblockMachine(IMachineBlockEntity holder, int parallelAmount, Object... args) { + super(holder, args); maxParallels = parallelAmount; } From cdc34b5818e9cb4637bf1b0b7206dd5f22d251b2 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Fri, 11 Oct 2024 22:03:28 -0600 Subject: [PATCH 118/141] Fix voltage floor formula causing negative values (#2141) --- src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java b/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java index 3a065f4742..ad4a2d14c0 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java @@ -216,7 +216,7 @@ public static byte getOCTierByVoltage(long voltage) { * {@code ULV} if there's no tier below */ public static byte getFloorTierByVoltage(long voltage) { - if (voltage < GTValues.V[GTValues.ULV]) { + if (voltage < GTValues.V[GTValues.LV]) { return GTValues.ULV; } if (voltage == GTValues.VEX[GTValues.MAX_TRUE]) { From 68124e0f8da194249e3b3e21002927e5fb8f7396 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Fri, 11 Oct 2024 22:03:50 -0600 Subject: [PATCH 119/141] Add pattern storage for Aisle Repetition (#2140) --- .../com/gregtechceu/gtceu/api/pattern/BlockPattern.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/BlockPattern.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/BlockPattern.java index d1cad89ddc..6053834f31 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/BlockPattern.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pattern/BlockPattern.java @@ -36,6 +36,7 @@ import com.mojang.datafixers.util.Pair; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import it.unimi.dsi.fastutil.longs.LongOpenHashSet; +import lombok.Getter; import org.apache.commons.lang3.ArrayUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -57,6 +58,8 @@ public class BlockPattern { protected final int thumbLength; // y size protected final int palmLength; // x size protected final int[] centerOffset; // x, y, z, minZ, maxZ + @Getter + protected int[] formedRepetitionCount; public BlockPattern(TraceabilityPredicate[][][] predicatesIn, RelativeDirection[] structureDir, int[][] aisleRepetitions, int[] centerOffset) { @@ -64,6 +67,7 @@ public BlockPattern(TraceabilityPredicate[][][] predicatesIn, RelativeDirection[ this.fingerLength = predicatesIn.length; this.structureDir = structureDir; this.aisleRepetitions = aisleRepetitions; + this.formedRepetitionCount = new int[aisleRepetitions.length]; if (this.fingerLength > 0) { this.thumbLength = predicatesIn[0].length; @@ -115,6 +119,7 @@ public boolean checkPatternAt(MultiblockState worldState, BlockPos centerPos, Di // Checking aisles for (int c = 0, z = minZ++, r; c < this.fingerLength; c++) { // Checking repeatable slices + int validRepetitions = 0; loop: for (r = 0; (findFirstAisle ? r < aisleRepetitions[c][1] : z <= -centerOffset[3]); r++) { // Checking single slice @@ -179,6 +184,7 @@ public boolean checkPatternAt(MultiblockState worldState, BlockPos centerPos, Di return false; } } + validRepetitions++; } // Repetitions out of range if (r < aisleRepetitions[c][0] || worldState.hasError() || !findFirstAisle) { @@ -187,6 +193,9 @@ public boolean checkPatternAt(MultiblockState worldState, BlockPos centerPos, Di } return false; } + + // finished checking the aisle, so store the repetitions + formedRepetitionCount[c] = validRepetitions; } // Check count matches amount From c3a983c4c365f54f4f52a6c5bdbb276be159c089 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sat, 12 Oct 2024 01:02:29 -0400 Subject: [PATCH 120/141] Copy the EBF's temperature tooltip to the ABS and RHF (#2142) --- .../gtceu/common/data/machines/GCyMMachines.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GCyMMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GCyMMachines.java index 3ea4db81d4..d35fb37a8c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GCyMMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GCyMMachines.java @@ -452,6 +452,9 @@ public static void init() {} .langValue("Alloy Blast Smelter") .tooltips(Component.translatable("gtceu.machine.available_recipe_map_1.tooltip", Component.translatable("gtceu.alloy_blast_smelter"))) + .tooltips(Component.translatable("gtceu.machine.electric_blast_furnace.tooltip.0"), + Component.translatable("gtceu.machine.electric_blast_furnace.tooltip.1"), + Component.translatable("gtceu.machine.electric_blast_furnace.tooltip.2")) .rotationState(RotationState.ALL) .recipeType(ALLOY_BLAST_RECIPES) .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, GTRecipeModifiers::ebfOverclock) @@ -805,6 +808,9 @@ public static void init() {} .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip")) .tooltips(Component.translatable("gtceu.machine.available_recipe_map_1.tooltip", Component.translatable("gtceu.electric_blast_furnace"))) + .tooltips(Component.translatable("gtceu.machine.electric_blast_furnace.tooltip.0"), + Component.translatable("gtceu.machine.electric_blast_furnace.tooltip.1"), + Component.translatable("gtceu.machine.electric_blast_furnace.tooltip.2")) .rotationState(RotationState.ALL) .recipeType(BLAST_RECIPES) .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, From 21e18cb3e3e3d7ea21faf2d39fb582b1dc6cdca5 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Sat, 12 Oct 2024 01:48:34 -0600 Subject: [PATCH 121/141] Add cutting recipe for stained glass panes (#2144) --- .../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 d85ddcb986..ffe961831d 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 @@ -543,6 +543,11 @@ private static void dyingCleaningRecipes(Consumer provider) { BuiltInRegistries.ITEM.get(new ResourceLocation(dyeName + "_stained_glass_pane")))) .save(provider); + CUTTER_RECIPES.recipeBuilder("cut_" + dyeName + "_glass_to_pane").duration(20).EUt(VA[ULV]) + .inputItems(BuiltInRegistries.ITEM.get(new ResourceLocation(dyeName + "_stained_glass"))) + .outputItems(BuiltInRegistries.ITEM.get(new ResourceLocation(dyeName + "_stained_glass_pane"))) + .save(provider); + CHEMICAL_BATH_RECIPES.recipeBuilder("dye_candle_to_" + dyeName).duration(20).EUt(VA[ULV]) .inputItems(new ItemStack(Items.CANDLE)) .inputFluids(CHEMICAL_DYES[color.ordinal()].getFluid(L / 8)) From 3fea246851312b09e88432ae00295885f6845170 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Sat, 12 Oct 2024 03:02:57 -0600 Subject: [PATCH 122/141] Fix insertion and extraction of rotors in rotor holders (#2143) Co-authored-by: kross <135918757+krossgg@users.noreply.github.com> --- .../machine/multiblock/generator/LargeTurbineMachine.java | 3 ++- .../machine/multiblock/part/RotorHolderPartMachine.java | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) 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 33fca4e163..f9bcb9dee0 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 @@ -161,7 +161,8 @@ public void addDisplayText(List textList) { if (isActive()) { textList.add(3, Component.translatable("gtceu.multiblock.turbine.energy_per_tick", - FormattingUtil.formatNumbers(currentProduction), voltageName)); + FormattingUtil.formatNumbers(currentProduction), + FormattingUtil.formatNumbers(maxProduction))); } int rotorDurability = rotorHolder.getRotorDurabilityPercent(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java index fa6f4a67f6..e79ce47792 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java @@ -2,6 +2,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.widget.BlockableSlotWidget; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; @@ -13,7 +14,6 @@ import com.gregtechceu.gtceu.common.data.GTDamageTypes; import com.gregtechceu.gtceu.common.item.TurbineRotorBehaviour; -import com.lowdragmc.lowdraglib.gui.widget.SlotWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; import com.lowdragmc.lowdraglib.syncdata.ISubscription; @@ -215,7 +215,8 @@ public InteractionResult onUse(BlockState state, Level level, BlockPos pos, Play public Widget createUIWidget() { var group = new WidgetGroup(0, 0, 18 + 16, 18 + 16); var container = new WidgetGroup(4, 4, 18 + 8, 18 + 8); - container.addWidget(new SlotWidget(inventory.storage, 0, 4, 4, true, true) + container.addWidget(new BlockableSlotWidget(inventory.storage, 0, 4, 4) + .setIsBlocked(() -> rotorSpeed != 0) .setBackground(GuiTextures.SLOT, GuiTextures.TURBINE_OVERLAY)); container.setBackground(GuiTextures.BACKGROUND_INVERSE); group.addWidget(container); From 5d4037e48ed59e1d0f61cb1164d933182b25da06 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Sat, 12 Oct 2024 11:55:37 -0600 Subject: [PATCH 123/141] Add ability to set ghost circuit using held circuit item (#2145) --- .../resources/assets/gtceu/lang/en_ud.json | 5 ++- .../resources/assets/gtceu/lang/en_us.json | 5 ++- .../common/item/IntCircuitBehaviour.java | 37 +++++++++++++++++++ .../gregtechceu/gtceu/data/lang/ItemLang.java | 3 +- .../gtceu/data/lang/LangHandler.java | 1 + 5 files changed, 48 insertions(+), 3 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 9ddcad58dc..009fc057a4 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -4657,7 +4657,10 @@ "item.gtceu.portable_scanner": "ɹǝuuɐɔS ǝןqɐʇɹoԀ", "item.gtceu.power_thruster": "ɹǝʇsnɹɥ⟘ ɹǝʍoԀ", "item.gtceu.programmed_circuit": "ʇınɔɹıƆ pǝɯɯɐɹboɹԀ", - "item.gtceu.programmed_circuit.tooltip": "I∩⅁ uoıʇɐɹnbıɟuoɔ uǝdo oʇ ǝs∩ㄥ§", + "item.gtceu.programmed_circuit.tooltip.0": "I∩⅁ uoıʇɐɹnbıɟuoɔ uǝdo oʇ ǝs∩", + "item.gtceu.programmed_circuit.tooltip.1": "ǝuıɥɔɐɯ ɐ uo ʞɔıןƆ-ʇɥbıᴚ-ʇɟıɥS", + "item.gtceu.programmed_circuit.tooltip.2": "oʇ ʇı ʇǝs oʇ ʇoןs ʇınɔɹıɔ ɐ ɥʇıʍ", + "item.gtceu.programmed_circuit.tooltip.3": "˙ǝnןɐʌ s,ʇınɔɹıɔ sıɥʇ", "item.gtceu.prospector.hv": ")ΛH( ɹoʇɔǝdsoɹԀ pǝɔuɐʌpⱯ", "item.gtceu.prospector.luv": ")ΛnꞀ( ɹoʇɔǝdsoɹԀ ɹǝdnS", "item.gtceu.prospector.lv": ")ΛꞀ( ɹoʇɔǝdsoɹԀ ǝɹO", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index a722ff62ca..781832509c 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -4657,7 +4657,10 @@ "item.gtceu.portable_scanner": "Portable Scanner", "item.gtceu.power_thruster": "Power Thruster", "item.gtceu.programmed_circuit": "Programmed Circuit", - "item.gtceu.programmed_circuit.tooltip": "§7Use to open configuration GUI", + "item.gtceu.programmed_circuit.tooltip.0": "Use to open configuration GUI", + "item.gtceu.programmed_circuit.tooltip.1": "Shift-Right-Click on a machine", + "item.gtceu.programmed_circuit.tooltip.2": "with a circuit slot to set it to", + "item.gtceu.programmed_circuit.tooltip.3": "this circuit's value.", "item.gtceu.prospector.hv": "Advanced Prospector (HV)", "item.gtceu.prospector.luv": "Super Prospector (LuV)", "item.gtceu.prospector.lv": "Ore Prospector (LV)", diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/IntCircuitBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/IntCircuitBehaviour.java index f3bba2abf2..5a6c470288 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/IntCircuitBehaviour.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/IntCircuitBehaviour.java @@ -1,9 +1,16 @@ package com.gregtechceu.gtceu.common.item; +import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.item.component.IAddInformation; import com.gregtechceu.gtceu.api.item.component.IItemUIFactory; +import com.gregtechceu.gtceu.api.machine.SimpleTieredMachine; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.common.data.GTItems; +import com.gregtechceu.gtceu.common.machine.multiblock.part.FluidHatchPartMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.part.ItemBusPartMachine; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.integration.ae2.machine.MEPatternBufferPartMachine; import com.lowdragmc.lowdraglib.gui.factory.HeldItemUIFactory; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; @@ -17,10 +24,13 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; +import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; import org.jetbrains.annotations.Nullable; @@ -132,4 +142,31 @@ public ModularUI createUI(HeldItemUIFactory.HeldItemHolder holder, Player entity modular.mainGroup.setBackground(GuiTextures.BACKGROUND); return modular; } + + @Override + public InteractionResult useOn(UseOnContext context) { + var stack = context.getItemInHand(); + int circuitSetting = getCircuitConfiguration(stack); + BlockEntity entity = context.getLevel().getBlockEntity(context.getClickedPos()); + if (entity instanceof MetaMachineBlockEntity machineEntity && context.getPlayer().isCrouching()) { + if (machineEntity.metaMachine instanceof SimpleTieredMachine tieredMachine) { + setCircuitConfig(tieredMachine.getCircuitInventory(), circuitSetting); + } else if (machineEntity.metaMachine instanceof FluidHatchPartMachine fluidHatch) { + setCircuitConfig(fluidHatch.getCircuitInventory(), circuitSetting); + } else if (machineEntity.metaMachine instanceof ItemBusPartMachine itemBus) { + setCircuitConfig(itemBus.getCircuitInventory(), circuitSetting); + } else if (machineEntity.metaMachine instanceof MEPatternBufferPartMachine patternBuffer) { + setCircuitConfig(patternBuffer.getCircuitInventorySimulated(), circuitSetting); + } + + if (!ConfigHolder.INSTANCE.machines.ghostCircuit) + stack.shrink(1); + return InteractionResult.SUCCESS; + } + return IItemUIFactory.super.useOn(context); + } + + void setCircuitConfig(NotifiableItemStackHandler circuit, int value) { + circuit.setStackInSlot(0, IntCircuitBehaviour.stack(value)); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java index 44432f61f7..f21dfb93f6 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java @@ -150,7 +150,8 @@ private static void initItemTooltips(RegistrateLangProvider provider) { provider.add("item.gtceu.robot.arm.tooltip", "§7Limits §fItems§7 to specific quantities as §fCover§7."); provider.add("item.gtceu.data_stick.tooltip", "§7A Low Capacity Data Storage"); provider.add("item.gtceu.data_orb.tooltip", "§7A High Capacity Data Storage"); - provider.add("item.gtceu.programmed_circuit.tooltip", "§7Use to open configuration GUI"); + multilineLang(provider, "item.gtceu.programmed_circuit.tooltip", + "Use to open configuration GUI\nShift-Right-Click on a machine\nwith a circuit slot to set it to\nthis circuit's value."); provider.add("item.gtceu.circuit.integrated.gui", "§7Programmed Circuit Configuration"); // multilineLang(provider, "item.gtceu.circuit.integrated.jei_description", "JEI is only showing recipes for the // given configuration.\n\nYou can select a configuration in the Programmed Circuit configuration tab."); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index fb2575736f..1474c4940a 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -92,6 +92,7 @@ public static void init(RegistrateLangProvider provider) { provider.add("metaitem.dust.tooltip.purify", "Right click a Cauldron to get clean Dust"); provider.add("metaitem.crushed.tooltip.purify", "Right click a Cauldron to get Purified Ore"); provider.add("metaitem.int_circuit.configuration", "Configuration: %d"); + provider.add("metaitem.machine_configuration.mode", "§aConfiguration Mode:§r %s"); provider.add("gtceu.mode.fluid", "§9Fluid§r"); provider.add("gtceu.mode.item", "§6Item§r"); From e3d9491b87a7ec37b264733d4649772f9ceb7f6f Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Sat, 12 Oct 2024 11:55:54 -0600 Subject: [PATCH 124/141] Fix Lighter ground behavior (#2146) --- .../gtceu/common/item/tool/behavior/LighterBehavior.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/LighterBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/LighterBehavior.java index e4b53bb986..0139e2af52 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/LighterBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/LighterBehavior.java @@ -174,7 +174,7 @@ public InteractionResult onItemUseFirst(ItemStack itemStack, UseOnContext contex return InteractionResult.SUCCESS; } } - return InteractionResult.FAIL; + return InteractionResult.PASS; } public boolean consumeFuel(Player player, ItemStack stack) { From f551c026043a8af3683682f02cf45f3482ed5b88 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Sat, 12 Oct 2024 11:56:38 -0600 Subject: [PATCH 125/141] Add dough (#2147) Co-authored-by: Karthi Suresh <75553966+JuiceyBeans@users.noreply.github.com> --- .../resources/assets/gtceu/lang/en_ud.json | 1 + .../resources/assets/gtceu/lang/en_us.json | 1 + .../assets/gtceu/models/item/dough.json | 6 + .../data/forge/tags/items/dough.json | 5 + .../gtceu/api/data/tag/TagUtil.java | 54 ++++++ .../gtceu/common/data/GTItems.java | 13 ++ .../gtceu/data/recipe/CustomTags.java | 1 + .../data/recipe/VanillaRecipeHelper.java | 53 ++++++ .../recipe/builder/CampfireRecipeBuilder.java | 154 ++++++++++++++++++ .../recipe/builder/SmokingRecipeBuilder.java | 2 +- .../recipe/configurable/RecipeRemoval.java | 4 + .../data/recipe/misc/MiscRecipeLoader.java | 93 +++++++++++ .../assets/gtceu/textures/item/dough.png | Bin 0 -> 380 bytes 13 files changed, 386 insertions(+), 1 deletion(-) create mode 100644 src/generated/resources/assets/gtceu/models/item/dough.json create mode 100644 src/generated/resources/data/forge/tags/items/dough.json create mode 100644 src/main/java/com/gregtechceu/gtceu/data/recipe/builder/CampfireRecipeBuilder.java create mode 100644 src/main/resources/assets/gtceu/textures/item/dough.png diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 009fc057a4..ab960d2cf8 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -4229,6 +4229,7 @@ "item.gtceu.diode.tooltip": "ʇuǝuodɯoƆ ɔıuoɹʇɔǝןƎ ɔısɐᗺㄥ§", "item.gtceu.doge_coin": "uıoƆ ǝboᗡ", "item.gtceu.doge_coin.tooltip": "ʍoʍ ʎɔuǝʍʍnɔ ʎʍǝʌ ɥɔıʍ ʌ ǝʎuıɯ zʍd oʇdʎʍɔ os ʎǝʎuoɯ ʍoɥ uıoɔ ɥɔnɯ ʍoʍㄥ§", + "item.gtceu.dough": "ɥbnoᗡ", "item.gtceu.duct_tape": "ㄣ8-ꞀⱯℲ ǝdɐ⟘ ʇɔnᗡ pǝɔɹoɟuıǝᴚ pǝɔuɐʌpⱯ ǝɔɐdsoɹǝⱯ ɥɔǝ⟘uıɐɹᗺ", "item.gtceu.duct_tape.tooltip": "¡ʇı ɟo ǝɹoɯ ǝsn 'sıɥʇ ɥʇıʍ ʇı xıɟ ʇ,uɐɔ noʎ ɟIㄥ§", "item.gtceu.dynamite": "ǝʇıɯɐuʎᗡ", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 781832509c..56b8040f88 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -4229,6 +4229,7 @@ "item.gtceu.diode.tooltip": "§7Basic Electronic Component", "item.gtceu.doge_coin": "Doge Coin", "item.gtceu.doge_coin.tooltip": "§7wow much coin how monyey so cwypto pwz minye v wich vewy cuwwency wow", + "item.gtceu.dough": "Dough", "item.gtceu.duct_tape": "BrainTech Aerospace Advanced Reinforced Duct Tape FAL-84", "item.gtceu.duct_tape.tooltip": "§7If you can't fix it with this, use more of it!", "item.gtceu.dynamite": "Dynamite", diff --git a/src/generated/resources/assets/gtceu/models/item/dough.json b/src/generated/resources/assets/gtceu/models/item/dough.json new file mode 100644 index 0000000000..1c03f01261 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/item/dough.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "gtceu:item/dough" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/dough.json b/src/generated/resources/data/forge/tags/items/dough.json new file mode 100644 index 0000000000..0d7285b98c --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/dough.json @@ -0,0 +1,5 @@ +{ + "values": [ + "gtceu:dough" + ] +} \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagUtil.java b/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagUtil.java index 88a219306a..7523df6d8b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagUtil.java @@ -26,29 +26,62 @@ public static TagKey optionalTag(ResourceKey> regis return TagKey.create(registryKey, id); } + /** + * Generates tag under Forge namespace + * + * @param vanilla Whether to use vanilla namespace instead of Forge + * @return optional tag #forge:path or #minecraft:path + */ public static TagKey createTag(Registry registry, String path, boolean vanilla) { if (vanilla) return optionalTag(registry, new ResourceLocation("minecraft", path)); return optionalTag(registry, new ResourceLocation("forge", path)); } + /** + * Generates tag under Forge namespace + * + * @param vanilla Whether to use vanilla namespace instead of Forge + * @return optional tag #forge:path or #minecraft:path + */ public static TagKey createTag(ResourceKey> registryKey, String path, boolean vanilla) { if (vanilla) return optionalTag(registryKey, new ResourceLocation("minecraft", path)); return optionalTag(registryKey, new ResourceLocation("forge", path)); } + /** + * Generates tag under GTM namespace + * + * @return #gtceu:path + */ public static TagKey createModTag(Registry registry, String path) { return optionalTag(registry, GTCEu.id(path)); } + /** + * Generates tag under GTM namespace + * + * @return #gtceu:path + */ public static TagKey createModTag(ResourceKey> registryKey, String path) { return TagKey.create(registryKey, GTCEu.id(path)); } + /** + * Generates block tag under Forge namespace + * + * @return Block tag #forge:path + */ public static TagKey createBlockTag(String path) { return createTag(BuiltInRegistries.BLOCK, path, false); } + /** + * Generates block tag under Forge namespace + * + * @param vanilla Whether to use vanilla namespace instead of Forge + * @return Block tag #forge:path or #minecraft:path + */ public static TagKey createBlockTag(String path, boolean vanilla) { return createTag(BuiltInRegistries.BLOCK, path, vanilla); } @@ -57,18 +90,39 @@ public static TagKey createModBlockTag(String path) { return createModTag(BuiltInRegistries.BLOCK, path); } + /** + * Generates tag under Forge namespace + * + * @return Tag #forge:path + */ public static TagKey createItemTag(String path) { return createTag(BuiltInRegistries.ITEM, path, false); } + /** + * Generates tag under Forge namespace + * + * @param vanilla Whether to use vanilla namespace instead of Forge + * @return Tag #forge:path or #minecraft:path + */ public static TagKey createItemTag(String path, boolean vanilla) { return createTag(BuiltInRegistries.ITEM, path, vanilla); } + /** + * Generates item tag under GTM namespace + * + * @return Item tag #gtceu:path + */ public static TagKey createModItemTag(String path) { return createModTag(BuiltInRegistries.ITEM, path); } + /** + * Generates fluid tag under Forge namespace + * + * @return Fluid tag #forge:path + */ public static TagKey createFluidTag(String path) { return createTag(BuiltInRegistries.FLUID, path, false); } 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 ca7e462a88..d38329c665 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java @@ -54,6 +54,9 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.stats.Stats; import net.minecraft.world.InteractionResult; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.food.FoodProperties; import net.minecraft.world.item.*; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.LayeredCauldronBlock; @@ -2367,6 +2370,16 @@ public Component getItemName(ItemStack stack) { .onRegister(attach(new FoodStats(GTFoods.DRINK, true, Items.GLASS_BOTTLE::getDefaultInstance))) .onRegister(compassNode(GTCompassSections.MISC)) .register(); + public static ItemEntry DOUGH = REGISTRATE.item("dough", ComponentItem::create) + .lang("Dough") + .onRegister(attach(new FoodStats( + new FoodProperties.Builder().nutrition(1) + .effect(() -> new MobEffectInstance(MobEffects.HUNGER, 400), .40f) + .effect(() -> new MobEffectInstance(MobEffects.POISON, 100), .05f) + .build(), + false, null))) + .tag(CustomTags.DOUGHS) + .register(); public static ItemEntry PLANT_BALL = REGISTRATE.item("plant_ball", ComponentItem::create) .onRegister(compassNode(GTCompassSections.MISC)).onRegister(burnTime(75)).register(); public static ItemEntry STICKY_RESIN = REGISTRATE.item("sticky_resin", ComponentItem::create) diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/CustomTags.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/CustomTags.java index 547e632ad6..e25a15a39b 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/CustomTags.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/CustomTags.java @@ -19,6 +19,7 @@ public class CustomTags { public static final TagKey PISTONS = TagUtil.createItemTag("pistons"); public static final TagKey CONCRETE_ITEM = TagUtil.createItemTag("concretes"); public static final TagKey CONCRETE_POWDER_ITEM = TagUtil.createItemTag("concrete_powders"); + public static final TagKey DOUGHS = TagUtil.createItemTag("dough"); // Added Gregtech tags public static final TagKey TRANSISTORS = TagUtil.createModItemTag("transistors"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java index fd11ea8e47..ffabd7110a 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java @@ -97,12 +97,65 @@ public static void addSmokingRecipe(Consumer provider, @NotNull addSmokingRecipe(provider, GTCEu.id(regName), input, output, experience); } + public static void addSmokingRecipe(Consumer provider, @NotNull String regName, ItemStack input, + ItemStack output, float experience) { + addSmokingRecipe(provider, GTCEu.id(regName), input, output, experience); + } + + public static void addSmokingRecipe(Consumer provider, @NotNull String regName, TagKey input, + ItemStack output) { + addSmokingRecipe(provider, GTCEu.id(regName), input, output, 0); + } + + public static void addSmokingRecipe(Consumer provider, @NotNull String regName, ItemStack input, + ItemStack output) { + addSmokingRecipe(provider, GTCEu.id(regName), input, output, 0); + } + public static void addSmokingRecipe(Consumer provider, @NotNull ResourceLocation regName, TagKey input, ItemStack output, float experience) { new SmokingRecipeBuilder(regName).input(input).output(output).cookingTime(100).experience(experience) .save(provider); } + public static void addSmokingRecipe(Consumer provider, @NotNull ResourceLocation regName, + ItemStack input, ItemStack output, float experience) { + new SmokingRecipeBuilder(regName).input(input).output(output).cookingTime(100).experience(experience) + .save(provider); + } + + public static void addCampfireRecipe(Consumer provider, @NotNull String regName, ItemStack input, + ItemStack output, float experience) { + addCampfireRecipe(provider, GTCEu.id(regName), input, output, experience); + } + + public static void addCampfireRecipe(Consumer provider, @NotNull String regName, ItemStack input, + ItemStack output) { + addCampfireRecipe(provider, GTCEu.id(regName), input, output, 0); + } + + public static void addCampfireRecipe(Consumer provider, @NotNull ResourceLocation regName, + ItemStack input, ItemStack output, float experience) { + new CampfireRecipeBuilder(regName).input(input).output(output).cookingTime(100).experience(experience) + .save(provider); + } + + public static void addCampfireRecipe(Consumer provider, @NotNull String regName, TagKey input, + ItemStack output, float experience) { + addCampfireRecipe(provider, GTCEu.id(regName), input, output, experience); + } + + public static void addCampfireRecipe(Consumer provider, @NotNull String regName, TagKey input, + ItemStack output) { + addCampfireRecipe(provider, GTCEu.id(regName), input, output, 0); + } + + public static void addCampfireRecipe(Consumer provider, @NotNull ResourceLocation regName, + TagKey input, ItemStack output, float experience) { + new CampfireRecipeBuilder(regName).input(input).output(output).cookingTime(100).experience(experience) + .save(provider); + } + public static void addSmeltingRecipe(Consumer provider, @NotNull String regName, ItemStack input, ItemStack output) { addSmeltingRecipe(provider, GTCEu.id(regName), input, output, 0.0f); diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/CampfireRecipeBuilder.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/CampfireRecipeBuilder.java new file mode 100644 index 0000000000..1239b8d0cf --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/CampfireRecipeBuilder.java @@ -0,0 +1,154 @@ +package com.gregtechceu.gtceu.data.recipe.builder; + +import com.gregtechceu.gtceu.api.recipe.ingredient.NBTIngredient; + +import com.lowdragmc.lowdraglib.LDLib; +import com.lowdragmc.lowdraglib.utils.NBTToJsonConverter; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.level.ItemLike; + +import com.google.gson.JsonObject; +import lombok.Setter; +import lombok.experimental.Accessors; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Consumer; + +/** + * @author JuiceyBeans + * @date 2024/10/12 + * @implNote CampfireRecipeBuilder + */ +@Accessors(chain = true, fluent = true) +public class CampfireRecipeBuilder { + + private Ingredient input; + @Setter + protected String group; + + private ItemStack output = ItemStack.EMPTY; + @Setter + private float experience; + @Setter + private int cookingTime; + @Setter + protected ResourceLocation id; + + public CampfireRecipeBuilder(@Nullable ResourceLocation id) { + this.id = id; + } + + public CampfireRecipeBuilder input(TagKey itemStack) { + return input(Ingredient.of(itemStack)); + } + + public CampfireRecipeBuilder input(ItemStack itemStack) { + if (itemStack.hasTag() || itemStack.getDamageValue() > 0) { + input = NBTIngredient.createNBTIngredient(itemStack); + } else { + input = Ingredient.of(itemStack); + } + return this; + } + + public CampfireRecipeBuilder input(ItemLike itemLike) { + return input(Ingredient.of(itemLike)); + } + + public CampfireRecipeBuilder input(Ingredient ingredient) { + input = ingredient; + return this; + } + + public CampfireRecipeBuilder output(ItemStack itemStack) { + this.output = itemStack.copy(); + return this; + } + + public CampfireRecipeBuilder output(ItemStack itemStack, int count) { + this.output = itemStack.copy(); + this.output.setCount(count); + return this; + } + + public CampfireRecipeBuilder output(ItemStack itemStack, int count, CompoundTag nbt) { + this.output = itemStack.copy(); + this.output.setCount(count); + this.output.setTag(nbt); + return this; + } + + protected ResourceLocation defaultId() { + return BuiltInRegistries.ITEM.getKey(output.getItem()); + } + + public void toJson(JsonObject json) { + if (group != null) { + json.addProperty("group", group); + } + + if (!input.isEmpty()) { + json.add("ingredient", input.toJson()); + } + + if (output.isEmpty()) { + LDLib.LOGGER.error("shapeless recipe {} output is empty", id); + throw new IllegalArgumentException(id + ": output items is empty"); + } else { + JsonObject result = new JsonObject(); + result.addProperty("item", BuiltInRegistries.ITEM.getKey(output.getItem()).toString()); + if (output.getCount() > 1) { + result.addProperty("count", output.getCount()); + } + if (output.hasTag() && output.getTag() != null) { + result.add("nbt", NBTToJsonConverter.getObject(output.getTag())); + } + json.add("result", result); + } + + json.addProperty("experience", experience); + json.addProperty("cookingtime", cookingTime); + } + + public void save(Consumer consumer) { + consumer.accept(new FinishedRecipe() { + + @Override + public void serializeRecipeData(JsonObject pJson) { + toJson(pJson); + } + + @Override + public ResourceLocation getId() { + var ID = id == null ? defaultId() : id; + return new ResourceLocation(ID.getNamespace(), "campfire" + "/" + ID.getPath()); + } + + @Override + public RecipeSerializer getType() { + return RecipeSerializer.CAMPFIRE_COOKING_RECIPE; + } + + @Nullable + @Override + public JsonObject serializeAdvancement() { + return null; + } + + @Nullable + @Override + public ResourceLocation getAdvancementId() { + return null; + } + }); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/SmokingRecipeBuilder.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/SmokingRecipeBuilder.java index 1e4d0973ca..2cf526d892 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/SmokingRecipeBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/SmokingRecipeBuilder.java @@ -135,7 +135,7 @@ public ResourceLocation getId() { @Override public RecipeSerializer getType() { - return RecipeSerializer.BLASTING_RECIPE; + return RecipeSerializer.SMOKING_RECIPE; } @Nullable diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeRemoval.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeRemoval.java index 0993ac8346..1a265764aa 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeRemoval.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeRemoval.java @@ -272,6 +272,10 @@ private static void hardMiscRecipes(Consumer registry) { registry.accept(new ResourceLocation("minecraft:respawn_anchor")); registry.accept(new ResourceLocation("minecraft:lodestone")); registry.accept(new ResourceLocation("minecraft:chiseled_bookshelf")); + registry.accept(new ResourceLocation("minecraft:bread")); + registry.accept(new ResourceLocation("minecraft:cake")); + registry.accept(new ResourceLocation("minecraft:cookie")); + registry.accept(new ResourceLocation("minecraft:pumpkin_pie")); } private static void hardGlassRecipes(Consumer registry) { diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MiscRecipeLoader.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MiscRecipeLoader.java index c774185737..45c34e99eb 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MiscRecipeLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MiscRecipeLoader.java @@ -4,6 +4,7 @@ import com.gregtechceu.gtceu.api.data.chemical.material.MarkerMaterials.Color; import com.gregtechceu.gtceu.api.data.chemical.material.stack.UnificationEntry; import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.recipe.CustomTags; import com.gregtechceu.gtceu.data.recipe.VanillaRecipeHelper; import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; @@ -502,6 +503,98 @@ public static void init(Consumer provider) { .outputFluids(Water.getFluid(1000)) .duration(100).EUt(VA[LV]).save(provider); + if (!ConfigHolder.INSTANCE.recipes.hardMiscRecipes) { + VanillaRecipeHelper.addShapedRecipe(provider, "flour_to_dough", new ItemStack(DOUGH, 8), + "FFF", "FWF", "FFF", + 'F', ChemicalHelper.get(dust, Wheat), + 'W', Water.getBucket()); + + MIXER_RECIPES.recipeBuilder("flour_to_dough") + .inputItems(dust, Wheat, 2) + .inputFluids(Water.getFluid(250)) + .outputItems(DOUGH, 3) + .EUt(VA[ULV]) + .duration(200) + .save(provider); + + VanillaRecipeHelper.addShapelessRecipe(provider, "pumpkin_pie_from_dough", new ItemStack(Items.PUMPKIN_PIE), + new ItemStack(Blocks.PUMPKIN), new ItemStack(Items.SUGAR), new ItemStack(DOUGH)); + + VanillaRecipeHelper.addShapelessRecipe(provider, "cookie_from_dough", new ItemStack(Items.COOKIE, 8), + new ItemStack(DOUGH), new ItemStack(Items.COCOA_BEANS)); + + FORMING_PRESS_RECIPES.recipeBuilder("cookie") + .notConsumable(SHAPE_MOLD_CYLINDER) + .inputItems(DOUGH) + .inputItems(Items.COCOA_BEANS, 2) + .outputItems(Items.COOKIE, 12) + .EUt(VA[LV]) + .duration(200) + .save(provider); + + VanillaRecipeHelper.addShapedRecipe(provider, "cake_from_dough", new ItemStack(Items.CAKE), + "MMM", "SES", " D ", + 'E', Items.EGG, + 'S', Items.SUGAR, + 'M', Items.MILK_BUCKET, + 'D', DOUGH); + } else { + VanillaRecipeHelper.addShapedRecipe(provider, "flour_to_dough", new ItemStack(DOUGH, 4), + "FFF", "FWF", "FFF", + 'F', ChemicalHelper.get(dust, Wheat), + 'W', Water.getBucket()); + + MIXER_RECIPES.recipeBuilder("flour_to_dough") + .inputItems(dust, Wheat, 4) + .inputItems(Items.EGG, 2) + .inputFluids(Milk.getFluid(250)) // 1 bucket = 1000mB, hence 250mb. Also its infinitely renewable + .outputItems(DOUGH, 7) + .EUt(VA[ULV]) + .duration(400) + .save(provider); + + VanillaRecipeHelper.addShapelessRecipe(provider, "pumpkin_pie_from_dough", new ItemStack(Items.PUMPKIN_PIE), + new ItemStack(Blocks.PUMPKIN), new ItemStack(DOUGH), new ItemStack(Items.SUGAR), 'r', 'k'); + + VanillaRecipeHelper.addShapelessRecipe(provider, "cookie", new ItemStack(Items.COOKIE, 4), + new ItemStack(Items.COCOA_BEANS), new ItemStack(DOUGH), new ItemStack(Items.SUGAR), 'r'); + + FORMING_PRESS_RECIPES.recipeBuilder("cookie") + .notConsumable(SHAPE_MOLD_CYLINDER) + .inputItems(DOUGH) + .inputItems(Items.COCOA_BEANS, 2) + .inputItems(Items.SUGAR) + .outputItems(Items.COOKIE, 8) + .EUt(VA[LV]) + .duration(200) + .save(provider); + + VanillaRecipeHelper.addShapedRecipe(provider, "cake", new ItemStack(Items.CAKE), + "BBB", "SMS", "DDD", + 'B', Items.SWEET_BERRIES, + 'S', Items.SUGAR, + 'M', Items.MILK_BUCKET, + 'D', DOUGH); + } + + FORMING_PRESS_RECIPES.recipeBuilder("pumpkin_pie") + .notConsumable(SHAPE_MOLD_CYLINDER) + .inputItems(DOUGH, 2) + .inputItems(Items.PUMPKIN) + .inputItems(Items.SUGAR) + .outputItems(Items.PUMPKIN_PIE, 2) + .EUt(VA[LV]) + .duration(200) + .save(provider); + + // XP set to 0.35, similar to vanilla food smelting + VanillaRecipeHelper.addSmeltingRecipe(provider, "dough_to_bread", CustomTags.DOUGHS, new ItemStack(Items.BREAD), + 0.35f); + VanillaRecipeHelper.addCampfireRecipe(provider, "dough_to_bread", CustomTags.DOUGHS, new ItemStack(Items.BREAD), + 0.35f); + VanillaRecipeHelper.addSmokingRecipe(provider, "dough_to_bread", CustomTags.DOUGHS, new ItemStack(Items.BREAD), + 0.35f); + FORMING_PRESS_RECIPES.recipeBuilder("laminated_glass") .inputItems(GTBlocks.CASING_TEMPERED_GLASS.asStack(2)) .inputItems(plate, PolyvinylButyral) diff --git a/src/main/resources/assets/gtceu/textures/item/dough.png b/src/main/resources/assets/gtceu/textures/item/dough.png new file mode 100644 index 0000000000000000000000000000000000000000..e70339d297e2666f02147ece23e160303e9b9456 GIT binary patch literal 380 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9EFZXnDkGR4`Efq_xP z)5S5wLNGZ&g0<&HQ$kty^ZJyJS7yD9xY~GSgMxNT=9iMqi4Pt;Vf6m{<6mo{88h>Z z1JdUC%}1-m?>9)B)RIHLoH802Oh-Kh0o!nZ=xhT9yQ zSnr0VoK>jY!KlE;ae#-Z&BTSFx8-J!n$47*48~lOBScs8D**$IFEzq5&DWPf3&`dG UVi33#JQ+lJy85}Sb4q9e0Q4J^EC2ui literal 0 HcmV?d00001 From 42e093083bc64c8e86a8c50f36af87a3bf3e1bd8 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Sat, 12 Oct 2024 11:56:57 -0600 Subject: [PATCH 126/141] Fix magnetic double plate overlay (#2148) --- .../gtceu/models/item/material_sets/magnetic/plate_double.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magnetic/plate_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/magnetic/plate_double.json index 7c8573b187..a400f5cb9c 100644 --- a/src/main/resources/assets/gtceu/models/item/material_sets/magnetic/plate_double.json +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magnetic/plate_double.json @@ -1,6 +1,6 @@ { "parent": "gtceu:item/material_sets/metallic/plate_double", "textures": { - "layer4": "gtceu:item/material_sets/magnetic/magnetic_overlay" + "layer3": "gtceu:item/material_sets/magnetic/magnetic_overlay" } } From 488a37e91359a3e5c447cd295cece35d7d18fc67 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Sat, 12 Oct 2024 14:34:34 -0600 Subject: [PATCH 127/141] Fix Surface Rock model in inventories and player (#2155) --- .../gtceu/models/block/surface_rock.json | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/gtceu/models/block/surface_rock.json b/src/main/resources/assets/gtceu/models/block/surface_rock.json index 3127da2c8c..d03ef5d82e 100644 --- a/src/main/resources/assets/gtceu/models/block/surface_rock.json +++ b/src/main/resources/assets/gtceu/models/block/surface_rock.json @@ -1,6 +1,6 @@ { - "parent" : "block/block", "credit": "Made with Blockbench", + "parent": "block/block", "textures": { "1": "gtceu:block/stones/gravel", "2": "gtceu:block/stones/surface_rock_stone", @@ -114,6 +114,39 @@ } } ], + "display": { + "thirdperson_righthand": { + "rotation": [90, 0, 0], + "translation": [0, 2.25, 8], + "scale": [0.7, 1, 0.7] + }, + "thirdperson_lefthand": { + "rotation": [90, 0, 0], + "translation": [0, 2.25, 8], + "scale": [0.7, 1, 0.7] + }, + "firstperson_righthand": { + "rotation": [35, 0, 35], + "translation": [-5.25, 6.75, 6.5], + "scale": [0.7, 1, 0.7] + }, + "firstperson_lefthand": { + "rotation": [35, 0, 35], + "translation": [-5.25, 6.75, 6.5], + "scale": [0.7, 1, 0.7] + }, + "ground": { + "translation": [0, 5, 0] + }, + "gui": { + "rotation": [22.5, -45, -15], + "translation": [1.25, 6.25, 0] + }, + "fixed": { + "rotation": [-90, 0, 0], + "translation": [-0.25, 1, -7.5] + } + }, "groups": [ { "name": "ore_bits", @@ -123,4 +156,4 @@ }, 7 ] -} +} \ No newline at end of file From 303602b55765b8fe94d3ce9e692d20f3d0dddd0c Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 12 Oct 2024 23:34:53 +0300 Subject: [PATCH 128/141] fluid crafting table recipes (#2152) --- .../recipe/ShapedEnergyTransferRecipe.java | 2 +- .../recipe/ShapedFluidContainerRecipe.java | 161 ++++++++++++++++++ .../ingredient/FluidContainerIngredient.java | 146 ++++++++++++++++ .../gregtechceu/gtceu/common/CommonProxy.java | 5 + .../gtceu/common/data/GTFluids.java | 2 + .../gtceu/common/data/GTRecipeTypes.java | 12 +- .../core/mixins/ShapedRecipeAccessor.java | 8 +- .../data/recipe/VanillaRecipeHelper.java | 89 ++++++++++ .../ShapedFluidContainerRecipeBuilder.java | 52 ++++++ .../recipe/configurable/RecipeAddition.java | 10 +- .../recipe/misc/CraftingRecipeLoader.java | 8 +- .../recipe/misc/VanillaStandardRecipes.java | 4 +- .../data/recipe/misc/WoodMachineRecipes.java | 9 - .../com/gregtechceu/gtceu/utils/GTUtil.java | 20 --- .../gtceu/utils/InfiniteFluidTransfer.java | 64 +++++++ 15 files changed, 546 insertions(+), 46 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/api/recipe/ShapedFluidContainerRecipe.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/FluidContainerIngredient.java create mode 100644 src/main/java/com/gregtechceu/gtceu/data/recipe/builder/ShapedFluidContainerRecipeBuilder.java create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/InfiniteFluidTransfer.java diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/ShapedEnergyTransferRecipe.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/ShapedEnergyTransferRecipe.java index 56a45edac5..951d2e8ae9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/ShapedEnergyTransferRecipe.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/ShapedEnergyTransferRecipe.java @@ -135,7 +135,7 @@ public void toNetwork(FriendlyByteBuf buffer, ShapedEnergyTransferRecipe recipe) for (Ingredient ingredient : recipe.getIngredients()) { ingredient.toNetwork(buffer); } - buffer.writeItem(((ShapedRecipeAccessor) this).getResult()); + buffer.writeItem(((ShapedRecipeAccessor) recipe).getResult()); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/ShapedFluidContainerRecipe.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/ShapedFluidContainerRecipe.java new file mode 100644 index 0000000000..6ebeac1570 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/ShapedFluidContainerRecipe.java @@ -0,0 +1,161 @@ +package com.gregtechceu.gtceu.api.recipe; + +import com.gregtechceu.gtceu.api.recipe.ingredient.FluidContainerIngredient; +import com.gregtechceu.gtceu.core.mixins.ShapedRecipeAccessor; + +import net.minecraft.core.NonNullList; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingBookCategory; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.ShapedRecipe; + +import com.google.gson.JsonObject; +import com.mojang.datafixers.util.Pair; +import org.jetbrains.annotations.NotNull; + +import java.util.Map; + +// TODO shapeless fluid container recipes +public class ShapedFluidContainerRecipe extends ShapedRecipe { + + public static final RecipeSerializer SERIALIZER = new Serializer(); + + public ShapedFluidContainerRecipe(ResourceLocation id, String group, CraftingBookCategory category, + int width, int height, + NonNullList recipeItems, ItemStack result, + boolean showNotification) { + super(id, group, category, width, height, recipeItems, result, showNotification); + } + + public ShapedFluidContainerRecipe(ResourceLocation id, String group, CraftingBookCategory category, + int width, int height, + NonNullList recipeItems, ItemStack result) { + this(id, group, category, width, height, recipeItems, result, true); + } + + @Override + public @NotNull NonNullList getRemainingItems(@NotNull CraftingContainer inv) { + NonNullList items = NonNullList.withSize(inv.getContainerSize(), ItemStack.EMPTY); + + // figure out all the fluid container ingredients' remainders. + int replacedSlot = -1; + OUTER_LOOP: + for (int x = 0; x <= inv.getWidth() - this.getWidth(); ++x) { + for (int y = 0; y <= inv.getHeight() - this.getHeight(); ++y) { + var stack = this.findFluidReplacement(inv, x, y, false); + if (stack.getFirst() != -1) { + items.set(stack.getFirst(), stack.getSecond()); + replacedSlot = stack.getFirst(); + break OUTER_LOOP; + } + + stack = this.findFluidReplacement(inv, x, y, true); + if (stack.getFirst() != -1) { + items.set(stack.getFirst(), stack.getSecond()); + replacedSlot = stack.getFirst(); + break OUTER_LOOP; + } + } + } + + for (int i = 0; i < items.size(); ++i) { + if (i == replacedSlot) { + continue; + } + ItemStack item = inv.getItem(i); + if (item.hasCraftingRemainingItem()) { + items.set(i, item.getCraftingRemainingItem()); + } + } + + return items; + } + + /** + * Checks if the region of a crafting inventory is match for the recipe. + */ + private Pair findFluidReplacement(CraftingContainer inv, int width, int height, + boolean mirrored) { + for (int x = 0; x < inv.getWidth(); ++x) { + for (int y = 0; y < inv.getHeight(); ++y) { + int offsetX = x - width; + int offsetY = y - height; + Ingredient ingredient = Ingredient.EMPTY; + if (offsetX >= 0 && offsetY >= 0 && offsetX < this.getWidth() && offsetY < this.getHeight()) { + if (mirrored) { + ingredient = this.getIngredients() + .get(this.getWidth() - offsetX - 1 + offsetY * this.getWidth()); + } else { + ingredient = this.getIngredients().get(offsetX + offsetY * this.getWidth()); + } + } + + if (ingredient instanceof FluidContainerIngredient fluidContainerIngredient) { + int slot = x + y * inv.getWidth(); + ItemStack stack = inv.getItem(slot); + if (fluidContainerIngredient.test(stack)) { + return Pair.of(slot, fluidContainerIngredient.getExtractedStack(stack)); + } + } + } + } + + return Pair.of(-1, ItemStack.EMPTY); + } + + public static class Serializer implements RecipeSerializer { + + @Override + public ShapedFluidContainerRecipe fromJson(ResourceLocation recipeId, JsonObject json) { + String group = GsonHelper.getAsString(json, "group", ""); + CraftingBookCategory category = CraftingBookCategory.CODEC + .byName(GsonHelper.getAsString(json, "category", null), CraftingBookCategory.MISC); + Map key = ShapedRecipeAccessor.callKeyFromJson(GsonHelper.getAsJsonObject(json, "key")); + String[] pattern = ShapedRecipeAccessor + .callShrink(ShapedRecipeAccessor.callPatternFromJson(GsonHelper.getAsJsonArray(json, "pattern"))); + int xSize = pattern[0].length(); + int ySize = pattern.length; + NonNullList dissolved = ShapedRecipeAccessor.callDissolvePattern(pattern, key, xSize, ySize); + ItemStack result = ShapedEnergyTransferRecipe.itemStackFromJson(GsonHelper.getAsJsonObject(json, "result")); + boolean showNotification = GsonHelper.getAsBoolean(json, "show_notification", true); + return new ShapedFluidContainerRecipe(recipeId, group, category, + xSize, ySize, + dissolved, result, + showNotification); + } + + @Override + public ShapedFluidContainerRecipe fromNetwork(ResourceLocation recipeId, FriendlyByteBuf buffer) { + int xSize = buffer.readVarInt(); + int ySize = buffer.readVarInt(); + CraftingBookCategory category = buffer.readEnum(CraftingBookCategory.class); + String group = buffer.readUtf(); + NonNullList ingredients = NonNullList.withSize(xSize * ySize, Ingredient.EMPTY); + ingredients.replaceAll($ -> Ingredient.fromNetwork(buffer)); + ItemStack result = buffer.readItem(); + boolean showNotification = buffer.readBoolean(); + return new ShapedFluidContainerRecipe(recipeId, group, category, + xSize, ySize, + ingredients, result, + showNotification); + } + + @Override + public void toNetwork(FriendlyByteBuf buffer, ShapedFluidContainerRecipe recipe) { + buffer.writeVarInt(recipe.getWidth()); + buffer.writeVarInt(recipe.getHeight()); + buffer.writeEnum(recipe.category()); + buffer.writeUtf(recipe.getGroup()); + for (Ingredient ingredient : recipe.getIngredients()) { + ingredient.toNetwork(buffer); + } + buffer.writeItem(((ShapedRecipeAccessor) recipe).getResult()); + buffer.writeBoolean(recipe.showNotification()); + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/FluidContainerIngredient.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/FluidContainerIngredient.java new file mode 100644 index 0000000000..d7f94a70a3 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/FluidContainerIngredient.java @@ -0,0 +1,146 @@ +package com.gregtechceu.gtceu.api.recipe.ingredient; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.tag.TagUtil; +import com.gregtechceu.gtceu.utils.InfiniteFluidTransfer; + +import com.lowdragmc.lowdraglib.side.fluid.*; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.material.Fluid; +import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.common.crafting.IIngredientSerializer; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; +import lombok.Getter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; +import java.util.stream.Stream; + +import javax.annotation.Nonnull; + +public class FluidContainerIngredient extends Ingredient { + + public static final ResourceLocation TYPE = GTCEu.id("fluid_container"); + + public static final Codec CODEC = FluidIngredient.CODEC.xmap( + FluidContainerIngredient::new, FluidContainerIngredient::getFluid); + + @Getter + private final FluidIngredient fluid; + + public FluidContainerIngredient(FluidIngredient fluid) { + super(Stream.empty()); + this.fluid = fluid; + } + + public FluidContainerIngredient(FluidStack fluidStack) { + this(FluidIngredient.of(TagUtil.createFluidTag(BuiltInRegistries.FLUID.getKey(fluidStack.getFluid()).getPath()), + fluidStack.getAmount())); + } + + public FluidContainerIngredient(TagKey tag, int amount) { + this(FluidIngredient.of(tag, amount, null)); + } + + private ItemStack[] cachedStacks; + + @Nonnull + @Override + public ItemStack[] getItems() { + if (cachedStacks == null) + cachedStacks = Arrays.stream(this.fluid.getStacks()) + .map(stack -> stack.getFluid().getBucket().getDefaultInstance()) + .filter(s -> !s.isEmpty()) + .toArray(ItemStack[]::new); + return this.cachedStacks; + } + + @Override + public JsonElement toJson() { + JsonObject json = new JsonObject(); + json.addProperty("type", TYPE.toString()); + json.add("fluid", fluid.toJson()); + return json; + } + + @Override + public boolean isEmpty() { + return this.fluid.isEmpty(); + } + + @Override + public boolean test(@Nullable ItemStack stack) { + if (stack == null || stack.isEmpty()) + return false; + IFluidTransfer transfer = FluidTransferHelper.getFluidTransfer(stack); + return transfer != null && this.extractFrom(transfer, true); + } + + @Override + public boolean isSimple() { + return false; + } + + public ItemStack getExtractedStack(ItemStack input) { + FluidActionResult result = FluidTransferHelper.tryEmptyContainer(input, + new InfiniteFluidTransfer(1), + (int) this.fluid.getAmount(), + ForgeHooks.getCraftingPlayer(), + true); + if (result.success) { + return result.result; + } + return input; + } + + public boolean extractFrom(IFluidTransfer handler, boolean simulate) { + for (int tank = 0; tank < handler.getTanks(); tank++) { + FluidStack inTank = handler.getFluidInTank(tank); + if (fluid.test(inTank)) { + FluidStack toExtract = inTank.copy(fluid.getAmount()); + FluidStack extractedSim = handler.drain(toExtract, true); + if (extractedSim.getAmount() >= fluid.getAmount()) { + if (!simulate) + handler.drain(toExtract, false); + return true; + } + } + } + return false; + } + + public static FluidContainerIngredient fromJson(JsonObject json) { + return SERIALIZER.parse(json); + } + + public static final IIngredientSerializer SERIALIZER = new IIngredientSerializer<>() { + + @Override + public @NotNull FluidContainerIngredient parse(FriendlyByteBuf buffer) { + FluidIngredient fluid = FluidIngredient.fromNetwork(buffer); + return new FluidContainerIngredient(fluid); + } + + @Override + public @NotNull FluidContainerIngredient parse(JsonObject json) { + FluidIngredient fluid = FluidIngredient.fromJson(GsonHelper.getAsJsonObject(json, "fluid")); + return new FluidContainerIngredient(fluid); + } + + @Override + public void write(FriendlyByteBuf buffer, FluidContainerIngredient ingredient) { + ingredient.fluid.toNetwork(buffer); + } + }; +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java index 00355d94e1..3395a93b96 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java @@ -20,6 +20,7 @@ import com.gregtechceu.gtceu.api.gui.factory.GTUIEditorFactory; import com.gregtechceu.gtceu.api.gui.factory.MachineUIFactory; import com.gregtechceu.gtceu.api.recipe.chance.logic.ChanceLogic; +import com.gregtechceu.gtceu.api.recipe.ingredient.FluidContainerIngredient; import com.gregtechceu.gtceu.api.recipe.ingredient.IntCircuitIngredient; import com.gregtechceu.gtceu.api.recipe.ingredient.IntProviderIngredient; import com.gregtechceu.gtceu.api.recipe.ingredient.SizedIngredient; @@ -53,6 +54,7 @@ import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.server.packs.PackType; import net.minecraft.server.packs.repository.Pack; +import net.minecraftforge.common.ForgeMod; import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent; import net.minecraftforge.common.crafting.CraftingHelper; import net.minecraftforge.event.AddPackFindersEvent; @@ -78,6 +80,8 @@ public class CommonProxy { public CommonProxy() { + ForgeMod.enableMilkFluid(); + // used for forge events (ClientProxy + CommonProxy) IEventBus eventBus = FMLJavaModLoadingContext.get().getModEventBus(); eventBus.register(this); @@ -229,6 +233,7 @@ public void commonSetup(FMLCommonSetupEvent event) { CraftingHelper.register(SizedIngredient.TYPE, SizedIngredient.SERIALIZER); CraftingHelper.register(IntCircuitIngredient.TYPE, IntCircuitIngredient.SERIALIZER); CraftingHelper.register(IntProviderIngredient.TYPE, IntProviderIngredient.SERIALIZER); + CraftingHelper.register(FluidContainerIngredient.TYPE, FluidContainerIngredient.SERIALIZER); }); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTFluids.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTFluids.java index 1bb842323b..54d91888ec 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTFluids.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTFluids.java @@ -9,6 +9,7 @@ import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.material.Fluids; +import net.minecraftforge.common.ForgeMod; import org.jetbrains.annotations.NotNull; @@ -24,6 +25,7 @@ public class GTFluids { public static void init() { handleNonMaterialFluids(GTMaterials.Water, Fluids.WATER); handleNonMaterialFluids(GTMaterials.Lava, Fluids.LAVA); + handleNonMaterialFluids(GTMaterials.Milk, ForgeMod.MILK.get()); REGISTRATE.creativeModeTab(() -> GTCreativeModeTabs.MATERIAL_FLUID); // register fluids for materials for (MaterialRegistry registry : GTCEuAPI.materialManager.getRegistries()) { 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 84f8f6eae1..d72b5d125a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java @@ -716,16 +716,18 @@ public static void init() { ModLoader.get().postEvent(new GTCEuAPI.RegisterEvent<>(GTRegistries.RECIPE_TYPES, GTRecipeType.class)); GTRegistries.RECIPE_TYPES.freeze(); - GTRegistries.register(BuiltInRegistries.RECIPE_SERIALIZER, GTCEu.id("gt_recipe_serializer"), + GTRegistries.register(BuiltInRegistries.RECIPE_SERIALIZER, GTCEu.id("machine"), GTRecipeSerializer.SERIALIZER); - GTRegistries.register(BuiltInRegistries.RECIPE_SERIALIZER, GTCEu.id("facade_cover_serializer"), + GTRegistries.register(BuiltInRegistries.RECIPE_SERIALIZER, GTCEu.id("crafting_facade_cover"), FacadeCoverRecipe.SERIALIZER); - GTRegistries.register(BuiltInRegistries.RECIPE_SERIALIZER, GTCEu.id("strict_shaped_recipe_serializer"), + GTRegistries.register(BuiltInRegistries.RECIPE_SERIALIZER, GTCEu.id("crafting_shaped_strict"), StrictShapedRecipe.SERIALIZER); - GTRegistries.register(BuiltInRegistries.RECIPE_SERIALIZER, GTCEu.id("shaped_energy_transfer_recipe_serializer"), + GTRegistries.register(BuiltInRegistries.RECIPE_SERIALIZER, GTCEu.id("crafting_shaped_energy_transfer"), ShapedEnergyTransferRecipe.SERIALIZER); - GTRegistries.register(BuiltInRegistries.RECIPE_SERIALIZER, GTCEu.id("tool_head_replace_recipe_serializer"), + GTRegistries.register(BuiltInRegistries.RECIPE_SERIALIZER, GTCEu.id("crafting_tool_head_replace"), ToolHeadReplaceRecipe.SERIALIZER); + GTRegistries.register(BuiltInRegistries.RECIPE_SERIALIZER, GTCEu.id("crafting_shaped_fluid_container"), + ShapedFluidContainerRecipe.SERIALIZER); } public static GTRecipeType get(String name) { diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/ShapedRecipeAccessor.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/ShapedRecipeAccessor.java index b26ca317a7..474fcf0c07 100644 --- a/src/main/java/com/gregtechceu/gtceu/core/mixins/ShapedRecipeAccessor.java +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/ShapedRecipeAccessor.java @@ -23,23 +23,23 @@ public interface ShapedRecipeAccessor { @Invoker static Map callKeyFromJson(JsonObject keyEntry) { - return null; + throw new AssertionError(); } @Invoker static String[] callPatternFromJson(JsonArray patternArray) { - return null; + throw new AssertionError(); } @Invoker static NonNullList callDissolvePattern(String[] pattern, Map keys, int patternWidth, int patternHeight) { - return null; + throw new AssertionError(); } @Invoker static String[] callShrink(String... toShrink) { - return null; + throw new AssertionError(); } @Accessor diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java index ffabd7110a..6694452f07 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java @@ -377,6 +377,95 @@ public static void addShapedEnergyTransferRecipe(Consumer provid GTCEu.id(regName), chargeIngredient, result, recipe); } + public static void addShapedFluidContainerRecipe(Consumer provider, boolean withUnificationData, + boolean isStrict, + @NotNull ResourceLocation regName, @NotNull ItemStack result, + @NotNull Object... recipe) { + var builder = new ShapedFluidContainerRecipeBuilder(regName).output(result); + builder.isStrict(isStrict); + CharSet set = new CharOpenHashSet(); + for (int i = 0; i < recipe.length; i++) { + var o = recipe[i]; + if (o instanceof String pattern) { + builder.pattern(pattern); + for (Character c : ToolHelper.getToolSymbols()) { + if (pattern.indexOf(c) >= 0) { + set.add(c.charValue()); + } + } + } + if (o instanceof String[] pattern) { + for (String s : pattern) { + builder.pattern(s); + for (Character c : ToolHelper.getToolSymbols()) { + if (s.indexOf(c) >= 0) { + set.add(c.charValue()); + } + } + } + } + if (o instanceof Character sign) { + var content = recipe[i + 1]; + i++; + if (content instanceof Ingredient ingredient) { + builder.define(sign, ingredient); + } else if (content instanceof ItemStack itemStack) { + builder.define(sign, itemStack); + } else if (content instanceof TagKey key) { + builder.define(sign, (TagKey) key); + } else if (content instanceof TagPrefix prefix) { + if (prefix.getItemParentTags().length > 0) { + builder.define(sign, prefix.getItemParentTags()[0]); + } + } else if (content instanceof ItemLike itemLike) { + builder.define(sign, itemLike); + } else if (content instanceof UnificationEntry entry) { + TagKey tag = ChemicalHelper.getTag(entry.tagPrefix, entry.material); + if (tag != null) { + builder.define(sign, tag); + } else builder.define(sign, ChemicalHelper.get(entry.tagPrefix, entry.material)); + } else if (content instanceof ItemProviderEntry entry) { + builder.define(sign, entry.asStack()); + } + } + } + for (Character c : set) { + builder.define(c, ToolHelper.getToolFromSymbol(c).itemTags.get(0)); + } + + builder.save(provider); + + if (withUnificationData) { + ChemicalHelper.registerMaterialInfo(result.getItem(), getRecyclingIngredients(result.getCount(), recipe)); + } + } + + public static void addShapedFluidContainerRecipe(Consumer provider, boolean withUnificationData, + @NotNull String regName, @NotNull ItemStack result, + @NotNull Object... recipe) { + addShapedFluidContainerRecipe(provider, withUnificationData, GTCEu.id(regName), result, recipe); + } + + public static void addShapedFluidContainerRecipe(Consumer provider, boolean withUnificationData, + @NotNull ResourceLocation regName, @NotNull ItemStack result, + + @NotNull Object... recipe) { + addShapedFluidContainerRecipe(provider, withUnificationData, false, regName, result, recipe); + } + + public static void addShapedFluidContainerRecipe(Consumer provider, @NotNull String regName, + @NotNull ItemStack result, + @NotNull Object... recipe) { + addShapedFluidContainerRecipe(provider, GTCEu.id(regName), result, recipe); + } + + public static void addShapedFluidContainerRecipe(Consumer provider, + @NotNull ResourceLocation regName, + @NotNull ItemStack result, + @NotNull Object... recipe) { + addShapedFluidContainerRecipe(provider, false, regName, result, recipe); + } + /** * Adds a shapeless recipe which clears the nbt of the outputs * diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/ShapedFluidContainerRecipeBuilder.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/ShapedFluidContainerRecipeBuilder.java new file mode 100644 index 0000000000..f74f871570 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/ShapedFluidContainerRecipeBuilder.java @@ -0,0 +1,52 @@ +package com.gregtechceu.gtceu.data.recipe.builder; + +import com.gregtechceu.gtceu.api.recipe.ShapedFluidContainerRecipe; + +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.RecipeSerializer; + +import com.google.gson.JsonObject; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Consumer; + +public class ShapedFluidContainerRecipeBuilder extends ShapedRecipeBuilder { + + public ShapedFluidContainerRecipeBuilder(@Nullable ResourceLocation id) { + super(id); + } + + public void save(Consumer consumer) { + consumer.accept(new FinishedRecipe() { + + @Override + public void serializeRecipeData(JsonObject pJson) { + toJson(pJson); + } + + @Override + public ResourceLocation getId() { + var ID = id == null ? defaultId() : id; + return new ResourceLocation(ID.getNamespace(), "shaped_fluid_container/" + ID.getPath()); + } + + @Override + public RecipeSerializer getType() { + return ShapedFluidContainerRecipe.SERIALIZER; + } + + @Nullable + @Override + public JsonObject serializeAdvancement() { + return null; + } + + @Nullable + @Override + public ResourceLocation getAdvancementId() { + return null; + } + }); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java index 53d5071413..cd4dba1860 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java @@ -5,6 +5,7 @@ import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.chemical.material.stack.UnificationEntry; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; +import com.gregtechceu.gtceu.api.recipe.ingredient.FluidContainerIngredient; import com.gregtechceu.gtceu.common.data.*; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.recipe.VanillaRecipeHelper; @@ -95,10 +96,11 @@ private static void disableManualCompression(Consumer provider) private static void harderBrickRecipes(Consumer provider) { if (ConfigHolder.INSTANCE.recipes.harderBrickRecipes) { - VanillaRecipeHelper.addShapedRecipe(provider, "brick_from_water", new ItemStack(Blocks.BRICKS, 2), "BBB", + VanillaRecipeHelper.addShapedFluidContainerRecipe(provider, "brick_from_water", + new ItemStack(Blocks.BRICKS, 2), "BBB", "BWB", "BBB", 'B', new ItemStack(Items.BRICK), - 'W', new ItemStack(Items.WATER_BUCKET)); + 'W', new FluidContainerIngredient(Water.getFluidTag(), 1000)); VanillaRecipeHelper.addShapedRecipe(provider, "bucket_of_concrete", new ItemStack(Concrete.getBucket()), "CBS", "CWQ", " L ", @@ -109,12 +111,12 @@ private static void harderBrickRecipes(Consumer provider) { 'L', new UnificationEntry(dust, Clay), 'B', new ItemStack(Items.BUCKET)); - VanillaRecipeHelper.addShapedRecipe(provider, "casing_primitive_bricks", + VanillaRecipeHelper.addShapedFluidContainerRecipe(provider, "casing_primitive_bricks", GTBlocks.CASING_PRIMITIVE_BRICKS.asStack(), "BGB", "BCB", "BGB", 'B', GTItems.FIRECLAY_BRICK.asStack(), 'G', new UnificationEntry(dust, Gypsum), - 'C', new ItemStack(Concrete.getBucket())); + 'C', new FluidContainerIngredient(Concrete.getFluidTag(), 1000)); VanillaRecipeHelper.addShapelessRecipe(provider, "compressed_clay", COMPRESSED_CLAY.asStack(), WOODEN_FORM_BRICK.asStack(), new ItemStack(Items.CLAY_BALL)); diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CraftingRecipeLoader.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CraftingRecipeLoader.java index c3e07eb44b..b70d6bf9e3 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CraftingRecipeLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CraftingRecipeLoader.java @@ -3,6 +3,7 @@ import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; import com.gregtechceu.gtceu.api.data.chemical.material.stack.UnificationEntry; import com.gregtechceu.gtceu.api.recipe.FacadeCoverRecipe; +import com.gregtechceu.gtceu.api.recipe.ingredient.FluidContainerIngredient; import com.gregtechceu.gtceu.common.data.GTBlocks; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.data.recipe.CustomTags; @@ -94,8 +95,10 @@ public static void init(Consumer provider) { // Items.PAPER, 'R', new UnificationEntry(springSmall, Iron), 'B', new UnificationEntry(bolt, Iron), 'S', new // UnificationEntry(screw, Iron), 'W', new UnificationEntry(plate, Wood)); - VanillaRecipeHelper.addShapedRecipe(provider, "treated_wood_planks", GTBlocks.TREATED_WOOD_PLANK.asStack(8), - "PPP", "PBP", "PPP", 'P', ItemTags.PLANKS, 'B', Creosote.getBucket()); + VanillaRecipeHelper.addShapedFluidContainerRecipe(provider, "treated_wood_planks", + GTBlocks.TREATED_WOOD_PLANK.asStack(8), + "PPP", "PBP", "PPP", 'P', ItemTags.PLANKS, 'B', + new FluidContainerIngredient(Creosote.getFluidTag(), 1000)); VanillaRecipeHelper.addShapedRecipe(provider, "rubber_ring", ChemicalHelper.get(ring, Rubber), "k", "X", 'X', new UnificationEntry(plate, Rubber)); @@ -234,6 +237,7 @@ public static void init(Consumer provider) { /////////////////////////////////////////////////// // Credits // /////////////////////////////////////////////////// + // TODO shapeless fluid container recipes VanillaRecipeHelper.addShapelessRecipe(provider, "coin_chocolate", COIN_CHOCOLATE.asStack(), new UnificationEntry(dust, Cocoa), new UnificationEntry(foil, Gold), new ItemStack(Items.MILK_BUCKET), new UnificationEntry(dust, Sugar)); 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 ffe961831d..ad4f29c714 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 @@ -3,6 +3,7 @@ import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; import com.gregtechceu.gtceu.api.data.chemical.material.stack.UnificationEntry; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; +import com.gregtechceu.gtceu.api.recipe.ingredient.FluidContainerIngredient; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.recipe.CustomTags; @@ -459,7 +460,8 @@ private static void woodRecipes(Consumer provider) { VanillaRecipeHelper.addShapedRecipe(provider, "torch_coke_dust", new ItemStack(Blocks.TORCH, 8), "C", "S", 'C', new UnificationEntry(dust, Coke), 'S', new ItemStack(Items.STICK)); VanillaRecipeHelper.addShapedRecipe(provider, "torch_creosote", new ItemStack(Blocks.TORCH, 16), "WB", "S ", - 'W', ItemTags.WOOL, 'S', new ItemStack(Items.STICK), 'B', Creosote.getBucket()); + 'W', ItemTags.WOOL, 'S', new ItemStack(Items.STICK), 'B', + new FluidContainerIngredient(Creosote.getFluidTag(), 1000)); VanillaRecipeHelper.addShapedRecipe(provider, "soul_torch", new ItemStack(Blocks.SOUL_TORCH, 1), "WB", 'W', ItemTags.SOUL_FIRE_BASE_BLOCKS, 'B', new ItemStack(Blocks.TORCH)); 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 654b938704..36fcb1e7c7 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 @@ -14,8 +14,6 @@ import com.gregtechceu.gtceu.data.recipe.VanillaRecipeHelper; import com.gregtechceu.gtceu.data.recipe.WoodTypeEntry; -import com.lowdragmc.lowdraglib.side.fluid.forge.FluidHelperImpl; - import net.minecraft.data.recipes.FinishedRecipe; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.ItemTags; @@ -24,7 +22,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraftforge.common.Tags; -import net.minecraftforge.fluids.FluidUtil; import org.jetbrains.annotations.NotNull; @@ -807,12 +804,6 @@ public static void registerWoodTypeRecipe(Consumer provider, @No * Standard recipes for GT woods */ private static void registerGTWoodRecipes(Consumer provider) { - VanillaRecipeHelper.addShapedRecipe(provider, "treated_wood_planks", - GTBlocks.TREATED_WOOD_PLANK.asStack(8), - "PPP", "PBP", "PPP", - 'P', ItemTags.PLANKS, - 'B', FluidUtil.getFilledBucket(FluidHelperImpl.toFluidStack(Creosote.getFluid(1000)))); - VanillaRecipeHelper.addShapedRecipe(provider, "treated_wood_stick", ChemicalHelper.get(rod, TreatedWood, ConfigHolder.INSTANCE.recipes.nerfWoodCrafting ? 2 : 4), "L", "L", diff --git a/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java b/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java index ad4a2d14c0..4921fb4965 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java @@ -13,8 +13,6 @@ import com.lowdragmc.lowdraglib.LDLib; import com.lowdragmc.lowdraglib.side.fluid.FluidHelper; import com.lowdragmc.lowdraglib.side.fluid.FluidStack; -import com.lowdragmc.lowdraglib.side.fluid.FluidTransferHelper; -import com.lowdragmc.lowdraglib.side.fluid.IFluidTransfer; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; @@ -409,24 +407,6 @@ public static Fluid getMoltenFluid(@NotNull Material material) { return null; } - /** - * Get fluidstack from a container. - * - * @param ingredient the fluidstack or fluid container item - * @return the fluidstack in container - */ - @Nullable - public static FluidStack getFluidFromContainer(Object ingredient) { - if (ingredient instanceof FluidStack) { - return (FluidStack) ingredient; - } else if (ingredient instanceof ItemStack itemStack) { - IFluidTransfer fluidHandler = FluidTransferHelper.getFluidTransfer(itemStack); - if (fluidHandler != null) - return fluidHandler.drain(Integer.MAX_VALUE, false); - } - return null; - } - public static boolean canSeeSunClearly(Level world, BlockPos blockPos) { if (!world.canSeeSky(blockPos.above())) { return false; diff --git a/src/main/java/com/gregtechceu/gtceu/utils/InfiniteFluidTransfer.java b/src/main/java/com/gregtechceu/gtceu/utils/InfiniteFluidTransfer.java new file mode 100644 index 0000000000..f61f4508f7 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/utils/InfiniteFluidTransfer.java @@ -0,0 +1,64 @@ +package com.gregtechceu.gtceu.utils; + +import com.lowdragmc.lowdraglib.side.fluid.FluidStack; +import com.lowdragmc.lowdraglib.side.fluid.IFluidTransfer; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.NotNull; + +@RequiredArgsConstructor +public class InfiniteFluidTransfer implements IFluidTransfer { + + @Getter + private final int tanks; + + @NotNull + @Override + public FluidStack getFluidInTank(int tank) { + return FluidStack.empty(); + } + + @Override + public void setFluidInTank(int tank, @NotNull FluidStack fluidStack) {} + + @Override + public long getTankCapacity(int tank) { + return Long.MAX_VALUE; + } + + @Override + public boolean isFluidValid(int tank, @NotNull FluidStack stack) { + return true; + } + + @Override + public long fill(int tank, FluidStack resource, boolean simulate, boolean notifyChanges) { + return resource.getAmount(); + } + + @Override + public boolean supportsFill(int tank) { + return true; + } + + @NotNull + @Override + public FluidStack drain(int tank, FluidStack resource, boolean simulate, boolean notifyChanges) { + return resource.copy(); + } + + @Override + public boolean supportsDrain(int tank) { + return true; + } + + @NotNull + @Override + public Object createSnapshot() { + return new Object(); + } + + @Override + public void restoreFromSnapshot(Object snapshot) {} +} From b64bf38c65f585a26b9d5d66d73b7d6de2ceae31 Mon Sep 17 00:00:00 2001 From: Karthi Suresh <75553966+JuiceyBeans@users.noreply.github.com> Date: Sat, 12 Oct 2024 21:39:16 +0100 Subject: [PATCH 129/141] Fix various recipe and item issues (#2077) Co-authored-by: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> --- .../resources/assets/gtceu/lang/en_ud.json | 14 +- .../resources/assets/gtceu/lang/en_us.json | 14 +- .../minecraft/tags/blocks/mineable/axe.json | 4 +- .../gtceu/common/data/GTMaterials.java | 2 +- .../gtceu/data/lang/BlockLang.java | 4 +- .../gregtechceu/gtceu/data/lang/ItemLang.java | 9 +- .../gtceu/data/recipe/WoodTypeEntry.java | 134 +++++-- .../recipe/configurable/RecipeAddition.java | 352 ++++-------------- .../recipe/configurable/RecipeRemoval.java | 104 +++--- .../data/recipe/misc/BatteryRecipes.java | 4 +- .../recipe/misc/CraftingRecipeLoader.java | 2 + .../gtceu/data/recipe/misc/FusionLoader.java | 6 +- .../gtceu/data/recipe/misc/GCyMRecipes.java | 2 +- .../data/recipe/misc/MachineRecipeLoader.java | 2 +- .../recipe/misc/MetaTileEntityLoader.java | 7 - .../data/recipe/misc/MiscRecipeLoader.java | 7 + .../recipe/misc/VanillaStandardRecipes.java | 87 ++++- .../data/recipe/misc/WoodMachineRecipes.java | 156 ++++++-- .../serialized/chemistry/PolymerRecipes.java | 18 +- .../serialized/chemistry/ReactorRecipes.java | 14 +- .../gtceu/data/tags/BlockTagLoader.java | 6 + 21 files changed, 470 insertions(+), 478 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index ab960d2cf8..fc1454a337 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -114,7 +114,7 @@ "block.gtceu.blue_studs": "spnʇS ǝnןᗺ", "block.gtceu.boss_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH ssoᗺ", "block.gtceu.brittle_charcoal": "ןɐoɔɹɐɥƆ ǝןʇʇıɹᗺ", - "block.gtceu.bronze_brick_casing": "buısɐƆ ʞɔıɹᗺ ǝzuoɹᗺ", + "block.gtceu.bronze_brick_casing": "buısɐƆ ǝzuoɹᗺ pǝʞɔıɹᗺ", "block.gtceu.bronze_crate": "ǝʇɐɹƆ ǝzuoɹᗺ", "block.gtceu.bronze_drum": "ɯnɹᗡ ǝzuoɹᗺ", "block.gtceu.bronze_firebox_casing": "buısɐƆ xoqǝɹıℲ ǝzuoɹᗺ", @@ -127,10 +127,8 @@ "block.gtceu.brown_large_metal_sheet": "ʇǝǝɥS ןɐʇǝW ǝbɹɐꞀ uʍoɹᗺ", "block.gtceu.brown_metal_sheet": "ʇǝǝɥS ןɐʇǝW uʍoɹᗺ", "block.gtceu.brown_studs": "spnʇS uʍoɹᗺ", - "block.gtceu.casing_bronze_bricks": "buısɐƆ ǝuıɥɔɐW ǝzuoɹᗺ", "block.gtceu.casing_coke_bricks": "sʞɔıɹᗺ uǝʌO ǝʞoƆ", "block.gtceu.casing_grate": "buısɐƆ ǝuıɥɔɐW ǝʇɐɹ⅁", - "block.gtceu.casing_primitive_bricks": "sʞɔıɹqǝɹıℲ", "block.gtceu.causality_hazard_sign_block": "ʞɔoןᗺ ubıS pɹɐzɐH ʎʇıןɐsnɐƆ", "block.gtceu.charcoal_pile_igniter": "ɹǝʇıubI ǝןıԀ ןɐoɔɹɐɥƆ", "block.gtceu.chiseled_dark_concrete": "ǝʇǝɹɔuoƆ ʞɹɐᗡ pǝןǝsıɥƆ", @@ -1117,7 +1115,7 @@ "block.gtceu.steam_output_bus": ")ɯɐǝʇS( snᗺ ʇndʇnO", "block.gtceu.steam_oven": "uǝʌO ɯɐǝʇS", "block.gtceu.steam_solid_boiler.bronze": "ɹǝןıoᗺ pıןoS ɯɐǝʇS ןןɐɯS", - "block.gtceu.steel_brick_casing": "buısɐƆ ʞɔıɹᗺ ןǝǝʇS", + "block.gtceu.steel_brick_casing": "buısɐƆ uoɹI ʇɥbnoɹM pǝʞɔıɹᗺ", "block.gtceu.steel_crate": "ǝʇɐɹƆ ןǝǝʇS", "block.gtceu.steel_drum": "ɯnɹᗡ ןǝǝʇS", "block.gtceu.steel_firebox_casing": "buısɐƆ xoqǝɹıℲ ןǝǝʇS", @@ -4112,7 +4110,7 @@ "item.gtceu.basic_integrated_circuit.tooltip.0": "ןnɟɹǝʍod ǝɹoɯ puɐ ɹǝןןɐɯSㄥ§", "item.gtceu.basic_integrated_circuit.tooltip.1": "ʇınɔɹıƆ ɹǝı⟘-ΛꞀ9§", "item.gtceu.basic_tape": "ǝdɐ⟘", - "item.gtceu.basic_tape.tooltip": "sǝnssı ןɐɔıuɐɥɔǝɯ ɹoɟ ɥbnouǝ buoɹʇs ʇoN", + "item.gtceu.basic_tape.tooltip": "sɯǝʇı ɹıǝɥʇ buıddoɹp ʇnoɥʇıʍ sǝʇɐɹɔ dn ʞɔıd oʇ pǝsn ǝq uɐƆ\nsǝnssı ןɐɔıuɐɥɔǝɯ ɹoɟ ɥbnouǝ buoɹʇs ʇoNㄥ§", "item.gtceu.battery.charge_detailed.0": ")ㄥ§buıuıɐɯǝɹ %s %s/%sɐ§(ㄥ§ %s ɹǝı⟘ - ㄥ§∩Ǝ %s/%sɐ§", "item.gtceu.battery.charge_detailed.1": ")ㄥ§buıuıɐɯǝɹ %s %s/%sǝ§(ㄥ§ %s ɹǝı⟘ - ㄥ§∩Ǝ %s/%sǝ§", "item.gtceu.battery.charge_detailed.2": ")ㄥ§buıuıɐɯǝɹ %s %s/%sɔ§(ㄥ§ %s ɹǝı⟘ - ㄥ§∩Ǝ %s/%sɔ§", @@ -4189,7 +4187,6 @@ "item.gtceu.cpu_chip.tooltip": "ʇıu∩ buıssǝɔoɹԀ ןɐɹʇuǝƆㄥ§", "item.gtceu.cpu_wafer": "ɹǝɟɐM ∩ԀƆ", "item.gtceu.cpu_wafer.tooltip": "ʇıu∩ buıssǝɔoɹԀ ʍɐᴚㄥ§", - "item.gtceu.crafting_table_cover.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ǝuıɥɔɐW ɐ uo ㄥ§ɥɔuǝqʞɹoM pǝɔuɐʌpⱯɟ§", "item.gtceu.credit_casting_mold": ")ǝbɐuıoƆ( pןoW buıʇsɐƆ", "item.gtceu.credit_casting_mold.tooltip": ")¡ʇı ǝsoן ʇ,uoᗡ( suıoƆ buıʞɐɯ ɹoɟ pןoW ǝɹnɔǝSㄥ§", "item.gtceu.crushed_bentonite_ore": "ǝʇıuoʇuǝᗺ punoɹ⅁", @@ -4277,7 +4274,8 @@ "item.gtceu.ev_voltage_coil.tooltip": "ןıoƆ ǝɯǝɹʇxƎ", "item.gtceu.exquisite_glass_gem": "ןɐʇsʎɹƆ ssɐן⅁ ǝʇısınbxƎ", "item.gtceu.facade_cover": "ǝpɐɔɐℲ ɹǝʌoƆ %s", - "item.gtceu.facade_cover.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ ʇıɟʇnO ǝʌıʇɐɹoɔǝᗡㄥ§", + "item.gtceu.facade_cover.tooltip.0": "˙ㄥ§ɹǝʌoƆɟ§ ʇıɟʇnO ǝʌıʇɐɹoɔǝᗡㄥ§", + "item.gtceu.facade_cover.tooltip.1": "ʞɔoןq ʎuɐ puɐ sǝʇɐןԀ uoɹI Ɛ buısn pǝʇɟɐɹƆㄥ§", "item.gtceu.face_mask": "ʞsɐW ǝɔɐℲ", "item.gtceu.fertilizer": "ɹǝzıןıʇɹǝℲ", "item.gtceu.fiber_reinforced_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ pǝɔɹoɟuıǝᴚ-ɹǝqıℲ", @@ -4819,7 +4817,7 @@ "item.gtceu.storage_cover": "ɹǝʌoƆ ǝbɐɹoʇS", "item.gtceu.sugar_gem": "ǝqnƆ ɹɐbnS", "item.gtceu.sus_record": "ɔsıᗡ ɔısnW", - "item.gtceu.sus_record.desc": "¡ʎssns", + "item.gtceu.sus_record.desc": "¡ʎssnsㄥ§", "item.gtceu.sword_extruder_mold.tooltip": "spɹoʍS buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", "item.gtceu.talc_dust": "ɔןɐ⟘", "item.gtceu.tantalum_capacitor": "ɹoʇıɔɐdɐƆ ɯnןɐʇuɐ⟘", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 56b8040f88..287c6693db 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -114,7 +114,7 @@ "block.gtceu.blue_studs": "Blue Studs", "block.gtceu.boss_hazard_sign_block": "Boss Hazard Sign Block", "block.gtceu.brittle_charcoal": "Brittle Charcoal", - "block.gtceu.bronze_brick_casing": "Bronze Brick Casing", + "block.gtceu.bronze_brick_casing": "Bricked Bronze Casing", "block.gtceu.bronze_crate": "Bronze Crate", "block.gtceu.bronze_drum": "Bronze Drum", "block.gtceu.bronze_firebox_casing": "Bronze Firebox Casing", @@ -127,10 +127,8 @@ "block.gtceu.brown_large_metal_sheet": "Brown Large Metal Sheet", "block.gtceu.brown_metal_sheet": "Brown Metal Sheet", "block.gtceu.brown_studs": "Brown Studs", - "block.gtceu.casing_bronze_bricks": "Bronze Machine Casing", "block.gtceu.casing_coke_bricks": "Coke Oven Bricks", "block.gtceu.casing_grate": "Grate Machine Casing", - "block.gtceu.casing_primitive_bricks": "Firebricks", "block.gtceu.causality_hazard_sign_block": "Causality Hazard Sign Block", "block.gtceu.charcoal_pile_igniter": "Charcoal Pile Igniter", "block.gtceu.chiseled_dark_concrete": "Chiseled Dark Concrete", @@ -1117,7 +1115,7 @@ "block.gtceu.steam_output_bus": "Output Bus (Steam)", "block.gtceu.steam_oven": "Steam Oven", "block.gtceu.steam_solid_boiler.bronze": "Small Steam Solid Boiler", - "block.gtceu.steel_brick_casing": "Steel Brick Casing", + "block.gtceu.steel_brick_casing": "Bricked Wrought Iron Casing", "block.gtceu.steel_crate": "Steel Crate", "block.gtceu.steel_drum": "Steel Drum", "block.gtceu.steel_firebox_casing": "Steel Firebox Casing", @@ -4112,7 +4110,7 @@ "item.gtceu.basic_integrated_circuit.tooltip.0": "§7Smaller and more powerful", "item.gtceu.basic_integrated_circuit.tooltip.1": "§6LV-Tier Circuit", "item.gtceu.basic_tape": "Tape", - "item.gtceu.basic_tape.tooltip": "Not strong enough for mechanical issues", + "item.gtceu.basic_tape.tooltip": "§7Not strong enough for mechanical issues\nCan be used to pick up crates without dropping their items", "item.gtceu.battery.charge_detailed.0": "§a%s/%s EU§7 - Tier %s §7(§a%s/%s %s remaining§7)", "item.gtceu.battery.charge_detailed.1": "§e%s/%s EU§7 - Tier %s §7(§e%s/%s %s remaining§7)", "item.gtceu.battery.charge_detailed.2": "§c%s/%s EU§7 - Tier %s §7(§c%s/%s %s remaining§7)", @@ -4189,7 +4187,6 @@ "item.gtceu.cpu_chip.tooltip": "§7Central Processing Unit", "item.gtceu.cpu_wafer": "CPU Wafer", "item.gtceu.cpu_wafer.tooltip": "§7Raw Processing Unit", - "item.gtceu.crafting_table_cover.tooltip": "§fAdvanced Workbench§7 on a Machine as §fCover§7.", "item.gtceu.credit_casting_mold": "Casting Mold (Coinage)", "item.gtceu.credit_casting_mold.tooltip": "§7Secure Mold for making Coins (Don't lose it!)", "item.gtceu.crushed_bentonite_ore": "Ground Bentonite", @@ -4277,7 +4274,8 @@ "item.gtceu.ev_voltage_coil.tooltip": "Extreme Coil", "item.gtceu.exquisite_glass_gem": "Exquisite Glass Crystal", "item.gtceu.facade_cover": "%s Cover Facade", - "item.gtceu.facade_cover.tooltip": "§7Decorative Outfit §fCover§7.", + "item.gtceu.facade_cover.tooltip.0": "§7Decorative Outfit §fCover§7.", + "item.gtceu.facade_cover.tooltip.1": "§7Crafted using 3 Iron Plates and any block", "item.gtceu.face_mask": "Face Mask", "item.gtceu.fertilizer": "Fertilizer", "item.gtceu.fiber_reinforced_circuit_board": "Fiber-Reinforced Circuit Board", @@ -4819,7 +4817,7 @@ "item.gtceu.storage_cover": "Storage Cover", "item.gtceu.sugar_gem": "Sugar Cube", "item.gtceu.sus_record": "Music Disc", - "item.gtceu.sus_record.desc": "sussy!", + "item.gtceu.sus_record.desc": "§7sussy!", "item.gtceu.sword_extruder_mold.tooltip": "§7Extruder Shape for making Swords", "item.gtceu.talc_dust": "Talc", "item.gtceu.tantalum_capacitor": "Tantalum Capacitor", diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json index f954d8b13f..ab4457c554 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json @@ -28,6 +28,8 @@ "gtceu:treated_wood_wall_hanging_sign", "gtceu:treated_wood_pressure_plate", "gtceu:treated_wood_trapdoor", - "gtceu:treated_wood_stairs" + "gtceu:treated_wood_stairs", + "gtceu:wood_drum", + "gtceu:wood_crate" ] } \ No newline at end of file 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 1119778619..15ab23d9dc 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTMaterials.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTMaterials.java @@ -176,8 +176,8 @@ public static void init() { rock.setIgnored(Deepslate, Blocks.DEEPSLATE); rock.setIgnored(Basalt, Blocks.BASALT); block.setIgnored(Sculk, Blocks.SCULK); - block.setIgnored(Concrete, SupplierMemoizer.memoizeBlockSupplier(() -> GTBlocks.LIGHT_CONCRETE.get())); block.setIgnored(Concrete, SupplierMemoizer.memoizeBlockSupplier(() -> GTBlocks.DARK_CONCRETE.get())); + block.setIgnored(Concrete, SupplierMemoizer.memoizeBlockSupplier(() -> GTBlocks.LIGHT_CONCRETE.get())); for (TagPrefix prefix : ORES.keySet()) { TagPrefix.OreType oreType = ORES.get(prefix); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java index 440de04732..2984ab5569 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/BlockLang.java @@ -30,8 +30,8 @@ private static void initCasingLang(RegistrateLangProvider provider) { replace(provider, "block.gtceu.wire_coil.tooltip_energy_cracking", " §aEnergy Usage: §f%s%%"); // Casings - replace(provider, "block.gtceu.casing_bronze_bricks", "Bronze Machine Casing"); - replace(provider, "block.gtceu.casing_primitive_bricks", "Firebricks"); + replace(provider, "block.gtceu.bronze_brick_casing", "Bricked Bronze Casing"); + replace(provider, "block.gtceu.steel_brick_casing", "Bricked Wrought Iron Casing"); replace(provider, "block.gtceu.heatproof_machine_casing", "Heat Proof Invar Machine Casing"); replace(provider, "block.gtceu.frostproof_machine_casing", "Frost Proof Aluminium Machine Casing"); replace(provider, "block.gtceu.steel_machine_casing", "Solid Steel Machine Casing"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java index f21dfb93f6..c6d7acd271 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java @@ -326,9 +326,9 @@ private static void initItemTooltips(RegistrateLangProvider provider) { "§7Voids §fItems§7 as §fCover§7.\nActivate with §fSoft Mallet§7 after placement."); multilineLang(provider, "item.gtceu.advanced_item_voiding_cover.tooltip", "§7Voids §fItems§7 with amount control as §fCover§7.\nActivate with §fSoft Mallet§7 after placement."); - provider.add("item.gtceu.facade_cover.tooltip", "§7Decorative Outfit §fCover§7."); + multilineLang(provider, "item.gtceu.facade_cover.tooltip", + "§7Decorative Outfit §fCover§7.\n§7Crafted using 3 Iron Plates and any block"); provider.add("item.gtceu.computer_monitor_cover.tooltip", "§7Displays §fData§7 as §fCover§7."); - provider.add("item.gtceu.crafting_table_cover.tooltip", "§fAdvanced Workbench§7 on a Machine as §fCover§7."); provider.add("item.gtceu.shutter_module_cover.tooltip", "§fBlocks Transfer§7 through attached Side as §fCover§7."); multilineLang(provider, "item.gtceu.solar_panel.tooltip", @@ -343,8 +343,9 @@ private static void initItemTooltips(RegistrateLangProvider provider) { multilineLang(provider, "item.gtceu.foam_sprayer.tooltip", "§7Sprays Construction Foam\nUse on a frame to foam connected frames\nFoam can be colored"); provider.add("item.gtceu.firebrick.tooltip", "§7Heat resistant"); - provider.add("item.gtceu.basic_tape.tooltip", "Not strong enough for mechanical issues"); + provider.add("item.gtceu.basic_tape.tooltip", + "§7Not strong enough for mechanical issues\nCan be used to pick up crates without dropping their items"); - provider.add("item.gtceu.sus_record.desc", "sussy!"); + provider.add("item.gtceu.sus_record.desc", "§7sussy!"); } } 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 ddab441154..27419b9b56 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/WoodTypeEntry.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/WoodTypeEntry.java @@ -88,6 +88,14 @@ public final class WoodTypeEntry { public final Item hangingSign; @Nullable public final String hangingSignRecipeName; + @Nullable + public final Item button; + @Nullable + public final String buttonRecipeName; + @Nullable + public final Item pressurePlate; + @Nullable + public final String pressurePlateRecipeName; public final Material material; public final boolean addLogOreDict; @@ -97,6 +105,11 @@ public final class WoodTypeEntry { public final boolean addFencesOreDict; public final boolean addFenceGatesOreDict; public final boolean addStairsOreDict; + public final boolean addBoatsOreDict; + public final boolean addChestBoatsOreDict; + public final boolean addButtonsOreDict; + public final boolean addPressurePlatesOreDict; + public final boolean addPlanksUnificationInfo; public final boolean addDoorsUnificationInfo; public final boolean addSlabsUnificationInfo; @@ -105,10 +118,12 @@ public final class WoodTypeEntry { public final boolean addStairsUnificationInfo; public final boolean addBoatsUnificationInfo; public final boolean addChestBoatsUnificationInfo; + public final boolean addButtonsUnificationInfo; + public final boolean addPressurePlatesUnificationInfo; public final boolean generateLogToPlankRecipe; /** - * @see WoodTypeEntry.Builder + * @see Builder */ private WoodTypeEntry(@NotNull String modid, @NotNull String woodName, @NotNull TagKey logTag, @Nullable Item log, @Nullable Item strippedLog, @@ -125,14 +140,19 @@ private WoodTypeEntry(@NotNull String modid, @NotNull String woodName, @NotNull @Nullable Item chestBoat, @Nullable String chestBoatRecipeName, @Nullable Item sign, @Nullable String signRecipeName, @Nullable Item hangingSign, @Nullable String hangingSignRecipeName, + @Nullable Item button, @Nullable String buttonRecipeName, + @Nullable Item pressurePlate, @Nullable String pressurePlateRecipeName, @Nullable Material material, boolean addLogOreDict, boolean addPlanksOreDict, boolean addDoorsOreDict, boolean addSlabsOreDict, boolean addFencesOreDict, boolean addFenceGatesOreDict, boolean addStairsOreDict, + boolean addBoatsOreDict, boolean addChestBoatsOreDict, + boolean addButtonsOreDict, boolean addPressurePlatesOreDict, boolean addPlanksUnificationInfo, boolean addDoorsUnificationInfo, boolean addSlabsUnificationInfo, boolean addFencesUnificationInfo, boolean addFenceGatesUnificationInfo, boolean addStairsUnificationInfo, boolean addBoatsUnificationInfo, boolean addChestBoatsUnificationInfo, + boolean addPressurePlatesUnificationInfo, boolean addButtonsUnificationInfo, boolean generateLogToPlankRecipe) { this.modid = modid; this.woodName = woodName; @@ -167,6 +187,10 @@ private WoodTypeEntry(@NotNull String modid, @NotNull String woodName, @NotNull this.signRecipeName = signRecipeName; this.hangingSign = hangingSign; this.hangingSignRecipeName = hangingSignRecipeName; + this.button = button; + this.buttonRecipeName = buttonRecipeName; + this.pressurePlate = pressurePlate; + this.pressurePlateRecipeName = pressurePlateRecipeName; this.material = material != null ? material : GTMaterials.Wood; this.addLogOreDict = addLogOreDict; @@ -176,6 +200,10 @@ private WoodTypeEntry(@NotNull String modid, @NotNull String woodName, @NotNull this.addFencesOreDict = addFencesOreDict; this.addFenceGatesOreDict = addFenceGatesOreDict; this.addStairsOreDict = addStairsOreDict; + this.addBoatsOreDict = addBoatsOreDict; + this.addChestBoatsOreDict = addChestBoatsOreDict; + this.addButtonsOreDict = addButtonsOreDict; + this.addPressurePlatesOreDict = addPressurePlatesOreDict; this.addPlanksUnificationInfo = addPlanksUnificationInfo; this.addDoorsUnificationInfo = addDoorsUnificationInfo; this.addSlabsUnificationInfo = addSlabsUnificationInfo; @@ -184,6 +212,8 @@ private WoodTypeEntry(@NotNull String modid, @NotNull String woodName, @NotNull this.addStairsUnificationInfo = addStairsUnificationInfo; this.addBoatsUnificationInfo = addBoatsUnificationInfo; this.addChestBoatsUnificationInfo = addChestBoatsUnificationInfo; + this.addButtonsUnificationInfo = addButtonsUnificationInfo; + this.addPressurePlatesUnificationInfo = addPressurePlatesUnificationInfo; this.generateLogToPlankRecipe = generateLogToPlankRecipe; } @@ -237,6 +267,10 @@ public static class Builder { private String signRecipeName; private Item hangingSign = null; private String hangingSignRecipeName; + private Item button = null; + private String buttonRecipeName; + private Item pressurePlate = null; + private String pressurePlateRecipeName; @Nullable private Material material = null; @@ -247,6 +281,10 @@ public static class Builder { private boolean addFencesOreDict; private boolean addFenceGatesOreDict; private boolean addStairsOreDict; + private boolean addBoatsOreDict; + private boolean addChestBoatsOreDict; + private boolean addButtonOreDict; + private boolean addPressurePlateOreDict; private boolean addPlanksUnificationInfo; private boolean addDoorsUnificationInfo; @@ -256,6 +294,8 @@ public static class Builder { private boolean addStairsUnificationInfo; private boolean addBoatsUnificationInfo; private boolean addChestBoatsUnificationInfo; + private boolean addButtonUnificationInfo; + private boolean addPressurePlateUnificationInfo; private boolean generateLogToPlankRecipe = true; /** @@ -506,6 +546,32 @@ public Builder hangingSign(@NotNull Item hangingSign, @Nullable String hangingSi return this; } + /** + * Add an entry for a sign + * + * @param button the hanging sign to add + * @param buttonRecipeName the recipe name for crafting the hanging sign + * @return this + */ + public Builder button(@NotNull Item button, @Nullable String buttonRecipeName) { + this.button = button; + this.buttonRecipeName = buttonRecipeName; + return this; + } + + /** + * Add an entry for a sign + * + * @param pressurePlate the hanging sign to add + * @param pressurePlateRecipeName the recipe name for crafting the hanging sign + * @return this + */ + public Builder pressurePlate(@NotNull Item pressurePlate, @Nullable String pressurePlateRecipeName) { + this.pressurePlate = pressurePlate; + this.pressurePlateRecipeName = pressurePlateRecipeName; + return this; + } + /** * Specify material for wood entry. If not provided, {@link GTMaterials#Wood} will be used * @@ -518,12 +584,12 @@ public Builder material(@NotNull Material material) { } /** - * Register all possible ore dictionary for wood entry. + * Register all possible tags for wood entry. * * @return this */ public Builder registerAllTags() { - return registerTag(true, true, true, true, true, true, true); + return registerTag(true, true, true, true, true, true, true, true, true, true, true); } /** @@ -532,23 +598,28 @@ public Builder registerAllTags() { * @return this */ public Builder registerAllUnificationInfo() { - return registerUnificationInfo(true, true, true, true, true, true, true, true); + return registerUnificationInfo(true, true, true, true, true, true, true, true, true, true); } /** - * Register ore dictionary for wood entry. + * Register tags for wood entry. * - * @param log whether to add ore dictionary for logs - * @param planks whether to add ore dictionary for planks - * @param door whether to add ore dictionary for doors - * @param slab whether to add ore dictionary for slab - * @param fence whether to add ore dictionary for fences - * @param fenceGate whether to add ore dictionary for fence gates - * @param stairs whether to add ore dictionary for stairs + * @param log whether to add tags for logs + * @param planks whether to add tags for planks + * @param door whether to add tags for doors + * @param slab whether to add tags for slab + * @param fence whether to add tags for fences + * @param fenceGate whether to add tags for fence gates + * @param stairs whether to add tags for stairs + * @param boat whether to add unification info for boats + * @param chestBoat whether to add unification info for chest boats + * @param button whether to add unification info for buttons + * @param pressurePlate whether to add unification info for pressure plates * @return this */ public Builder registerTag(boolean log, boolean planks, boolean door, boolean slab, boolean fence, - boolean fenceGate, boolean stairs) { + boolean fenceGate, boolean stairs, boolean boat, boolean chestBoat, boolean button, + boolean pressurePlate) { this.addLogOreDict = log; this.addPlanksOreDict = planks; this.addDoorsOreDict = door; @@ -556,24 +627,31 @@ public Builder registerTag(boolean log, boolean planks, boolean door, boolean sl this.addFencesOreDict = fence; this.addFenceGatesOreDict = fenceGate; this.addStairsOreDict = stairs; + this.addBoatsOreDict = boat; + this.addChestBoatsOreDict = chestBoat; + this.addButtonOreDict = button; + this.addPressurePlateOreDict = pressurePlate; return this; } /** * Register unification info for wood entry. * - * @param planks whether to add unification info for planks - * @param door whether to add unification info for doors - * @param slab whether to add unification info for slab - * @param fence whether to add unification info for fences - * @param fenceGate whether to add unification info for fence gates - * @param stairs whether to add unification info for stairs - * @param boat whether to add unification info for boats - * @param chestBoat whether to add unification info for chest boats + * @param planks whether to add unification info for planks + * @param door whether to add unification info for doors + * @param slab whether to add unification info for slab + * @param fence whether to add unification info for fences + * @param fenceGate whether to add unification info for fence gates + * @param stairs whether to add unification info for stairs + * @param boat whether to add unification info for boats + * @param chestBoat whether to add unification info for chest boats + * @param button whether to add unification info for buttons + * @param pressurePlate whether to add unification info for pressure plates * @return this */ public Builder registerUnificationInfo(boolean planks, boolean door, boolean slab, boolean fence, - boolean fenceGate, boolean stairs, boolean boat, boolean chestBoat) { + boolean fenceGate, boolean stairs, boolean boat, boolean chestBoat, + boolean button, boolean pressurePlate) { this.addPlanksUnificationInfo = planks; this.addDoorsUnificationInfo = door; this.addSlabsUnificationInfo = slab; @@ -582,6 +660,8 @@ public Builder registerUnificationInfo(boolean planks, boolean door, boolean sla this.addStairsUnificationInfo = stairs; this.addBoatsUnificationInfo = boat; this.addChestBoatsUnificationInfo = chestBoat; + this.addButtonUnificationInfo = button; + this.addPressurePlateUnificationInfo = pressurePlate; return this; } @@ -618,12 +698,16 @@ public WoodTypeEntry build() { stairs, stairsRecipeName, addStairsCraftingRecipe, boat, boatRecipeName, chestBoat, chestBoatRecipeName, sign, signRecipeName, hangingSign, hangingSignRecipeName, + button, buttonRecipeName, pressurePlate, pressurePlateRecipeName, material, addLogOreDict, addPlanksOreDict, addDoorsOreDict, addSlabsOreDict, - addFencesOreDict, addFenceGatesOreDict, addStairsOreDict, addPlanksUnificationInfo, - addDoorsUnificationInfo, addSlabsUnificationInfo, addFencesUnificationInfo, + addFencesOreDict, addFenceGatesOreDict, addStairsOreDict, addBoatsOreDict, addChestBoatsOreDict, + addButtonOreDict, addPressurePlateOreDict, + addPlanksUnificationInfo, addDoorsUnificationInfo, addSlabsUnificationInfo, + addFencesUnificationInfo, addFenceGatesUnificationInfo, addStairsUnificationInfo, addBoatsUnificationInfo, - addChestBoatsUnificationInfo, generateLogToPlankRecipe); + addChestBoatsUnificationInfo, addButtonUnificationInfo, addPressurePlateUnificationInfo, + generateLogToPlankRecipe); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java index cd4dba1860..3ef5e92832 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java @@ -177,7 +177,7 @@ private static void hardRedstoneRecipes(Consumer provider) { 'G', new UnificationEntry(TagPrefix.gearSmall, GTMaterials.Iron), 'A', new UnificationEntry(TagPrefix.rod, GTMaterials.RedAlloy)); - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("dispenser").duration(100).EUt(VA[LV]) + ASSEMBLER_RECIPES.recipeBuilder("dispenser").duration(100).EUt(VA[LV]) .inputItems(ItemTags.STONE_CRAFTING_MATERIALS, 2) .inputItems(TagPrefix.ring, GTMaterials.Iron) .inputItems(TagPrefix.spring, GTMaterials.Iron, 2) @@ -200,7 +200,7 @@ private static void hardRedstoneRecipes(Consumer provider) { 'G', new UnificationEntry(TagPrefix.gearSmall, GTMaterials.Iron), 'F', ItemTags.WOODEN_FENCES); - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("piston_iron") + ASSEMBLER_RECIPES.recipeBuilder("piston_iron") .inputItems(TagPrefix.rod, GTMaterials.Iron) .inputItems(TagPrefix.gearSmall, GTMaterials.Iron) .inputItems(ItemTags.WOODEN_SLABS) @@ -209,7 +209,7 @@ private static void hardRedstoneRecipes(Consumer provider) { .outputItems(new ItemStack(Blocks.PISTON)) .duration(240).EUt(VA[ULV]).save(provider); - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("piston_steel") + ASSEMBLER_RECIPES.recipeBuilder("piston_steel") .inputItems(TagPrefix.rod, GTMaterials.Steel) .inputItems(TagPrefix.gearSmall, GTMaterials.Steel) .inputItems(ItemTags.WOODEN_SLABS, 2) @@ -218,7 +218,7 @@ private static void hardRedstoneRecipes(Consumer provider) { .outputItems(new ItemStack(Blocks.PISTON, 2)) .duration(240).EUt(16).save(provider); - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("piston_aluminium") + ASSEMBLER_RECIPES.recipeBuilder("piston_aluminium") .inputItems(TagPrefix.rod, GTMaterials.Aluminium) .inputItems(TagPrefix.gearSmall, GTMaterials.Aluminium) .inputItems(ItemTags.WOODEN_SLABS, 4) @@ -227,7 +227,7 @@ private static void hardRedstoneRecipes(Consumer provider) { .outputItems(new ItemStack(Blocks.PISTON, 4)) .duration(240).EUt(VA[LV]).save(provider); - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("piston_stainless_steel") + ASSEMBLER_RECIPES.recipeBuilder("piston_stainless_steel") .inputItems(TagPrefix.rod, GTMaterials.StainlessSteel) .inputItems(TagPrefix.gearSmall, GTMaterials.StainlessSteel) .inputItems(ItemTags.WOODEN_SLABS, 8) @@ -236,7 +236,7 @@ private static void hardRedstoneRecipes(Consumer provider) { .outputItems(new ItemStack(Blocks.PISTON, 8)) .duration(600).EUt(VA[LV]).save(provider); - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("piston_titanium") + ASSEMBLER_RECIPES.recipeBuilder("piston_titanium") .inputItems(TagPrefix.rod, GTMaterials.Titanium) .inputItems(TagPrefix.gearSmall, GTMaterials.Titanium) .inputItems(ItemTags.WOODEN_SLABS, 16) @@ -251,82 +251,10 @@ private static void hardRedstoneRecipes(Consumer provider) { 'L', new ItemStack(Blocks.STONE_SLAB), 'C', new UnificationEntry(TagPrefix.spring, GTMaterials.Iron)); - VanillaRecipeHelper.addShapedRecipe(provider, "oak_pressure_plate", - new ItemStack(Blocks.OAK_PRESSURE_PLATE, 2), "SrS", "LCL", "SdS", - 'S', new UnificationEntry(TagPrefix.bolt, GTMaterials.Wood), - 'L', Blocks.OAK_SLAB.asItem(), - 'C', new UnificationEntry(TagPrefix.spring, GTMaterials.Iron)); - - VanillaRecipeHelper.addShapedRecipe(provider, "birch_pressure_plate", - new ItemStack(Blocks.BIRCH_PRESSURE_PLATE, 2), "SrS", "LCL", "SdS", - 'S', new UnificationEntry(TagPrefix.bolt, GTMaterials.Wood), - 'L', Blocks.BIRCH_SLAB.asItem(), - 'C', new UnificationEntry(TagPrefix.spring, GTMaterials.Iron)); - - VanillaRecipeHelper.addShapedRecipe(provider, "spruce_pressure_plate", - new ItemStack(Blocks.SPRUCE_PRESSURE_PLATE, 2), "SrS", "LCL", "SdS", - 'S', new UnificationEntry(TagPrefix.bolt, GTMaterials.Wood), - 'L', Blocks.SPRUCE_SLAB.asItem(), - 'C', new UnificationEntry(TagPrefix.spring, GTMaterials.Iron)); - - VanillaRecipeHelper.addShapedRecipe(provider, "jungle_pressure_plate", - new ItemStack(Blocks.JUNGLE_PRESSURE_PLATE, 2), "SrS", "LCL", "SdS", - 'S', new UnificationEntry(TagPrefix.bolt, GTMaterials.Wood), - 'L', Blocks.JUNGLE_SLAB.asItem(), - 'C', new UnificationEntry(TagPrefix.spring, GTMaterials.Iron)); - - VanillaRecipeHelper.addShapedRecipe(provider, "acacia_pressure_plate", - new ItemStack(Blocks.ACACIA_PRESSURE_PLATE, 2), "SrS", "LCL", "SdS", - 'S', new UnificationEntry(TagPrefix.bolt, GTMaterials.Wood), - 'L', Blocks.ACACIA_SLAB.asItem(), - 'C', new UnificationEntry(TagPrefix.spring, GTMaterials.Iron)); - - VanillaRecipeHelper.addShapedRecipe(provider, "dark_oak_pressure_plate", - new ItemStack(Blocks.DARK_OAK_PRESSURE_PLATE, 2), "SrS", "LCL", "SdS", - 'S', new UnificationEntry(TagPrefix.bolt, GTMaterials.Wood), - 'L', Blocks.DARK_OAK_SLAB.asItem(), - 'C', new UnificationEntry(TagPrefix.spring, GTMaterials.Iron)); - - VanillaRecipeHelper.addShapedRecipe(provider, "crimson_pressure_plate", - new ItemStack(Blocks.CRIMSON_PRESSURE_PLATE, 2), "SrS", "LCL", "SdS", - 'S', new UnificationEntry(TagPrefix.bolt, GTMaterials.Wood), - 'L', Blocks.CRIMSON_SLAB.asItem(), - 'C', new UnificationEntry(TagPrefix.spring, GTMaterials.Iron)); - - VanillaRecipeHelper.addShapedRecipe(provider, "warped_pressure_plate", - new ItemStack(Blocks.WARPED_PRESSURE_PLATE, 2), "SrS", "LCL", "SdS", - 'S', new UnificationEntry(TagPrefix.bolt, GTMaterials.Wood), - 'L', Blocks.WARPED_SLAB.asItem(), - 'C', new UnificationEntry(TagPrefix.spring, GTMaterials.Iron)); - - VanillaRecipeHelper.addShapedRecipe(provider, "mangrove_pressure_plate", - new ItemStack(Blocks.MANGROVE_PRESSURE_PLATE, 2), "SrS", "LCL", "SdS", - 'S', new UnificationEntry(TagPrefix.bolt, GTMaterials.Wood), - 'L', Blocks.MANGROVE_SLAB.asItem(), - 'C', new UnificationEntry(TagPrefix.spring, GTMaterials.Iron)); - - VanillaRecipeHelper.addShapedRecipe(provider, "cherry_pressure_plate", - new ItemStack(Blocks.CHERRY_PRESSURE_PLATE, 2), "SrS", "LCL", "SdS", - 'S', new UnificationEntry(TagPrefix.bolt, GTMaterials.Wood), - 'L', Blocks.CHERRY_SLAB.asItem(), - 'C', new UnificationEntry(TagPrefix.spring, GTMaterials.Iron)); - - VanillaRecipeHelper.addShapedRecipe(provider, "bamboo_pressure_plate", - new ItemStack(Blocks.BAMBOO_PRESSURE_PLATE, 2), "SrS", "LCL", "SdS", - 'S', new UnificationEntry(TagPrefix.bolt, GTMaterials.Wood), - 'L', Blocks.BAMBOO_SLAB.asItem(), - 'C', new UnificationEntry(TagPrefix.spring, GTMaterials.Iron)); - - VanillaRecipeHelper.addShapedRecipe(provider, "rubber_pressure_plate", - new ItemStack(GTBlocks.RUBBER_PRESSURE_PLATE, 2), "SrS", "LCL", "SdS", - 'S', new UnificationEntry(TagPrefix.bolt, GTMaterials.Wood), - 'L', GTBlocks.RUBBER_SLAB.asItem(), - 'C', new UnificationEntry(TagPrefix.spring, GTMaterials.Iron)); - - VanillaRecipeHelper.addShapedRecipe(provider, "treated_wood_pressure_plate", - new ItemStack(GTBlocks.TREATED_WOOD_PRESSURE_PLATE, 2), "SrS", "LCL", "SdS", - 'S', new UnificationEntry(TagPrefix.bolt, GTMaterials.Wood), - 'L', GTBlocks.TREATED_WOOD_SLAB.asItem(), + VanillaRecipeHelper.addShapedRecipe(provider, "polished_blackstone_pressure_plate", + new ItemStack(Blocks.POLISHED_BLACKSTONE_PRESSURE_PLATE, 2), "ShS", "LCL", "SdS", + 'S', new UnificationEntry(TagPrefix.screw, GTMaterials.Iron), + 'L', new ItemStack(Blocks.POLISHED_BLACKSTONE_SLAB), 'C', new UnificationEntry(TagPrefix.spring, GTMaterials.Iron)); VanillaRecipeHelper.addShapedRecipe(provider, "heavy_weighted_pressure_plate", @@ -341,97 +269,25 @@ private static void hardRedstoneRecipes(Consumer provider) { 'L', new UnificationEntry(TagPrefix.plate, GTMaterials.Iron), 'C', new UnificationEntry(TagPrefix.spring, GTMaterials.Steel)); - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("stone_pressure_plate") + ASSEMBLER_RECIPES.recipeBuilder("stone_pressure_plate") .inputItems(TagPrefix.spring, GTMaterials.Iron) .inputItems(new ItemStack(Blocks.STONE_SLAB, 2)) .outputItems(new ItemStack(Blocks.STONE_PRESSURE_PLATE, 2)) .duration(100).EUt(VA[ULV]).save(provider); - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("oak_pressure_plate") + ASSEMBLER_RECIPES.recipeBuilder("polished_blackstone_pressure_plate") .inputItems(TagPrefix.spring, GTMaterials.Iron) - .inputItems(new ItemStack(Blocks.OAK_SLAB, 2)) - .outputItems(new ItemStack(Blocks.OAK_PRESSURE_PLATE, 2)) + .inputItems(new ItemStack(Blocks.POLISHED_BLACKSTONE_SLAB, 2)) + .outputItems(new ItemStack(Blocks.POLISHED_BLACKSTONE_PRESSURE_PLATE, 2)) .duration(100).EUt(VA[ULV]).save(provider); - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("birch_pressure_plate") - .inputItems(TagPrefix.spring, GTMaterials.Iron) - .inputItems(new ItemStack(Blocks.BIRCH_SLAB, 2)) - .outputItems(new ItemStack(Blocks.BIRCH_PRESSURE_PLATE, 2)) - .duration(100).EUt(VA[ULV]).save(provider); - - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("spruce_pressure_plate") - .inputItems(TagPrefix.spring, GTMaterials.Iron) - .inputItems(new ItemStack(Blocks.SPRUCE_SLAB, 2)) - .outputItems(new ItemStack(Blocks.SPRUCE_PRESSURE_PLATE, 2)) - .duration(100).EUt(VA[ULV]).save(provider); - - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("jungle_pressure_plate") - .inputItems(TagPrefix.spring, GTMaterials.Iron) - .inputItems(new ItemStack(Blocks.JUNGLE_SLAB, 2)) - .outputItems(new ItemStack(Blocks.JUNGLE_PRESSURE_PLATE, 2)) - .duration(100).EUt(VA[ULV]).save(provider); - - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("acacia_pressure_plate") - .inputItems(TagPrefix.spring, GTMaterials.Iron) - .inputItems(new ItemStack(Blocks.ACACIA_SLAB, 2)) - .outputItems(new ItemStack(Blocks.ACACIA_PRESSURE_PLATE, 2)) - .duration(100).EUt(VA[ULV]).save(provider); - - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("dark_oak_pressure_plate") - .inputItems(TagPrefix.spring, GTMaterials.Iron) - .inputItems(new ItemStack(Blocks.DARK_OAK_SLAB, 2)) - .outputItems(new ItemStack(Blocks.DARK_OAK_PRESSURE_PLATE, 2)) - .duration(100).EUt(VA[ULV]).save(provider); - - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("crimson_pressure_plate") - .inputItems(TagPrefix.spring, GTMaterials.Iron) - .inputItems(new ItemStack(Blocks.CRIMSON_SLAB, 2)) - .outputItems(new ItemStack(Blocks.CRIMSON_PRESSURE_PLATE, 2)) - .duration(100).EUt(VA[ULV]).save(provider); - - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("warped_pressure_plate") - .inputItems(TagPrefix.spring, GTMaterials.Iron) - .inputItems(new ItemStack(Blocks.WARPED_SLAB, 2)) - .outputItems(new ItemStack(Blocks.WARPED_PRESSURE_PLATE, 2)) - .duration(100).EUt(VA[ULV]).save(provider); - - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("mangrove_pressure_plate") - .inputItems(TagPrefix.spring, GTMaterials.Iron) - .inputItems(new ItemStack(Blocks.MANGROVE_SLAB, 2)) - .outputItems(new ItemStack(Blocks.MANGROVE_PRESSURE_PLATE, 2)) - .duration(100).EUt(VA[ULV]).save(provider); - - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("cherry_pressure_plate") - .inputItems(TagPrefix.spring, GTMaterials.Iron) - .inputItems(new ItemStack(Blocks.CHERRY_SLAB, 2)) - .outputItems(new ItemStack(Blocks.CHERRY_PRESSURE_PLATE, 2)) - .duration(100).EUt(VA[ULV]).save(provider); - - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("bamboo_pressure_plate") - .inputItems(TagPrefix.spring, GTMaterials.Iron) - .inputItems(new ItemStack(Blocks.BAMBOO_SLAB, 2)) - .outputItems(new ItemStack(Blocks.BAMBOO_PRESSURE_PLATE, 2)) - .duration(100).EUt(VA[ULV]).save(provider); - - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("rubber_pressure_plate") - .inputItems(TagPrefix.spring, GTMaterials.Iron) - .inputItems(new ItemStack(GTBlocks.RUBBER_SLAB, 2)) - .outputItems(new ItemStack(GTBlocks.RUBBER_PRESSURE_PLATE, 2)) - .duration(100).EUt(VA[ULV]).save(provider); - - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("treated_wood_pressure_plate") - .inputItems(TagPrefix.spring, GTMaterials.Iron) - .inputItems(new ItemStack(GTBlocks.TREATED_WOOD_SLAB, 2)) - .outputItems(new ItemStack(GTBlocks.TREATED_WOOD_PRESSURE_PLATE, 2)) - .duration(100).EUt(VA[ULV]).save(provider); - - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("light_weighted_pressure_plate") + ASSEMBLER_RECIPES.recipeBuilder("light_weighted_pressure_plate") .inputItems(TagPrefix.spring, GTMaterials.Steel) .inputItems(TagPrefix.plate, GTMaterials.Gold) .outputItems(new ItemStack(Blocks.LIGHT_WEIGHTED_PRESSURE_PLATE)) .duration(200).EUt(16).save(provider); - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("heavy_weighted_pressure_plate") + ASSEMBLER_RECIPES.recipeBuilder("heavy_weighted_pressure_plate") .inputItems(TagPrefix.spring, GTMaterials.Steel) .inputItems(TagPrefix.plate, GTMaterials.Iron) .outputItems(new ItemStack(Blocks.HEAVY_WEIGHTED_PRESSURE_PLATE)) @@ -440,118 +296,18 @@ private static void hardRedstoneRecipes(Consumer provider) { VanillaRecipeHelper.addShapedRecipe(provider, "stone_button", new ItemStack(Blocks.STONE_BUTTON, 6), "sP", 'P', new ItemStack(Blocks.STONE_PRESSURE_PLATE)); - VanillaRecipeHelper.addShapedRecipe(provider, "oak_button", new ItemStack(Blocks.OAK_BUTTON, 6), "sP", - 'P', new ItemStack(Blocks.OAK_PRESSURE_PLATE)); - - VanillaRecipeHelper.addShapedRecipe(provider, "birch_button", new ItemStack(Blocks.BIRCH_BUTTON, 6), "sP", - 'P', new ItemStack(Blocks.BIRCH_PRESSURE_PLATE)); - - VanillaRecipeHelper.addShapedRecipe(provider, "spruce_button", new ItemStack(Blocks.SPRUCE_BUTTON, 6), "sP", - 'P', new ItemStack(Blocks.SPRUCE_PRESSURE_PLATE)); - - VanillaRecipeHelper.addShapedRecipe(provider, "jungle_button", new ItemStack(Blocks.JUNGLE_BUTTON, 6), "sP", - 'P', new ItemStack(Blocks.JUNGLE_PRESSURE_PLATE)); - - VanillaRecipeHelper.addShapedRecipe(provider, "acacia_button", new ItemStack(Blocks.ACACIA_BUTTON, 6), "sP", - 'P', new ItemStack(Blocks.ACACIA_PRESSURE_PLATE)); - - VanillaRecipeHelper.addShapedRecipe(provider, "dark_oak_button", new ItemStack(Blocks.DARK_OAK_BUTTON, 6), - "sP", - 'P', new ItemStack(Blocks.DARK_OAK_PRESSURE_PLATE)); - - VanillaRecipeHelper.addShapedRecipe(provider, "crimson_button", new ItemStack(Blocks.CRIMSON_BUTTON, 6), - "sP", - 'P', new ItemStack(Blocks.CRIMSON_PRESSURE_PLATE)); - - VanillaRecipeHelper.addShapedRecipe(provider, "warped_button", new ItemStack(Blocks.WARPED_BUTTON, 6), "sP", - 'P', new ItemStack(Blocks.WARPED_PRESSURE_PLATE)); - - VanillaRecipeHelper.addShapedRecipe(provider, "mangrove_button", new ItemStack(Blocks.MANGROVE_BUTTON, 6), - "sP", - 'P', new ItemStack(Blocks.MANGROVE_PRESSURE_PLATE)); + VanillaRecipeHelper.addShapedRecipe(provider, "blackstone_button", + new ItemStack(Blocks.POLISHED_BLACKSTONE_BUTTON, 6), "sP", + 'P', new ItemStack(Blocks.POLISHED_BLACKSTONE_PRESSURE_PLATE)); - VanillaRecipeHelper.addShapedRecipe(provider, "cherry_button", new ItemStack(Blocks.CHERRY_BUTTON, 6), "sP", - 'P', new ItemStack(Blocks.CHERRY_PRESSURE_PLATE)); - - VanillaRecipeHelper.addShapedRecipe(provider, "bamboo_button", new ItemStack(Blocks.BAMBOO_BUTTON, 6), "sP", - 'P', new ItemStack(Blocks.BAMBOO_PRESSURE_PLATE)); - - VanillaRecipeHelper.addShapedRecipe(provider, "rubber_button", new ItemStack(GTBlocks.RUBBER_BUTTON, 6), - "sP", - 'P', new ItemStack(GTBlocks.RUBBER_PRESSURE_PLATE)); - - VanillaRecipeHelper.addShapedRecipe(provider, "treated_wood_button", - new ItemStack(GTBlocks.TREATED_WOOD_BUTTON, 6), "sP", - 'P', new ItemStack(GTBlocks.TREATED_WOOD_PRESSURE_PLATE)); - - GTRecipeTypes.CUTTER_RECIPES.recipeBuilder("stone_button") + CUTTER_RECIPES.recipeBuilder("stone_button") .inputItems(new ItemStack(Blocks.STONE_PRESSURE_PLATE)) .outputItems(new ItemStack(Blocks.STONE_BUTTON, 12)) .duration(25).EUt(VA[ULV]).save(provider); - GTRecipeTypes.CUTTER_RECIPES.recipeBuilder("oak_button") - .inputItems(new ItemStack(Blocks.OAK_PRESSURE_PLATE)) - .outputItems(new ItemStack(Blocks.OAK_BUTTON, 12)) - .duration(25).EUt(VA[ULV]).save(provider); - - GTRecipeTypes.CUTTER_RECIPES.recipeBuilder("birch_button") - .inputItems(new ItemStack(Blocks.BIRCH_PRESSURE_PLATE)) - .outputItems(new ItemStack(Blocks.BIRCH_BUTTON, 12)) - .duration(25).EUt(VA[ULV]).save(provider); - - GTRecipeTypes.CUTTER_RECIPES.recipeBuilder("spruce_button") - .inputItems(new ItemStack(Blocks.SPRUCE_PRESSURE_PLATE)) - .outputItems(new ItemStack(Blocks.SPRUCE_BUTTON, 12)) - .duration(25).EUt(VA[ULV]).save(provider); - - GTRecipeTypes.CUTTER_RECIPES.recipeBuilder("jungle_button") - .inputItems(new ItemStack(Blocks.JUNGLE_PRESSURE_PLATE)) - .outputItems(new ItemStack(Blocks.JUNGLE_BUTTON, 12)) - .duration(25).EUt(VA[ULV]).save(provider); - - GTRecipeTypes.CUTTER_RECIPES.recipeBuilder("acacia_button") - .inputItems(new ItemStack(Blocks.ACACIA_PRESSURE_PLATE)) - .outputItems(new ItemStack(Blocks.ACACIA_BUTTON, 12)) - .duration(25).EUt(VA[ULV]).save(provider); - - GTRecipeTypes.CUTTER_RECIPES.recipeBuilder("dark_oak_button") - .inputItems(new ItemStack(Blocks.DARK_OAK_PRESSURE_PLATE)) - .outputItems(new ItemStack(Blocks.DARK_OAK_BUTTON, 12)) - .duration(25).EUt(VA[ULV]).save(provider); - - GTRecipeTypes.CUTTER_RECIPES.recipeBuilder("crimson_button") - .inputItems(new ItemStack(Blocks.CRIMSON_PRESSURE_PLATE)) - .outputItems(new ItemStack(Blocks.CRIMSON_BUTTON, 12)) - .duration(25).EUt(VA[ULV]).save(provider); - - GTRecipeTypes.CUTTER_RECIPES.recipeBuilder("warped_button") - .inputItems(new ItemStack(Blocks.WARPED_PRESSURE_PLATE)) - .outputItems(new ItemStack(Blocks.WARPED_BUTTON, 12)) - .duration(25).EUt(VA[ULV]).save(provider); - - GTRecipeTypes.CUTTER_RECIPES.recipeBuilder("mangrove_button") - .inputItems(new ItemStack(Blocks.MANGROVE_PRESSURE_PLATE)) - .outputItems(new ItemStack(Blocks.MANGROVE_BUTTON, 12)) - .duration(25).EUt(VA[ULV]).save(provider); - - GTRecipeTypes.CUTTER_RECIPES.recipeBuilder("cherry_button") - .inputItems(new ItemStack(Blocks.CHERRY_PRESSURE_PLATE)) - .outputItems(new ItemStack(Blocks.CHERRY_BUTTON, 12)) - .duration(25).EUt(VA[ULV]).save(provider); - - GTRecipeTypes.CUTTER_RECIPES.recipeBuilder("bamboo_button") - .inputItems(new ItemStack(Blocks.BAMBOO_PRESSURE_PLATE)) - .outputItems(new ItemStack(Blocks.BAMBOO_BUTTON, 12)) - .duration(25).EUt(VA[ULV]).save(provider); - - GTRecipeTypes.CUTTER_RECIPES.recipeBuilder("rubber_button") - .inputItems(new ItemStack(GTBlocks.RUBBER_PRESSURE_PLATE)) - .outputItems(new ItemStack(GTBlocks.RUBBER_BUTTON, 12)) - .duration(25).EUt(VA[ULV]).save(provider); - - GTRecipeTypes.CUTTER_RECIPES.recipeBuilder("treated_wood_button") - .inputItems(new ItemStack(GTBlocks.TREATED_WOOD_PRESSURE_PLATE)) - .outputItems(new ItemStack(GTBlocks.TREATED_WOOD_BUTTON, 12)) + CUTTER_RECIPES.recipeBuilder("blackstone_button") + .inputItems(new ItemStack(Blocks.POLISHED_BLACKSTONE_PRESSURE_PLATE)) + .outputItems(new ItemStack(Blocks.POLISHED_BLACKSTONE_BUTTON, 12)) .duration(25).EUt(VA[ULV]).save(provider); VanillaRecipeHelper.addShapedRecipe(provider, "lever", new ItemStack(Blocks.LEVER), "B", "S", @@ -579,7 +335,7 @@ private static void hardRedstoneRecipes(Consumer provider) { 'S', ItemTags.WOODEN_SLABS, 'R', new UnificationEntry(TagPrefix.rod, GTMaterials.RedAlloy)); - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("daylight_detector") + ASSEMBLER_RECIPES.recipeBuilder("daylight_detector") .inputItems(rod, RedAlloy) .inputItems(new ItemStack(Blocks.GLASS, 3)) .inputItems(gem, NetherQuartz, 3) @@ -587,7 +343,7 @@ private static void hardRedstoneRecipes(Consumer provider) { .outputItems(new ItemStack(Blocks.DAYLIGHT_DETECTOR)) .duration(200).EUt(16).save(provider); - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("daylight_detector_certus") + ASSEMBLER_RECIPES.recipeBuilder("daylight_detector_certus") .inputItems(rod, RedAlloy) .inputItems(new ItemStack(Blocks.GLASS, 3)) .inputItems(gem, CertusQuartz, 3) @@ -595,7 +351,7 @@ private static void hardRedstoneRecipes(Consumer provider) { .outputItems(new ItemStack(Blocks.DAYLIGHT_DETECTOR)) .duration(200).EUt(16).save(provider); - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("daylight_detector_quartzite") + ASSEMBLER_RECIPES.recipeBuilder("daylight_detector_quartzite") .inputItems(rod, RedAlloy) .inputItems(new ItemStack(Blocks.GLASS, 3)) .inputItems(gem, Quartzite, 3) @@ -854,7 +610,7 @@ private static void hardToolArmorRecipes(Consumer provider) { 'P', new UnificationEntry(TagPrefix.plate, GTMaterials.Iron), 'A', new UnificationEntry(TagPrefix.bolt, GTMaterials.RedAlloy)); - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("compass") + ASSEMBLER_RECIPES.recipeBuilder("compass") .inputItems(TagPrefix.plate, GTMaterials.Iron) .inputItems(TagPrefix.ring, GTMaterials.Zinc) .inputItems(TagPrefix.bolt, GTMaterials.RedAlloy) @@ -876,7 +632,7 @@ private static void hardToolArmorRecipes(Consumer provider) { 'C', new ItemStack(Items.COMPARATOR), 'S', new UnificationEntry(TagPrefix.screw, GTMaterials.Gold)); - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("clock") + ASSEMBLER_RECIPES.recipeBuilder("clock") .inputItems(TagPrefix.plate, GTMaterials.Gold) .inputItems(TagPrefix.ring, GTMaterials.Gold) .inputItems(TagPrefix.bolt, GTMaterials.Gold, 2) @@ -1010,7 +766,7 @@ private static void hardMiscRecipes(Consumer provider) { 'R', new UnificationEntry(TagPrefix.ring, GTMaterials.Iron), 'G', new UnificationEntry(TagPrefix.gear, GTMaterials.Iron)); - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("jukebox") + ASSEMBLER_RECIPES.recipeBuilder("jukebox") .inputItems(TagPrefix.bolt, GTMaterials.Diamond) .inputItems(TagPrefix.gear, GTMaterials.Iron) .inputItems(TagPrefix.ring, GTMaterials.Iron) @@ -1026,7 +782,7 @@ private static void hardMiscRecipes(Consumer provider) { 'G', new UnificationEntry(TagPrefix.gear, GTMaterials.Wood), 'R', new UnificationEntry(TagPrefix.rod, GTMaterials.RedAlloy)); - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("note_block") + ASSEMBLER_RECIPES.recipeBuilder("note_block") .inputItems(TagPrefix.plate, GTMaterials.Wood, 4) .inputItems(TagPrefix.gear, GTMaterials.Wood) .inputItems(TagPrefix.rod, GTMaterials.RedAlloy) @@ -1038,7 +794,7 @@ private static void hardMiscRecipes(Consumer provider) { 'F', new ItemStack(Items.FLINT), 'C', ItemTags.STONE_CRAFTING_MATERIALS); - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("furnace") + ASSEMBLER_RECIPES.recipeBuilder("furnace") .circuitMeta(8) .inputItems(ItemTags.STONE_CRAFTING_MATERIALS, 8) .inputItems(new ItemStack(Items.FLINT)) @@ -1050,7 +806,7 @@ private static void hardMiscRecipes(Consumer provider) { 'F', new ItemStack(Items.FLINT), 'W', ItemTags.LOGS); - GTRecipeTypes.ASSEMBLER_RECIPES.recipeBuilder("crafting_table").duration(80).EUt(6) + ASSEMBLER_RECIPES.recipeBuilder("crafting_table").duration(80).EUt(6) .inputItems(ItemTags.LOGS) .inputItems(new ItemStack(Items.FLINT)) .outputItems(new ItemStack(Blocks.CRAFTING_TABLE)) @@ -1323,9 +1079,8 @@ private static void hardMiscRecipes(Consumer provider) { .outputItems(new ItemStack(Blocks.LIGHTNING_ROD)) .duration(100).EUt(4).save(provider); - ASSEMBLER_RECIPES.recipeBuilder("chiseled_bookshelf") // based this one on bookshelf recipe, might need - // rebalancing - .inputItems(ItemTags.PLANKS, 6) // also consider a table crafting recipe + ASSEMBLER_RECIPES.recipeBuilder("chiseled_bookshelf") + .inputItems(ItemTags.PLANKS, 6) .circuitMeta(4) .outputItems(new ItemStack(Blocks.CHISELED_BOOKSHELF)) .duration(100).EUt(4).save(provider); @@ -1345,7 +1100,7 @@ private static void hardMiscRecipes(Consumer provider) { VanillaRecipeHelper.addShapedRecipe(provider, "brush", new ItemStack(Items.BRUSH), " F ", "fRr", " S ", - 'S', new UnificationEntry(rodLong, Wood), + 'S', new UnificationEntry(rod, Wood), 'R', new UnificationEntry(ring, Copper), 'F', new ItemStack(Items.FEATHER)); @@ -1396,17 +1151,36 @@ private static void hardMiscRecipes(Consumer provider) { // 'L', new ItemStack(Items.CRYING_OBSIDIAN), // 'G', new UnificationEntry(plate, Glowstone)); - VanillaRecipeHelper.addShapedRecipe(provider, "chain", new ItemStack(Items.CHAIN), " R ", + VanillaRecipeHelper.addShapedRecipe(provider, "chain_iron", new ItemStack(Items.CHAIN), " R ", "wR ", " R ", 'R', new UnificationEntry(ring, Iron)); - ASSEMBLER_RECIPES.recipeBuilder("chain") + ASSEMBLER_RECIPES.recipeBuilder("chain_iron") .inputItems(ring, Iron, 3) - .outputItems(new ItemStack(Items.CHAIN)) + .outputItems(new ItemStack(Items.CHAIN, 2)) + .duration(40).EUt(10).save(provider); + + VanillaRecipeHelper.addShapedRecipe(provider, "chain_wrought_iron", new ItemStack(Items.CHAIN, 2), " R ", + "wR ", " R ", + 'R', new UnificationEntry(ring, WroughtIron)); + + ASSEMBLER_RECIPES.recipeBuilder("chain_wrought_iron") + .inputItems(ring, WroughtIron, 3) + .outputItems(new ItemStack(Items.CHAIN, 3)) + .duration(40).EUt(10).save(provider); + + VanillaRecipeHelper.addShapedRecipe(provider, "chain_steel", new ItemStack(Items.CHAIN, 3), " R ", + "wR ", " R ", + 'R', new UnificationEntry(ring, Steel)); + + ASSEMBLER_RECIPES.recipeBuilder("chain_steel") + .inputItems(ring, Steel, 3) + .outputItems(new ItemStack(Items.CHAIN, 4)) .duration(40).EUt(10).save(provider); for (DyeColor color : DyeColor.values()) { addBedRecipe(provider, color); + addCarpetRecipe(provider, color); } } else { @@ -1497,7 +1271,17 @@ private static void addBedRecipe(Consumer provider, DyeColor col 'F', ItemTags.WOODEN_FENCES); } - private static void hardGlassRecipes(Consumer provider) {} + private static void addCarpetRecipe(Consumer provider, DyeColor color) { + String colorName = color.getName(); + VanillaRecipeHelper.addShapedRecipe(provider, colorName + "_carpet", + new ItemStack(BuiltInRegistries.ITEM.get(new ResourceLocation(colorName + "_carpet"))), "WW", + 'W', BuiltInRegistries.ITEM.get(new ResourceLocation(colorName + "_wool"))); + } + + private static void hardGlassRecipes(Consumer provider) { + VanillaRecipeHelper.addShapedRecipe(provider, "glass_pane", new ItemStack(Blocks.GLASS_PANE, 2), "sG", 'G', + new ItemStack(Blocks.GLASS)); + } private static void nerfPaperCrafting(Consumer provider) { VanillaRecipeHelper.addShapedRecipe(provider, "paper_dust", diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeRemoval.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeRemoval.java index 1a265764aa..58b584907b 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeRemoval.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeRemoval.java @@ -102,7 +102,8 @@ private static void disableManualCompression(Consumer registry registry.accept(new ResourceLocation("minecraft:glowstone")); registry.accept(new ResourceLocation("minecraft:amethyst_block")); registry.accept(new ResourceLocation("minecraft:copper_block")); - registry.accept(new ResourceLocation("minecraft:copper")); + registry.accept(new ResourceLocation("minecraft:copper_ingot")); + registry.accept(new ResourceLocation("minecraft:copper_ingot_from_waxed_copper_block")); registry.accept(new ResourceLocation("minecraft:honeycomb_block")); registry.accept(new ResourceLocation("minecraft:snow_block")); registry.accept(new ResourceLocation("minecraft:netherite_block")); @@ -150,31 +151,11 @@ private static void hardRedstoneRecipes(Consumer registry) { registry.accept(new ResourceLocation("minecraft:activator_rail")); registry.accept(new ResourceLocation("minecraft:redstone_torch")); registry.accept(new ResourceLocation("minecraft:stone_pressure_plate")); - registry.accept(new ResourceLocation("minecraft:oak_pressure_plate")); - registry.accept(new ResourceLocation("minecraft:birch_pressure_plate")); - registry.accept(new ResourceLocation("minecraft:spruce_pressure_plate")); - registry.accept(new ResourceLocation("minecraft:jungle_pressure_plate")); - registry.accept(new ResourceLocation("minecraft:acacia_pressure_plate")); - registry.accept(new ResourceLocation("minecraft:dark_oak_pressure_plate")); - registry.accept(new ResourceLocation("minecraft:crimson_pressure_plate")); - registry.accept(new ResourceLocation("minecraft:warped_pressure_plate")); - registry.accept(new ResourceLocation("minecraft:mangrove_pressure_plate")); - registry.accept(new ResourceLocation("minecraft:cherry_pressure_plate")); - registry.accept(new ResourceLocation("minecraft:bamboo_pressure_plate")); + registry.accept(new ResourceLocation("minecraft:polished_blackstone_pressure_plate")); registry.accept(new ResourceLocation("minecraft:heavy_weighted_pressure_plate")); registry.accept(new ResourceLocation("minecraft:light_weighted_pressure_plate")); registry.accept(new ResourceLocation("minecraft:stone_button")); - registry.accept(new ResourceLocation("minecraft:oak_button")); - registry.accept(new ResourceLocation("minecraft:birch_button")); - registry.accept(new ResourceLocation("minecraft:spruce_button")); - registry.accept(new ResourceLocation("minecraft:jungle_button")); - registry.accept(new ResourceLocation("minecraft:acacia_button")); - registry.accept(new ResourceLocation("minecraft:dark_oak_button")); - registry.accept(new ResourceLocation("minecraft:crimson_button")); - registry.accept(new ResourceLocation("minecraft:warped_button")); - registry.accept(new ResourceLocation("minecraft:mangrove_button")); - registry.accept(new ResourceLocation("minecraft:cherry_button")); - registry.accept(new ResourceLocation("minecraft:bamboo_button")); + registry.accept(new ResourceLocation("minecraft:polished_blackstone_button")); } private static void hardToolArmorRecipes(Consumer registry) { @@ -210,23 +191,12 @@ private static void hardToolArmorRecipes(Consumer registry) { * - Removes Vanilla Fire Charge recipe */ private static void hardMiscRecipes(Consumer registry) { - registry.accept(new ResourceLocation("minecraft:beacon")); - registry.accept(new ResourceLocation("minecraft:jack_o_lantern")); registry.accept(new ResourceLocation("minecraft:golden_apple")); registry.accept(new ResourceLocation("minecraft:book")); - registry.accept(new ResourceLocation("minecraft:brewing_stand")); registry.accept(new ResourceLocation("minecraft:ender_eye")); registry.accept(new ResourceLocation("minecraft:glistering_melon_slice")); registry.accept(new ResourceLocation("minecraft:golden_carrot")); registry.accept(new ResourceLocation("minecraft:magma_cream")); - registry.accept(new ResourceLocation("minecraft:enchanting_table")); - registry.accept(new ResourceLocation("minecraft:jukebox")); - registry.accept(new ResourceLocation("minecraft:note_block")); - registry.accept(new ResourceLocation("minecraft:furnace")); - registry.accept(new ResourceLocation("minecraft:crafting_table")); - registry.accept(new ResourceLocation("minecraft:polished_granite")); - registry.accept(new ResourceLocation("minecraft:polished_diorite")); - registry.accept(new ResourceLocation("minecraft:polished_andesite")); registry.accept(new ResourceLocation("minecraft:lead")); registry.accept(new ResourceLocation("minecraft:item_frame")); registry.accept(new ResourceLocation("minecraft:painting")); @@ -234,35 +204,11 @@ private static void hardMiscRecipes(Consumer registry) { registry.accept(new ResourceLocation("minecraft:furnace_minecart")); registry.accept(new ResourceLocation("minecraft:tnt_minecart")); registry.accept(new ResourceLocation("minecraft:hopper_minecart")); - registry.accept(new ResourceLocation("minecraft:flower_pot")); - registry.accept(new ResourceLocation("minecraft:armor_stand")); - registry.accept(new ResourceLocation("minecraft:trapped_chest")); - registry.accept(new ResourceLocation("minecraft:ender_chest")); for (DyeColor color : DyeColor.values()) { registry.accept(new ResourceLocation(color.getName() + "_bed")); } registry.accept(new ResourceLocation("minecraft:fermented_spider_eye")); registry.accept(new ResourceLocation("minecraft:fire_charge")); - // All items from here downward need to be checked for if they belong to miscRecipes or - // removeVanillaBlockRecipes - registry.accept(new ResourceLocation("minecraft:lantern")); - registry.accept(new ResourceLocation("minecraft:tinted_glass")); - registry.accept(new ResourceLocation("minecraft:stonecutter")); - registry.accept(new ResourceLocation("minecraft:cartography_table")); - registry.accept(new ResourceLocation("minecraft:fletching_table")); - registry.accept(new ResourceLocation("minecraft:smithing_table")); - registry.accept(new ResourceLocation("minecraft:grindstone")); - registry.accept(new ResourceLocation("minecraft:smoker")); - registry.accept(new ResourceLocation("minecraft:blast_furnace")); - registry.accept(new ResourceLocation("minecraft:loom")); - registry.accept(new ResourceLocation("minecraft:composter")); - registry.accept(new ResourceLocation("minecraft:bell")); - registry.accept(new ResourceLocation("minecraft:conduit")); - registry.accept(new ResourceLocation("minecraft:candle")); - registry.accept(new ResourceLocation("minecraft:scaffolding")); - registry.accept(new ResourceLocation("minecraft:beehive")); - registry.accept(new ResourceLocation("minecraft:lightning_rod")); - registry.accept(new ResourceLocation("minecraft:lectern")); registry.accept(new ResourceLocation("minecraft:music_disc_5")); registry.accept(new ResourceLocation("minecraft:turtle_helmet")); registry.accept(new ResourceLocation("minecraft:brush")); @@ -359,6 +305,7 @@ private static void removeVanillaBlockRecipes(Consumer registr registry.accept(new ResourceLocation("minecraft:cracked_stone_bricks")); registry.accept(new ResourceLocation("minecraft:mossy_cobblestone_from_moss_block")); registry.accept(new ResourceLocation("minecraft:mossy_cobblestone_from_vine")); + // TODO add recipes for ALL of these. sigh where do the nitpicks end // registry.accept(new ResourceLocation("minecraft:deepslate_bricks")); // registry.accept(new ResourceLocation("minecraft:cracked_nether_bricks")); // registry.accept(new ResourceLocation("minecraft:chiseled_nether_bricks")); @@ -384,8 +331,47 @@ private static void removeVanillaBlockRecipes(Consumer registr // registry.accept(new ResourceLocation("minecraft:waxed_weathered_cut_copper")); // registry.accept(new ResourceLocation("minecraft:waxed_oxidized_cut_copper")); // registry.accept(new ResourceLocation("minecraft:end_crystal")); - // registry.accept(new ResourceLocation("minecraft:end_rod")); // wait for approval before uncommenting this one + registry.accept(new ResourceLocation("minecraft:end_rod")); // registry.accept(new ResourceLocation("minecraft:mud_bricks")); //no other way to obtain these rn + registry.accept(new ResourceLocation("minecraft:dripstone_block")); + registry.accept(new ResourceLocation("minecraft:beacon")); + registry.accept(new ResourceLocation("minecraft:jack_o_lantern")); + registry.accept(new ResourceLocation("minecraft:packed_ice")); + registry.accept(new ResourceLocation("minecraft:blue_ice")); + registry.accept(new ResourceLocation("minecraft:respawn_anchor")); + registry.accept(new ResourceLocation("minecraft:lodestone")); + registry.accept(new ResourceLocation("minecraft:chiseled_bookshelf")); + registry.accept(new ResourceLocation("minecraft:brewing_stand")); + registry.accept(new ResourceLocation("minecraft:enchanting_table")); + registry.accept(new ResourceLocation("minecraft:jukebox")); + registry.accept(new ResourceLocation("minecraft:note_block")); + registry.accept(new ResourceLocation("minecraft:furnace")); + registry.accept(new ResourceLocation("minecraft:crafting_table")); + registry.accept(new ResourceLocation("minecraft:polished_granite")); + registry.accept(new ResourceLocation("minecraft:polished_diorite")); + registry.accept(new ResourceLocation("minecraft:polished_andesite")); + registry.accept(new ResourceLocation("minecraft:flower_pot")); + registry.accept(new ResourceLocation("minecraft:armor_stand")); + registry.accept(new ResourceLocation("minecraft:trapped_chest")); + registry.accept(new ResourceLocation("minecraft:ender_chest")); + registry.accept(new ResourceLocation("minecraft:lantern")); + registry.accept(new ResourceLocation("minecraft:tinted_glass")); + registry.accept(new ResourceLocation("minecraft:stonecutter")); + registry.accept(new ResourceLocation("minecraft:cartography_table")); + registry.accept(new ResourceLocation("minecraft:fletching_table")); + registry.accept(new ResourceLocation("minecraft:smithing_table")); + registry.accept(new ResourceLocation("minecraft:grindstone")); + registry.accept(new ResourceLocation("minecraft:smoker")); + registry.accept(new ResourceLocation("minecraft:blast_furnace")); + registry.accept(new ResourceLocation("minecraft:loom")); + registry.accept(new ResourceLocation("minecraft:composter")); + registry.accept(new ResourceLocation("minecraft:bell")); + registry.accept(new ResourceLocation("minecraft:conduit")); + registry.accept(new ResourceLocation("minecraft:candle")); + registry.accept(new ResourceLocation("minecraft:scaffolding")); + registry.accept(new ResourceLocation("minecraft:beehive")); + registry.accept(new ResourceLocation("minecraft:lightning_rod")); + registry.accept(new ResourceLocation("minecraft:lectern")); // Carpet replacement for (DyeColor color : DyeColor.values()) { diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/BatteryRecipes.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/BatteryRecipes.java index 68a2eb6f26..0f2c7da8d3 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/BatteryRecipes.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/BatteryRecipes.java @@ -88,7 +88,7 @@ private static void standardBatteries(Consumer provider) { ASSEMBLER_RECIPES.recipeBuilder("battery_hull_ev") .inputItems(cableGtSingle, Aluminium, 2) .inputItems(plate, BlueSteel, 2) - .inputFluids(Polytetrafluoroethylene.getFluid(144)) + .inputFluids(Polytetrafluoroethylene.getFluid(L)) .outputItems(BATTERY_HULL_SMALL_VANADIUM) .duration(100).EUt(VA[HV]).save(provider); @@ -104,7 +104,7 @@ private static void standardBatteries(Consumer provider) { ASSEMBLER_RECIPES.recipeBuilder("battery_hull_luv") .inputItems(cableGtSingle, NiobiumTitanium, 2) .inputItems(plate, RedSteel, 18) - .inputFluids(Polybenzimidazole.getFluid(144)) + .inputFluids(Polybenzimidazole.getFluid(L)) .outputItems(BATTERY_HULL_LARGE_VANADIUM) .duration(300).EUt(VA[IV]).save(provider); diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CraftingRecipeLoader.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CraftingRecipeLoader.java index b70d6bf9e3..1bafd706bd 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CraftingRecipeLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CraftingRecipeLoader.java @@ -89,6 +89,8 @@ public static void init(Consumer provider) { VanillaRecipeHelper.addSmeltingRecipe(provider, "wrought_iron_nugget", ChemicalHelper.getTag(nugget, Iron), ChemicalHelper.get(nugget, WroughtIron)); + VanillaRecipeHelper.addShapelessRecipe(provider, "nugget_disassembling_iron", + new ItemStack(Items.IRON_NUGGET, 9), new ItemStack(Items.IRON_INGOT), 's'); // TODO clipboard // VanillaRecipeHelper.addShapedRecipe(provider, "clipboard", CLIPBOARD.asStack(), " Sd", "BWR", "PPP", 'P', diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/FusionLoader.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/FusionLoader.java index 71907619b2..efb46ff0c2 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/FusionLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/FusionLoader.java @@ -176,9 +176,9 @@ public static void init(Consumer provider) { .save(provider); FUSION_RECIPES.recipeBuilder("silver_and_lithium_to_indium_plasma") - .inputFluids(GTMaterials.Silver.getFluid(144)) - .inputFluids(GTMaterials.Lithium.getFluid(144)) - .outputFluids(GTMaterials.Indium.getFluid(144)) + .inputFluids(GTMaterials.Silver.getFluid(L)) + .inputFluids(GTMaterials.Lithium.getFluid(L)) + .outputFluids(GTMaterials.Indium.getFluid(L)) .duration(16) .EUt(24576) .fusionStartEU(280_000_000) diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/GCyMRecipes.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/GCyMRecipes.java index 0ad9b66849..621807ab3e 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/GCyMRecipes.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/GCyMRecipes.java @@ -218,7 +218,7 @@ private static void registerAssemblerRecipes(Consumer provider) ASSEMBLER_RECIPES.recipeBuilder("mds_coil_block") .inputItems(ChemicalHelper.get(ring, MolybdenumDisilicide, 32)) .inputItems(ChemicalHelper.get(foil, Graphene, 16)) - .inputFluids(HSLASteel.getFluid(144)) + .inputFluids(HSLASteel.getFluid(L)) .outputItems(MOLYBDENUM_DISILICIDE_COIL_BLOCK.asStack(1)) .duration(500).EUt(1920) .save(provider); diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MachineRecipeLoader.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MachineRecipeLoader.java index 79679a8450..1ac51bc531 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MachineRecipeLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MachineRecipeLoader.java @@ -880,7 +880,7 @@ private static void registerAssemblerRecipes(Consumer provider) .inputItems(CARBON_MESH).inputFluids(Polyethylene.getFluid(288)).outputItems(DUCT_TAPE, 2).duration(100) .save(provider); ASSEMBLER_RECIPES.recipeBuilder("duct_tape_polycaprolactam").EUt(VA[LV]).inputItems(foil, Polycaprolactam, 2) - .inputItems(CARBON_MESH).inputFluids(Polyethylene.getFluid(144)).outputItems(DUCT_TAPE, 4).duration(100) + .inputItems(CARBON_MESH).inputFluids(Polyethylene.getFluid(L)).outputItems(DUCT_TAPE, 4).duration(100) .save(provider); ASSEMBLER_RECIPES.recipeBuilder("duct_tape_polybenzimidazole").EUt(VA[LV]).inputItems(foil, Polybenzimidazole) .inputItems(CARBON_MESH).inputFluids(Polyethylene.getFluid(72)).outputItems(DUCT_TAPE, 8).duration(100) diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MetaTileEntityLoader.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MetaTileEntityLoader.java index 73a0810cd4..e934c1f1f4 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MetaTileEntityLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MetaTileEntityLoader.java @@ -417,13 +417,6 @@ public static void init(Consumer provider) { new UnificationEntry(TagPrefix.pipeSmallFluid, GTMaterials.Steel), 'H', GTMachines.HULL[HV].asStack(), 'S', GTBlocks.CASING_TEMPERED_GLASS); - // TODO Charcoal pile igniter - // VanillaRecipeHelper.addShapedRecipe(provider, true, "charcoal_pile_igniter", - // GTMachines.CHARCOAL_PILE_IGNITER.getStackForm(), "ERE", "EHE", "FFF", 'E', new - // UnificationEntry(TagPrefix.plate, GTMaterials.Bronze), 'R', new UnificationEntry(TagPrefix.rotor, - // GTMaterials.Iron), 'H', MetaBlocks.STEAM_CASING.getItemVariant(BRONZE_BRICKS_HULL), 'F', new - // ItemStack(Items.FLINT)); - // STEAM MACHINES VanillaRecipeHelper.addShapedRecipe(provider, true, "bronze_hull", GTBlocks.BRONZE_HULL.asStack(), "PPP", "PhP", "PPP", 'P', new UnificationEntry(TagPrefix.plate, GTMaterials.Bronze)); diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MiscRecipeLoader.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MiscRecipeLoader.java index 45c34e99eb..65b82b870a 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MiscRecipeLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MiscRecipeLoader.java @@ -632,5 +632,12 @@ public static void init(Consumer provider) { .inputItems(ring, Steel, 2) .outputItems(STEEL_MINECART_WHEELS) .duration(60).EUt(20).save(provider); + + FLUID_SOLIDFICATION_RECIPES.recipeBuilder("light_concrete") + .inputFluids(Concrete.getFluid(144)) + .inputItems(SHAPE_MOLD_BLOCK) + .outputItems(GTBlocks.LIGHT_CONCRETE) + .duration(100).EUt(VA[ULV]) + .save(provider); } } 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 ad4f29c714..810d6cf8ed 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 @@ -93,29 +93,56 @@ private static void compressingRecipes(Consumer provider) { .outputItems(new ItemStack(Blocks.GLOWSTONE)) .save(provider); - COMPRESSOR_RECIPES.recipeBuilder("packed_ice").inputItems(new ItemStack(Blocks.ICE, 9)) - .outputItems(new ItemStack(Blocks.PACKED_ICE)).save(provider); - COMPRESSOR_RECIPES.recipeBuilder("blue_ice").inputItems(new ItemStack(Blocks.PACKED_ICE, 9)) - .outputItems(new ItemStack(Blocks.BLUE_ICE)).save(provider); - COMPRESSOR_RECIPES.recipeBuilder("ice_from_dust").inputItems(dust, Ice).outputItems(new ItemStack(Blocks.ICE)) + COMPRESSOR_RECIPES.recipeBuilder("packed_ice") + .inputItems(new ItemStack(Blocks.ICE, 9)) + .outputItems(new ItemStack(Blocks.PACKED_ICE)) + .duration(300).EUt(2) .save(provider); + + COMPRESSOR_RECIPES.recipeBuilder("blue_ice") + .inputItems(new ItemStack(Blocks.PACKED_ICE, 9)) + .outputItems(new ItemStack(Blocks.BLUE_ICE)) + .duration(300).EUt(2) + .save(provider); + + COMPRESSOR_RECIPES.recipeBuilder("ice_from_dust") + .inputItems(dust, Ice) + .outputItems(new ItemStack(Blocks.ICE)) + .duration(300).EUt(2) + .save(provider); + COMPRESSOR_RECIPES.recipeBuilder("dripstone_block_from_pointed_dripstone") .inputItems(new ItemStack(Items.POINTED_DRIPSTONE, 4)) .outputItems(new ItemStack(Blocks.DRIPSTONE_BLOCK)) + .duration(300).EUt(2) .save(provider); FORGE_HAMMER_RECIPES.recipeBuilder("pointed_dripstone_from_dripstone_block") .inputItems(new ItemStack(Blocks.DRIPSTONE_BLOCK)) .outputItems(new ItemStack(Items.POINTED_DRIPSTONE, 4)) + .duration(300).EUt(2) .save(provider); PACKER_RECIPES.recipeBuilder("hay_block") .inputItems(new ItemStack(Items.WHEAT, 9)) - .circuitMeta(9) + .circuitMeta(8) .outputItems(new ItemStack(Blocks.HAY_BLOCK)) .duration(200).EUt(2) .save(provider); + PACKER_RECIPES.recipeBuilder("wheat") + .inputItems(new ItemStack(Blocks.HAY_BLOCK)) + .outputItems(new ItemStack(Items.WHEAT, 9)) + .circuitMeta(9) + .duration(200).EUt(2) + .save(provider); + + FORGE_HAMMER_RECIPES.recipeBuilder("wheat_from_hay_block") + .inputItems(new ItemStack(Blocks.HAY_BLOCK)) + .outputItems(new ItemStack(Items.WHEAT, 9)) + .duration(200).EUt(2) + .save(provider); + PACKER_RECIPES.recipeBuilder("melon") .inputItems(new ItemStack(Items.MELON_SLICE, 9)) .circuitMeta(9) @@ -209,9 +236,6 @@ private static void glassRecipes(Consumer provider) { // .save(provider); // } - VanillaRecipeHelper.addShapedRecipe(provider, "glass_pane", new ItemStack(Blocks.GLASS_PANE, 2), "sG", 'G', - new ItemStack(Blocks.GLASS)); - CUTTER_RECIPES.recipeBuilder("cut_glass_block_to_plate").duration(50).EUt(VA[ULV]) .inputItems(new ItemStack(Blocks.GLASS, 3)) .outputItems(new ItemStack(Blocks.GLASS_PANE, 8)) @@ -439,7 +463,7 @@ private static void woodRecipes(Consumer provider) { .outputItems(new ItemStack(Blocks.SOUL_TORCH)) .duration(100).EUt(1).save(provider); - ASSEMBLER_RECIPES.recipeBuilder("soul_lantern") + ASSEMBLER_RECIPES.recipeBuilder("soul_lantern_from_lantern") .inputItems(new ItemStack(Blocks.LANTERN)) .inputItems(ItemTags.SOUL_FIRE_BASE_BLOCKS) .outputItems(new ItemStack(Blocks.SOUL_LANTERN)) @@ -464,6 +488,16 @@ private static void woodRecipes(Consumer provider) { new FluidContainerIngredient(Creosote.getFluidTag(), 1000)); VanillaRecipeHelper.addShapedRecipe(provider, "soul_torch", new ItemStack(Blocks.SOUL_TORCH, 1), "WB", 'W', ItemTags.SOUL_FIRE_BASE_BLOCKS, 'B', new ItemStack(Blocks.TORCH)); + if (!ConfigHolder.INSTANCE.recipes.hardMiscRecipes) { + VanillaRecipeHelper.addShapedRecipe(provider, "soul_lantern", new ItemStack(Blocks.SOUL_LANTERN, 1), "WB", + 'W', ItemTags.SOUL_FIRE_BASE_BLOCKS, 'B', new ItemStack(Blocks.SOUL_LANTERN)); + + ASSEMBLER_RECIPES.recipeBuilder("soul_lantern") + .inputItems(new ItemStack(Blocks.LANTERN)) + .inputItems(ItemTags.SOUL_FIRE_BASE_BLOCKS) + .outputItems(new ItemStack(Blocks.SOUL_LANTERN)) + .duration(100).EUt(1).save(provider); + } ASSEMBLER_RECIPES.recipeBuilder("redstone_torch").EUt(4).inputItems(dust, Redstone) .inputItems(new ItemStack(Items.STICK)).outputItems(new ItemStack(Blocks.REDSTONE_TORCH, 1)) @@ -708,6 +742,24 @@ private static void redstoneRecipes(Consumer provider) { .inputFluids(Concrete.getFluid(L)) .outputItems(new ItemStack(Items.COMPARATOR)) .duration(100).EUt(1).save(provider); + + if (!ConfigHolder.INSTANCE.recipes.hardRedstoneRecipes) { + CUTTER_RECIPES.recipeBuilder("stone_pressure_plate") + .inputItems(new ItemStack(Blocks.STONE_SLAB)) + .outputItems(new ItemStack(Blocks.STONE_PRESSURE_PLATE, 8)) + .duration(250).EUt(VA[ULV]).save(provider); + + CUTTER_RECIPES.recipeBuilder("polished_blackstone_pressure_plate") + .inputItems(new ItemStack(Blocks.POLISHED_BLACKSTONE_SLAB)) + .outputItems(new ItemStack(Blocks.POLISHED_BLACKSTONE_PRESSURE_PLATE, 8)) + .duration(250).EUt(VA[ULV]).save(provider); + + CUTTER_RECIPES.recipeBuilder("polished_blackstone_pressure_plate") + .inputItems(plate, Iron) + .outputItems(new ItemStack(Blocks.POLISHED_BLACKSTONE_PRESSURE_PLATE, 8)) + .circuitMeta(10) + .duration(250).EUt(VA[ULV]).save(provider); + } } /** @@ -757,19 +809,19 @@ private static void metalRecipes(Consumer provider) { VanillaRecipeHelper.addShapedRecipe(provider, "chainmail_helmet", new ItemStack(Items.CHAINMAIL_HELMET), "PPP", "PhP", - 'P', new UnificationEntry(ring, Iron)); + 'P', Items.CHAIN); VanillaRecipeHelper.addShapedRecipe(provider, "chainmail_chestplate", new ItemStack(Items.CHAINMAIL_CHESTPLATE), "PhP", "PPP", "PPP", - 'P', new UnificationEntry(ring, Iron)); + 'P', Items.CHAIN); VanillaRecipeHelper.addShapedRecipe(provider, "chainmail_leggings", new ItemStack(Items.CHAINMAIL_LEGGINGS), "PPP", "PhP", "P P", - 'P', new UnificationEntry(ring, Iron)); + 'P', Items.CHAIN); VanillaRecipeHelper.addShapedRecipe(provider, "chainmail_boots", new ItemStack(Items.CHAINMAIL_BOOTS), "P P", "PhP", - 'P', new UnificationEntry(ring, Iron)); + 'P', Items.CHAIN); ASSEMBLER_RECIPES.recipeBuilder("cauldron") .inputItems(plate, Iron, 7) @@ -1078,7 +1130,7 @@ private static void miscRecipes(Consumer provider) { .outputItems(new ItemStack(Items.ARMOR_STAND)).save(provider); FLUID_SOLIDFICATION_RECIPES.recipeBuilder("candle") - .inputFluids(Wax.getFluid(144)) + .inputFluids(Wax.getFluid(L)) .inputItems(new ItemStack(Items.STRING)) .outputItems(new ItemStack(Blocks.CANDLE, 2)) .duration(20).EUt(1).save(provider); @@ -1099,6 +1151,9 @@ private static void miscRecipes(Consumer provider) { .inputItems(new ItemStack(Items.MINECART)).inputItems(new ItemStack(Blocks.HOPPER)) .outputItems(new ItemStack(Items.HOPPER_MINECART)).save(provider); + VanillaRecipeHelper.addShapelessRecipe(provider, "hay_block_to_hay", new ItemStack(Items.WHEAT, 9), + Items.HAY_BLOCK, 'k'); + ASSEMBLER_RECIPES.recipeBuilder("conduit") .inputItems(new ItemStack(Items.HEART_OF_THE_SEA)) .inputItems(new ItemStack(Items.NAUTILUS_SHELL, 8)) @@ -1244,7 +1299,7 @@ private static void dyeRecipes(Consumer provider) { CHEMICAL_BATH_RECIPES.recipeBuilder("dark_prismarine") .inputItems(new ItemStack(Items.PRISMARINE_SHARD, 8)) - .inputFluids(DyeBlack.getFluid(144)) + .inputFluids(DyeBlack.getFluid(L)) .outputItems(new ItemStack(Blocks.DARK_PRISMARINE)) .duration(20).EUt(VA[ULV]).save(provider); } 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 36fcb1e7c7..7714cf9f0d 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 @@ -65,6 +65,8 @@ private static List getDefaultEntries() { .chestBoat(Items.OAK_CHEST_BOAT, "oak_chest_boat") .sign(Items.OAK_SIGN, "oak_sign") .hangingSign(Items.OAK_HANGING_SIGN, "oak_hanging_sign") + .button(Items.OAK_BUTTON, "oak_button") + .pressurePlate(Items.OAK_PRESSURE_PLATE, "oak_pressure_plate") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "spruce") @@ -83,6 +85,8 @@ private static List getDefaultEntries() { .chestBoat(Items.SPRUCE_CHEST_BOAT, "spruce_chest_boat") .sign(Items.SPRUCE_SIGN, "spruce_sign") .hangingSign(Items.SPRUCE_HANGING_SIGN, "spruce_hanging_sign") + .button(Items.SPRUCE_BUTTON, "spruce_button") + .pressurePlate(Items.SPRUCE_PRESSURE_PLATE, "spruce_pressure_plate") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "birch") @@ -101,6 +105,8 @@ private static List getDefaultEntries() { .chestBoat(Items.BIRCH_CHEST_BOAT, "birch_chest_boat") .sign(Items.BIRCH_SIGN, "birch_sign") .hangingSign(Items.BIRCH_HANGING_SIGN, "birch_hanging_sign") + .button(Items.BIRCH_BUTTON, "birch_button") + .pressurePlate(Items.BIRCH_PRESSURE_PLATE, "birch_pressure_plate") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "jungle") @@ -119,6 +125,8 @@ private static List getDefaultEntries() { .chestBoat(Items.JUNGLE_CHEST_BOAT, "jungle_chest_boat") .sign(Items.JUNGLE_SIGN, "jungle_sign") .hangingSign(Items.JUNGLE_HANGING_SIGN, "jungle_hanging_sign") + .button(Items.JUNGLE_BUTTON, "jungle_button") + .pressurePlate(Items.JUNGLE_PRESSURE_PLATE, "jungle_pressure_plate") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "acacia") @@ -137,6 +145,8 @@ private static List getDefaultEntries() { .chestBoat(Items.ACACIA_CHEST_BOAT, "acacia_chest_boat") .sign(Items.ACACIA_SIGN, "acacia_sign") .hangingSign(Items.ACACIA_HANGING_SIGN, "acacia_hanging_sign") + .button(Items.ACACIA_BUTTON, "acacia_button") + .pressurePlate(Items.ACACIA_PRESSURE_PLATE, "acacia_pressure_plate") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "dark_oak") @@ -155,6 +165,8 @@ private static List getDefaultEntries() { .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") + .button(Items.DARK_OAK_BUTTON, "dark_oak_button") + .pressurePlate(Items.DARK_OAK_PRESSURE_PLATE, "dark_oak_pressure_plate") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "bamboo") @@ -172,6 +184,8 @@ private static List getDefaultEntries() { .chestBoat(Items.BAMBOO_CHEST_RAFT, "bamboo_chest_raft") .sign(Items.BAMBOO_SIGN, "bamboo_sign") .hangingSign(Items.BAMBOO_HANGING_SIGN, "bamboo_hanging_sign") + .button(Items.BAMBOO_BUTTON, "bamboo_button") + .pressurePlate(Items.BAMBOO_PRESSURE_PLATE, "bamboo_pressure_plate") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "cherry") @@ -190,6 +204,8 @@ private static List getDefaultEntries() { .chestBoat(Items.CHERRY_CHEST_BOAT, "cherry_chest_boat") .sign(Items.CHERRY_SIGN, "cherry_sign") .hangingSign(Items.CHERRY_HANGING_SIGN, "cherry_hanging_sign") + .button(Items.CHERRY_BUTTON, "cherry_button") + .pressurePlate(Items.CHERRY_PRESSURE_PLATE, "cherry_pressure_plate") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "mangrove") @@ -208,6 +224,8 @@ private static List getDefaultEntries() { .chestBoat(Items.MANGROVE_CHEST_BOAT, "mangrove_chest_boat") .sign(Items.MANGROVE_SIGN, "mangrove_sign") .hangingSign(Items.MANGROVE_HANGING_SIGN, "mangrove_hanging_sign") + .button(Items.MANGROVE_BUTTON, "mangrove_button") + .pressurePlate(Items.MANGROVE_PRESSURE_PLATE, "mangrove_pressure_plate") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "crimson") @@ -225,6 +243,8 @@ private static List getDefaultEntries() { .stairs(Items.CRIMSON_STAIRS, "crimson_stairs") .sign(Items.CRIMSON_SIGN, "crimson_sign") .hangingSign(Items.CRIMSON_HANGING_SIGN, "crimson_hanging_sign") + .button(Items.CRIMSON_BUTTON, "crimson_button") + .pressurePlate(Items.CRIMSON_PRESSURE_PLATE, "crimson_pressure_plate") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "warped") @@ -242,6 +262,8 @@ private static List getDefaultEntries() { .stairs(Items.WARPED_STAIRS, "warped_stairs") .sign(Items.WARPED_SIGN, "warped_sign") .hangingSign(Items.WARPED_HANGING_SIGN, "warped_hanging_sign") + .button(Items.WARPED_BUTTON, "warped_button") + .pressurePlate(Items.WARPED_PRESSURE_PLATE, "warped_pressure_plate") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(GTCEu.MOD_ID, "rubber") @@ -260,6 +282,8 @@ private static List getDefaultEntries() { .chestBoat(GTItems.RUBBER_CHEST_BOAT.asItem(), null) .sign(GTBlocks.RUBBER_SIGN.asItem(), null) .hangingSign(GTBlocks.RUBBER_HANGING_SIGN.asItem(), null) + .button(GTBlocks.RUBBER_BUTTON.asItem(), null) + .pressurePlate(GTBlocks.RUBBER_PRESSURE_PLATE.asItem(), null) .registerAllTags() .registerAllUnificationInfo() .build(), @@ -275,9 +299,11 @@ private static List getDefaultEntries() { .chestBoat(GTItems.TREATED_WOOD_CHEST_BOAT.asItem(), null) .sign(GTBlocks.TREATED_WOOD_SIGN.asItem(), null) .hangingSign(GTBlocks.TREATED_WOOD_HANGING_SIGN.asItem(), null) + .button(GTBlocks.TREATED_WOOD_BUTTON.asItem(), null) + .pressurePlate(GTBlocks.TREATED_WOOD_PRESSURE_PLATE.asItem(), null) .material(TreatedWood) .generateLogToPlankRecipe(false) - .registerUnificationInfo(false, true, true, true, true, true, true, true) + .registerUnificationInfo(false, true, true, true, true, true, true, true, true, true) .build()); } return DEFAULT_ENTRIES; @@ -382,13 +408,20 @@ public static void registerWoodUnificationInfo(@NotNull WoodTypeEntry entry) { new ItemMaterialInfo(new MaterialStack(entry.material, M * 5))); } - /* - * TODO should this really be included? - * if (entry.chestBoat != null && entry.addChestBoatsUnificationInfo) { - * ChemicalHelper.registerMaterialInfo(entry.chestBoat, - * new ItemMaterialInfo(new MaterialStack(entry.material, M * 13))); - * } - */ + if (entry.chestBoat != null && entry.addChestBoatsUnificationInfo) { + ChemicalHelper.registerMaterialInfo(entry.chestBoat, + new ItemMaterialInfo(new MaterialStack(entry.material, M * 13))); + } + + if (entry.button != null && entry.addButtonsUnificationInfo) { + ChemicalHelper.registerMaterialInfo(entry.button, + new ItemMaterialInfo(new MaterialStack(entry.material, M / 6))); + } + + if (entry.pressurePlate != null && entry.addPressurePlatesUnificationInfo) { + ChemicalHelper.registerMaterialInfo(entry.pressurePlate, + new ItemMaterialInfo(new MaterialStack(entry.material, M))); + } } /** @@ -520,10 +553,6 @@ public static void registerWoodTypeRecipe(Consumer provider, @No .outputItems(entry.sign, 5) .duration(200).EUt(4).save(provider); } else { - VanillaRecipeHelper.addShapedRecipe(provider, recipeName + "_saw", new ItemStack(entry.sign, 3), - "PPP", "PPP", " s ", - 'P', entry.planks); - if (!hasSignRecipe) { VanillaRecipeHelper.addShapedRecipe(provider, recipeName + "_stick", new ItemStack(entry.sign, 3), "PPP", "PPP", " S ", @@ -539,9 +568,11 @@ public static void registerWoodTypeRecipe(Consumer provider, @No .duration(100).EUt(4).save(provider); } + // hanging sign if (entry.hangingSign != null && entry.strippedLog != null) { final boolean hasHangingSignRecipe = entry.hangingSignRecipeName != null; String recipeNameHanging = hasHangingSignRecipe ? entry.hangingSignRecipeName : name + "_hanging_sign"; + if (ConfigHolder.INSTANCE.recipes.hardWoodRecipes) { VanillaRecipeHelper.addShapedRecipe(provider, recipeNameHanging, new ItemStack(entry.hangingSign), "LLL", "C C", "RSR", @@ -550,15 +581,6 @@ public static void registerWoodTypeRecipe(Consumer provider, @No 'S', new ItemStack(entry.sign), 'L', new ItemStack(entry.slab)); - ASSEMBLER_RECIPES.recipeBuilder(name + "_hanging_sign_iron") - .inputItems(entry.slab, 3) - .inputItems(entry.sign) - .inputItems(Items.CHAIN, 2) - .inputFluids(Iron.getFluid(GTValues.L / 9)) - .outputItems(entry.hangingSign) - .circuitMeta(5) - .duration(150).EUt(4).save(provider); - VanillaRecipeHelper.addShapedRecipe(provider, recipeNameHanging + "_steel", new ItemStack(entry.hangingSign, 2), "LLL", "C C", "RSR", @@ -567,12 +589,11 @@ public static void registerWoodTypeRecipe(Consumer provider, @No 'S', new ItemStack(entry.sign), 'L', new ItemStack(entry.slab)); - ASSEMBLER_RECIPES.recipeBuilder(name + "_hanging_sign_steel") + ASSEMBLER_RECIPES.recipeBuilder(name + "_hanging_sign") .inputItems(entry.slab, 3) .inputItems(entry.sign) .inputItems(Items.CHAIN, 2) - .inputFluids(Steel.getFluid(GTValues.L / 9)) - .outputItems(entry.hangingSign, 2) + .outputItems(entry.hangingSign) .circuitMeta(5) .duration(150).EUt(4).save(provider); } else { @@ -636,7 +657,7 @@ public static void registerWoodTypeRecipe(Consumer provider, @No ASSEMBLER_RECIPES.recipeBuilder(name + "_trapdoor") .circuitMeta(3) .inputItems(new ItemStack(entry.planks), 6) - .outputItems(new ItemStack(entry.trapdoor), 2) + .outputItems(new ItemStack(entry.trapdoor), 4) .duration(100).EUt(4).save(provider); } } @@ -654,7 +675,7 @@ public static void registerWoodTypeRecipe(Consumer provider, @No // plank -> stairs assembling ASSEMBLER_RECIPES.recipeBuilder(name + "_stairs") - .inputItems(new ItemStack(entry.planks, 6)) + .inputItems(new ItemStack(entry.planks, 3)) .outputItems(new ItemStack(entry.stairs, 4)) .circuitMeta(7) .EUt(1).duration(100).save(provider); @@ -749,7 +770,6 @@ public static void registerWoodTypeRecipe(Consumer provider, @No final boolean hasBoatRecipe = entry.boatRecipeName != null; if (ConfigHolder.INSTANCE.recipes.hardWoodRecipes) { if (entry.slab != null) { - VanillaRecipeHelper.addShapedRecipe(provider, hasBoatRecipe ? entry.boatRecipeName : name + "_boat", new ItemStack(entry.boat), "PHP", "PkP", "SSS", @@ -798,6 +818,58 @@ public static void registerWoodTypeRecipe(Consumer provider, @No .duration(100).EUt(4).save(provider); } } + + // button + if (entry.button != null) { + final boolean hasButtonRecipe = entry.buttonRecipeName != null; + if (ConfigHolder.INSTANCE.recipes.hardWoodRecipes) { + VanillaRecipeHelper.addShapedRecipe(provider, name + "_button", new ItemStack(entry.button, 6), "sP", + 'P', new ItemStack(entry.pressurePlate)); + } else { + if (!hasButtonRecipe) { + VanillaRecipeHelper.addShapedRecipe(provider, name + "_button", new ItemStack(entry.button), "P", + 'P', new ItemStack(entry.planks)); + } + } + + // plank -> button cutting + CUTTER_RECIPES.recipeBuilder(name + "_button") + .inputItems(new ItemStack(entry.planks)) + .outputItems(entry.button, 12) + .duration(250).EUt(VA[ULV]).save(provider); + } + + // preesure plate + if (entry.pressurePlate != null) { + final boolean hasPressurePlateRecipe = entry.pressurePlateRecipeName != null; + if (ConfigHolder.INSTANCE.recipes.hardWoodRecipes) { + VanillaRecipeHelper.addShapedRecipe(provider, name + "_pressure_plate", + new ItemStack(entry.pressurePlate, 2), "SrS", "LCL", "SdS", + 'S', new UnificationEntry(bolt, GTMaterials.Wood), + 'L', entry.slab.asItem(), + 'C', new UnificationEntry(spring, GTMaterials.Iron)); + + ASSEMBLER_RECIPES.recipeBuilder(name + "_pressure_plate") + .inputItems(new ItemStack(entry.slab, 2)) + .inputItems(spring, Iron) + .outputItems(entry.pressurePlate) + .circuitMeta(7) + .duration(100).EUt(VA[ULV]).save(provider); + } else { + if (!hasPressurePlateRecipe) { + VanillaRecipeHelper.addShapedRecipe(provider, name + "_pressure_plate", + new ItemStack(entry.pressurePlate), "PP", + 'P', new ItemStack(entry.planks)); + } + + // slab -> pressure plate cutting + CUTTER_RECIPES.recipeBuilder(name + "_pressure_plate") + .inputItems(new ItemStack(entry.slab)) + .outputItems(entry.pressurePlate, 8) + .duration(250).EUt(VA[ULV]).save(provider); + } + + } } /** @@ -815,19 +887,6 @@ private static void registerGTWoodRecipes(Consumer provider) { 'L', GTBlocks.TREATED_WOOD_PLANK.asItem()); } - if (!ConfigHolder.INSTANCE.recipes.hardRedstoneRecipes) { - VanillaRecipeHelper.addShapelessRecipe(provider, "rubber_button", GTBlocks.RUBBER_BUTTON.asStack(), - GTBlocks.RUBBER_PLANK.asStack()); - VanillaRecipeHelper.addShapelessRecipe(provider, "treated_wood_button", - GTBlocks.TREATED_WOOD_BUTTON.asStack(), - GTBlocks.TREATED_WOOD_PLANK.asStack()); - VanillaRecipeHelper.addShapedRecipe(provider, "rubber_pressure_plate", - GTBlocks.RUBBER_PRESSURE_PLATE.asStack(), - "aa", 'a', GTBlocks.RUBBER_PLANK.asStack()); - VanillaRecipeHelper.addShapedRecipe(provider, "treated_wood_plate", - GTBlocks.TREATED_WOOD_PRESSURE_PLATE.asStack(), "aa", 'a', GTBlocks.TREATED_WOOD_PLANK.asStack()); - } - VanillaRecipeHelper.addShapedRecipe(provider, "rubber_wood", GTBlocks.RUBBER_WOOD.asStack(3), "LL", "LL", 'L', GTBlocks.RUBBER_LOG.asStack()); @@ -898,6 +957,11 @@ private static void hardWoodTypeRecipes(Consumer registry, @No registry.accept(new ResourceLocation(entry.modid, entry.trapdoorRecipeName)); } } + if (entry.chestBoat != null) { + if (entry.chestBoatRecipeName != null) { + registry.accept(new ResourceLocation(entry.modid, entry.chestBoatRecipeName)); + } + } if (entry.sign != null) { // hard plank -> sign crafting if (entry.signRecipeName != null) { @@ -910,6 +974,18 @@ private static void hardWoodTypeRecipes(Consumer registry, @No registry.accept(new ResourceLocation(entry.modid, entry.hangingSignRecipeName)); } } + if (entry.button != null) { + // hard plank -> button crafting + if (entry.buttonRecipeName != null) { + registry.accept(new ResourceLocation(entry.modid, entry.buttonRecipeName)); + } + } + if (entry.pressurePlate != null) { + // hard plank -> pressure plate crafting + if (entry.pressurePlateRecipeName != null) { + registry.accept(new ResourceLocation(entry.modid, entry.pressurePlateRecipeName)); + } + } } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/serialized/chemistry/PolymerRecipes.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/serialized/chemistry/PolymerRecipes.java index b33550523c..c7d3fd7ed1 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/serialized/chemistry/PolymerRecipes.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/serialized/chemistry/PolymerRecipes.java @@ -39,14 +39,14 @@ private static void polyethyleneProcess(Consumer provider) { CHEMICAL_RECIPES.recipeBuilder("polyethylene_from_air") .circuitMeta(1) .inputFluids(Air.getFluid(1000)) - .inputFluids(Ethylene.getFluid(144)) - .outputFluids(Polyethylene.getFluid(144)) + .inputFluids(Ethylene.getFluid(L)) + .outputFluids(Polyethylene.getFluid(L)) .duration(160).EUt(VA[LV]).save(provider); CHEMICAL_RECIPES.recipeBuilder("polyethylene_from_oxygen") .circuitMeta(1) .inputFluids(Oxygen.getFluid(1000)) - .inputFluids(Ethylene.getFluid(144)) + .inputFluids(Ethylene.getFluid(L)) .outputFluids(Polyethylene.getFluid(216)) .duration(160).EUt(VA[LV]).save(provider); @@ -95,14 +95,14 @@ private static void polyvinylChlorideProcess(Consumer provider) CHEMICAL_RECIPES.recipeBuilder("polyvinyl_chloride_from_air") .circuitMeta(1) .inputFluids(Air.getFluid(1000)) - .inputFluids(VinylChloride.getFluid(144)) - .outputFluids(PolyvinylChloride.getFluid(144)) + .inputFluids(VinylChloride.getFluid(L)) + .outputFluids(PolyvinylChloride.getFluid(L)) .duration(160).EUt(VA[LV]).save(provider); CHEMICAL_RECIPES.recipeBuilder("polyvinyl_chloride_from_oxygen") .circuitMeta(1) .inputFluids(Oxygen.getFluid(1000)) - .inputFluids(VinylChloride.getFluid(144)) + .inputFluids(VinylChloride.getFluid(L)) .outputFluids(PolyvinylChloride.getFluid(216)) .duration(160).EUt(VA[LV]).save(provider); @@ -151,14 +151,14 @@ private static void ptfeProcess(Consumer provider) { CHEMICAL_RECIPES.recipeBuilder("ptfe_from_air") .circuitMeta(1) .inputFluids(Air.getFluid(1000)) - .inputFluids(Tetrafluoroethylene.getFluid(144)) - .outputFluids(Polytetrafluoroethylene.getFluid(144)) + .inputFluids(Tetrafluoroethylene.getFluid(L)) + .outputFluids(Polytetrafluoroethylene.getFluid(L)) .duration(160).EUt(VA[LV]).save(provider); CHEMICAL_RECIPES.recipeBuilder("ptfe_from_oxygen") .circuitMeta(1) .inputFluids(Oxygen.getFluid(1000)) - .inputFluids(Tetrafluoroethylene.getFluid(144)) + .inputFluids(Tetrafluoroethylene.getFluid(L)) .outputFluids(Polytetrafluoroethylene.getFluid(216)) .duration(160).EUt(VA[LV]).save(provider); diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/serialized/chemistry/ReactorRecipes.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/serialized/chemistry/ReactorRecipes.java index 466360b0cb..4a3df055c8 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/serialized/chemistry/ReactorRecipes.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/serialized/chemistry/ReactorRecipes.java @@ -23,14 +23,14 @@ public class ReactorRecipes { public static void init(Consumer provider) { CHEMICAL_RECIPES.recipeBuilder("raw_rubber_from_air") .circuitMeta(1) - .inputFluids(Isoprene.getFluid(144)) + .inputFluids(Isoprene.getFluid(L)) .inputFluids(Air.getFluid(2000)) .outputItems(dust, RawRubber) .duration(160).EUt(VA[LV]).save(provider); CHEMICAL_RECIPES.recipeBuilder("raw_rubber_from_oxygen") .circuitMeta(1) - .inputFluids(Isoprene.getFluid(144)) + .inputFluids(Isoprene.getFluid(L)) .inputFluids(Oxygen.getFluid(2000)) .outputItems(dust, RawRubber, 3) .duration(160).EUt(VA[LV]).save(provider); @@ -219,14 +219,14 @@ public static void init(Consumer provider) { CHEMICAL_RECIPES.recipeBuilder("pva_from_air") .circuitMeta(1) .inputFluids(Air.getFluid(1000)) - .inputFluids(VinylAcetate.getFluid(144)) - .outputFluids(PolyvinylAcetate.getFluid(144)) + .inputFluids(VinylAcetate.getFluid(L)) + .outputFluids(PolyvinylAcetate.getFluid(L)) .duration(160).EUt(VA[LV]).save(provider); CHEMICAL_RECIPES.recipeBuilder("pva_from_oxygen") .circuitMeta(1) .inputFluids(Oxygen.getFluid(1000)) - .inputFluids(VinylAcetate.getFluid(144)) + .inputFluids(VinylAcetate.getFluid(L)) .outputFluids(PolyvinylAcetate.getFluid(216)) .duration(160).EUt(VA[LV]).save(provider); @@ -704,8 +704,8 @@ public static void init(Consumer provider) { CHEMICAL_RECIPES.recipeBuilder("polyvinyl_butyral") .inputFluids(Butyraldehyde.getFluid(250)) - .inputFluids(PolyvinylAcetate.getFluid(144)) - .outputFluids(PolyvinylButyral.getFluid(144)) + .inputFluids(PolyvinylAcetate.getFluid(L)) + .outputFluids(PolyvinylButyral.getFluid(L)) .duration(400).EUt(VA[HV]).save(provider); CHEMICAL_RECIPES.recipeBuilder("biphenyl_from_toluene") diff --git a/src/main/java/com/gregtechceu/gtceu/data/tags/BlockTagLoader.java b/src/main/java/com/gregtechceu/gtceu/data/tags/BlockTagLoader.java index f9726f9cca..995ffb3fc6 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/tags/BlockTagLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/tags/BlockTagLoader.java @@ -3,12 +3,14 @@ import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; +import com.gregtechceu.gtceu.common.data.GTMachines; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.data.recipe.CustomTags; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BlockTags; +import net.minecraft.tags.TagEntry; import net.minecraft.tags.TagKey; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -37,6 +39,10 @@ public static void init(RegistrateTagsProvider provider) { GTMaterials.OilHeavy.getFluid().defaultFluidState().createLegacyBlock().getBlock(), GTMaterials.RawOil.getFluid().defaultFluidState().createLegacyBlock().getBlock(), GTMaterials.NaturalGas.getFluid().defaultFluidState().createLegacyBlock().getBlock()); + + provider.addTag(BlockTags.MINEABLE_WITH_AXE) + .add(TagEntry.element(GTMachines.WOODEN_DRUM.getId())) + .add(TagEntry.element(GTMachines.WOODEN_CRATE.getId())); } private static void create(RegistrateTagsProvider provider, TagPrefix prefix, Material material, From 322ec43e7c97ec18ed9c1f7f2ddc490b657ffad5 Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Sat, 12 Oct 2024 19:38:03 -0400 Subject: [PATCH 130/141] Fix various Cleanroom issues (#2156) --- .../multiblock/electric/CleanroomMachine.java | 13 +- .../common/machine/trait/CleanroomLogic.java | 2 +- .../gtceu/core/mixins/ForgeHooksMixin.java | 42 ++++++ src/main/resources/gtceu.mixins.json | 139 +++++++++--------- 4 files changed, 122 insertions(+), 74 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/ForgeHooksMixin.java diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java index f827c32501..ff2a0aa573 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java @@ -27,6 +27,7 @@ import com.gregtechceu.gtceu.api.pattern.Predicates; import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTMachines; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; import com.gregtechceu.gtceu.common.machine.electric.HullMachine; import com.gregtechceu.gtceu.common.machine.multiblock.part.DiodePartMachine; @@ -34,6 +35,7 @@ import com.gregtechceu.gtceu.common.machine.multiblock.primitive.PrimitiveBlastFurnaceMachine; import com.gregtechceu.gtceu.common.machine.multiblock.primitive.PrimitivePumpMachine; import com.gregtechceu.gtceu.common.machine.trait.CleanroomLogic; +import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; @@ -66,8 +68,7 @@ import javax.annotation.ParametersAreNonnullByDefault; -import static com.gregtechceu.gtceu.api.pattern.Predicates.abilities; -import static com.gregtechceu.gtceu.api.pattern.Predicates.states; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault @@ -195,6 +196,7 @@ protected void initializeAbilities() { } this.inputEnergyContainers = new EnergyContainerList(energyContainers); getRecipeLogic().setEnergyContainer(this.inputEnergyContainers); + this.tier = GTUtil.getFloorTierByVoltage(getMaxVoltage()); } @SuppressWarnings("RedundantIfStatement") // `return false` being a separate statement is better for readability @@ -373,8 +375,11 @@ public BlockPattern getPattern() { } TraceabilityPredicate wallPredicate = states(getCasingState(), getGlassState()); - TraceabilityPredicate basePredicate = Predicates.autoAbilities(true, false, false) - .or(abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1).setMaxGlobalLimited(2)); + TraceabilityPredicate basePredicate = Predicates.abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1) + .setMaxGlobalLimited(2) + .or(blocks(GTMachines.MAINTENANCE_HATCH.get(), GTMachines.AUTO_MAINTENANCE_HATCH.get()) + .setMinGlobalLimited(ConfigHolder.INSTANCE.machines.enableMaintenance ? 1 : 0) + .setMaxGlobalLimited(1)); // layer the slices one behind the next return FactoryBlockPattern.start() diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/CleanroomLogic.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/CleanroomLogic.java index 72fe315b70..f5eec60abb 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/CleanroomLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/CleanroomLogic.java @@ -84,6 +84,7 @@ public void serverTick() { .append(EURecipeCapability.CAP.getName())); return; } + setStatus(Status.WORKING); // increase progress if (progress++ < getMaxProgress()) { if (!machine.onWorking()) { @@ -96,7 +97,6 @@ public void serverTick() { return; } adjustCleanAmount(false); - setStatus(Status.WORKING); } else { // has all maintenance problems if (progress > 0) { diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/ForgeHooksMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/ForgeHooksMixin.java new file mode 100644 index 0000000000..f56f54cff9 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/ForgeHooksMixin.java @@ -0,0 +1,42 @@ +package com.gregtechceu.gtceu.core.mixins; + +import com.gregtechceu.gtceu.api.pattern.MultiblockWorldSavedData; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.Level; +import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.common.util.BlockSnapshot; + +import com.llamalad7.mixinextras.sugar.Local; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(value = ForgeHooks.class, remap = false) +public class ForgeHooksMixin { + + @Inject(method = "onPlaceItemIntoWorld", + at = @At(value = "INVOKE", + remap = true, + target = "Lnet/minecraft/world/level/block/state/BlockState;onPlace(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Z)V")) + private static void gtceu$onPlaceBlock(UseOnContext context, CallbackInfoReturnable cir, + @Local Level level, @Local BlockSnapshot snap) { + MinecraftServer server = level.getServer(); + if (server != null) { + if (level instanceof ServerLevel serverLevel) { + for (var structure : MultiblockWorldSavedData.getOrCreate(serverLevel) + .getControllerInChunk(new ChunkPos(snap.getPos()))) { + if (structure.isPosInCache(snap.getPos())) { + server.executeBlocking( + () -> structure.onBlockStateChanged(snap.getPos(), level.getBlockState(snap.getPos()))); + } + } + } + } + } +} diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index ec71dfef3b..507b936342 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -1,71 +1,72 @@ { - "required": true, - "minVersion": "0.8", - "refmap": "gtceu.refmap.json", - "package": "com.gregtechceu.gtceu.core.mixins", - "compatibilityLevel": "JAVA_17", - "plugin": "com.gregtechceu.gtceu.core.mixins.GregTechMixinPlugin", - "client": [ - "BlockColorsMixin", - "BlockModelMixin", - "ClientLevelAccessor", - "CompassManagerMixin", - "GuiGraphicsAccessor", - "GuiGraphicsMixin", - "GuiHeartTypeMixin", - "LevelRendererMixin", - "ModelManagerMixin", - "MultiPlayerGameModeMixin", - "rei.FluidEntryRendererMixin" - ], - "mixins": [ - "AbstractRegistrateAccessor", - "BlockBehaviourAccessor", - "BlockMixin", - "BlockPropertiesAccessor", - "ChunkGeneratorMixin", - "ChunkMixin", - "CreeperMixin", - "EntityMixin", - "IFoliagePlacerTypeAccessor", - "IHolderReferenceAccessor", - "IngredientAccessor", - "IntersectionIngredientAccessor", - "InventoryMixin", - "ItemValueAccessor", - "ITrunkPlacerTypeAccessor", - "LevelMixin", - "LivingEntityMixin", - "LootDataManagerMixin", - "LootPoolAccessor", - "OreConfigurationMixin", - "OreVeinifierMixin", - "PartialNBTIngredientAccessor", - "PrimedTntAccessor", - "RecipeManagerAccessor", - "RecipeManagerInvoker", - "RecipeManagerMixin", - "RepairItemRecipeMixin", - "ServerChunkProviderMixin", - "ServerGamePacketListenerImplAccessor", - "ShapedRecipeAccessor", - "SidedRedstoneConnectivityMixin", - "StrictNBTIngredientAccessor", - "TagLoaderMixin", - "TagManagerMixin", - "TagValueAccessor", - "ae2.GenericStackInvAccessor", - "create.RotationPropagatorMixin", - "embeddium.BiomeColorCacheMixin", - "embeddium.VanillaColorAdapterMixin", - "emi.FluidEmiStackMixin", - "jei.FluidHelperMixin", - "rei.InputSlotCrafterMixin", - "rei.RecipeFinderMixin", - "top.ConfigMixin" - ], - "injectors": { - "defaultRequire": 1, - "maxShiftBy": 5 - } + "required": true, + "minVersion": "0.8", + "refmap": "gtceu.refmap.json", + "package": "com.gregtechceu.gtceu.core.mixins", + "compatibilityLevel": "JAVA_17", + "plugin": "com.gregtechceu.gtceu.core.mixins.GregTechMixinPlugin", + "client": [ + "BlockColorsMixin", + "BlockModelMixin", + "ClientLevelAccessor", + "CompassManagerMixin", + "GuiGraphicsAccessor", + "GuiGraphicsMixin", + "GuiHeartTypeMixin", + "LevelRendererMixin", + "ModelManagerMixin", + "MultiPlayerGameModeMixin", + "rei.FluidEntryRendererMixin" + ], + "mixins": [ + "AbstractRegistrateAccessor", + "BlockBehaviourAccessor", + "BlockMixin", + "BlockPropertiesAccessor", + "ChunkGeneratorMixin", + "ChunkMixin", + "CreeperMixin", + "EntityMixin", + "ForgeHooksMixin", + "IFoliagePlacerTypeAccessor", + "IHolderReferenceAccessor", + "IngredientAccessor", + "IntersectionIngredientAccessor", + "InventoryMixin", + "ItemValueAccessor", + "ITrunkPlacerTypeAccessor", + "LevelMixin", + "LivingEntityMixin", + "LootDataManagerMixin", + "LootPoolAccessor", + "OreConfigurationMixin", + "OreVeinifierMixin", + "PartialNBTIngredientAccessor", + "PrimedTntAccessor", + "RecipeManagerAccessor", + "RecipeManagerInvoker", + "RecipeManagerMixin", + "RepairItemRecipeMixin", + "ServerChunkProviderMixin", + "ServerGamePacketListenerImplAccessor", + "ShapedRecipeAccessor", + "SidedRedstoneConnectivityMixin", + "StrictNBTIngredientAccessor", + "TagLoaderMixin", + "TagManagerMixin", + "TagValueAccessor", + "ae2.GenericStackInvAccessor", + "create.RotationPropagatorMixin", + "embeddium.BiomeColorCacheMixin", + "embeddium.VanillaColorAdapterMixin", + "emi.FluidEmiStackMixin", + "jei.FluidHelperMixin", + "rei.InputSlotCrafterMixin", + "rei.RecipeFinderMixin", + "top.ConfigMixin" + ], + "injectors": { + "defaultRequire": 1, + "maxShiftBy": 5 + } } From ff0b20675d8730d97abdb7b0bd59490be0cdce50 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Sat, 12 Oct 2024 18:11:00 -0600 Subject: [PATCH 131/141] Fixed milk crash (#2158) --- src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java | 3 +-- src/main/java/com/gregtechceu/gtceu/common/data/GTFluids.java | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java index 3395a93b96..b39ac2491e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java @@ -80,8 +80,6 @@ public class CommonProxy { public CommonProxy() { - ForgeMod.enableMilkFluid(); - // used for forge events (ClientProxy + CommonProxy) IEventBus eventBus = FMLJavaModLoadingContext.get().getModEventBus(); eventBus.register(this); @@ -127,6 +125,7 @@ public static void init() { GTCompassSections.init(); GTCompassNodes.init(); GTCovers.init(); + ForgeMod.enableMilkFluid(); GTFluids.init(); GTCreativeModeTabs.init(); GTBlocks.init(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTFluids.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTFluids.java index 54d91888ec..b41e6f8b43 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTFluids.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTFluids.java @@ -25,7 +25,8 @@ public class GTFluids { public static void init() { handleNonMaterialFluids(GTMaterials.Water, Fluids.WATER); handleNonMaterialFluids(GTMaterials.Lava, Fluids.LAVA); - handleNonMaterialFluids(GTMaterials.Milk, ForgeMod.MILK.get()); + if (ForgeMod.MILK.isPresent()) + handleNonMaterialFluids(GTMaterials.Milk, ForgeMod.MILK.get()); REGISTRATE.creativeModeTab(() -> GTCreativeModeTabs.MATERIAL_FLUID); // register fluids for materials for (MaterialRegistry registry : GTCEuAPI.materialManager.getRegistries()) { From 4209e6d2b7dce9532254a34b2107d65672aa55a9 Mon Sep 17 00:00:00 2001 From: Karthi Suresh <75553966+JuiceyBeans@users.noreply.github.com> Date: Sun, 13 Oct 2024 06:27:31 +0100 Subject: [PATCH 132/141] Fix progress bar textures (#2163) --- .../gtceu/api/gui/GuiTextures.java | 5 ++++- .../gtceu/common/data/GTRecipeTypes.java | 2 +- .../progress_bar/progress_bar_assembler.png | Bin 0 -> 2093 bytes .../gui/progress_bar/progress_bar_circuit.png | Bin 2229 -> 0 bytes .../progress_bar_circuit_assembler.png | Bin 2093 -> 2229 bytes 5 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/assets/gtceu/textures/gui/progress_bar/progress_bar_assembler.png delete mode 100644 src/main/resources/assets/gtceu/textures/gui/progress_bar/progress_bar_circuit.png 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 6e8e97cec2..a114e933d7 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/GuiTextures.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/GuiTextures.java @@ -387,6 +387,9 @@ public class GuiTextures { .fullImage("gtceu:textures/gui/progress_bar/progress_bar_arrow_%s.png"); public static final ResourceTexture PROGRESS_BAR_ARROW_MULTIPLE = new ResourceTexture( "gtceu:textures/gui/progress_bar/progress_bar_arrow_multiple.png"); + public static final ResourceTexture PROGRESS_BAR_ASSEMBLER = new ResourceTexture( + "gtceu:textures/gui/progress_bar/progress_bar_assembler.png"); + public static final ResourceTexture PROGRESS_BAR_ASSEMBLY_LINE = new ResourceTexture( "gtceu:textures/gui/progress_bar/progress_bar_assembly_line.png"); public static final ResourceTexture PROGRESS_BAR_ASSEMBLY_LINE_ARROW = new ResourceTexture( @@ -404,7 +407,7 @@ public class GuiTextures { public static final ResourceTexture PROGRESS_BAR_CANNER = new ResourceTexture( "gtceu:textures/gui/progress_bar/progress_bar_canner.png"); public static final ResourceTexture PROGRESS_BAR_CIRCUIT = new ResourceTexture( - "gtceu:textures/gui/progress_bar/progress_bar_circuit.png"); + "gtceu:textures/gui/progress_bar/progress_bar_circuit_assembler.png"); public static final ResourceTexture PROGRESS_BAR_CIRCUIT_ASSEMBLER = new ResourceTexture( "gtceu:textures/gui/progress_bar/progress_bar_circuit_assembler.png"); public static final ResourceTexture PROGRESS_BAR_COKE_OVEN = new ResourceTexture( 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 d72b5d125a..6982426e5b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java @@ -119,7 +119,7 @@ public class GTRecipeTypes { public final static GTRecipeType ASSEMBLER_RECIPES = register("assembler", ELECTRIC).setMaxIOSize(9, 1, 1, 0) .setEUIO(IO.IN) .setSlotOverlay(false, false, GuiTextures.CIRCUIT_OVERLAY) - .setProgressBar(GuiTextures.PROGRESS_BAR_CIRCUIT, LEFT_TO_RIGHT) + .setProgressBar(GuiTextures.PROGRESS_BAR_ASSEMBLER, LEFT_TO_RIGHT) .setSound(GTSoundEntries.ASSEMBLER); public final static GTRecipeType AUTOCLAVE_RECIPES = register("autoclave", ELECTRIC).setMaxIOSize(2, 2, 1, 1) diff --git a/src/main/resources/assets/gtceu/textures/gui/progress_bar/progress_bar_assembler.png b/src/main/resources/assets/gtceu/textures/gui/progress_bar/progress_bar_assembler.png new file mode 100644 index 0000000000000000000000000000000000000000..8708614172a20c72c5f83ae3cbdfc7fb218f1549 GIT binary patch literal 2093 zcmb_de`p(398aazS#ABnVCYu3U7fV9mwR`)T$7`5G)dQHEM4i+U;blX?p~5>b3b-> zY0@Ht`fE;fDqBTF)at-daTJx!AzB$_Rckkj*w$9145t;eBFMx)oW4tw(ADk-)4=84 zz4!V4`h0)9gDuUCWu^C)IvkF&P*boKzc=EiYC{SBzr@Th;Mc8sQWmKQB#~y(xS+jQFM%UIO=v}bSU;Bi-@AQtoq1bKO7?oS@Mw`?l1`J z0hExN1`M=!pgAHA^om}I-0>h$ml3c61zC{DC`r{6GCne^SHNp~na9j1DM)yxL{*lUlgTa!n7Lta2Pp4)%5Z1;!Drt8tPj&?p47q-J2l*gMzi{ZJs# zVrVfri4V-yMn4g12=I)T=PB07WZeyig^+4mP!&-q=p!*XPFa=&7vPzg6!lPUmV-E0 z&PzdWG)6IERN`Z`QJ04o^YTGWOxY!nmzS`-JIZsY)&(do#>Oa-=XlEFad{{pxgp@( z9^^$_UVe`u;}(R;8`fhtrd>NilWgLw_UBq>FWQ$|C1oO8E&>$oHt><6oqr^exovqJ z2CgrH6}9OE!b-1F7b`GRi&<%Cp!zsw>zZ{(U&(nB_Fdg|7sv3x4ZIYH0X%eAj-?>P z$#b);$IGz{h)U6X=xbc}M1V`+JOW!N=^Jr9N2{2CY8>I2N|XN~nCq&(_`8oM}=*)2TF?PcK-!5@Wd2&tGS179*r%hnqXM^R-cSRZMc_~k`d z{utQs#79GKEjSm4yL!e)Xa9ITrH;)U{p{z(!x!uKG4EYCd+L#!J+7J5RK=E0Z~y9{ z(s#&jPE6f7H*?>{!9?==XQy`hr@wpp`3iD)YOHRlc&`3!mvz_qXGY6MB8Sc`Kknc9 z`=6Q4O}!|LN=TrnZYee&8GP%$?X%HL|6C_pzGO-yU#RNA7tOPN$Ujds=@xegqWHcUSD1 z8@hk!^vLAkHZ^jp#`i^a+vJ5?;>F#EKmWLY|LoD_SLmvT4~D`^FCVcl^iV@{@VLMG G(SHCA(7Sj5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/gui/progress_bar/progress_bar_circuit.png b/src/main/resources/assets/gtceu/textures/gui/progress_bar/progress_bar_circuit.png deleted file mode 100644 index f3def157adc0dacfaa8a989bbd9c36e0ee016828..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2229 zcmbVO2~ZPf6kZBA0)kMFaVWyFfaOXySqLFpBBDV+i3kQk1$DFg11rgHNEQi7v4bcT z4^T(cs%Q(;11~&Ur%_Q`&ng~e1gws>T5YXYJqC4@_D_He&e%FNvzyI(`@Qd-|C=nD zI3dB^)!P+85ci}+RT_K_hIerPe(<|XdgW*Ma4@AMj7E00`1}C{r`$Mo9D+1exxJ#C zq3mKvoMJ){w?Wq10r_J6Fa&WHv6@UFQ=LrGyk1N(ycUSfdILlwNKCBRK+*X?K(!#3 z<&@Y%OEZSDj1tR`sU>Q|7?8&%&M|^Xb0%o$Ir+4L!D2_cyT+JF$e;%Tg_`v`&P1A( zn2nf(zpZKGqM{;kQG}Q`=HgO?LV-&NoFGIH zAu<(n0%aC)rhsme9vT%e(MHxFusnxaX(=sVC@3))a(6CzgPof*^%M-24mVQ4W zbF%>%+Kw|68g;e^7#asUpa+~_f>@~?YsljT-jv7x3$^|A8xCNN)oQzsx5lE^+g+H1 z_}MUxo~pbRZPFAQ0G9dCq=VRR9;DAZ~)i8BclM}s7l5`#I5 zS(YIckun7>2S605PykUB6G@Ar8Ni6B9GN^?u2n=t6N+AY6;BshJKJl|{7?H7BMZ+M zrF(B4+exq^h?wRjNprDVcN2y~`+klW1Z5@0iMq4`$7_3LlzISoD zX^ZjzB>j&`=!Tj29HEFZg1B5*$ahZ~-Y1b5+6=HXm75kU{kv>I$i49Wd*tb#cR5bRMjS2rby{cb^&_?Gvb;*N4;Wt0 z+_QIXOUaXS_Z}>wmn@(6(cHOnXB|3pC`Ye9S90Rpep#=dNu#1hxVgD)eEj5>b1f}H zBMb8L!`3vnRUB+?zD_+rH!RqNH2h`0>QeE2^Y||DE6>v5vE|nharEwh=UWEeJ9+e` z$IG@62R5FKy&EyrDX95Q#&VkV-pe@8XAr#Cnuk} zb*o+wglbi2XlVWB&6_`KjZ05WT|U6Wqw;3-rS|sVprD{*-VU{QlJxo=F(XHg%g)}g zliIXzpGMoXX5_RPGgi-^?|4!a7Pc}m5KB)_A9v!^Vt03U@Aj)#x4T@qa;5&@!S$|B zhhO&f^<_#*vN(>r)zvk9f?Xs=0Q5HSe)j2>F3`z?M{8Lg=jK#$v85tSQ z<-X<5o;`c{!P?Hw&iz7vNo`$wVRmt8>Ev`rM@M66>CV6|+2msu%O^pa1zSctgG+la zU!KhJ{OXpL38IeBy5#WHKPHhIYF4fsq);k9%_dZt05mKMj`!NeKJVyQ+b{L*{rfw% z)o0yan|xd5fA>`KKs{T7t~)nt%983)N616-U!C_2^;c>uPA8*hes>v*xbE7utI)&c zp=7hrSUv2<#n={~4*$SSjg4W!OIP^sc3o3f9k_jx*N{x}?w@8(58Pt0O!F8xu#l_j zH>*9oRqOd^iOgadDlT`r)w%HOR?Rr~(Phh)EsJys^h_I4zc1Wx+<~U1FYi9`S4oqi zKb$R}F@1Vj)Tr|F-t+uk7+^()Ke&1O_SZgset-T}G2p8gFN)I_?`dcV8m@2%3k#bQ zy5e-bj^`Vvm|s1w^ogzO=;%mouvjcpht?zpK8=4=^RVtlRj8kC^|d`!FXuU8%}CqQ WZPEd!5`C@z9g^ZFsCJH?S@sY1lOy#2 diff --git a/src/main/resources/assets/gtceu/textures/gui/progress_bar/progress_bar_circuit_assembler.png b/src/main/resources/assets/gtceu/textures/gui/progress_bar/progress_bar_circuit_assembler.png index 8708614172a20c72c5f83ae3cbdfc7fb218f1549..f3def157adc0dacfaa8a989bbd9c36e0ee016828 100644 GIT binary patch delta 1474 zcmZ20uvKt^iZNqxkh>GZx^prw85kH?(j9#r85lP9bN@+X1@buyJR*x37`TN&n2}-D z90>*nR^5qK{!F}F6T56o&Gn3QlMM_E6wEF4OwG(vlaft!6pRdvjPwmm^$jd_4a}{K zjI4|-6`(-Lj+aYe;&&%jAf=$N*^<$MF~L~RL_s4wGcP5-yjW97p(3}y%DE^tu_V<6 zh;5ZXrs*02k!gsbxs|Djm8rS5frXWU0Ys^9eoAIqC8|;*qYy&_D1S*|;kx5Dz zYy_J4KPKbJQOr^*mL{f_$>yo4x+a#Esk&wo? z5U214vr05ECW3R5TgcK&*uvmEzWxhgj ziECMjRe45g9;?eF*GY(AxXIsa5lh&el!lp&kF2!<5tx zmOqOAKJWg4d9z~#Yhrg4{7u-jx%ynq=d*9#btd;rte38?uFl%KcW+v5?%A4S+u36N z)_*lLGgIT{=AQrQ^TV^}&WV{6W@l^9*nho!&;I@Q6W=M!ZC%f>^kc;x&i2Fmz5nU` z5vY^3Z@JH)XR$%~#|r*8#}7W{`*mGy$NV$)uZ*KuRQEq${b^c$V(7p0f_XU_D@oIN|ZzOe9Oy^g;A>iPXm&3CU~S3i36sG3yo zsS6h-T)A>ZVt$O9yZh3mOON{a_?&q1WJyU$$pjZIEv+TXmoIO);usnjIFW~suj{eJ zr5iUiR8>_ENioiQ?wOmr*2d1xD>ioSy2J%rwuB^YoM9IoA3wdhnfbV`w)SKX6{XP7 zP_JVrx_NndrEb*UxwD4z)~#Dh_UxI%^+ooYoSa-rO-)Q*Ufz>`|KcX^U@Bhjde*OAVKF;?B%S%>Ika%#>{+!HBMU@4s zS8HqZPEy>!HDmDvl{LYFq7fDK8!jirsjS$&JDQK5zcjC(E$fEPl_Y@=J*K;Ni|Mtn zJo(;sW@U&MuTxWBU!Mu5ia?O)k}W#&UOP5!T=?pPqKl!Yg;1G!d|X_UnM2EYse1XJ z1;8+oefRj;vt=^!@~@w^^DO%Lvof@M)6%7?vX+e6+S*lGlTI$l$b1}@#bdv}!BG!K<8t{Y0`HGhFXoWyo{FLk?IdGkCiC KxvXb3b-> zY0@Ht`fE;fDqBTF)at-daTJx!AzB$_Rckkj*w$9145t;eBFMx)oW4tw(ADk-)4=84 zz4!V4`h0)9gDuUCWu^C)IvkF&P*boKzc=EiYC{SBzr@Th;Mc8sQWmKQB#~y(xS+jQFM%UIO=v}bSU;Bi-@AQtoq1bKO7?oS@Mw`?l1`J z0hExN1`M=!pgAHA^om}I-0>h$ml3c61zC{DC`r{6GCne^SHNp~na9j1DM)yxL{*lUlgTa!n7Lta2Pp4)%5Z1;!Drt8tPj&?p47q-J2l*gMzi{ZJs# zVrVfri4V-yMn4g12=I)T=PB07WZeyig^+4mP!&-q=p!*XPFa=&7vPzg6!lPUmV-E0 z&PzdWG)6IERN`Z`QJ04o^YTGWOxY!nmzS`-JIZsY)&(do#>Oa-=XlEFad{{pxgp@( z9^^$_UVe`u;}(R;8`fhtrd>NilWgLw_UBq>FWQ$|C1oO8E&>$oHt><6oqr^exovqJ z2CgrH6}9OE!b-1F7b`GRi&<%Cp!zsw>zZ{(U&(nB_Fdg|7sv3x4ZIYH0X%eAj-?>P z$#b);$IGz{h)U6X=xbc}M1V`+JOW!N=^Jr9N2{2CY8>I2N|XN~nCq&(_`8oM}=*)2TF?PcK-!5@Wd2&tGS179*r%hnqXM^R-cSRZMc_~k`d z{utQs#79GKEjSm4yL!e)Xa9ITrH;)U{p{z(!x!uKG4EYCd+L#!J+7J5RK=E0Z~y9{ z(s#&jPE6f7H*?>{!9?==XQy`hr@wpp`3iD)YOHRlc&`3!mvz_qXGY6MB8Sc`Kknc9 z`=6Q4O}!|LN=TrnZYee&8GP%$?X%HL|6C_pzGO-yU#RNA7tOPN$Ujds=@xegqWHcUSD1 z8@hk!^vLAkHZ^jp#`i^a+vJ5?;>F#EKmWLY|LoD_SLmvT4~D`^FCVcl^iV@{@VLMG G(SHCA(7Sj5 From 05416db56c72487116b9743efaedd8bdcb07d47f Mon Sep 17 00:00:00 2001 From: Karthi Suresh <75553966+JuiceyBeans@users.noreply.github.com> Date: Sun, 13 Oct 2024 06:27:59 +0100 Subject: [PATCH 133/141] Fix FoodStats tooltip (#2161) --- .../resources/assets/gtceu/lang/en_ud.json | 2 +- .../resources/assets/gtceu/lang/en_us.json | 2 +- .../gtceu/api/item/component/FoodStats.java | 14 +++++++++++++- .../gregtechceu/gtceu/common/data/GTItems.java | 3 +-- .../gtceu/data/lang/LangHandler.java | 2 +- .../com/gregtechceu/gtceu/utils/GTUtil.java | 18 +++++++++++++----- 6 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index fc1454a337..d77c0d3658 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -3947,7 +3947,7 @@ "gtceu.tooltip.fluid_pipe_hold_shift": "oɟuI ʇuǝɯuıɐʇuoƆ pınןℲ ʍoɥs oʇ ⟘ℲIHS pןoHㄥ§", "gtceu.tooltip.hold_ctrl": "oɟuı ǝɹoɯ ɹoɟ Ꞁᴚ⟘Ɔ pןoHㄥ§", "gtceu.tooltip.hold_shift": "oɟuı ǝɹoɯ ɹoɟ ⟘ℲIHS pןoHㄥ§", - "gtceu.tooltip.potion.each": "buıuǝddɐɥ ɟo ǝɔuɐɥɔ ɹ§%s%%ɐ§ ɐ ɥʇıʍ sʞɔıʇ ɹ§%sɔ§ ɹoɟ ɹ§%s %sǝ§ ", + "gtceu.tooltip.potion.each": "ɹ§buıuǝddɐɥ ɟo ǝɔuɐɥɔㄥ§ %s%% ɹ§ɐ ɥʇıʍ sʞɔıʇㄥ§ %s ɹ§ɹoɟㄥ§ %s %s", "gtceu.tooltip.potion.header": ":sʇɔǝɟɟǝ suıɐʇuoƆ9§", "gtceu.tooltip.proxy_bind": "%s %s %s ʇɐ ɹǝɟɟnᗺ uɹǝʇʇɐԀ ɐ oʇ buıpuıᗺɟ§", "gtceu.tooltip.tool_fluid_hold_shift": "oɟuI ןoo⟘ puɐ ʇuǝɯuıɐʇuoƆ pınןℲ ʍoɥs oʇ ⟘ℲIHS pןoHㄥ§", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 287c6693db..d567afb38d 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -3947,7 +3947,7 @@ "gtceu.tooltip.fluid_pipe_hold_shift": "§7Hold SHIFT to show Fluid Containment Info", "gtceu.tooltip.hold_ctrl": "§7Hold CTRL for more info", "gtceu.tooltip.hold_shift": "§7Hold SHIFT for more info", - "gtceu.tooltip.potion.each": " §e%s %s§r for §c%s§r ticks with a §a%s%%§r chance of happening", + "gtceu.tooltip.potion.each": "%s %s §7for§r %s §7ticks with a§r %s%% §7chance of happening§r", "gtceu.tooltip.potion.header": "§6Contains effects:", "gtceu.tooltip.proxy_bind": "§fBinding to a Pattern Buffer at %s %s %s", "gtceu.tooltip.tool_fluid_hold_shift": "§7Hold SHIFT to show Fluid Containment and Tool Info", diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/component/FoodStats.java b/src/main/java/com/gregtechceu/gtceu/api/item/component/FoodStats.java index f6e0a1af5b..0bedb592ba 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/component/FoodStats.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/component/FoodStats.java @@ -28,16 +28,28 @@ public class FoodStats implements IEdibleItem, IInteractionItem, IAddInformation protected final FoodProperties properties; protected final boolean isDrink; - @Nullable protected final Supplier containerItem; + public FoodStats(FoodProperties properties, boolean isDrink, boolean hasPotionEffects, + @Nullable Supplier containerItem) { + this.properties = properties; + this.isDrink = isDrink; + this.containerItem = containerItem; + } + public FoodStats(FoodProperties properties, boolean isDrink, @Nullable Supplier containerItem) { this.properties = properties; this.isDrink = isDrink; this.containerItem = containerItem; } + public FoodStats(FoodProperties properties) { + this.properties = properties; + this.isDrink = false; + this.containerItem = null; + } + @Override public FoodProperties getFoodProperties(ItemStack stack, @Nullable LivingEntity entity) { return properties; 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 d38329c665..f7438218ee 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java @@ -2376,8 +2376,7 @@ public Component getItemName(ItemStack stack) { new FoodProperties.Builder().nutrition(1) .effect(() -> new MobEffectInstance(MobEffects.HUNGER, 400), .40f) .effect(() -> new MobEffectInstance(MobEffects.POISON, 100), .05f) - .build(), - false, null))) + .build()))) .tag(CustomTags.DOUGHS) .register(); public static ItemEntry PLANT_BALL = REGISTRATE.item("plant_ball", ComponentItem::create) diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index 1474c4940a..84b76d583f 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -1345,7 +1345,7 @@ public static void init(RegistrateLangProvider provider) { provider.add("effect.gtceu.weak_poison", "Weak Poison"); provider.add("gtceu.tooltip.potion.header", "§6Contains effects:"); - provider.add("gtceu.tooltip.potion.each", " §e%s %s§r for §c%s§r ticks with a §a%s%%§r chance of happening"); + provider.add("gtceu.tooltip.potion.each", "%s %s §7for§r %s §7ticks with a§r %s%% §7chance of happening§r"); } /** diff --git a/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java b/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java index 4921fb4965..eb431860bb 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/GTUtil.java @@ -14,6 +14,7 @@ import com.lowdragmc.lowdraglib.side.fluid.FluidHelper; import com.lowdragmc.lowdraglib.side.fluid.FluidStack; +import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -24,6 +25,7 @@ import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BiomeTags; import net.minecraft.util.RandomSource; @@ -496,15 +498,21 @@ public static Tuple getMaintenanceText(byte flag) { } public static void addPotionTooltip(List> effects, List list) { - list.add(Component.translatable("gtceu.tooltip.potion.header")); + if (!effects.isEmpty()) { + list.add(Component.translatable("gtceu.tooltip.potion.header")); + } effects.forEach(pair -> { var effect = pair.getFirst(); float probability = pair.getSecond(); list.add(Component.translatable("gtceu.tooltip.potion.each", - Component.translatable(effect.getDescriptionId()), - Component.translatable("enchantment.level." + (effect.getAmplifier() + 1)), - effect.getDuration(), - 100 * probability)); + Component.translatable(effect.getDescriptionId()) + .setStyle(Style.EMPTY.withColor(ChatFormatting.YELLOW)), + Component.translatable("enchantment.level." + (effect.getAmplifier() + 1)) + .setStyle(Style.EMPTY.withColor(ChatFormatting.YELLOW)), + Component.literal(String.valueOf(effect.getDuration())) + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED)), + Component.literal(String.valueOf(100 * probability)) + .setStyle(Style.EMPTY.withColor(ChatFormatting.GREEN)))); }); } } From 5b33d3eb37522032ef3c47d788bf73062be81083 Mon Sep 17 00:00:00 2001 From: Karthi Suresh <75553966+JuiceyBeans@users.noreply.github.com> Date: Sun, 13 Oct 2024 09:19:06 +0100 Subject: [PATCH 134/141] Last minute fixes (#2165) --- .../gtceu/data/recipe/misc/MiscRecipeLoader.java | 7 ------- .../gtceu/data/recipe/misc/VanillaStandardRecipes.java | 7 ++++--- .../gtceu/data/recipe/misc/WoodMachineRecipes.java | 2 +- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MiscRecipeLoader.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MiscRecipeLoader.java index 65b82b870a..45c34e99eb 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MiscRecipeLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MiscRecipeLoader.java @@ -632,12 +632,5 @@ public static void init(Consumer provider) { .inputItems(ring, Steel, 2) .outputItems(STEEL_MINECART_WHEELS) .duration(60).EUt(20).save(provider); - - FLUID_SOLIDFICATION_RECIPES.recipeBuilder("light_concrete") - .inputFluids(Concrete.getFluid(144)) - .inputItems(SHAPE_MOLD_BLOCK) - .outputItems(GTBlocks.LIGHT_CONCRETE) - .duration(100).EUt(VA[ULV]) - .save(provider); } } 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 810d6cf8ed..c2db6b89aa 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 @@ -489,10 +489,11 @@ private static void woodRecipes(Consumer provider) { VanillaRecipeHelper.addShapedRecipe(provider, "soul_torch", new ItemStack(Blocks.SOUL_TORCH, 1), "WB", 'W', ItemTags.SOUL_FIRE_BASE_BLOCKS, 'B', new ItemStack(Blocks.TORCH)); if (!ConfigHolder.INSTANCE.recipes.hardMiscRecipes) { - VanillaRecipeHelper.addShapedRecipe(provider, "soul_lantern", new ItemStack(Blocks.SOUL_LANTERN, 1), "WB", - 'W', ItemTags.SOUL_FIRE_BASE_BLOCKS, 'B', new ItemStack(Blocks.SOUL_LANTERN)); + VanillaRecipeHelper.addShapedRecipe(provider, "soul_lantern_from_lantern", + new ItemStack(Blocks.SOUL_LANTERN, 1), "WB", + 'W', ItemTags.SOUL_FIRE_BASE_BLOCKS, 'B', new ItemStack(Blocks.LANTERN)); - ASSEMBLER_RECIPES.recipeBuilder("soul_lantern") + ASSEMBLER_RECIPES.recipeBuilder("soul_lantern_from_lantern") .inputItems(new ItemStack(Blocks.LANTERN)) .inputItems(ItemTags.SOUL_FIRE_BASE_BLOCKS) .outputItems(new ItemStack(Blocks.SOUL_LANTERN)) 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 7714cf9f0d..15f2911da4 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 @@ -834,7 +834,7 @@ public static void registerWoodTypeRecipe(Consumer provider, @No // plank -> button cutting CUTTER_RECIPES.recipeBuilder(name + "_button") - .inputItems(new ItemStack(entry.planks)) + .inputItems(new ItemStack(entry.pressurePlate)) .outputItems(entry.button, 12) .duration(250).EUt(VA[ULV]).save(provider); } From bcba2295a70babc531f34f5db9dd7b2063c7f229 Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Sun, 13 Oct 2024 04:55:32 -0400 Subject: [PATCH 135/141] Update publish.yml (#2168) --- .github/workflows/publish.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index c50ab3f14a..89f4bc1fed 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -99,7 +99,9 @@ jobs: modrinth-token: ${{ secrets.MODRINTH_TOKEN }} curseforge-id: 890405 curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }} - files: ./*.jar + files: | + ./gtceu-${{ env.MC_VERSION }}-${{ needs.build.outputs.ver }}.jar + ./!(gtceu-${{ env.MC_VERSION }}-${{ needs.build.outputs.ver }}.jar) name: 'GregTechCEu ${{ env.MC_VERSION }}-${{ needs.build.outputs.ver }}' version: 'mc${{ env.MC_VERSION }}-${{ needs.build.outputs.ver }}' version-type: beta From dd8c2062fa7937fc9863637706edd3347d597147 Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Sun, 13 Oct 2024 05:20:35 -0400 Subject: [PATCH 136/141] Release for 1.20.1 (#2173) --- CHANGELOG.md | 69 +++++++++++++++++++++++++++++++++++++++++++++++ gradle.properties | 2 +- 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e7da322a4b..73d451e42d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,74 @@ # ChangeLog +## Version [v1.4.5](https://github.com/GregTechCEu/GregTech-Modern/compare/1.20.1-1.4.4...v1.4.5) +### Added + +- Replace wrench with plate in bender recipe by @JuiceyBeans in [#2057](https://github.com/GregTechCEu/GregTech-Modern/pull/2057) +- Machine Ownership by @YoungOnionMC in [#1970](https://github.com/GregTechCEu/GregTech-Modern/pull/1970) +- Give coils an actual EU discount in EBF by @YoungOnionMC in [#2055](https://github.com/GregTechCEu/GregTech-Modern/pull/2055) +- Multiblock Display Text for Outputs by @YoungOnionMC in [#2048](https://github.com/GregTechCEu/GregTech-Modern/pull/2048) +- Make magnetic tool property pull mob drops too by @JuiceyBeans in [#2037](https://github.com/GregTechCEu/GregTech-Modern/pull/2037) +- Yeet Sand from OreVeins by @Ghostipedia in [#2078](https://github.com/GregTechCEu/GregTech-Modern/pull/2078) +- Give torch placing a sound by @YoungOnionMC in [#2091](https://github.com/GregTechCEu/GregTech-Modern/pull/2091) +- Port of 1.12 hard ebf recipe by @YoungOnionMC in [#2093](https://github.com/GregTechCEu/GregTech-Modern/pull/2093) +- Add tags for GT components by @JuiceyBeans in [#2111](https://github.com/GregTechCEu/GregTech-Modern/pull/2111) +- Add in-line filtering for item and fluid pipes by @YoungOnionMC in [#2126](https://github.com/GregTechCEu/GregTech-Modern/pull/2126) +- Add Storage Cover by @Spicierspace153 in [#1990](https://github.com/GregTechCEu/GregTech-Modern/pull/1990) +- Add placable surface rock items by @YoungOnionMC in [#2132](https://github.com/GregTechCEu/GregTech-Modern/pull/2132) +- Aisle Repetition Storage by @YoungOnionMC in [#2140](https://github.com/GregTechCEu/GregTech-Modern/pull/2140) +- Copy the EBF's temperature tooltip to the ABS and RHF by @Zorbatron in [#2142](https://github.com/GregTechCEu/GregTech-Modern/pull/2142) +- Add cutting recipe for stained glass panes by @YoungOnionMC in [#2144](https://github.com/GregTechCEu/GregTech-Modern/pull/2144) +- Add ability to set ghost circuit using held circuit item by @YoungOnionMC in [#2145](https://github.com/GregTechCEu/GregTech-Modern/pull/2145) +- Add dough by @YoungOnionMC in [#2147](https://github.com/GregTechCEu/GregTech-Modern/pull/2147) +- fluid crafting table recipes by @screret in [#2152](https://github.com/GregTechCEu/GregTech-Modern/pull/2152) + +### Fixed + +- Give coils an actual EU discount in EBF by @YoungOnionMC in [#2055](https://github.com/GregTechCEu/GregTech-Modern/pull/2055) +- Update tooltip capitalization for consistency by @JuiceyBeans in [#2061](https://github.com/GregTechCEu/GregTech-Modern/pull/2061) +- Misc recipe fixes by @JuiceyBeans in [#2056](https://github.com/GregTechCEu/GregTech-Modern/pull/2056) +- Torch Behaviour, now with less duping by @YoungOnionMC in [#2067](https://github.com/GregTechCEu/GregTech-Modern/pull/2067) +- Fix broken treated wood recipes by @Electrolyte220 in [#2045](https://github.com/GregTechCEu/GregTech-Modern/pull/2045) +- Remove any connected miner pipes when the machine is removed by @Vextin in [#2064](https://github.com/GregTechCEu/GregTech-Modern/pull/2064) +- Add missing flags for materials by @JuiceyBeans in [#2024](https://github.com/GregTechCEu/GregTech-Modern/pull/2024) +- Output Line Infinite formatting by @YoungOnionMC in [#2082](https://github.com/GregTechCEu/GregTech-Modern/pull/2082) +- AE2 Integration: Use smart cable connection type for ME Connected blocks by @RealKC in [#2087](https://github.com/GregTechCEu/GregTech-Modern/pull/2087) +- Missing progress lang for some multis by @YoungOnionMC in [#2090](https://github.com/GregTechCEu/GregTech-Modern/pull/2090) +- Fix fluid drilling rig not working with 2 hatches by @YoungOnionMC in [#2092](https://github.com/GregTechCEu/GregTech-Modern/pull/2092) +- Fix Wooden sign recipes by @YoungOnionMC in [#2094](https://github.com/GregTechCEu/GregTech-Modern/pull/2094) +- Stone tags and LPG localisation by @JuiceyBeans in [#2095](https://github.com/GregTechCEu/GregTech-Modern/pull/2095) +- Add more interactions + fixes for Lighter by @JuiceyBeans in [#2075](https://github.com/GregTechCEu/GregTech-Modern/pull/2075) +- Fix Large Miner bus requirement by @YoungOnionMC in [#2121](https://github.com/GregTechCEu/GregTech-Modern/pull/2121) +- Fix Assembly Line ordering for certain orientations by @YoungOnionMC in [#2119](https://github.com/GregTechCEu/GregTech-Modern/pull/2119) +- Fix Gem downcrafting recipes by @YoungOnionMC in [#2102](https://github.com/GregTechCEu/GregTech-Modern/pull/2102) +- Fix Recipe NBT Serialization by @YoungOnionMC in [#2105](https://github.com/GregTechCEu/GregTech-Modern/pull/2105) +- Fix Drum Item fluid property handling by @YoungOnionMC in [#2128](https://github.com/GregTechCEu/GregTech-Modern/pull/2128) +- Misc Recipe Fixes by @Electrolyte220 in [#2125](https://github.com/GregTechCEu/GregTech-Modern/pull/2125) +- Rubber Wood/Log Fixes by @Electrolyte220 in [#2097](https://github.com/GregTechCEu/GregTech-Modern/pull/2097) +- Fix Frame Block being deleted upon shift-click with pipe by @YoungOnionMC in [#2131](https://github.com/GregTechCEu/GregTech-Modern/pull/2131) +- Fix Heat Capacity not showing in ABS and EBF by @RealKC in [#2134](https://github.com/GregTechCEu/GregTech-Modern/pull/2134) +- Fix Debrominated brine not having any usage by @YoungOnionMC in [#2133](https://github.com/GregTechCEu/GregTech-Modern/pull/2133) +- Add back backwards compatibility for the SteamParallelMultiblock constructor by @krossgg in [#2139](https://github.com/GregTechCEu/GregTech-Modern/pull/2139) +- Fix voltage floor formula causing negative values by @YoungOnionMC in [#2141](https://github.com/GregTechCEu/GregTech-Modern/pull/2141) +- Fix insertion and extraction of rotors in rotor holders by @YoungOnionMC in [#2143](https://github.com/GregTechCEu/GregTech-Modern/pull/2143) +- Fix Lighter ground behavior by @YoungOnionMC in [#2146](https://github.com/GregTechCEu/GregTech-Modern/pull/2146) +- Fix magnetic double plate overlay by @YoungOnionMC in [#2148](https://github.com/GregTechCEu/GregTech-Modern/pull/2148) +- Fix Surface Rock model in inventories and player by @YoungOnionMC in [#2155](https://github.com/GregTechCEu/GregTech-Modern/pull/2155) +- Fix various recipe and item issues by @JuiceyBeans in [#2077](https://github.com/GregTechCEu/GregTech-Modern/pull/2077) +- Fix various Cleanroom issues by @krossgg in [#2156](https://github.com/GregTechCEu/GregTech-Modern/pull/2156) +- Fixed milk crash by @YoungOnionMC in [#2158](https://github.com/GregTechCEu/GregTech-Modern/pull/2158) +- Fix progress bar textures by @JuiceyBeans in [#2163](https://github.com/GregTechCEu/GregTech-Modern/pull/2163) +- Fix FoodStats tooltip by @JuiceyBeans in [#2161](https://github.com/GregTechCEu/GregTech-Modern/pull/2161) + +### Changed + +- Update manage-pr-labels.yml by @krossgg in [#2062](https://github.com/GregTechCEu/GregTech-Modern/pull/2062) +- Change Wooden Multiblock Tank recipe to use copper instead of lead by @JuiceyBeans in [#2107](https://github.com/GregTechCEu/GregTech-Modern/pull/2107) +- Allow Steam Multiblocks to have variable parallel amounts by @Deepacat in [#2108](https://github.com/GregTechCEu/GregTech-Modern/pull/2108) +- Refactor and add missing sign & trapdoor recipes by @Electrolyte220 in [#2098](https://github.com/GregTechCEu/GregTech-Modern/pull/2098) +- Rework Pump Machine logic to fix issues by @eragaxshim in [#2003](https://github.com/GregTechCEu/GregTech-Modern/pull/2003) + + Version: 1.4.1 ### ADDITIONS: diff --git a/gradle.properties b/gradle.properties index b9016ca249..c09e2e4c10 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs = -Xmx6G # Mod Info mod_id = gtceu mod_name = GregTech -mod_version = 1.4.5 +mod_version = 1.4.6 mod_description = GregTech CE Unofficial, ported from 1.12.2 mod_license = LGPL-3.0 license mod_url = https://github.com/GregTechCEu/GregTech-Modern/ From 0468701d356ee581f7c59e36f64e40a4773a4853 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Sun, 13 Oct 2024 14:15:41 -0600 Subject: [PATCH 137/141] Fix NPE caused by filter not loading properly on cover (#2176) --- .../com/gregtechceu/gtceu/common/cover/FluidFilterCover.java | 4 ++-- .../com/gregtechceu/gtceu/common/cover/ItemFilterCover.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java index 757c6b378d..9e15898822 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java @@ -78,14 +78,14 @@ public FilteredFluidTransferWrapper(IFluidTransfer delegate) { @Override public long fill(int tank, FluidStack resource, boolean simulate, boolean notifyChanges) { - if (!fluidFilter.test(resource)) + if (!getFluidFilter().test(resource)) return 0; return super.fill(tank, resource, simulate, notifyChanges); } @Override public FluidStack drain(int tank, FluidStack resource, boolean simulate, boolean notifyChanges) { - if (!fluidFilter.test(resource)) + if (!getFluidFilter().test(resource)) return FluidStack.empty(); return super.drain(tank, resource, simulate, notifyChanges); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java index b6b8274d64..41f53297fc 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java @@ -103,7 +103,7 @@ public FilteredItemTransferWrapper(IItemTransfer delegate) { @Override public @NotNull ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate, boolean notifyChanges) { - if (filterMode != ItemFilterMode.FILTER_EXTRACT && !itemFilter.test(stack)) + if (filterMode != ItemFilterMode.FILTER_EXTRACT && !getItemFilter().test(stack)) return stack; return super.insertItem(slot, stack, simulate, notifyChanges); } @@ -111,7 +111,7 @@ public FilteredItemTransferWrapper(IItemTransfer delegate) { @Override public @NotNull ItemStack extractItem(int slot, int amount, boolean simulate, boolean notifyChanges) { ItemStack result = super.extractItem(slot, amount, true, notifyChanges); - if (result.isEmpty() || (filterMode != ItemFilterMode.FILTER_INSERT && !itemFilter.test(result))) { + if (result.isEmpty() || (filterMode != ItemFilterMode.FILTER_INSERT && !getItemFilter().test(result))) { return ItemStack.EMPTY; } return simulate ? result : super.extractItem(slot, amount, false, notifyChanges); From a4a2729882ec51a44127f2f2bb4b3b8d6c5aa22b Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Sun, 13 Oct 2024 16:16:06 -0400 Subject: [PATCH 138/141] Add Programmed Circuits to GTEmiRecipe Catalysts (#2175) --- .../gtceu/api/capability/recipe/ItemRecipeCapability.java | 3 +++ 1 file changed, 3 insertions(+) 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 556a62d972..848acad9cf 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 @@ -553,6 +553,9 @@ public void applyWidgetInfo(@NotNull Widget widget, tooltips.add(Component.translatable("gtceu.gui.content.per_tick")); } }); + if (io == IO.IN && this.of(content.content) instanceof IntCircuitIngredient) { + slot.setIngredientIO(IngredientIO.CATALYST); + } } } } From aa41aba133f31dd3928bea816d6fd032cd1d90b6 Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Sun, 13 Oct 2024 18:24:42 -0400 Subject: [PATCH 139/141] Fix issues with serialization (#2177) --- .../api/recipe/ingredient/FluidContainerIngredient.java | 6 ++++++ .../gtceu/common/recipe/condition/DimensionCondition.java | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/FluidContainerIngredient.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/FluidContainerIngredient.java index d7f94a70a3..ffcc6c3a56 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/FluidContainerIngredient.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/FluidContainerIngredient.java @@ -120,6 +120,12 @@ public boolean extractFrom(IFluidTransfer handler, boolean simulate) { return false; } + @Override + @NotNull + public IIngredientSerializer getSerializer() { + return SERIALIZER; + } + public static FluidContainerIngredient fromJson(JsonObject json) { return SERIALIZER.parse(json); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DimensionCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DimensionCondition.java index 31226a2f17..5dc771f9df 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DimensionCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DimensionCondition.java @@ -111,7 +111,7 @@ public JsonObject serialize() { public RecipeCondition deserialize(@NotNull JsonObject config) { super.deserialize(config); dimension = new ResourceLocation( - GsonHelper.getAsString(config, "dim", "dummy")); + GsonHelper.getAsString(config, "dimension", "dummy")); return this; } From e71f2e57f1476a439d7b918016d624d7ccd17e93 Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Mon, 14 Oct 2024 17:44:08 -0400 Subject: [PATCH 140/141] Release for 1.20.1 (#2181) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 11 +++++++++++ gradle.properties | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 73d451e42d..5abc864cc7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # ChangeLog +## Version [v1.4.6](https://github.com/GregTechCEu/GregTech-Modern/compare/v1.4.5...v1.4.6) +### Added + +- Add Programmed Circuits to GTEmiRecipe Catalysts by @krossgg in [#2175](https://github.com/GregTechCEu/GregTech-Modern/pull/2175) + +### Fixed + +- Fix NPE caused by filter not loading properly on cover by @YoungOnionMC in [#2176](https://github.com/GregTechCEu/GregTech-Modern/pull/2176) +- Fix issues with serialization by @krossgg in [#2177](https://github.com/GregTechCEu/GregTech-Modern/pull/2177) + + ## Version [v1.4.5](https://github.com/GregTechCEu/GregTech-Modern/compare/1.20.1-1.4.4...v1.4.5) ### Added diff --git a/gradle.properties b/gradle.properties index c09e2e4c10..b40d28b3e5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs = -Xmx6G # Mod Info mod_id = gtceu mod_name = GregTech -mod_version = 1.4.6 +mod_version = 1.4.7 mod_description = GregTech CE Unofficial, ported from 1.12.2 mod_license = LGPL-3.0 license mod_url = https://github.com/GregTechCEu/GregTech-Modern/ From e7293c235935f6c8ea1cfd11ce3bcaddd2544243 Mon Sep 17 00:00:00 2001 From: KilaBash Date: Tue, 15 Oct 2024 16:30:33 +0900 Subject: [PATCH 141/141] update LDLib to fix server freezing sometimes (and various other issues) (#2184) --- settings.gradle | 2 +- .../gtceu/api/gui/widget/ProspectingMapWidget.java | 1 + .../gtceu/api/pattern/MultiblockWorldSavedData.java | 5 ++++- .../gtceu/forge/ForgeCommonEventListener.java | 13 +++++++++++++ 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/settings.gradle b/settings.gradle index 5d5dc8d938..f2b142199f 100644 --- a/settings.gradle +++ b/settings.gradle @@ -58,7 +58,7 @@ dependencyResolutionManagement { def vineFlowerVersion = "1.+" def macheteVersion = "1.+" def configurationVersion = "2.2.0" - def ldLibVersion = "1.0.28.a" + def ldLibVersion = "1.0.30.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/ProspectingMapWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ProspectingMapWidget.java index 8bc48bed5a..2c84fd863f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ProspectingMapWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/ProspectingMapWidget.java @@ -260,6 +260,7 @@ public void selectResult(Object item) { public void search(String s, Consumer consumer) { var added = new HashSet(); for (var item : this.items) { + if (Thread.currentThread().isInterrupted()) return; var id = mode.getUniqueID(item); if (!added.contains(id)) { added.add(id); diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockWorldSavedData.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockWorldSavedData.java index f6448dcfda..41a33fee61 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockWorldSavedData.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockWorldSavedData.java @@ -3,6 +3,8 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; +import com.lowdragmc.lowdraglib.Platform; + import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerLevel; @@ -112,6 +114,7 @@ public void removeAsyncLogic(IMultiController controller) { private void searchingTask() { try { + if (Platform.isServerNotSafe()) return; IN_SERVICE.set(true); for (var controller : controllers) { controller.asyncCheckPattern(periodID); @@ -125,7 +128,7 @@ private void searchingTask() { } public static boolean isThreadService() { - return IN_SERVICE.get(); + return IN_SERVICE.get() && !Platform.isServerNotSafe(); } public void releaseExecutorService() { diff --git a/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java b/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java index 2cf95924d5..3adc6d7945 100644 --- a/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java +++ b/src/main/java/com/gregtechceu/gtceu/forge/ForgeCommonEventListener.java @@ -20,6 +20,7 @@ import com.gregtechceu.gtceu.api.item.armor.ArmorComponentItem; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; +import com.gregtechceu.gtceu.api.pattern.MultiblockWorldSavedData; import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.common.capability.EnvironmentalHazardSavedData; import com.gregtechceu.gtceu.common.capability.LocalizedHazardSavedData; @@ -75,6 +76,7 @@ import net.minecraftforge.event.level.BlockEvent; import net.minecraftforge.event.level.ChunkWatchEvent; import net.minecraftforge.event.level.LevelEvent; +import net.minecraftforge.event.server.ServerStoppingEvent; import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.LogicalSide; @@ -249,6 +251,17 @@ public static void levelTick(TickEvent.LevelTickEvent event) { public static void worldUnload(LevelEvent.Unload event) { if (event.getLevel() instanceof ServerLevel serverLevel) { TaskHandler.onWorldUnLoad(serverLevel); + MultiblockWorldSavedData.getOrCreate(serverLevel).releaseExecutorService(); + } + } + + @SubscribeEvent + public static void onServerStopping(ServerStoppingEvent event) { + var levels = event.getServer().getAllLevels(); + for (var level : levels) { + if (!level.isClientSide()) { + MultiblockWorldSavedData.getOrCreate(level).releaseExecutorService(); + } } }