Skip to content

Commit feecc47

Browse files
committed
More work on 1.21.4 changes
1 parent d53a1a5 commit feecc47

File tree

13 files changed

+337
-609
lines changed

13 files changed

+337
-609
lines changed

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@
5252
import java.util.List;
5353
import java.util.Map;
5454
import java.util.Objects;
55-
import java.util.stream.IntStream;
5655

5756
public class AnvilInventoryUpdater extends InventoryUpdater {
5857
public static final AnvilInventoryUpdater INSTANCE = new AnvilInventoryUpdater();
@@ -266,14 +265,14 @@ public int calcLevelCost(GeyserSession session, AnvilContainer anvilContainer, b
266265
*/
267266
private int calcRepairLevelCost(GeyserItemStack input, GeyserItemStack material) {
268267
int newDamage = getDamage(input);
269-
int unitRepair = Math.min(newDamage, input.asItem().maxDamage() / 4);
268+
int unitRepair = Math.min(newDamage, input.asItem().defaultMaxDamage() / 4);
270269
if (unitRepair <= 0) {
271270
// No damage to repair
272271
return -1;
273272
}
274273
for (int i = 0; i < material.getAmount(); i++) {
275274
newDamage -= unitRepair;
276-
unitRepair = Math.min(newDamage, input.asItem().maxDamage() / 4);
275+
unitRepair = Math.min(newDamage, input.asItem().defaultMaxDamage() / 4);
277276
if (unitRepair <= 0) {
278277
return i + 1;
279278
}
@@ -290,7 +289,7 @@ private int calcRepairLevelCost(GeyserItemStack input, GeyserItemStack material)
290289
*/
291290
private int calcMergeRepairCost(GeyserItemStack input, GeyserItemStack material) {
292291
// If the material item is damaged 112% or more, then the input item will not be repaired
293-
if (getDamage(input) > 0 && getDamage(material) < (material.asItem().maxDamage() * 112 / 100)) {
292+
if (getDamage(input) > 0 && getDamage(material) < (material.asItem().defaultMaxDamage() * 112 / 100)) {
294293
return 2;
295294
}
296295
return 0;
@@ -419,7 +418,7 @@ private int getRepairCost(GeyserItemStack itemStack) {
419418
}
420419

421420
private boolean hasDurability(GeyserItemStack itemStack) {
422-
if (itemStack.asItem().maxDamage() > 0) {
421+
if (itemStack.asItem().defaultMaxDamage() > 0) {
423422
return itemStack.getComponent(DataComponentType.UNBREAKABLE, false);
424423
}
425424
return false;

core/src/main/java/org/geysermc/geyser/item/Items.java

Lines changed: 263 additions & 253 deletions
Large diffs are not rendered by default.

core/src/main/java/org/geysermc/geyser/item/type/BedrockRequiresTagItem.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,6 @@
2525

2626
package org.geysermc.geyser.item.type;
2727

28-
import org.checkerframework.checker.nullness.qual.Nullable;
29-
import org.geysermc.geyser.session.GeyserSession;
30-
import org.geysermc.geyser.translator.item.BedrockItemBuilder;
31-
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponents;
32-
28+
// Whether this item should have its NBT data kept in the recipe book.
3329
public interface BedrockRequiresTagItem {
34-
35-
void addRequiredNbt(GeyserSession session, @Nullable DataComponents components, BedrockItemBuilder builder);
3630
}

core/src/main/java/org/geysermc/geyser/item/type/FireworkRocketItem.java

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727

2828
import it.unimi.dsi.fastutil.ints.IntArrays;
2929
import org.checkerframework.checker.nullness.qual.NonNull;
30-
import org.checkerframework.checker.nullness.qual.Nullable;
3130
import org.cloudburstmc.nbt.NbtList;
3231
import org.cloudburstmc.nbt.NbtMap;
3332
import org.cloudburstmc.nbt.NbtMapBuilder;
@@ -142,20 +141,4 @@ static Fireworks.FireworkExplosion translateExplosionToJava(NbtMap explosion) {
142141
return null;
143142
}
144143
}
145-
146-
@Override
147-
public void addRequiredNbt(GeyserSession session, @Nullable DataComponents components, BedrockItemBuilder builder) {
148-
if (components != null) {
149-
Fireworks fireworks = components.get(DataComponentType.FIREWORKS);
150-
if (fireworks != null) {
151-
// Already translated
152-
return;
153-
}
154-
}
155-
156-
NbtMapBuilder fireworksNbt = NbtMap.builder();
157-
fireworksNbt.putByte("Flight", (byte) 1);
158-
fireworksNbt.put("Explosions", NbtList.EMPTY);
159-
builder.putCompound("Fireworks", fireworksNbt.build());
160-
}
161144
}

core/src/main/java/org/geysermc/geyser/item/type/Item.java

Lines changed: 26 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -62,23 +62,16 @@ public class Item {
6262
private static final Map<Block, Item> BLOCK_TO_ITEM = new HashMap<>();
6363
protected final Key javaIdentifier;
6464
private int javaId = -1;
65-
66-
// TODO remove these
67-
private final int stackSize;
6865
private final int attackDamage;
69-
private final int maxDamage;
70-
private final Rarity rarity;
71-
private final boolean glint;
66+
private final DataComponents baseComponents;
7267

73-
private DataComponents dataComponents;
68+
private final List<Item> enchantmentGlintPresent = List.of(Items.ENCHANTED_GOLDEN_APPLE, Items.EXPERIENCE_BOTTLE, Items.WRITTEN_BOOK,
69+
Items.NETHER_STAR, Items.ENCHANTED_BOOK, Items.END_CRYSTAL);
7470

7571
public Item(String javaIdentifier, Builder builder) {
7672
this.javaIdentifier = MinecraftKey.key(javaIdentifier);
77-
this.stackSize = builder.stackSize;
78-
this.maxDamage = builder.maxDamage;
73+
this.baseComponents = builder.components;
7974
this.attackDamage = builder.attackDamage;
80-
this.rarity = builder.rarity;
81-
this.glint = builder.glint;
8275
}
8376

8477
public String javaIdentifier() {
@@ -89,24 +82,28 @@ public int javaId() {
8982
return javaId;
9083
}
9184

92-
public int maxDamage() {
93-
return dataComponents.getOrDefault(DataComponentType.MAX_DAMAGE, 0);
85+
public int defaultMaxDamage() {
86+
return baseComponents.getOrDefault(DataComponentType.MAX_DAMAGE, 0);
9487
}
9588

96-
public int attackDamage() {
89+
public int defaultAttackDamage() {
9790
return attackDamage;
9891
}
9992

100-
public int maxStackSize() {
101-
return dataComponents.getOrDefault(DataComponentType.MAX_STACK_SIZE, 1);
93+
public int defaultMaxStackSize() {
94+
return baseComponents.getOrDefault(DataComponentType.MAX_STACK_SIZE, 1);
10295
}
10396

104-
public Rarity rarity() {
105-
return rarity;
97+
public Rarity defaultRarity() {
98+
return Rarity.fromId(baseComponents.getOrDefault(DataComponentType.RARITY, 0));
10699
}
107100

108-
public boolean glint() {
109-
return glint;
101+
public DataComponents gatherComponents(DataComponents others) {
102+
if (others == null) return baseComponents.clone();
103+
104+
DataComponents components = baseComponents.clone();
105+
components.getDataComponents().putAll(others.getDataComponents());
106+
return components;
110107
}
111108

112109
public boolean isValidRepairItem(Item other) {
@@ -295,32 +292,28 @@ protected static void registerBlock(Block block, Item item) {
295292
}
296293

297294
public static Builder builder() {
298-
return new Builder();
295+
return new Builder().components(new DataComponents(new HashMap<>())); // TODO actually set components here
299296
}
300297

301298
public static final class Builder {
302-
private int stackSize = 64;
303-
private int maxDamage;
299+
private DataComponents components;
304300
private int attackDamage;
305-
private Rarity rarity = Rarity.COMMON;
306-
private boolean glint = false;
307-
308-
public Builder stackSize(int stackSize) {
309-
this.stackSize = stackSize;
310-
return this;
311-
}
312301

313302
public Builder attackDamage(double attackDamage) {
314-
// TODO properly store/send a double value once Bedrock supports it.. pls
303+
// Bedrock edition does not support attack damage being a double
315304
this.attackDamage = (int) attackDamage;
316305
return this;
317306
}
318307

319-
public Builder maxDamage(int maxDamage) {
320-
this.maxDamage = maxDamage;
308+
public Builder components(DataComponents components) {
309+
this.components = components;
321310
return this;
322311
}
323312

313+
public DataComponents components() {
314+
return this.components;
315+
}
316+
324317
private Builder() {
325318
}
326319
}

core/src/main/java/org/geysermc/geyser/registry/populator/CustomItemRegistryPopulator.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@
4848
import org.geysermc.geyser.registry.type.GeyserMappingItem;
4949
import org.geysermc.geyser.registry.type.ItemMapping;
5050
import org.geysermc.geyser.registry.type.NonVanillaItemRegistration;
51+
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponentType;
52+
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponents;
5153

5254
import java.util.*;
5355

@@ -129,10 +131,11 @@ public static NonVanillaItemRegistration registerCustomItem(NonVanillaCustomItem
129131

130132
Set<String> repairMaterials = customItemData.repairMaterials();
131133

132-
Item.Builder itemBuilder = Item.builder()
133-
.stackSize(customItemData.stackSize())
134-
.maxDamage(customItemData.maxDamage());
135-
Item item = new Item(customIdentifier, itemBuilder) {
134+
DataComponents components = new DataComponents(new HashMap<>());
135+
components.put(DataComponentType.MAX_STACK_SIZE, customItemData.stackSize());
136+
components.put(DataComponentType.MAX_DAMAGE, customItemData.maxDamage());
137+
138+
Item item = new Item(customIdentifier, Item.builder().components(components)) {
136139
@Override
137140
public boolean isValidRepairItem(Item other) {
138141
return repairMaterials != null && repairMaterials.contains(other.javaIdentifier());
@@ -167,11 +170,11 @@ private static NbtMapBuilder createComponentNbt(CustomItemData customItemData, I
167170
NbtMapBuilder itemProperties = NbtMap.builder();
168171
NbtMapBuilder componentBuilder = NbtMap.builder();
169172

170-
setupBasicItemInfo(javaItem.maxDamage(), javaItem.maxStackSize(), mapping.getToolType() != null || customItemData.displayHandheld(), customItemData, itemProperties, componentBuilder, protocolVersion);
173+
setupBasicItemInfo(javaItem.defaultMaxDamage(), javaItem.defaultMaxStackSize(), mapping.getToolType() != null || customItemData.displayHandheld(), customItemData, itemProperties, componentBuilder, protocolVersion);
171174

172175
boolean canDestroyInCreative = true;
173176
if (mapping.getToolType() != null) { // This is not using the isTool boolean because it is not just a render type here.
174-
canDestroyInCreative = computeToolProperties(mapping.getToolType(), itemProperties, componentBuilder, javaItem.attackDamage());
177+
canDestroyInCreative = computeToolProperties(mapping.getToolType(), itemProperties, componentBuilder, javaItem.defaultAttackDamage());
175178
}
176179
itemProperties.putBoolean("can_destroy_in_creative", canDestroyInCreative);
177180

core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ public static void populate() {
447447
}
448448
}
449449

450-
if (javaOnlyItems.contains(javaItem) || javaItem.rarity() != Rarity.COMMON) {
450+
if (javaOnlyItems.contains(javaItem) || javaItem.defaultRarity() != Rarity.COMMON) {
451451
// These items don't exist on Bedrock, so set up a variable that indicates they should have custom names
452452
// Or, ensure that we are translating these at all times to account for rarity colouring
453453
mappingBuilder = mappingBuilder.translationString((javaItem instanceof BlockItem ? "block." : "item.") + entry.getKey().replace(":", "."));

core/src/main/java/org/geysermc/geyser/translator/item/CustomItemTranslator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public static ItemDefinition getCustomItem(DataComponents components, ItemMappin
6262
}
6363
}
6464

65-
boolean checkDamage = mapping.getJavaItem().maxDamage() > 0;
65+
boolean checkDamage = mapping.getJavaItem().defaultMaxDamage() > 0;
6666
int damage = !checkDamage ? 0 : components.getOrDefault(DataComponentType.DAMAGE, 0);
6767
boolean unbreakable = checkDamage && !isDamaged(components, damage);
6868

core/src/main/java/org/geysermc/geyser/translator/item/ItemTranslator.java

Lines changed: 23 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
import org.geysermc.geyser.inventory.GeyserItemStack;
4141
import org.geysermc.geyser.item.Items;
4242
import org.geysermc.geyser.item.components.Rarity;
43-
import org.geysermc.geyser.item.type.BedrockRequiresTagItem;
4443
import org.geysermc.geyser.item.type.Item;
4544
import org.geysermc.geyser.level.block.type.Block;
4645
import org.geysermc.geyser.registry.BlockRegistries;
@@ -150,50 +149,32 @@ public static ItemData translateToBedrock(GeyserSession session, ItemStack stack
150149
public static ItemData.@NonNull Builder translateToBedrock(GeyserSession session, Item javaItem, ItemMapping bedrockItem, int count, @Nullable DataComponents components) {
151150
BedrockItemBuilder nbtBuilder = new BedrockItemBuilder();
152151

153-
boolean hideTooltips = false;
154-
if (components != null) {
155-
javaItem.translateComponentsToBedrock(session, components, nbtBuilder);
156-
if (components.get(DataComponentType.HIDE_TOOLTIP) != null) hideTooltips = true;
157-
}
158-
159-
// Fixes fireworks crafting recipe: they always contain a tag
160-
// TODO remove once all items have their default components
161-
if (javaItem instanceof BedrockRequiresTagItem requiresTagItem) {
162-
requiresTagItem.addRequiredNbt(session, components, nbtBuilder);
163-
}
152+
// Populates default components that aren't sent over the network
153+
components = javaItem.gatherComponents(components);
164154

165-
Rarity rarity = javaItem.rarity();
166-
boolean enchantmentGlint = javaItem.glint();
167-
if (components != null) {
168-
Integer rarityIndex = components.get(DataComponentType.RARITY);
169-
if (rarityIndex != null) {
170-
rarity = Rarity.fromId(rarityIndex);
171-
}
172-
Boolean enchantmentGlintOverride = components.get(DataComponentType.ENCHANTMENT_GLINT_OVERRIDE);
173-
if (enchantmentGlintOverride != null) {
174-
enchantmentGlint = enchantmentGlintOverride;
175-
}
176-
}
155+
// Translate item-specific components
156+
javaItem.translateComponentsToBedrock(session, components, nbtBuilder);
177157

158+
Rarity rarity = Rarity.fromId(components.getOrDefault(DataComponentType.RARITY, 0));
178159
String customName = getCustomName(session, components, bedrockItem, rarity.getColor());
179160
if (customName != null) {
180161
nbtBuilder.setCustomName(customName);
181162
}
182163

183-
if (components != null) {
184-
ItemAttributeModifiers attributeModifiers = components.get(DataComponentType.ATTRIBUTE_MODIFIERS);
185-
if (attributeModifiers != null && attributeModifiers.isShowInTooltip() && !hideTooltips) {
186-
// only add if attribute modifiers do not indicate to hide them
187-
addAttributeLore(attributeModifiers, nbtBuilder, session.locale());
188-
}
164+
boolean hideTooltips = components.get(DataComponentType.HIDE_TOOLTIP) != null;
165+
166+
ItemAttributeModifiers attributeModifiers = components.get(DataComponentType.ATTRIBUTE_MODIFIERS);
167+
if (attributeModifiers != null && attributeModifiers.isShowInTooltip() && !hideTooltips) {
168+
// only add if attribute modifiers do not indicate to hide them
169+
addAttributeLore(attributeModifiers, nbtBuilder, session.locale());
189170
}
190171

191172
if (session.isAdvancedTooltips() && !hideTooltips) {
192173
addAdvancedTooltips(components, nbtBuilder, javaItem, session.locale());
193174
}
194175

195176
// Add enchantment override. We can't remove it - enchantments would stop showing - but we can add it.
196-
if (enchantmentGlint) {
177+
if (components.getOrDefault(DataComponentType.ENCHANTMENT_GLINT_OVERRIDE, false)) {
197178
NbtMapBuilder nbtMapBuilder = nbtBuilder.getOrCreateNbt();
198179
nbtMapBuilder.putIfAbsent("ench", NbtList.EMPTY);
199180
}
@@ -217,18 +198,16 @@ public static ItemData translateToBedrock(GeyserSession session, ItemStack stack
217198

218199
translateCustomItem(components, builder, bedrockItem);
219200

220-
if (components != null) {
221-
// Translate the canDestroy and canPlaceOn Java components
222-
AdventureModePredicate canDestroy = components.get(DataComponentType.CAN_BREAK);
223-
AdventureModePredicate canPlaceOn = components.get(DataComponentType.CAN_PLACE_ON);
224-
String[] canBreak = getCanModify(session, canDestroy);
225-
String[] canPlace = getCanModify(session, canPlaceOn);
226-
if (canBreak != null) {
227-
builder.canBreak(canBreak);
228-
}
229-
if (canPlace != null) {
230-
builder.canPlace(canPlace);
231-
}
201+
// Translate the canDestroy and canPlaceOn Java components
202+
AdventureModePredicate canDestroy = components.get(DataComponentType.CAN_BREAK);
203+
AdventureModePredicate canPlaceOn = components.get(DataComponentType.CAN_PLACE_ON);
204+
String[] canBreak = getCanModify(session, canDestroy);
205+
String[] canPlace = getCanModify(session, canPlaceOn);
206+
if (canBreak != null) {
207+
builder.canBreak(canBreak);
208+
}
209+
if (canPlace != null) {
210+
builder.canPlace(canPlace);
232211
}
233212

234213
return builder;
@@ -325,7 +304,7 @@ private static String attributeToLore(int attribute, ItemAttributeModifiers.Attr
325304
}
326305

327306
private static void addAdvancedTooltips(@Nullable DataComponents components, BedrockItemBuilder builder, Item item, String language) {
328-
int maxDurability = item.maxDamage();
307+
int maxDurability = item.defaultMaxDamage();
329308

330309
if (maxDurability != 0 && components != null) {
331310
Integer durabilityComponent = components.get(DataComponentType.DAMAGE);

0 commit comments

Comments
 (0)