24w03a (maybe, and it's a bit ugly)

This commit is contained in:
Nassim Jahnke 2024-01-17 21:04:44 +01:00
parent 0946c72bdc
commit 5d5c98acc6
No known key found for this signature in database
GPG Key ID: EF6771C01F6EF02F
25 changed files with 748 additions and 90 deletions

View File

@ -113,5 +113,7 @@ public interface MappingData {
@Nullable FullMappings getArgumentTypeMappings();
@Nullable FullMappings getRecipeSerializerMappings();
@Nullable Mappings getPaintingMappings();
}

View File

@ -44,6 +44,7 @@ public class MappingDataBase implements MappingData {
protected BiMappings itemMappings;
protected FullMappings argumentTypeMappings;
protected FullMappings entityMappings;
protected FullMappings recipeSerializerMappings;
protected ParticleMappings particleMappings;
protected Mappings blockMappings;
protected Mappings blockStateMappings;
@ -84,6 +85,7 @@ public class MappingDataBase implements MappingData {
if (unmappedIdentifierData != null && mappedIdentifierData != null) {
entityMappings = loadFullMappings(data, unmappedIdentifierData, mappedIdentifierData, "entities");
argumentTypeMappings = loadFullMappings(data, unmappedIdentifierData, mappedIdentifierData, "argumenttypes");
recipeSerializerMappings = loadFullMappings(data, unmappedIdentifierData, mappedIdentifierData, "recipe_serializers");
final ListTag unmappedParticles = unmappedIdentifierData.get("particles");
final ListTag mappedParticles = mappedIdentifierData.get("particles");
@ -241,6 +243,11 @@ public class MappingDataBase implements MappingData {
return paintingMappings;
}
@Override
public @Nullable FullMappings getRecipeSerializerMappings() {
return recipeSerializerMappings;
}
protected Logger getLogger() {
return Via.getPlatform().getLogger();
}

View File

@ -136,13 +136,31 @@ public abstract class AbstractProtocol<CU extends ClientboundPacketType, CM exte
final ServerboundPacketType finishConfigurationPacket = serverboundFinishConfigurationPacket();
if (finishConfigurationPacket != null) {
final int id = finishConfigurationPacket.getId();
registerServerbound(State.CONFIGURATION, id, id, setClientStateHandler(State.PLAY));
final PacketMapping mapping = serverboundMappings.mappedPacket(State.CONFIGURATION, id); // Use existing handler if present
registerServerbound(State.CONFIGURATION, id, id, wrapper -> {
if (mapping != null) {
mapping.applyType(wrapper);
if (mapping.handler() != null) {
mapping.handler().handle(wrapper);
}
}
setClientStateHandler(State.PLAY).handle(wrapper);
}, true);
}
final ClientboundPacketType clientboundFinishConfigurationPacket = clientboundFinishConfigurationPacket();
if (clientboundFinishConfigurationPacket != null) {
final int id = clientboundFinishConfigurationPacket.getId();
registerClientbound(State.CONFIGURATION, id, id, setServerStateHandler(State.PLAY));
final PacketMapping mapping = clientboundMappings.mappedPacket(State.CONFIGURATION, id); // Use existing handler if present
registerClientbound(State.CONFIGURATION, id, id, wrapper -> {
if (mapping != null) {
mapping.applyType(wrapper);
if (mapping.handler() != null) {
mapping.handler().handle(wrapper);
}
}
setServerStateHandler(State.PLAY).handle(wrapper);
}, true);
}
}
@ -154,23 +172,62 @@ public abstract class AbstractProtocol<CU extends ClientboundPacketType, CM exte
) {
for (Map.Entry<State, PacketTypeMap<M>> entry : mappedPacketTypes.entrySet()) {
PacketTypeMap<M> mappedTypes = entry.getValue();
for (U unmappedType : unmappedPacketTypes.get(entry.getKey()).types()) {
M mappedType = mappedTypes.typeByName(unmappedType.getName());
if (mappedType == null) {
// No mapped packet of the same name exists
Preconditions.checkArgument(registeredPredicate.test(unmappedType),
"Packet %s in %s has no mapping - it needs to be manually cancelled or remapped", unmappedType, getClass());
continue;
}
PacketTypeMap<U> unmappedTypes = unmappedPacketTypes.get(entry.getKey());
registerPacketIdChanges(unmappedTypes, mappedTypes, registeredPredicate, registerConsumer, true);
}
}
// Register if no custom handler exists and ids are different
if (unmappedType.getId() != mappedType.getId() && !registeredPredicate.test(unmappedType)) {
registerConsumer.accept(unmappedType, mappedType);
}
protected <U extends PacketType, M extends PacketType> void registerPacketIdChanges(PacketTypeMap<U> unmappedTypes, PacketTypeMap<M> mappedTypes, Predicate<U> registeredPredicate, BiConsumer<U, M> registerConsumer, boolean errorOnMissing) {
for (U unmappedType : unmappedTypes.types()) {
M mappedType = mappedTypes.typeByName(unmappedType.getName());
if (mappedType == null) {
// No mapped packet of the same name exists
Preconditions.checkArgument(registeredPredicate.test(unmappedType) || !errorOnMissing,
"Packet %s in %s has no mapping - it needs to be manually cancelled or remapped", unmappedType, getClass());
continue;
}
// Register if no custom handler exists and ids are different
if (unmappedType.getId() != mappedType.getId() && !registeredPredicate.test(unmappedType)) {
registerConsumer.accept(unmappedType, mappedType);
}
}
}
@Deprecated // TODO Should instead be done automatically/properly via the packet types provider
protected void registerClientboundPacketIdChanges(State state, Class<? extends ClientboundPacketType> unmappedPacketTypesClass, Class<? extends ClientboundPacketType> mappedPacketTypesClass) {
registerPacketIdChanges(
PacketTypeMap.of(unmappedPacketTypesClass),
PacketTypeMap.of(mappedPacketTypesClass),
type -> false,
(unmappedType, mappedType) -> {
final PacketMapping mapping = clientboundMappings.mappedPacket(state, unmappedType.getId());
this.registerClientbound(state, unmappedType.getId(), mappedType.getId(), wrapper -> {
if (mapping != null && mapping.handler() != null) {
mapping.handler().handle(wrapper);
}
}, true);
}, false
);
}
@Deprecated // TODO Should instead be done automatically/properly via the packet types provider
protected void registerServerboundPacketIdChanges(State state, Class<? extends ServerboundPacketType> unmappedPacketTypesClass, Class<? extends ServerboundPacketType> mappedPacketTypesClass) {
registerPacketIdChanges(
PacketTypeMap.of(unmappedPacketTypesClass),
PacketTypeMap.of(mappedPacketTypesClass),
type -> false,
(unmappedType, mappedType) -> {
final PacketMapping mapping = serverboundMappings.mappedPacket(state, unmappedType.getId());
this.registerServerbound(state, unmappedType.getId(), mappedType.getId(), wrapper -> {
if (mapping != null && mapping.handler() != null) {
mapping.handler().handle(wrapper);
}
}, true);
}, false
);
}
@Override
public final void loadMappingData() {
getMappingData().load();
@ -228,7 +285,7 @@ public abstract class AbstractProtocol<CU extends ClientboundPacketType, CM exte
return PacketMappings.arrayMappings();
}
private <P extends PacketType> Map<State, PacketTypeMap<P>> packetTypeMap(Class<P> packetTypeClass) {
protected <P extends PacketType> Map<State, PacketTypeMap<P>> packetTypeMap(@Nullable Class<P> packetTypeClass) {
if (packetTypeClass != null) {
Map<State, PacketTypeMap<P>> map = new EnumMap<>(State.class);
map.put(State.PLAY, PacketTypeMap.of(packetTypeClass));

View File

@ -86,7 +86,7 @@ public class ProtocolVersion {
public static final ProtocolVersion v1_20 = register(763, "1.20/1.20.1", new VersionRange("1.20", 0, 1));
public static final ProtocolVersion v1_20_2 = register(764, "1.20.2");
public static final ProtocolVersion v1_20_3 = register(765, "1.20.3/1.20.4", new VersionRange("1.20", 3, 4));
public static final ProtocolVersion v1_20_5 = register(766, 170, "1.20.5");
public static final ProtocolVersion v1_20_5 = register(766, 171, "1.20.5");
public static final ProtocolVersion unknown = register(-1, "UNKNOWN");
public static ProtocolVersion register(int version, String name) {

View File

@ -24,10 +24,10 @@ package com.viaversion.viaversion.api.type.types.misc;
import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.api.data.ParticleMappings;
import com.viaversion.viaversion.api.minecraft.Particle;
import com.viaversion.viaversion.api.minecraft.item.Item;
import com.viaversion.viaversion.api.protocol.Protocol;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.api.minecraft.Particle;
import com.viaversion.viaversion.util.Key;
import io.netty.buffer.ByteBuf;
import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;
@ -66,12 +66,15 @@ public class ParticleType extends Type<Particle> {
public Particle read(final ByteBuf buffer) throws Exception {
final int type = Type.VAR_INT.readPrimitive(buffer);
final Particle particle = new Particle(type);
readData(buffer, particle);
return particle;
}
final ParticleReader reader = readers.get(type);
public void readData(final ByteBuf buffer, final Particle particle) throws Exception {
final ParticleReader reader = readers.get(particle.getId());
if (reader != null) {
reader.read(buffer, particle);
}
return particle;
}
public static ParticleReader itemHandler(final Type<Item> itemType) {

View File

@ -25,7 +25,8 @@ public enum ClientboundLoginPackets implements ClientboundPacketType {
HELLO, // 0x01
GAME_PROFILE, // 0x02
LOGIN_COMPRESSION, // 0x03
CUSTOM_QUERY; // 0x04
CUSTOM_QUERY, // 0x04
COOKIE_REQUEST; // 0x05
@Override
public final int getId() {

View File

@ -24,7 +24,8 @@ public enum ServerboundLoginPackets implements ServerboundPacketType {
HELLO, // 0x00
ENCRYPTION_KEY, // 0x01
CUSTOM_QUERY_ANSWER, // 0x02
LOGIN_ACKNOWLEDGED; // 0x03
LOGIN_ACKNOWLEDGED, // 0x03
COOKIE_RESPONSE; // 0x04
@Override
public final int getId() {

View File

@ -42,6 +42,7 @@ import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.Clientb
import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ServerboundPackets1_20_3;
import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.rewriter.BlockItemPacketRewriter1_20_3;
import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.rewriter.EntityPacketRewriter1_20_3;
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet.ClientboundConfigurationPackets1_20_5;
import com.viaversion.viaversion.rewriter.SoundRewriter;
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
import com.viaversion.viaversion.rewriter.TagRewriter;
@ -297,9 +298,8 @@ public final class Protocol1_20_3To1_20_2 extends AbstractProtocol<ClientboundPa
registerServerbound(State.CONFIGURATION, ServerboundConfigurationPackets1_20_2.RESOURCE_PACK, resourcePackStatusHandler());
registerClientbound(State.CONFIGURATION, ClientboundConfigurationPackets1_20_2.RESOURCE_PACK.getId(), ClientboundConfigurationPackets1_20_3.RESOURCE_PACK_PUSH.getId(), resourcePackHandler(ClientboundConfigurationPackets1_20_3.RESOURCE_PACK_POP));
// TODO Auto map via packet types provider
registerClientbound(State.CONFIGURATION, ClientboundConfigurationPackets1_20_2.UPDATE_ENABLED_FEATURES.getId(), ClientboundConfigurationPackets1_20_3.UPDATE_ENABLED_FEATURES.getId());
registerClientbound(State.CONFIGURATION, ClientboundConfigurationPackets1_20_2.UPDATE_TAGS.getId(), ClientboundConfigurationPackets1_20_3.UPDATE_TAGS.getId(), tagRewriter.getGenericHandler());
registerClientboundPacketIdChanges(State.CONFIGURATION, ClientboundConfigurationPackets1_20_2.class, ClientboundConfigurationPackets1_20_3.class);
}
private PacketHandler resourcePackStatusHandler() {

View File

@ -25,25 +25,32 @@ import com.viaversion.viaversion.api.protocol.AbstractProtocol;
import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType;
import com.viaversion.viaversion.api.protocol.packet.ServerboundPacketType;
import com.viaversion.viaversion.api.protocol.packet.State;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
import com.viaversion.viaversion.protocols.base.ClientboundLoginPackets;
import com.viaversion.viaversion.protocols.base.ServerboundLoginPackets;
import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.packet.ServerboundConfigurationPackets1_20_2;
import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ClientboundConfigurationPackets1_20_3;
import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ClientboundPackets1_20_3;
import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ServerboundPackets1_20_3;
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet.ClientboundConfigurationPackets1_20_5;
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet.ClientboundPackets1_20_5;
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet.ServerboundConfigurationPackets1_20_5;
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet.ServerboundPackets1_20_5;
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.rewriter.BlockItemPacketRewriter1_20_5;
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.rewriter.EntityPacketRewriter1_20_5;
import com.viaversion.viaversion.rewriter.SoundRewriter;
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
import com.viaversion.viaversion.rewriter.TagRewriter;
public final class Protocol1_20_5To1_20_3 extends AbstractProtocol<ClientboundPackets1_20_3, ClientboundPackets1_20_3, ServerboundPackets1_20_3, ServerboundPackets1_20_3> {
public final class Protocol1_20_5To1_20_3 extends AbstractProtocol<ClientboundPackets1_20_3, ClientboundPackets1_20_5, ServerboundPackets1_20_3, ServerboundPackets1_20_5> {
public static final MappingData MAPPINGS = new MappingDataBase("1.20.3", "1.20.5");
private final EntityPacketRewriter1_20_5 entityRewriter = new EntityPacketRewriter1_20_5(this);
private final BlockItemPacketRewriter1_20_5 itemRewriter = new BlockItemPacketRewriter1_20_5(this);
public Protocol1_20_5To1_20_3() {
super(ClientboundPackets1_20_3.class, ClientboundPackets1_20_3.class, ServerboundPackets1_20_3.class, ServerboundPackets1_20_3.class);
super(ClientboundPackets1_20_3.class, ClientboundPackets1_20_5.class, ServerboundPackets1_20_3.class, ServerboundPackets1_20_5.class);
}
@Override
@ -56,9 +63,33 @@ public final class Protocol1_20_5To1_20_3 extends AbstractProtocol<ClientboundPa
final SoundRewriter<ClientboundPackets1_20_3> soundRewriter = new SoundRewriter<>(this);
soundRewriter.register1_19_3Sound(ClientboundPackets1_20_3.SOUND);
soundRewriter.registerSound(ClientboundPackets1_20_3.ENTITY_SOUND);
registerClientbound(ClientboundPackets1_20_3.ENTITY_SOUND, wrapper -> {
// Now also written as a sound event with 0 marking a following resource location string
final int soundId = wrapper.read(Type.VAR_INT);
wrapper.write(Type.VAR_INT, MAPPINGS.getSoundMappings().getNewId(soundId) + 1);
});
new StatisticsRewriter<>(this).register(ClientboundPackets1_20_3.STATISTICS);
registerClientbound(State.LOGIN, ClientboundLoginPackets.HELLO, wrapper -> {
wrapper.passthrough(Type.STRING); // Server ID
wrapper.passthrough(Type.BYTE_ARRAY_PRIMITIVE); // Public key
wrapper.passthrough(Type.BYTE_ARRAY_PRIMITIVE); // Challenge
wrapper.write(Type.BOOLEAN, true); // Authenticate
});
registerClientbound(ClientboundPackets1_20_3.SERVER_DATA, wrapper -> {
wrapper.passthrough(Type.TAG); // MOTD
wrapper.passthrough(Type.OPTIONAL_BYTE_ARRAY_PRIMITIVE); // Icon
wrapper.read(Type.BOOLEAN); // Enforces secure chat - moved to join game
});
cancelServerbound(State.LOGIN, ServerboundLoginPackets.COOKIE_RESPONSE.getId());
cancelServerbound(State.CONFIGURATION, ServerboundConfigurationPackets1_20_5.COOKIE_RESPONSE.getId());
cancelServerbound(ServerboundPackets1_20_5.COOKIE_RESPONSE);
registerClientboundPacketIdChanges(State.CONFIGURATION, ClientboundConfigurationPackets1_20_3.class, ClientboundConfigurationPackets1_20_5.class);
registerServerboundPacketIdChanges(State.CONFIGURATION, ServerboundConfigurationPackets1_20_5.class, ServerboundConfigurationPackets1_20_2.class);
}
@Override
@ -95,6 +126,6 @@ public final class Protocol1_20_5To1_20_3 extends AbstractProtocol<ClientboundPa
@Override
protected ServerboundPacketType serverboundFinishConfigurationPacket() {
return ServerboundConfigurationPackets1_20_2.FINISH_CONFIGURATION;
return ServerboundConfigurationPackets1_20_5.FINISH_CONFIGURATION;
}
}

View File

@ -0,0 +1,53 @@
/*
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
* Copyright (C) 2016-2024 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet;
import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType;
import com.viaversion.viaversion.api.protocol.packet.State;
public enum ClientboundConfigurationPackets1_20_5 implements ClientboundPacketType {
COOKIE_REQUEST, // 0x00
CUSTOM_PAYLOAD, // 0x01
DISCONNECT, // 0x02
FINISH_CONFIGURATION, // 0x03
KEEP_ALIVE, // 0x04
PING, // 0x05
REGISTRY_DATA, // 0x06
RESOURCE_PACK_POP, // 0x07
RESOURCE_PACK_PUSH, // 0x08
STORE_COOKIE, // 0x09
TRANSFER, // 0x0A
UPDATE_ENABLED_FEATURES, // 0x0B
UPDATE_TAGS; // 0x0C
@Override
public int getId() {
return ordinal();
}
@Override
public String getName() {
return name();
}
@Override
public State state() {
return State.CONFIGURATION;
}
}

View File

@ -0,0 +1,154 @@
/*
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
* Copyright (C) 2016-2024 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet;
import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType;
public enum ClientboundPackets1_20_5 implements ClientboundPacketType {
BUNDLE, // 0x00
SPAWN_ENTITY, // 0x01
SPAWN_EXPERIENCE_ORB, // 0x02
ENTITY_ANIMATION, // 0x03
STATISTICS, // 0x04
BLOCK_CHANGED_ACK, // 0x05
BLOCK_BREAK_ANIMATION, // 0x06
BLOCK_ENTITY_DATA, // 0x07
BLOCK_ACTION, // 0x08
BLOCK_CHANGE, // 0x09
BOSSBAR, // 0x0A
SERVER_DIFFICULTY, // 0x0B
CHUNK_BATCH_FINISHED, // 0x0C
CHUNK_BATCH_START, // 0x0D
CHUNK_BIOMES, // 0x0E
CLEAR_TITLES, // 0x0F
TAB_COMPLETE, // 0x10
DECLARE_COMMANDS, // 0x11
CLOSE_WINDOW, // 0x12
WINDOW_ITEMS, // 0x13
WINDOW_PROPERTY, // 0x14
SET_SLOT, // 0x15
COOKIE_REQUEST, // 0x16
COOLDOWN, // 0x17
CUSTOM_CHAT_COMPLETIONS, // 0x18
PLUGIN_MESSAGE, // 0x19
DAMAGE_EVENT, // 0x1A
DELETE_CHAT_MESSAGE, // 0x1B
DISCONNECT, // 0x1C
DISGUISED_CHAT, // 0x1D
ENTITY_STATUS, // 0x1E
EXPLOSION, // 0x1F
UNLOAD_CHUNK, // 0x20
GAME_EVENT, // 0x21
OPEN_HORSE_WINDOW, // 0x22
HIT_ANIMATION, // 0x23
WORLD_BORDER_INIT, // 0x24
KEEP_ALIVE, // 0x25
CHUNK_DATA, // 0x26
EFFECT, // 0x27
SPAWN_PARTICLE, // 0x28
UPDATE_LIGHT, // 0x29
JOIN_GAME, // 0x2A
MAP_DATA, // 0x2B
TRADE_LIST, // 0x2C
ENTITY_POSITION, // 0x2D
ENTITY_POSITION_AND_ROTATION, // 0x2E
ENTITY_ROTATION, // 0x2F
VEHICLE_MOVE, // 0x30
OPEN_BOOK, // 0x31
OPEN_WINDOW, // 0x32
OPEN_SIGN_EDITOR, // 0x33
PING, // 0x34
PONG_RESPONSE, // 0x35
CRAFT_RECIPE_RESPONSE, // 0x36
PLAYER_ABILITIES, // 0x37
PLAYER_CHAT, // 0x38
COMBAT_END, // 0x39
COMBAT_ENTER, // 0x3A
COMBAT_KILL, // 0x3B
PLAYER_INFO_REMOVE, // 0x3C
PLAYER_INFO_UPDATE, // 0x3D
FACE_PLAYER, // 0x3E
PLAYER_POSITION, // 0x3F
UNLOCK_RECIPES, // 0x40
REMOVE_ENTITIES, // 0x41
REMOVE_ENTITY_EFFECT, // 0x42
RESET_SCORE, // 0x43
RESOURCE_PACK_POP, // 0x44
RESOURCE_PACK_PUSH, // 0x45
RESPAWN, // 0x46
ENTITY_HEAD_LOOK, // 0x47
MULTI_BLOCK_CHANGE, // 0x48
SELECT_ADVANCEMENTS_TAB, // 0x49
SERVER_DATA, // 0x4A
ACTIONBAR, // 0x4B
WORLD_BORDER_CENTER, // 0x4C
WORLD_BORDER_LERP_SIZE, // 0x4D
WORLD_BORDER_SIZE, // 0x4E
WORLD_BORDER_WARNING_DELAY, // 0x4F
WORLD_BORDER_WARNING_DISTANCE, // 0x50
CAMERA, // 0x51
HELD_ITEM_CHANGE, // 0x52
UPDATE_VIEW_POSITION, // 0x53
UPDATE_VIEW_DISTANCE, // 0x54
SPAWN_POSITION, // 0x55
DISPLAY_SCOREBOARD, // 0x56
ENTITY_METADATA, // 0x57
ATTACH_ENTITY, // 0x58
ENTITY_VELOCITY, // 0x59
ENTITY_EQUIPMENT, // 0x5A
SET_EXPERIENCE, // 0x5B
UPDATE_HEALTH, // 0x5C
SCOREBOARD_OBJECTIVE, // 0x5D
SET_PASSENGERS, // 0x5E
TEAMS, // 0x5F
UPDATE_SCORE, // 0x60
SET_SIMULATION_DISTANCE, // 0x61
TITLE_SUBTITLE, // 0x62
TIME_UPDATE, // 0x63
TITLE_TEXT, // 0x64
TITLE_TIMES, // 0x65
ENTITY_SOUND, // 0x66
SOUND, // 0x67
START_CONFIGURATION, // 0x68
STOP_SOUND, // 0x69
STORE_COOKIE, // 0x6A
SYSTEM_CHAT, // 0x6B
TAB_LIST, // 0x6C
NBT_QUERY, // 0x6D
COLLECT_ITEM, // 0x6E
ENTITY_TELEPORT, // 0x6F
TICKING_STATE, // 0x70
TICKING_STEP, // 0x71
TRANSFER, // 0x72
ADVANCEMENTS, // 0x73
ENTITY_PROPERTIES, // 0x74
ENTITY_EFFECT, // 0x75
DECLARE_RECIPES, // 0x76
TAGS; // 0x77
@Override
public int getId() {
return ordinal();
}
@Override
public String getName() {
return name();
}
}

View File

@ -0,0 +1,47 @@
/*
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
* Copyright (C) 2016-2024 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet;
import com.viaversion.viaversion.api.protocol.packet.ServerboundPacketType;
import com.viaversion.viaversion.api.protocol.packet.State;
public enum ServerboundConfigurationPackets1_20_5 implements ServerboundPacketType {
CLIENT_INFORMATION, // 0x00
COOKIE_RESPONSE, // 0x01
CUSTOM_PAYLOAD, // 0x02
FINISH_CONFIGURATION, // 0x03
KEEP_ALIVE, // 0x04
PONG, // 0x05
RESOURCE_PACK; // 0x06
@Override
public int getId() {
return ordinal();
}
@Override
public String getName() {
return name();
}
@Override
public State state() {
return State.CONFIGURATION;
}
}

View File

@ -0,0 +1,90 @@
/*
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
* Copyright (C) 2016-2024 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet;
import com.viaversion.viaversion.api.protocol.packet.ServerboundPacketType;
public enum ServerboundPackets1_20_5 implements ServerboundPacketType {
TELEPORT_CONFIRM, // 0x00
QUERY_BLOCK_NBT, // 0x01
SET_DIFFICULTY, // 0x02
CHAT_ACK, // 0x03
CHAT_COMMAND, // 0x04
CHAT_MESSAGE, // 0x05
CHAT_SESSION_UPDATE, // 0x06
CHUNK_BATCH_RECEIVED, // 0x07
CLIENT_STATUS, // 0x08
CLIENT_SETTINGS, // 0x09
TAB_COMPLETE, // 0x0A
CONFIGURATION_ACKNOWLEDGED, // 0x0B
CLICK_WINDOW_BUTTON, // 0x0C
CLICK_WINDOW, // 0x0D
CLOSE_WINDOW, // 0x0E
CONTAINER_SLOT_STATE_CHANGED, // 0x0F
COOKIE_RESPONSE, // 0x10
PLUGIN_MESSAGE, // 0x11
EDIT_BOOK, // 0x12
ENTITY_NBT_REQUEST, // 0x13
INTERACT_ENTITY, // 0x14
GENERATE_JIGSAW, // 0x15
KEEP_ALIVE, // 0x16
LOCK_DIFFICULTY, // 0x17
PLAYER_POSITION, // 0x18
PLAYER_POSITION_AND_ROTATION, // 0x19
PLAYER_ROTATION, // 0x1A
PLAYER_MOVEMENT, // 0x1B
VEHICLE_MOVE, // 0x1C
STEER_BOAT, // 0x1D
PICK_ITEM, // 0x1E
PING_REQUEST, // 0x1F
CRAFT_RECIPE_REQUEST, // 0x20
PLAYER_ABILITIES, // 0x21
PLAYER_DIGGING, // 0x22
ENTITY_ACTION, // 0x23
STEER_VEHICLE, // 0x24
PONG, // 0x25
RECIPE_BOOK_DATA, // 0x26
SEEN_RECIPE, // 0x27
RENAME_ITEM, // 0x28
RESOURCE_PACK_STATUS, // 0x29
ADVANCEMENT_TAB, // 0x2A
SELECT_TRADE, // 0x2B
SET_BEACON_EFFECT, // 0x2C
HELD_ITEM_CHANGE, // 0x2D
UPDATE_COMMAND_BLOCK, // 0x2E
UPDATE_COMMAND_BLOCK_MINECART, // 0x2F
CREATIVE_INVENTORY_ACTION, // 0x30
UPDATE_JIGSAW_BLOCK, // 0x31
UPDATE_STRUCTURE_BLOCK, // 0x32
UPDATE_SIGN, // 0x33
ANIMATION, // 0x34
SPECTATE, // 0x35
PLAYER_BLOCK_PLACEMENT, // 0x36
USE_ITEM; // 0x37
@Override
public int getId() {
return ordinal();
}
@Override
public String getName() {
return name();
}
}

View File

@ -17,16 +17,20 @@
*/
package com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.rewriter;
import com.viaversion.viaversion.api.minecraft.Particle;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2;
import com.viaversion.viaversion.api.type.types.version.Types1_20_3;
import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ClientboundPackets1_20_3;
import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ServerboundPackets1_20_3;
import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.rewriter.RecipeRewriter1_20_3;
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.Protocol1_20_5To1_20_3;
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet.ServerboundPackets1_20_5;
import com.viaversion.viaversion.rewriter.BlockRewriter;
import com.viaversion.viaversion.rewriter.ItemRewriter;
import com.viaversion.viaversion.util.Key;
import io.netty.buffer.ByteBuf;
public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter<ClientboundPackets1_20_3, ServerboundPackets1_20_3, Protocol1_20_5To1_20_3> {
public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter<ClientboundPackets1_20_3, ServerboundPackets1_20_5, Protocol1_20_5To1_20_3> {
public BlockItemPacketRewriter1_20_5(final Protocol1_20_5To1_20_3 protocol) {
super(protocol, Type.ITEM1_20_2, Type.ITEM1_20_2_ARRAY);
@ -42,20 +46,113 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter<Clientboun
blockRewriter.registerChunkData1_19(ClientboundPackets1_20_3.CHUNK_DATA, ChunkType1_20_2::new);
blockRewriter.registerBlockEntityData(ClientboundPackets1_20_3.BLOCK_ENTITY_DATA);
// registerOpenWindow(ClientboundPackets1_20_3.OPEN_WINDOW);
registerSetCooldown(ClientboundPackets1_20_3.COOLDOWN);
registerWindowItems1_17_1(ClientboundPackets1_20_3.WINDOW_ITEMS);
registerSetSlot1_17_1(ClientboundPackets1_20_3.SET_SLOT);
registerAdvancements1_20_3(ClientboundPackets1_20_3.ADVANCEMENTS);
registerEntityEquipmentArray(ClientboundPackets1_20_3.ENTITY_EQUIPMENT);
registerClickWindow1_17_1(ServerboundPackets1_20_3.CLICK_WINDOW);
registerTradeList1_19(ClientboundPackets1_20_3.TRADE_LIST);
registerCreativeInvAction(ServerboundPackets1_20_3.CREATIVE_INVENTORY_ACTION);
registerClickWindow1_17_1(ServerboundPackets1_20_5.CLICK_WINDOW);
registerCreativeInvAction(ServerboundPackets1_20_5.CREATIVE_INVENTORY_ACTION);
registerWindowPropertyEnchantmentHandler(ClientboundPackets1_20_3.WINDOW_PROPERTY);
registerSpawnParticle1_19(ClientboundPackets1_20_3.SPAWN_PARTICLE);
// TODO Explosion contains particles now
;
new RecipeRewriter1_20_3<>(protocol).register(ClientboundPackets1_20_3.DECLARE_RECIPES);
protocol.registerClientbound(ClientboundPackets1_20_3.SPAWN_PARTICLE, wrapper -> {
final int particleId = wrapper.read(Type.VAR_INT);
wrapper.passthrough(Type.BOOLEAN); // Long Distance
wrapper.passthrough(Type.DOUBLE); // X
wrapper.passthrough(Type.DOUBLE); // Y
wrapper.passthrough(Type.DOUBLE); // Z
wrapper.passthrough(Type.FLOAT); // Offset X
wrapper.passthrough(Type.FLOAT); // Offset Y
wrapper.passthrough(Type.FLOAT); // Offset Z
wrapper.passthrough(Type.FLOAT); // Particle Data
wrapper.passthrough(Type.INT); // Particle Count
final Particle particle = new Particle(particleId);
wrapper.read(new ParticleDataReader(particle));
rewriteParticle(particle);
wrapper.write(Types1_20_3.PARTICLE, particle);
});
protocol.registerClientbound(ClientboundPackets1_20_3.EXPLOSION, wrapper -> {
wrapper.passthrough(Type.DOUBLE); // X
wrapper.passthrough(Type.DOUBLE); // Y
wrapper.passthrough(Type.DOUBLE); // Z
wrapper.passthrough(Type.FLOAT); // Power
final int blocks = wrapper.passthrough(Type.VAR_INT);
for (int i = 0; i < blocks; i++) {
wrapper.passthrough(Type.BYTE); // Relative X
wrapper.passthrough(Type.BYTE); // Relative Y
wrapper.passthrough(Type.BYTE); // Relative Z
}
wrapper.passthrough(Type.FLOAT); // Knockback X
wrapper.passthrough(Type.FLOAT); // Knockback Y
wrapper.passthrough(Type.FLOAT); // Knockback Z
wrapper.passthrough(Type.VAR_INT); // Block interaction type
final Particle smallExplosionParticle = wrapper.passthrough(Types1_20_3.PARTICLE);
final Particle largeExplosionParticle = wrapper.passthrough(Types1_20_3.PARTICLE);
protocol.getEntityRewriter().rewriteParticle(smallExplosionParticle);
protocol.getEntityRewriter().rewriteParticle(largeExplosionParticle);
wrapper.write(Type.VAR_INT, 0); // "Empty" registry id to instead use the resource location that follows after
});
protocol.registerClientbound(ClientboundPackets1_20_3.TRADE_LIST, wrapper -> {
wrapper.passthrough(Type.VAR_INT); // Container id
final int size = wrapper.passthrough(Type.VAR_INT);
for (int i = 0; i < size; i++) {
handleItemToClient(wrapper.passthrough(Type.ITEM1_20_2)); // Input
handleItemToClient(wrapper.passthrough(Type.ITEM1_20_2)); // Output
handleItemToClient(wrapper.passthrough(Type.ITEM1_20_2)); // Second Item
wrapper.passthrough(Type.BOOLEAN); // Trade disabled
wrapper.passthrough(Type.INT); // Number of tools uses
wrapper.passthrough(Type.INT); // Maximum number of trade uses
wrapper.passthrough(Type.INT); // XP
wrapper.passthrough(Type.INT); // Special price
wrapper.passthrough(Type.FLOAT); // Price multiplier
wrapper.passthrough(Type.INT); // Demand
wrapper.write(Type.BOOLEAN, false); // Ignore tags
}
});
final RecipeRewriter1_20_3<ClientboundPackets1_20_3> recipeRewriter = new RecipeRewriter1_20_3<>(protocol);
protocol.registerClientbound(ClientboundPackets1_20_3.DECLARE_RECIPES, wrapper -> {
final int size = wrapper.passthrough(Type.VAR_INT);
for (int i = 0; i < size; i++) {
// Change order and write the type as an int
final String type = wrapper.read(Type.STRING);
wrapper.passthrough(Type.STRING); // Recipe Identifier
wrapper.write(Type.VAR_INT, protocol.getMappingData().getRecipeSerializerMappings().mappedId(type));
recipeRewriter.handleRecipeType(wrapper, Key.stripMinecraftNamespace(type));
}
});
}
private static final class ParticleDataReader extends Type<Void> {
private final Particle particle;
private ParticleDataReader(Particle particle) {
super(Void.class);
this.particle = particle;
}
@Override
public void write(final ByteBuf buffer, final Void value) {
throw new UnsupportedOperationException();
}
@Override
public Void read(final ByteBuf buffer) throws Exception {
// Extract the particle data to put into a particle
Types1_20_3.PARTICLE.readData(buffer, particle);
return null;
}
}
}

View File

@ -66,6 +66,13 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter<Clientbound
map(Type.BOOLEAN); // Limited crafting
map(Type.STRING); // Dimension key
map(Type.STRING); // World
map(Type.LONG); // Seed
map(Type.BYTE); // Gamemode
map(Type.BYTE); // Previous gamemode
map(Type.BOOLEAN); // Debug
map(Type.BOOLEAN); // Flat
map(Type.OPTIONAL_GLOBAL_POSITION); // Last death location
create(Type.BOOLEAN, false); // Enforces secure chat - moved from server data (which is unfortunately sent a while after this)
handler(worldDataTrackerHandlerByKey()); // Tracks world height and name for chunk data and entity (un)tracking
}
});

View File

@ -536,7 +536,7 @@ public abstract class EntityRewriter<C extends ClientboundPacketType, T extends
// ---------------------------------------------------------------------------
protected void rewriteParticle(Particle particle) {
public void rewriteParticle(Particle particle) {
ParticleMappings mappings = protocol.getMappingData().getParticleMappings();
int id = particle.getId();
if (mappings.isBlockParticle(id)) {

View File

@ -19,6 +19,7 @@ package com.viaversion.viaversion.rewriter;
import com.viaversion.viaversion.api.data.Mappings;
import com.viaversion.viaversion.api.data.ParticleMappings;
import com.viaversion.viaversion.api.minecraft.Particle;
import com.viaversion.viaversion.api.minecraft.item.Item;
import com.viaversion.viaversion.api.protocol.Protocol;
import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType;
@ -281,6 +282,28 @@ public class ItemRewriter<C extends ClientboundPacketType, S extends Serverbound
});
}
public void registerTradeList1_20_5(C packetType) {
protocol.registerClientbound(packetType, wrapper -> {
wrapper.passthrough(Type.VAR_INT); // Container id
int size = wrapper.passthrough(Type.VAR_INT);
for (int i = 0; i < size; i++) {
handleItemToClient(wrapper.passthrough(itemType)); // Input
handleItemToClient(wrapper.passthrough(itemType)); // Output
handleItemToClient(wrapper.passthrough(itemType)); // Second Item
wrapper.passthrough(Type.BOOLEAN); // Trade disabled
wrapper.passthrough(Type.INT); // Number of tools uses
wrapper.passthrough(Type.INT); // Maximum number of trade uses
wrapper.passthrough(Type.INT); // XP
wrapper.passthrough(Type.INT); // Special price
wrapper.passthrough(Type.FLOAT); // Price multiplier
wrapper.passthrough(Type.INT); // Demand
wrapper.passthrough(Type.BOOLEAN); // Ignore tags
}
});
}
public void registerAdvancements(C packetType, Type<Item> type) {
protocol.registerClientbound(packetType, wrapper -> {
wrapper.passthrough(Type.BOOLEAN); // Reset/clear
@ -420,6 +443,57 @@ public class ItemRewriter<C extends ClientboundPacketType, S extends Serverbound
});
}
public void registerSpawnParticle1_20_5(C packetType, Type<Particle> unmappedParticleType, Type<Particle> mappedParticleType) {
protocol.registerClientbound(packetType, new PacketHandlers() {
@Override
public void register() {
map(Type.BOOLEAN); // Long Distance
map(Type.DOUBLE); // X
map(Type.DOUBLE); // Y
map(Type.DOUBLE); // Z
map(Type.FLOAT); // Offset X
map(Type.FLOAT); // Offset Y
map(Type.FLOAT); // Offset Z
map(Type.FLOAT); // Particle Data
map(Type.INT); // Particle Count
handler(wrapper -> {
final Particle particle = wrapper.read(unmappedParticleType);
rewriteParticle(particle);
wrapper.write(mappedParticleType, particle);
});
}
});
}
public void registerExplosion(C packetType, Type<Particle> unmappedParticleType, Type<Particle> mappedParticleType) {
final SoundRewriter<C> cSoundRewriter = new SoundRewriter<>(protocol);
protocol.registerClientbound(packetType, wrapper -> {
wrapper.passthrough(Type.DOUBLE); // X
wrapper.passthrough(Type.DOUBLE); // Y
wrapper.passthrough(Type.DOUBLE); // Z
wrapper.passthrough(Type.FLOAT); // Power
final int blocks = wrapper.passthrough(Type.VAR_INT);
for (int i = 0; i < blocks; i++) {
wrapper.passthrough(Type.BYTE); // Relative X
wrapper.passthrough(Type.BYTE); // Relative Y
wrapper.passthrough(Type.BYTE); // Relative Z
}
wrapper.passthrough(Type.FLOAT); // Knockback X
wrapper.passthrough(Type.FLOAT); // Knockback Y
wrapper.passthrough(Type.FLOAT); // Knockback Z
wrapper.passthrough(Type.VAR_INT); // Block interaction type
final Particle smallExplosionParticle = wrapper.read(unmappedParticleType);
final Particle largeExplosionParticle = wrapper.read(unmappedParticleType);
wrapper.write(mappedParticleType, smallExplosionParticle);
wrapper.write(mappedParticleType, largeExplosionParticle);
rewriteParticle(smallExplosionParticle);
rewriteParticle(largeExplosionParticle);
cSoundRewriter.soundHolderHandler().handle(wrapper);
});
}
public PacketHandler getSpawnParticleHandler() {
return getSpawnParticleHandler(Type.INT);
}
@ -462,4 +536,20 @@ public class ItemRewriter<C extends ClientboundPacketType, S extends Serverbound
public PacketHandler itemToServerHandler(Type<Item> type) {
return wrapper -> handleItemToServer(wrapper.get(type, 0));
}
protected void rewriteParticle(Particle particle) {
ParticleMappings mappings = protocol.getMappingData().getParticleMappings();
int id = particle.getId();
if (mappings.isBlockParticle(id)) {
Particle.ParticleData<Integer> data = particle.getArgument(0);
data.setValue(protocol.getMappingData().getNewBlockStateId(data.getValue()));
} else if (mappings.isItemParticle(id)) {
Particle.ParticleData<Item> data = particle.getArgument(0);
Item item = data.getValue();
handleItemToClient(item);
}
particle.setId(protocol.getMappingData().getNewParticleId(id));
}
}

View File

@ -76,6 +76,19 @@ public class RecipeRewriter<C extends ClientboundPacketType> {
});
}
public void register1_20_5(C packetType) {
protocol.registerClientbound(packetType, wrapper -> {
int size = wrapper.passthrough(Type.VAR_INT);
for (int i = 0; i < size; i++) {
wrapper.passthrough(Type.STRING);// Recipe Identifier
final int typeId = wrapper.passthrough(Type.VAR_INT);
final String type = protocol.getMappingData().getRecipeSerializerMappings().identifier(typeId);
handleRecipeType(wrapper, type);
}
});
}
public void handleCraftingShaped(PacketWrapper wrapper) throws Exception {
int ingredientsNo = wrapper.passthrough(Type.VAR_INT) * wrapper.passthrough(Type.VAR_INT);
wrapper.passthrough(Type.STRING); // Group

View File

@ -51,9 +51,13 @@ public class SoundRewriter<C extends ClientboundPacketType> {
this.registerSound(packetType);
}
// Not for entity sounds
// Also for entity sounds starting with 1.20.5
public void register1_19_3Sound(C packetType) {
protocol.registerClientbound(packetType, wrapper -> {
protocol.registerClientbound(packetType, soundHolderHandler());
}
public PacketHandler soundHolderHandler() {
return wrapper -> {
final int soundId = wrapper.read(Type.VAR_INT);
if (soundId == 0) {
// Is followed by the resource loation
@ -68,7 +72,7 @@ public class SoundRewriter<C extends ClientboundPacketType> {
}
wrapper.write(Type.VAR_INT, mappedId + 1);
});
};
}
public PacketHandler getSoundHandler() {

View File

@ -1,5 +1,5 @@
# Project properties - we put these here so they can be modified without causing a recompile of the build scripts
projectVersion=4.10.0-23w51b-SNAPSHOT
projectVersion=4.10.0-24w03a-SNAPSHOT
# Smile emoji
mcVersions=1.20.4, 1.20.3, 1.20.2, 1.20.1, 1.20, 1.19.4, 1.19.3, 1.19.2, 1.19.1, 1.19, 1.18.2, 1.18.1, 1.18, 1.17.1, 1.17, 1.16.5, 1.16.4, 1.16.3, 1.16.2, 1.16.1, 1.16, 1.15.2, 1.15.1, 1.15, 1.14.4, 1.14.3, 1.14.2, 1.14.1, 1.14, 1.13.2, 1.13.1, 1.13, 1.12.2, 1.12.1, 1.12, 1.11.2, 1.11.1, 1.11, 1.10.2, 1.10.1, 1.10, 1.9.4, 1.9.3, 1.9.2, 1.9.1, 1.9, 1.8.9

View File

@ -26,10 +26,11 @@ import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType;
import com.viaversion.viaversion.api.protocol.packet.ServerboundPacketType;
import com.viaversion.viaversion.api.protocol.packet.State;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.packet.ServerboundConfigurationPackets1_20_2;
import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ClientboundConfigurationPackets1_20_3;
import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ClientboundPackets1_20_3;
import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ServerboundPackets1_20_3;
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet.ClientboundConfigurationPackets1_20_5;
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet.ClientboundPackets1_20_5;
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet.ServerboundConfigurationPackets1_20_5;
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet.ServerboundPackets1_20_5;
import com.viaversion.viaversion.rewriter.SoundRewriter;
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
import com.viaversion.viaversion.rewriter.TagRewriter;
@ -38,13 +39,13 @@ import com.viaversion.viaversion.template.protocols.rewriter.EntityPacketRewrite
// Placeholders to replace (in the entire package):
// Protocol1_99To_98, EntityPacketRewriter1_99, BlockItemPacketRewriter1_99
// ClientboundPackets1_20_3
// ServerboundPackets1_20_3
// ClientboundPackets1_20_5
// ServerboundPackets1_20_5
// ClientboundConfigurationPackets1_20_3
// ServerboundConfigurationPackets1_20_2
// Entity1_19_4Types (MAPPED type)
// 1.99, 1.98
public final class Protocol1_99To_98 extends AbstractProtocol<ClientboundPackets1_20_3, ClientboundPackets1_20_3, ServerboundPackets1_20_3, ServerboundPackets1_20_3> {
public final class Protocol1_99To_98 extends AbstractProtocol<ClientboundPackets1_20_5, ClientboundPackets1_20_5, ServerboundPackets1_20_5, ServerboundPackets1_20_5> {
public static final MappingData MAPPINGS = new MappingDataBase("1.98", "1.99");
private final EntityPacketRewriter1_99 entityRewriter = new EntityPacketRewriter1_99(this);
@ -52,7 +53,7 @@ public final class Protocol1_99To_98 extends AbstractProtocol<ClientboundPackets
public Protocol1_99To_98() {
// Passing the class types into the super constructor is needed for automatic packet type id remapping, but can otherwise be omitted
super(ClientboundPackets1_20_3.class, ClientboundPackets1_20_3.class, ServerboundPackets1_20_3.class, ServerboundPackets1_20_3.class);
super(ClientboundPackets1_20_5.class, ClientboundPackets1_20_5.class, ServerboundPackets1_20_5.class, ServerboundPackets1_20_5.class);
}
@Override
@ -60,20 +61,20 @@ public final class Protocol1_99To_98 extends AbstractProtocol<ClientboundPackets
super.registerPackets();
// Registers renames etc. as well as registry type id changes
final TagRewriter<ClientboundPackets1_20_3> tagRewriter = new TagRewriter<>(this);
tagRewriter.registerGeneric(ClientboundPackets1_20_3.TAGS);
final TagRewriter<ClientboundPackets1_20_5> tagRewriter = new TagRewriter<>(this);
tagRewriter.registerGeneric(ClientboundPackets1_20_5.TAGS);
tagRewriter.registerGeneric(State.CONFIGURATION, ClientboundConfigurationPackets1_20_3.UPDATE_TAGS);
// Registers sound id changes
final SoundRewriter<ClientboundPackets1_20_3> soundRewriter = new SoundRewriter<>(this);
soundRewriter.register1_19_3Sound(ClientboundPackets1_20_3.SOUND);
soundRewriter.registerSound(ClientboundPackets1_20_3.ENTITY_SOUND);
final SoundRewriter<ClientboundPackets1_20_5> soundRewriter = new SoundRewriter<>(this);
soundRewriter.register1_19_3Sound(ClientboundPackets1_20_5.SOUND);
soundRewriter.register1_19_3Sound(ClientboundPackets1_20_5.ENTITY_SOUND);
// Registers registry type id changes as well as stat id changes if also included in the json mappings
new StatisticsRewriter<>(this).register(ClientboundPackets1_20_3.STATISTICS);
new StatisticsRewriter<>(this).register(ClientboundPackets1_20_5.STATISTICS);
// Uncomment if an existing type changed serialization format. Mappings for argument type keys can also be defined in mapping files
/*final CommandRewriter1_19_4<ClientboundPackets1_20_3> commandRewriter = new CommandRewriter1_19_4<ClientboundPackets1_20_3>(this) {
/*final CommandRewriter1_19_4<ClientboundPackets1_20_5> commandRewriter = new CommandRewriter1_19_4<ClientboundPackets1_20_5>(this) {
@Override
public void handleArgument(final PacketWrapper wrapper, final String argumentType) throws Exception {
if (argumentType.equals("minecraft:abc")) {
@ -83,7 +84,7 @@ public final class Protocol1_99To_98 extends AbstractProtocol<ClientboundPackets
super.handleArgument(wrapper, argumentType);
}
}
}.registerDeclareCommands1_19(ClientboundPackets1_20_3.DECLARE_COMMANDS);*/
}.registerDeclareCommands1_19(ClientboundPackets1_20_5.DECLARE_COMMANDS);*/
// TODO Attributes
}
@ -132,11 +133,11 @@ public final class Protocol1_99To_98 extends AbstractProtocol<ClientboundPackets
@Override
protected ClientboundPacketType clientboundFinishConfigurationPacket() {
return ClientboundConfigurationPackets1_20_3.FINISH_CONFIGURATION;
return ClientboundConfigurationPackets1_20_5.FINISH_CONFIGURATION;
}
@Override
protected ServerboundPacketType serverboundFinishConfigurationPacket() {
return ServerboundConfigurationPackets1_20_2.FINISH_CONFIGURATION;
return ServerboundConfigurationPackets1_20_5.FINISH_CONFIGURATION;
}
}

View File

@ -19,9 +19,10 @@ package com.viaversion.viaversion.template.protocols.rewriter;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2;
import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ClientboundPackets1_20_3;
import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ServerboundPackets1_20_3;
import com.viaversion.viaversion.api.type.types.version.Types1_20_3;
import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.rewriter.RecipeRewriter1_20_3;
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet.ClientboundPackets1_20_5;
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet.ServerboundPackets1_20_5;
import com.viaversion.viaversion.rewriter.BlockRewriter;
import com.viaversion.viaversion.rewriter.ItemRewriter;
import com.viaversion.viaversion.template.protocols.Protocol1_99To_98;
@ -29,7 +30,7 @@ import com.viaversion.viaversion.template.protocols.Protocol1_99To_98;
// To replace if needed:
// ChunkType1_20_2
// RecipeRewriter1_20_3
public final class BlockItemPacketRewriter1_99 extends ItemRewriter<ClientboundPackets1_20_3, ServerboundPackets1_20_3, Protocol1_99To_98> {
public final class BlockItemPacketRewriter1_99 extends ItemRewriter<ClientboundPackets1_20_5, ServerboundPackets1_20_5, Protocol1_99To_98> {
public BlockItemPacketRewriter1_99(final Protocol1_99To_98 protocol) {
super(protocol, Type.ITEM1_20_2, Type.ITEM1_20_2_ARRAY);
@ -40,33 +41,32 @@ public final class BlockItemPacketRewriter1_99 extends ItemRewriter<ClientboundP
// Register block and block state id changes
// Other places using block state id mappings: Spawn particle, entity metadata, entity spawn (falling blocks)
// Tags and statistics use block (!) ids
final BlockRewriter<ClientboundPackets1_20_3> blockRewriter = BlockRewriter.for1_20_2(protocol);
blockRewriter.registerBlockAction(ClientboundPackets1_20_3.BLOCK_ACTION);
blockRewriter.registerBlockChange(ClientboundPackets1_20_3.BLOCK_CHANGE);
blockRewriter.registerVarLongMultiBlockChange1_20(ClientboundPackets1_20_3.MULTI_BLOCK_CHANGE);
blockRewriter.registerEffect(ClientboundPackets1_20_3.EFFECT, 1010, 2001);
blockRewriter.registerChunkData1_19(ClientboundPackets1_20_3.CHUNK_DATA, ChunkType1_20_2::new);
blockRewriter.registerBlockEntityData(ClientboundPackets1_20_3.BLOCK_ENTITY_DATA);
final BlockRewriter<ClientboundPackets1_20_5> blockRewriter = BlockRewriter.for1_20_2(protocol);
blockRewriter.registerBlockAction(ClientboundPackets1_20_5.BLOCK_ACTION);
blockRewriter.registerBlockChange(ClientboundPackets1_20_5.BLOCK_CHANGE);
blockRewriter.registerVarLongMultiBlockChange1_20(ClientboundPackets1_20_5.MULTI_BLOCK_CHANGE);
blockRewriter.registerEffect(ClientboundPackets1_20_5.EFFECT, 1010, 2001);
blockRewriter.registerChunkData1_19(ClientboundPackets1_20_5.CHUNK_DATA, ChunkType1_20_2::new);
blockRewriter.registerBlockEntityData(ClientboundPackets1_20_5.BLOCK_ENTITY_DATA);
// Registers item id changes
// Other places using item ids are: Entity metadata, tags, statistics, effect
// registerOpenWindow(ClientboundPackets1_20_3.OPEN_WINDOW); - If a new container type was added
registerSetCooldown(ClientboundPackets1_20_3.COOLDOWN);
registerWindowItems1_17_1(ClientboundPackets1_20_3.WINDOW_ITEMS);
registerSetSlot1_17_1(ClientboundPackets1_20_3.SET_SLOT);
registerAdvancements1_20_3(ClientboundPackets1_20_3.ADVANCEMENTS);
registerEntityEquipmentArray(ClientboundPackets1_20_3.ENTITY_EQUIPMENT);
registerClickWindow1_17_1(ServerboundPackets1_20_3.CLICK_WINDOW);
registerTradeList1_19(ClientboundPackets1_20_3.TRADE_LIST);
registerCreativeInvAction(ServerboundPackets1_20_3.CREATIVE_INVENTORY_ACTION);
registerWindowPropertyEnchantmentHandler(ClientboundPackets1_20_3.WINDOW_PROPERTY);
registerSpawnParticle1_19(ClientboundPackets1_20_3.SPAWN_PARTICLE);
// registerOpenWindow(ClientboundPackets1_20_5.OPEN_WINDOW); - If a new container type was added
registerSetCooldown(ClientboundPackets1_20_5.COOLDOWN);
registerWindowItems1_17_1(ClientboundPackets1_20_5.WINDOW_ITEMS);
registerSetSlot1_17_1(ClientboundPackets1_20_5.SET_SLOT);
registerAdvancements1_20_3(ClientboundPackets1_20_5.ADVANCEMENTS);
registerEntityEquipmentArray(ClientboundPackets1_20_5.ENTITY_EQUIPMENT);
registerClickWindow1_17_1(ServerboundPackets1_20_5.CLICK_WINDOW);
registerTradeList1_20_5(ClientboundPackets1_20_5.TRADE_LIST);
registerCreativeInvAction(ServerboundPackets1_20_5.CREATIVE_INVENTORY_ACTION);
registerWindowPropertyEnchantmentHandler(ClientboundPackets1_20_5.WINDOW_PROPERTY);
registerSpawnParticle1_20_5(ClientboundPackets1_20_5.SPAWN_PARTICLE, Types1_20_3.PARTICLE, Types1_20_3.PARTICLE);
registerExplosion(ClientboundPackets1_20_5.EXPLOSION, Types1_20_3.PARTICLE, Types1_20_3.PARTICLE); // Rewrites the included sound and particles
// TODO Explosion contains particles now
new RecipeRewriter1_20_3<>(protocol).register(ClientboundPackets1_20_3.DECLARE_RECIPES);
new RecipeRewriter1_20_3<>(protocol).register(ClientboundPackets1_20_5.DECLARE_RECIPES);
// OR do this if serialization of recipes changed and override the relevant method
// Add new serializers to RecipeRewriter, or extend the last one for changes
// new RecipeRewriter1_20_3<ClientboundPackets1_20_3>(this) {}.register(ClientboundPackets1_20_3.DECLARE_RECIPES);
// new RecipeRewriter1_20_3<ClientboundPackets1_20_5>(this) {}.register1_20_5(ClientboundPackets1_20_5.DECLARE_RECIPES);
}
}

View File

@ -24,14 +24,14 @@ import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.api.type.types.version.Types1_20_5;
import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ClientboundConfigurationPackets1_20_3;
import com.viaversion.viaversion.protocols.protocol1_20_3to1_20_2.packet.ClientboundPackets1_20_3;
import com.viaversion.viaversion.protocols.protocol1_20_5to1_20_3.packet.ClientboundPackets1_20_5;
import com.viaversion.viaversion.rewriter.EntityRewriter;
import com.viaversion.viaversion.template.protocols.Protocol1_99To_98;
// Replace if needed
// Types1_OLD
// Types1_20_5
public final class EntityPacketRewriter1_99 extends EntityRewriter<ClientboundPackets1_20_3, Protocol1_99To_98> {
public final class EntityPacketRewriter1_99 extends EntityRewriter<ClientboundPackets1_20_5, Protocol1_99To_98> {
public EntityPacketRewriter1_99(final Protocol1_99To_98 protocol) {
super(protocol);
@ -40,9 +40,9 @@ public final class EntityPacketRewriter1_99 extends EntityRewriter<ClientboundPa
@Override
public void registerPackets() {
// Tracks entities, applies metadata rewrites registered below, untracks entities
registerTrackerWithData1_19(ClientboundPackets1_20_3.SPAWN_ENTITY, EntityTypes1_20_5.FALLING_BLOCK);
registerMetadataRewriter(ClientboundPackets1_20_3.ENTITY_METADATA, /*Types1_OLD.METADATA_LIST, */Types1_20_5.METADATA_LIST); // Specify old and new metadata list if changed
registerRemoveEntities(ClientboundPackets1_20_3.REMOVE_ENTITIES);
registerTrackerWithData1_19(ClientboundPackets1_20_5.SPAWN_ENTITY, EntityTypes1_20_5.FALLING_BLOCK);
registerMetadataRewriter(ClientboundPackets1_20_5.ENTITY_METADATA, /*Types1_OLD.METADATA_LIST, */Types1_20_5.METADATA_LIST); // Specify old and new metadata list if changed
registerRemoveEntities(ClientboundPackets1_20_5.REMOVE_ENTITIES);
protocol.registerClientbound(State.CONFIGURATION, ClientboundConfigurationPackets1_20_3.REGISTRY_DATA, new PacketHandlers() {
@Override
@ -53,7 +53,7 @@ public final class EntityPacketRewriter1_99 extends EntityRewriter<ClientboundPa
}
});
protocol.registerClientbound(ClientboundPackets1_20_3.JOIN_GAME, new PacketHandlers() {
protocol.registerClientbound(ClientboundPackets1_20_5.JOIN_GAME, new PacketHandlers() {
@Override
public void register() {
map(Type.INT); // Entity id
@ -71,7 +71,7 @@ public final class EntityPacketRewriter1_99 extends EntityRewriter<ClientboundPa
}
});
protocol.registerClientbound(ClientboundPackets1_20_3.RESPAWN, new PacketHandlers() {
protocol.registerClientbound(ClientboundPackets1_20_5.RESPAWN, new PacketHandlers() {
@Override
public void register() {
map(Type.STRING); // Dimension