Compare commits

...
39 Commits
Author SHA1 Message Date
Nassim Jahnke 7f66786b76 5.4.0 Release 2025-06-20 19:07:34 +02:00
Nassim Jahnke 6993308019 Remove hanging entity direction 2025-06-17 17:28:56 +02:00
Nassim Jahnke a69b0b499c Add translations 2025-06-17 02:12:47 +02:00
Nassim Jahnke a48731ded2 1.21.6-pre1 2025-06-17 02:11:22 +02:00
Nassim Jahnke 11857f1abe 25w21a 2025-06-17 02:11:22 +02:00
Nassim Jahnke fdf2d5e87b Use updated versioned types 2025-06-17 02:11:22 +02:00
Nassim Jahnke 069c537dbb 25w20a 2025-06-17 02:11:22 +02:00
Nassim Jahnke 22e86fb127 Add hashed item handling 2025-06-17 02:11:22 +02:00
Nassim Jahnke d08da420b2 Fix modifier display backup handling 2025-06-17 02:11:22 +02:00
Nassim Jahnke 5bddf285e3 25w19a 2025-06-17 02:11:22 +02:00
Nassim Jahnke 3ba77829fe Shift player_command actions 2025-06-17 02:11:22 +02:00
Nassim Jahnke 3c3cd07fd7 25w16a 2025-06-17 02:11:21 +02:00
Nassim Jahnke 5a2d3b6b31 25w15a 2025-06-17 02:11:21 +02:00
FlorianMichael 0c21ddfe40 Add missing dimension change checks for entity tracking (#1034) 2025-06-17 02:11:05 +02:00
FlorianMichael 9b65b59411 Push block entity custom name through component conversion in 1.20.3->.2 (#1035) 2025-06-15 04:44:23 +02:00
riku6460 d3248037d8 Don't show enchantment level if level == 1 && max_level == 1 (#1027) 2025-06-12 15:10:20 +02:00
FlorianMichael e0f3a98d79 Don't add block mappings for alternative mappings (#1024) 2025-06-12 15:10:11 +02:00
Nassim Jahnke 39a4d4e973 Make publish action manually runnable 2025-06-11 10:38:45 +02:00
FlorianMichael 8a9bf708f2 Add option to disable display entity emulation in 1.19.4->.3 (#1022) 2025-05-31 02:43:19 +02:00
Nassim Jahnke 5070e51b04 Update VV usage 2025-05-27 14:28:31 +02:00
riku6460 12baac5cbd Fix login finished packet in 1.19->1.18.2 (#1018) 2025-05-27 04:41:00 +02:00
Nassim Jahnke 8669c17512 Update VV usage 2025-05-26 11:57:18 +02:00
github-actions[bot]andgradle-update-robot fe993fc2a7 Update Gradle Wrapper from 8.14 to 8.14.1 (#1016)
Signed-off-by: gradle-update-robot <gradle-update-robot@regolo.cc>
Co-authored-by: gradle-update-robot <gradle-update-robot@regolo.cc>
2025-05-22 17:35:16 +02:00
AdrianandFlorianMichael 54af45da27 Add alternative scaffolding mapping in 1.14->1.13.2 (#1015)
Co-authored-by: FlorianMichael <florian.michael07@gmail.com>
2025-05-22 15:18:40 +02:00
Nassim Jahnke 175daef7da Refactor 1.20.5+ versioned types 2025-05-17 14:30:10 +02:00
Nassim Jahnke 986ecaaf8d Fix 1.20.5 item handler
Fixes #1011
2025-05-15 15:10:50 +02:00
Nassim Jahnke b42c19752c Remove no longer needed container handling, now handled in the super call 2025-05-15 11:10:23 +02:00
Nassim Jahnke d98de382fc Update VV usage 2025-05-14 14:00:00 +02:00
Nassim Jahnke 13bc18b496 Update VV usage 2025-05-13 22:56:18 +02:00
Nassim Jahnke 4160b37f13 Update VV usage 2025-05-12 19:08:05 +02:00
FlorianMichael f9f7a24dda [ci skip] Make the runViaProxy task work with Gradle's configuration cache (#1005) 2025-05-12 17:54:17 +02:00
FlorianMichael 21fd034c02 Remove enchantments with level 0 if sent by the client in 1.21.2->1.21 (#1004) 2025-05-12 15:31:37 +02:00
Nassim Jahnke 6a59e887c8 Attempt to convert serverbound clicks to hashed items in 1.21.5
This will fix desyncs on item drags due to the server missing the individual data hashes. Some are not implemented, in which case it will still cause those sames issues, but generally this will fix its handling for most items
2025-05-11 23:14:51 +02:00
FlorianMichael 32488cf2ff [ci skip] Allow build if Git is not installed or the project is downloaded as code zip (#1002) 2025-05-11 22:26:49 +02:00
FlorianMichael 774a35db17 [ci skip] Don't publish viaversion-fabric to the repository server (#1000) 2025-05-05 21:07:22 +02:00
FlorianMichael 32f41382fa Add missing PLAYER_CHAT handlers in 1.20/1.21 versions (#999) 2025-04-28 22:08:25 +02:00
Nassim Jahnke c9573a1cfd Move data handling 1.21.5 text component rewriting to the right place
Fixes #997
2025-04-28 16:20:06 +02:00
github-actions[bot]andgradle-update-robot def9df84b4 Update Gradle Wrapper from 8.13 to 8.14 (#996)
Signed-off-by: gradle-update-robot <gradle-update-robot@regolo.cc>
Co-authored-by: gradle-update-robot <gradle-update-robot@regolo.cc>
2025-04-26 20:51:11 +02:00
FlorianMichael fd4bc59058 Fix potion entity hover event in 1.21.5->1.21.4 (#995) 2025-04-26 20:50:21 +02:00
70 changed files with 1583 additions and 511 deletions

No files matched your search

+1
View File
@@ -4,6 +4,7 @@ on:
branches:
- master
- dev
workflow_dispatch:
jobs:
publish:
+34 -3
View File
@@ -1,6 +1,12 @@
import org.gradle.api.Project
import org.gradle.api.plugins.JavaPluginExtension
import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.ValueSource
import org.gradle.api.provider.ValueSourceParameters
import org.gradle.jvm.toolchain.JavaLanguageVersion
import org.gradle.process.ExecOperations
import java.io.ByteArrayOutputStream
import javax.inject.Inject
fun Project.latestCommitHash(): String {
return runGitCommand(listOf("rev-parse", "--short", "HEAD"))
@@ -15,11 +21,36 @@ fun Project.branchName(): String {
}
fun Project.runGitCommand(args: List<String>): String {
return providers.exec {
commandLine = listOf("git") + args
}.standardOutput.asBytes.get().toString(Charsets.UTF_8).trim()
return providers.of(GitCommand::class.java) { parameters.args.set(args) }.getOrNull() ?: "unknown"
}
abstract class GitCommand : ValueSource<String, GitCommand.GitCommandParameters> {
@get:Inject
abstract val execOperations: ExecOperations
interface GitCommandParameters : ValueSourceParameters {
val args: ListProperty<String>
}
override fun obtain(): String? {
try {
val command = listOf("git") + parameters.args.get()
val output = ByteArrayOutputStream()
execOperations.exec {
commandLine = command
standardOutput = output
isIgnoreExitValue = true
}
return output.toString(Charsets.UTF_8).trim().takeIf { it.isNotBlank() }
} catch (e: Exception) {
return null
}
}
}
fun Project.parseMinecraftSnapshotVersion(version: String): String? {
val separatorIndex = version.indexOf('-')
val lastSeparatorIndex = version.lastIndexOf('-')
+1 -2
View File
@@ -13,8 +13,7 @@ val main = setOf(
projects.viabackwards,
projects.viabackwardsCommon,
projects.viabackwardsBukkit,
projects.viabackwardsVelocity,
projects.viabackwardsFabric
projects.viabackwardsVelocity
).map { it.path }
subprojects {
+24 -16
View File
@@ -27,29 +27,37 @@ java {
// Task to quickly test/debug code changes using https://github.com/ViaVersion/ViaProxy
// For further instructions see the ViaProxy repository README
tasks.register<JavaExec>("runViaProxy") {
dependsOn(tasks.shadowJar)
val prepareViaProxyFiles by tasks.registering(Copy::class) {
dependsOn(project.tasks.shadowJar)
val viaProxyConfiguration = configurations.create("viaProxy")
viaProxyConfiguration.dependencies.add(dependencies.create(rootProject.libs.viaProxy.get().copy().setTransitive(false)))
from(project.tasks.shadowJar.get().archiveFile.get().asFile)
into(layout.projectDirectory.dir("run/jars"))
val projectName = project.name
rename { "${projectName}.jar" }
}
val cleanupViaProxyFiles by tasks.registering(Delete::class) {
delete(
layout.projectDirectory.file("run/jars/${project.name}.jar"),
layout.projectDirectory.dir("run/logs")
)
}
val viaProxyConfiguration: Configuration by configurations.creating {
dependencies.add(rootProject.libs.viaProxy.get().copy().setTransitive(false))
}
tasks.register<JavaExec>("runViaProxy") {
dependsOn(prepareViaProxyFiles)
finalizedBy(cleanupViaProxyFiles)
mainClass.set("net.raphimc.viaproxy.ViaProxy")
classpath = viaProxyConfiguration
workingDir = file("run")
workingDir = layout.projectDirectory.dir("run").asFile
jvmArgs = listOf("-DskipUpdateCheck")
if (System.getProperty("viaproxy.gui.autoStart") != null) {
jvmArgs("-Dviaproxy.gui.autoStart")
}
doFirst {
val jarsDir = file("$workingDir/jars")
jarsDir.mkdirs()
file("$jarsDir/${project.name}.jar").writeBytes(tasks.shadowJar.get().archiveFile.get().asFile.readBytes())
}
doLast {
file("$workingDir/jars/${project.name}.jar").delete()
file("$workingDir/logs").deleteRecursively()
}
}
@@ -1,6 +1,6 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2023 ViaVersion and contributors
* 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
@@ -36,8 +36,10 @@ public class ViaBackwardsConfig extends Config implements com.viaversion.viaback
private boolean handlePingsAsInvAcknowledgements;
private boolean bedrockAtY0;
private boolean sculkShriekersToCryingObsidian;
private boolean scaffoldingToWater;
private boolean mapDarknessEffect;
private boolean mapCustomModelData;
private boolean mapDisplayEntities;
private boolean suppressEmulationWarnings;
public ViaBackwardsConfig(File configFile, Logger logger) {
@@ -59,8 +61,10 @@ public class ViaBackwardsConfig extends Config implements com.viaversion.viaback
handlePingsAsInvAcknowledgements = getBoolean("handle-pings-as-inv-acknowledgements", false);
bedrockAtY0 = getBoolean("bedrock-at-y-0", false);
sculkShriekersToCryingObsidian = getBoolean("sculk-shriekers-to-crying-obsidian", false);
scaffoldingToWater = getBoolean("scaffolding-to-water", false);
mapDarknessEffect = getBoolean("map-darkness-effect", true);
mapCustomModelData = getBoolean("map-custom-model-data", true);
mapDisplayEntities = getBoolean("map-display-entities", true);
suppressEmulationWarnings = getBoolean("suppress-emulation-warnings", false);
}
@@ -104,6 +108,11 @@ public class ViaBackwardsConfig extends Config implements com.viaversion.viaback
return sculkShriekersToCryingObsidian;
}
@Override
public boolean scaffoldingToWater() {
return scaffoldingToWater;
}
@Override
public boolean mapDarknessEffect() {
return mapDarknessEffect;
@@ -114,6 +123,11 @@ public class ViaBackwardsConfig extends Config implements com.viaversion.viaback
return mapCustomModelData;
}
@Override
public boolean mapDisplayEntities() {
return mapDisplayEntities;
}
@Override
public boolean suppressEmulationWarnings() {
return suppressEmulationWarnings;
@@ -78,6 +78,13 @@ public interface ViaBackwardsConfig extends Config {
*/
boolean sculkShriekerToCryingObsidian();
/**
* Shows scaffolding as water for 1.13.2 clients on 1.14+ servers. This fixes collision issues.
*
* @return true if enabled
*/
boolean scaffoldingToWater();
/**
* Maps the darkness effect to blindness for 1.18.2 clients on 1.19+ servers.
*
@@ -92,6 +99,13 @@ public interface ViaBackwardsConfig extends Config {
*/
boolean mapCustomModelData();
/**
* If enabled, 1.19.3 clients will receive display entities as armor stands with custom entity data on 1.19.4+ servers.
*
* @return true if enabled
*/
boolean mapDisplayEntities();
/**
* Suppresses warnings of missing emulations for certain features that are not supported (e.g. world height in 1.17+).
*
@@ -59,6 +59,7 @@ 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_21_6to1_21_5.Protocol1_21_6To1_21_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;
import com.viaversion.viabackwards.protocol.v1_9_1to1_9.Protocol1_9_1To1_9;
@@ -73,7 +74,7 @@ import java.util.logging.Logger;
public interface ViaBackwardsPlatform {
String MINIMUM_VV_VERSION = "5.3.2";
String MINIMUM_VV_VERSION = "5.4.0";
/**
* Initialize ViaBackwards.
@@ -148,6 +149,8 @@ public interface ViaBackwardsPlatform {
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);
protocolManager.registerProtocol(new Protocol1_21_6To1_21_5(), ProtocolVersion.v1_21_5, ProtocolVersion.v1_21_6);
}
default void enable() {
@@ -0,0 +1,51 @@
/*
* 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;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.nbt.tag.StringTag;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viaversion.api.minecraft.RegistryEntry;
import com.viaversion.viaversion.rewriter.RegistryDataRewriter;
public class BackwardsRegistryRewriter extends RegistryDataRewriter {
private final BackwardsProtocol<?, ?, ?, ?> protocol;
public BackwardsRegistryRewriter(final BackwardsProtocol<?, ?, ?, ?> protocol) {
super(protocol);
this.protocol = protocol;
}
@Override
public void updateJukeboxSongs(final RegistryEntry[] entries) {
for (final RegistryEntry entry : entries) {
if (entry.tag() == null) {
continue;
}
final StringTag soundEvent = ((CompoundTag) entry.tag()).getStringTag("sound_event");
if (soundEvent != null) {
final String mappedNamedSound = protocol.getMappingData().getMappedNamedSound(soundEvent.getValue());
if (mappedNamedSound != null) {
soundEvent.setValue(mappedNamedSound);
}
}
}
}
}
@@ -31,6 +31,7 @@ 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.SoundEvent;
import com.viaversion.viaversion.api.minecraft.data.StructuredDataContainer;
import com.viaversion.viaversion.api.minecraft.data.StructuredDataKey;
import com.viaversion.viaversion.api.minecraft.item.Item;
@@ -38,8 +39,8 @@ import com.viaversion.viaversion.api.minecraft.item.data.CustomModelData1_21_4;
import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType;
import com.viaversion.viaversion.api.protocol.packet.ServerboundPacketType;
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.rewriter.StructuredItemRewriter;
import com.viaversion.viaversion.util.Key;
import java.util.ArrayList;
import java.util.List;
import java.util.function.BiConsumer;
@@ -51,47 +52,22 @@ public class BackwardsStructuredItemRewriter<C extends ClientboundPacketType, S
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,
Type<Item> itemCostType, Type<Item> optionalItemCostType, Type<Item> mappedItemCostType, Type<Item> mappedOptionalItemCostType
) {
super(protocol, itemType, itemArrayType, mappedItemType, mappedItemArrayType, itemCostType, optionalItemCostType, mappedItemCostType, mappedOptionalItemCostType);
}
public BackwardsStructuredItemRewriter(final T protocol, final Type<Item> itemType, final Type<Item[]> itemArrayType, final Type<Item> mappedItemType, final Type<Item[]> mappedItemArrayType) {
super(protocol, itemType, itemArrayType, mappedItemType, mappedItemArrayType);
}
public BackwardsStructuredItemRewriter(final T protocol, final Type<Item> itemType, final Type<Item[]> itemArrayType) {
super(protocol, itemType, itemArrayType);
public BackwardsStructuredItemRewriter(T protocol) {
super(protocol);
}
@Override
public Item handleItemToClient(final UserConnection connection, final Item item) {
if (item.isEmpty()) {
return item;
}
final StructuredDataContainer dataContainer = item.dataContainer();
updateItemDataComponentTypeIds(dataContainer, true);
protected void backupInconvertibleData(final UserConnection connection, final Item item, final StructuredDataContainer dataContainer, final CompoundTag backupTag) {
super.backupInconvertibleData(connection, item, dataContainer, backupTag);
final BackwardsMappingData mappingData = protocol.getMappingData();
final MappedItem mappedItem = mappingData != null ? mappingData.getMappedItem(item.identifier()) : null;
if (mappedItem == null) {
// Just rewrite the id
if (mappingData != null && mappingData.getItemMappings() != null) {
item.setIdentifier(mappingData.getNewItemId(item.identifier()));
}
updateItemDataComponents(connection, item, true);
return item;
return;
}
// Save original id, set remapped id
final CompoundTag tag = createCustomTag(item);
tag.putInt(nbtTagName("id"), item.identifier());
item.setIdentifier(mappedItem.id());
final CompoundTag customTag = createCustomTag(item);
customTag.putInt(nbtTagName("id"), item.identifier()); // Save original id
// Add custom model data
if (mappedItem.customModelData() != null) {
@@ -112,38 +88,17 @@ public class BackwardsStructuredItemRewriter<C extends ClientboundPacketType, S
// Set custom name - only done if there is no original one
if (!dataContainer.has(StructuredDataKey.CUSTOM_NAME)) {
dataContainer.set(StructuredDataKey.CUSTOM_NAME, mappedItem.tagName());
tag.putBoolean(nbtTagName("added_custom_name"), true);
customTag.putBoolean(nbtTagName("added_custom_name"), true);
}
updateItemDataComponents(connection, item, true);
return item;
}
@Override
public Item handleItemToServer(final UserConnection connection, final Item item) {
if (item.isEmpty()) {
return item;
protected void restoreBackupData(final Item item, final StructuredDataContainer container, final CompoundTag customData) {
super.restoreBackupData(item, container, customData);
if (removeBackupTag(customData, "id") instanceof final IntTag originalTag) {
item.setIdentifier(originalTag.asInt());
removeCustomTag(container, customData);
}
final StructuredDataContainer dataContainer = item.dataContainer();
updateItemDataComponentTypeIds(dataContainer, false);
final BackwardsMappingData mappingData = protocol.getMappingData();
if (mappingData != null && mappingData.getItemMappings() != null) {
item.setIdentifier(mappingData.getOldItemId(item.identifier()));
}
final CompoundTag customData = dataContainer.get(StructuredDataKey.CUSTOM_DATA);
if (customData != null) {
if (customData.remove(nbtTagName("id")) instanceof final IntTag originalTag) {
item.setIdentifier(originalTag.asInt());
removeCustomTag(dataContainer, customData);
}
}
restoreTextComponents(item);
updateItemDataComponents(connection, item, false);
return item;
}
protected void saveListTag(CompoundTag tag, ListTag<?> original, String name) {
@@ -291,6 +246,20 @@ public class BackwardsStructuredItemRewriter<C extends ClientboundPacketType, S
}
}
protected void saveKeyData(final StructuredDataKey<Key> key, final StructuredDataContainer data, final CompoundTag backupTag) {
final Key value = data.get(key);
if (value != null) {
backupTag.putString(key.identifier(), value.original());
}
}
protected void restoreKeyData(final StructuredDataKey<Key> key, final StructuredDataContainer data, final CompoundTag backupTag) {
final String value = backupTag.getString(key.identifier());
if (value != null) {
data.set(key, Key.of(value));
}
}
protected void saveIntData(final StructuredDataKey<Integer> key, final StructuredDataContainer data, final CompoundTag backupTag) {
final Integer variant = data.get(key);
if (variant != null) {
@@ -319,6 +288,25 @@ public class BackwardsStructuredItemRewriter<C extends ClientboundPacketType, S
}
}
protected void saveSoundEventHolder(final CompoundTag tag, final Holder<SoundEvent> holder) {
tag.put("sound_event", holderToTag(holder, this::saveSoundEvent));
}
protected void saveSoundEvent(final SoundEvent soundEvent, final CompoundTag tag) {
tag.putString("identifier", soundEvent.identifier());
if (soundEvent.fixedRange() != null) {
tag.putFloat("fixed_range", soundEvent.fixedRange());
}
}
protected Holder<SoundEvent> restoreSoundEventHolder(final CompoundTag tag) {
return restoreHolder(tag, "sound_event", soundEventTag -> {
final String identifier = soundEventTag.getString("identifier");
final FloatTag fixedRange = soundEventTag.getFloatTag("fixed_range");
return new SoundEvent(identifier, fixedRange != null ? fixedRange.asFloat() : null);
});
}
@Override
public String nbtTagName() {
return "VB|" + protocol.getClass().getSimpleName();
@@ -17,10 +17,12 @@
*/
package com.viaversion.viabackwards.protocol.template;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.viabackwards.api.rewriters.BackwardsStructuredItemRewriter;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.data.StructuredDataContainer;
import com.viaversion.viaversion.api.minecraft.item.Item;
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;
@@ -33,14 +35,10 @@ import com.viaversion.viaversion.rewriter.RecipeDisplayRewriter;
// ChunkType1_21_5
// RecipeDisplayRewriter
// Types1_21_4
final class BlockItemPacketRewriter1_99 extends BackwardsStructuredItemRewriter<ClientboundPacket1_21_2, ServerboundPacket1_21_4, Protocol1_98To1_99> {
final class BlockItemPacketRewriter1_99 extends BackwardsStructuredItemRewriter<ClientboundPacket1_21_2, ServerboundPacket1_21_4, Protocol1_99To1_98> {
public BlockItemPacketRewriter1_99(final Protocol1_98To1_99 protocol) {
super(protocol, Types1_21_4.ITEM, Types1_21_4.ITEM_ARRAY);
/*super(protocol,
Types1_21_4.ITEM, Types1_21_4.ITEM_ARRAY, Types1_OLD.ITEM, Types1_OLD.ITEM_ARRAY,
Types1_21_4.ITEM_COST, Types1_21_4.OPTIONAL_ITEM_COST, Types1_OLD.ITEM_COST, Types1_OLD.OPTIONAL_ITEM_COST
);*/
public BlockItemPacketRewriter1_99(final Protocol1_99To1_98 protocol) {
super(protocol);
}
@Override
@@ -54,7 +52,7 @@ final class BlockItemPacketRewriter1_99 extends BackwardsStructuredItemRewriter<
blockRewriter.registerBlockEntityData(ClientboundPackets1_21_2.BLOCK_ENTITY_DATA);
// registerOpenScreen(ClientboundPackets1_21_2.OPEN_SCREEN);
protocol.registerClientbound(ClientboundPackets1_21_2.SET_CURSOR_ITEM, this::passthroughClientboundItem);
registerSetCursorItem(ClientboundPackets1_21_2.SET_CURSOR_ITEM);
registerSetPlayerInventory(ClientboundPackets1_21_2.SET_PLAYER_INVENTORY);
registerCooldown1_21_2(ClientboundPackets1_21_2.COOLDOWN);
registerSetContent1_21_2(ClientboundPackets1_21_2.CONTAINER_SET_CONTENT);
@@ -63,11 +61,35 @@ final class BlockItemPacketRewriter1_99 extends BackwardsStructuredItemRewriter<
registerSetEquipment(ClientboundPackets1_21_2.SET_EQUIPMENT);
registerMerchantOffers1_20_5(ClientboundPackets1_21_2.MERCHANT_OFFERS);
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
registerSetCreativeModeSlot1_21_5(ServerboundPackets1_21_4.SET_CREATIVE_MODE_SLOT);
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);
}
@Override
protected void handleItemDataComponentsToClient(final UserConnection connection, final Item item, final StructuredDataContainer container) {
super.handleItemDataComponentsToClient(connection, item, container);
// downgradeData(item, container); // static import VV method
}
@Override
protected void handleItemDataComponentsToServer(final UserConnection connection, final Item item, final StructuredDataContainer container) {
super.handleItemDataComponentsToServer(connection, item, container);
// upgradeData(item, container); // static import VV method
}
@Override
protected void restoreBackupData(final Item item, final StructuredDataContainer container, final CompoundTag customData) {
super.restoreBackupData(item, container, customData);
// restore any data if needed here
}
@Override
protected void backupInconvertibleData(final UserConnection connection, final Item item, final StructuredDataContainer dataContainer, final CompoundTag backupTag) {
super.backupInconvertibleData(connection, item, dataContainer, backupTag);
// back up any data if needed here, called before the method below
}
}
@@ -17,40 +17,42 @@
*/
package com.viaversion.viabackwards.protocol.template;
import com.viaversion.viabackwards.api.rewriters.BackwardsRegistryRewriter;
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.version.Types1_21_4;
import com.viaversion.viaversion.api.minecraft.entitydata.types.EntityDataTypes1_21_2;
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
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;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPackets1_21_2;
import com.viaversion.viaversion.rewriter.RegistryDataRewriter;
// Replace if needed
// Types1_OLD
// Types1_21_4
final class EntityPacketRewriter1_99 extends EntityRewriter<ClientboundPacket1_21_2, Protocol1_98To1_99> {
// VersionedTypes
final class EntityPacketRewriter1_99 extends EntityRewriter<ClientboundPacket1_21_2, Protocol1_99To1_98> {
public EntityPacketRewriter1_99(final Protocol1_98To1_99 protocol) {
super(protocol, Types1_21_4.ENTITY_DATA_TYPES.optionalComponentType, Types1_21_4.ENTITY_DATA_TYPES.booleanType);
public EntityPacketRewriter1_99(final Protocol1_99To1_98 protocol) {
super(protocol, VersionedTypes.V1_21_4.entityDataTypes.optionalComponentType, VersionedTypes.V1_21_4.entityDataTypes.booleanType);
}
@Override
public void registerPackets() {
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
registerSetEntityData(ClientboundPackets1_21_2.SET_ENTITY_DATA);
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);
final RegistryDataRewriter registryDataRewriter = new BackwardsRegistryRewriter(protocol);
protocol.registerClientbound(ClientboundConfigurationPackets1_21.REGISTRY_DATA, registryDataRewriter::handle);
}
@Override
protected void registerRewrites() {
final EntityDataTypes1_21_2 mappedEntityDataTypes = VersionedTypes.V1_21_4.entityDataTypes;
/*filter().handler((event, data) -> {
int id = data.dataType().typeId();
if (id >= ac) {
@@ -59,17 +61,17 @@ final class EntityPacketRewriter1_99 extends EntityRewriter<ClientboundPacket1_2
id--;
}
data.setDataType(Types1_21_4.ENTITY_DATA_TYPES.byId(id));
data.setDataType(mappedEntityDataTypess.byId(id));
});*/
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
mappedEntityDataTypes.itemType,
mappedEntityDataTypes.blockStateType,
mappedEntityDataTypes.optionalBlockStateType,
mappedEntityDataTypes.particleType,
mappedEntityDataTypes.particlesType,
mappedEntityDataTypes.componentType,
mappedEntityDataTypes.optionalComponentType
);
// Remove entity data of new entity type
@@ -25,8 +25,10 @@ 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;
import com.viaversion.viaversion.api.protocol.packet.provider.SimplePacketTypesProvider;
import com.viaversion.viaversion.api.type.types.version.Types1_21_4;
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
import com.viaversion.viaversion.api.type.types.version.VersionedTypesHolder;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
import com.viaversion.viaversion.data.item.ItemHasherBase;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ServerboundConfigurationPackets1_20_5;
import com.viaversion.viaversion.protocols.v1_20_5to1_21.Protocol1_20_5To1_21;
import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundConfigurationPackets1_21;
@@ -37,6 +39,7 @@ import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPacke
import com.viaversion.viaversion.rewriter.ParticleRewriter;
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
import com.viaversion.viaversion.rewriter.TagRewriter;
import com.viaversion.viaversion.util.SerializerVersion;
import static com.viaversion.viaversion.util.ProtocolUtil.packetTypeMap;
@@ -48,19 +51,20 @@ import static com.viaversion.viaversion.util.ProtocolUtil.packetTypeMap;
// ClientboundConfigurationPackets1_21
// ServerboundConfigurationPackets1_20_5
// EntityTypes1_21_4 (UNMAPPED type)
// Types1_21_4.PARTICLE
// VersionedTypes.V1_21_5
// SerializerVersion.V1_21_5
// 1.99, 1.98
final class Protocol1_98To1_99 extends BackwardsProtocol<ClientboundPacket1_21_2, ClientboundPacket1_21_2, ServerboundPacket1_21_4, ServerboundPacket1_21_4> {
final class Protocol1_99To1_98 extends BackwardsProtocol<ClientboundPacket1_21_2, ClientboundPacket1_21_2, ServerboundPacket1_21_4, ServerboundPacket1_21_4> {
// ViaBackwards uses its own mappings and also needs a translatablerewriter for translation mappings
public static final BackwardsMappingData MAPPINGS = new BackwardsMappingData("1.99", "1.98", Protocol1_20_5To1_21.class);
public static final BackwardsMappingData MAPPINGS = new BackwardsMappingData("1.99", "1.98", Protocol1_20_5To1_21.class); // Change the VV (!) protocol class
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 ParticleRewriter<ClientboundPacket1_21_2> particleRewriter = new ParticleRewriter<>(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() {
public Protocol1_99To1_98() {
super(ClientboundPacket1_21_2.class, ClientboundPacket1_21_2.class, ServerboundPacket1_21_4.class, ServerboundPacket1_21_4.class);
}
@@ -100,8 +104,9 @@ final class Protocol1_98To1_99 extends BackwardsProtocol<ClientboundPacket1_21_2
}
@Override
public void init(final UserConnection user) {
addEntityTracker(user, new EntityTrackerBase(user, EntityTypes1_21_4.PLAYER));
public void init(final UserConnection connection) {
addEntityTracker(connection, new EntityTrackerBase(connection, EntityTypes1_21_4.PLAYER));
addItemHasher(connection, new ItemHasherBase(this, connection, SerializerVersion.V1_21_5, SerializerVersion.V1_21_5));
}
@Override
@@ -134,6 +139,16 @@ final class Protocol1_98To1_99 extends BackwardsProtocol<ClientboundPacket1_21_2
return tagRewriter;
}
@Override
public VersionedTypesHolder types() {
return VersionedTypes.V1_21_5;
}
@Override
public VersionedTypesHolder mappedTypes() {
return VersionedTypes.V1_21_5;
}
@Override
protected PacketTypesProvider<ClientboundPacket1_21_2, ClientboundPacket1_21_2, ServerboundPacket1_21_4, ServerboundPacket1_21_4> createPacketTypesProvider() {
return new SimplePacketTypesProvider<>(
@@ -29,7 +29,6 @@ import com.viaversion.viaversion.api.minecraft.entitydata.EntityData;
import com.viaversion.viaversion.api.minecraft.entitydata.types.EntityDataTypes1_9;
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.version.Types1_9;
import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ClientboundPackets1_9_3;
import java.util.List;
@@ -80,7 +79,7 @@ public class EntityPacketRewriter1_10 extends LegacyEntityRewriter<ClientboundPa
map(Types.SHORT); // 9 - Velocity X
map(Types.SHORT); // 10 - Velocity Y
map(Types.SHORT); // 11 - Velocity Z
map(Types1_9.ENTITY_DATA_LIST); // 12 - Entity data
map(Types.ENTITY_DATA_LIST1_9); // 12 - Entity data
// Track entity
handler(getTrackerHandler(Types.UNSIGNED_BYTE, 0));
@@ -93,7 +92,7 @@ public class EntityPacketRewriter1_10 extends LegacyEntityRewriter<ClientboundPa
return;
}
List<EntityData> entityDataList = wrapper.get(Types1_9.ENTITY_DATA_LIST, 0);
List<EntityData> entityDataList = wrapper.get(Types.ENTITY_DATA_LIST1_9, 0);
handleEntityData(wrapper.get(Types.VAR_INT, 0), entityDataList, wrapper.user());
EntityReplacement entityReplacement = entityDataForType(type);
@@ -122,14 +121,14 @@ public class EntityPacketRewriter1_10 extends LegacyEntityRewriter<ClientboundPa
map(Types.DOUBLE); // 4 - Z
map(Types.BYTE); // 5 - Yaw
map(Types.BYTE); // 6 - Pitch
map(Types1_9.ENTITY_DATA_LIST); // 7 - Entity data list
map(Types.ENTITY_DATA_LIST1_9); // 7 - Entity data list
handler(getTrackerAndDataHandler(Types1_9.ENTITY_DATA_LIST, EntityTypes1_11.EntityType.PLAYER));
handler(getTrackerAndDataHandler(Types.ENTITY_DATA_LIST1_9, EntityTypes1_11.EntityType.PLAYER));
}
});
registerRemoveEntities(ClientboundPackets1_9_3.REMOVE_ENTITIES);
registerSetEntityData(ClientboundPackets1_9_3.SET_ENTITY_DATA, Types1_9.ENTITY_DATA_LIST);
registerSetEntityData(ClientboundPackets1_9_3.SET_ENTITY_DATA, Types.ENTITY_DATA_LIST1_9);
}
@Override
@@ -24,7 +24,6 @@ import com.viaversion.viaversion.api.minecraft.entities.EntityType;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_11;
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.version.Types1_9;
import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ClientboundPackets1_9_3;
public class EntityPacketRewriter1_11_1 extends LegacyEntityRewriter<ClientboundPackets1_9_3, Protocol1_11_1To1_11> {
@@ -72,13 +71,13 @@ public class EntityPacketRewriter1_11_1 extends LegacyEntityRewriter<Clientbound
map(Types.SHORT); // 9 - Velocity X
map(Types.SHORT); // 10 - Velocity Y
map(Types.SHORT); // 11 - Velocity Z
map(Types1_9.ENTITY_DATA_LIST); // 12 - Entity data
map(Types.ENTITY_DATA_LIST1_9); // 12 - Entity data
// Track entity
handler(getTrackerHandler());
// Rewrite entity type / data
handler(getMobSpawnRewriter1_11(Types1_9.ENTITY_DATA_LIST));
handler(getMobSpawnRewriter1_11(Types.ENTITY_DATA_LIST1_9));
}
});
@@ -96,14 +95,14 @@ public class EntityPacketRewriter1_11_1 extends LegacyEntityRewriter<Clientbound
map(Types.DOUBLE); // 4 - Z
map(Types.BYTE); // 5 - Yaw
map(Types.BYTE); // 6 - Pitch
map(Types1_9.ENTITY_DATA_LIST); // 7 - Entity data list
map(Types.ENTITY_DATA_LIST1_9); // 7 - Entity data list
handler(getTrackerAndDataHandler(Types1_9.ENTITY_DATA_LIST, EntityTypes1_11.EntityType.PLAYER));
handler(getTrackerAndDataHandler(Types.ENTITY_DATA_LIST1_9, EntityTypes1_11.EntityType.PLAYER));
}
});
registerRemoveEntities(ClientboundPackets1_9_3.REMOVE_ENTITIES);
registerSetEntityData(ClientboundPackets1_9_3.SET_ENTITY_DATA, Types1_9.ENTITY_DATA_LIST);
registerSetEntityData(ClientboundPackets1_9_3.SET_ENTITY_DATA, Types.ENTITY_DATA_LIST1_9);
}
@Override
@@ -30,7 +30,6 @@ import com.viaversion.viaversion.api.minecraft.entitydata.EntityData;
import com.viaversion.viaversion.api.minecraft.entitydata.types.EntityDataTypes1_9;
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.version.Types1_9;
import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ClientboundPackets1_9_3;
import java.util.List;
@@ -104,17 +103,17 @@ public class EntityPacketRewriter1_11 extends LegacyEntityRewriter<ClientboundPa
map(Types.SHORT); // 9 - Velocity X
map(Types.SHORT); // 10 - Velocity Y
map(Types.SHORT); // 11 - Velocity Z
map(Types1_9.ENTITY_DATA_LIST); // 12 - Entity data
map(Types.ENTITY_DATA_LIST1_9); // 12 - Entity data
// Track entity
handler(getTrackerHandler(Types.UNSIGNED_BYTE, 0));
// Rewrite entity type / data
handler(getMobSpawnRewriter(Types1_9.ENTITY_DATA_LIST));
handler(getMobSpawnRewriter(Types.ENTITY_DATA_LIST1_9));
// Sub 1.11 clients will error if the list is empty
handler(wrapper -> {
List<EntityData> entityDataList = wrapper.get(Types1_9.ENTITY_DATA_LIST, 0);
List<EntityData> entityDataList = wrapper.get(Types.ENTITY_DATA_LIST1_9, 0);
if (entityDataList.isEmpty()) {
entityDataList.add(new EntityData(0, EntityDataTypes1_9.BYTE, (byte) 0));
}
@@ -136,12 +135,12 @@ public class EntityPacketRewriter1_11 extends LegacyEntityRewriter<ClientboundPa
map(Types.DOUBLE); // 4 - Z
map(Types.BYTE); // 5 - Yaw
map(Types.BYTE); // 6 - Pitch
map(Types1_9.ENTITY_DATA_LIST); // 7 - Entity data list
map(Types.ENTITY_DATA_LIST1_9); // 7 - Entity data list
handler(getTrackerAndDataHandler(Types1_9.ENTITY_DATA_LIST, EntityTypes1_11.EntityType.PLAYER));
handler(getTrackerAndDataHandler(Types.ENTITY_DATA_LIST1_9, EntityTypes1_11.EntityType.PLAYER));
handler(wrapper -> {
// Sub 1.11 clients will cry if the list is empty
List<EntityData> entityDataList = wrapper.get(Types1_9.ENTITY_DATA_LIST, 0);
List<EntityData> entityDataList = wrapper.get(Types.ENTITY_DATA_LIST1_9, 0);
if (entityDataList.isEmpty()) {
entityDataList.add(new EntityData(0, EntityDataTypes1_9.BYTE, (byte) 0));
}
@@ -150,7 +149,7 @@ public class EntityPacketRewriter1_11 extends LegacyEntityRewriter<ClientboundPa
});
registerRemoveEntities(ClientboundPackets1_9_3.REMOVE_ENTITIES);
registerSetEntityData(ClientboundPackets1_9_3.SET_ENTITY_DATA, Types1_9.ENTITY_DATA_LIST);
registerSetEntityData(ClientboundPackets1_9_3.SET_ENTITY_DATA, Types.ENTITY_DATA_LIST1_9);
protocol.registerClientbound(ClientboundPackets1_9_3.ENTITY_EVENT, new PacketHandlers() {
@Override
@@ -31,8 +31,6 @@ import com.viaversion.viaversion.api.minecraft.entitydata.types.EntityDataTypes1
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.version.Types1_12;
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;
@@ -84,13 +82,13 @@ public class EntityPacketRewriter1_12 extends LegacyEntityRewriter<ClientboundPa
map(Types.SHORT); // 9 - Velocity X
map(Types.SHORT); // 10 - Velocity Y
map(Types.SHORT); // 11 - Velocity Z
map(Types1_12.ENTITY_DATA_LIST, Types1_9.ENTITY_DATA_LIST); // 12 - Entity data
map(Types.ENTITY_DATA_LIST1_12, Types.ENTITY_DATA_LIST1_9); // 12 - Entity data
// Track entity
handler(getTrackerHandler());
// Rewrite entity type / data
handler(getMobSpawnRewriter1_11(Types1_9.ENTITY_DATA_LIST));
handler(getMobSpawnRewriter1_11(Types.ENTITY_DATA_LIST1_9));
}
});
@@ -106,9 +104,9 @@ public class EntityPacketRewriter1_12 extends LegacyEntityRewriter<ClientboundPa
map(Types.DOUBLE); // 4 - Z
map(Types.BYTE); // 5 - Yaw
map(Types.BYTE); // 6 - Pitch
map(Types1_12.ENTITY_DATA_LIST, Types1_9.ENTITY_DATA_LIST); // 7 - Entity data list
map(Types.ENTITY_DATA_LIST1_12, Types.ENTITY_DATA_LIST1_9); // 7 - Entity data list
handler(getTrackerAndDataHandler(Types1_9.ENTITY_DATA_LIST, EntityTypes1_12.EntityType.PLAYER));
handler(getTrackerAndDataHandler(Types.ENTITY_DATA_LIST1_9, EntityTypes1_12.EntityType.PLAYER));
}
});
@@ -142,7 +140,7 @@ public class EntityPacketRewriter1_12 extends LegacyEntityRewriter<ClientboundPa
registerRespawn(ClientboundPackets1_12.RESPAWN);
registerRemoveEntities(ClientboundPackets1_12.REMOVE_ENTITIES);
registerSetEntityData(ClientboundPackets1_12.SET_ENTITY_DATA, Types1_12.ENTITY_DATA_LIST, Types1_9.ENTITY_DATA_LIST);
registerSetEntityData(ClientboundPackets1_12.SET_ENTITY_DATA, Types.ENTITY_DATA_LIST1_12, Types.ENTITY_DATA_LIST1_9);
protocol.registerClientbound(ClientboundPackets1_12.UPDATE_ATTRIBUTES, new PacketHandlers() {
@Override
@@ -38,7 +38,6 @@ 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_12;
import com.viaversion.viaversion.api.type.types.version.Types1_13;
import com.viaversion.viaversion.libs.gson.JsonElement;
import com.viaversion.viaversion.protocols.v1_12_2to1_13.packet.ClientboundPackets1_13;
@@ -130,7 +129,7 @@ public class EntityPacketRewriter1_13 extends LegacyEntityRewriter<ClientboundPa
map(Types.SHORT);
map(Types.SHORT);
map(Types.SHORT);
map(Types1_13.ENTITY_DATA_LIST, Types1_12.ENTITY_DATA_LIST);
map(Types1_13.ENTITY_DATA_LIST, Types.ENTITY_DATA_LIST1_12);
handler(wrapper -> {
int type = wrapper.get(Types.VAR_INT, 1);
@@ -152,7 +151,7 @@ public class EntityPacketRewriter1_13 extends LegacyEntityRewriter<ClientboundPa
});
// Rewrite entity type / ddata
handler(getMobSpawnRewriter1_11(Types1_12.ENTITY_DATA_LIST));
handler(getMobSpawnRewriter1_11(Types.ENTITY_DATA_LIST1_12));
}
});
@@ -166,9 +165,9 @@ public class EntityPacketRewriter1_13 extends LegacyEntityRewriter<ClientboundPa
map(Types.DOUBLE);
map(Types.BYTE);
map(Types.BYTE);
map(Types1_13.ENTITY_DATA_LIST, Types1_12.ENTITY_DATA_LIST);
map(Types1_13.ENTITY_DATA_LIST, Types.ENTITY_DATA_LIST1_12);
handler(getTrackerAndDataHandler(Types1_12.ENTITY_DATA_LIST, EntityTypes1_13.EntityType.PLAYER));
handler(getTrackerAndDataHandler(Types.ENTITY_DATA_LIST1_12, EntityTypes1_13.EntityType.PLAYER));
}
});
@@ -208,7 +207,7 @@ public class EntityPacketRewriter1_13 extends LegacyEntityRewriter<ClientboundPa
});
registerRemoveEntities(ClientboundPackets1_13.REMOVE_ENTITIES);
registerSetEntityData(ClientboundPackets1_13.SET_ENTITY_DATA, Types1_13.ENTITY_DATA_LIST, Types1_12.ENTITY_DATA_LIST);
registerSetEntityData(ClientboundPackets1_13.SET_ENTITY_DATA, Types1_13.ENTITY_DATA_LIST, Types.ENTITY_DATA_LIST1_12);
// Face Player (new packet)
protocol.registerClientbound(ClientboundPackets1_13.PLAYER_LOOK_AT, null, wrapper -> {
@@ -150,12 +150,7 @@ public class PlayerPacketRewriter1_13 extends RewriterBase<Protocol1_13To1_12_2>
if (action == 0) { // Add
String name = packetWrapper.passthrough(Types.STRING);
storage.usernames().put(uuid, name);
int nProperties = packetWrapper.passthrough(Types.VAR_INT);
for (int j = 0; j < nProperties; j++) {
packetWrapper.passthrough(Types.STRING);
packetWrapper.passthrough(Types.STRING);
packetWrapper.passthrough(Types.OPTIONAL_STRING);
}
packetWrapper.passthrough(Types.PROFILE_PROPERTY_ARRAY);
packetWrapper.passthrough(Types.VAR_INT);
packetWrapper.passthrough(Types.VAR_INT);
packetWrapper.passthrough(Types.OPTIONAL_COMPONENT);
@@ -20,6 +20,7 @@ package com.viaversion.viabackwards.protocol.v1_14_1to1_14;
import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.protocol.v1_14_1to1_14.rewriter.EntityPacketRewriter1_14_1;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.ClientWorld;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_15;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
import com.viaversion.viaversion.protocols.v1_13_2to1_14.packet.ClientboundPackets1_14;
@@ -41,6 +42,7 @@ public class Protocol1_14_1To1_14 extends BackwardsProtocol<ClientboundPackets1_
@Override
public void init(UserConnection user) {
user.addEntityTracker(this.getClass(), new EntityTrackerBase(user, EntityTypes1_15.PLAYER));
user.addClientWorld(this.getClass(), new ClientWorld());
}
@Override
@@ -23,7 +23,6 @@ import com.viaversion.viaversion.api.minecraft.entities.EntityType;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_14;
import com.viaversion.viaversion.api.minecraft.entitydata.EntityData;
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.api.type.types.version.Types1_14;
import com.viaversion.viaversion.protocols.v1_13_2to1_14.packet.ClientboundPackets1_14;
@@ -41,7 +40,8 @@ public class EntityPacketRewriter1_14_1 extends LegacyEntityRewriter<Clientbound
registerTracker(ClientboundPackets1_14.ADD_GLOBAL_ENTITY, EntityTypes1_14.LIGHTNING_BOLT);
registerTracker(ClientboundPackets1_14.ADD_PAINTING, EntityTypes1_14.PAINTING);
registerTracker(ClientboundPackets1_14.ADD_PLAYER, EntityTypes1_14.PLAYER);
registerTracker(ClientboundPackets1_14.LOGIN, EntityTypes1_14.PLAYER, Types.INT);
registerJoinGame(ClientboundPackets1_14.LOGIN, EntityTypes1_14.PLAYER);
registerRespawn(ClientboundPackets1_14.RESPAWN);
registerRemoveEntities(ClientboundPackets1_14.REMOVE_ENTITIES);
protocol.registerClientbound(ClientboundPackets1_14.ADD_ENTITY, new PacketHandlers() {
@@ -20,6 +20,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.text.JsonNBTComponentRewriter;
import com.viaversion.viabackwards.protocol.v1_14to1_13_2.data.BackwardsMappingData1_14;
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;
@@ -34,16 +35,15 @@ import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
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_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.text.ComponentRewriterBase;
import com.viaversion.viaversion.rewriter.ParticleRewriter;
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
import com.viaversion.viaversion.rewriter.text.ComponentRewriterBase;
public class Protocol1_14To1_13_2 extends BackwardsProtocol<ClientboundPackets1_14, ClientboundPackets1_13, ServerboundPackets1_14, ServerboundPackets1_13> {
public static final BackwardsMappingData MAPPINGS = new BackwardsMappingData("1.14", "1.13.2", Protocol1_13_2To1_14.class);
public static final BackwardsMappingData1_14 MAPPINGS = new BackwardsMappingData1_14();
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);
@@ -0,0 +1,42 @@
/*
* 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_14to1_13_2.data;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.viabackwards.ViaBackwards;
import com.viaversion.viabackwards.api.data.BackwardsMappingData;
import com.viaversion.viaversion.protocols.v1_13_2to1_14.Protocol1_13_2To1_14;
public final class BackwardsMappingData1_14 extends BackwardsMappingData {
public BackwardsMappingData1_14() {
super("1.14", "1.13.2", Protocol1_13_2To1_14.class);
}
@Override
protected void loadExtras(final CompoundTag data) {
super.loadExtras(data);
if (ViaBackwards.getConfig().scaffoldingToWater()) {
for (int i = 11099; i <= 11130; i++) {
blockStateMappings.setNewId(i, 49);
}
}
}
}
@@ -106,6 +106,7 @@ public class EntityPacketRewriter1_15 extends EntityRewriter<ClientboundPackets1
map(Types.INT); // 0 - Entity ID
map(Types.UNSIGNED_BYTE); // 1 - Gamemode
map(Types.INT); // 2 - Dimension
handler(getDimensionHandler(1));
read(Types.LONG); // Seed
@@ -18,6 +18,10 @@
package com.viaversion.viabackwards.protocol.v1_16_2to1_16_1.rewriter;
import com.google.common.collect.Sets;
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.viabackwards.ViaBackwards;
import com.viaversion.viabackwards.api.rewriters.EntityRewriter;
import com.viaversion.viabackwards.protocol.v1_16_2to1_16_1.Protocol1_16_2To1_16_1;
@@ -29,10 +33,6 @@ import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.version.Types1_16;
import com.viaversion.viaversion.protocols.v1_15_2to1_16.data.DimensionRegistries1_16;
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.viaversion.protocols.v1_16_1to1_16_2.packet.ClientboundPackets1_16_2;
import com.viaversion.viaversion.util.Key;
import com.viaversion.viaversion.util.TagUtil;
@@ -95,6 +95,10 @@ public class EntityPacketRewriter1_16_2 extends EntityRewriter<ClientboundPacket
wrapper.write(Types.STRING, getDimensionFromData(dimensionData));
});
map(Types.STRING); // Dimension
handler(wrapper -> {
final String world = wrapper.get(Types.STRING, 1);
trackWorld(wrapper.user(), world);
});
map(Types.LONG); // Seed
handler(wrapper -> {
int maxPlayers = wrapper.read(Types.VAR_INT);
@@ -109,7 +113,8 @@ public class EntityPacketRewriter1_16_2 extends EntityRewriter<ClientboundPacket
CompoundTag dimensionData = wrapper.read(Types.NAMED_COMPOUND_TAG);
wrapper.write(Types.STRING, getDimensionFromData(dimensionData));
tracker(wrapper.user()).clearEntities();
final String world = wrapper.passthrough(Types.STRING);
trackWorld(wrapper.user(), world);
});
}
@@ -230,12 +230,7 @@ public class EntityPacketRewriter1_16 extends EntityRewriter<ClientboundPackets1
wrapper.passthrough(Types.UUID);
if (action == 0) { // Add
wrapper.passthrough(Types.STRING);
int properties = wrapper.passthrough(Types.VAR_INT);
for (int j = 0; j < properties; j++) {
wrapper.passthrough(Types.STRING);
wrapper.passthrough(Types.STRING);
wrapper.passthrough(Types.OPTIONAL_STRING);
}
wrapper.passthrough(Types.PROFILE_PROPERTY_ARRAY);
wrapper.passthrough(Types.VAR_INT);
wrapper.passthrough(Types.VAR_INT);
// Display Name
@@ -131,14 +131,7 @@ public final class EntityPacketRewriter1_19_3 extends EntityRewriter<Clientbound
for (int i = 0; i < entries; i++) {
playerInfoPacket.write(Types.UUID, wrapper.read(Types.UUID));
playerInfoPacket.write(Types.STRING, wrapper.read(Types.STRING)); // Player Name
final int properties = wrapper.read(Types.VAR_INT);
playerInfoPacket.write(Types.VAR_INT, properties);
for (int j = 0; j < properties; j++) {
playerInfoPacket.write(Types.STRING, wrapper.read(Types.STRING)); // Name
playerInfoPacket.write(Types.STRING, wrapper.read(Types.STRING)); // Value
playerInfoPacket.write(Types.OPTIONAL_STRING, wrapper.read(Types.OPTIONAL_STRING)); // Signature
}
playerInfoPacket.write(Types.PROFILE_PROPERTY_ARRAY, wrapper.read(Types.PROFILE_PROPERTY_ARRAY));
// Now check for the other parts individually and add dummy values if not present
final ProfileKey profileKey;
@@ -20,6 +20,7 @@ package com.viaversion.viabackwards.protocol.v1_19_4to1_19_3.rewriter;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.nbt.tag.ListTag;
import com.viaversion.nbt.tag.NumberTag;
import com.viaversion.viabackwards.ViaBackwards;
import com.viaversion.viabackwards.api.entities.storage.EntityPositionHandler;
import com.viaversion.viabackwards.api.entities.storage.EntityReplacement;
import com.viaversion.viabackwards.api.rewriters.EntityRewriter;
@@ -70,6 +71,13 @@ public final class EntityPacketRewriter1_19_4 extends EntityRewriter<Clientbound
final int entityId = wrapper.get(Types.VAR_INT, 0);
final int entityType = wrapper.get(Types.VAR_INT, 1);
if (!ViaBackwards.getConfig().mapDisplayEntities()) {
if (entityType == EntityTypes1_19_4.BLOCK_DISPLAY.getId() || entityType == EntityTypes1_19_4.ITEM_DISPLAY.getId() || entityType == EntityTypes1_19_4.TEXT_DISPLAY.getId()) {
wrapper.cancel();
return;
}
}
// First track (and remap) entity, then put storage for block display entity
getSpawnTrackerWithDataHandler1_19(EntityTypes1_19_4.FALLING_BLOCK).handle(wrapper);
if (entityType != EntityTypes1_19_4.BLOCK_DISPLAY.getId()) {
@@ -296,14 +296,7 @@ public final class Protocol1_19To1_18_2 extends BackwardsProtocol<ClientboundPac
public void register() {
map(Types.UUID); // UUID
map(Types.STRING); // Name
handler(wrapper -> {
final int properties = wrapper.read(Types.VAR_INT);
for (int i = 0; i < properties; i++) {
wrapper.read(Types.STRING); // Name
wrapper.read(Types.STRING); // Value
wrapper.read(Types.OPTIONAL_STRING); // Optional signature
}
});
read(Types.PROFILE_PROPERTY_ARRAY);
}
});
@@ -17,21 +17,19 @@
*/
package com.viaversion.viabackwards.protocol.v1_19to1_18_2.data;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.nbt.tag.ListTag;
import com.viaversion.nbt.tag.NumberTag;
import com.viaversion.viabackwards.ViaBackwards;
import com.viaversion.viabackwards.api.data.BackwardsMappingData;
import com.viaversion.viabackwards.api.data.BackwardsMappingDataLoader;
import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectMap;
import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectOpenHashMap;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.nbt.tag.ListTag;
import com.viaversion.nbt.tag.NumberTag;
import com.viaversion.viaversion.protocols.v1_18_2to1_19.Protocol1_18_2To1_19;
import org.checkerframework.checker.nullness.qual.Nullable;
public final class BackwardsMappingData1_19 extends BackwardsMappingData {
private final boolean sculkShriekerToCryingObsidian = ViaBackwards.getConfig().sculkShriekerToCryingObsidian();
private final Int2ObjectMap<CompoundTag> defaultChatTypes = new Int2ObjectOpenHashMap<>();
public BackwardsMappingData1_19() {
@@ -40,15 +38,15 @@ public final class BackwardsMappingData1_19 extends BackwardsMappingData {
@Override
protected void loadExtras(final CompoundTag data) {
super.loadExtras(data);
if (sculkShriekerToCryingObsidian) {
blockMappings.setNewId(850, 750);
if (ViaBackwards.getConfig().sculkShriekerToCryingObsidian()) {
for (int i = 18900; i <= 18907; i++) {
blockStateMappings.setNewId(i, 16082);
}
itemMappings.setNewId(329, 1065);
}
super.loadExtras(data);
final ListTag<CompoundTag> chatTypes = BackwardsMappingDataLoader.INSTANCE.loadNBT("chat-types-1.19.1.nbt").getListTag("values", CompoundTag.class);
for (final CompoundTag chatType : chatTypes) {
final NumberTag idTag = chatType.getNumberTag("id");
@@ -56,14 +54,6 @@ public final class BackwardsMappingData1_19 extends BackwardsMappingData {
}
}
@Override
public int getNewItemId(final int id) {
if (sculkShriekerToCryingObsidian && id == 329) {
return 1065;
}
return super.getNewItemId(id);
}
public @Nullable CompoundTag chatType(final int id) {
return defaultChatTypes.get(id);
}
@@ -268,14 +268,7 @@ public final class EntityPacketRewriter1_19 extends EntityRewriter<ClientboundPa
wrapper.passthrough(Types.UUID); // UUID
if (action == 0) { // Add player
wrapper.passthrough(Types.STRING); // Player Name
final int properties = wrapper.passthrough(Types.VAR_INT);
for (int j = 0; j < properties; j++) {
wrapper.passthrough(Types.STRING); // Name
wrapper.passthrough(Types.STRING); // Value
wrapper.passthrough(Types.OPTIONAL_STRING); // Signature
}
wrapper.passthrough(Types.PROFILE_PROPERTY_ARRAY);
wrapper.passthrough(Types.VAR_INT); // Gamemode
wrapper.passthrough(Types.VAR_INT); // Ping
wrapper.passthrough(Types.OPTIONAL_COMPONENT); // Display name
@@ -291,13 +291,7 @@ public final class Protocol1_20_3To1_20_2 extends BackwardsProtocol<ClientboundP
wrapper.passthrough(Types.UUID);
if (actions.get(0)) {
wrapper.passthrough(Types.STRING); // Player Name
final int properties = wrapper.passthrough(Types.VAR_INT);
for (int j = 0; j < properties; j++) {
wrapper.passthrough(Types.STRING); // Name
wrapper.passthrough(Types.STRING); // Value
wrapper.passthrough(Types.OPTIONAL_STRING); // Signature
}
wrapper.passthrough(Types.PROFILE_PROPERTY_ARRAY);
}
if (actions.get(1) && wrapper.passthrough(Types.BOOLEAN)) {
wrapper.passthrough(Types.UUID); // Session UUID
@@ -17,20 +17,30 @@
*/
package com.viaversion.viabackwards.protocol.v1_20_3to1_20_2.rewriter;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.nbt.tag.StringTag;
import com.viaversion.viabackwards.api.rewriters.BackwardsItemRewriter;
import com.viaversion.viabackwards.protocol.v1_20_3to1_20_2.Protocol1_20_3To1_20_2;
import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.data.ParticleMappings;
import com.viaversion.viaversion.api.minecraft.blockentity.BlockEntity;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2;
import com.viaversion.viaversion.api.type.types.version.Types1_20_3;
import com.viaversion.viaversion.libs.gson.JsonElement;
import com.viaversion.viaversion.protocols.v1_20_2to1_20_3.packet.ClientboundPacket1_20_3;
import com.viaversion.viaversion.protocols.v1_20_2to1_20_3.packet.ClientboundPackets1_20_3;
import com.viaversion.viaversion.protocols.v1_20_2to1_20_3.rewriter.RecipeRewriter1_20_3;
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.BlockRewriter;
import com.viaversion.viaversion.util.ComponentUtil;
import com.viaversion.viaversion.util.SerializerVersion;
import com.viaversion.viaversion.util.StringUtil;
import java.util.logging.Level;
public final class BlockItemPacketRewriter1_20_3 extends BackwardsItemRewriter<ClientboundPacket1_20_3, ServerboundPacket1_20_2, Protocol1_20_3To1_20_2> {
@@ -45,8 +55,8 @@ public final class BlockItemPacketRewriter1_20_3 extends BackwardsItemRewriter<C
blockRewriter.registerBlockUpdate(ClientboundPackets1_20_3.BLOCK_UPDATE);
blockRewriter.registerSectionBlocksUpdate1_20(ClientboundPackets1_20_3.SECTION_BLOCKS_UPDATE);
blockRewriter.registerLevelEvent(ClientboundPackets1_20_3.LEVEL_EVENT, 1010, 2001);
blockRewriter.registerLevelChunk1_19(ClientboundPackets1_20_3.LEVEL_CHUNK_WITH_LIGHT, ChunkType1_20_2::new);
blockRewriter.registerBlockEntityData(ClientboundPackets1_20_3.BLOCK_ENTITY_DATA);
blockRewriter.registerLevelChunk1_19(ClientboundPackets1_20_3.LEVEL_CHUNK_WITH_LIGHT, ChunkType1_20_2::new, this::updateBlockEntity);
blockRewriter.registerBlockEntityData(ClientboundPackets1_20_3.BLOCK_ENTITY_DATA, this::updateBlockEntity);
registerCooldown(ClientboundPackets1_20_3.COOLDOWN);
registerSetContent1_17_1(ClientboundPackets1_20_3.CONTAINER_SET_CONTENT);
@@ -156,4 +166,25 @@ public final class BlockItemPacketRewriter1_20_3 extends BackwardsItemRewriter<C
wrapper.read(Types.OPTIONAL_FLOAT); // Sound range
});
}
private void updateBlockEntity(final UserConnection connection, final BlockEntity blockEntity) {
final CompoundTag tag = blockEntity.tag();
if (tag == null) {
return;
}
final StringTag customName = tag.getStringTag("CustomName");
if (customName == null) {
return;
}
try {
final JsonElement updatedComponent = ComponentUtil.convertJson(customName.getValue(), SerializerVersion.V1_20_3, SerializerVersion.V1_19_4);
customName.setValue(updatedComponent.toString());
} catch (final Exception e) {
if (!Via.getConfig().isSuppressTextComponentConversionWarnings()) {
protocol.getLogger().log(Level.SEVERE, "Error during custom name conversion: " + StringUtil.forLogging(customName.getValue()), e);
}
}
}
}
@@ -40,6 +40,8 @@ import com.viaversion.viaversion.api.protocol.packet.State;
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.VersionedTypes;
import com.viaversion.viaversion.api.type.types.version.VersionedTypesHolder;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
import com.viaversion.viaversion.protocols.base.ClientboundLoginPackets;
import com.viaversion.viaversion.protocols.base.ServerboundLoginPackets;
@@ -112,6 +114,7 @@ public final class Protocol1_20_5To1_20_3 extends BackwardsProtocol<ClientboundP
translatableRewriter.registerPlayerCombatKill1_20(ClientboundPackets1_20_5.PLAYER_COMBAT_KILL);
translatableRewriter.registerComponentPacket(ClientboundPackets1_20_5.SYSTEM_CHAT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_20_5.DISGUISED_CHAT);
translatableRewriter.registerPlayerChat(ClientboundPackets1_20_5.PLAYER_CHAT, Types.VAR_INT);
translatableRewriter.registerPlayerInfoUpdate1_20_3(ClientboundPackets1_20_5.PLAYER_INFO_UPDATE);
translatableRewriter.registerPing();
@@ -164,14 +167,7 @@ public final class Protocol1_20_5To1_20_3 extends BackwardsProtocol<ClientboundP
registerClientbound(State.LOGIN, ClientboundLoginPackets.LOGIN_FINISHED, wrapper -> {
wrapper.passthrough(Types.UUID); // UUID
wrapper.passthrough(Types.STRING); // Name
final int properties = wrapper.passthrough(Types.VAR_INT);
for (int i = 0; i < properties; i++) {
wrapper.passthrough(Types.STRING); // Name
wrapper.passthrough(Types.STRING); // Value
wrapper.passthrough(Types.OPTIONAL_STRING); // Signature
}
wrapper.passthrough(Types.PROFILE_PROPERTY_ARRAY);
wrapper.read(Types.BOOLEAN); // Strict error handling
});
@@ -267,6 +263,16 @@ public final class Protocol1_20_5To1_20_3 extends BackwardsProtocol<ClientboundP
return tagRewriter;
}
@Override
public VersionedTypesHolder types() {
return VersionedTypes.V1_20_5;
}
@Override
public VersionedTypesHolder mappedTypes() {
return new Types1_20_3();
}
@Override
protected PacketTypesProvider<ClientboundPacket1_20_5, ClientboundPacket1_20_3, ServerboundPacket1_20_5, ServerboundPacket1_20_3> createPacketTypesProvider() {
return new SimplePacketTypesProvider<>(
@@ -0,0 +1,94 @@
/*
* 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_20_5to1_20_3;
import com.viaversion.viaversion.api.minecraft.Particle;
import com.viaversion.viaversion.api.minecraft.data.StructuredData;
import com.viaversion.viaversion.api.minecraft.data.version.VersionedStructuredDataKeys;
import com.viaversion.viaversion.api.minecraft.entitydata.EntityData;
import com.viaversion.viaversion.api.minecraft.entitydata.types.AbstractEntityDataTypes;
import com.viaversion.viaversion.api.minecraft.item.Item;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.ArrayType;
import com.viaversion.viaversion.api.type.types.item.StructuredDataType;
import com.viaversion.viaversion.api.type.types.misc.ParticleType;
import com.viaversion.viaversion.api.type.types.version.VersionedTypesHolder;
import java.util.List;
final class Types1_20_3 implements VersionedTypesHolder {
@Override
public Type<Item> item() {
return Types.ITEM1_20_2;
}
@Override
public Type<Item[]> itemArray() {
return Types.ITEM1_20_2_ARRAY;
}
@Override
public Type<Item> itemCost() {
return null;
}
@Override
public Type<Item> optionalItemCost() {
return null;
}
@Override
public Type<Item> lengthPrefixedItem() {
return null;
}
@Override
public StructuredDataType structuredData() {
return null;
}
@Override
public Type<StructuredData<?>[]> structuredDataArray() {
return null;
}
@Override
public VersionedStructuredDataKeys structuredDataKeys() {
return null;
}
@Override
public ParticleType particle() {
return com.viaversion.viaversion.api.type.types.version.Types1_20_3.PARTICLE;
}
@Override
public ArrayType<Particle> particles() {
return null;
}
@Override
public AbstractEntityDataTypes entityDataTypes() {
return com.viaversion.viaversion.api.type.types.version.Types1_20_3.ENTITY_DATA_TYPES;
}
@Override
public Type<List<EntityData>> entityDataList() {
return com.viaversion.viaversion.api.type.types.version.Types1_20_3.ENTITY_DATA_LIST;
}
}
@@ -27,6 +27,7 @@ import com.viaversion.viabackwards.api.rewriters.StructuredEnchantmentRewriter;
import com.viaversion.viabackwards.protocol.v1_20_5to1_20_3.Protocol1_20_5To1_20_3;
import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.data.item.ItemHasher;
import com.viaversion.viaversion.api.minecraft.Holder;
import com.viaversion.viaversion.api.minecraft.Particle;
import com.viaversion.viaversion.api.minecraft.SoundEvent;
@@ -39,7 +40,7 @@ import com.viaversion.viaversion.api.minecraft.item.data.Fireworks;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2;
import com.viaversion.viaversion.api.type.types.version.Types1_20_3;
import com.viaversion.viaversion.api.type.types.version.Types1_20_5;
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
import com.viaversion.viaversion.protocols.v1_20_2to1_20_3.packet.ServerboundPacket1_20_3;
import com.viaversion.viaversion.protocols.v1_20_2to1_20_3.packet.ServerboundPackets1_20_3;
import com.viaversion.viaversion.protocols.v1_20_2to1_20_3.rewriter.RecipeRewriter1_20_3;
@@ -59,7 +60,7 @@ public final class BlockItemPacketRewriter1_20_5 extends BackwardsStructuredItem
private final StructuredEnchantmentRewriter enchantmentRewriter = new StructuredEnchantmentRewriter(this);
public BlockItemPacketRewriter1_20_5(final Protocol1_20_5To1_20_3 protocol) {
super(protocol, Types1_20_5.ITEM, Types1_20_5.ITEM_ARRAY, Types.ITEM1_20_2, Types.ITEM1_20_2_ARRAY);
super(protocol);
enchantmentRewriter.setRewriteIds(false); // Let VV handle it
}
@@ -106,7 +107,7 @@ public final class BlockItemPacketRewriter1_20_5 extends BackwardsStructuredItem
wrapper.passthrough(Types.INT); // Particle Count
// Move it to the beginning, move out arguments here
final Particle particle = wrapper.read(Types1_20_5.PARTICLE);
final Particle particle = wrapper.read(VersionedTypes.V1_20_5.particle());
protocol.getParticleRewriter().rewriteParticle(wrapper.user(), particle);
if (particle.id() == protocol.getMappingData().getParticleMappings().mappedId("entity_effect")) {
// Remove color argument
@@ -141,8 +142,8 @@ public final class BlockItemPacketRewriter1_20_5 extends BackwardsStructuredItem
wrapper.passthrough(Types.FLOAT); // Knockback Z
wrapper.passthrough(Types.VAR_INT); // Block interaction type
final Particle smallExplosionParticle = wrapper.passthroughAndMap(Types1_20_5.PARTICLE, Types1_20_3.PARTICLE);
final Particle largeExplosionParticle = wrapper.passthroughAndMap(Types1_20_5.PARTICLE, Types1_20_3.PARTICLE);
final Particle smallExplosionParticle = wrapper.passthroughAndMap(VersionedTypes.V1_20_5.particle(), Types1_20_3.PARTICLE);
final Particle largeExplosionParticle = wrapper.passthroughAndMap(VersionedTypes.V1_20_5.particle(), Types1_20_3.PARTICLE);
protocol.getParticleRewriter().rewriteParticle(wrapper.user(), smallExplosionParticle);
protocol.getParticleRewriter().rewriteParticle(wrapper.user(), largeExplosionParticle);
@@ -163,14 +164,14 @@ public final class BlockItemPacketRewriter1_20_5 extends BackwardsStructuredItem
wrapper.passthrough(Types.VAR_INT); // Container id
final int size = wrapper.passthrough(Types.VAR_INT);
for (int i = 0; i < size; i++) {
final Item input = handleItemToClient(wrapper.user(), wrapper.read(Types1_20_5.ITEM_COST));
final Item input = handleItemToClient(wrapper.user(), wrapper.read(VersionedTypes.V1_20_5.itemCost()));
cleanInput(input);
wrapper.write(Types.ITEM1_20_2, input);
final Item result = handleItemToClient(wrapper.user(), wrapper.read(Types1_20_5.ITEM));
final Item result = handleItemToClient(wrapper.user(), wrapper.read(VersionedTypes.V1_20_5.item()));
wrapper.write(Types.ITEM1_20_2, result);
Item secondInput = wrapper.read(Types1_20_5.OPTIONAL_ITEM_COST);
Item secondInput = wrapper.read(VersionedTypes.V1_20_5.optionalItemCost());
if (secondInput != null) {
secondInput = handleItemToClient(wrapper.user(), secondInput);
cleanInput(secondInput);
@@ -360,8 +361,8 @@ public final class BlockItemPacketRewriter1_20_5 extends BackwardsStructuredItem
super.handleItemToClient(connection, item);
// Text components since we skip the usual rewrite method
updateComponent(connection, item, StructuredDataKey.ITEM_NAME, "item_name");
updateComponent(connection, item, StructuredDataKey.CUSTOM_NAME, "custom_name");
updateTextComponent(connection, item, StructuredDataKey.ITEM_NAME, "item_name");
updateTextComponent(connection, item, StructuredDataKey.CUSTOM_NAME, "custom_name");
final Tag[] lore = data.get(StructuredDataKey.LORE);
if (lore != null) {
for (final Tag tag : lore) {
@@ -391,9 +392,21 @@ public final class BlockItemPacketRewriter1_20_5 extends BackwardsStructuredItem
return oldItem;
}
// Items and data within components are handled in this protocol
@Override
protected void updateItemDataComponents(final UserConnection connection, final Item item, final boolean clientbound) {
// Items and data within components are handled in this protocol
protected void handleItemDataComponentsToClient(final UserConnection connection, final Item item, final StructuredDataContainer container) {
}
@Override
protected void handleItemDataComponentsToServer(final UserConnection connection, final Item item, final StructuredDataContainer container) {
}
@Override
protected void handleRewritablesToClient(final UserConnection connection, final StructuredDataContainer container, @Nullable final ItemHasher itemHasher) {
}
@Override
protected void handleRewritablesToServer(final UserConnection connection, final StructuredDataContainer container) {
}
@Override
@@ -1,6 +1,6 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2024 ViaVersion and contributors
* 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
@@ -26,7 +26,7 @@ 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.api.type.types.version.VersionedTypes;
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;
@@ -39,7 +39,7 @@ public final class ComponentRewriter1_20_5 extends JsonNBTComponentRewriter<Clie
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);
vvRewriter = new com.viaversion.viaversion.protocols.v1_20_3to1_20_5.rewriter.ComponentRewriter1_20_5<>(protocol, VersionedTypes.V1_20_5.structuredData());
}
@Override
@@ -40,7 +40,7 @@ import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.version.Types1_20_3;
import com.viaversion.viaversion.api.type.types.version.Types1_20_5;
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
import com.viaversion.viaversion.data.entity.DimensionDataImpl;
import com.viaversion.viaversion.protocols.v1_20_2to1_20_3.packet.ClientboundPackets1_20_3;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.Protocol1_20_3To1_20_5;
@@ -67,7 +67,7 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter<Clientbound
@Override
public void registerPackets() {
registerTrackerWithData1_19(ClientboundPackets1_20_5.ADD_ENTITY, EntityTypes1_20_5.FALLING_BLOCK);
registerSetEntityData(ClientboundPackets1_20_5.SET_ENTITY_DATA, Types1_20_5.ENTITY_DATA_LIST, Types1_20_3.ENTITY_DATA_LIST);
registerSetEntityData(ClientboundPackets1_20_5.SET_ENTITY_DATA, VersionedTypes.V1_20_5.entityDataList(), Types1_20_3.ENTITY_DATA_LIST);
registerRemoveEntities(ClientboundPackets1_20_5.REMOVE_ENTITIES);
protocol.registerClientbound(ClientboundPackets1_20_5.SET_EQUIPMENT, wrapper -> {
@@ -76,7 +76,7 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter<Clientbound
byte slot;
do {
slot = wrapper.read(Types.BYTE);
final Item item = protocol.getItemRewriter().handleItemToClient(wrapper.user(), wrapper.read(Types1_20_5.ITEM));
final Item item = protocol.getItemRewriter().handleItemToClient(wrapper.user(), wrapper.read(VersionedTypes.V1_20_5.item()));
final int rawSlot = slot & 0x7F;
if (rawSlot == 6) {
@@ -408,7 +408,7 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter<Clientbound
protected void registerRewrites() {
filter().handler((event, data) -> {
final int typeId = data.dataType().typeId();
if (typeId == Types1_20_5.ENTITY_DATA_TYPES.particlesType.typeId()) {
if (typeId == VersionedTypes.V1_20_5.entityDataTypes.particlesType.typeId()) {
final Particle[] particles = data.value();
int color = 0;
for (final Particle particle : particles) {
@@ -419,19 +419,19 @@ 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()) {
} else if (typeId == VersionedTypes.V1_20_5.entityDataTypes.armadilloState.typeId() || typeId == VersionedTypes.V1_20_5.entityDataTypes.wolfVariantType.typeId()) {
event.cancel();
return;
}
int id = typeId;
if (typeId >= Types1_20_5.ENTITY_DATA_TYPES.armadilloState.typeId()) {
if (typeId >= VersionedTypes.V1_20_5.entityDataTypes.armadilloState.typeId()) {
id--;
}
if (typeId >= Types1_20_5.ENTITY_DATA_TYPES.wolfVariantType.typeId()) {
if (typeId >= VersionedTypes.V1_20_5.entityDataTypes.wolfVariantType.typeId()) {
id--;
}
if (typeId >= Types1_20_5.ENTITY_DATA_TYPES.particlesType.typeId()) {
if (typeId >= VersionedTypes.V1_20_5.entityDataTypes.particlesType.typeId()) {
id--;
}
data.setDataType(Types1_20_3.ENTITY_DATA_TYPES.byId(id));
@@ -31,11 +31,14 @@ import com.viaversion.viabackwards.protocol.v1_21_2to1_21.storage.PlayerStorage;
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.storage.RecipeStorage;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_20_5;
import com.viaversion.viaversion.api.minecraft.item.data.ChatType;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.protocol.packet.State;
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.VersionedTypes;
import com.viaversion.viaversion.api.type.types.version.VersionedTypesHolder;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
import com.viaversion.viaversion.protocols.base.ClientboundLoginPackets;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ServerboundConfigurationPackets1_20_5;
@@ -95,6 +98,7 @@ public final class Protocol1_21_2To1_21 extends BackwardsProtocol<ClientboundPac
translatableRewriter.registerPlayerCombatKill1_20(ClientboundPackets1_21_2.PLAYER_COMBAT_KILL);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_2.SYSTEM_CHAT);
translatableRewriter.registerDisguisedChat(ClientboundPackets1_21_2.DISGUISED_CHAT);
translatableRewriter.registerPlayerChat(ClientboundPackets1_21_2.PLAYER_CHAT, ChatType.TYPE);
translatableRewriter.registerPing();
registerServerbound(ServerboundPackets1_20_5.CLIENT_INFORMATION, this::clientInformation);
@@ -110,14 +114,7 @@ public final class Protocol1_21_2To1_21 extends BackwardsProtocol<ClientboundPac
registerClientbound(State.LOGIN, ClientboundLoginPackets.LOGIN_FINISHED, wrapper -> {
wrapper.passthrough(Types.UUID); // UUID
wrapper.passthrough(Types.STRING); // Name
final int properties = wrapper.passthrough(Types.VAR_INT);
for (int i = 0; i < properties; i++) {
wrapper.passthrough(Types.STRING); // Name
wrapper.passthrough(Types.STRING); // Value
wrapper.passthrough(Types.OPTIONAL_STRING); // Signature
}
wrapper.passthrough(Types.PROFILE_PROPERTY_ARRAY);
wrapper.write(Types.BOOLEAN, true); // Strict error handling. Always enabled for newer clients, so mimic that behavior
});
@@ -194,6 +191,16 @@ public final class Protocol1_21_2To1_21 extends BackwardsProtocol<ClientboundPac
return tagRewriter;
}
@Override
public VersionedTypesHolder types() {
return VersionedTypes.V1_21_2;
}
@Override
public VersionedTypesHolder mappedTypes() {
return VersionedTypes.V1_21;
}
@Override
protected PacketTypesProvider<ClientboundPacket1_21_2, ClientboundPacket1_21, ServerboundPacket1_21_2, ServerboundPacket1_20_5> createPacketTypesProvider() {
return new SimplePacketTypesProvider<>(
@@ -19,7 +19,6 @@ package com.viaversion.viabackwards.protocol.v1_21_2to1_21.rewriter;
import com.viaversion.nbt.tag.ByteTag;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.nbt.tag.FloatTag;
import com.viaversion.nbt.tag.IntTag;
import com.viaversion.nbt.tag.ListTag;
import com.viaversion.nbt.tag.Tag;
@@ -38,6 +37,8 @@ import com.viaversion.viaversion.api.minecraft.data.StructuredDataKey;
import com.viaversion.viaversion.api.minecraft.item.Item;
import com.viaversion.viaversion.api.minecraft.item.data.Consumable1_21_2;
import com.viaversion.viaversion.api.minecraft.item.data.DeathProtection;
import com.viaversion.viaversion.api.minecraft.item.data.Enchantable;
import com.viaversion.viaversion.api.minecraft.item.data.Enchantments;
import com.viaversion.viaversion.api.minecraft.item.data.Equippable;
import com.viaversion.viaversion.api.minecraft.item.data.FoodProperties1_20_5;
import com.viaversion.viaversion.api.minecraft.item.data.Instrument1_21_2;
@@ -47,8 +48,7 @@ import com.viaversion.viaversion.api.minecraft.item.data.UseCooldown;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2;
import com.viaversion.viaversion.api.type.types.version.Types1_21;
import com.viaversion.viaversion.api.type.types.version.Types1_21_2;
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ServerboundPacket1_20_5;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ServerboundPackets1_20_5;
import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundPackets1_21;
@@ -66,10 +66,7 @@ import static com.viaversion.viaversion.protocols.v1_21to1_21_2.rewriter.BlockIt
public final class BlockItemPacketRewriter1_21_2 extends BackwardsStructuredItemRewriter<ClientboundPacket1_21_2, ServerboundPacket1_20_5, Protocol1_21_2To1_21> {
public BlockItemPacketRewriter1_21_2(final Protocol1_21_2To1_21 protocol) {
super(protocol,
Types1_21_2.ITEM, Types1_21_2.ITEM_ARRAY, Types1_21.ITEM, Types1_21.ITEM_ARRAY,
Types1_21_2.ITEM_COST, Types1_21_2.OPTIONAL_ITEM_COST, Types1_21.ITEM_COST, Types1_21.OPTIONAL_ITEM_COST
);
super(protocol);
}
@Override
@@ -214,11 +211,11 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsStructuredItem
wrapper.write(Types.VAR_INT, 0); // Block interaction type
final Particle explosionParticle = wrapper.read(Types1_21.PARTICLE);
final Particle explosionParticle = wrapper.read(VersionedTypes.V1_21.particle());
protocol.getParticleRewriter().rewriteParticle(wrapper.user(), explosionParticle);
// As small and large explosion particle
wrapper.write(Types1_21_2.PARTICLE, explosionParticle);
wrapper.write(Types1_21_2.PARTICLE, explosionParticle);
wrapper.write(VersionedTypes.V1_21_2.particle(), explosionParticle);
wrapper.write(VersionedTypes.V1_21_2.particle(), explosionParticle);
new SoundRewriter<>(protocol).soundHolderHandler().handle(wrapper);
});
@@ -320,6 +317,21 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsStructuredItem
updateItemData(item);
restoreInconvertibleData(item);
// Enchantments with level 0 are not supported anymore, if an older client for some reason sends it (for example
// using stored items in the hotbar lists), we need to remove it.
final Enchantments enchantments = data.get(StructuredDataKey.ENCHANTMENTS1_20_5);
if (enchantments != null) {
// The enchantments might be used to create a glint, set glint override to true if the enchantments are empty after filtering
final boolean removed = enchantments.enchantments().values().removeIf(level -> level == 0);
if (removed && enchantments.size() == 0) {
data.set(StructuredDataKey.ENCHANTMENT_GLINT_OVERRIDE, true);
}
}
final Enchantments storedEnchantments = data.get(StructuredDataKey.STORED_ENCHANTMENTS1_20_5);
if (storedEnchantments != null) {
storedEnchantments.enchantments().values().removeIf(level -> level == 0);
}
return item;
}
@@ -340,9 +352,9 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsStructuredItem
backupTag.put("repairable", holderSetToTag(repairable));
}
final Integer enchantable = data.get(StructuredDataKey.ENCHANTABLE);
final Enchantable enchantable = data.get(StructuredDataKey.ENCHANTABLE);
if (enchantable != null) {
backupTag.putInt("enchantable", enchantable);
backupTag.putInt("enchantable", enchantable.value());
}
final UseCooldown useCooldown = data.get(StructuredDataKey.USE_COOLDOWN);
@@ -355,9 +367,9 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsStructuredItem
backupTag.put("use_cooldown", tag);
}
final String itemModel = data.get(StructuredDataKey.ITEM_MODEL);
final Key itemModel = data.get(StructuredDataKey.ITEM_MODEL);
if (itemModel != null) {
backupTag.putString("item_model", itemModel);
backupTag.putString("item_model", itemModel.original());
}
final Equippable equippable = data.get(StructuredDataKey.EQUIPPABLE1_21_2);
@@ -365,7 +377,7 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsStructuredItem
final CompoundTag tag = new CompoundTag();
tag.putInt("equipment_slot", equippable.equipmentSlot());
convertSoundEventHolder(tag, equippable.soundEvent());
saveSoundEventHolder(tag, equippable.soundEvent());
final String model = equippable.model();
if (model != null) {
tag.putString("model", model);
@@ -389,9 +401,9 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsStructuredItem
backupTag.putBoolean("glider", true);
}
final String tooltipStyle = data.get(StructuredDataKey.TOOLTIP_STYLE);
final Key tooltipStyle = data.get(StructuredDataKey.TOOLTIP_STYLE);
if (tooltipStyle != null) {
backupTag.putString("tooltip_style", tooltipStyle);
backupTag.putString("tooltip_style", tooltipStyle.original());
}
final DeathProtection deathProtection = data.get(StructuredDataKey.DEATH_PROTECTION);
@@ -437,7 +449,7 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsStructuredItem
} else if (effect.type() == Types.SOUND_EVENT && effect.value() instanceof Holder sound) {
tag.putString("type", "play_sound");
convertSoundEventHolder(tag, sound);
saveSoundEventHolder(tag, sound);
}
}
@@ -454,15 +466,6 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsStructuredItem
}
}
private void convertSoundEventHolder(final CompoundTag tag, final Holder<SoundEvent> holder) {
tag.put("sound_event", holderToTag(holder, (event, soundEventTag) -> {
soundEventTag.putString("identifier", event.identifier());
if (event.fixedRange() != null) {
soundEventTag.putFloat("fixed_range", event.fixedRange());
}
}));
}
private Consumable1_21_2.ConsumeEffect<?> convertConsumableEffect(final CompoundTag tag) {
final int id = tag.getInt("id");
final String type = tag.getString("type");
@@ -486,7 +489,7 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsStructuredItem
final float probability = tag.getFloat("probability");
return new Consumable1_21_2.ConsumeEffect<>(id, Types.FLOAT, probability);
} else if ("play_sound".equals(type)) {
final Holder<SoundEvent> sound = convertSoundEventHolder(tag);
final Holder<SoundEvent> sound = restoreSoundEventHolder(tag);
return new Consumable1_21_2.ConsumeEffect<>(id, Types.SOUND_EVENT, sound);
}
return null;
@@ -502,14 +505,6 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsStructuredItem
return new PotionEffectData(amplifier, duration, ambient, showParticles, showIcon, hiddenEffect != null ? convertPotionEffectData(hiddenEffect) : null);
}
private Holder<SoundEvent> convertSoundEventHolder(final CompoundTag tag) {
return restoreHolder(tag, "sound_event", soundEventTag -> {
final String identifier = soundEventTag.getString("identifier");
final FloatTag fixedRange = soundEventTag.getFloatTag("fixed_range");
return new SoundEvent(identifier, fixedRange != null ? fixedRange.asFloat() : null);
});
}
private void restoreInconvertibleData(final Item item) {
final StructuredDataContainer data = item.dataContainer();
final CompoundTag customData = data.get(StructuredDataKey.CUSTOM_DATA);
@@ -532,7 +527,7 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsStructuredItem
final IntTag enchantable = backupTag.getIntTag("enchantable");
if (enchantable != null) {
data.set(StructuredDataKey.ENCHANTABLE, enchantable.asInt());
data.set(StructuredDataKey.ENCHANTABLE, new Enchantable(enchantable.asInt()));
}
final CompoundTag useCooldown = backupTag.getCompoundTag("use_cooldown");
@@ -544,13 +539,13 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsStructuredItem
final String itemModel = backupTag.getString("item_model");
if (itemModel != null) {
data.set(StructuredDataKey.ITEM_MODEL, itemModel);
data.set(StructuredDataKey.ITEM_MODEL, Key.of(itemModel));
}
final CompoundTag equippable = backupTag.getCompoundTag("equippable");
if (equippable != null) {
final int equipmentSlot = equippable.getInt("equipment_slot");
final Holder<SoundEvent> soundEvent = convertSoundEventHolder(equippable);
final Holder<SoundEvent> soundEvent = restoreSoundEventHolder(equippable);
final String model = equippable.getString("model");
final String cameraOverlay = equippable.getString("camera_overlay");
final HolderSet allowedEntities = equippable.contains("allowed_entities") ? restoreHolderSet(equippable, "allowed_entities") : null;
@@ -567,7 +562,7 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsStructuredItem
final String tooltipStyle = backupTag.getString("tooltip_style");
if (tooltipStyle != null) {
data.set(StructuredDataKey.TOOLTIP_STYLE, tooltipStyle);
data.set(StructuredDataKey.TOOLTIP_STYLE, Key.of(tooltipStyle));
}
final ListTag<CompoundTag> deathProtection = backupTag.getListTag("death_protection", CompoundTag.class);
@@ -36,8 +36,7 @@ import com.viaversion.viaversion.api.minecraft.entitydata.EntityData;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.version.Types1_21;
import com.viaversion.viaversion.api.type.types.version.Types1_21_2;
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ServerboundPackets1_20_5;
import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundConfigurationPackets1_21;
import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundPackets1_21;
@@ -66,12 +65,12 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter<Clientbound
private boolean warned = ViaBackwards.getConfig().suppressEmulationWarnings();
public EntityPacketRewriter1_21_2(final Protocol1_21_2To1_21 protocol) {
super(protocol, Types1_21.ENTITY_DATA_TYPES.optionalComponentType, Types1_21.ENTITY_DATA_TYPES.booleanType);
super(protocol, VersionedTypes.V1_21.entityDataTypes.optionalComponentType, VersionedTypes.V1_21.entityDataTypes.booleanType);
}
@Override
public void registerPackets() {
registerSetEntityData(ClientboundPackets1_21_2.SET_ENTITY_DATA, Types1_21_2.ENTITY_DATA_LIST, Types1_21.ENTITY_DATA_LIST);
registerSetEntityData(ClientboundPackets1_21_2.SET_ENTITY_DATA);
registerRemoveEntities(ClientboundPackets1_21_2.REMOVE_ENTITIES);
protocol.registerClientbound(ClientboundPackets1_21_2.ADD_ENTITY, wrapper -> {
final int entityId = wrapper.passthrough(Types.VAR_INT);
@@ -94,11 +93,11 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter<Clientbound
// Add boat type to entity data
final List<EntityData> data = new ArrayList<>();
final int boatType = type.isOrHasParent(EntityTypes1_21_2.ABSTRACT_CHEST_BOAT) ? chestBoatTypeFromEntityType(type) : boatTypeFromEntityType(type);
data.add(new EntityData(11, Types1_21.ENTITY_DATA_TYPES.varIntType, boatType));
data.add(new EntityData(11, VersionedTypes.V1_21.entityDataTypes.varIntType, boatType));
final PacketWrapper entityDataPacket = wrapper.create(ClientboundPackets1_21.SET_ENTITY_DATA);
entityDataPacket.write(Types.VAR_INT, entityId);
entityDataPacket.write(Types1_21.ENTITY_DATA_LIST, data);
entityDataPacket.write(VersionedTypes.V1_21.entityDataList, data);
entityDataPacket.send(Protocol1_21_2To1_21.class);
}
});
@@ -385,13 +384,7 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter<Clientbound
wrapper.passthrough(Types.UUID);
if (actions.get(0)) {
wrapper.passthrough(Types.STRING); // Player Name
final int properties = wrapper.passthrough(Types.VAR_INT);
for (int j = 0; j < properties; j++) {
wrapper.passthrough(Types.STRING); // Name
wrapper.passthrough(Types.STRING); // Value
wrapper.passthrough(Types.OPTIONAL_STRING); // Signature
}
wrapper.passthrough(Types.PROFILE_PROPERTY_ARRAY);
}
if (actions.get(1) && wrapper.passthrough(Types.BOOLEAN)) {
wrapper.passthrough(Types.UUID); // Session UUID
@@ -544,8 +537,8 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter<Clientbound
explosionPacket.write(Types.FLOAT, (float) movementY);
explosionPacket.write(Types.FLOAT, (float) movementZ);
explosionPacket.write(Types.VAR_INT, 0); // Block interaction
explosionPacket.write(Types1_21.PARTICLE, new Particle(0)); // Small explosion
explosionPacket.write(Types1_21.PARTICLE, new Particle(0)); // Large explosion
explosionPacket.write(VersionedTypes.V1_21.particle(), new Particle(0)); // Small explosion
explosionPacket.write(VersionedTypes.V1_21.particle(), new Particle(0)); // Large explosion
explosionPacket.write(Types.SOUND_EVENT, Holder.of(new SoundEvent("", null))); // Explosion sound
explosionPacket.send(Protocol1_21_2To1_21.class);
@@ -623,15 +616,15 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter<Clientbound
@Override
protected void registerRewrites() {
filter().mapDataType(Types1_21.ENTITY_DATA_TYPES::byId);
filter().mapDataType(VersionedTypes.V1_21.entityDataTypes::byId);
registerEntityDataTypeHandler1_20_3(
Types1_21.ENTITY_DATA_TYPES.itemType,
Types1_21.ENTITY_DATA_TYPES.blockStateType,
Types1_21.ENTITY_DATA_TYPES.optionalBlockStateType,
Types1_21.ENTITY_DATA_TYPES.particleType,
Types1_21.ENTITY_DATA_TYPES.particlesType,
Types1_21.ENTITY_DATA_TYPES.componentType,
Types1_21.ENTITY_DATA_TYPES.optionalComponentType
VersionedTypes.V1_21.entityDataTypes.itemType,
VersionedTypes.V1_21.entityDataTypes.blockStateType,
VersionedTypes.V1_21.entityDataTypes.optionalBlockStateType,
VersionedTypes.V1_21.entityDataTypes.particleType,
VersionedTypes.V1_21.entityDataTypes.particlesType,
VersionedTypes.V1_21.entityDataTypes.componentType,
VersionedTypes.V1_21.entityDataTypes.optionalComponentType
);
registerBlockStateHandler(EntityTypes1_21_2.ABSTRACT_MINECART, 11);
@@ -21,15 +21,13 @@ import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.Particle;
import com.viaversion.viaversion.api.protocol.Protocol;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.version.Types1_21;
import com.viaversion.viaversion.api.type.types.version.Types1_21_2;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPacket1_21_2;
import com.viaversion.viaversion.rewriter.ParticleRewriter;
public final class ParticleRewriter1_21_2 extends ParticleRewriter<ClientboundPacket1_21_2> {
public ParticleRewriter1_21_2(final Protocol<ClientboundPacket1_21_2, ?, ?, ?> protocol) {
super(protocol, Types1_21_2.PARTICLE, Types1_21.PARTICLE);
super(protocol);
}
@Override
@@ -26,7 +26,7 @@ import com.viaversion.viaversion.api.minecraft.item.Item;
import com.viaversion.viaversion.api.minecraft.item.StructuredItem;
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_2;
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundPackets1_21;
import java.util.ArrayList;
import java.util.Comparator;
@@ -77,11 +77,11 @@ public final class RecipeStorage implements StorableObject {
for (int i = 0; i < ingredient.length; i++) {
copy[i] = ingredient[i].copy();
}
wrapper.write(Types1_21_2.ITEM_ARRAY, copy);
wrapper.write(VersionedTypes.V1_21_2.itemArray(), copy);
}
void writeResult(final PacketWrapper wrapper, final Item result) {
wrapper.write(Types1_21_2.ITEM, result.copy());
wrapper.write(VersionedTypes.V1_21_2.item(), result.copy());
}
void writeCategory(final PacketWrapper wrapper) {
@@ -286,7 +286,7 @@ public final class RecipeStorage implements StorableObject {
yield new Item[]{new StructuredItem(rewriteItemId(id), 1)};
}
case 3 -> {
final Item item = wrapper.read(Types1_21_2.ITEM);
final Item item = wrapper.read(VersionedTypes.V1_21_2.item());
protocol.getItemRewriter().handleItemToClient(wrapper.user(), item);
if (item.isEmpty()) {
protocol.getLogger().warning("Empty item in recipe");
@@ -29,11 +29,12 @@ import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.Particle;
import com.viaversion.viaversion.api.minecraft.RegistryType;
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.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_2;
import com.viaversion.viaversion.api.type.types.version.Types1_21_4;
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
import com.viaversion.viaversion.api.type.types.version.VersionedTypesHolder;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
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;
@@ -91,6 +92,7 @@ public final class Protocol1_21_4To1_21_2 extends BackwardsProtocol<ClientboundP
translatableRewriter.registerPlayerCombatKill1_20(ClientboundPackets1_21_2.PLAYER_COMBAT_KILL);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_2.SYSTEM_CHAT);
translatableRewriter.registerDisguisedChat(ClientboundPackets1_21_2.DISGUISED_CHAT);
translatableRewriter.registerPlayerChat(ClientboundPackets1_21_2.PLAYER_CHAT, ChatType.TYPE);
translatableRewriter.registerPing();
particleRewriter.registerExplode1_21_2(ClientboundPackets1_21_2.EXPLODE);
@@ -105,7 +107,7 @@ public final class Protocol1_21_4To1_21_2 extends BackwardsProtocol<ClientboundP
wrapper.passthrough(Types.FLOAT); // Offset Z
wrapper.passthrough(Types.FLOAT); // Particle Data
wrapper.passthrough(Types.INT); // Particle Count
final Particle particle = wrapper.passthroughAndMap(Types1_21_4.PARTICLE, Types1_21_2.PARTICLE);
final Particle particle = wrapper.passthroughAndMap(VersionedTypes.V1_21_4.particle(), VersionedTypes.V1_21_2.particle());
particleRewriter.rewriteParticle(wrapper.user(), particle);
});
@@ -130,13 +132,7 @@ public final class Protocol1_21_4To1_21_2 extends BackwardsProtocol<ClientboundP
wrapper.passthrough(Types.UUID);
if (actions.get(0)) {
wrapper.passthrough(Types.STRING); // Player Name
final int properties = wrapper.passthrough(Types.VAR_INT);
for (int j = 0; j < properties; j++) {
wrapper.passthrough(Types.STRING); // Name
wrapper.passthrough(Types.STRING); // Value
wrapper.passthrough(Types.OPTIONAL_STRING); // Signature
}
wrapper.passthrough(Types.PROFILE_PROPERTY_ARRAY);
}
if (actions.get(1) && wrapper.passthrough(Types.BOOLEAN)) {
wrapper.passthrough(Types.UUID); // Session UUID
@@ -208,6 +204,16 @@ public final class Protocol1_21_4To1_21_2 extends BackwardsProtocol<ClientboundP
return tagRewriter;
}
@Override
public VersionedTypesHolder types() {
return VersionedTypes.V1_21_4;
}
@Override
public VersionedTypesHolder mappedTypes() {
return VersionedTypes.V1_21_2;
}
@Override
protected PacketTypesProvider<ClientboundPacket1_21_2, ClientboundPacket1_21_2, ServerboundPacket1_21_4, ServerboundPacket1_21_2> createPacketTypesProvider() {
return new SimplePacketTypesProvider<>(
@@ -32,8 +32,6 @@ import com.viaversion.viaversion.api.minecraft.item.Item;
import com.viaversion.viaversion.api.minecraft.item.data.CustomModelData1_21_4;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2;
import com.viaversion.viaversion.api.type.types.version.Types1_21_2;
import com.viaversion.viaversion.api.type.types.version.Types1_21_4;
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.protocols.v1_21to1_21_2.packet.ServerboundPacket1_21_2;
@@ -47,10 +45,7 @@ import static com.viaversion.viaversion.protocols.v1_21_2to1_21_4.rewriter.Block
public final class BlockItemPacketRewriter1_21_4 extends BackwardsStructuredItemRewriter<ClientboundPacket1_21_2, ServerboundPacket1_21_2, Protocol1_21_4To1_21_2> {
public BlockItemPacketRewriter1_21_4(final Protocol1_21_4To1_21_2 protocol) {
super(protocol,
Types1_21_4.ITEM, Types1_21_4.ITEM_ARRAY, Types1_21_2.ITEM, Types1_21_2.ITEM_ARRAY,
Types1_21_4.ITEM_COST, Types1_21_4.OPTIONAL_ITEM_COST, Types1_21_2.ITEM_COST, Types1_21_2.OPTIONAL_ITEM_COST
);
super(protocol);
}
@Override
@@ -27,8 +27,7 @@ import com.viaversion.viaversion.api.minecraft.entities.EntityType;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_4;
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_2;
import com.viaversion.viaversion.api.type.types.version.Types1_21_4;
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundConfigurationPackets1_21;
import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.packet.ServerboundPackets1_21_4;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPacket1_21_2;
@@ -40,13 +39,13 @@ import com.viaversion.viaversion.util.Key;
public final class EntityPacketRewriter1_21_4 extends EntityRewriter<ClientboundPacket1_21_2, Protocol1_21_4To1_21_2> {
public EntityPacketRewriter1_21_4(final Protocol1_21_4To1_21_2 protocol) {
super(protocol, Types1_21_4.ENTITY_DATA_TYPES.optionalComponentType, Types1_21_4.ENTITY_DATA_TYPES.booleanType);
super(protocol, VersionedTypes.V1_21_4.entityDataTypes.optionalComponentType, VersionedTypes.V1_21_4.entityDataTypes.booleanType);
}
@Override
public void registerPackets() {
registerTrackerWithData1_19(ClientboundPackets1_21_2.ADD_ENTITY, EntityTypes1_21_4.FALLING_BLOCK);
registerSetEntityData(ClientboundPackets1_21_2.SET_ENTITY_DATA, Types1_21_4.ENTITY_DATA_LIST, Types1_21_2.ENTITY_DATA_LIST);
registerSetEntityData(ClientboundPackets1_21_2.SET_ENTITY_DATA);
registerRemoveEntities(ClientboundPackets1_21_2.REMOVE_ENTITIES);
final RegistryDataRewriter registryDataRewriter = new RegistryDataRewriter(protocol) {
@@ -147,15 +146,15 @@ public final class EntityPacketRewriter1_21_4 extends EntityRewriter<Clientbound
@Override
protected void registerRewrites() {
filter().mapDataType(Types1_21_2.ENTITY_DATA_TYPES::byId);
filter().mapDataType(VersionedTypes.V1_21_2.entityDataTypes::byId);
registerEntityDataTypeHandler1_20_3(
Types1_21_2.ENTITY_DATA_TYPES.itemType,
Types1_21_2.ENTITY_DATA_TYPES.blockStateType,
Types1_21_2.ENTITY_DATA_TYPES.optionalBlockStateType,
Types1_21_2.ENTITY_DATA_TYPES.particleType,
Types1_21_2.ENTITY_DATA_TYPES.particlesType,
Types1_21_2.ENTITY_DATA_TYPES.componentType,
Types1_21_2.ENTITY_DATA_TYPES.optionalComponentType
VersionedTypes.V1_21_2.entityDataTypes.itemType,
VersionedTypes.V1_21_2.entityDataTypes.blockStateType,
VersionedTypes.V1_21_2.entityDataTypes.optionalBlockStateType,
VersionedTypes.V1_21_2.entityDataTypes.particleType,
VersionedTypes.V1_21_2.entityDataTypes.particlesType,
VersionedTypes.V1_21_2.entityDataTypes.componentType,
VersionedTypes.V1_21_2.entityDataTypes.optionalComponentType
);
registerBlockStateHandler(EntityTypes1_21_4.ABSTRACT_MINECART, 11);
@@ -168,7 +167,7 @@ public final class EntityPacketRewriter1_21_4 extends EntityRewriter<Clientbound
case 2 -> "large";
default -> "medium";
};
data.setTypeAndValue(Types1_21_4.ENTITY_DATA_TYPES.stringType, type);
data.setTypeAndValue(VersionedTypes.V1_21_4.entityDataTypes.stringType, type);
});
}
@@ -20,15 +20,13 @@ package com.viaversion.viabackwards.protocol.v1_21_4to1_21_2.rewriter;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.Particle;
import com.viaversion.viaversion.api.protocol.Protocol;
import com.viaversion.viaversion.api.type.types.version.Types1_21_2;
import com.viaversion.viaversion.api.type.types.version.Types1_21_4;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPacket1_21_2;
import com.viaversion.viaversion.rewriter.ParticleRewriter;
public final class ParticleRewriter1_21_4 extends ParticleRewriter<ClientboundPacket1_21_2> {
public ParticleRewriter1_21_4(final Protocol<ClientboundPacket1_21_2, ?, ?, ?> protocol) {
super(protocol, Types1_21_4.PARTICLE, Types1_21_2.PARTICLE);
super(protocol);
}
@Override
@@ -23,16 +23,21 @@ 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.viabackwards.protocol.v1_21_5to1_21_4.storage.HashedItemConverterStorage;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.Particle;
import com.viaversion.viaversion.api.minecraft.data.version.StructuredDataKeys1_21_2;
import com.viaversion.viaversion.api.minecraft.data.version.StructuredDataKeys1_21_5;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_4;
import com.viaversion.viaversion.api.minecraft.entitydata.types.EntityDataTypes1_21_2;
import com.viaversion.viaversion.api.minecraft.entitydata.types.EntityDataTypes1_21_5;
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.api.type.types.version.Types1_20_5;
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
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;
@@ -58,7 +63,7 @@ public final class Protocol1_21_5To1_21_4 extends BackwardsProtocol<ClientboundP
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) {
private final ParticleRewriter<ClientboundPacket1_21_5> particleRewriter = new ParticleRewriter<>(this) {
@Override
public void rewriteParticle(final UserConnection connection, final Particle particle) {
if (particle.id() == MAPPINGS.getParticleMappings().id("tinted_leaves")) {
@@ -180,6 +185,7 @@ public final class Protocol1_21_5To1_21_4 extends BackwardsProtocol<ClientboundP
@Override
public void init(final UserConnection user) {
addEntityTracker(user, new EntityTrackerBase(user, EntityTypes1_21_4.PLAYER));
user.put(new HashedItemConverterStorage(this));
}
@Override
@@ -212,6 +218,16 @@ public final class Protocol1_21_5To1_21_4 extends BackwardsProtocol<ClientboundP
return tagRewriter;
}
@Override
public Types1_20_5<StructuredDataKeys1_21_5, EntityDataTypes1_21_5> types() {
return VersionedTypes.V1_21_5;
}
@Override
public Types1_20_5<StructuredDataKeys1_21_2, EntityDataTypes1_21_2> mappedTypes() {
return VersionedTypes.V1_21_4;
}
@Override
protected PacketTypesProvider<ClientboundPacket1_21_5, ClientboundPacket1_21_2, ServerboundPacket1_21_5, ServerboundPacket1_21_4> createPacketTypesProvider() {
return new SimplePacketTypesProvider<>(
@@ -17,10 +17,6 @@
*/
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;
@@ -30,6 +26,7 @@ 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.HashedItemConverterStorage;
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;
@@ -48,7 +45,6 @@ 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;
@@ -59,6 +55,7 @@ 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.TropicalFishPattern;
import com.viaversion.viaversion.api.minecraft.item.data.Weapon;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.rewriter.ComponentRewriter;
@@ -68,8 +65,8 @@ 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.api.type.types.version.VersionedTypes;
import com.viaversion.viaversion.data.item.ItemHasherBase;
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;
@@ -86,6 +83,10 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
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;
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;
@@ -93,10 +94,7 @@ public final class BlockItemPacketRewriter1_21_5 extends BackwardsStructuredItem
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
);
super(protocol);
}
@Override
@@ -157,7 +155,7 @@ public final class BlockItemPacketRewriter1_21_5 extends BackwardsStructuredItem
wrapper.passthrough(Types.SHORT); // Slot
final Item item = handleItemToServer(wrapper.user(), wrapper.read(mappedItemType()));
wrapper.write(Types1_21_5.LENGTH_PREFIXED_ITEM, item);
wrapper.write(VersionedTypes.V1_21_5.lengthPrefixedItem(), item);
});
protocol.registerServerbound(ServerboundPackets1_21_4.CONTAINER_CLICK, wrapper -> {
@@ -167,16 +165,17 @@ public final class BlockItemPacketRewriter1_21_5 extends BackwardsStructuredItem
wrapper.passthrough(Types.BYTE); // Button
wrapper.passthrough(Types.VAR_INT); // Mode
// We have no way of actually reconstructing the items here
// Try our best to get a hashed item out of it - will be wrong for some data component types that don't have their conversion implemented
final HashedItemConverterStorage hashedItemConverter = wrapper.user().get(HashedItemConverterStorage.class);
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()));
wrapper.write(Types.HASHED_ITEM, ItemHasherBase.toHashedItem(hashedItemConverter.hasher(), item));
}
final Item carriedItem = handleItemToServer(wrapper.user(), wrapper.read(mappedItemType()));
wrapper.write(Types.HASHED_ITEM, new HashedStructuredItem(carriedItem.identifier(), carriedItem.amount()));
wrapper.write(Types.HASHED_ITEM, ItemHasherBase.toHashedItem(hashedItemConverter.hasher(), carriedItem));
});
protocol.registerClientbound(ClientboundPackets1_21_5.SET_EQUIPMENT, wrapper -> {
@@ -282,9 +281,9 @@ public final class BlockItemPacketRewriter1_21_5 extends BackwardsStructuredItem
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));
entityDataList.add(new EntityData(17, VersionedTypes.V1_21_4.entityDataTypes.byteType, data));
entityDataPacket.write(Types.VAR_INT, entityId);
entityDataPacket.write(Types1_21_4.ENTITY_DATA_LIST, entityDataList);
entityDataPacket.write(VersionedTypes.V1_21_4.entityDataList, entityDataList);
entityDataPacket.send(Protocol1_21_5To1_21_4.class);
}
@@ -323,12 +322,8 @@ public final class BlockItemPacketRewriter1_21_5 extends BackwardsStructuredItem
}
@Override
public Item handleItemToClient(final UserConnection connection, final Item item) {
super.handleItemToClient(connection, item);
final StructuredDataContainer dataContainer = item.dataContainer();
final CompoundTag backupTag = new CompoundTag();
protected void backupInconvertibleData(final UserConnection connection, final Item item, final StructuredDataContainer dataContainer, final CompoundTag backupTag) {
super.backupInconvertibleData(connection, item, dataContainer, backupTag);
final ToolProperties toolProperties = dataContainer.get(StructuredDataKey.TOOL1_21_5);
if (toolProperties != null && toolProperties.canDestroyBlocksInCreative()) {
backupTag.putBoolean("tool", true);
@@ -390,10 +385,10 @@ public final class BlockItemPacketRewriter1_21_5 extends BackwardsStructuredItem
itemDamageTag.putString("bypassed_by", blocksAttacks.bypassedByTag());
}
if (blocksAttacks.blockSound() != null) {
blocksAttackTag.put("block_sound", holderToTag(blocksAttacks.blockSound(), this::soundToTag));
blocksAttackTag.put("block_sound", holderToTag(blocksAttacks.blockSound(), this::saveSoundEvent));
}
if (blocksAttacks.disableSound() != null) {
blocksAttackTag.put("disable_sound", holderToTag(blocksAttacks.disableSound(), this::soundToTag));
blocksAttackTag.put("disable_sound", holderToTag(blocksAttacks.disableSound(), this::saveSoundEvent));
}
}
@@ -402,13 +397,17 @@ public final class BlockItemPacketRewriter1_21_5 extends BackwardsStructuredItem
backupTag.put("hidden_components", new IntArrayTag(tooltipDisplay.hiddenComponents().toIntArray()));
}
saveStringData(StructuredDataKey.PROVIDES_BANNER_PATTERNS, dataContainer, backupTag);
final TropicalFishPattern tropicalFishPattern = dataContainer.get(StructuredDataKey.TROPICAL_FISH_PATTERN);
if (tropicalFishPattern != null) {
backupTag.putInt("tropical_fish_pattern", tropicalFishPattern.packedId());
}
saveKeyData(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);
@@ -447,34 +446,25 @@ public final class BlockItemPacketRewriter1_21_5 extends BackwardsStructuredItem
}
});
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());
}
saveHolderData(StructuredDataKey.BREAK_SOUND, dataContainer, backupTag, this::saveSoundEvent);
}
@Override
public Item handleItemToServer(final UserConnection connection, final Item item) {
super.handleItemToServer(connection, item);
restoreData(item.dataContainer());
updateItemData(item);
return item;
protected void handleItemDataComponentsToClient(final UserConnection connection, final Item item, final StructuredDataContainer dataContainer) {
super.handleItemDataComponentsToClient(connection, item, dataContainer);
downgradeItemData(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)) {
@Override
protected void handleItemDataComponentsToServer(final UserConnection connection, final Item item, final StructuredDataContainer container) {
super.handleItemDataComponentsToServer(connection, item, container);
updateItemData(item);
}
@Override
protected void restoreBackupData(final Item item, final StructuredDataContainer data, final CompoundTag customData) {
super.restoreBackupData(item, data, customData);
if (!(customData.remove(nbtTagName("backup")) instanceof final CompoundTag backupTag)) {
return;
}
@@ -544,13 +534,17 @@ public final class BlockItemPacketRewriter1_21_5 extends BackwardsStructuredItem
}
}
restoreStringData(StructuredDataKey.PROVIDES_BANNER_PATTERNS, data, backupTag);
final IntTag tropicalFishPattern = backupTag.getIntTag("tropical_fish_pattern");
if (tropicalFishPattern != null) {
data.set(StructuredDataKey.TROPICAL_FISH_PATTERN, new TropicalFishPattern(tropicalFishPattern.asInt()));
}
restoreKeyData(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);
@@ -32,6 +32,7 @@ import com.viaversion.viaversion.util.SerializerVersion;
import com.viaversion.viaversion.util.TagUtil;
import java.util.HashSet;
import java.util.Set;
import org.checkerframework.checker.nullness.qual.Nullable;
import static com.viaversion.viaversion.util.TagUtil.getNamespacedCompoundTag;
import static com.viaversion.viaversion.util.TagUtil.getNamespacedCompoundTagList;
@@ -102,22 +103,19 @@ public final class ComponentRewriter1_21_5 extends NBTComponentRewriter<Clientbo
final CompoundTag componentsTag = hoverEventTag.getCompoundTag("components");
handleShowItem(connection, contents, componentsTag);
if (componentsTag != null) {
hoverEventTag.remove("components");
contents.put("components", componentsTag);
}
}
@Override
protected void handleShowItem(final UserConnection connection, final CompoundTag itemTag, @Nullable final CompoundTag componentsTag) {
super.handleShowItem(connection, itemTag, 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);
@@ -234,8 +232,9 @@ public final class ComponentRewriter1_21_5 extends NBTComponentRewriter<Clientbo
contents.put("name", nameTag);
}
if (hoverEventTag.remove("id") instanceof StringTag typeTag) {
contents.put("type", typeTag);
if (hoverEventTag.remove("id") instanceof StringTag idTag) {
idTag.setValue(protocol.getEntityRewriter().mappedEntityIdentifier(idTag.getValue()));
contents.put("type", idTag);
}
final Tag uuidTag = hoverEventTag.remove("uuid");
@@ -22,6 +22,7 @@ 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.HashedItemConverterStorage;
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;
@@ -31,16 +32,19 @@ 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.minecraft.entitydata.types.EntityDataTypes1_21_2;
import com.viaversion.viaversion.api.minecraft.entitydata.types.EntityDataTypes1_21_5;
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.api.type.types.version.VersionedTypes;
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.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.UUID;
@@ -50,12 +54,12 @@ public final class EntityPacketRewriter1_21_5 extends EntityRewriter<Clientbound
"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);
super(protocol, protocol.mappedTypes().entityDataTypes().optionalComponentType, protocol.mappedTypes().entityDataTypes().booleanType);
}
@Override
public void registerPackets() {
registerSetEntityData(ClientboundPackets1_21_5.SET_ENTITY_DATA, Types1_21_5.ENTITY_DATA_LIST, Types1_21_4.ENTITY_DATA_LIST);
registerSetEntityData(ClientboundPackets1_21_5.SET_ENTITY_DATA);
registerRemoveEntities(ClientboundPackets1_21_5.REMOVE_ENTITIES);
protocol.appendClientbound(ClientboundPackets1_21_5.ADD_ENTITY, wrapper -> {
@@ -153,6 +157,14 @@ public final class EntityPacketRewriter1_21_5 extends EntityRewriter<Clientbound
}
final RegistryEntry[] entries = wrapper.read(Types.REGISTRY_ENTRY_ARRAY);
if (registryKey.equals("enchantment")) {
final List<String> identifiers = new ArrayList<>(entries.length);
for (final RegistryEntry entry : entries) {
identifiers.add(entry.key());
}
wrapper.user().get(HashedItemConverterStorage.class).setEnchantments(identifiers);
}
wrapper.write(Types.REGISTRY_ENTRY_ARRAY, registryDataRewriter.handle(wrapper.user(), registryKey, entries));
});
@@ -219,56 +231,58 @@ public final class EntityPacketRewriter1_21_5 extends EntityRewriter<Clientbound
@Override
protected void registerRewrites() {
final EntityDataTypes1_21_5 entityDataTypes = VersionedTypes.V1_21_5.entityDataTypes;
final EntityDataTypes1_21_2 mappedEntityDataTypes = VersionedTypes.V1_21_4.entityDataTypes;
filter().handler((event, data) -> {
final int id = data.dataType().typeId();
if (id == Types1_21_5.ENTITY_DATA_TYPES.wolfVariantType.typeId()) {
if (id == entityDataTypes.wolfVariantType.typeId()) {
final int type = data.value();
final Holder<WolfVariant> variant = Holder.of(type);
data.setTypeAndValue(Types1_21_4.ENTITY_DATA_TYPES.wolfVariantType, variant);
data.setTypeAndValue(mappedEntityDataTypes.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()) {
if (id == entityDataTypes.cowVariantType.typeId()
|| id == entityDataTypes.pigVariantType.typeId()
|| id == entityDataTypes.chickenVariantType.typeId()
|| id == entityDataTypes.wolfSoundVariantType.typeId()) {
event.cancel();
return;
} else if (id > Types1_21_5.ENTITY_DATA_TYPES.chickenVariantType.typeId()) {
} else if (id > entityDataTypes.chickenVariantType.typeId()) {
mappedId -= 4;
} else if (id > Types1_21_5.ENTITY_DATA_TYPES.pigVariantType.typeId()) {
} else if (id > entityDataTypes.pigVariantType.typeId()) {
mappedId -= 3;
} else if (id > Types1_21_5.ENTITY_DATA_TYPES.wolfSoundVariantType.typeId()) {
} else if (id > entityDataTypes.wolfSoundVariantType.typeId()) {
mappedId -= 2;
} else if (id > Types1_21_5.ENTITY_DATA_TYPES.cowVariantType.typeId()) {
} else if (id > entityDataTypes.cowVariantType.typeId()) {
mappedId -= 1;
}
data.setDataType(Types1_21_4.ENTITY_DATA_TYPES.byId(mappedId));
data.setDataType(mappedEntityDataTypes.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
mappedEntityDataTypes.itemType,
mappedEntityDataTypes.blockStateType,
mappedEntityDataTypes.optionalBlockStateType,
mappedEntityDataTypes.particleType,
mappedEntityDataTypes.particlesType,
mappedEntityDataTypes.componentType,
mappedEntityDataTypes.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));
data.setTypeAndValue(entityDataTypes.varIntType, mappedBlockState);
event.createExtraData(new EntityData(13, mappedEntityDataTypes.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);
data.setTypeAndValue(entityDataTypes.stringType, typeName);
}));
filter().type(EntityTypes1_21_5.ABSTRACT_HORSE).index(17).handler((event, data) -> {
@@ -0,0 +1,51 @@
/*
* 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;
import com.viaversion.viaversion.api.connection.StorableObject;
import com.viaversion.viaversion.api.minecraft.codec.CodecContext;
import com.viaversion.viaversion.api.minecraft.codec.CodecContext.RegistryAccess;
import com.viaversion.viaversion.api.minecraft.codec.hash.Hasher;
import com.viaversion.viaversion.api.protocol.Protocol;
import com.viaversion.viaversion.codec.CodecRegistryContext;
import com.viaversion.viaversion.codec.hash.HashFunction;
import com.viaversion.viaversion.codec.hash.HashOps;
import com.viaversion.viaversion.util.SerializerVersion;
import java.util.ArrayList;
import java.util.List;
public class HashedItemConverterStorage implements StorableObject {
private final List<String> enchantments = new ArrayList<>();
private final Hasher hasher;
public HashedItemConverterStorage(final Protocol<?, ?, ?, ?> protocol) {
final RegistryAccess registryAccess = RegistryAccess.of(this.enchantments, protocol.getMappingData());
final CodecContext context = new CodecRegistryContext(protocol, SerializerVersion.V1_21_5, SerializerVersion.V1_21_5, registryAccess, false);
this.hasher = new HashOps(context, HashFunction.CRC32C);
}
public void setEnchantments(final List<String> enchantments) {
this.enchantments.clear();
this.enchantments.addAll(enchantments);
}
public Hasher hasher() {
return hasher; // reusable
}
}
@@ -0,0 +1,177 @@
/*
* 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_6to1_21_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.text.NBTComponentRewriter;
import com.viaversion.viabackwards.protocol.v1_21_6to1_21_5.rewriter.BlockItemPacketRewriter1_21_6;
import com.viaversion.viabackwards.protocol.v1_21_6to1_21_5.rewriter.ComponentRewriter1_21_6;
import com.viaversion.viabackwards.protocol.v1_21_6to1_21_5.rewriter.EntityPacketRewriter1_21_6;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_6;
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.VersionedTypes;
import com.viaversion.viaversion.api.type.types.version.VersionedTypesHolder;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
import com.viaversion.viaversion.data.item.ItemHasherBase;
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_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_21_5to1_21_6.Protocol1_21_5To1_21_6;
import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundConfigurationPackets1_21_6;
import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPacket1_21_6;
import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPackets1_21_6;
import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ServerboundConfigurationPackets1_21_6;
import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ServerboundPacket1_21_6;
import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ServerboundPackets1_21_6;
import com.viaversion.viaversion.rewriter.AttributeRewriter;
import com.viaversion.viaversion.rewriter.ParticleRewriter;
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
import com.viaversion.viaversion.rewriter.TagRewriter;
import com.viaversion.viaversion.util.SerializerVersion;
import static com.viaversion.viaversion.util.ProtocolUtil.packetTypeMap;
public final class Protocol1_21_6To1_21_5 extends BackwardsProtocol<ClientboundPacket1_21_6, ClientboundPacket1_21_5, ServerboundPacket1_21_6, ServerboundPacket1_21_5> {
public static final BackwardsMappingData MAPPINGS = new BackwardsMappingData("1.21.6", "1.21.5", Protocol1_21_5To1_21_6.class);
private final EntityPacketRewriter1_21_6 entityRewriter = new EntityPacketRewriter1_21_6(this);
private final BlockItemPacketRewriter1_21_6 itemRewriter = new BlockItemPacketRewriter1_21_6(this);
private final ParticleRewriter<ClientboundPacket1_21_6> particleRewriter = new ParticleRewriter<>(this);
private final NBTComponentRewriter<ClientboundPacket1_21_6> translatableRewriter = new ComponentRewriter1_21_6(this);
private final TagRewriter<ClientboundPacket1_21_6> tagRewriter = new TagRewriter<>(this);
public Protocol1_21_6To1_21_5() {
super(ClientboundPacket1_21_6.class, ClientboundPacket1_21_5.class, ServerboundPacket1_21_6.class, ServerboundPacket1_21_5.class);
}
@Override
protected void registerPackets() {
super.registerPackets();
tagRewriter.removeTags("dialog");
tagRewriter.registerGeneric(ClientboundPackets1_21_6.UPDATE_TAGS);
tagRewriter.registerGeneric(ClientboundConfigurationPackets1_21_6.UPDATE_TAGS);
final SoundRewriter<ClientboundPacket1_21_6> soundRewriter = new SoundRewriter<>(this);
soundRewriter.registerSound1_19_3(ClientboundPackets1_21_6.SOUND);
soundRewriter.registerSound1_19_3(ClientboundPackets1_21_6.SOUND_ENTITY);
soundRewriter.registerStopSound(ClientboundPackets1_21_6.STOP_SOUND);
new StatisticsRewriter<>(this).register(ClientboundPackets1_21_6.AWARD_STATS);
new AttributeRewriter<>(this).register1_21(ClientboundPackets1_21_6.UPDATE_ATTRIBUTES);
new CommandRewriter1_19_4<>(this) {
@Override
public void handleArgument(final PacketWrapper wrapper, final String argumentType) {
if (argumentType.equals("minecraft:hex_color") || argumentType.equals("minecraft:dialog")) {
wrapper.write(Types.VAR_INT, 0); // Word
} else {
super.handleArgument(wrapper, argumentType);
}
}
}.registerDeclareCommands1_19(ClientboundPackets1_21_6.COMMANDS);
translatableRewriter.registerOpenScreen1_14(ClientboundPackets1_21_6.OPEN_SCREEN);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_6.SET_ACTION_BAR_TEXT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_6.SET_TITLE_TEXT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_6.SET_SUBTITLE_TEXT);
translatableRewriter.registerBossEvent(ClientboundPackets1_21_6.BOSS_EVENT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_6.DISCONNECT);
translatableRewriter.registerTabList(ClientboundPackets1_21_6.TAB_LIST);
translatableRewriter.registerPlayerCombatKill1_20(ClientboundPackets1_21_6.PLAYER_COMBAT_KILL);
translatableRewriter.registerPlayerInfoUpdate1_21_4(ClientboundPackets1_21_6.PLAYER_INFO_UPDATE);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_6.SYSTEM_CHAT);
translatableRewriter.registerDisguisedChat(ClientboundPackets1_21_6.DISGUISED_CHAT);
translatableRewriter.registerPlayerChat1_21_5(ClientboundPackets1_21_6.PLAYER_CHAT);
translatableRewriter.registerPing();
particleRewriter.registerLevelParticles1_21_4(ClientboundPackets1_21_6.LEVEL_PARTICLES);
particleRewriter.registerExplode1_21_2(ClientboundPackets1_21_6.EXPLODE);
cancelClientbound(ClientboundPackets1_21_6.TRACKED_WAYPOINT);
cancelClientbound(ClientboundPackets1_21_6.CLEAR_DIALOG);
cancelClientbound(ClientboundPackets1_21_6.SHOW_DIALOG);
cancelClientbound(ClientboundConfigurationPackets1_21_6.CLEAR_DIALOG);
cancelClientbound(ClientboundConfigurationPackets1_21_6.SHOW_DIALOG);
}
@Override
public void init(final UserConnection user) {
addEntityTracker(user, new EntityTrackerBase(user, EntityTypes1_21_6.PLAYER));
addItemHasher(user, new ItemHasherBase(this, user, SerializerVersion.V1_21_5, SerializerVersion.V1_21_5));
}
@Override
public BackwardsMappingData getMappingData() {
return MAPPINGS;
}
@Override
public EntityPacketRewriter1_21_6 getEntityRewriter() {
return entityRewriter;
}
@Override
public BlockItemPacketRewriter1_21_6 getItemRewriter() {
return itemRewriter;
}
@Override
public ParticleRewriter<ClientboundPacket1_21_6> getParticleRewriter() {
return particleRewriter;
}
@Override
public NBTComponentRewriter<ClientboundPacket1_21_6> getComponentRewriter() {
return translatableRewriter;
}
@Override
public TagRewriter<ClientboundPacket1_21_6> getTagRewriter() {
return tagRewriter;
}
@Override
public VersionedTypesHolder types() {
return VersionedTypes.V1_21_6;
}
@Override
public VersionedTypesHolder mappedTypes() {
return VersionedTypes.V1_21_5;
}
@Override
protected PacketTypesProvider<ClientboundPacket1_21_6, ClientboundPacket1_21_5, ServerboundPacket1_21_6, ServerboundPacket1_21_5> createPacketTypesProvider() {
return new SimplePacketTypesProvider<>(
packetTypeMap(unmappedClientboundPacketType, ClientboundPackets1_21_6.class, ClientboundConfigurationPackets1_21_6.class),
packetTypeMap(mappedClientboundPacketType, ClientboundPackets1_21_5.class, ClientboundConfigurationPackets1_21.class),
packetTypeMap(mappedServerboundPacketType, ServerboundPackets1_21_6.class, ServerboundConfigurationPackets1_21_6.class),
packetTypeMap(unmappedServerboundPacketType, ServerboundPackets1_21_5.class, ServerboundConfigurationPackets1_20_5.class)
);
}
}
@@ -0,0 +1,152 @@
/*
* 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_6to1_21_5.rewriter;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.nbt.tag.ListTag;
import com.viaversion.viabackwards.api.rewriters.BackwardsStructuredItemRewriter;
import com.viaversion.viabackwards.protocol.v1_21_6to1_21_5.Protocol1_21_6To1_21_5;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.data.StructuredDataContainer;
import com.viaversion.viaversion.api.minecraft.data.StructuredDataKey;
import com.viaversion.viaversion.api.minecraft.item.Item;
import com.viaversion.viaversion.api.minecraft.item.data.AttributeModifiers1_21;
import com.viaversion.viaversion.api.minecraft.item.data.Equippable;
import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_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_21_4to1_21_5.rewriter.RecipeDisplayRewriter1_21_5;
import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPacket1_21_6;
import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPackets1_21_6;
import com.viaversion.viaversion.rewriter.BlockRewriter;
import com.viaversion.viaversion.rewriter.RecipeDisplayRewriter;
import static com.viaversion.viaversion.protocols.v1_21_5to1_21_6.rewriter.BlockItemPacketRewriter1_21_6.downgradeItemData;
import static com.viaversion.viaversion.protocols.v1_21_5to1_21_6.rewriter.BlockItemPacketRewriter1_21_6.upgradeItemData;
public final class BlockItemPacketRewriter1_21_6 extends BackwardsStructuredItemRewriter<ClientboundPacket1_21_6, ServerboundPacket1_21_5, Protocol1_21_6To1_21_5> {
public BlockItemPacketRewriter1_21_6(final Protocol1_21_6To1_21_5 protocol) {
super(protocol);
}
@Override
public void registerPackets() {
final BlockRewriter<ClientboundPacket1_21_6> blockRewriter = BlockRewriter.for1_20_2(protocol);
blockRewriter.registerBlockEvent(ClientboundPackets1_21_6.BLOCK_EVENT);
blockRewriter.registerBlockUpdate(ClientboundPackets1_21_6.BLOCK_UPDATE);
blockRewriter.registerSectionBlocksUpdate1_20(ClientboundPackets1_21_6.SECTION_BLOCKS_UPDATE);
blockRewriter.registerLevelEvent1_21(ClientboundPackets1_21_6.LEVEL_EVENT, 2001);
blockRewriter.registerLevelChunk1_19(ClientboundPackets1_21_6.LEVEL_CHUNK_WITH_LIGHT, ChunkType1_21_5::new);
blockRewriter.registerBlockEntityData(ClientboundPackets1_21_6.BLOCK_ENTITY_DATA);
protocol.registerClientbound(ClientboundPackets1_21_6.SET_CURSOR_ITEM, this::passthroughClientboundItem);
registerSetPlayerInventory(ClientboundPackets1_21_6.SET_PLAYER_INVENTORY);
registerCooldown1_21_2(ClientboundPackets1_21_6.COOLDOWN);
registerSetContent1_21_2(ClientboundPackets1_21_6.CONTAINER_SET_CONTENT);
registerSetSlot1_21_2(ClientboundPackets1_21_6.CONTAINER_SET_SLOT);
registerAdvancements1_20_3(ClientboundPackets1_21_6.UPDATE_ADVANCEMENTS);
registerSetEquipment(ClientboundPackets1_21_6.SET_EQUIPMENT);
registerMerchantOffers1_20_5(ClientboundPackets1_21_6.MERCHANT_OFFERS);
registerContainerClick1_21_5(ServerboundPackets1_21_5.CONTAINER_CLICK);
registerSetCreativeModeSlot1_21_5(ServerboundPackets1_21_5.SET_CREATIVE_MODE_SLOT);
final RecipeDisplayRewriter<ClientboundPacket1_21_6> recipeRewriter = new RecipeDisplayRewriter1_21_5<>(protocol);
recipeRewriter.registerUpdateRecipes(ClientboundPackets1_21_6.UPDATE_RECIPES);
recipeRewriter.registerRecipeBookAdd(ClientboundPackets1_21_6.RECIPE_BOOK_ADD);
recipeRewriter.registerPlaceGhostRecipe(ClientboundPackets1_21_6.PLACE_GHOST_RECIPE);
}
@Override
protected void handleItemDataComponentsToClient(final UserConnection connection, final Item item, final StructuredDataContainer container) {
downgradeItemData(item);
super.handleItemDataComponentsToClient(connection, item, container);
}
@Override
protected void handleItemDataComponentsToServer(final UserConnection connection, final Item item, final StructuredDataContainer container) {
upgradeItemData(item);
super.handleItemDataComponentsToServer(connection, item, container);
}
@Override
protected void backupInconvertibleData(final UserConnection connection, final Item item, final StructuredDataContainer dataContainer, final CompoundTag backupTag) {
super.backupInconvertibleData(connection, item, dataContainer, backupTag);
final AttributeModifiers1_21 attributeModifiers = dataContainer.get(StructuredDataKey.ATTRIBUTE_MODIFIERS1_21_6);
if (attributeModifiers != null) {
final ListTag<CompoundTag> modifiersBackup = new ListTag<>(CompoundTag.class);
boolean needsBackup = false;
for (final AttributeModifiers1_21.AttributeModifier modifier : attributeModifiers.modifiers()) {
if (modifier.display().id() != 0) {
needsBackup = true;
}
final CompoundTag modifierBackup = new CompoundTag();
modifiersBackup.add(modifierBackup);
modifierBackup.putInt("id", modifier.display().id());
if (modifier.display() instanceof AttributeModifiers1_21.OverrideText overrideText) {
modifierBackup.put("text", overrideText.component());
}
}
if (needsBackup) {
backupTag.put("attribute_modifiers_displays", modifiersBackup);
}
}
final Equippable equippable = dataContainer.get(StructuredDataKey.EQUIPPABLE1_21_6);
if (equippable != null && equippable.canBeSheared()) {
final CompoundTag equippableTag = new CompoundTag();
equippableTag.putBoolean("can_be_sheared", true);
saveSoundEventHolder(equippableTag, equippable.shearingSound());
backupTag.put("equippable", equippableTag);
}
}
@Override
protected void restoreBackupData(final Item item, final StructuredDataContainer container, final CompoundTag customData) {
super.restoreBackupData(item, container, customData);
if (!(customData.remove(nbtTagName("backup")) instanceof final CompoundTag backupTag)) {
return;
}
final ListTag<CompoundTag> attributeModifiersDisplays = backupTag.getListTag("attribute_modifiers_displays", CompoundTag.class);
if (attributeModifiersDisplays != null) {
container.replace(StructuredDataKey.ATTRIBUTE_MODIFIERS1_21_5, StructuredDataKey.ATTRIBUTE_MODIFIERS1_21_6, modifiers -> {
final AttributeModifiers1_21.AttributeModifier[] updatedModifiers = new AttributeModifiers1_21.AttributeModifier[modifiers.modifiers().length];
for (int i = 0; i < modifiers.modifiers().length; i++) {
final CompoundTag modifierBackup = attributeModifiersDisplays.get(i);
final int id = modifierBackup.getInt("id");
final AttributeModifiers1_21.Display display = id == 2 ? new AttributeModifiers1_21.OverrideText(modifierBackup.get("text")) : new AttributeModifiers1_21.Display(id);
final AttributeModifiers1_21.AttributeModifier modifier = modifiers.modifiers()[i];
updatedModifiers[i] = new AttributeModifiers1_21.AttributeModifier(modifier.attribute(), modifier.modifier(), modifier.slotType(), display);
}
return new AttributeModifiers1_21(updatedModifiers);
});
}
final CompoundTag equippableTag = backupTag.getCompoundTag("equippable");
if (equippableTag != null) {
container.replace(StructuredDataKey.EQUIPPABLE1_21_5, StructuredDataKey.EQUIPPABLE1_21_6, equippable -> new Equippable(
equippable.equipmentSlot(), equippable.soundEvent(), equippable.model(), equippable.cameraOverlay(), equippable.allowedEntities(),
equippable.dispensable(), equippable.swappable(), equippable.damageOnHurt(), equippable.equipOnInteract(),
equippableTag.getBoolean("can_be_sheared"),
restoreSoundEventHolder(equippableTag)
));
}
}
}
@@ -0,0 +1,46 @@
/*
* 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_6to1_21_5.rewriter;
import com.viaversion.nbt.tag.CompoundTag;
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_5to1_21_6.packet.ClientboundPacket1_21_6;
public final class ComponentRewriter1_21_6 extends NBTComponentRewriter<ClientboundPacket1_21_6> {
public ComponentRewriter1_21_6(final BackwardsProtocol<ClientboundPacket1_21_6, ?, ?, ?> protocol) {
super(protocol);
}
@Override
protected void processCompoundTag(final UserConnection connection, final CompoundTag tag) {
super.processCompoundTag(connection, tag);
final CompoundTag clickEvent = tag.getCompoundTag("click_event");
if (clickEvent == null) {
return;
}
final String action = clickEvent.getString("action");
if ("custom".equals(action)) {
tag.remove("click_event");
}
}
}
@@ -0,0 +1,96 @@
/*
* 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_6to1_21_5.rewriter;
import com.viaversion.viabackwards.api.rewriters.BackwardsRegistryRewriter;
import com.viaversion.viabackwards.api.rewriters.EntityRewriter;
import com.viaversion.viabackwards.protocol.v1_21_6to1_21_5.Protocol1_21_6To1_21_5;
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_6;
import com.viaversion.viaversion.api.minecraft.entitydata.types.EntityDataTypes1_21_5;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ServerboundPackets1_21_5;
import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundConfigurationPackets1_21_6;
import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPacket1_21_6;
import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPackets1_21_6;
import com.viaversion.viaversion.rewriter.RegistryDataRewriter;
public final class EntityPacketRewriter1_21_6 extends EntityRewriter<ClientboundPacket1_21_6, Protocol1_21_6To1_21_5> {
public EntityPacketRewriter1_21_6(final Protocol1_21_6To1_21_5 protocol) {
super(protocol, VersionedTypes.V1_21_6.entityDataTypes.optionalComponentType, VersionedTypes.V1_21_6.entityDataTypes.booleanType);
}
@Override
public void registerPackets() {
registerTrackerWithData1_19(ClientboundPackets1_21_6.ADD_ENTITY, EntityTypes1_21_6.FALLING_BLOCK);
registerSetEntityData(ClientboundPackets1_21_6.SET_ENTITY_DATA);
registerRemoveEntities(ClientboundPackets1_21_6.REMOVE_ENTITIES);
registerPlayerAbilities(ClientboundPackets1_21_6.PLAYER_ABILITIES);
registerGameEvent(ClientboundPackets1_21_6.GAME_EVENT);
registerLogin1_20_5(ClientboundPackets1_21_6.LOGIN);
registerRespawn1_20_5(ClientboundPackets1_21_6.RESPAWN);
final RegistryDataRewriter registryDataRewriter = new BackwardsRegistryRewriter(protocol);
registryDataRewriter.remove("dialog");
protocol.registerClientbound(ClientboundConfigurationPackets1_21_6.REGISTRY_DATA, registryDataRewriter::handle);
protocol.registerServerbound(ServerboundPackets1_21_5.PLAYER_COMMAND, wrapper -> {
wrapper.passthrough(Types.VAR_INT); // Entity ID
// press_shift_key and release_shift_key gone. The server uses (the already sent) player input instead
final int action = wrapper.read(Types.VAR_INT);
if (action < 2) {
wrapper.cancel();
}
wrapper.write(Types.VAR_INT, action - 2);
});
}
@Override
protected void registerRewrites() {
final EntityDataTypes1_21_5 entityDataTypes = VersionedTypes.V1_21_5.entityDataTypes;
filter().mapDataType(entityDataTypes::byId);
registerEntityDataTypeHandler1_20_3(
entityDataTypes.itemType,
entityDataTypes.blockStateType,
entityDataTypes.optionalBlockStateType,
entityDataTypes.particleType,
entityDataTypes.particlesType,
entityDataTypes.componentType,
entityDataTypes.optionalComponentType
);
filter().type(EntityTypes1_21_6.HANGING_ENTITY).removeIndex(8); // Direction
filter().type(EntityTypes1_21_6.HAPPY_GHAST).cancel(17); // Leash holder
filter().type(EntityTypes1_21_6.HAPPY_GHAST).cancel(18); // Stays still
}
@Override
public void onMappingDataLoaded() {
mapTypes();
mapEntityTypeWithData(EntityTypes1_21_6.HAPPY_GHAST, EntityTypes1_21_6.GHAST).tagName();
}
@Override
public EntityType typeFromId(final int type) {
return EntityTypes1_21_6.getTypeFromId(type);
}
}
@@ -29,13 +29,16 @@ import com.viaversion.viabackwards.protocol.v1_21to1_20_5.storage.OpenScreenStor
import com.viaversion.viabackwards.protocol.v1_21to1_20_5.storage.PlayerRotationStorage;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.Holder;
import com.viaversion.viaversion.api.minecraft.data.version.StructuredDataKeys1_20_5;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_20_5;
import com.viaversion.viaversion.api.minecraft.entitydata.types.EntityDataTypes1_20_5;
import com.viaversion.viaversion.api.minecraft.item.data.ChatType;
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_20_5;
import com.viaversion.viaversion.api.type.types.version.Types1_21;
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ClientboundConfigurationPackets1_20_5;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ClientboundPacket1_20_5;
@@ -59,7 +62,7 @@ public final class Protocol1_21To1_20_5 extends BackwardsProtocol<ClientboundPac
public static final BackwardsMappingData MAPPINGS = new BackwardsMappingData("1.21", "1.20.5", Protocol1_20_5To1_21.class);
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 ParticleRewriter<ClientboundPacket1_21> particleRewriter = new ParticleRewriter<>(this);
private final JsonNBTComponentRewriter<ClientboundPacket1_21> translatableRewriter = new ComponentRewriter1_21(this);
private final TagRewriter<ClientboundPacket1_21> tagRewriter = new TagRewriter<>(this);
@@ -141,10 +144,12 @@ public final class Protocol1_21To1_20_5 extends BackwardsProtocol<ClientboundPac
if (chatType.isDirect()) {
// Oh well
wrapper.write(Types.VAR_INT, 0);
return;
} else {
wrapper.write(Types.VAR_INT, chatType.id());
}
wrapper.write(Types.VAR_INT, chatType.id());
translatableRewriter.processTag(wrapper.user(), wrapper.passthrough(Types.TAG)); // Name
translatableRewriter.processTag(wrapper.user(), wrapper.passthrough(Types.OPTIONAL_TAG)); // Target Name
});
registerClientbound(ClientboundPackets1_21.UPDATE_ATTRIBUTES, wrapper -> {
@@ -228,6 +233,16 @@ public final class Protocol1_21To1_20_5 extends BackwardsProtocol<ClientboundPac
return tagRewriter;
}
@Override
public Types1_21 types() {
return VersionedTypes.V1_21;
}
@Override
public Types1_20_5<StructuredDataKeys1_20_5, EntityDataTypes1_20_5> mappedTypes() {
return VersionedTypes.V1_20_5;
}
@Override
protected PacketTypesProvider<ClientboundPacket1_21, ClientboundPacket1_20_5, ServerboundPacket1_20_5, ServerboundPacket1_20_5> createPacketTypesProvider() {
return new SimplePacketTypesProvider<>(
@@ -39,8 +39,6 @@ import com.viaversion.viaversion.api.minecraft.item.data.Enchantments;
import com.viaversion.viaversion.api.minecraft.item.data.JukeboxPlayable;
import com.viaversion.viaversion.api.type.Types;
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.text.TextFormatting;
import com.viaversion.viaversion.libs.mcstructs.text.components.StringComponent;
@@ -65,10 +63,7 @@ public final class BlockItemPacketRewriter1_21 extends BackwardsStructuredItemRe
private final StructuredEnchantmentRewriter enchantmentRewriter = new StructuredEnchantmentRewriter(this);
public BlockItemPacketRewriter1_21(final Protocol1_21To1_20_5 protocol) {
super(protocol,
Types1_21.ITEM, Types1_21.ITEM_ARRAY, Types1_20_5.ITEM, Types1_20_5.ITEM_ARRAY,
Types1_21.ITEM_COST, Types1_21.OPTIONAL_ITEM_COST, Types1_20_5.ITEM_COST, Types1_20_5.OPTIONAL_ITEM_COST
);
super(protocol);
}
@Override
@@ -180,8 +175,10 @@ public final class BlockItemPacketRewriter1_21 extends BackwardsStructuredItemRe
final var component = SerializerVersion.V1_20_5.toComponent(description);
component.getStyle().setItalic(false);
component.getStyle().setFormatting(TextFormatting.GRAY);
component.getSiblings().add(new StringComponent(" "));
component.getSiblings().add(new TranslationComponent(EnchantmentRewriter.ENCHANTMENT_LEVEL_TRANSLATION.formatted(level)));
if (level != 1 || storage.enchantmentMaxLevel(id) != 1) {
component.getSiblings().add(new StringComponent(" "));
component.getSiblings().add(new TranslationComponent(EnchantmentRewriter.ENCHANTMENT_LEVEL_TRANSLATION.formatted(level)));
}
return SerializerVersion.V1_20_5.toTag(component);
};
@@ -283,12 +280,7 @@ public final class BlockItemPacketRewriter1_21 extends BackwardsStructuredItemRe
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());
if (soundEvent.fixedRange() != null) {
soundEventTag.putFloat("fixed_range", soundEvent.fixedRange());
}
}));
saveSoundEventHolder(songTag, song.soundEvent());
songTag.put("description", song.description());
songTag.putFloat("length_in_seconds", song.lengthInSeconds());
songTag.putInt("comparator_output", song.comparatorOutput());
@@ -314,11 +306,7 @@ public final class BlockItemPacketRewriter1_21 extends BackwardsStructuredItemRe
song = EitherHolder.of(songIdentifier);
} else {
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;
return new SoundEvent(identifier, fixedRange);
});
final Holder<SoundEvent> soundEvent = restoreSoundEventHolder(songTag);
final Tag description = songTag.get("description");
final float lengthInSeconds = songTag.getFloat("length_in_seconds");
final int comparatorOutput = songTag.getInt("comparator_output");
@@ -30,11 +30,13 @@ import com.viaversion.viaversion.api.minecraft.WolfVariant;
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_20_5;
import com.viaversion.viaversion.api.minecraft.entitydata.EntityDataType;
import com.viaversion.viaversion.api.minecraft.entitydata.types.EntityDataTypes1_20_5;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
import com.viaversion.viaversion.api.type.Types;
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.api.type.types.version.VersionedTypes;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ServerboundPackets1_20_5;
import com.viaversion.viaversion.protocols.v1_20_5to1_21.data.Paintings1_20_5;
import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundConfigurationPackets1_21;
@@ -51,7 +53,7 @@ public final class EntityPacketRewriter1_21 extends EntityRewriter<ClientboundPa
private final Map<String, PaintingData> oldPaintings = new HashMap<>();
public EntityPacketRewriter1_21(final Protocol1_21To1_20_5 protocol) {
super(protocol, Types1_20_5.ENTITY_DATA_TYPES.optionalComponentType, Types1_20_5.ENTITY_DATA_TYPES.booleanType);
super(protocol, protocol.mappedTypes().entityDataTypes().optionalComponentType, protocol.mappedTypes().entityDataTypes().booleanType);
for (int i = 0; i < Paintings1_20_5.PAINTINGS.length; i++) {
final PaintingVariant painting = Paintings1_20_5.PAINTINGS[i];
@@ -62,7 +64,7 @@ public final class EntityPacketRewriter1_21 extends EntityRewriter<ClientboundPa
@Override
public void registerPackets() {
registerTrackerWithData1_19(ClientboundPackets1_21.ADD_ENTITY, EntityTypes1_20_5.FALLING_BLOCK);
registerSetEntityData(ClientboundPackets1_21.SET_ENTITY_DATA, Types1_21.ENTITY_DATA_LIST, Types1_20_5.ENTITY_DATA_LIST);
registerSetEntityData(ClientboundPackets1_21.SET_ENTITY_DATA);
registerRemoveEntities(ClientboundPackets1_21.REMOVE_ENTITIES);
final RegistryDataRewriter registryDataRewriter = new RegistryDataRewriter(protocol);
@@ -83,13 +85,15 @@ public final class EntityPacketRewriter1_21 extends EntityRewriter<ClientboundPa
storage.setPaintings(new KeyMappings(keys), paintingMappingsForEntries(entries));
} else if (enchantment) {
final Tag[] descriptions = new Tag[entries.length];
final int[] maxLevels = new int[entries.length];
for (int i = 0; i < entries.length; i++) {
final RegistryEntry entry = entries[i];
if (entry.tag() != null) {
descriptions[i] = ((CompoundTag) entry.tag()).get("description");
if (entry.tag() instanceof final CompoundTag tag) {
descriptions[i] = tag.get("description");
maxLevels[i] = tag.getInt("max_level");
}
}
storage.setEnchantments(new KeyMappings(keys), descriptions);
storage.setEnchantments(new KeyMappings(keys), descriptions, maxLevels);
} else {
final int[] jukeboxSongMappings = new int[keys.length];
for (int i = 0; i < keys.length; i++) {
@@ -176,36 +180,37 @@ public final class EntityPacketRewriter1_21 extends EntityRewriter<ClientboundPa
@Override
protected void registerRewrites() {
final EntityDataTypes1_20_5 mappedEntityDataTypes = VersionedTypes.V1_20_5.entityDataTypes;
filter().handler((event, data) -> {
final EntityDataType type = data.dataType();
if (type == Types1_21.ENTITY_DATA_TYPES.wolfVariantType) {
if (type == VersionedTypes.V1_21.entityDataTypes.wolfVariantType) {
final Holder<WolfVariant> variant = data.value();
if (variant.hasId()) {
data.setTypeAndValue(Types1_20_5.ENTITY_DATA_TYPES.wolfVariantType, variant.id());
data.setTypeAndValue(mappedEntityDataTypes.wolfVariantType, variant.id());
} else {
event.cancel();
}
} else if (type == Types1_21.ENTITY_DATA_TYPES.paintingVariantType) {
} else if (type == VersionedTypes.V1_21.entityDataTypes.paintingVariantType) {
final Holder<PaintingVariant> variant = data.value();
if (variant.hasId()) {
final EnchantmentsPaintingsStorage storage = event.user().get(EnchantmentsPaintingsStorage.class);
final int mappedId = storage.mappedPainting(variant.id());
data.setTypeAndValue(Types1_20_5.ENTITY_DATA_TYPES.paintingVariantType, mappedId);
data.setTypeAndValue(mappedEntityDataTypes.paintingVariantType, mappedId);
} else {
event.cancel();
}
} else {
data.setDataType(Types1_20_5.ENTITY_DATA_TYPES.byId(type.typeId()));
data.setDataType(mappedEntityDataTypes.byId(type.typeId()));
}
});
registerEntityDataTypeHandler1_20_3(
Types1_20_5.ENTITY_DATA_TYPES.itemType,
Types1_20_5.ENTITY_DATA_TYPES.blockStateType,
Types1_20_5.ENTITY_DATA_TYPES.optionalBlockStateType,
Types1_20_5.ENTITY_DATA_TYPES.particleType,
Types1_20_5.ENTITY_DATA_TYPES.particlesType,
Types1_20_5.ENTITY_DATA_TYPES.componentType,
Types1_20_5.ENTITY_DATA_TYPES.optionalComponentType
mappedEntityDataTypes.itemType,
mappedEntityDataTypes.blockStateType,
mappedEntityDataTypes.optionalBlockStateType,
mappedEntityDataTypes.particleType,
mappedEntityDataTypes.particlesType,
mappedEntityDataTypes.componentType,
mappedEntityDataTypes.optionalComponentType
);
registerBlockStateHandler(EntityTypes1_20_5.ABSTRACT_MINECART, 11);
}
@@ -27,15 +27,17 @@ public final class EnchantmentsPaintingsStorage implements StorableObject {
private KeyMappings paintings;
private int[] paintingMappings;
private Tag[] enchantmentDescriptions;
private int[] enchantmentMaxLevels;
private int[] jubeboxSongsToItems;
public KeyMappings enchantments() {
return enchantments;
}
public void setEnchantments(final KeyMappings enchantment, final Tag[] enchantmentDescriptions) {
public void setEnchantments(final KeyMappings enchantment, final Tag[] enchantmentDescriptions, final int[] enchantmentMaxLevels) {
this.enchantments = enchantment;
this.enchantmentDescriptions = enchantmentDescriptions;
this.enchantmentMaxLevels = enchantmentMaxLevels;
}
public KeyMappings paintings() {
@@ -67,4 +69,8 @@ public final class EnchantmentsPaintingsStorage implements StorableObject {
public @Nullable Tag enchantmentDescription(final int id) {
return id > 0 && id < enchantmentDescriptions.length ? enchantmentDescriptions[id] : null;
}
public int enchantmentMaxLevel(final int id) {
return id > 0 && id < enchantmentMaxLevels.length ? enchantmentMaxLevels[id] : -1;
}
}
@@ -28,11 +28,19 @@ bedrock-at-y-0: false
# If disabled, the client will see them as end portal frames.
sculk-shriekers-to-crying-obsidian: true
#
# Shows scaffolding as water for 1.13.2 clients on 1.14+ servers. This fixes collision issues.
# If disabled, the client will see them as hay blocks.
scaffolding-to-water: false
#
# Maps the darkness effect to blindness for 1.18.2 clients on 1.19+ servers.
map-darkness-effect: true
#
# If enabled, 1.21.3 clients will receive the first float of 1.21.4+ custom model data as int. Disable if you handle this change yourself.
map-custom-model-data: true
#
# If enabled, 1.19.3 clients will receive display entities as armor stands with custom entity data on 1.19.4+ servers. Note that
# this does not support all features display entities offer.
map-display-entities: true
#
# Suppresses warnings of missing emulations for certain features that are not supported (e.g. world height in 1.17+).
suppress-emulation-warnings: false
@@ -1,4 +1,221 @@
{
"1.21.6": {
"advancements.adventure.heart_transplanter.description": "Place a Creaking Heart with the correct alignment between two Pale Oak Log blocks",
"advancements.adventure.heart_transplanter.title": "Heart Transplanter",
"advancements.husbandry.place_dried_ghast_in_water.description": "Place a Dried Ghast block into water",
"advancements.husbandry.place_dried_ghast_in_water.title": "Stay Hydrated!",
"argument.hexcolor.invalid": "Invalid hex color code '%s'",
"argument.resource_or_id.no_such_element": "Can't find element '%s' in registry '%s'",
"argument.waypoint.invalid": "Selected entity is not a waypoint",
"attribute.name.camera_distance": "Camera Distance",
"attribute.name.waypoint_receive_range": "Waypoint Receive Range",
"attribute.name.waypoint_transmit_range": "Waypoint Transmit Range",
"block.minecraft.dried_ghast": "Dried Ghast",
"book.edit.title": "Book Edit Screen",
"book.sign.title": "Book Sign Screen",
"book.sign.titlebox": "Title",
"book.view.title": "Book View Screen",
"commands.datapack.create.already_exists": "Pack with name '%s' already exists",
"commands.datapack.create.invalid_full_name": "Invalid new pack name '%s'",
"commands.datapack.create.invalid_name": "Invalid characters in new pack name '%s'",
"commands.datapack.create.io_failure": "Can't create pack with name '%s', check logs",
"commands.datapack.create.metadata_encode_failure": "Failed to encode metadata for pack with name '%s': %s",
"commands.datapack.create.success": "Created new empty pack with name '%s'",
"commands.dialog.clear.multiple": "Cleared dialog for %s players",
"commands.dialog.clear.single": "Cleared dialog for %s",
"commands.dialog.show.multiple": "Displayed dialog to %s players",
"commands.dialog.show.single": "Displayed dialog to %s",
"commands.version.build_time": "build_time = %s",
"commands.version.data": "data = %s",
"commands.version.header": "Server version info:",
"commands.version.id": "id = %s",
"commands.version.name": "name = %s",
"commands.version.pack.data": "pack_data = %s",
"commands.version.pack.resource": "pack_resource = %s",
"commands.version.protocol": "protocol = %s (%s)",
"commands.version.series": "series = %s",
"commands.version.stable.no": "stable = no",
"commands.version.stable.yes": "stable = yes",
"commands.waypoint.list.empty": "No waypoints in %s",
"commands.waypoint.list.success": "%s waypoint(s) in %s: %s",
"commands.waypoint.modify.color": "Waypoint color is now %s",
"commands.waypoint.modify.color.reset": "Reset waypoint color",
"commands.waypoint.modify.style": "Waypoint style changed",
"dataPack.locator_bar.description": "Show the direction of other players in multiplayer",
"dataPack.locator_bar.name": "Locator Bar",
"debug.version.header": "Client version info:",
"debug.version.help": "F3 + V = Client version info",
"entity.minecraft.happy_ghast": "Happy Ghast",
"gamerule.locatorBar": "Enable player Locator Bar",
"gamerule.locatorBar.description": "When enabled, a bar is shown on the screen to indicate the direction of players.",
"gui.waitingForResponse.button.inactive": "Back (%ss)",
"gui.waitingForResponse.title": "Waiting for Server",
"item.minecraft.black_harness": "Black Harness",
"item.minecraft.blue_harness": "Blue Harness",
"item.minecraft.brown_harness": "Brown Harness",
"item.minecraft.cyan_harness": "Cyan Harness",
"item.minecraft.gray_harness": "Gray Harness",
"item.minecraft.green_harness": "Green Harness",
"item.minecraft.happy_ghast_spawn_egg": "Happy Ghast Spawn Egg",
"item.minecraft.harness": "Harness",
"item.minecraft.light_blue_harness": "Light Blue Harness",
"item.minecraft.light_gray_harness": "Light Gray Harness",
"item.minecraft.lime_harness": "Lime Harness",
"item.minecraft.magenta_harness": "Magenta Harness",
"item.minecraft.music_disc_tears.desc": "Amos Roddy - Tears",
"item.minecraft.orange_harness": "Orange Harness",
"item.minecraft.pink_harness": "Pink Harness",
"item.minecraft.purple_harness": "Purple Harness",
"item.minecraft.red_harness": "Red Harness",
"item.minecraft.white_harness": "White Harness",
"item.minecraft.yellow_harness": "Yellow Harness",
"jukebox_song.minecraft.tears": "Amos Roddy - Tears",
"key.quickActions": "Quick Actions",
"mco.configure.world.buttons.region_preference": "Select Region...",
"mco.configure.world.close.question.title": "Need to make changes without disruption?",
"mco.configure.world.loading": "Loading Realm",
"mco.configure.world.region_preference": "Region Preference",
"mco.configure.world.region_preference.title": "Region Preference Selection",
"mco.configure.world.settings.expired": "You cannot edit settings of an expired Realm",
"mco.connect.region": "Server region: %s",
"mco.errorMessage.realmsService.configurationError": "An unexpected error occurred while editing world options",
"mco.play.button.realm.closed": "Realm is closed",
"menu.custom_options": "Custom Options...",
"menu.custom_options.title": "Custom Options",
"menu.custom_options.tooltip": "Note: Custom options are provided by third-party servers and/or content.\nHandle with care!",
"menu.custom_screen_info.button_narration": "This is a custom screen. Learn more.",
"menu.custom_screen_info.contents": "The contents of this screen are controlled by third-party servers and maps that are not owned, operated, or supervised by Mojang Studios or Microsoft.\n\nHandle with care! Always be careful when following links and never give away your personal information, including login details.\n\nIf this screen prevents you from playing, you can also disconnect from the current server by using the button below.",
"menu.custom_screen_info.disconnect": "Custom screen rejected",
"menu.custom_screen_info.title": "Note about custom screens",
"menu.custom_screen_info.tooltip": "This is a custom screen. Click here to learn more.",
"menu.quick_actions": "Quick Actions...",
"menu.quick_actions.title": "Quick Actions",
"multiplayer.confirm_command.parse_errors": "You are trying to execute an unrecognized or invalid command.\nAre you sure?\nCommand: %s",
"multiplayer.confirm_command.permissions_required": "You are trying to execute a command that requires elevated permissions.\nThis might negatively affect your game.\nAre you sure?\nCommand: %s",
"multiplayer.confirm_command.title": "Confirm Command Execution",
"music.game.a_familiar_room": "Aaron Cherof - A Familiar Room",
"music.game.an_ordinary_day": "Kumi Tanioka - An Ordinary Day",
"music.game.ancestry": "Lena Raine - Ancestry",
"music.game.below_and_above": "Amos Roddy - Below and Above",
"music.game.broken_clocks": "Amos Roddy - Broken Clocks",
"music.game.bromeliad": "Aaron Cherof - Bromeliad",
"music.game.clark": "C418 - Clark",
"music.game.comforting_memories": "Kumi Tanioka - Comforting Memories",
"music.game.creative.aria_math": "C418 - Aria Math",
"music.game.creative.biome_fest": "C418 - Biome Fest",
"music.game.creative.blind_spots": "C418 - Blind Spots",
"music.game.creative.dreiton": "C418 - Dreiton",
"music.game.creative.haunt_muskie": "C418 - Haunt Muskie",
"music.game.creative.taswell": "C418 - Taswell",
"music.game.crescent_dunes": "Aaron Cherof - Crescent Dunes",
"music.game.danny": "C418 - Danny",
"music.game.deeper": "Lena Raine - Deeper",
"music.game.dry_hands": "C418 - Dry Hands",
"music.game.echo_in_the_wind": "Aaron Cherof - Echo in the Wind",
"music.game.eld_unknown": "Lena Raine - Eld Unknown",
"music.game.end.alpha": "C418 - Alpha",
"music.game.end.boss": "C418 - Boss",
"music.game.end.the_end": "C418 - The End",
"music.game.endless": "Lena Raine - Endless",
"music.game.featherfall": "Aaron Cherof - Featherfall",
"music.game.fireflies": "Amos Roddy - Fireflies",
"music.game.floating_dream": "Kumi Tanioka - Floating Dream",
"music.game.haggstrom": "C418 - Haggstrom",
"music.game.infinite_amethyst": "Lena Raine - Infinite Amethyst",
"music.game.key": "C418 - Key",
"music.game.komorebi": "Kumi Tanioka - komorebi",
"music.game.left_to_bloom": "Lena Raine - Left to Bloom",
"music.game.lilypad": "Amos Roddy - Lilypad",
"music.game.living_mice": "C418 - Living Mice",
"music.game.mice_on_venus": "C418 - Mice on Venus",
"music.game.minecraft": "C418 - Minecraft",
"music.game.nether.ballad_of_the_cats": "C418 - Ballad of the Cats",
"music.game.nether.concrete_halls": "C418 - Concrete Halls",
"music.game.nether.crimson_forest.chrysopoeia": "Lena Raine - Chrysopoeia",
"music.game.nether.dead_voxel": "C418 - Dead Voxel",
"music.game.nether.nether_wastes.rubedo": "Lena Raine - Rubedo",
"music.game.nether.soulsand_valley.so_below": "Lena Raine - So Below",
"music.game.nether.warmth": "C418 - Warmth",
"music.game.one_more_day": "Lena Raine - One More Day",
"music.game.os_piano": "Amos Roddy - O's Piano",
"music.game.oxygene": "C418 - Oxygène",
"music.game.pokopoko": "Kumi Tanioka - pokopoko",
"music.game.puzzlebox": "Aaron Cherof - Puzzlebox",
"music.game.stand_tall": "Lena Raine - Stand Tall",
"music.game.subwoofer_lullaby": "C418 - Subwoofer Lullaby",
"music.game.swamp.aerie": "Lena Raine - Aerie",
"music.game.swamp.firebugs": "Lena Raine - Firebugs",
"music.game.swamp.labyrinthine": "Lena Raine - Labyrinthine",
"music.game.sweden": "C418 - Sweden",
"music.game.watcher": "Aaron Cherof - Watcher",
"music.game.water.axolotl": "C418 - Axolotl",
"music.game.water.dragon_fish": "C418 - Dragon Fish",
"music.game.water.shuniji": "C418 - Shuniji",
"music.game.wending": "Lena Raine - Wending",
"music.game.wet_hands": "C418 - Wet Hands",
"music.game.yakusoku": "Kumi Tanioka - yakusoku",
"music.menu.beginning_2": "C418 - Beginning 2",
"music.menu.floating_trees": "C418 - Floating Trees",
"music.menu.moog_city_2": "C418 - Moog City 2",
"music.menu.mutation": "C418 - Mutation",
"narration.item": "Item: %s",
"options.music_frequency": "Music Frequency",
"options.music_frequency.constant": "Constant",
"options.music_frequency.frequent": "Frequent",
"options.music_frequency.tooltip": "Changes how frequently music plays while in a game world.",
"options.renderCloudsDistance": "Cloud Distance",
"options.showNowPlayingToast": "Show Music Toast",
"options.showNowPlayingToast.tooltip": "Displays a toast whenever a song starts playing. The same toast is constantly displayed in the in-game pause menu while a song is playing.",
"realms.configuration.region_preference.automatic_owner": "Automatic (Realm owner ping)",
"realms.configuration.region_preference.automatic_player": "Automatic (first to join session)",
"realms.configuration.region.australia_east": "New South Wales, Australia",
"realms.configuration.region.australia_southeast": "Victoria, Australia",
"realms.configuration.region.brazil_south": "Brazil",
"realms.configuration.region.central_india": "India",
"realms.configuration.region.central_us": "Iowa, USA",
"realms.configuration.region.east_asia": "Hong Kong",
"realms.configuration.region.east_us": "Virginia, USA",
"realms.configuration.region.east_us_2": "North Carolina, USA",
"realms.configuration.region.france_central": "France",
"realms.configuration.region.japan_east": "Eastern Japan",
"realms.configuration.region.japan_west": "Western Japan",
"realms.configuration.region.korea_central": "South Korea",
"realms.configuration.region.north_central_us": "Illinois, USA",
"realms.configuration.region.north_europe": "Ireland",
"realms.configuration.region.south_central_us": "Texas, USA",
"realms.configuration.region.southeast_asia": "Singapore",
"realms.configuration.region.sweden_central": "Sweden",
"realms.configuration.region.uae_north": "United Arab Emirates (UAE)",
"realms.configuration.region.uk_south": "Southern England",
"realms.configuration.region.west_central_us": "Utah, USA",
"realms.configuration.region.west_europe": "Netherlands",
"realms.configuration.region.west_us": "California, USA",
"realms.configuration.region.west_us_2": "Washington, USA",
"soundCategory.ui": "UI",
"stat.minecraft.happy_ghast_one_cm": "Distance by Happy Ghast",
"subtitles.block.dried_ghast.ambient": "Sounds of dryness",
"subtitles.block.dried_ghast.ambient_water": "Dried Ghast rehydrates",
"subtitles.block.dried_ghast.place_in_water": "Dried Ghast soaks",
"subtitles.block.dried_ghast.transition": "Dried Ghast feels better",
"subtitles.entity.ghastling.ambient": "Ghastling coos",
"subtitles.entity.ghastling.death": "Ghastling dies",
"subtitles.entity.ghastling.hurt": "Ghastling hurts",
"subtitles.entity.ghastling.spawn": "Ghastling appears",
"subtitles.entity.happy_ghast.ambient": "Happy Ghast croons",
"subtitles.entity.happy_ghast.death": "Happy Ghast dies",
"subtitles.entity.happy_ghast.equip": "Harness equips",
"subtitles.entity.happy_ghast.harness_goggles_down": "Happy Ghast is ready",
"subtitles.entity.happy_ghast.harness_goggles_up": "Happy Ghast stops",
"subtitles.entity.happy_ghast.hurt": "Happy Ghast hurts",
"subtitles.entity.happy_ghast.unequip": "Harness unequips",
"subtitles.item.horse_armor.unequip": "Horse Armor snips away",
"subtitles.item.lead.break": "Lead snaps",
"subtitles.item.lead.tied": "Lead tied",
"subtitles.item.lead.untied": "Lead untied",
"subtitles.item.llama_carpet.unequip": "Carpet snips away",
"subtitles.item.saddle.unequip": "Saddle snips away",
"subtitles.item.shears.snip": "Shears snip"
},
"1.21.5": {
"argument.nbt.expected.compound": "Expected compound tag",
"argument.resource_selector.not_found": "No matches for selector '%s' of type '%s'",
+3 -3
View File
@@ -1,8 +1,8 @@
projectVersion=5.3.2
projectVersion=5.4.0
# Smile emoji
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
mcVersions=1.21.6, 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.6
velocityVersion=3.4
org.gradle.configureondemand=true
+2 -2
View File
@@ -3,7 +3,7 @@ metadata.format.version = "1.1"
[versions]
# ViaVersion
viaver = "5.3.2-SNAPSHOT"
viaver = "5.4.0"
# Common provided
netty = "4.0.20.Final"
@@ -16,7 +16,7 @@ checkerQual = "3.49.1"
paper = "1.16.5-R0.1-SNAPSHOT"
velocity = "3.1.1"
fabricLoader = "0.11.6"
viaProxy = "3.4.1-SNAPSHOT"
viaProxy = "3.4.2-SNAPSHOT"
[libraries]
Binary file not shown.
+2 -2
View File
@@ -1,7 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionSha256Sum=20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
distributionSha256Sum=845952a9d6afa783db70bb3b0effaae45ae5542ca2bb7929619e8af49cb634cf
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Vendored
+2 -2
View File
@@ -114,7 +114,7 @@ case "$( uname )" in #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
CLASSPATH="\\\"\\\""
# Determine the Java command to use to start the JVM.
@@ -213,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
"$@"
# Stop when "xargs" is not available.
Vendored
+2 -2
View File
@@ -70,11 +70,11 @@ goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
set CLASSPATH=
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
:end
@rem End local scope for the variables with windows NT shell
+2 -2
View File
@@ -1,7 +1,5 @@
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
rootProject.name = "viabackwards-parent"
dependencyResolutionManagement {
repositories {
maven("https://repo.viaversion.com")
@@ -19,6 +17,8 @@ pluginManagement {
}
}
rootProject.name = "viabackwards-parent"
includeBuild("build-logic")
setupViaSubproject("common")