From fd918c8707773c54fb47bafca8ff83677869137c Mon Sep 17 00:00:00 2001 From: GaLi <3096147684@qq.com> Date: Tue, 7 Apr 2026 13:46:05 +0800 Subject: [PATCH] =?UTF-8?q?=E9=95=9C=E5=83=8F=E6=A0=B7=E6=9D=BF=E4=BE=9B?= =?UTF-8?q?=E5=BA=94=E5=99=A8=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PatternProviderLogicSyncBridge.java | 5 ++ .../ae2/MirrorPatternProviderBlockEntity.java | 60 +++++++++++++++++-- .../PatternProviderLogicSyncVersionMixin.java | 26 ++++++++ .../resources/extendedae_plus.mixins.json | 1 + 4 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/extendedae_plus/api/bridge/PatternProviderLogicSyncBridge.java create mode 100644 src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicSyncVersionMixin.java diff --git a/src/main/java/com/extendedae_plus/api/bridge/PatternProviderLogicSyncBridge.java b/src/main/java/com/extendedae_plus/api/bridge/PatternProviderLogicSyncBridge.java new file mode 100644 index 0000000..cbb45bd --- /dev/null +++ b/src/main/java/com/extendedae_plus/api/bridge/PatternProviderLogicSyncBridge.java @@ -0,0 +1,5 @@ +package com.extendedae_plus.api.bridge; + +public interface PatternProviderLogicSyncBridge { + long eap$getPatternSyncVersion(); +} diff --git a/src/main/java/com/extendedae_plus/content/ae2/MirrorPatternProviderBlockEntity.java b/src/main/java/com/extendedae_plus/content/ae2/MirrorPatternProviderBlockEntity.java index f612a73..4e7b73a 100644 --- a/src/main/java/com/extendedae_plus/content/ae2/MirrorPatternProviderBlockEntity.java +++ b/src/main/java/com/extendedae_plus/content/ae2/MirrorPatternProviderBlockEntity.java @@ -9,6 +9,7 @@ import appeng.blockentity.crafting.PatternProviderBlockEntity; import appeng.helpers.patternprovider.PatternProviderLogic; import appeng.util.SettingsFrom; import appeng.util.inv.AppEngInternalInventory; +import com.extendedae_plus.api.bridge.PatternProviderLogicSyncBridge; import com.extendedae_plus.config.ModConfigs; import com.extendedae_plus.init.ModBlockEntities; import net.minecraft.core.BlockPos; @@ -43,6 +44,7 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity private static final int AE2_PATTERN_SLOTS = 9; private static final int EXTENDED_PATTERN_PROVIDER_BASE_SLOTS = 36; private static final InternalInventory DISABLED_PATTERN_INVENTORY = new AppEngInternalInventory(0); + private static final long UNKNOWN_PATTERN_SYNC_VERSION = Long.MIN_VALUE; @Nullable private ResourceKey masterDimension; @@ -51,6 +53,8 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity private BlockPos masterPos; private long nextSyncTick = Long.MIN_VALUE; + private long lastSyncedPatternVersion = UNKNOWN_PATTERN_SYNC_VERSION; + private boolean needsUnboundPatternCleanup; public MirrorPatternProviderBlockEntity(BlockPos pos, BlockState blockState) { super(ModBlockEntities.MIRROR_PATTERN_PROVIDER_BE.get(), pos, blockState); @@ -115,6 +119,8 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity this.masterDimension = null; this.masterPos = null; this.scheduleImmediateSync(); + this.invalidatePatternSyncState(); + this.needsUnboundPatternCleanup = true; if (data.contains(TAG_MASTER, Tag.TAG_COMPOUND)) { var masterTag = data.getCompound(TAG_MASTER); if (masterTag.contains(TAG_MASTER_DIMENSION, Tag.TAG_STRING) && masterTag.contains(TAG_MASTER_POS, Tag.TAG_LONG)) { @@ -122,6 +128,7 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity Registries.DIMENSION, ResourceLocation.parse(masterTag.getString(TAG_MASTER_DIMENSION))); this.masterPos = BlockPos.of(masterTag.getLong(TAG_MASTER_POS)); + this.needsUnboundPatternCleanup = false; } } } @@ -231,6 +238,16 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity } private int syncBoundMaster() { + if (this.masterDimension == null || this.masterPos == null) { + if (this.needsUnboundPatternCleanup) { + this.needsUnboundPatternCleanup = false; + if (this.clearMirroredPatterns()) { + this.flushStateChanges(); + } + } + return UNLOADED_MASTER_RETRY_INTERVAL; + } + var master = this.getMaster(); if (master != null) { return this.syncFromMaster(master) ? FAST_SYNC_INTERVAL : STABLE_SYNC_INTERVAL; @@ -248,7 +265,11 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity } private boolean shouldClearBrokenBinding() { - if (this.masterDimension == null || this.masterPos == null || !(this.getLevel() instanceof ServerLevel serverLevel)) { + if (this.masterDimension == null || this.masterPos == null) { + return false; + } + + if (!(this.getLevel() instanceof ServerLevel serverLevel)) { return true; } @@ -271,6 +292,8 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity this.masterDimension = null; this.masterPos = null; + this.invalidatePatternSyncState(); + this.needsUnboundPatternCleanup = false; var changed = hadBinding; if (clearMirroredPatterns) { @@ -286,6 +309,10 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity this.masterDimension = dimension; this.masterPos = newPos; + this.needsUnboundPatternCleanup = false; + if (changed) { + this.invalidatePatternSyncState(); + } return changed; } @@ -312,9 +339,10 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity return false; } - var changed = this.setBoundMaster(masterLevel.dimension(), master.getBlockPos()); + var bindingChanged = this.setBoundMaster(masterLevel.dimension(), master.getBlockPos()); + var changed = bindingChanged; changed |= this.syncMirroredSettings(master); - changed |= this.syncMirroredPatterns(master); + changed |= this.syncMirroredPatterns(master, bindingChanged); if (changed) { this.flushStateChanges(); @@ -355,7 +383,13 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity != master.getBlockState().getValue(PatternProviderBlock.PUSH_DIRECTION); } - private boolean syncMirroredPatterns(PatternProviderBlockEntity master) { + private boolean syncMirroredPatterns(PatternProviderBlockEntity master, boolean forceSync) { + var masterPatternVersion = getPatternSyncVersion(master); + if (!forceSync && masterPatternVersion != UNKNOWN_PATTERN_SYNC_VERSION + && masterPatternVersion == this.lastSyncedPatternVersion) { + return false; + } + var mirrorInventory = this.getPatternInventory(); var masterInventory = asPatternInventory(master.getLogic().getPatternInv()); var mirrorSize = mirrorInventory.size(); @@ -375,6 +409,12 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity this.getLogic().updatePatterns(); } + if (masterPatternVersion != UNKNOWN_PATTERN_SYNC_VERSION) { + this.lastSyncedPatternVersion = masterPatternVersion; + } else if (changed) { + this.invalidatePatternSyncState(); + } + return changed; } @@ -413,6 +453,10 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity this.nextSyncTick = Long.MIN_VALUE; } + private void invalidatePatternSyncState() { + this.lastSyncedPatternVersion = UNKNOWN_PATTERN_SYNC_VERSION; + } + private static int getMirrorPatternSlotCapacity() { int pageMultiplier = 1; try { @@ -432,6 +476,14 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity return ItemStack.isSameItemSameComponents(left, right) && left.getCount() == right.getCount(); } + private static long getPatternSyncVersion(PatternProviderBlockEntity master) { + if (master.getLogic() instanceof PatternProviderLogicSyncBridge bridge) { + return bridge.eap$getPatternSyncVersion(); + } + + return UNKNOWN_PATTERN_SYNC_VERSION; + } + private static boolean isValidMaster(@Nullable BlockEntity blockEntity) { return blockEntity instanceof PatternProviderBlockEntity && !(blockEntity instanceof MirrorPatternProviderBlockEntity) diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicSyncVersionMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicSyncVersionMixin.java new file mode 100644 index 0000000..cd03228 --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicSyncVersionMixin.java @@ -0,0 +1,26 @@ +package com.extendedae_plus.mixin.ae2.helpers; + +import appeng.helpers.patternprovider.PatternProviderLogic; +import appeng.util.inv.AppEngInternalInventory; +import com.extendedae_plus.api.bridge.PatternProviderLogicSyncBridge; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(value = PatternProviderLogic.class, remap = false) +public abstract class PatternProviderLogicSyncVersionMixin implements PatternProviderLogicSyncBridge { + @Unique + private long eap$patternSyncVersion; + + @Inject(method = "onChangeInventory", at = @At("TAIL")) + private void eap$trackPatternInventoryChanges(AppEngInternalInventory inv, int slot, CallbackInfo ci) { + this.eap$patternSyncVersion++; + } + + @Override + public long eap$getPatternSyncVersion() { + return this.eap$patternSyncVersion; + } +} diff --git a/src/main/resources/extendedae_plus.mixins.json b/src/main/resources/extendedae_plus.mixins.json index bc18530..baa6d9f 100644 --- a/src/main/resources/extendedae_plus.mixins.json +++ b/src/main/resources/extendedae_plus.mixins.json @@ -40,6 +40,7 @@ "ae2.helpers.InterfaceLogicUpgradesMixin", "ae2.helpers.PatternProviderLogicAdvancedMixin", "ae2.helpers.PatternProviderLogicDoublingMixin", + "ae2.helpers.PatternProviderLogicSyncVersionMixin", "ae2.helpers.PatternProviderLogicUpgradesMixin", "ae2.helpers.patternprovider.PatternProviderLogicTickerMixin", "ae2.menu.AEBaseMenuUpgradesDedupMixin",