Skip to content

Commit 32ef9f5

Browse files
committed
better way to handle closing ui on invalidate
1 parent f1277e9 commit 32ef9f5

File tree

2 files changed

+32
-29
lines changed

2 files changed

+32
-29
lines changed

src/main/java/gregtech/api/metatileentity/MetaTileEntity.java

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import gregtech.api.cover.CoverRayTracer;
1919
import gregtech.api.cover.CoverSaveHandler;
2020
import gregtech.api.cover.CoverUtil;
21+
import gregtech.api.cover.CoverWithUI;
2122
import gregtech.api.gui.ModularUI;
2223
import gregtech.api.items.itemhandlers.GTItemStackHandler;
2324
import gregtech.api.items.toolitem.ToolClasses;
@@ -101,6 +102,7 @@
101102
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
102103
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
103104
import it.unimi.dsi.fastutil.objects.ObjectArraySet;
105+
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
104106
import org.apache.commons.lang3.ArrayUtils;
105107
import org.apache.commons.lang3.tuple.Pair;
106108
import org.jetbrains.annotations.ApiStatus;
@@ -110,8 +112,10 @@
110112
import java.util.ArrayList;
111113
import java.util.Collections;
112114
import java.util.EnumMap;
115+
import java.util.Iterator;
113116
import java.util.List;
114117
import java.util.Map;
118+
import java.util.Objects;
115119
import java.util.Set;
116120
import java.util.UUID;
117121
import java.util.function.BiConsumer;
@@ -167,12 +171,17 @@ public abstract class MetaTileEntity implements ISyncedTileEntity, CoverHolder,
167171

168172
@Nullable
169173
private UUID owner = null;
174+
private Set<UUID> uiPlayers = new ObjectOpenHashSet<>();
175+
private EnumMap<EnumFacing, Set<UUID>> uiCoverPlayers = new EnumMap<>(EnumFacing.class);
170176

171177
private final Set<CreativeTabs> creativeTabs = new ObjectArraySet<>();
172178

173179
{
174180
creativeTabs.add(CreativeTabs.SEARCH);
175181
creativeTabs.add(GTCreativeTabs.TAB_GREGTECH_MACHINES);
182+
for (EnumFacing facing : EnumFacing.VALUES) {
183+
uiCoverPlayers.put(facing, new ObjectOpenHashSet<>());
184+
}
176185
}
177186

