package crazypants.enderio.enderface; import gnu.trove.map.TObjectIntMap; import gnu.trove.map.hash.TObjectIntHashMap; import java.util.UUID; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.Container; import net.minecraft.inventory.ContainerPlayer; import net.minecraftforge.event.entity.player.PlayerOpenContainerEvent; import com.enderio.core.common.Handlers.Handler; import cpw.mods.fml.common.eventhandler.Event.Result; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent.Phase; import cpw.mods.fml.common.gameevent.TickEvent.PlayerTickEvent; @Handler public enum EnderIOController { INSTANCE; private TObjectIntMap<UUID> openedContainers = new TObjectIntHashMap<UUID>(); private int clientWindowId; private boolean locked = false; public void addContainer(EntityPlayerMP player, Container opened) { openedContainers.put(player.getGameProfile().getId(), opened.windowId); } void lockAndWaitForChange(int windowId) { clientWindowId = windowId; locked = true; } void unlock() { locked = false; } @SubscribeEvent public void onContainerTick(PlayerOpenContainerEvent event) { Container c = event.entityPlayer.openContainer; if (c != null && !(c instanceof ContainerPlayer) && (c.windowId == clientWindowId || openedContainers.containsValue(c.windowId))) { event.setResult(Result.ALLOW); } } @SubscribeEvent public void onPlayerTick(PlayerTickEvent event) { if (event.phase == Phase.END) { if (event.side.isServer()) { int windowId = openedContainers.get(event.player.getGameProfile().getId()); if (event.player.openContainer == null || event.player.openContainer.windowId != windowId) { openedContainers.remove(event.player.getGameProfile().getId()); } } else { int windowId = event.player.openContainer.windowId; if (windowId != clientWindowId && locked) { clientWindowId = windowId; locked = false; System.out.println("Unlocked and set windowId to " + clientWindowId); } } } } }