From 8ce67c167c8f5938b0fed79b1d9727663d9cd9bc Mon Sep 17 00:00:00 2001 From: tth05 <36999320+tth05@users.noreply.github.com> Date: Sun, 15 Oct 2023 21:53:27 +0200 Subject: Fix memory leak of player instances in CoverBehavior (#2333) * Use weak references to store last player in cover behavior * Remove duplicate lastPlayer field from GT_CoverBehavior --- .../java/gregtech/api/util/GT_CoverBehavior.java | 5 +++-- .../gregtech/api/util/GT_CoverBehaviorBase.java | 5 +++-- .../common/covers/GT_Cover_ControlsWork.java | 24 +++++++++++++--------- 3 files changed, 20 insertions(+), 14 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/gregtech/api/util/GT_CoverBehavior.java b/src/main/java/gregtech/api/util/GT_CoverBehavior.java index 2f93d8faf3..34fc151b9a 100644 --- a/src/main/java/gregtech/api/util/GT_CoverBehavior.java +++ b/src/main/java/gregtech/api/util/GT_CoverBehavior.java @@ -2,6 +2,8 @@ package gregtech.api.util; import static gregtech.api.enums.GT_Values.E; +import java.lang.ref.WeakReference; + import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; @@ -20,7 +22,6 @@ import gregtech.api.net.GT_Packet_TileEntityCoverGUI; */ public abstract class GT_CoverBehavior extends GT_CoverBehaviorBase { - public EntityPlayer lastPlayer = null; public boolean mPlayerNotified = false; public GT_CoverBehavior() { @@ -241,7 +242,7 @@ public abstract class GT_CoverBehavior extends GT_CoverBehaviorBase(aPlayer); mPlayerNotified = false; if (useModularUI()) { GT_UIInfos.openCoverUI(aTileEntity, aPlayer, side); diff --git a/src/main/java/gregtech/api/util/GT_CoverBehaviorBase.java b/src/main/java/gregtech/api/util/GT_CoverBehaviorBase.java index 97f02821c1..236396e312 100644 --- a/src/main/java/gregtech/api/util/GT_CoverBehaviorBase.java +++ b/src/main/java/gregtech/api/util/GT_CoverBehaviorBase.java @@ -2,6 +2,7 @@ package gregtech.api.util; import static gregtech.api.enums.GT_Values.E; +import java.lang.ref.WeakReference; import java.util.List; import java.util.function.Supplier; @@ -45,7 +46,7 @@ import gregtech.common.covers.CoverInfo; */ public abstract class GT_CoverBehaviorBase { - public EntityPlayer lastPlayer = null; + public WeakReference lastPlayer = null; private final Class typeToken; private final ITexture coverFGTexture; @@ -620,7 +621,7 @@ public abstract class GT_CoverBehaviorBase { protected boolean onCoverShiftRightClickImpl(ForgeDirection side, int aCoverID, T aCoverVariable, ICoverable aTileEntity, EntityPlayer aPlayer) { if (hasCoverGUI() && aPlayer instanceof EntityPlayerMP) { - lastPlayer = aPlayer; + lastPlayer = new WeakReference<>(aPlayer); if (useModularUI()) { GT_UIInfos.openCoverUI(aTileEntity, aPlayer, side); } else { diff --git a/src/main/java/gregtech/common/covers/GT_Cover_ControlsWork.java b/src/main/java/gregtech/common/covers/GT_Cover_ControlsWork.java index 5145777f06..b57c4d682b 100644 --- a/src/main/java/gregtech/common/covers/GT_Cover_ControlsWork.java +++ b/src/main/java/gregtech/common/covers/GT_Cover_ControlsWork.java @@ -50,16 +50,20 @@ public class GT_Cover_ControlsWork extends GT_CoverBehavior implements IControls if (machine.wasShutdown()) { machine.disableWorking(); if (!mPlayerNotified) { - mPlayerNotified = true; - GT_Utility.sendChatToPlayer( - lastPlayer, - aTileEntity.getInventoryName() + "at " - + String.format( - "(%d,%d,%d)", - aTileEntity.getXCoord(), - aTileEntity.getYCoord(), - aTileEntity.getZCoord()) - + " shut down."); + EntityPlayer player = lastPlayer == null ? null : lastPlayer.get(); + if (player != null) { + lastPlayer = null; + mPlayerNotified = true; + GT_Utility.sendChatToPlayer( + player, + aTileEntity.getInventoryName() + "at " + + String.format( + "(%d,%d,%d)", + aTileEntity.getXCoord(), + aTileEntity.getYCoord(), + aTileEntity.getZCoord()) + + " shut down."); + } } return 2; } else { -- cgit