Skip to content

Commit 91ca77d

Browse files
smol inventory translator refactor (#5473)
* gah generics * compiles * Add getOpenInventory method * Remove debug, attempt to resolve barrel issues * Fix some edge-cases related to lecterns * inventory -> container renames * Fix component check in JavaOpenBookTranslator, increase open attempts to 5 * Remove session variable used to force-close the player inventory, use confirm variable instead. Also: fix rare issues where server-side requested lectern closing didn't work for real lectern blocks * Update core/src/main/java/org/geysermc/geyser/translator/inventory/InventoryTranslator.java * Use closingInventory for lecterns too * fix debug
1 parent 20680b3 commit 91ca77d

File tree

81 files changed

+1030
-837
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

81 files changed

+1030
-837
lines changed

core/src/main/java/org/geysermc/geyser/command/defaults/AdvancedTooltipsCommand.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,6 @@ public void execute(CommandContext<GeyserCommandSource> context) {
5151
+ MinecraftLocale.getLocaleString("debug.prefix", session.locale())
5252
+ " " + ChatColor.RESET
5353
+ MinecraftLocale.getLocaleString("debug.advanced_tooltips." + onOrOff, session.locale()));
54-
session.getPlayerInventory().updateInventory();
54+
session.getPlayerInventoryHolder().updateInventory();
5555
}
5656
}

core/src/main/java/org/geysermc/geyser/inventory/AnvilContainer.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import net.kyori.adventure.text.Component;
3131
import org.checkerframework.checker.nullness.qual.Nullable;
3232
import org.geysermc.geyser.session.GeyserSession;
33-
import org.geysermc.geyser.translator.inventory.InventoryTranslator;
3433
import org.geysermc.geyser.translator.text.MessageTranslator;
3534
import org.geysermc.mcprotocollib.protocol.data.game.inventory.ContainerType;
3635
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponentTypes;
@@ -63,8 +62,8 @@ public class AnvilContainer extends Container {
6362

6463
private int lastTargetSlot = -1;
6564

66-
public AnvilContainer(GeyserSession session, String title, int id, int size, ContainerType containerType, PlayerInventory playerInventory, InventoryTranslator translator) {
67-
super(session, title, id, size, containerType, playerInventory, translator);
65+
public AnvilContainer(GeyserSession session, String title, int id, int size, ContainerType containerType) {
66+
super(session, title, id, size, containerType);
6867
}
6968

7069
/**

core/src/main/java/org/geysermc/geyser/inventory/BeaconContainer.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,18 @@
2525

2626
package org.geysermc.geyser.inventory;
2727

28-
import org.geysermc.geyser.session.GeyserSession;
29-
import org.geysermc.geyser.translator.inventory.InventoryTranslator;
30-
import org.geysermc.mcprotocollib.protocol.data.game.inventory.ContainerType;
3128
import lombok.Getter;
3229
import lombok.Setter;
30+
import org.geysermc.geyser.session.GeyserSession;
31+
import org.geysermc.mcprotocollib.protocol.data.game.inventory.ContainerType;
3332

3433
@Getter
3534
@Setter
3635
public class BeaconContainer extends Container {
3736
private int primaryId;
3837
private int secondaryId;
3938

40-
public BeaconContainer(GeyserSession session, String title, int id, int size, ContainerType containerType, PlayerInventory playerInventory, InventoryTranslator translator) {
41-
super(session, title, id, size, containerType, playerInventory, translator);
39+
public BeaconContainer(GeyserSession session, String title, int id, int size, ContainerType containerType) {
40+
super(session, title, id, size, containerType);
4241
}
4342
}

core/src/main/java/org/geysermc/geyser/inventory/CartographyContainer.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,10 @@
2626
package org.geysermc.geyser.inventory;
2727

2828
import org.geysermc.geyser.session.GeyserSession;
29-
import org.geysermc.geyser.translator.inventory.InventoryTranslator;
3029
import org.geysermc.mcprotocollib.protocol.data.game.inventory.ContainerType;
3130

3231
public class CartographyContainer extends Container {
33-
public CartographyContainer(GeyserSession session, String title, int id, int size, ContainerType containerType, PlayerInventory playerInventory, InventoryTranslator translator) {
34-
super(session, title, id, size, containerType, playerInventory, translator);
32+
public CartographyContainer(GeyserSession session, String title, int id, int size, ContainerType containerType) {
33+
super(session, title, id, size, containerType);
3534
}
3635
}

core/src/main/java/org/geysermc/geyser/inventory/Container.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ public class Container extends Inventory {
4646
*/
4747
private boolean isUsingRealBlock = false;
4848

49-
public Container(GeyserSession session, String title, int id, int size, ContainerType containerType, PlayerInventory playerInventory, InventoryTranslator translator) {
50-
super(session, title, id, size, containerType, translator);
51-
this.playerInventory = playerInventory;
49+
public Container(GeyserSession session, String title, int id, int size, ContainerType containerType) {
50+
super(session, title, id, size, containerType);
51+
this.playerInventory = session.getPlayerInventory();
5252
this.containerSize = this.size + InventoryTranslator.PLAYER_INVENTORY_SIZE;
5353
}
5454

core/src/main/java/org/geysermc/geyser/inventory/CrafterContainer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ public class CrafterContainer extends Container {
4848
*/
4949
private short disabledSlotsMask = 0;
5050

51-
public CrafterContainer(GeyserSession session, String title, int id, int size, ContainerType containerType, PlayerInventory playerInventory, InventoryTranslator translator) {
52-
super(session, title, id, size, containerType, playerInventory, translator);
51+
public CrafterContainer(GeyserSession session, String title, int id, int size, ContainerType containerType) {
52+
super(session, title, id, size, containerType);
5353
}
5454

5555
@Override

core/src/main/java/org/geysermc/geyser/inventory/EnchantingContainer.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
package org.geysermc.geyser.inventory;
2727

2828
import org.geysermc.geyser.session.GeyserSession;
29-
import org.geysermc.geyser.translator.inventory.InventoryTranslator;
3029
import org.geysermc.mcprotocollib.protocol.data.game.inventory.ContainerType;
3130
import org.cloudburstmc.protocol.bedrock.data.inventory.EnchantOptionData;
3231
import lombok.Getter;
@@ -42,8 +41,8 @@ public class EnchantingContainer extends Container {
4241
*/
4342
private final GeyserEnchantOption[] geyserEnchantOptions;
4443

45-
public EnchantingContainer(GeyserSession session, String title, int id, int size, ContainerType containerType, PlayerInventory playerInventory, InventoryTranslator translator) {
46-
super(session, title, id, size, containerType, playerInventory, translator);
44+
public EnchantingContainer(GeyserSession session, String title, int id, int size, ContainerType containerType) {
45+
super(session, title, id, size, containerType);
4746

4847
enchantOptions = new EnchantOptionData[3];
4948
geyserEnchantOptions = new GeyserEnchantOption[3];

core/src/main/java/org/geysermc/geyser/inventory/Generic3X3Container.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,19 @@
3030
import org.geysermc.geyser.level.block.type.Block;
3131
import org.geysermc.geyser.session.GeyserSession;
3232
import org.geysermc.geyser.translator.inventory.Generic3X3InventoryTranslator;
33-
import org.geysermc.geyser.translator.inventory.InventoryTranslator;
3433
import org.geysermc.mcprotocollib.protocol.data.game.inventory.ContainerType;
3534

3635
@Getter
3736
public class Generic3X3Container extends Container {
3837
/**
3938
* Whether we need to set the container type as {@link org.cloudburstmc.protocol.bedrock.data.inventory.ContainerType#DROPPER}.
4039
* <p>
41-
* Used at {@link Generic3X3InventoryTranslator#openInventory(GeyserSession, Inventory)}
40+
* Used at {@link Generic3X3InventoryTranslator#openInventory(GeyserSession, Generic3X3Container)}
4241
*/
4342
private boolean isDropper = false;
4443

45-
public Generic3X3Container(GeyserSession session, String title, int id, int size, ContainerType containerType, PlayerInventory playerInventory, InventoryTranslator translator) {
46-
super(session, title, id, size, containerType, playerInventory, translator);
44+
public Generic3X3Container(GeyserSession session, String title, int id, int size, ContainerType containerType) {
45+
super(session, title, id, size, containerType);
4746
}
4847

4948
@Override
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* Copyright (c) 2025 GeyserMC. http://geysermc.org
3+
*
4+
* Permission is hereby granted, free of charge, to any person obtaining a copy
5+
* of this software and associated documentation files (the "Software"), to deal
6+
* in the Software without restriction, including without limitation the rights
7+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8+
* copies of the Software, and to permit persons to whom the Software is
9+
* furnished to do so, subject to the following conditions:
10+
*
11+
* The above copyright notice and this permission notice shall be included in
12+
* all copies or substantial portions of the Software.
13+
*
14+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20+
* THE SOFTWARE.
21+
*
22+
* @author GeyserMC
23+
* @link https://github.com/GeyserMC/Geyser
24+
*/
25+
26+
package org.geysermc.geyser.inventory;
27+
28+
import lombok.Getter;
29+
import lombok.Setter;
30+
import org.geysermc.geyser.level.block.Blocks;
31+
import org.geysermc.geyser.level.block.type.Block;
32+
import org.geysermc.geyser.session.GeyserSession;
33+
import org.geysermc.mcprotocollib.protocol.data.game.inventory.ContainerType;
34+
35+
/**
36+
* A "hack" to be able to use existing barrels.
37+
* The only difference to chests appears to be the different ContainerSlotType - this accounts for it.
38+
*/
39+
@Getter @Setter
40+
public class Generic9X3Container extends Container {
41+
42+
private boolean isBarrel;
43+
44+
public Generic9X3Container(GeyserSession session, String title, int id, int size, ContainerType containerType) {
45+
super(session, title, id, size, containerType);
46+
}
47+
48+
@Override
49+
public void setUsingRealBlock(boolean usingRealBlock, Block block) {
50+
super.setUsingRealBlock(usingRealBlock, block);
51+
if (usingRealBlock) {
52+
isBarrel = block == Blocks.BARREL;
53+
}
54+
}
55+
}

core/src/main/java/org/geysermc/geyser/inventory/Inventory.java

Lines changed: 5 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import org.geysermc.geyser.inventory.click.ClickPlan;
3636
import org.geysermc.geyser.item.Items;
3737
import org.geysermc.geyser.session.GeyserSession;
38-
import org.geysermc.geyser.translator.inventory.InventoryTranslator;
3938
import org.geysermc.geyser.translator.item.ItemTranslator;
4039
import org.geysermc.mcprotocollib.protocol.data.game.inventory.ContainerType;
4140
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponentTypes;
@@ -95,44 +94,24 @@ public abstract class Inventory {
9594
@Setter
9695
protected long holderId = -1;
9796

98-
/**
99-
* Whether this inventory is currently pending.
100-
* It can be pending if this inventory was opened while another inventory was still open,
101-
* or because opening this inventory takes more time (e.g. virtual inventories).
102-
*/
103-
@Getter
104-
@Setter
105-
private boolean pending = false;
106-
10797
/**
10898
* Whether this inventory is currently shown to the Bedrock player.
10999
*/
110100
@Getter
111101
@Setter
112-
private boolean displayed = false;
102+
private boolean displayed;
113103

114-
/**
115-
* The translator for this inventory. Stored here to avoid de-syncs of the inventory and current translator.
116-
*/
117-
@Getter
118-
private final InventoryTranslator translator;
119-
120-
@Getter
121-
private final GeyserSession session;
122-
123-
protected Inventory(GeyserSession session, int id, int size, ContainerType containerType, InventoryTranslator translator) {
124-
this(session, "Inventory", id, size, containerType, translator);
104+
protected Inventory(GeyserSession session, int id, int size, ContainerType containerType) {
105+
this(session, "Inventory", id, size, containerType);
125106
}
126107

127-
protected Inventory(GeyserSession session, String title, int javaId, int size, ContainerType containerType, InventoryTranslator translator) {
108+
protected Inventory(GeyserSession session, String title, int javaId, int size, ContainerType containerType) {
128109
this.title = title;
129110
this.javaId = javaId;
130111
this.size = size;
131112
this.containerType = containerType;
132113
this.items = new GeyserItemStack[size];
133114
Arrays.fill(items, GeyserItemStack.EMPTY);
134-
this.translator = translator;
135-
this.session = session;
136115

137116
// This is to prevent conflicts with special bedrock inventory IDs.
138117
// The vanilla java server only sends an ID between 1 and 100 when opening an inventory,
@@ -144,7 +123,7 @@ protected Inventory(GeyserSession session, String title, int javaId, int size, C
144123
// Java wouldn't - e.g. for virtual chest menus that switch pages.
145124
// And, well, we want to avoid reusing Bedrock inventory id's that are currently being used in a closing inventory;
146125
// so to be safe we just deviate in that case as well.
147-
if ((session.getOpenInventory() != null && session.getOpenInventory().getBedrockId() == bedrockId) || session.isClosingInventory()) {
126+
if ((session.getInventoryHolder() != null && session.getInventoryHolder().bedrockId() == bedrockId) || session.isClosingInventory()) {
148127
this.bedrockId += 1;
149128
}
150129
}
@@ -214,20 +193,4 @@ public void resetNextStateId() {
214193
public boolean shouldConfirmContainerClose() {
215194
return true;
216195
}
217-
218-
/*
219-
* Helper methods to avoid using the wrong translator to update specific inventories.
220-
*/
221-
222-
public void updateInventory() {
223-
this.translator.updateInventory(session, this);
224-
}
225-
226-
public void updateProperty(int rawProperty, int value) {
227-
this.translator.updateProperty(session, this, rawProperty, value);
228-
}
229-
230-
public void updateSlot(int slot) {
231-
this.translator.updateSlot(session, this, slot);
232-
}
233196
}

0 commit comments

Comments
 (0)