Skip to content

Commit 2ddb7f5

Browse files
authored
Merge branch 'feature/1.20.5' into feature/1.20.5
2 parents b96a6eb + 78edbac commit 2ddb7f5

26 files changed

+200
-184
lines changed

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

+8-7
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,21 @@
2525

2626
package org.geysermc.geyser.item;
2727

28+
import com.github.steveice10.mc.protocol.data.game.item.component.DataComponentType;
29+
import com.github.steveice10.mc.protocol.data.game.item.component.DataComponents;
30+
import com.github.steveice10.mc.protocol.data.game.item.component.DyedItemColor;
2831
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
2932
import com.github.steveice10.opennbt.tag.builtin.IntTag;
33+
import org.geysermc.geyser.translator.item.BedrockItemBuilder;
3034

3135
public interface DyeableLeatherItem {
3236

33-
static void translateNbtToBedrock(CompoundTag tag) {
34-
CompoundTag displayTag = tag.get("display");
35-
if (displayTag == null) {
37+
static void translateComponentsToBedrock(DataComponents components, BedrockItemBuilder builder) {
38+
DyedItemColor dyedItemColor = components.get(DataComponentType.DYED_COLOR);
39+
if (dyedItemColor == null) {
3640
return;
3741
}
38-
IntTag color = displayTag.remove("color");
39-
if (color != null) {
40-
tag.put(new IntTag("customColor", color.getValue()));
41-
}
42+
builder.putInt("customColor", dyedItemColor.getRgb());
4243
}
4344

4445
static void translateNbtToJava(CompoundTag tag) {

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

+16-9
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,18 @@
2525

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

28+
import com.github.steveice10.mc.protocol.data.game.item.component.ArmorTrim;
29+
import com.github.steveice10.mc.protocol.data.game.item.component.DataComponentType;
2830
import com.github.steveice10.mc.protocol.data.game.item.component.DataComponents;
2931
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
3032
import com.github.steveice10.opennbt.tag.builtin.StringTag;
3133
import org.checkerframework.checker.nullness.qual.NonNull;
34+
import org.cloudburstmc.nbt.NbtMap;
3235
import org.cloudburstmc.nbt.NbtMapBuilder;
3336
import org.geysermc.geyser.item.ArmorMaterial;
3437
import org.geysermc.geyser.registry.type.ItemMapping;
3538
import org.geysermc.geyser.session.GeyserSession;
39+
import org.geysermc.geyser.translator.item.BedrockItemBuilder;
3640

3741
public class ArmorItem extends Item {
3842
private final ArmorMaterial material;
@@ -43,23 +47,26 @@ public ArmorItem(String javaIdentifier, ArmorMaterial material, Builder builder)
4347
}
4448

4549
@Override
46-
public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNull DataComponents components, @NonNull NbtMapBuilder builder) {
50+
public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNull DataComponents components, @NonNull BedrockItemBuilder builder) {
4751
super.translateComponentsToBedrock(session, components, builder);
4852

49-
if (tag.get("Trim") instanceof CompoundTag trim) {
50-
StringTag material = trim.remove("material");
51-
StringTag pattern = trim.remove("pattern");
53+
ArmorTrim trim = components.get(DataComponentType.TRIM);
54+
if (trim != null) {
55+
// TODO material IDs
56+
String material = trim.getMaterial().getAssetName();
57+
String pattern = trim.getPattern().getAssetId();
5258

5359
// discard custom trim patterns/materials to prevent visual glitches on bedrock
54-
if (!material.getValue().startsWith("minecraft:")
55-
|| !pattern.getValue().startsWith("minecraft:")) {
56-
tag.remove("Trim");
60+
if (!material.startsWith("minecraft:")
61+
|| !pattern.startsWith("minecraft:")) {
5762
return;
5863
}
5964

65+
NbtMapBuilder trimBuilder = NbtMap.builder();
6066
// bedrock has an uppercase first letter key, and the value is not namespaced
61-
trim.put(new StringTag("Material", stripNamespace(material.getValue())));
62-
trim.put(new StringTag("Pattern", stripNamespace(pattern.getValue())));
67+
trimBuilder.put("Material", stripNamespace(material));
68+
trimBuilder.put("Pattern", stripNamespace(pattern));
69+
builder.putCompound("Trim", trimBuilder.build());
6370
}
6471
}
6572

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

+6-8
Original file line numberDiff line numberDiff line change
@@ -26,28 +26,26 @@
2626
package org.geysermc.geyser.item.type;
2727

2828
import com.github.steveice10.mc.protocol.data.game.item.component.DataComponents;
29-
import com.github.steveice10.opennbt.tag.builtin.ByteTag;
30-
import com.github.steveice10.opennbt.tag.builtin.StringTag;
3129
import org.checkerframework.checker.nullness.qual.NonNull;
32-
import org.cloudburstmc.nbt.NbtMapBuilder;
3330
import org.geysermc.geyser.session.GeyserSession;
3431
import org.geysermc.geyser.text.MinecraftLocale;
32+
import org.geysermc.geyser.translator.item.BedrockItemBuilder;
3533

3634
public class AxolotlBucketItem extends Item {
3735
public AxolotlBucketItem(String javaIdentifier, Builder builder) {
3836
super(javaIdentifier, builder);
3937
}
4038

4139
@Override
42-
public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNull DataComponents components, @NonNull NbtMapBuilder builder) {
40+
public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNull DataComponents components, @NonNull BedrockItemBuilder builder) {
4341
super.translateComponentsToBedrock(session, components, builder);
4442

4543
// Bedrock Edition displays the properties of the axolotl. Java does not.
4644
// To work around this, set the custom name to the Axolotl translation and it's displayed correctly
47-
tag.put(new ByteTag("AppendCustomName", (byte) 1));
48-
tag.put(new StringTag("CustomName", MinecraftLocale.getLocaleString("entity.minecraft.axolotl", session.locale())));
45+
builder.putByte("AppendCustomName", 1);
46+
builder.putString("CustomName", MinecraftLocale.getLocaleString("entity.minecraft.axolotl", session.locale()));
4947
// Boilerplate required so the nametag does not appear as "Bucket of "
50-
tag.put(new StringTag("ColorID", ""));
51-
tag.put(new StringTag("BodyID", ""));
48+
builder.putString("ColorID", "");
49+
builder.putString("BodyID", "");
5250
}
5351
}

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

+19-18
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525

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

28+
import com.github.steveice10.mc.protocol.data.game.item.component.BannerPatternLayer;
29+
import com.github.steveice10.mc.protocol.data.game.item.component.DataComponentType;
2830
import com.github.steveice10.mc.protocol.data.game.item.component.DataComponents;
2931
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
3032
import com.github.steveice10.opennbt.tag.builtin.IntTag;
@@ -33,16 +35,14 @@
3335
import org.checkerframework.checker.nullness.qual.NonNull;
3436
import org.cloudburstmc.nbt.NbtList;
3537
import org.cloudburstmc.nbt.NbtMap;
36-
import org.cloudburstmc.nbt.NbtMapBuilder;
3738
import org.cloudburstmc.nbt.NbtType;
3839
import org.geysermc.geyser.registry.type.ItemMapping;
3940
import org.geysermc.geyser.session.GeyserSession;
41+
import org.geysermc.geyser.translator.item.BedrockItemBuilder;
4042

4143
import java.util.ArrayList;
4244
import java.util.List;
4345

44-
import static org.geysermc.erosion.util.BannerUtils.getJavaPatternTag;
45-
4646
public class BannerItem extends BlockItem {
4747
/**
4848
* Holds what a Java ominous banner pattern looks like.
@@ -51,19 +51,20 @@ public class BannerItem extends BlockItem {
5151
* ominous banners that we set instead. This variable is used to detect Java ominous banner patterns, and apply
5252
* the correct ominous banner pattern if Bedrock pulls the item from creative.
5353
*/
54-
public static final ListTag OMINOUS_BANNER_PATTERN;
54+
public static final List<BannerPatternLayer> OMINOUS_BANNER_PATTERN;
5555

5656
static {
57-
OMINOUS_BANNER_PATTERN = new ListTag("Patterns");
5857
// Construct what an ominous banner is supposed to look like
59-
OMINOUS_BANNER_PATTERN.add(getJavaPatternTag("mr", 9));
60-
OMINOUS_BANNER_PATTERN.add(getJavaPatternTag("bs", 8));
61-
OMINOUS_BANNER_PATTERN.add(getJavaPatternTag("cs", 7));
62-
OMINOUS_BANNER_PATTERN.add(getJavaPatternTag("bo", 8));
63-
OMINOUS_BANNER_PATTERN.add(getJavaPatternTag("ms", 15));
64-
OMINOUS_BANNER_PATTERN.add(getJavaPatternTag("hh", 8));
65-
OMINOUS_BANNER_PATTERN.add(getJavaPatternTag("mc", 8));
66-
OMINOUS_BANNER_PATTERN.add(getJavaPatternTag("bo", 15));
58+
OMINOUS_BANNER_PATTERN = List.of(
59+
new BannerPatternLayer("mr", 9),
60+
new BannerPatternLayer("bs", 8),
61+
new BannerPatternLayer("cs", 7),
62+
new BannerPatternLayer("bo", 8),
63+
new BannerPatternLayer("ms", 15),
64+
new BannerPatternLayer("hh", 8),
65+
new BannerPatternLayer("mc", 8),
66+
new BannerPatternLayer("bo", 15)
67+
);
6768
}
6869

6970
/**
@@ -102,7 +103,7 @@ private static NbtMap getBedrockBannerPattern(CompoundTag pattern) {
102103
* @return The Java edition format pattern nbt
103104
*/
104105
public static CompoundTag getJavaBannerPattern(NbtMap pattern) {
105-
return getJavaPatternTag(pattern.getString("Pattern"), 15 - pattern.getInt("Color"));
106+
return new BannerPatternLayer(pattern.getString("Pattern"), 15 - pattern.getInt("Color"));
106107
}
107108

108109
/**
@@ -122,14 +123,14 @@ public BannerItem(String javaIdentifier, Builder builder) {
122123
}
123124

124125
@Override
125-
public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNull DataComponents components, @NonNull NbtMapBuilder builder) {
126+
public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNull DataComponents components, @NonNull BedrockItemBuilder builder) {
126127
super.translateComponentsToBedrock(session, components, builder);
127128

128-
CompoundTag blockEntityTag = tag.remove("BlockEntityTag");
129-
if (blockEntityTag != null && blockEntityTag.get("Patterns") instanceof ListTag patterns) {
129+
List<BannerPatternLayer> patterns = components.get(DataComponentType.BANNER_PATTERNS);
130+
if (patterns != null) {
130131
if (patterns.equals(OMINOUS_BANNER_PATTERN)) {
131132
// Remove the current patterns and set the ominous banner type
132-
tag.put(new IntTag("Type", 1));
133+
builder.putInt("Type", 1);
133134
} else {
134135
invertBannerColors(patterns);
135136
tag.put(patterns);

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

+3-13
Original file line numberDiff line numberDiff line change
@@ -27,28 +27,18 @@
2727

2828
import com.github.steveice10.mc.protocol.data.game.item.component.DataComponents;
2929
import org.checkerframework.checker.nullness.qual.NonNull;
30-
import org.cloudburstmc.nbt.NbtMapBuilder;
3130
import org.geysermc.geyser.session.GeyserSession;
31+
import org.geysermc.geyser.translator.item.BedrockItemBuilder;
3232

33+
@Deprecated
3334
public class ChestItem extends BlockItem {
3435

3536
public ChestItem(String javaIdentifier, Builder builder) {
3637
super(javaIdentifier, builder);
3738
}
3839

3940
@Override
40-
public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNull DataComponents components, @NonNull NbtMapBuilder builder) {
41+
public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNull DataComponents components, @NonNull BedrockItemBuilder builder) {
4142
super.translateComponentsToBedrock(session, components, builder);
42-
43-
// Strip the BlockEntityTag from the chests contents
44-
// sent to the client. The client does not parse this
45-
// or use it for anything, as this tag is fully
46-
// server-side, so we remove it to reduce bandwidth and
47-
// solve potential issues with very large tags.
48-
49-
// There was a problem in the past where this would strip
50-
// NBT data in creative mode, however with the new server
51-
// authoritative inventories, this is no longer a concern.
52-
tag.remove("BlockEntityTag");
5343
}
5444
}

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

+16-18
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,16 @@
2626
package org.geysermc.geyser.item.type;
2727

2828
import com.github.steveice10.mc.protocol.data.game.item.ItemStack;
29+
import com.github.steveice10.mc.protocol.data.game.item.component.DataComponentType;
2930
import com.github.steveice10.mc.protocol.data.game.item.component.DataComponents;
30-
import com.github.steveice10.opennbt.tag.builtin.ByteTag;
31-
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
32-
import com.github.steveice10.opennbt.tag.builtin.IntTag;
33-
import com.github.steveice10.opennbt.tag.builtin.Tag;
31+
import com.github.steveice10.mc.protocol.data.game.item.component.LodestoneTracker;
3432
import org.checkerframework.checker.nullness.qual.NonNull;
35-
import org.cloudburstmc.nbt.NbtMapBuilder;
33+
import org.checkerframework.checker.nullness.qual.Nullable;
3634
import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData;
3735
import org.geysermc.geyser.registry.type.ItemMapping;
3836
import org.geysermc.geyser.registry.type.ItemMappings;
3937
import org.geysermc.geyser.session.GeyserSession;
38+
import org.geysermc.geyser.translator.item.BedrockItemBuilder;
4039

4140
public class CompassItem extends Item {
4241
public CompassItem(String javaIdentifier, Builder builder) {
@@ -45,36 +44,35 @@ public CompassItem(String javaIdentifier, Builder builder) {
4544

4645
@Override
4746
public ItemData.Builder translateToBedrock(ItemStack itemStack, ItemMapping mapping, ItemMappings mappings) {
48-
if (isLodestoneCompass(itemStack.getNbt())) {
47+
if (isLodestoneCompass(itemStack.getDataComponents())) {
4948
return super.translateToBedrock(itemStack, mappings.getLodestoneCompass(), mappings);
5049
}
5150
return super.translateToBedrock(itemStack, mapping, mappings);
5251
}
5352

5453
@Override
55-
public ItemMapping toBedrockDefinition(CompoundTag nbt, ItemMappings mappings) {
56-
if (isLodestoneCompass(nbt)) {
54+
public ItemMapping toBedrockDefinition(DataComponents components, ItemMappings mappings) {
55+
if (isLodestoneCompass(components)) {
5756
return mappings.getLodestoneCompass();
5857
}
59-
return super.toBedrockDefinition(nbt, mappings);
58+
return super.toBedrockDefinition(components, mappings);
6059
}
6160

6261
@Override
63-
public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNull DataComponents components, @NonNull NbtMapBuilder builder) {
62+
public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNull DataComponents components, @NonNull BedrockItemBuilder builder) {
6463
super.translateComponentsToBedrock(session, components, builder);
6564

66-
Tag lodestoneTag = tag.get("LodestoneTracked");
67-
if (lodestoneTag instanceof ByteTag) {
68-
int trackId = session.getLodestoneCache().store(tag);
65+
LodestoneTracker tracker = components.get(DataComponentType.LODESTONE_TRACKER);
66+
if (tracker != null) {
67+
int trackId = session.getLodestoneCache().store(tracker);
6968
// Set the bedrock tracking id - will return 0 if invalid
70-
tag.put(new IntTag("trackingHandle", trackId));
69+
builder.putInt("trackingHandle", trackId);
7170
}
7271
}
7372

74-
private boolean isLodestoneCompass(CompoundTag nbt) {
75-
if (nbt != null) {
76-
Tag lodestoneTag = nbt.get("LodestoneTracked");
77-
return lodestoneTag instanceof ByteTag;
73+
private boolean isLodestoneCompass(@Nullable DataComponents components) {
74+
if (components != null) {
75+
return components.getDataComponents().containsKey(DataComponentType.LODESTONE_TRACKER);
7876
}
7977
return false;
8078
}

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

+16-19
Original file line numberDiff line numberDiff line change
@@ -26,44 +26,41 @@
2626
package org.geysermc.geyser.item.type;
2727

2828
import com.github.steveice10.mc.protocol.data.game.item.ItemStack;
29+
import com.github.steveice10.mc.protocol.data.game.item.component.DataComponentType;
2930
import com.github.steveice10.mc.protocol.data.game.item.component.DataComponents;
30-
import com.github.steveice10.opennbt.tag.builtin.*;
31+
import com.github.steveice10.opennbt.tag.builtin.ByteTag;
32+
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
33+
import com.github.steveice10.opennbt.tag.builtin.ListTag;
34+
import com.github.steveice10.opennbt.tag.builtin.StringTag;
3135
import org.checkerframework.checker.nullness.qual.NonNull;
32-
import org.checkerframework.checker.nullness.qual.Nullable;
3336
import org.cloudburstmc.nbt.NbtMapBuilder;
3437
import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData;
3538
import org.geysermc.geyser.registry.type.ItemMapping;
3639
import org.geysermc.geyser.session.GeyserSession;
40+
import org.geysermc.geyser.translator.item.BedrockItemBuilder;
3741
import org.geysermc.geyser.translator.item.ItemTranslator;
3842

43+
import java.util.List;
44+
3945
public class CrossbowItem extends Item {
4046
public CrossbowItem(String javaIdentifier, Builder builder) {
4147
super(javaIdentifier, builder);
4248
}
4349

4450
@Override
45-
public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNull DataComponents components, @NonNull NbtMapBuilder builder) {
51+
public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNull DataComponents components, @NonNull BedrockItemBuilder builder) {
4652
super.translateComponentsToBedrock(session, components, builder);
4753

48-
ListTag chargedProjectiles = tag.get("ChargedProjectiles");
49-
if (chargedProjectiles != null) {
50-
if (!chargedProjectiles.getValue().isEmpty()) {
51-
CompoundTag javaProjectileAsNbt = (CompoundTag) chargedProjectiles.getValue().get(0);
52-
53-
ItemMapping projectileMapping = session.getItemMappings().getMapping((String) javaProjectileAsNbt.get("id").getValue());
54-
if (projectileMapping == null) return;
55-
@Nullable CompoundTag projectileTag = javaProjectileAsNbt.get("tag");
56-
ItemStack itemStack = new ItemStack(projectileMapping.getJavaItem().javaId(), (byte) javaProjectileAsNbt.get("Count").getValue(), projectileTag);
57-
ItemData itemData = ItemTranslator.translateToBedrock(session, itemStack);
54+
List<ItemStack> chargedProjectiles = components.get(DataComponentType.CHARGED_PROJECTILES);
55+
if (chargedProjectiles != null && !chargedProjectiles.isEmpty()) {
56+
ItemStack javaProjectile = chargedProjectiles.get(0);
5857

59-
CompoundTag newProjectile = new CompoundTag("chargedItem");
60-
newProjectile.put(new ByteTag("Count", (byte) itemData.getCount()));
61-
newProjectile.put(new StringTag("Name", projectileMapping.getBedrockIdentifier()));
58+
ItemMapping projectileMapping = session.getItemMappings().getMapping(javaProjectile.getId());
59+
ItemData itemData = ItemTranslator.translateToBedrock(session, javaProjectile);
6260

63-
newProjectile.put(new ShortTag("Damage", (short) itemData.getDamage()));
61+
NbtMapBuilder newProjectile = BedrockItemBuilder.createItemNbt(projectileMapping, itemData.getCount(), itemData.getDamage());
6462

65-
tag.put(newProjectile);
66-
}
63+
builder.putCompound("chargedItem", newProjectile.build());
6764
}
6865
}
6966

0 commit comments

Comments
 (0)