镜像样板供应器性能优化
This commit is contained in:
parent
5262e40030
commit
e6de05dfda
|
|
@ -0,0 +1,5 @@
|
||||||
|
package com.extendedae_plus.api.bridge;
|
||||||
|
|
||||||
|
public interface PatternProviderLogicSyncBridge {
|
||||||
|
long eap$getPatternSyncVersion();
|
||||||
|
}
|
||||||
|
|
@ -10,6 +10,7 @@ import appeng.helpers.patternprovider.PatternProviderLogic;
|
||||||
import appeng.util.CustomNameUtil;
|
import appeng.util.CustomNameUtil;
|
||||||
import appeng.util.SettingsFrom;
|
import appeng.util.SettingsFrom;
|
||||||
import appeng.util.inv.AppEngInternalInventory;
|
import appeng.util.inv.AppEngInternalInventory;
|
||||||
|
import com.extendedae_plus.api.bridge.PatternProviderLogicSyncBridge;
|
||||||
import com.extendedae_plus.config.ModConfig;
|
import com.extendedae_plus.config.ModConfig;
|
||||||
import com.extendedae_plus.init.ModBlockEntities;
|
import com.extendedae_plus.init.ModBlockEntities;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
|
|
@ -40,6 +41,7 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
|
||||||
private static final int AE2_PATTERN_SLOTS = 9;
|
private static final int AE2_PATTERN_SLOTS = 9;
|
||||||
private static final int EXTENDED_PATTERN_PROVIDER_BASE_SLOTS = 36;
|
private static final int EXTENDED_PATTERN_PROVIDER_BASE_SLOTS = 36;
|
||||||
private static final InternalInventory DISABLED_PATTERN_INVENTORY = new AppEngInternalInventory(0);
|
private static final InternalInventory DISABLED_PATTERN_INVENTORY = new AppEngInternalInventory(0);
|
||||||
|
private static final long UNKNOWN_PATTERN_SYNC_VERSION = Long.MIN_VALUE;
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private ResourceKey<Level> masterDimension;
|
private ResourceKey<Level> masterDimension;
|
||||||
|
|
@ -48,6 +50,8 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
|
||||||
private BlockPos masterPos;
|
private BlockPos masterPos;
|
||||||
|
|
||||||
private long nextSyncTick = Long.MIN_VALUE;
|
private long nextSyncTick = Long.MIN_VALUE;
|
||||||
|
private long lastSyncedPatternVersion = UNKNOWN_PATTERN_SYNC_VERSION;
|
||||||
|
private boolean needsUnboundPatternCleanup;
|
||||||
|
|
||||||
public MirrorPatternProviderBlockEntity(BlockPos pos, BlockState blockState) {
|
public MirrorPatternProviderBlockEntity(BlockPos pos, BlockState blockState) {
|
||||||
super(ModBlockEntities.MIRROR_PATTERN_PROVIDER_BE.get(), pos, blockState);
|
super(ModBlockEntities.MIRROR_PATTERN_PROVIDER_BE.get(), pos, blockState);
|
||||||
|
|
@ -113,6 +117,8 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
|
||||||
this.masterDimension = null;
|
this.masterDimension = null;
|
||||||
this.masterPos = null;
|
this.masterPos = null;
|
||||||
this.scheduleImmediateSync();
|
this.scheduleImmediateSync();
|
||||||
|
this.invalidatePatternSyncState();
|
||||||
|
this.needsUnboundPatternCleanup = true;
|
||||||
if (data.contains(TAG_MASTER, Tag.TAG_COMPOUND)) {
|
if (data.contains(TAG_MASTER, Tag.TAG_COMPOUND)) {
|
||||||
var masterTag = data.getCompound(TAG_MASTER);
|
var masterTag = data.getCompound(TAG_MASTER);
|
||||||
if (masterTag.contains(TAG_MASTER_DIMENSION, Tag.TAG_STRING)
|
if (masterTag.contains(TAG_MASTER_DIMENSION, Tag.TAG_STRING)
|
||||||
|
|
@ -120,6 +126,7 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
|
||||||
this.masterDimension = ResourceKey.create(Registries.DIMENSION,
|
this.masterDimension = ResourceKey.create(Registries.DIMENSION,
|
||||||
new ResourceLocation(masterTag.getString(TAG_MASTER_DIMENSION)));
|
new ResourceLocation(masterTag.getString(TAG_MASTER_DIMENSION)));
|
||||||
this.masterPos = BlockPos.of(masterTag.getLong(TAG_MASTER_POS));
|
this.masterPos = BlockPos.of(masterTag.getLong(TAG_MASTER_POS));
|
||||||
|
this.needsUnboundPatternCleanup = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -209,6 +216,16 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
|
||||||
}
|
}
|
||||||
|
|
||||||
private int syncBoundMaster() {
|
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();
|
var master = this.getMaster();
|
||||||
if (master != null) {
|
if (master != null) {
|
||||||
return this.syncFromMaster(master) ? FAST_SYNC_INTERVAL : STABLE_SYNC_INTERVAL;
|
return this.syncFromMaster(master) ? FAST_SYNC_INTERVAL : STABLE_SYNC_INTERVAL;
|
||||||
|
|
@ -226,7 +243,11 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean shouldClearBrokenBinding() {
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -243,6 +264,8 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
|
||||||
|
|
||||||
this.masterDimension = null;
|
this.masterDimension = null;
|
||||||
this.masterPos = null;
|
this.masterPos = null;
|
||||||
|
this.invalidatePatternSyncState();
|
||||||
|
this.needsUnboundPatternCleanup = false;
|
||||||
|
|
||||||
var changed = hadBinding;
|
var changed = hadBinding;
|
||||||
if (clearMirroredPatterns) {
|
if (clearMirroredPatterns) {
|
||||||
|
|
@ -258,6 +281,10 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
|
||||||
|
|
||||||
this.masterDimension = dimension;
|
this.masterDimension = dimension;
|
||||||
this.masterPos = newPos;
|
this.masterPos = newPos;
|
||||||
|
this.needsUnboundPatternCleanup = false;
|
||||||
|
if (changed) {
|
||||||
|
this.invalidatePatternSyncState();
|
||||||
|
}
|
||||||
return changed;
|
return changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -267,9 +294,10 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
|
||||||
return false;
|
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.syncMirroredSettings(master);
|
||||||
changed |= this.syncMirroredPatterns(master);
|
changed |= this.syncMirroredPatterns(master, bindingChanged);
|
||||||
|
|
||||||
if (changed) {
|
if (changed) {
|
||||||
this.flushStateChanges();
|
this.flushStateChanges();
|
||||||
|
|
@ -315,7 +343,13 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
|
||||||
!= master.getBlockState().getValue(PatternProviderBlock.PUSH_DIRECTION);
|
!= 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 mirrorInventory = this.getPatternInventory();
|
||||||
var masterInventory = asPatternInventory(master.getLogic().getPatternInv());
|
var masterInventory = asPatternInventory(master.getLogic().getPatternInv());
|
||||||
var mirrorSize = mirrorInventory.size();
|
var mirrorSize = mirrorInventory.size();
|
||||||
|
|
@ -335,6 +369,12 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
|
||||||
this.getLogic().updatePatterns();
|
this.getLogic().updatePatterns();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (masterPatternVersion != UNKNOWN_PATTERN_SYNC_VERSION) {
|
||||||
|
this.lastSyncedPatternVersion = masterPatternVersion;
|
||||||
|
} else if (changed) {
|
||||||
|
this.invalidatePatternSyncState();
|
||||||
|
}
|
||||||
|
|
||||||
return changed;
|
return changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -390,6 +430,10 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
|
||||||
this.nextSyncTick = Long.MIN_VALUE;
|
this.nextSyncTick = Long.MIN_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void invalidatePatternSyncState() {
|
||||||
|
this.lastSyncedPatternVersion = UNKNOWN_PATTERN_SYNC_VERSION;
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private ServerLevel getMasterLevel(ServerLevel serverLevel) {
|
private ServerLevel getMasterLevel(ServerLevel serverLevel) {
|
||||||
if (serverLevel.dimension() == this.masterDimension) {
|
if (serverLevel.dimension() == this.masterDimension) {
|
||||||
|
|
@ -420,6 +464,14 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
|
||||||
return ItemStack.isSameItemSameTags(left, right) && left.getCount() == right.getCount();
|
return ItemStack.isSameItemSameTags(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;
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean isSupportedMaster(@Nullable BlockEntity blockEntity) {
|
public static boolean isSupportedMaster(@Nullable BlockEntity blockEntity) {
|
||||||
return blockEntity instanceof PatternProviderBlockEntity
|
return blockEntity instanceof PatternProviderBlockEntity
|
||||||
&& !(blockEntity instanceof MirrorPatternProviderBlockEntity)
|
&& !(blockEntity instanceof MirrorPatternProviderBlockEntity)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
package com.extendedae_plus.mixin.ae2.helpers.patternprovider;
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -71,6 +71,7 @@
|
||||||
"ae2.helpers.InterfaceLogicUpgradesMixin",
|
"ae2.helpers.InterfaceLogicUpgradesMixin",
|
||||||
"ae2.helpers.patternprovider.PatternProviderLogicAdvancedMixin",
|
"ae2.helpers.patternprovider.PatternProviderLogicAdvancedMixin",
|
||||||
"ae2.helpers.patternprovider.PatternProviderLogicDoublingMixin",
|
"ae2.helpers.patternprovider.PatternProviderLogicDoublingMixin",
|
||||||
|
"ae2.helpers.patternprovider.PatternProviderLogicSyncVersionMixin",
|
||||||
"ae2.helpers.patternprovider.PatternProviderLogicTickerMixin",
|
"ae2.helpers.patternprovider.PatternProviderLogicTickerMixin",
|
||||||
"ae2.items.MemoryCardItemMixin",
|
"ae2.items.MemoryCardItemMixin",
|
||||||
"ae2.menu.ContainerPatternEncodingTermMenuMixin",
|
"ae2.menu.ContainerPatternEncodingTermMenuMixin",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user