-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add titleOverride to InventoryOpenEvent (#7540)
- Loading branch information
1 parent
6813244
commit 7d13b70
Showing
2 changed files
with
172 additions
and
0 deletions.
There are no files selected for viewing
52 changes: 52 additions & 0 deletions
52
patches/api/0439-Add-titleOverride-to-InventoryOpenEvent.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||
From: Jake Potrebic <[email protected]> | ||
Date: Fri, 4 Mar 2022 12:45:21 -0800 | ||
Subject: [PATCH] Add titleOverride to InventoryOpenEvent | ||
|
||
|
||
diff --git a/src/main/java/org/bukkit/event/inventory/InventoryOpenEvent.java b/src/main/java/org/bukkit/event/inventory/InventoryOpenEvent.java | ||
index ceae092eb782698803c6c3df41267dde20ba62b2..8e2afeab4c62724148e8bb0c83fb7eec569c7a0c 100644 | ||
--- a/src/main/java/org/bukkit/event/inventory/InventoryOpenEvent.java | ||
+++ b/src/main/java/org/bukkit/event/inventory/InventoryOpenEvent.java | ||
@@ -12,6 +12,7 @@ import org.jetbrains.annotations.NotNull; | ||
public class InventoryOpenEvent extends InventoryEvent implements Cancellable { | ||
private static final HandlerList handlers = new HandlerList(); | ||
private boolean cancelled; | ||
+ private net.kyori.adventure.text.Component titleOverride; // Paper | ||
|
||
public InventoryOpenEvent(@NotNull InventoryView transaction) { | ||
super(transaction); | ||
@@ -56,6 +57,33 @@ public class InventoryOpenEvent extends InventoryEvent implements Cancellable { | ||
cancelled = cancel; | ||
} | ||
|
||
+ // Paper start | ||
+ /** | ||
+ * Gets the title override set by another event or null | ||
+ * if not set. | ||
+ * | ||
+ * @return the title override or null | ||
+ */ | ||
+ public [email protected] Component titleOverride() { | ||
+ return this.titleOverride; | ||
+ } | ||
+ | ||
+ /** | ||
+ * Sets the title override or clears the override. | ||
+ * <p> | ||
+ * This is only the title sent to the client in the open packet, this doesn't change | ||
+ * the title returned by {@link InventoryView#title()}, hence "override". | ||
+ * <p> | ||
+ * <b>NOTE:</b> Horse inventories are a special case where setting this will | ||
+ * have no effect. Horse inventory titles are set by the horse display name. | ||
+ * | ||
+ * @param titleOverride the title override or null | ||
+ */ | ||
+ public void titleOverride([email protected] Component titleOverride) { | ||
+ this.titleOverride = titleOverride; | ||
+ } | ||
+ // Paper end | ||
+ | ||
@NotNull | ||
@Override | ||
public HandlerList getHandlers() { |
120 changes: 120 additions & 0 deletions
120
patches/server/1027-Add-titleOverride-to-InventoryOpenEvent.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||
From: Jake Potrebic <[email protected]> | ||
Date: Fri, 4 Mar 2022 12:45:03 -0800 | ||
Subject: [PATCH] Add titleOverride to InventoryOpenEvent | ||
|
||
|
||
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java | ||
index 161c40692e8d469fad4169908b9353be0f85d0d8..b382da838acc04a1c5d89064b4fa43bcdd38ae71 100644 | ||
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java | ||
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java | ||
@@ -1559,12 +1559,17 @@ public class ServerPlayer extends Player { | ||
this.nextContainerCounter(); | ||
AbstractContainerMenu container = factory.createMenu(this.containerCounter, this.getInventory(), this); | ||
|
||
+ Component title = null; // Paper | ||
// CraftBukkit start - Inventory open hook | ||
if (container != null) { | ||
container.setTitle(factory.getDisplayName()); | ||
|
||
boolean cancelled = false; | ||
- container = CraftEventFactory.callInventoryOpenEvent(this, container, cancelled); | ||
+ // Paper start | ||
+ final com.mojang.datafixers.util.Pair<net.kyori.adventure.text.Component, AbstractContainerMenu> result = CraftEventFactory.callInventoryOpenEventWithTitle(this, container, cancelled); | ||
+ container = result.getSecond(); | ||
+ title = PaperAdventure.asVanilla(result.getFirst()); | ||
+ // Paper end | ||
if (container == null && !cancelled) { // Let pre-cancelled events fall through | ||
// SPIGOT-5263 - close chest if cancelled | ||
if (factory instanceof Container) { | ||
@@ -1586,7 +1591,7 @@ public class ServerPlayer extends Player { | ||
} else { | ||
// CraftBukkit start | ||
this.containerMenu = container; | ||
- if (!this.isImmobile()) this.connection.send(new ClientboundOpenScreenPacket(container.containerId, container.getType(), container.getTitle())); // Paper | ||
+ if (!this.isImmobile()) this.connection.send(new ClientboundOpenScreenPacket(container.containerId, container.getType(), Objects.requireNonNullElseGet(title, container::getTitle))); // Paper | ||
// CraftBukkit end | ||
this.initMenu(container); | ||
return OptionalInt.of(this.containerCounter); | ||
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java | ||
index 5fe9a0985432ac6cdd28a2a138854a24f10e42ba..7db63d9ef93902872937b69f431137336e4abc3a 100644 | ||
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java | ||
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java | ||
@@ -357,12 +357,16 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { | ||
Preconditions.checkArgument(windowType != null, "Unknown windowType"); | ||
AbstractContainerMenu container = new CraftContainer(inventory, player, player.nextContainerCounter()); | ||
|
||
- container = CraftEventFactory.callInventoryOpenEvent(player, container); | ||
+ // Paper start | ||
+ final com.mojang.datafixers.util.Pair<net.kyori.adventure.text.Component, AbstractContainerMenu> result = CraftEventFactory.callInventoryOpenEventWithTitle(player, container); | ||
+ container = result.getSecond(); | ||
+ // Paper end | ||
if (container == null) return; | ||
|
||
//String title = container.getBukkitView().getTitle(); // Paper - comment | ||
net.kyori.adventure.text.Component adventure$title = container.getBukkitView().title(); // Paper | ||
if (adventure$title == null) adventure$title = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(container.getBukkitView().getTitle()); // Paper | ||
+ if (result.getFirst() != null) adventure$title = result.getFirst(); // Paper | ||
|
||
//player.connection.send(new ClientboundOpenScreenPacket(container.containerId, windowType, CraftChatMessage.fromString(title)[0])); // Paper - comment | ||
if (!player.isImmobile()) player.connection.send(new ClientboundOpenScreenPacket(container.containerId, windowType, io.papermc.paper.adventure.PaperAdventure.asVanilla(adventure$title))); // Paper | ||
@@ -438,7 +442,10 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { | ||
} | ||
|
||
// Trigger an INVENTORY_OPEN event | ||
- container = CraftEventFactory.callInventoryOpenEvent(player, container); | ||
+ // Paper start | ||
+ final com.mojang.datafixers.util.Pair<net.kyori.adventure.text.Component, AbstractContainerMenu> result = CraftEventFactory.callInventoryOpenEventWithTitle(player, container); | ||
+ container = result.getSecond(); | ||
+ // Paper end | ||
if (container == null) { | ||
return; | ||
} | ||
@@ -449,6 +456,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { | ||
//String title = inventory.getTitle(); // Paper - comment | ||
net.kyori.adventure.text.Component adventure$title = inventory.title(); // Paper | ||
if (adventure$title == null) adventure$title = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(inventory.getTitle()); // Paper | ||
+ if (result.getFirst() != null) adventure$title = result.getFirst(); // Paper | ||
//player.connection.send(new ClientboundOpenScreenPacket(container.containerId, windowType, CraftChatMessage.fromString(title)[0])); // Paper - comment | ||
if (!player.isImmobile()) player.connection.send(new ClientboundOpenScreenPacket(container.containerId, windowType, io.papermc.paper.adventure.PaperAdventure.asVanilla(adventure$title))); // Paper | ||
player.containerMenu = container; | ||
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java | ||
index 676c44f688c41df66e304db30a05d6cc967bcf99..090b1ee57ddef58ca71469ad860960f66da7d5a2 100644 | ||
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java | ||
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java | ||
@@ -1413,10 +1413,21 @@ public class CraftEventFactory { | ||
} | ||
|
||
public static AbstractContainerMenu callInventoryOpenEvent(ServerPlayer player, AbstractContainerMenu container) { | ||
- return CraftEventFactory.callInventoryOpenEvent(player, container, false); | ||
+ // Paper start | ||
+ return callInventoryOpenEventWithTitle(player, container).getSecond(); | ||
+ } | ||
+ public static com.mojang.datafixers.util.Pair<[email protected] Component, @org.jetbrains.annotations.Nullable AbstractContainerMenu> callInventoryOpenEventWithTitle(ServerPlayer player, AbstractContainerMenu container) { | ||
+ return CraftEventFactory.callInventoryOpenEventWithTitle(player, container, false); | ||
+ // Paper end | ||
} | ||
|
||
+ @Deprecated @io.papermc.paper.annotation.DoNotUse // Paper - use method that acknowledges title overrides | ||
public static AbstractContainerMenu callInventoryOpenEvent(ServerPlayer player, AbstractContainerMenu container, boolean cancelled) { | ||
+ // Paper start | ||
+ return callInventoryOpenEventWithTitle(player, container, cancelled).getSecond(); | ||
+ } | ||
+ public static com.mojang.datafixers.util.Pair<[email protected] Component, @org.jetbrains.annotations.Nullable AbstractContainerMenu> callInventoryOpenEventWithTitle(ServerPlayer player, AbstractContainerMenu container, boolean cancelled) { | ||
+ // Paper end | ||
if (player.containerMenu != player.inventoryMenu) { // fire INVENTORY_CLOSE if one already open | ||
player.connection.handleContainerClose(new ServerboundContainerClosePacket(player.containerMenu.containerId), InventoryCloseEvent.Reason.OPEN_NEW); // Paper | ||
} | ||
@@ -1431,10 +1442,10 @@ public class CraftEventFactory { | ||
|
||
if (event.isCancelled()) { | ||
container.transferTo(player.containerMenu, craftPlayer); | ||
- return null; | ||
+ return com.mojang.datafixers.util.Pair.of(null, null); // Paper - title override | ||
} | ||
|
||
- return container; | ||
+ return com.mojang.datafixers.util.Pair.of(event.titleOverride(), container); // Paper - title override | ||
} | ||
|
||
public static ItemStack callPreCraftEvent(Container matrix, Container resultInventory, ItemStack result, InventoryView lastCraftView, boolean isRepair) { |