From 66c96a77fedfa5b4ca8c961be53cdba26dfce345 Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Sat, 10 Apr 2021 20:42:15 -0400 Subject: [PATCH 1/3] Fix llama carpet decoration --- .../entity/living/animal/horse/LlamaEntity.java | 12 ++++-------- .../network/translators/item/ItemRegistry.java | 11 +++++++++++ .../translators/world/block/BlockTranslator.java | 3 --- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/entity/living/animal/horse/LlamaEntity.java b/connector/src/main/java/org/geysermc/connector/entity/living/animal/horse/LlamaEntity.java index d575f95213c..6c76ccb12fe 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/living/animal/horse/LlamaEntity.java +++ b/connector/src/main/java/org/geysermc/connector/entity/living/animal/horse/LlamaEntity.java @@ -32,7 +32,7 @@ import com.nukkitx.protocol.bedrock.packet.MobArmorEquipmentPacket; import org.geysermc.connector.entity.type.EntityType; import org.geysermc.connector.network.session.GeyserSession; -import org.geysermc.connector.network.translators.world.block.BlockTranslator; +import org.geysermc.connector.network.translators.item.ItemRegistry; public class LlamaEntity extends ChestedHorseEntity { @@ -52,16 +52,12 @@ public void updateBedrockMetadata(EntityMetadata entityMetadata, GeyserSession s if (entityMetadata.getId() == 20) { // Bedrock treats llama decoration as armor MobArmorEquipmentPacket equipmentPacket = new MobArmorEquipmentPacket(); - equipmentPacket.setRuntimeEntityId(getGeyserId()); + equipmentPacket.setRuntimeEntityId(geyserId); // -1 means no armor if ((int) entityMetadata.getValue() != -1) { - // The damage value is the dye color that Java sends us + // The damage value is the dye color that Java sends us, for pre-1.16.220 // The item is always going to be a carpet - equipmentPacket.setChestplate(ItemData.builder() - .id(BlockTranslator.CARPET) - .damage((int) entityMetadata.getValue()) - .count(1) - .build()); + equipmentPacket.setChestplate(ItemRegistry.CARPETS.get((int) entityMetadata.getValue())); } else { equipmentPacket.setChestplate(ItemData.AIR); } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemRegistry.java b/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemRegistry.java index c56ba249f5b..3dfda2df83e 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemRegistry.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemRegistry.java @@ -92,6 +92,10 @@ public class ItemRegistry { * Bucket item entries (excluding the milk bucket), used in BedrockInventoryTransactionTranslator.java */ public static final IntSet BUCKETS = new IntArraySet(); + /** + * Bedrock carpet item data, used in LlamaEntity.java + */ + public static final List CARPETS = new ArrayList<>(); /** * Crossbow item entry, used in PillagerEntity.java */ @@ -452,6 +456,13 @@ public static void init() { BOATS.add(entry.getValue().get("bedrock_id").intValue()); } else if (entry.getKey().contains("bucket") && !entry.getKey().contains("milk")) { BUCKETS.add(entry.getValue().get("bedrock_id").intValue()); + } else if (entry.getKey().contains("_carpet")) { + // This should be the numerical order Java sends as an integer value for llamas + CARPETS.add(ItemData.builder() + .id(itemEntry.getBedrockId()) + .damage(itemEntry.getBedrockData()) + .count(1) + .blockRuntimeId(itemEntry.getBedrockBlockId()).build()); } itemNames.add(entry.getKey()); diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/world/block/BlockTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/world/block/BlockTranslator.java index aca6c843019..60786a6c4b0 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/world/block/BlockTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/world/block/BlockTranslator.java @@ -73,9 +73,6 @@ public abstract class BlockTranslator { private final Object2IntMap itemFrames = new Object2IntOpenHashMap<>(); private final Map flowerPotBlocks = new HashMap<>(); - // Bedrock carpet ID, used in LlamaEntity.java for decoration - public static final int CARPET = 171; - public static final Int2DoubleMap JAVA_RUNTIME_ID_TO_HARDNESS = new Int2DoubleOpenHashMap(); public static final Int2BooleanMap JAVA_RUNTIME_ID_TO_CAN_HARVEST_WITH_HAND = new Int2BooleanOpenHashMap(); public static final Int2ObjectMap JAVA_RUNTIME_ID_TO_TOOL_TYPE = new Int2ObjectOpenHashMap<>(); From 2b2d08066787f27a3ebb9eb0f00d9b3310116694 Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Sat, 10 Apr 2021 20:48:35 -0400 Subject: [PATCH 2/3] Store the ItemEntry for some sort of future-proofing --- .../entity/living/animal/horse/LlamaEntity.java | 8 +++++++- .../network/translators/item/ItemRegistry.java | 10 +++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/entity/living/animal/horse/LlamaEntity.java b/connector/src/main/java/org/geysermc/connector/entity/living/animal/horse/LlamaEntity.java index 6c76ccb12fe..ac8c3a7e7f6 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/living/animal/horse/LlamaEntity.java +++ b/connector/src/main/java/org/geysermc/connector/entity/living/animal/horse/LlamaEntity.java @@ -32,6 +32,7 @@ import com.nukkitx.protocol.bedrock.packet.MobArmorEquipmentPacket; import org.geysermc.connector.entity.type.EntityType; import org.geysermc.connector.network.session.GeyserSession; +import org.geysermc.connector.network.translators.item.ItemEntry; import org.geysermc.connector.network.translators.item.ItemRegistry; public class LlamaEntity extends ChestedHorseEntity { @@ -57,7 +58,12 @@ public void updateBedrockMetadata(EntityMetadata entityMetadata, GeyserSession s if ((int) entityMetadata.getValue() != -1) { // The damage value is the dye color that Java sends us, for pre-1.16.220 // The item is always going to be a carpet - equipmentPacket.setChestplate(ItemRegistry.CARPETS.get((int) entityMetadata.getValue())); + ItemEntry carpetItem = ItemRegistry.CARPETS.get((int) entityMetadata.getValue()); + equipmentPacket.setChestplate(ItemData.builder() + .id(carpetItem.getBedrockId()) + .damage(carpetItem.getBedrockData()) + .count(1) + .blockRuntimeId(carpetItem.getBedrockBlockId()).build()); } else { equipmentPacket.setChestplate(ItemData.AIR); } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemRegistry.java b/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemRegistry.java index 3dfda2df83e..b2fc7ca4c14 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemRegistry.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemRegistry.java @@ -93,9 +93,9 @@ public class ItemRegistry { */ public static final IntSet BUCKETS = new IntArraySet(); /** - * Bedrock carpet item data, used in LlamaEntity.java + * Carpet item entries, used in LlamaEntity.java */ - public static final List CARPETS = new ArrayList<>(); + public static final List CARPETS = new ArrayList<>(16); /** * Crossbow item entry, used in PillagerEntity.java */ @@ -458,11 +458,7 @@ public static void init() { BUCKETS.add(entry.getValue().get("bedrock_id").intValue()); } else if (entry.getKey().contains("_carpet")) { // This should be the numerical order Java sends as an integer value for llamas - CARPETS.add(ItemData.builder() - .id(itemEntry.getBedrockId()) - .damage(itemEntry.getBedrockData()) - .count(1) - .blockRuntimeId(itemEntry.getBedrockBlockId()).build()); + CARPETS.add(itemEntry); } itemNames.add(entry.getKey()); From 19d5c4033e740941b9f5a67dc28e8726bc0d276a Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Mon, 12 Apr 2021 20:09:44 -0400 Subject: [PATCH 3/3] Revert back to ItemData usage --- .../entity/living/animal/horse/LlamaEntity.java | 11 +++-------- .../network/translators/item/ItemRegistry.java | 10 +++++++--- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/entity/living/animal/horse/LlamaEntity.java b/connector/src/main/java/org/geysermc/connector/entity/living/animal/horse/LlamaEntity.java index ac8c3a7e7f6..48e321932cc 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/living/animal/horse/LlamaEntity.java +++ b/connector/src/main/java/org/geysermc/connector/entity/living/animal/horse/LlamaEntity.java @@ -32,7 +32,6 @@ import com.nukkitx.protocol.bedrock.packet.MobArmorEquipmentPacket; import org.geysermc.connector.entity.type.EntityType; import org.geysermc.connector.network.session.GeyserSession; -import org.geysermc.connector.network.translators.item.ItemEntry; import org.geysermc.connector.network.translators.item.ItemRegistry; public class LlamaEntity extends ChestedHorseEntity { @@ -55,15 +54,11 @@ public void updateBedrockMetadata(EntityMetadata entityMetadata, GeyserSession s MobArmorEquipmentPacket equipmentPacket = new MobArmorEquipmentPacket(); equipmentPacket.setRuntimeEntityId(geyserId); // -1 means no armor - if ((int) entityMetadata.getValue() != -1) { + int carpetIndex = (int) entityMetadata.getValue(); + if (carpetIndex > -1 && carpetIndex <= 15) { // The damage value is the dye color that Java sends us, for pre-1.16.220 // The item is always going to be a carpet - ItemEntry carpetItem = ItemRegistry.CARPETS.get((int) entityMetadata.getValue()); - equipmentPacket.setChestplate(ItemData.builder() - .id(carpetItem.getBedrockId()) - .damage(carpetItem.getBedrockData()) - .count(1) - .blockRuntimeId(carpetItem.getBedrockBlockId()).build()); + equipmentPacket.setChestplate(ItemRegistry.CARPETS.get(carpetIndex)); } else { equipmentPacket.setChestplate(ItemData.AIR); } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemRegistry.java b/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemRegistry.java index b2fc7ca4c14..7550bc818a4 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemRegistry.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemRegistry.java @@ -93,9 +93,9 @@ public class ItemRegistry { */ public static final IntSet BUCKETS = new IntArraySet(); /** - * Carpet item entries, used in LlamaEntity.java + * Carpet item data, used in LlamaEntity.java */ - public static final List CARPETS = new ArrayList<>(16); + public static final List CARPETS = new ArrayList<>(16); /** * Crossbow item entry, used in PillagerEntity.java */ @@ -458,7 +458,11 @@ public static void init() { BUCKETS.add(entry.getValue().get("bedrock_id").intValue()); } else if (entry.getKey().contains("_carpet")) { // This should be the numerical order Java sends as an integer value for llamas - CARPETS.add(itemEntry); + CARPETS.add(ItemData.builder() + .id(itemEntry.getBedrockId()) + .damage(itemEntry.getBedrockData()) + .count(1) + .blockRuntimeId(itemEntry.getBedrockBlockId()).build()); } itemNames.add(entry.getKey());