mirror of
https://github.com/ViaVersion/ViaBackwards.git
synced 2026-11-12 20:22:06 -05:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
17bda0fc29 | ||
|
|
1a22b371cd | ||
|
|
6292c5a5a5 | ||
|
|
6b616d8b07 | ||
|
|
fd43ca56d7 | ||
|
|
91193cf602 | ||
|
|
1680f9985d | ||
|
|
e8602adf5b | ||
|
|
7f0982e59c | ||
|
|
072b59060c | ||
|
|
633b4b393b |
No files matched your search
+3
-4
@@ -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.
|
||||
|
||||
+8
-7
@@ -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) {
|
||||
|
||||
+4
-2
@@ -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);
|
||||
|
||||
+4
-2
@@ -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());
|
||||
|
||||
+4
@@ -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);
|
||||
|
||||
+2
@@ -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
|
||||
|
||||
+120
-4
@@ -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
|
||||
|
||||
+11
-6
@@ -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
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in new issue
Block a user