Skip to content

Commit 0416b55

Browse files
committed
Fix: Looms modifying default data components causing visual bugs
Closes #5273
1 parent ea13e58 commit 0416b55

File tree

4 files changed

+14
-17
lines changed

4 files changed

+14
-17
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import org.geysermc.mcprotocollib.protocol.data.game.recipe.display.slot.SlotDisplay;
5151

5252
import java.util.HashMap;
53+
import java.util.function.Supplier;
5354

5455
@Data
5556
public class GeyserItemStack {
@@ -169,9 +170,9 @@ public <T> T getComponent(@NonNull DataComponentType<T> type) {
169170
return value;
170171
}
171172

172-
public <T> T getComponentOrFallback(@NonNull DataComponentType<T> type, T def) {
173+
public <T> T getComponentElseGet(@NonNull DataComponentType<T> type, Supplier<T> supplier) {
173174
T value = getComponent(type);
174-
return value == null ? def : value;
175+
return value == null ? supplier.get() : value;
175176
}
176177

177178
public int getNetId() {

core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@
4747
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponentType;
4848
import org.geysermc.mcprotocollib.protocol.data.game.item.component.HolderSet;
4949
import org.geysermc.mcprotocollib.protocol.data.game.item.component.ItemEnchantments;
50-
import org.geysermc.mcprotocollib.protocol.data.game.item.component.Unbreakable;
5150
import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.inventory.ServerboundRenameItemPacket;
5251

5352
import java.util.List;
@@ -420,7 +419,7 @@ private boolean isRenaming(GeyserSession session, AnvilContainer anvilContainer,
420419
}
421420

422421
private int getRepairCost(GeyserItemStack itemStack) {
423-
return itemStack.getComponentOrFallback(DataComponentType.REPAIR_COST, 0);
422+
return itemStack.getComponentElseGet(DataComponentType.REPAIR_COST, () -> 0);
424423
}
425424

426425
private boolean hasDurability(GeyserItemStack itemStack) {
@@ -431,6 +430,6 @@ private boolean hasDurability(GeyserItemStack itemStack) {
431430
}
432431

433432
private int getDamage(GeyserItemStack itemStack) {
434-
return itemStack.getComponentOrFallback(DataComponentType.DAMAGE, 0);
433+
return itemStack.getComponentElseGet(DataComponentType.DAMAGE, () -> 0);
435434
}
436435
}

core/src/main/java/org/geysermc/geyser/translator/inventory/BundleInventoryTranslator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ private static Fraction calculateWeight(GeyserItemStack itemStack) {
314314
return Fraction.ONE;
315315
}
316316
}
317-
return Fraction.getFraction(1, itemStack.getComponentOrFallback(DataComponentType.MAX_STACK_SIZE, itemStack.asItem().defaultMaxStackSize()));
317+
return Fraction.getFraction(1, itemStack.getComponentElseGet(DataComponentType.MAX_STACK_SIZE, () -> itemStack.asItem().defaultMaxStackSize()));
318318
}
319319

320320
public static int capacityForItemStack(Fraction bundleWeight, GeyserItemStack itemStack) {

core/src/main/java/org/geysermc/geyser/translator/inventory/LoomInventoryTranslator.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,8 @@ public class LoomInventoryTranslator extends AbstractBlockInventoryTranslator {
9393
PATTERN_TO_INDEX.put("vhr", index++);
9494
PATTERN_TO_INDEX.put("hhb", index++);
9595
PATTERN_TO_INDEX.put("bo", index++);
96-
index++; // Bordure indented, does not appear to exist in Bedrock?
9796
PATTERN_TO_INDEX.put("gra", index++);
9897
PATTERN_TO_INDEX.put("gru", index);
99-
// Bricks do not appear to be a pattern on Bedrock, either
10098
}
10199

102100
public LoomInventoryTranslator() {
@@ -120,7 +118,7 @@ protected boolean shouldRejectItemPlace(GeyserSession session, Inventory invento
120118

121119
@Override
122120
protected boolean shouldHandleRequestFirst(ItemStackRequestAction action, Inventory inventory) {
123-
// If the LOOM_MATERIAL slot is not empty, we are crafting a pattern that does not come from an item
121+
// If the LOOM_MATERIAL slot is empty, we are crafting a pattern that does not come from an item
124122
return action.getType() == ItemStackRequestActionType.CRAFT_LOOM && inventory.getItem(2).isEmpty();
125123
}
126124

@@ -135,17 +133,19 @@ public ItemStackResponse translateSpecialRequest(GeyserSession session, Inventor
135133
return rejectRequest(request);
136134
}
137135

138-
// Get the patterns compound tag
139-
List<NbtMap> newBlockEntityTag = craftData.getResultItems()[0].getTag().getList("Patterns", NbtType.COMPOUND);
140-
// Get the pattern that the Bedrock client requests - the last pattern in the Patterns list
141-
NbtMap pattern = newBlockEntityTag.get(newBlockEntityTag.size() - 1);
142136
String bedrockPattern = ((CraftLoomAction) headerData).getPatternId();
143137

144138
// Get the Java index of this pattern
145139
int index = PATTERN_TO_INDEX.getOrDefault(bedrockPattern, -1);
146140
if (index == -1) {
147141
return rejectRequest(request);
148142
}
143+
144+
// Get the patterns compound tag
145+
List<NbtMap> newBlockEntityTag = craftData.getResultItems()[0].getTag().getList("Patterns", NbtType.COMPOUND);
146+
// Get the pattern that the Bedrock client requests - the last pattern in the Patterns list
147+
NbtMap pattern = newBlockEntityTag.get(newBlockEntityTag.size() - 1);
148+
149149
// Java's formula: 4 * row + col
150150
// And the Java loom window has a fixed row/width of four
151151
// So... Number / 4 = row (so we don't have to bother there), and number % 4 is our column, which leads us back to our index. :)
@@ -156,10 +156,7 @@ public ItemStackResponse translateSpecialRequest(GeyserSession session, Inventor
156156
inputCopy.setNetId(session.getNextItemNetId());
157157
BannerPatternLayer bannerPatternLayer = BannerItem.getJavaBannerPattern(session, pattern); // TODO
158158
if (bannerPatternLayer != null) {
159-
List<BannerPatternLayer> patternsList = inputCopy.getComponent(DataComponentType.BANNER_PATTERNS);
160-
if (patternsList == null) {
161-
patternsList = new ArrayList<>();
162-
}
159+
List<BannerPatternLayer> patternsList = new ArrayList<>(inputCopy.getComponentElseGet(DataComponentType.BANNER_PATTERNS, ArrayList::new));
163160
patternsList.add(bannerPatternLayer);
164161
inputCopy.getOrCreateComponents().put(DataComponentType.BANNER_PATTERNS, patternsList);
165162
}

0 commit comments

Comments
 (0)