Compare commits

...
13 Commits
19 changed files with 176 additions and 55 deletions

No files matched your search

@@ -6,13 +6,13 @@ jobs:
build:
if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Validate Gradle Wrapper
uses: gradle/wrapper-validation-action@v2
uses: gradle/actions/wrapper-validation@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
+2 -2
View File
@@ -8,12 +8,12 @@ on:
jobs:
publish:
if: github.repository_owner == 'ViaVersion'
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Validate Gradle Wrapper
uses: gradle/wrapper-validation-action@v2
uses: gradle/actions/wrapper-validation@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
+1 -1
View File
@@ -4,7 +4,7 @@
[![Build Status](https://github.com/ViaVersion/ViaBackwards/actions/workflows/gradle.yml/badge.svg?branch=master)](https://github.com/ViaVersion/ViaBackwards/actions)
[![Discord](https://img.shields.io/badge/chat-on%20discord-blue.svg)](https://viaversion.com/discord)
**Allows older Minecraft client versions to connect to newer server versions.**
**Allows the connection of older clients to newer server versions for Minecraft servers.**
Requires [ViaVersion](https://hangar.papermc.io/ViaVersion/ViaVersion) to be installed..
+1 -1
View File
@@ -6,7 +6,7 @@ plugins {
allprojects {
group = "com.viaversion"
version = property("projectVersion") as String // from gradle.properties
description = "Allows older Minecraft client versions to connect to newer server versions."
description = "Allows the connection of older clients to newer server versions for Minecraft servers."
}
val main = setOf(
@@ -69,7 +69,7 @@ import java.util.logging.Logger;
public interface ViaBackwardsPlatform {
String MINIMUM_VV_VERSION = "5.0.2";
String MINIMUM_VV_VERSION = "5.0.3";
/**
* Initialize ViaBackwards.
@@ -78,11 +78,10 @@ public class StructuredEnchantmentRewriter {
public void rewriteEnchantmentsToClient(final StructuredDataContainer data, final StructuredDataKey<Enchantments> key, final IdRewriteFunction rewriteFunction, final DescriptionSupplier descriptionSupplier, final boolean storedEnchant) {
final StructuredData<Enchantments> enchantmentsData = data.getNonEmpty(key);
if (enchantmentsData == null) {
if (enchantmentsData == null || enchantmentsData.value().size() == 0) {
return;
}
final CompoundTag tag = data.computeIfAbsent(StructuredDataKey.CUSTOM_DATA, $ -> new CompoundTag()).value();
final Enchantments enchantments = enchantmentsData.value();
final List<Tag> loreToAdd = new ArrayList<>();
boolean changed = false;
@@ -106,7 +105,8 @@ public class StructuredEnchantmentRewriter {
if (description != null) {
if (!changed) {
// Backup original before doing modifications
itemRewriter.saveListTag(tag, asTag(enchantments), key.identifier());
final CompoundTag customData = data.computeIfAbsent(StructuredDataKey.CUSTOM_DATA, $ -> new CompoundTag()).value();
itemRewriter.saveListTag(customData, asTag(enchantments), key.identifier());
changed = true;
}
@@ -129,6 +129,7 @@ public class StructuredEnchantmentRewriter {
}
// Add glint override if there are no enchantments left
final CompoundTag tag = data.computeIfAbsent(StructuredDataKey.CUSTOM_DATA, $ -> new CompoundTag()).value();
if (!storedEnchant && enchantments.size() == 0) {
final StructuredData<Boolean> glintOverride = data.getNonEmpty(StructuredDataKey.ENCHANTMENT_GLINT_OVERRIDE);
if (glintOverride != null) {
@@ -18,6 +18,7 @@
package com.viaversion.viabackwards.protocol.v1_12to1_11_1.rewriter;
import com.viaversion.nbt.tag.StringTag;
import com.viaversion.viabackwards.api.rewriters.LegacyBlockItemRewriter;
import com.viaversion.viabackwards.protocol.v1_12to1_11_1.Protocol1_12To1_11_1;
import com.viaversion.viabackwards.protocol.v1_12to1_11_1.data.MapColorMappings1_11_1;
@@ -38,6 +39,9 @@ import com.viaversion.viaversion.protocols.v1_11_1to1_12.packet.ServerboundPacke
import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ServerboundPackets1_9_3;
import java.util.Iterator;
import java.util.Map;
import com.viaversion.viaversion.util.ComponentUtil;
import com.viaversion.viaversion.util.Key;
import com.viaversion.viaversion.util.SerializerVersion;
import org.checkerframework.checker.nullness.qual.Nullable;
public class BlockItemPacketRewriter1_12 extends LegacyBlockItemRewriter<ClientboundPackets1_12, ServerboundPackets1_9_3, Protocol1_12To1_11_1> {
@@ -133,6 +137,15 @@ public class BlockItemPacketRewriter1_12 extends LegacyBlockItemRewriter<Clientb
Chunk chunk = wrapper.passthrough(type);
handleChunk(chunk);
for (final CompoundTag tag : chunk.getBlockEntities()) {
final String id = tag.getString("id");
if (id == null) {
continue;
}
if (Key.stripMinecraftNamespace(id).equals("sign")) {
handleSignText(tag);
}
}
});
protocol.registerClientbound(ClientboundPackets1_12.BLOCK_ENTITY_DATA, new PacketHandlers() {
@@ -143,9 +156,14 @@ public class BlockItemPacketRewriter1_12 extends LegacyBlockItemRewriter<Clientb
map(Types.NAMED_COMPOUND_TAG); // 2 - NBT
handler(wrapper -> {
// Remove bed color
if (wrapper.get(Types.UNSIGNED_BYTE, 0) == 11)
final short type = wrapper.get(Types.UNSIGNED_BYTE, 0);
if (type == 9) {
final CompoundTag tag = wrapper.get(Types.NAMED_COMPOUND_TAG, 0);
handleSignText(tag);
} else if (type == 11) {
// Remove bed color
wrapper.cancel();
}
});
}
});
@@ -170,6 +188,18 @@ public class BlockItemPacketRewriter1_12 extends LegacyBlockItemRewriter<Clientb
});
}
private void handleSignText(final CompoundTag tag) {
// Push signs through component conversion, fixes https://github.com/ViaVersion/ViaBackwards/issues/835
for (int i = 0; i < 4; i++) {
final StringTag lineTag = tag.getStringTag("Text" + (i + 1));
if (lineTag == null) {
continue;
}
lineTag.setValue(ComponentUtil.convertJsonOrEmpty(lineTag.getValue(), SerializerVersion.V1_12, SerializerVersion.V1_9).toString());
}
}
@Override
public @Nullable Item handleItemToClient(UserConnection connection, Item item) {
if (item == null) return null;
@@ -153,6 +153,27 @@ public class EntityPacketRewriter1_14 extends LegacyEntityRewriter<ClientboundPa
};
if (data != 0)
wrapper.set(Types.INT, 0, data);
} else if (entityType.is(EntityTypes1_13.EntityType.EXPERIENCE_ORB)) {
// Newer clients can spawn experience orbs via add entity, map to add experience orb and override values via multiple packets
wrapper.cancel();
final int entityId = wrapper.get(Types.VAR_INT, 0);
// Shrug about uuid or rotations
final PacketWrapper addExperienceOrb = PacketWrapper.create(ClientboundPackets1_13.ADD_EXPERIENCE_ORB, wrapper.user());
addExperienceOrb.write(Types.VAR_INT, entityId); // Entity id
addExperienceOrb.write(Types.DOUBLE, wrapper.get(Types.DOUBLE, 0)); // X
addExperienceOrb.write(Types.DOUBLE, wrapper.get(Types.DOUBLE, 1)); // Y
addExperienceOrb.write(Types.DOUBLE, wrapper.get(Types.DOUBLE, 2)); // Z
addExperienceOrb.write(Types.SHORT, (short) 0); // Experience count
addExperienceOrb.send(Protocol1_14To1_13_2.class);
final PacketWrapper setEntityMotion = PacketWrapper.create(ClientboundPackets1_13.SET_ENTITY_MOTION, wrapper.user());
setEntityMotion.write(Types.VAR_INT, entityId); // Entity id
setEntityMotion.write(Types.SHORT, wrapper.get(Types.SHORT, 0));
setEntityMotion.write(Types.SHORT, wrapper.get(Types.SHORT, 1));
setEntityMotion.write(Types.SHORT, wrapper.get(Types.SHORT, 2));
setEntityMotion.send(Protocol1_14To1_13_2.class);
return;
} else {
for (final EntityTypes1_13.ObjectType type : EntityTypes1_13.ObjectType.values()) {
if (type.getType() == entityType) {
@@ -22,6 +22,7 @@ import com.viaversion.viabackwards.api.rewriters.EntityRewriter;
import com.viaversion.viabackwards.protocol.v1_17to1_16_4.Protocol1_17To1_16_4;
import com.viaversion.viaversion.api.minecraft.Particle;
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_16_2;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_17;
import com.viaversion.viaversion.api.minecraft.entitydata.EntityDataType;
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
@@ -50,6 +51,29 @@ public final class EntityPacketRewriter1_17 extends EntityRewriter<ClientboundPa
registerTracker(ClientboundPackets1_17.ADD_PLAYER, EntityTypes1_17.PLAYER);
registerSetEntityData(ClientboundPackets1_17.SET_ENTITY_DATA, Types1_17.ENTITY_DATA_LIST, Types1_16.ENTITY_DATA_LIST);
protocol.appendClientbound(ClientboundPackets1_17.ADD_ENTITY, wrapper -> {
final int entityType = wrapper.get(Types.VAR_INT, 1);
if (entityType != EntityTypes1_16_2.ITEM_FRAME.getId()) {
return;
}
// Older clients will ignore the data field and the server sets the item frame rotation by the yaw/pitch field inside the packet,
// newer clients do the opposite and ignore yaw/pitch and use the data field from the packet.
final int data = wrapper.get(Types.INT, 0);
float pitch = 0F;
float yaw = 0F;
switch (Math.abs(data % 6)) {
case 0 /* down */ -> pitch = 90F;
case 1 /* up */ -> pitch = -90F;
case 2 /* north */ -> yaw = 180F;
case 4 /* west */ -> yaw = 90F;
case 5 /* east */ -> yaw = 270;
}
wrapper.set(Types.BYTE, 0, (byte) (pitch * 256F / 360F));
wrapper.set(Types.BYTE, 1, (byte) (yaw * 256F / 360F));
});
protocol.registerClientbound(ClientboundPackets1_17.REMOVE_ENTITY, ClientboundPackets1_16_2.REMOVE_ENTITIES, wrapper -> {
int entityId = wrapper.read(Types.VAR_INT);
tracker(wrapper.user()).removeEntity(entityId);
@@ -54,6 +54,7 @@ import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ClientboundPac
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ServerboundConfigurationPackets1_20_5;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ServerboundPacket1_20_5;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ServerboundPackets1_20_5;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.storage.ArmorTrimStorage;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.storage.BannerPatternStorage;
import com.viaversion.viaversion.protocols.v1_20to1_20_2.packet.ServerboundConfigurationPackets1_20_2;
import com.viaversion.viaversion.rewriter.ComponentRewriter.ReadType;
@@ -233,6 +234,7 @@ public final class Protocol1_20_5To1_20_3 extends BackwardsProtocol<ClientboundP
user.put(new CookieStorage());
user.put(new RegistryDataStorage());
user.put(new BannerPatternStorage());
user.put(new ArmorTrimStorage());
}
@Override
@@ -274,4 +276,4 @@ public final class Protocol1_20_5To1_20_3 extends BackwardsProtocol<ClientboundP
packetTypeMap(unmappedServerboundPacketType, ServerboundPackets1_20_3.class, ServerboundConfigurationPackets1_20_2.class)
);
}
}
}
@@ -48,6 +48,7 @@ import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.data.Attributes1_20_5
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ClientboundConfigurationPackets1_20_5;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ClientboundPacket1_20_5;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ClientboundPackets1_20_5;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.storage.ArmorTrimStorage;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.storage.BannerPatternStorage;
import com.viaversion.viaversion.util.Key;
import com.viaversion.viaversion.util.KeyMappings;
@@ -78,9 +79,7 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter<Clientbound
final Item item = protocol.getItemRewriter().handleItemToClient(wrapper.user(), wrapper.read(Types1_20_5.ITEM));
if (slot == 6) {
if (type != null && type.isOrHasParent(EntityTypes1_20_5.ABSTRACT_HORSE)) {
slot = 4; // Map body slot index to chest slot index for horses
}
slot = 4; // Map body slot index to chest slot index for horses, also wolves
if (type != null && type.isOrHasParent(EntityTypes1_20_5.LLAMA)) {
// Cancel equipment and set correct entity data instead
wrapper.cancel();
@@ -112,16 +111,21 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter<Clientbound
final RegistryDataStorage registryDataStorage = wrapper.user().get(RegistryDataStorage.class);
final RegistryEntry[] entries = wrapper.read(Types.REGISTRY_ENTRY_ARRAY);
// Track trim patterns and armor trims for conversion in items
if (registryKey.equals("banner_pattern")) {
// 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++) {
keys[i] = Key.stripMinecraftNamespace(entries[i].key());
}
wrapper.user().get(BannerPatternStorage.class).setBannerPatterns(new KeyMappings(keys));
// Don't send it
wrapper.user().get(BannerPatternStorage.class).setBannerPatterns(toMappings(entries));
return;
}
final boolean isTrimPattern = registryKey.equals("trim_pattern");
if (isTrimPattern) {
wrapper.user().get(ArmorTrimStorage.class).setTrimPatterns(toMappings(entries));
} else if (registryKey.equals("trim_material")) {
wrapper.user().get(ArmorTrimStorage.class).setTrimMaterials(toMappings(entries));
}
// Track biome and dimension data
if (registryKey.equals("worldgen/biome")) {
tracker(wrapper.user()).setBiomesSent(entries.length);
@@ -158,7 +162,6 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter<Clientbound
}
// Write to old format
final boolean isTrimPattern = registryKey.equals("trim_pattern");
final CompoundTag registryTag = new CompoundTag();
final ListTag<CompoundTag> entriesTag = new ListTag<>(CompoundTag.class);
registryTag.putString("type", registryKey);
@@ -293,6 +296,14 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter<Clientbound
});
}
private KeyMappings toMappings(final RegistryEntry[] entries) {
final String[] keys = new String[entries.length];
for (int i = 0; i < entries.length; i++) {
keys[i] = Key.stripMinecraftNamespace(entries[i].key());
}
return new KeyMappings(keys);
}
private void updateParticleFormat(final CompoundTag options, final String particleType) {
if ("block".equals(particleType) || "block_marker".equals(particleType) || "falling_dust".equals(particleType) || "dust_pillar".equals(particleType)) {
Tag blockState = options.remove("block_state");
@@ -25,6 +25,7 @@ import com.viaversion.viabackwards.protocol.v1_21to1_20_5.rewriter.BlockItemPack
import com.viaversion.viabackwards.protocol.v1_21to1_20_5.rewriter.ComponentRewriter1_21;
import com.viaversion.viabackwards.protocol.v1_21to1_20_5.rewriter.EntityPacketRewriter1_21;
import com.viaversion.viabackwards.protocol.v1_21to1_20_5.storage.EnchantmentsPaintingsStorage;
import com.viaversion.viabackwards.protocol.v1_21to1_20_5.storage.OpenScreenStorage;
import com.viaversion.viabackwards.protocol.v1_21to1_20_5.storage.PlayerRotationStorage;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.Holder;
@@ -76,7 +77,6 @@ public final class Protocol1_21To1_20_5 extends BackwardsProtocol<ClientboundPac
new StatisticsRewriter<>(this).register(ClientboundPackets1_21.AWARD_STATS);
translatableRewriter.registerOpenScreen(ClientboundPackets1_21.OPEN_SCREEN);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21.SET_ACTION_BAR_TEXT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21.SET_TITLE_TEXT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21.SET_SUBTITLE_TEXT);
@@ -187,6 +187,7 @@ public final class Protocol1_21To1_20_5 extends BackwardsProtocol<ClientboundPac
public void init(final UserConnection user) {
addEntityTracker(user, new EntityTrackerBase(user, EntityTypes1_20_5.PLAYER));
user.put(new EnchantmentsPaintingsStorage());
user.put(new OpenScreenStorage());
user.put(new PlayerRotationStorage());
}
@@ -224,4 +225,4 @@ public final class Protocol1_21To1_20_5 extends BackwardsProtocol<ClientboundPac
packetTypeMap(unmappedServerboundPacketType, ServerboundPackets1_20_5.class, ServerboundConfigurationPackets1_20_5.class)
);
}
}
}
@@ -18,8 +18,6 @@
package com.viaversion.viabackwards.protocol.v1_21to1_20_5.rewriter;
import com.viaversion.nbt.tag.ByteTag;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.nbt.tag.ListTag;
import com.viaversion.nbt.tag.StringTag;
import com.viaversion.nbt.tag.Tag;
import com.viaversion.viabackwards.api.rewriters.BackwardsStructuredItemRewriter;
@@ -27,6 +25,7 @@ import com.viaversion.viabackwards.api.rewriters.EnchantmentRewriter;
import com.viaversion.viabackwards.api.rewriters.StructuredEnchantmentRewriter;
import com.viaversion.viabackwards.protocol.v1_21to1_20_5.Protocol1_21To1_20_5;
import com.viaversion.viabackwards.protocol.v1_21to1_20_5.storage.EnchantmentsPaintingsStorage;
import com.viaversion.viabackwards.protocol.v1_21to1_20_5.storage.OpenScreenStorage;
import com.viaversion.viabackwards.protocol.v1_21to1_20_5.storage.PlayerRotationStorage;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.data.StructuredData;
@@ -85,10 +84,25 @@ public final class BlockItemPacketRewriter1_21 extends BackwardsStructuredItemRe
registerLevelParticles1_20_5(ClientboundPackets1_21.LEVEL_PARTICLES, Types1_21.PARTICLE, Types1_20_5.PARTICLE);
registerExplosion(ClientboundPackets1_21.EXPLODE, Types1_21.PARTICLE, Types1_20_5.PARTICLE);
protocol.registerClientbound(ClientboundPackets1_21.OPEN_SCREEN, wrapper -> {
wrapper.passthrough(Types.VAR_INT); // Id
// Tracking the type actually matters now with crafters also using container data above index 3
final int menuType = wrapper.passthrough(Types.VAR_INT);
wrapper.user().get(OpenScreenStorage.class).setMenuType(menuType);
protocol.getComponentRewriter().passthroughAndProcess(wrapper);
});
protocol.registerClientbound(ClientboundPackets1_21.CONTAINER_SET_DATA, wrapper -> {
wrapper.passthrough(Types.UNSIGNED_BYTE); // Container id
final short property = wrapper.passthrough(Types.SHORT);
if (property >= 4 && property <= 6) { // Enchantment hints
final OpenScreenStorage openScreenStorage = wrapper.user().get(OpenScreenStorage.class);
if (openScreenStorage.menuType() != 13) { // Enchantment table
return;
}
final short enchantmentId = wrapper.read(Types.SHORT);
final EnchantmentsPaintingsStorage storage = wrapper.user().get(EnchantmentsPaintingsStorage.class);
final String key = storage.enchantments().idToKey(enchantmentId);
@@ -52,28 +52,13 @@ public final class ComponentRewriter1_21 extends TranslatableRewriter<Clientboun
}
}
private void handleContainerComponent(final CompoundTag tag) {
final ListTag<CompoundTag> container = TagUtil.getNamespacedCompoundTagList(tag, "container");
if (container == null) {
return;
}
for (final CompoundTag entryTag : container) {
final CompoundTag itemTag = entryTag.getCompoundTag("item");
final CompoundTag componentsTag = itemTag.getCompoundTag("components");
if (componentsTag != null) {
convertAttributeModifiersComponent(componentsTag);
handleContainerComponent(componentsTag);
}
}
}
@Override
protected void handleShowItem(final UserConnection connection, final CompoundTag componentsTag) {
convertAttributeModifiersComponent(componentsTag);
handleContainerComponent(componentsTag);
TagUtil.removeNamespaced(componentsTag, "jukebox_playable");
protected void handleShowItem(final UserConnection connection, final CompoundTag itemTag, final CompoundTag componentsTag) {
super.handleShowItem(connection, itemTag, componentsTag);
if (componentsTag != null) {
TagUtil.removeNamespaced(componentsTag, "jukebox_playable");
convertAttributeModifiersComponent(componentsTag);
}
}
@Override
@@ -0,0 +1,33 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2024 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.viaversion.viabackwards.protocol.v1_21to1_20_5.storage;
import com.viaversion.viaversion.api.connection.StorableObject;
public final class OpenScreenStorage implements StorableObject {
private int menuType = -1;
public int menuType() {
return menuType;
}
public void setMenuType(final int menuType) {
this.menuType = menuType;
}
}
@@ -24,7 +24,6 @@ import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.ClientWorld;
import com.viaversion.viaversion.api.minecraft.BlockPosition;
import com.viaversion.viaversion.api.minecraft.chunks.Chunk;
import com.viaversion.viaversion.api.protocol.AbstractProtocol;
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_9_1;
@@ -60,9 +59,9 @@ public class Protocol1_9_3To1_9_1 extends BackwardsProtocol<ClientboundPackets1_
wrapper.setPacketType(ClientboundPackets1_9.UPDATE_SIGN);
wrapper.write(Types.BLOCK_POSITION1_8, position); // Position
for (int i = 1; i < 5; i++) {
for (int i = 0; i < 4; i++) {
// Should technically be written as COMPONENT, but left as String for simplification/to remove redundant wrapping for VR
StringTag textTag = tag.getStringTag("Text" + i);
StringTag textTag = tag.getStringTag("Text" + (i + 1));
String line = textTag != null ? textTag.getValue() : "";
wrapper.write(Types.STRING, line); // Sign line
}
@@ -122,4 +121,4 @@ public class Protocol1_9_3To1_9_1 extends BackwardsProtocol<ClientboundPackets1_
userConnection.put(new ClientWorld());
}
}
}
}
+1 -1
View File
@@ -1,4 +1,4 @@
projectVersion=5.0.2
projectVersion=5.0.3
# Smile emoji
mcVersions=1.21,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 = "5.0.2-SNAPSHOT"
viaver = "5.0.3-SNAPSHOT"
# Common provided
netty = "4.0.20.Final"
@@ -37,7 +37,7 @@ import java.util.logging.Logger;
name = "ViaBackwards",
version = VersionInfo.VERSION,
authors = {"Matsv", "kennytv", "Gerrygames", "creeper123123321", "ForceUpdate1", "EnZaXD"},
description = "Allows older Minecraft client versions to connect to newer server versions.",
description = "Allows the connection of older clients to newer server versions for Minecraft servers.",
dependencies = {@Dependency(id = "viaversion")}
)
public class VelocityPlugin implements ViaBackwardsPlatform {