mirror of
https://github.com/ViaVersion/ViaBackwards.git
synced 2026-11-04 08:52:08 -05:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fdfbee3099 | ||
|
|
4e021f23ad | ||
|
|
9bf8a6b447 | ||
|
|
0452ac26f3 | ||
|
|
4938de8a33 | ||
|
|
c3bdf7230c | ||
|
|
104d68c29f | ||
|
|
c7702cc5a3 | ||
|
|
90fb84e012 | ||
|
|
2aec24449e | ||
|
|
cbafc0564e | ||
|
|
e7b588b965 | ||
|
|
d85de3461a | ||
|
|
924179d2af | ||
|
|
465dc5bbef | ||
|
|
71038072ed | ||
|
|
6cdf663490 | ||
|
|
0ba32cf4a5 | ||
|
|
5b1c323274 | ||
|
|
1d954e23ab | ||
|
|
cece459a36 | ||
|
|
d413b4af3a | ||
|
|
ec63e9f808 | ||
|
|
5a84625078 | ||
|
|
a36dfbc799 | ||
|
|
db6fc3d60d | ||
|
|
9a5b384e55 | ||
|
|
f801af36f8 | ||
|
|
883ca8dc01 | ||
|
|
41fbca556e | ||
|
|
32e81d9887 | ||
|
|
906b3afa0b | ||
|
|
ddc776c284 | ||
|
|
c73db36674 | ||
|
|
7bb4a5d69c | ||
|
|
4bb1b681e6 | ||
|
|
53c43db7ad | ||
|
|
3f9073ee68 | ||
|
|
283e40d32d | ||
|
|
53105e644d | ||
|
|
cd4470c7df | ||
|
|
64e049fa0f | ||
|
|
321f708674 | ||
|
|
de7fa4e6a3 | ||
|
|
a3e47e2d66 | ||
|
|
f638e8488d | ||
|
|
91f5a62de0 | ||
|
|
8e09ed3aea | ||
|
|
6c97db3867 | ||
|
|
c0305804a4 | ||
|
|
6518739c21 | ||
|
|
5436cc0062 | ||
|
|
138b2013d6 | ||
|
|
59eb5ccbc8 | ||
|
|
446d878671 | ||
|
|
a0fa6a5e04 | ||
|
|
00cbc4d149 | ||
|
|
336327a25c | ||
|
|
da0c9eebde | ||
|
|
36ca84041d | ||
|
|
631142f3da | ||
|
|
ca18e1e713 | ||
|
|
14958dbdd8 | ||
|
|
7ee2e15325 | ||
|
|
fb90e750d5 | ||
|
|
5533e61c32 | ||
|
|
9105fc4d79 | ||
|
|
86be811cfc | ||
|
|
7025027115 | ||
|
|
6466affb8b | ||
|
|
a0ab595d9b | ||
|
|
4b7b039621 | ||
|
|
9a0c78b25f | ||
|
|
d9c4d1c151 | ||
|
|
f919050171 | ||
|
|
3c3040f22d | ||
|
|
d63f1d1fad | ||
|
|
9265832edf | ||
|
|
5615d0591f | ||
|
|
e7d8703f86 | ||
|
|
441c7f831f | ||
|
|
87fb4c7e25 | ||
|
|
1aa00f4d1b | ||
|
|
4ad05a4470 | ||
|
|
8fb466022a | ||
|
|
799d8945a2 | ||
|
|
4bc4a4c942 | ||
|
|
483c0ec0d6 | ||
|
|
ef665d2f95 | ||
|
|
8fc519b781 | ||
|
|
fba3a6986a |
No files matched your search
@@ -1,4 +1,5 @@
|
||||
version: 2
|
||||
# Disabled for the time being, being done manually instead
|
||||
updates:
|
||||
- package-ecosystem: "github-actions"
|
||||
cooldown:
|
||||
@@ -6,11 +7,11 @@ updates:
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "monthly"
|
||||
open-pull-requests-limit: 10
|
||||
open-pull-requests-limit: 0
|
||||
- package-ecosystem: "gradle"
|
||||
cooldown:
|
||||
default-days: 7
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "monthly"
|
||||
open-pull-requests-limit: 10
|
||||
open-pull-requests-limit: 0
|
||||
@@ -11,16 +11,16 @@ jobs:
|
||||
timeout-minutes: 30
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Set up Gradle
|
||||
uses: gradle/actions/setup-gradle@3f131e8634966bd73d06cc69884922b02e6faf92 # v6.2.0
|
||||
uses: gradle/actions/setup-gradle@v6.4.0
|
||||
with:
|
||||
cache-disabled: false
|
||||
cache-provider: basic
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v5.5.0
|
||||
uses: actions/setup-java@v6.1.0
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
java-version: 17
|
||||
|
||||
@@ -16,16 +16,16 @@ jobs:
|
||||
timeout-minutes: 30
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Set up Gradle
|
||||
uses: gradle/actions/setup-gradle@3f131e8634966bd73d06cc69884922b02e6faf92 # v6.2.0
|
||||
uses: gradle/actions/setup-gradle@v6.4.0
|
||||
with:
|
||||
cache-disabled: false
|
||||
cache-provider: basic
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v5.5.0
|
||||
uses: actions/setup-java@v6.1.0
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
java-version: 17
|
||||
@@ -40,5 +40,5 @@ jobs:
|
||||
- name: Publish to Modrinth
|
||||
env:
|
||||
MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }}
|
||||
run: ./gradlew modrinth --stacktrace
|
||||
run: ./gradlew publishMods --stacktrace
|
||||
continue-on-error: true
|
||||
@@ -34,4 +34,6 @@ bin/
|
||||
# Misc
|
||||
|
||||
run/
|
||||
.claude/
|
||||
!.claude/CLAUDE.md
|
||||
AGENTS.override.md
|
||||
@@ -7,8 +7,7 @@ repositories {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// version must be manually kept in sync with the one in root project settings.gradle.kts
|
||||
implementation("com.gradleup.shadow:shadow-gradle-plugin:9.4.2")
|
||||
implementation("com.gradleup.shadow:shadow-gradle-plugin:9.6.1")
|
||||
|
||||
// A nice no-conflict comment for patching in downgrading
|
||||
}
|
||||
@@ -51,15 +51,6 @@ abstract class GitCommand : ValueSource<String, GitCommand.GitCommandParameters>
|
||||
}
|
||||
|
||||
|
||||
fun Project.parseMinecraftSnapshotVersion(version: String): String? {
|
||||
val separatorIndex = version.indexOf('-')
|
||||
val lastSeparatorIndex = version.lastIndexOf('-')
|
||||
if (separatorIndex == -1 || separatorIndex == lastSeparatorIndex) {
|
||||
return null
|
||||
}
|
||||
return version.substring(separatorIndex + 1, lastSeparatorIndex)
|
||||
}
|
||||
|
||||
fun JavaPluginExtension.javaTarget(version: Int) {
|
||||
toolchain.languageVersion.set(JavaLanguageVersion.of(version))
|
||||
}
|
||||
Whitespace-only changes.
+2
-1
@@ -1,6 +1,7 @@
|
||||
plugins {
|
||||
base
|
||||
id("vb.build-logic")
|
||||
id("vb.base-conventions") apply false
|
||||
id("vb.shadow-conventions") apply false
|
||||
}
|
||||
|
||||
allprojects {
|
||||
|
||||
@@ -27,7 +27,8 @@ java {
|
||||
|
||||
// Task to quickly test/debug code changes using https://github.com/ViaVersion/ViaProxy
|
||||
// For further instructions see the ViaProxy repository README
|
||||
val prepareViaProxyFiles by tasks.registering(Copy::class) {
|
||||
val prepareViaProxyFiles = tasks.register<Copy>("prepareViaProxyFiles") {
|
||||
description = "Prepares the ViaProxy run dir for the runViaProxy task"
|
||||
dependsOn(project.tasks.shadowJar)
|
||||
|
||||
from(project.tasks.shadowJar.map { it.archiveFile.get().asFile })
|
||||
@@ -37,27 +38,29 @@ val prepareViaProxyFiles by tasks.registering(Copy::class) {
|
||||
rename { "${projectName}.jar" }
|
||||
}
|
||||
|
||||
val cleanupViaProxyFiles by tasks.registering(Delete::class) {
|
||||
val cleanupViaProxyFiles = tasks.register<Delete>("cleanupViaProxyFiles") {
|
||||
description = "Deletes ViaProxy logs and the compiled project jar from its jars dir"
|
||||
delete(
|
||||
layout.projectDirectory.file("run/jars/${project.name}.jar"),
|
||||
layout.projectDirectory.dir("run/logs")
|
||||
)
|
||||
}
|
||||
|
||||
val viaProxyConfiguration: Configuration by configurations.creating {
|
||||
val viaProxyConfiguration: Configuration = configurations.create("viaProxyConfiguration") {
|
||||
dependencies.add(rootProject.libs.viaProxy.get().copy().setTransitive(false))
|
||||
}
|
||||
|
||||
tasks.register<JavaExec>("runViaProxy") {
|
||||
description = "Runs ViaProxy locally"
|
||||
dependsOn(prepareViaProxyFiles)
|
||||
finalizedBy(cleanupViaProxyFiles)
|
||||
|
||||
mainClass.set("net.raphimc.viaproxy.ViaProxy")
|
||||
classpath = viaProxyConfiguration
|
||||
workingDir = layout.projectDirectory.dir("run").asFile
|
||||
jvmArgs = listOf("-DskipUpdateCheck")
|
||||
jvmArgs = listOf("-DskipUpdateCheck", "-Dviaproxy.gui.autoStart")
|
||||
|
||||
if (System.getProperty("viaproxy.gui.autoStart") != null) {
|
||||
jvmArgs("-Dviaproxy.gui.autoStart")
|
||||
if (System.getProperty("viaproxy.disableExtraPlatforms") != null) {
|
||||
jvmArgs("-Dviaproxy.enableViaBedrock=false", "-Dviaproxy.enableViaLegacy=false", "-Dviaproxy.enableViaAprilFools=false")
|
||||
}
|
||||
}
|
||||
@@ -70,6 +70,7 @@ import com.viaversion.viabackwards.protocol.v1_9_1to1_9.Protocol1_9_1To1_9;
|
||||
import com.viaversion.viabackwards.protocol.v1_9_3to1_9_1.Protocol1_9_3To1_9_1;
|
||||
import com.viaversion.viabackwards.protocol.v26_1to1_21_11.Protocol26_1To1_21_11;
|
||||
import com.viaversion.viabackwards.protocol.v26_2to26_1.Protocol26_2To26_1;
|
||||
import com.viaversion.viabackwards.protocol.v26_3to26_2.Protocol26_3To26_2;
|
||||
import com.viaversion.viabackwards.utils.VersionInfo;
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
import com.viaversion.viaversion.api.protocol.ProtocolManager;
|
||||
@@ -81,7 +82,7 @@ import java.util.logging.Logger;
|
||||
|
||||
public interface ViaBackwardsPlatform {
|
||||
|
||||
String MINIMUM_VV_VERSION = "5.11.0";
|
||||
String MINIMUM_VV_VERSION = "5.12.2";
|
||||
|
||||
default void init(final File configFile) {
|
||||
init(new ViaBackwardsConfig(configFile, getLogger()));
|
||||
@@ -169,6 +170,7 @@ public interface ViaBackwardsPlatform {
|
||||
|
||||
protocolManager.registerProtocol(new Protocol26_1To1_21_11(), ProtocolVersion.v1_21_11, ProtocolVersion.v26_1);
|
||||
protocolManager.registerProtocol(new Protocol26_2To26_1(), ProtocolVersion.v26_1, ProtocolVersion.v26_2);
|
||||
protocolManager.registerProtocol(new Protocol26_3To26_2(), ProtocolVersion.v26_2, ProtocolVersion.v26_3);
|
||||
}
|
||||
|
||||
default void enable() {
|
||||
|
||||
+1
-1
@@ -79,7 +79,7 @@ public class EntityReplacement {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the custom entity name. Can be either a {@link String,} {@link StringTag} or {@link com.viaversion.viaversion.libs.gson.JsonElement}.
|
||||
* Returns the custom entity name. Can be either a {@link String}, {@link StringTag} or {@link com.viaversion.viaversion.libs.gson.JsonElement}.
|
||||
*
|
||||
* @return custom entity name
|
||||
*/
|
||||
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
|
||||
* Copyright (C) 2016-2026 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.entities.storage;
|
||||
|
||||
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
|
||||
import com.viaversion.viaversion.api.type.Types;
|
||||
|
||||
public class PlayerPosRotStorage extends PlayerPositionStorage {
|
||||
private float yRot; // yaw
|
||||
private float xRot; // pitch
|
||||
|
||||
public float yRot() {
|
||||
return yRot;
|
||||
}
|
||||
|
||||
public void setYRot(final float yRot) {
|
||||
this.yRot = yRot;
|
||||
}
|
||||
|
||||
public float xRot() {
|
||||
return xRot;
|
||||
}
|
||||
|
||||
public void setXRot(final float xRot) {
|
||||
this.xRot = xRot;
|
||||
}
|
||||
|
||||
public void setRotation(final float yRot, final float xRot) {
|
||||
this.yRot = yRot;
|
||||
this.xRot = xRot;
|
||||
}
|
||||
|
||||
public void setRotFromPacket(final PacketWrapper wrapper) {
|
||||
this.yRot = wrapper.passthrough(Types.FLOAT);
|
||||
this.xRot = wrapper.passthrough(Types.FLOAT);
|
||||
}
|
||||
|
||||
public void setPosRotFromPacket(final PacketWrapper wrapper) {
|
||||
this.setPosFromPacket(wrapper);
|
||||
this.setRotFromPacket(wrapper);
|
||||
}
|
||||
}
|
||||
+9
-4
@@ -18,15 +18,14 @@
|
||||
package com.viaversion.viabackwards.api.entities.storage;
|
||||
|
||||
import com.viaversion.viaversion.api.connection.StorableObject;
|
||||
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
|
||||
import com.viaversion.viaversion.api.type.Types;
|
||||
|
||||
public abstract class PlayerPositionStorage implements StorableObject {
|
||||
public class PlayerPositionStorage implements StorableObject {
|
||||
private double x;
|
||||
private double y;
|
||||
private double z;
|
||||
|
||||
protected PlayerPositionStorage() {
|
||||
}
|
||||
|
||||
public double x() {
|
||||
return x;
|
||||
}
|
||||
@@ -57,6 +56,12 @@ public abstract class PlayerPositionStorage implements StorableObject {
|
||||
this.z = z;
|
||||
}
|
||||
|
||||
public void setPosFromPacket(PacketWrapper wrapper) {
|
||||
this.x = wrapper.passthrough(Types.DOUBLE);
|
||||
this.y = wrapper.passthrough(Types.DOUBLE);
|
||||
this.z = wrapper.passthrough(Types.DOUBLE);
|
||||
}
|
||||
|
||||
public void addRelativePosition(double relX, double relY, double relZ) {
|
||||
this.x += relX;
|
||||
this.y += relY;
|
||||
|
||||
+33
-3
@@ -21,6 +21,7 @@ import com.viaversion.nbt.tag.CompoundTag;
|
||||
import com.viaversion.nbt.tag.Tag;
|
||||
import com.viaversion.viabackwards.api.BackwardsProtocol;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.data.FullMappings;
|
||||
import com.viaversion.viaversion.api.minecraft.RegistryEntry;
|
||||
import com.viaversion.viaversion.rewriter.RegistryDataRewriter;
|
||||
import com.viaversion.viaversion.util.Key;
|
||||
@@ -58,7 +59,8 @@ public class BackwardsRegistryRewriter extends RegistryDataRewriter {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateJukeboxSongs(final RegistryEntry[] entries) {
|
||||
public void updateJukeboxSongs(final UserConnection connection, final RegistryEntry[] entries) {
|
||||
super.updateJukeboxSongs(connection, entries);
|
||||
for (final RegistryEntry entry : entries) {
|
||||
if (entry.tag() == null) {
|
||||
continue;
|
||||
@@ -68,6 +70,28 @@ public class BackwardsRegistryRewriter extends RegistryDataRewriter {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean updateBlockState(final Tag blockStateTag) {
|
||||
if (!(blockStateTag instanceof CompoundTag blockState) || blockState.getStringTag("Name") == null) {
|
||||
return super.updateBlockState(blockStateTag);
|
||||
}
|
||||
|
||||
// Up to 26.2, block states use "Name" and "Properties" instead of "id" and "properties"
|
||||
final FullMappings blockMappings = protocol.getMappingData().getFullBlockMappings();
|
||||
if (blockMappings == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
final int blockId = blockMappings.id(blockState.getString("Name"));
|
||||
if (blockId == -1 || protocol.getMappingData().hasBlockChanged(blockId)) {
|
||||
// Replace unknown or changed blocks with a dummy state, else the client will fail to load the registry
|
||||
blockState.putString("Name", "minecraft:dirt");
|
||||
blockState.remove("Properties");
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void updateBiomeEffects(final CompoundTag effects) {
|
||||
updateSound(effects.getCompoundTag("mood_sound"), "sound");
|
||||
updateSound(effects.getCompoundTag("additions_sound"), "sound");
|
||||
@@ -100,10 +124,16 @@ public class BackwardsRegistryRewriter extends RegistryDataRewriter {
|
||||
}
|
||||
|
||||
final String mappedSound = protocol.getMappingData().getMappedNamedSound(sound);
|
||||
if (mappedSound == null) {
|
||||
if (mappedSound != null) {
|
||||
tag.putString(name, mappedSound);
|
||||
} else if (name.equals("sound_id")) {
|
||||
// If it's already an inlined sound
|
||||
tag.putString(name, "minecraft:intentionally_empty");
|
||||
} else {
|
||||
tag.putString(name, mappedSound);
|
||||
// Write as custom sound, so the id doesn't actually need to exist later on
|
||||
final CompoundTag soundEvent = new CompoundTag();
|
||||
soundEvent.putString("sound_id", "minecraft:intentionally_empty");
|
||||
tag.put(name, soundEvent);
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -250,7 +250,7 @@ public abstract class EntityRewriterBase<C extends ClientboundPacketType, T exte
|
||||
|
||||
protected PacketHandler getDimensionHandler(int index) {
|
||||
return wrapper -> {
|
||||
ClientWorld clientWorld = wrapper.user().getClientWorld(this.protocol.getClass());
|
||||
ClientWorld clientWorld = wrapper.user().storables(this.protocol).clientWorld();
|
||||
int dimensionId = wrapper.get(Types.INT, index);
|
||||
if (clientWorld.setEnvironment(dimensionId)) {
|
||||
tracker(wrapper.user()).clearEntities();
|
||||
|
||||
+2
-2
@@ -67,7 +67,7 @@ public abstract class LegacyEntityRewriter<C extends ClientboundPacketType, T ex
|
||||
public void register() {
|
||||
map(Types.INT);
|
||||
handler(wrapper -> {
|
||||
ClientWorld clientWorld = wrapper.user().getClientWorld(protocol.getClass());
|
||||
ClientWorld clientWorld = wrapper.user().storables(protocol).clientWorld();
|
||||
if (clientWorld.setEnvironment(wrapper.get(Types.INT, 0))) {
|
||||
tracker(wrapper.user()).clearEntities();
|
||||
}
|
||||
@@ -84,7 +84,7 @@ public abstract class LegacyEntityRewriter<C extends ClientboundPacketType, T ex
|
||||
map(Types.UNSIGNED_BYTE); // 1 - Gamemode
|
||||
map(Types.INT); // 2 - Dimension
|
||||
handler(wrapper -> {
|
||||
ClientWorld clientWorld = wrapper.user().getClientWorld(protocol.getClass());
|
||||
ClientWorld clientWorld = wrapper.user().storables(protocol).clientWorld();
|
||||
clientWorld.setEnvironment(wrapper.get(Types.INT, 1));
|
||||
|
||||
final int entityId = wrapper.get(Types.INT, 0);
|
||||
|
||||
+6
@@ -33,6 +33,7 @@ import com.viaversion.viaversion.libs.fastutil.ints.Int2IntMap;
|
||||
import com.viaversion.viaversion.libs.fastutil.objects.ObjectIterator;
|
||||
import com.viaversion.viaversion.rewriter.IdRewriteFunction;
|
||||
import com.viaversion.viaversion.util.ComponentUtil;
|
||||
import com.viaversion.viaversion.util.Limit;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
@@ -195,7 +196,12 @@ public class StructuredEnchantmentRewriter {
|
||||
}
|
||||
|
||||
final Enchantments enchantments = new Enchantments(tag.remove(itemRewriter.nbtTagName("show_" + key.identifier())) != null);
|
||||
int i = 0;
|
||||
for (final CompoundTag enchantment : enchantmentsTag) {
|
||||
if (i++ > 255) {
|
||||
break;
|
||||
}
|
||||
|
||||
enchantments.add(enchantment.getInt("id"), enchantment.getInt("lvl"));
|
||||
}
|
||||
data.set(key, enchantments);
|
||||
|
||||
+13
-7
@@ -22,22 +22,19 @@ import com.viaversion.viabackwards.api.data.BackwardsMappingData;
|
||||
import com.viaversion.viabackwards.api.rewriters.BackwardsRegistryRewriter;
|
||||
import com.viaversion.viabackwards.api.rewriters.text.NBTComponentRewriter;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_11;
|
||||
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.chunk.ChunkType26_1;
|
||||
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_21_11to26_1.Protocol1_21_11To26_1;
|
||||
import com.viaversion.viaversion.protocols.v1_21_11to26_1.packet.ClientboundPacket26_1;
|
||||
import com.viaversion.viaversion.protocols.v1_21_11to26_1.packet.ClientboundPackets26_1;
|
||||
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.ServerboundPackets1_21_6;
|
||||
import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ClientboundConfigurationPackets1_21_9;
|
||||
import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ServerboundConfigurationPackets1_21_9;
|
||||
import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ServerboundPacket1_21_9;
|
||||
import com.viaversion.viaversion.protocols.v26_2to26_3.rewriter.RecipeDisplayRewriter26_3;
|
||||
import com.viaversion.viaversion.rewriter.BlockRewriter;
|
||||
import com.viaversion.viaversion.rewriter.ParticleRewriter;
|
||||
import com.viaversion.viaversion.rewriter.RecipeDisplayRewriter;
|
||||
@@ -66,7 +63,7 @@ final class Protocol99_1To98_1 extends BackwardsProtocol<ClientboundPacket26_1,
|
||||
private final TagRewriter<ClientboundPacket26_1> tagRewriter = new TagRewriter<>(this);
|
||||
private final BackwardsRegistryRewriter registryDataRewriter = new BackwardsRegistryRewriter(this);
|
||||
private final BlockRewriter<ClientboundPacket26_1> blockRewriter = new BlockRewriter1_21_5<>(this, ChunkType26_1::new);
|
||||
private final RecipeDisplayRewriter<ClientboundPacket26_1> recipeRewriter = new RecipeDisplayRewriter1_21_5<>(this);
|
||||
private final RecipeDisplayRewriter<ClientboundPacket26_1> recipeRewriter = new RecipeDisplayRewriter26_3<>(this);
|
||||
|
||||
public Protocol99_1To98_1() {
|
||||
super(ClientboundPacket26_1.class, ClientboundPacket26_1.class, ServerboundPacket1_21_9.class, ServerboundPacket1_21_9.class);
|
||||
@@ -75,14 +72,23 @@ final class Protocol99_1To98_1 extends BackwardsProtocol<ClientboundPacket26_1,
|
||||
@Override
|
||||
protected void registerPackets() {
|
||||
super.registerPackets();
|
||||
|
||||
// Remove newly synchronized registries to prevent errors on older clients
|
||||
//registryDataRewriter.remove("worldgen/block_state_provider");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(final UserConnection connection) {
|
||||
addEntityTracker(connection, new EntityTrackerBase(connection, EntityTypes1_21_11.PLAYER));
|
||||
connection.addItemHasher(this.getClass(), new ItemHasherBase(this, connection));
|
||||
addEntityTracker(connection);
|
||||
addItemHasher(connection);
|
||||
}
|
||||
|
||||
// If data beyond the tracker and hasher is required
|
||||
//@Override
|
||||
//public ProtocolStorablesBase createStorables() {
|
||||
// return new ProtocolStorables99_1();
|
||||
//}
|
||||
|
||||
@Override
|
||||
public BackwardsMappingData getMappingData() {
|
||||
return MAPPINGS;
|
||||
|
||||
+2
-2
@@ -98,8 +98,8 @@ public class Protocol1_10To1_9_3 extends BackwardsProtocol<ClientboundPackets1_9
|
||||
|
||||
@Override
|
||||
public void init(UserConnection user) {
|
||||
user.addEntityTracker(this.getClass(), new EntityTrackerBase(user, EntityTypes1_10.EntityType.PLAYER));
|
||||
user.addClientWorld(this.getClass(), new ClientWorld());
|
||||
addEntityTracker(user, new EntityTrackerBase(user, EntityTypes1_10.EntityType.PLAYER));
|
||||
user.storables(this).setClientWorld(new ClientWorld());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
-1
@@ -50,7 +50,7 @@ public class BlockItemPacketRewriter1_10 extends LegacyBlockItemRewriter<Clientb
|
||||
registerSetCreativeModeSlot(ServerboundPackets1_9_3.SET_CREATIVE_MODE_SLOT);
|
||||
|
||||
protocol.registerClientbound(ClientboundPackets1_9_3.LEVEL_CHUNK, wrapper -> {
|
||||
ClientWorld clientWorld = wrapper.user().getClientWorld(Protocol1_10To1_9_3.class);
|
||||
ClientWorld clientWorld = wrapper.user().storables(protocol).clientWorld();
|
||||
|
||||
ChunkType1_9_3 type = ChunkType1_9_3.forEnvironment(clientWorld.getEnvironment());
|
||||
Chunk chunk = wrapper.passthrough(type);
|
||||
|
||||
+2
-2
@@ -39,8 +39,8 @@ public class Protocol1_11_1To1_11 extends BackwardsProtocol<ClientboundPackets1_
|
||||
|
||||
@Override
|
||||
public void init(UserConnection user) {
|
||||
user.addEntityTracker(this.getClass(), new EntityTrackerBase(user, EntityTypes1_11.EntityType.PLAYER));
|
||||
user.addClientWorld(this.getClass(), new ClientWorld());
|
||||
addEntityTracker(user, new EntityTrackerBase(user, EntityTypes1_11.EntityType.PLAYER));
|
||||
user.storables(this).setClientWorld(new ClientWorld());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+2
-2
@@ -56,8 +56,8 @@ public class Protocol1_11To1_10 extends BackwardsProtocol<ClientboundPackets1_9_
|
||||
|
||||
@Override
|
||||
public void init(UserConnection user) {
|
||||
user.addEntityTracker(this.getClass(), new EntityTrackerBase(user, EntityTypes1_11.EntityType.PLAYER));
|
||||
user.addClientWorld(this.getClass(), new ClientWorld());
|
||||
addEntityTracker(user, new EntityTrackerBase(user, EntityTypes1_11.EntityType.PLAYER));
|
||||
user.storables(this).setClientWorld(new ClientWorld());
|
||||
|
||||
if (!user.has(WindowTracker.class)) {
|
||||
user.put(new WindowTracker());
|
||||
|
||||
+28
-16
@@ -22,27 +22,39 @@ import com.viaversion.viaversion.libs.fastutil.ints.Int2IntOpenHashMap;
|
||||
|
||||
public class SplashPotionMappings1_10 {
|
||||
|
||||
private static final Int2IntMap DATA = new Int2IntOpenHashMap(14, 0.99F);
|
||||
private static final Int2IntMap DATA = new Int2IntOpenHashMap(26, 0.99F);
|
||||
|
||||
static {
|
||||
DATA.defaultReturnValue(-1);
|
||||
DATA.put(2039713, 5); // night vision
|
||||
DATA.put(8356754, 7); // invisibility
|
||||
DATA.put(2293580, 9); // jump boost
|
||||
DATA.put(14981690, 12); // fire resistance
|
||||
DATA.put(8171462, 14); // swiftness
|
||||
DATA.put(5926017, 17); // slowness
|
||||
DATA.put(3035801, 19); // water breathing
|
||||
DATA.put(16262179, 21); // instant health
|
||||
DATA.put(4393481, 23); // instant damage
|
||||
DATA.put(5149489, 25); // poison
|
||||
DATA.put(13458603, 28); // regeneration
|
||||
DATA.put(9643043, 31); // strength
|
||||
DATA.put(4738376, 34); // weakness
|
||||
DATA.put(3381504, 36); // luck
|
||||
DATA.put(0x1F1FA1, 5); // night vision
|
||||
DATA.put(0xC2FF66, 5); // night vision 1.19.4
|
||||
DATA.put(0x7F8392, 7); // invisibility
|
||||
DATA.put(0xF6F6F6, 7); // invisibility 1.19.4
|
||||
DATA.put(0x22FF4C, 9); // jump boost
|
||||
DATA.put(0xFDFF84, 9); // jump boost 1.19.4
|
||||
DATA.put(0xE49A3A, 12); // fire resistance
|
||||
DATA.put(0xFF9900, 12); // fire resistance 1.19.4
|
||||
DATA.put(0x7CAFC6, 14); // swiftness
|
||||
DATA.put(0x33EBFF, 14); // swiftness 1.19.4
|
||||
DATA.put(0x5A6C81, 17); // slowness
|
||||
DATA.put(0x8BAFE0, 17); // slowness 1.19.4
|
||||
DATA.put(0x2E5299, 19); // water breathing
|
||||
DATA.put(0x98DAC0, 19); // water breathing 1.19.4
|
||||
DATA.put(0xF82423, 21); // instant health
|
||||
DATA.put(0x430A09, 23); // instant damage
|
||||
DATA.put(0xA9656A, 23); // instant damage 1.19.4
|
||||
DATA.put(0x4E9331, 25); // poison
|
||||
DATA.put(0x87A363, 25); // poison 1.19.4
|
||||
DATA.put(0xCD5CAB, 28); // regeneration
|
||||
DATA.put(0x932423, 31); // strength
|
||||
DATA.put(0xFFC700, 31); // strength 1.19.4
|
||||
DATA.put(0x484D48, 34); // weakness
|
||||
DATA.put(0x339900, 36); // luck
|
||||
DATA.put(0x59C106, 36); // luck 1.19.4
|
||||
}
|
||||
|
||||
public static int getOldData(int data) {
|
||||
return DATA.get(data);
|
||||
// newer servers send as ARGB
|
||||
return DATA.get(data & 0xFFFFFF);
|
||||
}
|
||||
}
|
||||
+4
-5
@@ -40,7 +40,6 @@ import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_9_3;
|
||||
import com.viaversion.viaversion.protocols.v1_10to1_11.data.EntityMappings1_11;
|
||||
import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ClientboundPackets1_9_3;
|
||||
import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ServerboundPackets1_9_3;
|
||||
import com.viaversion.viaversion.util.IdAndData;
|
||||
import java.util.Arrays;
|
||||
import java.util.Optional;
|
||||
|
||||
@@ -147,7 +146,7 @@ public class BlockItemPacketRewriter1_11 extends LegacyBlockItemRewriter<Clientb
|
||||
registerSetCreativeModeSlot(ServerboundPackets1_9_3.SET_CREATIVE_MODE_SLOT);
|
||||
|
||||
protocol.registerClientbound(ClientboundPackets1_9_3.LEVEL_CHUNK, wrapper -> {
|
||||
ClientWorld clientWorld = wrapper.user().getClientWorld(Protocol1_11To1_10.class);
|
||||
ClientWorld clientWorld = wrapper.user().storables(protocol).clientWorld();
|
||||
|
||||
ChunkType1_9_3 type = ChunkType1_9_3.forEnvironment(clientWorld.getEnvironment()); // Use the 1.10 Chunk type since nothing changed.
|
||||
Chunk chunk = wrapper.passthrough(type);
|
||||
@@ -252,7 +251,7 @@ public class BlockItemPacketRewriter1_11 extends LegacyBlockItemRewriter<Clientb
|
||||
@Override
|
||||
protected void registerRewrites() {
|
||||
// Handle spawner block entity (map to itself with custom handler)
|
||||
MappedLegacyBlockItem data = itemReplacements.computeIfAbsent(IdAndData.toRawData(52), s -> new MappedLegacyBlockItem(52));
|
||||
MappedLegacyBlockItem data = blockReplacements.computeIfAbsent(compress(52, -1), s -> new MappedLegacyBlockItem(52, (short) -1, null, MappedLegacyBlockItem.Type.BLOCK));
|
||||
data.setBlockEntityHandler((b, tag) -> EntityMappings1_11.toClientSpawner(tag, true));
|
||||
|
||||
enchantmentRewriter = new LegacyEnchantmentRewriter(nbtTagName());
|
||||
@@ -295,7 +294,7 @@ public class BlockItemPacketRewriter1_11 extends LegacyBlockItemRewriter<Clientb
|
||||
private boolean isLlama(UserConnection user) {
|
||||
WindowTracker tracker = user.get(WindowTracker.class);
|
||||
if (tracker.getInventory() != null && tracker.getInventory().equals("EntityHorse")) {
|
||||
EntityTracker entTracker = user.getEntityTracker(Protocol1_11To1_10.class);
|
||||
EntityTracker entTracker = user.getEntityTracker(protocol);
|
||||
TrackedEntity entityData = entTracker.entity(tracker.getEntityId());
|
||||
return entityData != null && entityData.entityType().is(EntityTypes1_11.EntityType.LLAMA);
|
||||
}
|
||||
@@ -305,7 +304,7 @@ public class BlockItemPacketRewriter1_11 extends LegacyBlockItemRewriter<Clientb
|
||||
private Optional<ChestedHorseStorage> getChestedHorse(UserConnection user) {
|
||||
WindowTracker tracker = user.get(WindowTracker.class);
|
||||
if (tracker.getInventory() != null && tracker.getInventory().equals("EntityHorse")) {
|
||||
EntityTracker entTracker = user.getEntityTracker(Protocol1_11To1_10.class);
|
||||
EntityTracker entTracker = user.getEntityTracker(protocol);
|
||||
TrackedEntity entityData = entTracker.entity(tracker.getEntityId());
|
||||
if (entityData != null)
|
||||
return Optional.of(entityData.get(ChestedHorseStorage.class));
|
||||
|
||||
+2
-2
@@ -71,8 +71,8 @@ public class Protocol1_12To1_11_1 extends BackwardsProtocol<ClientboundPackets1_
|
||||
|
||||
@Override
|
||||
public void init(UserConnection user) {
|
||||
user.addEntityTracker(this.getClass(), new EntityTrackerBase(user, EntityTypes1_12.EntityType.PLAYER));
|
||||
user.addClientWorld(this.getClass(), new ClientWorld());
|
||||
addEntityTracker(user, new EntityTrackerBase(user, EntityTypes1_12.EntityType.PLAYER));
|
||||
user.storables(this).setClientWorld(new ClientWorld());
|
||||
|
||||
user.put(new ShoulderTracker(user));
|
||||
}
|
||||
|
||||
+55
-7
@@ -18,8 +18,10 @@
|
||||
|
||||
package com.viaversion.viabackwards.protocol.v1_12to1_11_1.rewriter;
|
||||
|
||||
import com.google.common.primitives.Ints;
|
||||
import com.viaversion.nbt.tag.CompoundTag;
|
||||
import com.viaversion.nbt.tag.IntArrayTag;
|
||||
import com.viaversion.nbt.tag.ListTag;
|
||||
import com.viaversion.nbt.tag.LongArrayTag;
|
||||
import com.viaversion.nbt.tag.StringTag;
|
||||
import com.viaversion.nbt.tag.Tag;
|
||||
@@ -131,7 +133,7 @@ public class BlockItemPacketRewriter1_12 extends LegacyBlockItemRewriter<Clientb
|
||||
registerSetCreativeModeSlot(ServerboundPackets1_9_3.SET_CREATIVE_MODE_SLOT);
|
||||
|
||||
protocol.registerClientbound(ClientboundPackets1_12.LEVEL_CHUNK, wrapper -> {
|
||||
ClientWorld clientWorld = wrapper.user().getClientWorld(Protocol1_12To1_11_1.class);
|
||||
ClientWorld clientWorld = wrapper.user().storables(protocol).clientWorld();
|
||||
|
||||
ChunkType1_9_3 type = ChunkType1_9_3.forEnvironment(clientWorld.getEnvironment()); // Use the 1.9.4 Chunk type since nothing changed.
|
||||
Chunk chunk = wrapper.passthrough(type);
|
||||
@@ -230,6 +232,30 @@ public class BlockItemPacketRewriter1_12 extends LegacyBlockItemRewriter<Clientb
|
||||
backupTag.put(entry.getKey(), fromLongArrayTag(tag));
|
||||
iterator.remove();
|
||||
hasLongArrayTag = true;
|
||||
} else if (entry.getValue() instanceof ListTag<?> tag) {
|
||||
if (tag.getElementType() == LongArrayTag.class) {
|
||||
// Lists can't hold mixed tag types, so the whole list has to be removed
|
||||
ListTag<IntArrayTag> intArrays = new ListTag<>(IntArrayTag.class);
|
||||
for (Tag longArrayTag : tag) {
|
||||
intArrays.add(fromLongArrayTag((LongArrayTag) longArrayTag));
|
||||
}
|
||||
backupTag.put(entry.getKey(), intArrays);
|
||||
iterator.remove();
|
||||
hasLongArrayTag = true;
|
||||
} else if (tag.getElementType() == CompoundTag.class) {
|
||||
// Backed up by list index
|
||||
CompoundTag listBackupTag = new CompoundTag();
|
||||
for (int i = 0; i < tag.size(); i++) {
|
||||
CompoundTag nestedBackupTag = new CompoundTag();
|
||||
if (handleNbtToClient((CompoundTag) tag.get(i), nestedBackupTag)) {
|
||||
listBackupTag.put(Integer.toString(i), nestedBackupTag);
|
||||
}
|
||||
}
|
||||
if (!listBackupTag.isEmpty()) {
|
||||
backupTag.put(entry.getKey(), listBackupTag);
|
||||
hasLongArrayTag = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return hasLongArrayTag;
|
||||
@@ -252,11 +278,33 @@ public class BlockItemPacketRewriter1_12 extends LegacyBlockItemRewriter<Clientb
|
||||
private void handleNbtToServer(CompoundTag compoundTag, CompoundTag backupTag) {
|
||||
// Restore the removed long array tags
|
||||
for (Map.Entry<String, Tag> entry : backupTag) {
|
||||
if (entry.getValue() instanceof CompoundTag) {
|
||||
CompoundTag nestedTag = compoundTag.getCompoundTag(entry.getKey());
|
||||
handleNbtToServer(nestedTag, (CompoundTag) entry.getValue());
|
||||
} else {
|
||||
compoundTag.put(entry.getKey(), fromIntArrayTag((IntArrayTag) entry.getValue()));
|
||||
if (entry.getValue() instanceof CompoundTag nestedBackupTag) {
|
||||
Tag tag = compoundTag.get(entry.getKey());
|
||||
if (tag instanceof CompoundTag nestedTag) {
|
||||
handleNbtToServer(nestedTag, nestedBackupTag);
|
||||
} else if (tag instanceof ListTag<?> listTag) {
|
||||
handleListToServer(listTag, nestedBackupTag);
|
||||
}
|
||||
} else if (entry.getValue() instanceof IntArrayTag intArrayTag) {
|
||||
compoundTag.put(entry.getKey(), fromIntArrayTag(intArrayTag));
|
||||
} else if (entry.getValue() instanceof ListTag<?> intArrays) {
|
||||
ListTag<LongArrayTag> longArrays = new ListTag<>(LongArrayTag.class);
|
||||
for (Tag intArrayTag : intArrays) {
|
||||
if (intArrayTag instanceof IntArrayTag) {
|
||||
longArrays.add(fromIntArrayTag((IntArrayTag) intArrayTag));
|
||||
}
|
||||
}
|
||||
compoundTag.put(entry.getKey(), longArrays);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void handleListToServer(ListTag<?> listTag, CompoundTag backupTag) {
|
||||
for (Map.Entry<String, Tag> entry : backupTag) {
|
||||
Integer index = Ints.tryParse(entry.getKey());
|
||||
if (index != null && index >= 0 && index < listTag.size()
|
||||
&& listTag.get(index) instanceof CompoundTag nestedTag && entry.getValue() instanceof CompoundTag nestedBackupTag) {
|
||||
handleNbtToServer(nestedTag, nestedBackupTag);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -275,7 +323,7 @@ public class BlockItemPacketRewriter1_12 extends LegacyBlockItemRewriter<Clientb
|
||||
private LongArrayTag fromIntArrayTag(IntArrayTag tag) {
|
||||
long[] longArray = new long[tag.length() / 2];
|
||||
int[] intArray = tag.getValue();
|
||||
for (int i = 0, j = 0; i < intArray.length; i += 2, j++) {
|
||||
for (int i = 0, j = 0; j < longArray.length; i += 2, j++) {
|
||||
longArray[j] = (long) intArray[i] << 32 | ((long) intArray[i + 1] & 0xFFFFFFFFL);
|
||||
}
|
||||
return new LongArrayTag(longArray);
|
||||
|
||||
+2
-2
@@ -159,8 +159,8 @@ public class Protocol1_13_1To1_13 extends BackwardsProtocol<ClientboundPackets1_
|
||||
|
||||
@Override
|
||||
public void init(UserConnection user) {
|
||||
user.addEntityTracker(getClass(), new EntityTrackerBase(user, EntityTypes1_13.EntityType.PLAYER));
|
||||
user.addClientWorld(getClass(), new ClientWorld());
|
||||
user.storables(this).setEntityTracker(new EntityTrackerBase(user, EntityTypes1_13.EntityType.PLAYER));
|
||||
user.storables(this).setClientWorld(new ClientWorld());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
-1
@@ -34,7 +34,7 @@ public class WorldPacketRewriter1_13_1 {
|
||||
BlockRewriter<ClientboundPackets1_13> blockRewriter = BlockRewriter.legacy(protocol);
|
||||
|
||||
protocol.registerClientbound(ClientboundPackets1_13.LEVEL_CHUNK, wrapper -> {
|
||||
ClientWorld clientWorld = wrapper.user().getClientWorld(Protocol1_13_1To1_13.class);
|
||||
ClientWorld clientWorld = wrapper.user().storables(protocol).clientWorld();
|
||||
Chunk chunk = wrapper.passthrough(ChunkType1_13.forEnvironment(clientWorld.getEnvironment()));
|
||||
|
||||
blockRewriter.handleChunk(chunk);
|
||||
|
||||
+11
-12
@@ -28,10 +28,8 @@ import com.viaversion.viabackwards.protocol.v1_13to1_12_2.rewriter.BlockItemPack
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.rewriter.EntityPacketRewriter1_13;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.rewriter.PlayerPacketRewriter1_13;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.rewriter.SoundPacketRewriter1_13;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.storage.BackwardsBlockStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.storage.NoteBlockStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.storage.PlayerPositionStorage1_13;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.storage.TabCompleteStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.storage.ProtocolStorables1_13;
|
||||
import com.viaversion.viabackwards.utils.BackwardsProtocolLogger;
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
@@ -86,7 +84,7 @@ public class Protocol1_13To1_12_2 extends BackwardsProtocol<ClientboundPackets1_
|
||||
super.registerPackets();
|
||||
|
||||
PaintingNames1_13.init();
|
||||
Via.getManager().getProviders().register(BackwardsBlockEntityProvider.class, new BackwardsBlockEntityProvider());
|
||||
Via.getManager().getProviders().register(BackwardsBlockEntityProvider.class, new BackwardsBlockEntityProvider(this));
|
||||
|
||||
translatableRewriter.registerLoginDisconnect();
|
||||
translatableRewriter.registerBossEvent(ClientboundPackets1_13.BOSS_EVENT);
|
||||
@@ -113,17 +111,18 @@ public class Protocol1_13To1_12_2 extends BackwardsProtocol<ClientboundPackets1_
|
||||
|
||||
@Override
|
||||
public void init(UserConnection user) {
|
||||
user.addEntityTracker(this.getClass(), new EntityTrackerBase(user, EntityTypes1_13.EntityType.PLAYER));
|
||||
user.addClientWorld(this.getClass(), new ClientWorld());
|
||||
addEntityTracker(user, new EntityTrackerBase(user, EntityTypes1_13.EntityType.PLAYER));
|
||||
final ProtocolStorables1_13 storables = user.storables(this);
|
||||
storables.setClientWorld(new ClientWorld());
|
||||
|
||||
user.put(new BackwardsBlockStorage());
|
||||
user.put(new TabCompleteStorage());
|
||||
|
||||
if (ViaBackwards.getConfig().isFix1_13FacePlayer() && !user.has(PlayerPositionStorage1_13.class)) {
|
||||
user.put(new PlayerPositionStorage1_13());
|
||||
if (ViaBackwards.getConfig().isFix1_13FacePlayer()) {
|
||||
storables.setPlayerPositionStorage(new PlayerPositionStorage1_13());
|
||||
}
|
||||
}
|
||||
|
||||
user.put(new NoteBlockStorage());
|
||||
@Override
|
||||
public ProtocolStorables1_13 createStorables() {
|
||||
return new ProtocolStorables1_13();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
-1
@@ -57,6 +57,6 @@ public class PaintingNames1_13 {
|
||||
}
|
||||
|
||||
public static String getStringId(int id) {
|
||||
return PAINTINGS.getOrDefault(id, "kebab");
|
||||
return PAINTINGS.getOrDefault(id, "Kebab");
|
||||
}
|
||||
}
|
||||
+5
@@ -76,6 +76,11 @@ public class ParticleIdMappings1_12_2 {
|
||||
float b = wrapper.read(Types.FLOAT);
|
||||
float scale = wrapper.read(Types.FLOAT);
|
||||
|
||||
if (r == 0.0) {
|
||||
// In 1.12.2 and below, a zero x offset becomes r = 1.0
|
||||
r = Float.MIN_NORMAL;
|
||||
}
|
||||
|
||||
wrapper.set(Types.FLOAT, 3, r); // 5 - Offset X index=3
|
||||
wrapper.set(Types.FLOAT, 4, g); // 6 - Offset Y index=4
|
||||
wrapper.set(Types.FLOAT, 5, b); // 7 - Offset Z index=5
|
||||
|
||||
+6
-2
@@ -20,6 +20,7 @@ package com.viaversion.viabackwards.protocol.v1_13to1_12_2.provider;
|
||||
|
||||
import com.viaversion.nbt.tag.CompoundTag;
|
||||
import com.viaversion.nbt.tag.StringTag;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.Protocol1_13To1_12_2;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.block_entity_handlers.BannerHandler;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.block_entity_handlers.BedHandler;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.block_entity_handlers.FlowerPotHandler;
|
||||
@@ -27,6 +28,7 @@ import com.viaversion.viabackwards.protocol.v1_13to1_12_2.block_entity_handlers.
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.block_entity_handlers.SkullHandler;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.block_entity_handlers.SpawnerHandler;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.storage.BackwardsBlockStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.storage.ProtocolStorables1_13;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.minecraft.BlockPosition;
|
||||
import com.viaversion.viaversion.api.platform.providers.Provider;
|
||||
@@ -36,8 +38,10 @@ import java.util.Map;
|
||||
|
||||
public class BackwardsBlockEntityProvider implements Provider {
|
||||
private final Map<String, BackwardsBlockEntityProvider.BackwardsBlockEntityHandler> handlers = new HashMap<>();
|
||||
private final Protocol1_13To1_12_2 protocol;
|
||||
|
||||
public BackwardsBlockEntityProvider() {
|
||||
public BackwardsBlockEntityProvider(final Protocol1_13To1_12_2 protocol) {
|
||||
this.protocol = protocol;
|
||||
handlers.put("flower_pot", new FlowerPotHandler()); // TODO requires special treatment, manually send
|
||||
handlers.put("bed", new BedHandler());
|
||||
handlers.put("banner", new BannerHandler());
|
||||
@@ -75,7 +79,7 @@ public class BackwardsBlockEntityProvider implements Provider {
|
||||
return tag;
|
||||
}
|
||||
|
||||
BackwardsBlockStorage storage = user.get(BackwardsBlockStorage.class);
|
||||
BackwardsBlockStorage storage = user.<ProtocolStorables1_13>storables(protocol).backwardsBlockStorage();
|
||||
Integer blockId = storage.get(position);
|
||||
if (blockId == null) {
|
||||
return tag;
|
||||
|
||||
+22
-10
@@ -34,6 +34,7 @@ import com.viaversion.viabackwards.protocol.v1_13to1_12_2.block_entity_handlers.
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.provider.BackwardsBlockEntityProvider;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.storage.BackwardsBlockStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.storage.NoteBlockStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.storage.ProtocolStorables1_13;
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.minecraft.BlockChangeRecord;
|
||||
@@ -140,7 +141,8 @@ public class BlockItemPacketRewriter1_13 extends BackwardsItemRewriter<Clientbou
|
||||
blockId = blockId - 483 + 219;
|
||||
|
||||
if (blockId == 25) { // Note block
|
||||
final NoteBlockStorage noteBlockStorage = wrapper.user().get(NoteBlockStorage.class);
|
||||
ProtocolStorables1_13 storables = wrapper.user().storables(protocol);
|
||||
final NoteBlockStorage noteBlockStorage = storables.noteBlockStorage();
|
||||
|
||||
final BlockPosition position = wrapper.get(Types.BLOCK_POSITION1_8, 0);
|
||||
final Pair<Integer, Integer> update = noteBlockStorage.getNoteBlockUpdate(position);
|
||||
@@ -185,7 +187,8 @@ public class BlockItemPacketRewriter1_13 extends BackwardsItemRewriter<Clientbou
|
||||
int chunkMinZ = wrapper.passthrough(Types.INT) << 4;
|
||||
int chunkMaxX = chunkMinX + 15;
|
||||
int chunkMaxZ = chunkMinZ + 15;
|
||||
BackwardsBlockStorage blockStorage = wrapper.user().get(BackwardsBlockStorage.class);
|
||||
ProtocolStorables1_13 storables = wrapper.user().storables(protocol);
|
||||
BackwardsBlockStorage blockStorage = storables.backwardsBlockStorage();
|
||||
blockStorage.getBlocks().entrySet().removeIf(entry -> {
|
||||
BlockPosition position = entry.getKey();
|
||||
return position.x() >= chunkMinX && position.z() >= chunkMinZ
|
||||
@@ -202,14 +205,15 @@ public class BlockItemPacketRewriter1_13 extends BackwardsItemRewriter<Clientbou
|
||||
handler(wrapper -> {
|
||||
int blockState = wrapper.read(Types.VAR_INT);
|
||||
BlockPosition position = wrapper.get(Types.BLOCK_POSITION1_8, 0);
|
||||
ProtocolStorables1_13 storables = wrapper.user().storables(protocol);
|
||||
|
||||
// Note block special treatment
|
||||
if (blockState >= 249 && blockState <= 748) { // Note block states id range
|
||||
wrapper.user().get(NoteBlockStorage.class).storeNoteBlockUpdate(position, blockState);
|
||||
storables.noteBlockStorage().storeNoteBlockUpdate(position, blockState);
|
||||
}
|
||||
|
||||
// Store blocks
|
||||
BackwardsBlockStorage storage = wrapper.user().get(BackwardsBlockStorage.class);
|
||||
BackwardsBlockStorage storage = storables.backwardsBlockStorage();
|
||||
storage.checkAndStore(position, blockState);
|
||||
|
||||
wrapper.write(Types.VAR_INT, protocol.getMappingData().getNewBlockStateId(blockState));
|
||||
@@ -228,7 +232,8 @@ public class BlockItemPacketRewriter1_13 extends BackwardsItemRewriter<Clientbou
|
||||
map(Types.INT); // 1 - Chunk Z
|
||||
map(Types.BLOCK_CHANGE_ARRAY);
|
||||
handler(wrapper -> {
|
||||
BackwardsBlockStorage storage = wrapper.user().get(BackwardsBlockStorage.class);
|
||||
ProtocolStorables1_13 storables = wrapper.user().storables(protocol);
|
||||
BackwardsBlockStorage storage = storables.backwardsBlockStorage();
|
||||
|
||||
for (BlockChangeRecord record : wrapper.get(Types.BLOCK_CHANGE_ARRAY, 0)) {
|
||||
int chunkX = wrapper.get(Types.INT, 0);
|
||||
@@ -253,7 +258,8 @@ public class BlockItemPacketRewriter1_13 extends BackwardsItemRewriter<Clientbou
|
||||
});
|
||||
|
||||
protocol.registerClientbound(ClientboundPackets1_13.LEVEL_CHUNK, wrapper -> {
|
||||
ClientWorld clientWorld = wrapper.user().getClientWorld(Protocol1_13To1_12_2.class);
|
||||
ProtocolStorables1_13 storables = wrapper.user().storables(protocol);
|
||||
ClientWorld clientWorld = storables.clientWorld();
|
||||
|
||||
ChunkType1_9_3 type_old = ChunkType1_9_3.forEnvironment(clientWorld.getEnvironment());
|
||||
ChunkType1_13 type = ChunkType1_13.forEnvironment(clientWorld.getEnvironment());
|
||||
@@ -261,7 +267,7 @@ public class BlockItemPacketRewriter1_13 extends BackwardsItemRewriter<Clientbou
|
||||
|
||||
// Handle Block Entities before block rewrite
|
||||
BackwardsBlockEntityProvider provider = Via.getManager().getProviders().get(BackwardsBlockEntityProvider.class);
|
||||
BackwardsBlockStorage storage = wrapper.user().get(BackwardsBlockStorage.class);
|
||||
BackwardsBlockStorage storage = storables.backwardsBlockStorage();
|
||||
for (CompoundTag tag : chunk.getBlockEntities()) {
|
||||
StringTag idTag = tag.getStringTag("id");
|
||||
if (idTag == null) continue;
|
||||
@@ -457,8 +463,12 @@ public class BlockItemPacketRewriter1_13 extends BackwardsItemRewriter<Clientbou
|
||||
|
||||
if (item.identifier() == 358) { // map
|
||||
Tag mapTag = tag.remove("map");
|
||||
if (!gotRawIdFromTag && mapTag instanceof NumberTag) {
|
||||
item.setData(((NumberTag) mapTag).asShort());
|
||||
if (!gotRawIdFromTag && mapTag instanceof NumberTag numberTag) {
|
||||
item.setData((short) (numberTag.asInt() & 0x7FFF));
|
||||
// Keep original ID if conversion is lossy
|
||||
if (numberTag.asInt() > Short.MAX_VALUE) {
|
||||
tag.put("map", numberTag);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -661,7 +671,9 @@ public class BlockItemPacketRewriter1_13 extends BackwardsItemRewriter<Clientbou
|
||||
}
|
||||
if (item.identifier() == 358) { // map
|
||||
if (tag == null) item.setTag(tag = new CompoundTag());
|
||||
tag.putInt("map", item.data());
|
||||
if (!tag.contains("map")) {
|
||||
tag.putInt("map", item.data());
|
||||
}
|
||||
}
|
||||
|
||||
// NBT Changes
|
||||
|
||||
+20
-11
@@ -24,9 +24,8 @@ import com.viaversion.viabackwards.protocol.v1_13to1_12_2.Protocol1_13To1_12_2;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.data.EntityIdMappings1_12_2;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.data.PaintingNames1_13;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.data.ParticleIdMappings1_12_2;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.storage.BackwardsBlockStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.storage.NoteBlockStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.storage.PlayerPositionStorage1_13;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.storage.ProtocolStorables1_13;
|
||||
import com.viaversion.viaversion.api.minecraft.ClientWorld;
|
||||
import com.viaversion.viaversion.api.minecraft.Particle;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
|
||||
@@ -64,7 +63,8 @@ public class EntityPacketRewriter1_13 extends LegacyEntityRewriter<ClientboundPa
|
||||
handler(wrapper -> {
|
||||
if (!ViaBackwards.getConfig().isFix1_13FacePlayer()) return;
|
||||
|
||||
PlayerPositionStorage1_13 playerStorage = wrapper.user().get(PlayerPositionStorage1_13.class);
|
||||
ProtocolStorables1_13 storables = wrapper.user().storables(protocol);
|
||||
PlayerPositionStorage1_13 playerStorage = storables.playerPositionStorage();
|
||||
byte bitField = wrapper.get(Types.BYTE, 0);
|
||||
playerStorage.setX(toSet(bitField, 0, playerStorage.x(), wrapper.get(Types.DOUBLE, 0)));
|
||||
playerStorage.setY(toSet(bitField, 1, playerStorage.y(), wrapper.get(Types.DOUBLE, 1)));
|
||||
@@ -196,13 +196,14 @@ public class EntityPacketRewriter1_13 extends LegacyEntityRewriter<ClientboundPa
|
||||
map(Types.INT); // 0 - Dimension ID
|
||||
|
||||
handler(wrapper -> {
|
||||
ClientWorld clientWorld = wrapper.user().getClientWorld(Protocol1_13To1_12_2.class);
|
||||
ProtocolStorables1_13 storables = wrapper.user().storables(protocol);
|
||||
ClientWorld clientWorld = storables.clientWorld();
|
||||
int dimensionId = wrapper.get(Types.INT, 0);
|
||||
|
||||
if (clientWorld.setEnvironment(dimensionId)) {
|
||||
tracker(wrapper.user()).clearEntities();
|
||||
wrapper.user().get(BackwardsBlockStorage.class).clear();
|
||||
wrapper.user().get(NoteBlockStorage.class).clear();
|
||||
storables.backwardsBlockStorage().clear();
|
||||
storables.noteBlockStorage().clear();
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -223,7 +224,8 @@ public class EntityPacketRewriter1_13 extends LegacyEntityRewriter<ClientboundPa
|
||||
final double y = wrapper.read(Types.DOUBLE);
|
||||
final double z = wrapper.read(Types.DOUBLE);
|
||||
|
||||
PlayerPositionStorage1_13 positionStorage = wrapper.user().get(PlayerPositionStorage1_13.class);
|
||||
ProtocolStorables1_13 storables = wrapper.user().storables(protocol);
|
||||
PlayerPositionStorage1_13 positionStorage = storables.playerPositionStorage();
|
||||
|
||||
// Send teleport packet to client
|
||||
PacketWrapper positionAndLook = wrapper.create(ClientboundPackets1_12_1.PLAYER_POSITION);
|
||||
@@ -245,10 +247,9 @@ public class EntityPacketRewriter1_13 extends LegacyEntityRewriter<ClientboundPa
|
||||
if (!ViaBackwards.getConfig().isFix1_13FacePlayer()) {
|
||||
return;
|
||||
}
|
||||
final double x = wrapper.passthrough(Types.DOUBLE);
|
||||
final double y = wrapper.passthrough(Types.DOUBLE);
|
||||
final double z = wrapper.passthrough(Types.DOUBLE);
|
||||
wrapper.user().get(PlayerPositionStorage1_13.class).setPosition(x, y, z);
|
||||
|
||||
ProtocolStorables1_13 storables = wrapper.user().storables(protocol);
|
||||
storables.playerPositionStorage().setPosFromPacket(wrapper);
|
||||
};
|
||||
protocol.registerServerbound(ServerboundPackets1_12_1.MOVE_PLAYER_POS, movementRemapper); // Player Position
|
||||
protocol.registerServerbound(ServerboundPackets1_12_1.MOVE_PLAYER_POS_ROT, movementRemapper); // Player Position And Look (serverbound)
|
||||
@@ -354,6 +355,14 @@ public class EntityPacketRewriter1_13 extends LegacyEntityRewriter<ClientboundPa
|
||||
|
||||
event.cancel();
|
||||
});
|
||||
|
||||
filter().dataType(EntityDataTypes1_12.OPTIONAL_BLOCK_STATE).handler(((event, data) -> {
|
||||
final int blockState = data.value();
|
||||
if (blockState != 0) {
|
||||
final int combined = Protocol1_13To1_12_2.MAPPINGS.getNewBlockStateId(blockState);
|
||||
data.setValue(((combined >> 4) & 0xFFF) | ((combined & 0xF) << 12));
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+9
-4
@@ -21,6 +21,7 @@ import com.google.common.base.Joiner;
|
||||
import com.viaversion.viabackwards.ViaBackwards;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.Protocol1_13To1_12_2;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.data.ParticleIdMappings1_12_2;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.storage.ProtocolStorables1_13;
|
||||
import com.viaversion.viabackwards.protocol.v1_13to1_12_2.storage.TabCompleteStorage;
|
||||
import com.viaversion.viabackwards.utils.ChatUtil;
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
@@ -142,7 +143,8 @@ public class PlayerPacketRewriter1_13 extends RewriterBase<Protocol1_13To1_12_2>
|
||||
@Override
|
||||
public void register() {
|
||||
handler(packetWrapper -> {
|
||||
TabCompleteStorage storage = packetWrapper.user().get(TabCompleteStorage.class);
|
||||
ProtocolStorables1_13 storables = packetWrapper.user().storables(protocol);
|
||||
TabCompleteStorage storage = storables.tabCompleteStorage();
|
||||
int action = packetWrapper.passthrough(Types.VAR_INT);
|
||||
int nPlayers = packetWrapper.passthrough(Types.VAR_INT);
|
||||
for (int i = 0; i < nPlayers; i++) {
|
||||
@@ -236,7 +238,8 @@ public class PlayerPacketRewriter1_13 extends RewriterBase<Protocol1_13To1_12_2>
|
||||
protocol.registerClientbound(ClientboundPackets1_13.COMMANDS, null, wrapper -> {
|
||||
wrapper.cancel();
|
||||
|
||||
TabCompleteStorage storage = wrapper.user().get(TabCompleteStorage.class);
|
||||
ProtocolStorables1_13 storables = wrapper.user().storables(protocol);
|
||||
TabCompleteStorage storage = storables.tabCompleteStorage();
|
||||
|
||||
if (!storage.commands().isEmpty()) {
|
||||
storage.commands().clear();
|
||||
@@ -274,7 +277,8 @@ public class PlayerPacketRewriter1_13 extends RewriterBase<Protocol1_13To1_12_2>
|
||||
});
|
||||
|
||||
protocol.registerClientbound(ClientboundPackets1_13.COMMAND_SUGGESTIONS, wrapper -> {
|
||||
TabCompleteStorage storage = wrapper.user().get(TabCompleteStorage.class);
|
||||
ProtocolStorables1_13 storables = wrapper.user().storables(protocol);
|
||||
TabCompleteStorage storage = storables.tabCompleteStorage();
|
||||
if (storage.lastRequest() == null) {
|
||||
wrapper.cancel();
|
||||
return;
|
||||
@@ -299,7 +303,8 @@ public class PlayerPacketRewriter1_13 extends RewriterBase<Protocol1_13To1_12_2>
|
||||
});
|
||||
|
||||
protocol.registerServerbound(ServerboundPackets1_12_1.COMMAND_SUGGESTION, wrapper -> {
|
||||
TabCompleteStorage storage = wrapper.user().get(TabCompleteStorage.class);
|
||||
ProtocolStorables1_13 storables = wrapper.user().storables(protocol);
|
||||
TabCompleteStorage storage = storables.tabCompleteStorage();
|
||||
List<String> suggestions = new ArrayList<>();
|
||||
|
||||
String command = wrapper.read(Types.STRING);
|
||||
|
||||
+1
-2
@@ -18,7 +18,6 @@
|
||||
|
||||
package com.viaversion.viabackwards.protocol.v1_13to1_12_2.storage;
|
||||
|
||||
import com.viaversion.viaversion.api.connection.StorableObject;
|
||||
import com.viaversion.viaversion.api.minecraft.BlockPosition;
|
||||
import com.viaversion.viaversion.libs.fastutil.ints.IntOpenHashSet;
|
||||
import com.viaversion.viaversion.libs.fastutil.ints.IntSet;
|
||||
@@ -26,7 +25,7 @@ import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
public class BackwardsBlockStorage implements StorableObject {
|
||||
public class BackwardsBlockStorage {
|
||||
// This BlockStorage is very exclusive (;
|
||||
private static final IntSet WHITELIST = new IntOpenHashSet(779);
|
||||
|
||||
|
||||
+1
-2
@@ -17,13 +17,12 @@
|
||||
*/
|
||||
package com.viaversion.viabackwards.protocol.v1_13to1_12_2.storage;
|
||||
|
||||
import com.viaversion.viaversion.api.connection.StorableObject;
|
||||
import com.viaversion.viaversion.api.minecraft.BlockPosition;
|
||||
import com.viaversion.viaversion.libs.fastutil.objects.Object2IntMap;
|
||||
import com.viaversion.viaversion.libs.fastutil.objects.Object2IntOpenHashMap;
|
||||
import com.viaversion.viaversion.util.Pair;
|
||||
|
||||
public class NoteBlockStorage implements StorableObject {
|
||||
public class NoteBlockStorage {
|
||||
|
||||
private static final int MAX_NOTE_ID = 24;
|
||||
|
||||
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
|
||||
* Copyright (C) 2016-2026 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_13to1_12_2.storage;
|
||||
|
||||
import com.viaversion.viaversion.connection.ProtocolStorablesBase;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
public final class ProtocolStorables1_13 extends ProtocolStorablesBase {
|
||||
|
||||
private final BackwardsBlockStorage backwardsBlockStorage = new BackwardsBlockStorage();
|
||||
private final TabCompleteStorage tabCompleteStorage = new TabCompleteStorage();
|
||||
private final NoteBlockStorage noteBlockStorage = new NoteBlockStorage();
|
||||
private PlayerPositionStorage1_13 playerPositionStorage;
|
||||
|
||||
public BackwardsBlockStorage backwardsBlockStorage() {
|
||||
return backwardsBlockStorage;
|
||||
}
|
||||
|
||||
public TabCompleteStorage tabCompleteStorage() {
|
||||
return tabCompleteStorage;
|
||||
}
|
||||
|
||||
public NoteBlockStorage noteBlockStorage() {
|
||||
return noteBlockStorage;
|
||||
}
|
||||
|
||||
public @Nullable PlayerPositionStorage1_13 playerPositionStorage() {
|
||||
return playerPositionStorage;
|
||||
}
|
||||
|
||||
public void setPlayerPositionStorage(final PlayerPositionStorage1_13 playerPositionStorage) {
|
||||
this.playerPositionStorage = playerPositionStorage;
|
||||
}
|
||||
}
|
||||
+1
-2
@@ -17,14 +17,13 @@
|
||||
*/
|
||||
package com.viaversion.viabackwards.protocol.v1_13to1_12_2.storage;
|
||||
|
||||
import com.viaversion.viaversion.api.connection.StorableObject;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
public class TabCompleteStorage implements StorableObject {
|
||||
public class TabCompleteStorage {
|
||||
private final Map<UUID, String> usernames = new HashMap<>();
|
||||
private final Set<String> commands = new HashSet<>();
|
||||
private int lastId;
|
||||
|
||||
+2
-2
@@ -41,8 +41,8 @@ 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());
|
||||
addEntityTracker(user, new EntityTrackerBase(user, EntityTypes1_15.PLAYER));
|
||||
user.storables(this).setClientWorld(new ClientWorld());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+10
-9
@@ -27,7 +27,7 @@ import com.viaversion.viabackwards.protocol.v1_14to1_13_2.rewriter.EntityPacketR
|
||||
import com.viaversion.viabackwards.protocol.v1_14to1_13_2.rewriter.PlayerPacketRewriter1_14;
|
||||
import com.viaversion.viabackwards.protocol.v1_14to1_13_2.rewriter.SoundPacketRewriter1_14;
|
||||
import com.viaversion.viabackwards.protocol.v1_14to1_13_2.storage.ChunkLightStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_14to1_13_2.storage.DifficultyStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_14to1_13_2.storage.ProtocolStorables1_14;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.minecraft.ClientWorld;
|
||||
import com.viaversion.viaversion.api.minecraft.RegistryType;
|
||||
@@ -121,7 +121,8 @@ public class Protocol1_14To1_13_2 extends BackwardsProtocol<ClientboundPackets1_
|
||||
}
|
||||
|
||||
//TODO Soft memory leak: Don't store light if chunk is already loaded
|
||||
wrapper.user().get(ChunkLightStorage.class).setStoredLight(skyLight, blockLight, x, z);
|
||||
ProtocolStorables1_14 storables = wrapper.user().storables(this);
|
||||
storables.chunkLightStorage().setStoredLight(skyLight, blockLight, x, z);
|
||||
wrapper.cancel();
|
||||
});
|
||||
}
|
||||
@@ -132,14 +133,14 @@ public class Protocol1_14To1_13_2 extends BackwardsProtocol<ClientboundPackets1_
|
||||
|
||||
@Override
|
||||
public void init(UserConnection user) {
|
||||
user.addEntityTracker(this.getClass(), new EntityTrackerBase(user, EntityTypes1_14.PLAYER));
|
||||
user.addClientWorld(this.getClass(), new ClientWorld());
|
||||
addEntityTracker(user, new EntityTrackerBase(user, EntityTypes1_14.PLAYER));
|
||||
final ProtocolStorables1_14 storables = user.storables(this);
|
||||
storables.setClientWorld(new ClientWorld());
|
||||
}
|
||||
|
||||
if (!user.has(ChunkLightStorage.class)) {
|
||||
user.put(new ChunkLightStorage());
|
||||
}
|
||||
|
||||
user.put(new DifficultyStorage());
|
||||
@Override
|
||||
public ProtocolStorables1_14 createStorables() {
|
||||
return new ProtocolStorables1_14();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+8
-5
@@ -27,6 +27,7 @@ import com.viaversion.viabackwards.api.rewriters.EnchantmentRewriter;
|
||||
import com.viaversion.viabackwards.item.DataItemWithExtras;
|
||||
import com.viaversion.viabackwards.protocol.v1_14to1_13_2.Protocol1_14To1_13_2;
|
||||
import com.viaversion.viabackwards.protocol.v1_14to1_13_2.storage.ChunkLightStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_14to1_13_2.storage.ProtocolStorables1_14;
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.minecraft.ClientWorld;
|
||||
@@ -130,7 +131,7 @@ public class BlockItemPacketRewriter1_14 extends BackwardsItemRewriter<Clientbou
|
||||
}
|
||||
|
||||
if (stringType == null) {
|
||||
protocol.getLogger().warning("Can't open inventory for player! Type: " + type);
|
||||
// TODO stonecutter, if reasonably possible
|
||||
wrapper.cancel();
|
||||
return;
|
||||
}
|
||||
@@ -221,7 +222,7 @@ public class BlockItemPacketRewriter1_14 extends BackwardsItemRewriter<Clientbou
|
||||
|
||||
handler(wrapper -> {
|
||||
int entityId = wrapper.get(Types.VAR_INT, 0);
|
||||
EntityType entityType = wrapper.user().getEntityTracker(Protocol1_14To1_13_2.class).entityType(entityId);
|
||||
EntityType entityType = wrapper.user().getEntityTracker(protocol).entityType(entityId);
|
||||
if (entityType == null) return;
|
||||
|
||||
if (entityType.isOrHasParent(EntityTypes1_14.ABSTRACT_HORSE)) {
|
||||
@@ -347,11 +348,12 @@ public class BlockItemPacketRewriter1_14 extends BackwardsItemRewriter<Clientbou
|
||||
});
|
||||
|
||||
protocol.registerClientbound(ClientboundPackets1_14.LEVEL_CHUNK, wrapper -> {
|
||||
ClientWorld clientWorld = wrapper.user().getClientWorld(Protocol1_14To1_13_2.class);
|
||||
ProtocolStorables1_14 storables = wrapper.user().storables(protocol);
|
||||
ClientWorld clientWorld = storables.clientWorld();
|
||||
Chunk chunk = wrapper.read(ChunkType1_14.TYPE);
|
||||
wrapper.write(ChunkType1_13.forEnvironment(clientWorld.getEnvironment()), chunk);
|
||||
|
||||
ChunkLightStorage.ChunkLight chunkLight = wrapper.user().get(ChunkLightStorage.class).getStoredLight(chunk.getX(), chunk.getZ());
|
||||
ChunkLightStorage.ChunkLight chunkLight = storables.chunkLightStorage().getStoredLight(chunk.getX(), chunk.getZ());
|
||||
for (int i = 0; i < chunk.getSections().length; i++) {
|
||||
ChunkSection section = chunk.getSections()[i];
|
||||
if (section == null) continue;
|
||||
@@ -391,7 +393,8 @@ public class BlockItemPacketRewriter1_14 extends BackwardsItemRewriter<Clientbou
|
||||
protocol.registerClientbound(ClientboundPackets1_14.FORGET_LEVEL_CHUNK, wrapper -> {
|
||||
int x = wrapper.passthrough(Types.INT);
|
||||
int z = wrapper.passthrough(Types.INT);
|
||||
wrapper.user().get(ChunkLightStorage.class).unloadChunk(x, z);
|
||||
ProtocolStorables1_14 storables = wrapper.user().storables(protocol);
|
||||
storables.chunkLightStorage().unloadChunk(x, z);
|
||||
});
|
||||
|
||||
protocol.replaceClientbound(ClientboundPackets1_14.LEVEL_EVENT, new PacketHandlers() {
|
||||
|
||||
+29
-10
@@ -21,9 +21,8 @@ import com.viaversion.viabackwards.api.entities.storage.EntityPositionHandler;
|
||||
import com.viaversion.viabackwards.api.entities.storage.EntityReplacement;
|
||||
import com.viaversion.viabackwards.api.rewriters.LegacyEntityRewriter;
|
||||
import com.viaversion.viabackwards.protocol.v1_14to1_13_2.Protocol1_14To1_13_2;
|
||||
import com.viaversion.viabackwards.protocol.v1_14to1_13_2.storage.ChunkLightStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_14to1_13_2.storage.DifficultyStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_14to1_13_2.storage.EntityPositionStorage1_14;
|
||||
import com.viaversion.viabackwards.protocol.v1_14to1_13_2.storage.ProtocolStorables1_14;
|
||||
import com.viaversion.viaversion.api.data.entity.EntityTracker;
|
||||
import com.viaversion.viaversion.api.data.entity.TrackedEntity;
|
||||
import com.viaversion.viaversion.api.minecraft.BlockPosition;
|
||||
@@ -64,6 +63,12 @@ public class EntityPacketRewriter1_14 extends LegacyEntityRewriter<ClientboundPa
|
||||
if (status != 3) return;
|
||||
|
||||
EntityTracker tracker = tracker(wrapper.user());
|
||||
if (entityId == tracker.clientEntityId()) {
|
||||
// Clients up to 1.13.2 run the local death handling on their own death event, clearing
|
||||
// their own inventory; the death screen still shows from the health update
|
||||
wrapper.cancel();
|
||||
return;
|
||||
}
|
||||
EntityType entityType = tracker.entityType(entityId);
|
||||
if (entityType != EntityTypes1_14.PLAYER) return;
|
||||
|
||||
@@ -310,7 +315,8 @@ public class EntityPacketRewriter1_14 extends LegacyEntityRewriter<ClientboundPa
|
||||
handler(getDimensionHandler(1));
|
||||
handler(playerTrackerHandler());
|
||||
handler(wrapper -> {
|
||||
short difficulty = wrapper.user().get(DifficultyStorage.class).getDifficulty();
|
||||
ProtocolStorables1_14 storables = wrapper.user().storables(protocol);
|
||||
short difficulty = storables.difficultyStorage().getDifficulty();
|
||||
wrapper.write(Types.UNSIGNED_BYTE, difficulty);
|
||||
|
||||
wrapper.passthrough(Types.UNSIGNED_BYTE); // Max Players
|
||||
@@ -331,17 +337,18 @@ public class EntityPacketRewriter1_14 extends LegacyEntityRewriter<ClientboundPa
|
||||
map(Types.INT); // 0 - Dimension ID
|
||||
|
||||
handler(wrapper -> {
|
||||
ClientWorld clientWorld = wrapper.user().getClientWorld(Protocol1_14To1_13_2.class);
|
||||
ProtocolStorables1_14 storables = wrapper.user().storables(protocol);
|
||||
ClientWorld clientWorld = storables.clientWorld();
|
||||
int dimensionId = wrapper.get(Types.INT, 0);
|
||||
|
||||
if (clientWorld.setEnvironment(dimensionId)) {
|
||||
EntityTracker tracker = tracker(wrapper.user());
|
||||
tracker.clearEntities();
|
||||
wrapper.user().get(ChunkLightStorage.class).clear();
|
||||
storables.chunkLightStorage().clear();
|
||||
tracker.entity(tracker.clientEntityId()).put(new EntityPositionStorage1_14());
|
||||
}
|
||||
|
||||
short difficulty = wrapper.user().get(DifficultyStorage.class).getDifficulty();
|
||||
short difficulty = storables.difficultyStorage().getDifficulty();
|
||||
wrapper.write(Types.UNSIGNED_BYTE, difficulty);
|
||||
});
|
||||
}
|
||||
@@ -477,9 +484,21 @@ public class EntityPacketRewriter1_14 extends LegacyEntityRewriter<ClientboundPa
|
||||
|
||||
filter().type(EntityTypes1_14.CAT).handler((event, data) -> {
|
||||
if (event.index() == 15) {
|
||||
data.setValue(1);
|
||||
} else if (event.index() == 13) {
|
||||
data.setValue((byte) ((byte) data.getValue() & 0x4));
|
||||
Integer catVariant = data.value();
|
||||
int ocelotVariant = catVariant != null ? switch (catVariant) {
|
||||
// new ocelot mappings
|
||||
case 0, 1, 2, 3 -> catVariant;
|
||||
|
||||
// Map to tuxedo
|
||||
case 10 -> 1; // all_black
|
||||
// Map to red
|
||||
case 5, 6 -> 2; // calico, persian
|
||||
// Map to siamese
|
||||
case 4, 7, 8, 9 -> 3; // british_shorthair, ragdoll, white, jellie
|
||||
|
||||
default -> 0; // Untamed
|
||||
} : 0;
|
||||
data.setValue(ocelotVariant);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -520,7 +539,7 @@ public class EntityPacketRewriter1_14 extends LegacyEntityRewriter<ClientboundPa
|
||||
@Override
|
||||
public void onMappingDataLoaded() {
|
||||
super.onMappingDataLoaded();
|
||||
mapEntityTypeWithData(EntityTypes1_14.CAT, EntityTypes1_14.OCELOT).jsonName();
|
||||
mapEntityTypeWithData(EntityTypes1_14.CAT, EntityTypes1_14.OCELOT);
|
||||
mapEntityTypeWithData(EntityTypes1_14.TRADER_LLAMA, EntityTypes1_14.LLAMA).jsonName();
|
||||
mapEntityTypeWithData(EntityTypes1_14.FOX, EntityTypes1_14.WOLF).jsonName();
|
||||
mapEntityTypeWithData(EntityTypes1_14.PANDA, EntityTypes1_14.POLAR_BEAR).jsonName();
|
||||
|
||||
+3
-2
@@ -18,7 +18,7 @@
|
||||
package com.viaversion.viabackwards.protocol.v1_14to1_13_2.rewriter;
|
||||
|
||||
import com.viaversion.viabackwards.protocol.v1_14to1_13_2.Protocol1_14To1_13_2;
|
||||
import com.viaversion.viabackwards.protocol.v1_14to1_13_2.storage.DifficultyStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_14to1_13_2.storage.ProtocolStorables1_14;
|
||||
import com.viaversion.viaversion.api.minecraft.BlockPosition;
|
||||
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
|
||||
import com.viaversion.viaversion.api.rewriter.RewriterBase;
|
||||
@@ -41,7 +41,8 @@ public class PlayerPacketRewriter1_14 extends RewriterBase<Protocol1_14To1_13_2>
|
||||
read(Types.BOOLEAN); // Locked
|
||||
handler(wrapper -> {
|
||||
byte difficulty = wrapper.get(Types.UNSIGNED_BYTE, 0).byteValue();
|
||||
wrapper.user().get(DifficultyStorage.class).setDifficulty(difficulty);
|
||||
ProtocolStorables1_14 storables = wrapper.user().storables(protocol);
|
||||
storables.difficultyStorage().setDifficulty(difficulty);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
+1
-1
@@ -45,7 +45,7 @@ public class SoundPacketRewriter1_14 extends RewriterBase<Protocol1_14To1_13_2>
|
||||
int category = wrapper.read(Types.VAR_INT);
|
||||
int entityId = wrapper.read(Types.VAR_INT);
|
||||
|
||||
TrackedEntity storedEntity = wrapper.user().getEntityTracker(protocol.getClass()).entity(entityId);
|
||||
TrackedEntity storedEntity = wrapper.user().getEntityTracker(protocol).entity(entityId);
|
||||
EntityPositionStorage1_14 entityStorage;
|
||||
if (storedEntity == null || (entityStorage = storedEntity.get(EntityPositionStorage1_14.class)) == null) {
|
||||
protocol.getLogger().warning("Untracked entity with id " + entityId);
|
||||
|
||||
+1
-2
@@ -17,12 +17,11 @@
|
||||
*/
|
||||
package com.viaversion.viabackwards.protocol.v1_14to1_13_2.storage;
|
||||
|
||||
import com.viaversion.viaversion.api.connection.StorableObject;
|
||||
import com.viaversion.viaversion.libs.fastutil.longs.Long2ObjectMap;
|
||||
import com.viaversion.viaversion.libs.fastutil.longs.Long2ObjectOpenHashMap;
|
||||
import java.util.Arrays;
|
||||
|
||||
public class ChunkLightStorage implements StorableObject {
|
||||
public class ChunkLightStorage {
|
||||
public static final byte[] FULL_LIGHT = new byte[2048];
|
||||
public static final byte[] EMPTY_LIGHT = new byte[2048];
|
||||
|
||||
|
||||
+1
-3
@@ -17,9 +17,7 @@
|
||||
*/
|
||||
package com.viaversion.viabackwards.protocol.v1_14to1_13_2.storage;
|
||||
|
||||
import com.viaversion.viaversion.api.connection.StorableObject;
|
||||
|
||||
public class DifficultyStorage implements StorableObject {
|
||||
public class DifficultyStorage {
|
||||
private byte difficulty;
|
||||
|
||||
public byte getDifficulty() {
|
||||
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
|
||||
* Copyright (C) 2016-2026 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.storage;
|
||||
|
||||
import com.viaversion.viaversion.connection.ProtocolStorablesBase;
|
||||
|
||||
public final class ProtocolStorables1_14 extends ProtocolStorablesBase {
|
||||
|
||||
private final ChunkLightStorage chunkLightStorage = new ChunkLightStorage();
|
||||
private final DifficultyStorage difficultyStorage = new DifficultyStorage();
|
||||
|
||||
public ChunkLightStorage chunkLightStorage() {
|
||||
return chunkLightStorage;
|
||||
}
|
||||
|
||||
public DifficultyStorage difficultyStorage() {
|
||||
return difficultyStorage;
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -88,8 +88,8 @@ public class Protocol1_15To1_14_4 extends BackwardsProtocol<ClientboundPackets1_
|
||||
|
||||
@Override
|
||||
public void init(UserConnection user) {
|
||||
user.addEntityTracker(getClass(), new EntityTrackerBase(user, EntityTypes1_15.PLAYER));
|
||||
user.addClientWorld(getClass(), new ClientWorld());
|
||||
user.storables(this).setEntityTracker(new EntityTrackerBase(user, EntityTypes1_15.PLAYER));
|
||||
user.storables(this).setClientWorld(new ClientWorld());
|
||||
|
||||
user.put(new ImmediateRespawnStorage());
|
||||
}
|
||||
|
||||
+11
-2
@@ -24,6 +24,8 @@ import com.viaversion.viabackwards.protocol.v1_16_2to1_16_1.rewriter.BlockItemPa
|
||||
import com.viaversion.viabackwards.protocol.v1_16_2to1_16_1.rewriter.CommandRewriter1_16_2;
|
||||
import com.viaversion.viabackwards.protocol.v1_16_2to1_16_1.rewriter.EntityPacketRewriter1_16_2;
|
||||
import com.viaversion.viabackwards.protocol.v1_16_2to1_16_1.storage.BiomeStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_16_2to1_16_1.storage.ProtocolStorables1_16_2;
|
||||
import com.viaversion.viaversion.connection.ProtocolStorablesBase;
|
||||
import com.viaversion.viabackwards.utils.BackwardsProtocolLogger;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.minecraft.RegistryType;
|
||||
@@ -109,8 +111,15 @@ public class Protocol1_16_2To1_16_1 extends BackwardsProtocol<ClientboundPackets
|
||||
|
||||
@Override
|
||||
public void init(UserConnection user) {
|
||||
user.put(new BiomeStorage());
|
||||
user.addEntityTracker(this.getClass(), new EntityTrackerBase(user, EntityTypes1_16_2.PLAYER));
|
||||
addEntityTracker(user, new EntityTrackerBase(user, EntityTypes1_16_2.PLAYER));
|
||||
final ProtocolStorables1_16_2 storables = user.storables(this);
|
||||
// BiomeStorage is also used in 1.16->1.15.2
|
||||
user.put(storables.biomeStorage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProtocolStorablesBase createStorables() {
|
||||
return new ProtocolStorables1_16_2();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+3
-1
@@ -26,6 +26,7 @@ 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;
|
||||
import com.viaversion.viabackwards.protocol.v1_16_2to1_16_1.storage.BiomeStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_16_2to1_16_1.storage.ProtocolStorables1_16_2;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_16_2;
|
||||
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
|
||||
@@ -73,7 +74,8 @@ public class EntityPacketRewriter1_16_2 extends EntityRewriter<ClientboundPacket
|
||||
if (wrapper.user().getProtocolInfo().protocolVersion().olderThanOrEqualTo(ProtocolVersion.v1_15_2)) {
|
||||
// Store biomes for <1.16 client handling
|
||||
ListTag<CompoundTag> biomes = TagUtil.getRegistryEntries(registry, "worldgen/biome");
|
||||
BiomeStorage biomeStorage = wrapper.user().get(BiomeStorage.class);
|
||||
ProtocolStorables1_16_2 storables = wrapper.user().storables(protocol);
|
||||
BiomeStorage biomeStorage = storables.biomeStorage();
|
||||
biomeStorage.clear();
|
||||
for (CompoundTag biome : biomes) {
|
||||
StringTag name = biome.getStringTag("name");
|
||||
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
|
||||
* Copyright (C) 2016-2026 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_16_2to1_16_1.storage;
|
||||
|
||||
import com.viaversion.viaversion.connection.ProtocolStorablesBase;
|
||||
|
||||
public final class ProtocolStorables1_16_2 extends ProtocolStorablesBase {
|
||||
|
||||
private final BiomeStorage biomeStorage = new BiomeStorage();
|
||||
|
||||
public BiomeStorage biomeStorage() {
|
||||
return biomeStorage;
|
||||
}
|
||||
}
|
||||
+11
-3
@@ -19,9 +19,11 @@ package com.viaversion.viabackwards.protocol.v1_16_4to1_16_3;
|
||||
|
||||
import com.viaversion.viabackwards.api.BackwardsProtocol;
|
||||
import com.viaversion.viabackwards.protocol.v1_16_4to1_16_3.storage.PlayerHandStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_16_4to1_16_3.storage.ProtocolStorables1_16_4;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
|
||||
import com.viaversion.viaversion.api.type.Types;
|
||||
import com.viaversion.viaversion.connection.ProtocolStorablesBase;
|
||||
import com.viaversion.viaversion.protocols.v1_16_1to1_16_2.packet.ClientboundPackets1_16_2;
|
||||
import com.viaversion.viaversion.protocols.v1_16_1to1_16_2.packet.ServerboundPackets1_16_2;
|
||||
|
||||
@@ -43,7 +45,8 @@ public class Protocol1_16_4To1_16_3 extends BackwardsProtocol<ClientboundPackets
|
||||
if (slot == 1) {
|
||||
wrapper.write(Types.VAR_INT, 40); // offhand
|
||||
} else {
|
||||
wrapper.write(Types.VAR_INT, wrapper.user().get(PlayerHandStorage.class).getCurrentHand());
|
||||
ProtocolStorables1_16_4 storables = wrapper.user().storables(Protocol1_16_4To1_16_3.this);
|
||||
wrapper.write(Types.VAR_INT, storables.playerHandStorage().getCurrentHand());
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -51,12 +54,17 @@ public class Protocol1_16_4To1_16_3 extends BackwardsProtocol<ClientboundPackets
|
||||
|
||||
registerServerbound(ServerboundPackets1_16_2.SET_CARRIED_ITEM, wrapper -> {
|
||||
short slot = wrapper.passthrough(Types.SHORT);
|
||||
wrapper.user().get(PlayerHandStorage.class).setCurrentHand(slot);
|
||||
ProtocolStorables1_16_4 storables = wrapper.user().storables(this);
|
||||
storables.playerHandStorage().setCurrentHand(slot);
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(UserConnection user) {
|
||||
user.put(new PlayerHandStorage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProtocolStorablesBase createStorables() {
|
||||
return new ProtocolStorables1_16_4();
|
||||
}
|
||||
}
|
||||
+1
-3
@@ -17,9 +17,7 @@
|
||||
*/
|
||||
package com.viaversion.viabackwards.protocol.v1_16_4to1_16_3.storage;
|
||||
|
||||
import com.viaversion.viaversion.api.connection.StorableObject;
|
||||
|
||||
public class PlayerHandStorage implements StorableObject {
|
||||
public class PlayerHandStorage {
|
||||
|
||||
private int currentHand;
|
||||
|
||||
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
|
||||
* Copyright (C) 2016-2026 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_16_4to1_16_3.storage;
|
||||
|
||||
import com.viaversion.viaversion.connection.ProtocolStorablesBase;
|
||||
|
||||
public final class ProtocolStorables1_16_4 extends ProtocolStorablesBase {
|
||||
|
||||
private final PlayerHandStorage playerHandStorage = new PlayerHandStorage();
|
||||
|
||||
public PlayerHandStorage playerHandStorage() {
|
||||
return playerHandStorage;
|
||||
}
|
||||
}
|
||||
+13
-11
@@ -23,9 +23,7 @@ import com.viaversion.viabackwards.protocol.v1_16to1_15_2.rewriter.BlockItemPack
|
||||
import com.viaversion.viabackwards.protocol.v1_16to1_15_2.rewriter.CommandRewriter1_16;
|
||||
import com.viaversion.viabackwards.protocol.v1_16to1_15_2.rewriter.EntityPacketRewriter1_16;
|
||||
import com.viaversion.viabackwards.protocol.v1_16to1_15_2.rewriter.TranslatableRewriter1_16;
|
||||
import com.viaversion.viabackwards.protocol.v1_16to1_15_2.storage.PlayerAttributesStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_16to1_15_2.storage.PlayerSneakStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_16to1_15_2.storage.WorldNameTracker;
|
||||
import com.viaversion.viabackwards.protocol.v1_16to1_15_2.storage.ProtocolStorables1_16;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.minecraft.ClientWorld;
|
||||
import com.viaversion.viaversion.api.minecraft.RegistryType;
|
||||
@@ -117,9 +115,11 @@ public class Protocol1_16To1_15_2 extends BackwardsProtocol<ClientboundPackets1_
|
||||
wrapper.passthrough(Types.VAR_INT); // player id
|
||||
int action = wrapper.passthrough(Types.VAR_INT);
|
||||
if (action == 0) {
|
||||
wrapper.user().get(PlayerSneakStorage.class).setSneaking(true);
|
||||
ProtocolStorables1_16 storables = wrapper.user().storables(this);
|
||||
storables.playerSneakStorage().setSneaking(true);
|
||||
} else if (action == 1) {
|
||||
wrapper.user().get(PlayerSneakStorage.class).setSneaking(false);
|
||||
ProtocolStorables1_16 storables = wrapper.user().storables(this);
|
||||
storables.playerSneakStorage().setSneaking(false);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -138,7 +138,8 @@ public class Protocol1_16To1_15_2 extends BackwardsProtocol<ClientboundPackets1_
|
||||
}
|
||||
|
||||
// New boolean: Whether the client is sneaking
|
||||
wrapper.write(Types.BOOLEAN, wrapper.user().get(PlayerSneakStorage.class).isSneaking());
|
||||
ProtocolStorables1_16 storables = wrapper.user().storables(this);
|
||||
wrapper.write(Types.BOOLEAN, storables.playerSneakStorage().isSneaking());
|
||||
});
|
||||
|
||||
registerServerbound(ServerboundPackets1_14.PLAYER_ABILITIES, wrapper -> {
|
||||
@@ -155,12 +156,13 @@ public class Protocol1_16To1_15_2 extends BackwardsProtocol<ClientboundPackets1_
|
||||
|
||||
@Override
|
||||
public void init(UserConnection user) {
|
||||
user.addEntityTracker(this.getClass(), new EntityTrackerBase(user, EntityTypes1_16.PLAYER));
|
||||
user.addClientWorld(this.getClass(), new ClientWorld());
|
||||
addEntityTracker(user, new EntityTrackerBase(user, EntityTypes1_16.PLAYER));
|
||||
user.storables(this).setClientWorld(new ClientWorld());
|
||||
}
|
||||
|
||||
user.put(new PlayerSneakStorage());
|
||||
user.put(new WorldNameTracker());
|
||||
user.put(new PlayerAttributesStorage());
|
||||
@Override
|
||||
public ProtocolStorables1_16 createStorables() {
|
||||
return new ProtocolStorables1_16();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+10
-7
@@ -20,6 +20,7 @@ package com.viaversion.viabackwards.protocol.v1_16to1_15_2.rewriter;
|
||||
import com.viaversion.viabackwards.api.rewriters.EntityRewriter;
|
||||
import com.viaversion.viabackwards.protocol.v1_16to1_15_2.Protocol1_16To1_15_2;
|
||||
import com.viaversion.viabackwards.protocol.v1_16to1_15_2.storage.PlayerAttributesStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_16to1_15_2.storage.ProtocolStorables1_16;
|
||||
import com.viaversion.viabackwards.protocol.v1_16to1_15_2.storage.WolfDataMaskStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_16to1_15_2.storage.WorldNameTracker;
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
@@ -99,8 +100,9 @@ public class EntityPacketRewriter1_16 extends EntityRewriter<ClientboundPackets1
|
||||
public void register() {
|
||||
map(dimensionTransformer); // Dimension Type
|
||||
handler(wrapper -> {
|
||||
ProtocolStorables1_16 storables = wrapper.user().storables(protocol);
|
||||
// Grab the tracker for world names
|
||||
WorldNameTracker worldNameTracker = wrapper.user().get(WorldNameTracker.class);
|
||||
WorldNameTracker worldNameTracker = storables.worldNameTracker();
|
||||
String nextWorldName = wrapper.read(Types.STRING); // World Name
|
||||
|
||||
wrapper.passthrough(Types.LONG); // Seed
|
||||
@@ -108,7 +110,7 @@ public class EntityPacketRewriter1_16 extends EntityRewriter<ClientboundPackets1
|
||||
wrapper.read(Types.BYTE); // Previous gamemode
|
||||
|
||||
// Grab client world
|
||||
ClientWorld clientWorld = wrapper.user().getClientWorld(Protocol1_16To1_15_2.class);
|
||||
ClientWorld clientWorld = storables.clientWorld();
|
||||
int dimension = wrapper.get(Types.INT, 0);
|
||||
|
||||
// Send a dummy respawn with a different dimension if the world name was different and the same dimension was used
|
||||
@@ -134,7 +136,7 @@ public class EntityPacketRewriter1_16 extends EntityRewriter<ClientboundPackets1
|
||||
wrapper.set(Types.STRING, 0, "flat");
|
||||
}
|
||||
|
||||
final PlayerAttributesStorage attributes = wrapper.user().get(PlayerAttributesStorage.class);
|
||||
final PlayerAttributesStorage attributes = storables.playerAttributesStorage();
|
||||
final boolean keepPlayerAttributes = wrapper.read(Types.BOOLEAN);
|
||||
if (keepPlayerAttributes) {
|
||||
// Ensure packet order
|
||||
@@ -161,13 +163,13 @@ public class EntityPacketRewriter1_16 extends EntityRewriter<ClientboundPackets1
|
||||
read(Types.NAMED_COMPOUND_TAG); // whatever this is
|
||||
map(dimensionTransformer); // Dimension Type
|
||||
handler(wrapper -> {
|
||||
WorldNameTracker worldNameTracker = wrapper.user().get(WorldNameTracker.class);
|
||||
worldNameTracker.setWorldName(wrapper.read(Types.STRING)); // Save the world name
|
||||
ProtocolStorables1_16 storables = wrapper.user().storables(protocol);
|
||||
storables.worldNameTracker().setWorldName(wrapper.read(Types.STRING)); // Save the world name
|
||||
});
|
||||
map(Types.LONG); // Seed
|
||||
map(Types.UNSIGNED_BYTE); // Max players
|
||||
handler(wrapper -> {
|
||||
ClientWorld clientWorld = wrapper.user().getClientWorld(Protocol1_16To1_15_2.class);
|
||||
ClientWorld clientWorld = wrapper.user().storables(protocol).clientWorld();
|
||||
clientWorld.setEnvironment(wrapper.get(Types.INT, 1));
|
||||
|
||||
wrapper.write(Types.STRING, "default"); // Level type
|
||||
@@ -192,7 +194,8 @@ public class EntityPacketRewriter1_16 extends EntityRewriter<ClientboundPackets1
|
||||
registerSetEntityData(ClientboundPackets1_16.SET_ENTITY_DATA, Types1_16.ENTITY_DATA_LIST, Types1_14.ENTITY_DATA_LIST);
|
||||
|
||||
protocol.registerClientbound(ClientboundPackets1_16.UPDATE_ATTRIBUTES, wrapper -> {
|
||||
final PlayerAttributesStorage attributes = wrapper.user().get(PlayerAttributesStorage.class);
|
||||
ProtocolStorables1_16 storables = wrapper.user().storables(protocol);
|
||||
final PlayerAttributesStorage attributes = storables.playerAttributesStorage();
|
||||
|
||||
final int entityId = wrapper.passthrough(Types.VAR_INT);
|
||||
|
||||
|
||||
+1
-2
@@ -18,7 +18,6 @@
|
||||
package com.viaversion.viabackwards.protocol.v1_16to1_15_2.storage;
|
||||
|
||||
import com.viaversion.viabackwards.protocol.v1_16to1_15_2.Protocol1_16To1_15_2;
|
||||
import com.viaversion.viaversion.api.connection.StorableObject;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
|
||||
import com.viaversion.viaversion.api.type.Types;
|
||||
@@ -27,7 +26,7 @@ import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
public final class PlayerAttributesStorage implements StorableObject {
|
||||
public final class PlayerAttributesStorage {
|
||||
|
||||
private final Map<String, Attribute> attributes = new HashMap<>();
|
||||
|
||||
|
||||
+1
-3
@@ -17,9 +17,7 @@
|
||||
*/
|
||||
package com.viaversion.viabackwards.protocol.v1_16to1_15_2.storage;
|
||||
|
||||
import com.viaversion.viaversion.api.connection.StorableObject;
|
||||
|
||||
public class PlayerSneakStorage implements StorableObject {
|
||||
public class PlayerSneakStorage {
|
||||
private boolean sneaking;
|
||||
|
||||
public boolean isSneaking() {
|
||||
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
|
||||
* Copyright (C) 2016-2026 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_16to1_15_2.storage;
|
||||
|
||||
import com.viaversion.viaversion.connection.ProtocolStorablesBase;
|
||||
|
||||
public final class ProtocolStorables1_16 extends ProtocolStorablesBase {
|
||||
|
||||
private final PlayerSneakStorage playerSneakStorage = new PlayerSneakStorage();
|
||||
private final WorldNameTracker worldNameTracker = new WorldNameTracker();
|
||||
private final PlayerAttributesStorage playerAttributesStorage = new PlayerAttributesStorage();
|
||||
|
||||
public PlayerSneakStorage playerSneakStorage() {
|
||||
return playerSneakStorage;
|
||||
}
|
||||
|
||||
public WorldNameTracker worldNameTracker() {
|
||||
return worldNameTracker;
|
||||
}
|
||||
|
||||
public PlayerAttributesStorage playerAttributesStorage() {
|
||||
return playerAttributesStorage;
|
||||
}
|
||||
}
|
||||
+1
-3
@@ -17,9 +17,7 @@
|
||||
*/
|
||||
package com.viaversion.viabackwards.protocol.v1_16to1_15_2.storage;
|
||||
|
||||
import com.viaversion.viaversion.api.connection.StorableObject;
|
||||
|
||||
public class WorldNameTracker implements StorableObject {
|
||||
public class WorldNameTracker {
|
||||
private String worldName;
|
||||
|
||||
public String getWorldName() {
|
||||
|
||||
+9
-9
@@ -21,7 +21,7 @@ import com.viaversion.nbt.tag.CompoundTag;
|
||||
import com.viaversion.nbt.tag.ListTag;
|
||||
import com.viaversion.nbt.tag.StringTag;
|
||||
import com.viaversion.viabackwards.api.BackwardsProtocol;
|
||||
import com.viaversion.viabackwards.protocol.v1_17_1to1_17.storage.InventoryStateIds;
|
||||
import com.viaversion.viabackwards.protocol.v1_17_1to1_17.storage.ProtocolStorables1_17_1;
|
||||
import com.viaversion.viabackwards.protocol.v1_17to1_16_4.storage.PlayerLastCursorItem;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.minecraft.item.Item;
|
||||
@@ -56,17 +56,17 @@ public final class Protocol1_17_1To1_17 extends BackwardsProtocol<ClientboundPac
|
||||
|
||||
registerClientbound(ClientboundPackets1_17_1.CONTAINER_CLOSE, wrapper -> {
|
||||
short containerId = wrapper.passthrough(Types.UNSIGNED_BYTE);
|
||||
wrapper.user().get(InventoryStateIds.class).removeStateId(containerId);
|
||||
wrapper.user().<ProtocolStorables1_17_1>storables(this).inventoryStateIds().removeStateId(containerId);
|
||||
});
|
||||
registerClientbound(ClientboundPackets1_17_1.CONTAINER_SET_SLOT, wrapper -> {
|
||||
byte containerId = wrapper.passthrough(Types.BYTE);
|
||||
int stateId = wrapper.read(Types.VAR_INT);
|
||||
wrapper.user().get(InventoryStateIds.class).setStateId(containerId, stateId);
|
||||
wrapper.user().<ProtocolStorables1_17_1>storables(this).inventoryStateIds().setStateId(containerId, stateId);
|
||||
});
|
||||
registerClientbound(ClientboundPackets1_17_1.CONTAINER_SET_CONTENT, wrapper -> {
|
||||
short containerId = wrapper.passthrough(Types.UNSIGNED_BYTE);
|
||||
int stateId = wrapper.read(Types.VAR_INT);
|
||||
wrapper.user().get(InventoryStateIds.class).setStateId(containerId, stateId);
|
||||
wrapper.user().<ProtocolStorables1_17_1>storables(this).inventoryStateIds().setStateId(containerId, stateId);
|
||||
|
||||
// Length is encoded as a var int in 1.17.1
|
||||
wrapper.write(Types.ITEM1_13_2_SHORT_ARRAY, wrapper.read(Types.ITEM1_13_2_ARRAY));
|
||||
@@ -74,7 +74,7 @@ public final class Protocol1_17_1To1_17 extends BackwardsProtocol<ClientboundPac
|
||||
// Carried item - forward as CONTAINER_SET_SLOT for <1.17 clients
|
||||
Item carried = wrapper.read(Types.ITEM1_13_2);
|
||||
|
||||
PlayerLastCursorItem lastCursorItem = wrapper.user().get(PlayerLastCursorItem.class);
|
||||
PlayerLastCursorItem lastCursorItem = wrapper.user().<ProtocolStorables1_17_1>storables(this).playerLastCursorItem();
|
||||
if (lastCursorItem != null) {
|
||||
// For click drag ghost item fix -- since the state ID is always wrong,
|
||||
// the server always resends the entire window contents after a drag action,
|
||||
@@ -97,11 +97,11 @@ public final class Protocol1_17_1To1_17 extends BackwardsProtocol<ClientboundPac
|
||||
|
||||
registerServerbound(ServerboundPackets1_17.CONTAINER_CLOSE, wrapper -> {
|
||||
byte containerId = wrapper.passthrough(Types.BYTE);
|
||||
wrapper.user().get(InventoryStateIds.class).removeStateId(containerId);
|
||||
wrapper.user().<ProtocolStorables1_17_1>storables(this).inventoryStateIds().removeStateId(containerId);
|
||||
});
|
||||
registerServerbound(ServerboundPackets1_17.CONTAINER_CLICK, wrapper -> {
|
||||
byte containerId = wrapper.passthrough(Types.BYTE);
|
||||
int stateId = wrapper.user().get(InventoryStateIds.class).removeStateId(containerId);
|
||||
int stateId = wrapper.user().<ProtocolStorables1_17_1>storables(this).inventoryStateIds().removeStateId(containerId);
|
||||
wrapper.write(Types.VAR_INT, stateId == Integer.MAX_VALUE ? 0 : stateId);
|
||||
});
|
||||
|
||||
@@ -158,7 +158,7 @@ public final class Protocol1_17_1To1_17 extends BackwardsProtocol<ClientboundPac
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(UserConnection connection) {
|
||||
connection.put(new InventoryStateIds());
|
||||
public ProtocolStorables1_17_1 createStorables() {
|
||||
return new ProtocolStorables1_17_1();
|
||||
}
|
||||
}
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
|
||||
* Copyright (C) 2016-2026 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_17_1to1_17.storage;
|
||||
|
||||
import com.viaversion.viabackwards.protocol.v1_17to1_16_4.storage.PlayerLastCursorItem;
|
||||
import com.viaversion.viaversion.connection.ProtocolStorablesBase;
|
||||
|
||||
public final class ProtocolStorables1_17_1 extends ProtocolStorablesBase {
|
||||
|
||||
private final InventoryStateIds inventoryStateIds = new InventoryStateIds();
|
||||
private final PlayerLastCursorItem playerLastCursorItem = new PlayerLastCursorItem();
|
||||
|
||||
public InventoryStateIds inventoryStateIds() {
|
||||
return inventoryStateIds;
|
||||
}
|
||||
|
||||
public PlayerLastCursorItem playerLastCursorItem() {
|
||||
return playerLastCursorItem;
|
||||
}
|
||||
}
|
||||
+7
-1
@@ -24,6 +24,8 @@ import com.viaversion.viabackwards.api.rewriters.text.JsonNBTComponentRewriter;
|
||||
import com.viaversion.viabackwards.protocol.v1_17to1_16_4.rewriter.BlockItemPacketRewriter1_17;
|
||||
import com.viaversion.viabackwards.protocol.v1_17to1_16_4.rewriter.EntityPacketRewriter1_17;
|
||||
import com.viaversion.viabackwards.protocol.v1_17to1_16_4.storage.PlayerLastCursorItem;
|
||||
import com.viaversion.viabackwards.protocol.v1_17to1_16_4.storage.ProtocolStorables1_17;
|
||||
import com.viaversion.viaversion.connection.ProtocolStorablesBase;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.minecraft.RegistryType;
|
||||
import com.viaversion.viaversion.api.minecraft.TagData;
|
||||
@@ -205,7 +207,11 @@ public final class Protocol1_17To1_16_4 extends BackwardsProtocol<ClientboundPac
|
||||
@Override
|
||||
public void init(UserConnection user) {
|
||||
addEntityTracker(user, new EntityTrackerBase(user, EntityTypes1_17.PLAYER));
|
||||
user.put(new PlayerLastCursorItem());
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProtocolStorablesBase createStorables() {
|
||||
return new ProtocolStorables1_17();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+12
-5
@@ -26,8 +26,12 @@ import com.viaversion.viabackwards.api.rewriters.BackwardsItemRewriter;
|
||||
import com.viaversion.viabackwards.api.rewriters.MapColorRewriter;
|
||||
import com.viaversion.viabackwards.protocol.v1_17to1_16_4.Protocol1_17To1_16_4;
|
||||
import com.viaversion.viabackwards.protocol.v1_17to1_16_4.data.MapColorMappings1_16_4;
|
||||
import com.viaversion.viabackwards.protocol.v1_17_1to1_17.Protocol1_17_1To1_17;
|
||||
import com.viaversion.viabackwards.protocol.v1_17_1to1_17.storage.InventoryStateIds;
|
||||
import com.viaversion.viabackwards.protocol.v1_17_1to1_17.storage.ProtocolStorables1_17_1;
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
import com.viaversion.viabackwards.protocol.v1_17to1_16_4.storage.PlayerLastCursorItem;
|
||||
import com.viaversion.viabackwards.protocol.v1_17to1_16_4.storage.ProtocolStorables1_17;
|
||||
import com.viaversion.viaversion.api.data.entity.EntityTracker;
|
||||
import com.viaversion.viaversion.api.minecraft.BlockChangeRecord;
|
||||
import com.viaversion.viaversion.api.minecraft.chunks.Chunk;
|
||||
@@ -99,13 +103,15 @@ public final class BlockItemPacketRewriter1_17 extends BackwardsItemRewriter<Cli
|
||||
// that we can't easily predict. Force a state ID mismatch so the server
|
||||
// sends a full inventory resync instead of individual slot corrections.
|
||||
if (mode != 0) {
|
||||
InventoryStateIds stateIds = wrapper.user().get(InventoryStateIds.class);
|
||||
ProtocolStorables1_17_1 storables1_17_1 = wrapper.user().storables(Via.getManager().getProtocolManager().getProtocol(Protocol1_17_1To1_17.class));
|
||||
InventoryStateIds stateIds = storables1_17_1.inventoryStateIds();
|
||||
if (stateIds != null) {
|
||||
stateIds.setStateId(wrapper.get(Types.BYTE, 0), -1);
|
||||
}
|
||||
}
|
||||
|
||||
PlayerLastCursorItem state = wrapper.user().get(PlayerLastCursorItem.class);
|
||||
ProtocolStorables1_17 storables = wrapper.user().storables(protocol);
|
||||
PlayerLastCursorItem state = storables.playerLastCursorItem();
|
||||
if (mode == 0 && button == 0 && clicked != null) {
|
||||
// Left click PICKUP
|
||||
// Carried item will (usually) be the entire clicked stack
|
||||
@@ -154,7 +160,8 @@ public final class BlockItemPacketRewriter1_17 extends BackwardsItemRewriter<Cli
|
||||
// carried item, and the server will helpfully send this packet allowing us
|
||||
// to update the internal state. This is necessary for fixing multiple sequential
|
||||
// click drag actions without intermittent pickup actions.
|
||||
wrapper.user().get(PlayerLastCursorItem.class).setLastCursorItem(carried);
|
||||
ProtocolStorables1_17 storables = wrapper.user().storables(protocol);
|
||||
storables.playerLastCursorItem().setLastCursorItem(carried);
|
||||
}
|
||||
|
||||
wrapper.write(Types.ITEM1_13_2, handleItemToClient(wrapper.user(), carried));
|
||||
@@ -228,7 +235,7 @@ public final class BlockItemPacketRewriter1_17 extends BackwardsItemRewriter<Cli
|
||||
map(Types.VAR_INT); // Z
|
||||
map(Types.BOOLEAN); // Trust edges
|
||||
handler(wrapper -> {
|
||||
EntityTracker tracker = wrapper.user().getEntityTracker(Protocol1_17To1_16_4.class);
|
||||
EntityTracker tracker = wrapper.user().getEntityTracker(protocol);
|
||||
int startFromSection = Math.max(0, -(tracker.currentMinY() >> 4));
|
||||
|
||||
long[] skyLightMask = wrapper.read(Types.LONG_ARRAY_PRIMITIVE);
|
||||
@@ -344,7 +351,7 @@ public final class BlockItemPacketRewriter1_17 extends BackwardsItemRewriter<Cli
|
||||
});
|
||||
|
||||
protocol.registerClientbound(ClientboundPackets1_17.LEVEL_CHUNK, wrapper -> {
|
||||
EntityTracker tracker = wrapper.user().getEntityTracker(Protocol1_17To1_16_4.class);
|
||||
EntityTracker tracker = wrapper.user().getEntityTracker(protocol);
|
||||
int currentWorldSectionHeight = tracker.currentWorldSectionHeight();
|
||||
|
||||
Chunk chunk = wrapper.read(new ChunkType1_17(currentWorldSectionHeight));
|
||||
|
||||
+1
-2
@@ -17,10 +17,9 @@
|
||||
*/
|
||||
package com.viaversion.viabackwards.protocol.v1_17to1_16_4.storage;
|
||||
|
||||
import com.viaversion.viaversion.api.connection.StorableObject;
|
||||
import com.viaversion.viaversion.api.minecraft.item.Item;
|
||||
|
||||
public class PlayerLastCursorItem implements StorableObject {
|
||||
public class PlayerLastCursorItem {
|
||||
private Item lastCursorItem;
|
||||
|
||||
public Item getLastCursorItem() {
|
||||
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
|
||||
* Copyright (C) 2016-2026 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_17to1_16_4.storage;
|
||||
|
||||
import com.viaversion.viaversion.connection.ProtocolStorablesBase;
|
||||
|
||||
public final class ProtocolStorables1_17 extends ProtocolStorablesBase {
|
||||
|
||||
private final PlayerLastCursorItem playerLastCursorItem = new PlayerLastCursorItem();
|
||||
|
||||
public PlayerLastCursorItem playerLastCursorItem() {
|
||||
return playerLastCursorItem;
|
||||
}
|
||||
}
|
||||
+2
-1
@@ -54,6 +54,7 @@ import com.viaversion.viaversion.protocols.v1_19to1_19_1.packet.ServerboundPacke
|
||||
import com.viaversion.viaversion.rewriter.text.ComponentRewriterBase;
|
||||
import com.viaversion.viaversion.util.CipherUtil;
|
||||
import com.viaversion.viaversion.util.ComponentUtil;
|
||||
import com.viaversion.viaversion.util.Limit;
|
||||
import com.viaversion.viaversion.util.Pair;
|
||||
import com.viaversion.viaversion.util.TagUtil;
|
||||
import java.security.SignatureException;
|
||||
@@ -230,7 +231,7 @@ public final class Protocol1_19_1To1_19 extends BackwardsProtocol<ClientboundPac
|
||||
final SignableCommandArgumentsProvider argumentsProvider = Via.getManager().getProviders().get(SignableCommandArgumentsProvider.class);
|
||||
|
||||
if (chatSession != null && argumentsProvider != null) {
|
||||
final int signatures = wrapper.read(Types.VAR_INT);
|
||||
final int signatures = Limit.max(wrapper.read(Types.VAR_INT), 8);
|
||||
for (int i = 0; i < signatures; i++) {
|
||||
wrapper.read(Types.STRING); // Argument name
|
||||
wrapper.read(Types.BYTE_ARRAY_PRIMITIVE); // Signature
|
||||
|
||||
+7
-3
@@ -41,7 +41,9 @@ import com.viaversion.viaversion.api.minecraft.signature.storage.ChatSession1_19
|
||||
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
|
||||
import com.viaversion.viaversion.api.protocol.packet.State;
|
||||
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
|
||||
import com.viaversion.viaversion.api.type.Type;
|
||||
import com.viaversion.viaversion.api.type.Types;
|
||||
import com.viaversion.viaversion.api.type.types.ArrayType;
|
||||
import com.viaversion.viaversion.api.type.types.BitSetType;
|
||||
import com.viaversion.viaversion.api.type.types.ByteArrayType;
|
||||
import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_18;
|
||||
@@ -61,6 +63,7 @@ import com.viaversion.viaversion.rewriter.TagRewriter;
|
||||
import com.viaversion.viaversion.rewriter.text.ComponentRewriterBase;
|
||||
import com.viaversion.viaversion.util.CipherUtil;
|
||||
import com.viaversion.viaversion.util.ComponentUtil;
|
||||
import com.viaversion.viaversion.util.Limit;
|
||||
import com.viaversion.viaversion.util.Pair;
|
||||
import java.security.SignatureException;
|
||||
import java.util.BitSet;
|
||||
@@ -70,6 +73,7 @@ import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
public final class Protocol1_19_3To1_19_1 extends BackwardsProtocol<ClientboundPackets1_19_3, ClientboundPackets1_19_1, ServerboundPackets1_19_3, ServerboundPackets1_19_1> {
|
||||
|
||||
public static final BackwardsMappingData MAPPINGS = new BackwardsMappingData("1.19.3", "1.19", Protocol1_19_1To1_19_3.class);
|
||||
private static final Type<PlayerMessageSignature[]> LAST_SEEN_MESSAGES_TYPE = new ArrayType<>(Types.PLAYER_MESSAGE_SIGNATURE, 5);
|
||||
private final EntityPacketRewriter1_19_3 entityRewriter = new EntityPacketRewriter1_19_3(this);
|
||||
private final BlockItemPacketRewriter1_19_3 itemRewriter = new BlockItemPacketRewriter1_19_3(this);
|
||||
private final ParticleRewriter<ClientboundPackets1_19_3> particleRewriter = new ParticleRewriter<>(this);
|
||||
@@ -207,7 +211,7 @@ public final class Protocol1_19_3To1_19_1 extends BackwardsProtocol<ClientboundP
|
||||
map(Types.LONG); // Salt
|
||||
read(Types.BYTE_ARRAY_PRIMITIVE); // Signature
|
||||
read(Types.BOOLEAN); // Signed preview
|
||||
read(Types.PLAYER_MESSAGE_SIGNATURE_ARRAY); // Last seen messages
|
||||
read(LAST_SEEN_MESSAGES_TYPE); // Last seen messages
|
||||
read(Types.OPTIONAL_PLAYER_MESSAGE_SIGNATURE); // Last received message
|
||||
handler(wrapper -> {
|
||||
final ChatSession1_19_3 chatSession = wrapper.user().get(ChatSession1_19_3.class);
|
||||
@@ -250,7 +254,7 @@ public final class Protocol1_19_3To1_19_1 extends BackwardsProtocol<ClientboundP
|
||||
final long timestamp = wrapper.get(Types.LONG, 0);
|
||||
final long salt = wrapper.get(Types.LONG, 1);
|
||||
|
||||
final int signatures = wrapper.read(Types.VAR_INT);
|
||||
final int signatures = Limit.max(wrapper.read(Types.VAR_INT), 8);
|
||||
for (int i = 0; i < signatures; i++) {
|
||||
wrapper.read(Types.STRING); // Name
|
||||
wrapper.read(Types.BYTE_ARRAY_PRIMITIVE); // Signature
|
||||
@@ -282,7 +286,7 @@ public final class Protocol1_19_3To1_19_1 extends BackwardsProtocol<ClientboundP
|
||||
wrapper.write(Types.VAR_INT, offset);
|
||||
wrapper.write(new BitSetType(20), acknowledged);
|
||||
});
|
||||
read(Types.PLAYER_MESSAGE_SIGNATURE_ARRAY); // Last seen messages
|
||||
read(LAST_SEEN_MESSAGES_TYPE); // Last seen messages
|
||||
read(Types.OPTIONAL_PLAYER_MESSAGE_SIGNATURE); // Last received message
|
||||
}
|
||||
});
|
||||
|
||||
+1
-9
@@ -24,21 +24,14 @@ import com.viaversion.viabackwards.protocol.v1_19to1_18_2.Protocol1_19To1_18_2;
|
||||
import com.viaversion.viabackwards.protocol.v1_19to1_18_2.storage.LastDeathPosition;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.data.ParticleMappings;
|
||||
import com.viaversion.viaversion.api.data.entity.EntityTracker;
|
||||
import com.viaversion.viaversion.api.minecraft.GlobalBlockPosition;
|
||||
import com.viaversion.viaversion.api.minecraft.chunks.Chunk;
|
||||
import com.viaversion.viaversion.api.minecraft.chunks.ChunkSection;
|
||||
import com.viaversion.viaversion.api.minecraft.chunks.DataPalette;
|
||||
import com.viaversion.viaversion.api.minecraft.chunks.PaletteType;
|
||||
import com.viaversion.viaversion.api.minecraft.item.Item;
|
||||
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_18;
|
||||
import com.viaversion.viaversion.protocols.v1_16_4to1_17.packet.ServerboundPackets1_17;
|
||||
import com.viaversion.viaversion.protocols.v1_18_2to1_19.packet.ClientboundPackets1_19;
|
||||
import com.viaversion.viaversion.rewriter.RecipeRewriter;
|
||||
import com.viaversion.viaversion.util.MathUtil;
|
||||
|
||||
public final class BlockItemPacketRewriter1_19 extends BackwardsItemRewriter<ClientboundPackets1_19, ServerboundPackets1_17, Protocol1_19To1_18_2> {
|
||||
|
||||
@@ -187,6 +180,7 @@ public final class BlockItemPacketRewriter1_19 extends BackwardsItemRewriter<Cli
|
||||
|
||||
final int identifier = item.identifier();
|
||||
item = super.handleItemToClient(connection, item);
|
||||
enchantmentRewriter.handleToClient(item);
|
||||
|
||||
if (identifier != 834) {
|
||||
return item;
|
||||
@@ -205,8 +199,6 @@ public final class BlockItemPacketRewriter1_19 extends BackwardsItemRewriter<Cli
|
||||
lodestonePosTag.putInt("X", position.x());
|
||||
lodestonePosTag.putInt("Y", position.y());
|
||||
lodestonePosTag.putInt("Z", position.z());
|
||||
|
||||
enchantmentRewriter.handleToClient(item);
|
||||
return item;
|
||||
}
|
||||
|
||||
|
||||
+67
-14
@@ -49,12 +49,6 @@ import com.viaversion.viaversion.util.TagUtil;
|
||||
|
||||
public final class EntityPacketRewriter1_19 extends EntityRewriter<ClientboundPackets1_19, Protocol1_19To1_18_2> {
|
||||
|
||||
private static final IntSet WIDE_PAINTINGS = IntOpenHashSet.of(
|
||||
7, 8, 9, 10, 11,
|
||||
14, 15, 16, 17, 18, 19, 20,
|
||||
21, 22, 23, 24, 25
|
||||
);
|
||||
|
||||
public EntityPacketRewriter1_19(final Protocol1_19To1_18_2 protocol) {
|
||||
super(protocol);
|
||||
}
|
||||
@@ -124,17 +118,68 @@ public final class EntityPacketRewriter1_19 extends EntityRewriter<ClientboundPa
|
||||
|
||||
final TrackedEntity entity = tracker(wrapper.user()).entity(entityId);
|
||||
final StoredPainting storedPainting = entity != null ? entity.get(StoredPainting.class) : null;
|
||||
// Presumably there is a more correct way of fixing this? Only north and east looking paintings with a width of >1 seem to be extra special
|
||||
if (storedPainting != null && (storedPainting.direction() == 2 || storedPainting.direction() == 3)
|
||||
&& WIDE_PAINTINGS.contains(storedPainting.type())) {
|
||||
wrapper.write(Types.DOUBLE, storedPainting.direction() == 2 ? x : x + 1);
|
||||
wrapper.write(Types.DOUBLE, y + 1);
|
||||
wrapper.write(Types.DOUBLE, storedPainting.direction() == 3 ? z : z + 1);
|
||||
} else {
|
||||
|
||||
if (storedPainting == null) {
|
||||
wrapper.write(Types.DOUBLE, x + 1);
|
||||
wrapper.write(Types.DOUBLE, y + 1);
|
||||
wrapper.write(Types.DOUBLE, z + 1);
|
||||
return;
|
||||
}
|
||||
|
||||
// In 1.18 and below, the teleport position is the painting entity's position.
|
||||
// In 1.19+, it is the block position the painting is attached to.
|
||||
// The game calculates the entity's position as follows.
|
||||
|
||||
// See PaintingVariants in 1.19
|
||||
double width = 0, height = 0;
|
||||
int type = storedPainting.type();
|
||||
if (type <= 6) {
|
||||
width = 16;
|
||||
height = 16;
|
||||
} else if (type <= 11) {
|
||||
width = 32;
|
||||
height = 16;
|
||||
} else if (type <= 13) {
|
||||
width = 16;
|
||||
height = 32;
|
||||
} else if (type <= 19 || (type >= 25 && type <= 28)) {
|
||||
width = 32;
|
||||
height = 32;
|
||||
} else if (type == 20) {
|
||||
width = 64;
|
||||
height = 32;
|
||||
} else if (type <= 23) {
|
||||
width = 64;
|
||||
height = 64;
|
||||
} else if (type == 24 || type == 29) {
|
||||
width = 64;
|
||||
height = 48;
|
||||
}
|
||||
|
||||
// See HangingEntity#recalculateBoundingBox
|
||||
double resX = x + 0.5, resY = y + 0.5, resZ = z + 0.5;
|
||||
final double againstWall = -0.46875;
|
||||
switch (storedPainting.direction()) {
|
||||
case 2 -> resZ -= againstWall; // North -z
|
||||
case 0 -> resZ += againstWall; // South +z
|
||||
case 1 -> resX -= againstWall; // West -x
|
||||
case 3 -> resX += againstWall; // East +x
|
||||
}
|
||||
|
||||
// Counter-clockwise
|
||||
final double horizontalOffset = width % 32 == 0 ? 0.5 : 0.0;
|
||||
final double verticalOffset = height % 32 == 0 ? 0.5 : 0.0;
|
||||
resY += verticalOffset;
|
||||
switch (storedPainting.direction()) {
|
||||
case 3 -> resZ -= horizontalOffset; // East -> North -z
|
||||
case 1 -> resZ += horizontalOffset; // West -> South +z
|
||||
case 2 -> resX -= horizontalOffset; // North -> West -x
|
||||
case 0 -> resX += horizontalOffset; // South -> East +x
|
||||
}
|
||||
|
||||
wrapper.write(Types.DOUBLE, resX);
|
||||
wrapper.write(Types.DOUBLE, resY);
|
||||
wrapper.write(Types.DOUBLE, resZ);
|
||||
});
|
||||
|
||||
protocol.registerClientbound(ClientboundPackets1_19.UPDATE_MOB_EFFECT, new PacketHandlers() {
|
||||
@@ -364,8 +409,16 @@ public final class EntityPacketRewriter1_19 extends EntityRewriter<ClientboundPa
|
||||
final TrackedEntity entity = tracker(event.user()).entity(event.entityId());
|
||||
final StoredPainting storedPainting = entity != null ? entity.get(StoredPainting.class) : null;
|
||||
if (storedPainting != null) {
|
||||
final int type = data.value();
|
||||
int type = data.value();
|
||||
storedPainting.setType(type);
|
||||
type = switch (type) {
|
||||
case 29 -> 25; // kong painting changed ID
|
||||
case 25 -> 19; // earth -> wither
|
||||
case 26 -> 16; // wind -> stage
|
||||
case 27 -> 18; // water -> skull_and_roses
|
||||
case 28 -> 14; // fire -> match
|
||||
default -> type;
|
||||
};
|
||||
|
||||
final PacketWrapper packet = PacketWrapper.create(ClientboundPackets1_18.ADD_PAINTING, event.user());
|
||||
packet.write(Types.VAR_INT, storedPainting.entityId());
|
||||
|
||||
+15
-11
@@ -79,26 +79,30 @@ public final class EntityPacketRewriter1_20_2 extends EntityRewriter<Clientbound
|
||||
final byte pitch = wrapper.read(Types.BYTE);
|
||||
wrapper.passthrough(Types.BYTE); // Yaw
|
||||
wrapper.write(Types.BYTE, pitch);
|
||||
wrapper.read(Types.BYTE); // Head yaw
|
||||
final byte headYaw = wrapper.read(Types.BYTE); // Head yaw
|
||||
wrapper.read(Types.VAR_INT); // Data
|
||||
|
||||
final short velocityX = wrapper.read(Types.SHORT);
|
||||
final short velocityY = wrapper.read(Types.SHORT);
|
||||
final short velocityZ = wrapper.read(Types.SHORT);
|
||||
if (velocityX == 0 && velocityY == 0 && velocityZ == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Follow up with velocity packet
|
||||
wrapper.send(Protocol1_20_2To1_20.class);
|
||||
wrapper.cancel();
|
||||
|
||||
final PacketWrapper velocityPacket = wrapper.create(ClientboundPackets1_19_4.SET_ENTITY_MOTION);
|
||||
velocityPacket.write(Types.VAR_INT, entityId);
|
||||
velocityPacket.write(Types.SHORT, velocityX);
|
||||
velocityPacket.write(Types.SHORT, velocityY);
|
||||
velocityPacket.write(Types.SHORT, velocityZ);
|
||||
velocityPacket.send(Protocol1_20_2To1_20.class);
|
||||
final PacketWrapper headRotation = wrapper.create(ClientboundPackets1_19_4.ROTATE_HEAD);
|
||||
headRotation.write(Types.VAR_INT, entityId);
|
||||
headRotation.write(Types.BYTE, headYaw);
|
||||
headRotation.send(Protocol1_20_2To1_20.class);
|
||||
|
||||
// Follow up with velocity packet
|
||||
if (velocityX != 0 || velocityY != 0 || velocityZ != 0) {
|
||||
final PacketWrapper velocityPacket = wrapper.create(ClientboundPackets1_19_4.SET_ENTITY_MOTION);
|
||||
velocityPacket.write(Types.VAR_INT, entityId);
|
||||
velocityPacket.write(Types.SHORT, velocityX);
|
||||
velocityPacket.write(Types.SHORT, velocityY);
|
||||
velocityPacket.write(Types.SHORT, velocityZ);
|
||||
velocityPacket.send(Protocol1_20_2To1_20.class);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
+1
-1
@@ -84,7 +84,7 @@ public final class Protocol1_20_5To1_20_3 extends BackwardsProtocol<ClientboundP
|
||||
protected void registerPackets() {
|
||||
super.registerPackets();
|
||||
|
||||
tagRewriter.addEmptyTag(RegistryType.ITEM, "minecraft:axolotl_tempt_items");
|
||||
tagRewriter.renameTag(RegistryType.ITEM, "axolotl_food", "axolotl_tempt_items");
|
||||
replaceClientbound(ClientboundConfigurationPackets1_20_5.UPDATE_TAGS, wrapper -> {
|
||||
// Send off registry data first, needed for tags
|
||||
sendRegistryData(wrapper.user());
|
||||
|
||||
+1
-1
@@ -180,7 +180,7 @@ public final class BlockItemPacketRewriter1_20_5 extends BackwardsFullStructured
|
||||
final int icons = wrapper.passthrough(Types.VAR_INT);
|
||||
for (int i = 0; i < icons; i++) {
|
||||
final int decorationType = wrapper.read(Types.VAR_INT);
|
||||
wrapper.write(Types.VAR_INT, decorationType == 34 ? 32 : decorationType); // Trial champer to jungle temple
|
||||
wrapper.write(Types.VAR_INT, decorationType == 34 ? 32 : decorationType); // Trial chamber to jungle temple
|
||||
wrapper.passthrough(Types.BYTE); // X
|
||||
wrapper.passthrough(Types.BYTE); // Y
|
||||
wrapper.passthrough(Types.BYTE); // Rotation
|
||||
|
||||
+11
-5
@@ -31,7 +31,7 @@ import com.viaversion.viabackwards.api.rewriters.text.NBTComponentRewriter;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_11to1_21_9.rewriter.BlockItemPacketRewriter1_21_11;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_11to1_21_9.rewriter.ComponentRewriter1_21_11;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_11to1_21_9.rewriter.EntityPacketRewriter1_21_11;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_11to1_21_9.storage.GameTimeStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_11to1_21_9.storage.ProtocolStorables1_21_11;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.data.FullMappings;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_11;
|
||||
@@ -56,6 +56,7 @@ import com.viaversion.viaversion.rewriter.BlockRewriter;
|
||||
import com.viaversion.viaversion.rewriter.ParticleRewriter;
|
||||
import com.viaversion.viaversion.rewriter.RecipeDisplayRewriter;
|
||||
import com.viaversion.viaversion.rewriter.TagRewriter;
|
||||
import com.viaversion.viaversion.rewriter.block.BlockRewriter1_21_5;
|
||||
import com.viaversion.viaversion.util.Key;
|
||||
import com.viaversion.viaversion.util.TagUtil;
|
||||
import java.util.function.Function;
|
||||
@@ -75,7 +76,7 @@ public final class Protocol1_21_11To1_21_9 extends BackwardsProtocol<Clientbound
|
||||
private final NBTComponentRewriter<ClientboundPacket1_21_11> translatableRewriter = new ComponentRewriter1_21_11(this);
|
||||
private final TagRewriter<ClientboundPacket1_21_11> tagRewriter = new TagRewriter<>(this);
|
||||
private final RecipeDisplayRewriter<ClientboundPacket1_21_11> recipeRewriter = new RecipeDisplayRewriter1_21_5<>(this);
|
||||
private final BlockRewriter<ClientboundPacket1_21_11> blockRewriter = BlockRewriter.for1_20_2(this, ChunkType1_21_5::new);
|
||||
private final BlockRewriter<ClientboundPacket1_21_11> blockRewriter = new BlockRewriter1_21_5<>(this, ChunkType1_21_5::new);
|
||||
private final BackwardsRegistryRewriter registryDataRewriter = new BackwardsRegistryRewriter(this) {
|
||||
@Override
|
||||
protected void updateType(final CompoundTag tag, final String key, final FullMappings mappings) {
|
||||
@@ -131,11 +132,12 @@ public final class Protocol1_21_11To1_21_9 extends BackwardsProtocol<Clientbound
|
||||
}
|
||||
|
||||
final ByteTag trueTag = new ByteTag((byte) 1);
|
||||
final ByteTag falseTag = new ByteTag((byte) 0);
|
||||
final CompoundTag attributes = tag.getCompoundTag("attributes");
|
||||
moveAttribute(tag, attributes, "visual/cloud_height", "cloud_height", Function.identity(), null);
|
||||
moveAttribute(tag, attributes, "gameplay/can_start_raid", "has_raids", Function.identity(), trueTag);
|
||||
moveAttribute(tag, attributes, "gameplay/piglins_zombify", "piglin_safe", attributeTag -> ((NumberTag) attributeTag).asBoolean() ? ByteTag.ZERO : trueTag, ByteTag.ZERO);
|
||||
moveAttribute(tag, attributes, "gameplay/respawn_anchor_works", "respawn_anchor_works", Function.identity(), trueTag);
|
||||
moveAttribute(tag, attributes, "gameplay/respawn_anchor_works", "respawn_anchor_works", Function.identity(), falseTag);
|
||||
moveAttribute(tag, attributes, "gameplay/bed_rule", "bed_works", attributeTag -> {
|
||||
final CompoundTag bedRule = (CompoundTag) attributeTag;
|
||||
return bedRule.getBoolean("can_sleep") || bedRule.getBoolean("can_set_spawn") ? trueTag : ByteTag.ZERO;
|
||||
@@ -242,8 +244,12 @@ public final class Protocol1_21_11To1_21_9 extends BackwardsProtocol<Clientbound
|
||||
@Override
|
||||
public void init(final UserConnection connection) {
|
||||
addEntityTracker(connection, new EntityTrackerBase(connection, EntityTypes1_21_11.PLAYER));
|
||||
connection.addItemHasher(this.getClass(), new ItemHasherBase(this, connection));
|
||||
connection.put(new GameTimeStorage());
|
||||
connection.storables(this).setItemHasher(new ItemHasherBase(this, connection));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProtocolStorables1_21_11 createStorables() {
|
||||
return new ProtocolStorables1_21_11();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+14
-13
@@ -23,7 +23,7 @@ import com.viaversion.nbt.tag.StringTag;
|
||||
import com.viaversion.nbt.tag.Tag;
|
||||
import com.viaversion.viabackwards.api.rewriters.BackwardsStructuredItemRewriter;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_11to1_21_9.Protocol1_21_11To1_21_9;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_11to1_21_9.storage.GameTimeStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_11to1_21_9.storage.ProtocolStorables1_21_11;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.minecraft.Holder;
|
||||
import com.viaversion.viaversion.api.minecraft.SoundEvent;
|
||||
@@ -31,7 +31,6 @@ 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.AttackRange;
|
||||
import com.viaversion.viaversion.api.minecraft.item.data.DamageType;
|
||||
import com.viaversion.viaversion.api.minecraft.item.data.KineticWeapon;
|
||||
import com.viaversion.viaversion.api.minecraft.item.data.PiercingWeapon;
|
||||
import com.viaversion.viaversion.api.minecraft.item.data.SwingAnimation;
|
||||
@@ -69,10 +68,12 @@ public final class BlockItemPacketRewriter1_21_11 extends BackwardsStructuredIte
|
||||
});
|
||||
protocol.registerClientbound(ClientboundPackets1_21_11.SET_TIME, wrapper -> {
|
||||
final long gameTime = wrapper.passthrough(Types.LONG);
|
||||
wrapper.user().get(GameTimeStorage.class).setGameTime(gameTime);
|
||||
final ProtocolStorables1_21_11 storables = wrapper.user().storables(protocol);
|
||||
storables.gameTimeStorage().setGameTime(gameTime);
|
||||
});
|
||||
protocol.registerServerbound(ServerboundPackets1_21_6.CLIENT_TICK_END, wrapper -> {
|
||||
wrapper.user().get(GameTimeStorage.class).incrementGameTime();
|
||||
final ProtocolStorables1_21_11 storables = wrapper.user().storables(protocol);
|
||||
storables.gameTimeStorage().incrementGameTime();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -107,14 +108,14 @@ public final class BlockItemPacketRewriter1_21_11 extends BackwardsStructuredIte
|
||||
if (kineticTag != null) {
|
||||
final int contactCooldownTicks = kineticTag.getInt("contact_cooldown_ticks");
|
||||
final int delayTicks = kineticTag.getInt("delay_ticks");
|
||||
final KineticWeapon.Condition damageConditions = loadDamageCondition(kineticTag, "damage_conditions");
|
||||
final KineticWeapon.Condition dismountConditions = loadDamageCondition(kineticTag, "dismount_conditions");
|
||||
final KineticWeapon.Condition knockbackConditions = loadDamageCondition(kineticTag, "knockback_conditions");
|
||||
final KineticWeapon.Condition damageConditions = loadDamageCondition(kineticTag, "damage_conditions");
|
||||
final float forwardMovement = kineticTag.getFloat("forward_movement");
|
||||
final float damageMultiplier = kineticTag.getFloat("damage_multiplier");
|
||||
final Holder<SoundEvent> sound = kineticTag.contains("sound") ? restoreSoundEventHolder(kineticTag, "sound") : null;
|
||||
final Holder<SoundEvent> hitSound = kineticTag.contains("hit_sound") ? restoreSoundEventHolder(kineticTag, "hit_sound") : null;
|
||||
container.set(StructuredDataKey.KINETIC_WEAPON, new KineticWeapon(contactCooldownTicks, delayTicks, damageConditions, dismountConditions, knockbackConditions, forwardMovement, damageMultiplier, sound, hitSound));
|
||||
container.set(StructuredDataKey.KINETIC_WEAPON, new KineticWeapon(contactCooldownTicks, delayTicks, dismountConditions, knockbackConditions, damageConditions, forwardMovement, damageMultiplier, sound, hitSound));
|
||||
}
|
||||
|
||||
final CompoundTag piercingTag = backupTag.getCompoundTag("piercing_weapon");
|
||||
@@ -129,9 +130,9 @@ public final class BlockItemPacketRewriter1_21_11 extends BackwardsStructuredIte
|
||||
final Tag damageTypeId = backupTag.get("damage_type_id");
|
||||
if (damageTypeId != null) {
|
||||
if (damageTypeId instanceof StringTag stringTag) {
|
||||
container.set(StructuredDataKey.DAMAGE_TYPE1_21_11, new DamageType(Either.right(stringTag.getValue())));
|
||||
container.set(StructuredDataKey.DAMAGE_TYPE1_21_11, Either.right(stringTag.getValue()));
|
||||
} else if (damageTypeId instanceof IntTag intTag) {
|
||||
container.set(StructuredDataKey.DAMAGE_TYPE1_21_11, new DamageType(Either.left(intTag.asInt())));
|
||||
container.set(StructuredDataKey.DAMAGE_TYPE1_21_11, Either.left(intTag.asInt()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -195,9 +196,9 @@ public final class BlockItemPacketRewriter1_21_11 extends BackwardsStructuredIte
|
||||
final CompoundTag kineticTag = new CompoundTag();
|
||||
kineticTag.putInt("contact_cooldown_ticks", kineticWeapon.contactCooldownTicks());
|
||||
kineticTag.putInt("delay_ticks", kineticWeapon.delayTicks());
|
||||
saveDamageCondition(kineticTag, "damage_conditions", kineticWeapon.damageConditions());
|
||||
saveDamageCondition(kineticTag, "dismount_conditions", kineticWeapon.dismountConditions());
|
||||
saveDamageCondition(kineticTag, "knockback_conditions", kineticWeapon.knockbackConditions());
|
||||
saveDamageCondition(kineticTag, "damage_conditions", kineticWeapon.damageConditions());
|
||||
kineticTag.putFloat("forward_movement", kineticWeapon.forwardMovement());
|
||||
kineticTag.putFloat("damage_multiplier", kineticWeapon.damageMultiplier());
|
||||
if (kineticWeapon.sound() != null) {
|
||||
@@ -223,12 +224,12 @@ public final class BlockItemPacketRewriter1_21_11 extends BackwardsStructuredIte
|
||||
backupTag.put("piercing_weapon", piercingTag);
|
||||
}
|
||||
|
||||
final DamageType damageType = dataContainer.get(StructuredDataKey.DAMAGE_TYPE1_21_11);
|
||||
final Either<Integer, String> damageType = dataContainer.get(StructuredDataKey.DAMAGE_TYPE1_21_11);
|
||||
if (damageType != null) {
|
||||
if (damageType.id().isLeft()) {
|
||||
backupTag.putInt("damage_type_id", damageType.id().left());
|
||||
if (damageType.isLeft()) {
|
||||
backupTag.putInt("damage_type_id", damageType.left());
|
||||
} else {
|
||||
backupTag.putString("damage_type_id", damageType.id().right());
|
||||
backupTag.putString("damage_type_id", damageType.right());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+12
@@ -18,11 +18,13 @@
|
||||
package com.viaversion.viabackwards.protocol.v1_21_11to1_21_9.rewriter;
|
||||
|
||||
import com.viaversion.nbt.tag.CompoundTag;
|
||||
import com.viaversion.nbt.tag.StringTag;
|
||||
import com.viaversion.viabackwards.api.BackwardsProtocol;
|
||||
import com.viaversion.viabackwards.api.rewriters.text.NBTComponentRewriter;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.minecraft.data.StructuredDataKey;
|
||||
import com.viaversion.viaversion.protocols.v1_21_9to1_21_11.packet.ClientboundPacket1_21_11;
|
||||
import com.viaversion.viaversion.util.Key;
|
||||
|
||||
public final class ComponentRewriter1_21_11 extends NBTComponentRewriter<ClientboundPacket1_21_11> {
|
||||
|
||||
@@ -30,6 +32,16 @@ public final class ComponentRewriter1_21_11 extends NBTComponentRewriter<Clientb
|
||||
super(protocol);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void processCompoundTag(final UserConnection connection, final CompoundTag tag) {
|
||||
super.processCompoundTag(connection, tag);
|
||||
|
||||
final StringTag atlas = tag.getStringTag("atlas");
|
||||
if (atlas != null && Key.stripMinecraftNamespace(atlas.getValue()).equals("items")) {
|
||||
atlas.setValue("blocks");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void handleShowItem(final UserConnection connection, final CompoundTag itemTag, final CompoundTag componentsTag) {
|
||||
super.handleShowItem(connection, itemTag, componentsTag);
|
||||
|
||||
+3
-2
@@ -19,7 +19,7 @@ package com.viaversion.viabackwards.protocol.v1_21_11to1_21_9.rewriter;
|
||||
|
||||
import com.viaversion.viabackwards.api.rewriters.EntityRewriter;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_11to1_21_9.Protocol1_21_11To1_21_9;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_11to1_21_9.storage.GameTimeStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_11to1_21_9.storage.ProtocolStorables1_21_11;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_11;
|
||||
import com.viaversion.viaversion.api.minecraft.entitydata.EntityData;
|
||||
@@ -92,7 +92,8 @@ public final class EntityPacketRewriter1_21_11 extends EntityRewriter<Clientboun
|
||||
}
|
||||
|
||||
private void absoluteToRelativeTicks(final EntityDataHandlerEvent event, final EntityData data) {
|
||||
final long currentGameTime = event.user().get(GameTimeStorage.class).gameTime();
|
||||
final ProtocolStorables1_21_11 storables = event.user().storables(protocol);
|
||||
final long currentGameTime = storables.gameTimeStorage().gameTime();
|
||||
final long angerEndTime = data.value();
|
||||
final int angerEndIn = (int) MathUtil.clamp(angerEndTime - currentGameTime, Integer.MIN_VALUE, Integer.MAX_VALUE);
|
||||
data.setTypeAndValue(VersionedTypes.V1_21_9.entityDataTypes.varIntType, Math.max(angerEndIn, 0));
|
||||
|
||||
+1
-3
@@ -17,9 +17,7 @@
|
||||
*/
|
||||
package com.viaversion.viabackwards.protocol.v1_21_11to1_21_9.storage;
|
||||
|
||||
import com.viaversion.viaversion.api.connection.StorableObject;
|
||||
|
||||
public final class GameTimeStorage implements StorableObject {
|
||||
public final class GameTimeStorage {
|
||||
|
||||
private long gameTime;
|
||||
|
||||
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
|
||||
* Copyright (C) 2016-2026 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_11to1_21_9.storage;
|
||||
|
||||
import com.viaversion.viaversion.connection.ProtocolStorablesBase;
|
||||
|
||||
public final class ProtocolStorables1_21_11 extends ProtocolStorablesBase {
|
||||
|
||||
private final GameTimeStorage gameTimeStorage = new GameTimeStorage();
|
||||
|
||||
public GameTimeStorage gameTimeStorage() {
|
||||
return gameTimeStorage;
|
||||
}
|
||||
}
|
||||
+11
-12
@@ -25,11 +25,8 @@ import com.viaversion.viabackwards.protocol.v1_21_2to1_21.rewriter.BlockItemPack
|
||||
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.rewriter.ComponentRewriter1_21_2;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.rewriter.EntityPacketRewriter1_21_2;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.rewriter.ParticleRewriter1_21_2;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.storage.InventoryStateIdStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.storage.ItemTagStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.storage.PlayerStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.storage.BackwardsStorables1_21_2;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.storage.RecipeStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.storage.SignStorage;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_20_5;
|
||||
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
|
||||
@@ -89,8 +86,6 @@ public final class Protocol1_21_2To1_21 extends BackwardsProtocol<ClientboundPac
|
||||
wrapper.write(Types.STRING_ARRAY, ArrayUtil.add(enabledFeatures, "bundle"));
|
||||
});
|
||||
|
||||
cancelClientbound(ClientboundPackets1_21_2.MOVE_MINECART_ALONG_TRACK); // TODO
|
||||
|
||||
registerClientbound(State.LOGIN, ClientboundLoginPackets.LOGIN_FINISHED, wrapper -> {
|
||||
wrapper.passthrough(Types.UUID); // UUID
|
||||
wrapper.passthrough(Types.STRING); // Name
|
||||
@@ -117,7 +112,8 @@ public final class Protocol1_21_2To1_21 extends BackwardsProtocol<ClientboundPac
|
||||
private void storeTags(final PacketWrapper wrapper) {
|
||||
tagRewriter.handleGeneric(wrapper);
|
||||
wrapper.resetReader();
|
||||
wrapper.user().get(ItemTagStorage.class).readItemTags(wrapper);
|
||||
final BackwardsStorables1_21_2 storables = wrapper.user().storables(this);
|
||||
storables.itemTagStorage().readItemTags(wrapper);
|
||||
}
|
||||
|
||||
private void clientInformation(final PacketWrapper wrapper) {
|
||||
@@ -135,11 +131,14 @@ public final class Protocol1_21_2To1_21 extends BackwardsProtocol<ClientboundPac
|
||||
@Override
|
||||
public void init(final UserConnection user) {
|
||||
addEntityTracker(user, new EntityTrackerBase(user, EntityTypes1_20_5.PLAYER));
|
||||
user.put(new InventoryStateIdStorage());
|
||||
user.put(new ItemTagStorage());
|
||||
user.put(new RecipeStorage(this));
|
||||
user.put(new PlayerStorage());
|
||||
user.put(new SignStorage());
|
||||
final BackwardsStorables1_21_2 storables = user.storables(this);
|
||||
storables.setRecipeStorage(new RecipeStorage(this));
|
||||
user.put(storables.playerStorage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public BackwardsStorables1_21_2 createStorables() {
|
||||
return new BackwardsStorables1_21_2();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+114
-35
@@ -24,6 +24,7 @@ import com.viaversion.nbt.tag.ListTag;
|
||||
import com.viaversion.nbt.tag.Tag;
|
||||
import com.viaversion.viabackwards.api.rewriters.BackwardsFullStructuredItemRewriter;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.Protocol1_21_2To1_21;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.storage.BackwardsStorables1_21_2;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.storage.InventoryStateIdStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.storage.RecipeStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.storage.SignStorage;
|
||||
@@ -44,7 +45,7 @@ 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.StructuredItem;
|
||||
import com.viaversion.viaversion.api.minecraft.item.data.Consumable1_21_2;
|
||||
import com.viaversion.viaversion.api.minecraft.item.data.DamageResistant1_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;
|
||||
@@ -52,10 +53,14 @@ 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;
|
||||
import com.viaversion.viaversion.api.minecraft.item.data.ItemModel;
|
||||
import com.viaversion.viaversion.api.minecraft.item.data.PotionContents;
|
||||
import com.viaversion.viaversion.api.minecraft.item.data.PotionEffect;
|
||||
import com.viaversion.viaversion.api.minecraft.item.data.PotionEffectData;
|
||||
import com.viaversion.viaversion.api.minecraft.item.data.Repairable;
|
||||
import com.viaversion.viaversion.api.minecraft.item.data.UseCooldown;
|
||||
import com.viaversion.viaversion.api.minecraft.item.data.consumable.ApplyStatusEffects;
|
||||
import com.viaversion.viaversion.api.minecraft.item.data.consumable.Consumable1_21_2;
|
||||
import com.viaversion.viaversion.api.minecraft.item.data.consumable.ConsumeEffect;
|
||||
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
|
||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
|
||||
import com.viaversion.viaversion.api.type.Types;
|
||||
@@ -91,9 +96,9 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsFullStructured
|
||||
return;
|
||||
}
|
||||
|
||||
final EntityTracker tracker = wrapper.user().getEntityTracker(Protocol1_21_2To1_21.class);
|
||||
final EntityTracker tracker = wrapper.user().getEntityTracker(protocol);
|
||||
|
||||
final SignStorage storage = wrapper.user().get(SignStorage.class);
|
||||
final SignStorage storage = wrapper.user().<BackwardsStorables1_21_2>storables(protocol).signStorage();
|
||||
storage.removeSigns(chunk.getX(), chunk.getZ());
|
||||
|
||||
for (int i = 0; i < chunk.getSections().length; i++) {
|
||||
@@ -125,7 +130,7 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsFullStructured
|
||||
return;
|
||||
}
|
||||
|
||||
final SignStorage storage = wrapper.user().get(SignStorage.class);
|
||||
final SignStorage storage = wrapper.user().<BackwardsStorables1_21_2>storables(protocol).signStorage();
|
||||
storage.removeSign(position);
|
||||
if (signBlockState(mappedBlockId)) {
|
||||
storage.addSign(position);
|
||||
@@ -139,7 +144,7 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsFullStructured
|
||||
final int chunkY = (int) (position << 44 >> 44);
|
||||
final int chunkZ = (int) (position << 22 >> 42);
|
||||
|
||||
final SignStorage signStorage = wrapper.user().get(SignStorage.class);
|
||||
final SignStorage signStorage = wrapper.user().<BackwardsStorables1_21_2>storables(protocol).signStorage();
|
||||
|
||||
final boolean equalToV1_21 = wrapper.user().getProtocolInfo().protocolVersion().equalTo(ProtocolVersion.v1_21);
|
||||
|
||||
@@ -168,7 +173,7 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsFullStructured
|
||||
}
|
||||
|
||||
final BlockPosition position = wrapper.passthrough(Types.BLOCK_POSITION1_14);
|
||||
if (!wrapper.user().get(SignStorage.class).isSign(position)) {
|
||||
if (!wrapper.user().<BackwardsStorables1_21_2>storables(protocol).signStorage().isSign(position)) {
|
||||
wrapper.cancel();
|
||||
}
|
||||
});
|
||||
@@ -187,7 +192,7 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsFullStructured
|
||||
|
||||
protocol.registerClientbound(ClientboundPackets1_21_2.SET_CURSOR_ITEM, ClientboundPackets1_21.CONTAINER_SET_SLOT, wrapper -> {
|
||||
wrapper.write(Types.BYTE, (byte) -1); // Player inventory
|
||||
wrapper.write(Types.VAR_INT, wrapper.user().get(InventoryStateIdStorage.class).stateId()); // State id; re-use the last known one
|
||||
wrapper.write(Types.VAR_INT, wrapper.user().<BackwardsStorables1_21_2>storables(protocol).inventoryStateIdStorage().stateId()); // State id; re-use the last known one
|
||||
wrapper.write(Types.SHORT, (short) -1); // Cursor
|
||||
passthroughClientboundItem(wrapper);
|
||||
});
|
||||
@@ -198,7 +203,7 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsFullStructured
|
||||
final int containerType = wrapper.passthrough(Types.VAR_INT);
|
||||
if (containerType == 21) {
|
||||
// Track smithing table to remove new data
|
||||
wrapper.user().get(InventoryStateIdStorage.class).setSmithingTableOpen(true);
|
||||
wrapper.user().<BackwardsStorables1_21_2>storables(protocol).inventoryStateIdStorage().setSmithingTableOpen(true);
|
||||
}
|
||||
|
||||
protocol.getComponentRewriter().passthroughAndProcess(wrapper);
|
||||
@@ -208,7 +213,7 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsFullStructured
|
||||
varIntToUnsignedByte(wrapper);
|
||||
|
||||
final int stateId = wrapper.passthrough(Types.VAR_INT);
|
||||
wrapper.user().get(InventoryStateIdStorage.class).setStateId(stateId);
|
||||
wrapper.user().<BackwardsStorables1_21_2>storables(protocol).inventoryStateIdStorage().setStateId(stateId);
|
||||
|
||||
final Item[] items = wrapper.read(itemArrayType());
|
||||
wrapper.write(mappedItemArrayType(), items);
|
||||
@@ -218,31 +223,48 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsFullStructured
|
||||
passthroughClientboundItem(wrapper);
|
||||
});
|
||||
protocol.replaceClientbound(ClientboundPackets1_21_2.CONTAINER_SET_SLOT, wrapper -> {
|
||||
varIntToByte(wrapper);
|
||||
final int containerId = wrapper.read(Types.VAR_INT);
|
||||
wrapper.write(Types.BYTE, (byte) containerId);
|
||||
|
||||
final int stateId = wrapper.passthrough(Types.VAR_INT);
|
||||
wrapper.user().get(InventoryStateIdStorage.class).setStateId(stateId);
|
||||
wrapper.user().<BackwardsStorables1_21_2>storables(protocol).inventoryStateIdStorage().setStateId(stateId);
|
||||
|
||||
wrapper.passthrough(Types.SHORT); // Slot id
|
||||
passthroughClientboundItem(wrapper);
|
||||
final short slotId = wrapper.passthrough(Types.SHORT);
|
||||
final Item item = handleItemToClient(wrapper.user(), wrapper.read(itemType()));
|
||||
|
||||
if (containerId == 0 && slotId >= 5 && slotId <= 8) {
|
||||
wrapper.write(mappedItemType(), item.copy());
|
||||
|
||||
// 1.21.2+ servers use set slot packets to update equipment while inside containers, 1.21 only expects
|
||||
// it for hotbar/offhand
|
||||
final EntityTracker tracker = wrapper.user().getEntityTracker(protocol);
|
||||
final PacketWrapper equipment = PacketWrapper.create(ClientboundPackets1_21.SET_EQUIPMENT, wrapper.user());
|
||||
equipment.write(Types.VAR_INT, tracker.clientEntityId());
|
||||
// helmet-boots is 5-8 in container but 5-2 in equipment
|
||||
equipment.write(Types.BYTE, (byte) (10 - slotId));
|
||||
equipment.write(mappedItemType(), item);
|
||||
equipment.send(Protocol1_21_2To1_21.class);
|
||||
} else {
|
||||
wrapper.write(mappedItemType(), item);
|
||||
}
|
||||
});
|
||||
protocol.registerClientbound(ClientboundPackets1_21_2.CONTAINER_SET_DATA, wrapper -> {
|
||||
varIntToUnsignedByte(wrapper);
|
||||
|
||||
if (wrapper.user().get(InventoryStateIdStorage.class).smithingTableOpen()) {
|
||||
if (wrapper.user().<BackwardsStorables1_21_2>storables(protocol).inventoryStateIdStorage().smithingTableOpen()) {
|
||||
// Cancel new data for smithing table
|
||||
wrapper.cancel();
|
||||
}
|
||||
});
|
||||
protocol.registerClientbound(ClientboundPackets1_21_2.CONTAINER_CLOSE, wrapper -> {
|
||||
varIntToUnsignedByte(wrapper);
|
||||
wrapper.user().get(InventoryStateIdStorage.class).setSmithingTableOpen(false);
|
||||
wrapper.user().<BackwardsStorables1_21_2>storables(protocol).inventoryStateIdStorage().setSmithingTableOpen(false);
|
||||
});
|
||||
protocol.registerClientbound(ClientboundPackets1_21_2.SET_HELD_SLOT, ClientboundPackets1_21.SET_CARRIED_ITEM);
|
||||
protocol.registerClientbound(ClientboundPackets1_21_2.HORSE_SCREEN_OPEN, this::varIntToUnsignedByte);
|
||||
protocol.registerServerbound(ServerboundPackets1_20_5.CONTAINER_CLOSE, wrapper -> {
|
||||
byteToVarInt(wrapper);
|
||||
wrapper.user().get(InventoryStateIdStorage.class).setSmithingTableOpen(false);
|
||||
wrapper.user().<BackwardsStorables1_21_2>storables(protocol).inventoryStateIdStorage().setSmithingTableOpen(false);
|
||||
});
|
||||
protocol.replaceServerbound(ServerboundPackets1_20_5.CONTAINER_CLICK, wrapper -> {
|
||||
byteToVarInt(wrapper);
|
||||
@@ -269,7 +291,7 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsFullStructured
|
||||
// Clearing the inventory via the destroy item slot is the only creative action old clients don't
|
||||
// apply locally, but 1.21.2+ servers do not send back the empty contents.
|
||||
// Detect the action by checking for linear slot clears and leave other actions alone.
|
||||
final InventoryStateIdStorage storage = wrapper.user().get(InventoryStateIdStorage.class);
|
||||
final InventoryStateIdStorage storage = wrapper.user().<BackwardsStorables1_21_2>storables(protocol).inventoryStateIdStorage();
|
||||
final boolean empty = Item.isEmpty(item);
|
||||
if (empty && slot == storage.nextClearedSlot()) {
|
||||
if (slot == 45) {
|
||||
@@ -328,7 +350,7 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsFullStructured
|
||||
});
|
||||
|
||||
protocol.registerClientbound(ClientboundPackets1_21_2.RECIPE_BOOK_ADD, null, wrapper -> {
|
||||
final RecipeStorage recipeStorage = wrapper.user().get(RecipeStorage.class);
|
||||
final RecipeStorage recipeStorage = wrapper.user().<BackwardsStorables1_21_2>storables(protocol).recipeStorage();
|
||||
final int size = wrapper.read(Types.VAR_INT);
|
||||
for (int i = 0; i < size; i++) {
|
||||
recipeStorage.readRecipe(wrapper);
|
||||
@@ -343,12 +365,12 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsFullStructured
|
||||
wrapper.cancel();
|
||||
});
|
||||
protocol.registerClientbound(ClientboundPackets1_21_2.RECIPE_BOOK_REMOVE, ClientboundPackets1_21.RECIPE, wrapper -> {
|
||||
final RecipeStorage recipeStorage = wrapper.user().get(RecipeStorage.class);
|
||||
final RecipeStorage recipeStorage = wrapper.user().<BackwardsStorables1_21_2>storables(protocol).recipeStorage();
|
||||
final int[] ids = wrapper.read(Types.VAR_INT_ARRAY_PRIMITIVE);
|
||||
recipeStorage.lockRecipes(wrapper, ids);
|
||||
});
|
||||
protocol.registerClientbound(ClientboundPackets1_21_2.RECIPE_BOOK_SETTINGS, null, wrapper -> {
|
||||
final RecipeStorage recipeStorage = wrapper.user().get(RecipeStorage.class);
|
||||
final RecipeStorage recipeStorage = wrapper.user().<BackwardsStorables1_21_2>storables(protocol).recipeStorage();
|
||||
final boolean[] settings = new boolean[RecipeStorage.RECIPE_BOOK_SETTINGS];
|
||||
for (int i = 0; i < RecipeStorage.RECIPE_BOOK_SETTINGS; i++) {
|
||||
settings[i] = wrapper.read(Types.BOOLEAN);
|
||||
@@ -365,7 +387,7 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsFullStructured
|
||||
wrapper.read(Types.VAR_INT_ARRAY_PRIMITIVE); // Items
|
||||
}
|
||||
|
||||
final RecipeStorage recipeStorage = wrapper.user().get(RecipeStorage.class);
|
||||
final RecipeStorage recipeStorage = wrapper.user().<BackwardsStorables1_21_2>storables(protocol).recipeStorage();
|
||||
recipeStorage.readStoneCutterRecipes(wrapper);
|
||||
|
||||
// Send later with the recipe book init
|
||||
@@ -396,7 +418,8 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsFullStructured
|
||||
}
|
||||
|
||||
private void sendEmptyInventorySlots(final UserConnection connection) {
|
||||
final int stateId = connection.get(InventoryStateIdStorage.class).stateId();
|
||||
final BackwardsStorables1_21_2 storables = connection.storables(protocol);
|
||||
final int stateId = storables.inventoryStateIdStorage().stateId();
|
||||
for (int slot = 1; slot <= 45; slot++) {
|
||||
final PacketWrapper setSlotPacket = PacketWrapper.create(ClientboundPackets1_21.CONTAINER_SET_SLOT, connection);
|
||||
setSlotPacket.write(Types.BYTE, (byte) 0); // Player inventory
|
||||
@@ -539,10 +562,10 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsFullStructured
|
||||
backupTag.putString("tooltip_style", tooltipStyle.original());
|
||||
}
|
||||
|
||||
final DeathProtection deathProtection = data.get(StructuredDataKey.DEATH_PROTECTION);
|
||||
final DeathProtection deathProtection = data.get(StructuredDataKey.DEATH_PROTECTION1_21_2);
|
||||
if (deathProtection != null) {
|
||||
final ListTag<CompoundTag> tag = new ListTag<>(CompoundTag.class);
|
||||
for (final Consumable1_21_2.ConsumeEffect<?> effect : deathProtection.deathEffects()) {
|
||||
for (final ConsumeEffect<?> effect : deathProtection.deathEffects()) {
|
||||
final CompoundTag effectTag = new CompoundTag();
|
||||
convertConsumableEffect(effectTag, effect);
|
||||
tag.add(effectTag);
|
||||
@@ -550,14 +573,42 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsFullStructured
|
||||
backupTag.put("death_protection", tag);
|
||||
}
|
||||
|
||||
final Consumable1_21_2 consumable = data.get(StructuredDataKey.CONSUMABLE1_21_2);
|
||||
if (consumable != null) {
|
||||
final CompoundTag tag = new CompoundTag();
|
||||
tag.putFloat("consume_seconds", consumable.consumeSeconds());
|
||||
tag.putInt("animation", consumable.animationType());
|
||||
saveSoundEventHolder(tag, consumable.sound());
|
||||
tag.putBoolean("has_consume_particles", consumable.hasConsumeParticles());
|
||||
|
||||
final ListTag<CompoundTag> effects = new ListTag<>(CompoundTag.class);
|
||||
for (final ConsumeEffect<?> effect : consumable.consumeEffects()) {
|
||||
final CompoundTag effectTag = new CompoundTag();
|
||||
convertConsumableEffect(effectTag, effect);
|
||||
effects.add(effectTag);
|
||||
}
|
||||
tag.put("consume_effects", effects);
|
||||
backupTag.put("consumable", tag);
|
||||
}
|
||||
|
||||
final DamageResistant1_21_2 damageResistant = data.get(StructuredDataKey.DAMAGE_RESISTANT1_21_2);
|
||||
if (damageResistant != null) {
|
||||
backupTag.putString("damage_resistant", damageResistant.typesTagKey().original());
|
||||
}
|
||||
|
||||
final PotionContents potionContents = data.get(StructuredDataKey.POTION_CONTENTS1_21_2);
|
||||
if (potionContents != null && potionContents.customName() != null) {
|
||||
backupTag.putString("potion_custom_name", potionContents.customName());
|
||||
}
|
||||
|
||||
if (!backupTag.isEmpty()) {
|
||||
saveTag(createCustomTag(item), backupTag, "inconvertible_data");
|
||||
}
|
||||
}
|
||||
|
||||
private void convertConsumableEffect(final CompoundTag tag, Consumable1_21_2.ConsumeEffect<?> effect) {
|
||||
private void convertConsumableEffect(final CompoundTag tag, ConsumeEffect<?> effect) {
|
||||
tag.putInt("id", effect.id());
|
||||
if (effect.type() == Consumable1_21_2.ApplyStatusEffects.TYPE && effect.value() instanceof Consumable1_21_2.ApplyStatusEffects value) {
|
||||
if (effect.type() == ApplyStatusEffects.TYPE && effect.value() instanceof ApplyStatusEffects value) {
|
||||
tag.putString("type", "apply_effects");
|
||||
|
||||
final ListTag<CompoundTag> effects = new ListTag<>(CompoundTag.class);
|
||||
@@ -599,7 +650,7 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsFullStructured
|
||||
}
|
||||
}
|
||||
|
||||
private Consumable1_21_2.ConsumeEffect<?> convertConsumableEffect(final CompoundTag tag) {
|
||||
private ConsumeEffect<?> convertConsumableEffect(final CompoundTag tag) {
|
||||
final int id = tag.getInt("id");
|
||||
final String type = tag.getString("type");
|
||||
if ("apply_effects".equals(type)) {
|
||||
@@ -612,18 +663,18 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsFullStructured
|
||||
potionEffects.add(new PotionEffect(effect, data));
|
||||
}
|
||||
final float probability = tag.getFloat("probability");
|
||||
return new Consumable1_21_2.ConsumeEffect<>(id, Consumable1_21_2.ApplyStatusEffects.TYPE, new Consumable1_21_2.ApplyStatusEffects(potionEffects.toArray(PotionEffect[]::new), probability));
|
||||
return new ConsumeEffect<>(id, ApplyStatusEffects.TYPE, new ApplyStatusEffects(potionEffects.toArray(PotionEffect[]::new), probability));
|
||||
} else if ("remove_effects".equals(type)) {
|
||||
final HolderSet set = restoreHolderSet(tag, "remove_effects");
|
||||
return new Consumable1_21_2.ConsumeEffect<>(id, Types.HOLDER_SET, set);
|
||||
return new ConsumeEffect<>(id, Types.HOLDER_SET, set);
|
||||
} else if ("clear_all_effects".equals(type)) {
|
||||
return new Consumable1_21_2.ConsumeEffect<>(id, Types.EMPTY, Unit.INSTANCE);
|
||||
return new ConsumeEffect<>(id, Types.EMPTY, Unit.INSTANCE);
|
||||
} else if ("teleport_randomly".equals(type)) {
|
||||
final float probability = tag.getFloat("probability");
|
||||
return new Consumable1_21_2.ConsumeEffect<>(id, Types.FLOAT, probability);
|
||||
return new ConsumeEffect<>(id, Types.FLOAT, probability);
|
||||
} else if ("play_sound".equals(type)) {
|
||||
final Holder<SoundEvent> sound = restoreSoundEventHolder(tag);
|
||||
return new Consumable1_21_2.ConsumeEffect<>(id, Types.SOUND_EVENT, sound);
|
||||
return new ConsumeEffect<>(id, Types.SOUND_EVENT, sound);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@@ -700,14 +751,42 @@ public final class BlockItemPacketRewriter1_21_2 extends BackwardsFullStructured
|
||||
|
||||
final ListTag<CompoundTag> deathProtection = backupTag.getListTag("death_protection", CompoundTag.class);
|
||||
if (deathProtection != null) {
|
||||
final List<Consumable1_21_2.ConsumeEffect<?>> effects = new ArrayList<>();
|
||||
final List<ConsumeEffect<?>> effects = new ArrayList<>();
|
||||
for (int i = 0; i < deathProtection.size(); i++) {
|
||||
final Consumable1_21_2.ConsumeEffect<?> effect = convertConsumableEffect(deathProtection.get(i));
|
||||
final ConsumeEffect<?> effect = convertConsumableEffect(deathProtection.get(i));
|
||||
if (effect != null) {
|
||||
effects.add(effect);
|
||||
}
|
||||
}
|
||||
data.set(StructuredDataKey.DEATH_PROTECTION, new DeathProtection(effects.toArray(Consumable1_21_2.ConsumeEffect[]::new)));
|
||||
data.set(StructuredDataKey.DEATH_PROTECTION1_21_2, new DeathProtection(effects.toArray(ConsumeEffect[]::new)));
|
||||
}
|
||||
|
||||
final CompoundTag consumable = backupTag.getCompoundTag("consumable");
|
||||
if (consumable != null) {
|
||||
final List<ConsumeEffect<?>> effects = new ArrayList<>();
|
||||
for (final CompoundTag effectTag : consumable.getListTag("consume_effects", CompoundTag.class)) {
|
||||
final ConsumeEffect<?> effect = convertConsumableEffect(effectTag);
|
||||
if (effect != null) {
|
||||
effects.add(effect);
|
||||
}
|
||||
}
|
||||
data.set(StructuredDataKey.CONSUMABLE1_21_2, new Consumable1_21_2(
|
||||
consumable.getFloat("consume_seconds"),
|
||||
consumable.getInt("animation"),
|
||||
restoreSoundEventHolder(consumable),
|
||||
consumable.getBoolean("has_consume_particles"),
|
||||
effects.toArray(ConsumeEffect[]::new)
|
||||
));
|
||||
}
|
||||
|
||||
final String damageResistant = backupTag.getString("damage_resistant");
|
||||
if (damageResistant != null) {
|
||||
data.set(StructuredDataKey.DAMAGE_RESISTANT1_21_2, new DamageResistant1_21_2(Key.of(damageResistant)));
|
||||
}
|
||||
|
||||
final String potionCustomName = backupTag.getString("potion_custom_name");
|
||||
if (potionCustomName != null) {
|
||||
data.replace(StructuredDataKey.POTION_CONTENTS1_21_2, potionContents -> new PotionContents(potionContents.potion(), potionContents.customColor(), potionContents.customEffects(), potionCustomName));
|
||||
}
|
||||
|
||||
removeCustomTag(data, customData);
|
||||
|
||||
+84
-44
@@ -27,6 +27,7 @@ import com.viaversion.viabackwards.api.entities.EntityScaleHelper;
|
||||
import com.viaversion.viabackwards.api.rewriters.EntityRewriter;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.Protocol1_21_2To1_21;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.storage.PlayerStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.storage.BackwardsStorables1_21_2;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.storage.SignStorage;
|
||||
import com.viaversion.viabackwards.utils.VelocityUtil;
|
||||
import com.viaversion.viaversion.api.data.entity.EntityTracker;
|
||||
@@ -176,7 +177,8 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter<Clientbound
|
||||
|
||||
final EntityTracker tracker = tracker(wrapper.user());
|
||||
if (tracker.currentWorld() != null && !tracker.currentWorld().equals(world)) {
|
||||
wrapper.user().put(new SignStorage());
|
||||
final BackwardsStorables1_21_2 storables = wrapper.user().storables(protocol);
|
||||
storables.setSignStorage(new SignStorage());
|
||||
}
|
||||
trackWorldDataByKey1_20_5(wrapper.user(), dimensionId, world);
|
||||
});
|
||||
@@ -197,6 +199,48 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter<Clientbound
|
||||
writePackedRotation(wrapper, yaw, pitch);
|
||||
});
|
||||
|
||||
protocol.registerClientbound(ClientboundPackets1_21_2.MOVE_MINECART_ALONG_TRACK, ClientboundPackets1_21.TELEPORT_ENTITY, wrapper -> {
|
||||
// Only sent with the experimental minecart improvements, old clients can only lerp to a single position
|
||||
final int entityId = wrapper.passthrough(Types.VAR_INT);
|
||||
final int steps = wrapper.read(Types.VAR_INT);
|
||||
if (steps == 0) {
|
||||
wrapper.cancel();
|
||||
return;
|
||||
}
|
||||
|
||||
double x = 0, y = 0, z = 0;
|
||||
double movementX = 0, movementY = 0, movementZ = 0;
|
||||
byte yaw = 0, pitch = 0;
|
||||
for (int i = 0; i < steps; i++) {
|
||||
x = wrapper.read(Types.DOUBLE);
|
||||
y = wrapper.read(Types.DOUBLE);
|
||||
z = wrapper.read(Types.DOUBLE);
|
||||
movementX = wrapper.read(Types.DOUBLE);
|
||||
movementY = wrapper.read(Types.DOUBLE);
|
||||
movementZ = wrapper.read(Types.DOUBLE);
|
||||
yaw = wrapper.read(Types.BYTE);
|
||||
pitch = wrapper.read(Types.BYTE);
|
||||
wrapper.read(Types.FLOAT); // Weight
|
||||
}
|
||||
|
||||
wrapper.write(Types.DOUBLE, x);
|
||||
wrapper.write(Types.DOUBLE, y);
|
||||
wrapper.write(Types.DOUBLE, z);
|
||||
wrapper.write(Types.BYTE, (byte) (128 - yaw));
|
||||
wrapper.write(Types.BYTE, pitch);
|
||||
wrapper.write(Types.BOOLEAN, false); // On ground
|
||||
|
||||
wrapper.send(Protocol1_21_2To1_21.class);
|
||||
wrapper.cancel();
|
||||
|
||||
final PacketWrapper entityMotionPacket = wrapper.create(ClientboundPackets1_21.SET_ENTITY_MOTION);
|
||||
entityMotionPacket.write(Types.VAR_INT, entityId);
|
||||
entityMotionPacket.write(Types.SHORT, VelocityUtil.toLegacyVelocity(movementX));
|
||||
entityMotionPacket.write(Types.SHORT, VelocityUtil.toLegacyVelocity(movementY));
|
||||
entityMotionPacket.write(Types.SHORT, VelocityUtil.toLegacyVelocity(movementZ));
|
||||
entityMotionPacket.send(Protocol1_21_2To1_21.class);
|
||||
});
|
||||
|
||||
protocol.registerClientbound(ClientboundPackets1_21_2.PLAYER_ROTATION, ClientboundPackets1_21.PLAYER_LOOK_AT, wrapper -> {
|
||||
final float yaw = wrapper.read(Types.FLOAT);
|
||||
final float pitch = wrapper.read(Types.FLOAT);
|
||||
@@ -209,7 +253,7 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter<Clientbound
|
||||
final double deltaY = Math.sin(-xRadians);
|
||||
final double deltaZ = Math.cos(-yRadians - (float) Math.PI) * factor;
|
||||
|
||||
final PlayerStorage storage = wrapper.user().get(PlayerStorage.class);
|
||||
final PlayerStorage storage = wrapper.user().<BackwardsStorables1_21_2>storables(protocol).playerStorage();
|
||||
wrapper.write(Types.VAR_INT, 0); // From anchor
|
||||
wrapper.write(Types.DOUBLE, storage.x() + deltaX); // X
|
||||
wrapper.write(Types.DOUBLE, storage.y() + deltaY); // Y
|
||||
@@ -276,7 +320,7 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter<Clientbound
|
||||
wrapper.passthrough(Types.VAR_INT);
|
||||
final int action = wrapper.passthrough(Types.VAR_INT);
|
||||
|
||||
final PlayerStorage storage = wrapper.user().get(PlayerStorage.class);
|
||||
final PlayerStorage storage = wrapper.user().<BackwardsStorables1_21_2>storables(protocol).playerStorage();
|
||||
if (action == 0) {
|
||||
storage.setPlayerCommandTrackedSneaking(true);
|
||||
} else if (action == 1) {
|
||||
@@ -326,45 +370,31 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter<Clientbound
|
||||
});
|
||||
|
||||
protocol.registerServerbound(ServerboundPackets1_20_5.MOVE_PLAYER_POS, wrapper -> {
|
||||
final double x = wrapper.passthrough(Types.DOUBLE);
|
||||
final double y = wrapper.passthrough(Types.DOUBLE);
|
||||
final double z = wrapper.passthrough(Types.DOUBLE);
|
||||
final PlayerStorage storage = wrapper.user().<BackwardsStorables1_21_2>storables(protocol).playerStorage();
|
||||
endPreviousTick(wrapper, storage);
|
||||
storage.setPosFromPacket(wrapper);
|
||||
fixOnGround(wrapper);
|
||||
|
||||
final PlayerStorage storage = wrapper.user().get(PlayerStorage.class);
|
||||
storage.setPosition(x, y, z);
|
||||
});
|
||||
protocol.registerServerbound(ServerboundPackets1_20_5.MOVE_PLAYER_POS_ROT, wrapper -> {
|
||||
final double x = wrapper.passthrough(Types.DOUBLE);
|
||||
final double y = wrapper.passthrough(Types.DOUBLE);
|
||||
final double z = wrapper.passthrough(Types.DOUBLE);
|
||||
final float yaw = wrapper.passthrough(Types.FLOAT);
|
||||
final float pitch = wrapper.passthrough(Types.FLOAT);
|
||||
final PlayerStorage storage = wrapper.user().<BackwardsStorables1_21_2>storables(protocol).playerStorage();
|
||||
endPreviousTick(wrapper, storage);
|
||||
storage.setPosRotFromPacket(wrapper);
|
||||
fixOnGround(wrapper);
|
||||
|
||||
final PlayerStorage storage = wrapper.user().get(PlayerStorage.class);
|
||||
storage.setPosition(x, y, z);
|
||||
storage.setRotation(yaw, pitch);
|
||||
});
|
||||
protocol.registerServerbound(ServerboundPackets1_20_5.MOVE_PLAYER_ROT, wrapper -> {
|
||||
final float yaw = wrapper.passthrough(Types.FLOAT);
|
||||
final float pitch = wrapper.passthrough(Types.FLOAT);
|
||||
final PlayerStorage storage = wrapper.user().<BackwardsStorables1_21_2>storables(protocol).playerStorage();
|
||||
endPreviousTick(wrapper, storage);
|
||||
storage.setRotFromPacket(wrapper);
|
||||
fixOnGround(wrapper);
|
||||
});
|
||||
protocol.registerServerbound(ServerboundPackets1_20_5.MOVE_PLAYER_STATUS_ONLY, wrapper -> {
|
||||
final PlayerStorage storage = wrapper.user().<BackwardsStorables1_21_2>storables(protocol).playerStorage();
|
||||
endPreviousTick(wrapper, storage);
|
||||
fixOnGround(wrapper);
|
||||
|
||||
final PlayerStorage storage = wrapper.user().get(PlayerStorage.class);
|
||||
storage.setRotation(yaw, pitch);
|
||||
});
|
||||
protocol.registerServerbound(ServerboundPackets1_20_5.MOVE_PLAYER_STATUS_ONLY, this::fixOnGround);
|
||||
protocol.registerServerbound(ServerboundPackets1_20_5.MOVE_VEHICLE, wrapper -> {
|
||||
final double x = wrapper.passthrough(Types.DOUBLE);
|
||||
final double y = wrapper.passthrough(Types.DOUBLE);
|
||||
final double z = wrapper.passthrough(Types.DOUBLE);
|
||||
final float yaw = wrapper.passthrough(Types.FLOAT);
|
||||
final float pitch = wrapper.passthrough(Types.FLOAT);
|
||||
|
||||
final PlayerStorage storage = wrapper.user().get(PlayerStorage.class);
|
||||
storage.setPosition(x, y, z);
|
||||
storage.setRotation(yaw, pitch);
|
||||
final PlayerStorage storage = wrapper.user().<BackwardsStorables1_21_2>storables(protocol).playerStorage();
|
||||
storage.setPosFromPacket(wrapper);
|
||||
});
|
||||
|
||||
protocol.replaceClientbound(ClientboundPackets1_21_2.PLAYER_INFO_UPDATE, wrapper -> {
|
||||
@@ -412,22 +442,24 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter<Clientbound
|
||||
protocol.registerClientbound(ClientboundPackets1_21_2.SET_PASSENGERS, wrapper -> {
|
||||
final int vehicleId = wrapper.passthrough(Types.VAR_INT);
|
||||
final int[] passengerIds = wrapper.passthrough(Types.VAR_INT_ARRAY_PRIMITIVE);
|
||||
final ClientVehicleStorage storage = wrapper.user().get(ClientVehicleStorage.class);
|
||||
final BackwardsStorables1_21_2 storables = wrapper.user().storables(protocol);
|
||||
final ClientVehicleStorage storage = storables.clientVehicleStorage();
|
||||
if (storage != null && vehicleId == storage.vehicleId()) {
|
||||
wrapper.user().remove(ClientVehicleStorage.class);
|
||||
storables.setClientVehicleStorage(null);
|
||||
sendSneakingPlayerCommand(wrapper, false);
|
||||
}
|
||||
|
||||
final int clientEntityId = tracker(wrapper.user()).clientEntityId();
|
||||
for (final int passenger : passengerIds) {
|
||||
if (passenger == clientEntityId) {
|
||||
wrapper.user().put(new ClientVehicleStorage(vehicleId));
|
||||
storables.setClientVehicleStorage(new ClientVehicleStorage(vehicleId));
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
protocol.appendClientbound(ClientboundPackets1_21_2.REMOVE_ENTITIES, wrapper -> {
|
||||
final ClientVehicleStorage vehicleStorage = wrapper.user().get(ClientVehicleStorage.class);
|
||||
final BackwardsStorables1_21_2 storables = wrapper.user().storables(protocol);
|
||||
final ClientVehicleStorage vehicleStorage = storables.clientVehicleStorage();
|
||||
if (vehicleStorage == null) {
|
||||
return;
|
||||
}
|
||||
@@ -435,7 +467,7 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter<Clientbound
|
||||
final int[] entityIds = wrapper.get(Types.VAR_INT_ARRAY_PRIMITIVE, 0);
|
||||
for (final int entityId : entityIds) {
|
||||
if (entityId == vehicleStorage.vehicleId()) {
|
||||
wrapper.user().remove(ClientVehicleStorage.class);
|
||||
storables.setClientVehicleStorage(null);
|
||||
sendSneakingPlayerCommand(wrapper, false);
|
||||
break;
|
||||
}
|
||||
@@ -481,7 +513,7 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter<Clientbound
|
||||
@Nullable final Integer entityId
|
||||
) {
|
||||
// Position and rotation
|
||||
final PlayerStorage storage = wrapper.user().get(PlayerStorage.class);
|
||||
final PlayerStorage storage = wrapper.user().<BackwardsStorables1_21_2>storables(protocol).playerStorage();
|
||||
if ((relativeArguments & 1 << REL_X) != 0) {
|
||||
x += storage.x();
|
||||
}
|
||||
@@ -492,21 +524,21 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter<Clientbound
|
||||
z += storage.z();
|
||||
}
|
||||
if ((relativeArguments & 1 << REL_Y_ROT) != 0) {
|
||||
yaw += storage.yaw();
|
||||
yaw += storage.yRot();
|
||||
}
|
||||
if ((relativeArguments & 1 << REL_X_ROT) != 0) {
|
||||
pitch += storage.pitch();
|
||||
pitch += storage.xRot();
|
||||
}
|
||||
|
||||
// Movement rotation
|
||||
if ((relativeArguments & 1 << REL_ROTATE_DELTA) != 0) {
|
||||
final double deltaYaw = Math.toRadians(storage.yaw() - yaw);
|
||||
final double deltaYaw = Math.toRadians(storage.yRot() - yaw);
|
||||
final double deltaYawCos = Math.cos(deltaYaw);
|
||||
final double deltaYawSin = Math.sin(deltaYaw);
|
||||
movementX = movementX * deltaYawCos + movementZ * deltaYawSin;
|
||||
movementZ = movementZ * deltaYawCos - movementX * deltaYawSin;
|
||||
|
||||
final double deltaPitch = Math.toRadians(storage.pitch() - pitch);
|
||||
final double deltaPitch = Math.toRadians(storage.xRot() - pitch);
|
||||
final double deltaPitchCos = Math.cos(deltaPitch);
|
||||
final double deltaPitchSin = Math.sin(deltaPitch);
|
||||
movementY = movementY * deltaPitchCos + movementZ * deltaPitchSin;
|
||||
@@ -563,7 +595,7 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter<Clientbound
|
||||
}
|
||||
|
||||
private void sendSneakingPlayerCommand(final PacketWrapper wrapper, final boolean sneaking) {
|
||||
final PlayerStorage sneakingStorage = wrapper.user().get(PlayerStorage.class);
|
||||
final PlayerStorage sneakingStorage = wrapper.user().<BackwardsStorables1_21_2>storables(protocol).playerStorage();
|
||||
if (sneakingStorage.setSneaking(sneaking)) {
|
||||
final PacketWrapper playerCommandPacket = wrapper.create(ServerboundPackets1_21_2.PLAYER_COMMAND);
|
||||
playerCommandPacket.write(Types.VAR_INT, tracker(wrapper.user()).clientEntityId());
|
||||
@@ -621,6 +653,14 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter<Clientbound
|
||||
}
|
||||
}
|
||||
|
||||
// Client tick ends are emulated on a timer, which drifts against the client's own tick and can put two movement packets into
|
||||
// the same tick - 26.3 servers disconnect on that. Take the tick rate from the client's movement packets while it is moving
|
||||
private void endPreviousTick(final PacketWrapper wrapper, final PlayerStorage storage) {
|
||||
if (storage.startTick()) {
|
||||
wrapper.create(ServerboundPackets1_21_2.CLIENT_TICK_END).sendToServer(Protocol1_21_2To1_21.class);
|
||||
}
|
||||
}
|
||||
|
||||
private void fixOnGround(final PacketWrapper wrapper) {
|
||||
final boolean data = wrapper.read(Types.BOOLEAN);
|
||||
wrapper.write(Types.UNSIGNED_BYTE, data ? (short) 1 : 0); // Carries more data now
|
||||
|
||||
+68
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
|
||||
* Copyright (C) 2016-2026 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_2to1_21.storage;
|
||||
|
||||
import com.viaversion.viaversion.connection.ProtocolStorablesBase;
|
||||
import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.ClientVehicleStorage;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
public final class BackwardsStorables1_21_2 extends ProtocolStorablesBase {
|
||||
|
||||
private final InventoryStateIdStorage inventoryStateIdStorage = new InventoryStateIdStorage();
|
||||
private final ItemTagStorage itemTagStorage = new ItemTagStorage();
|
||||
private final PlayerStorage playerStorage = new PlayerStorage();
|
||||
private SignStorage signStorage = new SignStorage();
|
||||
private RecipeStorage recipeStorage;
|
||||
private ClientVehicleStorage clientVehicleStorage;
|
||||
|
||||
public InventoryStateIdStorage inventoryStateIdStorage() {
|
||||
return inventoryStateIdStorage;
|
||||
}
|
||||
|
||||
public ItemTagStorage itemTagStorage() {
|
||||
return itemTagStorage;
|
||||
}
|
||||
|
||||
public PlayerStorage playerStorage() {
|
||||
return playerStorage;
|
||||
}
|
||||
|
||||
public SignStorage signStorage() {
|
||||
return signStorage;
|
||||
}
|
||||
|
||||
public void setSignStorage(final SignStorage signStorage) {
|
||||
this.signStorage = signStorage;
|
||||
}
|
||||
|
||||
public RecipeStorage recipeStorage() {
|
||||
return recipeStorage;
|
||||
}
|
||||
|
||||
public void setRecipeStorage(final RecipeStorage recipeStorage) {
|
||||
this.recipeStorage = recipeStorage;
|
||||
}
|
||||
|
||||
public @Nullable ClientVehicleStorage clientVehicleStorage() {
|
||||
return clientVehicleStorage;
|
||||
}
|
||||
|
||||
public void setClientVehicleStorage(final @Nullable ClientVehicleStorage clientVehicleStorage) {
|
||||
this.clientVehicleStorage = clientVehicleStorage;
|
||||
}
|
||||
}
|
||||
+1
-3
@@ -17,9 +17,7 @@
|
||||
*/
|
||||
package com.viaversion.viabackwards.protocol.v1_21_2to1_21.storage;
|
||||
|
||||
import com.viaversion.viaversion.api.connection.StorableObject;
|
||||
|
||||
public final class InventoryStateIdStorage implements StorableObject {
|
||||
public final class InventoryStateIdStorage {
|
||||
|
||||
private boolean smithingTableOpen;
|
||||
private int stateId = -1;
|
||||
|
||||
+1
-2
@@ -17,7 +17,6 @@
|
||||
*/
|
||||
package com.viaversion.viabackwards.protocol.v1_21_2to1_21.storage;
|
||||
|
||||
import com.viaversion.viaversion.api.connection.StorableObject;
|
||||
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
|
||||
import com.viaversion.viaversion.api.type.Types;
|
||||
import com.viaversion.viaversion.util.Key;
|
||||
@@ -25,7 +24,7 @@ import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
public final class ItemTagStorage implements StorableObject {
|
||||
public final class ItemTagStorage {
|
||||
|
||||
private Map<String, int[]> itemTags = new HashMap<>();
|
||||
|
||||
|
||||
+27
-19
@@ -17,20 +17,17 @@
|
||||
*/
|
||||
package com.viaversion.viabackwards.protocol.v1_21_2to1_21.storage;
|
||||
|
||||
import com.viaversion.viabackwards.api.entities.storage.PlayerPositionStorage;
|
||||
import com.viaversion.viabackwards.api.entities.storage.PlayerPosRotStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.Protocol1_21_2To1_21;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
|
||||
import com.viaversion.viaversion.api.type.Types;
|
||||
import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ServerboundPackets1_21_2;
|
||||
|
||||
public final class PlayerStorage extends PlayerPositionStorage {
|
||||
public final class PlayerStorage extends PlayerPosRotStorage {
|
||||
private static final PlayerInput EMPTY = new PlayerInput(false, false, false, false, false, false, false);
|
||||
private static final float PLAYER_JUMP_HEIGHT = 0.42F;
|
||||
|
||||
private float yaw;
|
||||
private float pitch;
|
||||
|
||||
private boolean playerCommandTrackedSneaking;
|
||||
private boolean playerCommandTrackedSprinting;
|
||||
|
||||
@@ -38,6 +35,8 @@ public final class PlayerStorage extends PlayerPositionStorage {
|
||||
private double prevX;
|
||||
private double prevY;
|
||||
private double prevZ;
|
||||
private boolean tickStarted;
|
||||
private boolean tickEndedEarly;
|
||||
|
||||
public void tick(final UserConnection user) {
|
||||
final double deltaX = x() - prevX;
|
||||
@@ -51,7 +50,7 @@ public final class PlayerStorage extends PlayerPositionStorage {
|
||||
directionX = Math.max(-1, Math.min(1, directionX));
|
||||
directionZ = Math.max(-1, Math.min(1, directionZ));
|
||||
|
||||
final double angle = Math.toRadians(-yaw);
|
||||
final double angle = Math.toRadians(-yRot());
|
||||
final double newDirectionX = directionX * Math.cos(angle) - directionZ * Math.sin(angle);
|
||||
final double newDirectionZ = directionX * Math.sin(angle) + directionZ * Math.cos(angle);
|
||||
|
||||
@@ -83,19 +82,6 @@ public final class PlayerStorage extends PlayerPositionStorage {
|
||||
this.prevZ = z();
|
||||
}
|
||||
|
||||
public float yaw() {
|
||||
return yaw;
|
||||
}
|
||||
|
||||
public float pitch() {
|
||||
return pitch;
|
||||
}
|
||||
|
||||
public void setRotation(final float yaw, final float pitch) {
|
||||
this.yaw = yaw;
|
||||
this.pitch = pitch;
|
||||
}
|
||||
|
||||
public void setPlayerCommandTrackedSneaking(final boolean playerCommandTrackedSneaking) {
|
||||
this.playerCommandTrackedSneaking = playerCommandTrackedSneaking;
|
||||
}
|
||||
@@ -104,6 +90,28 @@ public final class PlayerStorage extends PlayerPositionStorage {
|
||||
this.playerCommandTrackedSprinting = playerCommandTrackedSprinting;
|
||||
}
|
||||
|
||||
// Old clients send exactly one movement packet per tick, so the next one marks the end of the current tick
|
||||
public boolean startTick() {
|
||||
if (!tickStarted) {
|
||||
tickStarted = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
tickEndedEarly = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Skip a single tick end after one was already sent early above, keeping the number of ticks the same
|
||||
public boolean endTick() {
|
||||
if (tickEndedEarly) {
|
||||
tickEndedEarly = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
tickStarted = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean setSneaking(final boolean sneaking) {
|
||||
final boolean changed = this.playerCommandTrackedSneaking != sneaking;
|
||||
this.playerCommandTrackedSneaking = sneaking;
|
||||
|
||||
+1
-2
@@ -19,7 +19,6 @@ package com.viaversion.viabackwards.protocol.v1_21_2to1_21.storage;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.Protocol1_21_2To1_21;
|
||||
import com.viaversion.viaversion.api.connection.StorableObject;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.minecraft.HolderSet;
|
||||
import com.viaversion.viaversion.api.minecraft.item.Item;
|
||||
@@ -35,7 +34,7 @@ import java.util.List;
|
||||
// Mostly a lost cause as the server will not send all the necessary data.
|
||||
// Recipe displays can also be different from the actual recipe - at the end of the same,
|
||||
// the server will still properly handle inputs, but we can't fully reconstruct the recipe book.
|
||||
public final class RecipeStorage implements StorableObject {
|
||||
public final class RecipeStorage {
|
||||
|
||||
// Pairs of open + filtering for: Crafting, furnace, blast furnace, smoker
|
||||
public static final int RECIPE_BOOK_SETTINGS = 4 * 2;
|
||||
|
||||
+1
-2
@@ -17,12 +17,11 @@
|
||||
*/
|
||||
package com.viaversion.viabackwards.protocol.v1_21_2to1_21.storage;
|
||||
|
||||
import com.viaversion.viaversion.api.connection.StorableObject;
|
||||
import com.viaversion.viaversion.api.minecraft.BlockPosition;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
public final class SignStorage implements StorableObject {
|
||||
public final class SignStorage {
|
||||
|
||||
private final Set<BlockPosition> signs = new HashSet<>();
|
||||
|
||||
|
||||
+11
-5
@@ -21,13 +21,14 @@ import com.viaversion.viabackwards.ViaBackwards;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.Protocol1_21_2To1_21;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.storage.PlayerStorage;
|
||||
import com.viaversion.viaversion.api.connection.ProtocolInfo;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_2to1_21.storage.BackwardsStorables1_21_2;
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.data.entity.EntityTracker;
|
||||
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
|
||||
import com.viaversion.viaversion.api.protocol.packet.State;
|
||||
import com.viaversion.viaversion.connection.StorableObjectTask;
|
||||
import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ServerboundPackets1_21_2;
|
||||
import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.ClientVehicleStorage;
|
||||
import java.util.logging.Level;
|
||||
|
||||
public final class PlayerPacketsTickTask extends StorableObjectTask<PlayerStorage> {
|
||||
@@ -43,13 +44,15 @@ public final class PlayerPacketsTickTask extends StorableObjectTask<PlayerStorag
|
||||
return;
|
||||
}
|
||||
|
||||
final EntityTracker entityTracker = connection.getEntityTracker(Protocol1_21_2To1_21.class);
|
||||
final Protocol1_21_2To1_21 protocol = Via.getManager().getProtocolManager().getProtocol(Protocol1_21_2To1_21.class);
|
||||
final EntityTracker entityTracker = connection.getEntityTracker(protocol);
|
||||
if (!entityTracker.hasClientEntityId()) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
if (!connection.has(ClientVehicleStorage.class)) {
|
||||
final BackwardsStorables1_21_2 storables = connection.storables(protocol);
|
||||
if (storables.clientVehicleStorage() == null) {
|
||||
storableObject.tick(connection);
|
||||
}
|
||||
} catch (final Throwable t) {
|
||||
@@ -57,8 +60,11 @@ public final class PlayerPacketsTickTask extends StorableObjectTask<PlayerStorag
|
||||
}
|
||||
|
||||
try {
|
||||
final PacketWrapper clientTickEndPacket = PacketWrapper.create(ServerboundPackets1_21_2.CLIENT_TICK_END, connection);
|
||||
clientTickEndPacket.sendToServer(Protocol1_21_2To1_21.class);
|
||||
// The client's own movement packets may have ended this tick already
|
||||
if (storableObject.endTick()) {
|
||||
final PacketWrapper clientTickEndPacket = PacketWrapper.create(ServerboundPackets1_21_2.CLIENT_TICK_END, connection);
|
||||
clientTickEndPacket.sendToServer(Protocol1_21_2To1_21.class);
|
||||
}
|
||||
} catch (final Throwable t) {
|
||||
ViaBackwards.getPlatform().getLogger().log(Level.SEVERE, "Error while sending client tick end packet.", t);
|
||||
}
|
||||
|
||||
+5
-1
@@ -101,6 +101,10 @@ public final class Protocol1_21_4To1_21_2 extends BackwardsProtocol<ClientboundP
|
||||
|
||||
final CompoundTag compoundTag = ((CompoundTag) entry.tag());
|
||||
compoundTag.putFloat("item_model_index", itemModelIndex(entry.key()));
|
||||
|
||||
if ("resin".equals(compoundTag.getString("asset_name"))) {
|
||||
compoundTag.putString("asset_name", "gold");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -265,7 +269,7 @@ public final class Protocol1_21_4To1_21_2 extends BackwardsProtocol<ClientboundP
|
||||
case "copper" -> 0.5F;
|
||||
case "diamond" -> 0.8F;
|
||||
case "emerald" -> 0.7F;
|
||||
case "gold" -> 0.6F;
|
||||
case "gold", "resin" -> 0.6F;
|
||||
case "iron" -> 0.2F;
|
||||
case "lapis" -> 0.9F;
|
||||
case "netherite" -> 0.3F;
|
||||
|
||||
+4
-1
@@ -27,13 +27,14 @@ import com.viaversion.viabackwards.protocol.v1_21_5to1_21_4.rewriter.EntityPacke
|
||||
import com.viaversion.viabackwards.protocol.v1_21_5to1_21_4.rewriter.RegistryDataRewriter1_21_5;
|
||||
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.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.ArmorTrimPattern;
|
||||
import com.viaversion.viaversion.api.minecraft.item.data.ChatType;
|
||||
import com.viaversion.viaversion.api.minecraft.item.data.trim.ArmorTrimPattern;
|
||||
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;
|
||||
@@ -100,6 +101,8 @@ public final class Protocol1_21_5To1_21_4 extends BackwardsProtocol<ClientboundP
|
||||
protected void registerPackets() {
|
||||
super.registerPackets();
|
||||
|
||||
tagRewriter.renameTag(RegistryType.BLOCK, "dry_vegetation_may_place_on", "dead_bush_may_place_on");
|
||||
|
||||
final CommandRewriter1_19_4<ClientboundPacket1_21_5> commandRewriter = new CommandRewriter1_19_4<>(this) {
|
||||
@Override
|
||||
public void handleArgument(final PacketWrapper wrapper, final String argumentType) {
|
||||
|
||||
+25
-12
@@ -46,16 +46,17 @@ import com.viaversion.viaversion.api.minecraft.entitydata.EntityData;
|
||||
import com.viaversion.viaversion.api.minecraft.item.HashedItem;
|
||||
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.BlocksAttacks;
|
||||
import com.viaversion.viaversion.api.minecraft.item.data.BlocksAttacks.DamageReduction;
|
||||
import com.viaversion.viaversion.api.minecraft.item.data.BlocksAttacks.ItemDamageFunction;
|
||||
import com.viaversion.viaversion.api.minecraft.item.data.BreakSound;
|
||||
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.minecraft.item.data.trim.ArmorTrimMaterial1_20_5;
|
||||
import com.viaversion.viaversion.api.minecraft.item.data.trim.ProvidesTrimMaterial1_20_5;
|
||||
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
|
||||
import com.viaversion.viaversion.api.rewriter.ComponentRewriter;
|
||||
import com.viaversion.viaversion.api.type.Type;
|
||||
@@ -296,6 +297,10 @@ public final class BlockItemPacketRewriter1_21_5 extends BackwardsStructuredItem
|
||||
}
|
||||
|
||||
final OriginalHashedItem originalHashedItem = backedUpOriginalHashes(originalHashes, item);
|
||||
if (originalHashedItem == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Return as regular hashed item if the tag was forced in this protocol and it would otherwise be passed on
|
||||
// to the final serverbound protocol without the required handling.
|
||||
return originalHashedItem.backupTagName().equals(nbtTagName()) ? originalHashedItem.asRegularItem() : originalHashedItem;
|
||||
@@ -363,8 +368,8 @@ public final class BlockItemPacketRewriter1_21_5 extends BackwardsStructuredItem
|
||||
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);
|
||||
if (toolProperties != null && !toolProperties.canDestroyBlocksInCreative()) {
|
||||
backupTag.putBoolean("tool", false);
|
||||
}
|
||||
|
||||
final Equippable equippable = dataContainer.get(StructuredDataKey.EQUIPPABLE1_21_5);
|
||||
@@ -380,7 +385,7 @@ public final class BlockItemPacketRewriter1_21_5 extends BackwardsStructuredItem
|
||||
weaponTag.putFloat("disable_blocking_for_seconds", weapon.disableBlockingForSeconds());
|
||||
}
|
||||
|
||||
final ProvidesTrimMaterial providesTrimMaterial = dataContainer.get(StructuredDataKey.PROVIDES_TRIM_MATERIAL1_21_5);
|
||||
final ProvidesTrimMaterial1_20_5 providesTrimMaterial = dataContainer.get(StructuredDataKey.PROVIDES_TRIM_MATERIAL1_21_5);
|
||||
if (providesTrimMaterial != null) {
|
||||
final Tag materialTag = eitherHolderToTag(providesTrimMaterial.material(), (material, tag) -> {
|
||||
tag.putString("asset_name", material.assetName());
|
||||
@@ -462,6 +467,7 @@ public final class BlockItemPacketRewriter1_21_5 extends BackwardsStructuredItem
|
||||
saveIntData(StructuredDataKey.COW_VARIANT, dataContainer, backupTag);
|
||||
saveIntData(StructuredDataKey.PIG_VARIANT, dataContainer, backupTag);
|
||||
saveIntData(StructuredDataKey.WOLF_VARIANT, dataContainer, backupTag);
|
||||
saveIntData(StructuredDataKey.WOLF_COLLAR, dataContainer, backupTag);
|
||||
|
||||
final Either<Integer, String> chickenVariant = dataContainer.get(StructuredDataKey.CHICKEN_VARIANT1_21_5);
|
||||
if (chickenVariant != null) {
|
||||
@@ -484,7 +490,10 @@ public final class BlockItemPacketRewriter1_21_5 extends BackwardsStructuredItem
|
||||
}
|
||||
});
|
||||
|
||||
saveHolderData(StructuredDataKey.BREAK_SOUND, dataContainer, backupTag, this::saveSoundEvent);
|
||||
final BreakSound breakSound = dataContainer.get(StructuredDataKey.BREAK_SOUND);
|
||||
if (breakSound != null) {
|
||||
backupTag.put(StructuredDataKey.BREAK_SOUND.identifier(), holderToTag(breakSound.sound(), this::saveSoundEvent));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -511,8 +520,9 @@ public final class BlockItemPacketRewriter1_21_5 extends BackwardsStructuredItem
|
||||
data.set(StructuredDataKey.TOOLTIP_DISPLAY, new TooltipDisplay(data.has(StructuredDataKey.HIDE_TOOLTIP), new IntLinkedOpenHashSet(hiddenComponentsTag.getValue())));
|
||||
}
|
||||
|
||||
if (backupTag.getBoolean("tool")) {
|
||||
data.replace(StructuredDataKey.TOOL1_20_5, StructuredDataKey.TOOL1_21_5, t -> new ToolProperties(t.rules(), t.defaultMiningSpeed(), t.damagePerBlock(), true));
|
||||
if (backupTag.contains("tool")) {
|
||||
final boolean canDestroyBlocksInCreative = backupTag.getBoolean("tool");
|
||||
data.replace(StructuredDataKey.TOOL1_20_5, StructuredDataKey.TOOL1_21_5, t -> new ToolProperties(t.rules(), t.defaultMiningSpeed(), t.damagePerBlock(), canDestroyBlocksInCreative));
|
||||
}
|
||||
|
||||
if (backupTag.getBoolean("equippable")) {
|
||||
@@ -526,7 +536,7 @@ public final class BlockItemPacketRewriter1_21_5 extends BackwardsStructuredItem
|
||||
|
||||
final Tag materialTag = backupTag.get("provides_trim_material");
|
||||
if (materialTag != null) {
|
||||
data.set(StructuredDataKey.PROVIDES_TRIM_MATERIAL1_21_5, new ProvidesTrimMaterial(restoreEitherHolder(backupTag, "provides_trim_material", tag -> {
|
||||
data.set(StructuredDataKey.PROVIDES_TRIM_MATERIAL1_21_5, new ProvidesTrimMaterial1_20_5(restoreEitherHolder(backupTag, "provides_trim_material", tag -> {
|
||||
final String assetName = tag.getString("asset_name");
|
||||
final int itemId = tag.getInt("item_id");
|
||||
final float itemModelIndex = tag.getFloat("item_model_index");
|
||||
@@ -536,7 +546,7 @@ public final class BlockItemPacketRewriter1_21_5 extends BackwardsStructuredItem
|
||||
overrideArmorMaterials.put(key, overrideArmorMaterialsTag.getString(key));
|
||||
}
|
||||
final Tag description = tag.get("description");
|
||||
return new ArmorTrimMaterial(assetName, itemId, itemModelIndex, overrideArmorMaterials, description);
|
||||
return new ArmorTrimMaterial1_20_5(assetName, itemId, itemModelIndex, overrideArmorMaterials, description);
|
||||
})));
|
||||
}
|
||||
|
||||
@@ -546,7 +556,7 @@ public final class BlockItemPacketRewriter1_21_5 extends BackwardsStructuredItem
|
||||
final float disableCooldownScale = blocksAttackTag.getFloat("disable_cooldown_scale");
|
||||
final CompoundTag itemDamageTag = blocksAttackTag.getCompoundTag("item_damage");
|
||||
final ItemDamageFunction itemDamage = new ItemDamageFunction(itemDamageTag.getFloat("threshold"), itemDamageTag.getFloat("base"), itemDamageTag.getFloat("factor"));
|
||||
final String bypassedBy = blocksAttackTag.getString("bypassed_by");
|
||||
final String bypassedBy = itemDamageTag.getString("bypassed_by");
|
||||
final Holder<SoundEvent> blockSound = blocksAttackTag.contains("block_sound") ? restoreHolder(blocksAttackTag, "block_sound", this::tagToSound) : null;
|
||||
final Holder<SoundEvent> disableSound = blocksAttackTag.contains("disable_sound") ? restoreHolder(blocksAttackTag, "disable_sound", this::tagToSound) : null;
|
||||
|
||||
@@ -602,8 +612,11 @@ public final class BlockItemPacketRewriter1_21_5 extends BackwardsStructuredItem
|
||||
restoreIntData(StructuredDataKey.COW_VARIANT, data, backupTag);
|
||||
restoreIntData(StructuredDataKey.PIG_VARIANT, data, backupTag);
|
||||
restoreIntData(StructuredDataKey.WOLF_VARIANT, data, backupTag);
|
||||
restoreIntData(StructuredDataKey.WOLF_COLLAR, data, backupTag);
|
||||
|
||||
restoreHolderData(StructuredDataKey.BREAK_SOUND, data, backupTag, this::tagToSound);
|
||||
if (backupTag.contains(StructuredDataKey.BREAK_SOUND.identifier())) {
|
||||
data.set(StructuredDataKey.BREAK_SOUND, new BreakSound(restoreHolder(backupTag, StructuredDataKey.BREAK_SOUND.identifier(), this::tagToSound)));
|
||||
}
|
||||
restoreHolderData(StructuredDataKey.PAINTING_VARIANT, data, backupTag, tag -> {
|
||||
final int width = tag.getInt("width");
|
||||
final int height = tag.getInt("height");
|
||||
|
||||
+4
-1
@@ -38,6 +38,7 @@ import com.viaversion.viabackwards.protocol.v1_21_6to1_21_5.storage.ServerLinks;
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.minecraft.Holder;
|
||||
import com.viaversion.viaversion.api.minecraft.RegistryType;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_6;
|
||||
import com.viaversion.viaversion.api.platform.providers.ViaProviders;
|
||||
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
|
||||
@@ -93,6 +94,8 @@ public final class Protocol1_21_6To1_21_5 extends BackwardsProtocol<ClientboundP
|
||||
protected void registerPackets() {
|
||||
super.registerPackets();
|
||||
|
||||
tagRewriter.renameTag(RegistryType.BLOCK, "triggers_ambient_desert_dry_vegetation_block_sounds", "plays_ambient_desert_block_sounds");
|
||||
|
||||
replaceClientbound(ClientboundPackets1_21_6.UPDATE_TAGS, this::updateTags);
|
||||
replaceClientbound(ClientboundConfigurationPackets1_21_6.UPDATE_TAGS, this::updateTags);
|
||||
|
||||
@@ -300,7 +303,7 @@ public final class Protocol1_21_6To1_21_5 extends BackwardsProtocol<ClientboundP
|
||||
@Override
|
||||
public void init(final UserConnection user) {
|
||||
addEntityTracker(user, new EntityTrackerBase(user, EntityTypes1_21_6.PLAYER));
|
||||
user.addItemHasher(this.getClass(), new ItemHasherBase(this, user));
|
||||
user.storables(this).setItemHasher(new ItemHasherBase(this, user));
|
||||
user.put(new RegistryAndTags());
|
||||
user.put(new ClickEvents());
|
||||
}
|
||||
|
||||
+1
-1
@@ -68,7 +68,7 @@ public final class Protocol1_21_7To1_21_6 extends BackwardsProtocol<ClientboundP
|
||||
@Override
|
||||
public void init(final UserConnection connection) {
|
||||
addEntityTracker(connection, new EntityTrackerBase(connection, EntityTypes1_21_6.PLAYER));
|
||||
connection.addItemHasher(this.getClass(), new ItemHasherBase(this, connection));
|
||||
connection.storables(this).setItemHasher(new ItemHasherBase(this, connection));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+13
-10
@@ -29,8 +29,7 @@ import com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.rewriter.ComponentRe
|
||||
import com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.rewriter.EntityPacketRewriter1_21_9;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.rewriter.ParticleRewriter1_21_9;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.rewriter.RegistryDataRewriter1_21_9;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.storage.DimensionScaleStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.storage.PlayerRotationStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.storage.ProtocolStorables1_21_9;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.tracker.EntityTracker1_21_9;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.minecraft.data.version.StructuredDataKeys1_21_5;
|
||||
@@ -59,7 +58,6 @@ import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ClientboundPac
|
||||
import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ClientboundPackets1_21_9;
|
||||
import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ServerboundConfigurationPackets1_21_9;
|
||||
import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ServerboundPacket1_21_9;
|
||||
import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.BundleStateTracker;
|
||||
import com.viaversion.viaversion.rewriter.BlockRewriter;
|
||||
import com.viaversion.viaversion.rewriter.ParticleRewriter;
|
||||
import com.viaversion.viaversion.rewriter.RecipeDisplayRewriter;
|
||||
@@ -174,29 +172,34 @@ public final class Protocol1_21_9To1_21_7 extends BackwardsProtocol<ClientboundP
|
||||
}
|
||||
});
|
||||
|
||||
registerServerbound(ServerboundPackets1_21_6.DEBUG_SAMPLE_SUBSCRIPTION, wrapper -> {
|
||||
registerServerbound(ServerboundPackets1_21_6.DEBUG_SUBSCRIPTION_REQUEST, wrapper -> {
|
||||
final int sampleType = wrapper.read(Types.VAR_INT);
|
||||
if (sampleType == 0) { // TICK_TIME
|
||||
wrapper.write(Types.VAR_INT, 1); // Subscription count
|
||||
wrapper.write(Types.VAR_INT, 0); // Subscription registry id (DEDICATED_SERVER_TICK_TIME)
|
||||
}
|
||||
});
|
||||
registerClientbound(ClientboundPackets1_21_9.BUNDLE_DELIMITER, wrapper -> wrapper.user().get(BundleStateTracker.class).toggleBundling());
|
||||
registerClientbound(ClientboundPackets1_21_9.BUNDLE_DELIMITER, wrapper -> {
|
||||
ProtocolStorables1_21_9 storables = wrapper.user().storables(this);
|
||||
storables.bundleStateTracker().toggleBundling();
|
||||
});
|
||||
|
||||
cancelClientbound(ClientboundPackets1_21_9.DEBUG_BLOCK_VALUE);
|
||||
cancelClientbound(ClientboundPackets1_21_9.DEBUG_CHUNK_VALUE);
|
||||
cancelClientbound(ClientboundPackets1_21_9.DEBUG_ENTITY_VALUE);
|
||||
cancelClientbound(ClientboundPackets1_21_9.DEBUG_EVENT);
|
||||
cancelClientbound(ClientboundPackets1_21_9.GAME_EVENT_TEST_HIGHLIGHT_POS);
|
||||
cancelClientbound(ClientboundPackets1_21_9.GAME_TEST_HIGHLIGHT_POS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(final UserConnection connection) {
|
||||
addEntityTracker(connection, new EntityTracker1_21_9(connection, EntityTypes1_21_9.PLAYER));
|
||||
connection.addItemHasher(this.getClass(), new ItemHasherBase(this, connection));
|
||||
connection.put(new PlayerRotationStorage());
|
||||
connection.put(new DimensionScaleStorage());
|
||||
connection.put(new BundleStateTracker());
|
||||
connection.storables(this).setItemHasher(new ItemHasherBase(this, connection));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProtocolStorables1_21_9 createStorables() {
|
||||
return new ProtocolStorables1_21_9();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+3
-2
@@ -20,7 +20,7 @@ package com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.rewriter;
|
||||
import com.viaversion.nbt.tag.CompoundTag;
|
||||
import com.viaversion.viabackwards.api.rewriters.BackwardsStructuredItemRewriter;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.Protocol1_21_9To1_21_7;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.storage.DimensionScaleStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.storage.ProtocolStorables1_21_9;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.data.entity.EntityTracker;
|
||||
import com.viaversion.viaversion.api.minecraft.ResolvableProfile;
|
||||
@@ -108,7 +108,8 @@ public final class BlockItemPacketRewriter1_21_9 extends BackwardsStructuredItem
|
||||
|
||||
final EntityTracker tracker = protocol.getEntityRewriter().tracker(wrapper.user());
|
||||
if (tracker.currentDimensionId() != -1) {
|
||||
final double scale = wrapper.user().get(DimensionScaleStorage.class).getScale(tracker.currentDimensionId());
|
||||
final ProtocolStorables1_21_9 storables = wrapper.user().storables(protocol);
|
||||
final double scale = storables.dimensionScaleStorage().getScale(tracker.currentDimensionId());
|
||||
centerX *= scale;
|
||||
centerZ *= scale;
|
||||
}
|
||||
|
||||
+9
-10
@@ -24,6 +24,7 @@ import com.viaversion.viabackwards.api.rewriters.EntityRewriter;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.Protocol1_21_9To1_21_7;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.storage.MannequinData;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.storage.PlayerRotationStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.storage.ProtocolStorables1_21_9;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.tracker.EntityTracker1_21_9;
|
||||
import com.viaversion.viabackwards.utils.VelocityUtil;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
@@ -46,7 +47,6 @@ import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPac
|
||||
import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ServerboundPackets1_21_6;
|
||||
import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ClientboundPacket1_21_9;
|
||||
import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ClientboundPackets1_21_9;
|
||||
import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.BundleStateTracker;
|
||||
import com.viaversion.viaversion.rewriter.entitydata.EntityDataHandler;
|
||||
import com.viaversion.viaversion.util.ChatColorUtil;
|
||||
import com.viaversion.viaversion.util.Copyable;
|
||||
@@ -164,7 +164,8 @@ public final class EntityPacketRewriter1_21_9 extends EntityRewriter<Clientbound
|
||||
});
|
||||
|
||||
protocol.registerClientbound(ClientboundPackets1_21_9.PLAYER_ROTATION, wrapper -> {
|
||||
final PlayerRotationStorage storage = wrapper.user().get(PlayerRotationStorage.class);
|
||||
final ProtocolStorables1_21_9 storables = wrapper.user().storables(protocol);
|
||||
final PlayerRotationStorage storage = storables.playerRotationStorage();
|
||||
|
||||
float yRot = wrapper.read(Types.FLOAT);
|
||||
if (wrapper.read(Types.BOOLEAN)) {
|
||||
@@ -315,10 +316,11 @@ public final class EntityPacketRewriter1_21_9 extends EntityRewriter<Clientbound
|
||||
final StringBuilder builder = new StringBuilder();
|
||||
// Player names cannot be updated after the initial add without fully respawning them;
|
||||
// Stack random color codes to appear as an empty name, later filled with a team prefix
|
||||
for (int i = 0; i < 8; i++) {
|
||||
for (int i = 0; i < 7; i++) {
|
||||
final int random = ThreadLocalRandom.current().nextInt(ChatColorUtil.ALL_CODES.length());
|
||||
builder.append('§').append(ChatColorUtil.ALL_CODES.charAt(random));
|
||||
}
|
||||
builder.append("§r");
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
@@ -332,7 +334,8 @@ public final class EntityPacketRewriter1_21_9 extends EntityRewriter<Clientbound
|
||||
final float yaw = wrapper.passthrough(Types.FLOAT);
|
||||
final float pitch = wrapper.passthrough(Types.FLOAT);
|
||||
|
||||
wrapper.user().get(PlayerRotationStorage.class).setRotation(yaw, pitch);
|
||||
final ProtocolStorables1_21_9 storables = wrapper.user().storables(protocol);
|
||||
storables.playerRotationStorage().setRotation(yaw, pitch);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -386,7 +389,8 @@ public final class EntityPacketRewriter1_21_9 extends EntityRewriter<Clientbound
|
||||
mannequinData.setDisplayName(displayName);
|
||||
sendPlayerInfoDisplayNameUpdate(event.user(), mannequinData, displayName);
|
||||
} else if (event.index() == 17) { // Profile
|
||||
final boolean isBundling = event.user().get(BundleStateTracker.class).isBundling();
|
||||
ProtocolStorables1_21_9 storables = event.user().storables(protocol);
|
||||
final boolean isBundling = storables.bundleStateTracker().isBundling();
|
||||
if (!isBundling) {
|
||||
final PacketWrapper bundleStart = PacketWrapper.create(ClientboundPackets1_21_6.BUNDLE_DELIMITER, event.user());
|
||||
bundleStart.send(Protocol1_21_9To1_21_7.class);
|
||||
@@ -452,11 +456,6 @@ public final class EntityPacketRewriter1_21_9 extends EntityRewriter<Clientbound
|
||||
equipment.send(Protocol1_21_9To1_21_7.class);
|
||||
}
|
||||
|
||||
final PacketWrapper setHeadRotation = PacketWrapper.create(ClientboundPackets1_21_6.ROTATE_HEAD, event.user());
|
||||
setHeadRotation.write(Types.VAR_INT, event.entityId());
|
||||
setHeadRotation.write(Types.BYTE, mannequinData.headYaw());
|
||||
setHeadRotation.send(Protocol1_21_9To1_21_7.class);
|
||||
|
||||
if (!isBundling) {
|
||||
final PacketWrapper bundleStart = PacketWrapper.create(ClientboundPackets1_21_6.BUNDLE_DELIMITER, event.user());
|
||||
bundleStart.send(Protocol1_21_9To1_21_7.class);
|
||||
|
||||
+6
-1
@@ -21,13 +21,17 @@ import com.viaversion.nbt.tag.CompoundTag;
|
||||
import com.viaversion.viabackwards.api.BackwardsProtocol;
|
||||
import com.viaversion.viabackwards.api.rewriters.BackwardsRegistryRewriter;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.storage.DimensionScaleStorage;
|
||||
import com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.storage.ProtocolStorables1_21_9;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.minecraft.RegistryEntry;
|
||||
|
||||
public final class RegistryDataRewriter1_21_9 extends BackwardsRegistryRewriter {
|
||||
|
||||
private final BackwardsProtocol<?, ?, ?, ?> backwardsProtocol;
|
||||
|
||||
public RegistryDataRewriter1_21_9(final BackwardsProtocol<?, ?, ?, ?> protocol) {
|
||||
super(protocol);
|
||||
this.backwardsProtocol = protocol;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -37,7 +41,8 @@ public final class RegistryDataRewriter1_21_9 extends BackwardsRegistryRewriter
|
||||
return;
|
||||
}
|
||||
|
||||
final DimensionScaleStorage dimensionScaleStorage = connection.get(DimensionScaleStorage.class);
|
||||
final ProtocolStorables1_21_9 storables = connection.storables(backwardsProtocol);
|
||||
final DimensionScaleStorage dimensionScaleStorage = storables.dimensionScaleStorage();
|
||||
for (int i = 0; i < entries.length; i++) {
|
||||
final RegistryEntry entry = entries[i];
|
||||
final CompoundTag dimension = (CompoundTag) entry.tag();
|
||||
|
||||
+1
-2
@@ -17,11 +17,10 @@
|
||||
*/
|
||||
package com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.storage;
|
||||
|
||||
import com.viaversion.viaversion.api.connection.StorableObject;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public final class DimensionScaleStorage implements StorableObject {
|
||||
public final class DimensionScaleStorage {
|
||||
|
||||
private final Map<Integer, Double> dimensionScales = new HashMap<>(4);
|
||||
|
||||
|
||||
Loaded 100 of 135 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user