From 0f9ba22aa2bbb387857ce6372c3f1f90eb5248a5 Mon Sep 17 00:00:00 2001 From: Ginger <75683114+gingershaped@users.noreply.github.com> Date: Mon, 13 Jan 2025 09:41:57 -0500 Subject: [PATCH 1/8] Fix calls to getSize() on display link peripheral failing when the peripheral is newly loaded (#7059) --- .../implementation/peripherals/DisplayLinkPeripheral.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/simibubi/create/compat/computercraft/implementation/peripherals/DisplayLinkPeripheral.java b/src/main/java/com/simibubi/create/compat/computercraft/implementation/peripherals/DisplayLinkPeripheral.java index 2d1c9d29b..693a72aa7 100644 --- a/src/main/java/com/simibubi/create/compat/computercraft/implementation/peripherals/DisplayLinkPeripheral.java +++ b/src/main/java/com/simibubi/create/compat/computercraft/implementation/peripherals/DisplayLinkPeripheral.java @@ -36,6 +36,7 @@ public class DisplayLinkPeripheral extends SyncedPeripheral Date: Mon, 13 Jan 2025 08:58:25 -0600 Subject: [PATCH 2/8] Sugar Cane Variants tag (#7263) --- .../.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c | 3 ++- .../data/create/tags/blocks/sugar_cane_variants.json | 5 +++++ src/main/java/com/simibubi/create/AllTags.java | 1 + .../actors/harvester/HarvesterMovementBehaviour.java | 3 ++- .../create/infrastructure/data/CreateRegistrateTags.java | 3 +++ 5 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 src/generated/resources/data/create/tags/blocks/sugar_cane_variants.json diff --git a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c index 5777ab3d8..65c9cefcc 100644 --- a/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c +++ b/src/generated/resources/.cache/2d64935085b86659cb7857bad9701dbf9bab6e4c @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-11T10:29:49.10689745 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] +// 1.20.1 2025-01-04T09:59:54.9600791 Registrate Provider for create [Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), Blockstates, Item models, Lang (en_us/en_ud)] 60bbdf92d2ac9824ea6144955c74043a6005f79d assets/create/blockstates/acacia_window.json 6a67703c2697d81b7dc83e9d72a66f9c9ff08383 assets/create/blockstates/acacia_window_pane.json c3ae87b62e81d8e9476eccd793bb1548d74c66a1 assets/create/blockstates/adjustable_chain_gearshift.json @@ -4185,6 +4185,7 @@ a5874f73c7dc0a3ae12999e6ae8abf45bc7fb9be data/create/tags/blocks/passive_boiler_ 9bc8c13fd80bdbe7f767b91ee1a1042e9aff02b0 data/create/tags/blocks/roots.json 79ed9149ee2ce143114db4ccafda8a2b6a293aac data/create/tags/blocks/safe_nbt.json 79418bd729cef417b322cef9b491e7ae83317d61 data/create/tags/blocks/seats.json +f02fc9781e8f0ae33ed3b98cf4f46ba6927c7ff8 data/create/tags/blocks/sugar_cane_variants.json 5def5088f7fd31b80e6f28c1c4ea146aa9d7d15b data/create/tags/blocks/toolboxes.json 2589b135c0e96ad29076569e144528fe32ea5b39 data/create/tags/blocks/tracks.json 1b6977d9a399cf6ee042e3f8f5e64e4d3cda5489 data/create/tags/blocks/tree_attachments.json diff --git a/src/generated/resources/data/create/tags/blocks/sugar_cane_variants.json b/src/generated/resources/data/create/tags/blocks/sugar_cane_variants.json new file mode 100644 index 000000000..6e3dc8c98 --- /dev/null +++ b/src/generated/resources/data/create/tags/blocks/sugar_cane_variants.json @@ -0,0 +1,5 @@ +{ + "values": [ + "minecraft:sugar_cane" + ] +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllTags.java b/src/main/java/com/simibubi/create/AllTags.java index a48d8602f..49a98d557 100644 --- a/src/main/java/com/simibubi/create/AllTags.java +++ b/src/main/java/com/simibubi/create/AllTags.java @@ -104,6 +104,7 @@ public class AllTags { WINDMILL_SAILS, WRENCH_PICKUP, ROOTS, + SUGAR_CANE_VARIANTS, CORALS, diff --git a/src/main/java/com/simibubi/create/content/contraptions/actors/harvester/HarvesterMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/actors/harvester/HarvesterMovementBehaviour.java index 8680025d7..63de5f379 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/actors/harvester/HarvesterMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/actors/harvester/HarvesterMovementBehaviour.java @@ -4,6 +4,7 @@ import javax.annotation.Nullable; import org.apache.commons.lang3.mutable.MutableBoolean; +import com.simibubi.create.AllTags; import com.simibubi.create.content.contraptions.behaviour.MovementBehaviour; import com.simibubi.create.content.contraptions.behaviour.MovementContext; import com.simibubi.create.content.contraptions.render.ActorVisual; @@ -173,7 +174,7 @@ public class HarvesterMovementBehaviour implements MovementBehaviour { if (block == Blocks.SWEET_BERRY_BUSH) { return state.setValue(BlockStateProperties.AGE_3, Integer.valueOf(1)); } - if (block == Blocks.SUGAR_CANE || block instanceof GrowingPlantBlock) { + if (state.is(AllTags.AllBlockTags.SUGAR_CANE_VARIANTS.tag) || block instanceof GrowingPlantBlock) { if (state.getFluidState() .isEmpty()) return Blocks.AIR.defaultBlockState(); diff --git a/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java b/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java index 157577e50..56a6e75df 100644 --- a/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java +++ b/src/main/java/com/simibubi/create/infrastructure/data/CreateRegistrateTags.java @@ -111,6 +111,9 @@ public class CreateRegistrateTags { prov.tag(AllBlockTags.ROOTS.tag) .add(Blocks.MANGROVE_ROOTS); + prov.tag(AllBlockTags.SUGAR_CANE_VARIANTS.tag) + .add(Blocks.SUGAR_CANE); + prov.tag(AllBlockTags.CORALS.tag) .add(Blocks.DEAD_TUBE_CORAL, Blocks.DEAD_BRAIN_CORAL, Blocks.DEAD_BUBBLE_CORAL, Blocks.DEAD_FIRE_CORAL, Blocks.DEAD_HORN_CORAL, Blocks.TUBE_CORAL, Blocks.BRAIN_CORAL, Blocks.BUBBLE_CORAL, From 67085963d006e2b5c03e31c3ee2a74847da4ec0c Mon Sep 17 00:00:00 2001 From: VoidLeech <57987812+VoidLeech@users.noreply.github.com> Date: Mon, 13 Jan 2025 16:00:03 +0100 Subject: [PATCH 3/8] fix: cactus milling getting disabled when quark is loaded (#7215) --- .../.cache/b256105d8411632b0d585496ea8944a751a08034 | 4 ++-- .../resources/data/create/recipes/milling/cactus.json | 9 --------- .../create/foundation/data/recipe/MillingRecipeGen.java | 3 +-- 3 files changed, 3 insertions(+), 13 deletions(-) diff --git a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 index 7cbe41f31..bc6c8ed80 100644 --- a/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 +++ b/src/generated/resources/.cache/b256105d8411632b0d585496ea8944a751a08034 @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-09T12:24:59.1833995 Create's Processing Recipes +// 1.20.1 2024-12-15T23:26:23.3573034 Create's Processing Recipes 3c94326fb730f68c1e44fe1e2ef09c9db6ffd92b data/create/recipes/compacting/andesite_from_flint.json 8d3d5b31f3601b9f681ff710e0545a483a1494c6 data/create/recipes/compacting/blaze_cake.json 8bd7f4e3a686ab520b2d55594d2018d0e9a50c91 data/create/recipes/compacting/chocolate.json @@ -764,7 +764,7 @@ d480b1b4c48440c6d6cb775321e95be7ea171aa5 data/create/recipes/milling/andesite.js a3b4a9eb3970eea745dff83c2d5fbab403ed481f data/create/recipes/milling/blue_orchid.json 720ff9753bb30e874483fc850c3cbc8bfa973224 data/create/recipes/milling/bone.json e84433fe6ec772c212d20109268fa74ceb8fa3ab data/create/recipes/milling/bone_meal.json -08771e9c43212ed8a378a7f4b2e5147ebe37fe0b data/create/recipes/milling/cactus.json +77b571f6ee4e8775d87077accdce4a23fb6a0c56 data/create/recipes/milling/cactus.json d6073794b0be05fb52faf2d78d0daeb6ce3beab5 data/create/recipes/milling/calcite.json 5b6ccdbc1bf1dcc3fc3fca94ff1fa46c17f46622 data/create/recipes/milling/charcoal.json 6323f36ea7a1a46d0999dfe24e4fa86d677e319d data/create/recipes/milling/clay.json diff --git a/src/generated/resources/data/create/recipes/milling/cactus.json b/src/generated/resources/data/create/recipes/milling/cactus.json index 091fe39bc..7c4cfdf92 100644 --- a/src/generated/resources/data/create/recipes/milling/cactus.json +++ b/src/generated/resources/data/create/recipes/milling/cactus.json @@ -1,14 +1,5 @@ { "type": "create:milling", - "conditions": [ - { - "type": "forge:not", - "value": { - "type": "forge:mod_loaded", - "modid": "quark" - } - } - ], "ingredients": [ { "item": "minecraft:cactus" diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/MillingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/MillingRecipeGen.java index 6b28a22d5..5dd9aa72b 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/MillingRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/MillingRecipeGen.java @@ -62,8 +62,7 @@ public class MillingRecipeGen extends ProcessingRecipeGen { CACTUS = create(() -> Blocks.CACTUS, b -> b.duration(50) .output(Items.GREEN_DYE, 2) - .output(.1f, Items.GREEN_DYE, 1) - .whenModMissing("quark")), + .output(.1f, Items.GREEN_DYE, 1)), SEA_PICKLE = create(() -> Blocks.SEA_PICKLE, b -> b.duration(50) .output(Items.LIME_DYE, 2) From 7a7993deb89e432f8a4cce8a8d5f35f85f57bfed Mon Sep 17 00:00:00 2001 From: GG3Hahn Date: Mon, 13 Jan 2025 16:01:33 +0100 Subject: [PATCH 4/8] Add pressing recipes for coarse and rooted dirt (#7186) --- .../resources/data/create/recipes/pressing/path.json | 6 ++++++ .../create/foundation/data/recipe/PressingRecipeGen.java | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/generated/resources/data/create/recipes/pressing/path.json b/src/generated/resources/data/create/recipes/pressing/path.json index e81480ed2..5faca9542 100644 --- a/src/generated/resources/data/create/recipes/pressing/path.json +++ b/src/generated/resources/data/create/recipes/pressing/path.json @@ -7,6 +7,12 @@ }, { "item": "minecraft:dirt" + }, + { + "item": "minecraft:coarse_dirt" + }, + { + "item": "minecraft:rooted_dirt" } ] ], diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/PressingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/PressingRecipeGen.java index bea708341..cfea98ed8 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/PressingRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/PressingRecipeGen.java @@ -14,7 +14,7 @@ public class PressingRecipeGen extends ProcessingRecipeGen { SUGAR_CANE = create(() -> Items.SUGAR_CANE, b -> b.output(Items.PAPER)), - PATH = create("path", b -> b.require(Ingredient.of(Items.GRASS_BLOCK, Items.DIRT)) + PATH = create("path", b -> b.require(Ingredient.of(Items.GRASS_BLOCK, Items.DIRT, Items.COARSE_DIRT, Items.ROOTED_DIRT)) .output(Items.DIRT_PATH)), IRON = create("iron_ingot", b -> b.require(I.iron()) From 28d30f3c620ee15ac9c97b294b3e61cf91ac5c19 Mon Sep 17 00:00:00 2001 From: James Mitchell Date: Sun, 26 Jan 2025 13:36:17 -1000 Subject: [PATCH 5/8] Update JEI integration and add potion fluids to the ingredient list (#6934) * Update JEI integration and add potion fluids to the ingredient list This also resolves a minor issue where all virtual fluids were considered "flowing". Fixes https://github.com/mezz/JustEnoughItems/issues/3754 * Fixed JEI potion fluids registered without Bottle tag --------- Co-authored-by: goshante --- gradle.properties | 2 +- .../java/com/simibubi/create/AllFluids.java | 5 ++-- .../simibubi/create/compat/jei/CreateJEI.java | 20 ++++++++++++++ .../compat/jei/category/BasinCategory.java | 6 ++--- .../jei/category/CreateRecipeCategory.java | 26 ++++++------------- .../compat/jei/category/CrushingCategory.java | 2 +- .../jei/category/DeployingCategory.java | 2 +- .../jei/category/ItemApplicationCategory.java | 2 +- .../jei/category/ItemDrainCategory.java | 2 +- .../compat/jei/category/MillingCategory.java | 2 +- .../jei/category/PolishingCategory.java | 2 +- .../compat/jei/category/PressingCategory.java | 2 +- .../category/ProcessingViaFanCategory.java | 2 +- .../compat/jei/category/SawingCategory.java | 2 +- .../compat/jei/category/SpoutCategory.java | 2 +- .../SequencedAssemblySubCategory.java | 2 +- .../create/content/fluids/VirtualFluid.java | 24 +++++++++++++++-- .../content/fluids/potion/PotionFluid.java | 22 +++++++++++----- .../fluids/potion/PotionFluidHandler.java | 5 ++-- .../foundation/data/CreateRegistrate.java | 13 +++++----- .../foundation/data/VirtualFluidBuilder.java | 8 +++--- src/main/resources/META-INF/mods.toml | 7 +++++ 22 files changed, 105 insertions(+), 55 deletions(-) diff --git a/gradle.properties b/gradle.properties index 923699fb4..df343accb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -25,7 +25,7 @@ registrate_version = MC1.20-1.3.3 flywheel_minecraft_version = 1.20.1 flywheel_version = 1.0.0-beta-145 jei_minecraft_version = 1.20.1 -jei_version = 15.10.0.39 +jei_version = 15.19.0.85 curios_minecraft_version = 1.20.1 curios_version = 5.3.1 diff --git a/src/main/java/com/simibubi/create/AllFluids.java b/src/main/java/com/simibubi/create/AllFluids.java index 4e1e7f9b7..8595a404b 100644 --- a/src/main/java/com/simibubi/create/AllFluids.java +++ b/src/main/java/com/simibubi/create/AllFluids.java @@ -7,6 +7,8 @@ import java.util.function.Supplier; import javax.annotation.Nullable; +import com.simibubi.create.content.fluids.VirtualFluid; + import org.jetbrains.annotations.NotNull; import org.joml.Vector3f; @@ -14,7 +16,6 @@ import com.mojang.blaze3d.shaders.FogShape; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.AllTags.AllFluidTags; import com.simibubi.create.content.decoration.palettes.AllPaletteStoneTypes; -import com.simibubi.create.content.fluids.VirtualFluid; import com.simibubi.create.content.fluids.potion.PotionFluid; import com.simibubi.create.content.fluids.potion.PotionFluid.PotionFluidType; import com.simibubi.create.foundation.utility.Color; @@ -46,7 +47,7 @@ public class AllFluids { } public static final FluidEntry POTION = - REGISTRATE.virtualFluid("potion", PotionFluidType::new, PotionFluid::new) + REGISTRATE.virtualFluid("potion", PotionFluidType::new, PotionFluid::createSource, PotionFluid::createFlowing) .lang("Potion") .register(); diff --git a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java index 58270c69f..56351d019 100644 --- a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java +++ b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java @@ -78,6 +78,7 @@ import mezz.jei.api.forge.ForgeTypes; import mezz.jei.api.gui.drawable.IDrawable; import mezz.jei.api.helpers.IPlatformFluidHelper; import mezz.jei.api.recipe.category.IRecipeCategory; +import mezz.jei.api.registration.IExtraIngredientRegistration; import mezz.jei.api.registration.IGuiHandlerRegistration; import mezz.jei.api.registration.IRecipeCatalystRegistration; import mezz.jei.api.registration.IRecipeCategoryRegistration; @@ -90,6 +91,7 @@ import net.minecraft.core.RegistryAccess; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.Potion; import net.minecraft.world.item.crafting.AbstractCookingRecipe; import net.minecraft.world.item.crafting.CraftingRecipe; import net.minecraft.world.item.crafting.Recipe; @@ -98,7 +100,9 @@ import net.minecraft.world.item.crafting.SmokingRecipe; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Blocks; import net.minecraftforge.common.crafting.IShapedRecipe; +import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fml.ModList; +import net.minecraftforge.registries.ForgeRegistries; @JeiPlugin @SuppressWarnings("unused") @@ -363,6 +367,22 @@ public class CreateJEI implements IModPlugin { registration.registerSubtypeInterpreter(ForgeTypes.FLUID_STACK, potionFluid.getFlowing(), interpreter); } + @Override + public void registerExtraIngredients(IExtraIngredientRegistration registration) { + Collection potions = ForgeRegistries.POTIONS.getValues(); + Collection potionFluids = new ArrayList<>(potions.size() * 3); + for (Potion potion : potions) { + // @goshante: Ingame potion fluids always have Bottle tag that specifies + // to what bottle type this potion belongs + // Potion fluid without this tag wouldn't be recognized by other mods + for (PotionFluid.BottleType bottleType : PotionFluid.BottleType.values()) { + FluidStack potionFluid = PotionFluid.of(1000, potion, bottleType); + potionFluids.add(potionFluid); + } + } + registration.addExtraIngredients(ForgeTypes.FLUID_STACK, potionFluids); + } + @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public void registerGuiHandlers(IGuiHandlerRegistration registration) { diff --git a/src/main/java/com/simibubi/create/compat/jei/category/BasinCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/BasinCategory.java index 64b72748a..c07d4cec3 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/BasinCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/BasinCategory.java @@ -67,7 +67,7 @@ public class BasinCategory extends CreateRecipeCategory { .addSlot(RecipeIngredientRole.INPUT, 17 + xOffset + (i % 3) * 19, 51 - (i / 3) * 19) .setBackground(getRenderedSlot(), -1, -1) .addIngredients(ForgeTypes.FLUID_STACK, withImprovedVisibility(fluidIngredient.getMatchingFluidStacks())) - .addTooltipCallback(addFluidTooltip(fluidIngredient.getRequiredAmount())); + .addRichTooltipCallback(addFluidTooltip(fluidIngredient.getRequiredAmount())); i++; } @@ -82,7 +82,7 @@ public class BasinCategory extends CreateRecipeCategory { .addSlot(RecipeIngredientRole.OUTPUT, xPosition, yPosition) .setBackground(getRenderedSlot(result), -1, -1) .addItemStack(result.getStack()) - .addTooltipCallback(addStochasticTooltip(result)); + .addRichTooltipCallback(addStochasticTooltip(result)); i++; } @@ -94,7 +94,7 @@ public class BasinCategory extends CreateRecipeCategory { .addSlot(RecipeIngredientRole.OUTPUT, xPosition, yPosition) .setBackground(getRenderedSlot(), -1, -1) .addIngredient(ForgeTypes.FLUID_STACK, withImprovedVisibility(fluidResult)) - .addTooltipCallback(addFluidTooltip(fluidResult.getAmount())); + .addRichTooltipCallback(addFluidTooltip(fluidResult.getAmount())); i++; } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/CreateRecipeCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/CreateRecipeCategory.java index b672341d1..6517830e1 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/CreateRecipeCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/CreateRecipeCategory.java @@ -8,6 +8,8 @@ import java.util.stream.Collectors; import javax.annotation.ParametersAreNonnullByDefault; +import mezz.jei.api.gui.ingredient.IRecipeSlotRichTooltipCallback; + import org.jetbrains.annotations.NotNull; import com.simibubi.create.AllFluids; @@ -108,11 +110,11 @@ public abstract class CreateRecipeCategory> implements IReci return recipe.getResultItem(level.registryAccess()); } - public static IRecipeSlotTooltipCallback addStochasticTooltip(ProcessingOutput output) { + public static IRecipeSlotRichTooltipCallback addStochasticTooltip(ProcessingOutput output) { return (view, tooltip) -> { float chance = output.getChance(); if (chance != 1) - tooltip.add(1, Lang.translateDirect("recipe.processing.chance", chance < 0.01 ? "<1" : (int) (chance * 100)) + tooltip.add(Lang.translateDirect("recipe.processing.chance", chance < 0.01 ? "<1" : (int) (chance * 100)) .withStyle(ChatFormatting.GOLD)); }; } @@ -130,11 +132,11 @@ public abstract class CreateRecipeCategory> implements IReci return display; } - public static IRecipeSlotTooltipCallback addFluidTooltip() { + public static IRecipeSlotRichTooltipCallback addFluidTooltip() { return addFluidTooltip(-1); } - public static IRecipeSlotTooltipCallback addFluidTooltip(int mbAmount) { + public static IRecipeSlotRichTooltipCallback addFluidTooltip(int mbAmount) { return (view, tooltip) -> { Optional displayed = view.getDisplayedIngredient(ForgeTypes.FLUID_STACK); if (displayed.isEmpty()) @@ -143,26 +145,14 @@ public abstract class CreateRecipeCategory> implements IReci FluidStack fluidStack = displayed.get(); if (fluidStack.getFluid().isSame(AllFluids.POTION.get())) { - Component name = fluidStack.getDisplayName(); - if (tooltip.isEmpty()) - tooltip.add(0, name); - else - tooltip.set(0, name); - ArrayList potionTooltip = new ArrayList<>(); PotionFluidHandler.addPotionTooltip(fluidStack, potionTooltip, 1); - tooltip.addAll(1, potionTooltip.stream().toList()); + tooltip.addAll(potionTooltip.stream().toList()); } int amount = mbAmount == -1 ? fluidStack.getAmount() : mbAmount; Component text = Components.literal(String.valueOf(amount)).append(Lang.translateDirect("generic.unit.millibuckets")).withStyle(ChatFormatting.GOLD); - if (tooltip.isEmpty()) - tooltip.add(0, text); - else { - List siblings = tooltip.get(0).getSiblings(); - siblings.add(Components.literal(" ")); - siblings.add(text); - } + tooltip.add(text); }; } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/CrushingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/CrushingCategory.java index ec3cc2f70..e3b8279d8 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/CrushingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/CrushingCategory.java @@ -41,7 +41,7 @@ public class CrushingCategory extends CreateRecipeCategory { .addSlot(RecipeIngredientRole.OUTPUT, 132, 8) .setBackground(getRenderedSlot(), -1, -1) .addIngredient(ForgeTypes.FLUID_STACK, withImprovedVisibility(recipe.getResultingFluid())) - .addTooltipCallback(addFluidTooltip(recipe.getResultingFluid().getAmount())); + .addRichTooltipCallback(addFluidTooltip(recipe.getResultingFluid().getAmount())); builder .addSlot(RecipeIngredientRole.OUTPUT, 132, 27) .setBackground(getRenderedSlot(), -1, -1) diff --git a/src/main/java/com/simibubi/create/compat/jei/category/MillingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/MillingCategory.java index be2f25059..0a7b4d73f 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/MillingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/MillingCategory.java @@ -42,7 +42,7 @@ public class MillingCategory extends CreateRecipeCategory { builder.addSlot(RecipeIngredientRole.OUTPUT, 131 + 19 * i, 50) .setBackground(getRenderedSlot(output), -1, -1) .addItemStack(output.getStack()) - .addTooltipCallback(addStochasticTooltip(output)); + .addRichTooltipCallback(addStochasticTooltip(output)); i++; } } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/ProcessingViaFanCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/ProcessingViaFanCategory.java index acf4604cf..a116a29e0 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/ProcessingViaFanCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/ProcessingViaFanCategory.java @@ -117,7 +117,7 @@ public abstract class ProcessingViaFanCategory> extends Crea .addSlot(RecipeIngredientRole.OUTPUT, 141 + xOffset, 48 + yOffset) .setBackground(getRenderedSlot(output), -1, -1) .addItemStack(output.getStack()) - .addTooltipCallback(addStochasticTooltip(output)); + .addRichTooltipCallback(addStochasticTooltip(output)); i++; } } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/SawingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/SawingCategory.java index 8238a49d9..63b48c62d 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/SawingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/SawingCategory.java @@ -40,7 +40,7 @@ public class SawingCategory extends CreateRecipeCategory { .addSlot(RecipeIngredientRole.OUTPUT, 118 + xOffset, 48 + yOffset) .setBackground(getRenderedSlot(output), -1, -1) .addItemStack(output.getStack()) - .addTooltipCallback(addStochasticTooltip(output)); + .addRichTooltipCallback(addStochasticTooltip(output)); i++; } } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/SpoutCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/SpoutCategory.java index cd810c034..72bca8604 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/SpoutCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/SpoutCategory.java @@ -112,7 +112,7 @@ public class SpoutCategory extends CreateRecipeCategory { .addSlot(RecipeIngredientRole.INPUT, 27, 32) .setBackground(getRenderedSlot(), -1, -1) .addIngredients(ForgeTypes.FLUID_STACK, withImprovedVisibility(recipe.getRequiredFluid().getMatchingFluidStacks())) - .addTooltipCallback(addFluidTooltip(recipe.getRequiredFluid().getRequiredAmount())); + .addRichTooltipCallback(addFluidTooltip(recipe.getRequiredFluid().getRequiredAmount())); builder .addSlot(RecipeIngredientRole.OUTPUT, 132, 51) .setBackground(getRenderedSlot(), -1, -1) diff --git a/src/main/java/com/simibubi/create/compat/jei/category/sequencedAssembly/SequencedAssemblySubCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/sequencedAssembly/SequencedAssemblySubCategory.java index 7c552a3f6..2976ba5e8 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/sequencedAssembly/SequencedAssemblySubCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/sequencedAssembly/SequencedAssemblySubCategory.java @@ -76,7 +76,7 @@ public abstract class SequencedAssemblySubCategory { .addSlot(RecipeIngredientRole.INPUT, x + 4, 15) .setBackground(CreateRecipeCategory.getRenderedSlot(), -1, -1) .addIngredients(ForgeTypes.FLUID_STACK, CreateRecipeCategory.withImprovedVisibility(fluidIngredient.getMatchingFluidStacks())) - .addTooltipCallback(CreateRecipeCategory.addFluidTooltip(fluidIngredient.getRequiredAmount())); + .addRichTooltipCallback(CreateRecipeCategory.addFluidTooltip(fluidIngredient.getRequiredAmount())); } @Override diff --git a/src/main/java/com/simibubi/create/content/fluids/VirtualFluid.java b/src/main/java/com/simibubi/create/content/fluids/VirtualFluid.java index d7c086f11..af4c358f1 100644 --- a/src/main/java/com/simibubi/create/content/fluids/VirtualFluid.java +++ b/src/main/java/com/simibubi/create/content/fluids/VirtualFluid.java @@ -1,5 +1,7 @@ package com.simibubi.create.content.fluids; +import com.simibubi.create.content.fluids.potion.PotionFluid; + import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; import net.minecraft.world.level.block.Blocks; @@ -10,17 +12,35 @@ import net.minecraftforge.fluids.ForgeFlowingFluid; public class VirtualFluid extends ForgeFlowingFluid { - public VirtualFluid(Properties properties) { + public static VirtualFluid createSource(Properties properties) { + return new VirtualFluid(properties, true); + } + + public static VirtualFluid createFlowing(Properties properties) { + return new VirtualFluid(properties, false); + } + + + private final boolean source; + + public VirtualFluid(Properties properties, boolean source) { super(properties); + this.source = source; } @Override public Fluid getSource() { + if (source) { + return this; + } return super.getSource(); } @Override public Fluid getFlowing() { + if (source) { + return super.getFlowing(); + } return this; } @@ -36,7 +56,7 @@ public class VirtualFluid extends ForgeFlowingFluid { @Override public boolean isSource(FluidState p_207193_1_) { - return false; + return source; } @Override diff --git a/src/main/java/com/simibubi/create/content/fluids/potion/PotionFluid.java b/src/main/java/com/simibubi/create/content/fluids/potion/PotionFluid.java index fda2b5ea3..3bc1b75be 100644 --- a/src/main/java/com/simibubi/create/content/fluids/potion/PotionFluid.java +++ b/src/main/java/com/simibubi/create/content/fluids/potion/PotionFluid.java @@ -24,19 +24,29 @@ import net.minecraftforge.fluids.FluidStack; public class PotionFluid extends VirtualFluid { - public PotionFluid(Properties properties) { - super(properties); + public static PotionFluid createSource(Properties properties) { + return new PotionFluid(properties, true); } - public static FluidStack of(int amount, Potion potion) { - FluidStack fluidStack = new FluidStack(AllFluids.POTION.get() - .getSource(), amount); + public static PotionFluid createFlowing(Properties properties) { + return new PotionFluid(properties, false); + } + + public PotionFluid(Properties properties, boolean source) { + super(properties, source); + } + + public static FluidStack of(int amount, Potion potion, BottleType bottleType) { + + FluidStack fluidStack; + fluidStack = new FluidStack(AllFluids.POTION.get().getSource(), amount); addPotionToFluidStack(fluidStack, potion); + NBTHelper.writeEnum(fluidStack.getOrCreateTag(), "Bottle", bottleType); return fluidStack; } public static FluidStack withEffects(int amount, Potion potion, List customEffects) { - FluidStack fluidStack = of(amount, potion); + FluidStack fluidStack = of(amount, potion, BottleType.REGULAR); appendEffects(fluidStack, customEffects); return fluidStack; } diff --git a/src/main/java/com/simibubi/create/content/fluids/potion/PotionFluidHandler.java b/src/main/java/com/simibubi/create/content/fluids/potion/PotionFluidHandler.java index 19fd4411c..2c5c34b5a 100644 --- a/src/main/java/com/simibubi/create/content/fluids/potion/PotionFluidHandler.java +++ b/src/main/java/com/simibubi/create/content/fluids/potion/PotionFluidHandler.java @@ -42,7 +42,7 @@ public class PotionFluidHandler { return stack.getItem() instanceof PotionItem && !(stack.getCraftingRemainingItem() .getItem() instanceof BucketItem); } - + public static Pair emptyPotion(ItemStack stack, boolean simulate) { FluidStack fluid = getFluidFromPotionItem(stack); if (!simulate) @@ -69,8 +69,7 @@ public class PotionFluidHandler { public static FluidStack getFluidFromPotion(Potion potion, BottleType bottleType, int amount) { if (potion == Potions.WATER && bottleType == BottleType.REGULAR) return new FluidStack(Fluids.WATER, amount); - FluidStack fluid = PotionFluid.of(amount, potion); - NBTHelper.writeEnum(fluid.getOrCreateTag(), "Bottle", bottleType); + FluidStack fluid = PotionFluid.of(amount, potion, bottleType); return fluid; } diff --git a/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java b/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java index 1eda3db41..349d60918 100644 --- a/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java +++ b/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java @@ -172,29 +172,30 @@ public class CreateRegistrate extends AbstractRegistrate { /* Fluids */ public FluidBuilder virtualFluid(String name, - FluidBuilder.FluidTypeFactory typeFactory, NonNullFunction factory) { + FluidBuilder.FluidTypeFactory typeFactory, NonNullFunction sourceFactory, + NonNullFunction flowingFactory) { return entry(name, c -> new VirtualFluidBuilder<>(self(), self(), name, c, new ResourceLocation(getModid(), "fluid/" + name + "_still"), - new ResourceLocation(getModid(), "fluid/" + name + "_flow"), typeFactory, factory)); + new ResourceLocation(getModid(), "fluid/" + name + "_flow"), typeFactory, sourceFactory, flowingFactory)); } public FluidBuilder virtualFluid(String name, ResourceLocation still, ResourceLocation flow, FluidBuilder.FluidTypeFactory typeFactory, - NonNullFunction factory) { - return entry(name, c -> new VirtualFluidBuilder<>(self(), self(), name, c, still, flow, typeFactory, factory)); + NonNullFunction sourceFactory, NonNullFunction flowingFactory) { + return entry(name, c -> new VirtualFluidBuilder<>(self(), self(), name, c, still, flow, typeFactory, sourceFactory, flowingFactory)); } public FluidBuilder virtualFluid(String name) { return entry(name, c -> new VirtualFluidBuilder(self(), self(), name, c, new ResourceLocation(getModid(), "fluid/" + name + "_still"), new ResourceLocation(getModid(), "fluid/" + name + "_flow"), - CreateRegistrate::defaultFluidType, VirtualFluid::new)); + CreateRegistrate::defaultFluidType, VirtualFluid::createSource, VirtualFluid::createFlowing)); } public FluidBuilder virtualFluid(String name, ResourceLocation still, ResourceLocation flow) { return entry(name, c -> new VirtualFluidBuilder<>(self(), self(), name, c, still, flow, - CreateRegistrate::defaultFluidType, VirtualFluid::new)); + CreateRegistrate::defaultFluidType, VirtualFluid::createSource, VirtualFluid::createFlowing)); } public FluidBuilder standardFluid(String name) { diff --git a/src/main/java/com/simibubi/create/foundation/data/VirtualFluidBuilder.java b/src/main/java/com/simibubi/create/foundation/data/VirtualFluidBuilder.java index 9b7250346..b384f59c6 100644 --- a/src/main/java/com/simibubi/create/foundation/data/VirtualFluidBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/data/VirtualFluidBuilder.java @@ -17,9 +17,11 @@ public class VirtualFluidBuilder extends FluidBu public VirtualFluidBuilder(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, ResourceLocation stillTexture, ResourceLocation flowingTexture, FluidBuilder.FluidTypeFactory typeFactory, - NonNullFunction factory) { - super(owner, parent, name, callback, stillTexture, flowingTexture, typeFactory, factory); - source(factory); + NonNullFunction sourceFactory, + NonNullFunction flowingFactory + ) { + super(owner, parent, name, callback, stillTexture, flowingTexture, typeFactory, flowingFactory); + source(sourceFactory); } @Override diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index b84c313c9..381b32a3d 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -36,3 +36,10 @@ Technology that empowers the player.''' versionRange="[1.0.0-alpha,2.0)" ordering="AFTER" side="CLIENT" + +[[dependencies.create]] + modId="jei" + mandatory=false + versionRange="[15.19.0,)" + ordering="NONE" + side="CLIENT" From 4ba5e984a901eeb3391355c6cd0574b827d57d3a Mon Sep 17 00:00:00 2001 From: MoePus <547007249@qq.com> Date: Mon, 27 Jan 2025 08:44:40 +0900 Subject: [PATCH 6/8] Fix rare spout crash and offset rendering (#7025) --- .../create/content/fluids/spout/SpoutBlockEntity.java | 2 ++ .../simibubi/create/content/fluids/spout/SpoutRenderer.java | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/fluids/spout/SpoutBlockEntity.java b/src/main/java/com/simibubi/create/content/fluids/spout/SpoutBlockEntity.java index 1712fcccb..7ac5e382b 100644 --- a/src/main/java/com/simibubi/create/content/fluids/spout/SpoutBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/fluids/spout/SpoutBlockEntity.java @@ -232,6 +232,8 @@ public class SpoutBlockEntity extends SmartBlockEntity implements IHaveGoggleInf protected void spawnProcessingParticles(FluidStack fluid) { if (isVirtual()) return; + if (fluid.isEmpty()) + return; Vec3 vec = VecHelper.getCenterOf(worldPosition); vec = vec.subtract(0, 8 / 16f, 0); ParticleOptions particle = FluidFX.getFluidParticle(fluid); diff --git a/src/main/java/com/simibubi/create/content/fluids/spout/SpoutRenderer.java b/src/main/java/com/simibubi/create/content/fluids/spout/SpoutRenderer.java index c4502024c..5d5315544 100644 --- a/src/main/java/com/simibubi/create/content/fluids/spout/SpoutRenderer.java +++ b/src/main/java/com/simibubi/create/content/fluids/spout/SpoutRenderer.java @@ -65,9 +65,9 @@ public class SpoutRenderer extends SafeBlockEntityRenderer { processingProgress = Mth.clamp(processingProgress, 0, 1); float radius = 0; - if (processingTicks != -1) { + if (!fluidStack.isEmpty() && processingTicks != -1) { radius = (float) (Math.pow(((2 * processingProgress) - 1), 2) - 1); - AABB bb = new AABB(0.5, .5, 0.5, 0.5, -1.2, 0.5).inflate(radius / 32f); + AABB bb = new AABB(0.5, 0.0, 0.5, 0.5, -1.2, 0.5).inflate(radius / 32f); FluidRenderer.renderFluidBox(fluidStack, (float) bb.minX, (float) bb.minY, (float) bb.minZ, (float) bb.maxX, (float) bb.maxY, (float) bb.maxZ, buffer, ms, light, true); } From e2b65fd53c430c03ad07959a651311b6a867b0d2 Mon Sep 17 00:00:00 2001 From: justliliandev <36055315+justliliandev@users.noreply.github.com> Date: Mon, 27 Jan 2025 00:46:33 +0100 Subject: [PATCH 7/8] Add api to add custom conductors to trains (#7030) --- .../java/com/simibubi/create/AllBlocks.java | 7 ++- .../train/TrainConductorHandler.java | 54 +++++++++++++++++++ ...edTrainConductorInteractionBehaviour.java} | 28 ++++++++-- .../trains/entity/CarriageContraption.java | 27 +++++----- .../entity/CarriageContraptionEntity.java | 4 +- 5 files changed, 97 insertions(+), 23 deletions(-) create mode 100644 src/main/java/com/simibubi/create/api/contraption/train/TrainConductorHandler.java rename src/main/java/com/simibubi/create/content/processing/burner/{BlazeBurnerInteractionBehaviour.java => BlockBasedTrainConductorInteractionBehaviour.java} (75%) diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index afe741ca1..bc794ecc3 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -3,6 +3,9 @@ package com.simibubi.create; import static com.simibubi.create.AllInteractionBehaviours.interactionBehaviour; import static com.simibubi.create.AllMovementBehaviours.movementBehaviour; import static com.simibubi.create.Create.REGISTRATE; + +import com.simibubi.create.api.contraption.train.TrainConductorHandler; + import static com.simibubi.create.content.redstone.displayLink.AllDisplayBehaviours.assignDataBehaviour; import static com.simibubi.create.foundation.data.BlockStateGen.axisBlock; import static com.simibubi.create.foundation.data.BlockStateGen.simpleCubeAll; @@ -185,7 +188,7 @@ import com.simibubi.create.content.processing.basin.BasinGenerator; import com.simibubi.create.content.processing.basin.BasinMovementBehaviour; import com.simibubi.create.content.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.processing.burner.BlazeBurnerBlockItem; -import com.simibubi.create.content.processing.burner.BlazeBurnerInteractionBehaviour; +import com.simibubi.create.content.processing.burner.BlockBasedTrainConductorInteractionBehaviour; import com.simibubi.create.content.processing.burner.BlazeBurnerMovementBehaviour; import com.simibubi.create.content.processing.burner.LitBlazeBurnerBlock; import com.simibubi.create.content.redstone.RoseQuartzLampBlock; @@ -708,7 +711,7 @@ public class AllBlocks { .loot((lt, block) -> lt.add(block, BlazeBurnerBlock.buildLootTable())) .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.partialBaseModel(c, p))) .onRegister(movementBehaviour(new BlazeBurnerMovementBehaviour())) - .onRegister(interactionBehaviour(new BlazeBurnerInteractionBehaviour())) + .onRegister(block -> TrainConductorHandler.registerBlazeBurner()) .item(BlazeBurnerBlockItem::withBlaze) .model(AssetLookup.customBlockItemModel("blaze_burner", "block_with_blaze")) .build() diff --git a/src/main/java/com/simibubi/create/api/contraption/train/TrainConductorHandler.java b/src/main/java/com/simibubi/create/api/contraption/train/TrainConductorHandler.java new file mode 100644 index 000000000..05cd1e09e --- /dev/null +++ b/src/main/java/com/simibubi/create/api/contraption/train/TrainConductorHandler.java @@ -0,0 +1,54 @@ +package com.simibubi.create.api.contraption.train; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllInteractionBehaviours; +import com.simibubi.create.content.processing.burner.BlazeBurnerBlock; + +import com.simibubi.create.content.processing.burner.BlockBasedTrainConductorInteractionBehaviour; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.state.BlockState; + + +import org.jetbrains.annotations.ApiStatus; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Predicate; + + +/** + * All required methods to make your block a train conductor similar to the blaze burner + */ +public interface TrainConductorHandler { + + @ApiStatus.Internal + List CONDUCTOR_HANDLERS = new ArrayList<>(); + + + + boolean isValidConductor(BlockState state); + + private static void registerHandler(TrainConductorHandler handler) { + CONDUCTOR_HANDLERS.add(handler); + } + + static void registerConductor(ResourceLocation blockRl, Predicate isValidConductor, UpdateScheduleCallback updateScheduleCallback) { + AllInteractionBehaviours.registerBehaviour(blockRl, new BlockBasedTrainConductorInteractionBehaviour(isValidConductor, updateScheduleCallback)); + registerHandler(isValidConductor::test); + } + + @ApiStatus.Internal + static void registerBlazeBurner() { + registerConductor(AllBlocks.BLAZE_BURNER.getId(), blockState -> AllBlocks.BLAZE_BURNER.has(blockState) + && blockState.getValue(BlazeBurnerBlock.HEAT_LEVEL) != BlazeBurnerBlock.HeatLevel.NONE, UpdateScheduleCallback.EMPTY); + } + + interface UpdateScheduleCallback { + + UpdateScheduleCallback EMPTY = (hasSchedule, blockState, blockStateSetter) -> {}; + + void update(boolean hasSchedule, BlockState currentBlockState, Consumer blockStateSetter); + } +} diff --git a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerInteractionBehaviour.java b/src/main/java/com/simibubi/create/content/processing/burner/BlockBasedTrainConductorInteractionBehaviour.java similarity index 75% rename from src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerInteractionBehaviour.java rename to src/main/java/com/simibubi/create/content/processing/burner/BlockBasedTrainConductorInteractionBehaviour.java index 0473f856d..4bde1367f 100644 --- a/src/main/java/com/simibubi/create/content/processing/burner/BlazeBurnerInteractionBehaviour.java +++ b/src/main/java/com/simibubi/create/content/processing/burner/BlockBasedTrainConductorInteractionBehaviour.java @@ -2,10 +2,10 @@ package com.simibubi.create.content.processing.burner; import com.simibubi.create.AllItems; import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.api.contraption.train.TrainConductorHandler; import com.simibubi.create.content.contraptions.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.Contraption; import com.simibubi.create.content.contraptions.behaviour.MovingInteractionBehaviour; -import com.simibubi.create.content.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.content.trains.entity.CarriageContraption; import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; import com.simibubi.create.content.trains.entity.Train; @@ -21,9 +21,21 @@ import net.minecraft.core.Direction; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate.StructureBlockInfo; -public class BlazeBurnerInteractionBehaviour extends MovingInteractionBehaviour { +import java.util.function.Predicate; + +public class BlockBasedTrainConductorInteractionBehaviour extends MovingInteractionBehaviour { + + private final Predicate isValidConductor; + private final TrainConductorHandler.UpdateScheduleCallback callback; + + public BlockBasedTrainConductorInteractionBehaviour(Predicate isValidConductor, TrainConductorHandler.UpdateScheduleCallback callback) { + this.isValidConductor = isValidConductor; + this.callback = callback; + } @Override public boolean handlePlayerInteraction(Player player, InteractionHand activeHand, BlockPos localPos, @@ -40,8 +52,7 @@ public class BlazeBurnerInteractionBehaviour extends MovingInteractionBehaviour StructureBlockInfo info = carriageContraption.getBlocks() .get(localPos); - if (info == null || !info.state().hasProperty(BlazeBurnerBlock.HEAT_LEVEL) - || info.state().getValue(BlazeBurnerBlock.HEAT_LEVEL) == HeatLevel.NONE) + if (info == null || !isValidConductor.test(info.state())) return false; Direction assemblyDirection = carriageContraption.getAssemblyDirection(); @@ -74,6 +85,7 @@ public class BlazeBurnerInteractionBehaviour extends MovingInteractionBehaviour train.runtime.isAutoSchedule ? "schedule.auto_removed_from_train" : "schedule.removed_from_train"), true); player.setItemInHand(activeHand, train.runtime.returnSchedule()); + callback.update(false, info.state(), newBlockState -> setBlockState(localPos, contraptionEntity, newBlockState)); return true; } @@ -89,7 +101,7 @@ public class BlazeBurnerInteractionBehaviour extends MovingInteractionBehaviour player.displayClientMessage(Lang.translateDirect("schedule.no_stops"), true); return true; } - + callback.update(true, info.state(), newBlockState -> setBlockState(localPos, contraptionEntity, newBlockState)); train.runtime.setSchedule(schedule, false); AllAdvancements.CONDUCTOR.awardTo(player); AllSoundEvents.CONFIRM.playOnServer(player.level(), player.blockPosition(), 1, 1); @@ -105,4 +117,10 @@ public class BlazeBurnerInteractionBehaviour extends MovingInteractionBehaviour return true; } + private void setBlockState(BlockPos localPos, AbstractContraptionEntity contraption, BlockState newState) { + StructureTemplate.StructureBlockInfo info = contraption.getContraption().getBlocks().get(localPos); + if (info != null) { + setContraptionBlockData(contraption, localPos, new StructureTemplate.StructureBlockInfo(info.pos(), newState, info.nbt())); + } + } } diff --git a/src/main/java/com/simibubi/create/content/trains/entity/CarriageContraption.java b/src/main/java/com/simibubi/create/content/trains/entity/CarriageContraption.java index 5a6f1b47b..ab566a6f8 100644 --- a/src/main/java/com/simibubi/create/content/trains/entity/CarriageContraption.java +++ b/src/main/java/com/simibubi/create/content/trains/entity/CarriageContraption.java @@ -7,6 +7,8 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import com.simibubi.create.api.contraption.train.TrainConductorHandler; + import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.AllBlocks; @@ -17,8 +19,6 @@ import com.simibubi.create.content.contraptions.ContraptionType; import com.simibubi.create.content.contraptions.MountedStorageManager; import com.simibubi.create.content.contraptions.actors.trainControls.ControlsBlock; import com.simibubi.create.content.contraptions.minecart.TrainCargoManager; -import com.simibubi.create.content.processing.burner.BlazeBurnerBlock; -import com.simibubi.create.content.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.content.trains.bogey.AbstractBogeyBlock; import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.Iterate; @@ -51,7 +51,7 @@ public class CarriageContraption extends Contraption { private boolean forwardControls; private boolean backwardControls; - public Couple blazeBurnerConductors; + public Couple blockConductors; public Map> conductorSeats; public ArrivalSoundQueue soundQueue; @@ -61,7 +61,7 @@ public class CarriageContraption extends Contraption { private int bogeys; private boolean sidewaysControls; private BlockPos secondBogeyPos; - private List assembledBlazeBurners; + private List assembledBlockConductors; // render public int portalCutoffMin; @@ -72,8 +72,8 @@ public class CarriageContraption extends Contraption { public CarriageContraption() { conductorSeats = new HashMap<>(); - assembledBlazeBurners = new ArrayList<>(); - blazeBurnerConductors = Couple.create(false, false); + assembledBlockConductors = new ArrayList<>(); + blockConductors = Couple.create(false, false); soundQueue = new ArrivalSoundQueue(); portalCutoffMin = Integer.MIN_VALUE; portalCutoffMax = Integer.MAX_VALUE; @@ -103,10 +103,10 @@ public class CarriageContraption extends Contraption { if (sidewaysControls) throw new AssemblyException(Lang.translateDirect("train_assembly.sideways_controls")); - for (BlockPos blazePos : assembledBlazeBurners) + for (BlockPos blazePos : assembledBlockConductors) for (Direction direction : Iterate.directionsInAxis(assemblyDirection.getAxis())) if (inControl(blazePos, direction)) - blazeBurnerConductors.set(direction != assemblyDirection, true); + blockConductors.set(direction != assemblyDirection, true); for (BlockPos seatPos : getSeats()) for (Direction direction : Iterate.directionsInAxis(assemblyDirection.getAxis())) if (inControl(seatPos, direction)) @@ -166,9 +166,8 @@ public class CarriageContraption extends Contraption { captureBE ? world.getBlockEntity(pos) : null); } - if (AllBlocks.BLAZE_BURNER.has(blockState) - && blockState.getValue(BlazeBurnerBlock.HEAT_LEVEL) != HeatLevel.NONE) - assembledBlazeBurners.add(toLocalPos(pos)); + if (TrainConductorHandler.CONDUCTOR_HANDLERS.stream().anyMatch(handler -> handler.isValidConductor(blockState))) + assembledBlockConductors.add(toLocalPos(pos)); if (AllBlocks.TRAIN_CONTROLS.has(blockState)) { Direction facing = blockState.getValue(ControlsBlock.FACING); @@ -192,8 +191,8 @@ public class CarriageContraption extends Contraption { NBTHelper.writeEnum(tag, "AssemblyDirection", getAssemblyDirection()); tag.putBoolean("FrontControls", forwardControls); tag.putBoolean("BackControls", backwardControls); - tag.putBoolean("FrontBlazeConductor", blazeBurnerConductors.getFirst()); - tag.putBoolean("BackBlazeConductor", blazeBurnerConductors.getSecond()); + tag.putBoolean("FrontBlazeConductor", blockConductors.getFirst()); + tag.putBoolean("BackBlazeConductor", blockConductors.getSecond()); ListTag list = NBTHelper.writeCompoundList(conductorSeats.entrySet(), e -> { CompoundTag compoundTag = new CompoundTag(); compoundTag.put("Pos", NbtUtils.writeBlockPos(e.getKey())); @@ -213,7 +212,7 @@ public class CarriageContraption extends Contraption { assemblyDirection = NBTHelper.readEnum(nbt, "AssemblyDirection", Direction.class); forwardControls = nbt.getBoolean("FrontControls"); backwardControls = nbt.getBoolean("BackControls"); - blazeBurnerConductors = + blockConductors = Couple.create(nbt.getBoolean("FrontBlazeConductor"), nbt.getBoolean("BackBlazeConductor")); conductorSeats.clear(); NBTHelper.iterateCompoundList(nbt.getList("ConductorSeats", Tag.TAG_COMPOUND), diff --git a/src/main/java/com/simibubi/create/content/trains/entity/CarriageContraptionEntity.java b/src/main/java/com/simibubi/create/content/trains/entity/CarriageContraptionEntity.java index c7c717a44..0c5d75e25 100644 --- a/src/main/java/com/simibubi/create/content/trains/entity/CarriageContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/trains/entity/CarriageContraptionEntity.java @@ -492,8 +492,8 @@ public class CarriageContraptionEntity extends OrientedContraptionEntity { if (!(contraption instanceof CarriageContraption cc)) return sides; - sides.setFirst(cc.blazeBurnerConductors.getFirst()); - sides.setSecond(cc.blazeBurnerConductors.getSecond()); + sides.setFirst(cc.blockConductors.getFirst()); + sides.setSecond(cc.blockConductors.getSecond()); for (Entity entity : getPassengers()) { if (entity instanceof Player) From 2cf08a1231c28bae267688c3a666530f7a0ae4bb Mon Sep 17 00:00:00 2001 From: Cody <90773155+jetpacker06@users.noreply.github.com> Date: Mon, 27 Jan 2025 09:25:06 -0600 Subject: [PATCH 8/8] Fix deploying food missing particles and not returning the correct items (#7288) * fix particle when deploying last food in stack * Bowl foods deployer fix --- .../create/content/kinetics/deployer/DeployerHandler.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerHandler.java b/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerHandler.java index 0a4b6cd16..8d2cdac14 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerHandler.java @@ -184,8 +184,9 @@ public class DeployerHandler { if (stack.isEdible()) { FoodProperties foodProperties = item.getFoodProperties(stack, player); if (playerEntity.canEat(foodProperties.canAlwaysEat())) { - playerEntity.eat(world, stack); - player.spawnedItemEffects = stack.copy(); + ItemStack copy = stack.copy(); + player.setItemInHand(hand, stack.finishUsingItem(world, playerEntity)); + player.spawnedItemEffects = copy; success = true; } }