public final void openUI(E holder, EntityPlayerMP player) { if (player instanceof FakePlayer) { return; } ModularUI uiTemplate = createUITemplate(holder, player); uiTemplate.initWidgets(); player.getNextWindowId(); player.closeContainer(); int currentWindowId = player.currentWindowId; PacketBuffer serializedHolder = new PacketBuffer(Unpooled.buffer()); writeHolderToSyncData(serializedHolder, holder); int uiFactoryId = FACTORY_REGISTRY.getIDForObject(this); ModularUIContainer container = new ModularUIContainer(uiTemplate); container.windowId = currentWindowId; //accumulate all initial updates of widgets in open packet container.accumulateWidgetUpdateData = true; uiTemplate.guiWidgets.values().forEach(Widget::detectAndSendChanges); container.accumulateWidgetUpdateData = false; ArrayList<PacketUIWidgetUpdate> updateData = new ArrayList<>(container.accumulatedUpdates); container.accumulatedUpdates.clear(); PacketUIOpen packet = new PacketUIOpen(uiFactoryId, serializedHolder, currentWindowId, updateData); NetworkHandler.channel.sendTo(NetworkHandler.packet2proxy(packet), player); container.addListener(player); player.openContainer = container; //and fire forge event only in the end MinecraftForge.EVENT_BUS.post(new PlayerContainerEvent.Open(player, container)); }
public static void openGui(GuiProvider guiProvider, EntityPlayer oPlayer) { if (!(oPlayer instanceof EntityPlayerMP)) { throw new UnsupportedOperationException("Gui can only be opened on the server side"); } EntityPlayerMP player = (EntityPlayerMP) oPlayer; Container container = guiProvider.getContainer(player); if (container == null) { if (guiProvider instanceof PopupGuiProvider) { OpenGUIPacket packet = PacketHandler.getPacket(OpenGUIPacket.class); packet.setGuiID(guiProvider.getId()); packet.setWindowID(-2); packet.setGuiData(LPDataIOWrapper.collectData(guiProvider::writeData)); MainProxy.sendPacketToPlayer(packet, player); } return; } player.getNextWindowId(); player.closeContainer(); int windowId = player.currentWindowId; OpenGUIPacket packet = PacketHandler.getPacket(OpenGUIPacket.class); packet.setGuiID(guiProvider.getId()); packet.setWindowID(windowId); packet.setGuiData(LPDataIOWrapper.collectData(guiProvider::writeData)); MainProxy.sendPacketToPlayer(packet, player); player.openContainer = container; player.openContainer.windowId = windowId; player.openContainer.addListener(player); net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.entity.player.PlayerContainerEvent.Open(player, player.openContainer)); }
private void openGrid(int id, EntityPlayerMP player, @Nullable ItemStack stack, @Nullable BlockPos pos) { Pair<IGrid, TileEntity> grid = createGrid(id, player, stack, pos); if (grid == null) { return; } // @Volatile: FMLNetworkHandler#openGui player.getNextWindowId(); player.closeContainer(); player.openContainer = new ContainerGrid(grid.getLeft(), new ResizableDisplayDummy(), grid.getRight() instanceof TileBase ? (TileBase) grid.getRight() : null, player); player.openContainer.windowId = player.currentWindowId; player.openContainer.addListener(player); MinecraftForge.EVENT_BUS.post(new PlayerContainerEvent.Open(player, player.openContainer)); RS.INSTANCE.network.sendTo(new MessageGridOpen(player.currentWindowId, pos, id, stack), player); }
@SubscribeEvent public static void onCraftingStationGuiOpened(PlayerContainerEvent.Open event) { // by default the container does not update after it has been opened. // we need it to check its recipe if(event.getContainer() instanceof ContainerCraftingStation) { ((ContainerCraftingStation) event.getContainer()).onCraftMatrixChanged(); } }