178187
protected MetaTileEntity(@NotNull ResourceLocation metaTileEntityId) {
@@ -520,6 +529,7 @@ public boolean onRightClick(EntityPlayer playerIn, EnumHand hand, EnumFacing fac
520529
if (!playerIn.isSneaking() && openGUIOnRightClick()) {
521530
if (getWorld() != null && !getWorld().isRemote) {
522531
if (usesMui2()) {
532+
uiPlayers.add(playerIn.getUniqueID());
523533
MetaTileEntityGuiFactory.open(playerIn, this);
524534
} else {
525535
MetaTileEntityUIFactory.INSTANCE.openUI(getHolder(), (EntityPlayerMP) playerIn);
@@ -558,6 +568,9 @@ public boolean onRightClick(EntityPlayer playerIn, EnumHand hand, EnumFacing fac
558568
EnumFacing gridSideHit = CoverRayTracer.determineGridSideHit(hitResult);
559569
cover = gridSideHit == null ? null : getCoverAtSide(gridSideHit);
560570
if (cover != null && playerIn.isSneaking() && playerIn.getHeldItemMainhand().isEmpty()) {
571+
if (cover instanceof CoverWithUI) {
572+
uiCoverPlayers.get(gridSideHit).add(playerIn.getUniqueID());
573+
}
561574
return cover.onScrewdriverClick(playerIn, hand, hitResult) == EnumActionResult.SUCCESS;
562575
}
563576
}
@@ -640,6 +653,11 @@ public boolean onCrowbarClick(EntityPlayer playerIn, EnumHand hand, EnumFacing f
640653
CuboidRayTraceResult hitResult) {
641654
if (getCoverAtSide(facing) != null) {
642655
removeCover(facing);
656+
Iterator<UUID> iterator = uiCoverPlayers.get(facing).iterator();
657+
while (iterator.hasNext()) {
658+
Objects.requireNonNull(getWorld().getPlayerEntityByUUID(iterator.next())).closeScreen();
659+
iterator.remove();
660+
}
643661
return true;
644662
}
645663
return false;
@@ -1431,7 +1449,18 @@ public void invalidate() {
14311449
if (getWorld().isRemote) {
14321450
GregTechAPI.soundManager.stopTileSound(getPos());
14331451
} else {
1434-
MetaTileEntityGuiFactory.close(getPos(), getWorld());
1452+
Iterator<UUID> iterator = uiPlayers.iterator();
1453+
while (iterator.hasNext()) {
1454+
Objects.requireNonNull(getWorld().getPlayerEntityByUUID(iterator.next())).closeScreen();
1455+
iterator.remove();
1456+
}
1457+
for (Set<UUID> value : uiCoverPlayers.values()) {
1458+
iterator = value.iterator();
1459+
while (iterator.hasNext()) {
1460+
Objects.requireNonNull(getWorld().getPlayerEntityByUUID(iterator.next())).closeScreen();
1461+
iterator.remove();
1462+
}
1463+
}
14351464
}
14361465
}
14371466

src/main/java/gregtech/api/mui/factory/MetaTileEntityGuiFactory.java

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,19 @@
88
import net.minecraft.network.PacketBuffer;
99
import net.minecraft.tileentity.TileEntity;
1010
import net.minecraft.util.math.BlockPos;
11-
import net.minecraft.world.World;
1211

1312
import com.cleanroommc.modularui.api.IGuiHolder;
1413
import com.cleanroommc.modularui.factory.AbstractUIFactory;
1514
import com.cleanroommc.modularui.factory.GuiManager;
1615
import com.cleanroommc.modularui.factory.PosGuiData;
17-
import it.unimi.dsi.fastutil.longs.Long2ObjectArrayMap;
18-
import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
19-
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
2016
import org.jetbrains.annotations.NotNull;
2117

22-
import java.util.Iterator;
2318
import java.util.Objects;
24-
import java.util.Set;
25-
import java.util.UUID;
2619

2720
public class MetaTileEntityGuiFactory extends AbstractUIFactory<PosGuiData> {
2821

2922
public static final MetaTileEntityGuiFactory INSTANCE = new MetaTileEntityGuiFactory();
3023

31-
private static final Long2ObjectMap<Set<UUID>> openedUIs = new Long2ObjectArrayMap<>();
32-
3324
private MetaTileEntityGuiFactory() {
3425
super("gregtech:mte");
3526
}
@@ -44,25 +35,8 @@ public static <T extends MetaTileEntity & IGuiHolder<PosGuiData>> void open(Enti
4435
throw new IllegalArgumentException("MetaTileEntity must be in same dimension as the player!");
4536
}
4637
BlockPos pos = mte.getPos();
47-
Set<UUID> players = openedUIs.computeIfAbsent(pos.toLong(), key -> new ObjectOpenHashSet<>());
48-
if (players.add(player.getUniqueID())) {
49-
PosGuiData data = new PosGuiData(player, pos.getX(), pos.getY(), pos.getZ());
50-
GuiManager.open(INSTANCE, data, (EntityPlayerMP) player);
51-
}
52-
}
53-
54-
public static void close(BlockPos pos, World world) {
55-
if (world.isRemote) {
56-
return;
57-
}
58-
Iterator<UUID> iterator = openedUIs.get(pos.toLong()).iterator();
59-
while (iterator.hasNext()) {
60-
var p = world.getPlayerEntityByUUID(iterator.next());
61-
if (p != null) {
62-
p.closeScreen();
63-
iterator.remove();
64-
}
65-
}
38+
PosGuiData data = new PosGuiData(player, pos.getX(), pos.getY(), pos.getZ());
39+
GuiManager.open(INSTANCE, data, (EntityPlayerMP) player);
6640
}
6741

6842
@Override

0 commit comments

Comments
 (0)