diff --git a/InvUI/src/main/java/de/studiocode/invui/window/Window.java b/InvUI/src/main/java/de/studiocode/invui/window/Window.java index 0417bf3..d36af34 100644 --- a/InvUI/src/main/java/de/studiocode/invui/window/Window.java +++ b/InvUI/src/main/java/de/studiocode/invui/window/Window.java @@ -160,6 +160,13 @@ public interface Window extends GUIParent { */ void setCloseable(boolean closeable); + /** + * Changes the title of the {@link Inventory}. + * + * @param title The new title + */ + void changeTitle(String title); + /** * Gets the viewer of this {@link Window} * diff --git a/InvUI/src/main/java/de/studiocode/invui/window/impl/BaseWindow.java b/InvUI/src/main/java/de/studiocode/invui/window/impl/BaseWindow.java index 8edd2b1..7ac7504 100644 --- a/InvUI/src/main/java/de/studiocode/invui/window/impl/BaseWindow.java +++ b/InvUI/src/main/java/de/studiocode/invui/window/impl/BaseWindow.java @@ -31,6 +31,8 @@ public abstract class BaseWindow implements Window { private final boolean closeOnEvent; private final SlotElement[] elementsDisplayed; + private String updatedTitle; + private boolean closeable; private boolean closed; @@ -202,7 +204,16 @@ public abstract class BaseWindow implements Window { Player viewer = getViewer(); if (viewer == null) throw new IllegalStateException("The player is not online."); - InventoryAccess.getInventoryUtils().openCustomInventory(viewer, getInventories()[0]); + InventoryAccess.getInventoryUtils().openCustomInventory(viewer, getInventories()[0], updatedTitle); + } + + @Override + public void changeTitle(String title) { + updatedTitle = title; + Player currentViewer = getCurrentViewer(); + if (currentViewer != null) { + InventoryAccess.getInventoryUtils().updateOpenInventoryTitle(currentViewer, title); + } } @Override diff --git a/InventoryAccess/1_14_R1/src/main/java/de/studiocode/inventoryaccess/v1_14_R1/util/InventoryUtilsImpl.java b/InventoryAccess/1_14_R1/src/main/java/de/studiocode/inventoryaccess/v1_14_R1/util/InventoryUtilsImpl.java index 42c63f2..08bfa01 100644 --- a/InventoryAccess/1_14_R1/src/main/java/de/studiocode/inventoryaccess/v1_14_R1/util/InventoryUtilsImpl.java +++ b/InventoryAccess/1_14_R1/src/main/java/de/studiocode/inventoryaccess/v1_14_R1/util/InventoryUtilsImpl.java @@ -14,6 +14,11 @@ public class InventoryUtilsImpl implements InventoryUtils { @Override public void openCustomInventory(Player player, Inventory inventory) { + openCustomInventory(player, inventory, null); + } + + @Override + public void openCustomInventory(Player player, Inventory inventory, String title) { EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle(); Containers windowType = getNotchInventoryType(inventory); @@ -22,18 +27,27 @@ public class InventoryUtilsImpl implements InventoryUtils { container = CraftEventFactory.callInventoryOpenEvent(entityPlayer, container); if (container != null) { IInventory iinventory = ((CraftInventory) inventory).getInventory(); - IChatBaseComponent title; - if (iinventory instanceof ITileInventory) - title = ((ITileInventory) iinventory).getScoreboardDisplayName(); - else title = new ChatComponentText(container.getBukkitView().getTitle()); + IChatBaseComponent titleComponent; + if (title == null) { + if (iinventory instanceof ITileInventory) + titleComponent = ((ITileInventory) iinventory).getScoreboardDisplayName(); + else titleComponent = new ChatComponentText(container.getBukkitView().getTitle()); + } else titleComponent = new ChatComponentText(title); - entityPlayer.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, windowType, title)); + entityPlayer.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, windowType, titleComponent)); entityPlayer.activeContainer = container; entityPlayer.activeContainer.addSlotListener(entityPlayer); } } } + @Override + public void updateOpenInventoryTitle(Player player, String title) { + EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle(); + Container container = entityPlayer.activeContainer; + entityPlayer.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, container.getType(), new ChatComponentText(title))); + } + private static Containers getNotchInventoryType(Inventory inventory) { InventoryType type = inventory.getType(); if (type == InventoryType.CHEST) { diff --git a/InventoryAccess/1_15_R1/src/main/java/de/studiocode/inventoryaccess/v1_15_R1/util/InventoryUtilsImpl.java b/InventoryAccess/1_15_R1/src/main/java/de/studiocode/inventoryaccess/v1_15_R1/util/InventoryUtilsImpl.java index 6a13c36..9dce50e 100644 --- a/InventoryAccess/1_15_R1/src/main/java/de/studiocode/inventoryaccess/v1_15_R1/util/InventoryUtilsImpl.java +++ b/InventoryAccess/1_15_R1/src/main/java/de/studiocode/inventoryaccess/v1_15_R1/util/InventoryUtilsImpl.java @@ -13,6 +13,11 @@ public class InventoryUtilsImpl implements InventoryUtils { @Override public void openCustomInventory(Player player, Inventory inventory) { + openCustomInventory(player, inventory, null); + } + + @Override + public void openCustomInventory(Player player, Inventory inventory, String title) { EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle(); Containers windowType = CraftContainer.getNotchInventoryType(inventory); @@ -21,16 +26,25 @@ public class InventoryUtilsImpl implements InventoryUtils { container = CraftEventFactory.callInventoryOpenEvent(entityPlayer, container); if (container != null) { IInventory iinventory = ((CraftInventory) inventory).getInventory(); - IChatBaseComponent title; - if (iinventory instanceof ITileInventory) - title = ((ITileInventory) iinventory).getScoreboardDisplayName(); - else title = new ChatComponentText(container.getBukkitView().getTitle()); + IChatBaseComponent titleComponent; + if (title == null) { + if (iinventory instanceof ITileInventory) + titleComponent = ((ITileInventory) iinventory).getScoreboardDisplayName(); + else titleComponent = new ChatComponentText(container.getBukkitView().getTitle()); + } else titleComponent = new ChatComponentText(title); - entityPlayer.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, windowType, title)); + entityPlayer.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, windowType, titleComponent)); entityPlayer.activeContainer = container; entityPlayer.activeContainer.addSlotListener(entityPlayer); } } } + @Override + public void updateOpenInventoryTitle(Player player, String title) { + EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle(); + Container container = entityPlayer.activeContainer; + entityPlayer.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, container.getType(), new ChatComponentText(title))); + } + } diff --git a/InventoryAccess/1_16_R1/src/main/java/de/studiocode/inventoryaccess/v1_16_R1/util/InventoryUtilsImpl.java b/InventoryAccess/1_16_R1/src/main/java/de/studiocode/inventoryaccess/v1_16_R1/util/InventoryUtilsImpl.java index 9b22f2a..40af255 100644 --- a/InventoryAccess/1_16_R1/src/main/java/de/studiocode/inventoryaccess/v1_16_R1/util/InventoryUtilsImpl.java +++ b/InventoryAccess/1_16_R1/src/main/java/de/studiocode/inventoryaccess/v1_16_R1/util/InventoryUtilsImpl.java @@ -14,6 +14,11 @@ public class InventoryUtilsImpl implements InventoryUtils { @Override public void openCustomInventory(Player player, Inventory inventory) { + openCustomInventory(player, inventory, null); + } + + @Override + public void openCustomInventory(Player player, Inventory inventory, String title) { EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle(); Containers windowType = CraftContainer.getNotchInventoryType(inventory); @@ -22,16 +27,26 @@ public class InventoryUtilsImpl implements InventoryUtils { container = CraftEventFactory.callInventoryOpenEvent(entityPlayer, container); if (container != null) { IInventory iinventory = ((CraftInventory) inventory).getInventory(); - IChatBaseComponent title; - if (iinventory instanceof ITileInventory) - title = ((ITileInventory) iinventory).getScoreboardDisplayName(); - else title = CraftChatMessage.fromString(container.getBukkitView().getTitle())[0]; + IChatBaseComponent titleComponent; + if (title == null) { + if (iinventory instanceof ITileInventory) + titleComponent = ((ITileInventory) iinventory).getScoreboardDisplayName(); + else titleComponent = CraftChatMessage.fromString(container.getBukkitView().getTitle())[0]; + } else titleComponent = CraftChatMessage.fromString(title)[0]; - entityPlayer.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, windowType, title)); + entityPlayer.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, windowType, titleComponent)); entityPlayer.activeContainer = container; entityPlayer.activeContainer.addSlotListener(entityPlayer); } } } + @Override + public void updateOpenInventoryTitle(Player player, String title) { + EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle(); + Container container = entityPlayer.activeContainer; + IChatBaseComponent titleComponent = CraftChatMessage.fromString(container.getBukkitView().getTitle())[0]; + entityPlayer.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, container.getType(), titleComponent)); + } + } diff --git a/InventoryAccess/1_16_R2/src/main/java/de/studiocode/inventoryaccess/v1_16_R2/util/InventoryUtilsImpl.java b/InventoryAccess/1_16_R2/src/main/java/de/studiocode/inventoryaccess/v1_16_R2/util/InventoryUtilsImpl.java index 16a0157..a13111e 100644 --- a/InventoryAccess/1_16_R2/src/main/java/de/studiocode/inventoryaccess/v1_16_R2/util/InventoryUtilsImpl.java +++ b/InventoryAccess/1_16_R2/src/main/java/de/studiocode/inventoryaccess/v1_16_R2/util/InventoryUtilsImpl.java @@ -14,6 +14,11 @@ public class InventoryUtilsImpl implements InventoryUtils { @Override public void openCustomInventory(Player player, Inventory inventory) { + openCustomInventory(player, inventory, null); + } + + @Override + public void openCustomInventory(Player player, Inventory inventory, String title) { EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle(); Containers windowType = CraftContainer.getNotchInventoryType(inventory); @@ -22,16 +27,26 @@ public class InventoryUtilsImpl implements InventoryUtils { container = CraftEventFactory.callInventoryOpenEvent(entityPlayer, container); if (container != null) { IInventory iinventory = ((CraftInventory) inventory).getInventory(); - IChatBaseComponent title; - if (iinventory instanceof ITileInventory) - title = ((ITileInventory) iinventory).getScoreboardDisplayName(); - else title = CraftChatMessage.fromString(container.getBukkitView().getTitle())[0]; - - entityPlayer.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, windowType, title)); + IChatBaseComponent titleComponent; + if (title == null) { + if (iinventory instanceof ITileInventory) + titleComponent = ((ITileInventory) iinventory).getScoreboardDisplayName(); + else titleComponent = CraftChatMessage.fromString(container.getBukkitView().getTitle())[0]; + } else titleComponent = CraftChatMessage.fromString(title)[0]; + + entityPlayer.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, windowType, titleComponent)); entityPlayer.activeContainer = container; entityPlayer.activeContainer.addSlotListener(entityPlayer); } } } + @Override + public void updateOpenInventoryTitle(Player player, String title) { + EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle(); + Container container = entityPlayer.activeContainer; + IChatBaseComponent titleComponent = CraftChatMessage.fromString(container.getBukkitView().getTitle())[0]; + entityPlayer.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, container.getType(), titleComponent)); + } + } diff --git a/InventoryAccess/1_16_R3/src/main/java/de/studiocode/inventoryaccess/v1_16_R3/util/InventoryUtilsImpl.java b/InventoryAccess/1_16_R3/src/main/java/de/studiocode/inventoryaccess/v1_16_R3/util/InventoryUtilsImpl.java index 3925917..e88026a 100644 --- a/InventoryAccess/1_16_R3/src/main/java/de/studiocode/inventoryaccess/v1_16_R3/util/InventoryUtilsImpl.java +++ b/InventoryAccess/1_16_R3/src/main/java/de/studiocode/inventoryaccess/v1_16_R3/util/InventoryUtilsImpl.java @@ -14,6 +14,11 @@ public class InventoryUtilsImpl implements InventoryUtils { @Override public void openCustomInventory(Player player, Inventory inventory) { + openCustomInventory(player, inventory, null); + } + + @Override + public void openCustomInventory(Player player, Inventory inventory, String title) { EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle(); Containers windowType = CraftContainer.getNotchInventoryType(inventory); @@ -22,16 +27,26 @@ public class InventoryUtilsImpl implements InventoryUtils { container = CraftEventFactory.callInventoryOpenEvent(entityPlayer, container); if (container != null) { IInventory iinventory = ((CraftInventory) inventory).getInventory(); - IChatBaseComponent title; - if (iinventory instanceof ITileInventory) - title = ((ITileInventory) iinventory).getScoreboardDisplayName(); - else title = CraftChatMessage.fromString(container.getBukkitView().getTitle())[0]; - - entityPlayer.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, windowType, title)); + IChatBaseComponent titleComponent; + if (title == null) { + if (iinventory instanceof ITileInventory) + titleComponent = ((ITileInventory) iinventory).getScoreboardDisplayName(); + else titleComponent = CraftChatMessage.fromString(container.getBukkitView().getTitle())[0]; + } else titleComponent = CraftChatMessage.fromString(title)[0]; + + entityPlayer.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, windowType, titleComponent)); entityPlayer.activeContainer = container; entityPlayer.activeContainer.addSlotListener(entityPlayer); } } } + @Override + public void updateOpenInventoryTitle(Player player, String title) { + EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle(); + Container container = entityPlayer.activeContainer; + IChatBaseComponent titleComponent = CraftChatMessage.fromString(container.getBukkitView().getTitle())[0]; + entityPlayer.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, container.getType(), titleComponent)); + } + } diff --git a/InventoryAccess/1_17_R1/src/main/java/de/studiocode/inventoryaccess/v1_17_R1/util/InventoryUtilsImpl.java b/InventoryAccess/1_17_R1/src/main/java/de/studiocode/inventoryaccess/v1_17_R1/util/InventoryUtilsImpl.java index 8d1c46b..06f019c 100644 --- a/InventoryAccess/1_17_R1/src/main/java/de/studiocode/inventoryaccess/v1_17_R1/util/InventoryUtilsImpl.java +++ b/InventoryAccess/1_17_R1/src/main/java/de/studiocode/inventoryaccess/v1_17_R1/util/InventoryUtilsImpl.java @@ -20,6 +20,11 @@ public class InventoryUtilsImpl implements InventoryUtils { @Override public void openCustomInventory(Player player, Inventory inventory) { + openCustomInventory(player, inventory, null); + } + + @Override + public void openCustomInventory(Player player, Inventory inventory, String title) { ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); MenuType menuType = CraftContainer.getNotchInventoryType(inventory); @@ -28,13 +33,15 @@ public class InventoryUtilsImpl implements InventoryUtils { menu = CraftEventFactory.callInventoryOpenEvent(serverPlayer, menu); if (menu != null) { Container container = ((CraftInventory) inventory).getInventory(); - Component title; - if (container instanceof MenuProvider) - title = ((MenuProvider) container).getDisplayName(); - else title = CraftChatMessage.fromString(menu.getBukkitView().getTitle())[0]; + Component titleComponent; + if (title == null) { + if (container instanceof MenuProvider) + titleComponent = ((MenuProvider) container).getDisplayName(); + else titleComponent = CraftChatMessage.fromString(menu.getBukkitView().getTitle())[0]; + } else titleComponent = CraftChatMessage.fromString(title)[0]; menu.checkReachable = false; - serverPlayer.connection.send(new ClientboundOpenScreenPacket(menu.containerId, menuType, title)); + serverPlayer.connection.send(new ClientboundOpenScreenPacket(menu.containerId, menuType, titleComponent)); serverPlayer.containerMenu = menu; serverPlayer.initMenu(menu); } @@ -42,4 +49,11 @@ public class InventoryUtilsImpl implements InventoryUtils { } + @Override + public void updateOpenInventoryTitle(Player player, String title) { + ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); + AbstractContainerMenu menu = serverPlayer.containerMenu; + serverPlayer.connection.send(new ClientboundOpenScreenPacket(menu.containerId, menu.getType(), CraftChatMessage.fromString(title)[0])); + } + } diff --git a/InventoryAccess/api/src/main/java/de/studiocode/inventoryaccess/api/abstraction/util/InventoryUtils.java b/InventoryAccess/api/src/main/java/de/studiocode/inventoryaccess/api/abstraction/util/InventoryUtils.java index 4ec6a8f..b23e854 100644 --- a/InventoryAccess/api/src/main/java/de/studiocode/inventoryaccess/api/abstraction/util/InventoryUtils.java +++ b/InventoryAccess/api/src/main/java/de/studiocode/inventoryaccess/api/abstraction/util/InventoryUtils.java @@ -17,4 +17,24 @@ public interface InventoryUtils { */ void openCustomInventory(Player player, Inventory inventory); + /** + * Opens an {@link Inventory} as a custom inventory with a title that differs from the + * actual title of the {@link Inventory}. + * Internally, this creates a CraftContainer which can save the {@link InventoryView}, + * unlike when using nms Containers, which is the default way for opening Inventories of + * TileEntities. + * + * @param player The {@link Player} to open the {@link Inventory} for + * @param inventory The {@link Inventory} + */ + void openCustomInventory(Player player, Inventory inventory, String title); + + /** + * Changes the title of the {@link Inventory} the player is currently viewing. + * + * @param player The {@link Player} + * @param title The new title + */ + void updateOpenInventoryTitle(Player player, String title); + }