mirror of
https://github.com/ViaVersion/ViaBackwards.git
synced 2024-11-22 12:16:21 +01:00
Allow specifying unmapped data in legacy mappings
This commit is contained in:
parent
4fe53f5ab8
commit
6ad4a29d30
@ -50,7 +50,7 @@ public abstract class LegacyBlockItemRewriter<C extends ClientboundPacketType, S
|
|||||||
T extends BackwardsProtocol<C, ?, ?, S>> extends ItemRewriterBase<C, S, T> {
|
T extends BackwardsProtocol<C, ?, ?, S>> extends ItemRewriterBase<C, S, T> {
|
||||||
|
|
||||||
private static final Map<String, Int2ObjectMap<MappedLegacyBlockItem>> LEGACY_MAPPINGS = new HashMap<>();
|
private static final Map<String, Int2ObjectMap<MappedLegacyBlockItem>> LEGACY_MAPPINGS = new HashMap<>();
|
||||||
protected final Int2ObjectMap<MappedLegacyBlockItem> replacementData;
|
protected final Int2ObjectMap<MappedLegacyBlockItem> replacementData; // Raw id -> mapped data
|
||||||
|
|
||||||
static {
|
static {
|
||||||
JsonObject jsonObject = VBMappingDataLoader.loadFromDataDir("legacy-mappings.json");
|
JsonObject jsonObject = VBMappingDataLoader.loadFromDataDir("legacy-mappings.json");
|
||||||
@ -58,7 +58,12 @@ public abstract class LegacyBlockItemRewriter<C extends ClientboundPacketType, S
|
|||||||
Int2ObjectMap<MappedLegacyBlockItem> mappings = new Int2ObjectOpenHashMap<>(8);
|
Int2ObjectMap<MappedLegacyBlockItem> mappings = new Int2ObjectOpenHashMap<>(8);
|
||||||
LEGACY_MAPPINGS.put(entry.getKey(), mappings);
|
LEGACY_MAPPINGS.put(entry.getKey(), mappings);
|
||||||
for (Map.Entry<String, JsonElement> dataEntry : entry.getValue().getAsJsonObject().entrySet()) {
|
for (Map.Entry<String, JsonElement> dataEntry : entry.getValue().getAsJsonObject().entrySet()) {
|
||||||
JsonObject object = dataEntry.getValue().getAsJsonObject();
|
addMapping(dataEntry.getKey(), dataEntry.getValue().getAsJsonObject(), mappings);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void addMapping(String key, JsonObject object, Int2ObjectMap<MappedLegacyBlockItem> mappings) {
|
||||||
int id = object.getAsJsonPrimitive("id").getAsInt();
|
int id = object.getAsJsonPrimitive("id").getAsInt();
|
||||||
JsonPrimitive jsonData = object.getAsJsonPrimitive("data");
|
JsonPrimitive jsonData = object.getAsJsonPrimitive("data");
|
||||||
short data = jsonData != null ? jsonData.getAsShort() : 0;
|
short data = jsonData != null ? jsonData.getAsShort() : 0;
|
||||||
@ -66,26 +71,36 @@ public abstract class LegacyBlockItemRewriter<C extends ClientboundPacketType, S
|
|||||||
JsonPrimitive blockField = object.getAsJsonPrimitive("block");
|
JsonPrimitive blockField = object.getAsJsonPrimitive("block");
|
||||||
boolean block = blockField != null && blockField.getAsBoolean();
|
boolean block = blockField != null && blockField.getAsBoolean();
|
||||||
|
|
||||||
if (dataEntry.getKey().indexOf('-') != -1) {
|
if (key.indexOf('-') == -1) {
|
||||||
|
int unmappedId;
|
||||||
|
int dataSeparatorIndex = key.indexOf(':');
|
||||||
|
if (dataSeparatorIndex != -1) {
|
||||||
|
// Include data
|
||||||
|
short unmappedData = Short.parseShort(key.substring(dataSeparatorIndex + 1));
|
||||||
|
unmappedId = Integer.parseInt(key.substring(0, dataSeparatorIndex));
|
||||||
|
unmappedId = (unmappedId << 4) | (unmappedData & 15);
|
||||||
|
} else {
|
||||||
|
unmappedId = Integer.parseInt(key) << 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
mappings.put(unmappedId, new MappedLegacyBlockItem(id, data, name, block));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Range of ids
|
// Range of ids
|
||||||
String[] split = dataEntry.getKey().split("-", 2);
|
String[] split = key.split("-", 2);
|
||||||
int from = Integer.parseInt(split[0]);
|
int from = Integer.parseInt(split[0]);
|
||||||
int to = Integer.parseInt(split[1]);
|
int to = Integer.parseInt(split[1]);
|
||||||
|
|
||||||
// Special block color handling
|
// Special block color handling
|
||||||
if (name.contains("%color%")) {
|
if (name.contains("%color%")) {
|
||||||
for (int i = from; i <= to; i++) {
|
for (int i = from; i <= to; i++) {
|
||||||
mappings.put(i, new MappedLegacyBlockItem(id, data, name.replace("%color%", BlockColors.get(i - from)), block));
|
mappings.put(i << 4, new MappedLegacyBlockItem(id, data, name.replace("%color%", BlockColors.get(i - from)), block));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
MappedLegacyBlockItem mappedBlockItem = new MappedLegacyBlockItem(id, data, name, block);
|
MappedLegacyBlockItem mappedBlockItem = new MappedLegacyBlockItem(id, data, name, block);
|
||||||
for (int i = from; i <= to; i++) {
|
for (int i = from; i <= to; i++) {
|
||||||
mappings.put(i, mappedBlockItem);
|
mappings.put(i << 4, mappedBlockItem);
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
mappings.put(Integer.parseInt(dataEntry.getKey()), new MappedLegacyBlockItem(id, data, name, block));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -99,7 +114,7 @@ public abstract class LegacyBlockItemRewriter<C extends ClientboundPacketType, S
|
|||||||
public @Nullable Item handleItemToClient(@Nullable Item item) {
|
public @Nullable Item handleItemToClient(@Nullable Item item) {
|
||||||
if (item == null) return null;
|
if (item == null) return null;
|
||||||
|
|
||||||
MappedLegacyBlockItem data = replacementData.get(item.identifier());
|
MappedLegacyBlockItem data = getMappedBlockItem(item.identifier(), item.data());
|
||||||
if (data == null) {
|
if (data == null) {
|
||||||
// Just rewrite the id
|
// Just rewrite the id
|
||||||
return super.handleItemToClient(item);
|
return super.handleItemToClient(item);
|
||||||
@ -149,7 +164,7 @@ public abstract class LegacyBlockItemRewriter<C extends ClientboundPacketType, S
|
|||||||
}
|
}
|
||||||
|
|
||||||
public @Nullable Block handleBlock(int blockId, int data) {
|
public @Nullable Block handleBlock(int blockId, int data) {
|
||||||
MappedLegacyBlockItem settings = replacementData.get(blockId);
|
MappedLegacyBlockItem settings = getMappedBlockItem(blockId, data);
|
||||||
if (settings == null || !settings.isBlock()) return null;
|
if (settings == null || !settings.isBlock()) return null;
|
||||||
|
|
||||||
Block block = settings.getBlock();
|
Block block = settings.getBlock();
|
||||||
@ -160,6 +175,16 @@ public abstract class LegacyBlockItemRewriter<C extends ClientboundPacketType, S
|
|||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private @Nullable MappedLegacyBlockItem getMappedBlockItem(int id, int data) {
|
||||||
|
MappedLegacyBlockItem mapping = replacementData.get((id << 4) | (data & 15));
|
||||||
|
return mapping != null || data == 0 ? mapping : replacementData.get(id << 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
private @Nullable MappedLegacyBlockItem getMappedBlockItem(int rawId) {
|
||||||
|
MappedLegacyBlockItem mapping = replacementData.get(rawId);
|
||||||
|
return mapping != null ? mapping : replacementData.get(rawId & ~15);
|
||||||
|
}
|
||||||
|
|
||||||
protected void handleChunk(Chunk chunk) {
|
protected void handleChunk(Chunk chunk) {
|
||||||
// Map Block Entities
|
// Map Block Entities
|
||||||
Map<Pos, CompoundTag> tags = new HashMap<>();
|
Map<Pos, CompoundTag> tags = new HashMap<>();
|
||||||
@ -184,9 +209,8 @@ public abstract class LegacyBlockItemRewriter<C extends ClientboundPacketType, S
|
|||||||
if (section == null) continue;
|
if (section == null) continue;
|
||||||
|
|
||||||
int block = section.palette(PaletteType.BLOCKS).idAt(pos.getX(), pos.getY() & 0xF, pos.getZ());
|
int block = section.palette(PaletteType.BLOCKS).idAt(pos.getX(), pos.getY() & 0xF, pos.getZ());
|
||||||
int btype = block >> 4;
|
|
||||||
|
|
||||||
MappedLegacyBlockItem settings = replacementData.get(btype);
|
MappedLegacyBlockItem settings = getMappedBlockItem(block);
|
||||||
if (settings != null && settings.hasBlockEntityHandler()) {
|
if (settings != null && settings.hasBlockEntityHandler()) {
|
||||||
settings.getBlockEntityHandler().handleOrNewCompoundTag(block, tag);
|
settings.getBlockEntityHandler().handleOrNewCompoundTag(block, tag);
|
||||||
}
|
}
|
||||||
@ -215,7 +239,7 @@ public abstract class LegacyBlockItemRewriter<C extends ClientboundPacketType, S
|
|||||||
// We already know that is has a handler
|
// We already know that is has a handler
|
||||||
if (hasBlockEntityHandler) continue;
|
if (hasBlockEntityHandler) continue;
|
||||||
|
|
||||||
MappedLegacyBlockItem settings = replacementData.get(btype);
|
MappedLegacyBlockItem settings = getMappedBlockItem(block);
|
||||||
if (settings != null && settings.hasBlockEntityHandler()) {
|
if (settings != null && settings.hasBlockEntityHandler()) {
|
||||||
hasBlockEntityHandler = true;
|
hasBlockEntityHandler = true;
|
||||||
}
|
}
|
||||||
@ -228,10 +252,8 @@ public abstract class LegacyBlockItemRewriter<C extends ClientboundPacketType, S
|
|||||||
for (int y = 0; y < 16; y++) {
|
for (int y = 0; y < 16; y++) {
|
||||||
for (int z = 0; z < 16; z++) {
|
for (int z = 0; z < 16; z++) {
|
||||||
int block = palette.idAt(x, y, z);
|
int block = palette.idAt(x, y, z);
|
||||||
int btype = block >> 4;
|
|
||||||
int meta = block & 15;
|
|
||||||
|
|
||||||
MappedLegacyBlockItem settings = replacementData.get(btype);
|
MappedLegacyBlockItem settings = getMappedBlockItem(block);
|
||||||
if (settings == null || !settings.hasBlockEntityHandler()) continue;
|
if (settings == null || !settings.hasBlockEntityHandler()) continue;
|
||||||
|
|
||||||
Pos pos = new Pos(x, (y + (i << 4)), z);
|
Pos pos = new Pos(x, (y + (i << 4)), z);
|
||||||
|
@ -306,7 +306,7 @@ public class BlockItemPackets1_11 extends LegacyBlockItemRewriter<ClientboundPac
|
|||||||
@Override
|
@Override
|
||||||
protected void registerRewrites() {
|
protected void registerRewrites() {
|
||||||
// Handle spawner block entity (map to itself with custom handler)
|
// Handle spawner block entity (map to itself with custom handler)
|
||||||
MappedLegacyBlockItem data = replacementData.computeIfAbsent(52, s -> new MappedLegacyBlockItem(52, (short) -1, null, false));
|
MappedLegacyBlockItem data = replacementData.computeIfAbsent(52 << 4, s -> new MappedLegacyBlockItem(52, (short) -1, null, false));
|
||||||
data.setBlockEntityHandler((b, tag) -> {
|
data.setBlockEntityHandler((b, tag) -> {
|
||||||
EntityIdRewriter.toClientSpawner(tag, true);
|
EntityIdRewriter.toClientSpawner(tag, true);
|
||||||
return tag;
|
return tag;
|
||||||
|
Loading…
Reference in New Issue
Block a user