Compare commits

..
55 Commits
Author SHA1 Message Date
Nassim Jahnke aecd74425d 5.3.2 Release 2025-04-13 15:45:38 +02:00
Nassim Jahnke 53584b01f7 Trim string tag in 1.20.5->1.20.3 show item hovers
Fixes ViaVersion/ViaVersion#4457
2025-04-12 15:46:25 +02:00
Nassim Jahnke 7f97ae80c3 Cancel more new entity data types directly
Be more lenient with plugins sending data for entities that don't exist...
2025-04-11 18:20:38 +02:00
bookyandFlorianMichael 4dd4b2f53b Fix advancement menu background keys (#984)
Co-authored-by: FlorianMichael <florian.michael07@gmail.com>
2025-04-09 16:20:02 +02:00
FlorianMichael 8a9cc8bd9b Use correct version in json to tag conversion in 1.21.5->.4 (#983) 2025-04-08 15:31:20 +02:00
FlorianMichael 9e3861fb21 Remap COPY_TO_CLIPBOARD click event to SUGGEST_COMMAND in 1.16->1.15.2 (#982) 2025-04-08 15:31:08 +02:00
青海 b74ac19d9d Fix attribute_modifiers in 1.21.5->1.21.4 (#979) 2025-04-01 16:42:25 +02:00
FlorianMichael 4cca914c5d [ci skip] Update build status url in README.md (#977) 2025-04-01 16:42:00 +02:00
Nassim Jahnke fa90711056 Bump version to 5.3.2-SNAPSHOT 2025-04-01 16:41:46 +02:00
Nassim Jahnke d5d4073857 5.3.1 Release 2025-03-30 21:09:13 +02:00
Gero b8e0b39eeb Add mapping for CHUNKS_BIOMES in 1.21.5->1.21.4 (#976) 2025-03-30 19:20:00 +02:00
Nassim Jahnke 6ec175dff2 And here too 2025-03-29 20:34:38 +01:00
Nassim Jahnke 9bd1785886 Add --refresh-dependencies to workflow build 2025-03-29 20:30:37 +01:00
Nassim Jahnke 9fabc4b11e Never push random updates the day of a release 2025-03-29 20:28:10 +01:00
FlorianMichael 3969186439 Update MCStructs to 3.0.0 (#975) 2025-03-29 14:35:38 +01:00
Nassim Jahnke 422826a9b8 Always cancel saddle equipment 2025-03-29 13:59:42 +01:00
Nassim Jahnke ddcaa78b61 5.3.0 Release 2025-03-28 18:57:40 +01:00
Nassim Jahnke d3c6065367 Remove missing new registries 2025-03-28 17:59:47 +01:00
Nassim Jahnke df5353be29 Also check for hanging sign block entities 2025-03-28 17:05:50 +01:00
FlorianMichael 9e8e23d308 Use TagUtil#getNamespacedTagKey in component rewriter 2025-03-28 15:19:33 +01:00
Nassim Jahnke 3693ec6021 Process player chat and disguised chat text components 2025-03-27 16:23:22 +01:00
Nassim Jahnke 0a5ba125f7 Add 1.21.5 translations 2025-03-26 14:32:57 +01:00
Nassim Jahnke 8f861f670c Update dependencies 2025-03-23 11:00:30 +01:00
Nassim Jahnke 0f806f1016 1.21.5-pre1 2025-03-12 16:54:34 +01:00
Nassim Jahnke fbba2dc81b Handle show_in_tooltip and other structural changes in show item hovers 2025-03-12 16:54:34 +01:00
Nassim Jahnke 61f537e9b9 Fix some entity variants 2025-03-12 16:54:34 +01:00
FlorianMichael ba84a588f1 Backup PROVIDES_TRIM_MATERIAL item component 2025-03-12 16:54:34 +01:00
Nassim Jahnke 4ec0969b45 Send horse saddle equipment as entity data 2025-03-12 16:54:33 +01:00
Nassim Jahnke 19a04666e5 Update sign text 2025-03-12 16:54:33 +01:00
Nassim Jahnke 9a5e2f8e8c 25w08a 2025-03-12 16:54:33 +01:00
Nassim Jahnke a33feff59b 25w07a 2025-03-12 16:54:33 +01:00
Nassim Jahnke 612a6b3696 25w06a 2025-03-12 16:54:32 +01:00
Nassim Jahnke b42e466248 Null check bypassed_by tag 2025-03-12 16:54:32 +01:00
Nassim Jahnke e4ea6aa5e2 25w05a 2025-03-12 16:54:32 +01:00
Nassim Jahnke c40e092b48 Start working on 25w04a
Testing will be easier once Mojang fixes current crashes and parsing issues
2025-03-12 16:54:32 +01:00
Nassim Jahnke 46a33a42ec Handle new item data components 2025-03-12 16:54:31 +01:00
Nassim Jahnke d31892513c Mostly done 25w03a 2025-03-12 16:54:31 +01:00
Nassim Jahnke e6af10a0b6 25w02a 2025-03-12 16:54:31 +01:00
Nassim Jahnke f6dcd149cb Update pre-1.20 container id types 2025-03-11 10:38:06 +01:00
Nassim Jahnke 1fb2bd410f Fix inverted player input when in a vehicle
Fixes #969
2025-03-10 11:28:31 +01:00
github-actions[bot]andgradle-update-robot b1e667fadb Update Gradle Wrapper from 8.12.1 to 8.13 (#966)
Signed-off-by: gradle-update-robot <gradle-update-robot@regolo.cc>
Co-authored-by: gradle-update-robot <gradle-update-robot@regolo.cc>
2025-02-25 18:41:22 +01:00
Nassim Jahnke 7eb0522150 Also remove data component overrides in hover events
Fixes ViaVersion/ViaVersion#4395
2025-02-25 13:51:31 +01:00
Nassim Jahnke 3f6c172d7b Fix player rotation in 1.21.2->1.21.2
Fixes ViaVersion/ViaVersion#4380
2025-02-08 14:24:35 +01:00
Nassim Jahnke 9e7fad2840 Update minecart held block states in 1.17->1.16
Fixes #958
2025-02-04 11:04:58 +01:00
FlorianMichael 2f3c869f4d Fix compile error 2025-02-03 00:22:12 +01:00
bookyandFlorianMichael c6b287bfac Always rewrite map color ids in 1.17->1.16.4 (#956)
Co-authored-by: FlorianMichael <florian.michael07@gmail.com>
2025-02-03 00:17:34 +01:00
EnZaXD 0f59bf96c8 Only send registry before tags if not empty in 1.20.5->1.20.3 (#955) 2025-01-31 22:35:37 +01:00
Florian ca5028a7fa Use ProtocolRunnable in PlayerPacketsTickTask (#954) 2025-01-29 20:53:00 +01:00
github-actions[bot]andgradle-update-robot 9740910d98 Update Gradle Wrapper from 8.12 to 8.12.1 (#953)
Signed-off-by: gradle-update-robot <gradle-update-robot@regolo.cc>
Co-authored-by: gradle-update-robot <gradle-update-robot@regolo.cc>
2025-01-26 20:01:56 +01:00
EnZaXD cb9907743d Add show_item rewriting to 1.20.5->1.20.3 (#931) 2025-01-15 12:04:18 +01:00
EnZaXD 4617e6e416 [ci skip] Exclude .DS_Store file (#951) 2025-01-11 10:17:25 +01:00
Nassim Jahnke de0c869dbb Update component rewriters 2025-01-10 21:38:08 +01:00
EnZaXD 29ec02687c Properly track minecart object entity types in <= 1.12.2 (#946) 2025-01-10 17:14:47 +01:00
Nassim Jahnke 481b06cd2a Fix inlined jukebox song backup
Fixes #949
2025-01-09 22:47:20 +01:00
Ryn. 624fb6acd4 [ci skip] Fix typo in README.md (#947) 2025-01-07 17:48:06 +01:00
88 changed files with 2325 additions and 444 deletions

No files matched your search

Vendored
BIN
View File
Binary file not shown.
+1 -1
View File
@@ -22,4 +22,4 @@ jobs:
java-version: 17
check-latest: true
- name: Build with Gradle
run: ./gradlew build
run: ./gradlew build --refresh-dependencies
+1 -1
View File
@@ -26,4 +26,4 @@ jobs:
env:
HANGAR_TOKEN: ${{ secrets.HANGAR_TOKEN }}
MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }}
run: ./gradlew build modrinth publishAllPublicationsToHangar --stacktrace
run: ./gradlew build modrinth publishAllPublicationsToHangar --refresh-dependencies --stacktrace
+3
View File
@@ -108,5 +108,8 @@ nbactions.xml
nb-configuration.xml
.nb-gradle/
### MacOS ###
.DS_Store
### Run Folder (ViaProxy) ###
common/run/
+3 -3
View File
@@ -1,12 +1,12 @@
# ViaBackwards
[![Latest Release](https://img.shields.io/github/v/release/ViaVersion/ViaBackwards)](https://github.com/ViaVersion/ViaBackwards/releases)
[![Build Status](https://github.com/ViaVersion/ViaBackwards/actions/workflows/gradle.yml/badge.svg?branch=master)](https://github.com/ViaVersion/ViaBackwards/actions)
[![Build Status](https://github.com/ViaVersion/ViaBackwards/actions/workflows/build.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 the connection of older clients to newer server versions for Minecraft servers.**
Requires [ViaVersion](https://hangar.papermc.io/ViaVersion/ViaVersion) to be installed..
Requires [ViaVersion](https://hangar.papermc.io/ViaVersion/ViaVersion) to be installed.
Supported Versions
-
@@ -42,7 +42,7 @@ Known issues
1.17 will not be able to see or interact with blocks below y=0 and above y=255
* <1.17 clients on 1.17+ servers might experience inventory desyncs on certain inventory click actions
* Sound mappings are incomplete ([see here](https://github.com/ViaVersion/ViaBackwards/issues/326))
* <1.19.4 clients on 1.20+ servers won't be able to use the smithing table, this can be fixed by
* <1.19.4 clients on 1.20+ servers won't be able to use the smithing table. This can be fixed by
installing [AxSmithing](https://github.com/ViaVersionAddons/AxSmithing)
Other Links
+1 -1
View File
@@ -8,5 +8,5 @@ repositories {
dependencies {
// version must be manually kept in sync with the one in root project settings.gradle.kts
implementation("com.gradleup.shadow", "shadow-gradle-plugin", "8.3.0")
implementation("com.gradleup.shadow", "shadow-gradle-plugin", "8.3.6")
}
@@ -18,7 +18,7 @@
package com.viaversion.viabackwards.api;
import com.viaversion.viabackwards.api.data.BackwardsMappingData;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.TranslatableRewriter;
import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.api.protocol.AbstractProtocol;
import com.viaversion.viaversion.api.protocol.Protocol;
@@ -66,7 +66,7 @@ public abstract class BackwardsProtocol<CU extends ClientboundPacketType, CM ext
}
@Override
public @Nullable TranslatableRewriter<CU> getComponentRewriter() {
public @Nullable TranslatableRewriter getComponentRewriter() {
return null;
}
}
@@ -20,7 +20,7 @@ package com.viaversion.viabackwards.api;
import com.viaversion.viabackwards.ViaBackwards;
import com.viaversion.viabackwards.ViaBackwardsConfig;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.data.TranslatableMappings;
import com.viaversion.viabackwards.protocol.v1_11to1_10.Protocol1_11To1_10;
import com.viaversion.viabackwards.protocol.v1_12to1_11_1.Protocol1_12To1_11_1;
import com.viaversion.viabackwards.protocol.v1_11_1to1_11.Protocol1_11_1To1_11;
@@ -57,6 +57,7 @@ import com.viaversion.viabackwards.protocol.v1_20_5to1_20_3.Protocol1_20_5To1_20
import com.viaversion.viabackwards.protocol.v1_20_2to1_20.Protocol1_20_2To1_20;
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.Protocol1_21_2To1_21;
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.task.PlayerPacketsTickTask;
import com.viaversion.viabackwards.protocol.v1_21_5to1_21_4.Protocol1_21_5To1_21_4;
import com.viaversion.viabackwards.protocol.v1_21to1_20_5.Protocol1_21To1_20_5;
import com.viaversion.viabackwards.protocol.v1_9_3to1_9_1.Protocol1_9_3To1_9_1;
import com.viaversion.viabackwards.protocol.v1_10to1_9_3.Protocol1_10To1_9_3;
@@ -72,7 +73,7 @@ import java.util.logging.Logger;
public interface ViaBackwardsPlatform {
String MINIMUM_VV_VERSION = "5.2.1";
String MINIMUM_VV_VERSION = "5.3.2";
/**
* Initialize ViaBackwards.
@@ -92,7 +93,7 @@ public interface ViaBackwardsPlatform {
Via.getManager().getSubPlatforms().add(VersionInfo.getImplementationVersion());
getLogger().info("Loading translations...");
TranslatableRewriter.loadTranslatables();
TranslatableMappings.loadTranslatables();
getLogger().info("Registering protocols...");
final ProtocolManager protocolManager = Via.getManager().getProtocolManager();
@@ -146,6 +147,7 @@ public interface ViaBackwardsPlatform {
protocolManager.registerProtocol(new Protocol1_21To1_20_5(), ProtocolVersion.v1_20_5, ProtocolVersion.v1_21);
protocolManager.registerProtocol(new Protocol1_21_2To1_21(), ProtocolVersion.v1_21, ProtocolVersion.v1_21_2);
protocolManager.registerProtocol(new Protocol1_21_4To1_21_2(), ProtocolVersion.v1_21_2, ProtocolVersion.v1_21_4);
protocolManager.registerProtocol(new Protocol1_21_5To1_21_4(), ProtocolVersion.v1_21_4, ProtocolVersion.v1_21_5);
}
default void enable() {
@@ -15,26 +15,19 @@
* 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.api.rewriters;
package com.viaversion.viabackwards.api.data;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.nbt.tag.StringTag;
import com.viaversion.viabackwards.ViaBackwards;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.data.BackwardsMappingDataLoader;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType;
import com.viaversion.viaversion.api.protocol.Protocol;
import com.viaversion.viaversion.libs.gson.JsonElement;
import com.viaversion.viaversion.libs.gson.JsonObject;
import com.viaversion.viaversion.rewriter.ComponentRewriter;
import java.util.HashMap;
import java.util.Map;
import org.checkerframework.checker.nullness.qual.Nullable;
public class TranslatableRewriter<C extends ClientboundPacketType> extends ComponentRewriter<C> {
public final class TranslatableMappings {
private static final Map<String, Map<String, String>> TRANSLATABLES = new HashMap<>();
private final Map<String, String> translatables;
public static void loadTranslatables() {
if (!TRANSLATABLES.isEmpty()) {
@@ -53,42 +46,24 @@ public class TranslatableRewriter<C extends ClientboundPacketType> extends Compo
}
}
public TranslatableRewriter(final BackwardsProtocol<C, ?, ?, ?> protocol, final ReadType type) {
this(protocol, type, protocol.getClass().getSimpleName().replace("Protocol", "").split("To")[0].replace("_", "."));
public static Map<String, String> translatablesFor(final Protocol<?, ?, ?, ?> protocol) {
final String version = protocol.getClass().getSimpleName()
.replace("Protocol", "")
.split("To")[0]
.replace("_", ".");
return translatablesFor(version);
}
public TranslatableRewriter(final BackwardsProtocol<C, ?, ?, ?> protocol, final ReadType type, final String version) {
super(protocol, type);
public static Map<String, String> translatablesFor(final String version) {
final Map<String, String> translatableMappings = getTranslatableMappings(version);
if (translatableMappings == null) {
ViaBackwards.getPlatform().getLogger().warning("Missing " + version + " translatables!");
this.translatables = new HashMap<>();
} else {
this.translatables = translatableMappings;
return new HashMap<>();
}
return translatableMappings;
}
@Override
protected void handleTranslate(final JsonObject root, final String translate) {
final String newTranslate = mappedTranslationKey(translate);
if (newTranslate != null) {
root.addProperty("translate", newTranslate);
}
}
@Override
protected void handleTranslate(final UserConnection connection, final CompoundTag parentTag, final StringTag translateTag) {
final String newTranslate = mappedTranslationKey(translateTag.getValue());
if (newTranslate != null) {
parentTag.put("translate", new StringTag(newTranslate));
}
}
public @Nullable String mappedTranslationKey(final String translationKey) {
return translatables.get(translationKey);
}
public static Map<String, String> getTranslatableMappings(final String sectionIdentifier) {
public static @Nullable Map<String, String> getTranslatableMappings(final String sectionIdentifier) {
return TRANSLATABLES.get(sectionIdentifier);
}
}
@@ -18,6 +18,7 @@
package com.viaversion.viabackwards.api.rewriters;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.nbt.tag.FloatTag;
import com.viaversion.nbt.tag.IntArrayTag;
import com.viaversion.nbt.tag.IntTag;
import com.viaversion.nbt.tag.ListTag;
@@ -27,6 +28,7 @@ import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.data.BackwardsMappingData;
import com.viaversion.viabackwards.api.data.MappedItem;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.EitherHolder;
import com.viaversion.viaversion.api.minecraft.Holder;
import com.viaversion.viaversion.api.minecraft.HolderSet;
import com.viaversion.viaversion.api.minecraft.data.StructuredDataContainer;
@@ -47,6 +49,8 @@ import org.checkerframework.checker.nullness.qual.Nullable;
public class BackwardsStructuredItemRewriter<C extends ClientboundPacketType, S extends ServerboundPacketType,
T extends BackwardsProtocol<C, ?, ?, S>> extends StructuredItemRewriter<C, S, T> {
private static final int[] EMPTY_INT_ARRAY = new int[0];
public BackwardsStructuredItemRewriter(
T protocol,
Type<Item> itemType, Type<Item[]> itemArrayType, Type<Item> mappedItemType, Type<Item[]> mappedItemArrayType,
@@ -97,7 +101,7 @@ public class BackwardsStructuredItemRewriter<C extends ClientboundPacketType, S
new float[]{mappedItem.customModelData().floatValue()},
new boolean[0],
new String[0],
new int[0]
EMPTY_INT_ARRAY
));
}
} else if (!dataContainer.has(StructuredDataKey.CUSTOM_MODEL_DATA1_20_5)) {
@@ -195,7 +199,7 @@ public class BackwardsStructuredItemRewriter<C extends ClientboundPacketType, S
protected HolderSet restoreHolderSet(final CompoundTag tag, final String key) {
final Tag savedTag = tag.get(key);
if (savedTag == null) {
return HolderSet.of(new int[0]);
return HolderSet.of(EMPTY_INT_ARRAY);
}
if (savedTag instanceof StringTag tagKey) {
@@ -203,7 +207,7 @@ public class BackwardsStructuredItemRewriter<C extends ClientboundPacketType, S
} else if (savedTag instanceof IntArrayTag idsTag) {
return HolderSet.of(idsTag.getValue());
} else {
return HolderSet.of(new int[0]);
return HolderSet.of(EMPTY_INT_ARRAY);
}
}
@@ -217,6 +221,28 @@ public class BackwardsStructuredItemRewriter<C extends ClientboundPacketType, S
}
}
protected <V> Tag eitherHolderToTag(final EitherHolder<V> holder, final BiConsumer<V, CompoundTag> valueSaveFunction) {
if (holder.hasKey()) {
return new StringTag(holder.key());
} else {
return holderToTag(holder.holder(), valueSaveFunction);
}
}
protected <V> void saveEitherHolderData(final StructuredDataKey<EitherHolder<V>> key, final StructuredDataContainer data, final CompoundTag backupTag, final BiConsumer<V, CompoundTag> valueSaveFunction) {
final EitherHolder<V> holder = data.get(key);
if (holder != null) {
backupTag.put(key.identifier(), eitherHolderToTag(holder, valueSaveFunction));
}
}
protected <V> void saveHolderData(final StructuredDataKey<Holder<V>> key, final StructuredDataContainer data, final CompoundTag backupTag, final BiConsumer<V, CompoundTag> valueSaveFunction) {
final Holder<V> holder = data.get(key);
if (holder != null) {
backupTag.put(key.identifier(), holderToTag(holder, valueSaveFunction));
}
}
protected <V> Holder<V> restoreHolder(final CompoundTag tag, final String key, final Function<CompoundTag, V> valueRestoreFunction) {
final Tag savedTag = tag.get(key);
if (savedTag == null) {
@@ -232,6 +258,67 @@ public class BackwardsStructuredItemRewriter<C extends ClientboundPacketType, S
}
}
protected <V> EitherHolder<V> restoreEitherHolder(final CompoundTag tag, final String key, final Function<CompoundTag, V> valueRestoreFunction) {
final Tag savedTag = tag.get(key);
if (savedTag == null) {
return EitherHolder.of(Holder.of(0));
}
if (savedTag instanceof StringTag keyTag) {
return EitherHolder.of(keyTag.getValue());
} else {
return EitherHolder.of(restoreHolder(tag, key, valueRestoreFunction));
}
}
protected <V> void restoreHolderData(final StructuredDataKey<Holder<V>> key, final StructuredDataContainer data, final CompoundTag backupTag, final Function<CompoundTag, V> valueRestoreFunction) {
if (backupTag.contains(key.identifier())) {
data.set(key, restoreHolder(backupTag, key.identifier(), valueRestoreFunction));
}
}
protected void saveStringData(final StructuredDataKey<String> key, final StructuredDataContainer data, final CompoundTag backupTag) {
final String value = data.get(key);
if (value != null) {
backupTag.putString(key.identifier(), value);
}
}
protected void restoreStringData(final StructuredDataKey<String> key, final StructuredDataContainer data, final CompoundTag backupTag) {
final String value = backupTag.getString(key.identifier());
if (value != null) {
data.set(key, value);
}
}
protected void saveIntData(final StructuredDataKey<Integer> key, final StructuredDataContainer data, final CompoundTag backupTag) {
final Integer variant = data.get(key);
if (variant != null) {
backupTag.putInt(key.identifier(), variant);
}
}
protected void restoreIntData(final StructuredDataKey<Integer> key, final StructuredDataContainer data, final CompoundTag backupTag) {
final IntTag variant = backupTag.getIntTag(key.identifier());
if (variant != null) {
data.set(key, variant.asInt());
}
}
protected void saveFloatData(final StructuredDataKey<Float> key, final StructuredDataContainer data, final CompoundTag backupTag) {
final Float variant = data.get(key);
if (variant != null) {
backupTag.putFloat(key.identifier(), variant);
}
}
protected void restoreFloatData(final StructuredDataKey<Float> key, final StructuredDataContainer data, final CompoundTag backupTag) {
final FloatTag variant = backupTag.getFloatTag(key.identifier());
if (variant != null) {
data.set(key, variant.asFloat());
}
}
@Override
public String nbtTagName() {
return "VB|" + protocol.getClass().getSimpleName();
@@ -24,7 +24,6 @@ import com.viaversion.viaversion.api.minecraft.entitydata.EntityDataType;
import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.protocol.remapper.PacketHandler;
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.version.Types1_14;
@@ -40,40 +39,34 @@ public abstract class EntityRewriter<C extends ClientboundPacketType, T extends
@Override
public void registerTrackerWithData(C packetType, EntityType fallingBlockType) {
protocol.registerClientbound(packetType, new PacketHandlers() {
@Override
public void register() {
map(Types.VAR_INT); // 0 - Entity id
map(Types.UUID); // 1 - Entity UUID
map(Types.VAR_INT); // 2 - Entity Type
map(Types.DOUBLE); // 3 - X
map(Types.DOUBLE); // 4 - Y
map(Types.DOUBLE); // 5 - Z
map(Types.BYTE); // 6 - Pitch
map(Types.BYTE); // 7 - Yaw
map(Types.INT); // 8 - Data
handler(getSpawnTrackerWithDataHandler(fallingBlockType));
}
protocol.registerClientbound(packetType, wrapper -> {
wrapper.passthrough(Types.VAR_INT); // Entity ID
wrapper.passthrough(Types.UUID); // Entity UUID
wrapper.passthrough(Types.VAR_INT); // Entity Type
wrapper.passthrough(Types.DOUBLE); // X
wrapper.passthrough(Types.DOUBLE); // Y
wrapper.passthrough(Types.DOUBLE); // Z
wrapper.passthrough(Types.BYTE); // Pitch
wrapper.passthrough(Types.BYTE); // Yaw
wrapper.passthrough(Types.INT); // Data
getSpawnTrackerWithDataHandler(fallingBlockType).handle(wrapper);
});
}
@Override
public void registerTrackerWithData1_19(C packetType, EntityType fallingBlockType) {
protocol.registerClientbound(packetType, new PacketHandlers() {
@Override
public void register() {
map(Types.VAR_INT); // Entity id
map(Types.UUID); // Entity UUID
map(Types.VAR_INT); // Entity type
map(Types.DOUBLE); // X
map(Types.DOUBLE); // Y
map(Types.DOUBLE); // Z
map(Types.BYTE); // Pitch
map(Types.BYTE); // Yaw
map(Types.BYTE); // Head yaw
map(Types.VAR_INT); // Data
handler(getSpawnTrackerWithDataHandler1_19(fallingBlockType));
}
protocol.registerClientbound(packetType, wrapper -> {
wrapper.passthrough(Types.VAR_INT); // Entity id
wrapper.passthrough(Types.UUID); // Entity UUID
wrapper.passthrough(Types.VAR_INT); // Entity type
wrapper.passthrough(Types.DOUBLE); // X
wrapper.passthrough(Types.DOUBLE); // Y
wrapper.passthrough(Types.DOUBLE); // Z
wrapper.passthrough(Types.BYTE); // Pitch
wrapper.passthrough(Types.BYTE); // Yaw
wrapper.passthrough(Types.BYTE); // Head yaw
wrapper.passthrough(Types.VAR_INT); // Data
getSpawnTrackerWithDataHandler1_19(fallingBlockType).handle(wrapper);
});
}
@@ -18,9 +18,16 @@
package com.viaversion.viabackwards.api.rewriters;
import com.viaversion.nbt.tag.ByteTag;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.nbt.tag.IntTag;
import com.viaversion.nbt.tag.NumberTag;
import com.viaversion.nbt.tag.ShortTag;
import com.viaversion.nbt.tag.StringTag;
import com.viaversion.nbt.tag.Tag;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.data.MappedLegacyBlockItem;
import com.viaversion.viabackwards.api.data.BackwardsMappingDataLoader;
import com.viaversion.viabackwards.api.data.MappedLegacyBlockItem;
import com.viaversion.viabackwards.protocol.v1_12to1_11_1.data.BlockColors1_11_1;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.BlockChangeRecord;
@@ -41,17 +48,10 @@ import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectOpenHashMap;
import com.viaversion.viaversion.libs.gson.JsonElement;
import com.viaversion.viaversion.libs.gson.JsonObject;
import com.viaversion.viaversion.libs.gson.JsonPrimitive;
import com.viaversion.nbt.tag.ByteTag;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.nbt.tag.IntTag;
import com.viaversion.nbt.tag.NumberTag;
import com.viaversion.nbt.tag.ShortTag;
import com.viaversion.nbt.tag.StringTag;
import com.viaversion.nbt.tag.Tag;
import com.viaversion.viaversion.util.ComponentUtil;
import com.viaversion.viaversion.util.IdAndData;
import java.util.HashMap;
import java.util.Map;
import com.viaversion.viaversion.util.IdAndData;
import org.checkerframework.checker.nullness.qual.Nullable;
public abstract class LegacyBlockItemRewriter<C extends ClientboundPacketType, S extends ServerboundPacketType,
@@ -226,10 +226,9 @@ public abstract class LegacyBlockItemRewriter<C extends ClientboundPacketType, S
public PacketHandler getFallingBlockHandler() {
return wrapper -> {
final EntityTypes1_12.ObjectType type = EntityTypes1_12.ObjectType.findById(wrapper.get(Types.BYTE, 0));
final int objectData = wrapper.get(Types.INT, 0);
final EntityTypes1_12.ObjectType type = EntityTypes1_12.ObjectType.findById(wrapper.get(Types.BYTE, 0), objectData);
if (type == EntityTypes1_12.ObjectType.FALLING_BLOCK) {
final int objectData = wrapper.get(Types.INT, 0);
final IdAndData block = handleBlock(objectData & 4095, objectData >> 12 & 15);
if (block == null) return;
@@ -36,7 +36,6 @@ import com.viaversion.viaversion.api.type.Types;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import org.checkerframework.checker.nullness.qual.Nullable;
public abstract class LegacyEntityRewriter<C extends ClientboundPacketType, T extends BackwardsProtocol<C, ?, ?, ?>> extends EntityRewriterBase<C, T> {
@@ -125,7 +124,9 @@ public abstract class LegacyEntityRewriter<C extends ClientboundPacketType, T ex
protected PacketHandler getObjectTrackerHandler() {
return wrapper -> {
EntityType type = objectTypeFromId(wrapper.get(Types.BYTE, 0));
int id = wrapper.get(Types.BYTE, 0);
int data = wrapper.get(Types.INT, 0);
EntityType type = objectTypeFromId(id, data);
if (type == null) {
return;
}
@@ -142,18 +143,20 @@ public abstract class LegacyEntityRewriter<C extends ClientboundPacketType, T ex
};
}
protected PacketHandler getObjectRewriter(Function<Byte, ObjectType> objectGetter) {
protected PacketHandler getObjectRewriter(ObjectTypeGetter objectGetter) {
return wrapper -> {
ObjectType type = objectGetter.apply(wrapper.get(Types.BYTE, 0));
int id = wrapper.get(Types.BYTE, 0);
int data = wrapper.get(Types.INT, 0);
ObjectType type = objectGetter.get(id, data);
if (type == null) {
return;
}
EntityReplacement data = getObjectData(type);
if (data != null) {
wrapper.set(Types.BYTE, 0, (byte) data.replacementId());
if (data.objectData() != -1) {
wrapper.set(Types.INT, 0, data.objectData());
EntityReplacement replacement = getObjectData(type);
if (replacement != null) {
wrapper.set(Types.BYTE, 0, (byte) replacement.replacementId());
if (replacement.objectData() != -1) {
wrapper.set(Types.INT, 0, replacement.objectData());
}
}
};
@@ -169,4 +172,10 @@ public abstract class LegacyEntityRewriter<C extends ClientboundPacketType, T ex
void setId(PacketWrapper wrapper, int id);
}
@FunctionalInterface
protected interface ObjectTypeGetter {
ObjectType get(int id, int data);
}
}
@@ -17,13 +17,47 @@
*/
package com.viaversion.viabackwards.api.rewriters;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.protocol.remapper.PacketHandler;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.rewriter.IdRewriteFunction;
public final class MapColorRewriter {
/**
* Rewrite map colors using the provided id rewriter.
*
* @param wrapper packet wrapper
* @param rewriter id rewriter returning mapped colors, or -1 if unmapped
* @param iconCount number of icons to read
*/
public static void rewriteMapColors(PacketWrapper wrapper, IdRewriteFunction rewriter, int iconCount) {
for (int i = 0; i < iconCount; i++) {
wrapper.passthrough(Types.VAR_INT); // Type
wrapper.passthrough(Types.BYTE); // X
wrapper.passthrough(Types.BYTE); // Z
wrapper.passthrough(Types.BYTE); // Direction
wrapper.passthrough(Types.OPTIONAL_COMPONENT); // Display Name
}
short columns = wrapper.passthrough(Types.UNSIGNED_BYTE);
if (columns < 1) {
return;
}
wrapper.passthrough(Types.UNSIGNED_BYTE); // Rows
wrapper.passthrough(Types.UNSIGNED_BYTE); // X
wrapper.passthrough(Types.UNSIGNED_BYTE); // Z
byte[] data = wrapper.passthrough(Types.BYTE_ARRAY_PRIMITIVE);
for (int i = 0; i < data.length; i++) {
int color = data[i] & 0xFF;
int mappedColor = rewriter.rewrite(color);
if (mappedColor != -1) {
data[i] = (byte) mappedColor;
}
}
}
/**
* Returns a packethandler to rewrite map data color ids. Reading starts from the icon count.
*
@@ -31,30 +65,6 @@ public final class MapColorRewriter {
* @return packethandler to rewrite map data color ids
*/
public static PacketHandler getRewriteHandler(IdRewriteFunction rewriter) {
return wrapper -> {
int iconCount = wrapper.passthrough(Types.VAR_INT);
for (int i = 0; i < iconCount; i++) {
wrapper.passthrough(Types.VAR_INT); // Type
wrapper.passthrough(Types.BYTE); // X
wrapper.passthrough(Types.BYTE); // Z
wrapper.passthrough(Types.BYTE); // Direction
wrapper.passthrough(Types.OPTIONAL_COMPONENT); // Display Name
}
short columns = wrapper.passthrough(Types.UNSIGNED_BYTE);
if (columns < 1) return;
wrapper.passthrough(Types.UNSIGNED_BYTE); // Rows
wrapper.passthrough(Types.UNSIGNED_BYTE); // X
wrapper.passthrough(Types.UNSIGNED_BYTE); // Z
byte[] data = wrapper.passthrough(Types.BYTE_ARRAY_PRIMITIVE);
for (int i = 0; i < data.length; i++) {
int color = data[i] & 0xFF;
int mappedColor = rewriter.rewrite(color);
if (mappedColor != -1) {
data[i] = (byte) mappedColor;
}
}
};
return wrapper -> rewriteMapColors(wrapper, rewriter, wrapper.passthrough(Types.VAR_INT));
}
}
@@ -59,16 +59,16 @@ public class StructuredEnchantmentRewriter {
final String remappedName = mappingData.mappedEnchantmentName(id);
return ComponentUtil.jsonStringToTag(ChatUtil.legacyToJsonString("§7" + remappedName, ENCHANTMENT_LEVEL_TRANSLATION.formatted(level), true));
};
rewriteEnchantmentsToClient(data, StructuredDataKey.ENCHANTMENTS, idRewriteFunction, descriptionSupplier, false);
rewriteEnchantmentsToClient(data, StructuredDataKey.STORED_ENCHANTMENTS, idRewriteFunction, descriptionSupplier, true);
rewriteEnchantmentsToClient(data, StructuredDataKey.ENCHANTMENTS1_20_5, idRewriteFunction, descriptionSupplier, false);
rewriteEnchantmentsToClient(data, StructuredDataKey.STORED_ENCHANTMENTS1_20_5, idRewriteFunction, descriptionSupplier, true);
}
public void handleToServer(final Item item) {
final StructuredDataContainer data = item.dataContainer();
final CompoundTag customData = data.get(StructuredDataKey.CUSTOM_DATA);
if (customData != null) {
rewriteEnchantmentsToServer(data, customData, StructuredDataKey.ENCHANTMENTS);
rewriteEnchantmentsToServer(data, customData, StructuredDataKey.STORED_ENCHANTMENTS);
rewriteEnchantmentsToServer(data, customData, StructuredDataKey.ENCHANTMENTS1_20_5);
rewriteEnchantmentsToServer(data, customData, StructuredDataKey.STORED_ENCHANTMENTS1_20_5);
}
}
@@ -0,0 +1,64 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2025 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.api.rewriters.text;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.nbt.tag.StringTag;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.data.TranslatableMappings;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType;
import com.viaversion.viaversion.libs.gson.JsonObject;
import java.util.Map;
import org.checkerframework.checker.nullness.qual.Nullable;
public class JsonNBTComponentRewriter<C extends ClientboundPacketType> extends com.viaversion.viaversion.rewriter.text.JsonNBTComponentRewriter<C> implements TranslatableRewriter {
private final Map<String, String> translatables;
public JsonNBTComponentRewriter(final BackwardsProtocol<C, ?, ?, ?> protocol, final ReadType type) {
super(protocol, type);
this.translatables = TranslatableMappings.translatablesFor(protocol);
}
public JsonNBTComponentRewriter(final BackwardsProtocol<C, ?, ?, ?> protocol, final ReadType type, final String version) {
super(protocol, type);
this.translatables = TranslatableMappings.translatablesFor(version);
}
@Override
protected void handleTranslate(final JsonObject root, final String translate) {
final String newTranslate = mappedTranslationKey(translate);
if (newTranslate != null) {
root.addProperty("translate", newTranslate);
}
}
@Override
protected void handleTranslate(final UserConnection connection, final CompoundTag parentTag, final StringTag translateTag) {
final String newTranslate = mappedTranslationKey(translateTag.getValue());
if (newTranslate != null) {
parentTag.put("translate", new StringTag(newTranslate));
}
}
@Override
public @Nullable String mappedTranslationKey(final String translationKey) {
return translatables.get(translationKey);
}
}
@@ -0,0 +1,64 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2025 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.api.rewriters.text;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.nbt.tag.StringTag;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.data.TranslatableMappings;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType;
import com.viaversion.viaversion.libs.gson.JsonObject;
import java.util.Map;
import org.checkerframework.checker.nullness.qual.Nullable;
public class NBTComponentRewriter<C extends ClientboundPacketType> extends com.viaversion.viaversion.rewriter.text.NBTComponentRewriter<C> implements TranslatableRewriter {
private final Map<String, String> translatables;
public NBTComponentRewriter(final BackwardsProtocol<C, ?, ?, ?> protocol) {
super(protocol);
this.translatables = TranslatableMappings.translatablesFor(protocol);
}
public NBTComponentRewriter(final BackwardsProtocol<C, ?, ?, ?> protocol, final String version) {
super(protocol);
this.translatables = TranslatableMappings.translatablesFor(version);
}
@Override
protected void handleTranslate(final JsonObject root, final String translate) {
final String newTranslate = mappedTranslationKey(translate);
if (newTranslate != null) {
root.addProperty("translate", newTranslate);
}
}
@Override
protected void handleTranslate(final UserConnection connection, final CompoundTag parentTag, final StringTag translateTag) {
final String newTranslate = mappedTranslationKey(translateTag.getValue());
if (newTranslate != null) {
parentTag.put("translate", new StringTag(newTranslate));
}
}
@Override
public @Nullable String mappedTranslationKey(final String translationKey) {
return translatables.get(translationKey);
}
}
@@ -0,0 +1,27 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2025 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.api.rewriters.text;
import com.viaversion.viaversion.api.rewriter.ComponentRewriter;
import org.checkerframework.checker.nullness.qual.Nullable;
public interface TranslatableRewriter extends ComponentRewriter {
@Nullable
String mappedTranslationKey(String translationKey);
}
@@ -18,17 +18,19 @@
package com.viaversion.viabackwards.protocol.template;
import com.viaversion.viabackwards.api.rewriters.BackwardsStructuredItemRewriter;
import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2;
import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_21_5;
import com.viaversion.viaversion.api.type.types.version.Types1_21_4;
import com.viaversion.viaversion.api.type.types.version.Types1_21_5;
import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.packet.ServerboundPacket1_21_4;
import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.packet.ServerboundPackets1_21_4;
import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.rewriter.RecipeDisplayRewriter1_21_5;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPacket1_21_2;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPackets1_21_2;
import com.viaversion.viaversion.rewriter.BlockRewriter;
import com.viaversion.viaversion.rewriter.RecipeDisplayRewriter;
// To replace if needed:
// ChunkType1_20_2
// ChunkType1_21_5
// RecipeDisplayRewriter
// Types1_21_4
final class BlockItemPacketRewriter1_99 extends BackwardsStructuredItemRewriter<ClientboundPacket1_21_2, ServerboundPacket1_21_4, Protocol1_98To1_99> {
@@ -48,7 +50,7 @@ final class BlockItemPacketRewriter1_99 extends BackwardsStructuredItemRewriter<
blockRewriter.registerBlockUpdate(ClientboundPackets1_21_2.BLOCK_UPDATE);
blockRewriter.registerSectionBlocksUpdate1_20(ClientboundPackets1_21_2.SECTION_BLOCKS_UPDATE);
blockRewriter.registerLevelEvent1_21(ClientboundPackets1_21_2.LEVEL_EVENT, 2001);
blockRewriter.registerLevelChunk1_19(ClientboundPackets1_21_2.LEVEL_CHUNK_WITH_LIGHT, ChunkType1_20_2::new);
blockRewriter.registerLevelChunk1_19(ClientboundPackets1_21_2.LEVEL_CHUNK_WITH_LIGHT, ChunkType1_21_5::new);
blockRewriter.registerBlockEntityData(ClientboundPackets1_21_2.BLOCK_ENTITY_DATA);
// registerOpenScreen(ClientboundPackets1_21_2.OPEN_SCREEN);
@@ -60,10 +62,10 @@ final class BlockItemPacketRewriter1_99 extends BackwardsStructuredItemRewriter<
registerAdvancements1_20_3(ClientboundPackets1_21_2.UPDATE_ADVANCEMENTS);
registerSetEquipment(ClientboundPackets1_21_2.SET_EQUIPMENT);
registerMerchantOffers1_20_5(ClientboundPackets1_21_2.MERCHANT_OFFERS);
registerContainerClick1_21_2(ServerboundPackets1_21_4.CONTAINER_CLICK);
registerSetCreativeModeSlot(ServerboundPackets1_21_4.SET_CREATIVE_MODE_SLOT);
registerContainerClick1_21_5(ServerboundPackets1_21_4.CONTAINER_CLICK);
registerSetCreativeModeSlot1_21_5(ServerboundPackets1_21_4.SET_CREATIVE_MODE_SLOT, Types1_21_5.LENGTH_PREFIXED_ITEM, Types1_21_5.LENGTH_PREFIXED_ITEM); // Change this
final RecipeDisplayRewriter<ClientboundPacket1_21_2> recipeRewriter = new RecipeDisplayRewriter<>(protocol);
final RecipeDisplayRewriter<ClientboundPacket1_21_2> recipeRewriter = new RecipeDisplayRewriter1_21_5<>(protocol);
recipeRewriter.registerUpdateRecipes(ClientboundPackets1_21_2.UPDATE_RECIPES);
recipeRewriter.registerRecipeBookAdd(ClientboundPackets1_21_2.RECIPE_BOOK_ADD);
recipeRewriter.registerPlaceGhostRecipe(ClientboundPackets1_21_2.PLACE_GHOST_RECIPE);
@@ -19,15 +19,14 @@ package com.viaversion.viabackwards.protocol.template;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.NBTComponentRewriter;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPacket1_21_2;
import com.viaversion.viaversion.util.SerializerVersion;
final class ComponentRewriter1_99 extends TranslatableRewriter<ClientboundPacket1_21_2> {
final class ComponentRewriter1_99 extends NBTComponentRewriter<ClientboundPacket1_21_2> {
public ComponentRewriter1_99(final BackwardsProtocol<ClientboundPacket1_21_2, ?, ?, ?> protocol) {
super(protocol, ReadType.NBT);
super(protocol);
}
@Override
@@ -38,11 +37,6 @@ final class ComponentRewriter1_99 extends TranslatableRewriter<ClientboundPacket
}
// Remove or update data from componentsTag
// New added data which is not handled otherwise needs to be removed to prevent errors on the client
}
@Override
protected SerializerVersion inputSerializerVersion() {
return SerializerVersion.V1_21_4;
// Newly added data which is not handled otherwise needs to be removed to prevent errors on the client
}
}
@@ -20,7 +20,6 @@ package com.viaversion.viabackwards.protocol.template;
import com.viaversion.viabackwards.api.rewriters.EntityRewriter;
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_4;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.version.Types1_21_4;
import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundConfigurationPackets1_21;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPacket1_21_2;
@@ -41,31 +40,13 @@ final class EntityPacketRewriter1_99 extends EntityRewriter<ClientboundPacket1_2
registerTrackerWithData1_19(ClientboundPackets1_21_2.ADD_ENTITY, EntityTypes1_21_4.FALLING_BLOCK);
registerSetEntityData(ClientboundPackets1_21_2.SET_ENTITY_DATA, /*Types1_OLD.ENTITY_DATA_LIST, */Types1_21_4.ENTITY_DATA_LIST); // Specify old and new entity data list if changed
registerRemoveEntities(ClientboundPackets1_21_2.REMOVE_ENTITIES);
registerPlayerAbilities(ClientboundPackets1_21_2.PLAYER_ABILITIES);
registerGameEvent(ClientboundPackets1_21_2.GAME_EVENT);
registerLogin1_20_5(ClientboundPackets1_21_2.LOGIN);
registerRespawn1_20_5(ClientboundPackets1_21_2.RESPAWN);
final RegistryDataRewriter registryDataRewriter = new RegistryDataRewriter(protocol);
protocol.registerClientbound(ClientboundConfigurationPackets1_21.REGISTRY_DATA, registryDataRewriter::handle);
protocol.registerClientbound(ClientboundPackets1_21_2.LOGIN, wrapper -> {
final int entityId = wrapper.passthrough(Types.INT); // Entity id
wrapper.passthrough(Types.BOOLEAN); // Hardcore
wrapper.passthrough(Types.STRING_ARRAY); // World List
wrapper.passthrough(Types.VAR_INT); // Max players
wrapper.passthrough(Types.VAR_INT); // View distance
wrapper.passthrough(Types.VAR_INT); // Simulation distance
wrapper.passthrough(Types.BOOLEAN); // Reduced debug info
wrapper.passthrough(Types.BOOLEAN); // Show death screen
wrapper.passthrough(Types.BOOLEAN); // Limited crafting
final int dimensionId = wrapper.passthrough(Types.VAR_INT);
final String world = wrapper.passthrough(Types.STRING);
trackWorldDataByKey1_20_5(wrapper.user(), dimensionId, world);
trackPlayer(wrapper.user(), entityId);
});
protocol.registerClientbound(ClientboundPackets1_21_2.RESPAWN, wrapper -> {
final int dimensionId = wrapper.passthrough(Types.VAR_INT);
final String world = wrapper.passthrough(Types.STRING);
trackWorldDataByKey1_20_5(wrapper.user(), dimensionId, world); // Tracks world height and name for chunk data and entity (un)tracking
});
}
@Override
@@ -90,7 +71,6 @@ final class EntityPacketRewriter1_99 extends EntityRewriter<ClientboundPacket1_2
Types1_21_4.ENTITY_DATA_TYPES.componentType,
Types1_21_4.ENTITY_DATA_TYPES.optionalComponentType
);
registerBlockStateHandler(EntityTypes1_21_4.ABSTRACT_MINECART, 11);
// Remove entity data of new entity type
// filter().type(EntityTypes1_21_4.SNIFFER).removeIndex(newIndex);
@@ -20,7 +20,7 @@ package com.viaversion.viabackwards.protocol.template;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.data.BackwardsMappingData;
import com.viaversion.viabackwards.api.rewriters.SoundRewriter;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.NBTComponentRewriter;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_4;
import com.viaversion.viaversion.api.protocol.packet.provider.PacketTypesProvider;
@@ -57,7 +57,7 @@ final class Protocol1_98To1_99 extends BackwardsProtocol<ClientboundPacket1_21_2
private final EntityPacketRewriter1_99 entityRewriter = new EntityPacketRewriter1_99(this);
private final BlockItemPacketRewriter1_99 itemRewriter = new BlockItemPacketRewriter1_99(this);
private final ParticleRewriter<ClientboundPacket1_21_2> particleRewriter = new ParticleRewriter<>(this, Types1_21_4.PARTICLE/*, Types1_OLD.PARTICLE*/);
private final TranslatableRewriter<ClientboundPacket1_21_2> translatableRewriter = new ComponentRewriter1_99(this);
private final NBTComponentRewriter<ClientboundPacket1_21_2> translatableRewriter = new ComponentRewriter1_99(this);
private final TagRewriter<ClientboundPacket1_21_2> tagRewriter = new TagRewriter<>(this);
public Protocol1_98To1_99() {
@@ -80,7 +80,7 @@ final class Protocol1_98To1_99 extends BackwardsProtocol<ClientboundPacket1_21_2
//new AttributeRewriter<>(this).register1_21(ClientboundPackets1_21_2.UPDATE_ATTRIBUTES);
// Registers translatable mappings (missing a whole bunch still)
//translatableRewriter.registerOpenScreen(ClientboundPackets1_21_2.OPEN_SCREEN); // Handled by registerOpenScreen in item rewriters
//translatableRewriter.registerOpenScreen1_14(ClientboundPackets1_21_2.OPEN_SCREEN); // Handled by registerOpenScreen in item rewriters
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_2.SET_ACTION_BAR_TEXT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_2.SET_TITLE_TEXT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_2.SET_SUBTITLE_TEXT);
@@ -88,13 +88,14 @@ final class Protocol1_98To1_99 extends BackwardsProtocol<ClientboundPacket1_21_2
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_2.DISCONNECT);
translatableRewriter.registerTabList(ClientboundPackets1_21_2.TAB_LIST);
translatableRewriter.registerPlayerCombatKill1_20(ClientboundPackets1_21_2.PLAYER_COMBAT_KILL);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_2.SYSTEM_CHAT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_2.DISGUISED_CHAT);
translatableRewriter.registerPlayerInfoUpdate1_21_4(ClientboundPackets1_21_2.PLAYER_INFO_UPDATE);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_2.SYSTEM_CHAT);
translatableRewriter.registerDisguisedChat(ClientboundPackets1_21_2.DISGUISED_CHAT);
translatableRewriter.registerPlayerChat1_21_5(ClientboundPackets1_21_2.PLAYER_CHAT);
translatableRewriter.registerPing();
// If needed for any particle, item, or block changes. Extend ParticleRewriter for particle serializer changes
particleRewriter.registerLevelParticles1_20_5(ClientboundPackets1_21_2.LEVEL_PARTICLES);
particleRewriter.registerLevelParticles1_21_4(ClientboundPackets1_21_2.LEVEL_PARTICLES);
particleRewriter.registerExplode1_21_2(ClientboundPackets1_21_2.EXPLODE);
}
@@ -124,7 +125,7 @@ final class Protocol1_98To1_99 extends BackwardsProtocol<ClientboundPacket1_21_2
}
@Override
public TranslatableRewriter<ClientboundPacket1_21_2> getComponentRewriter() {
public NBTComponentRewriter<ClientboundPacket1_21_2> getComponentRewriter() {
return translatableRewriter;
}
@@ -21,7 +21,7 @@ package com.viaversion.viabackwards.protocol.v1_10to1_9_3;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.data.BackwardsMappingData;
import com.viaversion.viabackwards.api.rewriters.SoundRewriter;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
import com.viaversion.viabackwards.protocol.v1_10to1_9_3.rewriter.BlockItemPacketRewriter1_10;
import com.viaversion.viabackwards.protocol.v1_10to1_9_3.rewriter.EntityPacketRewriter1_10;
import com.viaversion.viaversion.api.connection.UserConnection;
@@ -34,7 +34,7 @@ import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ClientboundPackets1_9_3;
import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ServerboundPackets1_9_3;
import com.viaversion.viaversion.rewriter.ComponentRewriter;
import com.viaversion.viaversion.rewriter.text.ComponentRewriterBase;
public class Protocol1_10To1_9_3 extends BackwardsProtocol<ClientboundPackets1_9_3, ClientboundPackets1_9_3, ServerboundPackets1_9_3, ServerboundPackets1_9_3> {
@@ -92,7 +92,7 @@ public class Protocol1_10To1_9_3 extends BackwardsProtocol<ClientboundPackets1_9
}
});
TranslatableRewriter<ClientboundPackets1_9_3> componentRewriter = new TranslatableRewriter<>(this, ComponentRewriter.ReadType.JSON);
JsonNBTComponentRewriter<ClientboundPackets1_9_3> componentRewriter = new JsonNBTComponentRewriter<>(this, ComponentRewriterBase.ReadType.JSON);
componentRewriter.registerComponentPacket(ClientboundPackets1_9_3.CHAT);
}
@@ -164,11 +164,11 @@ public class EntityPacketRewriter1_10 extends LegacyEntityRewriter<ClientboundPa
@Override
public EntityType typeFromId(int typeId) {
return EntityTypes1_10.getTypeFromId(typeId, false);
return EntityTypes1_10.EntityType.findById(typeId);
}
@Override
public EntityType objectTypeFromId(int typeId) {
return EntityTypes1_10.getTypeFromId(typeId, true);
public EntityType objectTypeFromId(int typeId, int data) {
return EntityTypes1_10.ObjectType.getEntityType(typeId, data);
}
}
@@ -117,11 +117,11 @@ public class EntityPacketRewriter1_11_1 extends LegacyEntityRewriter<Clientbound
@Override
public EntityType typeFromId(int typeId) {
return EntityTypes1_11.getTypeFromId(typeId, false);
return EntityTypes1_11.EntityType.findById(typeId);
}
@Override
public EntityType objectTypeFromId(int typeId) {
return EntityTypes1_11.getTypeFromId(typeId, true);
public EntityType objectTypeFromId(int typeId, int data) {
return EntityTypes1_11.ObjectType.getEntityType(typeId, data);
}
}
@@ -21,7 +21,7 @@ package com.viaversion.viabackwards.protocol.v1_11to1_10;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.data.BackwardsMappingData;
import com.viaversion.viabackwards.api.rewriters.SoundRewriter;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
import com.viaversion.viabackwards.protocol.v1_11to1_10.rewriter.BlockItemPacketRewriter1_11;
import com.viaversion.viabackwards.protocol.v1_11to1_10.rewriter.EntityPacketRewriter1_11;
import com.viaversion.viabackwards.protocol.v1_11to1_10.rewriter.PlayerPacketRewriter1_11;
@@ -30,17 +30,16 @@ import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.ClientWorld;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_11;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
import com.viaversion.viaversion.protocols.v1_11_1to1_12.packet.ClientboundPackets1_12;
import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ClientboundPackets1_9_3;
import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ServerboundPackets1_9_3;
import com.viaversion.viaversion.rewriter.ComponentRewriter;
import com.viaversion.viaversion.rewriter.text.ComponentRewriterBase;
public class Protocol1_11To1_10 extends BackwardsProtocol<ClientboundPackets1_9_3, ClientboundPackets1_9_3, ServerboundPackets1_9_3, ServerboundPackets1_9_3> {
public static final BackwardsMappingData MAPPINGS = new BackwardsMappingData("1.11", "1.10");
private final EntityPacketRewriter1_11 entityRewriter = new EntityPacketRewriter1_11(this);
private final BlockItemPacketRewriter1_11 itemRewriter = new BlockItemPacketRewriter1_11(this);
private TranslatableRewriter<ClientboundPackets1_9_3> componentRewriter;
private JsonNBTComponentRewriter<ClientboundPackets1_9_3> componentRewriter;
public Protocol1_11To1_10() {
super(ClientboundPackets1_9_3.class, ClientboundPackets1_9_3.class, ServerboundPackets1_9_3.class, ServerboundPackets1_9_3.class);
@@ -56,7 +55,7 @@ public class Protocol1_11To1_10 extends BackwardsProtocol<ClientboundPackets1_9_
soundRewriter.registerNamedSound(ClientboundPackets1_9_3.CUSTOM_SOUND);
soundRewriter.registerSound(ClientboundPackets1_9_3.SOUND);
componentRewriter = new TranslatableRewriter<>(this, ComponentRewriter.ReadType.JSON);
componentRewriter = new JsonNBTComponentRewriter<>(this, ComponentRewriterBase.ReadType.JSON);
componentRewriter.registerComponentPacket(ClientboundPackets1_9_3.CHAT);
}
@@ -85,7 +84,7 @@ public class Protocol1_11To1_10 extends BackwardsProtocol<ClientboundPackets1_9_
return itemRewriter;
}
public TranslatableRewriter<ClientboundPackets1_9_3> getComponentRewriter() {
public JsonNBTComponentRewriter<ClientboundPackets1_9_3> getComponentRewriter() {
return componentRewriter;
}
@@ -60,7 +60,7 @@ public class BlockItemPacketRewriter1_11 extends LegacyBlockItemRewriter<Clientb
protocol.registerClientbound(ClientboundPackets1_9_3.CONTAINER_SET_SLOT, new PacketHandlers() {
@Override
public void register() {
map(Types.UNSIGNED_BYTE); // 0 - Window ID
map(Types.BYTE); // 0 - Window ID
map(Types.SHORT); // 1 - Slot ID
map(Types.ITEM1_8); // 2 - Slot Value
@@ -118,7 +118,7 @@ public class BlockItemPacketRewriter1_11 extends LegacyBlockItemRewriter<Clientb
protocol.registerServerbound(ServerboundPackets1_9_3.CONTAINER_CLICK, new PacketHandlers() {
@Override
public void register() {
map(Types.UNSIGNED_BYTE); // 0 - Window ID
map(Types.BYTE); // 0 - Window ID
map(Types.SHORT); // 1 - Slot
map(Types.BYTE); // 2 - Button
map(Types.SHORT); // 3 - Action number
@@ -364,11 +364,11 @@ public class EntityPacketRewriter1_11 extends LegacyEntityRewriter<ClientboundPa
@Override
public EntityType typeFromId(int typeId) {
return EntityTypes1_11.getTypeFromId(typeId, false);
return EntityTypes1_11.EntityType.findById(typeId);
}
@Override
public EntityType objectTypeFromId(int typeId) {
return EntityTypes1_11.getTypeFromId(typeId, true);
public EntityType objectTypeFromId(int typeId, int data) {
return EntityTypes1_11.ObjectType.getEntityType(typeId, data);
}
}
@@ -95,7 +95,7 @@ public class BlockItemPacketRewriter1_12 extends LegacyBlockItemRewriter<Clientb
protocol.registerServerbound(ServerboundPackets1_9_3.CONTAINER_CLICK, new PacketHandlers() {
@Override
public void register() {
map(Types.UNSIGNED_BYTE); // 0 - Window ID
map(Types.BYTE); // 0 - Window ID
map(Types.SHORT); // 1 - Slot
map(Types.BYTE); // 2 - Button
map(Types.SHORT); // 3 - Action number
@@ -112,7 +112,7 @@ public class BlockItemPacketRewriter1_12 extends LegacyBlockItemRewriter<Clientb
// Apologize (may happen in some cases, maybe if inventory is full?)
PacketWrapper confirm = wrapper.create(ServerboundPackets1_12.CONTAINER_ACK);
confirm.write(Types.UNSIGNED_BYTE, wrapper.get(Types.UNSIGNED_BYTE, 0));
confirm.write(Types.BYTE, wrapper.get(Types.BYTE, 0));
confirm.write(Types.SHORT, wrapper.get(Types.SHORT, 1));
confirm.write(Types.BOOLEAN, false); // Success - not used
@@ -18,18 +18,18 @@
package com.viaversion.viabackwards.protocol.v1_12to1_11_1.rewriter;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
import com.viaversion.viabackwards.protocol.v1_12to1_11_1.Protocol1_12To1_11_1;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.libs.gson.JsonElement;
import com.viaversion.viaversion.libs.gson.JsonObject;
import com.viaversion.viaversion.protocols.v1_11_1to1_12.packet.ClientboundPackets1_12;
import com.viaversion.viaversion.rewriter.ComponentRewriter;
import com.viaversion.viaversion.rewriter.text.ComponentRewriterBase;
public class ComponentRewriter1_12 extends TranslatableRewriter<ClientboundPackets1_12> {
public class ComponentRewriter1_12 extends JsonNBTComponentRewriter<ClientboundPackets1_12> {
public ComponentRewriter1_12(Protocol1_12To1_11_1 protocol) {
super(protocol, ComponentRewriter.ReadType.JSON);
super(protocol, ComponentRewriterBase.ReadType.JSON);
}
@Override
@@ -18,6 +18,7 @@
package com.viaversion.viabackwards.protocol.v1_12to1_11_1.rewriter;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.viabackwards.api.rewriters.LegacyEntityRewriter;
import com.viaversion.viabackwards.protocol.v1_12to1_11_1.Protocol1_12To1_11_1;
import com.viaversion.viabackwards.protocol.v1_12to1_11_1.storage.ParrotStorage;
@@ -35,7 +36,6 @@ import com.viaversion.viaversion.api.type.types.version.Types1_9;
import com.viaversion.viaversion.libs.gson.JsonElement;
import com.viaversion.viaversion.protocols.v1_11_1to1_12.packet.ClientboundPackets1_12;
import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ClientboundPackets1_9_3;
import com.viaversion.nbt.tag.CompoundTag;
public class EntityPacketRewriter1_12 extends LegacyEntityRewriter<ClientboundPackets1_12, Protocol1_12To1_11_1> {
@@ -285,11 +285,11 @@ public class EntityPacketRewriter1_12 extends LegacyEntityRewriter<ClientboundPa
@Override
public EntityType typeFromId(int typeId) {
return EntityTypes1_12.getTypeFromId(typeId, false);
return EntityTypes1_12.EntityType.findById(typeId);
}
@Override
public EntityType objectTypeFromId(int typeId) {
return EntityTypes1_12.getTypeFromId(typeId, true);
public EntityType objectTypeFromId(int typeId, int data) {
return EntityTypes1_12.ObjectType.getEntityType(typeId, data);
}
}
@@ -20,7 +20,7 @@ package com.viaversion.viabackwards.protocol.v1_13_1to1_13;
import com.viaversion.viabackwards.ViaBackwards;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.data.BackwardsMappingData;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
import com.viaversion.viabackwards.protocol.v1_13_1to1_13.rewriter.CommandRewriter1_13_1;
import com.viaversion.viabackwards.protocol.v1_13_1to1_13.rewriter.EntityPacketRewriter1_13_1;
import com.viaversion.viabackwards.protocol.v1_13_1to1_13.rewriter.ItemPacketRewriter1_13_1;
@@ -40,7 +40,7 @@ import com.viaversion.viaversion.libs.gson.JsonObject;
import com.viaversion.viaversion.protocols.v1_12_2to1_13.packet.ClientboundPackets1_13;
import com.viaversion.viaversion.protocols.v1_12_2to1_13.packet.ServerboundPackets1_13;
import com.viaversion.viaversion.protocols.v1_13to1_13_1.Protocol1_13To1_13_1;
import com.viaversion.viaversion.rewriter.ComponentRewriter;
import com.viaversion.viaversion.rewriter.text.ComponentRewriterBase;
import com.viaversion.viaversion.rewriter.ParticleRewriter;
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
import com.viaversion.viaversion.rewriter.TagRewriter;
@@ -52,7 +52,7 @@ public class Protocol1_13_1To1_13 extends BackwardsProtocol<ClientboundPackets1_
private final EntityPacketRewriter1_13_1 entityRewriter = new EntityPacketRewriter1_13_1(this);
private final ItemPacketRewriter1_13_1 itemRewriter = new ItemPacketRewriter1_13_1(this);
private final ParticleRewriter<ClientboundPackets1_13> particleRewriter = new ParticleRewriter<>(this);
private final TranslatableRewriter<ClientboundPackets1_13> translatableRewriter = new TranslatableRewriter<>(this, ComponentRewriter.ReadType.JSON);
private final JsonNBTComponentRewriter<ClientboundPackets1_13> translatableRewriter = new JsonNBTComponentRewriter<>(this, ComponentRewriterBase.ReadType.JSON);
private final TagRewriter<ClientboundPackets1_13> tagRewriter = new TagRewriter<>(this);
public Protocol1_13_1To1_13() {
@@ -230,7 +230,7 @@ public class Protocol1_13_1To1_13 extends BackwardsProtocol<ClientboundPackets1_
return particleRewriter;
}
public TranslatableRewriter<ClientboundPackets1_13> translatableRewriter() {
public JsonNBTComponentRewriter<ClientboundPackets1_13> translatableRewriter() {
return translatableRewriter;
}
@@ -55,14 +55,14 @@ public class EntityPacketRewriter1_13_1 extends LegacyEntityRewriter<Clientbound
handler(wrapper -> {
int entityId = wrapper.get(Types.VAR_INT, 0);
byte type = wrapper.get(Types.BYTE, 0);
EntityTypes1_13.EntityType entType = EntityTypes1_13.getTypeFromId(type, true);
int data = wrapper.get(Types.INT, 0);
EntityTypes1_13.EntityType entType = EntityTypes1_13.ObjectType.getEntityType(type, data);
if (entType == null) {
return;
}
// Rewrite falling block
if (entType.is(EntityTypes1_13.EntityType.FALLING_BLOCK)) {
int data = wrapper.get(Types.INT, 0);
wrapper.set(Types.INT, 0, protocol.getMappingData().getNewBlockStateId(data));
}
@@ -159,11 +159,11 @@ public class EntityPacketRewriter1_13_1 extends LegacyEntityRewriter<Clientbound
@Override
public EntityType typeFromId(int typeId) {
return EntityTypes1_13.getTypeFromId(typeId, false);
return EntityTypes1_13.EntityType.findById(typeId);
}
@Override
public EntityType objectTypeFromId(int typeId) {
return EntityTypes1_13.getTypeFromId(typeId, true);
public EntityType objectTypeFromId(int typeId, int data) {
return EntityTypes1_13.ObjectType.getEntityType(typeId, data);
}
}
@@ -30,7 +30,7 @@ public class ItemPacketRewriter1_13_2 {
protocol.registerClientbound(ClientboundPackets1_13.CONTAINER_SET_SLOT, new PacketHandlers() {
@Override
public void register() {
map(Types.UNSIGNED_BYTE); // 0 - Window ID
map(Types.BYTE); // 0 - Window ID
map(Types.SHORT); // 1 - Slot ID
map(Types.ITEM1_13_2, Types.ITEM1_13); // 2 - Slot Value
}
@@ -117,7 +117,7 @@ public class ItemPacketRewriter1_13_2 {
protocol.registerServerbound(ServerboundPackets1_13.CONTAINER_CLICK, new PacketHandlers() {
@Override
public void register() {
map(Types.UNSIGNED_BYTE); // 0 - Window ID
map(Types.BYTE); // 0 - Window ID
map(Types.SHORT); // 1 - Slot
map(Types.BYTE); // 2 - Button
map(Types.SHORT); // 3 - Action number
@@ -20,7 +20,7 @@ package com.viaversion.viabackwards.protocol.v1_13to1_12_2;
import com.viaversion.viabackwards.ViaBackwards;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.data.BackwardsMappingData1_13;
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.data.PaintingNames1_13;
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.provider.BackwardsBlockEntityProvider;
@@ -45,7 +45,7 @@ import com.viaversion.viaversion.protocols.v1_12_2to1_13.packet.ServerboundPacke
import com.viaversion.viaversion.protocols.v1_12to1_12_1.packet.ClientboundPackets1_12_1;
import com.viaversion.viaversion.protocols.v1_12to1_12_1.packet.ServerboundPackets1_12_1;
import com.viaversion.viaversion.protocols.v1_12_2to1_13.Protocol1_12_2To1_13;
import com.viaversion.viaversion.rewriter.ComponentRewriter;
import com.viaversion.viaversion.rewriter.text.ComponentRewriterBase;
import com.viaversion.viaversion.util.ComponentUtil;
import com.viaversion.viaversion.util.ProtocolLogger;
import org.checkerframework.checker.nullness.qual.Nullable;
@@ -56,7 +56,7 @@ public class Protocol1_13To1_12_2 extends BackwardsProtocol<ClientboundPackets1_
public static final ProtocolLogger LOGGER = new ProtocolLogger(Protocol1_13To1_12_2.class);
private final EntityPacketRewriter1_13 entityRewriter = new EntityPacketRewriter1_13(this);
private final BlockItemPacketRewriter1_13 blockItemPackets = new BlockItemPacketRewriter1_13(this);
private final TranslatableRewriter<ClientboundPackets1_13> translatableRewriter = new TranslatableRewriter<>(this, ComponentRewriter.ReadType.JSON) {
private final JsonNBTComponentRewriter<ClientboundPackets1_13> translatableRewriter = new JsonNBTComponentRewriter<>(this, ComponentRewriterBase.ReadType.JSON) {
@Override
protected void handleTranslate(JsonObject root, String translate) {
String mappedKey = mappedTranslationKey(translate);
@@ -65,7 +65,7 @@ public class Protocol1_13To1_12_2 extends BackwardsProtocol<ClientboundPackets1_
}
}
};
private final TranslatableRewriter<ClientboundPackets1_13> translatableToLegacyRewriter = new TranslatableRewriter<>(this, ComponentRewriter.ReadType.JSON) {
private final JsonNBTComponentRewriter<ClientboundPackets1_13> translatableToLegacyRewriter = new JsonNBTComponentRewriter<>(this, ComponentRewriterBase.ReadType.JSON) {
@Override
protected void handleTranslate(JsonObject root, String translate) {
String mappedKey = mappedTranslationKey(translate);
@@ -148,7 +148,7 @@ public class Protocol1_13To1_12_2 extends BackwardsProtocol<ClientboundPackets1_
}
// Don't override the parent method
public TranslatableRewriter<ClientboundPackets1_13> translatableRewriter() {
public JsonNBTComponentRewriter<ClientboundPackets1_13> translatableRewriter() {
return translatableRewriter;
}
@@ -270,7 +270,7 @@ public class BlockItemPacketRewriter1_13 extends BackwardsItemRewriter<Clientbou
protocol.registerClientbound(ClientboundPackets1_13.CONTAINER_SET_SLOT, new PacketHandlers() {
@Override
public void register() {
map(Types.UNSIGNED_BYTE);
map(Types.BYTE);
map(Types.SHORT);
map(Types.ITEM1_13, Types.ITEM1_8);
@@ -464,7 +464,7 @@ public class BlockItemPacketRewriter1_13 extends BackwardsItemRewriter<Clientbou
protocol.registerServerbound(ServerboundPackets1_12_1.CONTAINER_CLICK, new PacketHandlers() {
@Override
public void register() {
map(Types.UNSIGNED_BYTE);
map(Types.BYTE);
map(Types.SHORT);
map(Types.BYTE);
map(Types.SHORT);
@@ -90,14 +90,14 @@ public class EntityPacketRewriter1_13 extends LegacyEntityRewriter<ClientboundPa
handler(getObjectTrackerHandler());
handler(wrapper -> {
EntityTypes1_13.ObjectType type = EntityTypes1_13.ObjectType.findById(wrapper.get(Types.BYTE, 0));
int id = wrapper.get(Types.BYTE, 0);
int data = wrapper.get(Types.INT, 0);
EntityTypes1_13.ObjectType type = EntityTypes1_13.ObjectType.findById(id, data);
if (type == EntityTypes1_13.ObjectType.FALLING_BLOCK) {
int blockState = wrapper.get(Types.INT, 0);
int combined = Protocol1_13To1_12_2.MAPPINGS.getNewBlockStateId(blockState);
int combined = Protocol1_13To1_12_2.MAPPINGS.getNewBlockStateId(data);
combined = ((combined >> 4) & 0xFFF) | ((combined & 0xF) << 12);
wrapper.set(Types.INT, 0, combined);
} else if (type == EntityTypes1_13.ObjectType.ITEM_FRAME) {
int data = wrapper.get(Types.INT, 0);
data = switch (data) {
case 3 -> 0;
case 4 -> 1;
@@ -134,7 +134,7 @@ public class EntityPacketRewriter1_13 extends LegacyEntityRewriter<ClientboundPa
handler(wrapper -> {
int type = wrapper.get(Types.VAR_INT, 1);
EntityType entityType = EntityTypes1_13.getTypeFromId(type, false);
EntityType entityType = EntityTypes1_13.EntityType.findById(type);
if (entityType == null) {
return;
}
@@ -358,12 +358,12 @@ public class EntityPacketRewriter1_13 extends LegacyEntityRewriter<ClientboundPa
@Override
public EntityType typeFromId(int typeId) {
return EntityTypes1_13.getTypeFromId(typeId, false);
return EntityTypes1_13.EntityType.findById(typeId);
}
@Override
public EntityType objectTypeFromId(int typeId) {
return EntityTypes1_13.getTypeFromId(typeId, true);
public EntityType objectTypeFromId(int typeId, int data) {
return EntityTypes1_13.ObjectType.getEntityType(typeId, data);
}
@Override
@@ -19,7 +19,7 @@ package com.viaversion.viabackwards.protocol.v1_14to1_13_2;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.data.BackwardsMappingData;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
import com.viaversion.viabackwards.protocol.v1_14to1_13_2.rewriter.BlockItemPacketRewriter1_14;
import com.viaversion.viabackwards.protocol.v1_14to1_13_2.rewriter.CommandRewriter1_14;
import com.viaversion.viabackwards.protocol.v1_14to1_13_2.rewriter.EntityPacketRewriter1_14;
@@ -37,7 +37,7 @@ import com.viaversion.viaversion.protocols.v1_12_2to1_13.packet.ServerboundPacke
import com.viaversion.viaversion.protocols.v1_13_2to1_14.Protocol1_13_2To1_14;
import com.viaversion.viaversion.protocols.v1_13_2to1_14.packet.ClientboundPackets1_14;
import com.viaversion.viaversion.protocols.v1_13_2to1_14.packet.ServerboundPackets1_14;
import com.viaversion.viaversion.rewriter.ComponentRewriter;
import com.viaversion.viaversion.rewriter.text.ComponentRewriterBase;
import com.viaversion.viaversion.rewriter.ParticleRewriter;
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
@@ -47,7 +47,7 @@ public class Protocol1_14To1_13_2 extends BackwardsProtocol<ClientboundPackets1_
private final EntityPacketRewriter1_14 entityRewriter = new EntityPacketRewriter1_14(this);
private final BlockItemPacketRewriter1_14 itemRewriter = new BlockItemPacketRewriter1_14(this);
private final ParticleRewriter<ClientboundPackets1_14> particleRewriter = new ParticleRewriter<>(this);
private final TranslatableRewriter<ClientboundPackets1_14> translatableRewriter = new TranslatableRewriter<>(this, ComponentRewriter.ReadType.JSON);
private final JsonNBTComponentRewriter<ClientboundPackets1_14> translatableRewriter = new JsonNBTComponentRewriter<>(this, ComponentRewriterBase.ReadType.JSON);
public Protocol1_14To1_13_2() {
super(ClientboundPackets1_14.class, ClientboundPackets1_13.class, ServerboundPackets1_14.class, ServerboundPackets1_13.class);
@@ -197,7 +197,7 @@ public class Protocol1_14To1_13_2 extends BackwardsProtocol<ClientboundPackets1_
}
@Override
public TranslatableRewriter<ClientboundPackets1_14> getComponentRewriter() {
public JsonNBTComponentRewriter<ClientboundPackets1_14> getComponentRewriter() {
return translatableRewriter;
}
}
@@ -21,9 +21,9 @@ import com.google.common.collect.ImmutableSet;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.nbt.tag.ListTag;
import com.viaversion.nbt.tag.StringTag;
import com.viaversion.viabackwards.api.data.TranslatableMappings;
import com.viaversion.viabackwards.api.rewriters.BackwardsItemRewriter;
import com.viaversion.viabackwards.api.rewriters.EnchantmentRewriter;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.protocol.v1_14to1_13_2.Protocol1_14To1_13_2;
import com.viaversion.viabackwards.protocol.v1_14to1_13_2.storage.ChunkLightStorage;
import com.viaversion.viaversion.api.Via;
@@ -479,7 +479,7 @@ public class BlockItemPacketRewriter1_14 extends BackwardsItemRewriter<Clientbou
continue;
}
TextUtils.setTranslator(component, s -> Protocol1_12_2To1_13.MAPPINGS.getMojangTranslation().
getOrDefault(s, TranslatableRewriter.getTranslatableMappings("1.14").get(s)));
getOrDefault(s, TranslatableMappings.getTranslatableMappings("1.14").get(s)));
loreEntry.setValue(component.asLegacyFormatString());
}
} catch (final JsonParseException e) {
@@ -138,7 +138,7 @@ public class EntityPacketRewriter1_14 extends LegacyEntityRewriter<ClientboundPa
handler(wrapper -> {
int id = wrapper.get(Types.BYTE, 0);
int mappedId = newEntityId(id);
EntityTypes1_13.EntityType entityType = EntityTypes1_13.getTypeFromId(mappedId, false);
EntityTypes1_13.EntityType entityType = EntityTypes1_13.EntityType.findById(mappedId);
if (entityType == null) {
// Would be EntityType.PIG on a 1.14 client, but later discarded anyway since not an object type
return;
@@ -20,7 +20,7 @@ package com.viaversion.viabackwards.protocol.v1_15to1_14_4;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.data.BackwardsMappingData;
import com.viaversion.viabackwards.api.rewriters.SoundRewriter;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
import com.viaversion.viabackwards.protocol.v1_15to1_14_4.rewriter.BlockItemPacketRewriter1_15;
import com.viaversion.viabackwards.protocol.v1_15to1_14_4.rewriter.EntityPacketRewriter1_15;
import com.viaversion.viabackwards.protocol.v1_15to1_14_4.storage.ImmediateRespawnStorage;
@@ -36,7 +36,7 @@ import com.viaversion.viaversion.protocols.v1_13_2to1_14.packet.ServerboundPacke
import com.viaversion.viaversion.protocols.v1_14_3to1_14_4.packet.ClientboundPackets1_14_4;
import com.viaversion.viaversion.protocols.v1_14_4to1_15.Protocol1_14_4To1_15;
import com.viaversion.viaversion.protocols.v1_14_4to1_15.packet.ClientboundPackets1_15;
import com.viaversion.viaversion.rewriter.ComponentRewriter;
import com.viaversion.viaversion.rewriter.text.ComponentRewriterBase;
import com.viaversion.viaversion.rewriter.ParticleRewriter;
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
import com.viaversion.viaversion.rewriter.TagRewriter;
@@ -47,7 +47,7 @@ public class Protocol1_15To1_14_4 extends BackwardsProtocol<ClientboundPackets1_
private final EntityPacketRewriter1_15 entityRewriter = new EntityPacketRewriter1_15(this);
private final BlockItemPacketRewriter1_15 blockItemPackets = new BlockItemPacketRewriter1_15(this);
private final ParticleRewriter<ClientboundPackets1_15> particleRewriter = new ParticleRewriter<>(this);
private final TranslatableRewriter<ClientboundPackets1_15> translatableRewriter = new TranslatableRewriter<>(this, ComponentRewriter.ReadType.JSON);
private final JsonNBTComponentRewriter<ClientboundPackets1_15> translatableRewriter = new JsonNBTComponentRewriter<>(this, ComponentRewriterBase.ReadType.JSON);
private final TagRewriter<ClientboundPackets1_15> tagRewriter = new TagRewriter<>(this);
public Protocol1_15To1_14_4() {
@@ -62,7 +62,7 @@ public class Protocol1_15To1_14_4 extends BackwardsProtocol<ClientboundPackets1_
translatableRewriter.registerComponentPacket(ClientboundPackets1_15.CHAT);
translatableRewriter.registerPlayerCombat(ClientboundPackets1_15.PLAYER_COMBAT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_15.DISCONNECT);
translatableRewriter.registerOpenScreen(ClientboundPackets1_15.OPEN_SCREEN);
translatableRewriter.registerOpenScreen1_14(ClientboundPackets1_15.OPEN_SCREEN);
translatableRewriter.registerTabList(ClientboundPackets1_15.TAB_LIST);
translatableRewriter.registerTitle(ClientboundPackets1_15.SET_TITLES);
translatableRewriter.registerPing();
@@ -137,7 +137,7 @@ public class Protocol1_15To1_14_4 extends BackwardsProtocol<ClientboundPackets1_
}
@Override
public TranslatableRewriter<ClientboundPackets1_15> getComponentRewriter() {
public JsonNBTComponentRewriter<ClientboundPackets1_15> getComponentRewriter() {
return translatableRewriter;
}
}
@@ -20,7 +20,7 @@ package com.viaversion.viabackwards.protocol.v1_16_2to1_16_1;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.data.BackwardsMappingData;
import com.viaversion.viabackwards.api.rewriters.SoundRewriter;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
import com.viaversion.viabackwards.protocol.v1_16_2to1_16_1.rewriter.BlockItemPacketRewriter1_16_2;
import com.viaversion.viabackwards.protocol.v1_16_2to1_16_1.rewriter.CommandRewriter1_16_2;
import com.viaversion.viabackwards.protocol.v1_16_2to1_16_1.rewriter.EntityPacketRewriter1_16_2;
@@ -37,7 +37,7 @@ import com.viaversion.viaversion.protocols.v1_15_2to1_16.packet.ServerboundPacke
import com.viaversion.viaversion.protocols.v1_16_1to1_16_2.Protocol1_16_1To1_16_2;
import com.viaversion.viaversion.protocols.v1_16_1to1_16_2.packet.ClientboundPackets1_16_2;
import com.viaversion.viaversion.protocols.v1_16_1to1_16_2.packet.ServerboundPackets1_16_2;
import com.viaversion.viaversion.rewriter.ComponentRewriter;
import com.viaversion.viaversion.rewriter.text.ComponentRewriterBase;
import com.viaversion.viaversion.rewriter.ParticleRewriter;
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
import com.viaversion.viaversion.rewriter.TagRewriter;
@@ -50,7 +50,7 @@ public class Protocol1_16_2To1_16_1 extends BackwardsProtocol<ClientboundPackets
private final EntityPacketRewriter1_16_2 entityRewriter = new EntityPacketRewriter1_16_2(this);
private final BlockItemPacketRewriter1_16_2 blockItemPackets = new BlockItemPacketRewriter1_16_2(this);
private final ParticleRewriter<ClientboundPackets1_16_2> particleRewriter = new ParticleRewriter<>(this);
private final TranslatableRewriter<ClientboundPackets1_16_2> translatableRewriter = new TranslatableRewriter<>(this, ComponentRewriter.ReadType.JSON);
private final JsonNBTComponentRewriter<ClientboundPackets1_16_2> translatableRewriter = new JsonNBTComponentRewriter<>(this, ComponentRewriterBase.ReadType.JSON);
private final TagRewriter<ClientboundPackets1_16_2> tagRewriter = new TagRewriter<>(this);
public Protocol1_16_2To1_16_1() {
@@ -66,7 +66,7 @@ public class Protocol1_16_2To1_16_1 extends BackwardsProtocol<ClientboundPackets
translatableRewriter.registerComponentPacket(ClientboundPackets1_16_2.DISCONNECT);
translatableRewriter.registerTabList(ClientboundPackets1_16_2.TAB_LIST);
translatableRewriter.registerTitle(ClientboundPackets1_16_2.SET_TITLES);
translatableRewriter.registerOpenScreen(ClientboundPackets1_16_2.OPEN_SCREEN);
translatableRewriter.registerOpenScreen1_14(ClientboundPackets1_16_2.OPEN_SCREEN);
translatableRewriter.registerPing();
particleRewriter.registerLevelParticles1_13(ClientboundPackets1_16_2.LEVEL_PARTICLES, Types.DOUBLE);
@@ -131,7 +131,7 @@ public class Protocol1_16_2To1_16_1 extends BackwardsProtocol<ClientboundPackets
}
@Override
public TranslatableRewriter<ClientboundPackets1_16_2> getComponentRewriter() {
public JsonNBTComponentRewriter<ClientboundPackets1_16_2> getComponentRewriter() {
return translatableRewriter;
}
@@ -17,7 +17,7 @@
*/
package com.viaversion.viabackwards.protocol.v1_16to1_15_2.rewriter;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
import com.viaversion.viabackwards.protocol.v1_16to1_15_2.Protocol1_16To1_15_2;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.libs.gson.JsonElement;
@@ -27,7 +27,7 @@ import com.viaversion.viaversion.protocols.v1_15_2to1_16.packet.ClientboundPacke
import com.viaversion.viaversion.util.ComponentUtil;
import com.viaversion.viaversion.util.SerializerVersion;
public class TranslatableRewriter1_16 extends TranslatableRewriter<ClientboundPackets1_16> {
public class TranslatableRewriter1_16 extends JsonNBTComponentRewriter<ClientboundPackets1_16> {
private static final ChatColor[] COLORS = {
new ChatColor("black", 0x000000),
@@ -70,6 +70,14 @@ public class TranslatableRewriter1_16 extends TranslatableRewriter<ClientboundPa
}
}
JsonObject clickEvent = object.getAsJsonObject("clickEvent");
if (clickEvent != null && clickEvent.has("action")) {
String action = clickEvent.get("action").getAsString();
if (action.equals("copy_to_clipboard")) {
clickEvent.addProperty("action", "suggest_command");
}
}
JsonObject hoverEvent = object.getAsJsonObject("hoverEvent");
if (hoverEvent == null || !hoverEvent.has("contents")) {
return;
@@ -61,7 +61,7 @@ public final class Protocol1_17_1To1_17 extends BackwardsProtocol<ClientboundPac
wrapper.user().get(InventoryStateIds.class).removeStateId(containerId);
});
registerClientbound(ClientboundPackets1_17_1.CONTAINER_SET_SLOT, wrapper -> {
short containerId = wrapper.passthrough(Types.UNSIGNED_BYTE);
byte containerId = wrapper.passthrough(Types.BYTE);
int stateId = wrapper.read(Types.VAR_INT);
wrapper.user().get(InventoryStateIds.class).setStateId(containerId, stateId);
});
@@ -88,11 +88,11 @@ public final class Protocol1_17_1To1_17 extends BackwardsProtocol<ClientboundPac
});
registerServerbound(ServerboundPackets1_17.CONTAINER_CLOSE, wrapper -> {
short containerId = wrapper.passthrough(Types.UNSIGNED_BYTE);
byte containerId = wrapper.passthrough(Types.BYTE);
wrapper.user().get(InventoryStateIds.class).removeStateId(containerId);
});
registerServerbound(ServerboundPackets1_17.CONTAINER_CLICK, wrapper -> {
short containerId = wrapper.passthrough(Types.UNSIGNED_BYTE);
byte containerId = wrapper.passthrough(Types.BYTE);
int stateId = wrapper.user().get(InventoryStateIds.class).removeStateId(containerId);
wrapper.write(Types.VAR_INT, stateId == Integer.MAX_VALUE ? 0 : stateId);
});
@@ -25,15 +25,14 @@ public final class InventoryStateIds implements StorableObject {
private final Int2IntMap ids = new Int2IntOpenHashMap();
public InventoryStateIds() {
// Inventory ids are unsigned bytes, so this is safe to do
ids.defaultReturnValue(Integer.MAX_VALUE);
}
public void setStateId(short containerId, int id) {
public void setStateId(int containerId, int id) {
ids.put(containerId, id);
}
public int removeStateId(short containerId) {
public int removeStateId(int containerId) {
return ids.remove(containerId);
}
}
@@ -21,7 +21,7 @@ import com.viaversion.viabackwards.ViaBackwards;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.data.BackwardsMappingData;
import com.viaversion.viabackwards.api.rewriters.SoundRewriter;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
import com.viaversion.viabackwards.protocol.v1_17to1_16_4.rewriter.BlockItemPacketRewriter1_17;
import com.viaversion.viabackwards.protocol.v1_17to1_16_4.rewriter.EntityPacketRewriter1_17;
import com.viaversion.viabackwards.protocol.v1_17to1_16_4.storage.PlayerLastCursorItem;
@@ -40,7 +40,7 @@ import com.viaversion.viaversion.protocols.v1_16_1to1_16_2.packet.ServerboundPac
import com.viaversion.viaversion.protocols.v1_16_4to1_17.Protocol1_16_4To1_17;
import com.viaversion.viaversion.protocols.v1_16_4to1_17.packet.ClientboundPackets1_17;
import com.viaversion.viaversion.protocols.v1_16_4to1_17.packet.ServerboundPackets1_17;
import com.viaversion.viaversion.rewriter.ComponentRewriter;
import com.viaversion.viaversion.rewriter.text.ComponentRewriterBase;
import com.viaversion.viaversion.rewriter.IdRewriteFunction;
import com.viaversion.viaversion.rewriter.ParticleRewriter;
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
@@ -59,7 +59,7 @@ public final class Protocol1_17To1_16_4 extends BackwardsProtocol<ClientboundPac
private final EntityPacketRewriter1_17 entityRewriter = new EntityPacketRewriter1_17(this);
private final BlockItemPacketRewriter1_17 blockItemPackets = new BlockItemPacketRewriter1_17(this);
private final ParticleRewriter<ClientboundPackets1_17> particleRewriter = new ParticleRewriter<>(this);
private final TranslatableRewriter<ClientboundPackets1_17> translatableRewriter = new TranslatableRewriter<>(this, ComponentRewriter.ReadType.JSON);
private final JsonNBTComponentRewriter<ClientboundPackets1_17> translatableRewriter = new JsonNBTComponentRewriter<>(this, ComponentRewriterBase.ReadType.JSON);
private final TagRewriter<ClientboundPackets1_17> tagRewriter = new TagRewriter<>(this);
public Protocol1_17To1_16_4() {
@@ -74,7 +74,7 @@ public final class Protocol1_17To1_16_4 extends BackwardsProtocol<ClientboundPac
translatableRewriter.registerBossEvent(ClientboundPackets1_17.BOSS_EVENT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_17.DISCONNECT);
translatableRewriter.registerTabList(ClientboundPackets1_17.TAB_LIST);
translatableRewriter.registerOpenScreen(ClientboundPackets1_17.OPEN_SCREEN);
translatableRewriter.registerOpenScreen1_14(ClientboundPackets1_17.OPEN_SCREEN);
translatableRewriter.registerPing();
SoundRewriter<ClientboundPackets1_17> soundRewriter = new SoundRewriter<>(this);
@@ -229,7 +229,7 @@ public final class Protocol1_17To1_16_4 extends BackwardsProtocol<ClientboundPac
}
@Override
public TranslatableRewriter<ClientboundPackets1_17> getComponentRewriter() {
public JsonNBTComponentRewriter<ClientboundPackets1_17> getComponentRewriter() {
return translatableRewriter;
}
@@ -90,7 +90,7 @@ public final class BlockItemPacketRewriter1_17 extends BackwardsItemRewriter<Cli
protocol.registerServerbound(ServerboundPackets1_16_2.CONTAINER_CLICK, new PacketHandlers() {
@Override
public void register() {
map(Types.UNSIGNED_BYTE);
map(Types.BYTE);
handler(wrapper -> {
short slot = wrapper.passthrough(Types.SHORT); // Slot
byte button = wrapper.passthrough(Types.BYTE); // Button
@@ -138,7 +138,7 @@ public final class BlockItemPacketRewriter1_17 extends BackwardsItemRewriter<Cli
});
protocol.registerClientbound(ClientboundPackets1_17.CONTAINER_SET_SLOT, wrapper -> {
short windowId = wrapper.passthrough(Types.UNSIGNED_BYTE);
byte windowId = wrapper.passthrough(Types.BYTE);
short slot = wrapper.passthrough(Types.SHORT);
Item carried = wrapper.read(Types.ITEM1_13_2);
@@ -163,7 +163,7 @@ public final class BlockItemPacketRewriter1_17 extends BackwardsItemRewriter<Cli
}
// Handle ping packet replacement
short inventoryId = wrapper.read(Types.UNSIGNED_BYTE);
byte inventoryId = wrapper.read(Types.BYTE);
short confirmationId = wrapper.read(Types.SHORT);
boolean accepted = wrapper.read(Types.BOOLEAN);
if (inventoryId == 0 && accepted) {
@@ -422,12 +422,15 @@ public final class BlockItemPacketRewriter1_17 extends BackwardsItemRewriter<Cli
handler(wrapper -> wrapper.write(Types.BOOLEAN, true)); // Tracking position
map(Types.BOOLEAN); // Locked
handler(wrapper -> {
boolean hasMarkers = wrapper.read(Types.BOOLEAN);
if (!hasMarkers) {
wrapper.write(Types.VAR_INT, 0); // Array size
final int iconCount;
final boolean hasMarkers = wrapper.read(Types.BOOLEAN);
if (hasMarkers) {
iconCount = wrapper.passthrough(Types.VAR_INT);
} else {
MapColorRewriter.getRewriteHandler(MapColorMappings1_16_4::getMappedColor).handle(wrapper);
wrapper.write(Types.VAR_INT, 0); // Add icon count
iconCount = 0;
}
MapColorRewriter.rewriteMapColors(wrapper, MapColorMappings1_16_4::getMappedColor, iconCount);
});
}
});
@@ -214,6 +214,8 @@ public final class EntityPacketRewriter1_17 extends EntityRewriter<ClientboundPa
filter().type(EntityTypes1_17.SHULKER).addIndex(17); // TODO Handle attachment pos?
registerBlockStateHandler(EntityTypes1_17.ABSTRACT_MINECART, 11);
filter().removeIndex(7); // Ticks frozen
}
@@ -19,7 +19,7 @@ package com.viaversion.viabackwards.protocol.v1_18to1_17_1;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.rewriters.SoundRewriter;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
import com.viaversion.viabackwards.protocol.v1_18to1_17_1.data.BackwardsMappingData1_18;
import com.viaversion.viabackwards.protocol.v1_18to1_17_1.rewriter.BlockItemPacketRewriter1_18;
import com.viaversion.viabackwards.protocol.v1_18to1_17_1.rewriter.EntityPacketRewriter1_18;
@@ -33,7 +33,7 @@ import com.viaversion.viaversion.data.entity.EntityTrackerBase;
import com.viaversion.viaversion.protocols.v1_16_4to1_17.packet.ServerboundPackets1_17;
import com.viaversion.viaversion.protocols.v1_17_1to1_18.packet.ClientboundPackets1_18;
import com.viaversion.viaversion.protocols.v1_17to1_17_1.packet.ClientboundPackets1_17_1;
import com.viaversion.viaversion.rewriter.ComponentRewriter;
import com.viaversion.viaversion.rewriter.text.ComponentRewriterBase;
import com.viaversion.viaversion.rewriter.ParticleRewriter;
import com.viaversion.viaversion.rewriter.TagRewriter;
@@ -43,7 +43,7 @@ public final class Protocol1_18To1_17_1 extends BackwardsProtocol<ClientboundPac
private final EntityPacketRewriter1_18 entityRewriter = new EntityPacketRewriter1_18(this);
private final BlockItemPacketRewriter1_18 itemRewriter = new BlockItemPacketRewriter1_18(this);
private final ParticleRewriter<ClientboundPackets1_18> particleRewriter = new ParticleRewriter<>(this);
private final TranslatableRewriter<ClientboundPackets1_18> translatableRewriter = new TranslatableRewriter<>(this, ComponentRewriter.ReadType.JSON);
private final JsonNBTComponentRewriter<ClientboundPackets1_18> translatableRewriter = new JsonNBTComponentRewriter<>(this, ComponentRewriterBase.ReadType.JSON);
private final TagRewriter<ClientboundPackets1_18> tagRewriter = new TagRewriter<>(this);
public Protocol1_18To1_17_1() {
@@ -61,7 +61,7 @@ public final class Protocol1_18To1_17_1 extends BackwardsProtocol<ClientboundPac
translatableRewriter.registerBossEvent(ClientboundPackets1_18.BOSS_EVENT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_18.DISCONNECT);
translatableRewriter.registerTabList(ClientboundPackets1_18.TAB_LIST);
translatableRewriter.registerOpenScreen(ClientboundPackets1_18.OPEN_SCREEN);
translatableRewriter.registerOpenScreen1_14(ClientboundPackets1_18.OPEN_SCREEN);
translatableRewriter.registerPlayerCombatKill(ClientboundPackets1_18.PLAYER_COMBAT_KILL);
translatableRewriter.registerPing();
@@ -158,7 +158,7 @@ public final class Protocol1_18To1_17_1 extends BackwardsProtocol<ClientboundPac
}
@Override
public TranslatableRewriter<ClientboundPackets1_18> getComponentRewriter() {
public JsonNBTComponentRewriter<ClientboundPackets1_18> getComponentRewriter() {
return translatableRewriter;
}
@@ -17,9 +17,8 @@
*/
package com.viaversion.viabackwards.protocol.v1_19_1to1_19;
import com.viaversion.viabackwards.ViaBackwards;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
import com.viaversion.viabackwards.protocol.v1_19_1to1_19.rewriter.EntityPacketRewriter1_19_1;
import com.viaversion.viabackwards.protocol.v1_19_1to1_19.storage.ChatRegistryStorage;
import com.viaversion.viabackwards.protocol.v1_19_1to1_19.storage.ChatRegistryStorage1_19_1;
@@ -38,7 +37,6 @@ import com.viaversion.viaversion.api.protocol.Protocol;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.protocol.packet.State;
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
import com.viaversion.viaversion.libs.gson.JsonElement;
@@ -53,7 +51,7 @@ import com.viaversion.viaversion.protocols.v1_19to1_19_1.Protocol1_19To1_19_1;
import com.viaversion.viaversion.protocols.v1_19to1_19_1.packet.ClientboundPackets1_19_1;
import com.viaversion.viaversion.protocols.v1_19to1_19_1.packet.ServerboundPackets1_19_1;
import com.viaversion.viaversion.protocols.v1_18_2to1_19.Protocol1_18_2To1_19;
import com.viaversion.viaversion.rewriter.ComponentRewriter;
import com.viaversion.viaversion.rewriter.text.ComponentRewriterBase;
import com.viaversion.viaversion.util.CipherUtil;
import com.viaversion.viaversion.util.ComponentUtil;
import com.viaversion.viaversion.util.Pair;
@@ -70,7 +68,7 @@ public final class Protocol1_19_1To1_19 extends BackwardsProtocol<ClientboundPac
private static final UUID ZERO_UUID = new UUID(0, 0);
private static final byte[] EMPTY_BYTES = new byte[0];
private final EntityPacketRewriter1_19_1 entityRewriter = new EntityPacketRewriter1_19_1(this);
private final TranslatableRewriter<ClientboundPackets1_19_1> translatableRewriter = new TranslatableRewriter<>(this, ComponentRewriter.ReadType.JSON);
private final JsonNBTComponentRewriter<ClientboundPackets1_19_1> translatableRewriter = new JsonNBTComponentRewriter<>(this, ComponentRewriterBase.ReadType.JSON);
public Protocol1_19_1To1_19() {
super(ClientboundPackets1_19_1.class, ClientboundPackets1_19.class, ServerboundPackets1_19_1.class, ServerboundPackets1_19.class);
@@ -84,7 +82,7 @@ public final class Protocol1_19_1To1_19 extends BackwardsProtocol<ClientboundPac
translatableRewriter.registerBossEvent(ClientboundPackets1_19_1.BOSS_EVENT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_19_1.DISCONNECT);
translatableRewriter.registerTabList(ClientboundPackets1_19_1.TAB_LIST);
translatableRewriter.registerOpenScreen(ClientboundPackets1_19_1.OPEN_SCREEN);
translatableRewriter.registerOpenScreen1_14(ClientboundPackets1_19_1.OPEN_SCREEN);
translatableRewriter.registerPlayerCombatKill(ClientboundPackets1_19_1.PLAYER_COMBAT_KILL);
translatableRewriter.registerPing();
@@ -395,7 +393,7 @@ public final class Protocol1_19_1To1_19 extends BackwardsProtocol<ClientboundPac
}
@Override
public TranslatableRewriter<ClientboundPackets1_19_1> getComponentRewriter() {
public JsonNBTComponentRewriter<ClientboundPackets1_19_1> getComponentRewriter() {
return translatableRewriter;
}
@@ -20,7 +20,7 @@ package com.viaversion.viabackwards.protocol.v1_19_3to1_19_1;
import com.google.common.base.Preconditions;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.rewriters.SoundRewriter;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
import com.viaversion.viabackwards.protocol.v1_19_1to1_19.Protocol1_19_1To1_19;
import com.viaversion.viabackwards.protocol.v1_19_3to1_19_1.data.BackwardsMappingData1_19_3;
import com.viaversion.viabackwards.protocol.v1_19_3to1_19_1.rewriter.BlockItemPacketRewriter1_19_3;
@@ -54,7 +54,7 @@ import com.viaversion.viaversion.protocols.v1_19_1to1_19_3.packet.ServerboundPac
import com.viaversion.viaversion.protocols.v1_19to1_19_1.packet.ClientboundPackets1_19_1;
import com.viaversion.viaversion.protocols.v1_19to1_19_1.packet.ServerboundPackets1_19_1;
import com.viaversion.viaversion.rewriter.CommandRewriter;
import com.viaversion.viaversion.rewriter.ComponentRewriter;
import com.viaversion.viaversion.rewriter.text.ComponentRewriterBase;
import com.viaversion.viaversion.rewriter.ParticleRewriter;
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
import com.viaversion.viaversion.rewriter.TagRewriter;
@@ -74,7 +74,7 @@ public final class Protocol1_19_3To1_19_1 extends BackwardsProtocol<ClientboundP
private final EntityPacketRewriter1_19_3 entityRewriter = new EntityPacketRewriter1_19_3(this);
private final BlockItemPacketRewriter1_19_3 itemRewriter = new BlockItemPacketRewriter1_19_3(this);
private final ParticleRewriter<ClientboundPackets1_19_3> particleRewriter = new ParticleRewriter<>(this);
private final TranslatableRewriter<ClientboundPackets1_19_3> translatableRewriter = new TranslatableRewriter<>(this, ComponentRewriter.ReadType.JSON);
private final JsonNBTComponentRewriter<ClientboundPackets1_19_3> translatableRewriter = new JsonNBTComponentRewriter<>(this, ComponentRewriterBase.ReadType.JSON);
private final TagRewriter<ClientboundPackets1_19_3> tagRewriter = new TagRewriter<>(this);
public Protocol1_19_3To1_19_1() {
@@ -92,7 +92,7 @@ public final class Protocol1_19_3To1_19_1 extends BackwardsProtocol<ClientboundP
translatableRewriter.registerBossEvent(ClientboundPackets1_19_3.BOSS_EVENT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_19_3.DISCONNECT);
translatableRewriter.registerTabList(ClientboundPackets1_19_3.TAB_LIST);
translatableRewriter.registerOpenScreen(ClientboundPackets1_19_3.OPEN_SCREEN);
translatableRewriter.registerOpenScreen1_14(ClientboundPackets1_19_3.OPEN_SCREEN);
translatableRewriter.registerPlayerCombatKill(ClientboundPackets1_19_3.PLAYER_COMBAT_KILL);
translatableRewriter.registerPing();
@@ -406,7 +406,7 @@ public final class Protocol1_19_3To1_19_1 extends BackwardsProtocol<ClientboundP
}
@Override
public TranslatableRewriter<ClientboundPackets1_19_3> getComponentRewriter() {
public JsonNBTComponentRewriter<ClientboundPackets1_19_3> getComponentRewriter() {
return translatableRewriter;
}
@@ -20,7 +20,7 @@ package com.viaversion.viabackwards.protocol.v1_19_4to1_19_3;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.data.BackwardsMappingData;
import com.viaversion.viabackwards.api.rewriters.SoundRewriter;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
import com.viaversion.viabackwards.protocol.v1_19_4to1_19_3.rewriter.BlockItemPacketRewriter1_19_4;
import com.viaversion.viabackwards.protocol.v1_19_4to1_19_3.rewriter.EntityPacketRewriter1_19_4;
import com.viaversion.viabackwards.protocol.v1_19_4to1_19_3.storage.EntityTracker1_19_4;
@@ -34,7 +34,7 @@ import com.viaversion.viaversion.protocols.v1_19_3to1_19_4.Protocol1_19_3To1_19_
import com.viaversion.viaversion.protocols.v1_19_3to1_19_4.packet.ClientboundPackets1_19_4;
import com.viaversion.viaversion.protocols.v1_19_3to1_19_4.packet.ServerboundPackets1_19_4;
import com.viaversion.viaversion.rewriter.CommandRewriter;
import com.viaversion.viaversion.rewriter.ComponentRewriter;
import com.viaversion.viaversion.rewriter.text.ComponentRewriterBase;
import com.viaversion.viaversion.rewriter.ParticleRewriter;
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
import com.viaversion.viaversion.rewriter.TagRewriter;
@@ -47,7 +47,7 @@ public final class Protocol1_19_4To1_19_3 extends BackwardsProtocol<ClientboundP
private final EntityPacketRewriter1_19_4 entityRewriter = new EntityPacketRewriter1_19_4(this);
private final BlockItemPacketRewriter1_19_4 itemRewriter = new BlockItemPacketRewriter1_19_4(this);
private final ParticleRewriter<ClientboundPackets1_19_4> particleRewriter = new ParticleRewriter<>(this);
private final TranslatableRewriter<ClientboundPackets1_19_4> translatableRewriter = new TranslatableRewriter<>(this, ComponentRewriter.ReadType.JSON);
private final JsonNBTComponentRewriter<ClientboundPackets1_19_4> translatableRewriter = new JsonNBTComponentRewriter<>(this, ComponentRewriterBase.ReadType.JSON);
private final TagRewriter<ClientboundPackets1_19_4> tagRewriter = new TagRewriter<>(this);
public Protocol1_19_4To1_19_3() {
@@ -137,7 +137,7 @@ public final class Protocol1_19_4To1_19_3 extends BackwardsProtocol<ClientboundP
}
@Override
public TranslatableRewriter<ClientboundPackets1_19_4> getComponentRewriter() {
public JsonNBTComponentRewriter<ClientboundPackets1_19_4> getComponentRewriter() {
return translatableRewriter;
}
@@ -220,6 +220,7 @@ public final class EntityPacketRewriter1_19_4 extends EntityRewriter<Clientbound
filter().handler((event, data) -> {
int id = data.dataType().typeId();
if (id >= 25) { // Sniffer state, Vector3f, Quaternion types
event.cancel();
return;
} else if (id >= 15) { // Optional block state - just map down to block state
id--;
@@ -21,7 +21,7 @@ import com.google.common.primitives.Longs;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.rewriters.SoundRewriter;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
import com.viaversion.viabackwards.protocol.v1_19_1to1_19.Protocol1_19_1To1_19;
import com.viaversion.viabackwards.protocol.v1_19to1_18_2.data.BackwardsMappingData1_19;
import com.viaversion.viabackwards.protocol.v1_19to1_18_2.rewriter.BlockItemPacketRewriter1_19;
@@ -50,7 +50,7 @@ import com.viaversion.viaversion.protocols.v1_18_2to1_19.packet.ServerboundPacke
import com.viaversion.viaversion.protocols.v1_19to1_19_1.Protocol1_19To1_19_1;
import com.viaversion.viaversion.protocols.v1_19to1_19_1.data.ChatDecorationResult;
import com.viaversion.viaversion.rewriter.CommandRewriter;
import com.viaversion.viaversion.rewriter.ComponentRewriter;
import com.viaversion.viaversion.rewriter.text.ComponentRewriterBase;
import com.viaversion.viaversion.rewriter.ParticleRewriter;
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
import com.viaversion.viaversion.rewriter.TagRewriter;
@@ -69,7 +69,7 @@ public final class Protocol1_19To1_18_2 extends BackwardsProtocol<ClientboundPac
private final EntityPacketRewriter1_19 entityRewriter = new EntityPacketRewriter1_19(this);
private final BlockItemPacketRewriter1_19 blockItemPackets = new BlockItemPacketRewriter1_19(this);
private final ParticleRewriter<ClientboundPackets1_19> particleRewriter = new ParticleRewriter<>(this);
private final TranslatableRewriter<ClientboundPackets1_19> translatableRewriter = new TranslatableRewriter<>(this, ComponentRewriter.ReadType.JSON);
private final JsonNBTComponentRewriter<ClientboundPackets1_19> translatableRewriter = new JsonNBTComponentRewriter<>(this, ComponentRewriterBase.ReadType.JSON);
private final TagRewriter<ClientboundPackets1_19> tagRewriter = new TagRewriter<>(this);
public Protocol1_19To1_18_2() {
@@ -86,7 +86,7 @@ public final class Protocol1_19To1_18_2 extends BackwardsProtocol<ClientboundPac
translatableRewriter.registerBossEvent(ClientboundPackets1_19.BOSS_EVENT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_19.DISCONNECT);
translatableRewriter.registerTabList(ClientboundPackets1_19.TAB_LIST);
translatableRewriter.registerOpenScreen(ClientboundPackets1_19.OPEN_SCREEN);
translatableRewriter.registerOpenScreen1_14(ClientboundPackets1_19.OPEN_SCREEN);
translatableRewriter.registerPlayerCombatKill(ClientboundPackets1_19.PLAYER_COMBAT_KILL);
translatableRewriter.registerPing();
@@ -372,7 +372,7 @@ public final class Protocol1_19To1_18_2 extends BackwardsProtocol<ClientboundPac
}
@Override
public TranslatableRewriter<ClientboundPackets1_19> getComponentRewriter() {
public JsonNBTComponentRewriter<ClientboundPackets1_19> getComponentRewriter() {
return translatableRewriter;
}
@@ -198,7 +198,7 @@ public final class EntityPacketRewriter1_20_2 extends EntityRewriter<Clientbound
@Override
protected void registerRewrites() {
filter().handler((event, data) -> data.setDataType(Types1_20.ENTITY_DATA_TYPES.byId(data.dataType().typeId())));
filter().mapDataType(Types1_20.ENTITY_DATA_TYPES::byId);
registerEntityDataTypeHandler(Types1_20.ENTITY_DATA_TYPES.itemType, Types1_20.ENTITY_DATA_TYPES.blockStateType, Types1_20.ENTITY_DATA_TYPES.optionalBlockStateType, Types1_20.ENTITY_DATA_TYPES.particleType, null, null);
registerBlockStateHandler(EntityTypes1_19_4.ABSTRACT_MINECART, 11);
@@ -21,7 +21,7 @@ import com.viaversion.nbt.tag.Tag;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.data.BackwardsMappingData;
import com.viaversion.viabackwards.api.rewriters.SoundRewriter;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
import com.viaversion.viabackwards.protocol.v1_20_3to1_20_2.rewriter.BlockItemPacketRewriter1_20_3;
import com.viaversion.viabackwards.protocol.v1_20_3to1_20_2.rewriter.EntityPacketRewriter1_20_3;
import com.viaversion.viabackwards.protocol.v1_20_3to1_20_2.storage.ResourcepackIDStorage;
@@ -50,10 +50,10 @@ import com.viaversion.viaversion.protocols.v1_20to1_20_2.packet.ClientboundPacke
import com.viaversion.viaversion.protocols.v1_20to1_20_2.packet.ServerboundConfigurationPackets1_20_2;
import com.viaversion.viaversion.protocols.v1_20to1_20_2.packet.ServerboundPacket1_20_2;
import com.viaversion.viaversion.protocols.v1_20to1_20_2.packet.ServerboundPackets1_20_2;
import com.viaversion.viaversion.rewriter.ComponentRewriter.ReadType;
import com.viaversion.viaversion.rewriter.ParticleRewriter;
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
import com.viaversion.viaversion.rewriter.TagRewriter;
import com.viaversion.viaversion.rewriter.text.ComponentRewriterBase;
import com.viaversion.viaversion.util.ComponentUtil;
import java.util.BitSet;
import java.util.UUID;
@@ -66,7 +66,7 @@ public final class Protocol1_20_3To1_20_2 extends BackwardsProtocol<ClientboundP
private final EntityPacketRewriter1_20_3 entityRewriter = new EntityPacketRewriter1_20_3(this);
private final BlockItemPacketRewriter1_20_3 itemRewriter = new BlockItemPacketRewriter1_20_3(this);
private final ParticleRewriter<ClientboundPacket1_20_3> particleRewriter = new ParticleRewriter<>(this);
private final TranslatableRewriter<ClientboundPacket1_20_3> translatableRewriter = new TranslatableRewriter<>(this, ReadType.NBT);
private final JsonNBTComponentRewriter<ClientboundPacket1_20_3> translatableRewriter = new JsonNBTComponentRewriter<>(this, ComponentRewriterBase.ReadType.NBT);
private final TagRewriter<ClientboundPacket1_20_3> tagRewriter = new TagRewriter<>(this);
public Protocol1_20_3To1_20_2() {
@@ -405,7 +405,7 @@ public final class Protocol1_20_3To1_20_2 extends BackwardsProtocol<ClientboundP
}
@Override
public TranslatableRewriter<ClientboundPacket1_20_3> getComponentRewriter() {
public JsonNBTComponentRewriter<ClientboundPacket1_20_3> getComponentRewriter() {
return translatableRewriter;
}
@@ -17,12 +17,14 @@
*/
package com.viaversion.viabackwards.protocol.v1_20_5to1_20_3;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.data.BackwardsMappingData;
import com.viaversion.viabackwards.api.rewriters.SoundRewriter;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
import com.viaversion.viabackwards.protocol.v1_20_5to1_20_3.provider.TransferProvider;
import com.viaversion.viabackwards.protocol.v1_20_5to1_20_3.rewriter.BlockItemPacketRewriter1_20_5;
import com.viaversion.viabackwards.protocol.v1_20_5to1_20_3.rewriter.ComponentRewriter1_20_5;
import com.viaversion.viabackwards.protocol.v1_20_5to1_20_3.rewriter.EntityPacketRewriter1_20_5;
import com.viaversion.viabackwards.protocol.v1_20_5to1_20_3.storage.CookieStorage;
import com.viaversion.viabackwards.protocol.v1_20_5to1_20_3.storage.RegistryDataStorage;
@@ -57,7 +59,6 @@ import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ServerboundPac
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;
import com.viaversion.viaversion.rewriter.ParticleRewriter;
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
import com.viaversion.viaversion.rewriter.TagRewriter;
@@ -70,7 +71,7 @@ public final class Protocol1_20_5To1_20_3 extends BackwardsProtocol<ClientboundP
private final EntityPacketRewriter1_20_5 entityRewriter = new EntityPacketRewriter1_20_5(this);
private final BlockItemPacketRewriter1_20_5 itemRewriter = new BlockItemPacketRewriter1_20_5(this);
private final ParticleRewriter<ClientboundPacket1_20_5> particleRewriter = new ParticleRewriter<>(this);
private final TranslatableRewriter<ClientboundPacket1_20_5> translatableRewriter = new TranslatableRewriter<>(this, ReadType.NBT);
private final JsonNBTComponentRewriter<ClientboundPacket1_20_5> translatableRewriter = new ComponentRewriter1_20_5(this);
private final TagRewriter<ClientboundPacket1_20_5> tagRewriter = new TagRewriter<>(this);
public Protocol1_20_5To1_20_3() {
@@ -180,9 +181,11 @@ public final class Protocol1_20_5To1_20_3 extends BackwardsProtocol<ClientboundP
private void sendRegistryData(final UserConnection connection) {
final RegistryDataStorage registryDataStorage = connection.get(RegistryDataStorage.class);
if (!registryDataStorage.sentRegistryData()) {
final CompoundTag registryData = registryDataStorage.registryData();
if (!registryDataStorage.sentRegistryData() && !registryData.isEmpty()) {
final PacketWrapper registryDataPacket = PacketWrapper.create(ClientboundConfigurationPackets1_20_3.REGISTRY_DATA, connection);
registryDataPacket.write(Types.COMPOUND_TAG, registryDataStorage.registryData().copy());
registryDataPacket.write(Types.COMPOUND_TAG, registryData.copy());
registryDataPacket.send(Protocol1_20_5To1_20_3.class);
registryDataStorage.setSentRegistryData();
}
@@ -255,7 +258,7 @@ public final class Protocol1_20_5To1_20_3 extends BackwardsProtocol<ClientboundP
}
@Override
public TranslatableRewriter<ClientboundPacket1_20_5> getComponentRewriter() {
public JsonNBTComponentRewriter<ClientboundPacket1_20_5> getComponentRewriter() {
return translatableRewriter;
}
@@ -0,0 +1,85 @@
/*
* 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_20_5to1_20_3.rewriter;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.nbt.tag.StringTag;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.data.StructuredData;
import com.viaversion.viaversion.api.minecraft.data.StructuredDataContainer;
import com.viaversion.viaversion.api.minecraft.item.Item;
import com.viaversion.viaversion.api.minecraft.item.StructuredItem;
import com.viaversion.viaversion.api.type.types.version.Types1_20_5;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ClientboundPacket1_20_5;
import com.viaversion.viaversion.util.ComponentUtil;
import com.viaversion.viaversion.util.SerializerVersion;
import java.util.List;
import org.checkerframework.checker.nullness.qual.Nullable;
public final class ComponentRewriter1_20_5 extends JsonNBTComponentRewriter<ClientboundPacket1_20_5> {
private final com.viaversion.viaversion.protocols.v1_20_3to1_20_5.rewriter.ComponentRewriter1_20_5<ClientboundPacket1_20_5> vvRewriter;
public ComponentRewriter1_20_5(final BackwardsProtocol<ClientboundPacket1_20_5, ?, ?, ?> protocol) {
super(protocol, ReadType.NBT);
vvRewriter = new com.viaversion.viaversion.protocols.v1_20_3to1_20_5.rewriter.ComponentRewriter1_20_5<>(protocol, Types1_20_5.STRUCTURED_DATA);
}
@Override
protected void handleShowItem(final UserConnection connection, final CompoundTag itemTag, @Nullable final CompoundTag componentsTag) {
super.handleShowItem(connection, itemTag, componentsTag);
if (componentsTag == null) {
return;
}
final StringTag idTag = itemTag.getStringTag("id");
if (idTag == null) {
return;
}
final List<StructuredData<?>> data = vvRewriter.toData(connection, componentsTag);
if (data.isEmpty()) {
return;
}
final int identifier = this.protocol.getMappingData().getFullItemMappings().id(idTag.getValue());
final StructuredItem structuredItem = new StructuredItem(identifier, 1, new StructuredDataContainer(data.toArray(StructuredData[]::new)));
final Item dataItem = protocol.getItemRewriter().handleItemToClient(connection, structuredItem);
if (dataItem.tag() == null) {
return;
}
itemTag.remove("components");
final StringTag tag = new StringTag(outputSerializerVersion().toSNBT(dataItem.tag()));
itemTag.put("tag", ComponentUtil.trimStrings(tag));
}
@Override
protected SerializerVersion inputSerializerVersion() {
return SerializerVersion.V1_20_5;
}
@Override
protected SerializerVersion outputSerializerVersion() {
return SerializerVersion.V1_20_3;
}
}
@@ -419,6 +419,9 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter<Clientbound
}
data.setTypeAndValue(Types1_20_3.ENTITY_DATA_TYPES.varIntType, removeAlpha(color));
return;
} else if (typeId == Types1_20_5.ENTITY_DATA_TYPES.armadilloState.typeId() || typeId == Types1_20_5.ENTITY_DATA_TYPES.wolfVariantType.typeId()) {
event.cancel();
return;
}
int id = typeId;
@@ -19,7 +19,7 @@ package com.viaversion.viabackwards.protocol.v1_20to1_19_4;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.rewriters.SoundRewriter;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
import com.viaversion.viabackwards.protocol.v1_20to1_19_4.data.BackwardsMappingData1_20;
import com.viaversion.viabackwards.protocol.v1_20to1_19_4.rewriter.BlockItemPacketRewriter1_20;
import com.viaversion.viabackwards.protocol.v1_20to1_19_4.rewriter.EntityPacketRewriter1_20;
@@ -30,7 +30,7 @@ import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
import com.viaversion.viaversion.protocols.v1_19_3to1_19_4.packet.ClientboundPackets1_19_4;
import com.viaversion.viaversion.protocols.v1_19_3to1_19_4.packet.ServerboundPackets1_19_4;
import com.viaversion.viaversion.rewriter.ComponentRewriter;
import com.viaversion.viaversion.rewriter.text.ComponentRewriterBase;
import com.viaversion.viaversion.rewriter.ParticleRewriter;
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
import com.viaversion.viaversion.rewriter.TagRewriter;
@@ -39,7 +39,7 @@ import com.viaversion.viaversion.util.ArrayUtil;
public final class Protocol1_20To1_19_4 extends BackwardsProtocol<ClientboundPackets1_19_4, ClientboundPackets1_19_4, ServerboundPackets1_19_4, ServerboundPackets1_19_4> {
public static final BackwardsMappingData1_20 MAPPINGS = new BackwardsMappingData1_20();
private final TranslatableRewriter<ClientboundPackets1_19_4> translatableRewriter = new TranslatableRewriter<>(this, ComponentRewriter.ReadType.JSON);
private final JsonNBTComponentRewriter<ClientboundPackets1_19_4> translatableRewriter = new JsonNBTComponentRewriter<>(this, ComponentRewriterBase.ReadType.JSON);
private final EntityPacketRewriter1_20 entityRewriter = new EntityPacketRewriter1_20(this);
private final BlockItemPacketRewriter1_20 itemRewriter = new BlockItemPacketRewriter1_20(this);
private final ParticleRewriter<ClientboundPackets1_19_4> particleRewriter = new ParticleRewriter<>(this);
@@ -117,7 +117,7 @@ public final class Protocol1_20To1_19_4 extends BackwardsProtocol<ClientboundPac
}
@Override
public TranslatableRewriter<ClientboundPackets1_19_4> getComponentRewriter() {
public JsonNBTComponentRewriter<ClientboundPackets1_19_4> getComponentRewriter() {
return translatableRewriter;
}
@@ -122,7 +122,7 @@ public final class EntityPacketRewriter1_20 extends EntityRewriter<ClientboundPa
@Override
protected void registerRewrites() {
filter().handler((event, data) -> data.setDataType(Types1_19_4.ENTITY_DATA_TYPES.byId(data.dataType().typeId())));
filter().mapDataType(Types1_19_4.ENTITY_DATA_TYPES::byId);
registerEntityDataTypeHandler(Types1_19_4.ENTITY_DATA_TYPES.itemType, Types1_19_4.ENTITY_DATA_TYPES.blockStateType, Types1_19_4.ENTITY_DATA_TYPES.optionalBlockStateType,
Types1_19_4.ENTITY_DATA_TYPES.particleType, Types1_19_4.ENTITY_DATA_TYPES.componentType, Types1_19_4.ENTITY_DATA_TYPES.optionalComponentType);
registerBlockStateHandler(EntityTypes1_19_4.ABSTRACT_MINECART, 11);
@@ -20,7 +20,7 @@ package com.viaversion.viabackwards.protocol.v1_21_2to1_21;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.data.BackwardsMappingData;
import com.viaversion.viabackwards.api.rewriters.SoundRewriter;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.rewriter.BlockItemPacketRewriter1_21_2;
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.rewriter.ComponentRewriter1_21_2;
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.rewriter.EntityPacketRewriter1_21_2;
@@ -62,7 +62,7 @@ public final class Protocol1_21_2To1_21 extends BackwardsProtocol<ClientboundPac
private final EntityPacketRewriter1_21_2 entityRewriter = new EntityPacketRewriter1_21_2(this);
private final BlockItemPacketRewriter1_21_2 itemRewriter = new BlockItemPacketRewriter1_21_2(this);
private final ParticleRewriter1_21_2 particleRewriter = new ParticleRewriter1_21_2(this);
private final TranslatableRewriter<ClientboundPacket1_21_2> translatableRewriter = new ComponentRewriter1_21_2(this);
private final JsonNBTComponentRewriter<ClientboundPacket1_21_2> translatableRewriter = new ComponentRewriter1_21_2(this);
private final TagRewriter<ClientboundPacket1_21_2> tagRewriter = new TagRewriter<>(this);
public Protocol1_21_2To1_21() {
@@ -94,7 +94,7 @@ public final class Protocol1_21_2To1_21 extends BackwardsProtocol<ClientboundPac
translatableRewriter.registerTabList(ClientboundPackets1_21_2.TAB_LIST);
translatableRewriter.registerPlayerCombatKill1_20(ClientboundPackets1_21_2.PLAYER_COMBAT_KILL);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_2.SYSTEM_CHAT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_2.DISGUISED_CHAT);
translatableRewriter.registerDisguisedChat(ClientboundPackets1_21_2.DISGUISED_CHAT);
translatableRewriter.registerPing();
registerServerbound(ServerboundPackets1_20_5.CLIENT_INFORMATION, this::clientInformation);
@@ -185,7 +185,7 @@ public final class Protocol1_21_2To1_21 extends BackwardsProtocol<ClientboundPac
}
@Override
public TranslatableRewriter<ClientboundPacket1_21_2> getComponentRewriter() {
public JsonNBTComponentRewriter<ClientboundPacket1_21_2> getComponentRewriter() {
return translatableRewriter;
}
@@ -100,7 +100,7 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsStructuredItem
});
protocol.registerClientbound(ClientboundPackets1_21_2.SET_CURSOR_ITEM, ClientboundPackets1_21.CONTAINER_SET_SLOT, wrapper -> {
wrapper.write(Types.UNSIGNED_BYTE, (short) -1); // Player inventory
wrapper.write(Types.BYTE, (byte) -1); // Player inventory
wrapper.write(Types.VAR_INT, wrapper.user().get(InventoryStateIdStorage.class).stateId()); // State id; re-use the last known one
wrapper.write(Types.SHORT, (short) -1); // Cursor
passthroughClientboundItem(wrapper);
@@ -119,7 +119,7 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsStructuredItem
});
protocol.registerClientbound(ClientboundPackets1_21_2.CONTAINER_SET_CONTENT, wrapper -> {
updateContainerId(wrapper);
varIntToUnsignedByte(wrapper);
final int stateId = wrapper.passthrough(Types.VAR_INT);
wrapper.user().get(InventoryStateIdStorage.class).setStateId(stateId);
@@ -132,7 +132,7 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsStructuredItem
passthroughClientboundItem(wrapper);
});
protocol.registerClientbound(ClientboundPackets1_21_2.CONTAINER_SET_SLOT, wrapper -> {
updateContainerId(wrapper);
varIntToByte(wrapper);
final int stateId = wrapper.passthrough(Types.VAR_INT);
wrapper.user().get(InventoryStateIdStorage.class).setStateId(stateId);
@@ -141,7 +141,7 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsStructuredItem
passthroughClientboundItem(wrapper);
});
protocol.registerClientbound(ClientboundPackets1_21_2.CONTAINER_SET_DATA, wrapper -> {
updateContainerId(wrapper);
varIntToUnsignedByte(wrapper);
if (wrapper.user().get(InventoryStateIdStorage.class).smithingTableOpen()) {
// Cancel new data for smithing table
@@ -149,17 +149,17 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsStructuredItem
}
});
protocol.registerClientbound(ClientboundPackets1_21_2.CONTAINER_CLOSE, wrapper -> {
updateContainerId(wrapper);
varIntToUnsignedByte(wrapper);
wrapper.user().get(InventoryStateIdStorage.class).setSmithingTableOpen(false);
});
protocol.registerClientbound(ClientboundPackets1_21_2.SET_HELD_SLOT, ClientboundPackets1_21.SET_CARRIED_ITEM);
protocol.registerClientbound(ClientboundPackets1_21_2.HORSE_SCREEN_OPEN, this::updateContainerId);
protocol.registerClientbound(ClientboundPackets1_21_2.HORSE_SCREEN_OPEN, this::varIntToUnsignedByte);
protocol.registerServerbound(ServerboundPackets1_20_5.CONTAINER_CLOSE, wrapper -> {
updateContainerIdServerbound(wrapper);
byteToVarInt(wrapper);
wrapper.user().get(InventoryStateIdStorage.class).setSmithingTableOpen(false);
});
protocol.registerServerbound(ServerboundPackets1_20_5.CONTAINER_CLICK, wrapper -> {
updateContainerIdServerbound(wrapper);
byteToVarInt(wrapper);
wrapper.passthrough(Types.VAR_INT); // State id
wrapper.passthrough(Types.SHORT); // Slot
wrapper.passthrough(Types.BYTE); // Button
@@ -167,9 +167,9 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsStructuredItem
final int length = Limit.max(wrapper.passthrough(Types.VAR_INT), 128);
for (int i = 0; i < length; i++) {
wrapper.passthrough(Types.SHORT); // Slot
passthroughServerboundItem(wrapper);
wrapper.write(itemType(), handleItemToServer(wrapper.user(), wrapper.read(mappedItemType())));
}
passthroughServerboundItem(wrapper);
wrapper.write(itemType(), handleItemToServer(wrapper.user(), wrapper.read(mappedItemType())));
});
protocol.registerServerbound(ServerboundPackets1_20_5.USE_ITEM_ON, wrapper -> {
@@ -184,7 +184,7 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsStructuredItem
});
protocol.registerClientbound(ClientboundPackets1_21_2.SET_PLAYER_INVENTORY, ClientboundPackets1_21.CONTAINER_SET_SLOT, wrapper -> {
wrapper.write(Types.UNSIGNED_BYTE, (short) -2); // Player inventory
wrapper.write(Types.BYTE, (byte) -2); // Player inventory
wrapper.write(Types.VAR_INT, 0); // 0 state id
final int slot = wrapper.read(Types.VAR_INT);
wrapper.write(Types.SHORT, (short) slot);
@@ -268,11 +268,11 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsStructuredItem
wrapper.cancel();
});
protocol.registerClientbound(ClientboundPackets1_21_2.PLACE_GHOST_RECIPE, wrapper -> {
this.updateContainerId(wrapper);
this.varIntToByte(wrapper);
wrapper.cancel(); // Full recipe display, this doesn't look mappable
});
protocol.registerServerbound(ServerboundPackets1_20_5.PLACE_RECIPE, wrapper -> {
this.updateContainerIdServerbound(wrapper);
this.byteToVarInt(wrapper);
final String recipe = Key.stripMinecraftNamespace(wrapper.read(Types.STRING));
wrapper.write(Types.VAR_INT, Integer.parseInt(recipe));
@@ -283,15 +283,19 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsStructuredItem
});
}
private void updateContainerId(final PacketWrapper wrapper) {
private void varIntToUnsignedByte(final PacketWrapper wrapper) {
final int containerId = wrapper.read(Types.VAR_INT);
wrapper.write(Types.UNSIGNED_BYTE, (short) containerId);
}
private void updateContainerIdServerbound(final PacketWrapper wrapper) {
final short containerId = wrapper.read(Types.UNSIGNED_BYTE);
final int intId = (byte) containerId;
wrapper.write(Types.VAR_INT, intId);
private void varIntToByte(final PacketWrapper wrapper) {
final int containerId = wrapper.read(Types.VAR_INT);
wrapper.write(Types.BYTE, (byte) containerId);
}
private void byteToVarInt(final PacketWrapper wrapper) {
final byte containerId = wrapper.read(Types.BYTE);
wrapper.write(Types.VAR_INT, (int) containerId);
}
@Override
@@ -356,7 +360,7 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsStructuredItem
backupTag.putString("item_model", itemModel);
}
final Equippable equippable = data.get(StructuredDataKey.EQUIPPABLE);
final Equippable equippable = data.get(StructuredDataKey.EQUIPPABLE1_21_2);
if (equippable != null) {
final CompoundTag tag = new CompoundTag();
@@ -553,7 +557,7 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsStructuredItem
final boolean dispensable = equippable.getBoolean("dispensable");
final boolean swappable = equippable.getBoolean("swappable");
final boolean damageOnHurt = equippable.getBoolean("damage_on_hurt");
data.set(StructuredDataKey.EQUIPPABLE, new Equippable(equipmentSlot, soundEvent, model, cameraOverlay, allowedEntities, dispensable, swappable, damageOnHurt));
data.set(StructuredDataKey.EQUIPPABLE1_21_2, new Equippable(equipmentSlot, soundEvent, model, cameraOverlay, allowedEntities, dispensable, swappable, damageOnHurt));
}
final ByteTag glider = backupTag.getByteTag("glider");
@@ -18,14 +18,16 @@
package com.viaversion.viabackwards.protocol.v1_21_2to1_21.rewriter;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.Protocol1_21_2To1_21;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.data.StructuredDataKey;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPacket1_21_2;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.rewriter.BlockItemPacketRewriter1_21_2;
import com.viaversion.viaversion.util.SerializerVersion;
import com.viaversion.viaversion.util.TagUtil;
public final class ComponentRewriter1_21_2 extends TranslatableRewriter<ClientboundPacket1_21_2> {
public final class ComponentRewriter1_21_2 extends JsonNBTComponentRewriter<ClientboundPacket1_21_2> {
public ComponentRewriter1_21_2(final Protocol1_21_2To1_21 protocol) {
super(protocol, ReadType.NBT);
@@ -54,18 +56,8 @@ public final class ComponentRewriter1_21_2 extends TranslatableRewriter<Clientbo
food.putFloat("eat_seconds", 1.6F);
}
TagUtil.removeNamespaced(componentsTag, "repairable");
TagUtil.removeNamespaced(componentsTag, "enchantable");
TagUtil.removeNamespaced(componentsTag, "consumable");
TagUtil.removeNamespaced(componentsTag, "use_remainder");
TagUtil.removeNamespaced(componentsTag, "use_cooldown");
TagUtil.removeNamespaced(componentsTag, "item_model");
TagUtil.removeNamespaced(componentsTag, "equippable");
TagUtil.removeNamespaced(componentsTag, "glider");
TagUtil.removeNamespaced(componentsTag, "tooltip_style");
TagUtil.removeNamespaced(componentsTag, "death_protection");
TagUtil.removeNamespaced(componentsTag, "damage_resistant");
TagUtil.removeNamespaced(componentsTag, "lock");
removeDataComponents(componentsTag, BlockItemPacketRewriter1_21_2.NEW_DATA_TO_REMOVE);
removeDataComponents(componentsTag, StructuredDataKey.DAMAGE_RESISTANT, StructuredDataKey.LOCK); // No point in updating these
}
@Override
@@ -193,8 +193,8 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter<Clientbound
});
protocol.registerClientbound(ClientboundPackets1_21_2.PLAYER_ROTATION, ClientboundPackets1_21.PLAYER_LOOK_AT, wrapper -> {
final float yaw = wrapper.passthrough(Types.FLOAT);
final float pitch = wrapper.passthrough(Types.FLOAT);
final float yaw = wrapper.read(Types.FLOAT);
final float pitch = wrapper.read(Types.FLOAT);
final double yRadians = Math.toRadians(yaw);
final double xRadians = Math.toRadians(pitch);
@@ -291,15 +291,15 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter<Clientbound
byte updatedFlags = 0;
if (forward > 0) {
updatedFlags |= 1;
updatedFlags |= 1; // Forward
} else if (forward < 0) {
updatedFlags |= 1 << 1;
updatedFlags |= 1 << 1; // Backward
}
if (sideways < 0) {
updatedFlags |= 1 << 2;
} else if (sideways > 0) {
updatedFlags |= 1 << 3;
if (sideways > 0) {
updatedFlags |= 1 << 2; // Left
} else if (sideways < 0) {
updatedFlags |= 1 << 3; // Right
}
if ((flags & 1) != 0) { // Jumping
@@ -20,46 +20,48 @@ package com.viaversion.viabackwards.protocol.v1_21_2to1_21.task;
import com.viaversion.viabackwards.ViaBackwards;
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.Protocol1_21_2To1_21;
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.storage.PlayerStorage;
import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.api.connection.ProtocolInfo;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.protocol.packet.State;
import com.viaversion.viaversion.protocol.ProtocolRunnable;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ServerboundPackets1_21_2;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.ClientVehicleStorage;
import io.netty.channel.Channel;
import java.util.logging.Level;
public final class PlayerPacketsTickTask implements Runnable {
public final class PlayerPacketsTickTask extends ProtocolRunnable {
public PlayerPacketsTickTask() {
super(Protocol1_21_2To1_21.class);
}
@Override
public void run() {
for (final UserConnection user : Via.getManager().getConnectionManager().getConnections()) {
final ProtocolInfo protocolInfo = user.getProtocolInfo();
if (protocolInfo.getClientState() != State.PLAY || protocolInfo.getServerState() != State.PLAY || !protocolInfo.getPipeline().contains(Protocol1_21_2To1_21.class)) {
continue;
}
final Channel channel = user.getChannel();
channel.eventLoop().submit(() -> {
if (!channel.isActive() || protocolInfo.getClientState() != State.PLAY || protocolInfo.getServerState() != State.PLAY) {
return;
}
try {
if (!user.has(ClientVehicleStorage.class)) {
final PlayerStorage playerStorage = user.get(PlayerStorage.class);
playerStorage.tick(user);
}
} catch (final Throwable t) {
ViaBackwards.getPlatform().getLogger().log(Level.SEVERE, "Error while sending player input packet.", t);
}
try {
final PacketWrapper clientTickEndPacket = PacketWrapper.create(ServerboundPackets1_21_2.CLIENT_TICK_END, user);
clientTickEndPacket.sendToServer(Protocol1_21_2To1_21.class);
} catch (final Throwable t) {
ViaBackwards.getPlatform().getLogger().log(Level.SEVERE, "Error while sending client tick end packet.", t);
}
});
public void run(final UserConnection connection) {
final ProtocolInfo protocolInfo = connection.getProtocolInfo();
if (protocolInfo.getClientState() != State.PLAY || protocolInfo.getServerState() != State.PLAY) {
return;
}
final Channel channel = connection.getChannel();
channel.eventLoop().submit(() -> {
if (!channel.isActive() || protocolInfo.getClientState() != State.PLAY || protocolInfo.getServerState() != State.PLAY) {
return;
}
try {
if (!connection.has(ClientVehicleStorage.class)) {
final PlayerStorage playerStorage = connection.get(PlayerStorage.class);
playerStorage.tick(connection);
}
} catch (final Throwable t) {
ViaBackwards.getPlatform().getLogger().log(Level.SEVERE, "Error while sending player input packet.", t);
}
try {
final PacketWrapper clientTickEndPacket = PacketWrapper.create(ServerboundPackets1_21_2.CLIENT_TICK_END, connection);
clientTickEndPacket.sendToServer(Protocol1_21_2To1_21.class);
} catch (final Throwable t) {
ViaBackwards.getPlatform().getLogger().log(Level.SEVERE, "Error while sending client tick end packet.", t);
}
});
}
}
@@ -20,7 +20,7 @@ package com.viaversion.viabackwards.protocol.v1_21_4to1_21_2;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.data.BackwardsMappingData;
import com.viaversion.viabackwards.api.rewriters.SoundRewriter;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
import com.viaversion.viabackwards.protocol.v1_21_4to1_21_2.rewriter.BlockItemPacketRewriter1_21_4;
import com.viaversion.viabackwards.protocol.v1_21_4to1_21_2.rewriter.ComponentRewriter1_21_4;
import com.viaversion.viabackwards.protocol.v1_21_4to1_21_2.rewriter.EntityPacketRewriter1_21_4;
@@ -59,7 +59,7 @@ public final class Protocol1_21_4To1_21_2 extends BackwardsProtocol<ClientboundP
private final EntityPacketRewriter1_21_4 entityRewriter = new EntityPacketRewriter1_21_4(this);
private final BlockItemPacketRewriter1_21_4 itemRewriter = new BlockItemPacketRewriter1_21_4(this);
private final ParticleRewriter<ClientboundPacket1_21_2> particleRewriter = new ParticleRewriter1_21_4(this);
private final TranslatableRewriter<ClientboundPacket1_21_2> translatableRewriter = new ComponentRewriter1_21_4(this);
private final JsonNBTComponentRewriter<ClientboundPacket1_21_2> translatableRewriter = new ComponentRewriter1_21_4(this);
private final TagRewriter<ClientboundPacket1_21_2> tagRewriter = new TagRewriter<>(this);
public Protocol1_21_4To1_21_2() {
@@ -81,7 +81,7 @@ public final class Protocol1_21_4To1_21_2 extends BackwardsProtocol<ClientboundP
new StatisticsRewriter<>(this).register(ClientboundPackets1_21_2.AWARD_STATS);
new AttributeRewriter<>(this).register1_21(ClientboundPackets1_21_2.UPDATE_ATTRIBUTES);
translatableRewriter.registerOpenScreen(ClientboundPackets1_21_2.OPEN_SCREEN);
translatableRewriter.registerOpenScreen1_14(ClientboundPackets1_21_2.OPEN_SCREEN);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_2.SET_ACTION_BAR_TEXT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_2.SET_TITLE_TEXT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_2.SET_SUBTITLE_TEXT);
@@ -90,7 +90,7 @@ public final class Protocol1_21_4To1_21_2 extends BackwardsProtocol<ClientboundP
translatableRewriter.registerTabList(ClientboundPackets1_21_2.TAB_LIST);
translatableRewriter.registerPlayerCombatKill1_20(ClientboundPackets1_21_2.PLAYER_COMBAT_KILL);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_2.SYSTEM_CHAT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_2.DISGUISED_CHAT);
translatableRewriter.registerDisguisedChat(ClientboundPackets1_21_2.DISGUISED_CHAT);
translatableRewriter.registerPing();
particleRewriter.registerExplode1_21_2(ClientboundPackets1_21_2.EXPLODE);
@@ -199,7 +199,7 @@ public final class Protocol1_21_4To1_21_2 extends BackwardsProtocol<ClientboundP
}
@Override
public TranslatableRewriter<ClientboundPacket1_21_2> getComponentRewriter() {
public JsonNBTComponentRewriter<ClientboundPacket1_21_2> getComponentRewriter() {
return translatableRewriter;
}
@@ -19,13 +19,13 @@ package com.viaversion.viabackwards.protocol.v1_21_4to1_21_2.rewriter;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.data.StructuredDataKey;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPacket1_21_2;
import com.viaversion.viaversion.util.SerializerVersion;
import com.viaversion.viaversion.util.TagUtil;
public final class ComponentRewriter1_21_4 extends TranslatableRewriter<ClientboundPacket1_21_2> {
public final class ComponentRewriter1_21_4 extends JsonNBTComponentRewriter<ClientboundPacket1_21_2> {
public ComponentRewriter1_21_4(final BackwardsProtocol<ClientboundPacket1_21_2, ?, ?, ?> protocol) {
super(protocol, ReadType.NBT);
@@ -38,8 +38,7 @@ public final class ComponentRewriter1_21_4 extends TranslatableRewriter<Clientbo
return;
}
TagUtil.removeNamespaced(componentsTag, "custom_model_data");
TagUtil.removeNamespaced(componentsTag, "trim");
removeDataComponents(componentsTag, StructuredDataKey.CUSTOM_MODEL_DATA1_21_4, StructuredDataKey.TRIM1_21_4);
}
@Override
@@ -0,0 +1,224 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2025 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_21_5to1_21_4;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.data.BackwardsMappingData;
import com.viaversion.viabackwards.api.rewriters.SoundRewriter;
import com.viaversion.viabackwards.protocol.v1_21_5to1_21_4.rewriter.BlockItemPacketRewriter1_21_5;
import com.viaversion.viabackwards.protocol.v1_21_5to1_21_4.rewriter.ComponentRewriter1_21_5;
import com.viaversion.viabackwards.protocol.v1_21_5to1_21_4.rewriter.EntityPacketRewriter1_21_5;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.Particle;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_4;
import com.viaversion.viaversion.api.minecraft.item.data.ChatType;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.protocol.packet.provider.PacketTypesProvider;
import com.viaversion.viaversion.api.protocol.packet.provider.SimplePacketTypesProvider;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.version.Types1_21_4;
import com.viaversion.viaversion.api.type.types.version.Types1_21_5;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
import com.viaversion.viaversion.protocols.v1_19_3to1_19_4.rewriter.CommandRewriter1_19_4;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ServerboundConfigurationPackets1_20_5;
import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundConfigurationPackets1_21;
import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.packet.ServerboundPacket1_21_4;
import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.packet.ServerboundPackets1_21_4;
import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.Protocol1_21_4To1_21_5;
import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ClientboundPacket1_21_5;
import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ClientboundPackets1_21_5;
import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ServerboundPacket1_21_5;
import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ServerboundPackets1_21_5;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPacket1_21_2;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPackets1_21_2;
import com.viaversion.viaversion.rewriter.ParticleRewriter;
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
import com.viaversion.viaversion.rewriter.TagRewriter;
import com.viaversion.viaversion.util.Key;
import static com.viaversion.viaversion.util.ProtocolUtil.packetTypeMap;
public final class Protocol1_21_5To1_21_4 extends BackwardsProtocol<ClientboundPacket1_21_5, ClientboundPacket1_21_2, ServerboundPacket1_21_5, ServerboundPacket1_21_4> {
public static final BackwardsMappingData MAPPINGS = new BackwardsMappingData("1.21.5", "1.21.4", Protocol1_21_4To1_21_5.class);
private final EntityPacketRewriter1_21_5 entityRewriter = new EntityPacketRewriter1_21_5(this);
private final BlockItemPacketRewriter1_21_5 itemRewriter = new BlockItemPacketRewriter1_21_5(this);
private final ParticleRewriter<ClientboundPacket1_21_5> particleRewriter = new ParticleRewriter<>(this, Types1_21_5.PARTICLE, Types1_21_4.PARTICLE) {
@Override
public void rewriteParticle(final UserConnection connection, final Particle particle) {
if (particle.id() == MAPPINGS.getParticleMappings().id("tinted_leaves")) {
particle.getArguments().clear();
}
super.rewriteParticle(connection, particle);
}
};
private final ComponentRewriter1_21_5 translatableRewriter = new ComponentRewriter1_21_5(this);
private final TagRewriter<ClientboundPacket1_21_5> tagRewriter = new TagRewriter<>(this);
public Protocol1_21_5To1_21_4() {
super(ClientboundPacket1_21_5.class, ClientboundPacket1_21_2.class, ServerboundPacket1_21_5.class, ServerboundPacket1_21_4.class);
}
@Override
protected void registerPackets() {
super.registerPackets();
tagRewriter.registerGeneric(ClientboundPackets1_21_5.UPDATE_TAGS);
tagRewriter.registerGeneric(ClientboundConfigurationPackets1_21.UPDATE_TAGS);
final SoundRewriter<ClientboundPacket1_21_5> soundRewriter = new SoundRewriter<>(this);
soundRewriter.registerSound1_19_3(ClientboundPackets1_21_5.SOUND);
soundRewriter.registerSound1_19_3(ClientboundPackets1_21_5.SOUND_ENTITY);
soundRewriter.registerStopSound(ClientboundPackets1_21_5.STOP_SOUND);
new StatisticsRewriter<>(this).register(ClientboundPackets1_21_5.AWARD_STATS);
translatableRewriter.registerOpenScreen1_14(ClientboundPackets1_21_5.OPEN_SCREEN);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_5.SET_ACTION_BAR_TEXT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_5.SET_TITLE_TEXT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_5.SET_SUBTITLE_TEXT);
translatableRewriter.registerBossEvent(ClientboundPackets1_21_5.BOSS_EVENT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_5.DISCONNECT);
translatableRewriter.registerTabList(ClientboundPackets1_21_5.TAB_LIST);
translatableRewriter.registerPlayerCombatKill1_20(ClientboundPackets1_21_5.PLAYER_COMBAT_KILL);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_5.SYSTEM_CHAT);
translatableRewriter.registerDisguisedChat(ClientboundPackets1_21_5.DISGUISED_CHAT);
translatableRewriter.registerPlayerInfoUpdate1_21_4(ClientboundPackets1_21_5.PLAYER_INFO_UPDATE);
translatableRewriter.registerPing();
particleRewriter.registerLevelParticles1_21_4(ClientboundPackets1_21_5.LEVEL_PARTICLES);
particleRewriter.registerExplode1_21_2(ClientboundPackets1_21_5.EXPLODE);
new CommandRewriter1_19_4<>(this) {
@Override
public void handleArgument(final PacketWrapper wrapper, final String argumentType) {
if (argumentType.equals("minecraft:resource")) {
String resource = wrapper.read(Types.STRING);
if (Key.equals(resource, "test_instance")) {
resource = "minecraft:item"; // Just give it anything else
}
wrapper.write(Types.STRING, resource);
} else if (argumentType.equals("minecraft:resource_selector")) {
wrapper.read(Types.STRING); // Selector
wrapper.write(Types.VAR_INT, 1); // Quotable string
} else {
super.handleArgument(wrapper, argumentType);
}
}
}.registerDeclareCommands1_19(ClientboundPackets1_21_5.COMMANDS);
registerClientbound(ClientboundPackets1_21_5.PLAYER_CHAT, wrapper -> {
wrapper.read(Types.VAR_INT); // Index
wrapper.passthrough(Types.UUID); // Sender
wrapper.passthrough(Types.VAR_INT); // Index
wrapper.passthrough(Types.OPTIONAL_SIGNATURE_BYTES); // Signature
wrapper.passthrough(Types.STRING); // Plain content
wrapper.passthrough(Types.LONG); // Timestamp
wrapper.passthrough(Types.LONG); // Salt
final int lastSeen = wrapper.passthrough(Types.VAR_INT);
for (int i = 0; i < lastSeen; i++) {
final int index = wrapper.passthrough(Types.VAR_INT);
if (index == 0) {
wrapper.passthrough(Types.SIGNATURE_BYTES);
}
}
translatableRewriter.processTag(wrapper.user(), wrapper.passthrough(Types.OPTIONAL_TAG)); // Unsigned content
final int filterMaskType = wrapper.passthrough(Types.VAR_INT);
if (filterMaskType == 2) { // Partially filtered
wrapper.passthrough(Types.LONG_ARRAY_PRIMITIVE); // Mask
}
wrapper.passthrough(ChatType.TYPE); // Chat Type
translatableRewriter.processTag(wrapper.user(), wrapper.passthrough(Types.TAG)); // Name
translatableRewriter.processTag(wrapper.user(), wrapper.passthrough(Types.OPTIONAL_TAG)); // Target Name
});
registerServerbound(ServerboundPackets1_21_4.CHAT_COMMAND_SIGNED, wrapper -> {
wrapper.passthrough(Types.STRING); // Command
wrapper.passthrough(Types.LONG); // Timestamp
wrapper.passthrough(Types.LONG); // Salt
final int signatures = wrapper.passthrough(Types.VAR_INT);
for (int i = 0; i < signatures; i++) {
wrapper.passthrough(Types.STRING); // Argument name
wrapper.passthrough(Types.SIGNATURE_BYTES); // Signature
}
wrapper.passthrough(Types.VAR_INT); // Offset
wrapper.passthrough(Types.ACKNOWLEDGED_BIT_SET); // Acknowledged
wrapper.write(Types.BYTE, (byte) 0); // Checksum
});
registerServerbound(ServerboundPackets1_21_4.CHAT, wrapper -> {
wrapper.passthrough(Types.STRING); // Message
wrapper.passthrough(Types.LONG); // Timestamp
wrapper.passthrough(Types.LONG); // Salt
wrapper.passthrough(Types.OPTIONAL_SIGNATURE_BYTES); // Signature
wrapper.passthrough(Types.VAR_INT); // Offset
wrapper.passthrough(Types.ACKNOWLEDGED_BIT_SET); // Acknowledged
wrapper.write(Types.BYTE, (byte) 0); // Checksum
});
cancelClientbound(ClientboundPackets1_21_5.TEST_INSTANCE_BLOCK_STATUS);
}
@Override
public void init(final UserConnection user) {
addEntityTracker(user, new EntityTrackerBase(user, EntityTypes1_21_4.PLAYER));
}
@Override
public BackwardsMappingData getMappingData() {
return MAPPINGS;
}
@Override
public EntityPacketRewriter1_21_5 getEntityRewriter() {
return entityRewriter;
}
@Override
public BlockItemPacketRewriter1_21_5 getItemRewriter() {
return itemRewriter;
}
@Override
public ParticleRewriter<ClientboundPacket1_21_5> getParticleRewriter() {
return particleRewriter;
}
@Override
public ComponentRewriter1_21_5 getComponentRewriter() {
return translatableRewriter;
}
@Override
public TagRewriter<ClientboundPacket1_21_5> getTagRewriter() {
return tagRewriter;
}
@Override
protected PacketTypesProvider<ClientboundPacket1_21_5, ClientboundPacket1_21_2, ServerboundPacket1_21_5, ServerboundPacket1_21_4> createPacketTypesProvider() {
return new SimplePacketTypesProvider<>(
packetTypeMap(unmappedClientboundPacketType, ClientboundPackets1_21_5.class, ClientboundConfigurationPackets1_21.class),
packetTypeMap(mappedClientboundPacketType, ClientboundPackets1_21_2.class, ClientboundConfigurationPackets1_21.class),
packetTypeMap(mappedServerboundPacketType, ServerboundPackets1_21_5.class, ServerboundConfigurationPackets1_20_5.class),
packetTypeMap(unmappedServerboundPacketType, ServerboundPackets1_21_4.class, ServerboundConfigurationPackets1_20_5.class)
);
}
}
@@ -0,0 +1,589 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2025 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_21_5to1_21_4.rewriter;
import static com.viaversion.viaversion.protocols.v1_21_4to1_21_5.rewriter.BlockItemPacketRewriter1_21_5.downgradeItemData;
import static com.viaversion.viaversion.protocols.v1_21_4to1_21_5.rewriter.BlockItemPacketRewriter1_21_5.updateItemData;
import static com.viaversion.viaversion.util.MathUtil.ceilLog2;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.nbt.tag.FloatTag;
import com.viaversion.nbt.tag.IntArrayTag;
import com.viaversion.nbt.tag.IntTag;
import com.viaversion.nbt.tag.ListTag;
import com.viaversion.nbt.tag.LongArrayTag;
import com.viaversion.nbt.tag.Tag;
import com.viaversion.viabackwards.api.rewriters.BackwardsStructuredItemRewriter;
import com.viaversion.viabackwards.protocol.v1_21_5to1_21_4.Protocol1_21_5To1_21_4;
import com.viaversion.viabackwards.protocol.v1_21_5to1_21_4.storage.HorseDataStorage;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.data.Mappings;
import com.viaversion.viaversion.api.data.entity.EntityTracker;
import com.viaversion.viaversion.api.data.entity.TrackedEntity;
import com.viaversion.viaversion.api.minecraft.Holder;
import com.viaversion.viaversion.api.minecraft.HolderSet;
import com.viaversion.viaversion.api.minecraft.PaintingVariant;
import com.viaversion.viaversion.api.minecraft.SoundEvent;
import com.viaversion.viaversion.api.minecraft.blockentity.BlockEntity;
import com.viaversion.viaversion.api.minecraft.chunks.Chunk;
import com.viaversion.viaversion.api.minecraft.chunks.Chunk1_18;
import com.viaversion.viaversion.api.minecraft.chunks.DataPalette;
import com.viaversion.viaversion.api.minecraft.chunks.Heightmap;
import com.viaversion.viaversion.api.minecraft.data.StructuredDataContainer;
import com.viaversion.viaversion.api.minecraft.data.StructuredDataKey;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_5;
import com.viaversion.viaversion.api.minecraft.entitydata.EntityData;
import com.viaversion.viaversion.api.minecraft.item.HashedStructuredItem;
import com.viaversion.viaversion.api.minecraft.item.Item;
import com.viaversion.viaversion.api.minecraft.item.data.ArmorTrimMaterial;
import com.viaversion.viaversion.api.minecraft.item.data.ArmorTrimPattern;
import com.viaversion.viaversion.api.minecraft.item.data.BlocksAttacks;
import com.viaversion.viaversion.api.minecraft.item.data.BlocksAttacks.DamageReduction;
import com.viaversion.viaversion.api.minecraft.item.data.BlocksAttacks.ItemDamageFunction;
import com.viaversion.viaversion.api.minecraft.item.data.Equippable;
import com.viaversion.viaversion.api.minecraft.item.data.ProvidesTrimMaterial;
import com.viaversion.viaversion.api.minecraft.item.data.ToolProperties;
import com.viaversion.viaversion.api.minecraft.item.data.TooltipDisplay;
import com.viaversion.viaversion.api.minecraft.item.data.Weapon;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.rewriter.ComponentRewriter;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.chunk.ChunkBiomesType1_19_4;
import com.viaversion.viaversion.api.type.types.chunk.ChunkBiomesType1_21_5;
import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2;
import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_21_5;
import com.viaversion.viaversion.api.type.types.version.Types1_21_4;
import com.viaversion.viaversion.api.type.types.version.Types1_21_5;
import com.viaversion.viaversion.libs.fastutil.ints.IntLinkedOpenHashSet;
import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.packet.ServerboundPacket1_21_4;
import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.packet.ServerboundPackets1_21_4;
import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ClientboundPacket1_21_5;
import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ClientboundPackets1_21_5;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPackets1_21_2;
import com.viaversion.viaversion.rewriter.BlockRewriter;
import com.viaversion.viaversion.rewriter.RecipeDisplayRewriter;
import com.viaversion.viaversion.util.Either;
import com.viaversion.viaversion.util.Key;
import com.viaversion.viaversion.util.Limit;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public final class BlockItemPacketRewriter1_21_5 extends BackwardsStructuredItemRewriter<ClientboundPacket1_21_5, ServerboundPacket1_21_4, Protocol1_21_5To1_21_4> {
private static final int SIGN_BOCK_ENTITY_ID = 7;
private static final int HANGING_SIGN_BOCK_ENTITY_ID = 8;
private static final int SADDLE_EQUIPMENT_SLOT = 7;
private static final byte SADDLED_FLAG = 4;
public BlockItemPacketRewriter1_21_5(final Protocol1_21_5To1_21_4 protocol) {
super(protocol,
Types1_21_5.ITEM, Types1_21_5.ITEM_ARRAY, Types1_21_4.ITEM, Types1_21_4.ITEM_ARRAY,
Types1_21_5.ITEM_COST, Types1_21_5.OPTIONAL_ITEM_COST, Types1_21_4.ITEM_COST, Types1_21_4.OPTIONAL_ITEM_COST
);
}
@Override
public void registerPackets() {
final BlockRewriter<ClientboundPacket1_21_5> blockRewriter = BlockRewriter.for1_20_2(protocol);
blockRewriter.registerBlockEvent(ClientboundPackets1_21_5.BLOCK_EVENT);
blockRewriter.registerBlockUpdate(ClientboundPackets1_21_5.BLOCK_UPDATE);
blockRewriter.registerSectionBlocksUpdate1_20(ClientboundPackets1_21_5.SECTION_BLOCKS_UPDATE);
blockRewriter.registerLevelEvent1_21(ClientboundPackets1_21_5.LEVEL_EVENT, 2001);
blockRewriter.registerBlockEntityData(ClientboundPackets1_21_5.BLOCK_ENTITY_DATA, this::handleBlockEntity);
protocol.registerClientbound(ClientboundPackets1_21_5.LEVEL_CHUNK_WITH_LIGHT, wrapper -> {
final EntityTracker tracker = protocol.getEntityRewriter().tracker(wrapper.user());
final Mappings blockStateMappings = protocol.getMappingData().getBlockStateMappings();
final Type<Chunk> chunkType = new ChunkType1_21_5(tracker.currentWorldSectionHeight(), ceilLog2(blockStateMappings.size()), ceilLog2(tracker.biomesSent()));
final Chunk chunk = wrapper.read(chunkType);
blockRewriter.handleChunk(chunk);
blockRewriter.handleBlockEntities(null, chunk, wrapper.user());
final Type<Chunk> newChunkType = new ChunkType1_20_2(tracker.currentWorldSectionHeight(), ceilLog2(blockStateMappings.mappedSize()), ceilLog2(tracker.biomesSent()));
final CompoundTag heightmapTag = new CompoundTag();
for (final Heightmap heightmap : chunk.heightmaps()) {
final String typeKey = heightmapType(heightmap.type());
if (typeKey == null) {
protocol.getLogger().warning("Unknown heightmap type id: " + heightmap.type());
continue;
}
heightmapTag.put(typeKey, new LongArrayTag(heightmap.data()));
}
final Chunk mappedChunk = new Chunk1_18(chunk.getX(), chunk.getZ(), chunk.getSections(), heightmapTag, chunk.blockEntities());
blockRewriter.handleBlockEntities(this::handleBlockEntity, chunk, wrapper.user());
wrapper.write(newChunkType, mappedChunk);
});
protocol.registerClientbound(ClientboundPackets1_21_5.CHUNKS_BIOMES, wrapper -> {
final EntityTracker tracker = protocol.getEntityRewriter().tracker(wrapper.user());
final int globalPaletteBiomeBits = ceilLog2(tracker.biomesSent());
final Type<DataPalette[]> biomesType = new ChunkBiomesType1_21_5(tracker.currentWorldSectionHeight(), globalPaletteBiomeBits);
final Type<DataPalette[]> newBiomesType = new ChunkBiomesType1_19_4(tracker.currentWorldSectionHeight(), globalPaletteBiomeBits);
final int size = wrapper.passthrough(Types.VAR_INT);
for (int i = 0; i < size; i++) {
wrapper.passthrough(Types.CHUNK_POSITION);
wrapper.passthroughAndMap(biomesType, newBiomesType);
}
});
protocol.registerClientbound(ClientboundPackets1_21_5.SET_CURSOR_ITEM, this::passthroughClientboundItem);
registerSetPlayerInventory(ClientboundPackets1_21_5.SET_PLAYER_INVENTORY);
registerCooldown1_21_2(ClientboundPackets1_21_5.COOLDOWN);
registerSetContent1_21_2(ClientboundPackets1_21_5.CONTAINER_SET_CONTENT);
registerSetSlot1_21_2(ClientboundPackets1_21_5.CONTAINER_SET_SLOT);
registerMerchantOffers1_20_5(ClientboundPackets1_21_5.MERCHANT_OFFERS);
protocol.registerServerbound(ServerboundPackets1_21_4.SET_CREATIVE_MODE_SLOT, wrapper -> {
wrapper.passthrough(Types.SHORT); // Slot
final Item item = handleItemToServer(wrapper.user(), wrapper.read(mappedItemType()));
wrapper.write(Types1_21_5.LENGTH_PREFIXED_ITEM, item);
});
protocol.registerServerbound(ServerboundPackets1_21_4.CONTAINER_CLICK, wrapper -> {
wrapper.passthrough(Types.VAR_INT); // Container id
wrapper.passthrough(Types.VAR_INT); // State id
wrapper.passthrough(Types.SHORT); // Slot
wrapper.passthrough(Types.BYTE); // Button
wrapper.passthrough(Types.VAR_INT); // Mode
// We have no way of actually reconstructing the items here
final int affectedItems = Limit.max(wrapper.passthrough(Types.VAR_INT), 128);
for (int i = 0; i < affectedItems; i++) {
wrapper.passthrough(Types.SHORT); // Slot
final Item item = handleItemToServer(wrapper.user(), wrapper.read(mappedItemType()));
wrapper.write(Types.HASHED_ITEM, new HashedStructuredItem(item.identifier(), item.amount()));
}
final Item carriedItem = handleItemToServer(wrapper.user(), wrapper.read(mappedItemType()));
wrapper.write(Types.HASHED_ITEM, new HashedStructuredItem(carriedItem.identifier(), carriedItem.amount()));
});
protocol.registerClientbound(ClientboundPackets1_21_5.SET_EQUIPMENT, wrapper -> {
final int entityId = wrapper.passthrough(Types.VAR_INT);
final TrackedEntity trackedEntity = protocol.getEntityRewriter().tracker(wrapper.user()).entity(entityId);
byte value;
do {
value = wrapper.passthrough(Types.BYTE);
final int equipmentSlot = value & 0x7F;
if (equipmentSlot == SADDLE_EQUIPMENT_SLOT) {
if (trackedEntity != null && trackedEntity.entityType().isOrHasParent(EntityTypes1_21_5.ABSTRACT_HORSE)) {
sendSaddledEntityData(wrapper.user(), trackedEntity, entityId);
}
wrapper.cancel();
return;
}
passthroughClientboundItem(wrapper);
} while (value < 0);
});
protocol.registerClientbound(ClientboundPackets1_21_5.UPDATE_ADVANCEMENTS, wrapper -> {
wrapper.passthrough(Types.BOOLEAN); // Reset/clear
int size = wrapper.passthrough(Types.VAR_INT); // Mapping size
for (int i = 0; i < size; i++) {
wrapper.passthrough(Types.STRING); // Identifier
wrapper.passthrough(Types.OPTIONAL_STRING); // Parent
// Display data
if (wrapper.passthrough(Types.BOOLEAN)) {
final Tag title = wrapper.passthrough(Types.TAG);
final Tag description = wrapper.passthrough(Types.TAG);
final ComponentRewriter componentRewriter = protocol.getComponentRewriter();
if (componentRewriter != null) {
componentRewriter.processTag(wrapper.user(), title);
componentRewriter.processTag(wrapper.user(), description);
}
passthroughClientboundItem(wrapper); // Icon
wrapper.passthrough(Types.VAR_INT); // Frame type
int flags = wrapper.passthrough(Types.INT); // Flags
if ((flags & 1) != 0) {
convertClientAsset(wrapper);
}
wrapper.passthrough(Types.FLOAT); // X
wrapper.passthrough(Types.FLOAT); // Y
}
int requirements = wrapper.passthrough(Types.VAR_INT);
for (int array = 0; array < requirements; array++) {
wrapper.passthrough(Types.STRING_ARRAY);
}
wrapper.passthrough(Types.BOOLEAN); // Send telemetry
}
wrapper.passthrough(Types.STRING_ARRAY); // Removed
final int progressSize = wrapper.passthrough(Types.VAR_INT);
for (int i = 0; i < progressSize; i++) {
wrapper.passthrough(Types.STRING); // Key
final int criterionSize = wrapper.passthrough(Types.VAR_INT);
for (int j = 0; j < criterionSize; j++) {
wrapper.passthrough(Types.STRING); // Key
wrapper.passthrough(Types.OPTIONAL_LONG); // Obtained instant
}
}
wrapper.read(Types.BOOLEAN); // Show advancements
});
final RecipeDisplayRewriter<ClientboundPacket1_21_5> recipeRewriter = new RecipeDisplayRewriter<>(protocol) {
@Override
protected void handleSmithingTrimSlotDisplay(final PacketWrapper wrapper) {
handleSlotDisplay(wrapper); // Base
handleSlotDisplay(wrapper); // Material
wrapper.read(ArmorTrimPattern.TYPE1_21_5); // Patterm
// Add empty slot display...
wrapper.write(Types.VAR_INT, 0);
}
};
recipeRewriter.registerUpdateRecipes(ClientboundPackets1_21_5.UPDATE_RECIPES);
recipeRewriter.registerRecipeBookAdd(ClientboundPackets1_21_5.RECIPE_BOOK_ADD);
recipeRewriter.registerPlaceGhostRecipe(ClientboundPackets1_21_5.PLACE_GHOST_RECIPE);
}
private void convertClientAsset(final PacketWrapper wrapper) {
final String background = wrapper.read(Types.STRING);
final String namespace = Key.namespace(background);
final String path = Key.stripNamespace(background);
wrapper.write(Types.STRING, namespace + ":textures/" + path + ".png");
}
private void sendSaddledEntityData(final UserConnection connection, final TrackedEntity trackedEntity, final int entityId) {
byte data = 0;
if (trackedEntity.hasData()) {
final HorseDataStorage horseDataStorage = trackedEntity.data().get(HorseDataStorage.class);
if (horseDataStorage != null) {
data = horseDataStorage.data();
}
}
trackedEntity.data().put(new HorseDataStorage(data, true));
data = (byte) (data | SADDLED_FLAG);
final PacketWrapper entityDataPacket = PacketWrapper.create(ClientboundPackets1_21_2.SET_ENTITY_DATA, connection);
final List<EntityData> entityDataList = new ArrayList<>();
entityDataList.add(new EntityData(17, Types1_21_4.ENTITY_DATA_TYPES.byteType, data));
entityDataPacket.write(Types.VAR_INT, entityId);
entityDataPacket.write(Types1_21_4.ENTITY_DATA_LIST, entityDataList);
entityDataPacket.send(Protocol1_21_5To1_21_4.class);
}
private void handleBlockEntity(final UserConnection connection, final BlockEntity blockEntity) {
final CompoundTag tag = blockEntity.tag();
if (tag != null && (blockEntity.typeId() == SIGN_BOCK_ENTITY_ID || blockEntity.typeId() == HANGING_SIGN_BOCK_ENTITY_ID)) {
updateSignMessages(connection, tag.getCompoundTag("front_text"));
updateSignMessages(connection, tag.getCompoundTag("back_text"));
}
}
private void updateSignMessages(final UserConnection connection, final CompoundTag tag) {
if (tag == null) {
return;
}
final ListTag<?> messages = tag.getListTag("messages");
tag.put("messages", protocol.getComponentRewriter().updateComponentList(connection, messages));
final ListTag<?> filteredMessages = tag.getListTag("filtered_messages");
if (filteredMessages != null) {
tag.put("filtered_messages", protocol.getComponentRewriter().updateComponentList(connection, filteredMessages));
}
}
private String heightmapType(final int id) {
return switch (id) {
case 0 -> "WORLD_SURFACE_WG";
case 1 -> "WORLD_SURFACE";
case 2 -> "OCEAN_FLOOR_WG";
case 3 -> "OCEAN_FLOOR";
case 4 -> "MOTION_BLOCKING";
case 5 -> "MOTION_BLOCKING_NO_LEAVES";
default -> null;
};
}
@Override
public Item handleItemToClient(final UserConnection connection, final Item item) {
super.handleItemToClient(connection, item);
final StructuredDataContainer dataContainer = item.dataContainer();
final CompoundTag backupTag = new CompoundTag();
final ToolProperties toolProperties = dataContainer.get(StructuredDataKey.TOOL1_21_5);
if (toolProperties != null && toolProperties.canDestroyBlocksInCreative()) {
backupTag.putBoolean("tool", true);
}
final Equippable equippable = dataContainer.get(StructuredDataKey.EQUIPPABLE1_21_5);
if (equippable != null && equippable.equipOnInteract()) {
backupTag.putBoolean("equippable", true);
}
final Weapon weapon = dataContainer.get(StructuredDataKey.WEAPON);
if (weapon != null) {
final CompoundTag weaponTag = new CompoundTag();
backupTag.put("weapon", weaponTag);
weaponTag.putInt("item_damage_per_attack", weapon.itemDamagePerAttack());
weaponTag.putFloat("disable_blocking_for_seconds", weapon.disableBlockingForSeconds());
}
final ProvidesTrimMaterial providesTrimMaterial = dataContainer.get(StructuredDataKey.PROVIDES_TRIM_MATERIAL);
if (providesTrimMaterial != null) {
final Tag materialTag = eitherHolderToTag(providesTrimMaterial.material(), (material, tag) -> {
tag.putString("asset_name", material.assetName());
tag.putInt("item_id", material.itemId());
tag.putFloat("item_model_index", material.itemModelIndex());
final CompoundTag overrideArmorMaterials = new CompoundTag();
material.overrideArmorMaterials().forEach(overrideArmorMaterials::putString);
tag.put("override_armor_materials", overrideArmorMaterials);
tag.put("description", material.description());
});
backupTag.put("provides_trim_material", materialTag);
}
final BlocksAttacks blocksAttacks = dataContainer.get(StructuredDataKey.BLOCKS_ATTACKS);
if (blocksAttacks != null) {
final CompoundTag blocksAttackTag = new CompoundTag();
backupTag.put("blocks_attack", blocksAttackTag);
blocksAttackTag.putFloat("block_delay_seconds", blocksAttacks.blockDelaySeconds());
blocksAttackTag.putFloat("disable_cooldown_scale", blocksAttacks.disableCooldownScale());
final ListTag<CompoundTag> damageReductions = new ListTag<>(CompoundTag.class);
blocksAttackTag.put("damage_reductions", damageReductions);
for (final DamageReduction damageReduction : blocksAttacks.damageReductions()) {
final CompoundTag damageReductionTag = new CompoundTag();
damageReductionTag.putFloat("horizontal_blocking_angle", damageReduction.horizontalBlockingAngle());
if (damageReduction.type() != null) {
damageReductionTag.put("type", holderSetToTag(damageReduction.type()));
}
damageReductionTag.putFloat("base", damageReduction.base());
damageReductionTag.putFloat("factor", damageReduction.factor());
damageReductions.add(damageReductionTag);
}
final CompoundTag itemDamageTag = new CompoundTag();
blocksAttackTag.put("item_damage", itemDamageTag);
itemDamageTag.putFloat("threshold", blocksAttacks.itemDamage().threshold());
itemDamageTag.putFloat("base", blocksAttacks.itemDamage().base());
itemDamageTag.putFloat("factor", blocksAttacks.itemDamage().factor());
if (blocksAttacks.bypassedByTag() != null) {
itemDamageTag.putString("bypassed_by", blocksAttacks.bypassedByTag());
}
if (blocksAttacks.blockSound() != null) {
blocksAttackTag.put("block_sound", holderToTag(blocksAttacks.blockSound(), this::soundToTag));
}
if (blocksAttacks.disableSound() != null) {
blocksAttackTag.put("disable_sound", holderToTag(blocksAttacks.disableSound(), this::soundToTag));
}
}
final TooltipDisplay tooltipDisplay = dataContainer.get(StructuredDataKey.TOOLTIP_DISPLAY);
if (tooltipDisplay != null) {
backupTag.put("hidden_components", new IntArrayTag(tooltipDisplay.hiddenComponents().toIntArray()));
}
saveStringData(StructuredDataKey.PROVIDES_BANNER_PATTERNS, dataContainer, backupTag);
saveFloatData(StructuredDataKey.POTION_DURATION_SCALE, dataContainer, backupTag);
saveIntData(StructuredDataKey.VILLAGER_VARIANT, dataContainer, backupTag);
saveIntData(StructuredDataKey.FOX_VARIANT, dataContainer, backupTag);
saveIntData(StructuredDataKey.SALMON_SIZE, dataContainer, backupTag);
saveIntData(StructuredDataKey.PARROT_VARIANT, dataContainer, backupTag);
saveIntData(StructuredDataKey.TROPICAL_FISH_PATTERN, dataContainer, backupTag);
saveIntData(StructuredDataKey.TROPICAL_FISH_BASE_COLOR, dataContainer, backupTag);
saveIntData(StructuredDataKey.TROPICAL_FISH_PATTERN_COLOR, dataContainer, backupTag);
saveIntData(StructuredDataKey.MOOSHROOM_VARIANT, dataContainer, backupTag);
saveIntData(StructuredDataKey.RABBIT_VARIANT, dataContainer, backupTag);
saveIntData(StructuredDataKey.FROG_VARIANT, dataContainer, backupTag);
saveIntData(StructuredDataKey.HORSE_VARIANT, dataContainer, backupTag);
saveIntData(StructuredDataKey.LLAMA_VARIANT, dataContainer, backupTag);
saveIntData(StructuredDataKey.AXOLOTL_VARIANT, dataContainer, backupTag);
saveIntData(StructuredDataKey.CAT_VARIANT, dataContainer, backupTag);
saveIntData(StructuredDataKey.CAT_COLLAR, dataContainer, backupTag);
saveIntData(StructuredDataKey.SHEEP_COLOR, dataContainer, backupTag);
saveIntData(StructuredDataKey.SHULKER_COLOR, dataContainer, backupTag);
saveIntData(StructuredDataKey.WOLF_SOUND_VARIANT, dataContainer, backupTag);
saveIntData(StructuredDataKey.COW_VARIANT, dataContainer, backupTag);
saveIntData(StructuredDataKey.PIG_VARIANT, dataContainer, backupTag);
saveIntData(StructuredDataKey.WOLF_VARIANT, dataContainer, backupTag);
final Either<Integer, String> chickenVariant = dataContainer.get(StructuredDataKey.CHICKEN_VARIANT);
if (chickenVariant != null) {
if (chickenVariant.isLeft()) {
backupTag.putInt("chicken_variant", chickenVariant.left());
} else {
backupTag.putString("chicken_variant", chickenVariant.right());
}
}
saveHolderData(StructuredDataKey.PAINTING_VARIANT, dataContainer, backupTag, (paintingVariant, tag) -> {
tag.putInt("width", paintingVariant.width());
tag.putInt("height", paintingVariant.height());
tag.putString("asset_id", paintingVariant.assetId());
if (paintingVariant.title() != null) {
tag.put("title", paintingVariant.title());
}
if (paintingVariant.author() != null) {
tag.put("author", paintingVariant.author());
}
});
saveHolderData(StructuredDataKey.BREAK_SOUND, dataContainer, backupTag, this::soundToTag);
if (!backupTag.isEmpty()) {
saveTag(createCustomTag(item), backupTag, "backup");
}
downgradeItemData(item);
return item;
}
private void soundToTag(final SoundEvent soundEvent, final CompoundTag tag) {
tag.putString("identifier", soundEvent.identifier());
if (soundEvent.fixedRange() != null) {
tag.putFloat("fixed_range", soundEvent.fixedRange());
}
}
@Override
public Item handleItemToServer(final UserConnection connection, final Item item) {
super.handleItemToServer(connection, item);
restoreData(item.dataContainer());
updateItemData(item);
return item;
}
private void restoreData(final StructuredDataContainer data) {
final CompoundTag customData = data.get(StructuredDataKey.CUSTOM_DATA);
if (customData == null || !(customData.remove(nbtTagName("backup")) instanceof final CompoundTag backupTag)) {
return;
}
final IntArrayTag hiddenComponentsTag = backupTag.getIntArrayTag("hidden_components");
if (hiddenComponentsTag != null) {
data.set(StructuredDataKey.TOOLTIP_DISPLAY, new TooltipDisplay(data.has(StructuredDataKey.HIDE_TOOLTIP), new IntLinkedOpenHashSet(hiddenComponentsTag.getValue())));
}
if (backupTag.getBoolean("tool")) {
data.replace(StructuredDataKey.TOOL1_20_5, StructuredDataKey.TOOL1_21_5, t -> new ToolProperties(t.rules(), t.defaultMiningSpeed(), t.damagePerBlock(), true));
}
if (backupTag.getBoolean("equippable")) {
data.replace(StructuredDataKey.EQUIPPABLE1_21_2, StructuredDataKey.EQUIPPABLE1_21_5, e -> new Equippable(e.equipmentSlot(), e.soundEvent(), e.model(), e.cameraOverlay(), e.allowedEntities(), e.dispensable(), e.swappable(), e.damageOnHurt(), true));
}
final CompoundTag weaponTag = backupTag.getCompoundTag("weapon");
if (weaponTag != null) {
data.set(StructuredDataKey.WEAPON, new Weapon(weaponTag.getInt("item_damage_per_attack"), weaponTag.getFloat("disable_blocking_for_seconds")));
}
final Tag materialTag = backupTag.get("provides_trim_material");
if (materialTag != null) {
data.set(StructuredDataKey.PROVIDES_TRIM_MATERIAL, new ProvidesTrimMaterial(restoreEitherHolder(backupTag, "provides_trim_material", tag -> {
final String assetName = tag.getString("asset_name");
final int itemId = tag.getInt("item_id");
final float itemModelIndex = tag.getFloat("item_model_index");
final CompoundTag overrideArmorMaterialsTag = tag.getCompoundTag("override_armor_materials");
final Map<String, String> overrideArmorMaterials = new HashMap<>();
for (final String key : overrideArmorMaterialsTag.keySet()) {
overrideArmorMaterials.put(key, overrideArmorMaterialsTag.getString(key));
}
final Tag description = tag.get("description");
return new ArmorTrimMaterial(assetName, itemId, itemModelIndex, overrideArmorMaterials, description);
})));
}
final CompoundTag blocksAttackTag = backupTag.getCompoundTag("blocks_attack");
if (blocksAttackTag != null) {
final float blockDelaySeconds = blocksAttackTag.getFloat("block_delay_seconds");
final float disableCooldownScale = blocksAttackTag.getFloat("disable_cooldown_scale");
final CompoundTag itemDamageTag = blocksAttackTag.getCompoundTag("item_damage");
final ItemDamageFunction itemDamage = new ItemDamageFunction(itemDamageTag.getFloat("threshold"), itemDamageTag.getFloat("base"), itemDamageTag.getFloat("factor"));
final String bypassedBy = blocksAttackTag.getString("bypassed_by");
final Holder<SoundEvent> blockSound = blocksAttackTag.contains("block_sound") ? restoreHolder(blocksAttackTag, "block_sound", this::tagToSound) : null;
final Holder<SoundEvent> disableSound = blocksAttackTag.contains("disable_sound") ? restoreHolder(blocksAttackTag, "disable_sound", this::tagToSound) : null;
final List<DamageReduction> damageReductions = new ArrayList<>();
for (final CompoundTag damageReductionTag : blocksAttackTag.getListTag("damage_reductions", CompoundTag.class)) {
final float horizontalBlockingAngle = damageReductionTag.getFloat("horizontal_blocking_angle");
final HolderSet type = damageReductionTag.contains("type") ? restoreHolderSet(damageReductionTag, "type") : null;
final float base = damageReductionTag.getFloat("base");
final float factor = damageReductionTag.getFloat("factor");
damageReductions.add(new DamageReduction(horizontalBlockingAngle, type, base, factor));
}
data.set(StructuredDataKey.BLOCKS_ATTACKS, new BlocksAttacks(blockDelaySeconds, disableCooldownScale, damageReductions.toArray(new DamageReduction[0]), itemDamage, bypassedBy, blockSound, disableSound));
}
final IntTag chickenVariant = backupTag.getIntTag("chicken_variant");
if (chickenVariant != null) {
data.set(StructuredDataKey.CHICKEN_VARIANT, Either.left(chickenVariant.asInt()));
} else {
final String chickenVariantKey = backupTag.getString("chicken_variant");
if (chickenVariantKey != null) {
data.set(StructuredDataKey.CHICKEN_VARIANT, Either.right(chickenVariantKey));
}
}
restoreStringData(StructuredDataKey.PROVIDES_BANNER_PATTERNS, data, backupTag);
restoreFloatData(StructuredDataKey.POTION_DURATION_SCALE, data, backupTag);
restoreIntData(StructuredDataKey.VILLAGER_VARIANT, data, backupTag);
restoreIntData(StructuredDataKey.FOX_VARIANT, data, backupTag);
restoreIntData(StructuredDataKey.SALMON_SIZE, data, backupTag);
restoreIntData(StructuredDataKey.PARROT_VARIANT, data, backupTag);
restoreIntData(StructuredDataKey.TROPICAL_FISH_PATTERN, data, backupTag);
restoreIntData(StructuredDataKey.TROPICAL_FISH_BASE_COLOR, data, backupTag);
restoreIntData(StructuredDataKey.TROPICAL_FISH_PATTERN_COLOR, data, backupTag);
restoreIntData(StructuredDataKey.MOOSHROOM_VARIANT, data, backupTag);
restoreIntData(StructuredDataKey.RABBIT_VARIANT, data, backupTag);
restoreIntData(StructuredDataKey.FROG_VARIANT, data, backupTag);
restoreIntData(StructuredDataKey.HORSE_VARIANT, data, backupTag);
restoreIntData(StructuredDataKey.LLAMA_VARIANT, data, backupTag);
restoreIntData(StructuredDataKey.AXOLOTL_VARIANT, data, backupTag);
restoreIntData(StructuredDataKey.CAT_VARIANT, data, backupTag);
restoreIntData(StructuredDataKey.CAT_COLLAR, data, backupTag);
restoreIntData(StructuredDataKey.SHEEP_COLOR, data, backupTag);
restoreIntData(StructuredDataKey.SHULKER_COLOR, data, backupTag);
restoreIntData(StructuredDataKey.WOLF_SOUND_VARIANT, data, backupTag);
restoreIntData(StructuredDataKey.COW_VARIANT, data, backupTag);
restoreIntData(StructuredDataKey.PIG_VARIANT, data, backupTag);
restoreIntData(StructuredDataKey.WOLF_VARIANT, data, backupTag);
restoreHolderData(StructuredDataKey.BREAK_SOUND, data, backupTag, this::tagToSound);
restoreHolderData(StructuredDataKey.PAINTING_VARIANT, data, backupTag, tag -> {
final int width = tag.getInt("width");
final int height = tag.getInt("height");
final String assetId = tag.getString("asset_id");
final Tag title = tag.get("title");
final Tag author = tag.get("author");
return new PaintingVariant(width, height, assetId, title, author);
});
removeCustomTag(data, customData);
}
private SoundEvent tagToSound(final CompoundTag tag) {
final String identifier = tag.getString("identifier");
final FloatTag fixedRangeTag = tag.getFloatTag("fixed_range");
return new SoundEvent(identifier, fixedRangeTag != null ? fixedRangeTag.asFloat() : null);
}
}
@@ -0,0 +1,274 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2025 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_21_5to1_21_4.rewriter;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.nbt.tag.ListTag;
import com.viaversion.nbt.tag.NumberTag;
import com.viaversion.nbt.tag.StringTag;
import com.viaversion.nbt.tag.Tag;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.rewriters.text.NBTComponentRewriter;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ClientboundPacket1_21_5;
import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.rewriter.BlockItemPacketRewriter1_21_5;
import com.viaversion.viaversion.util.Key;
import com.viaversion.viaversion.util.SerializerVersion;
import com.viaversion.viaversion.util.TagUtil;
import java.util.HashSet;
import java.util.Set;
import static com.viaversion.viaversion.util.TagUtil.getNamespacedCompoundTag;
import static com.viaversion.viaversion.util.TagUtil.getNamespacedCompoundTagList;
import static com.viaversion.viaversion.util.TagUtil.getNamespacedNumberTag;
import static com.viaversion.viaversion.util.TagUtil.removeNamespaced;
public final class ComponentRewriter1_21_5 extends NBTComponentRewriter<ClientboundPacket1_21_5> {
public ComponentRewriter1_21_5(final BackwardsProtocol<ClientboundPacket1_21_5, ?, ?, ?> protocol) {
super(protocol);
}
@Override
protected void processCompoundTag(final UserConnection connection, final CompoundTag tag) {
super.processCompoundTag(connection, tag);
if (tag.remove("hover_event") instanceof final CompoundTag hoverEvent) {
tag.put("hoverEvent", hoverEvent);
}
if (tag.remove("click_event") instanceof final CompoundTag clickEvent) {
tag.put("clickEvent", clickEvent);
updateClickEvent(clickEvent);
}
}
@Override
protected void handleHoverEvent(final UserConnection connection, final CompoundTag hoverEventTag) {
final String action = hoverEventTag.getString("action");
if (action == null) {
return;
}
switch (action) {
case "show_text" -> updateShowTextHover(hoverEventTag);
case "show_entity" -> updateShowEntityHover(hoverEventTag);
case "show_item" -> updateShowItemHover(connection, hoverEventTag);
}
}
private void updateClickEvent(final CompoundTag clickEventTag) {
final String action = clickEventTag.getString("action");
if (action == null) {
return;
}
switch (action) {
case "open_url" -> clickEventTag.put("value", clickEventTag.getStringTag("url"));
case "change_page" -> clickEventTag.putString("value", Integer.toString(clickEventTag.getInt("page")));
case "run_command", "suggest_command" -> clickEventTag.put("value", clickEventTag.getStringTag("command"));
}
}
private void updateShowTextHover(final CompoundTag hoverEventTag) {
final Tag text = hoverEventTag.remove("value");
hoverEventTag.put("contents", text);
}
private void updateShowItemHover(final UserConnection connection, final CompoundTag hoverEventTag) {
final CompoundTag contents = new CompoundTag();
hoverEventTag.put("contents", contents);
if (hoverEventTag.get("count") instanceof NumberTag countTag) {
contents.put("count", countTag);
}
if (hoverEventTag.get("id") instanceof StringTag idTag) {
contents.put("id", idTag);
}
final CompoundTag componentsTag = hoverEventTag.getCompoundTag("components");
handleShowItem(connection, contents, componentsTag);
if (componentsTag == null) {
return;
}
hoverEventTag.remove("components");
contents.put("components", componentsTag);
final CompoundTag useRemainder = TagUtil.getNamespacedCompoundTag(componentsTag, "use_remainder");
if (useRemainder != null) {
handleShowItem(connection, useRemainder);
}
handleContainerContents(connection, componentsTag);
handleItemArrayContents(connection, componentsTag, "bundle_contents");
handleItemArrayContents(connection, componentsTag, "charged_projectiles");
handleWrittenBookContents(connection, componentsTag);
insertUglyJson(componentsTag, connection);
updateDataComponents(componentsTag);
removeDataComponents(componentsTag, BlockItemPacketRewriter1_21_5.NEW_DATA_TO_REMOVE);
}
private void updateDataComponents(final CompoundTag componentsTag) {
final CompoundTag tooltipDisplay = getNamespacedCompoundTag(componentsTag, "tooltip_display");
Set<String> hiddenComponents = Set.of();
if (tooltipDisplay != null) {
final ListTag<StringTag> hiddenComponentsTag = tooltipDisplay.getListTag("hidden_components", StringTag.class);
if (hiddenComponentsTag != null) {
hiddenComponents = new HashSet<>(hiddenComponentsTag.size());
for (final StringTag stringTag : hiddenComponentsTag) {
hiddenComponents.add(Key.stripMinecraftNamespace(stringTag.getValue()));
}
}
}
final ListTag<CompoundTag> attributeModifiers = getNamespacedCompoundTagList(componentsTag, "attribute_modifiers");
if (attributeModifiers != null) {
removeNamespaced(componentsTag, "attribute_modifiers");
final CompoundTag attributesParent = new CompoundTag();
attributesParent.put("modifiers", attributeModifiers);
attributesParent.putBoolean("show_in_tooltip", hiddenComponents.contains("attribute_modifiers"));
componentsTag.put("attribute_modifiers", attributesParent);
}
final NumberTag dyedColor = getNamespacedNumberTag(componentsTag, "dyed_color");
if (dyedColor != null) {
removeNamespaced(componentsTag, "dyed_color");
final CompoundTag dyedColorParent = new CompoundTag();
dyedColorParent.put("rgb", dyedColor);
dyedColorParent.putBoolean("show_in_tooltip", hiddenComponents.contains("dyed_color"));
componentsTag.put("dyed_color", dyedColorParent);
}
updateShowInTooltip(componentsTag, "unbreakable", hiddenComponents);
updateShowInTooltip(componentsTag, "dyed_color", hiddenComponents);
updateShowInTooltip(componentsTag, "trim", hiddenComponents);
updateShowInTooltip(componentsTag, "jukebox_playable", hiddenComponents);
handleAdventureModePredicate(componentsTag, "can_place_on", hiddenComponents);
handleAdventureModePredicate(componentsTag, "can_break", hiddenComponents);
handleEnchantments(componentsTag, "enchantments", hiddenComponents);
handleEnchantments(componentsTag, "stored_enchantments", hiddenComponents);
}
private void updateShowInTooltip(final CompoundTag tag, final String key, final Set<String> hiddenComponents) {
final CompoundTag data = getNamespacedCompoundTag(tag, key);
if (data != null) {
data.putBoolean("show_in_tooltip", hiddenComponents.contains(key));
}
}
private void handleAdventureModePredicate(final CompoundTag componentsTag, final String key, final Set<String> hiddenComponents) {
final ListTag<CompoundTag> blockPredicates = getNamespacedCompoundTagList(componentsTag, key);
if (blockPredicates == null) {
return;
}
removeDataComponents(componentsTag, key);
final CompoundTag predicate = new CompoundTag();
predicate.put("predicates", blockPredicates);
predicate.putBoolean("show_in_tooltip", hiddenComponents.contains(key));
componentsTag.put(key, predicate);
}
private void handleEnchantments(final CompoundTag componentsTag, final String key, final Set<String> hiddenComponents) {
final CompoundTag levels = getNamespacedCompoundTag(componentsTag, key);
if (levels != null) {
removeNamespaced(componentsTag, key);
final CompoundTag enchantments = new CompoundTag();
enchantments.put("levels", levels);
enchantments.putBoolean("show_in_tooltip", hiddenComponents.contains(key));
componentsTag.put(key, enchantments);
}
}
private void insertUglyJson(final CompoundTag componentsTag, final UserConnection connection) {
insertUglyJson(componentsTag, "item_name", connection);
insertUglyJson(componentsTag, "custom_name", connection);
final String loreKey = TagUtil.getNamespacedTagKey(componentsTag, "lore");
final ListTag<?> lore = componentsTag.getListTag(loreKey);
if (lore != null) {
componentsTag.put(loreKey, updateComponentList(connection, lore));
}
}
public ListTag<StringTag> updateComponentList(final UserConnection connection, final ListTag<?> messages) {
final ListTag<StringTag> updatedMessages = new ListTag<>(StringTag.class);
for (final Tag message : messages) {
updatedMessages.add(new StringTag(toUglyJson(connection, message)));
}
return updatedMessages;
}
private void insertUglyJson(final CompoundTag componentsTag, final String key, final UserConnection connection) {
final String actualKey = TagUtil.getNamespacedTagKey(componentsTag, key);
final Tag tag = componentsTag.get(actualKey);
if (tag == null) {
return;
}
componentsTag.putString(actualKey, toUglyJson(connection, tag));
}
private void updateShowEntityHover(final CompoundTag hoverEventTag) {
final CompoundTag contents = new CompoundTag();
hoverEventTag.put("contents", contents);
final Tag nameTag = hoverEventTag.remove("name");
if (nameTag != null) {
contents.put("name", nameTag);
}
if (hoverEventTag.remove("id") instanceof StringTag typeTag) {
contents.put("type", typeTag);
}
final Tag uuidTag = hoverEventTag.remove("uuid");
if (uuidTag != null) {
contents.put("id", uuidTag);
}
}
private String toUglyJson(final UserConnection connection, final Tag value) {
processTag(connection, value);
return SerializerVersion.V1_21_4.toString(SerializerVersion.V1_21_4.toComponent(value));
}
@Override
protected void handleWrittenBookContents(final UserConnection connection, final CompoundTag tag) {
final CompoundTag book = TagUtil.getNamespacedCompoundTag(tag, "written_book_content");
if (book == null) {
return;
}
final ListTag<CompoundTag> pagesTag = book.getListTag("pages", CompoundTag.class);
if (pagesTag == null) {
return;
}
for (final CompoundTag compoundTag : pagesTag) {
final Tag raw = compoundTag.get("raw");
compoundTag.putString("raw", toUglyJson(connection, raw));
final Tag filtered = compoundTag.get("filtered");
if (filtered != null) {
compoundTag.putString("filtered", toUglyJson(connection, raw));
}
}
}
}
@@ -0,0 +1,311 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2025 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_21_5to1_21_4.rewriter;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.nbt.tag.ListTag;
import com.viaversion.nbt.tag.StringTag;
import com.viaversion.viabackwards.api.rewriters.EntityRewriter;
import com.viaversion.viabackwards.protocol.v1_21_5to1_21_4.Protocol1_21_5To1_21_4;
import com.viaversion.viabackwards.protocol.v1_21_5to1_21_4.storage.HorseDataStorage;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.data.entity.TrackedEntity;
import com.viaversion.viaversion.api.minecraft.Holder;
import com.viaversion.viaversion.api.minecraft.RegistryEntry;
import com.viaversion.viaversion.api.minecraft.WolfVariant;
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_5;
import com.viaversion.viaversion.api.minecraft.entitydata.EntityData;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.version.Types1_21_4;
import com.viaversion.viaversion.api.type.types.version.Types1_21_5;
import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundConfigurationPackets1_21;
import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ClientboundPacket1_21_5;
import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ClientboundPackets1_21_5;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPackets1_21_2;
import com.viaversion.viaversion.rewriter.RegistryDataRewriter;
import com.viaversion.viaversion.util.Key;
import java.util.Set;
import java.util.UUID;
public final class EntityPacketRewriter1_21_5 extends EntityRewriter<ClientboundPacket1_21_5, Protocol1_21_5To1_21_4> {
private static final Set<String> NEW_REGISTRIES = Set.of("pig_variant", "cow_variant", "frog_variant", "cat_variant",
"chicken_variant", "test_environment", "test_instance", "wolf_sound_variant");
public EntityPacketRewriter1_21_5(final Protocol1_21_5To1_21_4 protocol) {
super(protocol, Types1_21_4.ENTITY_DATA_TYPES.optionalComponentType, Types1_21_4.ENTITY_DATA_TYPES.booleanType);
}
@Override
public void registerPackets() {
registerSetEntityData(ClientboundPackets1_21_5.SET_ENTITY_DATA, Types1_21_5.ENTITY_DATA_LIST, Types1_21_4.ENTITY_DATA_LIST);
registerRemoveEntities(ClientboundPackets1_21_5.REMOVE_ENTITIES);
protocol.appendClientbound(ClientboundPackets1_21_5.ADD_ENTITY, wrapper -> {
final int entityId = wrapper.passthrough(Types.VAR_INT);
final UUID uuid = wrapper.read(Types.UUID);
final int entityType = wrapper.read(Types.VAR_INT);
if (entityType != EntityTypes1_21_5.EXPERIENCE_ORB.getId()) {
wrapper.write(Types.UUID, uuid);
wrapper.write(Types.VAR_INT, entityType);
wrapper.passthrough(Types.DOUBLE); // X
wrapper.passthrough(Types.DOUBLE); // Y
wrapper.passthrough(Types.DOUBLE); // Z
wrapper.passthrough(Types.BYTE); // Pitch
wrapper.passthrough(Types.BYTE); // Yaw
wrapper.passthrough(Types.BYTE); // Head yaw
wrapper.passthrough(Types.VAR_INT); // Data
getSpawnTrackerWithDataHandler1_19(EntityTypes1_21_5.FALLING_BLOCK).handle(wrapper);
return;
}
tracker(wrapper.user()).addEntity(entityId, EntityTypes1_21_5.EXPERIENCE_ORB);
// Back to its own special packet
wrapper.setPacketType(ClientboundPackets1_21_2.ADD_EXPERIENCE_ORB);
wrapper.passthrough(Types.DOUBLE); // X
wrapper.passthrough(Types.DOUBLE); // Y
wrapper.passthrough(Types.DOUBLE); // Z
wrapper.read(Types.BYTE); // Pitch
wrapper.read(Types.BYTE); // Yaw
wrapper.read(Types.BYTE); // Head yaw
final int data = wrapper.read(Types.VAR_INT);
wrapper.write(Types.SHORT, (short) data);
final short velocityX = wrapper.read(Types.SHORT);
final short velocityY = wrapper.read(Types.SHORT);
final short velocityZ = wrapper.read(Types.SHORT);
if (velocityX != 0 || velocityY != 0 || velocityZ != 0) {
// Send movement separately
final PacketWrapper motionPacket = wrapper.create(ClientboundPackets1_21_2.SET_ENTITY_MOTION);
motionPacket.write(Types.VAR_INT, entityId);
motionPacket.write(Types.SHORT, velocityX);
motionPacket.write(Types.SHORT, velocityY);
motionPacket.write(Types.SHORT, velocityZ);
wrapper.send(Protocol1_21_5To1_21_4.class);
motionPacket.send(Protocol1_21_5To1_21_4.class);
wrapper.cancel();
}
});
final RegistryDataRewriter registryDataRewriter = new RegistryDataRewriter(protocol) {
@Override
public RegistryEntry[] handle(final UserConnection connection, final String key, final RegistryEntry[] entries) {
final boolean trimPatternRegistry = key.equals("trim_pattern");
if (trimPatternRegistry || key.equals("trim_material")) {
updateTrim(entries, trimPatternRegistry ? "template_item" : "ingredient");
return super.handle(connection, key, entries);
}
if (!key.equals("wolf_variant")) {
return super.handle(connection, key, entries);
}
for (final RegistryEntry entry : entries) {
if (entry.tag() == null) {
continue;
}
final CompoundTag variant = (CompoundTag) entry.tag();
final CompoundTag assets = (CompoundTag) variant.remove("assets");
variant.put("wild_texture", assets.get("wild"));
variant.put("tame_texture", assets.get("tame"));
variant.put("angry_texture", assets.get("angry"));
variant.put("biomes", new ListTag<>(StringTag.class));
}
return entries;
}
private void updateTrim(final RegistryEntry[] entries, final String itemKey) {
for (final RegistryEntry entry : entries) {
if (entry.tag() == null) {
continue;
}
final CompoundTag tag = (CompoundTag) entry.tag();
tag.putString(itemKey, "stone"); // dummy ingredient
}
}
};
protocol.registerClientbound(ClientboundConfigurationPackets1_21.REGISTRY_DATA, wrapper -> {
final String registryKey = Key.stripMinecraftNamespace(wrapper.passthrough(Types.STRING));
if (NEW_REGISTRIES.contains(registryKey)) {
wrapper.cancel();
return;
}
final RegistryEntry[] entries = wrapper.read(Types.REGISTRY_ENTRY_ARRAY);
wrapper.write(Types.REGISTRY_ENTRY_ARRAY, registryDataRewriter.handle(wrapper.user(), registryKey, entries));
});
protocol.registerClientbound(ClientboundPackets1_21_5.LOGIN, wrapper -> {
final int entityId = wrapper.passthrough(Types.INT); // Entity id
wrapper.passthrough(Types.BOOLEAN); // Hardcore
wrapper.passthrough(Types.STRING_ARRAY); // World List
wrapper.passthrough(Types.VAR_INT); // Max players
wrapper.passthrough(Types.VAR_INT); // View distance
wrapper.passthrough(Types.VAR_INT); // Simulation distance
wrapper.passthrough(Types.BOOLEAN); // Reduced debug info
wrapper.passthrough(Types.BOOLEAN); // Show death screen
wrapper.passthrough(Types.BOOLEAN); // Limited crafting
final int dimensionId = wrapper.passthrough(Types.VAR_INT);
final String world = wrapper.passthrough(Types.STRING);
trackWorldDataByKey1_20_5(wrapper.user(), dimensionId, world);
trackPlayer(wrapper.user(), entityId);
});
protocol.registerClientbound(ClientboundPackets1_21_5.RESPAWN, wrapper -> {
final int dimensionId = wrapper.passthrough(Types.VAR_INT);
final String world = wrapper.passthrough(Types.STRING);
trackWorldDataByKey1_20_5(wrapper.user(), dimensionId, world);
});
protocol.registerClientbound(ClientboundPackets1_21_5.SET_PLAYER_TEAM, wrapper -> {
wrapper.passthrough(Types.STRING); // Team Name
final byte action = wrapper.passthrough(Types.BYTE); // Mode
if (action == 0 || action == 2) {
wrapper.passthrough(Types.TAG); // Display Name
wrapper.passthrough(Types.BYTE); // Flags
final int nametagVisibility = wrapper.read(Types.VAR_INT);
final int collisionRule = wrapper.read(Types.VAR_INT);
wrapper.write(Types.STRING, visibility(nametagVisibility));
wrapper.write(Types.STRING, collision(collisionRule));
wrapper.passthrough(Types.VAR_INT); // Color
wrapper.passthrough(Types.TAG); // Prefix
wrapper.passthrough(Types.TAG); // Suffix
}
});
}
private String visibility(final int id) {
return switch (id) {
case 0 -> "always";
case 1 -> "never";
case 2 -> "hideForOtherTeams";
case 3 -> "hideForOwnTeam";
default -> "always";
};
}
private String collision(final int id) {
return switch (id) {
case 0 -> "always";
case 1 -> "never";
case 2 -> "pushOtherTeams";
case 3 -> "pushOwnTeam";
default -> "always";
};
}
@Override
protected void registerRewrites() {
filter().handler((event, data) -> {
final int id = data.dataType().typeId();
if (id == Types1_21_5.ENTITY_DATA_TYPES.wolfVariantType.typeId()) {
final int type = data.value();
final Holder<WolfVariant> variant = Holder.of(type);
data.setTypeAndValue(Types1_21_4.ENTITY_DATA_TYPES.wolfVariantType, variant);
return;
}
int mappedId = id;
if (id == Types1_21_5.ENTITY_DATA_TYPES.cowVariantType.typeId()
|| id == Types1_21_5.ENTITY_DATA_TYPES.pigVariantType.typeId()
|| id == Types1_21_5.ENTITY_DATA_TYPES.chickenVariantType.typeId()
|| id == Types1_21_5.ENTITY_DATA_TYPES.wolfSoundVariantType.typeId()) {
event.cancel();
return;
} else if (id > Types1_21_5.ENTITY_DATA_TYPES.chickenVariantType.typeId()) {
mappedId -= 4;
} else if (id > Types1_21_5.ENTITY_DATA_TYPES.pigVariantType.typeId()) {
mappedId -= 3;
} else if (id > Types1_21_5.ENTITY_DATA_TYPES.wolfSoundVariantType.typeId()) {
mappedId -= 2;
} else if (id > Types1_21_5.ENTITY_DATA_TYPES.cowVariantType.typeId()) {
mappedId -= 1;
}
data.setDataType(Types1_21_4.ENTITY_DATA_TYPES.byId(mappedId));
});
registerEntityDataTypeHandler1_20_3(
Types1_21_4.ENTITY_DATA_TYPES.itemType,
Types1_21_4.ENTITY_DATA_TYPES.blockStateType,
Types1_21_4.ENTITY_DATA_TYPES.optionalBlockStateType,
Types1_21_4.ENTITY_DATA_TYPES.particleType,
Types1_21_4.ENTITY_DATA_TYPES.particlesType,
Types1_21_4.ENTITY_DATA_TYPES.componentType,
Types1_21_4.ENTITY_DATA_TYPES.optionalComponentType
);
filter().type(EntityTypes1_21_5.ABSTRACT_MINECART).addIndex(13); // Custom display
filter().type(EntityTypes1_21_5.ABSTRACT_MINECART).index(11).handler((event, data) -> {
final int state = (int) data.getValue();
final int mappedBlockState = protocol.getMappingData().getNewBlockStateId(state);
data.setTypeAndValue(Types1_21_5.ENTITY_DATA_TYPES.varIntType, mappedBlockState);
event.createExtraData(new EntityData(13, Types1_21_4.ENTITY_DATA_TYPES.booleanType, true));
});
filter().type(EntityTypes1_21_5.MOOSHROOM).index(17).handler(((event, data) -> {
final int typeId = data.value();
final String typeName = typeId == 0 ? "red" : "brown";
data.setTypeAndValue(Types1_21_5.ENTITY_DATA_TYPES.stringType, typeName);
}));
filter().type(EntityTypes1_21_5.ABSTRACT_HORSE).index(17).handler((event, data) -> {
// Store data for later
final TrackedEntity entity = event.trackedEntity();
if (entity.hasData()) {
final HorseDataStorage horseDataStorage = entity.data().get(HorseDataStorage.class);
if (horseDataStorage != null && horseDataStorage.saddled()) {
entity.data().put(new HorseDataStorage(data.value(), true));
return;
}
}
entity.data().put(new HorseDataStorage(data.value(), false));
});
filter().type(EntityTypes1_21_5.CHICKEN).cancel(17); // Chicken variant
filter().type(EntityTypes1_21_5.COW).cancel(17); // Cow variant
filter().type(EntityTypes1_21_5.PIG).cancel(19); // Pig variant
filter().type(EntityTypes1_21_5.WOLF).cancel(23); // Sound variant
filter().type(EntityTypes1_21_5.EXPERIENCE_ORB).cancel(8); // Value
filter().type(EntityTypes1_21_5.DOLPHIN).addIndex(17); // Treasure pos
filter().type(EntityTypes1_21_5.TURTLE).addIndex(17); // Home pos
// Saddled
filter().type(EntityTypes1_21_5.PIG).addIndex(17);
filter().type(EntityTypes1_21_5.STRIDER).addIndex(19);
}
@Override
public void onMappingDataLoaded() {
mapTypes();
}
@Override
public EntityType typeFromId(final int type) {
return EntityTypes1_21_5.getTypeFromId(type);
}
}
@@ -0,0 +1,21 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2025 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_21_5to1_21_4.storage;
public record HorseDataStorage(byte data, boolean saddled) {
}
@@ -20,7 +20,7 @@ package com.viaversion.viabackwards.protocol.v1_21to1_20_5;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.data.BackwardsMappingData;
import com.viaversion.viabackwards.api.rewriters.SoundRewriter;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
import com.viaversion.viabackwards.protocol.v1_21to1_20_5.rewriter.BlockItemPacketRewriter1_21;
import com.viaversion.viabackwards.protocol.v1_21to1_20_5.rewriter.ComponentRewriter1_21;
import com.viaversion.viabackwards.protocol.v1_21to1_20_5.rewriter.EntityPacketRewriter1_21;
@@ -60,7 +60,7 @@ public final class Protocol1_21To1_20_5 extends BackwardsProtocol<ClientboundPac
private final EntityPacketRewriter1_21 entityRewriter = new EntityPacketRewriter1_21(this);
private final BlockItemPacketRewriter1_21 itemRewriter = new BlockItemPacketRewriter1_21(this);
private final ParticleRewriter<ClientboundPacket1_21> particleRewriter = new ParticleRewriter<>(this, Types1_21.PARTICLE, Types1_20_5.PARTICLE);
private final TranslatableRewriter<ClientboundPacket1_21> translatableRewriter = new ComponentRewriter1_21(this);
private final JsonNBTComponentRewriter<ClientboundPacket1_21> translatableRewriter = new ComponentRewriter1_21(this);
private final TagRewriter<ClientboundPacket1_21> tagRewriter = new TagRewriter<>(this);
public Protocol1_21To1_20_5() {
@@ -219,7 +219,7 @@ public final class Protocol1_21To1_20_5 extends BackwardsProtocol<ClientboundPac
}
@Override
public TranslatableRewriter<ClientboundPacket1_21> getComponentRewriter() {
public JsonNBTComponentRewriter<ClientboundPacket1_21> getComponentRewriter() {
return translatableRewriter;
}
@@ -29,6 +29,7 @@ import com.viaversion.viabackwards.protocol.v1_21to1_20_5.storage.EnchantmentsPa
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.EitherHolder;
import com.viaversion.viaversion.api.minecraft.Holder;
import com.viaversion.viaversion.api.minecraft.SoundEvent;
import com.viaversion.viaversion.api.minecraft.data.StructuredDataContainer;
@@ -41,7 +42,7 @@ import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2;
import com.viaversion.viaversion.api.type.types.version.Types1_20_5;
import com.viaversion.viaversion.api.type.types.version.Types1_21;
import com.viaversion.viaversion.libs.fastutil.ints.Int2IntMap;
import com.viaversion.viaversion.libs.mcstructs.core.TextFormatting;
import com.viaversion.viaversion.libs.mcstructs.text.TextFormatting;
import com.viaversion.viaversion.libs.mcstructs.text.components.StringComponent;
import com.viaversion.viaversion.libs.mcstructs.text.components.TranslationComponent;
import com.viaversion.viaversion.protocols.v1_20_2to1_20_3.rewriter.RecipeRewriter1_20_3;
@@ -52,7 +53,6 @@ import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundPacke
import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundPackets1_21;
import com.viaversion.viaversion.rewriter.BlockRewriter;
import com.viaversion.viaversion.rewriter.IdRewriteFunction;
import com.viaversion.viaversion.util.Either;
import com.viaversion.viaversion.util.SerializerVersion;
import java.util.ArrayList;
import java.util.List;
@@ -185,8 +185,8 @@ public final class BlockItemPacketRewriter1_21 extends BackwardsStructuredItemRe
return SerializerVersion.V1_20_5.toTag(component);
};
enchantmentRewriter.rewriteEnchantmentsToClient(data, StructuredDataKey.ENCHANTMENTS, idRewriteFunction, descriptionSupplier, false);
enchantmentRewriter.rewriteEnchantmentsToClient(data, StructuredDataKey.STORED_ENCHANTMENTS, idRewriteFunction, descriptionSupplier, true);
enchantmentRewriter.rewriteEnchantmentsToClient(data, StructuredDataKey.ENCHANTMENTS1_20_5, idRewriteFunction, descriptionSupplier, false);
enchantmentRewriter.rewriteEnchantmentsToClient(data, StructuredDataKey.STORED_ENCHANTMENTS1_20_5, idRewriteFunction, descriptionSupplier, true);
final int identifier = item.identifier();
@@ -218,8 +218,8 @@ public final class BlockItemPacketRewriter1_21 extends BackwardsStructuredItemRe
// Rewrite enchantments
final EnchantmentsPaintingsStorage storage = connection.get(EnchantmentsPaintingsStorage.class);
rewriteEnchantmentToServer(storage, item, StructuredDataKey.ENCHANTMENTS);
rewriteEnchantmentToServer(storage, item, StructuredDataKey.STORED_ENCHANTMENTS);
rewriteEnchantmentToServer(storage, item, StructuredDataKey.ENCHANTMENTS1_20_5);
rewriteEnchantmentToServer(storage, item, StructuredDataKey.STORED_ENCHANTMENTS1_20_5);
// Restore originals if present
enchantmentRewriter.handleToServer(item);
@@ -274,14 +274,14 @@ public final class BlockItemPacketRewriter1_21 extends BackwardsStructuredItemRe
final StructuredDataContainer data = item.dataContainer();
data.setIdLookup(protocol, true);
final JukeboxPlayable jukeboxPlayable = data.get(StructuredDataKey.JUKEBOX_PLAYABLE);
final JukeboxPlayable jukeboxPlayable = data.get(StructuredDataKey.JUKEBOX_PLAYABLE1_21);
if (jukeboxPlayable == null) {
return;
}
final CompoundTag tag = new CompoundTag();
if (jukeboxPlayable.song().isLeft()) {
final Holder<JukeboxPlayable.JukeboxSong> songHolder = jukeboxPlayable.song().left();
if (jukeboxPlayable.song().hasHolder()) {
final Holder<JukeboxPlayable.JukeboxSong> songHolder = jukeboxPlayable.song().holder();
tag.put("song", holderToTag(songHolder, (song, songTag) -> {
songTag.put("sound_event", holderToTag(song.soundEvent(), (soundEvent, soundEventTag) -> {
soundEventTag.putString("identifier", soundEvent.identifier());
@@ -294,7 +294,7 @@ public final class BlockItemPacketRewriter1_21 extends BackwardsStructuredItemRe
songTag.putInt("comparator_output", song.comparatorOutput());
}));
} else {
tag.putString("song_identifier", jukeboxPlayable.song().right());
tag.putString("song_identifier", jukeboxPlayable.song().key());
}
tag.putBoolean("show_in_tooltip", jukeboxPlayable.showInTooltip());
@@ -308,12 +308,12 @@ public final class BlockItemPacketRewriter1_21 extends BackwardsStructuredItemRe
return;
}
final Either<Holder<JukeboxPlayable.JukeboxSong>, String> song;
final EitherHolder<JukeboxPlayable.JukeboxSong> song;
final String songIdentifier = tag.getString("song_identifier");
if (songIdentifier != null) {
song = Either.right(tag.getString(songIdentifier));
song = EitherHolder.of(songIdentifier);
} else {
song = Either.left(restoreHolder(tag, "song", songTag -> {
song = EitherHolder.of(restoreHolder(tag, "song", songTag -> {
final Holder<SoundEvent> soundEvent = restoreHolder(songTag, "sound_event", soundTag -> {
final String identifier = soundTag.getString("identifier");
final Float fixedRange = soundTag.contains("fixed_range") ? soundTag.getFloat("fixed_range") : null;
@@ -327,7 +327,7 @@ public final class BlockItemPacketRewriter1_21 extends BackwardsStructuredItemRe
}
final JukeboxPlayable jukeboxPlayable = new JukeboxPlayable(song, tag.getBoolean("show_in_tooltip"));
data.set(StructuredDataKey.JUKEBOX_PLAYABLE, jukeboxPlayable);
data.set(StructuredDataKey.JUKEBOX_PLAYABLE1_21, jukeboxPlayable);
removeCustomTag(data, customData);
}
@@ -20,9 +20,10 @@ package com.viaversion.viabackwards.protocol.v1_21to1_20_5.rewriter;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.nbt.tag.IntArrayTag;
import com.viaversion.nbt.tag.ListTag;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
import com.viaversion.viabackwards.protocol.v1_21to1_20_5.Protocol1_21To1_20_5;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.data.StructuredDataKey;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.data.Attributes1_20_5;
import com.viaversion.viaversion.protocols.v1_20_5to1_21.Protocol1_20_5To1_21;
import com.viaversion.viaversion.protocols.v1_20_5to1_21.data.AttributeModifierMappings1_21;
@@ -33,7 +34,7 @@ import com.viaversion.viaversion.util.TagUtil;
import com.viaversion.viaversion.util.UUIDUtil;
import java.util.UUID;
public final class ComponentRewriter1_21 extends TranslatableRewriter<ClientboundPacket1_21> {
public final class ComponentRewriter1_21 extends JsonNBTComponentRewriter<ClientboundPacket1_21> {
public ComponentRewriter1_21(final Protocol1_21To1_20_5 protocol) {
super(protocol, ReadType.NBT);
@@ -68,7 +69,7 @@ public final class ComponentRewriter1_21 extends TranslatableRewriter<Clientboun
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");
removeDataComponents(componentsTag, StructuredDataKey.JUKEBOX_PLAYABLE1_21);
convertAttributeModifiersComponent(componentsTag);
}
}
@@ -18,15 +18,12 @@
package com.viaversion.viabackwards.protocol.v1_9_1to1_9;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viaversion.api.protocol.AbstractProtocol;
import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.protocols.v1_8to1_9.packet.ClientboundPackets1_9;
import com.viaversion.viaversion.protocols.v1_8to1_9.packet.ServerboundPackets1_9;
import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ClientboundPackets1_9_3;
import com.viaversion.viaversion.rewriter.ComponentRewriter;
import com.viaversion.viaversion.rewriter.text.ComponentRewriterBase;
public class Protocol1_9_1To1_9 extends BackwardsProtocol<ClientboundPackets1_9, ClientboundPackets1_9, ServerboundPackets1_9, ServerboundPackets1_9> {
@@ -66,7 +63,7 @@ public class Protocol1_9_1To1_9 extends BackwardsProtocol<ClientboundPackets1_9,
}
});
TranslatableRewriter<ClientboundPackets1_9> componentRewriter = new TranslatableRewriter<>(this, ComponentRewriter.ReadType.JSON);
JsonNBTComponentRewriter<ClientboundPackets1_9> componentRewriter = new JsonNBTComponentRewriter<>(this, ComponentRewriterBase.ReadType.JSON);
componentRewriter.registerComponentPacket(ClientboundPackets1_9.CHAT);
}
}
@@ -18,7 +18,7 @@
package com.viaversion.viabackwards.protocol.v1_9_3to1_9_1;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter;
import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
import com.viaversion.viabackwards.protocol.v1_9_3to1_9_1.data.BlockEntity1_9_1;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.ClientWorld;
@@ -34,7 +34,7 @@ import com.viaversion.viaversion.protocols.v1_8to1_9.packet.ClientboundPackets1_
import com.viaversion.viaversion.protocols.v1_8to1_9.packet.ServerboundPackets1_9;
import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ClientboundPackets1_9_3;
import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ServerboundPackets1_9_3;
import com.viaversion.viaversion.rewriter.ComponentRewriter;
import com.viaversion.viaversion.rewriter.text.ComponentRewriterBase;
public class Protocol1_9_3To1_9_1 extends BackwardsProtocol<ClientboundPackets1_9_3, ClientboundPackets1_9, ServerboundPackets1_9_3, ServerboundPackets1_9> {
@@ -111,7 +111,7 @@ public class Protocol1_9_3To1_9_1 extends BackwardsProtocol<ClientboundPackets1_
}
});
TranslatableRewriter<ClientboundPackets1_9_3> componentRewriter = new TranslatableRewriter<>(this, ComponentRewriter.ReadType.JSON);
JsonNBTComponentRewriter<ClientboundPackets1_9_3> componentRewriter = new JsonNBTComponentRewriter<>(this, ComponentRewriterBase.ReadType.JSON);
componentRewriter.registerComponentPacket(ClientboundPackets1_9_3.CHAT);
}
@@ -17,10 +17,12 @@
*/
package com.viaversion.viabackwards.utils;
import com.viaversion.viaversion.libs.mcstructs.text.ATextComponent;
import com.viaversion.viaversion.libs.mcstructs.text.Style;
import com.viaversion.viaversion.libs.mcstructs.text.TextComponent;
import com.viaversion.viaversion.libs.mcstructs.text.components.TranslationComponent;
import com.viaversion.viaversion.libs.mcstructs.text.serializer.LegacyStringDeserializer;
import com.viaversion.viaversion.libs.mcstructs.text.stringformat.StringFormat;
import com.viaversion.viaversion.libs.mcstructs.text.stringformat.handling.ColorHandling;
import com.viaversion.viaversion.libs.mcstructs.text.stringformat.handling.DeserializerUnknownHandling;
import com.viaversion.viaversion.util.SerializerVersion;
import java.util.HashSet;
import java.util.Objects;
@@ -43,8 +45,8 @@ public final class ChatUtil {
}, itemData);
}
public static String legacyToJsonString(String legacy, Consumer<ATextComponent> consumer, boolean itemData) {
final ATextComponent component = LegacyStringDeserializer.parse(legacy, true);
public static String legacyToJsonString(String legacy, Consumer<TextComponent> consumer, boolean itemData) {
final TextComponent component = StringFormat.vanilla().fromString(legacy, ColorHandling.RESET, DeserializerUnknownHandling.WHITE);
consumer.accept(component);
if (itemData) {
@@ -1,4 +1,158 @@
{
"1.21.5": {
"argument.nbt.expected.compound": "Expected compound tag",
"argument.resource_selector.not_found": "No matches for selector '%s' of type '%s'",
"block.minecraft.bush": "Bush",
"block.minecraft.cactus_flower": "Cactus Flower",
"block.minecraft.firefly_bush": "Firefly Bush",
"block.minecraft.leaf_litter": "Leaf Litter",
"block.minecraft.short_dry_grass": "Short Dry Grass",
"block.minecraft.tall_dry_grass": "Tall Dry Grass",
"block.minecraft.test_block": "Test Block",
"block.minecraft.test_instance_block": "Test Instance Block",
"block.minecraft.tnt.disabled": "TNT explosions are disabled",
"block.minecraft.wildflowers": "Wildflowers",
"commands.test.batch.starting": "Starting environment %s batch %s",
"commands.test.clear.error.no_tests": "Could not find any tests to clear",
"commands.test.clear.success": "Cleared %s structure(s)",
"commands.test.coordinates.copy": "Click to copy to clipboard",
"commands.test.create.success": "Created test setup for test %s",
"commands.test.error.no_test_containing_pos": "Can't find a test instance that contains %s, %s, %s",
"commands.test.error.no_test_instances": "Found no test instances",
"commands.test.error.non_existant_test": "Test %s could not be found",
"commands.test.error.structure_not_found": "Test structure %s could not be found",
"commands.test.error.test_instance_not_found": "Test instance block entity could not be found",
"commands.test.error.test_instance_not_found.position": "Test instance block entity could not be found for test at %s, %s, %s",
"commands.test.error.too_large": "The structure size must be less than %s blocks along each axis",
"commands.test.locate.done": "Finished locating, found %s structure(s)",
"commands.test.locate.found": "Found structure at: %s (distance: %s)",
"commands.test.locate.started": "Started locating test structures, this might take a while...",
"commands.test.no_tests": "No tests to run",
"commands.test.relative_position": "Position relative to %s: %s",
"commands.test.reset.error.no_tests": "Could not find any tests to reset",
"commands.test.reset.success": "Reset %s structure(s)",
"commands.test.run.no_tests": "No tests found",
"commands.test.run.running": "Running %s test(s)...",
"commands.test.summary": "Game Test complete! %s test(s) were run",
"commands.test.summary.all_required_passed": "All required tests passed :)",
"commands.test.summary.failed": "%s required test(s) failed :(",
"commands.test.summary.optional_failed": "%s optional test(s) failed",
"gamerule.allowFireTicksAwayFromPlayer": "Tick fire away from players",
"gamerule.allowFireTicksAwayFromPlayer.description": "Controls whether or not fire and lava should be able to tick further than 8 chunks away from any player",
"gamerule.tntExplodes": "Allow TNT to be activated and to explode",
"item.minecraft.blue_egg": "Blue Egg",
"item.minecraft.brown_egg": "Brown Egg",
"item.minecraft.crossbow.projectile.multiple": "Projectile: %s x %s",
"item.minecraft.crossbow.projectile.single": "Projectile: %s",
"item.minecraft.firework_rocket.multiple_stars": "%s x %s",
"item.modifiers.saddle": "When saddled:",
"multiplayer.disconnect.bad_chat_index": "Detected missed or reordered chat message from server",
"snbt.parser.empty_key": "Key cannot be empty",
"snbt.parser.expected_binary_numeral": "Expected a binary number",
"snbt.parser.expected_decimal_numeral": "Expected a decimal number",
"snbt.parser.expected_float_type": "Expected a floating point number",
"snbt.parser.expected_hex_escape": "Expected a character literal of length %s",
"snbt.parser.expected_hex_numeral": "Expected a hexadecimal number",
"snbt.parser.expected_integer_type": "Expected an integer number",
"snbt.parser.expected_non_negative_number": "Expected a non-negative number",
"snbt.parser.expected_number_or_boolean": "Expected a number or a boolean",
"snbt.parser.expected_string_uuid": "Expected a string representing a valid UUID",
"snbt.parser.expected_unquoted_string": "Expected a valid unquoted string",
"snbt.parser.infinity_not_allowed": "Non-finite numbers are not allowed",
"snbt.parser.invalid_array_element_type": "Invalid array element type",
"snbt.parser.invalid_character_name": "Invalid Unicode character name",
"snbt.parser.invalid_codepoint": "Invalid Unicode character value: %s",
"snbt.parser.invalid_string_contents": "Invalid string contents",
"snbt.parser.invalid_unquoted_start": "Unquoted strings can't start with digits 0-9, + or -",
"snbt.parser.leading_zero_not_allowed": "Decimal numbers can't start with 0",
"snbt.parser.no_such_operation": "No such operation: %s",
"snbt.parser.number_parse_failure": "Failed to parse number: %s",
"snbt.parser.undescore_not_allowed": "Underscore characters are not allowed at the start or end of a number",
"structure_block.strict": "Strict Placement:",
"subtitles.block.deadbush.idle": "Dry sounds",
"subtitles.block.firefly_bush.idle": "Fireflies buzz",
"subtitles.block.sand.idle": "Sandy sounds",
"subtitles.block.sand.wind": "Windy sounds",
"subtitles.entity.wolf.bark": "Wolf barks",
"subtitles.entity.wolf.whine": "Wolf whines",
"test_block.error.missing": "Test structure missing %s block",
"test_block.error.too_many": "Too many %s blocks",
"test_block.invalid_timeout": "Invalid timeout (%s) - must be a positive number of ticks",
"test_block.message": "Message:",
"test_block.mode_info.accept": "Accept Mode - Accept success for (part of) a test",
"test_block.mode_info.fail": "Fail Mode - Fail the test",
"test_block.mode_info.log": "Log Mode - Log a message",
"test_block.mode_info.start": "Start Mode - The starting point for a test",
"test_block.mode.fail": "Fail",
"test_block.mode.log": "Log",
"test_block.mode.start": "Start",
"test_instance_block.entities": "Entities:",
"test_instance_block.error.no_test": "Unable to run test instance at %s, %s, %s since it has an undefined test",
"test_instance_block.error.no_test_structure": "Unable to run test instance at %s, %s, %s since it has no test structure",
"test_instance_block.error.unable_to_save": "Unable to save test structure template for test instance at %s, %s, %s",
"test_instance_block.invalid": "[invalid]",
"test_instance_block.reset_success": "Reset succeeded for test: %s",
"test_instance_block.rotation": "Rotation:",
"test_instance_block.size": "Test Structure Size",
"test_instance_block.starting": "Starting test %s",
"test_instance_block.test_id": "Test Instance ID",
"test_instance.action.reset": "Reset and Load",
"test_instance.action.run": "Load and Run",
"test_instance.action.save": "Save Structure",
"test_instance.description.batch": "Batch: %s",
"test_instance.description.failed": "Failed: %s",
"test_instance.description.function": "Function: %s",
"test_instance.description.invalid_id": "Invalid test ID",
"test_instance.description.no_test": "No such test",
"test_instance.description.structure": "Structure: %s",
"test_instance.type.block_based": "Block-Based Test",
"test_instance.type.function": "Built-in Function Test",
"test.error.block_property_mismatch": "Expected property %s to be %s, was %s",
"test.error.block_property_missing": "Block property missing, expected property %s to be %s",
"test.error.entity_property": "Entity %s failed test: %s",
"test.error.entity_property_details": "Entity %s failed test: %s, expected: %s, was: %s",
"test.error.expected_block": "Expected block %s, got %s",
"test.error.expected_block_tag": "Expected block in #%s, got %s",
"test.error.expected_container_contents": "Container should contain: %s",
"test.error.expected_container_contents_single": "Container should contain a single: %s",
"test.error.expected_empty_container": "Container should be empty",
"test.error.expected_entity": "Expected %s",
"test.error.expected_entity_around": "Expected %s to exist around %s, %s, %s",
"test.error.expected_entity_count": "Expected %s entities of type %s, found %s",
"test.error.expected_entity_data": "Expected entity data to be: %s, was: %s",
"test.error.expected_entity_data_predicate": "Entity data mismatch for %s",
"test.error.expected_entity_effect": "Expected %s to have effect %s %s",
"test.error.expected_entity_having": "Entity inventory should contain %s",
"test.error.expected_entity_holding": "Entity should be holding %s",
"test.error.expected_entity_in_test": "Expected %s to exist in test",
"test.error.expected_entity_not_touching": "Did not expect %s touching %s, %s, %s (relative: %s, %s, %s)",
"test.error.expected_entity_touching": "Expected %s touching %s, %s, %s (relative: %s, %s, %s)",
"test.error.expected_item": "Expected item of type %s",
"test.error.expected_items_count": "Expected %s items of type %s, found %s",
"test.error.fail": "Fail conditions met",
"test.error.invalid_block_type": "Unexpected block type found: %s",
"test.error.missing_block_entity": "Missing block entity",
"test.error.position": "%s at %s, %s, %s (relative: %s, %s, %s) on tick %s",
"test.error.sequence.condition_already_triggered": "Condition already triggered at %s",
"test.error.sequence.condition_not_triggered": "Condition not triggered",
"test.error.sequence.invalid_tick": "Succeeded in invalid tick: expected %s",
"test.error.sequence.not_completed": "Test timed out before sequence completed",
"test.error.set_biome": "Failed to set biome for test",
"test.error.spawn_failure": "Failed to create entity %s",
"test.error.state_not_equal": "Incorrect state. Expected %s, was %s",
"test.error.structure.failure": "Failed to place test structure for %s",
"test.error.tick": "%s on tick %s",
"test.error.ticking_without_structure": "Ticking test before placing structure",
"test.error.timeout.no_result": "Didn't succeed or fail within %s ticks",
"test.error.timeout.no_sequences_finished": "No sequences finished within %s ticks",
"test.error.too_many_entities": "Expected only one %s to exist around %s, %s, %s but found %s",
"test.error.unexpected_block": "Did not expect block to be %s",
"test.error.unexpected_entity": "Did not expect %s to exist",
"test.error.unexpected_item": "Did not expect item of type %s",
"test.error.unknown": "Unknown internal error: %s",
"test.error.value_not_equal": "Expected %s to be %s, was %s",
"test.error.wrong_block_entity": "Wrong block entity type: %s"
},
"1.21.4": {
"block.minecraft.chiseled_resin_bricks": "Chiseled Resin Bricks",
"block.minecraft.closed_eyeblossom": "Closed Eyeblossom",
+3 -3
View File
@@ -1,8 +1,8 @@
projectVersion=5.2.1
projectVersion=5.3.2
# Smile emoji
mcVersions=1.21.4,1.21.3,1.21.2,1.21.1,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
mcVersionRange=1.10-1.21.4
mcVersions=1.21.5, 1.21.4, 1.21.3, 1.21.2, 1.21.1, 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
mcVersionRange=1.10-1.21.5
velocityVersion=3.4
org.gradle.configureondemand=true
+3 -3
View File
@@ -3,20 +3,20 @@ metadata.format.version = "1.1"
[versions]
# ViaVersion
viaver = "5.2.1-SNAPSHOT"
viaver = "5.3.2-SNAPSHOT"
# Common provided
netty = "4.0.20.Final"
guava = "17.0"
log4j = "2.8.1"
checkerQual = "3.39.0"
checkerQual = "3.49.1"
# Platforms
paper = "1.16.5-R0.1-SNAPSHOT"
velocity = "3.1.1"
fabricLoader = "0.11.6"
viaProxy = "3.3.8-SNAPSHOT"
viaProxy = "3.4.1-SNAPSHOT"
[libraries]
Binary file not shown.
+2 -2
View File
@@ -1,7 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionSha256Sum=7a00d51fb93147819aab76024feece20b6b84e420694101f276be952e08bef03
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip
distributionSha256Sum=20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Vendored
+1 -1
View File
@@ -205,7 +205,7 @@ fi
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
+2 -2
View File
@@ -14,8 +14,8 @@ dependencyResolutionManagement {
pluginManagement {
plugins {
id("net.kyori.blossom") version "2.1.0"
id("org.jetbrains.gradle.plugin.idea-ext") version "1.1.9"
id("com.gradleup.shadow") version "8.3.5"
id("org.jetbrains.gradle.plugin.idea-ext") version "1.1.10"
id("com.gradleup.shadow") version "8.3.6"
}
}
View File
Whitespace-only changes.