diff --git a/common/src/main/java/com/viaversion/viabackwards/api/BackwardsProtocol.java b/common/src/main/java/com/viaversion/viabackwards/api/BackwardsProtocol.java index 006c64af..17cd23e3 100644 --- a/common/src/main/java/com/viaversion/viabackwards/api/BackwardsProtocol.java +++ b/common/src/main/java/com/viaversion/viabackwards/api/BackwardsProtocol.java @@ -18,9 +18,9 @@ package com.viaversion.viabackwards.api; import com.viaversion.viabackwards.api.data.BackwardsMappings; -import com.viaversion.viabackwards.api.entities.storage.EntityTracker; +import com.viaversion.viabackwards.api.rewriters.ItemRewriterBase; +import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter; import com.viaversion.viaversion.api.Via; -import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.protocol.AbstractProtocol; import com.viaversion.viaversion.api.protocol.Protocol; import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType; @@ -45,23 +45,22 @@ public abstract class BackwardsProtocol. - */ - -package com.viaversion.viabackwards.api.entities.meta; - -import com.viaversion.viabackwards.api.exceptions.RemovedValueException; -import com.viaversion.viaversion.api.minecraft.metadata.Metadata; - -public interface MetaHandler { - - Metadata handle(MetaHandlerEvent e) throws RemovedValueException; -} diff --git a/common/src/main/java/com/viaversion/viabackwards/api/entities/meta/MetaHandlerEvent.java b/common/src/main/java/com/viaversion/viabackwards/api/entities/meta/MetaHandlerEvent.java deleted file mode 100644 index 16115479..00000000 --- a/common/src/main/java/com/viaversion/viabackwards/api/entities/meta/MetaHandlerEvent.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards - * Copyright (C) 2016-2021 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 . - */ - -package com.viaversion.viabackwards.api.entities.meta; - -import com.viaversion.viabackwards.api.entities.storage.EntityTracker; -import com.viaversion.viabackwards.api.entities.storage.MetaStorage; -import com.viaversion.viaversion.api.connection.UserConnection; -import com.viaversion.viaversion.api.minecraft.metadata.Metadata; -import org.checkerframework.checker.nullness.qual.Nullable; - -import java.util.ArrayList; -import java.util.List; - -public class MetaHandlerEvent { - private final UserConnection user; - private final EntityTracker.StoredEntity entity; - private final int index; - private final Metadata data; - private final MetaStorage storage; - private List extraData; - - public MetaHandlerEvent(UserConnection user, EntityTracker.StoredEntity entity, int index, Metadata data, MetaStorage storage) { - this.user = user; - this.entity = entity; - this.index = index; - this.data = data; - this.storage = storage; - } - - public boolean hasData() { - return data != null; - } - - public Metadata getMetaByIndex(int index) { - for (Metadata meta : storage.getMetaDataList()) { - if (index == meta.getId()) { - return meta; - } - } - return null; - } - - public void clearExtraData() { - extraData = null; - } - - public void createMeta(Metadata metadata) { - (extraData != null ? extraData : (extraData = new ArrayList<>())).add(metadata); - } - - public UserConnection getUser() { - return user; - } - - public EntityTracker.StoredEntity getEntity() { - return entity; - } - - public int getIndex() { - return index; - } - - public Metadata getData() { - return data; - } - - public MetaStorage getStorage() { - return storage; - } - - /** - * May be null, use {@link #createMeta(Metadata)} for adding metadata. - */ - public @Nullable List getExtraData() { - return extraData; - } -} diff --git a/common/src/main/java/com/viaversion/viabackwards/api/entities/meta/MetaHandlerSettings.java b/common/src/main/java/com/viaversion/viabackwards/api/entities/meta/MetaHandlerSettings.java deleted file mode 100644 index d48413e1..00000000 --- a/common/src/main/java/com/viaversion/viabackwards/api/entities/meta/MetaHandlerSettings.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards - * Copyright (C) 2016-2021 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 . - */ - -package com.viaversion.viabackwards.api.entities.meta; - -import com.viaversion.viabackwards.api.exceptions.RemovedValueException; -import com.viaversion.viaversion.api.minecraft.entities.EntityType; -import com.viaversion.viaversion.api.minecraft.metadata.Metadata; -import org.checkerframework.checker.nullness.qual.Nullable; - -public class MetaHandlerSettings { - private EntityType filterType; - private boolean filterFamily; - private int filterIndex = -1; - private MetaHandler handler; - - public MetaHandlerSettings filter(EntityType type) { - return filter(type, filterFamily, filterIndex); - } - - public MetaHandlerSettings filter(EntityType type, boolean filterFamily) { - return filter(type, filterFamily, filterIndex); - } - - public MetaHandlerSettings filter(int index) { - return filter(filterType, filterFamily, index); - } - - public MetaHandlerSettings filter(EntityType type, int index) { - return filter(type, filterFamily, index); - } - - public MetaHandlerSettings filter(EntityType type, boolean filterFamily, int index) { - this.filterType = type; - this.filterFamily = filterFamily; - this.filterIndex = index; - return this; - } - - public void handle(@Nullable MetaHandler handler) { - this.handler = handler; - } - - public void handleIndexChange(final int newIndex) { - handle(e -> { - Metadata data = e.getData(); - data.setId(newIndex); - return data; - }); - } - - public void removed() { - handle(e -> { - throw RemovedValueException.EX; - }); - } - - public boolean hasHandler() { - return handler != null; - } - - public boolean hasType() { - return filterType != null; - } - - public boolean hasIndex() { - return filterIndex > -1; - } - - public boolean isFilterFamily() { - return filterFamily; - } - - /** - * Returns true if the metadata should be handled by this object. - * - * @param type entity type - * @param metadata metadata - * @return true if gucci - */ - public boolean isGucci(EntityType type, Metadata metadata) { - if (!hasHandler()) return false; - if (hasType() && (filterFamily ? !type.isOrHasParent(filterType) : !filterType.is(type))) { - return false; - } - return !hasIndex() || metadata.getId() == filterIndex; - } - - public EntityType getFilterType() { - return filterType; - } - - public int getFilterIndex() { - return filterIndex; - } - - public @Nullable MetaHandler getHandler() { - return handler; - } - - @Override - public String toString() { - return "MetaHandlerSettings{" + - "filterType=" + filterType + - ", filterFamily=" + filterFamily + - ", filterIndex=" + filterIndex + - ", handler=" + handler + - '}'; - } -} diff --git a/common/src/main/java/com/viaversion/viabackwards/api/entities/storage/EntityData.java b/common/src/main/java/com/viaversion/viabackwards/api/entities/storage/EntityData.java index 6791629e..9736c530 100644 --- a/common/src/main/java/com/viaversion/viabackwards/api/entities/storage/EntityData.java +++ b/common/src/main/java/com/viaversion/viabackwards/api/entities/storage/EntityData.java @@ -51,30 +51,30 @@ public class EntityData { return this.defaultMeta != null; } - public int getId() { + public int typeId() { return id; } /** * @return custom mobname, can be either a String or a JsonElement */ - public @Nullable Object getMobName() { + public @Nullable Object mobName() { return mobName; } - public int getReplacementId() { + public int replacementId() { return replacementId; } - public @Nullable MetaCreator getDefaultMeta() { + public @Nullable MetaCreator defaultMeta() { return defaultMeta; } - public boolean isObject() { + public boolean isObjectType() { return false; } - public int getObjectData() { + public int objectData() { return -1; } @@ -91,6 +91,6 @@ public class EntityData { @FunctionalInterface public interface MetaCreator { - void createMeta(MetaStorage storage); + void createMeta(WrappedMetadata storage); } } diff --git a/common/src/main/java/com/viaversion/viabackwards/api/entities/storage/EntityObjectData.java b/common/src/main/java/com/viaversion/viabackwards/api/entities/storage/EntityObjectData.java index f45881db..5bd9cb05 100644 --- a/common/src/main/java/com/viaversion/viabackwards/api/entities/storage/EntityObjectData.java +++ b/common/src/main/java/com/viaversion/viabackwards/api/entities/storage/EntityObjectData.java @@ -28,12 +28,12 @@ public class EntityObjectData extends EntityData { } @Override - public boolean isObject() { + public boolean isObjectType() { return isObject; } @Override - public int getObjectData() { + public int objectData() { return objectData; } } diff --git a/common/src/main/java/com/viaversion/viabackwards/api/entities/storage/EntityPositionHandler.java b/common/src/main/java/com/viaversion/viabackwards/api/entities/storage/EntityPositionHandler.java index da692af4..c309905e 100644 --- a/common/src/main/java/com/viaversion/viabackwards/api/entities/storage/EntityPositionHandler.java +++ b/common/src/main/java/com/viaversion/viabackwards/api/entities/storage/EntityPositionHandler.java @@ -21,6 +21,7 @@ import com.viaversion.viabackwards.ViaBackwards; import com.viaversion.viabackwards.api.rewriters.EntityRewriterBase; import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.data.entity.StoredEntityData; import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; import com.viaversion.viaversion.api.type.Type; @@ -29,12 +30,12 @@ import java.util.function.Supplier; public class EntityPositionHandler { public static final double RELATIVE_MOVE_FACTOR = 32 * 128; - private final EntityRewriterBase entityRewriter; + private final EntityRewriterBase entityRewriter; private final Class storageClass; private final Supplier storageSupplier; private boolean warnedForMissingEntity; - public EntityPositionHandler(EntityRewriterBase entityRewriter, + public EntityPositionHandler(EntityRewriterBase entityRewriter, Class storageClass, Supplier storageSupplier) { this.entityRewriter = entityRewriter; this.storageClass = storageClass; @@ -48,7 +49,7 @@ public class EntityPositionHandler { public void cacheEntityPosition(PacketWrapper wrapper, double x, double y, double z, boolean create, boolean relative) throws Exception { int entityId = wrapper.get(Type.VAR_INT, 0); - EntityTracker.StoredEntity storedEntity = entityRewriter.getEntityTracker(wrapper.user()).getEntity(entityId); + StoredEntityData storedEntity = entityRewriter.tracker(wrapper.user()).entityData(entityId); if (storedEntity == null) { if (Via.getManager().isDebug()) { // There is too many plugins violating this out there, and reading seems to be hard! :> ViaBackwards.getPlatform().getLogger().warning("Stored entity with id " + entityId + " missing at position: " + x + " - " + y + " - " + z + " in " + storageClass.getSimpleName()); @@ -73,7 +74,7 @@ public class EntityPositionHandler { } public EntityPositionStorage getStorage(UserConnection user, int entityId) { - EntityTracker.StoredEntity storedEntity = user.get(EntityTracker.class).get(entityRewriter.getProtocol()).getEntity(entityId); + StoredEntityData storedEntity = entityRewriter.tracker(user).entityData(entityId); EntityPositionStorage entityStorage; if (storedEntity == null || (entityStorage = storedEntity.get(EntityPositionStorage.class)) == null) { ViaBackwards.getPlatform().getLogger().warning("Untracked entity with id " + entityId + " in " + storageClass.getSimpleName()); diff --git a/common/src/main/java/com/viaversion/viabackwards/api/entities/storage/EntityPositionStorage.java b/common/src/main/java/com/viaversion/viabackwards/api/entities/storage/EntityPositionStorage.java index 31dc079a..ce3a80e6 100644 --- a/common/src/main/java/com/viaversion/viabackwards/api/entities/storage/EntityPositionStorage.java +++ b/common/src/main/java/com/viaversion/viabackwards/api/entities/storage/EntityPositionStorage.java @@ -17,7 +17,7 @@ */ package com.viaversion.viabackwards.api.entities.storage; -public abstract class EntityPositionStorage implements EntityStorage { +public abstract class EntityPositionStorage { private double x; private double y; private double z; diff --git a/common/src/main/java/com/viaversion/viabackwards/api/entities/storage/EntityStorage.java b/common/src/main/java/com/viaversion/viabackwards/api/entities/storage/EntityStorage.java deleted file mode 100644 index a00359c5..00000000 --- a/common/src/main/java/com/viaversion/viabackwards/api/entities/storage/EntityStorage.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards - * Copyright (C) 2016-2021 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 . - */ - -package com.viaversion.viabackwards.api.entities.storage; - -public interface EntityStorage { -} diff --git a/common/src/main/java/com/viaversion/viabackwards/api/entities/storage/EntityTracker.java b/common/src/main/java/com/viaversion/viabackwards/api/entities/storage/EntityTracker.java deleted file mode 100644 index ef4426a9..00000000 --- a/common/src/main/java/com/viaversion/viabackwards/api/entities/storage/EntityTracker.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards - * Copyright (C) 2016-2021 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 . - */ - -package com.viaversion.viabackwards.api.entities.storage; - -import com.viaversion.viabackwards.api.BackwardsProtocol; -import com.viaversion.viaversion.api.connection.StoredObject; -import com.viaversion.viaversion.api.connection.UserConnection; -import com.viaversion.viaversion.api.minecraft.entities.EntityType; -import org.checkerframework.checker.nullness.qual.Nullable; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class EntityTracker extends StoredObject { - private final Map trackers = new HashMap<>(); - private int currentWorldSectionHeight = 16; - private int currentMinY; - - public EntityTracker(UserConnection user) { - super(user); - } - - public void initProtocol(BackwardsProtocol protocol) { - trackers.put(protocol, new ProtocolEntityTracker()); - } - - public @Nullable ProtocolEntityTracker get(BackwardsProtocol protocol) { - return trackers.get(protocol); - } - - public Map getTrackers() { - return trackers; - } - - /** - * @return amount of chunk sections of the current world (block height / 16) - */ - public int getCurrentWorldSectionHeight() { - return currentWorldSectionHeight; - } - - public void setCurrentWorldSectionHeight(int currentWorldSectionHeight) { - this.currentWorldSectionHeight = currentWorldSectionHeight; - } - - /** - * @return absolute minimum y coordinate of the current world - */ - public int getCurrentMinY() { - return currentMinY; - } - - public void setCurrentMinY(int currentMinY) { - this.currentMinY = currentMinY; - } - - public static class ProtocolEntityTracker { - private final Map entityMap = new ConcurrentHashMap<>(); - - public void trackEntityType(int id, EntityType type) { - entityMap.putIfAbsent(id, new StoredEntity(id, type)); - } - - public void removeEntity(int id) { - entityMap.remove(id); - } - - @Nullable - public EntityType getEntityType(int id) { - StoredEntity storedEntity = entityMap.get(id); - return storedEntity != null ? storedEntity.getType() : null; - } - - @Nullable - public StoredEntity getEntity(int id) { - return entityMap.get(id); - } - } - - public static final class StoredEntity { - private final int entityId; - private final EntityType type; - private Map, EntityStorage> storedObjects; - - private StoredEntity(final int entityId, final EntityType type) { - this.entityId = entityId; - this.type = type; - } - - /** - * Get an object from the storage - * - * @param objectClass The class of the object to get - * @param The type of the class you want to get. - * @return The requested object - */ - @Nullable - public T get(Class objectClass) { - return storedObjects != null ? (T) storedObjects.get(objectClass) : null; - } - - /** - * Check if the storage has an object - * - * @param objectClass The object class to check - * @return True if the object is in the storage - */ - public boolean has(Class objectClass) { - return storedObjects != null && storedObjects.containsKey(objectClass); - } - - /** - * Put an object into the stored objects based on class - * - * @param object The object to store. - */ - public void put(EntityStorage object) { - if (storedObjects == null) { - storedObjects = new ConcurrentHashMap<>(); - } - storedObjects.put(object.getClass(), object); - } - - public int getEntityId() { - return entityId; - } - - public EntityType getType() { - return type; - } - - @Override - public String toString() { - return "StoredEntity{" + - "entityId=" + entityId + - ", type=" + type + - ", storedObjects=" + storedObjects + - '}'; - } - } -} diff --git a/common/src/main/java/com/viaversion/viabackwards/api/entities/storage/MetaStorage.java b/common/src/main/java/com/viaversion/viabackwards/api/entities/storage/WrappedMetadata.java similarity index 62% rename from common/src/main/java/com/viaversion/viabackwards/api/entities/storage/MetaStorage.java rename to common/src/main/java/com/viaversion/viabackwards/api/entities/storage/WrappedMetadata.java index 02da79d4..6583f733 100644 --- a/common/src/main/java/com/viaversion/viabackwards/api/entities/storage/MetaStorage.java +++ b/common/src/main/java/com/viaversion/viabackwards/api/entities/storage/WrappedMetadata.java @@ -23,48 +23,44 @@ import org.checkerframework.checker.nullness.qual.Nullable; import java.util.List; -public class MetaStorage { - private List metaDataList; +public final class WrappedMetadata { + private final List metadataList; - public MetaStorage(List metaDataList) { - this.metaDataList = metaDataList; + public WrappedMetadata(List metadataList) { + this.metadataList = metadataList; } public boolean has(Metadata data) { - return this.metaDataList.contains(data); + return this.metadataList.contains(data); } - public void delete(Metadata data) { - this.metaDataList.remove(data); + public void remove(Metadata data) { + this.metadataList.remove(data); } - public void delete(int index) { - metaDataList.removeIf(meta -> meta.getId() == index); + public void remove(int index) { + metadataList.removeIf(meta -> meta.id() == index); } public void add(Metadata data) { - this.metaDataList.add(data); + this.metadataList.add(data); } public @Nullable Metadata get(int index) { - for (Metadata meta : this.metaDataList) { - if (index == meta.getId()) { + for (Metadata meta : this.metadataList) { + if (index == meta.id()) { return meta; } } return null; } - public List getMetaDataList() { - return metaDataList; - } - - public void setMetaDataList(List metaDataList) { - this.metaDataList = metaDataList; + public List metadataList() { + return metadataList; } @Override public String toString() { - return "MetaStorage{" + "metaDataList=" + metaDataList + '}'; + return "MetaStorage{" + "metaDataList=" + metadataList + '}'; } } diff --git a/common/src/main/java/com/viaversion/viabackwards/api/rewriters/EntityRewriter.java b/common/src/main/java/com/viaversion/viabackwards/api/rewriters/EntityRewriter.java index 75be1538..29238ffd 100644 --- a/common/src/main/java/com/viaversion/viabackwards/api/rewriters/EntityRewriter.java +++ b/common/src/main/java/com/viaversion/viabackwards/api/rewriters/EntityRewriter.java @@ -18,11 +18,8 @@ package com.viaversion.viabackwards.api.rewriters; import com.viaversion.viabackwards.api.BackwardsProtocol; -import com.viaversion.viabackwards.api.entities.storage.EntityData; -import com.viaversion.viabackwards.api.entities.storage.MetaStorage; import com.viaversion.viaversion.api.minecraft.entities.EntityType; import com.viaversion.viaversion.api.minecraft.metadata.MetaType; -import com.viaversion.viaversion.api.minecraft.metadata.Metadata; import com.viaversion.viaversion.api.minecraft.metadata.types.MetaType1_14; import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType; import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; @@ -30,8 +27,6 @@ import com.viaversion.viaversion.api.protocol.remapper.PacketHandler; import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper; import com.viaversion.viaversion.api.type.Type; -import java.util.List; - public abstract class EntityRewriter extends EntityRewriterBase { protected EntityRewriter(T protocol) { @@ -42,7 +37,8 @@ public abstract class EntityRewriter extends Entity super(protocol, displayType, 2, displayVisibilityType, 3); } - public void registerSpawnTrackerWithData(ClientboundPacketType packetType, EntityType fallingBlockType) { + @Override + public void registerTrackerWithData(ClientboundPacketType packetType, EntityType fallingBlockType) { protocol.registerClientbound(packetType, new PacketRemapper() { @Override public void registerMap() { @@ -55,13 +51,14 @@ public abstract class EntityRewriter extends Entity map(Type.BYTE); // 6 - Pitch map(Type.BYTE); // 7 - Yaw map(Type.INT); // 8 - Data - handler(getSpawnTracketWithDataHandler(fallingBlockType)); + handler(getSpawnTrackerWithDataHandler(fallingBlockType)); } }); } - public PacketHandler getSpawnTracketWithDataHandler(EntityType fallingBlockType) { + public PacketHandler getSpawnTrackerWithDataHandler(EntityType fallingBlockType) { return wrapper -> { + // Check against the UNMAPPED entity type EntityType entityType = setOldEntityId(wrapper); if (entityType == fallingBlockType) { int blockState = wrapper.get(Type.INT, 0); @@ -84,52 +81,14 @@ public abstract class EntityRewriter extends Entity private EntityType setOldEntityId(PacketWrapper wrapper) throws Exception { int typeId = wrapper.get(Type.VAR_INT, 1); - EntityType entityType = getTypeFromId(typeId); - addTrackedEntity(wrapper, wrapper.get(Type.VAR_INT, 0), entityType); + EntityType entityType = typeFromId(typeId); + tracker(wrapper.user()).addEntity(wrapper.get(Type.VAR_INT, 0), entityType); - int oldTypeId = getOldEntityId(entityType.getId()); - if (typeId != oldTypeId) { - wrapper.set(Type.VAR_INT, 1, oldTypeId); + int mappedTypeId = newEntityId(entityType.getId()); + if (typeId != mappedTypeId) { + wrapper.set(Type.VAR_INT, 1, mappedTypeId); } return entityType; } - - /** - * Helper method to handle a metadata list packet and its full initial meta rewrite. - */ - protected void registerMetadataRewriter(ClientboundPacketType packetType, Type> oldMetaType, Type> newMetaType) { - getProtocol().registerClientbound(packetType, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); // 0 - Entity ID - if (oldMetaType != null) { - map(oldMetaType, newMetaType); - } else { - map(newMetaType); - } - handler(wrapper -> { - int entityId = wrapper.get(Type.VAR_INT, 0); - EntityType type = getEntityType(wrapper.user(), entityId); - - MetaStorage storage = new MetaStorage(wrapper.get(newMetaType, 0)); - handleMeta(wrapper.user(), entityId, storage); - - EntityData entityData = getEntityData(type); - //TODO only do this once for a first meta packet? - if (entityData != null) { - if (entityData.hasBaseMeta()) { - entityData.getDefaultMeta().createMeta(storage); - } - } - - wrapper.set(newMetaType, 0, storage.getMetaDataList()); - }); - } - }); - } - - protected void registerMetadataRewriter(ClientboundPacketType packetType, Type> metaType) { - registerMetadataRewriter(packetType, null, metaType); - } } diff --git a/common/src/main/java/com/viaversion/viabackwards/api/rewriters/EntityRewriterBase.java b/common/src/main/java/com/viaversion/viabackwards/api/rewriters/EntityRewriterBase.java index 34aa7e68..6c89c4c8 100644 --- a/common/src/main/java/com/viaversion/viabackwards/api/rewriters/EntityRewriterBase.java +++ b/common/src/main/java/com/viaversion/viabackwards/api/rewriters/EntityRewriterBase.java @@ -20,97 +20,120 @@ package com.viaversion.viabackwards.api.rewriters; import com.google.common.base.Preconditions; import com.viaversion.viabackwards.ViaBackwards; import com.viaversion.viabackwards.api.BackwardsProtocol; -import com.viaversion.viabackwards.api.entities.meta.MetaHandlerEvent; -import com.viaversion.viabackwards.api.entities.meta.MetaHandlerSettings; import com.viaversion.viabackwards.api.entities.storage.EntityData; -import com.viaversion.viabackwards.api.entities.storage.EntityTracker; -import com.viaversion.viabackwards.api.entities.storage.MetaStorage; -import com.viaversion.viabackwards.api.exceptions.RemovedValueException; -import com.viaversion.viaversion.api.Via; +import com.viaversion.viabackwards.api.entities.storage.WrappedMetadata; import com.viaversion.viaversion.api.connection.UserConnection; -import com.viaversion.viaversion.api.data.ParticleMappings; +import com.viaversion.viaversion.api.data.entity.StoredEntityData; import com.viaversion.viaversion.api.minecraft.entities.EntityType; import com.viaversion.viaversion.api.minecraft.metadata.MetaType; import com.viaversion.viaversion.api.minecraft.metadata.Metadata; -import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType; -import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; import com.viaversion.viaversion.api.protocol.remapper.PacketHandler; -import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper; import com.viaversion.viaversion.api.type.Type; -import com.viaversion.viaversion.api.type.types.Particle; -import com.viaversion.viaversion.exception.CancelException; -import com.viaversion.viaversion.libs.fastutil.ints.Int2IntMap; import com.viaversion.viaversion.libs.fastutil.ints.Int2IntOpenHashMap; -import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag; -import com.viaversion.viaversion.libs.opennbt.tag.builtin.IntTag; -import com.viaversion.viaversion.libs.opennbt.tag.builtin.Tag; +import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectMap; +import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectOpenHashMap; +import com.viaversion.viaversion.libs.gson.JsonElement; import com.viaversion.viaversion.protocols.protocol1_9_3to1_9_1_2.storage.ClientWorld; +import com.viaversion.viaversion.rewriter.EntityRewriter; +import com.viaversion.viaversion.rewriter.meta.MetaHandlerEvent; import org.checkerframework.checker.nullness.qual.Nullable; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.logging.Logger; -import java.util.stream.Collectors; /** * Entity rewriter base class. * - * @see EntityRewriter + * @see com.viaversion.viabackwards.api.rewriters.EntityRewriter * @see LegacyEntityRewriter */ -public abstract class EntityRewriterBase extends Rewriter { - private final Map entityTypes = new HashMap<>(); - private final List metaHandlers = new ArrayList<>(); +public abstract class EntityRewriterBase extends EntityRewriter { + private final Int2ObjectMap entityDataMappings = new Int2ObjectOpenHashMap<>(); private final MetaType displayNameMetaType; private final MetaType displayVisibilityMetaType; private final int displayNameIndex; private final int displayVisibilityIndex; - protected Int2IntMap typeMapping; EntityRewriterBase(T protocol, MetaType displayNameMetaType, int displayNameIndex, MetaType displayVisibilityMetaType, int displayVisibilityIndex) { - super(protocol); + super(protocol, false); this.displayNameMetaType = displayNameMetaType; this.displayNameIndex = displayNameIndex; this.displayVisibilityMetaType = displayVisibilityMetaType; this.displayVisibilityIndex = displayVisibilityIndex; } - protected EntityType getEntityType(UserConnection connection, int id) { - return getEntityTracker(connection).getEntityType(id); + @Override + public void handleMetadata(int entityId, List metadataList, UserConnection connection) { + super.handleMetadata(entityId, metadataList, connection); + + EntityType type = tracker(connection).entityType(entityId); + if (type == null) return; + + EntityData entityData = entityDataForType(type); + + // Set the mapped entity name if there is no custom name set already + Metadata meta = getMeta(displayNameIndex, metadataList); + if (meta != null && entityData != null && entityData.mobName() != null + && (meta.getValue() == null || meta.getValue().toString().isEmpty()) + && meta.metaType().typeId() == displayNameMetaType.typeId()) { + meta.setValue(entityData.mobName()); + if (ViaBackwards.getConfig().alwaysShowOriginalMobName()) { + removeMeta(displayVisibilityIndex, metadataList); + metadataList.add(new Metadata(displayVisibilityIndex, displayVisibilityMetaType, true)); + } + } + + // Add any other extra meta for mapped entities + if (entityData != null) { + //TODO only do this once for a first meta packet? + if (entityData != null && entityData.hasBaseMeta()) { + entityData.defaultMeta().createMeta(new WrappedMetadata(metadataList)); + } + } } - protected void addTrackedEntity(PacketWrapper wrapper, int entityId, EntityType type) throws Exception { - getEntityTracker(wrapper.user()).trackEntityType(entityId, type); + protected @Nullable Metadata getMeta(int metaIndex, List metadataList) { + for (Metadata metadata : metadataList) { + if (metadata.id() == metaIndex) { + return metadata; + } + } + return null; + } + + protected void removeMeta(int metaIndex, List metadataList) { + metadataList.removeIf(meta -> meta.id() == metaIndex); } protected boolean hasData(EntityType type) { - return entityTypes.containsKey(type); + return entityDataMappings.containsKey(type.getId()); } - protected @Nullable EntityData getEntityData(EntityType type) { - return entityTypes.get(type); + protected @Nullable EntityData entityDataForType(EntityType type) { + return entityDataMappings.get(type.getId()); + } + + protected @Nullable StoredEntityData storedEntityData(MetaHandlerEvent event) { + return tracker(event.user()).entityData(event.entityId()); } /** - * Note that both types should be of the SAME version. + * Maps an entity type to another with extra data. + * Note that both types should be of the same version. * - * @param oldType old type of the higher version - * @param replacement new type of the higher version + * @param type entity type + * @param mappedType mapped entity type * @return created entity data - * @see #mapEntityDirect(EntityType, EntityType) for id only rewriting + * @see #mapEntityType(EntityType, EntityType) for id only rewriting */ - protected EntityData mapEntity(EntityType oldType, EntityType replacement) { - Preconditions.checkArgument(oldType.getClass() == replacement.getClass()); + protected EntityData mapEntityTypeWithData(EntityType type, EntityType mappedType) { + Preconditions.checkArgument(type.getClass() == mappedType.getClass()); // Already rewrite the id here - int mappedReplacementId = getOldEntityId(replacement.getId()); - EntityData data = new EntityData(oldType.getId(), mappedReplacementId); - mapEntityDirect(oldType.getId(), mappedReplacementId); - entityTypes.put(oldType, data); + int mappedReplacementId = newEntityId(mappedType.getId()); + EntityData data = new EntityData(type.getId(), mappedReplacementId); + mapEntityType(type.getId(), mappedReplacementId); + entityDataMappings.put(type.getId(), data); return data; } @@ -119,167 +142,40 @@ public abstract class EntityRewriterBase extends Re * * @param oldTypes entity types of the higher version * @param newTypeClass entity types enum class of the lower version - * @param new type class + * @param new enum type */ - public & EntityType> void mapTypes(EntityType[] oldTypes, Class newTypeClass) { - if (typeMapping == null) { - typeMapping = new Int2IntOpenHashMap(oldTypes.length, 1F); - typeMapping.defaultReturnValue(-1); + @Override + public & EntityType> void mapTypes(EntityType[] oldTypes, Class newTypeClass) { + if (typeMappings == null) { + typeMappings = new Int2IntOpenHashMap(oldTypes.length, 1F); + typeMappings.defaultReturnValue(-1); } for (EntityType oldType : oldTypes) { try { - T newType = Enum.valueOf(newTypeClass, oldType.name()); - typeMapping.put(oldType.getId(), newType.getId()); + E newType = Enum.valueOf(newTypeClass, oldType.name()); + typeMappings.put(oldType.getId(), newType.getId()); } catch (IllegalArgumentException ignored) { + // Don't warn } } } - /** - * Directly maps the entity without any other rewriting. - * - * @param oldType type of the higher version - * @param newType type of the lower version - * @see #mapEntity(EntityType, EntityType) for mapping with data - */ - public void mapEntityDirect(EntityType oldType, EntityType newType) { - Preconditions.checkArgument(oldType.getClass() != newType.getClass()); - mapEntityDirect(oldType.getId(), newType.getId()); - } - - private void mapEntityDirect(int oldType, int newType) { - if (typeMapping == null) { - typeMapping = new Int2IntOpenHashMap(); - typeMapping.defaultReturnValue(-1); - } - typeMapping.put(oldType, newType); - } - - public MetaHandlerSettings registerMetaHandler() { - MetaHandlerSettings settings = new MetaHandlerSettings(); - metaHandlers.add(settings); - return settings; - } - - protected MetaStorage handleMeta(UserConnection user, int entityId, MetaStorage storage) throws Exception { - EntityTracker.StoredEntity storedEntity = getEntityTracker(user).getEntity(entityId); - if (storedEntity == null) { - if (!Via.getConfig().isSuppressMetadataErrors()) { - ViaBackwards.getPlatform().getLogger().warning("Metadata for entity id: " + entityId + " not sent because the entity doesn't exist. " + storage); - } - throw CancelException.CACHED; - } - - EntityType type = storedEntity.getType(); - for (MetaHandlerSettings settings : metaHandlers) { - List newData = new ArrayList<>(); - for (Metadata meta : storage.getMetaDataList()) { - MetaHandlerEvent event = null; - try { - Metadata modifiedMeta = meta; - if (settings.isGucci(type, meta)) { - event = new MetaHandlerEvent(user, storedEntity, meta.getId(), meta, storage); - modifiedMeta = settings.getHandler().handle(event); - - if (event.getExtraData() != null) { - newData.addAll(event.getExtraData()); - event.clearExtraData(); - } - } - - if (modifiedMeta == null) { - throw RemovedValueException.EX; - } - - newData.add(modifiedMeta); - } catch (RemovedValueException e) { - // Add the additionally created data here in case of an interruption - if (event != null && event.getExtraData() != null) { - newData.addAll(event.getExtraData()); - } - } catch (Exception e) { - Logger log = ViaBackwards.getPlatform().getLogger(); - log.warning("Unable to handle metadata " + meta + " for entity type " + type); - log.warning(storage.getMetaDataList().stream().sorted(Comparator.comparingInt(Metadata::getId)) - .map(Metadata::toString).collect(Collectors.joining("\n", "Full metadata list: ", ""))); - e.printStackTrace(); + public void registerMetaTypeHandler(@Nullable MetaType itemType, @Nullable MetaType blockType, @Nullable MetaType particleType, @Nullable MetaType optChatType) { + filter().handler((event, meta) -> { + MetaType type = meta.metaType(); + if (itemType != null && type == itemType) { + protocol.getBlockItemPackets().handleItemToClient(meta.value()); + } else if (blockType != null && type == blockType) { + int data = meta.value(); + meta.setValue(protocol.getMappingData().getNewBlockStateId(data)); + } else if (particleType != null && type == particleType) { + rewriteParticle(meta.value()); + } else if (optChatType != null && type == optChatType) { + JsonElement text = meta.value(); + if (text != null) { + protocol.getTranslatableRewriter().processText(text); } } - - storage.setMetaDataList(newData); - } - - // Handle Entity Name - Metadata data = storage.get(displayNameIndex); - if (data != null) { - EntityData entityData = getEntityData(type); - // Set the name if there is no custom name set already - if (entityData != null && entityData.getMobName() != null - && (data.getValue() == null || data.getValue().toString().isEmpty()) - && data.getMetaType().getTypeID() == displayNameMetaType.getTypeID()) { - data.setValue(entityData.getMobName()); - if (ViaBackwards.getConfig().alwaysShowOriginalMobName()) { - storage.delete(displayVisibilityIndex); - storage.add(new Metadata(displayVisibilityIndex, displayVisibilityMetaType, true)); - } - } - } - - return storage; - } - - /** - * Helper method to handle player, painting, or xp orb trackers without meta changes. - */ - protected void registerExtraTracker(ClientboundPacketType packetType, EntityType entityType, Type intType) { - getProtocol().registerClientbound(packetType, new PacketRemapper() { - @Override - public void registerMap() { - map(intType); // 0 - Entity id - handler(wrapper -> addTrackedEntity(wrapper, (int) wrapper.get(intType, 0), entityType)); - } - }); - } - - protected void registerExtraTracker(ClientboundPacketType packetType, EntityType entityType) { - registerExtraTracker(packetType, entityType, Type.VAR_INT); - } - - /** - * Sub 1.17 method for entity remove packets. - * - * @param packetType remove entities packet type - */ - protected void registerEntityDestroy(ClientboundPacketType packetType) { - getProtocol().registerClientbound(packetType, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT_ARRAY_PRIMITIVE); // 0 - Entity ids - handler(wrapper -> { - EntityTracker.ProtocolEntityTracker tracker = getEntityTracker(wrapper.user()); - for (int entity : wrapper.get(Type.VAR_INT_ARRAY_PRIMITIVE, 0)) { - tracker.removeEntity(entity); - } - }); - } - }); - } - - /** - * 1.17+ method for entity remove packets. - * - * @param packetType remove entities packet type - */ - protected void registerRemoveEntity(ClientboundPacketType packetType) { - protocol.registerClientbound(packetType, new PacketRemapper() { - @Override - public void registerMap() { - map(Type.VAR_INT); // 0 - Entity ids - handler(wrapper -> { - int entity = wrapper.get(Type.VAR_INT, 0); - getEntityTracker(wrapper.user()).removeEntity(entity); - }); - } }); } @@ -287,7 +183,7 @@ public abstract class EntityRewriterBase extends Re protected PacketHandler getTrackerHandler(Type intType, int typeIndex) { return wrapper -> { Number id = (Number) wrapper.get(intType, typeIndex); - addTrackedEntity(wrapper, wrapper.get(Type.VAR_INT, 0), getTypeFromId(id.intValue())); + tracker(wrapper.user()).addEntity(wrapper.get(Type.VAR_INT, 0), typeFromId(id.intValue())); }; } @@ -296,29 +192,7 @@ public abstract class EntityRewriterBase extends Re } protected PacketHandler getTrackerHandler(EntityType entityType, Type intType) { - return wrapper -> addTrackedEntity(wrapper, (int) wrapper.get(intType, 0), entityType); - } - - protected PacketHandler getWorldDataTracker(int nbtIndex) { - return wrapper -> { - EntityTracker tracker = wrapper.user().get(EntityTracker.class); - - CompoundTag registryData = wrapper.get(Type.NBT, nbtIndex); - Tag height = registryData.get("height"); - if (height instanceof IntTag) { - int blockHeight = ((IntTag) height).asInt(); - tracker.setCurrentWorldSectionHeight(blockHeight >> 4); - } else { - ViaBackwards.getPlatform().getLogger().warning("Height missing in dimension data: " + registryData); - } - - Tag minY = registryData.get("min_y"); - if (minY instanceof IntTag) { - tracker.setCurrentMinY(((IntTag) minY).asInt()); - } else { - ViaBackwards.getPlatform().getLogger().warning("Min Y missing in dimension data: " + registryData); - } - }; + return wrapper -> tracker(wrapper.user()).addEntity((int) wrapper.get(intType, 0), entityType); } protected PacketHandler getDimensionHandler(int index) { @@ -328,28 +202,4 @@ public abstract class EntityRewriterBase extends Re clientWorld.setEnvironment(dimensionId); }; } - - public EntityTracker.ProtocolEntityTracker getEntityTracker(UserConnection user) { - return user.get(EntityTracker.class).get(getProtocol()); - } - - protected void rewriteParticle(Particle particle) { - ParticleMappings mappings = protocol.getMappingData().getParticleMappings(); - int id = particle.getId(); - if (id == mappings.getBlockId() || id == mappings.getFallingDustId()) { - Particle.ParticleData data = particle.getArguments().get(0); - data.setValue(protocol.getMappingData().getNewBlockStateId(data.get())); - } else if (id == mappings.getItemId()) { - Particle.ParticleData data = particle.getArguments().get(0); - data.setValue(protocol.getMappingData().getNewItemId(data.get())); - } - - particle.setId(protocol.getMappingData().getNewParticleId(id)); - } - - protected abstract EntityType getTypeFromId(int typeId); - - public int getOldEntityId(int newId) { - return typeMapping != null ? typeMapping.getOrDefault(newId, newId) : newId; - } } diff --git a/common/src/main/java/com/viaversion/viabackwards/api/rewriters/ItemRewriterBase.java b/common/src/main/java/com/viaversion/viabackwards/api/rewriters/ItemRewriterBase.java index 0ebe73eb..4d7bacb3 100644 --- a/common/src/main/java/com/viaversion/viabackwards/api/rewriters/ItemRewriterBase.java +++ b/common/src/main/java/com/viaversion/viabackwards/api/rewriters/ItemRewriterBase.java @@ -23,9 +23,10 @@ import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag; import com.viaversion.viaversion.libs.opennbt.tag.builtin.ListTag; import com.viaversion.viaversion.libs.opennbt.tag.builtin.StringTag; import com.viaversion.viaversion.libs.opennbt.tag.builtin.Tag; +import com.viaversion.viaversion.rewriter.RewriterBase; import org.checkerframework.checker.nullness.qual.Nullable; -public abstract class ItemRewriterBase extends Rewriter { +public abstract class ItemRewriterBase extends RewriterBase { protected final String nbtTagName; protected final boolean jsonNameFormat; diff --git a/common/src/main/java/com/viaversion/viabackwards/api/rewriters/LegacyEntityRewriter.java b/common/src/main/java/com/viaversion/viabackwards/api/rewriters/LegacyEntityRewriter.java index 059e8517..2a6993e4 100644 --- a/common/src/main/java/com/viaversion/viabackwards/api/rewriters/LegacyEntityRewriter.java +++ b/common/src/main/java/com/viaversion/viabackwards/api/rewriters/LegacyEntityRewriter.java @@ -21,13 +21,14 @@ import com.viaversion.viabackwards.ViaBackwards; import com.viaversion.viabackwards.api.BackwardsProtocol; import com.viaversion.viabackwards.api.entities.storage.EntityData; import com.viaversion.viabackwards.api.entities.storage.EntityObjectData; -import com.viaversion.viabackwards.api.entities.storage.MetaStorage; +import com.viaversion.viabackwards.api.entities.storage.WrappedMetadata; import com.viaversion.viaversion.api.minecraft.entities.EntityType; import com.viaversion.viaversion.api.minecraft.entities.ObjectType; import com.viaversion.viaversion.api.minecraft.metadata.MetaType; import com.viaversion.viaversion.api.minecraft.metadata.Metadata; import com.viaversion.viaversion.api.minecraft.metadata.types.MetaType1_9; import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType; +import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; import com.viaversion.viaversion.api.protocol.remapper.PacketHandler; import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper; import com.viaversion.viaversion.api.type.Type; @@ -83,14 +84,15 @@ public abstract class LegacyEntityRewriter extends handler(wrapper -> { ClientWorld clientChunks = wrapper.user().get(ClientWorld.class); clientChunks.setEnvironment(wrapper.get(Type.INT, 1)); - getEntityTracker(wrapper.user()).trackEntityType(wrapper.get(Type.INT, 0), playerType); + addTrackedEntity(wrapper, wrapper.get(Type.INT, 0), playerType); }); } }); } - protected void registerMetadataRewriter(ClientboundPacketType packetType, Type> oldMetaType, Type> newMetaType) { - getProtocol().registerClientbound(packetType, new PacketRemapper() { + @Override + public void registerMetadataRewriter(ClientboundPacketType packetType, Type> oldMetaType, Type> newMetaType) { + protocol.registerClientbound(packetType, new PacketRemapper() { @Override public void registerMap() { map(Type.VAR_INT); // 0 - Entity ID @@ -101,35 +103,32 @@ public abstract class LegacyEntityRewriter extends } handler(wrapper -> { List metadata = wrapper.get(newMetaType, 0); - wrapper.set(newMetaType, 0, - handleMeta(wrapper.user(), wrapper.get(Type.VAR_INT, 0), new MetaStorage(metadata)).getMetaDataList()); + handleMetadata(wrapper.get(Type.VAR_INT, 0), metadata, wrapper.user()); }); } }); } - protected void registerMetadataRewriter(ClientboundPacketType packetType, Type> metaType) { + @Override + public void registerMetadataRewriter(ClientboundPacketType packetType, Type> metaType) { registerMetadataRewriter(packetType, null, metaType); } protected PacketHandler getMobSpawnRewriter(Type> metaType) { return wrapper -> { int entityId = wrapper.get(Type.VAR_INT, 0); - EntityType type = getEntityType(wrapper.user(), entityId); + EntityType type = tracker(wrapper.user()).entityType(entityId); - MetaStorage storage = new MetaStorage(wrapper.get(metaType, 0)); - handleMeta(wrapper.user(), entityId, storage); + List metadata = wrapper.get(metaType, 0); + handleMetadata(entityId, metadata, wrapper.user()); - EntityData entityData = getEntityData(type); + EntityData entityData = entityDataForType(type); if (entityData != null) { - wrapper.set(Type.VAR_INT, 1, entityData.getReplacementId()); + wrapper.set(Type.VAR_INT, 1, entityData.replacementId()); if (entityData.hasBaseMeta()) { - entityData.getDefaultMeta().createMeta(storage); + entityData.defaultMeta().createMeta(new WrappedMetadata(metadata)); } } - - // Rewrite Metadata - wrapper.set(metaType, 0, storage.getMetaDataList()); }; } @@ -140,10 +139,8 @@ public abstract class LegacyEntityRewriter extends protected PacketHandler getTrackerAndMetaHandler(Type> metaType, EntityType entityType) { return wrapper -> { addTrackedEntity(wrapper, wrapper.get(Type.VAR_INT, 0), entityType); - - List metaDataList = handleMeta(wrapper.user(), wrapper.get(Type.VAR_INT, 0), - new MetaStorage(wrapper.get(metaType, 0))).getMetaDataList(); - wrapper.set(metaType, 0, metaDataList); + List metadata = wrapper.get(metaType, 0); + handleMetadata(wrapper.get(Type.VAR_INT, 0), metadata, wrapper.user()); }; } @@ -157,15 +154,20 @@ public abstract class LegacyEntityRewriter extends EntityData data = getObjectData(type); if (data != null) { - wrapper.set(Type.BYTE, 0, (byte) data.getReplacementId()); - if (data.getObjectData() != -1) { - wrapper.set(Type.INT, 0, data.getObjectData()); + wrapper.set(Type.BYTE, 0, (byte) data.replacementId()); + if (data.objectData() != -1) { + wrapper.set(Type.INT, 0, data.objectData()); } } }; } protected EntityType getObjectTypeFromId(int typeId) { - return getTypeFromId(typeId); + return typeFromId(typeId); + } + + @Deprecated + protected void addTrackedEntity(PacketWrapper wrapper, int entityId, EntityType type) throws Exception { + tracker(wrapper.user()).addEntity(entityId, type); } } diff --git a/common/src/main/java/com/viaversion/viabackwards/api/rewriters/LegacySoundRewriter.java b/common/src/main/java/com/viaversion/viabackwards/api/rewriters/LegacySoundRewriter.java index 3358b3a1..067cdd24 100644 --- a/common/src/main/java/com/viaversion/viabackwards/api/rewriters/LegacySoundRewriter.java +++ b/common/src/main/java/com/viaversion/viabackwards/api/rewriters/LegacySoundRewriter.java @@ -21,9 +21,10 @@ package com.viaversion.viabackwards.api.rewriters; import com.viaversion.viabackwards.api.BackwardsProtocol; import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectMap; import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectOpenHashMap; +import com.viaversion.viaversion.rewriter.RewriterBase; @Deprecated -public abstract class LegacySoundRewriter extends Rewriter { +public abstract class LegacySoundRewriter extends RewriterBase { protected final Int2ObjectMap soundRewrites = new Int2ObjectOpenHashMap<>(64); protected LegacySoundRewriter(T protocol) { diff --git a/common/src/main/java/com/viaversion/viabackwards/api/rewriters/Rewriter.java b/common/src/main/java/com/viaversion/viabackwards/api/rewriters/Rewriter.java deleted file mode 100644 index 41bfbd58..00000000 --- a/common/src/main/java/com/viaversion/viabackwards/api/rewriters/Rewriter.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards - * Copyright (C) 2016-2021 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 . - */ - -package com.viaversion.viabackwards.api.rewriters; - -import com.viaversion.viabackwards.api.BackwardsProtocol; - -public abstract class Rewriter { - protected final T protocol; - - protected Rewriter(final T protocol) { - this.protocol = protocol; - } - - /** - * Register everything. - */ - public void register() { - registerPackets(); - registerRewrites(); - } - - /** - * Register packet listeners. - */ - protected abstract void registerPackets(); - - /** - * Register rewrites. - */ - protected void registerRewrites() { - } - - public T getProtocol() { - return protocol; - } -} diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_10to1_11/Protocol1_10To1_11.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_10to1_11/Protocol1_10To1_11.java index fa6570bf..90612f5f 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_10to1_11/Protocol1_10To1_11.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_10to1_11/Protocol1_10To1_11.java @@ -26,6 +26,8 @@ import com.viaversion.viabackwards.protocol.protocol1_10to1_11.packets.EntityPac import com.viaversion.viabackwards.protocol.protocol1_10to1_11.packets.PlayerPackets1_11; import com.viaversion.viabackwards.protocol.protocol1_10to1_11.storage.WindowTracker; import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.minecraft.entities.Entity1_11Types; +import com.viaversion.viaversion.data.entity.EntityTrackerBase; import com.viaversion.viaversion.protocols.protocol1_9_3to1_9_1_2.ClientboundPackets1_9_3; import com.viaversion.viaversion.protocols.protocol1_9_3to1_9_1_2.ServerboundPackets1_9_3; import com.viaversion.viaversion.protocols.protocol1_9_3to1_9_1_2.storage.ClientWorld; @@ -58,7 +60,7 @@ public class Protocol1_10To1_11 extends BackwardsProtocol { - Metadata data = e.getData(); - - if (data.getMetaType().getType().equals(Type.ITEM)) // Is Item - data.setValue(handleItemToClient((Item) data.getValue())); - - return data; + protocol.getEntityPackets().filter().handler((event, meta) -> { + if (meta.metaType().type().equals(Type.ITEM)) // Is Item + meta.setValue(handleItemToClient((Item) meta.getValue())); }); } @@ -404,9 +400,9 @@ public class BlockItemPackets1_11 extends LegacyBlockItemRewriter getChestedHorse(UserConnection user) { WindowTracker tracker = user.get(WindowTracker.class); if (tracker.getInventory() != null && tracker.getInventory().equals("EntityHorse")) { - EntityTracker.ProtocolEntityTracker entTracker = user.get(EntityTracker.class).get(getProtocol()); - EntityTracker.StoredEntity storedEntity = entTracker.getEntity(tracker.getEntityId()); - if (storedEntity != null) - return Optional.of(storedEntity.get(ChestedHorseStorage.class)); + EntityTracker entTracker = user.getEntityTracker(Protocol1_10To1_11.class); + StoredEntityData entityData = entTracker.entityData(tracker.getEntityId()); + if (entityData != null) + return Optional.of(entityData.get(ChestedHorseStorage.class)); } return Optional.empty(); } diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_10to1_11/packets/EntityPackets1_11.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_10to1_11/packets/EntityPackets1_11.java index 89407b58..3249deee 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_10to1_11/packets/EntityPackets1_11.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_10to1_11/packets/EntityPackets1_11.java @@ -19,13 +19,13 @@ package com.viaversion.viabackwards.protocol.protocol1_10to1_11.packets; import com.viaversion.viabackwards.api.entities.storage.EntityData; -import com.viaversion.viabackwards.api.entities.storage.MetaStorage; -import com.viaversion.viabackwards.api.exceptions.RemovedValueException; +import com.viaversion.viabackwards.api.entities.storage.WrappedMetadata; import com.viaversion.viabackwards.api.rewriters.LegacyEntityRewriter; import com.viaversion.viabackwards.protocol.protocol1_10to1_11.PotionSplashHandler; import com.viaversion.viabackwards.protocol.protocol1_10to1_11.Protocol1_10To1_11; import com.viaversion.viabackwards.protocol.protocol1_10to1_11.storage.ChestedHorseStorage; import com.viaversion.viabackwards.utils.Block; +import com.viaversion.viaversion.api.data.entity.StoredEntityData; import com.viaversion.viaversion.api.minecraft.entities.Entity1_11Types; import com.viaversion.viaversion.api.minecraft.entities.Entity1_12Types; import com.viaversion.viaversion.api.minecraft.entities.EntityType; @@ -38,6 +38,7 @@ import com.viaversion.viaversion.api.type.Type; import com.viaversion.viaversion.api.type.types.version.Types1_9; import com.viaversion.viaversion.protocols.protocol1_9_3to1_9_1_2.ClientboundPackets1_9_3; +import java.util.List; import java.util.Optional; public class EntityPackets1_11 extends LegacyEntityRewriter { @@ -98,7 +99,7 @@ public class EntityPackets1_11 extends LegacyEntityRewriter int objType = objectData & 4095; int data = objectData >> 12 & 15; - Block block = getProtocol().getBlockItemPackets().handleBlock(objType, data); + Block block = protocol.getBlockItemPackets().handleBlock(objType, data); if (block == null) return; @@ -109,8 +110,8 @@ public class EntityPackets1_11 extends LegacyEntityRewriter } }); - registerExtraTracker(ClientboundPackets1_9_3.SPAWN_EXPERIENCE_ORB, Entity1_11Types.EntityType.EXPERIENCE_ORB); - registerExtraTracker(ClientboundPackets1_9_3.SPAWN_GLOBAL_ENTITY, Entity1_11Types.EntityType.WEATHER); + registerTracker(ClientboundPackets1_9_3.SPAWN_EXPERIENCE_ORB, Entity1_11Types.EntityType.EXPERIENCE_ORB); + registerTracker(ClientboundPackets1_9_3.SPAWN_GLOBAL_ENTITY, Entity1_11Types.EntityType.WEATHER); protocol.registerClientbound(ClientboundPackets1_9_3.SPAWN_MOB, new PacketRemapper() { @Override @@ -137,35 +138,24 @@ public class EntityPackets1_11 extends LegacyEntityRewriter @Override public void handle(PacketWrapper wrapper) throws Exception { int entityId = wrapper.get(Type.VAR_INT, 0); - EntityType type = getEntityType(wrapper.user(), entityId); + EntityType type = tracker(wrapper.user()).entityType(entityId); - MetaStorage storage = new MetaStorage(wrapper.get(Types1_9.METADATA_LIST, 0)); - handleMeta( - wrapper.user(), - wrapper.get(Type.VAR_INT, 0), - storage - ); + List list = wrapper.get(Types1_9.METADATA_LIST, 0); + handleMetadata(wrapper.get(Type.VAR_INT, 0), list, wrapper.user()); - EntityData entityData = getEntityData(type); + EntityData entityData = entityDataForType(type); if (entityData != null) { - wrapper.set(Type.UNSIGNED_BYTE, 0, (short) entityData.getReplacementId()); + wrapper.set(Type.UNSIGNED_BYTE, 0, (short) entityData.replacementId()); if (entityData.hasBaseMeta()) { - entityData.getDefaultMeta().createMeta(storage); + entityData.defaultMeta().createMeta(new WrappedMetadata(list)); } } - - // Rewrite Metadata - wrapper.set( - Types1_9.METADATA_LIST, - 0, - storage.getMetaDataList() - ); } }); } }); - registerExtraTracker(ClientboundPackets1_9_3.SPAWN_PAINTING, Entity1_11Types.EntityType.PAINTING); + registerTracker(ClientboundPackets1_9_3.SPAWN_PAINTING, Entity1_11Types.EntityType.PAINTING); registerJoinGame(ClientboundPackets1_9_3.JOIN_GAME, Entity1_11Types.EntityType.PLAYER); registerRespawn(ClientboundPackets1_9_3.RESPAWN); @@ -185,7 +175,7 @@ public class EntityPackets1_11 extends LegacyEntityRewriter } }); - registerEntityDestroy(ClientboundPackets1_9_3.DESTROY_ENTITIES); + registerRemoveEntities(ClientboundPackets1_9_3.DESTROY_ENTITIES); registerMetadataRewriter(ClientboundPackets1_9_3.ENTITY_METADATA, Types1_9.METADATA_LIST); protocol.registerClientbound(ClientboundPackets1_9_3.ENTITY_STATUS, new PacketRemapper() { @@ -214,99 +204,86 @@ public class EntityPackets1_11 extends LegacyEntityRewriter @Override protected void registerRewrites() { // Guardian - mapEntity(Entity1_11Types.EntityType.ELDER_GUARDIAN, Entity1_11Types.EntityType.GUARDIAN); + mapEntityTypeWithData(Entity1_11Types.EntityType.ELDER_GUARDIAN, Entity1_11Types.EntityType.GUARDIAN); // Skeletons - mapEntity(Entity1_11Types.EntityType.WITHER_SKELETON, Entity1_11Types.EntityType.SKELETON).mobName("Wither Skeleton").spawnMetadata(storage -> storage.add(getSkeletonTypeMeta(1))); - mapEntity(Entity1_11Types.EntityType.STRAY, Entity1_11Types.EntityType.SKELETON).mobName("Stray").spawnMetadata(storage -> storage.add(getSkeletonTypeMeta(2))); + mapEntityTypeWithData(Entity1_11Types.EntityType.WITHER_SKELETON, Entity1_11Types.EntityType.SKELETON).mobName("Wither Skeleton").spawnMetadata(storage -> storage.add(getSkeletonTypeMeta(1))); + mapEntityTypeWithData(Entity1_11Types.EntityType.STRAY, Entity1_11Types.EntityType.SKELETON).mobName("Stray").spawnMetadata(storage -> storage.add(getSkeletonTypeMeta(2))); // Zombies - mapEntity(Entity1_11Types.EntityType.HUSK, Entity1_11Types.EntityType.ZOMBIE).mobName("Husk").spawnMetadata(storage -> handleZombieType(storage, 6)); - mapEntity(Entity1_11Types.EntityType.ZOMBIE_VILLAGER, Entity1_11Types.EntityType.ZOMBIE).spawnMetadata(storage -> handleZombieType(storage, 1)); + mapEntityTypeWithData(Entity1_11Types.EntityType.HUSK, Entity1_11Types.EntityType.ZOMBIE).mobName("Husk").spawnMetadata(storage -> handleZombieType(storage, 6)); + mapEntityTypeWithData(Entity1_11Types.EntityType.ZOMBIE_VILLAGER, Entity1_11Types.EntityType.ZOMBIE).spawnMetadata(storage -> handleZombieType(storage, 1)); // Horses - mapEntity(Entity1_11Types.EntityType.HORSE, Entity1_11Types.EntityType.HORSE).spawnMetadata(storage -> storage.add(getHorseMetaType(0))); // Nob able to ride the horse without having the MetaType sent. - mapEntity(Entity1_11Types.EntityType.DONKEY, Entity1_11Types.EntityType.HORSE).spawnMetadata(storage -> storage.add(getHorseMetaType(1))); - mapEntity(Entity1_11Types.EntityType.MULE, Entity1_11Types.EntityType.HORSE).spawnMetadata(storage -> storage.add(getHorseMetaType(2))); - mapEntity(Entity1_11Types.EntityType.SKELETON_HORSE, Entity1_11Types.EntityType.HORSE).spawnMetadata(storage -> storage.add(getHorseMetaType(4))); - mapEntity(Entity1_11Types.EntityType.ZOMBIE_HORSE, Entity1_11Types.EntityType.HORSE).spawnMetadata(storage -> storage.add(getHorseMetaType(3))); + mapEntityTypeWithData(Entity1_11Types.EntityType.HORSE, Entity1_11Types.EntityType.HORSE).spawnMetadata(storage -> storage.add(getHorseMetaType(0))); // Nob able to ride the horse without having the MetaType sent. + mapEntityTypeWithData(Entity1_11Types.EntityType.DONKEY, Entity1_11Types.EntityType.HORSE).spawnMetadata(storage -> storage.add(getHorseMetaType(1))); + mapEntityTypeWithData(Entity1_11Types.EntityType.MULE, Entity1_11Types.EntityType.HORSE).spawnMetadata(storage -> storage.add(getHorseMetaType(2))); + mapEntityTypeWithData(Entity1_11Types.EntityType.SKELETON_HORSE, Entity1_11Types.EntityType.HORSE).spawnMetadata(storage -> storage.add(getHorseMetaType(4))); + mapEntityTypeWithData(Entity1_11Types.EntityType.ZOMBIE_HORSE, Entity1_11Types.EntityType.HORSE).spawnMetadata(storage -> storage.add(getHorseMetaType(3))); // New mobs - mapEntity(Entity1_11Types.EntityType.EVOCATION_FANGS, Entity1_11Types.EntityType.SHULKER); - mapEntity(Entity1_11Types.EntityType.EVOCATION_ILLAGER, Entity1_11Types.EntityType.VILLAGER).mobName("Evoker"); - mapEntity(Entity1_11Types.EntityType.VEX, Entity1_11Types.EntityType.BAT).mobName("Vex"); - mapEntity(Entity1_11Types.EntityType.VINDICATION_ILLAGER, Entity1_11Types.EntityType.VILLAGER).mobName("Vindicator").spawnMetadata(storage -> storage.add(new Metadata(13, MetaType1_9.VarInt, 4))); // Base Profession - mapEntity(Entity1_11Types.EntityType.LIAMA, Entity1_11Types.EntityType.HORSE).mobName("Llama").spawnMetadata(storage -> storage.add(getHorseMetaType(1))); - mapEntity(Entity1_11Types.EntityType.LIAMA_SPIT, Entity1_11Types.EntityType.SNOWBALL); + mapEntityTypeWithData(Entity1_11Types.EntityType.EVOCATION_FANGS, Entity1_11Types.EntityType.SHULKER); + mapEntityTypeWithData(Entity1_11Types.EntityType.EVOCATION_ILLAGER, Entity1_11Types.EntityType.VILLAGER).mobName("Evoker"); + mapEntityTypeWithData(Entity1_11Types.EntityType.VEX, Entity1_11Types.EntityType.BAT).mobName("Vex"); + mapEntityTypeWithData(Entity1_11Types.EntityType.VINDICATION_ILLAGER, Entity1_11Types.EntityType.VILLAGER).mobName("Vindicator").spawnMetadata(storage -> storage.add(new Metadata(13, MetaType1_9.VarInt, 4))); // Base Profession + mapEntityTypeWithData(Entity1_11Types.EntityType.LIAMA, Entity1_11Types.EntityType.HORSE).mobName("Llama").spawnMetadata(storage -> storage.add(getHorseMetaType(1))); + mapEntityTypeWithData(Entity1_11Types.EntityType.LIAMA_SPIT, Entity1_11Types.EntityType.SNOWBALL); mapObjectType(Entity1_11Types.ObjectType.LIAMA_SPIT, Entity1_11Types.ObjectType.SNOWBALL, -1); // Replace with endertorchthingies mapObjectType(Entity1_11Types.ObjectType.EVOCATION_FANGS, Entity1_11Types.ObjectType.FALLING_BLOCK, 198 | 1 << 12); // Handle ElderGuardian & target metadata - registerMetaHandler().filter(Entity1_11Types.EntityType.GUARDIAN, true, 12).handle(e -> { - Metadata data = e.getData(); - - boolean b = (boolean) data.getValue(); + filter().filterFamily(Entity1_11Types.EntityType.GUARDIAN).index(12).handler((event, meta) -> { + boolean b = (boolean) meta.getValue(); int bitmask = b ? 0x02 : 0; - if (e.getEntity().getType().is(Entity1_11Types.EntityType.ELDER_GUARDIAN)) + if (event.entityType() == Entity1_11Types.EntityType.ELDER_GUARDIAN) { bitmask |= 0x04; + } - data.setMetaType(MetaType1_9.Byte); - data.setValue((byte) bitmask); - - return data; + meta.setMetaType(MetaType1_9.Byte); + meta.setValue((byte) bitmask); }); // Handle skeleton swing - registerMetaHandler().filter(Entity1_11Types.EntityType.ABSTRACT_SKELETON, true, 12).handleIndexChange(13); + filter().filterFamily(Entity1_11Types.EntityType.ABSTRACT_SKELETON).index(12).toIndex(13); /* ZOMBIE CHANGES */ - registerMetaHandler().filter(Entity1_11Types.EntityType.ZOMBIE, true).handle(e -> { - Metadata data = e.getData(); - - switch (data.getId()) { + filter().filterFamily(Entity1_11Types.EntityType.ZOMBIE).handler((event, meta) -> { + switch (meta.id()) { case 13: - throw RemovedValueException.EX; + event.cancel(); + return; case 14: - data.setId(15); + event.setIndex(15); break; case 15: - data.setId(14); + event.setIndex(14); break; // Profession case 16: - data.setId(13); - data.setValue(1 + (int) data.getValue()); + event.setIndex(13); + meta.setValue(1 + (int) meta.getValue()); break; } - - return data; }); // Handle Evocation Illager - registerMetaHandler().filter(Entity1_11Types.EntityType.EVOCATION_ILLAGER, 12).handle(e -> { - Metadata data = e.getData(); - data.setId(13); - data.setMetaType(MetaType1_9.VarInt); - data.setValue(((Byte) data.getValue()).intValue()); // Change the profession for the states - - return data; + filter().type(Entity1_11Types.EntityType.EVOCATION_ILLAGER).index(12).handler((event, meta) -> { + event.setIndex(13); + meta.setMetaType(MetaType1_9.VarInt); + meta.setValue(((Byte) meta.getValue()).intValue()); // Change the profession for the states }); // Handle Vex (Remove this field completely since the position is not updated correctly when idling for bats. Sad ): - registerMetaHandler().filter(Entity1_11Types.EntityType.VEX, 12).handle(e -> { - Metadata data = e.getData(); - data.setValue((byte) 0x00); - return data; + filter().type(Entity1_11Types.EntityType.VEX).index(12).handler((event, meta) -> { + meta.setValue((byte) 0x00); }); // Handle VindicationIllager - registerMetaHandler().filter(Entity1_11Types.EntityType.VINDICATION_ILLAGER, 12).handle(e -> { - Metadata data = e.getData(); - data.setId(13); - data.setMetaType(MetaType1_9.VarInt); - data.setValue(((Number) data.getValue()).intValue() == 1 ? 2 : 4); - return data; + filter().type(Entity1_11Types.EntityType.VINDICATION_ILLAGER).index(12).handler((event, meta) -> { + event.setIndex(13); + meta.setMetaType(MetaType1_9.VarInt); + meta.setValue(((Number) meta.getValue()).intValue() == 1 ? 2 : 4); }); /* @@ -314,72 +291,70 @@ public class EntityPackets1_11 extends LegacyEntityRewriter */ // Handle horse flags - registerMetaHandler().filter(Entity1_11Types.EntityType.ABSTRACT_HORSE, true, 13).handle(e -> { - Metadata data = e.getData(); - byte b = (byte) data.getValue(); - if (e.getEntity().has(ChestedHorseStorage.class) && - e.getEntity().get(ChestedHorseStorage.class).isChested()) { + filter().filterFamily(Entity1_11Types.EntityType.ABSTRACT_HORSE).index(13).handler((event, meta) -> { + StoredEntityData data = storedEntityData(event); + byte b = (byte) meta.getValue(); + if (data.has(ChestedHorseStorage.class) && data.get(ChestedHorseStorage.class).isChested()) { b |= 0x08; // Chested - data.setValue(b); + meta.setValue(b); } - return data; }); // Create chested horse storage - registerMetaHandler().filter(Entity1_11Types.EntityType.CHESTED_HORSE, true).handle(e -> { - if (!e.getEntity().has(ChestedHorseStorage.class)) - e.getEntity().put(new ChestedHorseStorage()); - return e.getData(); + filter().filterFamily(Entity1_11Types.EntityType.CHESTED_HORSE).handler((event, meta) -> { + StoredEntityData data = storedEntityData(event); + if (!data.has(ChestedHorseStorage.class)) { + data.put(new ChestedHorseStorage()); + } }); // Handle horse armor - registerMetaHandler().filter(Entity1_11Types.EntityType.HORSE, 16).handleIndexChange(17); + filter().type(Entity1_11Types.EntityType.HORSE).index(16).toIndex(17); // Handle chested horse - registerMetaHandler().filter(Entity1_11Types.EntityType.CHESTED_HORSE, true, 15).handle(e -> { - ChestedHorseStorage storage = e.getEntity().get(ChestedHorseStorage.class); - boolean b = (boolean) e.getData().getValue(); + filter().filterFamily(Entity1_11Types.EntityType.CHESTED_HORSE).index(15).handler((event, meta) -> { + StoredEntityData data = storedEntityData(event); + ChestedHorseStorage storage = data.get(ChestedHorseStorage.class); + boolean b = (boolean) meta.getValue(); storage.setChested(b); - - throw RemovedValueException.EX; + event.cancel(); }); // Get rid of Liama metadata - registerMetaHandler().filter(Entity1_11Types.EntityType.LIAMA).handle(e -> { - Metadata data = e.getData(); - ChestedHorseStorage storage = e.getEntity().get(ChestedHorseStorage.class); + filter().type(Entity1_11Types.EntityType.LIAMA).handler((event, meta) -> { + StoredEntityData data = storedEntityData(event); + ChestedHorseStorage storage = data.get(ChestedHorseStorage.class); - int index = e.getIndex(); + int index = event.index(); // Store them for later (: switch (index) { case 16: - storage.setLiamaStrength((int) data.getValue()); - throw RemovedValueException.EX; + storage.setLiamaStrength((int) meta.getValue()); + event.cancel(); + break; case 17: - storage.setLiamaCarpetColor((int) data.getValue()); - throw RemovedValueException.EX; + storage.setLiamaCarpetColor((int) meta.getValue()); + event.cancel(); + break; case 18: - storage.setLiamaVariant((int) data.getValue()); - throw RemovedValueException.EX; + storage.setLiamaVariant((int) meta.getValue()); + event.cancel(); + break; } - return e.getData(); }); // Handle Horse (Correct owner) - registerMetaHandler().filter(Entity1_11Types.EntityType.ABSTRACT_HORSE, true, 14).handleIndexChange(16); + filter().filterFamily(Entity1_11Types.EntityType.ABSTRACT_HORSE).index(14).toIndex(16); // Handle villager - Change non-existing profession - registerMetaHandler().filter(Entity1_11Types.EntityType.VILLAGER, 13).handle(e -> { - Metadata data = e.getData(); - if ((int) data.getValue() == 5) - data.setValue(0); - - return data; + filter().type(Entity1_11Types.EntityType.VILLAGER).index(13).handler((event, meta) -> { + if ((int) meta.getValue() == 5) { + meta.setValue(0); + } }); // handle new Shulker color meta - registerMetaHandler().filter(Entity1_11Types.EntityType.SHULKER, 15).removed(); - + filter().type(Entity1_11Types.EntityType.SHULKER).cancel(15); } /* @@ -401,7 +376,7 @@ public class EntityPackets1_11 extends LegacyEntityRewriter return new Metadata(13, MetaType1_9.VarInt, type); } - private void handleZombieType(MetaStorage storage, int type) { + private void handleZombieType(WrappedMetadata storage, int type) { Metadata meta = storage.get(13); if (meta == null) { storage.add(getZombieTypeMeta(type)); @@ -420,7 +395,7 @@ public class EntityPackets1_11 extends LegacyEntityRewriter } @Override - protected EntityType getTypeFromId(int typeId) { + public EntityType typeFromId(int typeId) { return Entity1_11Types.getTypeFromId(typeId, false); } diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_10to1_11/storage/ChestedHorseStorage.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_10to1_11/storage/ChestedHorseStorage.java index 88a6545d..dbac5b92 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_10to1_11/storage/ChestedHorseStorage.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_10to1_11/storage/ChestedHorseStorage.java @@ -18,9 +18,7 @@ package com.viaversion.viabackwards.protocol.protocol1_10to1_11.storage; -import com.viaversion.viabackwards.api.entities.storage.EntityStorage; - -public class ChestedHorseStorage implements EntityStorage { +public class ChestedHorseStorage { private boolean chested; private int liamaStrength; private int liamaCarpetColor = -1; diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_11_1to1_12/Protocol1_11_1To1_12.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_11_1to1_12/Protocol1_11_1To1_12.java index d2d2028f..d83bc0a2 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_11_1to1_12/Protocol1_11_1To1_12.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_11_1to1_12/Protocol1_11_1To1_12.java @@ -25,8 +25,10 @@ import com.viaversion.viabackwards.protocol.protocol1_11_1to1_12.packets.ChatPac import com.viaversion.viabackwards.protocol.protocol1_11_1to1_12.packets.EntityPackets1_12; import com.viaversion.viabackwards.protocol.protocol1_11_1to1_12.packets.SoundPackets1_12; import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.minecraft.entities.Entity1_12Types; import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper; import com.viaversion.viaversion.api.type.Type; +import com.viaversion.viaversion.data.entity.EntityTrackerBase; import com.viaversion.viaversion.libs.gson.JsonElement; import com.viaversion.viaversion.protocols.protocol1_12to1_11_1.ClientboundPackets1_12; import com.viaversion.viaversion.protocols.protocol1_12to1_11_1.ServerboundPackets1_12; @@ -76,7 +78,7 @@ public class Protocol1_11_1To1_12 extends BackwardsProtocol { - Metadata data = e.getData(); - - if (data.getMetaType().getType().equals(Type.ITEM)) // Is Item - data.setValue(handleItemToClient((Item) data.getValue())); - - return data; + protocol.getEntityPackets().filter().handler((event, meta) -> { + if (meta.metaType().type().equals(Type.ITEM)) // Is Item + meta.setValue(handleItemToClient((Item) meta.getValue())); }); protocol.registerServerbound(ServerboundPackets1_9_3.CLIENT_STATUS, new PacketRemapper() { diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_11_1to1_12/packets/ChatPackets1_12.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_11_1to1_12/packets/ChatPackets1_12.java index 8789bd8e..5874011f 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_11_1to1_12/packets/ChatPackets1_12.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_11_1to1_12/packets/ChatPackets1_12.java @@ -18,7 +18,6 @@ package com.viaversion.viabackwards.protocol.protocol1_11_1to1_12.packets; -import com.viaversion.viabackwards.api.rewriters.Rewriter; import com.viaversion.viabackwards.protocol.protocol1_11_1to1_12.Protocol1_11_1To1_12; import com.viaversion.viabackwards.protocol.protocol1_11_1to1_12.data.AdvancementTranslations; import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper; @@ -27,8 +26,9 @@ import com.viaversion.viaversion.libs.gson.JsonElement; import com.viaversion.viaversion.libs.gson.JsonObject; import com.viaversion.viaversion.protocols.protocol1_12to1_11_1.ClientboundPackets1_12; import com.viaversion.viaversion.rewriter.ComponentRewriter; +import com.viaversion.viaversion.rewriter.RewriterBase; -public class ChatPackets1_12 extends Rewriter { +public class ChatPackets1_12 extends RewriterBase { private final ComponentRewriter componentRewriter = new ComponentRewriter() { @Override diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_11_1to1_12/packets/EntityPackets1_12.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_11_1to1_12/packets/EntityPackets1_12.java index b4c10134..809c31f6 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_11_1to1_12/packets/EntityPackets1_12.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_11_1to1_12/packets/EntityPackets1_12.java @@ -18,12 +18,12 @@ package com.viaversion.viabackwards.protocol.protocol1_11_1to1_12.packets; -import com.viaversion.viabackwards.api.exceptions.RemovedValueException; import com.viaversion.viabackwards.api.rewriters.LegacyEntityRewriter; import com.viaversion.viabackwards.protocol.protocol1_11_1to1_12.Protocol1_11_1To1_12; import com.viaversion.viabackwards.protocol.protocol1_11_1to1_12.data.ParrotStorage; import com.viaversion.viabackwards.protocol.protocol1_11_1to1_12.data.ShoulderTracker; import com.viaversion.viabackwards.utils.Block; +import com.viaversion.viaversion.api.data.entity.StoredEntityData; import com.viaversion.viaversion.api.minecraft.entities.Entity1_12Types; import com.viaversion.viaversion.api.minecraft.entities.EntityType; import com.viaversion.viaversion.api.minecraft.metadata.Metadata; @@ -73,7 +73,7 @@ public class EntityPackets1_12 extends LegacyEntityRewriter> 12 & 15; - Block block = getProtocol().getBlockItemPackets().handleBlock(objType, data); + Block block = protocol.getBlockItemPackets().handleBlock(objType, data); if (block == null) { return; } @@ -85,8 +85,8 @@ public class EntityPackets1_12 extends LegacyEntityRewriter storage.add(new Metadata(12, MetaType1_12.Byte, (byte) 0x00))); - mapEntity(Entity1_12Types.EntityType.ILLUSION_ILLAGER, Entity1_12Types.EntityType.EVOCATION_ILLAGER).mobName("Illusioner"); + mapEntityTypeWithData(Entity1_12Types.EntityType.PARROT, Entity1_12Types.EntityType.BAT).mobName("Parrot").spawnMetadata(storage -> storage.add(new Metadata(12, MetaType1_12.Byte, (byte) 0x00))); + mapEntityTypeWithData(Entity1_12Types.EntityType.ILLUSION_ILLAGER, Entity1_12Types.EntityType.EVOCATION_ILLAGER).mobName("Illusioner"); // Handle Illager - registerMetaHandler().filter(Entity1_12Types.EntityType.EVOCATION_ILLAGER, true, 12).removed(); - registerMetaHandler().filter(Entity1_12Types.EntityType.EVOCATION_ILLAGER, true, 13).handleIndexChange(12); + filter().filterFamily(Entity1_12Types.EntityType.EVOCATION_ILLAGER).cancel(12); + filter().filterFamily(Entity1_12Types.EntityType.EVOCATION_ILLAGER).index(13).toIndex(12); - registerMetaHandler().filter(Entity1_12Types.EntityType.ILLUSION_ILLAGER, 0).handle(e -> { - byte mask = (byte) e.getData().getValue(); + filter().type(Entity1_12Types.EntityType.ILLUSION_ILLAGER).index(0).handler((event, meta) -> { + byte mask = (byte) meta.getValue(); - if ((mask & 0x20) == 0x20) + if ((mask & 0x20) == 0x20) { mask &= ~0x20; + } - e.getData().setValue(mask); - return e.getData(); + meta.setValue(mask); }); // Create Parrot storage - registerMetaHandler().filter(Entity1_12Types.EntityType.PARROT, true).handle(e -> { - if (!e.getEntity().has(ParrotStorage.class)) - e.getEntity().put(new ParrotStorage()); - return e.getData(); + filter().filterFamily(Entity1_12Types.EntityType.PARROT).handler((event, meta) -> { + StoredEntityData data = storedEntityData(event); + if (!data.has(ParrotStorage.class)) { + data.put(new ParrotStorage()); + } }); // Parrot remove animal metadata - registerMetaHandler().filter(Entity1_12Types.EntityType.PARROT, 12).removed(); // Is baby - registerMetaHandler().filter(Entity1_12Types.EntityType.PARROT, 13).handle(e -> { - Metadata data = e.getData(); - ParrotStorage storage = e.getEntity().get(ParrotStorage.class); - boolean isSitting = (((byte) data.getValue()) & 0x01) == 0x01; - boolean isTamed = (((byte) data.getValue()) & 0x04) == 0x04; + filter().type(Entity1_12Types.EntityType.PARROT).cancel(12); // Is baby + filter().type(Entity1_12Types.EntityType.PARROT).index(13).handler((event, meta) -> { + StoredEntityData data = storedEntityData(event); + ParrotStorage storage = data.get(ParrotStorage.class); + boolean isSitting = (((byte) meta.getValue()) & 0x01) == 0x01; + boolean isTamed = (((byte) meta.getValue()) & 0x04) == 0x04; if (!storage.isTamed() && isTamed) { // TODO do something to let the user know it's done @@ -250,30 +251,29 @@ public class EntityPackets1_12 extends LegacyEntityRewriter { - CompoundTag tag = (CompoundTag) e.getData().getValue(); - ShoulderTracker tracker = e.getUser().get(ShoulderTracker.class); + filter().type(Entity1_12Types.EntityType.PLAYER).index(15).handler((event, meta) -> { + CompoundTag tag = (CompoundTag) meta.getValue(); + ShoulderTracker tracker = event.user().get(ShoulderTracker.class); if (tag.isEmpty() && tracker.getLeftShoulder() != null) { tracker.setLeftShoulder(null); tracker.update(); - } else if (tag.contains("id") && e.getEntity().getEntityId() == tracker.getEntityId()) { + } else if (tag.contains("id") && event.entityId() == tracker.getEntityId()) { String id = (String) tag.get("id").getValue(); if (tracker.getLeftShoulder() == null || !tracker.getLeftShoulder().equals(id)) { tracker.setLeftShoulder(id); @@ -281,18 +281,18 @@ public class EntityPackets1_12 extends LegacyEntityRewriter { - CompoundTag tag = (CompoundTag) e.getData().getValue(); - ShoulderTracker tracker = e.getUser().get(ShoulderTracker.class); + filter().type(Entity1_12Types.EntityType.PLAYER).index(16).handler((event, meta) -> { + CompoundTag tag = (CompoundTag) event.meta().getValue(); + ShoulderTracker tracker = event.user().get(ShoulderTracker.class); if (tag.isEmpty() && tracker.getRightShoulder() != null) { tracker.setRightShoulder(null); tracker.update(); - } else if (tag.contains("id") && e.getEntity().getEntityId() == tracker.getEntityId()) { + } else if (tag.contains("id") && event.entityId() == tracker.getEntityId()) { String id = (String) tag.get("id").getValue(); if (tracker.getRightShoulder() == null || !tracker.getRightShoulder().equals(id)) { tracker.setRightShoulder(id); @@ -300,12 +300,12 @@ public class EntityPackets1_12 extends LegacyEntityRewriter { - Metadata data = e.getData(); - - if (data.getMetaType().getType().equals(Type.ITEM)) { // Is Item - data.setValue(handleItemToClient((Item) data.getValue())); + protocol.getEntityPackets().filter().handler((event, meta) -> { + if (meta.metaType().type().equals(Type.ITEM)) { // Is Item + meta.setValue(handleItemToClient((Item) meta.getValue())); } - - return data; }); } diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_12_2to1_13/Protocol1_12_2To1_13.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_12_2to1_13/Protocol1_12_2To1_13.java index 1ad29d30..668bee11 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_12_2to1_13/Protocol1_12_2To1_13.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_12_2to1_13/Protocol1_12_2To1_13.java @@ -33,6 +33,8 @@ import com.viaversion.viabackwards.protocol.protocol1_12_2to1_13.storage.PlayerP import com.viaversion.viabackwards.protocol.protocol1_12_2to1_13.storage.TabCompleteStorage; import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.minecraft.entities.Entity1_13Types; +import com.viaversion.viaversion.data.entity.EntityTrackerBase; import com.viaversion.viaversion.libs.gson.JsonObject; import com.viaversion.viaversion.protocols.protocol1_12_1to1_12.ClientboundPackets1_12_1; import com.viaversion.viaversion.protocols.protocol1_12_1to1_12.ServerboundPackets1_12_1; @@ -99,7 +101,7 @@ public class Protocol1_12_2To1_13 extends BackwardsProtocol { + mapEntityTypeWithData(Entity1_13Types.EntityType.PHANTOM, Entity1_13Types.EntityType.PARROT).mobName("Phantom").spawnMetadata(storage -> { // The phantom is grey/blue so let's do yellow/blue storage.add(new Metadata(15, MetaType1_12.VarInt, 3)); }); // Dolphin - mapEntity(Entity1_13Types.EntityType.DOLPHIN, Entity1_13Types.EntityType.SQUID).mobName("Dolphin"); + mapEntityTypeWithData(Entity1_13Types.EntityType.DOLPHIN, Entity1_13Types.EntityType.SQUID).mobName("Dolphin"); // Turtle - mapEntity(Entity1_13Types.EntityType.TURTLE, Entity1_13Types.EntityType.OCELOT).mobName("Turtle"); + mapEntityTypeWithData(Entity1_13Types.EntityType.TURTLE, Entity1_13Types.EntityType.OCELOT).mobName("Turtle"); // Rewrite Meta types - registerMetaHandler().handle(e -> { - Metadata meta = e.getData(); - int typeId = meta.getMetaType().getTypeID(); + filter().handler((event, meta) -> { + int typeId = meta.metaType().typeId(); // Rewrite optional chat to chat if (typeId == 5) { @@ -334,63 +332,49 @@ public class EntityPackets1_13 extends LegacyEntityRewriter { - Metadata meta = e.getData(); + filter().filterFamily(Entity1_13Types.EntityType.ENTITY).index(2).handler((event, meta) -> { String value = meta.getValue().toString(); - if (value.isEmpty()) return meta; - meta.setValue(ChatRewriter.jsonToLegacyText(value)); - return meta; + if (!value.isEmpty()) { + meta.setValue(ChatRewriter.jsonToLegacyText(value)); + } }); // Handle zombie metadata - registerMetaHandler().filter(Entity1_13Types.EntityType.ZOMBIE, true, 15).removed(); - registerMetaHandler().filter(Entity1_13Types.EntityType.ZOMBIE, true).handle(e -> { - Metadata meta = e.getData(); - - if (meta.getId() > 15) { - meta.setId(meta.getId() - 1); - } - - return meta; - }); + filter().filterFamily(Entity1_13Types.EntityType.ZOMBIE).removeIndex(15); // Handle turtle metadata (Remove them all for now) - registerMetaHandler().filter(Entity1_13Types.EntityType.TURTLE, 13).removed(); // Home pos - registerMetaHandler().filter(Entity1_13Types.EntityType.TURTLE, 14).removed(); // Has egg - registerMetaHandler().filter(Entity1_13Types.EntityType.TURTLE, 15).removed(); // Laying egg - registerMetaHandler().filter(Entity1_13Types.EntityType.TURTLE, 16).removed(); // Travel pos - registerMetaHandler().filter(Entity1_13Types.EntityType.TURTLE, 17).removed(); // Going home - registerMetaHandler().filter(Entity1_13Types.EntityType.TURTLE, 18).removed(); // Traveling + filter().type(Entity1_13Types.EntityType.TURTLE).cancel(13); // Home pos + filter().type(Entity1_13Types.EntityType.TURTLE).cancel(14); // Has egg + filter().type(Entity1_13Types.EntityType.TURTLE).cancel(15); // Laying egg + filter().type(Entity1_13Types.EntityType.TURTLE).cancel(16); // Travel pos + filter().type(Entity1_13Types.EntityType.TURTLE).cancel(17); // Going home + filter().type(Entity1_13Types.EntityType.TURTLE).cancel(18); // Traveling // Remove additional fish meta - registerMetaHandler().filter(Entity1_13Types.EntityType.ABSTRACT_FISHES, true, 12).removed(); - registerMetaHandler().filter(Entity1_13Types.EntityType.ABSTRACT_FISHES, true, 13).removed(); + filter().filterFamily(Entity1_13Types.EntityType.ABSTRACT_FISHES).cancel(12); + filter().filterFamily(Entity1_13Types.EntityType.ABSTRACT_FISHES).cancel(13); // Remove phantom size - registerMetaHandler().filter(Entity1_13Types.EntityType.PHANTOM, 12).removed(); + filter().type(Entity1_13Types.EntityType.PHANTOM).cancel(12); // Remove boat splash timer - registerMetaHandler().filter(Entity1_13Types.EntityType.BOAT, 12).removed(); + filter().type(Entity1_13Types.EntityType.BOAT).cancel(12); // Remove Trident special loyalty level - registerMetaHandler().filter(Entity1_13Types.EntityType.TRIDENT, 7).removed(); + filter().type(Entity1_13Types.EntityType.TRIDENT).cancel(7); // Handle new wolf colors - registerMetaHandler().filter(Entity1_13Types.EntityType.WOLF, 17).handle(e -> { - Metadata meta = e.getData(); + filter().type(Entity1_13Types.EntityType.WOLF).index(17).handler((event, meta) -> { meta.setValue(15 - (int) meta.getValue()); - return meta; }); // Rewrite AreaEffectCloud - registerMetaHandler().filter(Entity1_13Types.EntityType.AREA_EFFECT_CLOUD, 9).handle(e -> { - Metadata meta = e.getData(); + filter().type(Entity1_13Types.EntityType.AREA_EFFECT_CLOUD).index(9).handler((event, meta) -> { Particle particle = (Particle) meta.getValue(); ParticleMapping.ParticleData data = ParticleMapping.getMapping(particle.getId()); @@ -408,16 +392,16 @@ public class EntityPackets1_13 extends LegacyEntityRewriter { +public class PlayerPacket1_13 extends RewriterBase { private final CommandRewriter commandRewriter = new CommandRewriter(protocol) { }; @@ -93,16 +93,16 @@ public class PlayerPacket1_13 extends Rewriter { for (int i = 0; i < size; i++) { //Input Item Item input = wrapper.read(Type.FLAT_ITEM); - wrapper.write(Type.ITEM, getProtocol().getBlockItemPackets().handleItemToClient(input)); + wrapper.write(Type.ITEM, protocol.getBlockItemPackets().handleItemToClient(input)); //Output Item Item output = wrapper.read(Type.FLAT_ITEM); - wrapper.write(Type.ITEM, getProtocol().getBlockItemPackets().handleItemToClient(output)); + wrapper.write(Type.ITEM, protocol.getBlockItemPackets().handleItemToClient(output)); boolean secondItem = wrapper.passthrough(Type.BOOLEAN); //Has second item if (secondItem) { //Second Item Item second = wrapper.read(Type.FLAT_ITEM); - wrapper.write(Type.ITEM, getProtocol().getBlockItemPackets().handleItemToClient(second)); + wrapper.write(Type.ITEM, protocol.getBlockItemPackets().handleItemToClient(second)); } wrapper.passthrough(Type.BOOLEAN); //Trade disabled @@ -448,7 +448,7 @@ public class PlayerPacket1_13 extends Rewriter { case "MC|BEdit": wrapper.setId(0x0B); Item book = wrapper.read(Type.ITEM); - wrapper.write(Type.FLAT_ITEM, getProtocol().getBlockItemPackets().handleItemToServer(book)); + wrapper.write(Type.FLAT_ITEM, protocol.getBlockItemPackets().handleItemToServer(book)); boolean signing = channel.equals("MC|BSign"); wrapper.write(Type.BOOLEAN, signing); break; diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_12_2to1_13/packets/SoundPackets1_13.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_12_2to1_13/packets/SoundPackets1_13.java index 043b4506..70d3082d 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_12_2to1_13/packets/SoundPackets1_13.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_12_2to1_13/packets/SoundPackets1_13.java @@ -18,7 +18,6 @@ package com.viaversion.viabackwards.protocol.protocol1_12_2to1_13.packets; import com.viaversion.viabackwards.ViaBackwards; -import com.viaversion.viabackwards.api.rewriters.Rewriter; import com.viaversion.viabackwards.protocol.protocol1_12_2to1_13.Protocol1_12_2To1_13; import com.viaversion.viabackwards.protocol.protocol1_12_2to1_13.data.NamedSoundMapping; import com.viaversion.viaversion.api.Via; @@ -26,8 +25,9 @@ import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper; import com.viaversion.viaversion.api.type.Type; import com.viaversion.viaversion.protocols.protocol1_12_1to1_12.ClientboundPackets1_12_1; import com.viaversion.viaversion.protocols.protocol1_13to1_12_2.ClientboundPackets1_13; +import com.viaversion.viaversion.rewriter.RewriterBase; -public class SoundPackets1_13 extends Rewriter { +public class SoundPackets1_13 extends RewriterBase { private static final String[] SOUND_SOURCES = {"master", "music", "record", "weather", "block", "hostile", "neutral", "player", "ambient", "voice"}; public SoundPackets1_13(Protocol1_12_2To1_13 protocol) { diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_13_1to1_13_2/packets/EntityPackets1_13_2.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_13_1to1_13_2/packets/EntityPackets1_13_2.java index a5139136..b452b0b8 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_13_1to1_13_2/packets/EntityPackets1_13_2.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_13_1to1_13_2/packets/EntityPackets1_13_2.java @@ -54,7 +54,7 @@ public class EntityPackets1_13_2 { @Override public void handle(PacketWrapper wrapper) throws Exception { for (Metadata metadata : wrapper.get(Types1_13.METADATA_LIST, 0)) { - if (metadata.getMetaType() == MetaType1_13_2.Slot) { + if (metadata.metaType() == MetaType1_13_2.Slot) { metadata.setMetaType(MetaType1_13.Slot); } } @@ -79,7 +79,7 @@ public class EntityPackets1_13_2 { @Override public void handle(PacketWrapper wrapper) throws Exception { for (Metadata metadata : wrapper.get(Types1_13.METADATA_LIST, 0)) { - if (metadata.getMetaType() == MetaType1_13_2.Slot) { + if (metadata.metaType() == MetaType1_13_2.Slot) { metadata.setMetaType(MetaType1_13.Slot); } } @@ -98,7 +98,7 @@ public class EntityPackets1_13_2 { @Override public void handle(PacketWrapper wrapper) throws Exception { for (Metadata metadata : wrapper.get(Types1_13.METADATA_LIST, 0)) { - if (metadata.getMetaType() == MetaType1_13_2.Slot) { + if (metadata.metaType() == MetaType1_13_2.Slot) { metadata.setMetaType(MetaType1_13.Slot); } } diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_13_2to1_14/Protocol1_13_2To1_14.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_13_2to1_14/Protocol1_13_2To1_14.java index 402b3e57..dc89a844 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_13_2to1_14/Protocol1_13_2To1_14.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_13_2to1_14/Protocol1_13_2To1_14.java @@ -27,10 +27,12 @@ import com.viaversion.viabackwards.protocol.protocol1_13_2to1_14.packets.PlayerP import com.viaversion.viabackwards.protocol.protocol1_13_2to1_14.packets.SoundPackets1_14; import com.viaversion.viabackwards.protocol.protocol1_13_2to1_14.storage.ChunkLightStorage; import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.minecraft.entities.Entity1_14Types; import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; import com.viaversion.viaversion.api.protocol.remapper.PacketHandler; import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper; import com.viaversion.viaversion.api.type.Type; +import com.viaversion.viaversion.data.entity.EntityTrackerBase; import com.viaversion.viaversion.protocols.protocol1_13to1_12_2.ClientboundPackets1_13; import com.viaversion.viaversion.protocols.protocol1_13to1_12_2.ServerboundPackets1_13; import com.viaversion.viaversion.protocols.protocol1_14to1_13_2.ClientboundPackets1_14; @@ -71,7 +73,7 @@ public class Protocol1_13_2To1_14 extends BackwardsProtocol { @@ -54,6 +54,7 @@ public class EntityPackets1_14 extends LegacyEntityRewriter { - Metadata meta = e.getData(); - int typeId = meta.getMetaType().getTypeID(); + filter().handler((event, meta) -> { + int typeId = meta.metaType().typeId(); if (typeId <= 15) { meta.setMetaType(MetaType1_13_2.byId(typeId)); } - MetaType type = meta.getMetaType(); + MetaType type = meta.metaType(); if (type == MetaType1_13_2.Slot) { Item item = (Item) meta.getValue(); - meta.setValue(getProtocol().getBlockItemPackets().handleItemToClient(item)); + meta.setValue(protocol.getBlockItemPackets().handleItemToClient(item)); } else if (type == MetaType1_13_2.BlockID) { int blockstate = (Integer) meta.getValue(); meta.setValue(protocol.getMappingData().getNewBlockStateId(blockstate)); } - return meta; }); - registerMetaHandler().filter(Entity1_14Types.PILLAGER, 15).removed(); + filter().type(Entity1_14Types.PILLAGER).cancel(15); - registerMetaHandler().filter(Entity1_14Types.FOX, 15).removed(); - registerMetaHandler().filter(Entity1_14Types.FOX, 16).removed(); - registerMetaHandler().filter(Entity1_14Types.FOX, 17).removed(); - registerMetaHandler().filter(Entity1_14Types.FOX, 18).removed(); + filter().type(Entity1_14Types.FOX).cancel(15); + filter().type(Entity1_14Types.FOX).cancel(16); + filter().type(Entity1_14Types.FOX).cancel(17); + filter().type(Entity1_14Types.FOX).cancel(18); - registerMetaHandler().filter(Entity1_14Types.PANDA, 15).removed(); - registerMetaHandler().filter(Entity1_14Types.PANDA, 16).removed(); - registerMetaHandler().filter(Entity1_14Types.PANDA, 17).removed(); - registerMetaHandler().filter(Entity1_14Types.PANDA, 18).removed(); - registerMetaHandler().filter(Entity1_14Types.PANDA, 19).removed(); - registerMetaHandler().filter(Entity1_14Types.PANDA, 20).removed(); + filter().type(Entity1_14Types.PANDA).cancel(15); + filter().type(Entity1_14Types.PANDA).cancel(16); + filter().type(Entity1_14Types.PANDA).cancel(17); + filter().type(Entity1_14Types.PANDA).cancel(18); + filter().type(Entity1_14Types.PANDA).cancel(19); + filter().type(Entity1_14Types.PANDA).cancel(20); - registerMetaHandler().filter(Entity1_14Types.CAT, 18).removed(); - registerMetaHandler().filter(Entity1_14Types.CAT, 19).removed(); - registerMetaHandler().filter(Entity1_14Types.CAT, 20).removed(); + filter().type(Entity1_14Types.CAT).cancel(18); + filter().type(Entity1_14Types.CAT).cancel(19); + filter().type(Entity1_14Types.CAT).cancel(20); - registerMetaHandler().handle(e -> { - EntityType type = e.getEntity().getType(); - Metadata meta = e.getData(); + filter().handler((event, meta) -> { + EntityType type = event.entityType(); if (type.isOrHasParent(Entity1_14Types.ABSTRACT_ILLAGER_BASE) || type == Entity1_14Types.RAVAGER || type == Entity1_14Types.WITCH) { - int index = e.getIndex(); + int index = event.index(); if (index == 14) { - throw RemovedValueException.EX; + event.cancel(); } else if (index > 14) { - meta.setId(index - 1); + event.setIndex(index - 1); } } - return meta; }); - registerMetaHandler().filter(Entity1_14Types.AREA_EFFECT_CLOUD, 10).handle(e -> { - Metadata meta = e.getData(); + filter().type(Entity1_14Types.AREA_EFFECT_CLOUD).index(10).handler((event, meta) -> { rewriteParticle((Particle) meta.getValue()); - return meta; }); - registerMetaHandler().filter(Entity1_14Types.FIREWORK_ROCKET, 8).handle(e -> { - Metadata meta = e.getData(); + filter().type(Entity1_14Types.FIREWORK_ROCKET).index(8).handler((event, meta) -> { meta.setMetaType(MetaType1_13_2.VarInt); Integer value = (Integer) meta.getValue(); if (value == null) meta.setValue(0); - return meta; }); - registerMetaHandler().filter(Entity1_14Types.ABSTRACT_ARROW, true).handle(e -> { - Metadata meta = e.getData(); - int index = e.getIndex(); - if (index == 9) { - throw RemovedValueException.EX; - } else if (index > 9) { - meta.setId(index - 1); - } - return meta; - }); + filter().filterFamily(Entity1_14Types.ABSTRACT_ARROW).removeIndex(9); - registerMetaHandler().filter(Entity1_14Types.VILLAGER, 15).removed(); // Head shake timer + filter().type(Entity1_14Types.VILLAGER).cancel(15); // Head shake timer - MetaHandler villagerDataHandler = e -> { - Metadata meta = e.getData(); + MetaHandler villagerDataHandler = (event, meta) -> { VillagerData villagerData = (VillagerData) meta.getValue(); meta.setValue(villagerDataToProfession(villagerData)); meta.setMetaType(MetaType1_13_2.VarInt); - if (meta.getId() == 16) { - meta.setId(15); // decreased by 2 again in one of the following handlers + if (meta.id() == 16) { + event.setIndex(15); // decreased by 2 again in one of the following handlers } - return meta; }; - registerMetaHandler().filter(Entity1_14Types.ZOMBIE_VILLAGER, 18).handle(villagerDataHandler); - registerMetaHandler().filter(Entity1_14Types.VILLAGER, 16).handle(villagerDataHandler); + filter().type(Entity1_14Types.ZOMBIE_VILLAGER).index(18).handler(villagerDataHandler); + filter().type(Entity1_14Types.VILLAGER).index(16).handler(villagerDataHandler); // Holding arms up - from bitfield into own boolean - registerMetaHandler().filter(Entity1_14Types.ABSTRACT_SKELETON, true, 13).handle(e -> { - byte value = (byte) e.getData().getValue(); + filter().filterFamily(Entity1_14Types.ABSTRACT_SKELETON).index(13).handler((event, meta) -> { + byte value = (byte) meta.getValue(); if ((value & 4) != 0) { - e.createMeta(new Metadata(14, MetaType1_13_2.Boolean, true)); + event.createExtraMeta(new Metadata(14, MetaType1_13_2.Boolean, true)); } - return e.getData(); }); - registerMetaHandler().filter(Entity1_14Types.ZOMBIE, true, 13).handle(e -> { - byte value = (byte) e.getData().getValue(); + filter().filterFamily(Entity1_14Types.ZOMBIE).index(13).handler((event, meta) -> { + byte value = (byte) meta.getValue(); if ((value & 4) != 0) { - e.createMeta(new Metadata(16, MetaType1_13_2.Boolean, true)); + event.createExtraMeta(new Metadata(16, MetaType1_13_2.Boolean, true)); } - return e.getData(); }); - registerMetaHandler().filter(Entity1_14Types.ZOMBIE, true).handle(e -> { - Metadata meta = e.getData(); - int index = e.getIndex(); - if (index >= 16) { - meta.setId(index + 1); - } - return meta; - }); + filter().filterFamily(Entity1_14Types.ZOMBIE).addIndex(16); // Remove bed location - registerMetaHandler().filter(Entity1_14Types.LIVINGENTITY, true).handle(e -> { - Metadata meta = e.getData(); - int index = e.getIndex(); + filter().filterFamily(Entity1_14Types.LIVINGENTITY).handler((event, meta) -> { + int index = event.index(); if (index == 12) { Position position = (Position) meta.getValue(); if (position != null) { // Use bed - PacketWrapper wrapper = PacketWrapper.create(0x33, null, e.getUser()); - wrapper.write(Type.VAR_INT, e.getEntity().getEntityId()); + PacketWrapper wrapper = PacketWrapper.create(0x33, null, event.user()); + wrapper.write(Type.VAR_INT, event.entityId()); wrapper.write(Type.POSITION, position); try { @@ -491,50 +463,34 @@ public class EntityPackets1_14 extends LegacyEntityRewriter 12) { - meta.setId(index - 1); + event.setIndex(index - 1); } - return meta; }); - registerMetaHandler().handle(e -> { - Metadata meta = e.getData(); - int index = e.getIndex(); - if (index == 6) { - throw RemovedValueException.EX; - } else if (index > 6) { - meta.setId(index - 1); - } - return meta; - }); + // Something + filter().removeIndex(6); - registerMetaHandler().handle(e -> { - Metadata meta = e.getData(); - int typeId = meta.getMetaType().getTypeID(); + filter().handler((event, meta) -> { + int typeId = meta.metaType().typeId(); if (typeId > 15) { - ViaBackwards.getPlatform().getLogger().warning("New 1.14 metadata was not handled: " + meta + " entity: " + e.getEntity().getType()); - return null; + ViaBackwards.getPlatform().getLogger().warning("New 1.14 metadata was not handled: " + meta + " entity: " + event.entityType()); } - return meta; }); - registerMetaHandler().filter(Entity1_14Types.OCELOT, 13).handle(e -> { - Metadata meta = e.getData(); - meta.setId(15); + filter().type(Entity1_14Types.OCELOT).index(13).handler((event, meta) -> { + event.setIndex(15); meta.setMetaType(MetaType1_13_2.VarInt); meta.setValue(0); - return meta; }); - registerMetaHandler().filter(Entity1_14Types.CAT).handle(e -> { - Metadata meta = e.getData(); - if (meta.getId() == 15) { + filter().type(Entity1_14Types.CAT).handler((event, meta) -> { + if (event.index() == 15) { meta.setValue(1); - } else if (meta.getId() == 13) { + } else if (event.index() == 13) { meta.setValue((byte) ((byte) meta.getValue() & 0x4)); } - return meta; }); } @@ -566,7 +522,7 @@ public class EntityPackets1_14 extends LegacyEntityRewriter { +public class PlayerPackets1_14 extends RewriterBase { public PlayerPackets1_14(Protocol1_13_2To1_14 protocol) { super(protocol); diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_13_2to1_14/packets/SoundPackets1_14.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_13_2to1_14/packets/SoundPackets1_14.java index acbf2ce1..bbeddc37 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_13_2to1_14/packets/SoundPackets1_14.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_13_2to1_14/packets/SoundPackets1_14.java @@ -18,17 +18,17 @@ package com.viaversion.viabackwards.protocol.protocol1_13_2to1_14.packets; import com.viaversion.viabackwards.ViaBackwards; -import com.viaversion.viabackwards.api.entities.storage.EntityTracker; -import com.viaversion.viabackwards.api.rewriters.Rewriter; import com.viaversion.viabackwards.api.rewriters.SoundRewriter; import com.viaversion.viabackwards.protocol.protocol1_13_2to1_14.Protocol1_13_2To1_14; import com.viaversion.viabackwards.protocol.protocol1_13_2to1_14.storage.EntityPositionStorage1_14; +import com.viaversion.viaversion.api.data.entity.StoredEntityData; import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper; import com.viaversion.viaversion.api.type.Type; import com.viaversion.viaversion.protocols.protocol1_14to1_13_2.ClientboundPackets1_14; +import com.viaversion.viaversion.rewriter.RewriterBase; -public class SoundPackets1_14 extends Rewriter { +public class SoundPackets1_14 extends RewriterBase { public SoundPackets1_14(Protocol1_13_2To1_14 protocol) { super(protocol); @@ -55,7 +55,7 @@ public class SoundPackets1_14 extends Rewriter { int category = wrapper.read(Type.VAR_INT); int entityId = wrapper.read(Type.VAR_INT); - EntityTracker.StoredEntity storedEntity = wrapper.user().get(EntityTracker.class).get(protocol).getEntity(entityId); + StoredEntityData storedEntity = wrapper.user().getEntityTracker(protocol.getClass()).entityData(entityId); EntityPositionStorage1_14 entityStorage; if (storedEntity == null || (entityStorage = storedEntity.get(EntityPositionStorage1_14.class)) == null) { ViaBackwards.getPlatform().getLogger().warning("Untracked entity with id " + entityId); diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_13to1_13_1/Protocol1_13To1_13_1.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_13to1_13_1/Protocol1_13To1_13_1.java index 501498c9..f42d10b1 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_13to1_13_1/Protocol1_13To1_13_1.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_13to1_13_1/Protocol1_13To1_13_1.java @@ -19,19 +19,20 @@ package com.viaversion.viabackwards.protocol.protocol1_13to1_13_1; import com.viaversion.viabackwards.api.BackwardsProtocol; import com.viaversion.viabackwards.api.data.BackwardsMappings; -import com.viaversion.viabackwards.api.entities.storage.EntityTracker; import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter; import com.viaversion.viabackwards.protocol.protocol1_13to1_13_1.data.CommandRewriter1_13_1; import com.viaversion.viabackwards.protocol.protocol1_13to1_13_1.packets.EntityPackets1_13_1; import com.viaversion.viabackwards.protocol.protocol1_13to1_13_1.packets.InventoryPackets1_13_1; import com.viaversion.viabackwards.protocol.protocol1_13to1_13_1.packets.WorldPackets1_13_1; import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.minecraft.entities.Entity1_13Types; import com.viaversion.viaversion.api.minecraft.item.Item; import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; import com.viaversion.viaversion.api.protocol.remapper.PacketHandler; import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper; import com.viaversion.viaversion.api.protocol.remapper.ValueTransformer; import com.viaversion.viaversion.api.type.Type; +import com.viaversion.viaversion.data.entity.EntityTrackerBase; import com.viaversion.viaversion.libs.gson.JsonElement; import com.viaversion.viaversion.libs.gson.JsonObject; import com.viaversion.viaversion.protocols.protocol1_13_1to1_13.Protocol1_13_1To1_13; @@ -215,12 +216,7 @@ public class Protocol1_13To1_13_1 extends BackwardsProtocol { public EntityPackets1_13_1(Protocol1_13To1_13_1 protocol) { @@ -73,14 +74,14 @@ public class EntityPackets1_13_1 extends LegacyEntityRewriter metadata = wrapper.get(Types1_13.METADATA_LIST, 0); + handleMetadata(wrapper.get(Type.VAR_INT, 0), metadata, wrapper.user()); } }); } @@ -134,58 +130,46 @@ public class EntityPackets1_13_1 extends LegacyEntityRewriter { - Metadata meta = e.getData(); - if (meta.getMetaType() == MetaType1_13.Slot) { + filter().handler((event, meta) -> { + if (meta.metaType() == MetaType1_13.Slot) { InventoryPackets1_13_1.toClient((Item) meta.getValue()); - } else if (meta.getMetaType() == MetaType1_13.BlockID) { + } else if (meta.metaType() == MetaType1_13.BlockID) { // Convert to new block id int data = (int) meta.getValue(); meta.setValue(protocol.getMappingData().getNewBlockStateId(data)); - } else if (meta.getMetaType() == MetaType1_13.PARTICLE) { + } else if (meta.metaType() == MetaType1_13.PARTICLE) { rewriteParticle((Particle) meta.getValue()); } - return meta; }); // Remove shooter UUID - registerMetaHandler(). - filter(Entity1_13Types.EntityType.ABSTRACT_ARROW, true, 7) - .removed(); + filter().filterFamily(Entity1_13Types.EntityType.ABSTRACT_ARROW).cancel(7); // Move colors to old position - registerMetaHandler().filter(Entity1_13Types.EntityType.SPECTRAL_ARROW, 8) - .handleIndexChange(7); + filter().type(Entity1_13Types.EntityType.SPECTRAL_ARROW).index(8).toIndex(7); // Move loyalty level to old position - registerMetaHandler().filter(Entity1_13Types.EntityType.TRIDENT, 8) - .handleIndexChange(7); + filter().type(Entity1_13Types.EntityType.TRIDENT).index(8).toIndex(7); // Rewrite Minecart blocks - registerMetaHandler() - .filter(Entity1_13Types.EntityType.MINECART_ABSTRACT, true, 9) - .handle(e -> { - Metadata meta = e.getData(); - - int data = (int) meta.getValue(); - meta.setValue(protocol.getMappingData().getNewBlockStateId(data)); - - return meta; - }); + filter().filterFamily(Entity1_13Types.EntityType.MINECART_ABSTRACT).index(9).handler((event, meta) -> { + int data = (int) meta.getValue(); + meta.setValue(protocol.getMappingData().getNewBlockStateId(data)); + }); } @Override - protected EntityType getTypeFromId(int typeId) { + public EntityType typeFromId(int typeId) { return Entity1_13Types.getTypeFromId(typeId, false); } diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_14_4to1_15/Protocol1_14_4To1_15.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_14_4to1_15/Protocol1_14_4To1_15.java index a9de84d2..28ec6673 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_14_4to1_15/Protocol1_14_4To1_15.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_14_4to1_15/Protocol1_14_4To1_15.java @@ -19,7 +19,6 @@ package com.viaversion.viabackwards.protocol.protocol1_14_4to1_15; import com.viaversion.viabackwards.api.BackwardsProtocol; import com.viaversion.viabackwards.api.data.BackwardsMappings; -import com.viaversion.viabackwards.api.entities.storage.EntityTracker; import com.viaversion.viabackwards.api.rewriters.SoundRewriter; import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter; import com.viaversion.viabackwards.protocol.protocol1_14_4to1_15.data.EntityTypeMapping; @@ -27,9 +26,11 @@ import com.viaversion.viabackwards.protocol.protocol1_14_4to1_15.data.ImmediateR import com.viaversion.viabackwards.protocol.protocol1_14_4to1_15.packets.BlockItemPackets1_15; import com.viaversion.viabackwards.protocol.protocol1_14_4to1_15.packets.EntityPackets1_15; import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.minecraft.entities.Entity1_15Types; import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper; import com.viaversion.viaversion.api.type.Type; +import com.viaversion.viaversion.data.entity.EntityTrackerBase; import com.viaversion.viaversion.protocols.protocol1_14to1_13_2.ClientboundPackets1_14; import com.viaversion.viaversion.protocols.protocol1_14to1_13_2.ServerboundPackets1_14; import com.viaversion.viaversion.protocols.protocol1_15to1_14_4.ClientboundPackets1_15; @@ -105,10 +106,7 @@ public class Protocol1_14_4To1_15 extends BackwardsProtocol { } }); - registerSpawnTrackerWithData(ClientboundPackets1_15.SPAWN_ENTITY, Entity1_15Types.FALLING_BLOCK); + registerTrackerWithData(ClientboundPackets1_15.SPAWN_ENTITY, Entity1_15Types.FALLING_BLOCK); protocol.registerClientbound(ClientboundPackets1_15.SPAWN_MOB, new PacketRemapper() { @Override @@ -96,7 +92,7 @@ public class EntityPackets1_15 extends EntityRewriter { handler(wrapper -> { int type = wrapper.get(Type.VAR_INT, 1); EntityType entityType = Entity1_15Types.getTypeFromId(type); - addTrackedEntity(wrapper, wrapper.get(Type.VAR_INT, 0), entityType); + tracker(wrapper.user()).addEntity(wrapper.get(Type.VAR_INT, 0), entityType); wrapper.set(Type.VAR_INT, 1, EntityTypeMapping.getOldEntityId(type)); }); } @@ -130,9 +126,9 @@ public class EntityPackets1_15 extends EntityRewriter { } }); - registerExtraTracker(ClientboundPackets1_15.SPAWN_EXPERIENCE_ORB, Entity1_15Types.EXPERIENCE_ORB); - registerExtraTracker(ClientboundPackets1_15.SPAWN_GLOBAL_ENTITY, Entity1_15Types.LIGHTNING_BOLT); - registerExtraTracker(ClientboundPackets1_15.SPAWN_PAINTING, Entity1_15Types.PAINTING); + registerTracker(ClientboundPackets1_15.SPAWN_EXPERIENCE_ORB, Entity1_15Types.EXPERIENCE_ORB); + registerTracker(ClientboundPackets1_15.SPAWN_GLOBAL_ENTITY, Entity1_15Types.LIGHTNING_BOLT); + registerTracker(ClientboundPackets1_15.SPAWN_PAINTING, Entity1_15Types.PAINTING); protocol.registerClientbound(ClientboundPackets1_15.SPAWN_PLAYER, new PacketRemapper() { @Override @@ -150,7 +146,7 @@ public class EntityPackets1_15 extends EntityRewriter { } }); - registerEntityDestroy(ClientboundPackets1_15.DESTROY_ENTITIES); + registerRemoveEntities(ClientboundPackets1_15.DESTROY_ENTITIES); registerMetadataRewriter(ClientboundPackets1_15.ENTITY_METADATA, Types1_14.METADATA_LIST); // Attributes (get rid of generic.flyingSpeed for the Bee remap) @@ -161,7 +157,7 @@ public class EntityPackets1_15 extends EntityRewriter { map(Type.INT); handler(wrapper -> { int entityId = wrapper.get(Type.VAR_INT, 0); - EntityType entityType = getEntityType(wrapper.user(), entityId); + EntityType entityType = tracker(wrapper.user()).entityType(entityId); if (entityType != Entity1_15Types.BEE) return; int size = wrapper.get(Type.INT, 0); @@ -199,62 +195,35 @@ public class EntityPackets1_15 extends EntityRewriter { @Override protected void registerRewrites() { - registerMetaHandler().handle(e -> { - Metadata meta = e.getData(); - MetaType type = meta.getMetaType(); - if (type == MetaType1_14.Slot) { - Item item = (Item) meta.getValue(); - meta.setValue(protocol.getBlockItemPackets().handleItemToClient(item)); - } else if (type == MetaType1_14.BlockID) { - int blockstate = (int) meta.getValue(); - meta.setValue(protocol.getMappingData().getNewBlockStateId(blockstate)); - } else if (type == MetaType1_14.PARTICLE) { - rewriteParticle((Particle) meta.getValue()); - } - return meta; - }); + registerMetaTypeHandler(MetaType1_14.Slot, MetaType1_14.BlockID, MetaType1_14.PARTICLE, null); - registerMetaHandler().filter(Entity1_15Types.LIVINGENTITY, true).handle(e -> { - int index = e.getIndex(); - if (index == 12) { - throw RemovedValueException.EX; - } else if (index > 12) { - e.getData().setId(index - 1); - } - return e.getData(); - }); + filter().filterFamily(Entity1_15Types.LIVINGENTITY).removeIndex(12); - registerMetaHandler().filter(Entity1_15Types.BEE, 15).removed(); - registerMetaHandler().filter(Entity1_15Types.BEE, 16).removed(); + filter().type(Entity1_15Types.BEE).cancel(15); + filter().type(Entity1_15Types.BEE).cancel(16); - mapEntity(Entity1_15Types.BEE, Entity1_15Types.PUFFERFISH).jsonName("Bee").spawnMetadata(storage -> { + mapEntityTypeWithData(Entity1_15Types.BEE, Entity1_15Types.PUFFERFISH).jsonName("Bee").spawnMetadata(storage -> { storage.add(new Metadata(14, MetaType1_14.Boolean, false)); storage.add(new Metadata(15, MetaType1_14.VarInt, 2)); }); - registerMetaHandler().filter(Entity1_15Types.ENDERMAN, 16).removed(); - registerMetaHandler().filter(Entity1_15Types.TRIDENT, 10).removed(); + filter().type(Entity1_15Types.ENDERMAN).cancel(16); + filter().type(Entity1_15Types.TRIDENT).cancel(10); - registerMetaHandler().filter(Entity1_15Types.WOLF).handle(e -> { - int index = e.getIndex(); - if (index >= 17) { - e.getData().setId(index + 1); // redundant health removed in 1.15 - } - return e.getData(); - }); - registerMetaHandler().filter(Entity1_15Types.WOLF, 8).handle(e -> { - e.createMeta(new Metadata(17/*WOLF_HEALTH*/, MetaType1_14.Float, e.getData().getValue())); - return e.getData(); + // Redundant health removed in 1.15 + filter().type(Entity1_15Types.WOLF).addIndex(17); + filter().type(Entity1_15Types.WOLF).index(8).handler((event, meta) -> { + event.createExtraMeta(new Metadata(17/*WOLF_HEALTH*/, MetaType1_14.Float, event.meta().value())); }); } @Override - protected EntityType getTypeFromId(int typeId) { + public EntityType typeFromId(int typeId) { return Entity1_15Types.getTypeFromId(typeId); } @Override - public int getOldEntityId(final int newId) { + public int newEntityId(final int newId) { return EntityTypeMapping.getOldEntityId(newId); } } diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_14to1_14_1/Protocol1_14To1_14_1.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_14to1_14_1/Protocol1_14To1_14_1.java index b9878fa7..bceb138e 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_14to1_14_1/Protocol1_14To1_14_1.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_14to1_14_1/Protocol1_14To1_14_1.java @@ -20,6 +20,8 @@ package com.viaversion.viabackwards.protocol.protocol1_14to1_14_1; import com.viaversion.viabackwards.api.BackwardsProtocol; import com.viaversion.viabackwards.protocol.protocol1_14to1_14_1.packets.EntityPackets1_14_1; import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.minecraft.entities.Entity1_15Types; +import com.viaversion.viaversion.data.entity.EntityTrackerBase; import com.viaversion.viaversion.protocols.protocol1_14to1_13_2.ClientboundPackets1_14; import com.viaversion.viaversion.protocols.protocol1_14to1_13_2.ServerboundPackets1_14; @@ -36,6 +38,6 @@ public class Protocol1_14To1_14_1 extends BackwardsProtocol { public EntityPackets1_14_1(Protocol1_14To1_14_1 protocol) { @@ -37,12 +39,12 @@ public class EntityPackets1_14_1 extends LegacyEntityRewriter metadata = wrapper.get(Types1_14.METADATA_LIST, 0); + handleMetadata(entityId, metadata, wrapper.user()); } }); } @@ -94,13 +96,13 @@ public class EntityPackets1_14_1 extends LegacyEntityRewriter { map(Type.BYTE); // 7 - Yaw map(Type.INT); // 8 - Data handler(wrapper -> { - EntityType entityType = getTypeFromId(wrapper.get(Type.VAR_INT, 1)); + EntityType entityType = typeFromId(wrapper.get(Type.VAR_INT, 1)); if (entityType == Entity1_16Types.LIGHTNING_BOLT) { // Map to old weather entity packet wrapper.cancel(); @@ -89,7 +88,7 @@ public class EntityPackets1_16 extends EntityRewriter { spawnLightningPacket.send(Protocol1_15_2To1_16.class, true, true); } }); - handler(getSpawnTracketWithDataHandler(Entity1_16Types.FALLING_BLOCK)); + handler(getSpawnTrackerWithDataHandler(Entity1_16Types.FALLING_BLOCK)); } }); @@ -156,7 +155,7 @@ public class EntityPackets1_16 extends EntityRewriter { handler(wrapper -> { ClientWorld clientChunks = wrapper.user().get(ClientWorld.class); clientChunks.setEnvironment(wrapper.get(Type.INT, 1)); - getEntityTracker(wrapper.user()).trackEntityType(wrapper.get(Type.INT, 0), Entity1_16Types.PLAYER); + tracker(wrapper.user()).addEntity(wrapper.get(Type.INT, 0), Entity1_16Types.PLAYER); wrapper.write(Type.STRING, "default"); // Level type @@ -172,11 +171,11 @@ public class EntityPackets1_16 extends EntityRewriter { } }); - registerExtraTracker(ClientboundPackets1_16.SPAWN_EXPERIENCE_ORB, Entity1_16Types.EXPERIENCE_ORB); + registerTracker(ClientboundPackets1_16.SPAWN_EXPERIENCE_ORB, Entity1_16Types.EXPERIENCE_ORB); // F Spawn Global Object, it is no longer with us :( - registerExtraTracker(ClientboundPackets1_16.SPAWN_PAINTING, Entity1_16Types.PAINTING); - registerExtraTracker(ClientboundPackets1_16.SPAWN_PLAYER, Entity1_16Types.PLAYER); - registerEntityDestroy(ClientboundPackets1_16.DESTROY_ENTITIES); + registerTracker(ClientboundPackets1_16.SPAWN_PAINTING, Entity1_16Types.PAINTING); + registerTracker(ClientboundPackets1_16.SPAWN_PLAYER, Entity1_16Types.PLAYER); + registerRemoveEntities(ClientboundPackets1_16.DESTROY_ENTITIES); registerMetadataRewriter(ClientboundPackets1_16.ENTITY_METADATA, Types1_14.METADATA_LIST); protocol.registerClientbound(ClientboundPackets1_16.ENTITY_PROPERTIES, new PacketRemapper() { @@ -244,9 +243,8 @@ public class EntityPackets1_16 extends EntityRewriter { @Override protected void registerRewrites() { - registerMetaHandler().handle(e -> { - Metadata meta = e.getData(); - MetaType type = meta.getMetaType(); + filter().handler((event, meta) -> { + MetaType type = meta.metaType(); if (type == MetaType1_14.Slot) { meta.setValue(protocol.getBlockItemPackets().handleItemToClient((Item) meta.getValue())); } else if (type == MetaType1_14.BlockID) { @@ -254,52 +252,49 @@ public class EntityPackets1_16 extends EntityRewriter { } else if (type == MetaType1_14.PARTICLE) { rewriteParticle((Particle) meta.getValue()); } else if (type == MetaType1_14.OptChat) { - JsonElement text = meta.getCastedValue(); + JsonElement text = meta.value(); if (text != null) { protocol.getTranslatableRewriter().processText(text); } } - return meta; }); - mapEntityDirect(Entity1_16Types.ZOMBIFIED_PIGLIN, Entity1_15Types.ZOMBIE_PIGMAN); + mapEntityType(Entity1_16Types.ZOMBIFIED_PIGLIN, Entity1_15Types.ZOMBIE_PIGMAN); mapTypes(Entity1_16Types.values(), Entity1_15Types.class); - mapEntity(Entity1_16Types.HOGLIN, Entity1_16Types.COW).jsonName("Hoglin"); - mapEntity(Entity1_16Types.ZOGLIN, Entity1_16Types.COW).jsonName("Zoglin"); - mapEntity(Entity1_16Types.PIGLIN, Entity1_16Types.ZOMBIFIED_PIGLIN).jsonName("Piglin"); - mapEntity(Entity1_16Types.STRIDER, Entity1_16Types.MAGMA_CUBE).jsonName("Strider"); + mapEntityTypeWithData(Entity1_16Types.HOGLIN, Entity1_16Types.COW).jsonName("Hoglin"); + mapEntityTypeWithData(Entity1_16Types.ZOGLIN, Entity1_16Types.COW).jsonName("Zoglin"); + mapEntityTypeWithData(Entity1_16Types.PIGLIN, Entity1_16Types.ZOMBIFIED_PIGLIN).jsonName("Piglin"); + mapEntityTypeWithData(Entity1_16Types.STRIDER, Entity1_16Types.MAGMA_CUBE).jsonName("Strider"); - registerMetaHandler().filter(Entity1_16Types.ZOGLIN, 16).removed(); - registerMetaHandler().filter(Entity1_16Types.HOGLIN, 15).removed(); + filter().type(Entity1_16Types.ZOGLIN).cancel(16); + filter().type(Entity1_16Types.HOGLIN).cancel(15); - registerMetaHandler().filter(Entity1_16Types.PIGLIN, 16).removed(); - registerMetaHandler().filter(Entity1_16Types.PIGLIN, 17).removed(); - registerMetaHandler().filter(Entity1_16Types.PIGLIN, 18).removed(); + filter().type(Entity1_16Types.PIGLIN).cancel(16); + filter().type(Entity1_16Types.PIGLIN).cancel(17); + filter().type(Entity1_16Types.PIGLIN).cancel(18); - registerMetaHandler().filter(Entity1_16Types.STRIDER, 15).handle(meta -> { - boolean baby = meta.getData().getCastedValue(); - meta.getData().setValue(baby ? 1 : 3); - meta.getData().setMetaType(MetaType1_14.VarInt); - return meta.getData(); + filter().type(Entity1_16Types.STRIDER).index(15).handler((event, meta) -> { + boolean baby = meta.value(); + meta.setValue(baby ? 1 : 3); + meta.setMetaType(MetaType1_14.VarInt); }); - registerMetaHandler().filter(Entity1_16Types.STRIDER, 16).removed(); - registerMetaHandler().filter(Entity1_16Types.STRIDER, 17).removed(); - registerMetaHandler().filter(Entity1_16Types.STRIDER, 18).removed(); + filter().type(Entity1_16Types.STRIDER).cancel(16); + filter().type(Entity1_16Types.STRIDER).cancel(17); + filter().type(Entity1_16Types.STRIDER).cancel(18); - registerMetaHandler().filter(Entity1_16Types.FISHING_BOBBER, 8).removed(); + filter().type(Entity1_16Types.FISHING_BOBBER).cancel(8); - registerMetaHandler().filter(Entity1_16Types.ABSTRACT_ARROW, true, 8).removed(); - registerMetaHandler().filter(Entity1_16Types.ABSTRACT_ARROW, true).handle(meta -> { - if (meta.getIndex() >= 8) { - meta.getData().setId(meta.getIndex() + 1); + filter().filterFamily(Entity1_16Types.ABSTRACT_ARROW).cancel(8); + filter().filterFamily(Entity1_16Types.ABSTRACT_ARROW).handler((event, meta) -> { + if (event.index() >= 8) { + event.setIndex(event.index() + 1); // TODO is this right...? } - return meta.getData(); }); } @Override - protected EntityType getTypeFromId(int typeId) { + public EntityType typeFromId(int typeId) { return Entity1_16Types.getTypeFromId(typeId); } } diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_16_1to1_16_2/Protocol1_16_1To1_16_2.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_16_1to1_16_2/Protocol1_16_1To1_16_2.java index f1e7af3a..8ee516cf 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_16_1to1_16_2/Protocol1_16_1To1_16_2.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_16_1to1_16_2/Protocol1_16_1To1_16_2.java @@ -25,10 +25,12 @@ import com.viaversion.viabackwards.protocol.protocol1_16_1to1_16_2.data.CommandR import com.viaversion.viabackwards.protocol.protocol1_16_1to1_16_2.packets.BlockItemPackets1_16_2; import com.viaversion.viabackwards.protocol.protocol1_16_1to1_16_2.packets.EntityPackets1_16_2; import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.minecraft.entities.Entity1_16_2Types; import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; import com.viaversion.viaversion.api.protocol.remapper.PacketHandler; import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper; import com.viaversion.viaversion.api.type.Type; +import com.viaversion.viaversion.data.entity.EntityTrackerBase; import com.viaversion.viaversion.libs.gson.JsonElement; import com.viaversion.viaversion.protocols.protocol1_16_2to1_16_1.ClientboundPackets1_16_2; import com.viaversion.viaversion.protocols.protocol1_16_2to1_16_1.Protocol1_16_2To1_16_1; @@ -127,14 +129,14 @@ public class Protocol1_16_1To1_16_2 extends BackwardsProtocol @Override protected void registerPackets() { - registerSpawnTrackerWithData(ClientboundPackets1_16_2.SPAWN_ENTITY, Entity1_16_2Types.FALLING_BLOCK); + registerTrackerWithData(ClientboundPackets1_16_2.SPAWN_ENTITY, Entity1_16_2Types.FALLING_BLOCK); registerSpawnTracker(ClientboundPackets1_16_2.SPAWN_MOB); - registerExtraTracker(ClientboundPackets1_16_2.SPAWN_EXPERIENCE_ORB, Entity1_16_2Types.EXPERIENCE_ORB); - registerExtraTracker(ClientboundPackets1_16_2.SPAWN_PAINTING, Entity1_16_2Types.PAINTING); - registerExtraTracker(ClientboundPackets1_16_2.SPAWN_PLAYER, Entity1_16_2Types.PLAYER); - registerEntityDestroy(ClientboundPackets1_16_2.DESTROY_ENTITIES); + registerTracker(ClientboundPackets1_16_2.SPAWN_EXPERIENCE_ORB, Entity1_16_2Types.EXPERIENCE_ORB); + registerTracker(ClientboundPackets1_16_2.SPAWN_PAINTING, Entity1_16_2Types.PAINTING); + registerTracker(ClientboundPackets1_16_2.SPAWN_PLAYER, Entity1_16_2Types.PLAYER); + registerRemoveEntities(ClientboundPackets1_16_2.DESTROY_ENTITIES); registerMetadataRewriter(ClientboundPackets1_16_2.ENTITY_METADATA, Types1_14.METADATA_LIST); protocol.registerClientbound(ClientboundPackets1_16_2.JOIN_GAME, new PacketRemapper() { @@ -109,39 +104,17 @@ public class EntityPackets1_16_2 extends EntityRewriter @Override protected void registerRewrites() { - registerMetaHandler().handle(e -> { - Metadata meta = e.getData(); - MetaType type = meta.getMetaType(); - if (type == MetaType1_14.Slot) { - meta.setValue(protocol.getBlockItemPackets().handleItemToClient((Item) meta.getValue())); - } else if (type == MetaType1_14.BlockID) { - meta.setValue(protocol.getMappingData().getNewBlockStateId((int) meta.getValue())); - } else if (type == MetaType1_14.OptChat) { - JsonElement text = meta.getCastedValue(); - if (text != null) { - protocol.getTranslatableRewriter().processText(text); - } - } else if (type == MetaType1_14.PARTICLE) { - rewriteParticle((Particle) meta.getValue()); - } - return meta; - }); + registerMetaTypeHandler(MetaType1_14.Slot, MetaType1_14.BlockID, MetaType1_14.PARTICLE, MetaType1_14.OptChat); mapTypes(Entity1_16_2Types.values(), Entity1_16Types.class); - mapEntity(Entity1_16_2Types.PIGLIN_BRUTE, Entity1_16_2Types.PIGLIN).jsonName("Piglin Brute"); + mapEntityTypeWithData(Entity1_16_2Types.PIGLIN_BRUTE, Entity1_16_2Types.PIGLIN).jsonName("Piglin Brute"); - registerMetaHandler().filter(Entity1_16_2Types.ABSTRACT_PIGLIN, true).handle(meta -> { - if (meta.getIndex() == 15) { - meta.getData().setId(16); - } else if (meta.getIndex() == 16) { - meta.getData().setId(15); - } - return meta.getData(); - }); + filter().filterFamily(Entity1_16_2Types.ABSTRACT_PIGLIN).index(15).toIndex(16); + filter().filterFamily(Entity1_16_2Types.ABSTRACT_PIGLIN).index(16).toIndex(15); } @Override - protected EntityType getTypeFromId(int typeId) { + public EntityType typeFromId(int typeId) { return Entity1_16_2Types.getTypeFromId(typeId); } } diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_16_4to1_17/Protocol1_16_4To1_17.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_16_4to1_17/Protocol1_16_4To1_17.java index a79b9022..db697f0f 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_16_4to1_17/Protocol1_16_4To1_17.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_16_4to1_17/Protocol1_16_4To1_17.java @@ -24,9 +24,11 @@ import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter; import com.viaversion.viabackwards.protocol.protocol1_16_4to1_17.packets.BlockItemPackets1_17; import com.viaversion.viabackwards.protocol.protocol1_16_4to1_17.packets.EntityPackets1_17; import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.minecraft.entities.Entity1_17Types; import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper; import com.viaversion.viaversion.api.type.Type; +import com.viaversion.viaversion.data.entity.EntityTrackerBase; import com.viaversion.viaversion.libs.fastutil.ints.IntArrayList; import com.viaversion.viaversion.libs.fastutil.ints.IntList; import com.viaversion.viaversion.protocols.protocol1_16_2to1_16_1.ClientboundPackets1_16_2; @@ -79,7 +81,7 @@ public class Protocol1_16_4To1_17 extends BackwardsProtocol { - EntityTracker tracker = wrapper.user().get(EntityTracker.class); - int startFromSection = Math.max(0, -(tracker.getCurrentMinY() >> 4)); + EntityTracker tracker = wrapper.user().getEntityTracker(Protocol1_16_4To1_17.class); + int startFromSection = Math.max(0, -(tracker.currentMinY() >> 4)); long[] skyLightMask = wrapper.read(Type.LONG_ARRAY_PRIMITIVE); long[] blockLightMask = wrapper.read(Type.LONG_ARRAY_PRIMITIVE); @@ -158,8 +158,8 @@ public class BlockItemPackets1_17 extends com.viaversion.viabackwards.api.rewrit wrapper.write(Type.VAR_INT, cutLightMask(emptySkyLightMask, startFromSection)); wrapper.write(Type.VAR_INT, cutLightMask(emptyBlockLightMask, startFromSection)); - writeLightArrays(wrapper, BitSet.valueOf(skyLightMask), cutSkyLightMask, startFromSection, tracker.getCurrentWorldSectionHeight()); - writeLightArrays(wrapper, BitSet.valueOf(blockLightMask), cutBlockLightMask, startFromSection, tracker.getCurrentWorldSectionHeight()); + writeLightArrays(wrapper, BitSet.valueOf(skyLightMask), cutSkyLightMask, startFromSection, tracker.currentWorldSectionHeight()); + writeLightArrays(wrapper, BitSet.valueOf(blockLightMask), cutBlockLightMask, startFromSection, tracker.currentWorldSectionHeight()); }); } @@ -242,14 +242,14 @@ public class BlockItemPackets1_17 extends com.viaversion.viabackwards.api.rewrit @Override public void registerMap() { handler(wrapper -> { - EntityTracker tracker = wrapper.user().get(EntityTracker.class); - int currentWorldSectionHeight = tracker.getCurrentWorldSectionHeight(); + EntityTracker tracker = wrapper.user().getEntityTracker(Protocol1_16_4To1_17.class); + int currentWorldSectionHeight = tracker.currentWorldSectionHeight(); Chunk chunk = wrapper.read(new Chunk1_17Type(currentWorldSectionHeight)); wrapper.write(new Chunk1_16_2Type(), chunk); // Cut sections - int startFromSection = Math.max(0, -(tracker.getCurrentMinY() >> 4)); + int startFromSection = Math.max(0, -(tracker.currentMinY() >> 4)); chunk.setBiomeData(Arrays.copyOfRange(chunk.getBiomeData(), startFromSection * 64, (startFromSection * 64) + 1024)); chunk.setBitmask(cutMask(chunk.getChunkMask(), startFromSection, false)); diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_16_4to1_17/packets/EntityPackets1_17.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_16_4to1_17/packets/EntityPackets1_17.java index 5a2028ab..830b07fb 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_16_4to1_17/packets/EntityPackets1_17.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_16_4to1_17/packets/EntityPackets1_17.java @@ -23,16 +23,13 @@ import com.viaversion.viabackwards.protocol.protocol1_16_4to1_17.Protocol1_16_4T import com.viaversion.viaversion.api.minecraft.entities.Entity1_16_2Types; import com.viaversion.viaversion.api.minecraft.entities.Entity1_17Types; import com.viaversion.viaversion.api.minecraft.entities.EntityType; -import com.viaversion.viaversion.api.minecraft.item.Item; import com.viaversion.viaversion.api.minecraft.metadata.MetaType; -import com.viaversion.viaversion.api.minecraft.metadata.Metadata; import com.viaversion.viaversion.api.minecraft.metadata.types.MetaType1_14; import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper; import com.viaversion.viaversion.api.type.Type; import com.viaversion.viaversion.api.type.types.Particle; import com.viaversion.viaversion.api.type.types.version.Types1_14; import com.viaversion.viaversion.api.type.types.version.Types1_17; -import com.viaversion.viaversion.libs.gson.JsonElement; import com.viaversion.viaversion.libs.opennbt.tag.builtin.CompoundTag; import com.viaversion.viaversion.libs.opennbt.tag.builtin.IntTag; import com.viaversion.viaversion.libs.opennbt.tag.builtin.ListTag; @@ -49,11 +46,11 @@ public class EntityPackets1_17 extends EntityRewriter { @Override protected void registerPackets() { - registerSpawnTrackerWithData(ClientboundPackets1_17.SPAWN_ENTITY, Entity1_16_2Types.FALLING_BLOCK); + registerTrackerWithData(ClientboundPackets1_17.SPAWN_ENTITY, Entity1_16_2Types.FALLING_BLOCK); registerSpawnTracker(ClientboundPackets1_17.SPAWN_MOB); - registerExtraTracker(ClientboundPackets1_17.SPAWN_EXPERIENCE_ORB, Entity1_16_2Types.EXPERIENCE_ORB); - registerExtraTracker(ClientboundPackets1_17.SPAWN_PAINTING, Entity1_16_2Types.PAINTING); - registerExtraTracker(ClientboundPackets1_17.SPAWN_PLAYER, Entity1_16_2Types.PLAYER); + registerTracker(ClientboundPackets1_17.SPAWN_EXPERIENCE_ORB, Entity1_16_2Types.EXPERIENCE_ORB); + registerTracker(ClientboundPackets1_17.SPAWN_PAINTING, Entity1_16_2Types.PAINTING); + registerTracker(ClientboundPackets1_17.SPAWN_PLAYER, Entity1_16_2Types.PLAYER); registerMetadataRewriter(ClientboundPackets1_17.ENTITY_METADATA, Types1_17.METADATA_LIST, Types1_14.METADATA_LIST); protocol.registerClientbound(ClientboundPackets1_17.REMOVE_ENTITY, ClientboundPackets1_16_2.DESTROY_ENTITIES, new PacketRemapper() { @@ -61,7 +58,7 @@ public class EntityPackets1_17 extends EntityRewriter { public void registerMap() { handler(wrapper -> { int entityId = wrapper.read(Type.VAR_INT); - getEntityTracker(wrapper.user()).removeEntity(entityId); + tracker(wrapper.user()).removeEntity(entityId); // Write into single value array int[] array = {entityId}; @@ -87,7 +84,7 @@ public class EntityPackets1_17 extends EntityRewriter { } }); handler(getTrackerHandler(Entity1_16_2Types.PLAYER, Type.INT)); - handler(getWorldDataTracker(1)); + handler(worldDataTrackerHandler(1)); handler(wrapper -> { CompoundTag registry = wrapper.get(Type.NBT, 0); CompoundTag biomeRegsitry = registry.get("minecraft:worldgen/biome"); @@ -116,10 +113,8 @@ public class EntityPackets1_17 extends EntityRewriter { @Override public void registerMap() { map(Type.NBT); // Dimension data - handler(getWorldDataTracker(0)); - handler(wrapper -> { - reduceExtendedHeight(wrapper.get(Type.NBT, 0), true); - }); + handler(worldDataTrackerHandler(0)); + handler(wrapper -> reduceExtendedHeight(wrapper.get(Type.NBT, 0), true)); } }); @@ -157,21 +152,11 @@ public class EntityPackets1_17 extends EntityRewriter { @Override protected void registerRewrites() { - registerMetaHandler().handle(e -> { - Metadata meta = e.getData(); - meta.setMetaType(MetaType1_14.byId(meta.getMetaType().getTypeID())); + filter().handler((event, meta) -> { + meta.setMetaType(MetaType1_14.byId(meta.metaType().typeId())); - MetaType type = meta.getMetaType(); - if (type == MetaType1_14.Slot) { - meta.setValue(protocol.getBlockItemPackets().handleItemToClient((Item) meta.getValue())); - } else if (type == MetaType1_14.BlockID) { - meta.setValue(protocol.getMappingData().getNewBlockStateId((int) meta.getValue())); - } else if (type == MetaType1_14.OptChat) { - JsonElement text = meta.getCastedValue(); - if (text != null) { - protocol.getTranslatableRewriter().processText(text); - } - } else if (type == MetaType1_14.PARTICLE) { + MetaType type = meta.metaType(); + if (type == MetaType1_14.PARTICLE) { Particle particle = (Particle) meta.getValue(); if (particle.getId() == 15) { // Dust / Dust Transition // Remove transition target color values 4-6 @@ -180,55 +165,46 @@ public class EntityPackets1_17 extends EntityRewriter { // No nice mapping possible without tracking entity positions and doing particle tasks particle.setId(0); particle.getArguments().clear(); - return meta; + return; } rewriteParticle(particle); } else if (type == MetaType1_14.Pose) { // Goat LONG_JUMP added at 6 - int pose = meta.getCastedValue(); + int pose = meta.value(); if (pose == 6) { meta.setValue(1); // FALL_FLYING } else if (pose > 6) { meta.setValue(pose - 1); } } - return meta; }); + // Particles have already been handled + registerMetaTypeHandler(MetaType1_14.Slot, MetaType1_14.BlockID, null, MetaType1_14.OptChat); + mapTypes(Entity1_17Types.values(), Entity1_16_2Types.class); - registerMetaHandler().filter(Entity1_17Types.AXOLOTL, 17).removed(); - registerMetaHandler().filter(Entity1_17Types.AXOLOTL, 18).removed(); - registerMetaHandler().filter(Entity1_17Types.AXOLOTL, 19).removed(); + filter().type(Entity1_17Types.AXOLOTL).cancel(17); + filter().type(Entity1_17Types.AXOLOTL).cancel(18); + filter().type(Entity1_17Types.AXOLOTL).cancel(19); - registerMetaHandler().filter(Entity1_17Types.GLOW_SQUID, 16).removed(); + filter().type(Entity1_17Types.GLOW_SQUID).cancel(16); - registerMetaHandler().filter(Entity1_17Types.GOAT, 17).removed(); + filter().type(Entity1_17Types.GOAT).cancel(17); - mapEntity(Entity1_17Types.AXOLOTL, Entity1_17Types.TROPICAL_FISH).jsonName("Axolotl"); - mapEntity(Entity1_17Types.GOAT, Entity1_17Types.SHEEP).jsonName("Goat"); + mapEntityTypeWithData(Entity1_17Types.AXOLOTL, Entity1_17Types.TROPICAL_FISH).jsonName("Axolotl"); + mapEntityTypeWithData(Entity1_17Types.GOAT, Entity1_17Types.SHEEP).jsonName("Goat"); - mapEntity(Entity1_17Types.GLOW_SQUID, Entity1_17Types.SQUID).jsonName("Glow Squid"); - mapEntity(Entity1_17Types.GLOW_ITEM_FRAME, Entity1_17Types.ITEM_FRAME); + mapEntityTypeWithData(Entity1_17Types.GLOW_SQUID, Entity1_17Types.SQUID).jsonName("Glow Squid"); + mapEntityTypeWithData(Entity1_17Types.GLOW_ITEM_FRAME, Entity1_17Types.ITEM_FRAME); - registerMetaHandler().filter(Entity1_17Types.SHULKER).handle(meta -> { - if (meta.getIndex() >= 17) { - meta.getData().setId(meta.getIndex() + 1); // TODO Handle attachment pos? - } - return meta.getData(); - }); + filter().type(Entity1_17Types.SHULKER).addIndex(17); // TODO Handle attachment pos? - registerMetaHandler().filter(7).removed(); // Ticks frozen - registerMetaHandler().handle(meta -> { - if (meta.getIndex() > 7) { - meta.getData().setId(meta.getIndex() - 1); - } - return meta.getData(); - }); + filter().removeIndex(7); // Ticks frozen } @Override - protected EntityType getTypeFromId(int typeId) { + public EntityType typeFromId(int typeId) { return Entity1_17Types.getTypeFromId(typeId); } diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_9_4to1_10/Protocol1_9_4To1_10.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_9_4to1_10/Protocol1_9_4To1_10.java index aedd32b7..99dbf5be 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_9_4to1_10/Protocol1_9_4To1_10.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_9_4to1_10/Protocol1_9_4To1_10.java @@ -24,10 +24,12 @@ import com.viaversion.viabackwards.api.rewriters.SoundRewriter; import com.viaversion.viabackwards.protocol.protocol1_9_4to1_10.packets.BlockItemPackets1_10; import com.viaversion.viabackwards.protocol.protocol1_9_4to1_10.packets.EntityPackets1_10; import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.minecraft.entities.Entity1_10Types; import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper; import com.viaversion.viaversion.api.protocol.remapper.ValueTransformer; import com.viaversion.viaversion.api.type.Type; +import com.viaversion.viaversion.data.entity.EntityTrackerBase; import com.viaversion.viaversion.protocols.protocol1_9_3to1_9_1_2.ClientboundPackets1_9_3; import com.viaversion.viaversion.protocols.protocol1_9_3to1_9_1_2.ServerboundPackets1_9_3; import com.viaversion.viaversion.protocols.protocol1_9_3to1_9_1_2.storage.ClientWorld; @@ -94,7 +96,7 @@ public class Protocol1_9_4To1_10 extends BackwardsProtocol { - Metadata data = e.getData(); - - if (data.getMetaType().getType().equals(Type.ITEM)) // Is Item - data.setValue(handleItemToClient((Item) data.getValue())); - - return data; + protocol.getEntityPackets().filter().handler((event, meta) -> { + if (meta.metaType().type().equals(Type.ITEM)) // Is Item + meta.setValue(handleItemToClient((Item) meta.getValue())); }); // Particle diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_9_4to1_10/packets/EntityPackets1_10.java b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_9_4to1_10/packets/EntityPackets1_10.java index dec490cd..25f7481b 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_9_4to1_10/packets/EntityPackets1_10.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/protocol1_9_4to1_10/packets/EntityPackets1_10.java @@ -19,8 +19,7 @@ package com.viaversion.viabackwards.protocol.protocol1_9_4to1_10.packets; import com.viaversion.viabackwards.api.entities.storage.EntityData; -import com.viaversion.viabackwards.api.entities.storage.MetaStorage; -import com.viaversion.viabackwards.api.exceptions.RemovedValueException; +import com.viaversion.viabackwards.api.entities.storage.WrappedMetadata; import com.viaversion.viabackwards.api.rewriters.LegacyEntityRewriter; import com.viaversion.viabackwards.protocol.protocol1_9_4to1_10.Protocol1_9_4To1_10; import com.viaversion.viabackwards.utils.Block; @@ -37,6 +36,7 @@ import com.viaversion.viaversion.api.type.Type; import com.viaversion.viaversion.api.type.types.version.Types1_9; import com.viaversion.viaversion.protocols.protocol1_9_3to1_9_1_2.ClientboundPackets1_9_3; +import java.util.List; import java.util.Optional; public class EntityPackets1_10 extends LegacyEntityRewriter { @@ -74,7 +74,7 @@ public class EntityPackets1_10 extends LegacyEntityRewriter int objType = objectData & 4095; int data = objectData >> 12 & 15; - Block block = getProtocol().getBlockItemPackets().handleBlock(objType, data); + Block block = protocol.getBlockItemPackets().handleBlock(objType, data); if (block == null) return; @@ -85,8 +85,8 @@ public class EntityPackets1_10 extends LegacyEntityRewriter } }); - registerExtraTracker(ClientboundPackets1_9_3.SPAWN_EXPERIENCE_ORB, Entity1_10Types.EntityType.EXPERIENCE_ORB); - registerExtraTracker(ClientboundPackets1_9_3.SPAWN_GLOBAL_ENTITY, Entity1_10Types.EntityType.WEATHER); + registerTracker(ClientboundPackets1_9_3.SPAWN_EXPERIENCE_ORB, Entity1_10Types.EntityType.EXPERIENCE_ORB); + registerTracker(ClientboundPackets1_9_3.SPAWN_GLOBAL_ENTITY, Entity1_10Types.EntityType.WEATHER); protocol.registerClientbound(ClientboundPackets1_9_3.SPAWN_MOB, new PacketRemapper() { @Override @@ -113,35 +113,25 @@ public class EntityPackets1_10 extends LegacyEntityRewriter @Override public void handle(PacketWrapper wrapper) throws Exception { int entityId = wrapper.get(Type.VAR_INT, 0); - EntityType type = getEntityType(wrapper.user(), entityId); + EntityType type = tracker(wrapper.user()).entityType(entityId); - MetaStorage storage = new MetaStorage(wrapper.get(Types1_9.METADATA_LIST, 0)); - handleMeta( - wrapper.user(), - wrapper.get(Type.VAR_INT, 0), - storage - ); + List metadata = wrapper.get(Types1_9.METADATA_LIST, 0); + handleMetadata(wrapper.get(Type.VAR_INT, 0), metadata, wrapper.user()); - EntityData entityData = getEntityData(type); + EntityData entityData = entityDataForType(type); if (entityData != null) { - wrapper.set(Type.UNSIGNED_BYTE, 0, (short) entityData.getReplacementId()); + WrappedMetadata storage = new WrappedMetadata(metadata); + wrapper.set(Type.UNSIGNED_BYTE, 0, (short) entityData.replacementId()); if (entityData.hasBaseMeta()) - entityData.getDefaultMeta().createMeta(storage); + entityData.defaultMeta().createMeta(storage); } - - // Rewrite Metadata - wrapper.set( - Types1_9.METADATA_LIST, - 0, - storage.getMetaDataList() - ); } }); } }); - registerExtraTracker(ClientboundPackets1_9_3.SPAWN_PAINTING, Entity1_10Types.EntityType.PAINTING); + registerTracker(ClientboundPackets1_9_3.SPAWN_PAINTING, Entity1_10Types.EntityType.PAINTING); registerJoinGame(ClientboundPackets1_9_3.JOIN_GAME, Entity1_10Types.EntityType.PLAYER); registerRespawn(ClientboundPackets1_9_3.RESPAWN); @@ -161,61 +151,43 @@ public class EntityPackets1_10 extends LegacyEntityRewriter } }); - registerEntityDestroy(ClientboundPackets1_9_3.DESTROY_ENTITIES); + registerRemoveEntities(ClientboundPackets1_9_3.DESTROY_ENTITIES); registerMetadataRewriter(ClientboundPackets1_9_3.ENTITY_METADATA, Types1_9.METADATA_LIST); } @Override protected void registerRewrites() { - mapEntity(Entity1_10Types.EntityType.POLAR_BEAR, Entity1_10Types.EntityType.SHEEP).mobName("Polar Bear"); + mapEntityTypeWithData(Entity1_10Types.EntityType.POLAR_BEAR, Entity1_10Types.EntityType.SHEEP).mobName("Polar Bear"); // Change the sheep color when the polar bear is standing up (index 13 -> Standing up) - registerMetaHandler().filter(Entity1_10Types.EntityType.POLAR_BEAR, 13).handle((e -> { - Metadata data = e.getData(); - boolean b = (boolean) data.getValue(); + filter().type(Entity1_10Types.EntityType.POLAR_BEAR).index(13).handler((event, meta) -> { + boolean b = (boolean) meta.getValue(); - data.setMetaType(MetaType1_9.Byte); - data.setValue(b ? (byte) (14 & 0x0F) : (byte) (0)); - - return data; - })); + meta.setMetaType(MetaType1_9.Byte); + meta.setValue(b ? (byte) (14 & 0x0F) : (byte) (0)); + }); // Handle husk (index 13 -> Zombie Type) - registerMetaHandler().filter(Entity1_10Types.EntityType.ZOMBIE, 13).handle(e -> { - Metadata data = e.getData(); - - if ((int) data.getValue() == 6) // Is type Husk - data.setValue(0); - - return data; + filter().type(Entity1_10Types.EntityType.ZOMBIE).index(13).handler((event, meta) -> { + if ((int) meta.getValue() == 6) { // Is type Husk + meta.setValue(0); + } }); // Handle Stray (index 12 -> Skeleton Type) - registerMetaHandler().filter(Entity1_10Types.EntityType.SKELETON, 12).handle(e -> { - Metadata data = e.getData(); - - if ((int) data.getValue() == 2) - data.setValue(0); // Change to default skeleton - - return data; + filter().type(Entity1_10Types.EntityType.SKELETON).index(12).handler((event, meta) -> { + if ((int) meta.getValue() == 2) { + meta.setValue(0); // Change to default skeleton + } }); // Handle the missing NoGravity tag for every metadata - registerMetaHandler().handle(e -> { - Metadata data = e.getData(); - - if (data.getId() == 5) - throw RemovedValueException.EX; - else if (data.getId() >= 5) - data.setId(data.getId() - 1); - - return data; - }); + filter().removeIndex(5); } @Override - protected EntityType getTypeFromId(int typeId) { + public EntityType typeFromId(int typeId) { return Entity1_10Types.getTypeFromId(typeId, false); }