Compare commits

..
11 Commits
12 changed files with 160 additions and 29 deletions

No files matched your search

@@ -24,12 +24,11 @@ import org.bukkit.advancement.Advancement;
public final class BukkitAdvancementCriteriaProvider extends AdvancementCriteriaProvider {
private static final String[] EMPTY_CRITERIA = new String[0];
@Override
public String[] getCriteria(final String key) {
final Advancement advancement = Bukkit.getAdvancement(NamespacedKey.fromString(key));
if (advancement == null) {
return null;
}
return advancement.getCriteria().toArray(new String[0]);
return advancement == null ? EMPTY_CRITERIA : advancement.getCriteria().toArray(EMPTY_CRITERIA);
}
}
@@ -68,7 +68,7 @@ import java.util.logging.Logger;
public interface ViaBackwardsPlatform {
String MINIMUM_VV_VERSION = "4.10.1";
String MINIMUM_VV_VERSION = "4.10.2";
/**
* Initialize ViaBackwards.
@@ -105,7 +105,7 @@ public abstract class LegacyBlockItemRewriter<C extends ClientboundPacketType, S
unmappedId = Integer.parseInt(key.substring(0, dataSeparatorIndex));
unmappedId = IdAndData.toRawData(unmappedId, unmappedData);
} else {
unmappedId = IdAndData.toRawData(Integer.parseInt(key));
unmappedId = IdAndData.toRawData(Integer.parseInt(key), -1);
}
mappings.put(unmappedId, new MappedLegacyBlockItem(id, data, name, type));
@@ -120,12 +120,12 @@ public abstract class LegacyBlockItemRewriter<C extends ClientboundPacketType, S
// Special block color handling
if (name != null && name.contains("%color%")) {
for (int i = from; i <= to; i++) {
mappings.put(IdAndData.toRawData(i), new MappedLegacyBlockItem(id, data, name.replace("%color%", BlockColors.get(i - from)), type));
mappings.put(IdAndData.toRawData(i, -1), new MappedLegacyBlockItem(id, data, name.replace("%color%", BlockColors.get(i - from)), type));
}
} else {
MappedLegacyBlockItem mappedBlockItem = new MappedLegacyBlockItem(id, data, name, type);
for (int i = from; i <= to; i++) {
mappings.put(IdAndData.toRawData(i), mappedBlockItem);
mappings.put(IdAndData.toRawData(i, -1), mappedBlockItem);
}
}
}
@@ -361,17 +361,18 @@ public abstract class LegacyBlockItemRewriter<C extends ClientboundPacketType, S
private @Nullable MappedLegacyBlockItem getMappedBlock(int id, int data) {
MappedLegacyBlockItem mapping = blockReplacements.get(IdAndData.toRawData(id, data));
return mapping != null || data == 0 ? mapping : blockReplacements.get(IdAndData.toRawData(id));
return mapping != null ? mapping : blockReplacements.get(IdAndData.toRawData(id, -1));
}
private @Nullable MappedLegacyBlockItem getMappedItem(int id, int data) {
MappedLegacyBlockItem mapping = itemReplacements.get(IdAndData.toRawData(id, data));
return mapping != null || data == 0 ? mapping : itemReplacements.get(IdAndData.toRawData(id));
return mapping != null ? mapping : itemReplacements.get(IdAndData.toRawData(id, -1));
}
private @Nullable MappedLegacyBlockItem getMappedBlock(int rawId) {
MappedLegacyBlockItem mapping = blockReplacements.get(rawId);
return mapping != null ? mapping : blockReplacements.get(IdAndData.removeData(rawId));
int id = IdAndData.getId(rawId);
int data = IdAndData.getData(rawId);
return getMappedBlock(id, data);
}
protected JsonObject readMappingsFile(final String name) {
@@ -32,6 +32,8 @@ import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
import com.viaversion.viaversion.api.rewriter.RewriterBase;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.libs.gson.JsonElement;
import com.viaversion.viaversion.protocols.base.ClientboundLoginPackets;
import com.viaversion.viaversion.protocols.base.ServerboundLoginPackets;
import com.viaversion.viaversion.protocols.protocol1_12_1to1_12.ClientboundPackets1_12_1;
import com.viaversion.viaversion.protocols.protocol1_12_1to1_12.ServerboundPackets1_12_1;
import com.viaversion.viaversion.protocols.protocol1_13to1_12_2.ClientboundPackets1_13;
@@ -57,13 +59,13 @@ public class PlayerPacket1_13 extends RewriterBase<Protocol1_12_2To1_13> {
@Override
protected void registerPackets() {
// Login Plugin Request
protocol.registerClientbound(State.LOGIN, 0x04, -1, new PacketHandlers() {
protocol.registerClientbound(State.LOGIN, ClientboundLoginPackets.CUSTOM_QUERY.getId(), -1, new PacketHandlers() {
@Override
public void register() {
handler(packetWrapper -> {
packetWrapper.cancel();
// Plugin response
packetWrapper.create(0x02, wrapper -> {
packetWrapper.create(ServerboundLoginPackets.CUSTOM_QUERY_ANSWER.getId(), wrapper -> {
wrapper.write(Type.VAR_INT, packetWrapper.read(Type.VAR_INT)); // Packet id
wrapper.write(Type.BOOLEAN, false); // Success
}).sendToServer(Protocol1_12_2To1_13.class);
@@ -36,6 +36,8 @@ import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
import com.viaversion.viaversion.libs.gson.JsonElement;
import com.viaversion.viaversion.libs.gson.JsonObject;
import com.viaversion.viaversion.protocols.base.ClientboundLoginPackets;
import com.viaversion.viaversion.protocols.base.ClientboundStatusPackets;
import com.viaversion.viaversion.protocols.protocol1_14to1_13_2.ServerboundPackets1_14;
import com.viaversion.viaversion.protocols.protocol1_15to1_14_4.ClientboundPackets1_15;
import com.viaversion.viaversion.protocols.protocol1_16to1_15_2.ClientboundPackets1_16;
@@ -70,7 +72,7 @@ public class Protocol1_15_2To1_16 extends BackwardsProtocol<ClientboundPackets1_
new CommandRewriter1_16(this).registerDeclareCommands(ClientboundPackets1_16.DECLARE_COMMANDS);
registerClientbound(State.STATUS, 0x00, 0x00, wrapper -> {
registerClientbound(State.STATUS, ClientboundStatusPackets.STATUS_RESPONSE.getId(), ClientboundStatusPackets.STATUS_RESPONSE.getId(), wrapper -> {
String original = wrapper.passthrough(Type.STRING);
JsonObject object = GsonUtil.getGson().fromJson(original, JsonObject.class);
JsonElement description = object.get("description");
@@ -113,7 +115,7 @@ public class Protocol1_15_2To1_16 extends BackwardsProtocol<ClientboundPackets1_
soundRewriter.registerStopSound(ClientboundPackets1_16.STOP_SOUND);
// Login success
registerClientbound(State.LOGIN, 0x02, 0x02, wrapper -> {
registerClientbound(State.LOGIN, ClientboundLoginPackets.GAME_PROFILE.getId(), ClientboundLoginPackets.GAME_PROFILE.getId(), wrapper -> {
// Transform uuid to plain string
UUID uuid = wrapper.read(Type.UUID);
wrapper.write(Type.STRING, uuid.toString());
@@ -339,6 +339,10 @@ public final class BlockItemPackets1_17 extends BackwardsItemRewriter<Clientboun
CompoundTag heightMaps = chunk.getHeightMap();
for (Tag heightMapTag : heightMaps.values()) {
if (!(heightMapTag instanceof LongArrayTag)) {
continue; // Client can handle bad data
}
LongArrayTag heightMap = (LongArrayTag) heightMapTag;
int[] heightMapData = new int[256];
int bitsPerEntry = MathUtil.ceilLog2((currentWorldSectionHeight << 4) + 1);
@@ -54,6 +54,7 @@ import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet.Clientb
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet.ServerboundConfigurationPackets1_20_5;
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet.ServerboundPacket1_20_5;
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet.ServerboundPackets1_20_5;
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.storage.BannerPatternStorage;
import com.viaversion.viaversion.rewriter.ComponentRewriter.ReadType;
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
import com.viaversion.viaversion.rewriter.TagRewriter;
@@ -218,6 +219,7 @@ public final class Protocol1_20_3To1_20_5 extends BackwardsProtocol<ClientboundP
user.put(new SecureChatStorage());
user.put(new CookieStorage());
user.put(new RegistryDataStorage());
user.put(new BannerPatternStorage());
}
@Override
@@ -28,11 +28,15 @@ import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2;
import com.viaversion.viaversion.api.type.types.version.Types1_20_3;
import com.viaversion.viaversion.api.type.types.version.Types1_20_5;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.IntArrayTag;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.ListTag;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.StringTag;
import com.viaversion.viaversion.libs.opennbt.tag.builtin.Tag;
import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ServerboundPacket1_20_3;
import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ServerboundPackets1_20_3;
import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.rewriter.RecipeRewriter1_20_3;
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.Protocol1_20_5To1_20_3;
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.data.BannerPatterns1_20_5;
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet.ClientboundPacket1_20_5;
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet.ClientboundPackets1_20_5;
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.rewriter.StructuredDataConverter;
@@ -57,8 +61,13 @@ public final class BlockItemPacketRewriter1_20_5 extends BackwardsStructuredItem
blockRewriter.registerBlockChange(ClientboundPackets1_20_5.BLOCK_CHANGE);
blockRewriter.registerVarLongMultiBlockChange1_20(ClientboundPackets1_20_5.MULTI_BLOCK_CHANGE);
blockRewriter.registerEffect(ClientboundPackets1_20_5.EFFECT, 1010, 2001);
blockRewriter.registerChunkData1_19(ClientboundPackets1_20_5.CHUNK_DATA, ChunkType1_20_2::new);
blockRewriter.registerBlockEntityData(ClientboundPackets1_20_5.BLOCK_ENTITY_DATA);
blockRewriter.registerChunkData1_19(ClientboundPackets1_20_5.CHUNK_DATA, ChunkType1_20_2::new, (user, blockEntity) -> updateBlockEntityTag(user, blockEntity.tag()));
protocol.registerClientbound(ClientboundPackets1_20_5.BLOCK_ENTITY_DATA, wrapper -> {
wrapper.passthrough(Type.POSITION1_14); // Position
wrapper.passthrough(Type.VAR_INT); // Block entity type
final CompoundTag tag = wrapper.passthrough(Type.COMPOUND_TAG);
updateBlockEntityTag(wrapper.user(), tag);
});
registerSetCooldown(ClientboundPackets1_20_5.COOLDOWN);
registerWindowItems1_17_1(ClientboundPackets1_20_5.WINDOW_ITEMS);
@@ -178,6 +187,76 @@ public final class BlockItemPacketRewriter1_20_5 extends BackwardsStructuredItem
});
}
private void updateBlockEntityTag(final UserConnection connection, final CompoundTag tag) {
if (tag == null) {
return;
}
final Tag profileTag = tag.remove("profile");
if (profileTag instanceof StringTag) {
tag.put("SkullOwner", profileTag);
} else if (profileTag instanceof CompoundTag) {
updateProfileTag(tag, (CompoundTag) profileTag);
}
final ListTag<CompoundTag> patternsTag = tag.getListTag("patterns", CompoundTag.class);
if (patternsTag != null) {
for (final CompoundTag patternTag : patternsTag) {
final String pattern = patternTag.getString("pattern", "");
final String color = patternTag.getString("color");
final String compactIdentifier = BannerPatterns1_20_5.fullIdToCompact(Key.stripMinecraftNamespace(pattern));
if (compactIdentifier == null || color == null) {
continue;
}
patternTag.remove("pattern");
patternTag.remove("color");
patternTag.putString("Pattern", compactIdentifier);
patternTag.putInt("Color", colorId(color));
}
tag.remove("patterns");
tag.put("Patterns", patternsTag);
}
}
private void updateProfileTag(final CompoundTag tag, final CompoundTag profileTag) {
final CompoundTag skullOwnerTag = new CompoundTag();
tag.put("SkullOwner", skullOwnerTag);
final String name = profileTag.getString("name");
if (name != null) {
skullOwnerTag.putString("Name", name);
}
final IntArrayTag idTag = profileTag.getIntArrayTag("id");
if (idTag != null) {
skullOwnerTag.put("Id", idTag);
}
final ListTag<CompoundTag> propertiesListTag = profileTag.getListTag("properties", CompoundTag.class);
if (propertiesListTag == null) {
return;
}
final CompoundTag propertiesTag = new CompoundTag();
for (final CompoundTag propertyTag : propertiesListTag) {
final String property = propertyTag.getString("name", "");
final String value = propertyTag.getString("value", "");
final String signature = propertyTag.getString("signature");
final ListTag<CompoundTag> list = new ListTag<>(CompoundTag.class);
final CompoundTag updatedPropertyTag = new CompoundTag();
updatedPropertyTag.putString("Value", value);
if (signature != null) {
updatedPropertyTag.putString("Signature", signature);
}
list.add(updatedPropertyTag);
propertiesTag.put(property, list);
}
skullOwnerTag.put("Properties", propertiesTag);
}
private void cleanInput(@Nullable final Item item) {
// Try to maybe hopefully get the tag matching to what the client will try to input by removing default data
if (item == null || item.tag() == null) {
@@ -185,7 +264,7 @@ public final class BlockItemPacketRewriter1_20_5 extends BackwardsStructuredItem
}
final CompoundTag tag = item.tag();
tag.remove("VV|DataComponents");
StructuredDataConverter.removeBackupTag(tag);
final CompoundTag display = tag.getCompoundTag("display");
if (display != null) {
@@ -214,12 +293,49 @@ public final class BlockItemPacketRewriter1_20_5 extends BackwardsStructuredItem
}
}
private static int colorId(final String color) {
switch (color) {
case "orange":
return 1;
case "magenta":
return 2;
case "light_blue":
return 3;
case "yellow":
return 4;
case "lime":
return 5;
case "pink":
return 6;
case "gray":
return 7;
case "light_gray":
return 8;
case "cyan":
return 9;
case "purple":
return 10;
case "blue":
return 11;
case "brown":
return 12;
case "green":
return 13;
case "red":
return 14;
case "black":
return 15;
default:
return 0;
}
}
@Override
public @Nullable Item handleItemToClient(final UserConnection connection, @Nullable final Item item) {
if (item == null) return null;
super.handleItemToClient(connection, item);
return vvProtocol.getItemRewriter().toOldItem(item, DATA_CONVERTER);
return vvProtocol.getItemRewriter().toOldItem(connection, item, DATA_CONVERTER);
}
@Override
@@ -47,6 +47,7 @@ import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet.Clientb
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet.ClientboundPackets1_20_5;
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.storage.BannerPatternStorage;
import com.viaversion.viaversion.util.Key;
import com.viaversion.viaversion.util.KeyMappings;
import com.viaversion.viaversion.util.MathUtil;
import java.util.HashMap;
import java.util.Map;
@@ -93,13 +94,13 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter<Clientbound
final RegistryDataStorage registryDataStorage = wrapper.user().get(RegistryDataStorage.class);
final RegistryEntry[] entries = wrapper.read(Type.REGISTRY_ENTRY_ARRAY);
// Track banner pattern and material ids for conversion in items
if (registryKey.equals("banner_pattern")) {
final BannerPatternStorage bannerStorage = new BannerPatternStorage();
wrapper.user().put(bannerStorage);
// Track banner pattern and material ids for conversion in items
final String[] keys = new String[entries.length];
for (int i = 0; i < entries.length; i++) {
bannerStorage.bannerPatterns().put(i, entries[i].key());
keys[i] = Key.stripMinecraftNamespace(entries[i].key());
}
wrapper.user().get(BannerPatternStorage.class).setBannerPatterns(new KeyMappings(keys));
return;
}
@@ -317,6 +318,10 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter<Clientbound
return (int) Math.floor(part * 255);
}
private int removeAlpha(final int argb) {
return argb & 0x00FFFFFF;
}
private void moveTag(final CompoundTag compoundTag, final String from, final String to) {
final Tag tag = compoundTag.remove(from);
if (tag != null) {
@@ -374,7 +379,7 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter<Clientbound
color = particle.<Integer>removeArgument(0).getValue();
}
}
meta.setTypeAndValue(Types1_20_3.META_TYPES.varIntType, color);
meta.setTypeAndValue(Types1_20_3.META_TYPES.varIntType, removeAlpha(color));
});
filter().type(EntityTypes1_20_5.AREA_EFFECT_CLOUD).addIndex(9); // Color
@@ -383,7 +388,7 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter<Clientbound
if (particle.id() == protocol.getMappingData().getParticleMappings().mappedId("entity_effect")) {
// Move color to its own metadata
final int color = particle.<Integer>removeArgument(0).getValue();
event.createExtraMeta(new Metadata(9, Types1_20_3.META_TYPES.varIntType, color));
event.createExtraMeta(new Metadata(9, Types1_20_3.META_TYPES.varIntType, removeAlpha(color)));
}
});
@@ -22,7 +22,7 @@
},
"215": {
"id": 112,
"name": "1.10 Red Nether Bricks"
"name": "1.10 Red Nether Brick"
},
"216": {
"id": 155,
+1 -1
View File
@@ -1,4 +1,4 @@
projectVersion=4.10.1
projectVersion=4.10.2
# Smile emoji
mcVersions=1.20.6,1.20.5,1.20.4, 1.20.3, 1.20.2, 1.20.1, 1.20, 1.19.4, 1.19.3, 1.19.2, 1.19.1, 1.19, 1.18.2, 1.18.1, 1.18, 1.17.1, 1.17, 1.16.5, 1.16.4, 1.16.3, 1.16.2, 1.16.1, 1.16, 1.15.2, 1.15.1, 1.15, 1.14.4, 1.14.3, 1.14.2, 1.14.1, 1.14, 1.13.2, 1.13.1, 1.13, 1.12.2, 1.12.1, 1.12, 1.11.2, 1.11.1, 1.11, 1.10.2, 1.10.1, 1.10
+1 -1
View File
@@ -3,7 +3,7 @@ metadata.format.version = "1.1"
[versions]
# ViaVersion
viaver = "4.10.1-SNAPSHOT"
viaver = "4.10.2-SNAPSHOT"
# Common provided
netty = "4.0.20.Final"