mirror of
https://github.com/GeyserMC/Geyser.git
synced 2024-11-23 07:16:39 +01:00
Fix some villager block trades being unable to stack
This commit is contained in:
parent
44e9dba759
commit
3f14624d46
2 changed files with 31 additions and 3 deletions
|
@ -44,6 +44,7 @@ import org.geysermc.connector.network.translators.Translator;
|
|||
import org.geysermc.connector.network.translators.item.ItemEntry;
|
||||
import org.geysermc.connector.network.translators.item.ItemRegistry;
|
||||
import org.geysermc.connector.network.translators.item.ItemTranslator;
|
||||
import org.geysermc.connector.network.translators.world.block.BlockTranslator;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
@ -140,6 +141,12 @@ public class JavaTradeListTranslator extends PacketTranslator<ServerTradeListPac
|
|||
NbtMap tag = itemData.getTag().toBuilder().build();
|
||||
builder.put("tag", tag);
|
||||
}
|
||||
NbtMap blockTag = BlockTranslator.getBedrockBlockNbt(itemEntry.getJavaIdentifier());
|
||||
if (blockTag != null) {
|
||||
// This fixes certain blocks being unable to stack after grabbing one
|
||||
builder.putCompound("Block", blockTag);
|
||||
builder.putShort("Damage", (short) 0);
|
||||
}
|
||||
return builder.build();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -98,6 +98,12 @@ public class BlockTranslator {
|
|||
|
||||
public static final int JAVA_RUNTIME_SPAWNER_ID;
|
||||
|
||||
/**
|
||||
* Contains a map of Java blocks to their respective Bedrock block tag, if the Java identifier is different from Bedrock.
|
||||
* Required to fix villager trades with these blocks.
|
||||
*/
|
||||
private static final Map<String, NbtMap> JAVA_IDENTIFIER_TO_BEDROCK_TAG;
|
||||
|
||||
private static final int BLOCK_STATE_VERSION = 17825808;
|
||||
|
||||
static {
|
||||
|
@ -112,6 +118,8 @@ public class BlockTranslator {
|
|||
throw new AssertionError("Unable to get blocks from runtime block states", e);
|
||||
}
|
||||
|
||||
JAVA_IDENTIFIER_TO_BEDROCK_TAG = new Object2ObjectOpenHashMap<>(blocksTag.size());
|
||||
|
||||
// New since 1.16.100 - find the block runtime ID by the order given to us in the block palette,
|
||||
// as we no longer send a block palette
|
||||
Object2IntMap<NbtMap> blockStateOrderedMap = new Object2IntOpenHashMap<>(blocksTag.size());
|
||||
|
@ -188,15 +196,19 @@ public class BlockTranslator {
|
|||
BlockStateValues.storeBlockStateValues(entry.getKey(), javaRuntimeId, entry.getValue());
|
||||
|
||||
String cleanJavaIdentifier = entry.getKey().split("\\[")[0];
|
||||
String bedrockIdentifier = entry.getValue().get("bedrock_identifier").asText();
|
||||
|
||||
boolean javaIdentifierSameAsBedrock = cleanJavaIdentifier.equals(bedrockIdentifier);
|
||||
|
||||
if (!JAVA_ID_TO_JAVA_IDENTIFIER_MAP.containsValue(cleanJavaIdentifier)) {
|
||||
uniqueJavaId++;
|
||||
JAVA_ID_TO_JAVA_IDENTIFIER_MAP.put(uniqueJavaId, cleanJavaIdentifier);
|
||||
if (!javaIdentifierSameAsBedrock) {
|
||||
JAVA_IDENTIFIER_TO_BEDROCK_TAG.put(cleanJavaIdentifier, blockTag);
|
||||
}
|
||||
}
|
||||
|
||||
String bedrockIdentifier = entry.getValue().get("bedrock_identifier").asText();
|
||||
|
||||
if (!cleanJavaIdentifier.equals(bedrockIdentifier)) {
|
||||
if (!javaIdentifierSameAsBedrock) {
|
||||
JAVA_TO_BEDROCK_IDENTIFIERS.put(cleanJavaIdentifier, bedrockIdentifier);
|
||||
}
|
||||
|
||||
|
@ -393,4 +405,13 @@ public class BlockTranslator {
|
|||
public static String[] getAllBlockIdentifiers() {
|
||||
return JAVA_ID_TO_JAVA_IDENTIFIER_MAP.values().toArray(new String[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param cleanJavaIdentifier the clean Java identifier of the block to look up
|
||||
*
|
||||
* @return the block tag of the block name mapped from Java to Bedrock.
|
||||
*/
|
||||
public static NbtMap getBedrockBlockNbt(String cleanJavaIdentifier) {
|
||||
return JAVA_IDENTIFIER_TO_BEDROCK_TAG.get(cleanJavaIdentifier);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue