Compare commits

...
16 Commits
Author SHA1 Message Date
Nassim Jahnke 76b98eb396 5.7.0 Release 2025-12-29 12:48:01 +01:00
Nassim Jahnke b33221b95c Don't throw on bad entity data in 1.14->1.13 2025-12-28 10:33:03 +01:00
Nassim Jahnke 8ce26b1353 Bump to 5.7.0-SNAPSHOT and update VV usage 2025-12-26 21:57:06 +01:00
9a79f9e217 Delay mannequin spawning for proper skin application (#1158)
Co-authored-by: FlorianMichael <git@florianmichael.de>
Co-authored-by: Nassim Jahnke <nassim@njahnke.dev>
2025-12-26 21:50:10 +01:00
Nassim Jahnke 44476f2468 Replace toIntExact with clamp
Fixes #1159
2025-12-25 09:10:09 +01:00
David Lüdtke 54655e34e7 Fix world border lerp size set in ticks instead of millis (#1156) 2025-12-23 09:55:03 +01:00
Nassim Jahnke 863258df4e Correct overworld fog color 2025-12-21 16:55:01 +01:00
Nassim Jahnke 8a5fce2d2e Put set_objective and set_score packets through component rewriter
Fixes #1155
2025-12-21 15:53:03 +01:00
Nassim Jahnke 5374c3b626 Fix avatar arm handling in 1.21.11->1.21.9 2025-12-20 22:53:24 +01:00
FlorianMichael 96e0d85bc0 Map pale oak shelf to pale oak planks in 1.21.9->1.21.7 (#1154) 2025-12-20 16:38:29 +01:00
Kichura 84576d1d95 [ci skip] Set CI timeout to 30 mins (#1153) 2025-12-20 15:46:05 +01:00
Nassim Jahnke c6f0717ad5 Convert compact sound list to single entry in registry data 2025-12-20 12:00:16 +01:00
Nassim Jahnke 395bebac62 Remove tamable entity data from nautilus
Fixes #1152
2025-12-14 09:25:07 +01:00
FlorianMichael 6d19ad3b81 [ci skip] Include the newest ViaProxy version from 3.0.0 to 4.0.0 (#1151) 2025-12-13 19:59:23 +01:00
Nassim Jahnke 38080fc5cc Remove 1.21.11 registries 2025-12-13 12:04:12 +01:00
FlorianMichael 285dcdd81f Add ViaBackwardsPlatform#init with config instance (#1149) 2025-12-13 11:30:04 +01:00
39 changed files with 443 additions and 60 deletions

No files matched your search

+1
View File
@@ -8,6 +8,7 @@ jobs:
# Only run on PRs if the source branch is on a different repo. We do not need to run everything twice.
if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}
runs-on: ubuntu-24.04
timeout-minutes: 30
steps:
- name: Checkout Repository
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # 6.0.0
+1
View File
@@ -13,6 +13,7 @@ jobs:
publish:
if: github.repository_owner == 'ViaVersion'
runs-on: ubuntu-24.04
timeout-minutes: 30
steps:
- name: Checkout Repository
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # 6.0.0
@@ -11,6 +11,7 @@ permissions:
jobs:
update-gradle-wrapper:
runs-on: ubuntu-24.04
timeout-minutes: 30
steps:
- name: Checkout Repository
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # 6.0.0
@@ -78,13 +78,16 @@ import java.util.logging.Logger;
public interface ViaBackwardsPlatform {
String MINIMUM_VV_VERSION = "5.6.0";
String MINIMUM_VV_VERSION = "5.7.0";
default void init(final File configFile) {
init(new ViaBackwardsConfig(configFile, getLogger()));
}
/**
* Initialize ViaBackwards.
*/
default void init(final File configFile) {
ViaBackwardsConfig config = new ViaBackwardsConfig(configFile, getLogger());
default void init(final ViaBackwardsConfig config) {
config.reload();
Via.getManager().getConfigurationProvider().register(config);
@@ -93,6 +93,7 @@ final class Protocol1_99To1_98 extends BackwardsProtocol<ClientboundPacket1_21_2
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_2.SET_SUBTITLE_TEXT);
translatableRewriter.registerBossEvent(ClientboundPackets1_21_2.BOSS_EVENT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_2.DISCONNECT);
translatableRewriter.registerComponentPacket(ClientboundConfigurationPackets1_21.DISCONNECT);
translatableRewriter.registerTabList(ClientboundPackets1_21_2.TAB_LIST);
translatableRewriter.registerSetPlayerTeam1_21_5(ClientboundPackets1_21_2.SET_PLAYER_TEAM);
translatableRewriter.registerPlayerCombatKill1_20(ClientboundPackets1_21_2.PLAYER_COMBAT_KILL);
@@ -100,6 +101,8 @@ final class Protocol1_99To1_98 extends BackwardsProtocol<ClientboundPacket1_21_2
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_2.SYSTEM_CHAT);
translatableRewriter.registerDisguisedChat(ClientboundPackets1_21_2.DISGUISED_CHAT);
translatableRewriter.registerPlayerChat1_21_5(ClientboundPackets1_21_2.PLAYER_CHAT);
translatableRewriter.registerSetObjective(ClientboundPackets1_21_2.SET_OBJECTIVE);
translatableRewriter.registerSetScore1_20_3(ClientboundPackets1_21_2.SET_SCORE);
translatableRewriter.registerPing();
// If needed for any particle, item, or block changes. Extend ParticleRewriter for particle serializer changes
@@ -71,6 +71,7 @@ public class Protocol1_13_1To1_13 extends BackwardsProtocol<ClientboundPackets1_
translatableRewriter.registerTabList(ClientboundPackets1_13.TAB_LIST);
translatableRewriter.registerSetPlayerTeam1_13(ClientboundPackets1_13.SET_PLAYER_TEAM);
translatableRewriter.registerTitle(ClientboundPackets1_13.SET_TITLES);
translatableRewriter.registerSetObjective(ClientboundPackets1_13.SET_OBJECTIVE);
translatableRewriter.registerPing();
new CommandRewriter1_13_1(this).registerDeclareCommands(ClientboundPackets1_13.COMMANDS);
@@ -508,7 +508,7 @@ public class BlockItemPacketRewriter1_13 extends BackwardsItemRewriter<Clientbou
if (originalId == 362) { // base/colorless shulker box
rawId = 0xe50000; // purple shulker box
} else {
if (!Via.getConfig().isSuppressConversionWarnings()) {
if (Via.getConfig().logOtherConversionWarnings()) {
protocol.getLogger().warning("Failed to get new item for " + originalId);
}
@@ -818,7 +818,7 @@ public class BlockItemPacketRewriter1_13 extends BackwardsItemRewriter<Clientbou
} else if (protocol.getMappingData().getItemMappings().inverse().getNewId(rawId & ~0xF) != -1) {
rawId &= ~0xF; // Remove data
} else {
if (!Via.getConfig().isSuppressConversionWarnings()) {
if (Via.getConfig().logOtherConversionWarnings()) {
protocol.getLogger().warning("Failed to get old item for " + item.identifier());
}
rawId = 16; // Stone
@@ -81,7 +81,7 @@ public class PlayerPacketRewriter1_13 extends RewriterBase<Protocol1_13To1_12_2>
} else {
String oldChannel = ItemPacketRewriter1_13.getOldPluginChannelId(channel);
if (oldChannel == null) {
if (!Via.getConfig().isSuppressConversionWarnings()) {
if (Via.getConfig().logOtherConversionWarnings()) {
protocol.getLogger().warning("Ignoring clientbound plugin message with channel: " + channel);
}
wrapper.cancel();
@@ -96,7 +96,7 @@ public class PlayerPacketRewriter1_13 extends RewriterBase<Protocol1_13To1_12_2>
String rewritten = ItemPacketRewriter1_13.getOldPluginChannelId(s);
if (rewritten != null) {
rewrittenChannels.add(rewritten);
} else if (!Via.getConfig().isSuppressConversionWarnings()) {
} else if (Via.getConfig().logOtherConversionWarnings()) {
protocol.getLogger().warning("Ignoring plugin channel in clientbound " + oldChannel + ": " + s);
}
}
@@ -367,7 +367,7 @@ public class PlayerPacketRewriter1_13 extends RewriterBase<Protocol1_13To1_12_2>
//Maybe older versions used this and we need to implement this? The issue is that we would have to save the command block types
wrapper.setPacketType(ServerboundPackets1_13.SET_COMMAND_BLOCK);
wrapper.cancel();
if (!Via.getConfig().isSuppressConversionWarnings()) {
if (Via.getConfig().logOtherConversionWarnings()) {
protocol.getLogger().warning("Client send MC|AdvCmd custom payload to update command block, weird!");
}
} else if (type == 1) {
@@ -457,7 +457,7 @@ public class PlayerPacketRewriter1_13 extends RewriterBase<Protocol1_13To1_12_2>
default -> {
String newChannel = ItemPacketRewriter1_13.getNewPluginChannelId(channel);
if (newChannel == null) {
if (!Via.getConfig().isSuppressConversionWarnings()) {
if (Via.getConfig().logOtherConversionWarnings()) {
protocol.getLogger().warning("Ignoring serverbound plugin message with channel: " + channel);
}
wrapper.cancel();
@@ -472,7 +472,7 @@ public class PlayerPacketRewriter1_13 extends RewriterBase<Protocol1_13To1_12_2>
String rewritten = ItemPacketRewriter1_13.getNewPluginChannelId(s);
if (rewritten != null) {
rewrittenChannels.add(rewritten);
} else if (!Via.getConfig().isSuppressConversionWarnings()) {
} else if (Via.getConfig().logOtherConversionWarnings()) {
protocol.getLogger().warning("Ignoring plugin channel in serverbound " + Key.stripMinecraftNamespace(newChannel).toUpperCase(Locale.ROOT) + ": " + s);
}
}
@@ -64,6 +64,7 @@ public class Protocol1_14To1_13_2 extends BackwardsProtocol<ClientboundPackets1_
translatableRewriter.registerTabList(ClientboundPackets1_14.TAB_LIST);
translatableRewriter.registerSetPlayerTeam1_13(ClientboundPackets1_14.SET_PLAYER_TEAM);
translatableRewriter.registerTitle(ClientboundPackets1_14.SET_TITLES);
translatableRewriter.registerSetObjective(ClientboundPackets1_14.SET_OBJECTIVE);
translatableRewriter.registerPing();
particleRewriter.registerLevelParticles1_13(ClientboundPackets1_14.LEVEL_PARTICLES, Types.FLOAT);
@@ -487,7 +487,7 @@ public class EntityPacketRewriter1_14 extends LegacyEntityRewriter<ClientboundPa
filter().handler((event, data) -> {
if (data.dataType().typeId() > 15) {
throw new IllegalArgumentException("Unhandled entity data: " + data);
event.cancel(); // Cancel bad data (generally from plugins sending data for despawned entities)
}
});
}
@@ -66,6 +66,7 @@ public class Protocol1_15To1_14_4 extends BackwardsProtocol<ClientboundPackets1_
translatableRewriter.registerTabList(ClientboundPackets1_15.TAB_LIST);
translatableRewriter.registerSetPlayerTeam1_13(ClientboundPackets1_15.SET_PLAYER_TEAM);
translatableRewriter.registerTitle(ClientboundPackets1_15.SET_TITLES);
translatableRewriter.registerSetObjective(ClientboundPackets1_15.SET_OBJECTIVE);
translatableRewriter.registerPing();
SoundRewriter<ClientboundPackets1_15> soundRewriter = new SoundRewriter<>(this);
@@ -69,6 +69,7 @@ public class Protocol1_16_2To1_16_1 extends BackwardsProtocol<ClientboundPackets
translatableRewriter.registerTitle(ClientboundPackets1_16_2.SET_TITLES);
translatableRewriter.registerSetPlayerTeam1_13(ClientboundPackets1_16_2.SET_PLAYER_TEAM);
translatableRewriter.registerOpenScreen1_14(ClientboundPackets1_16_2.OPEN_SCREEN);
translatableRewriter.registerSetObjective(ClientboundPackets1_16_2.SET_OBJECTIVE);
translatableRewriter.registerPing();
particleRewriter.registerLevelParticles1_13(ClientboundPackets1_16_2.LEVEL_PARTICLES, Types.DOUBLE);
@@ -136,7 +136,7 @@ public final class BiomeMappings1_16_1 {
public static int toLegacyBiome(String biome) {
final int legacyBiome = MODERN_TO_LEGACY_ID.getInt(Key.stripMinecraftNamespace(biome));
if (legacyBiome == -1) {
if (!Via.getConfig().isSuppressConversionWarnings()) {
if (Via.getConfig().logOtherConversionWarnings()) {
Protocol1_16_2To1_16_1.LOGGER.warning("Biome with id " + biome + " has no legacy biome mapping (custom datapack?)");
}
return 1; // Plains
@@ -72,6 +72,7 @@ public class Protocol1_16To1_15_2 extends BackwardsProtocol<ClientboundPackets1_
translatableRewriter.registerTabList(ClientboundPackets1_16.TAB_LIST);
translatableRewriter.registerSetPlayerTeam1_13(ClientboundPackets1_16.SET_PLAYER_TEAM);
translatableRewriter.registerTitle(ClientboundPackets1_16.SET_TITLES);
translatableRewriter.registerSetObjective(ClientboundPackets1_16.SET_OBJECTIVE);
translatableRewriter.registerPing();
particleRewriter.registerLevelParticles1_13(ClientboundPackets1_16.LEVEL_PARTICLES, Types.DOUBLE);
@@ -76,6 +76,7 @@ public final class Protocol1_17To1_16_4 extends BackwardsProtocol<ClientboundPac
translatableRewriter.registerTabList(ClientboundPackets1_17.TAB_LIST);
translatableRewriter.registerSetPlayerTeam1_13(ClientboundPackets1_17.SET_PLAYER_TEAM);
translatableRewriter.registerOpenScreen1_14(ClientboundPackets1_17.OPEN_SCREEN);
translatableRewriter.registerSetObjective(ClientboundPackets1_17.SET_OBJECTIVE);
translatableRewriter.registerPing();
SoundRewriter<ClientboundPackets1_17> soundRewriter = new SoundRewriter<>(this);
@@ -43,7 +43,7 @@ public final class Protocol1_18_2To1_18 extends BackwardsProtocol<ClientboundPac
final PacketHandler entityEffectIdHandler = wrapper -> {
final int id = wrapper.read(Types.VAR_INT);
if ((byte) id != id) {
if (!Via.getConfig().isSuppressConversionWarnings()) {
if (Via.getConfig().logOtherConversionWarnings()) {
getLogger().warning("Cannot send entity effect id " + id + " to old client");
}
wrapper.cancel();
@@ -85,6 +85,7 @@ public final class Protocol1_19_1To1_19 extends BackwardsProtocol<ClientboundPac
translatableRewriter.registerSetPlayerTeam1_13(ClientboundPackets1_19_1.SET_PLAYER_TEAM);
translatableRewriter.registerOpenScreen1_14(ClientboundPackets1_19_1.OPEN_SCREEN);
translatableRewriter.registerPlayerCombatKill(ClientboundPackets1_19_1.PLAYER_COMBAT_KILL);
translatableRewriter.registerSetObjective(ClientboundPackets1_19_1.SET_OBJECTIVE);
translatableRewriter.registerPing();
entityRewriter.register();
@@ -96,6 +96,7 @@ public final class Protocol1_19_3To1_19_1 extends BackwardsProtocol<ClientboundP
translatableRewriter.registerSetPlayerTeam1_13(ClientboundPackets1_19_3.SET_PLAYER_TEAM);
translatableRewriter.registerOpenScreen1_14(ClientboundPackets1_19_3.OPEN_SCREEN);
translatableRewriter.registerPlayerCombatKill(ClientboundPackets1_19_3.PLAYER_COMBAT_KILL);
translatableRewriter.registerSetObjective(ClientboundPackets1_19_3.SET_OBJECTIVE);
translatableRewriter.registerPing();
particleRewriter.registerLevelParticles1_19(ClientboundPackets1_19_3.LEVEL_PARTICLES);
@@ -74,6 +74,7 @@ public final class Protocol1_19_4To1_19_3 extends BackwardsProtocol<ClientboundP
translatableRewriter.registerSetPlayerTeam1_13(ClientboundPackets1_19_4.SET_PLAYER_TEAM);
translatableRewriter.registerComponentPacket(ClientboundPackets1_19_4.SYSTEM_CHAT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_19_4.DISGUISED_CHAT);
translatableRewriter.registerSetObjective(ClientboundPackets1_19_4.SET_OBJECTIVE);
translatableRewriter.registerPing();
particleRewriter.registerLevelParticles1_19(ClientboundPackets1_19_4.LEVEL_PARTICLES);
@@ -89,6 +89,7 @@ public final class Protocol1_19To1_18_2 extends BackwardsProtocol<ClientboundPac
translatableRewriter.registerSetPlayerTeam1_13(ClientboundPackets1_19.SET_PLAYER_TEAM);
translatableRewriter.registerOpenScreen1_14(ClientboundPackets1_19.OPEN_SCREEN);
translatableRewriter.registerPlayerCombatKill(ClientboundPackets1_19.PLAYER_COMBAT_KILL);
translatableRewriter.registerSetObjective(ClientboundPackets1_19.SET_OBJECTIVE);
translatableRewriter.registerPing();
final SoundRewriter<ClientboundPackets1_19> soundRewriter = new SoundRewriter<>(this);
@@ -110,6 +110,7 @@ public final class Protocol1_20_5To1_20_3 extends BackwardsProtocol<ClientboundP
translatableRewriter.registerComponentPacket(ClientboundPackets1_20_5.SET_SUBTITLE_TEXT);
translatableRewriter.registerBossEvent(ClientboundPackets1_20_5.BOSS_EVENT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_20_5.DISCONNECT);
translatableRewriter.registerComponentPacket(ClientboundConfigurationPackets1_20_5.DISCONNECT);
translatableRewriter.registerTabList(ClientboundPackets1_20_5.TAB_LIST);
translatableRewriter.registerSetPlayerTeam1_13(ClientboundPackets1_20_5.SET_PLAYER_TEAM);
translatableRewriter.registerPlayerCombatKill1_20(ClientboundPackets1_20_5.PLAYER_COMBAT_KILL);
@@ -117,6 +118,8 @@ public final class Protocol1_20_5To1_20_3 extends BackwardsProtocol<ClientboundP
translatableRewriter.registerComponentPacket(ClientboundPackets1_20_5.DISGUISED_CHAT);
translatableRewriter.registerPlayerChat(ClientboundPackets1_20_5.PLAYER_CHAT, Types.VAR_INT);
translatableRewriter.registerPlayerInfoUpdate1_20_3(ClientboundPackets1_20_5.PLAYER_INFO_UPDATE);
translatableRewriter.registerSetObjective(ClientboundPackets1_20_5.SET_OBJECTIVE);
translatableRewriter.registerSetScore1_20_3(ClientboundPackets1_20_5.SET_SCORE);
translatableRewriter.registerPing();
registerClientbound(State.LOGIN, ClientboundLoginPackets.HELLO, wrapper -> {
@@ -74,6 +74,7 @@ public final class Protocol1_20To1_19_4 extends BackwardsProtocol<ClientboundPac
translatableRewriter.registerSetPlayerTeam1_13(ClientboundPackets1_19_4.SET_PLAYER_TEAM);
translatableRewriter.registerComponentPacket(ClientboundPackets1_19_4.SYSTEM_CHAT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_19_4.DISGUISED_CHAT);
translatableRewriter.registerSetObjective(ClientboundPackets1_19_4.SET_OBJECTIVE);
translatableRewriter.registerPing();
registerClientbound(ClientboundPackets1_19_4.UPDATE_ENABLED_FEATURES, wrapper -> {
@@ -34,6 +34,7 @@ import com.viaversion.viabackwards.protocol.v1_21_11to1_21_9.rewriter.ComponentR
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.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.data.FullMappings;
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;
@@ -67,13 +68,29 @@ public final class Protocol1_21_11To1_21_9 extends BackwardsProtocol<Clientbound
public static final BackwardsMappingData MAPPINGS = new BackwardsMappingData("1.21.11", "1.21.9", Protocol1_21_9To1_21_11.class);
private static final int END_FOG_COLOR = 10518688;
private static final int OVERWORLD_FOG_COLOR = 126384063;
private static final int OVERWORLD_FOG_COLOR = -4138753;
private final EntityPacketRewriter1_21_11 entityRewriter = new EntityPacketRewriter1_21_11(this);
private final BlockItemPacketRewriter1_21_11 itemRewriter = new BlockItemPacketRewriter1_21_11(this);
private final ParticleRewriter<ClientboundPacket1_21_11> particleRewriter = new ParticleRewriter<>(this);
private final NBTComponentRewriter<ClientboundPacket1_21_11> translatableRewriter = new ComponentRewriter1_21_11(this);
private final TagRewriter<ClientboundPacket1_21_11> tagRewriter = new TagRewriter<>(this);
private final RegistryDataRewriter registryDataRewriter = new BackwardsRegistryRewriter(this);
private final RegistryDataRewriter registryDataRewriter = new BackwardsRegistryRewriter(this) {
@Override
protected void updateType(final CompoundTag tag, final String key, final FullMappings mappings) {
super.updateType(tag, key, mappings);
if (key.equals("sound") && tag.get(key) instanceof ListTag<?> listTag) {
// From a compact list to a single value
final Tag first;
if (listTag.isEmpty()) {
first = new StringTag(mappings.mappedIdentifier(0)); // Dummy
} else {
first = listTag.get(0);
}
tag.put(key, first);
}
}
};
public Protocol1_21_11To1_21_9() {
super(ClientboundPacket1_21_11.class, ClientboundPacket1_21_9.class, ServerboundPacket1_21_9.class, ServerboundPacket1_21_9.class);
@@ -142,6 +159,8 @@ public final class Protocol1_21_11To1_21_9 extends BackwardsProtocol<Clientbound
TagUtil.removeNamespaced(effects, "post_piercing_attack");
}
});
registryDataRewriter.remove("zombie_nautilus_variant");
registryDataRewriter.remove("timeline");
registerClientbound(ClientboundConfigurationPackets1_21_9.REGISTRY_DATA, registryDataRewriter::handle);
tagRewriter.removeTags("timeline");
@@ -162,12 +181,15 @@ public final class Protocol1_21_11To1_21_9 extends BackwardsProtocol<Clientbound
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_11.SET_SUBTITLE_TEXT);
translatableRewriter.registerBossEvent(ClientboundPackets1_21_11.BOSS_EVENT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_11.DISCONNECT);
translatableRewriter.registerComponentPacket(ClientboundConfigurationPackets1_21_9.DISCONNECT);
translatableRewriter.registerTabList(ClientboundPackets1_21_11.TAB_LIST);
translatableRewriter.registerPlayerCombatKill1_20(ClientboundPackets1_21_11.PLAYER_COMBAT_KILL);
translatableRewriter.registerPlayerInfoUpdate1_21_4(ClientboundPackets1_21_11.PLAYER_INFO_UPDATE);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_11.SYSTEM_CHAT);
translatableRewriter.registerDisguisedChat(ClientboundPackets1_21_11.DISGUISED_CHAT);
translatableRewriter.registerPlayerChat1_21_5(ClientboundPackets1_21_11.PLAYER_CHAT);
translatableRewriter.registerSetObjective(ClientboundPackets1_21_11.SET_OBJECTIVE);
translatableRewriter.registerSetScore1_20_3(ClientboundPackets1_21_11.SET_SCORE);
translatableRewriter.registerPing();
particleRewriter.registerLevelParticles1_21_4(ClientboundPackets1_21_11.LEVEL_PARTICLES);
@@ -83,6 +83,18 @@ public final class BlockItemPacketRewriter1_21_11 extends BackwardsStructuredIte
recipeRewriter.registerRecipeBookAdd(ClientboundPackets1_21_11.RECIPE_BOOK_ADD);
recipeRewriter.registerPlaceGhostRecipe(ClientboundPackets1_21_11.PLACE_GHOST_RECIPE);
protocol.registerClientbound(ClientboundPackets1_21_11.SET_BORDER_LERP_SIZE, wrapper -> {
wrapper.passthrough(Types.DOUBLE); // oldSize
wrapper.passthrough(Types.DOUBLE); // newSize
wrapper.write(Types.VAR_LONG, wrapper.read(Types.VAR_LONG) * 50); // lerpTime
});
protocol.registerClientbound(ClientboundPackets1_21_11.INITIALIZE_BORDER, wrapper -> {
wrapper.passthrough(Types.DOUBLE); // newCenterX
wrapper.passthrough(Types.DOUBLE); // newCenterZ
wrapper.passthrough(Types.DOUBLE); // oldSize
wrapper.passthrough(Types.DOUBLE); // newSize
wrapper.write(Types.VAR_LONG, wrapper.read(Types.VAR_LONG) * 50); // lerpTime
});
protocol.registerClientbound(ClientboundPackets1_21_11.SET_TIME, wrapper -> {
final long gameTime = wrapper.passthrough(Types.LONG);
wrapper.user().get(GameTimeStorage.class).setGameTime(gameTime);
@@ -30,6 +30,7 @@ import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ClientboundPac
import com.viaversion.viaversion.protocols.v1_21_9to1_21_11.packet.ClientboundPacket1_21_11;
import com.viaversion.viaversion.protocols.v1_21_9to1_21_11.packet.ClientboundPackets1_21_11;
import com.viaversion.viaversion.rewriter.entitydata.EntityDataHandlerEvent;
import com.viaversion.viaversion.util.MathUtil;
public final class EntityPacketRewriter1_21_11 extends EntityRewriter<ClientboundPacket1_21_11, Protocol1_21_11To1_21_9> {
@@ -54,15 +55,23 @@ public final class EntityPacketRewriter1_21_11 extends EntityRewriter<Clientboun
protected void registerRewrites() {
final EntityDataTypes1_21_11 unmappedDataTypes = VersionedTypes.V1_21_11.entityDataTypes;
final EntityDataTypes1_21_9 entityDataTypes = VersionedTypes.V1_21_9.entityDataTypes;
filter().mapDataType(id -> {
if (id == unmappedDataTypes.humanoidArmType.typeId() || id == unmappedDataTypes.zombieNautilusVariantType.typeId()) {
return null;
filter().handler((event, data) -> {
if (data.dataType() == unmappedDataTypes.humanoidArmType) {
final int arm = data.value();
data.setTypeAndValue(entityDataTypes.byteType, (byte) arm);
return;
} else if (data.dataType() == unmappedDataTypes.zombieNautilusVariantType) {
event.cancel();
return;
}
int id = data.dataType().typeId();
if (id > unmappedDataTypes.zombieNautilusVariantType.typeId()) {
id--;
}
return entityDataTypes.byId(id);
data.setDataType(entityDataTypes.byId(id));
});
registerEntityDataTypeHandler1_20_3(
entityDataTypes.itemType,
entityDataTypes.blockStateType,
@@ -73,21 +82,19 @@ public final class EntityPacketRewriter1_21_11 extends EntityRewriter<Clientboun
entityDataTypes.optionalComponentType
);
filter().type(EntityTypes1_21_11.AVATAR).index(15).handler(((event, data) -> {
final int arm = data.value();
data.setTypeAndValue(entityDataTypes.byteType, (byte) arm);
}));
filter().type(EntityTypes1_21_11.WOLF).index(21).handler(this::absoluteToRelativeTicks);
filter().type(EntityTypes1_21_11.BEE).index(18).handler(this::absoluteToRelativeTicks);
filter().type(EntityTypes1_21_11.ABSTRACT_NAUTILUS).removeIndex(19); // Dashing
filter().type(EntityTypes1_21_11.ZOMBIE_NAUTILUS).removeIndex(20); // Variant
filter().type(EntityTypes1_21_11.ABSTRACT_NAUTILUS).cancel(17); // Tamable flags
filter().type(EntityTypes1_21_11.ABSTRACT_NAUTILUS).cancel(18); // Owner UUID
filter().type(EntityTypes1_21_11.ABSTRACT_NAUTILUS).cancel(19); // Dashing
filter().type(EntityTypes1_21_11.ZOMBIE_NAUTILUS).cancel(20); // Variant
}
private void absoluteToRelativeTicks(final EntityDataHandlerEvent event, final EntityData data) {
final long currentGameTime = event.user().get(GameTimeStorage.class).gameTime();
final long angerEndTime = data.value();
final int angerEndIn = Math.toIntExact(angerEndTime - currentGameTime);
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));
}
@@ -95,12 +95,15 @@ public final class Protocol1_21_2To1_21 extends BackwardsProtocol<ClientboundPac
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_2.SET_SUBTITLE_TEXT);
translatableRewriter.registerBossEvent(ClientboundPackets1_21_2.BOSS_EVENT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_2.DISCONNECT);
translatableRewriter.registerComponentPacket(ClientboundConfigurationPackets1_21.DISCONNECT);
translatableRewriter.registerTabList(ClientboundPackets1_21_2.TAB_LIST);
translatableRewriter.registerSetPlayerTeam1_13(ClientboundPackets1_21_2.SET_PLAYER_TEAM);
translatableRewriter.registerPlayerCombatKill1_20(ClientboundPackets1_21_2.PLAYER_COMBAT_KILL);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_2.SYSTEM_CHAT);
translatableRewriter.registerDisguisedChat(ClientboundPackets1_21_2.DISGUISED_CHAT);
translatableRewriter.registerPlayerChat(ClientboundPackets1_21_2.PLAYER_CHAT, ChatType.TYPE);
translatableRewriter.registerSetObjective(ClientboundPackets1_21_2.SET_OBJECTIVE);
translatableRewriter.registerSetScore1_20_3(ClientboundPackets1_21_2.SET_SCORE);
translatableRewriter.registerPing();
registerServerbound(ServerboundPackets1_20_5.CLIENT_INFORMATION, this::clientInformation);
@@ -88,12 +88,15 @@ public final class Protocol1_21_4To1_21_2 extends BackwardsProtocol<ClientboundP
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_2.SET_SUBTITLE_TEXT);
translatableRewriter.registerBossEvent(ClientboundPackets1_21_2.BOSS_EVENT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_2.DISCONNECT);
translatableRewriter.registerComponentPacket(ClientboundConfigurationPackets1_21.DISCONNECT);
translatableRewriter.registerTabList(ClientboundPackets1_21_2.TAB_LIST);
translatableRewriter.registerSetPlayerTeam1_13(ClientboundPackets1_21_2.SET_PLAYER_TEAM);
translatableRewriter.registerPlayerCombatKill1_20(ClientboundPackets1_21_2.PLAYER_COMBAT_KILL);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_2.SYSTEM_CHAT);
translatableRewriter.registerDisguisedChat(ClientboundPackets1_21_2.DISGUISED_CHAT);
translatableRewriter.registerPlayerChat(ClientboundPackets1_21_2.PLAYER_CHAT, ChatType.TYPE);
translatableRewriter.registerSetObjective(ClientboundPackets1_21_2.SET_OBJECTIVE);
translatableRewriter.registerSetScore1_20_3(ClientboundPackets1_21_2.SET_SCORE);
translatableRewriter.registerPing();
particleRewriter.registerExplode1_21_2(ClientboundPackets1_21_2.EXPLODE);
@@ -105,11 +105,14 @@ public final class Protocol1_21_5To1_21_4 extends BackwardsProtocol<ClientboundP
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_5.SET_SUBTITLE_TEXT);
translatableRewriter.registerBossEvent(ClientboundPackets1_21_5.BOSS_EVENT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_5.DISCONNECT);
translatableRewriter.registerComponentPacket(ClientboundConfigurationPackets1_21.DISCONNECT);
translatableRewriter.registerTabList(ClientboundPackets1_21_5.TAB_LIST);
translatableRewriter.registerPlayerCombatKill1_20(ClientboundPackets1_21_5.PLAYER_COMBAT_KILL);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_5.SYSTEM_CHAT);
translatableRewriter.registerDisguisedChat(ClientboundPackets1_21_5.DISGUISED_CHAT);
translatableRewriter.registerPlayerInfoUpdate1_21_4(ClientboundPackets1_21_5.PLAYER_INFO_UPDATE);
translatableRewriter.registerSetObjective(ClientboundPackets1_21_5.SET_OBJECTIVE);
translatableRewriter.registerSetScore1_20_3(ClientboundPackets1_21_5.SET_SCORE);
translatableRewriter.registerPing();
particleRewriter.registerLevelParticles1_21_4(ClientboundPackets1_21_5.LEVEL_PARTICLES);
@@ -131,6 +131,7 @@ public final class Protocol1_21_6To1_21_5 extends BackwardsProtocol<ClientboundP
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_6.SET_SUBTITLE_TEXT);
translatableRewriter.registerBossEvent(ClientboundPackets1_21_6.BOSS_EVENT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_6.DISCONNECT);
translatableRewriter.registerComponentPacket(ClientboundConfigurationPackets1_21_6.DISCONNECT);
translatableRewriter.registerTabList(ClientboundPackets1_21_6.TAB_LIST);
translatableRewriter.registerSetPlayerTeam1_21_5(ClientboundPackets1_21_6.SET_PLAYER_TEAM);
translatableRewriter.registerPlayerCombatKill1_20(ClientboundPackets1_21_6.PLAYER_COMBAT_KILL);
@@ -138,6 +139,8 @@ public final class Protocol1_21_6To1_21_5 extends BackwardsProtocol<ClientboundP
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_6.SYSTEM_CHAT);
translatableRewriter.registerDisguisedChat(ClientboundPackets1_21_6.DISGUISED_CHAT);
translatableRewriter.registerPlayerChat1_21_5(ClientboundPackets1_21_6.PLAYER_CHAT);
translatableRewriter.registerSetObjective(ClientboundPackets1_21_6.SET_OBJECTIVE);
translatableRewriter.registerSetScore1_20_3(ClientboundPackets1_21_6.SET_SCORE);
translatableRewriter.registerPing();
particleRewriter.registerLevelParticles1_21_4(ClientboundPackets1_21_6.LEVEL_PARTICLES);
@@ -84,6 +84,7 @@ public final class Protocol1_21_7To1_21_6 extends BackwardsProtocol<ClientboundP
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_6.SET_SUBTITLE_TEXT);
translatableRewriter.registerBossEvent(ClientboundPackets1_21_6.BOSS_EVENT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_6.DISCONNECT);
translatableRewriter.registerComponentPacket(ClientboundConfigurationPackets1_21_6.DISCONNECT);
translatableRewriter.registerTabList(ClientboundPackets1_21_6.TAB_LIST);
translatableRewriter.registerSetPlayerTeam1_21_5(ClientboundPackets1_21_6.SET_PLAYER_TEAM);
translatableRewriter.registerPlayerCombatKill1_20(ClientboundPackets1_21_6.PLAYER_COMBAT_KILL);
@@ -91,6 +92,8 @@ public final class Protocol1_21_7To1_21_6 extends BackwardsProtocol<ClientboundP
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_6.SYSTEM_CHAT);
translatableRewriter.registerDisguisedChat(ClientboundPackets1_21_6.DISGUISED_CHAT);
translatableRewriter.registerPlayerChat1_21_5(ClientboundPackets1_21_6.PLAYER_CHAT);
translatableRewriter.registerSetObjective(ClientboundPackets1_21_6.SET_OBJECTIVE);
translatableRewriter.registerSetScore1_20_3(ClientboundPackets1_21_6.SET_SCORE);
translatableRewriter.registerPing();
particleRewriter.registerLevelParticles1_21_4(ClientboundPackets1_21_6.LEVEL_PARTICLES);
@@ -55,6 +55,7 @@ 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.ParticleRewriter;
import com.viaversion.viaversion.rewriter.RegistryDataRewriter;
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
@@ -98,6 +99,7 @@ public final class Protocol1_21_9To1_21_7 extends BackwardsProtocol<ClientboundP
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_9.SET_SUBTITLE_TEXT);
translatableRewriter.registerBossEvent(ClientboundPackets1_21_9.BOSS_EVENT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_9.DISCONNECT);
translatableRewriter.registerComponentPacket(ClientboundConfigurationPackets1_21_9.DISCONNECT);
translatableRewriter.registerTabList(ClientboundPackets1_21_9.TAB_LIST);
translatableRewriter.registerSetPlayerTeam1_21_5(ClientboundPackets1_21_9.SET_PLAYER_TEAM);
translatableRewriter.registerPlayerCombatKill1_20(ClientboundPackets1_21_9.PLAYER_COMBAT_KILL);
@@ -105,6 +107,8 @@ public final class Protocol1_21_9To1_21_7 extends BackwardsProtocol<ClientboundP
translatableRewriter.registerComponentPacket(ClientboundPackets1_21_9.SYSTEM_CHAT);
translatableRewriter.registerDisguisedChat(ClientboundPackets1_21_9.DISGUISED_CHAT);
translatableRewriter.registerPlayerChat1_21_5(ClientboundPackets1_21_9.PLAYER_CHAT);
translatableRewriter.registerSetObjective(ClientboundPackets1_21_9.SET_OBJECTIVE);
translatableRewriter.registerSetScore1_20_3(ClientboundPackets1_21_9.SET_SCORE);
translatableRewriter.registerPing();
particleRewriter.registerLevelParticles1_21_4(ClientboundPackets1_21_9.LEVEL_PARTICLES);
@@ -199,6 +203,7 @@ public final class Protocol1_21_9To1_21_7 extends BackwardsProtocol<ClientboundP
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());
cancelClientbound(ClientboundPackets1_21_9.DEBUG_BLOCK_VALUE);
cancelClientbound(ClientboundPackets1_21_9.DEBUG_CHUNK_VALUE);
@@ -213,6 +218,7 @@ public final class Protocol1_21_9To1_21_7 extends BackwardsProtocol<ClientboundP
addItemHasher(connection, new ItemHasherBase(this, connection));
connection.put(new PlayerRotationStorage());
connection.put(new DimensionScaleStorage());
connection.put(new BundleStateTracker());
}
@Override
@@ -68,7 +68,6 @@ public final class BlockItemPacketRewriter1_21_9 extends BackwardsStructuredItem
registerSetContent1_21_2(ClientboundPackets1_21_9.CONTAINER_SET_CONTENT);
registerSetSlot1_21_2(ClientboundPackets1_21_9.CONTAINER_SET_SLOT);
registerAdvancements1_20_3(ClientboundPackets1_21_9.UPDATE_ADVANCEMENTS);
registerSetEquipment(ClientboundPackets1_21_9.SET_EQUIPMENT);
registerMerchantOffers1_20_5(ClientboundPackets1_21_9.MERCHANT_OFFERS);
registerContainerClick1_21_5(ServerboundPackets1_21_6.CONTAINER_CLICK);
registerSetCreativeModeSlot1_21_5(ServerboundPackets1_21_6.SET_CREATIVE_MODE_SLOT);
@@ -24,7 +24,9 @@ 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.tracker.EntityTracker1_21_9;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.data.entity.TrackedEntity;
import com.viaversion.viaversion.api.minecraft.BlockPosition;
import com.viaversion.viaversion.api.minecraft.GameProfile;
import com.viaversion.viaversion.api.minecraft.GlobalBlockPosition;
@@ -33,7 +35,9 @@ import com.viaversion.viaversion.api.minecraft.Vector3d;
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_6;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_9;
import com.viaversion.viaversion.api.minecraft.entitydata.EntityData;
import com.viaversion.viaversion.api.minecraft.entitydata.types.EntityDataTypes1_21_5;
import com.viaversion.viaversion.api.minecraft.item.Item;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
@@ -41,9 +45,13 @@ 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;
import java.util.BitSet;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;
import org.checkerframework.checker.nullness.qual.Nullable;
@@ -68,15 +76,16 @@ public final class EntityPacketRewriter1_21_9 extends EntityRewriter<Clientbound
final UUID uuid = wrapper.passthrough(Types.UUID);
final int entityTypeId = wrapper.passthrough(Types.VAR_INT);
wrapper.passthrough(Types.DOUBLE); // X
wrapper.passthrough(Types.DOUBLE); // Y
wrapper.passthrough(Types.DOUBLE); // Z
final double x = wrapper.passthrough(Types.DOUBLE);
final double y = wrapper.passthrough(Types.DOUBLE);
final double z = wrapper.passthrough(Types.DOUBLE);
final Vector3d movement = wrapper.read(Types.MOVEMENT_VECTOR);
wrapper.passthrough(Types.BYTE); // Pitch
wrapper.passthrough(Types.BYTE); // Yaw
wrapper.passthrough(Types.BYTE); // Head yaw
final byte pitch = wrapper.passthrough(Types.BYTE);
final byte yaw = wrapper.passthrough(Types.BYTE);
final byte headYaw = wrapper.passthrough(Types.BYTE);
final int data = wrapper.passthrough(Types.VAR_INT);
final EntityType entityType = trackAndRewrite(wrapper, entityTypeId, entityId);
if (protocol.getMappingData() != null && entityType == EntityTypes1_21_9.FALLING_BLOCK) {
@@ -89,11 +98,72 @@ public final class EntityPacketRewriter1_21_9 extends EntityRewriter<Clientbound
if (EntityTypes1_21_9.getTypeFromId(entityTypeId) == EntityTypes1_21_9.MANNEQUIN) {
final String name = randomHackyEmptyName();
final MannequinData mannequinData = new MannequinData(uuid, name);
tracker(wrapper.user()).entity(entityId).data().put(mannequinData);
sendInitialPlayerInfoUpdate(wrapper, mannequinData);
final TrackedEntity trackedEntity = tracker(wrapper.user()).entity(entityId);
trackedEntity.data().put(mannequinData);
sendInitialPlayerInfoUpdate(wrapper.user(), mannequinData, null, new GameProfile.Property[0]);
mannequinData.setPosition(x, y, z);
mannequinData.setRotation(yaw, pitch);
mannequinData.setHeadYaw(headYaw);
}
});
// Track movement
protocol.registerClientbound(ClientboundPackets1_21_9.TELEPORT_ENTITY, this::trackMannequinTeleport);
protocol.registerClientbound(ClientboundPackets1_21_9.ENTITY_POSITION_SYNC, this::trackMannequinTeleport);
protocol.registerClientbound(ClientboundPackets1_21_9.MOVE_ENTITY_POS, wrapper -> storeMovementMannequinData(wrapper, true, false));
protocol.registerClientbound(ClientboundPackets1_21_9.MOVE_ENTITY_POS_ROT, wrapper -> storeMovementMannequinData(wrapper, true, true));
protocol.registerClientbound(ClientboundPackets1_21_9.MOVE_ENTITY_ROT, wrapper -> storeMovementMannequinData(wrapper, false, true));
protocol.registerClientbound(ClientboundPackets1_21_9.ROTATE_HEAD, wrapper -> {
final int vehicleId = wrapper.passthrough(Types.VAR_INT);
final byte headRotation = wrapper.passthrough(Types.BYTE);
final EntityTracker1_21_9 tracker = tracker(wrapper.user());
final TrackedEntity trackedEntity = tracker.entity(vehicleId);
if (trackedEntity != null && trackedEntity.hasData()) {
final MannequinData data = trackedEntity.data().get(MannequinData.class);
if (data != null) {
data.setHeadYaw(headRotation);
}
}
});
// Track passengers
protocol.registerClientbound(ClientboundPackets1_21_9.SET_PASSENGERS, wrapper -> {
final int vehicleId = wrapper.passthrough(Types.VAR_INT);
final int[] passengerIds = wrapper.passthrough(Types.VAR_INT_ARRAY_PRIMITIVE);
final EntityTracker1_21_9 tracker = tracker(wrapper.user());
final TrackedEntity trackedEntity = tracker.entity(vehicleId);
if (trackedEntity != null && trackedEntity.hasData()) {
final MannequinData data = trackedEntity.data().get(MannequinData.class);
if (data != null) {
data.setPassengers(passengerIds);
}
}
});
// Track items
protocol.registerClientbound(ClientboundPackets1_21_9.SET_EQUIPMENT, wrapper -> {
final int entityId = wrapper.passthrough(Types.VAR_INT);
final TrackedEntity trackedEntity = tracker(wrapper.user()).entity(entityId);
final MannequinData mannequinData = trackedEntity != null && trackedEntity.hasData() ? trackedEntity.data().get(MannequinData.class) : null;
byte slot;
do {
slot = wrapper.passthrough(Types.BYTE);
final Item item = protocol.getItemRewriter().handleItemToClient(wrapper.user(), wrapper.read(protocol.getItemRewriter().itemType()));
wrapper.write(protocol.getItemRewriter().mappedItemType(), item);
if (mannequinData != null) {
mannequinData.setEquipment((byte) (slot & 0x7F), item);
}
} while (slot < 0);
});
// Back to more non-mannequin things
protocol.registerClientbound(ClientboundPackets1_21_9.SET_ENTITY_MOTION, wrapper -> {
wrapper.passthrough(Types.VAR_INT); // Entity ID
writeMovementShorts(wrapper, wrapper.read(Types.MOVEMENT_VECTOR));
@@ -135,8 +205,63 @@ public final class EntityPacketRewriter1_21_9 extends EntityRewriter<Clientbound
protocol.registerServerbound(ServerboundPackets1_21_6.MOVE_PLAYER_ROT, this::storePlayerRotation);
}
private void sendInitialPlayerInfoUpdate(final PacketWrapper wrapper, final MannequinData mannequinData) {
final PacketWrapper playerInfo = wrapper.create(ClientboundPackets1_21_6.PLAYER_INFO_UPDATE);
private void trackMannequinTeleport(final PacketWrapper wrapper) {
final int entityId = wrapper.passthrough(Types.VAR_INT);
final EntityTracker1_21_9 tracker = tracker(wrapper.user());
final TrackedEntity trackedEntity = tracker.entity(entityId);
if (trackedEntity == null || !trackedEntity.hasData()) {
return;
}
final MannequinData mannequinData = trackedEntity.data().get(MannequinData.class);
if (mannequinData == null) {
return;
}
final double x = wrapper.passthrough(Types.DOUBLE);
final double y = wrapper.passthrough(Types.DOUBLE);
final double z = wrapper.passthrough(Types.DOUBLE);
wrapper.passthrough(Types.DOUBLE); // Delta movement X
wrapper.passthrough(Types.DOUBLE); // Delta movement Y
wrapper.passthrough(Types.DOUBLE); // Delta movement Z
final byte yaw = (byte) Math.floor(wrapper.passthrough(Types.FLOAT) * 256F / 360F);
final byte pitch = (byte) Math.floor(wrapper.passthrough(Types.FLOAT) * 256F / 360F);
mannequinData.setPosition(x, y, z);
mannequinData.setRotation(yaw, pitch);
}
private void storeMovementMannequinData(final PacketWrapper wrapper, final boolean position, final boolean rotation) {
final int entityId = wrapper.passthrough(Types.VAR_INT);
final TrackedEntity trackedEntity = tracker(wrapper.user()).entity(entityId);
if (trackedEntity == null || !trackedEntity.hasData()) {
return;
}
final MannequinData mannequinData = trackedEntity.data().get(MannequinData.class);
if (mannequinData == null) {
return;
}
if (position) {
final double deltaX = wrapper.passthrough(Types.SHORT) / 4096.0;
final double deltaY = wrapper.passthrough(Types.SHORT) / 4096.0;
final double deltaZ = wrapper.passthrough(Types.SHORT) / 4096.0;
mannequinData.setPosition(mannequinData.x() + deltaX, mannequinData.y() + deltaY, mannequinData.z() + deltaZ);
}
if (rotation) {
final byte yaw = wrapper.passthrough(Types.BYTE);
final byte pitch = wrapper.passthrough(Types.BYTE);
mannequinData.setRotation(yaw, pitch);
}
}
private void sendInitialPlayerInfoUpdate(final UserConnection connection, final MannequinData mannequinData, final @Nullable String nameOverride, final GameProfile.Property[] properties) {
final PacketWrapper playerInfo = PacketWrapper.create(ClientboundPackets1_21_6.PLAYER_INFO_UPDATE, connection);
final BitSet actions = new BitSet(8);
for (int i = 0; i < 8; i++) {
@@ -145,8 +270,8 @@ public final class EntityPacketRewriter1_21_9 extends EntityRewriter<Clientbound
playerInfo.write(Types.PROFILE_ACTIONS_ENUM1_21_4, actions);
playerInfo.write(Types.VAR_INT, 1); // One entry
playerInfo.write(Types.UUID, mannequinData.uuid());
playerInfo.write(Types.STRING, mannequinData.name());
playerInfo.write(Types.PROFILE_PROPERTY_ARRAY, new GameProfile.Property[0]);
playerInfo.write(Types.STRING, nameOverride != null ? nameOverride : mannequinData.name());
playerInfo.write(Types.PROFILE_PROPERTY_ARRAY, properties);
playerInfo.write(Types.BOOLEAN, false); // Session info
playerInfo.write(Types.VAR_INT, 0); // Gamemode
playerInfo.write(Types.BOOLEAN, false); // Listed
@@ -156,7 +281,7 @@ public final class EntityPacketRewriter1_21_9 extends EntityRewriter<Clientbound
playerInfo.write(Types.BOOLEAN, true); // Show hat
playerInfo.send(Protocol1_21_9To1_21_7.class);
sendPlayerTeamDisplayName(wrapper.user(), mannequinData, null);
sendPlayerTeamDisplayName(connection, mannequinData, mannequinData.displayName());
}
private void sendPlayerInfoDisplayNameUpdate(final UserConnection connection, final MannequinData mannequinData, @Nullable final Tag displayName) {
@@ -191,18 +316,6 @@ public final class EntityPacketRewriter1_21_9 extends EntityRewriter<Clientbound
addTeam.send(Protocol1_21_9To1_21_7.class);
}
private void sendPlayerInfoProfileUpdate(final UserConnection connection, final UUID uuid, @Nullable final String name, final GameProfile.Property[] properties) {
final PacketWrapper playerInfo = PacketWrapper.create(ClientboundPackets1_21_6.PLAYER_INFO_UPDATE, connection);
final BitSet actions = new BitSet(8);
actions.set(0);
playerInfo.write(Types.PROFILE_ACTIONS_ENUM1_21_4, actions);
playerInfo.write(Types.VAR_INT, 1);
playerInfo.write(Types.UUID, uuid);
playerInfo.write(Types.STRING, name != null ? name : randomHackyEmptyName());
playerInfo.write(Types.PROFILE_PROPERTY_ARRAY, properties);
playerInfo.send(Protocol1_21_9To1_21_7.class);
}
private String randomHackyEmptyName() {
final StringBuilder builder = new StringBuilder();
// Player names cannot be updated after the initial add without fully respawning them;
@@ -283,15 +396,84 @@ public final class EntityPacketRewriter1_21_9 extends EntityRewriter<Clientbound
}
});
filter().type(EntityTypes1_21_9.MANNEQUIN).handler(((event, data) -> {
filter().type(EntityTypes1_21_9.MANNEQUIN).handler((event, data) -> {
if (event.index() == 2) { // Display name
final Tag displayName = data.value();
final MannequinData mannequinData = event.trackedEntity().data().get(MannequinData.class);
mannequinData.setDisplayName(displayName);
sendPlayerInfoDisplayNameUpdate(event.user(), mannequinData, displayName);
} else if (event.index() == 17) { // Profile
final boolean isBundling = event.user().get(BundleStateTracker.class).isBundling();
if (!isBundling) {
final PacketWrapper bundleStart = PacketWrapper.create(ClientboundPackets1_21_6.BUNDLE_DELIMITER, event.user());
bundleStart.send(Protocol1_21_9To1_21_7.class);
}
final ResolvableProfile profile = data.value();
final UUID uuid = event.trackedEntity().data().get(MannequinData.class).uuid();
sendPlayerInfoProfileUpdate(event.user(), uuid, profile.profile().name(), profile.profile().properties());
final MannequinData mannequinData = event.trackedEntity().data().get(MannequinData.class);
final UUID uuid = mannequinData.uuid();
// Remove the old entity
final PacketWrapper removeEntityPacket = PacketWrapper.create(ClientboundPackets1_21_6.REMOVE_ENTITIES, event.user());
removeEntityPacket.write(Types.VAR_INT_ARRAY_PRIMITIVE, new int[]{event.entityId()});
removeEntityPacket.send(Protocol1_21_9To1_21_7.class);
final PacketWrapper playerInfoRemove = PacketWrapper.create(ClientboundPackets1_21_6.PLAYER_INFO_REMOVE, event.user());
playerInfoRemove.write(Types.UUID_ARRAY, new UUID[]{uuid});
playerInfoRemove.send(Protocol1_21_9To1_21_7.class);
// Spawn new entity
sendInitialPlayerInfoUpdate(event.user(), mannequinData, profile.profile().name(), profile.profile().properties());
final PacketWrapper spawnEntityPacket = PacketWrapper.create(ClientboundPackets1_21_6.ADD_ENTITY, event.user());
spawnEntityPacket.write(Types.VAR_INT, event.entityId());
spawnEntityPacket.write(Types.UUID, mannequinData.uuid());
spawnEntityPacket.write(Types.VAR_INT, EntityTypes1_21_6.PLAYER.getId());
spawnEntityPacket.write(Types.DOUBLE, mannequinData.x());
spawnEntityPacket.write(Types.DOUBLE, mannequinData.y());
spawnEntityPacket.write(Types.DOUBLE, mannequinData.z());
spawnEntityPacket.write(Types.BYTE, mannequinData.pitch());
spawnEntityPacket.write(Types.BYTE, mannequinData.yaw());
spawnEntityPacket.write(Types.BYTE, mannequinData.headYaw());
spawnEntityPacket.write(Types.VAR_INT, 0); // Data
spawnEntityPacket.write(Types.SHORT, (short) 0); // Velocity X
spawnEntityPacket.write(Types.SHORT, (short) 0); // Velocity Y
spawnEntityPacket.write(Types.SHORT, (short) 0); // Velocity Z
spawnEntityPacket.send(Protocol1_21_9To1_21_7.class);
// Re-apply entity data previously set
final PacketWrapper setEntityDataPacket = PacketWrapper.create(ClientboundPackets1_21_6.SET_ENTITY_DATA, event.user());
setEntityDataPacket.write(Types.VAR_INT, event.entityId());
setEntityDataPacket.write(VersionedTypes.V1_21_6.entityDataList, mannequinData.entityData());
setEntityDataPacket.send(Protocol1_21_9To1_21_7.class);
// Re-attach all passengers
if (mannequinData.passengers() != null) {
final PacketWrapper setPassengersPacket = PacketWrapper.create(ClientboundPackets1_21_6.SET_PASSENGERS, event.user());
setPassengersPacket.write(Types.VAR_INT, event.entityId());
setPassengersPacket.write(Types.VAR_INT_ARRAY_PRIMITIVE, mannequinData.passengers());
setPassengersPacket.send(Protocol1_21_9To1_21_7.class);
}
// Put on items
if (!mannequinData.itemMap().isEmpty()) {
final PacketWrapper equipment = PacketWrapper.create(ClientboundPackets1_21_6.SET_EQUIPMENT, event.user());
equipment.write(Types.VAR_INT, event.entityId());
int i = 0;
for (final Map.Entry<Byte, Item> itemEntry : mannequinData.itemMap().entrySet()) {
final boolean more = i < mannequinData.itemMap().size() - 1;
equipment.write(Types.BYTE, more ? (byte) (itemEntry.getKey() | -128) : itemEntry.getKey());
equipment.write(protocol.getItemRewriter().mappedItemType(), itemEntry.getValue());
i++;
}
equipment.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);
}
event.cancel();
} else if (event.index() == 15) {
event.setIndex(18);
@@ -303,7 +485,30 @@ public final class EntityPacketRewriter1_21_9 extends EntityRewriter<Clientbound
} else if (event.index() == 19) {
event.cancel(); // Description
}
}));
});
}
@Override
public void handleEntityData(final int entityId, final List<EntityData> dataList, final UserConnection connection) {
super.handleEntityData(entityId, dataList, connection);
final EntityTracker1_21_9 tracker = tracker(connection);
final EntityType entityType = tracker.entityType(entityId);
if (entityType == null || !entityType.isOrHasParent(EntityTypes1_21_9.MANNEQUIN)) {
return;
}
final MannequinData mannequinData = tracker.entity(entityId).data().get(MannequinData.class);
if (mannequinData == null) {
return;
}
final List<EntityData> entityData = mannequinData.entityData();
entityData.removeIf(first -> dataList.stream().anyMatch(second -> first.id() == second.id()));
for (final EntityData data : dataList) {
final Object value = data.value();
entityData.add(new EntityData(data.id(), data.dataType(), Copyable.copy(value)));
}
}
@Override
@@ -17,6 +17,14 @@
*/
package com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.storage;
import com.viaversion.nbt.tag.Tag;
import com.viaversion.viaversion.api.minecraft.entitydata.EntityData;
import com.viaversion.viaversion.api.minecraft.item.Item;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
public final class MannequinData {
@@ -24,6 +32,22 @@ public final class MannequinData {
private final String name;
private boolean hasTeam;
private double x;
private double y;
private double z;
// Packed values
private byte yaw;
private byte pitch;
private byte headYaw;
private int[] passengers;
private final List<EntityData> entityData = new ArrayList<>();
private final Map<Byte, Item> itemMap = new HashMap<>();
private Tag displayName;
public MannequinData(final UUID uuid, final String name) {
this.uuid = uuid;
this.name = name;
@@ -44,4 +68,71 @@ public final class MannequinData {
public String name() {
return name;
}
public void setPosition(final double x, final double y, final double z) {
this.x = x;
this.y = y;
this.z = z;
}
public void setRotation(final byte yaw, final byte pitch) {
this.yaw = yaw;
this.pitch = pitch;
}
public void setPassengers(final int[] passengers) {
this.passengers = passengers;
}
public double x() {
return x;
}
public double y() {
return y;
}
public double z() {
return z;
}
public byte yaw() {
return yaw;
}
public byte pitch() {
return pitch;
}
public List<EntityData> entityData() {
return entityData;
}
public int[] passengers() {
return passengers;
}
public void setDisplayName(Tag displayName) {
this.displayName = displayName;
}
public Tag displayName() {
return displayName;
}
public void setEquipment(byte slot, Item item) {
itemMap.put(slot, item);
}
public Map<Byte, Item> itemMap() {
return itemMap;
}
public byte headYaw() {
return headYaw;
}
public void setHeadYaw(byte headYaw) {
this.headYaw = headYaw;
}
}
@@ -92,10 +92,13 @@ public final class Protocol1_21To1_20_5 extends BackwardsProtocol<ClientboundPac
translatableRewriter.registerComponentPacket(ClientboundPackets1_21.SET_SUBTITLE_TEXT);
translatableRewriter.registerBossEvent(ClientboundPackets1_21.BOSS_EVENT);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21.DISCONNECT);
translatableRewriter.registerComponentPacket(ClientboundConfigurationPackets1_21.DISCONNECT);
translatableRewriter.registerTabList(ClientboundPackets1_21.TAB_LIST);
translatableRewriter.registerSetPlayerTeam1_13(ClientboundPackets1_21.SET_PLAYER_TEAM);
translatableRewriter.registerPlayerCombatKill1_20(ClientboundPackets1_21.PLAYER_COMBAT_KILL);
translatableRewriter.registerComponentPacket(ClientboundPackets1_21.SYSTEM_CHAT);
translatableRewriter.registerSetObjective(ClientboundPackets1_21.SET_OBJECTIVE);
translatableRewriter.registerSetScore1_20_3(ClientboundPackets1_21.SET_SCORE);
translatableRewriter.registerPing();
// Format change we can't properly map - all this really results in is a desync one version earlier
+1 -1
View File
@@ -1,4 +1,4 @@
projectVersion=5.6.0
projectVersion=5.7.0
# Smile emoji (note that modrinth may not have added the version on release yet)
mcVersions=1.21.11, 1.21.10, 1.21.9, 1.21.8, 1.21.7, 1.21.6, 1.21.5, 1.21.4, 1.21.3, 1.21.2, 1.21.1, 1.21, 1.20.6, 1.20.5, 1.20.4, 1.20.3, 1.20.2, 1.20.1, 1.20, 1.19.4, 1.19.3, 1.19.2, 1.19.1, 1.19, 1.18.2, 1.18.1, 1.18, 1.17.1, 1.17, 1.16.5, 1.16.4, 1.16.3, 1.16.2, 1.16.1, 1.16, 1.15.2, 1.15.1, 1.15, 1.14.4, 1.14.3, 1.14.2, 1.14.1, 1.14, 1.13.2, 1.13.1, 1.13, 1.12.2, 1.12.1, 1.12, 1.11.2, 1.11.1, 1.11, 1.10.2, 1.10.1, 1.10
+2 -2
View File
@@ -3,7 +3,7 @@ metadata.format.version = "1.1"
[versions]
# ViaVersion
viaver = "5.6.0"
viaver = "5.7.0"
# Common provided
netty = "4.0.20.Final"
@@ -16,7 +16,7 @@ checkerQual = "3.51.0"
paper = "1.16.5-R0.1-SNAPSHOT"
velocity = "3.1.1"
fabricLoader = "0.11.6"
viaProxy = "3.4.7-SNAPSHOT"
viaProxy = "[3.0.0,4.0.0)"
[libraries]
@@ -47,7 +47,7 @@
},
{
"id": "viaversion",
"version": "[5.6.0-SNAPSHOT,)"
"version": "[5.7.0-SNAPSHOT,)"
}
]
},