Compare commits

..
13 Commits
74 changed files with 314 additions and 267 deletions

No files matched your search

+2 -2
View File
@@ -15,7 +15,7 @@ jobs:
with:
persist-credentials: false
- name: Set up Gradle
uses: gradle/actions/setup-gradle@f29f5a9d7b09a7c6b29859002d29d24e1674c884 # 5.0.1
uses: gradle/actions/setup-gradle@39e147cb9de83bb9910b8ef8bd7fff0ee20fcd6f # 6.0.1
- name: Set up JDK 17
uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # 5.2.0
with:
@@ -27,7 +27,7 @@ jobs:
- name: Upload Artifacts to GitHub
# Only upload on the preview repository as there is no CI job for it.
if: ${{ github.repository == 'ViaVersion/ViaVersionDev' && github.ref_name == 'preview' }}
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # 6.0.0
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # 7.0.0
with:
name: Artifacts
path: build/libs/
+1 -1
View File
@@ -20,7 +20,7 @@ jobs:
with:
persist-credentials: false
- name: Set up Gradle
uses: gradle/actions/setup-gradle@f29f5a9d7b09a7c6b29859002d29d24e1674c884 # 5.0.1
uses: gradle/actions/setup-gradle@39e147cb9de83bb9910b8ef8bd7fff0ee20fcd6f # 6.0.1
- name: Set up JDK 17
uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # 5.2.0
with:
+2
View File
@@ -19,6 +19,8 @@ classes/
*.ipr
*.iws
benchmark/
# VSCode
.settings/
@@ -37,6 +37,7 @@ public interface ViaVersionCommand {
/**
* Removes a subcommand by name, can be used to unload default subcommands which are not supported
* on the platform.
*
* @param name Subcommand name
*/
void removeSubCommand(String name);
@@ -31,8 +31,8 @@ import org.checkerframework.checker.nullness.qual.Nullable;
* Represents an animal variant (e.g. for cows, pigs, chickens).
*
* @param modelType model type id
* @param texture texture path
* @param biomes biomes this variant can spawn in, if limited to specific biomes
* @param texture texture path
* @param biomes biomes this variant can spawn in, if limited to specific biomes
*/
public record AnimalVariant(int modelType, String texture, @Nullable HolderSet biomes) {
@@ -38,7 +38,7 @@ public interface EitherHolder<T> {
/**
* Returns an indirect holder via the resource key.
*
* @param key the resource key
* @param key the resource key
* @param <T> the type of the value
* @return a new holder with the given resource key
*/
@@ -163,7 +163,7 @@ public final class DataPaletteImpl implements DataPalette {
}
}
private class ByteChunkData implements ChunkData {
private final class ByteChunkData implements ChunkData {
private final byte[] data;
public ByteChunkData(int size) {
@@ -187,7 +187,7 @@ public final class DataPaletteImpl implements DataPalette {
}
}
private static class ShortChunkData implements ChunkData {
private static final class ShortChunkData implements ChunkData {
private final short[] data;
public ShortChunkData(byte[] data) {
@@ -53,7 +53,7 @@ public interface CodecContext {
* Returns the key for a stored mapping type and its numeric id.
*
* @param mappingType mapping type
* @param id numeric id
* @param id numeric id
* @return the key
*/
Key key(MappingData.MappingType mappingType, int id);
@@ -62,7 +62,7 @@ public interface CodecContext {
* Returns the numeric id for a stored mapping type and its identifier.
*
* @param mappingType mapping type
* @param identifier identifier
* @param identifier identifier
* @return the numeric id, or -1 if not found
*/
int id(MappingData.MappingType mappingType, String identifier);
@@ -75,7 +75,7 @@ public interface CodecContext {
* Returns the key for a client-synchronized registry element.
*
* @param registry registry key
* @param id numeric id
* @param id numeric id
* @return the key
*/
Key registryKey(String registry, int id);
@@ -81,12 +81,12 @@ public interface Ops {
/**
* Writes the given value or default value if the value is null.
*
* @param key map key
* @param type type of the value
* @param key map key
* @param type type of the value
* @param value the value to write, or null
* @param def default value to write if the value is null
* @param def default value to write if the value is null
* @param <V> value type
* @return self
* @param <V> value type
*/
default <V> MapSerializer write(final String key, final Type<V> type, @Nullable final V value, final V def) {
write(Types.STRING, key, type, value != null ? value : def);
@@ -96,11 +96,11 @@ public interface Ops {
/**
* Writes the given value if it is not null.
*
* @param key map key
* @param type type of the value
* @param key map key
* @param type type of the value
* @param value the value to write, or null
* @param <V> value type
* @return self
* @param <V> value type
*/
default <V> MapSerializer writeOptional(final String key, final Type<V> type, @Nullable final V value) {
if (value != null) {
@@ -112,12 +112,12 @@ public interface Ops {
/**
* Writes the given value if it is not null and not equal to the default value.
*
* @param key map key
* @param type type of the value
* @param key map key
* @param type type of the value
* @param value the value to write, or null
* @param def default value to compare against
* @param def default value to compare against
* @param <V> value type
* @return self
* @param <V> value type
*/
default <V> MapSerializer writeOptional(final String key, final Type<V> type, @Nullable final V value, final V def) {
if (value != null && !Objects.deepEquals(value, def)) {
@@ -145,13 +145,13 @@ public enum EntityTypes1_14 implements EntityType {
SHEEP(ABSTRACT_ANIMAL),
TURTLE(ABSTRACT_ANIMAL),
FOX(ABSTRACT_ANIMAL),
OCELOT(ABSTRACT_ANIMAL),
COW(ABSTRACT_ANIMAL),
MOOSHROOM(COW),
TAMABLE_ANIMAL(ABSTRACT_ANIMAL, null),
CAT(TAMABLE_ANIMAL),
OCELOT(TAMABLE_ANIMAL),
WOLF(TAMABLE_ANIMAL),
PARROT(TAMABLE_ANIMAL),
@@ -146,13 +146,13 @@ public enum EntityTypes1_15 implements EntityType {
BEE(ABSTRACT_ANIMAL),
TURTLE(ABSTRACT_ANIMAL),
FOX(ABSTRACT_ANIMAL),
OCELOT(ABSTRACT_ANIMAL),
COW(ABSTRACT_ANIMAL),
MOOSHROOM(COW),
TAMABLE_ANIMAL(ABSTRACT_ANIMAL, null),
CAT(TAMABLE_ANIMAL),
OCELOT(TAMABLE_ANIMAL),
WOLF(TAMABLE_ANIMAL),
PARROT(TAMABLE_ANIMAL),
@@ -148,13 +148,13 @@ public enum EntityTypes1_16 implements EntityType {
FOX(ABSTRACT_ANIMAL),
HOGLIN(ABSTRACT_ANIMAL),
STRIDER(ABSTRACT_ANIMAL),
OCELOT(ABSTRACT_ANIMAL),
COW(ABSTRACT_ANIMAL),
MOOSHROOM(COW),
TAMABLE_ANIMAL(ABSTRACT_ANIMAL, null),
CAT(TAMABLE_ANIMAL),
OCELOT(TAMABLE_ANIMAL),
WOLF(TAMABLE_ANIMAL),
PARROT(TAMABLE_ANIMAL),
@@ -148,13 +148,13 @@ public enum EntityTypes1_16_2 implements EntityType {
FOX(ABSTRACT_ANIMAL),
HOGLIN(ABSTRACT_ANIMAL),
STRIDER(ABSTRACT_ANIMAL),
OCELOT(ABSTRACT_ANIMAL),
COW(ABSTRACT_ANIMAL),
MOOSHROOM(COW),
TAMABLE_ANIMAL(ABSTRACT_ANIMAL, null),
CAT(TAMABLE_ANIMAL),
OCELOT(TAMABLE_ANIMAL),
WOLF(TAMABLE_ANIMAL),
PARROT(TAMABLE_ANIMAL),
@@ -154,13 +154,13 @@ public enum EntityTypes1_17 implements EntityType {
GOAT(ABSTRACT_ANIMAL),
HOGLIN(ABSTRACT_ANIMAL),
STRIDER(ABSTRACT_ANIMAL),
OCELOT(ABSTRACT_ANIMAL),
COW(ABSTRACT_ANIMAL),
MOOSHROOM(COW),
TAMABLE_ANIMAL(ABSTRACT_ANIMAL, null),
CAT(TAMABLE_ANIMAL),
OCELOT(TAMABLE_ANIMAL),
WOLF(TAMABLE_ANIMAL),
PARROT(TAMABLE_ANIMAL),
@@ -158,13 +158,13 @@ public enum EntityTypes1_19 implements EntityType {
GOAT(ABSTRACT_ANIMAL),
HOGLIN(ABSTRACT_ANIMAL),
STRIDER(ABSTRACT_ANIMAL),
OCELOT(ABSTRACT_ANIMAL),
COW(ABSTRACT_ANIMAL),
MOOSHROOM(COW),
TAMABLE_ANIMAL(ABSTRACT_ANIMAL, null),
CAT(TAMABLE_ANIMAL),
OCELOT(TAMABLE_ANIMAL),
WOLF(TAMABLE_ANIMAL),
PARROT(TAMABLE_ANIMAL),
@@ -158,13 +158,13 @@ public enum EntityTypes1_19_3 implements EntityType {
GOAT(ABSTRACT_ANIMAL),
HOGLIN(ABSTRACT_ANIMAL),
STRIDER(ABSTRACT_ANIMAL),
OCELOT(ABSTRACT_ANIMAL),
COW(ABSTRACT_ANIMAL),
MOOSHROOM(COW),
TAMABLE_ANIMAL(ABSTRACT_ANIMAL, null),
CAT(TAMABLE_ANIMAL),
OCELOT(TAMABLE_ANIMAL),
WOLF(TAMABLE_ANIMAL),
PARROT(TAMABLE_ANIMAL),
@@ -165,13 +165,13 @@ public enum EntityTypes1_19_4 implements EntityType {
HOGLIN(ABSTRACT_ANIMAL),
STRIDER(ABSTRACT_ANIMAL),
SNIFFER(ABSTRACT_ANIMAL),
OCELOT(ABSTRACT_ANIMAL),
COW(ABSTRACT_ANIMAL),
MOOSHROOM(COW),
TAMABLE_ANIMAL(ABSTRACT_ANIMAL, null),
CAT(TAMABLE_ANIMAL),
OCELOT(TAMABLE_ANIMAL),
WOLF(TAMABLE_ANIMAL),
PARROT(TAMABLE_ANIMAL),
@@ -166,13 +166,13 @@ public enum EntityTypes1_20_3 implements EntityType {
HOGLIN(ABSTRACT_ANIMAL),
STRIDER(ABSTRACT_ANIMAL),
SNIFFER(ABSTRACT_ANIMAL),
OCELOT(ABSTRACT_ANIMAL),
COW(ABSTRACT_ANIMAL),
MOOSHROOM(COW),
TAMABLE_ANIMAL(ABSTRACT_ANIMAL, null),
CAT(TAMABLE_ANIMAL),
OCELOT(TAMABLE_ANIMAL),
WOLF(TAMABLE_ANIMAL),
PARROT(TAMABLE_ANIMAL),
@@ -171,13 +171,13 @@ public enum EntityTypes1_20_5 implements EntityType {
STRIDER(ABSTRACT_ANIMAL),
SNIFFER(ABSTRACT_ANIMAL),
ARMADILLO(ABSTRACT_ANIMAL),
OCELOT(ABSTRACT_ANIMAL),
COW(ABSTRACT_ANIMAL),
MOOSHROOM(COW),
TAMABLE_ANIMAL(ABSTRACT_ANIMAL, null),
CAT(TAMABLE_ANIMAL),
OCELOT(TAMABLE_ANIMAL),
WOLF(TAMABLE_ANIMAL),
PARROT(TAMABLE_ANIMAL),
@@ -185,6 +185,7 @@ public enum EntityTypes1_21_11 implements EntityType {
SNIFFER(ABSTRACT_ANIMAL),
ARMADILLO(ABSTRACT_ANIMAL),
HAPPY_GHAST(ABSTRACT_ANIMAL),
OCELOT(ABSTRACT_ANIMAL),
ABSTRACT_COW(ABSTRACT_ANIMAL, null),
COW(ABSTRACT_COW),
@@ -192,7 +193,6 @@ public enum EntityTypes1_21_11 implements EntityType {
TAMABLE_ANIMAL(ABSTRACT_ANIMAL, null),
CAT(TAMABLE_ANIMAL),
OCELOT(TAMABLE_ANIMAL),
WOLF(TAMABLE_ANIMAL),
PARROT(TAMABLE_ANIMAL),
@@ -176,13 +176,13 @@ public enum EntityTypes1_21_2 implements EntityType {
STRIDER(ABSTRACT_ANIMAL),
SNIFFER(ABSTRACT_ANIMAL),
ARMADILLO(ABSTRACT_ANIMAL),
OCELOT(ABSTRACT_ANIMAL),
COW(ABSTRACT_ANIMAL),
MOOSHROOM(COW),
TAMABLE_ANIMAL(ABSTRACT_ANIMAL, null),
CAT(TAMABLE_ANIMAL),
OCELOT(TAMABLE_ANIMAL),
WOLF(TAMABLE_ANIMAL),
PARROT(TAMABLE_ANIMAL),
@@ -176,13 +176,13 @@ public enum EntityTypes1_21_4 implements EntityType {
STRIDER(ABSTRACT_ANIMAL),
SNIFFER(ABSTRACT_ANIMAL),
ARMADILLO(ABSTRACT_ANIMAL),
OCELOT(ABSTRACT_ANIMAL),
COW(ABSTRACT_ANIMAL),
MOOSHROOM(COW),
TAMABLE_ANIMAL(ABSTRACT_ANIMAL, null),
CAT(TAMABLE_ANIMAL),
OCELOT(TAMABLE_ANIMAL),
WOLF(TAMABLE_ANIMAL),
PARROT(TAMABLE_ANIMAL),
@@ -179,6 +179,7 @@ public enum EntityTypes1_21_5 implements EntityType {
STRIDER(ABSTRACT_ANIMAL),
SNIFFER(ABSTRACT_ANIMAL),
ARMADILLO(ABSTRACT_ANIMAL),
OCELOT(ABSTRACT_ANIMAL),
ABSTRACT_COW(ABSTRACT_ANIMAL, null),
COW(ABSTRACT_COW),
@@ -186,7 +187,6 @@ public enum EntityTypes1_21_5 implements EntityType {
TAMABLE_ANIMAL(ABSTRACT_ANIMAL, null),
CAT(TAMABLE_ANIMAL),
OCELOT(TAMABLE_ANIMAL),
WOLF(TAMABLE_ANIMAL),
PARROT(TAMABLE_ANIMAL),
@@ -180,6 +180,7 @@ public enum EntityTypes1_21_6 implements EntityType {
SNIFFER(ABSTRACT_ANIMAL),
ARMADILLO(ABSTRACT_ANIMAL),
HAPPY_GHAST(ABSTRACT_ANIMAL),
OCELOT(ABSTRACT_ANIMAL),
ABSTRACT_COW(ABSTRACT_ANIMAL, null),
COW(ABSTRACT_COW),
@@ -187,7 +188,6 @@ public enum EntityTypes1_21_6 implements EntityType {
TAMABLE_ANIMAL(ABSTRACT_ANIMAL, null),
CAT(TAMABLE_ANIMAL),
OCELOT(TAMABLE_ANIMAL),
WOLF(TAMABLE_ANIMAL),
PARROT(TAMABLE_ANIMAL),
@@ -185,6 +185,7 @@ public enum EntityTypes1_21_9 implements EntityType {
SNIFFER(ABSTRACT_ANIMAL),
ARMADILLO(ABSTRACT_ANIMAL),
HAPPY_GHAST(ABSTRACT_ANIMAL),
OCELOT(ABSTRACT_ANIMAL),
ABSTRACT_COW(ABSTRACT_ANIMAL, null),
COW(ABSTRACT_COW),
@@ -192,7 +193,6 @@ public enum EntityTypes1_21_9 implements EntityType {
TAMABLE_ANIMAL(ABSTRACT_ANIMAL, null),
CAT(TAMABLE_ANIMAL),
OCELOT(TAMABLE_ANIMAL),
WOLF(TAMABLE_ANIMAL),
PARROT(TAMABLE_ANIMAL),
@@ -43,6 +43,10 @@ public abstract class AbstractEntityDataTypes implements EntityDataTypes {
return values;
}
public Class<? extends EntityDataType> getDataTypeClass() {
return byId(0).getClass();
}
protected EntityDataType add(final int typeId, final Type<?> type) {
if (values[typeId] != null) {
throw new IllegalArgumentException("Entity data type ID " + typeId + " is already registered as " + values[typeId]);
@@ -93,7 +93,7 @@ public class ProtocolVersion implements Comparable<ProtocolVersion> {
public static final ProtocolVersion v1_21_7 = register(772, "1.21.7-1.21.8", new SubVersionRange("1.21", 7, 8));
public static final ProtocolVersion v1_21_9 = register(773, "1.21.9-1.21.10", new SubVersionRange("1.21", 9, 10));
public static final ProtocolVersion v1_21_11 = register(774, "1.21.11");
public static final ProtocolVersion v26_1 = register(775, "26.1-26.1.1", new SubVersionRange("26.1", 0, 1));
public static final ProtocolVersion v26_1 = register(775, "26.1-26.1.2", new SubVersionRange("26.1", 0, 2));
public static final ProtocolVersion unknown = new ProtocolVersion(VersionType.SPECIAL, -1, -1, "UNKNOWN", null);
static {
@@ -40,10 +40,7 @@ public interface EntityRewriter<T extends Protocol<?, ?, ?, ?>> extends Rewriter
*/
EntityType typeFromId(int type);
default @Nullable EntityType typeFromId(final String type) {
final int id = protocol().getMappingData().getEntityMappings().id(type);
return id == -1 ? null : typeFromId(id);
}
@Nullable EntityType typeFromId(String type);
/**
* Returns the entity type from the given id.
@@ -76,9 +73,9 @@ public interface EntityRewriter<T extends Protocol<?, ?, ?, ?>> extends Rewriter
/**
* Handles and transforms entity data of an entity.
*
* @param entityId entity id
* @param dataList full, mutable list of entity data
* @param connection user connection
* @param entityId entity id
* @param dataList full, mutable list of entity data
* @param connection user connection
*/
void handleEntityData(int entityId, List<EntityData> dataList, UserConnection connection);
@@ -23,8 +23,8 @@
package com.viaversion.viaversion.api.rewriter;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.util.KeyMappings;
import org.checkerframework.checker.nullness.qual.Nullable;
@@ -40,7 +40,7 @@ public class BlockEntityType1_20_2 extends Type<BlockEntity> {
final byte xz = buffer.readByte();
final short y = buffer.readShort();
final int typeId = Types.VAR_INT.readPrimitive(buffer);
final CompoundTag tag = Types.COMPOUND_TAG.read(buffer);
final CompoundTag tag = Types.TRUSTED_COMPOUND_TAG.read(buffer);
return new BlockEntityImpl(xz, y, typeId, tag);
}
@@ -49,6 +49,6 @@ public class BlockEntityType1_20_2 extends Type<BlockEntity> {
buffer.writeByte(entity.packedXZ());
buffer.writeShort(entity.y());
Types.VAR_INT.writePrimitive(buffer, entity.typeId());
Types.COMPOUND_TAG.write(buffer, entity.tag());
Types.TRUSTED_COMPOUND_TAG.write(buffer, entity.tag());
}
}
@@ -48,7 +48,7 @@ public final class Key {
* Creates a new key with the given namespace and path.
*
* @param namespace the namespace of the identifier
* @param path the path of the identifier
* @param path the path of the identifier
* @return a new key with the given namespace and path
*/
public static Key of(final String namespace, final String path) {
@@ -22,6 +22,7 @@ import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.data.entity.EntityTracker;
import com.viaversion.viaversion.api.data.item.ItemHasher;
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType;
import com.viaversion.viaversion.api.protocol.packet.Direction;
import com.viaversion.viaversion.api.protocol.packet.PacketType;
@@ -37,6 +38,8 @@ import com.viaversion.viaversion.api.protocol.remapper.PacketHandler;
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
import com.viaversion.viaversion.api.rewriter.MappingDataListener;
import com.viaversion.viaversion.api.rewriter.Rewriter;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
import com.viaversion.viaversion.data.item.ItemHasherBase;
import com.viaversion.viaversion.exception.CancelException;
import com.viaversion.viaversion.exception.InformativeException;
import com.viaversion.viaversion.protocol.shared_registration.SharedRegistrations;
@@ -277,10 +280,21 @@ public abstract class AbstractProtocol<CU extends ClientboundPacketType, CM exte
}
}
protected void addEntityTracker(UserConnection connection) {
final EntityType playerEntityType = getEntityRewriter().typeFromId("player");
Preconditions.checkNotNull(playerEntityType, "Player entity type not found");
connection.addEntityTracker(this.getClass(), new EntityTrackerBase(connection, playerEntityType));
}
protected void addEntityTracker(UserConnection connection, EntityTracker tracker) {
connection.addEntityTracker(this.getClass(), tracker);
}
protected void addItemHasher(UserConnection connection) {
connection.addItemHasher(this.getClass(), new ItemHasherBase(this, connection));
}
@Deprecated(forRemoval = true)
protected void addItemHasher(UserConnection connection, ItemHasher hasher) {
connection.addItemHasher(this.getClass(), hasher);
}
@@ -512,31 +526,6 @@ public abstract class AbstractProtocol<CU extends ClientboundPacketType, CM exte
return logger;
}
@Override
public @Nullable TagRewriter<CU> getTagRewriter() {
return null;
}
@Override
public @Nullable ComponentRewriterBase<CU> getComponentRewriter() {
return null;
}
@Override
public com.viaversion.viaversion.rewriter.@Nullable ParticleRewriter<CU> getParticleRewriter() {
return null;
}
@Override
public com.viaversion.viaversion.rewriter.@Nullable EntityRewriter<CU, ?> getEntityRewriter() {
return null;
}
@Override
public com.viaversion.viaversion.rewriter.@Nullable ItemRewriter<CU, SU, ?> getItemRewriter() {
return null;
}
public com.viaversion.viaversion.rewriter.@Nullable BlockRewriter<CU> getBlockRewriter() {
return null;
}
@@ -43,6 +43,7 @@ import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPipeline;
import io.netty.handler.codec.CodecException;
import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
@@ -52,7 +53,6 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Function;
import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap;
import org.checkerframework.checker.nullness.qual.Nullable;
public class UserConnectionImpl implements UserConnection {
@@ -34,8 +34,6 @@ import com.viaversion.viaversion.codec.CodecRegistryContext;
import com.viaversion.viaversion.codec.hash.HashFunction;
import com.viaversion.viaversion.codec.hash.HashOps;
import it.unimi.dsi.fastutil.ints.Int2IntMap;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.checkerframework.checker.nullness.qual.Nullable;
@@ -58,7 +56,7 @@ public class ItemHasherBase implements ItemHasher {
/**
* Returns the hashed item for the given item. Not all data may be successfully hashed.
*
* @param item the item to hash
* @param item the item to hash
* @param mapped whether the item is mapped to the client version
* @return the hashed item
*/
@@ -83,7 +81,7 @@ public class ItemHasherBase implements ItemHasher {
/**
* Tracks the data for the given data container, storing the original hashes via the now transformed data hashes.
*
* @param customData custom_data tag
* @param customData custom_data tag
* @param originalHashedItem the original (pre-transformed) hashed item
*/
public void trackOriginalHashedItem(final CompoundTag customData, final HashedItem originalHashedItem) {
@@ -97,7 +95,7 @@ public class ItemHasherBase implements ItemHasher {
* Returns a copy of the original hashed item for a given custom_data hash.
*
* @param customDataHash custom_data hash
* @param clientItem the hashed item from the client that the original should be retrieved for
* @param clientItem the hashed item from the client that the original should be retrieved for
* @return the original hashed item, or null if not found
*/
public @Nullable HashedItem originalHashedItem(final int customDataHash, final HashedItem clientItem) {
@@ -91,6 +91,6 @@ final class EntityRegistrations {
static @Nullable <CU extends ClientboundPacketType, SU extends ServerboundPacketType> EntityRewriter<CU, ?> entity(final RegistrationContext<CU, SU> ctx) {
return ctx.protocol().getEntityRewriter();
return (EntityRewriter<CU, ?>) ctx.protocol().getEntityRewriter();
}
}
@@ -176,7 +176,7 @@ final class ItemRegistrations {
}
static @Nullable <CU extends ClientboundPacketType, SU extends ServerboundPacketType> ItemRewriter<CU, SU, ?> item(final RegistrationContext<CU, SU> ctx) {
return ctx.protocol().getItemRewriter();
return (ItemRewriter<CU, SU, ?>) ctx.protocol().getItemRewriter();
}
static @Nullable <CU extends ClientboundPacketType, SU extends ServerboundPacketType> StructuredItemRewriter<CU, SU, ?> structuredItem(final RegistrationContext<CU, SU> ctx) {
@@ -69,6 +69,6 @@ final class ParticleRegistrations {
}
static @Nullable <CU extends ClientboundPacketType, SU extends ServerboundPacketType> ParticleRewriter<CU> particle(final RegistrationContext<CU, SU> ctx) {
return ctx.protocol().getParticleRewriter();
return (ParticleRewriter<CU>) ctx.protocol().getParticleRewriter();
}
}
@@ -36,18 +36,21 @@ import com.viaversion.viaversion.rewriter.AttributeRewriter;
import com.viaversion.viaversion.rewriter.RecipeDisplayRewriter;
import com.viaversion.viaversion.rewriter.SoundRewriter;
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
import com.viaversion.viaversion.rewriter.TagRewriter;
final class RegistryRegistrations {
static <CU extends ClientboundPacketType> void registerTags1_17_1(final RegistrationContext<CU, ?> ctx) {
if (ctx.protocol().getTagRewriter() == null) return;
ctx.clientbound(ClientboundPackets1_17_1.UPDATE_TAGS, ctx.protocol().getTagRewriter()::registerGeneric);
if (ctx.protocol().getTagRewriter() instanceof final TagRewriter tagRewriter) {
ctx.clientbound(ClientboundPackets1_17_1.UPDATE_TAGS, tagRewriter::registerGeneric);
}
}
static <CU extends ClientboundPacketType> void registerTags1_20_2(final RegistrationContext<CU, ?> ctx) {
if (ctx.protocol().getTagRewriter() == null) return;
ctx.clientbound(ClientboundPackets1_20_2.UPDATE_TAGS, ctx.protocol().getTagRewriter()::registerGeneric);
ctx.clientbound(ClientboundConfigurationPackets1_20_2.UPDATE_TAGS, ctx.protocol().getTagRewriter()::registerGeneric, PacketBound.ADDED_AT_MIN);
if (ctx.protocol().getTagRewriter() instanceof final TagRewriter tagRewriter) {
ctx.clientbound(ClientboundPackets1_20_2.UPDATE_TAGS, tagRewriter::registerGeneric);
ctx.clientbound(ClientboundConfigurationPackets1_20_2.UPDATE_TAGS, tagRewriter::registerGeneric, PacketBound.ADDED_AT_MIN);
}
}
@@ -184,7 +184,7 @@ final class TextComponentRegistrations {
}
static @Nullable <CU extends ClientboundPacketType, SU extends ServerboundPacketType> ComponentRewriterBase<CU> text(final RegistrationContext<CU, SU> ctx) {
return ctx.protocol().getComponentRewriter();
return (ComponentRewriterBase<CU>) ctx.protocol().getComponentRewriter();
}
@@ -25,8 +25,6 @@ import com.viaversion.viaversion.protocols.v1_21_11to26_1.packet.ClientboundPack
import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ServerboundPacket1_21_9;
import com.viaversion.viaversion.rewriter.StructuredItemRewriter;
// To replace if needed:
// RecipeDisplayRewriter
final class BlockItemPacketRewriter99_1 extends StructuredItemRewriter<ClientboundPacket26_1, ServerboundPacket1_21_9, Protocol98_1To99_1> {
public BlockItemPacketRewriter99_1(final Protocol98_1To99_1 protocol) {
@@ -36,9 +34,7 @@ final class BlockItemPacketRewriter99_1 extends StructuredItemRewriter<Clientbou
@Override
public void registerPackets() {
// Common block, item, recipe, and entity registrations are handled by SharedRegistrations
// registerOpenScreen(ClientboundPackets26_1.OPEN_SCREEN); If a new container type was added; also remove from the component rewriter registration
// OR add new serializers to RecipeDisplayRewriter, or extend the last one for changes
// If recipe serializers changed: add new serializers to RecipeDisplayRewriter, or extend the last one for changes
}
@Override
@@ -49,20 +45,21 @@ final class BlockItemPacketRewriter99_1 extends StructuredItemRewriter<Clientbou
@Override
protected void handleItemDataComponentsToClient(final UserConnection connection, final Item item, final StructuredDataContainer container) {
upgradeData(item, container);
upgradeData(container);
super.handleItemDataComponentsToClient(connection, item, container);
}
public static void upgradeData(final Item item, final StructuredDataContainer container) { // public for VB
}
@Override
protected void handleItemDataComponentsToServer(final UserConnection connection, final Item item, final StructuredDataContainer container) {
downgradeData(item, container);
downgradeData(container);
super.handleItemDataComponentsToServer(connection, item, container);
}
public static void downgradeData(final Item item, final StructuredDataContainer container) {
// public for VB
public static void upgradeData(final StructuredDataContainer container) {
}
public static void downgradeData(final StructuredDataContainer container) {
}
@Override
@@ -24,7 +24,6 @@ import com.viaversion.viaversion.protocols.v1_21_11to26_1.packet.ClientboundPack
import com.viaversion.viaversion.rewriter.EntityRewriter;
// Replace if needed
// VersionedTypes
// EntityTypes1_21_11
final class EntityPacketRewriter99_1 extends EntityRewriter<ClientboundPacket26_1, Protocol98_1To99_1> {
@@ -34,22 +33,19 @@ final class EntityPacketRewriter99_1 extends EntityRewriter<ClientboundPacket26_
@Override
public void registerPackets() {
// Common entity registrations (SET_ENTITY_DATA, REMOVE_ENTITIES, PLAYER_ABILITIES,
// GAME_EVENT, LOGIN, RESPAWN) are handled by SharedRegistrations.
// Common entity registrations (including LOGIN, RESPAWN) are handled by SharedRegistrations.
}
@Override
protected void registerRewrites() {
final EntityDataTypes26_1 entityDataTypes = protocol.mappedTypes().entityDataTypes();
filter().mapDataType(entityDataTypes::byId);
/* ... or something this if entity data classes changed
filter().mapDataType(typeId -> {
int id = typeId;
if (id >= SomeAddedIndex) {
id++;
}
return entityDataTypes.byId(id);
});*/
dataTypeMapper().register();
/* ... or like this for additions and removals that are not at the very end
dataTypeMapper()
.added(entityDataTypes.catSoundVariant)
.removed(entityDataTypes.cowSoundVariant)
.skip(entityDataTypes.pigSoundVariant) // if neither removed nor added, but the value type has to be changed separately
.register();*/
// Registers registry type id changes
registerEntityDataTypeHandler(
@@ -21,16 +21,13 @@ import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.data.MappingData;
import com.viaversion.viaversion.api.data.MappingDataBase;
import com.viaversion.viaversion.api.minecraft.data.version.StructuredDataKeys1_21_11;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_11;
import com.viaversion.viaversion.api.minecraft.entitydata.types.EntityDataTypes26_1;
import com.viaversion.viaversion.api.protocol.AbstractProtocol;
import com.viaversion.viaversion.api.protocol.packet.provider.PacketTypesProvider;
import com.viaversion.viaversion.api.protocol.packet.provider.SimplePacketTypesProvider;
import com.viaversion.viaversion.api.type.types.chunk.ChunkType26_1;
import com.viaversion.viaversion.api.type.types.version.Types1_20_5;
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
import com.viaversion.viaversion.data.item.ItemHasherBase;
import com.viaversion.viaversion.api.protocol.AbstractProtocol;
import com.viaversion.viaversion.protocols.v1_21_11to26_1.packet.ClientboundPacket26_1;
import com.viaversion.viaversion.protocols.v1_21_11to26_1.packet.ClientboundPackets26_1;
import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ServerboundPackets1_21_6;
@@ -49,7 +46,6 @@ import static com.viaversion.viaversion.util.ProtocolUtil.packetTypeMap;
// Placeholders to replace (in the entire package):
// ClientboundPacket26_1
// ServerboundPacket1_21_9
// EntityDataTypes26_1 (MAPPED type)
// VersionedTypes.V26_1
// ChunkType26_1::new
// 98.1, 99.1
@@ -96,26 +92,8 @@ final class Protocol98_1To99_1 extends AbstractProtocol<ClientboundPacket26_1, C
// Uncomment this if the entity types enum has been newly added specifically for this Protocol
// EntityTypes1_21_11.initialize(this);
// Uncomment if a new particle was added = ids shifted; requires a new Types_ class copied from the last
/*mappedTypes().particle.filler(this)
.reader("block", ParticleType.Readers.BLOCK)
.reader("block_marker", ParticleType.Readers.BLOCK)
.reader("dust_pillar", ParticleType.Readers.BLOCK)
.reader("falling_dust", ParticleType.Readers.BLOCK)
.reader("block_crumble", ParticleType.Readers.BLOCK)
.reader("dust", ParticleType.Readers.DUST1_21_2)
.reader("dust_color_transition", ParticleType.Readers.DUST_TRANSITION1_21_2)
.reader("vibration", ParticleType.Readers.VIBRATION1_20_3)
.reader("sculk_charge", ParticleType.Readers.SCULK_CHARGE)
.reader("shriek", ParticleType.Readers.SHRIEK)
.reader("entity_effect", ParticleType.Readers.COLOR)
.reader("tinted_leaves", ParticleType.Readers.COLOR)
.reader("trail", ParticleType.Readers.TRAIL1_21_4)
.reader("dragon_breath", ParticleType.Readers.POWER)
.reader("effect", ParticleType.Readers.SPELL)
.reader("instant_effect", ParticleType.Readers.SPELL)
.reader("flash", ParticleType.Readers.COLOR)
.reader("item", ParticleType.Readers.item(itemRewriter.mappedItemTemplateType()));*/
// Uncomment if versioned types changed
// ParticleType.Fillers.fill1_21_9(this);
super.onMappingDataLoaded(); // Calls load methods on rewriters. Last in case the rewriters access the above filled data
}
@@ -123,8 +101,8 @@ final class Protocol98_1To99_1 extends AbstractProtocol<ClientboundPacket26_1, C
@Override
public void init(final UserConnection connection) {
// Register the entity tracker - used for entity id/entity data rewriting AND for tracking world data sent to the client (then used for chunk data rewriting)
addEntityTracker(connection, new EntityTrackerBase(connection, EntityTypes1_21_11.PLAYER));
addItemHasher(connection, new ItemHasherBase(this, connection));
addEntityTracker(connection);
addItemHasher(connection);
}
// Overriding these methods is important as they are relied on various rewriter classes
@@ -64,7 +64,6 @@ import com.viaversion.viaversion.protocols.v1_12_2to1_13.storage.BlockStorage;
import com.viaversion.viaversion.protocols.v1_12_2to1_13.storage.TabCompleteTracker;
import com.viaversion.viaversion.protocols.v1_12to1_12_1.packet.ClientboundPackets1_12_1;
import com.viaversion.viaversion.protocols.v1_12to1_12_1.packet.ServerboundPackets1_12_1;
import com.viaversion.viaversion.rewriter.SoundRewriter;
import com.viaversion.viaversion.util.ChatColorUtil;
import com.viaversion.viaversion.util.ComponentUtil;
import com.viaversion.viaversion.util.GsonUtil;
@@ -678,7 +677,7 @@ public class Protocol1_12_2To1_13 extends AbstractProtocol<ClientboundPackets1_1
String stringMode = mode == 0 ? "SEQUENCE"
: mode == 1 ? "AUTO"
: "REDSTONE";
: "REDSTONE";
wrapper.write(Types.BOOLEAN, (flags & 0x1) != 0); // Track output
wrapper.write(Types.STRING, stringMode);
@@ -719,8 +718,8 @@ public class Protocol1_12_2To1_13 extends AbstractProtocol<ClientboundPackets1_1
public String transform(PacketWrapper wrapper, Integer mode) {
return mode == 0 ? "SAVE"
: mode == 1 ? "LOAD"
: mode == 2 ? "CORNER"
: "DATA";
: mode == 2 ? "CORNER"
: "DATA";
}
});
map(Types.STRING); // Name
@@ -735,7 +734,7 @@ public class Protocol1_12_2To1_13 extends AbstractProtocol<ClientboundPackets1_1
public String transform(PacketWrapper wrapper, Integer mirror) {
return mirror == 0 ? "NONE"
: mirror == 1 ? "LEFT_RIGHT"
: "FRONT_BACK";
: "FRONT_BACK";
}
});
map(Types.VAR_INT, new ValueTransformer<>(Types.STRING) { // Rotation
@@ -743,8 +742,8 @@ public class Protocol1_12_2To1_13 extends AbstractProtocol<ClientboundPackets1_1
public String transform(PacketWrapper wrapper, Integer rotation) {
return rotation == 0 ? "NONE"
: rotation == 1 ? "CLOCKWISE_90"
: rotation == 2 ? "CLOCKWISE_180"
: "COUNTERCLOCKWISE_90";
: rotation == 2 ? "CLOCKWISE_180"
: "COUNTERCLOCKWISE_90";
}
});
map(Types.STRING);
@@ -26,7 +26,6 @@ import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_16_2;
import com.viaversion.viaversion.protocols.v1_15_2to1_16.packet.ClientboundPackets1_16;
import com.viaversion.viaversion.protocols.v1_16_1to1_16_2.Protocol1_16_1To1_16_2;
import com.viaversion.viaversion.protocols.v1_16_1to1_16_2.packet.ClientboundPackets1_16_2;
import com.viaversion.viaversion.rewriter.BlockRewriter;
import java.util.ArrayList;
import java.util.List;
@@ -18,11 +18,9 @@
package com.viaversion.viaversion.protocols.v1_20_3to1_20_5.data;
import com.viaversion.nbt.tag.CompoundTag;
import com.viaversion.nbt.tag.StringTag;
import com.viaversion.viaversion.api.data.MappingDataBase;
import com.viaversion.viaversion.api.data.MappingDataLoader;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.Protocol1_20_3To1_20_5;
import com.viaversion.viaversion.util.KeyMappings;
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.objects.ObjectSet;
@@ -267,7 +267,8 @@ public final class StructuredDataConverter {
final CompoundTag propertiesTag = new CompoundTag();
for (final GameProfile.Property property : data.properties()) {
final ListTag<CompoundTag> values = new ListTag<>(CompoundTag.class);
ListTag<CompoundTag> values = propertiesTag.getListTag(property.name(), CompoundTag.class);
if (values == null) values = new ListTag<>(CompoundTag.class);
final CompoundTag propertyTag = new CompoundTag();
propertyTag.putString("Value", property.value());
if (property.signature() != null) {
@@ -655,6 +656,10 @@ public final class StructuredDataConverter {
getBackupTag(tag).putInt("ominous_bottle_amplifier", data);
}
});
register(StructuredDataKey.MAP_POST_PROCESSING, (data, tag) -> {
});
register(StructuredDataKey.CREATIVE_SLOT_LOCK, (data, tag) -> {
});
}
private int unmappedItemId(final int id) {
@@ -29,7 +29,6 @@ import com.viaversion.viaversion.api.minecraft.item.data.AttributeModifiers1_21;
import com.viaversion.viaversion.api.minecraft.item.data.Enchantments;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2;
import com.viaversion.viaversion.protocols.v1_20_2to1_20_3.rewriter.RecipeRewriter1_20_3;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ClientboundPacket1_20_5;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ClientboundPackets1_20_5;
@@ -39,7 +38,6 @@ import com.viaversion.viaversion.protocols.v1_20_5to1_21.Protocol1_20_5To1_21;
import com.viaversion.viaversion.protocols.v1_20_5to1_21.data.AttributeModifierMappings1_21;
import com.viaversion.viaversion.protocols.v1_20_5to1_21.storage.EfficiencyAttributeStorage;
import com.viaversion.viaversion.protocols.v1_20_5to1_21.storage.PlayerPositionStorage;
import com.viaversion.viaversion.rewriter.BlockRewriter;
import com.viaversion.viaversion.rewriter.StructuredItemRewriter;
import java.util.Arrays;
import java.util.List;
@@ -26,7 +26,6 @@ import com.viaversion.viaversion.api.minecraft.PaintingVariant;
import com.viaversion.viaversion.api.minecraft.RegistryEntry;
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_20_5;
import com.viaversion.viaversion.api.minecraft.entitydata.EntityDataType;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
@@ -177,17 +176,17 @@ public final class EntityPacketRewriter1_21 extends EntityRewriter<ClientboundPa
@Override
protected void registerRewrites() {
filter().handler((event, data) -> {
final EntityDataType type = data.dataType();
if (type == VersionedTypes.V1_20_5.entityDataTypes.wolfVariantType) {
final int variant = data.value();
data.setTypeAndValue(VersionedTypes.V1_21.entityDataTypes.wolfVariantType, Holder.of(variant));
} else if (type == VersionedTypes.V1_20_5.entityDataTypes.paintingVariantType) {
final int variant = data.value();
data.setTypeAndValue(VersionedTypes.V1_21.entityDataTypes.paintingVariantType, Holder.of(variant));
} else {
data.setDataType(VersionedTypes.V1_21.entityDataTypes.byId(type.typeId()));
}
dataTypeMapper()
.skip(VersionedTypes.V1_20_5.entityDataTypes.wolfVariantType)
.skip(VersionedTypes.V1_20_5.entityDataTypes.paintingVariantType)
.register();
filter().dataType(VersionedTypes.V1_20_5.entityDataTypes.paintingVariantType).handler((event, data) -> {
final int variant = data.value();
data.setTypeAndValue(VersionedTypes.V1_21.entityDataTypes.paintingVariantType, Holder.of(variant));
});
filter().dataType(VersionedTypes.V1_20_5.entityDataTypes.wolfVariantType).handler((event, data) -> {
final int variant = data.value();
data.setTypeAndValue(VersionedTypes.V1_21.entityDataTypes.wolfVariantType, Holder.of(variant));
});
registerEntityDataTypeHandler(
VersionedTypes.V1_21.entityDataTypes.itemType,
@@ -40,7 +40,6 @@ import com.viaversion.viaversion.api.type.types.misc.ParticleType;
import com.viaversion.viaversion.api.type.types.version.Types1_20_5;
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
import com.viaversion.viaversion.data.item.ItemHasherBase;
import com.viaversion.viaversion.protocols.v1_21_11to26_1.data.MappingData26_1;
import com.viaversion.viaversion.protocols.v1_21_11to26_1.packet.ClientboundPacket26_1;
import com.viaversion.viaversion.protocols.v1_21_11to26_1.packet.ClientboundPackets26_1;
@@ -278,7 +277,7 @@ public final class Protocol1_21_11To26_1 extends AbstractProtocol<ClientboundPac
@Override
public void init(final UserConnection connection) {
addEntityTracker(connection, new EntityTrackerBase(connection, EntityTypes1_21_11.PLAYER));
addItemHasher(connection, new ItemHasherBase(this, connection));
addItemHasher(connection);
connection.put(new PlayerSneaking());
}
@@ -58,9 +58,13 @@ public final class BlockItemPacketRewriter26_1 extends StructuredItemRewriter<Cl
protocol.replaceClientbound(ClientboundPackets1_21_11.LEVEL_CHUNK_WITH_LIGHT, wrapper -> {
final Chunk chunk = protocol.getBlockRewriter().handleChunk1_18(wrapper);
for (final ChunkSection section : chunk.getSections()) {
if (section.getNonAirBlocksCount() == 0) {
continue;
}
final DataPalette blockPalette = section.palette(PaletteType.BLOCKS);
for (int i = 0; i < blockPalette.size(); i++) {
final int id = blockPalette.idByIndex(i);
for (int idx = 0; idx < ChunkSection.SIZE; idx++) {
final int id = blockPalette.idAt(idx);
if (Protocol1_21_11To26_1.MAPPINGS.fluidBlockStates().contains(id)) {
// Needed for certain client-side fluid interactions
section.setFluidCount(section.getFluidCount() + 1);
@@ -78,7 +82,7 @@ public final class BlockItemPacketRewriter26_1 extends StructuredItemRewriter<Cl
}
public static void upgradeData(final Protocol<?, ?, ?, ?> protocol, final StructuredDataKeys1_21_11 dataKeys, final StructuredDataContainer container) {
container.replace(StructuredDataKey.JUKEBOX_PLAYABLE1_21_5, StructuredDataKey.JUKEBOX_PLAYABLE26_1, jukeboxPlayable -> upgradeHolder(protocol, jukeboxPlayable.song(), "jukebox_playable"));
container.replace(StructuredDataKey.JUKEBOX_PLAYABLE1_21_5, StructuredDataKey.JUKEBOX_PLAYABLE26_1, jukeboxPlayable -> upgradeHolder(protocol, jukeboxPlayable.song(), "jukebox_song"));
container.replace(StructuredDataKey.INSTRUMENT1_21_5, StructuredDataKey.INSTRUMENT26_1, instrument -> upgradeHolder(protocol, instrument, "instrument"));
container.replace(StructuredDataKey.PROVIDES_TRIM_MATERIAL1_21_5, StructuredDataKey.PROVIDES_TRIM_MATERIAL26_1, providesTrimMaterial -> upgradeHolder(protocol, providesTrimMaterial.material(), "trim_material"));
container.replace(StructuredDataKey.CHICKEN_VARIANT1_21_5, StructuredDataKey.CHICKEN_VARIANT26_1, chickenVariant -> upgradeEitherVariant(protocol, chickenVariant, "chicken_variant"));
@@ -80,22 +80,12 @@ public final class EntityPacketRewriter26_1 extends EntityRewriter<ClientboundPa
@Override
protected void registerRewrites() {
final EntityDataTypes26_1 entityDataTypes = protocol.mappedTypes().entityDataTypes();
filter().mapDataType(id -> {
int mappedId = id;
if (mappedId >= entityDataTypes.catSoundVariant.typeId()) {
mappedId++;
}
if (mappedId >= entityDataTypes.cowSoundVariant.typeId()) {
mappedId++;
}
if (mappedId >= entityDataTypes.pigSoundVariant.typeId()) {
mappedId++;
}
if (mappedId >= entityDataTypes.chickenSoundVariant.typeId()) {
mappedId++;
}
return entityDataTypes.byId(mappedId);
});
dataTypeMapper()
.added(entityDataTypes.catSoundVariant)
.added(entityDataTypes.cowSoundVariant)
.added(entityDataTypes.pigSoundVariant)
.added(entityDataTypes.chickenSoundVariant)
.register();
registerEntityDataTypeHandler(
entityDataTypes.itemType,
entityDataTypes.blockStateType,
@@ -24,6 +24,7 @@ import com.viaversion.viaversion.api.minecraft.Particle;
import com.viaversion.viaversion.api.minecraft.data.StructuredDataKey;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_4;
import com.viaversion.viaversion.api.platform.providers.ViaProviders;
import com.viaversion.viaversion.api.protocol.AbstractProtocol;
import com.viaversion.viaversion.api.protocol.packet.provider.PacketTypesProvider;
import com.viaversion.viaversion.api.protocol.packet.provider.SimplePacketTypesProvider;
import com.viaversion.viaversion.api.type.Types;
@@ -31,7 +32,6 @@ import com.viaversion.viaversion.api.type.types.misc.ParticleType;
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
import com.viaversion.viaversion.api.type.types.version.VersionedTypesHolder;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
import com.viaversion.viaversion.api.protocol.AbstractProtocol;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ServerboundConfigurationPackets1_20_5;
import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundConfigurationPackets1_21;
import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.packet.ServerboundPacket1_21_4;
@@ -23,12 +23,10 @@ import com.viaversion.viaversion.api.minecraft.entities.EntityType;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_4;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundConfigurationPackets1_21;
import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.Protocol1_21_2To1_21_4;
import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.packet.ServerboundPackets1_21_4;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPacket1_21_2;
import com.viaversion.viaversion.rewriter.EntityRewriter;
import com.viaversion.viaversion.rewriter.RegistryDataRewriter;
public final class EntityPacketRewriter1_21_4 extends EntityRewriter<ClientboundPacket1_21_2, Protocol1_21_2To1_21_4> {
@@ -67,7 +65,7 @@ public final class EntityPacketRewriter1_21_4 extends EntityRewriter<Clientbound
@Override
protected void registerRewrites() {
filter().mapDataType(VersionedTypes.V1_21_4.entityDataTypes::byId);
dataTypeMapper().register();
registerEntityDataTypeHandler(
VersionedTypes.V1_21_4.entityDataTypes.itemType,
@@ -197,7 +197,7 @@ public final class Protocol1_21_4To1_21_5 extends AbstractProtocol<ClientboundPa
@Override
public void init(final UserConnection connection) {
addEntityTracker(connection, new EntityTrackerBase(connection, EntityTypes1_21_4.PLAYER));
addItemHasher(connection, new ItemHashStorage1_21_5(this));
connection.addItemHasher(this.getClass(), new ItemHashStorage1_21_5(this));
connection.put(new MessageIndexStorage());
}
@@ -27,7 +27,6 @@ import com.viaversion.viaversion.api.data.MappingData;
import com.viaversion.viaversion.api.data.Mappings;
import com.viaversion.viaversion.api.data.entity.EntityTracker;
import com.viaversion.viaversion.api.minecraft.EitherHolder;
import com.viaversion.viaversion.api.minecraft.Holder;
import com.viaversion.viaversion.api.minecraft.chunks.Chunk;
import com.viaversion.viaversion.api.minecraft.chunks.Chunk1_21_5;
import com.viaversion.viaversion.api.minecraft.chunks.DataPalette;
@@ -42,7 +41,6 @@ import com.viaversion.viaversion.api.minecraft.item.Item;
import com.viaversion.viaversion.api.minecraft.item.StructuredItem;
import com.viaversion.viaversion.api.minecraft.item.data.AdventureModePredicate;
import com.viaversion.viaversion.api.minecraft.item.data.ArmorTrim;
import com.viaversion.viaversion.api.minecraft.item.data.ArmorTrimPattern;
import com.viaversion.viaversion.api.minecraft.item.data.AttributeModifiers1_21;
import com.viaversion.viaversion.api.minecraft.item.data.BlockPredicate;
import com.viaversion.viaversion.api.minecraft.item.data.BlocksAttacks;
@@ -62,15 +60,12 @@ import com.viaversion.viaversion.api.type.types.chunk.ChunkBiomesType1_21_5;
import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2;
import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_21_5;
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
import com.viaversion.viaversion.protocol.packet.PacketWrapperImpl;
import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.Protocol1_21_4To1_21_5;
import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ServerboundPacket1_21_5;
import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ServerboundPackets1_21_5;
import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.storage.ItemHashStorage1_21_5;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPacket1_21_2;
import com.viaversion.viaversion.protocols.v1_21to1_21_2.packet.ClientboundPackets1_21_2;
import com.viaversion.viaversion.rewriter.BlockRewriter;
import com.viaversion.viaversion.rewriter.RecipeDisplayRewriter;
import com.viaversion.viaversion.rewriter.StructuredItemRewriter;
import com.viaversion.viaversion.util.Key;
import com.viaversion.viaversion.util.Limit;
@@ -186,28 +186,16 @@ public final class EntityPacketRewriter1_21_5 extends EntityRewriter<Clientbound
@Override
protected void registerRewrites() {
filter().handler((event, data) -> {
final int id = data.dataType().typeId();
if (id == VersionedTypes.V1_21_4.entityDataTypes.wolfVariantType.typeId()) {
final Holder<WolfVariant> wolfVariant = data.value();
data.setTypeAndValue(VersionedTypes.V1_21_5.entityDataTypes.wolfVariantType, wolfVariant.hasId() ? wolfVariant.id() : 0);
return;
}
int mappedId = id;
if (mappedId >= VersionedTypes.V1_21_5.entityDataTypes.cowVariantType.typeId()) {
mappedId++;
}
if (mappedId >= VersionedTypes.V1_21_5.entityDataTypes.wolfSoundVariantType.typeId()) {
mappedId++;
}
if (mappedId >= VersionedTypes.V1_21_5.entityDataTypes.pigVariantType.typeId()) {
mappedId++;
}
if (mappedId >= VersionedTypes.V1_21_5.entityDataTypes.chickenVariantType.typeId()) {
mappedId++;
}
data.setDataType(VersionedTypes.V1_21_5.entityDataTypes.byId(mappedId));
dataTypeMapper()
.added(VersionedTypes.V1_21_5.entityDataTypes.cowVariantType)
.added(VersionedTypes.V1_21_5.entityDataTypes.wolfSoundVariantType)
.added(VersionedTypes.V1_21_5.entityDataTypes.pigVariantType)
.added(VersionedTypes.V1_21_5.entityDataTypes.chickenVariantType)
.skip(VersionedTypes.V1_21_4.entityDataTypes.wolfVariantType)
.register();
filter().dataType(VersionedTypes.V1_21_4.entityDataTypes.wolfVariantType).handler((event, data) -> {
final Holder<WolfVariant> wolfVariant = data.value();
data.setTypeAndValue(VersionedTypes.V1_21_5.entityDataTypes.wolfVariantType, wolfVariant.hasId() ? wolfVariant.id() : 0);
});
registerEntityDataTypeHandler(
@@ -32,7 +32,6 @@ import com.viaversion.viaversion.api.type.types.misc.ParticleType;
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
import com.viaversion.viaversion.api.type.types.version.VersionedTypesHolder;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
import com.viaversion.viaversion.data.item.ItemHasherBase;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ServerboundConfigurationPackets1_20_5;
import com.viaversion.viaversion.protocols.v1_20_5to1_21.packet.ClientboundConfigurationPackets1_21;
import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ClientboundPacket1_21_5;
@@ -148,7 +147,7 @@ public final class Protocol1_21_5To1_21_6 extends AbstractProtocol<ClientboundPa
@Override
public void init(final UserConnection connection) {
addEntityTracker(connection, new EntityTrackerBase(connection, EntityTypes1_21_6.PLAYER));
addItemHasher(connection, new ItemHasherBase(this, connection));
addItemHasher(connection);
connection.put(new SneakStorage());
}
@@ -101,7 +101,7 @@ public final class EntityPacketRewriter1_21_6 extends EntityRewriter<Clientbound
@Override
protected void registerRewrites() {
final EntityDataTypes1_21_5 entityDataTypes = VersionedTypes.V1_21_6.entityDataTypes;
filter().mapDataType(entityDataTypes::byId);
dataTypeMapper().register();
registerEntityDataTypeHandler(
entityDataTypes.itemType,
entityDataTypes.blockStateType,
@@ -23,14 +23,13 @@ import com.viaversion.viaversion.api.data.MappingDataBase;
import com.viaversion.viaversion.api.minecraft.data.version.StructuredDataKeys1_21_5;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_6;
import com.viaversion.viaversion.api.minecraft.entitydata.types.EntityDataTypes1_21_5;
import com.viaversion.viaversion.api.protocol.AbstractProtocol;
import com.viaversion.viaversion.api.protocol.packet.provider.PacketTypesProvider;
import com.viaversion.viaversion.api.protocol.packet.provider.SimplePacketTypesProvider;
import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_21_5;
import com.viaversion.viaversion.api.type.types.version.Types1_20_5;
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
import com.viaversion.viaversion.data.item.ItemHasherBase;
import com.viaversion.viaversion.api.protocol.AbstractProtocol;
import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.rewriter.RecipeDisplayRewriter1_21_5;
import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundConfigurationPackets1_21_6;
import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPacket1_21_6;
@@ -71,7 +70,7 @@ public final class Protocol1_21_6To1_21_7 extends AbstractProtocol<ClientboundPa
@Override
public void init(final UserConnection connection) {
addEntityTracker(connection, new EntityTrackerBase(connection, EntityTypes1_21_6.PLAYER));
addItemHasher(connection, new ItemHasherBase(this, connection));
addItemHasher(connection);
}
@Override
@@ -25,6 +25,7 @@ import com.viaversion.viaversion.api.minecraft.data.version.StructuredDataKeys1_
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_9;
import com.viaversion.viaversion.api.minecraft.entitydata.types.EntityDataTypes1_21_5;
import com.viaversion.viaversion.api.minecraft.entitydata.types.EntityDataTypes1_21_9;
import com.viaversion.viaversion.api.protocol.AbstractProtocol;
import com.viaversion.viaversion.api.protocol.packet.provider.PacketTypesProvider;
import com.viaversion.viaversion.api.protocol.packet.provider.SimplePacketTypesProvider;
import com.viaversion.viaversion.api.type.Types;
@@ -33,8 +34,6 @@ import com.viaversion.viaversion.api.type.types.misc.ParticleType;
import com.viaversion.viaversion.api.type.types.version.Types1_20_5;
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
import com.viaversion.viaversion.data.item.ItemHasherBase;
import com.viaversion.viaversion.api.protocol.AbstractProtocol;
import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.rewriter.RecipeDisplayRewriter1_21_5;
import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundConfigurationPackets1_21_6;
import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPacket1_21_6;
@@ -163,7 +162,7 @@ public final class Protocol1_21_7To1_21_9 extends AbstractProtocol<ClientboundPa
@Override
public void init(final UserConnection connection) {
addEntityTracker(connection, new EntityTrackerBase(connection, EntityTypes1_21_9.PLAYER));
addItemHasher(connection, new ItemHasherBase(this, connection));
addItemHasher(connection);
connection.put(new DimensionScaleStorage());
}
@@ -23,7 +23,6 @@ import com.viaversion.viaversion.api.minecraft.data.StructuredDataKey;
import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPacket1_21_6;
import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.Protocol1_21_7To1_21_9;
import com.viaversion.viaversion.rewriter.text.NBTComponentRewriter;
import com.viaversion.viaversion.util.TagUtil;
public final class ComponentRewriter1_21_9 extends NBTComponentRewriter<ClientboundPacket1_21_6> {
@@ -103,24 +103,11 @@ public final class EntityPacketRewriter1_21_9 extends EntityRewriter<Clientbound
protected void registerRewrites() {
final EntityDataTypes1_21_5 unmappedEntityDataTypes = protocol.types().entityDataTypes();
final EntityDataTypes1_21_9 entityDataTypes = protocol.mappedTypes().entityDataTypes();
filter().handler((event, data) -> {
int id = data.dataType().typeId();
if (id == unmappedEntityDataTypes.compoundTagType.typeId()) {
if (event.entityType() == null) {
// Remove unhandled data from bad packets here
event.cancel();
}
return; // Handled below
}
if (id > unmappedEntityDataTypes.compoundTagType.typeId()) {
id--;
}
if (id > entityDataTypes.armadilloState.typeId()) {
id += 2; // copper golem and weathering copper state
}
data.setDataType(entityDataTypes.byId(id));
});
dataTypeMapper()
.added(entityDataTypes.copperGolemState)
.added(entityDataTypes.weatheringCopperState)
.removed(unmappedEntityDataTypes.compoundTagType)
.register();
registerEntityDataTypeHandler(
entityDataTypes.itemType,
entityDataTypes.blockStateType,
@@ -34,6 +34,7 @@ import com.viaversion.viaversion.api.minecraft.data.version.StructuredDataKeys1_
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_11;
import com.viaversion.viaversion.api.minecraft.entitydata.types.EntityDataTypes1_21_11;
import com.viaversion.viaversion.api.minecraft.entitydata.types.EntityDataTypes1_21_9;
import com.viaversion.viaversion.api.protocol.AbstractProtocol;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.protocol.packet.provider.PacketTypesProvider;
import com.viaversion.viaversion.api.protocol.packet.provider.SimplePacketTypesProvider;
@@ -43,8 +44,6 @@ import com.viaversion.viaversion.api.type.types.misc.ParticleType;
import com.viaversion.viaversion.api.type.types.version.Types1_20_5;
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
import com.viaversion.viaversion.data.item.ItemHasherBase;
import com.viaversion.viaversion.api.protocol.AbstractProtocol;
import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.rewriter.RecipeDisplayRewriter1_21_5;
import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ServerboundPackets1_21_6;
import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ClientboundConfigurationPackets1_21_9;
@@ -55,9 +54,9 @@ import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ServerboundPac
import com.viaversion.viaversion.protocols.v1_21_9to1_21_11.data.MappingData1_21_11;
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.protocols.v1_21_9to1_21_11.rewriter.BlockItemPacketRewriter1_21_11;
import com.viaversion.viaversion.protocols.v1_21_9to1_21_11.rewriter.ComponentRewriter1_21_11;
import com.viaversion.viaversion.protocols.v1_21_9to1_21_11.rewriter.EntityPacketRewriter1_21_11;
import com.viaversion.viaversion.protocols.v1_21_9to1_21_11.rewriter.BlockItemPacketRewriter1_21_11;
import com.viaversion.viaversion.protocols.v1_21_9to1_21_11.storage.GameTimeStorage;
import com.viaversion.viaversion.rewriter.BlockRewriter;
import com.viaversion.viaversion.rewriter.ParticleRewriter;
@@ -323,7 +322,7 @@ public final class Protocol1_21_9To1_21_11 extends AbstractProtocol<ClientboundP
@Override
public void init(final UserConnection connection) {
addEntityTracker(connection, new EntityTrackerBase(connection, EntityTypes1_21_11.PLAYER));
addItemHasher(connection, new ItemHasherBase(this, connection));
addItemHasher(connection);
connection.put(new GameTimeStorage());
}
@@ -53,12 +53,7 @@ public final class EntityPacketRewriter1_21_11 extends EntityRewriter<Clientboun
@Override
protected void registerRewrites() {
final EntityDataTypes1_21_11 entityDataTypes = protocol.mappedTypes().entityDataTypes();
filter().mapDataType(id -> {
if (id >= entityDataTypes.zombieNautilusVariantType.typeId()) {
id++;
}
return entityDataTypes.byId(id);
});
dataTypeMapper().added(entityDataTypes.zombieNautilusVariantType).register();
registerEntityDataTypeHandler(
entityDataTypes.itemType,
entityDataTypes.blockStateType,
@@ -24,6 +24,7 @@ import com.viaversion.viaversion.api.data.MappingDataBase;
import com.viaversion.viaversion.api.minecraft.RegistryEntry;
import com.viaversion.viaversion.api.minecraft.data.StructuredDataKey;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_2;
import com.viaversion.viaversion.api.protocol.AbstractProtocol;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.protocol.packet.State;
import com.viaversion.viaversion.api.protocol.packet.provider.PacketTypesProvider;
@@ -34,7 +35,6 @@ import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2;
import com.viaversion.viaversion.api.type.types.misc.ParticleType;
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
import com.viaversion.viaversion.api.type.types.version.VersionedTypesHolder;
import com.viaversion.viaversion.api.protocol.AbstractProtocol;
import com.viaversion.viaversion.protocols.base.ClientboundLoginPackets;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ServerboundConfigurationPackets1_20_5;
import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.packet.ServerboundPacket1_20_5;
@@ -475,7 +475,7 @@ public final class EntityPacketRewriter1_21_2 extends EntityRewriter<Clientbound
@Override
protected void registerRewrites() {
filter().mapDataType(VersionedTypes.V1_21_2.entityDataTypes::byId);
dataTypeMapper().register();
registerEntityDataTypeHandler(
VersionedTypes.V1_21_2.entityDataTypes.itemType,
@@ -48,7 +48,6 @@ import com.viaversion.viaversion.protocols.v1_8to1_9.provider.CommandBlockProvid
import com.viaversion.viaversion.protocols.v1_8to1_9.provider.HandItemProvider;
import com.viaversion.viaversion.protocols.v1_8to1_9.storage.ClientWorld1_9;
import com.viaversion.viaversion.protocols.v1_8to1_9.storage.EntityTracker1_9;
import com.viaversion.viaversion.util.ComponentUtil;
import com.viaversion.viaversion.util.Key;
import java.util.ArrayList;
import java.util.Optional;
@@ -19,7 +19,6 @@ package com.viaversion.viaversion.rewriter;
import com.google.common.base.Preconditions;
import com.viaversion.viaversion.api.data.FullMappings;
import com.viaversion.viaversion.api.data.Mappings;
import com.viaversion.viaversion.api.protocol.Protocol;
import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
@@ -91,6 +91,19 @@ public abstract class EntityRewriter<C extends ClientboundPacketType, T extends
return new EntityDataFilter.Builder(this);
}
/**
* Registers a first-pass handler to remap entity data types via {@code rewriter.protocol().mappedTypes().entityDataTypes().byId(typeId)}
* <p>
* Removed source types are intentionally left untouched during the initial handler, so entity-specific handlers can
* still manually remap them before the final cancellation runs (unless something sent invalid packets for untracked entities).
*
* @return configurable type remapper
*/
public EntityDataFilter.DataTypeMapper dataTypeMapper() {
Preconditions.checkNotNull(protocol.mappedTypes(), "Protocol does not override mappedTypes, use filter().mapDataType instead");
return new EntityDataFilter.DataTypeMapper(this);
}
/**
* Registers an entity data filter.
* Note that {@link EntityDataFilter.Builder#register()} already calls this method.
@@ -177,6 +190,13 @@ public abstract class EntityRewriter<C extends ClientboundPacketType, T extends
return identifier;
}
@Override
public @Nullable EntityType typeFromId(final String type) {
final FullMappings mappings = protocol().getMappingData().getEntityMappings();
final int id = trackMappedType ? mappings.mappedId(type) : mappings.id(type);
return id == -1 ? null : typeFromId(id);
}
/**
* Maps an entity type.
*
@@ -19,7 +19,6 @@ package com.viaversion.viaversion.rewriter;
import com.viaversion.viaversion.api.data.FullMappings;
import com.viaversion.viaversion.api.data.MappingData;
import com.viaversion.viaversion.api.data.Mappings;
import com.viaversion.viaversion.api.minecraft.HolderSet;
import com.viaversion.viaversion.api.minecraft.item.Item;
import com.viaversion.viaversion.api.protocol.Protocol;
@@ -22,8 +22,14 @@ import com.google.common.base.Preconditions;
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
import com.viaversion.viaversion.api.minecraft.entitydata.EntityData;
import com.viaversion.viaversion.api.minecraft.entitydata.EntityDataType;
import com.viaversion.viaversion.api.minecraft.entitydata.types.AbstractEntityDataTypes;
import com.viaversion.viaversion.rewriter.EntityRewriter;
import it.unimi.dsi.fastutil.ints.Int2ObjectFunction;
import it.unimi.dsi.fastutil.ints.IntArrayList;
import it.unimi.dsi.fastutil.ints.IntArraySet;
import it.unimi.dsi.fastutil.ints.IntComparators;
import it.unimi.dsi.fastutil.ints.IntList;
import it.unimi.dsi.fastutil.ints.IntSet;
import java.util.Objects;
import org.checkerframework.checker.nullness.qual.Nullable;
@@ -34,6 +40,10 @@ public record EntityDataFilter(@Nullable EntityType type, boolean filterFamily,
Preconditions.checkNotNull(handler, "EntityDataHandler cannot be null");
}
public EntityDataFilter(final EntityDataHandler handler) {
this(null, true, null, -1, handler);
}
/**
* Returns the entity data index to filter, or -1.
*
@@ -82,7 +92,7 @@ public record EntityDataFilter(@Nullable EntityType type, boolean filterFamily,
/**
* Returns whether if the entity data should be handled by this filter.
*
* @param type entity type
* @param type entity type
* @param entityData entityData
* @return whether the data should be filtered
*/
@@ -211,6 +221,7 @@ public record EntityDataFilter(@Nullable EntityType type, boolean filterFamily,
register();
}
// Mainly for pre-1.20.5 use
public void mapDataType(Int2ObjectFunction<EntityDataType> updateFunction) {
handler((event, data) -> {
EntityDataType mappedType = updateFunction.apply(data.dataType().typeId());
@@ -293,7 +304,112 @@ public record EntityDataFilter(@Nullable EntityType type, boolean filterFamily,
* @return created data filter
*/
public EntityDataFilter build() {
Preconditions.checkNotNull(handler, "EntityDataHandler cannot be null");
return new EntityDataFilter(type, filterFamily, dataType, index, handler);
}
}
public static final class DataTypeMapper {
private final IntList addedTypeIds = new IntArrayList();
private final IntList removedTypeIds = new IntArrayList();
private final IntSet skippedTypeIds = new IntArraySet();
private final EntityRewriter<?, ?> rewriter;
private final AbstractEntityDataTypes mappedDataTypes;
public DataTypeMapper(final EntityRewriter<?, ?> rewriter) {
this.rewriter = rewriter;
this.mappedDataTypes = rewriter.protocol().mappedTypes().entityDataTypes();
}
/**
* Marks a mapped entity data type as added.
*
* @param dataType added mapped entity data type
* @return self
*/
public DataTypeMapper added(final EntityDataType dataType) {
Preconditions.checkArgument(dataType.getClass() == mappedDataTypes.getDataTypeClass());
this.addedTypeIds.add(dataType.typeId());
return this;
}
/**
* Marks an unmapped entity data type as removed.
* <p>
* Matching unmapped types are left untouched for the regular handlers to process and must be canceled or updated manually.
*
* @param dataType removed unmapped entity data type
* @return self
*/
public DataTypeMapper removed(final EntityDataType dataType) {
Preconditions.checkArgument(dataType.getClass() == rewriter.protocol().types().entityDataTypes().getDataTypeClass());
this.removedTypeIds.add(dataType.typeId());
return this;
}
/**
* Skips automatic remapping for an unmapped entity data type so another handler can process it later.
*
* @param dataType unmapped entity data type to leave untouched
* @return self
*/
public DataTypeMapper skip(final EntityDataType dataType) {
Preconditions.checkArgument(dataType.getClass() == rewriter.protocol().types().entityDataTypes().getDataTypeClass());
this.skippedTypeIds.add(dataType.typeId());
return this;
}
public void register() {
if (addedTypeIds.isEmpty() && removedTypeIds.isEmpty() && skippedTypeIds.isEmpty()) {
// Simple handler
rewriter.filter().handler((event, data) -> {
final EntityDataType dataType = mappedDataTypes.byId(data.dataType().typeId());
data.setDataType(dataType);
});
return;
}
this.addedTypeIds.sort(IntComparators.NATURAL_COMPARATOR);
this.removedTypeIds.sort(IntComparators.OPPOSITE_COMPARATOR);
rewriter.registerFilter(new EntityDataFilter((event, data) -> {
// Do not cancel removed elements yet so that filters can handle them (unless something sent an invalid packet for untracked entities)
final EntityDataType mappedType = mappedType(data.dataType());
if (mappedType != null) {
data.setDataType(mappedType);
} else if (event.entityType() == null) {
event.cancel();
}
}));
}
private @Nullable EntityDataType mappedType(final EntityDataType dataType) {
if (skippedTypeIds.contains(dataType.typeId()) || shouldCancel(dataType)) {
return null;
}
final int mappedId = mappedTypeId(dataType.typeId());
return mappedDataTypes.byId(mappedId);
}
private boolean shouldCancel(final EntityDataType dataType) {
return !removedTypeIds.isEmpty() && removedTypeIds.contains(dataType.typeId());
}
private int mappedTypeId(int typeId) {
// Starts with the highest removed
for (final int removedTypeId : removedTypeIds) {
if (typeId > removedTypeId) {
typeId--;
}
}
// Starts with the first added
for (final int addedTypeId : addedTypeIds) {
if (typeId >= addedTypeId) {
typeId++;
}
}
return typeId;
}
}
}
+3 -3
View File
@@ -1,9 +1,9 @@
# Project properties - we put these here so they can be modified without causing a recompile of the build scripts
projectVersion=5.9.0-SNAPSHOT
projectVersion=5.9.0
# Smile emoji (note that modrinth may not have added the version on release yet)
mcVersions=26.1, 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, 1.9.4, 1.9.3, 1.9.2, 1.9.1, 1.9, 1.8.9
mcVersionRange=1.8-26.1.1
mcVersions=26.1.2, 26.1.1, 26.1, 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, 1.9.4, 1.9.3, 1.9.2, 1.9.1, 1.9, 1.8.9
mcVersionRange=1.8-26.1.2
velocityVersion=3.4-3.5
# Gradle properties
+2 -2
View File
@@ -3,7 +3,7 @@ metadata.format.version = "1.1"
[versions]
gson = "2.13.2"
snakeYaml = "2.5"
snakeYaml = "2.6"
fastutil = "8.5.15"
vianbt = "5.2.0"
mcstructs = "5-3.3.1-SNAPSHOT"
@@ -14,7 +14,7 @@ guava = "17.0"
junit = "6.0.3"
platformLauncher = "6.0.3"
checkerQual = "3.53.1"
checkerQual = "3.54.0"
# Platforms
paper = "1.20.4-R0.1-SNAPSHOT"