From e9a17eb2f8b22cfca8d6140f049f00db3d9114a2 Mon Sep 17 00:00:00 2001 From: attackeight Date: Tue, 7 May 2024 20:25:30 -0400 Subject: [PATCH 01/28] Guard against chunk protections --- build.gradle | 4 ++++ .../simibubi/create/content/equipment/wrench/IWrenchable.java | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index a203b1be0..99a6f1965 100644 --- a/build.gradle +++ b/build.gradle @@ -206,6 +206,10 @@ dependencies { // runtimeOnly fg.deobf("maven.modrinth:spark:1.10.38-forge") //runtimeOnly fg.deobf("curse.maven:forbidden-arcanus-309858:4729924") //runtimeOnly fg.deobf("curse.maven:valhelsia-core-416935:3886212") + // implementation fg.deobf("curse.maven:ftb-chunks-forge-314906:4494633") + // implementation fg.deobf("curse.maven:architectury-api-419699:4521465") + // implementation fg.deobf("curse.maven:ftb-library-forge-404465:4396792") + // implementation fg.deobf("curse.maven:ftb-teams-forge-404468:4579981") // https://discord.com/channels/313125603924639766/725850371834118214/910619168821354497 // Prevent Mixin annotation processor from getting into IntelliJ's annotation processor settings diff --git a/src/main/java/com/simibubi/create/content/equipment/wrench/IWrenchable.java b/src/main/java/com/simibubi/create/content/equipment/wrench/IWrenchable.java index 73e61afc2..1e7286060 100644 --- a/src/main/java/com/simibubi/create/content/equipment/wrench/IWrenchable.java +++ b/src/main/java/com/simibubi/create/content/equipment/wrench/IWrenchable.java @@ -55,13 +55,14 @@ public interface IWrenchable { BlockPos pos = context.getClickedPos(); Player player = context.getPlayer(); if (world instanceof ServerLevel) { + if (!world.destroyBlock(pos, false)) + return InteractionResult.PASS; if (player != null && !player.isCreative()) Block.getDrops(state, (ServerLevel) world, pos, world.getBlockEntity(pos), player, context.getItemInHand()) .forEach(itemStack -> { player.getInventory().placeItemBackInInventory(itemStack); }); state.spawnAfterBreak((ServerLevel) world, pos, ItemStack.EMPTY); - world.destroyBlock(pos, false); playRemoveSound(world, pos); } return InteractionResult.SUCCESS; From 4e51df3f8109953bf479a655745b317087445cb1 Mon Sep 17 00:00:00 2001 From: attackeight Date: Tue, 7 May 2024 20:25:30 -0400 Subject: [PATCH 02/28] Guard against chunk protections --- build.gradle | 4 ++++ .../content/equipment/wrench/IWrenchable.java | 23 ++++++++++++------- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/build.gradle b/build.gradle index a203b1be0..99a6f1965 100644 --- a/build.gradle +++ b/build.gradle @@ -206,6 +206,10 @@ dependencies { // runtimeOnly fg.deobf("maven.modrinth:spark:1.10.38-forge") //runtimeOnly fg.deobf("curse.maven:forbidden-arcanus-309858:4729924") //runtimeOnly fg.deobf("curse.maven:valhelsia-core-416935:3886212") + // implementation fg.deobf("curse.maven:ftb-chunks-forge-314906:4494633") + // implementation fg.deobf("curse.maven:architectury-api-419699:4521465") + // implementation fg.deobf("curse.maven:ftb-library-forge-404465:4396792") + // implementation fg.deobf("curse.maven:ftb-teams-forge-404468:4579981") // https://discord.com/channels/313125603924639766/725850371834118214/910619168821354497 // Prevent Mixin annotation processor from getting into IntelliJ's annotation processor settings diff --git a/src/main/java/com/simibubi/create/content/equipment/wrench/IWrenchable.java b/src/main/java/com/simibubi/create/content/equipment/wrench/IWrenchable.java index 73e61afc2..232a9dd5e 100644 --- a/src/main/java/com/simibubi/create/content/equipment/wrench/IWrenchable.java +++ b/src/main/java/com/simibubi/create/content/equipment/wrench/IWrenchable.java @@ -22,6 +22,8 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.world.BlockEvent; public interface IWrenchable { @@ -55,14 +57,19 @@ public interface IWrenchable { BlockPos pos = context.getClickedPos(); Player player = context.getPlayer(); if (world instanceof ServerLevel) { - if (player != null && !player.isCreative()) - Block.getDrops(state, (ServerLevel) world, pos, world.getBlockEntity(pos), player, context.getItemInHand()) - .forEach(itemStack -> { - player.getInventory().placeItemBackInInventory(itemStack); - }); - state.spawnAfterBreak((ServerLevel) world, pos, ItemStack.EMPTY); - world.destroyBlock(pos, false); - playRemoveSound(world, pos); + BlockEvent.BreakEvent event = new BlockEvent.BreakEvent(world, pos, world.getBlockState(pos), player); + MinecraftForge.EVENT_BUS.post(event); + if (!event.isCanceled()) { + if (player != null && !player.isCreative()) { + Block.getDrops(state, (ServerLevel) world, pos, world.getBlockEntity(pos), player, context.getItemInHand()) + .forEach(itemStack -> { + player.getInventory().placeItemBackInInventory(itemStack); + }); + } + state.spawnAfterBreak((ServerLevel) world, pos, ItemStack.EMPTY); + world.destroyBlock(pos, false); + playRemoveSound(world, pos); + } } return InteractionResult.SUCCESS; } From cda65027b253947f5cc431bb190234d0404581b7 Mon Sep 17 00:00:00 2001 From: attackeight Date: Thu, 9 May 2024 16:53:24 -0400 Subject: [PATCH 03/28] Fix Ore Crushing Inconsistency and add Gilded Blackstone Crushing fixes Creators-of-Create#6440 --- src/generated/resources/.cache/cache | 3 ++- .../recipes/crushing/deepslate_coal_ore.json | 7 +++--- .../recipes/crushing/gilded_blackstone.json | 23 +++++++++++++++++++ .../data/recipe/CrushingRecipeGen.java | 4 +++- 4 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 src/generated/resources/data/create/recipes/crushing/gilded_blackstone.json diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 1f49b621b..0946d510c 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -4251,7 +4251,7 @@ fe6620822b1c90527c6b77ab6f6e25873d19487c data/create/recipes/crushing/compat/the 2670e2454e82fd7dc44e896e40771bce9c515285 data/create/recipes/crushing/copper_ore.json 4106006671af487158d165c8211553028585ebb3 data/create/recipes/crushing/crimsite.json b2ba06eb5bcc907f16e4605fc53f31aa35bc2cfd data/create/recipes/crushing/crimsite_recycling.json -c0f2d4de4d00504607a8f3e2d1327d754835eebe data/create/recipes/crushing/deepslate_coal_ore.json +57a02cc2631a232a6bad5e772b622983087ecb18 data/create/recipes/crushing/deepslate_coal_ore.json 81ae6cf7b0f7dbf8f4966a4670121919de7b5391 data/create/recipes/crushing/deepslate_copper_ore.json 2f9f26daadda2d291989bccd2b0ea5f85e3ef5ae data/create/recipes/crushing/deepslate_diamond_ore.json ae3070fc3ae237192949ad06ebb8a4c157f7e832 data/create/recipes/crushing/deepslate_emerald_ore.json @@ -4265,6 +4265,7 @@ c42d105c8567c0844fcd811349093c2d754ea7d0 data/create/recipes/crushing/diamond_or f2b1c52cde3ecd83f021eff5114375e2f6526d90 data/create/recipes/crushing/diorite.json 38e958ba2e12daeed2fb0bc65a9ab9e04c98b816 data/create/recipes/crushing/diorite_recycling.json 1327589e844cb587a02167e4428fd604350d60e1 data/create/recipes/crushing/emerald_ore.json +23623c1aa357e96b791019d64bdaf0124652baaf data/create/recipes/crushing/gilded_blackstone.json b26b1f0dccf2ffb194ce12173890a83e93369b39 data/create/recipes/crushing/glowstone.json 159ac6c38b0232fa9bf3ed5e7ea8e23854c96f22 data/create/recipes/crushing/gold_ore.json 55c0656723bd5a87089965651fe268b2d2956771 data/create/recipes/crushing/golden_horse_armor.json diff --git a/src/generated/resources/data/create/recipes/crushing/deepslate_coal_ore.json b/src/generated/resources/data/create/recipes/crushing/deepslate_coal_ore.json index 1a7b72c05..6cf1a77d8 100644 --- a/src/generated/resources/data/create/recipes/crushing/deepslate_coal_ore.json +++ b/src/generated/resources/data/create/recipes/crushing/deepslate_coal_ore.json @@ -7,11 +7,12 @@ ], "results": [ { - "item": "minecraft:coal" + "item": "minecraft:coal", + "count": 2 }, { "item": "minecraft:coal", - "chance": 0.75 + "chance": 0.25 }, { "item": "create:experience_nugget", @@ -22,5 +23,5 @@ "chance": 0.125 } ], - "processingTime": 250 + "processingTime": 300 } \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crushing/gilded_blackstone.json b/src/generated/resources/data/create/recipes/crushing/gilded_blackstone.json new file mode 100644 index 000000000..df163c327 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crushing/gilded_blackstone.json @@ -0,0 +1,23 @@ +{ + "type": "create:crushing", + "ingredients": [ + { + "item": "minecraft:gilded_blackstone" + } + ], + "results": [ + { + "item": "minecraft:gold_nugget", + "count": 18 + }, + { + "item": "create:experience_nugget", + "chance": 0.75 + }, + { + "item": "minecraft:blackstone", + "chance": 0.125 + } + ], + "processingTime": 400 +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/CrushingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/CrushingRecipeGen.java index ee78cbec9..33223bb04 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/CrushingRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/CrushingRecipeGen.java @@ -93,13 +93,15 @@ public class CrushingRecipeGen extends ProcessingRecipeGen { DEEP_GOLD_ORE = deepslateOre(() -> Items.DEEPSLATE_GOLD_ORE, AllItems.CRUSHED_GOLD::get, 2.25f, 350), DEEP_DIAMOND_ORE = deepslateOre(() -> Items.DEEPSLATE_DIAMOND_ORE, () -> Items.DIAMOND, 2.25f, 450), DEEP_EMERALD_ORE = deepslateOre(() -> Items.DEEPSLATE_EMERALD_ORE, () -> Items.EMERALD, 2.25f, 450), - DEEP_COAL_ORE = deepslateOre(() -> Items.DEEPSLATE_COAL_ORE, () -> Items.COAL, 1.75f, 250), + DEEP_COAL_ORE = deepslateOre(() -> Items.DEEPSLATE_COAL_ORE, () -> Items.COAL, 2.25f, 300), DEEP_REDSTONE_ORE = deepslateOre(() -> Items.DEEPSLATE_REDSTONE_ORE, () -> Items.REDSTONE, 7.5f, 350), DEEP_LAPIS_ORE = deepslateOre(() -> Items.DEEPSLATE_LAPIS_ORE, () -> Items.LAPIS_LAZULI, 12.5f, 350), NETHER_GOLD_ORE = netherOre(() -> Items.NETHER_GOLD_ORE, () -> Items.GOLD_NUGGET, 18, 350), NETHER_QUARTZ_ORE = netherOre(() -> Items.NETHER_QUARTZ_ORE, () -> Items.QUARTZ, 2.25f, 350), + GILDED_BLACKSTONE = ore(Items.BLACKSTONE, () -> Items.GILDED_BLACKSTONE, () -> Items.GOLD_NUGGET, 18, 400), + RAW_COPPER_ORE = rawOre(() -> Items.RAW_COPPER, AllItems.CRUSHED_COPPER::get, 1), RAW_ZINC_ORE = rawOre(AllItems.RAW_ZINC::get, AllItems.CRUSHED_ZINC::get, 1), RAW_IRON_ORE = rawOre(() -> Items.RAW_IRON, AllItems.CRUSHED_IRON::get, 1), From 5ad844daf996a7d1363c6eda64550b871d8ce07c Mon Sep 17 00:00:00 2001 From: attackeight Date: Sun, 12 May 2024 08:17:53 -0400 Subject: [PATCH 04/28] Fence Gates on Trains fixes Creators-of-Create#6354 --- .../create/AllInteractionBehaviours.java | 11 +++++++ .../behaviour/FenceGateMovingInteraction.java | 29 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/behaviour/FenceGateMovingInteraction.java diff --git a/src/main/java/com/simibubi/create/AllInteractionBehaviours.java b/src/main/java/com/simibubi/create/AllInteractionBehaviours.java index 31c518c5f..0c857e93d 100644 --- a/src/main/java/com/simibubi/create/AllInteractionBehaviours.java +++ b/src/main/java/com/simibubi/create/AllInteractionBehaviours.java @@ -3,6 +3,8 @@ package com.simibubi.create; import java.util.ArrayList; import java.util.List; +import com.simibubi.create.content.contraptions.behaviour.FenceGateMovingInteraction; + import org.jetbrains.annotations.Nullable; import com.simibubi.create.content.contraptions.behaviour.DoorMovingInteraction; @@ -75,6 +77,15 @@ public class AllInteractionBehaviours { } return null; }); + + FenceGateMovingInteraction fenceGateBehavior = new FenceGateMovingInteraction(); + registerBehaviourProvider(state -> { + if (state.is(BlockTags.FENCE_GATES)) { + return fenceGateBehavior; + } + return null; + }); + } public interface BehaviourProvider { diff --git a/src/main/java/com/simibubi/create/content/contraptions/behaviour/FenceGateMovingInteraction.java b/src/main/java/com/simibubi/create/content/contraptions/behaviour/FenceGateMovingInteraction.java new file mode 100644 index 000000000..95510d99a --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/behaviour/FenceGateMovingInteraction.java @@ -0,0 +1,29 @@ +package com.simibubi.create.content.contraptions.behaviour; + +import com.simibubi.create.content.contraptions.Contraption; + +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.FenceGateBlock; +import net.minecraft.world.level.block.TrapDoorBlock; +import net.minecraft.world.level.block.state.BlockState; + +public class FenceGateMovingInteraction extends SimpleBlockMovingInteraction { + + @Override + protected BlockState handle(Player player, Contraption contraption, BlockPos pos, BlockState currentState) { + SoundEvent sound = currentState.getValue(FenceGateBlock.OPEN) ? SoundEvents.FENCE_GATE_CLOSE + : SoundEvents.FENCE_GATE_OPEN; + float pitch = player.level.random.nextFloat() * 0.1F + 0.9F; + playSound(player, sound, pitch); + return currentState.cycle(FenceGateBlock.OPEN); + } + + @Override + protected boolean updateColliders() { + return true; + } + +} From f9c966d6a89f9b7a93d93399ede94d04e93af674 Mon Sep 17 00:00:00 2001 From: techno-sam <77073745+techno-sam@users.noreply.github.com> Date: Wed, 12 Jun 2024 15:49:08 -0700 Subject: [PATCH 05/28] I'm totally stable fixes Creators-of-Create/Create#3640 and Creators-of-Create/Create#6590 --- .../contraptions/AbstractContraptionEntity.java | 10 +++++++--- .../contraptions/OrientedContraptionEntity.java | 7 ++++--- .../create/foundation/utility/AngleHelper.java | 3 +++ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/AbstractContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/AbstractContraptionEntity.java index a23fb5e6e..795513952 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/AbstractContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/AbstractContraptionEntity.java @@ -212,14 +212,18 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit Vec3 transformedVector = getPassengerPosition(passenger, 1); if (transformedVector == null) return; + + float offset = -1 / 8f; + if (passenger instanceof AbstractContraptionEntity) + offset = 0.0f; callback.accept(passenger, transformedVector.x, - transformedVector.y + SeatEntity.getCustomEntitySeatOffset(passenger) - 1 / 8f, transformedVector.z); + transformedVector.y + SeatEntity.getCustomEntitySeatOffset(passenger) + offset, transformedVector.z); } public Vec3 getPassengerPosition(Entity passenger, float partialTicks) { if (contraption == null) return null; - + UUID id = passenger.getUUID(); if (passenger instanceof OrientedContraptionEntity) { BlockPos localPos = contraption.getBearingPosOf(id); @@ -234,7 +238,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit BlockPos seat = contraption.getSeatOf(id); if (seat == null) return null; - + Vec3 transformedVector = toGlobalVector(Vec3.atLowerCornerOf(seat) .add(.5, passenger.getMyRidingOffset() + ySize - .15f, .5), partialTicks) .add(VecHelper.getCenterOf(BlockPos.ZERO)) diff --git a/src/main/java/com/simibubi/create/content/contraptions/OrientedContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/OrientedContraptionEntity.java index 13dc64607..4882e858e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/OrientedContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/OrientedContraptionEntity.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.contraptions; import static com.simibubi.create.foundation.utility.AngleHelper.angleLerp; +import static com.simibubi.create.foundation.utility.AngleHelper.wrapAngle180; import java.util.Optional; import java.util.UUID; @@ -353,7 +354,7 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { return false; OrientedContraptionEntity parent = (OrientedContraptionEntity) riding; prevYaw = yaw; - yaw = -parent.getViewYRot(1); + yaw = wrapAngle180(getInitialYaw() - parent.getInitialYaw()) - parent.getViewYRot(1); return false; } @@ -496,7 +497,7 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { Vec3 anchorVec = super.getAnchorVec(); return anchorVec.subtract(.5, 0, .5); } - + @Override public Vec3 getPrevAnchorVec() { Vec3 prevAnchorVec = super.getPrevAnchorVec(); @@ -571,7 +572,7 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { Vec3 passengerPosition = parent.getPassengerPosition(this, partialTicks); if (passengerPosition == null) return Vec3.ZERO; - + double x = passengerPosition.x - Mth.lerp(partialTicks, this.xOld, this.getX()); double y = passengerPosition.y - Mth.lerp(partialTicks, this.yOld, this.getY()); double z = passengerPosition.z - Mth.lerp(partialTicks, this.zOld, this.getZ()); diff --git a/src/main/java/com/simibubi/create/foundation/utility/AngleHelper.java b/src/main/java/com/simibubi/create/foundation/utility/AngleHelper.java index 4c3715fb6..94a639161 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/AngleHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/AngleHelper.java @@ -49,4 +49,7 @@ public class AngleHelper { return diff; } + public static float wrapAngle180(float angle) { + return (angle + 180) % 360 - 180; + } } From d8eeaf1220fb606e0932c29e4287cc8cc95909c7 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Fri, 14 Jun 2024 15:52:54 -0400 Subject: [PATCH 06/28] remove unnecessary glue ticking --- .../content/contraptions/glue/SuperGlueEntity.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/glue/SuperGlueEntity.java b/src/main/java/com/simibubi/create/content/contraptions/glue/SuperGlueEntity.java index 0efe74944..a90f059f2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/glue/SuperGlueEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/glue/SuperGlueEntity.java @@ -36,6 +36,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityDimensions; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LightningBolt; +import net.minecraft.world.entity.Marker; import net.minecraft.world.entity.MoverType; import net.minecraft.world.entity.Pose; import net.minecraft.world.entity.player.Player; @@ -161,7 +162,13 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat @Override public void tick() { - super.tick(); + xRotO = getXRot(); + yRotO = getYRot(); + walkDistO = walkDist; + xo = getX(); + yo = getY(); + zo = getZ(); + if (getBoundingBox().getXsize() == 0) discard(); } @@ -294,7 +301,7 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat public PushReaction getPistonPushReaction() { return PushReaction.IGNORE; } - + @Override public PortalInfo findDimensionEntryPoint(ServerLevel pDestination) { portalEntrancePos = blockPosition(); From 75d337ba8cfcfd8054a3e254dba70b991e8e0519 Mon Sep 17 00:00:00 2001 From: TelepathicGrunt <40846040+TelepathicGrunt@users.noreply.github.com> Date: Sun, 23 Jun 2024 09:46:36 -0400 Subject: [PATCH 07/28] Use safer fluidstack comparisons in FluidIngredient (#6317) * Use safer fluidstack comparisons * switched to getFluid check --- .../simibubi/create/foundation/fluid/FluidIngredient.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/fluid/FluidIngredient.java b/src/main/java/com/simibubi/create/foundation/fluid/FluidIngredient.java index ba85a3dc2..0a6fcca97 100644 --- a/src/main/java/com/simibubi/create/foundation/fluid/FluidIngredient.java +++ b/src/main/java/com/simibubi/create/foundation/fluid/FluidIngredient.java @@ -152,8 +152,7 @@ public abstract class FluidIngredient implements Predicate { @Override protected boolean testInternal(FluidStack t) { - if (!t.getFluid() - .isSame(fluid)) + if (t.getFluid() != fluid) return false; if (tagToMatch.isEmpty()) return true; @@ -206,8 +205,7 @@ public abstract class FluidIngredient implements Predicate { protected boolean testInternal(FluidStack t) { if (tag == null) { for (FluidStack accepted : getMatchingFluidStacks()) - if (accepted.getFluid() - .isSame(t.getFluid())) + if (accepted.getFluid() != t.getFluid()) return true; return false; } From 153423cc373ea61b926de779ae3acfc30873abf4 Mon Sep 17 00:00:00 2001 From: VoidLeech Date: Thu, 4 Jul 2024 01:30:34 +0200 Subject: [PATCH 08/28] fix alexmobs compat recipe name --- src/generated/resources/.cache/cache | 4 ++-- .../create/recipes/emptying/compat/alexsmobs/lava_bottle.json | 2 +- .../compat/alexsmobs/{milk_bottle.json => lava_bottle.json} | 0 .../create/foundation/data/recipe/FillingRecipeGen.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename src/generated/resources/data/create/recipes/filling/compat/alexsmobs/{milk_bottle.json => lava_bottle.json} (100%) diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 1f49b621b..4762e9723 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -5012,7 +5012,7 @@ e6aa8895186358e9d069f5a99909132be49f3bf1 data/create/recipes/diorite_from_stone_ a90268d38f976327ff5e1b87ff1d72ca2d1ebad6 data/create/recipes/dripstone_block_from_stone_types_dripstone_stonecutting.json 27d9bf05a610447e90314e658dbbcd191f378fc9 data/create/recipes/dripstone_pillar_from_stone_types_dripstone_stonecutting.json d81ceba2946286d374801e698a4ca2116395cbad data/create/recipes/emptying/builders_tea.json -318ab703224ff1d6f7200675e1e0a4c138b28456 data/create/recipes/emptying/compat/alexsmobs/lava_bottle.json +d62f4682fe6cc61df5a1c0231a2004a4ee78a329 data/create/recipes/emptying/compat/alexsmobs/lava_bottle.json c26d003e921720308c05ad7b9f3cb57de94a10a8 data/create/recipes/emptying/compat/farmersdelight/milk_bottle.json 60c0edfb5b759e4f13427b631861f503f8552923 data/create/recipes/emptying/compat/neapolitan/milk_bottle.json 20b7c7c62fa2e33199e08188dd8836844a6d9cfd data/create/recipes/emptying/honey_bottle.json @@ -5027,7 +5027,7 @@ c2f40d447fbac4b4975e578fe32635658b73ebf7 data/create/recipes/exposed_copper_tile 133e79f78a7f2c2f63ac7695d2be57d56e8955f4 data/create/recipes/filling/blaze_cake.json 642e96ce5dd2f31e7a33c6ef4060eecb0bf2aa86 data/create/recipes/filling/builders_tea.json 1367357fc36adc4b67467d90589ef91e657380a4 data/create/recipes/filling/chocolate_glazed_berries.json -61a770607d872ace2be80c3391fba4225182282f data/create/recipes/filling/compat/alexsmobs/milk_bottle.json +61a770607d872ace2be80c3391fba4225182282f data/create/recipes/filling/compat/alexsmobs/lava_bottle.json 08dde80a4761e430eaaa18fb813885d307b25bd1 data/create/recipes/filling/compat/byg/lush_grass_block.json 0e79248178f8c1690b4e5a5ad2ffaf63711ad3c7 data/create/recipes/filling/compat/farmersdelight/milk_bottle.json bcfbc3d6617e32732a1e186059694c4880e2d2e4 data/create/recipes/filling/compat/neapolitan/milk_bottle.json diff --git a/src/generated/resources/data/create/recipes/emptying/compat/alexsmobs/lava_bottle.json b/src/generated/resources/data/create/recipes/emptying/compat/alexsmobs/lava_bottle.json index b9a1453cc..5840cfd98 100644 --- a/src/generated/resources/data/create/recipes/emptying/compat/alexsmobs/lava_bottle.json +++ b/src/generated/resources/data/create/recipes/emptying/compat/alexsmobs/lava_bottle.json @@ -16,7 +16,7 @@ ], "conditions": [ { - "modid": "atmospheric", + "modid": "alexsmobs", "type": "forge:mod_loaded" } ] diff --git a/src/generated/resources/data/create/recipes/filling/compat/alexsmobs/milk_bottle.json b/src/generated/resources/data/create/recipes/filling/compat/alexsmobs/lava_bottle.json similarity index 100% rename from src/generated/resources/data/create/recipes/filling/compat/alexsmobs/milk_bottle.json rename to src/generated/resources/data/create/recipes/filling/compat/alexsmobs/lava_bottle.json diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/FillingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/FillingRecipeGen.java index c5f6c2a6b..9e967348b 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/FillingRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/FillingRecipeGen.java @@ -62,7 +62,7 @@ public class FillingRecipeGen extends ProcessingRecipeGen { .output(Items.GLOWSTONE_DUST)), - AM_LAVA = create(Mods.AM.recipeId("milk_bottle"), b -> b.require(Fluids.LAVA, 250) + AM_LAVA = create(Mods.AM.recipeId("lava_bottle"), b -> b.require(Fluids.LAVA, 250) .require(Items.GLASS_BOTTLE) .output(1, Mods.AM, "lava_bottle", 1) .whenModLoaded(Mods.AM.getId())), From f20dbd5caee0d1c4c514f71637a129439344bb35 Mon Sep 17 00:00:00 2001 From: VoidLeech Date: Fri, 5 Jul 2024 00:16:28 +0200 Subject: [PATCH 09/28] fix backtank nbt not saving ForgeCaps don't save yet either though --- src/generated/resources/.cache/cache | 6 +++--- .../loot_tables/blocks/copper_backtank.json | 11 +++++++++++ .../loot_tables/blocks/netherite_backtank.json | 11 +++++++++++ .../emptying/compat/alexsmobs/lava_bottle.json | 2 +- .../content/equipment/armor/BacktankBlock.java | 9 ++++++--- .../equipment/armor/BacktankBlockEntity.java | 15 +++++++++++++++ .../foundation/data/BuilderTransformers.java | 4 ++++ 7 files changed, 51 insertions(+), 7 deletions(-) diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 1f49b621b..e8b04142f 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -3329,7 +3329,7 @@ c2b075008849e152f20e8da946e89c9722325df6 data/create/loot_tables/blocks/content_ 69b4b25d7d271458177fbbaeba2c797daccc38a2 data/create/loot_tables/blocks/contraption_controls.json 28856dc862efc6bcc421d035d26386740458f868 data/create/loot_tables/blocks/controller_rail.json 2c2785e39e1891dff2c50cba93e814b56d935154 data/create/loot_tables/blocks/controls.json -3abf04f6132955275ad490668cd28f481afb4ec2 data/create/loot_tables/blocks/copper_backtank.json +830949a5dc64982392db2c1f651d2a9d0ff659a8 data/create/loot_tables/blocks/copper_backtank.json 6697e619d5c6dcb81aad4f5c88ba319d13665b35 data/create/loot_tables/blocks/copper_bars.json 8010db6b2427536c74312c85425b3ba83abc363c data/create/loot_tables/blocks/copper_casing.json ea5fb942c8dfb792daac538e09d286ac120aa199 data/create/loot_tables/blocks/copper_door.json @@ -3590,7 +3590,7 @@ afdff197c9d1a6940e988c00435135f9705fd0e5 data/create/loot_tables/blocks/metal_gi b83a90fbe83906b171fc0de6bdc2d9aa3a8c542e data/create/loot_tables/blocks/millstone.json 5c1df8443043b3fe3b665dba348e2ff188bcbe31 data/create/loot_tables/blocks/minecart_anchor.json 1e73d28fdd2e54910074aeadbe5617425a8ae656 data/create/loot_tables/blocks/mysterious_cuckoo_clock.json -a5fa8fdc10efe534e5c7d8bdb687f226b39f63ef data/create/loot_tables/blocks/netherite_backtank.json +9be92bab82bc1e83533f1d4679b09bd0513b07eb data/create/loot_tables/blocks/netherite_backtank.json 2e21a06c0d671e543bffecb0b67d97b51fa83ddc data/create/loot_tables/blocks/nixie_tube.json f6b4095a518a01081f3663d7268d67063bdb44ee data/create/loot_tables/blocks/nozzle.json d378be8f13fc7ed625813eae3a50b68e8706a297 data/create/loot_tables/blocks/oak_window.json @@ -5012,7 +5012,7 @@ e6aa8895186358e9d069f5a99909132be49f3bf1 data/create/recipes/diorite_from_stone_ a90268d38f976327ff5e1b87ff1d72ca2d1ebad6 data/create/recipes/dripstone_block_from_stone_types_dripstone_stonecutting.json 27d9bf05a610447e90314e658dbbcd191f378fc9 data/create/recipes/dripstone_pillar_from_stone_types_dripstone_stonecutting.json d81ceba2946286d374801e698a4ca2116395cbad data/create/recipes/emptying/builders_tea.json -318ab703224ff1d6f7200675e1e0a4c138b28456 data/create/recipes/emptying/compat/alexsmobs/lava_bottle.json +d62f4682fe6cc61df5a1c0231a2004a4ee78a329 data/create/recipes/emptying/compat/alexsmobs/lava_bottle.json c26d003e921720308c05ad7b9f3cb57de94a10a8 data/create/recipes/emptying/compat/farmersdelight/milk_bottle.json 60c0edfb5b759e4f13427b631861f503f8552923 data/create/recipes/emptying/compat/neapolitan/milk_bottle.json 20b7c7c62fa2e33199e08188dd8836844a6d9cfd data/create/recipes/emptying/honey_bottle.json diff --git a/src/generated/resources/data/create/loot_tables/blocks/copper_backtank.json b/src/generated/resources/data/create/loot_tables/blocks/copper_backtank.json index 9083fd8b2..2ae4e172a 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/copper_backtank.json +++ b/src/generated/resources/data/create/loot_tables/blocks/copper_backtank.json @@ -8,6 +8,17 @@ { "type": "minecraft:item", "functions": [ + { + "function": "minecraft:copy_nbt", + "source": "block_entity", + "ops": [ + { + "source": "FullNBT", + "target": "{}", + "op": "merge" + } + ] + }, { "function": "minecraft:copy_name", "source": "block_entity" diff --git a/src/generated/resources/data/create/loot_tables/blocks/netherite_backtank.json b/src/generated/resources/data/create/loot_tables/blocks/netherite_backtank.json index 4418da818..dde8be2fa 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/netherite_backtank.json +++ b/src/generated/resources/data/create/loot_tables/blocks/netherite_backtank.json @@ -8,6 +8,17 @@ { "type": "minecraft:item", "functions": [ + { + "function": "minecraft:copy_nbt", + "source": "block_entity", + "ops": [ + { + "source": "FullNBT", + "target": "{}", + "op": "merge" + } + ] + }, { "function": "minecraft:copy_name", "source": "block_entity" diff --git a/src/generated/resources/data/create/recipes/emptying/compat/alexsmobs/lava_bottle.json b/src/generated/resources/data/create/recipes/emptying/compat/alexsmobs/lava_bottle.json index b9a1453cc..5840cfd98 100644 --- a/src/generated/resources/data/create/recipes/emptying/compat/alexsmobs/lava_bottle.json +++ b/src/generated/resources/data/create/recipes/emptying/compat/alexsmobs/lava_bottle.json @@ -16,7 +16,7 @@ ], "conditions": [ { - "modid": "atmospheric", + "modid": "alexsmobs", "type": "forge:mod_loaded" } ] diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlock.java b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlock.java index 8848aa392..aa07e001f 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlock.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlock.java @@ -83,7 +83,7 @@ public class BacktankBlock extends HorizontalKineticBlock @Override public BlockState updateShape(BlockState state, Direction direction, BlockState neighbourState, LevelAccessor world, BlockPos pos, BlockPos neighbourPos) { - if (state.getValue(BlockStateProperties.WATERLOGGED)) + if (state.getValue(BlockStateProperties.WATERLOGGED)) world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); return state; } @@ -121,6 +121,7 @@ public class BacktankBlock extends HorizontalKineticBlock be.setEnchantmentTag(stack.getEnchantmentTags()); if (stack.hasCustomHoverName()) be.setCustomName(stack.getHoverName()); + be.setFullNbt(stack.getOrCreateTag()); }); } @@ -157,9 +158,10 @@ public class BacktankBlock extends HorizontalKineticBlock ItemStack stack = new ItemStack(item); Optional blockEntityOptional = getBlockEntityOptional(blockGetter, pos); + CompoundTag tag = blockEntityOptional.map(BacktankBlockEntity::getFullNbt).orElse(stack.getOrCreateTag()); + int air = blockEntityOptional.map(BacktankBlockEntity::getAirLevel) .orElse(0); - CompoundTag tag = stack.getOrCreateTag(); tag.putInt("Air", air); ListTag enchants = blockEntityOptional.map(BacktankBlockEntity::getEnchantmentTag) @@ -174,6 +176,7 @@ public class BacktankBlock extends HorizontalKineticBlock .orElse(null); if (customName != null) stack.setHoverName(customName); + stack.setTag(tag); return stack; } @@ -187,7 +190,7 @@ public class BacktankBlock extends HorizontalKineticBlock public Class getBlockEntityClass() { return BacktankBlockEntity.class; } - + @Override public BlockEntityType getBlockEntityType() { return AllBlockEntityTypes.BACKTANK.get(); diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlockEntity.java b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlockEntity.java index 20f3c4518..cca4eda3f 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlockEntity.java @@ -37,10 +37,13 @@ public class BacktankBlockEntity extends KineticBlockEntity implements Nameable private int capacityEnchantLevel; private ListTag enchantmentTag; + private CompoundTag fullNbt; + public BacktankBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); defaultName = getDefaultName(state); enchantmentTag = new ListTag(); + fullNbt = new CompoundTag(); } public static Component getDefaultName(BlockState state) { @@ -118,6 +121,7 @@ public class BacktankBlockEntity extends KineticBlockEntity implements Nameable if (this.customName != null) compound.putString("CustomName", Component.Serializer.toJson(this.customName)); compound.put("Enchantments", enchantmentTag); + compound.put("FullNBT", fullNbt); } @Override @@ -128,6 +132,7 @@ public class BacktankBlockEntity extends KineticBlockEntity implements Nameable airLevel = compound.getInt("Air"); airLevelTimer = compound.getInt("Timer"); enchantmentTag = compound.getList("Enchantments", Tag.TAG_COMPOUND); + this.fullNbt = compound.getCompound("FullNBT"); if (compound.contains("CustomName", 8)) this.customName = Component.Serializer.fromJson(compound.getString("CustomName")); if (prev != 0 && prev != airLevel && airLevel == BacktankUtil.maxAir(capacityEnchantLevel) && clientPacket) @@ -182,4 +187,14 @@ public class BacktankBlockEntity extends KineticBlockEntity implements Nameable this.capacityEnchantLevel = capacityEnchantLevel; } + public CompoundTag getFullNbt() + { + return fullNbt; + } + + public void setFullNbt(CompoundTag fullNbt) + { + this.fullNbt = fullNbt; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java index b39035f11..3e839be0f 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java +++ b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java @@ -73,6 +73,8 @@ import net.minecraft.world.level.storage.loot.LootTable.Builder; import net.minecraft.world.level.storage.loot.entries.LootItem; import net.minecraft.world.level.storage.loot.functions.CopyNameFunction; import net.minecraft.world.level.storage.loot.functions.CopyNbtFunction; +import net.minecraft.world.level.storage.loot.functions.LootItemFunction; +import net.minecraft.world.level.storage.loot.functions.SetNbtFunction; import net.minecraft.world.level.storage.loot.predicates.ExplosionCondition; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; import net.minecraft.world.level.storage.loot.providers.nbt.ContextNbtProvider; @@ -435,6 +437,8 @@ public class BuilderTransformers { .when(survivesExplosion) .setRolls(ConstantValue.exactly(1)) .add(LootItem.lootTableItem(drop.get()) + .apply(CopyNbtFunction.copyData(ContextNbtProvider.BLOCK_ENTITY) + .copy("FullNBT", "{}", CopyNbtFunction.MergeStrategy.MERGE)) .apply(CopyNameFunction.copyName(CopyNameFunction.NameSource.BLOCK_ENTITY)) .apply(CopyNbtFunction.copyData(ContextNbtProvider.BLOCK_ENTITY) .copy("Air", "Air")) From d67f345146433a8f958ec2d3a81bb1f82a1cb4fb Mon Sep 17 00:00:00 2001 From: VoidLeech Date: Fri, 5 Jul 2024 00:57:11 +0200 Subject: [PATCH 10/28] remove unused imports --- .../simibubi/create/foundation/data/BuilderTransformers.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java index 3e839be0f..0a7148cf2 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java +++ b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java @@ -73,8 +73,6 @@ import net.minecraft.world.level.storage.loot.LootTable.Builder; import net.minecraft.world.level.storage.loot.entries.LootItem; import net.minecraft.world.level.storage.loot.functions.CopyNameFunction; import net.minecraft.world.level.storage.loot.functions.CopyNbtFunction; -import net.minecraft.world.level.storage.loot.functions.LootItemFunction; -import net.minecraft.world.level.storage.loot.functions.SetNbtFunction; import net.minecraft.world.level.storage.loot.predicates.ExplosionCondition; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; import net.minecraft.world.level.storage.loot.providers.nbt.ContextNbtProvider; From a6f5c51d6a3a2c971d6a4f40cfdc3ee4499b63d9 Mon Sep 17 00:00:00 2001 From: VoidLeech Date: Fri, 5 Jul 2024 01:08:44 +0200 Subject: [PATCH 11/28] Preserve getOrCreateStack --- .../simibubi/create/content/equipment/armor/BacktankBlock.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlock.java b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlock.java index aa07e001f..59ca29710 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlock.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlock.java @@ -158,7 +158,7 @@ public class BacktankBlock extends HorizontalKineticBlock ItemStack stack = new ItemStack(item); Optional blockEntityOptional = getBlockEntityOptional(blockGetter, pos); - CompoundTag tag = blockEntityOptional.map(BacktankBlockEntity::getFullNbt).orElse(stack.getOrCreateTag()); + CompoundTag tag = stack.getOrCreateTag().merge(blockEntityOptional.map(BacktankBlockEntity::getFullNbt).orElse(new CompoundTag())); int air = blockEntityOptional.map(BacktankBlockEntity::getAirLevel) .orElse(0); From caf79d40ae2977fe5a56946a8de9c0b1e3907914 Mon Sep 17 00:00:00 2001 From: VoidLeech Date: Fri, 5 Jul 2024 02:29:33 +0200 Subject: [PATCH 12/28] Revert "Preserve getOrCreateStack" This reverts commit a6f5c51d6a3a2c971d6a4f40cfdc3ee4499b63d9. Would duplicate the enchants on the backtank --- .../simibubi/create/content/equipment/armor/BacktankBlock.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlock.java b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlock.java index 59ca29710..aa07e001f 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlock.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlock.java @@ -158,7 +158,7 @@ public class BacktankBlock extends HorizontalKineticBlock ItemStack stack = new ItemStack(item); Optional blockEntityOptional = getBlockEntityOptional(blockGetter, pos); - CompoundTag tag = stack.getOrCreateTag().merge(blockEntityOptional.map(BacktankBlockEntity::getFullNbt).orElse(new CompoundTag())); + CompoundTag tag = blockEntityOptional.map(BacktankBlockEntity::getFullNbt).orElse(stack.getOrCreateTag()); int air = blockEntityOptional.map(BacktankBlockEntity::getAirLevel) .orElse(0); From ee41e0f04e365678c786eb82454761a714f5a88c Mon Sep 17 00:00:00 2001 From: NotSoEpic Date: Sat, 6 Jul 2024 08:41:41 +0800 Subject: [PATCH 13/28] Encasing blocks plays a placing sound --- .../content/decoration/encasing/EncasableBlock.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/com/simibubi/create/content/decoration/encasing/EncasableBlock.java b/src/main/java/com/simibubi/create/content/decoration/encasing/EncasableBlock.java index 6c31ae78c..d53cf9617 100644 --- a/src/main/java/com/simibubi/create/content/decoration/encasing/EncasableBlock.java +++ b/src/main/java/com/simibubi/create/content/decoration/encasing/EncasableBlock.java @@ -3,12 +3,14 @@ package com.simibubi.create.content.decoration.encasing; import java.util.List; import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; @@ -31,9 +33,16 @@ public interface EncasableBlock { return InteractionResult.SUCCESS; encased.handleEncasing(state, level, pos, heldItem, player, hand, ray); + playEncaseSound(level, pos); return InteractionResult.SUCCESS; } } return InteractionResult.PASS; } + + default void playEncaseSound(Level level, BlockPos pos) { + BlockState newState = level.getBlockState(pos); + SoundType soundType = newState.getSoundType(); + level.playSound(null, pos, soundType.getPlaceSound(), SoundSource.BLOCKS, (soundType.getVolume() + 1.0F) / 2.0F, soundType.getPitch() * 0.8F); + } } From 9dfbe061def61b99b03b5bbf66a349323709fd91 Mon Sep 17 00:00:00 2001 From: drouarb Date: Mon, 8 Jul 2024 20:53:49 +0200 Subject: [PATCH 14/28] Preserving BakedModel and switching to ItemRenderer.render instead of ItemRenderer.renderStatic for performance --- .../decoration/placard/PlacardRenderer.java | 7 ++++--- .../content/fluids/drain/ItemDrainRenderer.java | 7 ++++--- .../create/content/kinetics/belt/BeltRenderer.java | 11 ++++++----- .../kinetics/deployer/DeployerRenderer.java | 8 ++++---- .../kinetics/mechanicalArm/ArmRenderer.java | 14 +++++++------- .../create/content/kinetics/saw/SawRenderer.java | 2 +- .../content/logistics/depot/DepotRenderer.java | 7 ++++--- 7 files changed, 30 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/decoration/placard/PlacardRenderer.java b/src/main/java/com/simibubi/create/content/decoration/placard/PlacardRenderer.java index 7081b98ae..fe98850ea 100644 --- a/src/main/java/com/simibubi/create/content/decoration/placard/PlacardRenderer.java +++ b/src/main/java/com/simibubi/create/content/decoration/placard/PlacardRenderer.java @@ -10,6 +10,7 @@ import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.block.model.ItemTransforms.TransformType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraft.world.item.ItemStack; @@ -33,8 +34,8 @@ public class PlacardRenderer extends SafeBlockEntityRenderer ItemRenderer itemRenderer = Minecraft.getInstance() .getItemRenderer(); - boolean blockItem = itemRenderer.getModel(heldItem, null, null, 0) - .isGui3d(); + BakedModel bakedModel = itemRenderer.getModel(heldItem, null, null, 0); + boolean blockItem = bakedModel.isGui3d(); ms.pushPose(); TransformStack.cast(ms) @@ -46,7 +47,7 @@ public class PlacardRenderer extends SafeBlockEntityRenderer .translate(0, 0, 4.5 / 16f) .scale(blockItem ? .5f : .375f); - itemRenderer.renderStatic(heldItem, TransformType.FIXED, light, overlay, ms, buffer, 0); + itemRenderer.render(heldItem, TransformType.FIXED, false, ms, buffer, light, overlay, bakedModel); ms.popPose(); } diff --git a/src/main/java/com/simibubi/create/content/fluids/drain/ItemDrainRenderer.java b/src/main/java/com/simibubi/create/content/fluids/drain/ItemDrainRenderer.java index d803e31dc..e3a9c4957 100644 --- a/src/main/java/com/simibubi/create/content/fluids/drain/ItemDrainRenderer.java +++ b/src/main/java/com/simibubi/create/content/fluids/drain/ItemDrainRenderer.java @@ -19,6 +19,7 @@ import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.block.model.ItemTransforms.TransformType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.util.Mth; @@ -78,8 +79,8 @@ public class ItemDrainRenderer extends SmartBlockEntityRenderer { boolean slopeAlongX = beltFacing .getAxis() == Axis.X; + ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer(); boolean onContraption = be.getLevel() instanceof WrappedWorld; for (TransportedItemStack transported : be.getInventory() @@ -238,11 +240,10 @@ public class BeltRenderer extends SafeBlockEntityRenderer { ms.translate(alongX ? sideOffset : 0, 0, alongX ? 0 : sideOffset); int stackLight = onContraption ? light : getPackedLight(be, offset); - ItemRenderer itemRenderer = Minecraft.getInstance() - .getItemRenderer(); + boolean renderUpright = BeltHelper.isItemUpright(transported.stack); - boolean blockItem = itemRenderer.getModel(transported.stack, be.getLevel(), null, 0) - .isGui3d(); + BakedModel bakedModel = itemRenderer.getModel(transported.stack, be.getLevel(), null, 0); + boolean blockItem = bakedModel.isGui3d(); int count = (int) (Mth.log2((int) (transported.stack.getCount()))) / 2; Random r = new Random(transported.angle); @@ -289,7 +290,7 @@ public class BeltRenderer extends SafeBlockEntityRenderer { } ms.scale(.5f, .5f, .5f); - itemRenderer.renderStatic(null, transported.stack, TransformType.FIXED, false, ms, buffer, be.getLevel(), stackLight, overlay, 0); + itemRenderer.render(transported.stack, TransformType.FIXED, false, ms, buffer, stackLight, overlay, bakedModel); ms.popPose(); if (!renderUpright) { diff --git a/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerRenderer.java index 3ce20684f..031f162ce 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/deployer/DeployerRenderer.java @@ -34,6 +34,7 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.ItemTransforms.TransformType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; @@ -89,9 +90,8 @@ public class DeployerRenderer extends SafeBlockEntityRenderer { ItemRenderer itemRenderer = Minecraft.getInstance() .getItemRenderer(); - boolean isBlockItem = - hasItem && (item.getItem() instanceof BlockItem) && itemRenderer.getModel(item, be.getLevel(), null, 0) - .isGui3d(); + BakedModel bakedModel = itemRenderer.getModel(item, be.getLevel(), null, 0); + boolean isBlockItem = hasItem && (item.getItem() instanceof BlockItem) && bakedModel.isGui3d(); VertexConsumer builder = buffer.getBuffer(be.goggles ? RenderType.cutout() : RenderType.solid()); BlockState blockState = be.getBlockState(); @@ -102,7 +102,7 @@ public class ArmRenderer extends KineticBlockEntityRenderer { .multiply(msLocal.last() .pose()); - itemRenderer.renderStatic(item, TransformType.FIXED, light, overlay, ms, buffer, 0); + itemRenderer.render(item, TransformType.FIXED, false, ms, buffer, light, overlay, bakedModel); ms.popPose(); } @@ -141,13 +141,13 @@ public class ArmRenderer extends KineticBlockEntityRenderer { .renderInto(ms, builder); transformHead(msr, headAngle); - + if (inverted) msr.rotateZ(180); - + claw.transform(msLocal) .renderInto(ms, builder); - + if (inverted) msr.rotateZ(180); diff --git a/src/main/java/com/simibubi/create/content/kinetics/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/saw/SawRenderer.java index 926b7332a..750ca9371 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/saw/SawRenderer.java @@ -134,7 +134,7 @@ public class SawRenderer extends SafeBlockEntityRenderer { if (alongZ) ms.mulPose(Vector3f.YP.rotationDegrees(90)); ms.mulPose(Vector3f.XP.rotationDegrees(90)); - itemRenderer.renderStatic(stack, ItemTransforms.TransformType.FIXED, light, overlay, ms, buffer, 0); + itemRenderer.render(stack, ItemTransforms.TransformType.FIXED, false, ms, buffer, light, overlay, modelWithOverrides); break; } diff --git a/src/main/java/com/simibubi/create/content/logistics/depot/DepotRenderer.java b/src/main/java/com/simibubi/create/content/logistics/depot/DepotRenderer.java index 5f830e91d..3d53879fa 100644 --- a/src/main/java/com/simibubi/create/content/logistics/depot/DepotRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/depot/DepotRenderer.java @@ -16,6 +16,7 @@ import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.block.model.ItemTransforms.TransformType; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.Direction.Axis; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; @@ -104,8 +105,8 @@ public class DepotRenderer extends SafeBlockEntityRenderer { TransformStack msr = TransformStack.cast(ms); int count = (int) (Mth.log2((int) (itemStack.getCount()))) / 2; boolean renderUpright = BeltHelper.isItemUpright(itemStack); - boolean blockItem = itemRenderer.getModel(itemStack, null, null, 0) - .isGui3d(); + BakedModel bakedModel = itemRenderer.getModel(itemStack, null, null, 0); + boolean blockItem = bakedModel.isGui3d(); ms.pushPose(); msr.rotateY(angle); @@ -131,7 +132,7 @@ public class DepotRenderer extends SafeBlockEntityRenderer { ms.translate(0, -3 / 16f, 0); msr.rotateX(90); } - itemRenderer.renderStatic(itemStack, TransformType.FIXED, light, overlay, ms, buffer, 0); + itemRenderer.render(itemStack, TransformType.FIXED, false, ms, buffer, light, overlay, bakedModel); ms.popPose(); if (!renderUpright) { From 03973c4dc5927a9f67afdb412c0a920c20977878 Mon Sep 17 00:00:00 2001 From: drouarb Date: Thu, 11 Jul 2024 00:00:27 +0200 Subject: [PATCH 15/28] Culling item on belts --- .../content/kinetics/belt/BeltRenderer.java | 24 +++++++++++++++---- .../renderer/SafeBlockEntityRenderer.java | 21 ++++++++++++++++ .../resources/META-INF/accesstransformer.cfg | 3 +++ 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java index c7241ed53..04f366232 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltRenderer.java @@ -198,10 +198,6 @@ public class BeltRenderer extends SafeBlockEntityRenderer { for (TransportedItemStack transported : be.getInventory() .getTransportedItems()) { - ms.pushPose(); - TransformStack.cast(ms) - .nudge(transported.angle); - float offset; float sideOffset; float verticalMovement; @@ -228,6 +224,18 @@ public class BeltRenderer extends SafeBlockEntityRenderer { .getAxis() == Axis.Z); float slopeAngle = onSlope ? tiltForward ? -45 : 45 : 0; + Vec3 itemPos = beltStartOffset.add( + be.getBlockPos().getX(), + be.getBlockPos().getY(), + be.getBlockPos().getZ()) + .add(offsetVec); + + if (this.shouldCullItem(itemPos)) { + continue; + } + + ms.pushPose(); + TransformStack.cast(ms).nudge(transported.angle); ms.translate(offsetVec.x, offsetVec.y, offsetVec.z); boolean alongX = beltFacing @@ -243,7 +251,13 @@ public class BeltRenderer extends SafeBlockEntityRenderer { boolean renderUpright = BeltHelper.isItemUpright(transported.stack); boolean blockItem = itemRenderer.getModel(transported.stack, be.getLevel(), null, 0) .isGui3d(); - int count = (int) (Mth.log2((int) (transported.stack.getCount()))) / 2; + + + int count = 0; + if (Minecraft.getInstance().player.getEyePosition(1.0F).distanceTo(itemPos) < 16) { + count = (int) (Mth.log2((int) (transported.stack.getCount()))) / 2; + } + Random r = new Random(transported.angle); boolean slopeShadowOnly = renderUpright && onSlope; diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/renderer/SafeBlockEntityRenderer.java b/src/main/java/com/simibubi/create/foundation/blockEntity/renderer/SafeBlockEntityRenderer.java index 1ecb77e29..f26940d4c 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/renderer/SafeBlockEntityRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/renderer/SafeBlockEntityRenderer.java @@ -2,10 +2,14 @@ package com.simibubi.create.foundation.blockEntity.renderer; import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; public abstract class SafeBlockEntityRenderer implements BlockEntityRenderer { @Override @@ -23,4 +27,21 @@ public abstract class SafeBlockEntityRenderer implements return !be.hasLevel() || be.getBlockState() .getBlock() == Blocks.AIR; } + + public boolean shouldCullItem(Vec3 itemPos) { + Frustum frustum = Minecraft.getInstance().levelRenderer.capturedFrustum != null ? + Minecraft.getInstance().levelRenderer.capturedFrustum : + Minecraft.getInstance().levelRenderer.cullingFrustum; + + AABB itemBB = new AABB( + itemPos.x - 0.25, + itemPos.y - 0.25, + itemPos.z - 0.25, + itemPos.x + 0.25, + itemPos.y + 0.25, + itemPos.z + 0.25 + ); + + return !frustum.isVisible(itemBB); + } } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index a911f646d..1bc660abe 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -42,3 +42,6 @@ public net.minecraft.client.model.AgeableListModel f_102012_ # bodyYOffset public net.minecraft.client.gui.components.CommandSuggestions f_93866_ # suggestions public net.minecraft.client.gui.components.CommandSuggestions$SuggestionsList (Lnet/minecraft/client/gui/components/CommandSuggestions;IIILjava/util/List;Z)V # + +public net.minecraft.client.renderer.LevelRenderer f_172938_ # cullingFrustum +public net.minecraft.client.renderer.LevelRenderer f_109442_ # capturedFrustum From 7bd602a33f838bd8904c4ac8edf9cc21220862e4 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 15 Jul 2024 11:44:30 +0200 Subject: [PATCH 16/28] The Dupe Chute - Fixed a duplication bug involving belts and chutes #6210 #5781 #6686 --- .../content/kinetics/belt/transport/BeltInventory.java | 2 ++ .../belt/transport/ItemHandlerBeltSegment.java | 10 ++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/transport/BeltInventory.java b/src/main/java/com/simibubi/create/content/kinetics/belt/transport/BeltInventory.java index 42b0939f6..1d1b80b05 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/transport/BeltInventory.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/transport/BeltInventory.java @@ -378,6 +378,8 @@ public class BeltInventory { float min = offset; float max = offset + 1; for (TransportedItemStack stack : items) { + if (toRemove.contains(stack)) + continue; if (stack.beltPosition > max) continue; if (stack.beltPosition > min) diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/transport/ItemHandlerBeltSegment.java b/src/main/java/com/simibubi/create/content/kinetics/belt/transport/ItemHandlerBeltSegment.java index 3395f9393..0a5248c5f 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/transport/ItemHandlerBeltSegment.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/transport/ItemHandlerBeltSegment.java @@ -50,13 +50,15 @@ public class ItemHandlerBeltSegment implements IItemHandler { return ItemStack.EMPTY; amount = Math.min(amount, transported.stack.getCount()); - ItemStack extracted = simulate ? transported.stack.copy().split(amount) : transported.stack.split(amount); + ItemStack extracted = simulate ? transported.stack.copy() + .split(amount) : transported.stack.split(amount); if (!simulate) { if (transported.stack.isEmpty()) - this.beltInventory.toRemove.add(transported); - this.beltInventory.belt.setChanged(); - this.beltInventory.belt.sendData(); + beltInventory.toRemove.add(transported); + else + beltInventory.belt.notifyUpdate(); } + return extracted; } From 4b3dcc32abb34a32fd420b44e2812ef8e17ce87e Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 15 Jul 2024 12:58:38 +0200 Subject: [PATCH 17/28] Equals does not equal not equals - Fix inverted fluid comparison from a recent PR --- .../create/foundation/fluid/FluidHelper.java | 8 ++++++++ .../create/foundation/fluid/FluidIngredient.java | 16 +++++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java b/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java index befb004b2..5d54e13cf 100644 --- a/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java +++ b/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java @@ -49,6 +49,14 @@ public class FluidHelper { public static boolean isLava(Fluid fluid) { return convertToStill(fluid) == Fluids.LAVA; } + + public static boolean isSame(FluidStack fluidStack, FluidStack fluidStack2) { + return fluidStack.getFluid() == fluidStack2.getFluid(); + } + + public static boolean isSame(FluidStack fluidStack, Fluid fluid) { + return fluidStack.getFluid() == fluid; + } @SuppressWarnings("deprecation") public static boolean isTag(Fluid fluid, TagKey tag) { diff --git a/src/main/java/com/simibubi/create/foundation/fluid/FluidIngredient.java b/src/main/java/com/simibubi/create/foundation/fluid/FluidIngredient.java index 0a6fcca97..9f1eccaf0 100644 --- a/src/main/java/com/simibubi/create/foundation/fluid/FluidIngredient.java +++ b/src/main/java/com/simibubi/create/foundation/fluid/FluidIngredient.java @@ -152,7 +152,7 @@ public abstract class FluidIngredient implements Predicate { @Override protected boolean testInternal(FluidStack t) { - if (t.getFluid() != fluid) + if (!FluidHelper.isSame(t, fluid)) return false; if (tagToMatch.isEmpty()) return true; @@ -200,16 +200,14 @@ public abstract class FluidIngredient implements Predicate { protected TagKey tag; - @SuppressWarnings("deprecation") @Override protected boolean testInternal(FluidStack t) { - if (tag == null) { - for (FluidStack accepted : getMatchingFluidStacks()) - if (accepted.getFluid() != t.getFluid()) - return true; - return false; - } - return t.getFluid().is(tag); + if (tag != null) + return FluidHelper.isTag(t, tag); + for (FluidStack accepted : getMatchingFluidStacks()) + if (FluidHelper.isSame(accepted, t)) + return true; + return false; } @Override From d9198f678ea499bc14e7af669ff586dcc4afd6bb Mon Sep 17 00:00:00 2001 From: zelophed Date: Mon, 15 Jul 2024 14:45:23 +0200 Subject: [PATCH 18/28] rework ThresholdSwitch compat - adds better support for SophisticatedStorage and FunctionalStorage --- build.gradle | 6 +++ .../java/com/simibubi/create/compat/Mods.java | 3 ++ .../compat/storageDrawers/StorageDrawers.java | 41 ------------------- .../thresholdSwitch/FunctionalStorage.java | 22 ++++++++++ .../thresholdSwitch/SophisticatedStorage.java | 29 +++++++++++++ .../thresholdSwitch/StorageDrawers.java | 25 +++++++++++ .../ThresholdSwitchCompat.java | 12 ++++++ .../ThresholdSwitchBlockEntity.java | 32 +++++++++++---- 8 files changed, 120 insertions(+), 50 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/compat/storageDrawers/StorageDrawers.java create mode 100644 src/main/java/com/simibubi/create/compat/thresholdSwitch/FunctionalStorage.java create mode 100644 src/main/java/com/simibubi/create/compat/thresholdSwitch/SophisticatedStorage.java create mode 100644 src/main/java/com/simibubi/create/compat/thresholdSwitch/StorageDrawers.java create mode 100644 src/main/java/com/simibubi/create/compat/thresholdSwitch/ThresholdSwitchCompat.java diff --git a/build.gradle b/build.gradle index a203b1be0..c96b7f2ca 100644 --- a/build.gradle +++ b/build.gradle @@ -53,6 +53,7 @@ minecraft { workingDirectory project.file('run') arg '-mixin.config=create.mixins.json' //jvmArgs '-XX:+UnlockCommercialFeatures' // uncomment for profiling + //jvmArgs '-XX:+IgnoreUnrecognizedVMOptions', '-XX:+AllowEnhancedClassRedefinition' // uncomment with jbr property 'forge.logging.console.level', 'info' mods { create { @@ -206,6 +207,11 @@ dependencies { // runtimeOnly fg.deobf("maven.modrinth:spark:1.10.38-forge") //runtimeOnly fg.deobf("curse.maven:forbidden-arcanus-309858:4729924") //runtimeOnly fg.deobf("curse.maven:valhelsia-core-416935:3886212") +// runtimeOnly fg.deobf("curse.maven:sophisticated-storage-619320:5194748") +// runtimeOnly fg.deobf("curse.maven:sophisticated-core-618298:5296312") +// runtimeOnly fg.deobf("curse.maven:functional-storage-556861:5271589") +// runtimeOnly fg.deobf("curse.maven:titanium-287342:5151207") +// runtimeOnly fg.deobf("curse.maven:storage-drawers-223852:3807626") // https://discord.com/channels/313125603924639766/725850371834118214/910619168821354497 // Prevent Mixin annotation processor from getting into IntelliJ's annotation processor settings diff --git a/src/main/java/com/simibubi/create/compat/Mods.java b/src/main/java/com/simibubi/create/compat/Mods.java index 909569e04..710df10b2 100644 --- a/src/main/java/com/simibubi/create/compat/Mods.java +++ b/src/main/java/com/simibubi/create/compat/Mods.java @@ -18,8 +18,11 @@ public enum Mods { CONNECTIVITY, CURIOS, DYNAMICTREES, + FUNCTIONALSTORAGE, OCCULTISM, PACKETFIXER, + SOPHISTICATEDBACKPACKS, + SOPHISTICATEDSTORAGE, STORAGEDRAWERS, TCONSTRUCT, XLPACKETS; diff --git a/src/main/java/com/simibubi/create/compat/storageDrawers/StorageDrawers.java b/src/main/java/com/simibubi/create/compat/storageDrawers/StorageDrawers.java deleted file mode 100644 index 854decc6d..000000000 --- a/src/main/java/com/simibubi/create/compat/storageDrawers/StorageDrawers.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.simibubi.create.compat.storageDrawers; - -import com.simibubi.create.compat.Mods; -import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour; - -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraftforge.items.IItemHandler; - -public class StorageDrawers { - - public static boolean isDrawer(BlockEntity be) { - return be != null && Mods.STORAGEDRAWERS.id() - .equals(be.getType() - .getRegistryName() - .getNamespace()); - } - - public static float getTrueFillLevel(IItemHandler inv, FilteringBehaviour filtering) { - float occupied = 0; - float totalSpace = 0; - - for (int slot = 1; slot < inv.getSlots(); slot++) { - ItemStack stackInSlot = inv.getStackInSlot(slot); - int space = inv.getSlotLimit(slot); - int count = stackInSlot.getCount(); - if (space == 0) - continue; - - totalSpace += 1; - if (filtering.test(stackInSlot)) - occupied += count * (1f / space); - } - - if (totalSpace == 0) - return 0; - - return occupied / totalSpace; - } - -} diff --git a/src/main/java/com/simibubi/create/compat/thresholdSwitch/FunctionalStorage.java b/src/main/java/com/simibubi/create/compat/thresholdSwitch/FunctionalStorage.java new file mode 100644 index 000000000..2ec66a935 --- /dev/null +++ b/src/main/java/com/simibubi/create/compat/thresholdSwitch/FunctionalStorage.java @@ -0,0 +1,22 @@ +package com.simibubi.create.compat.thresholdSwitch; + +import com.simibubi.create.compat.Mods; + +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.items.IItemHandler; + +public class FunctionalStorage implements ThresholdSwitchCompat { + + @Override + public boolean isFromThisMod(BlockEntity blockEntity) { + return blockEntity != null && Mods.FUNCTIONALSTORAGE.id() + .equals(blockEntity.getType() + .getRegistryName() + .getNamespace()); + } + + @Override + public long getSpaceInSlot(IItemHandler inv, int slot) { + return inv.getSlotLimit(slot); + } +} diff --git a/src/main/java/com/simibubi/create/compat/thresholdSwitch/SophisticatedStorage.java b/src/main/java/com/simibubi/create/compat/thresholdSwitch/SophisticatedStorage.java new file mode 100644 index 000000000..bc200b598 --- /dev/null +++ b/src/main/java/com/simibubi/create/compat/thresholdSwitch/SophisticatedStorage.java @@ -0,0 +1,29 @@ +package com.simibubi.create.compat.thresholdSwitch; + +import com.simibubi.create.compat.Mods; + +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.items.IItemHandler; + +public class SophisticatedStorage implements ThresholdSwitchCompat { + + @Override + public boolean isFromThisMod(BlockEntity be) { + if (be == null) + return false; + + String namespace = be.getType() + .getRegistryName() + .getNamespace(); + + return + Mods.SOPHISTICATEDSTORAGE.id().equals(namespace) + || Mods.SOPHISTICATEDBACKPACKS.id().equals(namespace); + } + + @Override + public long getSpaceInSlot(IItemHandler inv, int slot) { + return ((long) inv.getSlotLimit(slot) * inv.getStackInSlot(slot).getMaxStackSize()) / 64; + } + +} diff --git a/src/main/java/com/simibubi/create/compat/thresholdSwitch/StorageDrawers.java b/src/main/java/com/simibubi/create/compat/thresholdSwitch/StorageDrawers.java new file mode 100644 index 000000000..a5055e017 --- /dev/null +++ b/src/main/java/com/simibubi/create/compat/thresholdSwitch/StorageDrawers.java @@ -0,0 +1,25 @@ +package com.simibubi.create.compat.thresholdSwitch; + +import com.simibubi.create.compat.Mods; + +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.items.IItemHandler; + +public class StorageDrawers implements ThresholdSwitchCompat { + + @Override + public boolean isFromThisMod(BlockEntity blockEntity) { + return blockEntity != null && Mods.STORAGEDRAWERS.id() + .equals(blockEntity.getType() + .getRegistryName() + .getNamespace()); + } + + @Override + public long getSpaceInSlot(IItemHandler inv, int slot) { + if (slot == 0) + return 0; + + return inv.getSlotLimit(slot); + } +} diff --git a/src/main/java/com/simibubi/create/compat/thresholdSwitch/ThresholdSwitchCompat.java b/src/main/java/com/simibubi/create/compat/thresholdSwitch/ThresholdSwitchCompat.java new file mode 100644 index 000000000..841769c34 --- /dev/null +++ b/src/main/java/com/simibubi/create/compat/thresholdSwitch/ThresholdSwitchCompat.java @@ -0,0 +1,12 @@ +package com.simibubi.create.compat.thresholdSwitch; + +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.items.IItemHandler; + +public interface ThresholdSwitchCompat { + + boolean isFromThisMod(BlockEntity blockEntity); + + long getSpaceInSlot(IItemHandler inv, int slot); + +} diff --git a/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchBlockEntity.java b/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchBlockEntity.java index f623407a0..0163ed260 100644 --- a/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/redstone/thresholdSwitch/ThresholdSwitchBlockEntity.java @@ -2,7 +2,10 @@ package com.simibubi.create.content.redstone.thresholdSwitch; import java.util.List; -import com.simibubi.create.compat.storageDrawers.StorageDrawers; +import com.simibubi.create.compat.thresholdSwitch.FunctionalStorage; +import com.simibubi.create.compat.thresholdSwitch.SophisticatedStorage; +import com.simibubi.create.compat.thresholdSwitch.StorageDrawers; +import com.simibubi.create.compat.thresholdSwitch.ThresholdSwitchCompat; import com.simibubi.create.content.redstone.DirectedDirectionalBlock; import com.simibubi.create.content.redstone.FilteredDetectorFilterSlot; import com.simibubi.create.content.redstone.displayLink.DisplayLinkBlock; @@ -42,6 +45,12 @@ public class ThresholdSwitchBlockEntity extends SmartBlockEntity { private TankManipulationBehaviour observedTank; private VersionedInventoryTrackerBehaviour invVersionTracker; + private static final List COMPAT = List.of( + new FunctionalStorage(), + new SophisticatedStorage(), + new StorageDrawers() + ); + public ThresholdSwitchBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); onWhenAbove = .75f; @@ -104,27 +113,32 @@ public class ThresholdSwitchBlockEntity extends SmartBlockEntity { if (targetBlockEntity instanceof ThresholdSwitchObservable observable) { currentLevel = observable.getPercent() / 100f; - } else if (StorageDrawers.isDrawer(targetBlockEntity) && observedInventory.hasInventory()) { - currentLevel = StorageDrawers.getTrueFillLevel(observedInventory.getInventory(), filtering); - } else if (observedInventory.hasInventory() || observedTank.hasInventory()) { if (observedInventory.hasInventory()) { - + // Item inventory IItemHandler inv = observedInventory.getInventory(); if (invVersionTracker.stillWaiting(inv)) { occupied = prevLevel; totalSpace = 1f; - + } else { invVersionTracker.awaitNewVersion(inv); for (int slot = 0; slot < inv.getSlots(); slot++) { ItemStack stackInSlot = inv.getStackInSlot(slot); - int space = Math.min(stackInSlot.getMaxStackSize(), inv.getSlotLimit(slot)); + + int finalSlot = slot; + long space = COMPAT + .stream() + .filter(compat -> compat.isFromThisMod(targetBlockEntity)) + .map(compat -> compat.getSpaceInSlot(inv, finalSlot)) + .findFirst() + .orElseGet(() -> (long) Math.min(stackInSlot.getMaxStackSize(), inv.getSlotLimit(finalSlot))); + int count = stackInSlot.getCount(); if (space == 0) continue; - + totalSpace += 1; if (filtering.test(stackInSlot)) occupied += count * (1f / space); @@ -209,7 +223,7 @@ public class ThresholdSwitchBlockEntity extends SmartBlockEntity { this.updateCurrentLevel(); invVersionTracker.reset(); })); - + behaviours.add(invVersionTracker = new VersionedInventoryTrackerBehaviour(this)); InterfaceProvider towardBlockFacing = From 1722d4dda08ff5ed5a19c7f3816fa1ef2a996a58 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Mon, 15 Jul 2024 09:07:52 -0400 Subject: [PATCH 19/28] Total Ram info inside DebugInfo command (#6507) * add total ram available info to DebugInfo command * remove unused import --- .../infrastructure/debugInfo/DebugInformation.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/com/simibubi/create/infrastructure/debugInfo/DebugInformation.java b/src/main/java/com/simibubi/create/infrastructure/debugInfo/DebugInformation.java index ac34ab7b3..120392857 100644 --- a/src/main/java/com/simibubi/create/infrastructure/debugInfo/DebugInformation.java +++ b/src/main/java/com/simibubi/create/infrastructure/debugInfo/DebugInformation.java @@ -26,6 +26,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.ModList; import net.minecraftforge.forgespi.language.IModInfo; +import oshi.SystemInfo; /** * Allows for providing easily accessible debugging information. @@ -86,6 +87,7 @@ public class DebugInformation { .put("Java Version", SystemReportAccessor.getJAVA_VERSION()) .put("JVM Flags", getMcSystemInfo("JVM Flags")) .put("Memory", () -> getMcSystemInfo("Memory")) + .put("Total Memory", getTotalRam()) .put("CPU", getCpuInfo()) .putAll(listAllGraphicsCards()) .buildTo(DebugInformation::registerBothInfo); @@ -129,6 +131,13 @@ public class DebugInformation { return cards.isEmpty() ? List.of(new InfoEntry("Graphics cards", "none")) : cards; } + public static String getTotalRam() { + long availableMemory = new SystemInfo().getHardware().getMemory().getAvailable(); + long totalMemory = new SystemInfo().getHardware().getMemory().getTotal(); + long usedMemory = totalMemory - availableMemory; + return String.format("%s bytes (%s MiB) / %s bytes (%s MiB)", usedMemory, usedMemory / 1049000, totalMemory, totalMemory / 1049000); + } + public static String getCpuInfo() { String name = tryTrim(getMcSystemInfo("Processor Name")); String freq = getMcSystemInfo("Frequency (GHz)"); From 54f760feb1a9b48bfca220fc04d89fda854f42ed Mon Sep 17 00:00:00 2001 From: littlej541 Date: Mon, 15 Jul 2024 06:14:48 -0700 Subject: [PATCH 20/28] Goggles function in any curio slot (#6520) --- .../simibubi/create/compat/curios/Curios.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/simibubi/create/compat/curios/Curios.java b/src/main/java/com/simibubi/create/compat/curios/Curios.java index 97eea93e2..7adbb59be 100644 --- a/src/main/java/com/simibubi/create/compat/curios/Curios.java +++ b/src/main/java/com/simibubi/create/compat/curios/Curios.java @@ -43,13 +43,16 @@ public class Curios { modEventBus.addListener(Curios::onClientSetup); GogglesItem.addIsWearingPredicate(player -> resolveCuriosMap(player) - .map(curiosMap -> curiosMap.get("head")) - .map(stacksHandler -> { - // Check all the Head slots for Goggles existing - int slots = stacksHandler.getSlots(); - for (int slot = 0; slot < slots; slot++) - if (AllItems.GOGGLES.isIn(stacksHandler.getStacks().getStackInSlot(slot))) - return true; + .map(curiosMap -> { + for (ICurioStacksHandler stacksHandler : curiosMap.values()) { + // Search all the curio slots for Goggles existing + int slots = stacksHandler.getSlots(); + for (int slot = 0; slot < slots; slot++) { + if (AllItems.GOGGLES.isIn(stacksHandler.getStacks().getStackInSlot(slot))) { + return true; + } + } + } return false; }) From 15f426d9c67a0542c2486196f817604124d34c56 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 15 Jul 2024 16:17:28 +0200 Subject: [PATCH 21/28] Tag me back - Backtanks now keep track of item capability data in their placed block #6186 - Backtanks no longer ask for an unobtainable item when placed with a Schematicannon --- src/generated/resources/.cache/cache | 4 +- .../loot_tables/blocks/copper_backtank.json | 17 +--- .../blocks/netherite_backtank.json | 17 +--- .../equipment/armor/BacktankBlock.java | 92 ++++++++++++------- .../equipment/armor/BacktankBlockEntity.java | 66 +++++++------ .../foundation/data/BuilderTransformers.java | 7 +- 6 files changed, 99 insertions(+), 104 deletions(-) diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index e8b04142f..ab3d01d23 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -3329,7 +3329,7 @@ c2b075008849e152f20e8da946e89c9722325df6 data/create/loot_tables/blocks/content_ 69b4b25d7d271458177fbbaeba2c797daccc38a2 data/create/loot_tables/blocks/contraption_controls.json 28856dc862efc6bcc421d035d26386740458f868 data/create/loot_tables/blocks/controller_rail.json 2c2785e39e1891dff2c50cba93e814b56d935154 data/create/loot_tables/blocks/controls.json -830949a5dc64982392db2c1f651d2a9d0ff659a8 data/create/loot_tables/blocks/copper_backtank.json +ac15351000c44cf0924e8e3b3c6d92e3d54bb084 data/create/loot_tables/blocks/copper_backtank.json 6697e619d5c6dcb81aad4f5c88ba319d13665b35 data/create/loot_tables/blocks/copper_bars.json 8010db6b2427536c74312c85425b3ba83abc363c data/create/loot_tables/blocks/copper_casing.json ea5fb942c8dfb792daac538e09d286ac120aa199 data/create/loot_tables/blocks/copper_door.json @@ -3590,7 +3590,7 @@ afdff197c9d1a6940e988c00435135f9705fd0e5 data/create/loot_tables/blocks/metal_gi b83a90fbe83906b171fc0de6bdc2d9aa3a8c542e data/create/loot_tables/blocks/millstone.json 5c1df8443043b3fe3b665dba348e2ff188bcbe31 data/create/loot_tables/blocks/minecart_anchor.json 1e73d28fdd2e54910074aeadbe5617425a8ae656 data/create/loot_tables/blocks/mysterious_cuckoo_clock.json -9be92bab82bc1e83533f1d4679b09bd0513b07eb data/create/loot_tables/blocks/netherite_backtank.json +188de41337119f55117c48eeb8d31cdf12cebd76 data/create/loot_tables/blocks/netherite_backtank.json 2e21a06c0d671e543bffecb0b67d97b51fa83ddc data/create/loot_tables/blocks/nixie_tube.json f6b4095a518a01081f3663d7268d67063bdb44ee data/create/loot_tables/blocks/nozzle.json d378be8f13fc7ed625813eae3a50b68e8706a297 data/create/loot_tables/blocks/oak_window.json diff --git a/src/generated/resources/data/create/loot_tables/blocks/copper_backtank.json b/src/generated/resources/data/create/loot_tables/blocks/copper_backtank.json index 2ae4e172a..f06a7a321 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/copper_backtank.json +++ b/src/generated/resources/data/create/loot_tables/blocks/copper_backtank.json @@ -13,16 +13,12 @@ "source": "block_entity", "ops": [ { - "source": "FullNBT", + "source": "VanillaTag", "target": "{}", "op": "merge" } ] }, - { - "function": "minecraft:copy_name", - "source": "block_entity" - }, { "function": "minecraft:copy_nbt", "source": "block_entity", @@ -33,17 +29,6 @@ "op": "replace" } ] - }, - { - "function": "minecraft:copy_nbt", - "source": "block_entity", - "ops": [ - { - "source": "Enchantments", - "target": "Enchantments", - "op": "replace" - } - ] } ], "name": "create:copper_backtank" diff --git a/src/generated/resources/data/create/loot_tables/blocks/netherite_backtank.json b/src/generated/resources/data/create/loot_tables/blocks/netherite_backtank.json index dde8be2fa..337fb1e51 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/netherite_backtank.json +++ b/src/generated/resources/data/create/loot_tables/blocks/netherite_backtank.json @@ -13,16 +13,12 @@ "source": "block_entity", "ops": [ { - "source": "FullNBT", + "source": "VanillaTag", "target": "{}", "op": "merge" } ] }, - { - "function": "minecraft:copy_name", - "source": "block_entity" - }, { "function": "minecraft:copy_nbt", "source": "block_entity", @@ -33,17 +29,6 @@ "op": "replace" } ] - }, - { - "function": "minecraft:copy_nbt", - "source": "block_entity", - "ops": [ - { - "source": "Enchantments", - "target": "Enchantments", - "op": "replace" - } - ] } ], "name": "create:netherite_backtank" diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlock.java b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlock.java index aa07e001f..62f78e3c8 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlock.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlock.java @@ -1,11 +1,15 @@ package com.simibubi.create.content.equipment.armor; +import java.util.List; import java.util.Optional; import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.AllEnchantments; import com.simibubi.create.AllShapes; import com.simibubi.create.content.kinetics.base.HorizontalKineticBlock; +import com.simibubi.create.content.schematics.requirement.ISpecialBlockItemRequirement; +import com.simibubi.create.content.schematics.requirement.ItemRequirement; +import com.simibubi.create.content.schematics.requirement.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.block.IBE; import net.minecraft.core.BlockPos; @@ -13,8 +17,6 @@ import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.network.chat.Component; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; @@ -34,6 +36,7 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition.Builder; @@ -41,13 +44,14 @@ import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Fluids; import net.minecraft.world.level.pathfinder.PathComputationType; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.common.util.FakePlayer; -public class BacktankBlock extends HorizontalKineticBlock - implements IBE, SimpleWaterloggedBlock { +public class BacktankBlock extends HorizontalKineticBlock implements IBE, SimpleWaterloggedBlock, ISpecialBlockItemRequirement { public BacktankBlock(Properties properties) { super(properties); @@ -81,8 +85,8 @@ public class BacktankBlock extends HorizontalKineticBlock } @Override - public BlockState updateShape(BlockState state, Direction direction, BlockState neighbourState, - LevelAccessor world, BlockPos pos, BlockPos neighbourPos) { + public BlockState updateShape(BlockState state, Direction direction, BlockState neighbourState, LevelAccessor world, + BlockPos pos, BlockPos neighbourPos) { if (state.getValue(BlockStateProperties.WATERLOGGED)) world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); return state; @@ -114,17 +118,46 @@ public class BacktankBlock extends HorizontalKineticBlock if (stack == null) return; withBlockEntityDo(worldIn, pos, be -> { - be.setCapacityEnchantLevel(EnchantmentHelper.getItemEnchantmentLevel(AllEnchantments.CAPACITY.get(), stack)); - be.setAirLevel(stack.getOrCreateTag() - .getInt("Air")); - if (stack.isEnchanted()) - be.setEnchantmentTag(stack.getEnchantmentTags()); + be.setCapacityEnchantLevel( + EnchantmentHelper.getItemEnchantmentLevel(AllEnchantments.CAPACITY.get(), stack)); + CompoundTag vanillaTag = stack.getOrCreateTag(); + be.setAirLevel(vanillaTag.getInt("Air")); if (stack.hasCustomHoverName()) be.setCustomName(stack.getHoverName()); - be.setFullNbt(stack.getOrCreateTag()); + + CompoundTag nbt = stack.serializeNBT(); + CompoundTag forgeCapsTag = nbt.contains("ForgeCaps") ? nbt.getCompound("ForgeCaps") : null; + be.setTags(vanillaTag, forgeCapsTag); }); } + @Override + @SuppressWarnings("deprecation") + // Re-adding ForgeCaps to item here as there is no loot function that can modify + // outside of the vanilla tag + public List getDrops(BlockState pState, LootContext.Builder pBuilder) { + List lootDrops = super.getDrops(pState, pBuilder); + + BlockEntity blockEntity = pBuilder.getOptionalParameter(LootContextParams.BLOCK_ENTITY); + if (!(blockEntity instanceof BacktankBlockEntity bbe)) + return lootDrops; + + CompoundTag forgeCapsTag = bbe.getForgeCapsTag(); + if (forgeCapsTag == null) + return lootDrops; + + return lootDrops.stream() + .map(stack -> { + if (!(stack.getItem() instanceof BacktankItem)) + return stack; + + ItemStack modifiedStack = new ItemStack(stack.getItem(), stack.getCount(), forgeCapsTag.copy()); + modifiedStack.setTag(stack.getTag()); + return modifiedStack; + }) + .toList(); + } + @Override public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { @@ -151,32 +184,21 @@ public class BacktankBlock extends HorizontalKineticBlock @Override public ItemStack getCloneItemStack(BlockGetter blockGetter, BlockPos pos, BlockState state) { Item item = asItem(); - if (item instanceof BacktankItem.BacktankBlockItem placeable) { + if (item instanceof BacktankItem.BacktankBlockItem placeable) item = placeable.getActualItem(); - } - ItemStack stack = new ItemStack(item); Optional blockEntityOptional = getBlockEntityOptional(blockGetter, pos); - CompoundTag tag = blockEntityOptional.map(BacktankBlockEntity::getFullNbt).orElse(stack.getOrCreateTag()); - + CompoundTag forgeCapsTag = blockEntityOptional.map(BacktankBlockEntity::getForgeCapsTag) + .orElse(null); + CompoundTag vanillaTag = blockEntityOptional.map(BacktankBlockEntity::getVanillaTag) + .orElse(new CompoundTag()); int air = blockEntityOptional.map(BacktankBlockEntity::getAirLevel) .orElse(0); - tag.putInt("Air", air); - ListTag enchants = blockEntityOptional.map(BacktankBlockEntity::getEnchantmentTag) - .orElse(new ListTag()); - if (!enchants.isEmpty()) { - ListTag enchantmentTagList = stack.getEnchantmentTags(); - enchantmentTagList.addAll(enchants); - tag.put("Enchantments", enchantmentTagList); - } - - Component customName = blockEntityOptional.map(BacktankBlockEntity::getCustomName) - .orElse(null); - if (customName != null) - stack.setHoverName(customName); - stack.setTag(tag); + ItemStack stack = new ItemStack(item, 1, forgeCapsTag); + vanillaTag.putInt("Air", air); + stack.setTag(vanillaTag); return stack; } @@ -201,4 +223,12 @@ public class BacktankBlock extends HorizontalKineticBlock return false; } + @Override + public ItemRequirement getRequiredItems(BlockState state, BlockEntity blockEntity) { + Item item = asItem(); + if (item instanceof BacktankItem.BacktankBlockItem placeable) + item = placeable.getActualItem(); + return new ItemRequirement(ItemUseType.CONSUME, item); + } + } diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlockEntity.java b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlockEntity.java index cca4eda3f..181e5b1bb 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/BacktankBlockEntity.java @@ -2,6 +2,8 @@ package com.simibubi.create.content.equipment.armor; import java.util.List; +import javax.annotation.Nullable; + import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllSoundEvents; @@ -16,8 +18,6 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction.Axis; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; import net.minecraft.world.Nameable; @@ -35,23 +35,25 @@ public class BacktankBlockEntity extends KineticBlockEntity implements Nameable private Component customName; private int capacityEnchantLevel; - private ListTag enchantmentTag; - private CompoundTag fullNbt; + private CompoundTag vanillaTag; + private CompoundTag forgeCapsTag; public BacktankBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); defaultName = getDefaultName(state); - enchantmentTag = new ListTag(); - fullNbt = new CompoundTag(); + vanillaTag = new CompoundTag(); + forgeCapsTag = null; } public static Component getDefaultName(BlockState state) { if (AllBlocks.NETHERITE_BACKTANK.has(state)) { - AllItems.NETHERITE_BACKTANK.get().getDescription(); + AllItems.NETHERITE_BACKTANK.get() + .getDescription(); } - return AllItems.COPPER_BACKTANK.get().getDescription(); + return AllItems.COPPER_BACKTANK.get() + .getDescription(); } @Override @@ -118,23 +120,29 @@ public class BacktankBlockEntity extends KineticBlockEntity implements Nameable compound.putInt("Air", airLevel); compound.putInt("Timer", airLevelTimer); compound.putInt("CapacityEnchantment", capacityEnchantLevel); + if (this.customName != null) compound.putString("CustomName", Component.Serializer.toJson(this.customName)); - compound.put("Enchantments", enchantmentTag); - compound.put("FullNBT", fullNbt); + + compound.put("VanillaTag", vanillaTag); + if (forgeCapsTag != null) + compound.put("ForgeCapsTag", forgeCapsTag); } @Override protected void read(CompoundTag compound, boolean clientPacket) { super.read(compound, clientPacket); int prev = airLevel; - capacityEnchantLevel = compound.getInt("CapacityEnchantment"); airLevel = compound.getInt("Air"); airLevelTimer = compound.getInt("Timer"); - enchantmentTag = compound.getList("Enchantments", Tag.TAG_COMPOUND); - this.fullNbt = compound.getCompound("FullNBT"); + capacityEnchantLevel = compound.getInt("CapacityEnchantment"); + if (compound.contains("CustomName", 8)) this.customName = Component.Serializer.fromJson(compound.getString("CustomName")); + + vanillaTag = compound.getCompound("VanillaTag"); + forgeCapsTag = compound.contains("ForgeCapsTag") ? compound.getCompound("ForgeCapsTag") : null; + if (prev != 0 && prev != airLevel && airLevel == BacktankUtil.maxAir(capacityEnchantLevel) && clientPacket) playFilledEffect(); } @@ -154,8 +162,7 @@ public class BacktankBlockEntity extends KineticBlockEntity implements Nameable @Override public Component getName() { - return this.customName != null ? this.customName - : defaultName; + return this.customName != null ? this.customName : defaultName; } public int getAirLevel() { @@ -171,30 +178,21 @@ public class BacktankBlockEntity extends KineticBlockEntity implements Nameable this.customName = customName; } - public Component getCustomName() { - return customName; - } - - public ListTag getEnchantmentTag() { - return enchantmentTag; - } - - public void setEnchantmentTag(ListTag enchantmentTag) { - this.enchantmentTag = enchantmentTag; - } - public void setCapacityEnchantLevel(int capacityEnchantLevel) { this.capacityEnchantLevel = capacityEnchantLevel; } - - public CompoundTag getFullNbt() - { - return fullNbt; + + public void setTags(CompoundTag vanillaTag, @Nullable CompoundTag forgeCapsTag) { + this.vanillaTag = vanillaTag; + this.forgeCapsTag = forgeCapsTag; } - public void setFullNbt(CompoundTag fullNbt) - { - this.fullNbt = fullNbt; + public CompoundTag getVanillaTag() { + return vanillaTag; + } + + public CompoundTag getForgeCapsTag() { + return forgeCapsTag; } } diff --git a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java index 0a7148cf2..b985cfbb4 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java +++ b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java @@ -435,13 +435,10 @@ public class BuilderTransformers { .when(survivesExplosion) .setRolls(ConstantValue.exactly(1)) .add(LootItem.lootTableItem(drop.get()) - .apply(CopyNbtFunction.copyData(ContextNbtProvider.BLOCK_ENTITY) - .copy("FullNBT", "{}", CopyNbtFunction.MergeStrategy.MERGE)) - .apply(CopyNameFunction.copyName(CopyNameFunction.NameSource.BLOCK_ENTITY)) .apply(CopyNbtFunction.copyData(ContextNbtProvider.BLOCK_ENTITY) - .copy("Air", "Air")) + .copy("VanillaTag", "{}", CopyNbtFunction.MergeStrategy.MERGE)) .apply(CopyNbtFunction.copyData(ContextNbtProvider.BLOCK_ENTITY) - .copy("Enchantments", "Enchantments"))))); + .copy("Air", "Air"))))); }); } From 9703417f1c7acb64acf3a36147d3df9042e6a794 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 15 Jul 2024 16:50:17 +0200 Subject: [PATCH 22/28] Funnels in motion revisited - Fixed andesite funnels dropping full stacks when used in a moving contraption (PR #6602 by cshcrafter) --- .../content/logistics/funnel/FunnelMovementBehaviour.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelMovementBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelMovementBehaviour.java index 9b461c5f9..69e417134 100644 --- a/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/funnel/FunnelMovementBehaviour.java @@ -74,8 +74,7 @@ public class FunnelMovementBehaviour implements MovementBehaviour { FilterItemStack filter = context.getFilterFromBE(); int filterAmount = context.blockEntityData.getInt("FilterAmount"); boolean upTo = context.blockEntityData.getBoolean("UpTo"); - if (filterAmount <= 0) - filterAmount = hasFilter ? 64 : 1; + filterAmount = hasFilter ? filterAmount : 1; ItemStack extract = ItemHelper.extract(context.contraption.getSharedInventory(), s -> filter.test(world, s), From a5dc53ba5f2618515b76dec62bb8b34275c0f445 Mon Sep 17 00:00:00 2001 From: attackeight <71084901+Attack8@users.noreply.github.com> Date: Mon, 15 Jul 2024 11:14:56 -0400 Subject: [PATCH 23/28] Goggle Tooltip code cleanup and ModernUI compat (#6477) * Goggle Tooltip code cleanup and ModernUI compat fixes Creators-of-Create#6404 * Calculate indents based on font thanks @Tidy-Bear * exactPositioning workaround --------- Co-authored-by: zelophed --- build.gradle | 1 + .../java/com/simibubi/create/compat/Mods.java | 3 +- .../IDisplayAssemblyExceptions.java | 8 ++-- .../elevator/ElevatorContactEditPacket.java | 4 +- .../steamWhistle/WhistleBlockEntity.java | 3 +- .../goggles/GoggleOverlayRenderer.java | 47 ++++++++++++++++--- .../content/fluids/tank/BoilerData.java | 17 ++----- .../kinetics/gauge/GaugeBlockEntity.java | 2 +- .../tunnel/BrassTunnelBlockEntity.java | 17 ++----- .../analogLever/AnalogLeverBlockEntity.java | 2 +- .../create/foundation/item/TooltipHelper.java | 11 ++--- .../mixin/accessor/MouseHandlerAccessor.java | 16 +++++++ .../foundation/utility/LangBuilder.java | 34 ++++++++++---- src/main/resources/create.mixins.json | 1 + 14 files changed, 105 insertions(+), 61 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/mixin/accessor/MouseHandlerAccessor.java diff --git a/build.gradle b/build.gradle index c96b7f2ca..ca4685191 100644 --- a/build.gradle +++ b/build.gradle @@ -207,6 +207,7 @@ dependencies { // runtimeOnly fg.deobf("maven.modrinth:spark:1.10.38-forge") //runtimeOnly fg.deobf("curse.maven:forbidden-arcanus-309858:4729924") //runtimeOnly fg.deobf("curse.maven:valhelsia-core-416935:3886212") + // implementation fg.deobf("curse.maven:modern-ui-352491:5229350") // runtimeOnly fg.deobf("curse.maven:sophisticated-storage-619320:5194748") // runtimeOnly fg.deobf("curse.maven:sophisticated-core-618298:5296312") // runtimeOnly fg.deobf("curse.maven:functional-storage-556861:5271589") diff --git a/src/main/java/com/simibubi/create/compat/Mods.java b/src/main/java/com/simibubi/create/compat/Mods.java index 710df10b2..105256b58 100644 --- a/src/main/java/com/simibubi/create/compat/Mods.java +++ b/src/main/java/com/simibubi/create/compat/Mods.java @@ -25,7 +25,8 @@ public enum Mods { SOPHISTICATEDSTORAGE, STORAGEDRAWERS, TCONSTRUCT, - XLPACKETS; + XLPACKETS, + MODERNUI; private final String id; diff --git a/src/main/java/com/simibubi/create/content/contraptions/IDisplayAssemblyExceptions.java b/src/main/java/com/simibubi/create/content/contraptions/IDisplayAssemblyExceptions.java index c99054f41..983f67c37 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/IDisplayAssemblyExceptions.java +++ b/src/main/java/com/simibubi/create/content/contraptions/IDisplayAssemblyExceptions.java @@ -22,15 +22,13 @@ public interface IDisplayAssemblyExceptions { if (!tooltip.isEmpty()) tooltip.add(Components.immutableEmpty()); - tooltip.add(IHaveGoggleInformation.componentSpacing.plainCopy() - .append(Lang.translateDirect("gui.assembly.exception") - .withStyle(ChatFormatting.GOLD))); + Lang.translate("gui.assembly.exception").style(ChatFormatting.GOLD) + .forGoggles(tooltip); String text = e.component.getString(); Arrays.stream(text.split("\n")) .forEach(l -> TooltipHelper.cutStringTextComponent(l, Palette.GRAY_AND_WHITE) - .forEach(c -> tooltip.add(IHaveGoggleInformation.componentSpacing.plainCopy() - .append(c)))); + .forEach(c -> Lang.text(c.getString()).forGoggles(tooltip))); return true; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorContactEditPacket.java b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorContactEditPacket.java index 81d331d54..2a8a4487d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorContactEditPacket.java +++ b/src/main/java/com/simibubi/create/content/contraptions/elevator/ElevatorContactEditPacket.java @@ -27,14 +27,14 @@ public class ElevatorContactEditPacket extends BlockEntityConfigurationPacket tooltip, boolean isPlayerSneaking) { - tooltip.add(componentSpacing.plainCopy().append(Lang.translateDirect("gui.gauge.info_header"))); + Lang.translate("gui.gauge.info_header").forGoggles(tooltip); return true; } diff --git a/src/main/java/com/simibubi/create/content/logistics/tunnel/BrassTunnelBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/tunnel/BrassTunnelBlockEntity.java index b2f248fea..3fe40f41d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tunnel/BrassTunnelBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/tunnel/BrassTunnelBlockEntity.java @@ -784,20 +784,13 @@ public class BrassTunnelBlockEntity extends BeltTunnelBlockEntity implements IHa if (allStacks.isEmpty()) return false; - tooltip.add(componentSpacing.plainCopy() - .append(Lang.translateDirect("tooltip.brass_tunnel.contains")) - .withStyle(ChatFormatting.WHITE)); + Lang.translate("tooltip.brass_tunnel.contains").style(ChatFormatting.WHITE).forGoggles(tooltip); for (ItemStack item : allStacks) { - tooltip.add(componentSpacing.plainCopy() - .append(Lang.translateDirect("tooltip.brass_tunnel.contains_entry", - Components.translatable(item.getDescriptionId()) - .getString(), - item.getCount())) - .withStyle(ChatFormatting.GRAY)); + Lang.translate("tooltip.brass_tunnel.contains_entry", + Components.translatable(item.getDescriptionId()).getString(), item.getCount()) + .style(ChatFormatting.GRAY).forGoggles(tooltip); } - tooltip.add(componentSpacing.plainCopy() - .append(Lang.translateDirect("tooltip.brass_tunnel.retrieve")) - .withStyle(ChatFormatting.DARK_GRAY)); + Lang.translate("tooltip.brass_tunnel.retrieve").style(ChatFormatting.DARK_GRAY).forGoggles(tooltip); return true; } diff --git a/src/main/java/com/simibubi/create/content/redstone/analogLever/AnalogLeverBlockEntity.java b/src/main/java/com/simibubi/create/content/redstone/analogLever/AnalogLeverBlockEntity.java index 3902009ff..53b0c6b83 100644 --- a/src/main/java/com/simibubi/create/content/redstone/analogLever/AnalogLeverBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/redstone/analogLever/AnalogLeverBlockEntity.java @@ -79,7 +79,7 @@ public class AnalogLeverBlockEntity extends SmartBlockEntity implements IHaveGog @Override public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { - tooltip.add(componentSpacing.plainCopy().append(Lang.translateDirect("tooltip.analogStrength", this.state))); + Lang.translate("tooltip.analogStrength", this.state).forGoggles(tooltip); return true; } diff --git a/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java b/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java index af1adfc9d..e5da669a1 100644 --- a/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java +++ b/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java @@ -6,7 +6,6 @@ import java.util.LinkedList; import java.util.List; import com.google.common.base.Strings; -import com.simibubi.create.content.equipment.goggles.IHaveGoggleInformation; import com.simibubi.create.foundation.utility.Components; import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.Lang; @@ -30,15 +29,11 @@ public class TooltipHelper { } public static void addHint(List tooltip, String hintKey, Object... messageParams) { - Component spacing = IHaveGoggleInformation.componentSpacing; - tooltip.add(spacing.plainCopy() - .append(Lang.translateDirect(hintKey + ".title")) - .withStyle(ChatFormatting.GOLD)); + Lang.translate(hintKey + ".title").style(ChatFormatting.GOLD).forGoggles(tooltip); Component hint = Lang.translateDirect(hintKey); List cutComponent = cutTextComponent(hint, Palette.GRAY_AND_WHITE); for (Component component : cutComponent) - tooltip.add(spacing.plainCopy() - .append(component)); + Lang.text(component.getString()).forGoggles(tooltip); } public static String makeProgressBar(int length, int filledLength) { @@ -54,7 +49,7 @@ public class TooltipHelper { public static Style styleFromColor(ChatFormatting color) { return Style.EMPTY.applyFormat(color); } - + public static Style styleFromColor(int hex) { return Style.EMPTY.withColor(hex); } diff --git a/src/main/java/com/simibubi/create/foundation/mixin/accessor/MouseHandlerAccessor.java b/src/main/java/com/simibubi/create/foundation/mixin/accessor/MouseHandlerAccessor.java new file mode 100644 index 000000000..d837c06f0 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/mixin/accessor/MouseHandlerAccessor.java @@ -0,0 +1,16 @@ +package com.simibubi.create.foundation.mixin.accessor; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import net.minecraft.client.MouseHandler; + +@Mixin(MouseHandler.class) +public interface MouseHandlerAccessor { + + @Accessor("xpos") + void create$setXPos(double xPos); + + @Accessor("ypos") + void create$setYPos(double yPos); +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/LangBuilder.java b/src/main/java/com/simibubi/create/foundation/utility/LangBuilder.java index 564b6131f..161f52dd4 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/LangBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/utility/LangBuilder.java @@ -2,10 +2,15 @@ package com.simibubi.create.foundation.utility; import java.util.List; +import com.simibubi.create.compat.Mods; + import joptsimple.internal.Strings; import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; +import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Player; public class LangBuilder { @@ -29,7 +34,7 @@ public class LangBuilder { * Appends a localised component
* To add an independently formatted localised component, use add() and a nested * builder - * + * * @param langKey * @param args * @return @@ -40,7 +45,7 @@ public class LangBuilder { /** * Appends a text component - * + * * @param literalText * @return */ @@ -50,7 +55,7 @@ public class LangBuilder { /** * Appends a colored text component - * + * * @param format * @param literalText * @return @@ -61,7 +66,7 @@ public class LangBuilder { /** * Appends a colored text component - * + * * @param color * @param literalText * @return @@ -72,7 +77,7 @@ public class LangBuilder { /** * Appends the contents of another builder - * + * * @param otherBuilder * @return */ @@ -82,7 +87,7 @@ public class LangBuilder { /** * Appends a component - * + * * @param customComponent * @return */ @@ -95,7 +100,7 @@ public class LangBuilder { /** * Applies the format to all added components - * + * * @param format * @return */ @@ -107,7 +112,7 @@ public class LangBuilder { /** * Applies the color to all added components - * + * * @param color * @return */ @@ -150,11 +155,20 @@ public class LangBuilder { public void forGoggles(List tooltip, int indents) { tooltip.add(Lang.builder() - .text(Strings.repeat(' ', 4 + indents)) + .text(Strings.repeat(' ', getIndents(Minecraft.getInstance().font, 4 + indents))) .add(this) .component()); } + public static final float DEFAULT_SPACE_WIDTH = 4.0F; // space width in vanilla's default font + static int getIndents(Font font, int defaultIndents) { + int spaceWidth = font.width(" "); + if (DEFAULT_SPACE_WIDTH == spaceWidth) { + return defaultIndents; + } + return Mth.ceil(DEFAULT_SPACE_WIDTH * defaultIndents / spaceWidth); + } + // private void assertComponent() { @@ -162,4 +176,4 @@ public class LangBuilder { throw new IllegalStateException("No components were added to builder"); } -} \ No newline at end of file +} diff --git a/src/main/resources/create.mixins.json b/src/main/resources/create.mixins.json index 63c44c55f..a434994ce 100644 --- a/src/main/resources/create.mixins.json +++ b/src/main/resources/create.mixins.json @@ -29,6 +29,7 @@ "accessor.AgeableListModelAccessor", "accessor.GameRendererAccessor", "accessor.HumanoidArmorLayerAccessor", + "accessor.MouseHandlerAccessor", "accessor.ParticleEngineAccessor", "client.BlockDestructionProgressMixin", "client.CameraMixin", From 08b5515068a469079e374860ef5b2f2af5ecdd33 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 16 Jul 2024 12:37:02 +0200 Subject: [PATCH 24/28] Less drains More - Partially filled water cauldrons can no longer be drained by fluid pipes #6506 #6505 - Fixed forge capabilities on modded cauldron blocks getting ignored (?) --- .../create/content/fluids/FluidPropagator.java | 2 +- .../content/fluids/pipes/FluidPipeBlock.java | 2 +- .../fluids/pipes/VanillaFluidTargets.java | 16 +++++++++++----- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/fluids/FluidPropagator.java b/src/main/java/com/simibubi/create/content/fluids/FluidPropagator.java index bad5e0007..b5811a2eb 100644 --- a/src/main/java/com/simibubi/create/content/fluids/FluidPropagator.java +++ b/src/main/java/com/simibubi/create/content/fluids/FluidPropagator.java @@ -174,7 +174,7 @@ public class FluidPropagator { if (PumpBlock.isPump(connectedState) && connectedState.getValue(PumpBlock.FACING) .getAxis() == side.getAxis()) return false; - if (VanillaFluidTargets.shouldPipesConnectTo(connectedState)) + if (VanillaFluidTargets.canProvideFluidWithoutCapability(connectedState)) return true; if (BlockHelper.hasBlockSolidSide(connectedState, reader, connectedPos, side.getOpposite()) && !AllBlockTags.FAN_TRANSPARENT.matches(connectedState)) diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlock.java b/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlock.java index 17a3b5280..c505b3c71 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/FluidPipeBlock.java @@ -183,7 +183,7 @@ public class FluidPipeBlock extends PipeBlock implements SimpleWaterloggedBlock, Direction direction) { if (FluidPropagator.hasFluidCapability(world, neighbourPos, direction.getOpposite())) return true; - if (VanillaFluidTargets.shouldPipesConnectTo(neighbour)) + if (VanillaFluidTargets.canProvideFluidWithoutCapability(neighbour)) return true; FluidTransportBehaviour transport = BlockEntityBehaviour.get(world, neighbourPos, FluidTransportBehaviour.TYPE); BracketedBlockEntityBehaviour bracket = diff --git a/src/main/java/com/simibubi/create/content/fluids/pipes/VanillaFluidTargets.java b/src/main/java/com/simibubi/create/content/fluids/pipes/VanillaFluidTargets.java index d971b9b66..a20a4e786 100644 --- a/src/main/java/com/simibubi/create/content/fluids/pipes/VanillaFluidTargets.java +++ b/src/main/java/com/simibubi/create/content/fluids/pipes/VanillaFluidTargets.java @@ -5,9 +5,9 @@ import static net.minecraft.world.level.block.state.properties.BlockStatePropert import com.simibubi.create.AllFluids; import net.minecraft.core.BlockPos; -import net.minecraft.tags.BlockTags; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.LayeredCauldronBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.material.Fluids; @@ -15,10 +15,14 @@ import net.minecraftforge.fluids.FluidStack; public class VanillaFluidTargets { - public static boolean shouldPipesConnectTo(BlockState state) { + public static boolean canProvideFluidWithoutCapability(BlockState state) { if (state.hasProperty(BlockStateProperties.LEVEL_HONEY)) return true; - if (state.is(BlockTags.CAULDRONS)) + if (state.is(Blocks.CAULDRON)) + return true; + if (state.is(Blocks.LAVA_CAULDRON)) + return true; + if (state.is(Blocks.WATER_CAULDRON)) return true; return false; } @@ -31,13 +35,15 @@ public class VanillaFluidTargets { .getSource(), 250); } - if (state.getBlock() == Blocks.LAVA_CAULDRON) { + if (state.is(Blocks.LAVA_CAULDRON)) { if (!simulate) level.setBlock(pos, Blocks.CAULDRON.defaultBlockState(), 3); return new FluidStack(Fluids.LAVA, 1000); } - if (state.getBlock() == Blocks.WATER_CAULDRON) { + if (state.is(Blocks.WATER_CAULDRON) && state.getBlock() instanceof LayeredCauldronBlock lcb) { + if (!lcb.isFull(state)) + return FluidStack.EMPTY; if (!simulate) level.setBlock(pos, Blocks.CAULDRON.defaultBlockState(), 3); return new FluidStack(Fluids.WATER, 1000); From 127724b23fa7b29ba8ca3b112235b20769097200 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 16 Jul 2024 13:25:04 +0200 Subject: [PATCH 25/28] Update BlockStressDefaults to use thread-safe maps #6579 by ByThePowerOfScience --- .../create/content/kinetics/BlockStressDefaults.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/kinetics/BlockStressDefaults.java b/src/main/java/com/simibubi/create/content/kinetics/BlockStressDefaults.java index 16fb0cd2e..3b1db16a8 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/BlockStressDefaults.java +++ b/src/main/java/com/simibubi/create/content/kinetics/BlockStressDefaults.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.kinetics; -import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; import com.simibubi.create.foundation.utility.Couple; @@ -20,9 +20,9 @@ public class BlockStressDefaults { */ public static final int FORCED_UPDATE_VERSION = 2; - public static final Map DEFAULT_IMPACTS = new HashMap<>(); - public static final Map DEFAULT_CAPACITIES = new HashMap<>(); - public static final Map>> GENERATOR_SPEEDS = new HashMap<>(); + public static final Map DEFAULT_IMPACTS = new ConcurrentHashMap<>(); + public static final Map DEFAULT_CAPACITIES = new ConcurrentHashMap<>(); + public static final Map>> GENERATOR_SPEEDS = new ConcurrentHashMap<>(); public static void setDefaultImpact(ResourceLocation blockId, double impact) { DEFAULT_IMPACTS.put(blockId, impact); From 00e919b6c7d13065e394561410dab8873091e5cf Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 16 Jul 2024 16:15:36 +0200 Subject: [PATCH 26/28] Unusual Crafting - Fixed crash with JEI when a modded crafting recipe has an inconsistent ingredient list #6368 #6494 --- .../category/MechanicalCraftingCategory.java | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/simibubi/create/compat/jei/category/MechanicalCraftingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/MechanicalCraftingCategory.java index 33e0c5239..334c065dd 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/MechanicalCraftingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/MechanicalCraftingCategory.java @@ -99,16 +99,21 @@ public class MechanicalCraftingCategory extends CreateRecipeCategory= recipe.getIngredients() + .size()) + break; + if (recipe.getIngredients() + .get(pIndex) + .isEmpty()) + continue; + matrixStack.pushPose(); + matrixStack.translate(col * 19 * scale, row * 19 * scale, 0); + matrixStack.scale(scale, scale, scale); + AllGuiTextures.JEI_SLOT.render(matrixStack, 0, 0); + matrixStack.popPose(); + } matrixStack.popPose(); From 661e5c5aef650f9059d6a63447ef2de93da5a8d6 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 16 Jul 2024 17:43:48 +0200 Subject: [PATCH 27/28] Baiting the hotfix - Fixed basin inventory pretending to accept full stacks when empty #3104 - Fixed basin spout outputs getting voided when targeting another basin #6451 #6474 - Fixed basin spout outputs not working when targeting a basin with a recipe filter --- .../behaviour/FenceGateMovingInteraction.java | 1 - .../processing/basin/BasinBlockEntity.java | 28 +++++++++++++------ .../processing/basin/BasinInventory.java | 21 +++++++++++--- .../content/processing/basin/BasinRecipe.java | 15 ++++++++-- 4 files changed, 48 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/behaviour/FenceGateMovingInteraction.java b/src/main/java/com/simibubi/create/content/contraptions/behaviour/FenceGateMovingInteraction.java index 95510d99a..340dc0b56 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/behaviour/FenceGateMovingInteraction.java +++ b/src/main/java/com/simibubi/create/content/contraptions/behaviour/FenceGateMovingInteraction.java @@ -7,7 +7,6 @@ import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.FenceGateBlock; -import net.minecraft.world.level.block.TrapDoorBlock; import net.minecraft.world.level.block.state.BlockState; public class FenceGateMovingInteraction extends SimpleBlockMovingInteraction { diff --git a/src/main/java/com/simibubi/create/content/processing/basin/BasinBlockEntity.java b/src/main/java/com/simibubi/create/content/processing/basin/BasinBlockEntity.java index 9d82d5ce4..ee4292c77 100644 --- a/src/main/java/com/simibubi/create/content/processing/basin/BasinBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/processing/basin/BasinBlockEntity.java @@ -380,6 +380,9 @@ public class BasinBlockEntity extends SmartBlockEntity implements IHaveGoggleInf inserter = BlockEntityBehaviour.get(level, be.getBlockPos(), InvManipulationBehaviour.TYPE); } + if (be instanceof BasinBlockEntity) + filter = null; // Do not test spout outputs against the recipe filter + IItemHandler targetInv = be == null ? null : be.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, direction.getOpposite()) .orElse(inserter == null ? null : inserter.getInventory()); @@ -402,16 +405,21 @@ public class BasinBlockEntity extends SmartBlockEntity implements IHaveGoggleInf if (targetInv == null) break; - if (!ItemHandlerHelper.insertItemStacked(targetInv, itemStack, true) - .isEmpty()) + + ItemStack remainder = ItemHandlerHelper.insertItemStacked(targetInv, itemStack, true); + if (remainder.getCount() == itemStack.getCount()) continue; if (filter != null && !filter.test(itemStack)) continue; - update = true; - ItemHandlerHelper.insertItemStacked(targetInv, itemStack.copy(), false); - iterator.remove(); visualizedOutputItems.add(IntAttached.withZero(itemStack)); + update = true; + + remainder = ItemHandlerHelper.insertItemStacked(targetInv, itemStack.copy(), false); + if (remainder.isEmpty()) + iterator.remove(); + else + itemStack.setCount(remainder.getCount()); } for (Iterator iterator = spoutputFluidBuffer.iterator(); iterator.hasNext();) { @@ -547,9 +555,9 @@ public class BasinBlockEntity extends SmartBlockEntity implements IHaveGoggleInf if (simulate) return true; - for (ItemStack itemStack : outputItems) { - spoutputBuffer.add(itemStack.copy()); - } + for (ItemStack itemStack : outputItems) + if (!itemStack.isEmpty()) + spoutputBuffer.add(itemStack.copy()); if (!externalTankNotPresent) for (FluidStack fluidStack : outputFluids) spoutputFluidBuffer.add(fluidStack.copy()); @@ -604,7 +612,9 @@ public class BasinBlockEntity extends SmartBlockEntity implements IHaveGoggleInf public static HeatLevel getHeatLevelOf(BlockState state) { if (state.hasProperty(BlazeBurnerBlock.HEAT_LEVEL)) return state.getValue(BlazeBurnerBlock.HEAT_LEVEL); - return AllTags.AllBlockTags.PASSIVE_BOILER_HEATERS.matches(state) && BlockHelper.isNotUnheated(state) ? HeatLevel.SMOULDERING : HeatLevel.NONE; + return AllTags.AllBlockTags.PASSIVE_BOILER_HEATERS.matches(state) && BlockHelper.isNotUnheated(state) + ? HeatLevel.SMOULDERING + : HeatLevel.NONE; } public Couple getTanks() { diff --git a/src/main/java/com/simibubi/create/content/processing/basin/BasinInventory.java b/src/main/java/com/simibubi/create/content/processing/basin/BasinInventory.java index 0c88d4d0d..63121355d 100644 --- a/src/main/java/com/simibubi/create/content/processing/basin/BasinInventory.java +++ b/src/main/java/com/simibubi/create/content/processing/basin/BasinInventory.java @@ -13,16 +13,29 @@ public class BasinInventory extends SmartInventory { super(slots, be, 16, true); this.blockEntity = be; } - + @Override public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { - // Only insert if no other slot already has a stack of this item - for (int i = 0; i < getSlots(); i++) + int firstFreeSlot = -1; + + for (int i = 0; i < getSlots(); i++) { + // Only insert if no other slot already has a stack of this item if (i != slot && ItemHandlerHelper.canItemStacksStack(stack, inv.getStackInSlot(i))) return stack; + if (inv.getStackInSlot(i) + .isEmpty() && firstFreeSlot == -1) + firstFreeSlot = i; + } + + // Only insert if this is the first empty slot, prevents overfilling in the + // simulation pass + if (inv.getStackInSlot(slot) + .isEmpty() && firstFreeSlot != slot) + return stack; + return super.insertItem(slot, stack, simulate); } - + @Override public ItemStack extractItem(int slot, int amount, boolean simulate) { ItemStack extractItem = super.extractItem(slot, amount, simulate); diff --git a/src/main/java/com/simibubi/create/content/processing/basin/BasinRecipe.java b/src/main/java/com/simibubi/create/content/processing/basin/BasinRecipe.java index 9a86e0066..0db6e6eec 100644 --- a/src/main/java/com/simibubi/create/content/processing/basin/BasinRecipe.java +++ b/src/main/java/com/simibubi/create/content/processing/basin/BasinRecipe.java @@ -149,13 +149,22 @@ public class BasinRecipe extends ProcessingRecipe { if (simulate) { if (recipe instanceof BasinRecipe basinRecipe) { recipeOutputItems.addAll(basinRecipe.rollResults()); - recipeOutputFluids.addAll(basinRecipe.getFluidResults()); - recipeOutputItems.addAll(basinRecipe.getRemainingItems(basin.getInputInventory())); + + for (FluidStack fluidStack : basinRecipe.getFluidResults()) + if (!fluidStack.isEmpty()) + recipeOutputFluids.add(fluidStack); + for (ItemStack stack : basinRecipe.getRemainingItems(basin.getInputInventory())) + if (!stack.isEmpty()) + recipeOutputItems.add(stack); + } else { recipeOutputItems.add(recipe.getResultItem()); if (recipe instanceof CraftingRecipe craftingRecipe) { - recipeOutputItems.addAll(craftingRecipe.getRemainingItems(new DummyCraftingContainer(availableItems, extractedItemsFromSlot))); + for (ItemStack stack : craftingRecipe + .getRemainingItems(new DummyCraftingContainer(availableItems, extractedItemsFromSlot))) + if (!stack.isEmpty()) + recipeOutputItems.add(stack); } } } From c05e366dc7928283c558126ee5a7e6bb96202af0 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 16 Jul 2024 19:15:45 +0200 Subject: [PATCH 28/28] Refactor IWrenchable.onSneakWrenched --- .../content/equipment/wrench/IWrenchable.java | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/equipment/wrench/IWrenchable.java b/src/main/java/com/simibubi/create/content/equipment/wrench/IWrenchable.java index 232a9dd5e..8abcca734 100644 --- a/src/main/java/com/simibubi/create/content/equipment/wrench/IWrenchable.java +++ b/src/main/java/com/simibubi/create/content/equipment/wrench/IWrenchable.java @@ -56,21 +56,26 @@ public interface IWrenchable { Level world = context.getLevel(); BlockPos pos = context.getClickedPos(); Player player = context.getPlayer(); - if (world instanceof ServerLevel) { - BlockEvent.BreakEvent event = new BlockEvent.BreakEvent(world, pos, world.getBlockState(pos), player); - MinecraftForge.EVENT_BUS.post(event); - if (!event.isCanceled()) { - if (player != null && !player.isCreative()) { - Block.getDrops(state, (ServerLevel) world, pos, world.getBlockEntity(pos), player, context.getItemInHand()) - .forEach(itemStack -> { - player.getInventory().placeItemBackInInventory(itemStack); - }); - } - state.spawnAfterBreak((ServerLevel) world, pos, ItemStack.EMPTY); - world.destroyBlock(pos, false); - playRemoveSound(world, pos); - } + + if (!(world instanceof ServerLevel serverLevel)) + return InteractionResult.SUCCESS; + + BlockEvent.BreakEvent event = new BlockEvent.BreakEvent(world, pos, world.getBlockState(pos), player); + MinecraftForge.EVENT_BUS.post(event); + if (event.isCanceled()) + return InteractionResult.SUCCESS; + + if (player != null && !player.isCreative()) { + Block.getDrops(state, serverLevel, pos, world.getBlockEntity(pos), player, context.getItemInHand()) + .forEach(itemStack -> { + player.getInventory() + .placeItemBackInInventory(itemStack); + }); } + + state.spawnAfterBreak(serverLevel, pos, ItemStack.EMPTY); + world.destroyBlock(pos, false); + playRemoveSound(world, pos); return InteractionResult.SUCCESS; }