3
0
Mirror von https://github.com/GeyserMC/Geyser.git synchronisiert 2024-12-27 08:30:12 +01:00

Fix regressions from 1.16.100 (#1558)

* Fix regressions from 1.16.100

- Update mappings to fix recipe regressions and item differences
- Villager trading NBT now prefers the String identifier and not the integer ID

* Fix lodestone compass breaking
Dieser Commit ist enthalten in:
Camotoy 2020-11-18 01:10:49 -05:00 committet von GitHub
Ursprung 99558b61a6
Commit 199778faea
Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden
GPG-Schlüssel-ID: 4AEE18F83AFDEB23
10 geänderte Dateien mit 28 neuen und 45 gelöschten Zeilen

Datei anzeigen

@ -98,14 +98,12 @@ public class ItemFrameEntity extends Entity {
ItemEntry itemEntry = ItemRegistry.getItem((ItemStack) entityMetadata.getValue()); ItemEntry itemEntry = ItemRegistry.getItem((ItemStack) entityMetadata.getValue());
NbtMapBuilder builder = NbtMap.builder(); NbtMapBuilder builder = NbtMap.builder();
String blockName = ItemRegistry.getBedrockIdentifier(itemEntry);
builder.putByte("Count", (byte) itemData.getCount()); builder.putByte("Count", (byte) itemData.getCount());
if (itemData.getTag() != null) { if (itemData.getTag() != null) {
builder.put("tag", itemData.getTag().toBuilder().build()); builder.put("tag", itemData.getTag().toBuilder().build());
} }
builder.putShort("Damage", itemData.getDamage()); builder.putShort("Damage", itemData.getDamage());
builder.putString("Name", blockName); builder.putString("Name", itemEntry.getBedrockIdentifier());
NbtMapBuilder tag = getDefaultTag().toBuilder(); NbtMapBuilder tag = getDefaultTag().toBuilder();
tag.put("Item", builder.build()); tag.put("Item", builder.build());
tag.putFloat("ItemDropChance", 1.0f); tag.putFloat("ItemDropChance", 1.0f);

Datei anzeigen

@ -34,9 +34,10 @@ import lombok.ToString;
@ToString @ToString
public class ItemEntry { public class ItemEntry {
public static ItemEntry AIR = new ItemEntry("minecraft:air", 0, 0, 0, false); public static ItemEntry AIR = new ItemEntry("minecraft:air", "minecraft:air", 0, 0, 0, false);
private final String javaIdentifier; private final String javaIdentifier;
private final String bedrockIdentifier;
private final int javaId; private final int javaId;
private final int bedrockId; private final int bedrockId;
private final int bedrockData; private final int bedrockData;

Datei anzeigen

@ -103,6 +103,9 @@ public class ItemRegistry {
TypeReference<List<JsonNode>> itemEntriesType = new TypeReference<List<JsonNode>>() { TypeReference<List<JsonNode>> itemEntriesType = new TypeReference<List<JsonNode>>() {
}; };
// Used to get the Bedrock namespaced ID (in instances where there are small differences)
Int2ObjectMap<String> bedrockIdToIdentifier = new Int2ObjectOpenHashMap<>();
List<JsonNode> itemEntries; List<JsonNode> itemEntries;
try { try {
itemEntries = GeyserConnector.JSON_MAPPER.readValue(stream, itemEntriesType); itemEntries = GeyserConnector.JSON_MAPPER.readValue(stream, itemEntriesType);
@ -114,6 +117,7 @@ public class ItemRegistry {
for (JsonNode entry : itemEntries) { for (JsonNode entry : itemEntries) {
ITEMS.add(new StartGamePacket.ItemEntry(entry.get("name").textValue(), (short) entry.get("id").intValue())); ITEMS.add(new StartGamePacket.ItemEntry(entry.get("name").textValue(), (short) entry.get("id").intValue()));
bedrockIdToIdentifier.put(entry.get("id").intValue(), entry.get("name").textValue());
if (entry.get("name").textValue().equals("minecraft:lodestone_compass")) { if (entry.get("name").textValue().equals("minecraft:lodestone_compass")) {
lodestoneCompassId = entry.get("id").intValue(); lodestoneCompassId = entry.get("id").intValue();
} }
@ -132,28 +136,29 @@ public class ItemRegistry {
Iterator<Map.Entry<String, JsonNode>> iterator = items.fields(); Iterator<Map.Entry<String, JsonNode>> iterator = items.fields();
while (iterator.hasNext()) { while (iterator.hasNext()) {
Map.Entry<String, JsonNode> entry = iterator.next(); Map.Entry<String, JsonNode> entry = iterator.next();
int bedrockId = entry.getValue().get("bedrock_id").intValue();
String bedrockIdentifier = bedrockIdToIdentifier.get(bedrockId);
if (bedrockIdentifier == null) {
throw new RuntimeException("Missing Bedrock ID in mappings!: " + bedrockId);
}
if (entry.getValue().has("tool_type")) { if (entry.getValue().has("tool_type")) {
if (entry.getValue().has("tool_tier")) { if (entry.getValue().has("tool_tier")) {
ITEM_ENTRIES.put(itemIndex, new ToolItemEntry( ITEM_ENTRIES.put(itemIndex, new ToolItemEntry(
entry.getKey(), itemIndex, entry.getKey(), bedrockIdentifier, itemIndex, bedrockId,
entry.getValue().get("bedrock_id").intValue(),
entry.getValue().get("bedrock_data").intValue(), entry.getValue().get("bedrock_data").intValue(),
entry.getValue().get("tool_type").textValue(), entry.getValue().get("tool_type").textValue(),
entry.getValue().get("tool_tier").textValue(), entry.getValue().get("tool_tier").textValue(),
entry.getValue().get("is_block") != null && entry.getValue().get("is_block").booleanValue())); entry.getValue().get("is_block") != null && entry.getValue().get("is_block").booleanValue()));
} else { } else {
ITEM_ENTRIES.put(itemIndex, new ToolItemEntry( ITEM_ENTRIES.put(itemIndex, new ToolItemEntry(
entry.getKey(), itemIndex, entry.getKey(), bedrockIdentifier, itemIndex, bedrockId,
entry.getValue().get("bedrock_id").intValue(),
entry.getValue().get("bedrock_data").intValue(), entry.getValue().get("bedrock_data").intValue(),
entry.getValue().get("tool_type").textValue(), entry.getValue().get("tool_type").textValue(),
"", "", entry.getValue().get("is_block").booleanValue()));
entry.getValue().get("is_block").booleanValue()));
} }
} else { } else {
ITEM_ENTRIES.put(itemIndex, new ItemEntry( ITEM_ENTRIES.put(itemIndex, new ItemEntry(
entry.getKey(), itemIndex, entry.getKey(), bedrockIdentifier, itemIndex, bedrockId,
entry.getValue().get("bedrock_id").intValue(),
entry.getValue().get("bedrock_data").intValue(), entry.getValue().get("bedrock_data").intValue(),
entry.getValue().get("is_block") != null && entry.getValue().get("is_block").booleanValue())); entry.getValue().get("is_block") != null && entry.getValue().get("is_block").booleanValue()));
} }
@ -197,7 +202,7 @@ public class ItemRegistry {
} }
// Add the loadstone compass since it doesn't exist on java but we need it for item conversion // Add the loadstone compass since it doesn't exist on java but we need it for item conversion
ITEM_ENTRIES.put(itemIndex, new ItemEntry("minecraft:lodestone_compass", itemIndex, ITEM_ENTRIES.put(itemIndex, new ItemEntry("minecraft:lodestone_compass", "minecraft:lodestone_compass", itemIndex,
lodestoneCompassId, 0, false)); lodestoneCompassId, 0, false));
/* Load creative items */ /* Load creative items */
@ -269,23 +274,6 @@ public class ItemRegistry {
}); });
} }
/**
* Finds the Bedrock string identifier of an ItemEntry
*
* @param entry the ItemEntry to search for
* @return the Bedrock identifier
*/
public static String getBedrockIdentifier(ItemEntry entry) {
String blockName = "";
for (StartGamePacket.ItemEntry startGamePacketItemEntry : ItemRegistry.ITEMS) {
if (startGamePacketItemEntry.getId() == (short) entry.getBedrockId()) {
blockName = startGamePacketItemEntry.getIdentifier(); // Find the Bedrock string name
break;
}
}
return blockName;
}
/** /**
* Gets a Bedrock {@link ItemData} from a {@link JsonNode} * Gets a Bedrock {@link ItemData} from a {@link JsonNode}
* @param itemNode the JSON node that contains ProxyPass-compatible Bedrock item data * @param itemNode the JSON node that contains ProxyPass-compatible Bedrock item data

Datei anzeigen

@ -34,16 +34,13 @@ import com.nukkitx.nbt.NbtType;
import com.nukkitx.protocol.bedrock.data.inventory.ItemData; import com.nukkitx.protocol.bedrock.data.inventory.ItemData;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import org.geysermc.connector.GeyserConnector; import org.geysermc.connector.GeyserConnector;
import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.session.GeyserSession;
import org.geysermc.connector.network.translators.ItemRemapper; import org.geysermc.connector.network.translators.ItemRemapper;
import org.geysermc.connector.network.translators.chat.MessageTranslator;
import org.geysermc.connector.network.translators.world.block.BlockTranslator; import org.geysermc.connector.network.translators.world.block.BlockTranslator;
import org.geysermc.connector.utils.FileUtils; import org.geysermc.connector.utils.FileUtils;
import org.geysermc.connector.utils.LanguageUtils; import org.geysermc.connector.utils.LanguageUtils;
import org.geysermc.connector.network.translators.chat.MessageTranslator;
import org.reflections.Reflections; import org.reflections.Reflections;
import java.util.*; import java.util.*;

Datei anzeigen

@ -32,8 +32,8 @@ public class ToolItemEntry extends ItemEntry {
private final String toolType; private final String toolType;
private final String toolTier; private final String toolTier;
public ToolItemEntry(String javaIdentifier, int javaId, int bedrockId, int bedrockData, String toolType, String toolTier, boolean isBlock) { public ToolItemEntry(String javaIdentifier, String bedrockIdentifier, int javaId, int bedrockId, int bedrockData, String toolType, String toolTier, boolean isBlock) {
super(javaIdentifier, javaId, bedrockId, bedrockData, isBlock); super(javaIdentifier, bedrockIdentifier, javaId, bedrockId, bedrockData, isBlock);
this.toolType = toolType; this.toolType = toolType;
this.toolTier = toolTier; this.toolTier = toolTier;
} }

Datei anzeigen

@ -53,7 +53,7 @@ public class CompassTranslator extends ItemTranslator {
Tag lodestoneTag = itemStack.getNbt().get("LodestoneTracked"); Tag lodestoneTag = itemStack.getNbt().get("LodestoneTracked");
if (lodestoneTag instanceof ByteTag) { if (lodestoneTag instanceof ByteTag) {
// Get the fake lodestonecompass entry // Get the fake lodestonecompass entry
itemEntry = ItemRegistry.getItemEntry("minecraft:lodestonecompass"); itemEntry = ItemRegistry.getItemEntry("minecraft:lodestone_compass");
// Get the loadstone pos // Get the loadstone pos
CompoundTag loadstonePos = itemStack.getNbt().get("LodestonePos"); CompoundTag loadstonePos = itemStack.getNbt().get("LodestonePos");
@ -83,7 +83,7 @@ public class CompassTranslator extends ItemTranslator {
@Override @Override
public ItemStack translateToJava(ItemData itemData, ItemEntry itemEntry) { public ItemStack translateToJava(ItemData itemData, ItemEntry itemEntry) {
boolean isLoadstone = false; boolean isLoadstone = false;
if (itemEntry.getJavaIdentifier().equals("minecraft:lodestonecompass")) { if (itemEntry.getBedrockIdentifier().equals("minecraft:lodestone_compass")) {
// Revert the entry back to the compass // Revert the entry back to the compass
itemEntry = ItemRegistry.getItemEntry("minecraft:compass"); itemEntry = ItemRegistry.getItemEntry("minecraft:compass");

Datei anzeigen

@ -45,15 +45,15 @@ public class CrossbowTranslator extends NbtItemStackTranslator {
if (!chargedProjectiles.getValue().isEmpty()) { if (!chargedProjectiles.getValue().isEmpty()) {
CompoundTag projectile = (CompoundTag) chargedProjectiles.getValue().get(0); CompoundTag projectile = (CompoundTag) chargedProjectiles.getValue().get(0);
ItemEntry entry = ItemRegistry.getItemEntry((String) projectile.get("id").getValue()); ItemEntry projectileEntry = ItemRegistry.getItemEntry((String) projectile.get("id").getValue());
if (entry == null) return; if (projectileEntry == null) return;
CompoundTag tag = projectile.get("tag"); CompoundTag tag = projectile.get("tag");
ItemStack itemStack = new ItemStack(itemEntry.getJavaId(), (byte) projectile.get("Count").getValue(), tag); ItemStack itemStack = new ItemStack(itemEntry.getJavaId(), (byte) projectile.get("Count").getValue(), tag);
ItemData itemData = ItemTranslator.translateToBedrock(session, itemStack); ItemData itemData = ItemTranslator.translateToBedrock(session, itemStack);
CompoundTag newProjectile = new CompoundTag("chargedItem"); CompoundTag newProjectile = new CompoundTag("chargedItem");
newProjectile.put(new ByteTag("Count", (byte) itemData.getCount())); newProjectile.put(new ByteTag("Count", (byte) itemData.getCount()));
newProjectile.put(new StringTag("Name", ItemRegistry.getBedrockIdentifier(entry))); newProjectile.put(new StringTag("Name", projectileEntry.getBedrockIdentifier()));
newProjectile.put(new ShortTag("Damage", itemData.getDamage())); newProjectile.put(new ShortTag("Damage", itemData.getDamage()));

Datei anzeigen

@ -50,9 +50,8 @@ public class ShulkerBoxItemTranslator extends NbtItemStackTranslator {
boxItemTag.put(new ByteTag("WasPickedUp", (byte) 0)); // ??? boxItemTag.put(new ByteTag("WasPickedUp", (byte) 0)); // ???
ItemEntry boxItemEntry = ItemRegistry.getItemEntry(((StringTag) itemData.get("id")).getValue()); ItemEntry boxItemEntry = ItemRegistry.getItemEntry(((StringTag) itemData.get("id")).getValue());
String blockName = ItemRegistry.getBedrockIdentifier(boxItemEntry);
boxItemTag.put(new StringTag("Name", blockName)); boxItemTag.put(new StringTag("Name", boxItemEntry.getBedrockIdentifier()));
boxItemTag.put(new ShortTag("Damage", (short) boxItemEntry.getBedrockData())); boxItemTag.put(new ShortTag("Damage", (short) boxItemEntry.getBedrockData()));
boxItemTag.put(new ByteTag("Count", ((ByteTag) itemData.get("Count")).getValue())); boxItemTag.put(new ByteTag("Count", ((ByteTag) itemData.get("Count")).getValue()));
if (itemData.contains("tag")) { if (itemData.contains("tag")) {

Datei anzeigen

@ -139,7 +139,7 @@ public class JavaTradeListTranslator extends PacketTranslator<ServerTradeListPac
NbtMapBuilder builder = NbtMap.builder(); NbtMapBuilder builder = NbtMap.builder();
builder.putByte("Count", (byte) (Math.max(itemData.getCount() + specialPrice, 1))); builder.putByte("Count", (byte) (Math.max(itemData.getCount() + specialPrice, 1)));
builder.putShort("Damage", itemData.getDamage()); builder.putShort("Damage", itemData.getDamage());
builder.putShort("id", (short) itemEntry.getBedrockId()); builder.putString("Name", itemEntry.getBedrockIdentifier());
if (itemData.getTag() != null) { if (itemData.getTag() != null) {
NbtMap tag = itemData.getTag().toBuilder().build(); NbtMap tag = itemData.getTag().toBuilder().build();
builder.put("tag", tag); builder.put("tag", tag);

@ -1 +1 @@
Subproject commit 5c1da92b7144096449fc02c42a1adcd3fba7f52f Subproject commit 618a9b981398647125b1b63494cb49ad93433243