Skip to content

Commit

Permalink
Update the item parts
Browse files Browse the repository at this point in the history
  • Loading branch information
Camotoy committed Apr 20, 2024
1 parent 3bdc615 commit 3a37daa
Show file tree
Hide file tree
Showing 17 changed files with 171 additions and 154 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,11 @@ public CompassItem(String javaIdentifier, Builder builder) {
}

@Override
public ItemData.Builder translateToBedrock(ItemStack itemStack, ItemMapping mapping, ItemMappings mappings) {
if (isLodestoneCompass(itemStack.getDataComponents())) {
return super.translateToBedrock(itemStack, mappings.getLodestoneCompass(), mappings);
public ItemData.Builder translateToBedrock(int count, DataComponents components, ItemMapping mapping, ItemMappings mappings) {
if (isLodestoneCompass(components)) {
return super.translateToBedrock(count, components, mappings.getLodestoneCompass(), mappings);
}
return super.translateToBedrock(itemStack, mapping, mappings);
return super.translateToBedrock(count, components, mapping, mappings);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,8 @@

package org.geysermc.geyser.item.type;

import com.github.steveice10.mc.protocol.data.game.item.ItemStack;
import com.github.steveice10.mc.protocol.data.game.item.component.DataComponentType;
import com.github.steveice10.mc.protocol.data.game.item.component.DataComponents;
import org.cloudburstmc.nbt.NbtMap;
import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData;
import org.geysermc.geyser.registry.type.ItemMapping;
import org.geysermc.geyser.registry.type.ItemMappings;
Expand All @@ -39,12 +37,12 @@ public FilledMapItem(String javaIdentifier, Builder builder) {
}

@Override
public ItemData.Builder translateToBedrock(ItemStack itemStack, ItemMapping mapping, ItemMappings mappings) {
ItemData.Builder builder = super.translateToBedrock(itemStack, mapping, mappings);
DataComponents components = itemStack.getDataComponents();
public ItemData.Builder translateToBedrock(int count, DataComponents components, ItemMapping mapping, ItemMappings mappings) {
ItemData.Builder builder = super.translateToBedrock(count, components, mapping, mappings);
if (components == null) {
// This is a fallback for maps with no nbt (Change added back in June 2020; is it needed in 2023?)
return builder.tag(NbtMap.builder().putInt("map", 0).build());
//return builder.tag(NbtMap.builder().putInt("map", 0).build()); TODO if this is *still* broken, let's move it to translateComponentsToBedrock
return builder;
} else {
Integer mapColor = components.get(DataComponentType.MAP_COLOR);
if (mapColor != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import org.checkerframework.checker.nullness.qual.NonNull;
import org.cloudburstmc.nbt.NbtMap;
import org.cloudburstmc.nbt.NbtMapBuilder;
import org.cloudburstmc.nbt.NbtType;
import org.geysermc.geyser.level.FireworkColor;
import org.geysermc.geyser.registry.type.ItemMapping;
import org.geysermc.geyser.session.GeyserSession;
Expand Down Expand Up @@ -63,49 +64,45 @@ public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNul
}
List<NbtMap> explosionNbt = new ArrayList<>();
for (Fireworks.FireworkExplosion explosion : explosions) {
explosionNbt.add(translateExplosionToBedrock(explosion, ""));
explosionNbt.add(translateExplosionToBedrock(explosion));
}

fireworksNbt.putList("Explosions", NbtType.COMPOUND, explosionNbt);
builder.putCompound("Fireworks", fireworksNbt.build());
}

@Override
public void translateNbtToJava(@NonNull CompoundTag tag, @NonNull ItemMapping mapping) {
super.translateNbtToJava(tag, mapping);
}

static NbtMap translateExplosionToBedrock(Fireworks.FireworkExplosion explosion, String newName) {
static NbtMap translateExplosionToBedrock(Fireworks.FireworkExplosion explosion) {
NbtMapBuilder newExplosionData = NbtMap.builder();

if (explosion.get("Type") != null) {
newExplosionData.put(new ByteTag("FireworkType", MathUtils.getNbtByte(explosion.get("Type").getValue())));
}
// if (explosion.get("Type") != null) {
// newExplosionData.put(new ByteTag("FireworkType", MathUtils.getNbtByte(explosion.get("Type").getValue())));
// }
//newExplosionData.putByte("FireworkType", explosion.get) //TODO???

// TODO do we need length checks
if (explosion.get("Colors") != null) {
int[] oldColors = (int[]) explosion.get("Colors").getValue();
byte[] colors = new byte[oldColors.length];

int i = 0;
for (int color : oldColors) {
colors[i++] = FireworkColor.fromJavaRGB(color);
}
int[] oldColors = explosion.getColors();
byte[] colors = new byte[oldColors.length];

newExplosionData.put(new ByteArrayTag("FireworkColor", colors));
int i = 0;
for (int color : oldColors) {
colors[i++] = FireworkColor.fromJavaRGB(color);
}

if (explosion.get("FadeColors") != null) {
int[] oldColors = (int[]) explosion.get("FadeColors").getValue();
byte[] colors = new byte[oldColors.length];
newExplosionData.putByteArray("FireworkColor", colors);

int i = 0;
for (int color : oldColors) {
colors[i++] = FireworkColor.fromJavaRGB(color);
}
oldColors = explosion.getFadeColors();
colors = new byte[oldColors.length];

newExplosionData.put(new ByteArrayTag("FireworkFade", colors));
i = 0;
for (int color : oldColors) {
colors[i++] = FireworkColor.fromJavaRGB(color);
}

newExplosionData.putByteArray("FireworkFade", colors);

newExplosionData.putBoolean("FireworkTrail", explosion.isHasTrail());
newExplosionData.putBoolean("FireworkFlicker", explosion.isHasTwinkle()); // TODO verify

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,13 @@

package org.geysermc.geyser.item.type;

import com.github.steveice10.mc.protocol.data.game.item.component.DataComponentType;
import com.github.steveice10.mc.protocol.data.game.item.component.DataComponents;
import com.github.steveice10.mc.protocol.data.game.item.component.Fireworks;
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
import com.github.steveice10.opennbt.tag.builtin.IntArrayTag;
import com.github.steveice10.opennbt.tag.builtin.IntTag;
import com.github.steveice10.opennbt.tag.builtin.Tag;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.cloudburstmc.nbt.NbtMap;
import org.geysermc.geyser.registry.type.ItemMapping;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.translator.item.BedrockItemBuilder;
Expand All @@ -44,19 +45,15 @@ public FireworkStarItem(String javaIdentifier, Builder builder) {
public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNull DataComponents components, @NonNull BedrockItemBuilder builder) {
super.translateComponentsToBedrock(session, components, builder);

Tag explosion = tag.remove("Explosion");
if (explosion instanceof CompoundTag) {
CompoundTag newExplosion = FireworkRocketItem.translateExplosionToBedrock((CompoundTag) explosion, "FireworksItem");
tag.put(newExplosion);
Tag color = ((CompoundTag) explosion).get("Colors");
if (color instanceof IntArrayTag) {
Fireworks.FireworkExplosion explosion = components.get(DataComponentType.FIREWORK_EXPLOSION);
if (explosion != null) {
NbtMap newExplosion = FireworkRocketItem.translateExplosionToBedrock(explosion);
builder.putCompound("FireworksItem", newExplosion);
int[] colors = explosion.getColors();
if (colors.length != 0) {
// Determine the custom color, if any.
// Mostly replicates Java's own rendering code, as Java determines the final firework star color client-side
// while Bedrock determines it server-side.
int[] colors = ((IntArrayTag) color).getValue();
if (colors.length == 0) {
return;
}
int finalColor;
if (colors.length == 1) {
finalColor = colors[0];
Expand All @@ -77,7 +74,7 @@ public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNul
finalColor = r << 16 | g << 8 | b;
}

tag.put(new IntTag("customColor", finalColor));
builder.putInt("customColor", finalColor);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@
package org.geysermc.geyser.item.type;

import com.github.steveice10.mc.protocol.data.game.item.component.DataComponents;
import com.github.steveice10.opennbt.tag.builtin.IntTag;
import com.github.steveice10.opennbt.tag.builtin.Tag;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.translator.item.BedrockItemBuilder;
Expand All @@ -42,11 +40,7 @@ public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNul
super.translateComponentsToBedrock(session, components, builder);

// Fix damage inconsistency
Tag damage = tag.get("Damage");
if (damage instanceof IntTag) {
int originalDurability = ((IntTag) damage).getValue();
tag.put(new IntTag("Damage", getBedrockDamage(originalDurability)));
}
builder.getDamage().ifPresent(damage -> builder.setDamage(getBedrockDamage(damage)));
}

public static int getBedrockDamage(int javaDamage) {
Expand Down
15 changes: 11 additions & 4 deletions core/src/main/java/org/geysermc/geyser/item/type/GoatHornItem.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@
package org.geysermc.geyser.item.type;

import com.github.steveice10.mc.protocol.data.game.item.ItemStack;
import com.github.steveice10.mc.protocol.data.game.item.component.DataComponentType;
import com.github.steveice10.mc.protocol.data.game.item.component.DataComponents;
import com.github.steveice10.mc.protocol.data.game.item.component.Instrument;
import com.github.steveice10.opennbt.tag.builtin.StringTag;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData;
Expand All @@ -52,10 +55,14 @@ public GoatHornItem(String javaIdentifier, Builder builder) {
}

@Override
public ItemData.Builder translateToBedrock(ItemStack itemStack, ItemMapping mapping, ItemMappings mappings) {
ItemData.Builder builder = super.translateToBedrock(itemStack, mapping, mappings);
if (itemStack.getNbt() != null && itemStack.getNbt().get("instrument") instanceof StringTag instrumentTag) {
String instrument = instrumentTag.getValue();
public ItemData.Builder translateToBedrock(int count, DataComponents components, ItemMapping mapping, ItemMappings mappings) {
ItemData.Builder builder = super.translateToBedrock(count, components, mapping, mappings);
if (components == null) {
return builder;
}
Instrument instrument = components.get(DataComponentType.INSTRUMENT);
// TODO registry
if (instrument != null) {
// Drop the Minecraft namespace if applicable
if (instrument.startsWith("minecraft:")) {
instrument = instrument.substring("minecraft:".length());
Expand Down
16 changes: 9 additions & 7 deletions core/src/main/java/org/geysermc/geyser/item/type/Item.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData;
import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.inventory.item.Enchantment;
import org.geysermc.geyser.item.Items;
import org.geysermc.geyser.registry.type.ItemMapping;
import org.geysermc.geyser.registry.type.ItemMappings;
import org.geysermc.geyser.session.GeyserSession;
Expand Down Expand Up @@ -93,20 +94,16 @@ public boolean isValidRepairItem(Item other) {

/* Translation methods to Bedrock and back */

public ItemData.Builder translateToBedrock(ItemStack itemStack, ItemMapping mapping, ItemMappings mappings) {
if (InventoryUtils.isEmpty(itemStack)) {
public ItemData.Builder translateToBedrock(int count, DataComponents components, ItemMapping mapping, ItemMappings mappings) {
if (this == Items.AIR || count <= 0) {
// Return, essentially, air
return ItemData.builder();
}
ItemData.Builder builder = ItemData.builder()
.definition(mapping.getBedrockDefinition())
.damage(mapping.getBedrockData())
.count(itemStack.getAmount());
if (itemStack.getDataComponents() != null) {
builder.tag(ItemTranslator.translateNbtToBedrock(itemStack.getDataComponents()));
}
.count(count);

DataComponents components = itemStack.getDataComponents();
ItemTranslator.translateCustomItem(components, builder, mapping);

return builder;
Expand Down Expand Up @@ -135,6 +132,11 @@ public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNul
}
}

Integer damage = components.get(DataComponentType.DAMAGE);
if (damage != null) {
builder.setDamage(damage);
}

List<Tag> newTags = new ArrayList<>();
ItemEnchantments enchantments = components.get(DataComponentType.ENCHANTMENTS);
if (enchantments != null) {
Expand Down
15 changes: 8 additions & 7 deletions core/src/main/java/org/geysermc/geyser/item/type/MapItem.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@

package org.geysermc.geyser.item.type;

import com.github.steveice10.mc.protocol.data.game.item.component.DataComponentType;
import com.github.steveice10.mc.protocol.data.game.item.component.DataComponents;
import com.github.steveice10.opennbt.tag.builtin.*;
import org.checkerframework.checker.nullness.qual.NonNull;
Expand All @@ -41,14 +42,14 @@ public MapItem(String javaIdentifier, Builder builder) {
public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNull DataComponents components, @NonNull BedrockItemBuilder builder) {
super.translateComponentsToBedrock(session, components, builder);

Tag mapId = tag.remove("map");
if (mapId == null || !(mapId.getValue() instanceof Number number)) return;

int mapValue = number.intValue();
Integer mapValue = components.get(DataComponentType.MAP_ID);
if (mapValue == null) {
return;
}

tag.put(new LongTag("map_uuid", mapValue));
tag.put(new IntTag("map_name_index", mapValue));
tag.put(new ByteTag("map_display_players", (byte) 1));
builder.putLong("map_uuid", mapValue);
builder.putInt("map_name_index", mapValue);
builder.putByte("map_display_players", (byte) 1);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,14 @@

package org.geysermc.geyser.item.type;

import com.github.steveice10.mc.auth.data.GameProfile;
import com.github.steveice10.mc.protocol.data.game.item.component.DataComponentType;
import com.github.steveice10.mc.protocol.data.game.item.component.DataComponents;
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
import com.github.steveice10.opennbt.tag.builtin.StringTag;
import com.github.steveice10.opennbt.tag.builtin.Tag;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.text.ChatColor;
import org.geysermc.geyser.text.MinecraftLocale;
import org.geysermc.geyser.translator.item.BedrockItemBuilder;
import org.geysermc.geyser.translator.text.MessageTranslator;

public class PlayerHeadItem extends Item {
public PlayerHeadItem(String javaIdentifier, Builder builder) {
Expand All @@ -45,35 +43,24 @@ public PlayerHeadItem(String javaIdentifier, Builder builder) {
public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNull DataComponents components, @NonNull BedrockItemBuilder builder) {
super.translateComponentsToBedrock(session, components, builder);

CompoundTag displayTag;
if (tag.get("display") instanceof CompoundTag existingDisplayTag) {
displayTag = existingDisplayTag;
} else {
displayTag = new CompoundTag("display");
tag.put(displayTag);
}

if (displayTag.get("Name") instanceof StringTag nameTag) {
// Custom names are always yellow and italic
displayTag.put(new StringTag("Name", ChatColor.YELLOW + ChatColor.ITALIC + MessageTranslator.convertMessageLenient(nameTag.getValue(), session.locale())));
} else {
if (tag.contains("SkullOwner")) {
StringTag name;
Tag skullOwner = tag.get("SkullOwner");
if (skullOwner instanceof StringTag skullName) {
name = skullName;
// TODO verify
// Also - ChatColor.YELLOW + ChatColor.ITALIC + MessageTranslator.convertMessageLenient(nameTag.getValue(), session.locale())) this code existed if a custom name was already present.
// But I think we would always overwrite that because translateDisplayProperties runs after this method.
String customName = builder.getCustomName();
if (customName == null) {
GameProfile profile = components.get(DataComponentType.PROFILE);
if (profile != null) {
String name = profile.getName();
if (name != null) {
// Add correct name of player skull
String displayName = ChatColor.RESET + ChatColor.YELLOW +
MinecraftLocale.getLocaleString("block.minecraft.player_head.named", session.locale()).replace("%s", name);
builder.setCustomName(displayName);
} else {
if (skullOwner instanceof CompoundTag && ((CompoundTag) skullOwner).get("Name") instanceof StringTag skullName) {
name = skullName;
} else {
// No name found so default to "Player Head"
displayTag.put(new StringTag("Name", ChatColor.RESET + ChatColor.YELLOW + MinecraftLocale.getLocaleString("block.minecraft.player_head", session.locale())));
return;
}
// No name found so default to "Player Head"
builder.setCustomName(ChatColor.RESET + ChatColor.YELLOW +
MinecraftLocale.getLocaleString("block.minecraft.player_head", session.locale()));
}
// Add correct name of player skull
String displayName = ChatColor.RESET + ChatColor.YELLOW + MinecraftLocale.getLocaleString("block.minecraft.player_head.named", session.locale()).replace("%s", name.getValue());
displayTag.put(new StringTag("Name", displayName));
}
}
}
Expand Down
Loading

0 comments on commit 3a37daa

Please # to comment.