From 07dbce245982d3882e7f8161fc5e97387da4fb97 Mon Sep 17 00:00:00 2001 From: SpacePython12 Date: Tue, 8 Jul 2025 02:04:01 -0500 Subject: [PATCH 1/3] It's like, actually functional now, yay --- .gitignore | 4 +++ .../equipment/armor/DivingHelmetItem.java | 9 ++++-- .../equipment/armor/RemainingAirOverlay.java | 4 ++- .../content/kinetics/belt/BeltBlock.java | 14 ++++---- .../content/logistics/box/PackageEntity.java | 2 +- .../packager/PackagerBlockEntity.java | 16 ++++------ .../packager/PackagerItemHandler.java | 32 ++++++++++++++++--- .../logistics/vault/ItemVaultBlockEntity.java | 8 +++-- .../unpacking/CrafterUnpackingHandler.java | 4 +-- .../unpacking/DefaultUnpackingHandler.java | 3 +- 10 files changed, 64 insertions(+), 32 deletions(-) diff --git a/.gitignore b/.gitignore index 3f7b46cdd9..ad545bf8f0 100644 --- a/.gitignore +++ b/.gitignore @@ -36,6 +36,9 @@ local.properties .settings/ .loadpath +## VSCode/VSCodium +.vscode/* + # External tool builders .externalToolBuilders/ @@ -57,3 +60,4 @@ local.properties Ponder Ponder/ .Ponder/ +.vscode/launch.json diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/DivingHelmetItem.java b/src/main/java/com/simibubi/create/content/equipment/armor/DivingHelmetItem.java index a322c418bc..54a1f02060 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/DivingHelmetItem.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/DivingHelmetItem.java @@ -10,6 +10,8 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; @@ -119,7 +121,10 @@ public static void breatheUnderwater(LivingEntity entity) { if (entity instanceof ServerPlayer sp) AllAdvancements.DIVING_SUIT.awardTo(sp); - event.setCanBreathe(true); - event.setCanRefillAir(true); + // TODO: Find a way to make this work in Fabric if possible + // event.setCanBreathe(true); + // event.setCanRefillAir(true); + entity.setAirSupply(Math.min(entity.getMaxAirSupply(), entity.getAirSupply() + 10)); + entity.addEffect(new MobEffectInstance(MobEffects.WATER_BREATHING, 30, 0, true, false, true)); } } diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/RemainingAirOverlay.java b/src/main/java/com/simibubi/create/content/equipment/armor/RemainingAirOverlay.java index 60a2368936..2fdd96ff7d 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/RemainingAirOverlay.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/RemainingAirOverlay.java @@ -11,6 +11,7 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.player.LocalPlayer; import net.minecraft.network.chat.Component; +import net.minecraft.tags.FluidTags; import net.minecraft.util.StringUtil; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.GameType; @@ -29,7 +30,8 @@ public static void render(GuiGraphics graphics, int width, int height) { if (!player.getCustomData() .contains("VisualBacktankAir")) return; - if (!player.canDrownInFluidType(player.getEyeInFluidType()) && !player.isInLava()) + // TODO: Find a way to make this work in Fabric if possible + if (/*!player.canDrownInFluidType(player.getEyeInFluidType())*/ !player.isEyeInFluid(FluidTags.WATER) && !player.isInLava()) return; int timeLeft = player.getCustomData() diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java index 0f4dddc8a9..bfe160bcd8 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java @@ -216,19 +216,19 @@ public void entityInside(BlockState state, Level worldIn, BlockPos pos, Entity e if (BeltTunnelInteractionHandler.getTunnelOnPosition(worldIn, pos) != null) return; withBlockEntityDo(worldIn, pos, be -> { - ItemEntity itemEntity = (ItemEntity) entityIn; + // ItemEntity itemEntity = (ItemEntity) entityIn; Storage handler = be.getItemStorage(null); if (handler == null) return; - ItemStack inEntity = itemEntity.getItem(); try (Transaction t = TransferUtil.getTransaction()) { - long inserted = handler.insert(ItemVariant.of(inEntity), inEntity.getCount(), t); + long inserted = handler.insert(ItemVariant.of(asItem), asItem.getCount(), t); + asItem.shrink((int) inserted); if (inserted == 0) return; - if (inEntity.getCount() == inserted) { - itemEntity.discard(); - } else { - inEntity.shrink((int) inserted); + if (asItem.getCount() == inserted) { + entityIn.discard(); + } else if (entityIn instanceof ItemEntity itemEntity && asItem.getCount() != itemEntity.getItem().getCount()) { + itemEntity.setItem(asItem); } t.commit(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java index ba931b0726..dd51b48e83 100644 --- a/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/box/PackageEntity.java @@ -207,7 +207,7 @@ public EntityDimensions getDimensions(Pose pPose) { @Override public void recreateFromPacket(ClientboundAddEntityPacket packet) { - this.setDeltaMovement(packet.getXa(), packet.getYa(), packet.getZa()); + super.recreateFromPacket(packet); this.clientPosition = this.position(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java index df0c849197..1cb41dda6a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerBlockEntity.java @@ -358,26 +358,22 @@ public boolean unwrapBox(ItemStack box, TransactionContext ctx) { BlockPos target = worldPosition.relative(facing.getOpposite()); BlockState targetState = level.getBlockState(target); - UnpackingHandler handler = UnpackingHandler.REGISTRY.get(targetState); + UnpackingHandler handler = UnpackingHandler.REGISTRY.get(targetState); UnpackingHandler toUse = handler != null ? handler : UnpackingHandler.DEFAULT; // fabric: copy the items to actually unpack later List copy = items.stream().map(ItemStack::copy).toList(); // note: handler may modify the passed items - boolean unpacked = toUse.unpack(level, target, targetState, facing, items, orderContext, true); + boolean unpacked = toUse.unpack(level, target, targetState, facing, items, orderContext, false); if (unpacked) { - TransactionCallback.onSuccess(ctx, () -> { - toUse.unpack(level, target, targetState, facing, copy, orderContext, false); - previouslyUnwrapped = box; - animationInward = true; - animationTicks = CYCLE; - notifyUpdate(); - }); + previouslyUnwrapped = box; + animationInward = true; + animationTicks = CYCLE; } - return true; + return unpacked; } public void attemptToSend(List queuedRequests) { diff --git a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerItemHandler.java b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerItemHandler.java index 5b074be7ca..8a0927249f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/packager/PackagerItemHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/packager/PackagerItemHandler.java @@ -8,13 +8,16 @@ import net.fabricmc.fabric.api.transfer.v1.storage.StoragePreconditions; import net.fabricmc.fabric.api.transfer.v1.storage.base.SingleSlotStorage; import net.fabricmc.fabric.api.transfer.v1.transaction.TransactionContext; - +import net.fabricmc.fabric.api.transfer.v1.transaction.TransactionContext.Result; +import net.fabricmc.fabric.api.transfer.v1.transaction.base.SnapshotParticipant; import io.github.fabricators_of_create.porting_lib.transfer.callbacks.TransactionCallback; -public class PackagerItemHandler implements SingleSlotStorage { +public class PackagerItemHandler extends SnapshotParticipant implements SingleSlotStorage { private final PackagerBlockEntity blockEntity; + private boolean unpackSuccessful = false; + public PackagerItemHandler(PackagerBlockEntity blockEntity) { this.blockEntity = blockEntity; } @@ -27,8 +30,9 @@ public long insert(ItemVariant resource, long maxAmount, TransactionContext tran if (!PackageItem.isPackage(resource)) return 0; ItemStack stack = resource.toStack(1); + this.updateSnapshots(transaction); if (blockEntity.unwrapBox(stack, transaction)) { - TransactionCallback.onSuccess(transaction, blockEntity::scheduleStockCheck); + this.unpackSuccessful = true; return 1; } else { return 0; @@ -43,9 +47,8 @@ public long extract(ItemVariant resource, long maxAmount, TransactionContext tra ItemStack box = blockEntity.heldBox; if (!resource.matches(box)) return 0; - + this.updateSnapshots(transaction); blockEntity.heldBox = ItemStack.EMPTY; - TransactionCallback.onSuccess(transaction, blockEntity::notifyUpdate); return box.getCount(); } @@ -68,4 +71,23 @@ public long getAmount() { public long getCapacity() { return 1; } + + @Override + protected ItemStack createSnapshot() { + return blockEntity.heldBox.copy(); + } + + @Override + protected void readSnapshot(ItemStack snapshot) { + blockEntity.heldBox = snapshot; + } + + @Override + protected void onFinalCommit() { + if (this.unpackSuccessful) { + blockEntity.scheduleStockCheck(); + this.unpackSuccessful = false; + } + blockEntity.notifyUpdate(); + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultBlockEntity.java index 8595373016..4dd2aaf9b9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultBlockEntity.java @@ -162,11 +162,13 @@ private static void updateComaratorsInner(Level level, Block provokingBlock, Blo } BlockState blockstate = level.getBlockState(updatePos); - blockstate.onNeighborChange(level, updatePos, provokingPos); + // TODO: Find a way to make this work in Fabric if possible + // blockstate.onNeighborChange(level, updatePos, provokingPos); if (blockstate.isRedstoneConductor(level, updatePos)) { updatePos.move(direction); blockstate = level.getBlockState(updatePos); - if (blockstate.getWeakChanges(level, updatePos)) { + // TODO: Find a way to make this work in Fabric if possible + if (/*blockstate.getWeakChanges(level, updatePos)*/ blockstate.is(Blocks.COMPARATOR)) { level.neighborChanged(blockstate, updatePos, provokingBlock, provokingPos, false); } } @@ -359,7 +361,7 @@ protected void initCapability() { } } - Storage combinedInvWrapper = new CombinedStorage<>(SameSizeCombinedInvWrapper.create(invs)); + Storage combinedInvWrapper = SameSizeCombinedInvWrapper.create(List.of(invs)); combinedInvWrapper = new VersionedInventoryWrapper(combinedInvWrapper); itemCapability = combinedInvWrapper; diff --git a/src/main/java/com/simibubi/create/impl/unpacking/CrafterUnpackingHandler.java b/src/main/java/com/simibubi/create/impl/unpacking/CrafterUnpackingHandler.java index be2e7fab67..a1e9d76371 100644 --- a/src/main/java/com/simibubi/create/impl/unpacking/CrafterUnpackingHandler.java +++ b/src/main/java/com/simibubi/create/impl/unpacking/CrafterUnpackingHandler.java @@ -20,7 +20,7 @@ import net.fabricmc.fabric.api.transfer.v1.item.ItemVariant; import net.fabricmc.fabric.api.transfer.v1.transaction.Transaction; - +import io.github.fabricators_of_create.porting_lib.transfer.TransferUtil; import io.github.fabricators_of_create.porting_lib.transfer.item.ItemHandlerHelper; public enum CrafterUnpackingHandler implements UnpackingHandler { @@ -43,7 +43,7 @@ public boolean unpack(Level level, BlockPos pos, BlockState state, Direction sid if (inventories.isEmpty()) return false; - try (Transaction t = Transaction.openOuter()) { + try (Transaction t = TransferUtil.getTransaction()) { // insert in the order's defined ordering int max = Math.min(inventories.size(), craftingContext.size()); outer: for (int i = 0; i < max; i++) { diff --git a/src/main/java/com/simibubi/create/impl/unpacking/DefaultUnpackingHandler.java b/src/main/java/com/simibubi/create/impl/unpacking/DefaultUnpackingHandler.java index 285606496d..332163a54a 100644 --- a/src/main/java/com/simibubi/create/impl/unpacking/DefaultUnpackingHandler.java +++ b/src/main/java/com/simibubi/create/impl/unpacking/DefaultUnpackingHandler.java @@ -7,6 +7,7 @@ import com.simibubi.create.api.packager.unpacking.UnpackingHandler; import com.simibubi.create.content.logistics.stockTicker.PackageOrderWithCrafts; +import io.github.fabricators_of_create.porting_lib.transfer.TransferUtil; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; @@ -30,7 +31,7 @@ public boolean unpack(Level level, BlockPos pos, BlockState state, Direction sid if (targetInv == null) return false; - try (Transaction t = Transaction.openOuter()) { + try (Transaction t = TransferUtil.getTransaction()) { for (ItemStack stack : items) { long inserted = targetInv.insert(ItemVariant.of(stack), stack.getCount(), t); if (inserted != stack.getCount()) { From 4680f7078e2b40ee73e9f570592f4d084b5c9ec9 Mon Sep 17 00:00:00 2001 From: SpacePython12 Date: Tue, 8 Jul 2025 13:46:05 -0500 Subject: [PATCH 2/3] Bumped version --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 777f2e55ad..82eb912f50 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -69,7 +69,7 @@ val buildNum = providers.environmentVariable("GITHUB_RUN_NUMBER") .orElse("-local") .getOrElse("") -version = "6.0.4.0+mc$minecraftVersion$buildNum" +version = "6.0.6.0+mc$minecraftVersion$buildNum" group = "com.simibubi.create" base.archivesName = "create-fabric" From c4dfafddeb008970a4fa5ca730e732c665c0790a Mon Sep 17 00:00:00 2001 From: SpacePython12 Date: Sun, 13 Jul 2025 14:24:33 -0500 Subject: [PATCH 3/3] Acknowledge TropheusJ's suggestions --- build.gradle.kts | 2 +- .../create/content/equipment/armor/DivingHelmetItem.java | 7 ++----- .../content/equipment/armor/RemainingAirOverlay.java | 3 +-- .../simibubi/create/content/kinetics/belt/BeltBlock.java | 1 - .../content/logistics/vault/ItemVaultBlockEntity.java | 6 ++---- 5 files changed, 6 insertions(+), 13 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 82eb912f50..777f2e55ad 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -69,7 +69,7 @@ val buildNum = providers.environmentVariable("GITHUB_RUN_NUMBER") .orElse("-local") .getOrElse("") -version = "6.0.6.0+mc$minecraftVersion$buildNum" +version = "6.0.4.0+mc$minecraftVersion$buildNum" group = "com.simibubi.create" base.archivesName = "create-fabric" diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/DivingHelmetItem.java b/src/main/java/com/simibubi/create/content/equipment/armor/DivingHelmetItem.java index 54a1f02060..99274eef01 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/DivingHelmetItem.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/DivingHelmetItem.java @@ -121,10 +121,7 @@ public static void breatheUnderwater(LivingEntity entity) { if (entity instanceof ServerPlayer sp) AllAdvancements.DIVING_SUIT.awardTo(sp); - // TODO: Find a way to make this work in Fabric if possible - // event.setCanBreathe(true); - // event.setCanRefillAir(true); - entity.setAirSupply(Math.min(entity.getMaxAirSupply(), entity.getAirSupply() + 10)); - entity.addEffect(new MobEffectInstance(MobEffects.WATER_BREATHING, 30, 0, true, false, true)); + event.setCanBreathe(true); + event.setCanRefillAir(true); } } diff --git a/src/main/java/com/simibubi/create/content/equipment/armor/RemainingAirOverlay.java b/src/main/java/com/simibubi/create/content/equipment/armor/RemainingAirOverlay.java index 2fdd96ff7d..2c397fca3f 100644 --- a/src/main/java/com/simibubi/create/content/equipment/armor/RemainingAirOverlay.java +++ b/src/main/java/com/simibubi/create/content/equipment/armor/RemainingAirOverlay.java @@ -30,8 +30,7 @@ public static void render(GuiGraphics graphics, int width, int height) { if (!player.getCustomData() .contains("VisualBacktankAir")) return; - // TODO: Find a way to make this work in Fabric if possible - if (/*!player.canDrownInFluidType(player.getEyeInFluidType())*/ !player.isEyeInFluid(FluidTags.WATER) && !player.isInLava()) + if (!player.canDrownInFluidType(player.getEyeInFluidType()) && !player.isInLava()) return; int timeLeft = player.getCustomData() diff --git a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java index bfe160bcd8..b523628c8d 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java +++ b/src/main/java/com/simibubi/create/content/kinetics/belt/BeltBlock.java @@ -216,7 +216,6 @@ public void entityInside(BlockState state, Level worldIn, BlockPos pos, Entity e if (BeltTunnelInteractionHandler.getTunnelOnPosition(worldIn, pos) != null) return; withBlockEntityDo(worldIn, pos, be -> { - // ItemEntity itemEntity = (ItemEntity) entityIn; Storage handler = be.getItemStorage(null); if (handler == null) return; diff --git a/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultBlockEntity.java b/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultBlockEntity.java index 4dd2aaf9b9..1cb5e20ee0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultBlockEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/vault/ItemVaultBlockEntity.java @@ -162,13 +162,11 @@ private static void updateComaratorsInner(Level level, Block provokingBlock, Blo } BlockState blockstate = level.getBlockState(updatePos); - // TODO: Find a way to make this work in Fabric if possible - // blockstate.onNeighborChange(level, updatePos, provokingPos); + blockstate.onNeighborChange(level, updatePos, provokingPos); if (blockstate.isRedstoneConductor(level, updatePos)) { updatePos.move(direction); blockstate = level.getBlockState(updatePos); - // TODO: Find a way to make this work in Fabric if possible - if (/*blockstate.getWeakChanges(level, updatePos)*/ blockstate.is(Blocks.COMPARATOR)) { + if (blockstate.getWeakChanges(level, updatePos)) { level.neighborChanged(blockstate, updatePos, provokingBlock, provokingPos, false); } }