From 08b15c72722525163577a2d0866aeb50f0ecb811 Mon Sep 17 00:00:00 2001 From: GilbertzRivii Date: Mon, 18 May 2026 01:50:59 +0200 Subject: [PATCH 1/2] fix TES eating too much TPS while there is no TES --- .../saveddata/CreativeEnergySavedData.java | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/neganote/monilabs/saveddata/CreativeEnergySavedData.java b/src/main/java/net/neganote/monilabs/saveddata/CreativeEnergySavedData.java index 4a815b8c..988a4f0d 100644 --- a/src/main/java/net/neganote/monilabs/saveddata/CreativeEnergySavedData.java +++ b/src/main/java/net/neganote/monilabs/saveddata/CreativeEnergySavedData.java @@ -20,6 +20,7 @@ public class CreativeEnergySavedData extends SavedData { public static String ENERGY_OWNERS = "creativeEnergyOwners"; private final Map ownersMap = new HashMap<>(); + private boolean hasAnyEnabled = false; private CreativeEnergySavedData() {} @@ -32,6 +33,9 @@ public CreativeEnergySavedData(CompoundTag tag) { boolean enabled = ownerTag.getBoolean("enabled"); UUID ownerUUID = new UUID(ownerUUIDMSB, ownerUUIDLSB); ownersMap.put(ownerUUID, enabled); + if (enabled) { + hasAnyEnabled = true; + } } } @@ -55,6 +59,9 @@ public static CreativeEnergySavedData getOrCreate(ServerLevel serverLevel) { } public boolean isEnabledFor(UUID uuid) { + if (!hasAnyEnabled) { + return false; + } MachineOwner owner = MachineOwner.getOwner(uuid); if (owner == null) { return false; @@ -63,10 +70,16 @@ public boolean isEnabledFor(UUID uuid) { } public void setEnabled(UUID uuid, boolean enabled) { - boolean isEnabled = isEnabledFor(uuid); - if (isEnabled != enabled) { - ownersMap.put(uuid, enabled); - setDirty(); + Boolean current = ownersMap.get(uuid); + if (current != null && current == enabled) { + return; + } + ownersMap.put(uuid, enabled); + if (enabled) { + hasAnyEnabled = true; + } else { + hasAnyEnabled = ownersMap.values().stream().anyMatch(Boolean::booleanValue); } + setDirty(); } } From 430a6136c93e3a19c8f79448970da0e28426841c Mon Sep 17 00:00:00 2001 From: GilbertzRivii Date: Mon, 18 May 2026 03:30:30 +0200 Subject: [PATCH 2/2] add global owner map and fix ATs turning off --- .../net/neganote/monilabs/MoniEvents.java | 7 ++ .../CreativeEnergyMultiMachine.java | 32 +++++-- .../mixin/NotifiableEnergyContainerMixin.java | 17 ++-- .../mixin/PowerSubstationMachineMixin.java | 11 +-- .../saveddata/CreativeEnergySavedData.java | 85 ------------------- 5 files changed, 45 insertions(+), 107 deletions(-) delete mode 100644 src/main/java/net/neganote/monilabs/saveddata/CreativeEnergySavedData.java diff --git a/src/main/java/net/neganote/monilabs/MoniEvents.java b/src/main/java/net/neganote/monilabs/MoniEvents.java index 3483a563..3d6d70ae 100644 --- a/src/main/java/net/neganote/monilabs/MoniEvents.java +++ b/src/main/java/net/neganote/monilabs/MoniEvents.java @@ -1,9 +1,11 @@ package net.neganote.monilabs; import net.minecraftforge.event.RegisterCommandsEvent; +import net.minecraftforge.event.server.ServerStoppingEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.neganote.monilabs.commands.PackSwitcherCommands; +import net.neganote.monilabs.common.machine.multiblock.CreativeEnergyMultiMachine; @Mod.EventBusSubscriber(modid = MoniLabs.MOD_ID) public class MoniEvents { @@ -13,4 +15,9 @@ public static void RegisterCommandsEvent(RegisterCommandsEvent event) { MoniLabs.LOGGER.debug("Registering commands..."); PackSwitcherCommands.register(event.getDispatcher(), event.getBuildContext()); } + + @SubscribeEvent + public static void onServerStopping(ServerStoppingEvent event) { + CreativeEnergyMultiMachine.clearActiveOwners(); + } } diff --git a/src/main/java/net/neganote/monilabs/common/machine/multiblock/CreativeEnergyMultiMachine.java b/src/main/java/net/neganote/monilabs/common/machine/multiblock/CreativeEnergyMultiMachine.java index 8bf0ee7c..bf11649b 100644 --- a/src/main/java/net/neganote/monilabs/common/machine/multiblock/CreativeEnergyMultiMachine.java +++ b/src/main/java/net/neganote/monilabs/common/machine/multiblock/CreativeEnergyMultiMachine.java @@ -2,15 +2,22 @@ import com.gregtechceu.gtceu.api.machine.ConditionalSubscriptionHandler; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; import net.minecraft.server.level.ServerLevel; -import net.neganote.monilabs.saveddata.CreativeEnergySavedData; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; import java.util.UUID; @SuppressWarnings("unused") public class CreativeEnergyMultiMachine extends UniqueWorkableElectricMultiblockMachine { + private static final Set ACTIVE_OWNERS = new HashSet<>(); + private static final Map PLAYER_CACHE = new HashMap<>(); + private final ConditionalSubscriptionHandler creativeEnergySubscription; public CreativeEnergyMultiMachine(IMachineBlockEntity holder, Object... args) { @@ -20,21 +27,36 @@ public CreativeEnergyMultiMachine(IMachineBlockEntity holder, Object... args) { this::isSubscriptionActive); } + public static boolean isCreativeEnergyEnabledFor(UUID playerUUID) { + if (ACTIVE_OWNERS.isEmpty()) return false; + return PLAYER_CACHE.computeIfAbsent(playerUUID, uuid -> { + MachineOwner owner = MachineOwner.getOwner(uuid); + if (owner == null) return false; + return ACTIVE_OWNERS.stream().anyMatch(owner::isPlayerInTeam); + }); + } + + public static void clearActiveOwners() { + ACTIVE_OWNERS.clear(); + PLAYER_CACHE.clear(); + } + @Override public void onStructureFormed() { super.onStructureFormed(); + enableCreativeEnergy(recipeLogic.isWorking()); creativeEnergySubscription.updateSubscription(); } public void enableCreativeEnergy(boolean enabled) { + if (!(getLevel() instanceof ServerLevel)) return; UUID ownerUUID = getOwnerUUID(); if (ownerUUID == null) { ownerUUID = new UUID(0L, 0L); } - if (getLevel() instanceof ServerLevel serverLevel) { - CreativeEnergySavedData savedData = CreativeEnergySavedData - .getOrCreate(serverLevel.getServer().overworld()); - savedData.setEnabled(ownerUUID, enabled); + boolean changed = enabled ? ACTIVE_OWNERS.add(ownerUUID) : ACTIVE_OWNERS.remove(ownerUUID); + if (changed) { + PLAYER_CACHE.clear(); } } diff --git a/src/main/java/net/neganote/monilabs/mixin/NotifiableEnergyContainerMixin.java b/src/main/java/net/neganote/monilabs/mixin/NotifiableEnergyContainerMixin.java index fe8ee046..b555582e 100644 --- a/src/main/java/net/neganote/monilabs/mixin/NotifiableEnergyContainerMixin.java +++ b/src/main/java/net/neganote/monilabs/mixin/NotifiableEnergyContainerMixin.java @@ -8,7 +8,7 @@ import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.server.level.ServerLevel; -import net.neganote.monilabs.saveddata.CreativeEnergySavedData; +import net.neganote.monilabs.common.machine.multiblock.CreativeEnergyMultiMachine; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; @@ -45,13 +45,12 @@ public MetaMachine getMachine() { @Inject(method = "getEnergyStored()J", at = @At(value = "HEAD"), cancellable = true) private void monilabs$injectBeforeGetEnergyStored(CallbackInfoReturnable cir) { MetaMachine machine = getMachine(); - if (machine.getLevel() instanceof ServerLevel serverLevel) { + if (machine.getLevel() instanceof ServerLevel) { outputSubs = machine.subscribeServerTick(this.outputSubs, this::serverTick); - CreativeEnergySavedData savedData = CreativeEnergySavedData - .getOrCreate(serverLevel.getServer().overworld()); UUID uuid = machine.getOwnerUUID(); - if (uuid != null && savedData.isEnabledFor(uuid)) { - cir.setReturnValue(getEnergyCapacity()); + if (uuid != null && CreativeEnergyMultiMachine.isCreativeEnergyEnabledFor(uuid)) { + // return 1 less so active transformers won't turn off + cir.setReturnValue(getEnergyCapacity() - 1); } } } @@ -61,12 +60,10 @@ public MetaMachine getMachine() { @Inject(method = "changeEnergy", at = @At(value = "HEAD"), cancellable = true) private void monilabs$injectBeforeChangeEnergy(long energyToAdd, CallbackInfoReturnable cir) { MetaMachine machine = getMachine(); - if (machine.getLevel() instanceof ServerLevel serverLevel) { + if (machine.getLevel() instanceof ServerLevel) { outputSubs = machine.subscribeServerTick(this.outputSubs, this::serverTick); - CreativeEnergySavedData savedData = CreativeEnergySavedData - .getOrCreate(serverLevel.getServer().overworld()); UUID uuid = machine.getOwnerUUID(); - if (uuid != null && savedData.isEnabledFor(uuid)) { + if (uuid != null && CreativeEnergyMultiMachine.isCreativeEnergyEnabledFor(uuid)) { cir.setReturnValue(energyToAdd); } } diff --git a/src/main/java/net/neganote/monilabs/mixin/PowerSubstationMachineMixin.java b/src/main/java/net/neganote/monilabs/mixin/PowerSubstationMachineMixin.java index f3ec1d92..274ede8a 100644 --- a/src/main/java/net/neganote/monilabs/mixin/PowerSubstationMachineMixin.java +++ b/src/main/java/net/neganote/monilabs/mixin/PowerSubstationMachineMixin.java @@ -5,7 +5,7 @@ import com.gregtechceu.gtceu.common.machine.multiblock.electric.PowerSubstationMachine; import net.minecraft.server.level.ServerLevel; -import net.neganote.monilabs.saveddata.CreativeEnergySavedData; +import net.neganote.monilabs.common.machine.multiblock.CreativeEnergyMultiMachine; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -22,12 +22,9 @@ public PowerSubstationMachineMixin(IMachineBlockEntity holder) { // Prevents substations from performing any power transfers while TES is running @Inject(method = "transferEnergyTick()V", at = @At(value = "HEAD"), cancellable = true) public void monilabs$injectBeforeTransferEnergyTick(CallbackInfo ci) { - if (getLevel() instanceof ServerLevel serverLevel) { - CreativeEnergySavedData savedData = CreativeEnergySavedData - .getOrCreate(serverLevel.getServer().overworld()); - if (savedData.isEnabledFor(getOwnerUUID())) { - ci.cancel(); - } + if (getLevel() instanceof ServerLevel && + CreativeEnergyMultiMachine.isCreativeEnergyEnabledFor(getOwnerUUID())) { + ci.cancel(); } } } diff --git a/src/main/java/net/neganote/monilabs/saveddata/CreativeEnergySavedData.java b/src/main/java/net/neganote/monilabs/saveddata/CreativeEnergySavedData.java deleted file mode 100644 index 988a4f0d..00000000 --- a/src/main/java/net/neganote/monilabs/saveddata/CreativeEnergySavedData.java +++ /dev/null @@ -1,85 +0,0 @@ -package net.neganote.monilabs.saveddata; - -import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.saveddata.SavedData; - -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -public class CreativeEnergySavedData extends SavedData { - - public static String DATA_NAME = "creativeEnergyData"; - public static String ENERGY_OWNERS = "creativeEnergyOwners"; - - private final Map ownersMap = new HashMap<>(); - private boolean hasAnyEnabled = false; - - private CreativeEnergySavedData() {} - - public CreativeEnergySavedData(CompoundTag tag) { - var ownerList = tag.getList(ENERGY_OWNERS, CompoundTag.TAG_COMPOUND); - for (Tag t : ownerList) { - CompoundTag ownerTag = (CompoundTag) t; - long ownerUUIDMSB = ownerTag.getLong("ownerUUIDMSB"); - long ownerUUIDLSB = ownerTag.getLong("ownerUUIDLSB"); - boolean enabled = ownerTag.getBoolean("enabled"); - UUID ownerUUID = new UUID(ownerUUIDMSB, ownerUUIDLSB); - ownersMap.put(ownerUUID, enabled); - if (enabled) { - hasAnyEnabled = true; - } - } - } - - public static CreativeEnergySavedData getOrCreate(ServerLevel serverLevel) { - return serverLevel.getDataStorage().computeIfAbsent(CreativeEnergySavedData::new, - CreativeEnergySavedData::new, DATA_NAME); - } - - @Override - public @NotNull CompoundTag save(@NotNull CompoundTag nbt) { - ListTag ownerList = new ListTag(); - for (UUID ownerUUID : ownersMap.keySet()) { - CompoundTag ownerTag = new CompoundTag(); - ownerTag.putLong("ownerUUIDMSB", ownerUUID.getMostSignificantBits()); - ownerTag.putLong("ownerUUIDLSB", ownerUUID.getLeastSignificantBits()); - ownerTag.putBoolean("enabled", ownersMap.get(ownerUUID)); - ownerList.add(ownerTag); - } - nbt.put(ENERGY_OWNERS, ownerList); - return nbt; - } - - public boolean isEnabledFor(UUID uuid) { - if (!hasAnyEnabled) { - return false; - } - MachineOwner owner = MachineOwner.getOwner(uuid); - if (owner == null) { - return false; - } - return ownersMap.keySet().stream().filter(ownersMap::get).anyMatch(owner::isPlayerInTeam); - } - - public void setEnabled(UUID uuid, boolean enabled) { - Boolean current = ownersMap.get(uuid); - if (current != null && current == enabled) { - return; - } - ownersMap.put(uuid, enabled); - if (enabled) { - hasAnyEnabled = true; - } else { - hasAnyEnabled = ownersMap.values().stream().anyMatch(Boolean::booleanValue); - } - setDirty(); - } -}