Skip to content

Commit 043d673

Browse files
committed
ability to reopen containers
1 parent e982a6f commit 043d673

6 files changed

Lines changed: 80 additions & 1 deletion

File tree

src/main/java/com/cleanroommc/modularui/api/MCHelper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.cleanroommc.modularui.ModularUI;
44
import com.cleanroommc.modularui.ModularUIConfig;
55
import com.cleanroommc.modularui.api.drawable.IKey;
6+
import com.cleanroommc.modularui.network.ModularNetwork;
67
import com.cleanroommc.modularui.network.NetworkUtils;
78

89
import net.minecraft.client.Minecraft;
@@ -60,6 +61,7 @@ public static void popScreen(boolean openParentOnClose, GuiScreen parent) {
6061
// instead they are kept in a stack until all screens are closed
6162
if (openParentOnClose) {
6263
Minecraft.getMinecraft().displayGuiScreen(parent);
64+
ModularNetwork.CLIENT.reopenSyncerOf(parent);
6365
} else {
6466
Minecraft.getMinecraft().displayGuiScreen(null);
6567
}

src/main/java/com/cleanroommc/modularui/factory/GuiManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public static <T extends GuiData> void open(@NotNull UIFactory<T> factory, @NotN
9090
factory.writeGuiData(guiData, buffer);
9191
int nid = ModularNetwork.SERVER.activate(msm);
9292
NetworkHandler.sendToPlayer(new OpenGuiPacket<>(windowId, nid, factory, buffer), player);
93-
// open container // this mimics forge behaviour
93+
// open container // this mimics forge behavior
9494
player.openContainer = container;
9595
player.openContainer.windowId = windowId;
9696
player.openContainer.addListener(player);

src/main/java/com/cleanroommc/modularui/network/ModularNetwork.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.cleanroommc.modularui.network;
22

3+
import com.cleanroommc.modularui.api.IMuiScreen;
34
import com.cleanroommc.modularui.value.sync.ModularSyncManager;
45

56
import net.minecraft.client.Minecraft;
67
import net.minecraft.client.entity.EntityPlayerSP;
8+
import net.minecraft.client.gui.GuiScreen;
79
import net.minecraft.entity.player.EntityPlayer;
810
import net.minecraft.entity.player.EntityPlayerMP;
911
import net.minecraft.item.ItemStack;
@@ -64,6 +66,14 @@ public void closeContainer(int networkId, boolean dispose, EntityPlayerSP player
6466
public void closeAll() {
6567
closeAll(Minecraft.getMinecraft().player);
6668
}
69+
70+
@SideOnly(Side.CLIENT)
71+
public void reopenSyncerOf(GuiScreen guiScreen) {
72+
if (guiScreen instanceof IMuiScreen ms && !ms.getScreen().isClientOnly()) {
73+
ModularSyncManager msm = ms.getScreen().getSyncManager();
74+
reopen(Minecraft.getMinecraft().player, msm, true);
75+
}
76+
}
6777
}
6878

6979
public static final class Server extends ModularNetworkSide {

src/main/java/com/cleanroommc/modularui/network/ModularNetworkSide.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,15 @@
44
import com.cleanroommc.modularui.network.packets.CloseAllGuiPacket;
55
import com.cleanroommc.modularui.network.packets.CloseGuiPacket;
66
import com.cleanroommc.modularui.network.packets.PacketSyncHandler;
7+
import com.cleanroommc.modularui.network.packets.ReopenGuiPacket;
78
import com.cleanroommc.modularui.screen.ModularContainer;
89
import com.cleanroommc.modularui.value.sync.ModularSyncManager;
910
import com.cleanroommc.modularui.value.sync.SyncHandler;
1011

1112
import net.minecraft.entity.player.EntityPlayer;
1213
import net.minecraft.network.PacketBuffer;
14+
import net.minecraftforge.common.MinecraftForge;
15+
import net.minecraftforge.event.entity.player.PlayerContainerEvent;
1316

1417
import it.unimi.dsi.fastutil.ints.Int2ReferenceOpenHashMap;
1518
import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap;
@@ -115,4 +118,20 @@ void deactivate(int networkId, boolean dispose) {
115118
msm.dispose();
116119
}
117120
}
121+
122+
@ApiStatus.Internal
123+
public void reopen(EntityPlayer player, ModularSyncManager msm, boolean sync) {
124+
if (player.openContainer != msm.getContainer()) {
125+
closeContainer(player);
126+
player.openContainer = msm.getContainer();
127+
msm.onOpen();
128+
MinecraftForge.EVENT_BUS.post(new PlayerContainerEvent.Open(player, msm.getContainer()));
129+
}
130+
if (sync) sendPacket(new ReopenGuiPacket(inverseActiveScreens.getInt(msm)), player);
131+
}
132+
133+
@ApiStatus.Internal
134+
public void reopen(EntityPlayer player, int networkId, boolean sync) {
135+
reopen(player, activeScreens.get(networkId), sync);
136+
}
118137
}

src/main/java/com/cleanroommc/modularui/network/NetworkHandler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.cleanroommc.modularui.network.packets.CloseGuiPacket;
66
import com.cleanroommc.modularui.network.packets.OpenGuiPacket;
77
import com.cleanroommc.modularui.network.packets.PacketSyncHandler;
8+
import com.cleanroommc.modularui.network.packets.ReopenGuiPacket;
89
import com.cleanroommc.modularui.network.packets.SClipboard;
910
import com.cleanroommc.modularui.network.packets.SyncConfig;
1011

@@ -30,6 +31,7 @@ public static void init() {
3031
registerC2S(SyncConfig.class);
3132

3233
registerBoth(OpenGuiPacket.class);
34+
registerBoth(ReopenGuiPacket.class);
3335
registerBoth(CloseGuiPacket.class);
3436
registerBoth(CloseAllGuiPacket.class);
3537
registerBoth(PacketSyncHandler.class);
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.cleanroommc.modularui.network.packets;
2+
3+
import com.cleanroommc.modularui.network.IPacket;
4+
import com.cleanroommc.modularui.network.ModularNetwork;
5+
6+
import net.minecraft.client.Minecraft;
7+
import net.minecraft.client.network.NetHandlerPlayClient;
8+
import net.minecraft.network.NetHandlerPlayServer;
9+
import net.minecraft.network.PacketBuffer;
10+
11+
import org.jetbrains.annotations.Nullable;
12+
13+
import java.io.IOException;
14+
15+
public class ReopenGuiPacket implements IPacket {
16+
17+
private int networkId;
18+
19+
public ReopenGuiPacket() {}
20+
21+
public ReopenGuiPacket(int networkId) {
22+
this.networkId = networkId;
23+
}
24+
25+
@Override
26+
public void write(PacketBuffer buf) throws IOException {
27+
buf.writeInt(networkId);
28+
}
29+
30+
@Override
31+
public void read(PacketBuffer buf) throws IOException {
32+
this.networkId = buf.readInt();
33+
}
34+
35+
@Override
36+
public @Nullable IPacket executeClient(NetHandlerPlayClient handler) {
37+
ModularNetwork.CLIENT.reopen(Minecraft.getMinecraft().player, this.networkId, false);
38+
return null;
39+
}
40+
41+
@Override
42+
public @Nullable IPacket executeServer(NetHandlerPlayServer handler) {
43+
ModularNetwork.SERVER.reopen(handler.player, this.networkId, false);
44+
return null;
45+
}
46+
}

0 commit comments

Comments
 (0)