diff --git a/api/src/main/java/com/viaversion/viaversion/api/ViaAPI.java b/api/src/main/java/com/viaversion/viaversion/api/ViaAPI.java index a353ad848..02eeed480 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/ViaAPI.java +++ b/api/src/main/java/com/viaversion/viaversion/api/ViaAPI.java @@ -64,7 +64,7 @@ public interface ViaAPI { * @return API version incremented with meaningful API changes */ default int apiVersion() { - return 11; + return 12; } /** diff --git a/api/src/main/java/com/viaversion/viaversion/api/data/FullMappingData.java b/api/src/main/java/com/viaversion/viaversion/api/data/FullMappings.java similarity index 96% rename from api/src/main/java/com/viaversion/viaversion/api/data/FullMappingData.java rename to api/src/main/java/com/viaversion/viaversion/api/data/FullMappings.java index b070deb9c..ef571026a 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/data/FullMappingData.java +++ b/api/src/main/java/com/viaversion/viaversion/api/data/FullMappings.java @@ -24,7 +24,10 @@ package com.viaversion.viaversion.api.data; import org.checkerframework.checker.nullness.qual.Nullable; -public interface FullMappingData { +/** + * Mappings containing the full string identifier mappings. + */ +public interface FullMappings { Mappings mappings(); diff --git a/api/src/main/java/com/viaversion/viaversion/api/data/FullMappingDataBase.java b/api/src/main/java/com/viaversion/viaversion/api/data/FullMappingsBase.java similarity index 94% rename from api/src/main/java/com/viaversion/viaversion/api/data/FullMappingDataBase.java rename to api/src/main/java/com/viaversion/viaversion/api/data/FullMappingsBase.java index ef3ef44c7..5d3095201 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/data/FullMappingDataBase.java +++ b/api/src/main/java/com/viaversion/viaversion/api/data/FullMappingsBase.java @@ -26,14 +26,14 @@ import com.google.gson.JsonArray; import it.unimi.dsi.fastutil.objects.Object2IntMap; import org.checkerframework.checker.nullness.qual.Nullable; -public class FullMappingDataBase implements FullMappingData { +public class FullMappingsBase implements FullMappings { private final Object2IntMap stringToId; private final Object2IntMap mappedStringToId; private final String[] idToString; private final String[] mappedIdToString; private final Mappings mappings; - public FullMappingDataBase(final JsonArray oldMappings, final JsonArray newMappings, final Mappings mappings) { + public FullMappingsBase(final JsonArray oldMappings, final JsonArray newMappings, final Mappings mappings) { this.mappings = mappings; stringToId = MappingDataLoader.arrayToMap(oldMappings); mappedStringToId = MappingDataLoader.arrayToMap(newMappings); diff --git a/api/src/main/java/com/viaversion/viaversion/api/data/Int2IntMapMappings.java b/api/src/main/java/com/viaversion/viaversion/api/data/Int2IntMapMappings.java new file mode 100644 index 000000000..e8f6fa19b --- /dev/null +++ b/api/src/main/java/com/viaversion/viaversion/api/data/Int2IntMapMappings.java @@ -0,0 +1,66 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2016-2022 ViaVersion and contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.viaversion.viaversion.api.data; + +import it.unimi.dsi.fastutil.ints.Int2IntMap; +import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; + +public class Int2IntMapMappings implements Mappings { + private final Int2IntMap mappings; + private final int mappedIds; + + protected Int2IntMapMappings(final Int2IntMap mappings, final int mappedIds) { + this.mappings = mappings; + this.mappedIds = mappedIds; + mappings.defaultReturnValue(-1); + } + + public static Int2IntMapMappings of(final Int2IntMap mappings, final int mappedIds) { + return new Int2IntMapMappings(mappings, mappedIds); + } + + public static Int2IntMapMappings of() { + + return new Int2IntMapMappings(new Int2IntOpenHashMap(), -1); + } + + @Override + public int getNewId(final int id) { + return mappings.get(id); + } + + @Override + public void setNewId(final int id, final int newId) { + mappings.put(id, newId); + } + + @Override + public int size() { + return mappings.size(); + } + + @Override + public int mappedSize() { + return mappedIds; + } +} diff --git a/api/src/main/java/com/viaversion/viaversion/api/data/MappingData.java b/api/src/main/java/com/viaversion/viaversion/api/data/MappingData.java index 07a2646db..9f04e4042 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/data/MappingData.java +++ b/api/src/main/java/com/viaversion/viaversion/api/data/MappingData.java @@ -105,7 +105,9 @@ public interface MappingData { @Nullable Mappings getEnchantmentMappings(); - @Nullable FullMappingData getArgumentTypeMappings(); + @Nullable FullMappings getEntityMappings(); + + @Nullable FullMappings getArgumentTypeMappings(); @Nullable Mappings getPaintingMappings(); } diff --git a/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataBase.java b/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataBase.java index 2b89182eb..2bd74d041 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataBase.java +++ b/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataBase.java @@ -44,7 +44,8 @@ public class MappingDataBase implements MappingData { protected final String newVersion; protected final boolean hasDiffFile; protected Int2IntBiMap itemMappings; - protected FullMappingData argumentTypeMappings; + protected FullMappings argumentTypeMappings; + protected FullMappings entityMappings; protected ParticleMappings particleMappings; protected Mappings blockMappings; protected Mappings blockStateMappings; @@ -81,11 +82,8 @@ public class MappingDataBase implements MappingData { enchantmentMappings = loadFromArray(oldMappings, newMappings, diffmapping, "enchantments"); paintingMappings = loadFromArray(oldMappings, newMappings, diffmapping, "paintings"); - Mappings argumentTypeMappings = loadFromArray(oldMappings, newMappings, diffmapping, "argumenttypes"); - if (argumentTypeMappings != null) { - this.argumentTypeMappings = new FullMappingDataBase(oldMappings.getAsJsonArray("argumenttypes"), - newMappings.getAsJsonArray("argumenttypes"), argumentTypeMappings); - } + entityMappings = loadFullMappings(oldMappings, newMappings, diffmapping, "entities"); + argumentTypeMappings = loadFullMappings(oldMappings, newMappings, diffmapping, "argumenttypes"); Mappings particles = loadFromArray(oldMappings, newMappings, diffmapping, "particles"); if (particles != null) { @@ -113,6 +111,11 @@ public class MappingDataBase implements MappingData { loadExtras(oldMappings, newMappings, diffmapping); } + protected FullMappings loadFullMappings(JsonObject oldMappings, JsonObject newMappings, @Nullable JsonObject diffMappings, String key) { + Mappings mappings = loadFromArray(oldMappings, newMappings, diffMappings, key); + return mappings != null ? new FullMappingsBase(oldMappings.getAsJsonArray(key), newMappings.getAsJsonArray(key), mappings) : null; + } + private void loadTags(RegistryType type, JsonObject object, Object2IntMap typeMapping) { JsonObject tags = object.getAsJsonObject(type.resourceLocation()); List tagsList = new ArrayList<>(tags.size()); @@ -208,7 +211,12 @@ public class MappingDataBase implements MappingData { } @Override - public @Nullable FullMappingData getArgumentTypeMappings() { + public @Nullable FullMappings getEntityMappings() { + return entityMappings; + } + + @Override + public @Nullable FullMappings getArgumentTypeMappings() { return argumentTypeMappings; } diff --git a/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataLoader.java b/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataLoader.java index 7dbd2abf1..7fbc1b3dc 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataLoader.java +++ b/api/src/main/java/com/viaversion/viaversion/api/data/MappingDataLoader.java @@ -164,7 +164,7 @@ public class MappingDataLoader { mapIdentifiers(output, oldIdentifiers, newIdentifiers, diffIdentifiers, true); } - private static int mapIdentifierEntry(Map.Entry entry, Object2IntMap newIdentifierMap, @Nullable JsonObject diffIdentifiers, boolean warnOnMissing) { + private static int mapIdentifierEntry(Map.Entry entry, Object2IntMap newIdentifierMap, @Nullable JsonObject diffIdentifiers, boolean warnOnMissing) { int value = newIdentifierMap.getInt(entry.getValue().getAsString()); if (value == -1) { // Search in diff mappings diff --git a/api/src/main/java/com/viaversion/viaversion/api/data/Mappings.java b/api/src/main/java/com/viaversion/viaversion/api/data/Mappings.java index c0945e9b9..1474f49cb 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/data/Mappings.java +++ b/api/src/main/java/com/viaversion/viaversion/api/data/Mappings.java @@ -38,6 +38,28 @@ public interface Mappings { */ int getNewId(int id); + /** + * Returns the mapped id from the given id, or the given default if unmapped/invalid. + * + * @param id unmapped id + * @param def fallback return value + * @return mapped id, or -1 if invalid/out of bounds + */ + default int getNewIdOrDefault(int id, int def) { + final int mappedId = getNewId(id); + return mappedId != -1 ? mappedId : def; + } + + /** + * Returns whether the id has a mapping. + * + * @param id unmapped id + * @return whether the id has a mapped id + */ + default boolean contains(int id) { + return getNewId(id) != -1; + } + /** * Manually maps a specific id. * diff --git a/api/src/main/java/com/viaversion/viaversion/api/data/ParticleMappings.java b/api/src/main/java/com/viaversion/viaversion/api/data/ParticleMappings.java index dee8778c1..c79806785 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/data/ParticleMappings.java +++ b/api/src/main/java/com/viaversion/viaversion/api/data/ParticleMappings.java @@ -26,7 +26,7 @@ import com.google.gson.JsonArray; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; -public class ParticleMappings extends FullMappingDataBase { +public class ParticleMappings extends FullMappingsBase { private final IntList itemParticleIds = new IntArrayList(2); private final IntList blockParticleIds = new IntArrayList(4); diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_10Types.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_10Types.java index d54f25661..89f057172 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_10Types.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_10Types.java @@ -170,6 +170,16 @@ public class Entity1_10Types { public EntityType getParent() { return parent; } + + @Override + public String identifier() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isAbstractType() { + return id != -1; + } } public enum ObjectType implements com.viaversion.viaversion.api.minecraft.entities.ObjectType { diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_11Types.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_11Types.java index b12a710e3..9977d6892 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_11Types.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_11Types.java @@ -187,6 +187,16 @@ public class Entity1_11Types { return parent; } + @Override + public String identifier() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isAbstractType() { + return id != -1; + } + static { for (EntityType type : EntityType.values()) { TYPES.put(type.id, type); diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_12Types.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_12Types.java index cd85f4b75..c43b8d774 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_12Types.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_12Types.java @@ -191,6 +191,16 @@ public class Entity1_12Types { return parent; } + @Override + public String identifier() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isAbstractType() { + return id != -1; + } + static { for (EntityType type : EntityType.values()) { TYPES.put(type.id, type); diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_13Types.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_13Types.java index e0fe6eb4b..82efa3a89 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_13Types.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_13Types.java @@ -240,6 +240,16 @@ public class Entity1_13Types { return parent; } + @Override + public String identifier() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isAbstractType() { + return id != -1; + } + static { for (EntityType type : EntityType.values()) { TYPES.put(type.id, type); diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_14Types.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_14Types.java index e5ef877fd..7230c532c 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_14Types.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_14Types.java @@ -224,6 +224,16 @@ public enum Entity1_14Types implements EntityType { return parent; } + @Override + public String identifier() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isAbstractType() { + return id != -1; + } + static { TYPES = EntityTypeUtil.toOrderedArray(values()); } diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_15Types.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_15Types.java index f27752c1a..f2ab1fce4 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_15Types.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_15Types.java @@ -226,6 +226,16 @@ public enum Entity1_15Types implements EntityType { return parent; } + @Override + public String identifier() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isAbstractType() { + return id != -1; + } + static { TYPES = EntityTypeUtil.toOrderedArray(values()); } diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_16Types.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_16Types.java index 9253a5b91..9d22781cb 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_16Types.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_16Types.java @@ -231,6 +231,16 @@ public enum Entity1_16Types implements EntityType { return parent; } + @Override + public String identifier() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isAbstractType() { + return id != -1; + } + static { TYPES = EntityTypeUtil.toOrderedArray(values()); } diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_16_2Types.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_16_2Types.java index c4879f5b6..dd3a0a081 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_16_2Types.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_16_2Types.java @@ -235,6 +235,16 @@ public enum Entity1_16_2Types implements EntityType { return parent; } + @Override + public String identifier() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isAbstractType() { + return id != -1; + } + static { TYPES = EntityTypeUtil.toOrderedArray(values()); } diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_17Types.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_17Types.java index eae298628..17b440df4 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_17Types.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_17Types.java @@ -240,6 +240,16 @@ public enum Entity1_17Types implements EntityType { return parent; } + @Override + public String identifier() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isAbstractType() { + return id != -1; + } + static { TYPES = EntityTypeUtil.toOrderedArray(values()); } diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_19Types.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_19Types.java index bcd735827..fe5286512 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_19Types.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/Entity1_19Types.java @@ -22,234 +22,262 @@ */ package com.viaversion.viaversion.api.minecraft.entities; +import com.google.common.base.Preconditions; +import com.viaversion.viaversion.api.protocol.Protocol; import com.viaversion.viaversion.util.EntityTypeUtil; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Locale; public enum Entity1_19Types implements EntityType { - ENTITY(-1), + ENTITY(null, null), - AREA_EFFECT_CLOUD(1, ENTITY), - END_CRYSTAL(21, ENTITY), - EVOKER_FANGS(26, ENTITY), - EXPERIENCE_ORB(27, ENTITY), - EYE_OF_ENDER(28, ENTITY), - FALLING_BLOCK(29, ENTITY), - FIREWORK_ROCKET(30, ENTITY), - ITEM(44, ENTITY), - LLAMA_SPIT(50, ENTITY), - TNT(72, ENTITY), - SHULKER_BULLET(79, ENTITY), - FISHING_BOBBER(117, ENTITY), + AREA_EFFECT_CLOUD(ENTITY), + END_CRYSTAL(ENTITY), + EVOKER_FANGS(ENTITY), + EXPERIENCE_ORB(ENTITY), + EYE_OF_ENDER(ENTITY), + FALLING_BLOCK(ENTITY), + FIREWORK_ROCKET(ENTITY), + ITEM(ENTITY), + LLAMA_SPIT(ENTITY), + TNT(ENTITY), + SHULKER_BULLET(ENTITY), + FISHING_BOBBER(ENTITY), - LIVINGENTITY(-1, ENTITY), - ARMOR_STAND(2, LIVINGENTITY), - MARKER(52, ENTITY), - PLAYER(116, LIVINGENTITY), + LIVINGENTITY(ENTITY, null), + ARMOR_STAND(LIVINGENTITY), + MARKER(ENTITY), + PLAYER(LIVINGENTITY), - ABSTRACT_INSENTIENT(-1, LIVINGENTITY), - ENDER_DRAGON(22, ABSTRACT_INSENTIENT), + ABSTRACT_INSENTIENT(LIVINGENTITY, null), + ENDER_DRAGON(ABSTRACT_INSENTIENT), - BEE(6, ABSTRACT_INSENTIENT), + BEE(ABSTRACT_INSENTIENT), - ABSTRACT_CREATURE(-1, ABSTRACT_INSENTIENT), + ABSTRACT_CREATURE(ABSTRACT_INSENTIENT, null), - ABSTRACT_AGEABLE(-1, ABSTRACT_CREATURE), - VILLAGER(102, ABSTRACT_AGEABLE), - WANDERING_TRADER(104, ABSTRACT_AGEABLE), + ABSTRACT_AGEABLE(ABSTRACT_CREATURE, null), + VILLAGER(ABSTRACT_AGEABLE), + WANDERING_TRADER(ABSTRACT_AGEABLE), // Animals - ABSTRACT_ANIMAL(-1, ABSTRACT_AGEABLE), - AXOLOTL(4, ABSTRACT_ANIMAL), - DOLPHIN(16, ABSTRACT_INSENTIENT), - CHICKEN(12, ABSTRACT_ANIMAL), - COW(14, ABSTRACT_ANIMAL), - MOOSHROOM(61, COW), - PANDA(64, ABSTRACT_INSENTIENT), - PIG(67, ABSTRACT_ANIMAL), - POLAR_BEAR(71, ABSTRACT_ANIMAL), - RABBIT(74, ABSTRACT_ANIMAL), - SHEEP(77, ABSTRACT_ANIMAL), - TURTLE(100, ABSTRACT_ANIMAL), - FOX(31, ABSTRACT_ANIMAL), - FROG(32, ABSTRACT_ANIMAL), - GOAT(37, ABSTRACT_ANIMAL), + ABSTRACT_ANIMAL(ABSTRACT_AGEABLE, null), + AXOLOTL(ABSTRACT_ANIMAL), + DOLPHIN(ABSTRACT_INSENTIENT), + CHICKEN(ABSTRACT_ANIMAL), + COW(ABSTRACT_ANIMAL), + MOOSHROOM(COW), + PANDA(ABSTRACT_INSENTIENT), + PIG(ABSTRACT_ANIMAL), + POLAR_BEAR(ABSTRACT_ANIMAL), + RABBIT(ABSTRACT_ANIMAL), + SHEEP(ABSTRACT_ANIMAL), + TURTLE(ABSTRACT_ANIMAL), + FOX(ABSTRACT_ANIMAL), + FROG(ABSTRACT_ANIMAL), + GOAT(ABSTRACT_ANIMAL), - ABSTRACT_TAMEABLE_ANIMAL(-1, ABSTRACT_ANIMAL), - CAT(10, ABSTRACT_TAMEABLE_ANIMAL), - OCELOT(62, ABSTRACT_TAMEABLE_ANIMAL), - WOLF(110, ABSTRACT_TAMEABLE_ANIMAL), + ABSTRACT_TAMEABLE_ANIMAL(ABSTRACT_ANIMAL, null), + CAT(ABSTRACT_TAMEABLE_ANIMAL), + OCELOT(ABSTRACT_TAMEABLE_ANIMAL), + WOLF(ABSTRACT_TAMEABLE_ANIMAL), - ABSTRACT_PARROT(-1, ABSTRACT_TAMEABLE_ANIMAL), - PARROT(65, ABSTRACT_PARROT), + ABSTRACT_PARROT(ABSTRACT_TAMEABLE_ANIMAL, null), + PARROT(ABSTRACT_PARROT), // Horses - ABSTRACT_HORSE(-1, ABSTRACT_ANIMAL), - CHESTED_HORSE(-1, ABSTRACT_HORSE), - DONKEY(17, CHESTED_HORSE), - MULE(60, CHESTED_HORSE), - LLAMA(49, CHESTED_HORSE), - TRADER_LLAMA(98, CHESTED_HORSE), - HORSE(40, ABSTRACT_HORSE), - SKELETON_HORSE(82, ABSTRACT_HORSE), - ZOMBIE_HORSE(113, ABSTRACT_HORSE), + ABSTRACT_HORSE(ABSTRACT_ANIMAL, null), + CHESTED_HORSE(ABSTRACT_HORSE, null), + DONKEY(CHESTED_HORSE), + MULE(CHESTED_HORSE), + LLAMA(CHESTED_HORSE), + TRADER_LLAMA(CHESTED_HORSE), + HORSE(ABSTRACT_HORSE), + SKELETON_HORSE(ABSTRACT_HORSE), + ZOMBIE_HORSE(ABSTRACT_HORSE), // Golem - ABSTRACT_GOLEM(-1, ABSTRACT_CREATURE), - SNOW_GOLEM(85, ABSTRACT_GOLEM), - IRON_GOLEM(43, ABSTRACT_GOLEM), - SHULKER(78, ABSTRACT_GOLEM), + ABSTRACT_GOLEM(ABSTRACT_CREATURE, null), + SNOW_GOLEM(ABSTRACT_GOLEM), + IRON_GOLEM(ABSTRACT_GOLEM), + SHULKER(ABSTRACT_GOLEM), // Fish - ABSTRACT_FISHES(-1, ABSTRACT_CREATURE), - COD(13, ABSTRACT_FISHES), - PUFFERFISH(73, ABSTRACT_FISHES), - SALMON(76, ABSTRACT_FISHES), - TROPICAL_FISH(99, ABSTRACT_FISHES), + ABSTRACT_FISHES(ABSTRACT_CREATURE, null), + COD(ABSTRACT_FISHES), + PUFFERFISH(ABSTRACT_FISHES), + SALMON(ABSTRACT_FISHES), + TROPICAL_FISH(ABSTRACT_FISHES), // Monsters - ABSTRACT_MONSTER(-1, ABSTRACT_CREATURE), - BLAZE(7, ABSTRACT_MONSTER), - CREEPER(15, ABSTRACT_MONSTER), - ENDERMITE(24, ABSTRACT_MONSTER), - ENDERMAN(23, ABSTRACT_MONSTER), - GIANT(34, ABSTRACT_MONSTER), - SILVERFISH(80, ABSTRACT_MONSTER), - VEX(101, ABSTRACT_MONSTER), - WITCH(106, ABSTRACT_MONSTER), - WITHER(107, ABSTRACT_MONSTER), - RAVAGER(75, ABSTRACT_MONSTER), + ABSTRACT_MONSTER(ABSTRACT_CREATURE, null), + BLAZE(ABSTRACT_MONSTER), + CREEPER(ABSTRACT_MONSTER), + ENDERMITE(ABSTRACT_MONSTER), + ENDERMAN(ABSTRACT_MONSTER), + GIANT(ABSTRACT_MONSTER), + SILVERFISH(ABSTRACT_MONSTER), + VEX(ABSTRACT_MONSTER), + WITCH(ABSTRACT_MONSTER), + WITHER(ABSTRACT_MONSTER), + RAVAGER(ABSTRACT_MONSTER), - ABSTRACT_PIGLIN(-1, ABSTRACT_MONSTER), + ABSTRACT_PIGLIN(ABSTRACT_MONSTER, null), - PIGLIN(68, ABSTRACT_PIGLIN), - PIGLIN_BRUTE(69, ABSTRACT_PIGLIN), + PIGLIN(ABSTRACT_PIGLIN), + PIGLIN_BRUTE(ABSTRACT_PIGLIN), - HOGLIN(39, ABSTRACT_ANIMAL), - STRIDER(91, ABSTRACT_ANIMAL), - TADPOLE(91, ABSTRACT_FISHES), - ZOGLIN(111, ABSTRACT_MONSTER), - WARDEN(105, ABSTRACT_MONSTER), + HOGLIN(ABSTRACT_ANIMAL), + STRIDER(ABSTRACT_ANIMAL), + TADPOLE(ABSTRACT_FISHES), + ZOGLIN(ABSTRACT_MONSTER), + WARDEN(ABSTRACT_MONSTER), // Illagers - ABSTRACT_ILLAGER_BASE(-1, ABSTRACT_MONSTER), - ABSTRACT_EVO_ILLU_ILLAGER(-1, ABSTRACT_ILLAGER_BASE), - EVOKER(25, ABSTRACT_EVO_ILLU_ILLAGER), - ILLUSIONER(42, ABSTRACT_EVO_ILLU_ILLAGER), - VINDICATOR(103, ABSTRACT_ILLAGER_BASE), - PILLAGER(70, ABSTRACT_ILLAGER_BASE), + ABSTRACT_ILLAGER_BASE(ABSTRACT_MONSTER, null), + ABSTRACT_EVO_ILLU_ILLAGER(ABSTRACT_ILLAGER_BASE, null), + EVOKER(ABSTRACT_EVO_ILLU_ILLAGER), + ILLUSIONER(ABSTRACT_EVO_ILLU_ILLAGER), + VINDICATOR(ABSTRACT_ILLAGER_BASE), + PILLAGER(ABSTRACT_ILLAGER_BASE), // Skeletons - ABSTRACT_SKELETON(-1, ABSTRACT_MONSTER), - SKELETON(81, ABSTRACT_SKELETON), - STRAY(90, ABSTRACT_SKELETON), - WITHER_SKELETON(108, ABSTRACT_SKELETON), + ABSTRACT_SKELETON(ABSTRACT_MONSTER, null), + SKELETON(ABSTRACT_SKELETON), + STRAY(ABSTRACT_SKELETON), + WITHER_SKELETON(ABSTRACT_SKELETON), // Guardians - GUARDIAN(38, ABSTRACT_MONSTER), - ELDER_GUARDIAN(20, GUARDIAN), + GUARDIAN(ABSTRACT_MONSTER), + ELDER_GUARDIAN(GUARDIAN), // Spiders - SPIDER(88, ABSTRACT_MONSTER), - CAVE_SPIDER(11, SPIDER), + SPIDER(ABSTRACT_MONSTER), + CAVE_SPIDER(SPIDER), // Zombies - ZOMBIE(112, ABSTRACT_MONSTER), - DROWNED(19, ZOMBIE), - HUSK(41, ZOMBIE), - ZOMBIFIED_PIGLIN(115, ZOMBIE), - ZOMBIE_VILLAGER(114, ZOMBIE), + ZOMBIE(ABSTRACT_MONSTER), + DROWNED(ZOMBIE), + HUSK(ZOMBIE), + ZOMBIFIED_PIGLIN(ZOMBIE), + ZOMBIE_VILLAGER(ZOMBIE), // Flying entities - ABSTRACT_FLYING(-1, ABSTRACT_INSENTIENT), - GHAST(33, ABSTRACT_FLYING), - PHANTOM(66, ABSTRACT_FLYING), + ABSTRACT_FLYING(ABSTRACT_INSENTIENT, null), + GHAST(ABSTRACT_FLYING), + PHANTOM(ABSTRACT_FLYING), - ABSTRACT_AMBIENT(-1, ABSTRACT_INSENTIENT), - BAT(5, ABSTRACT_AMBIENT), - ALLAY(0, ABSTRACT_CREATURE), + ABSTRACT_AMBIENT(ABSTRACT_INSENTIENT, null), + BAT(ABSTRACT_AMBIENT), + ALLAY(ABSTRACT_CREATURE), - ABSTRACT_WATERMOB(-1, ABSTRACT_INSENTIENT), - SQUID(89, ABSTRACT_WATERMOB), - GLOW_SQUID(36, SQUID), + ABSTRACT_WATERMOB(ABSTRACT_INSENTIENT, null), + SQUID(ABSTRACT_WATERMOB), + GLOW_SQUID(SQUID), // Slimes - SLIME(83, ABSTRACT_INSENTIENT), - MAGMA_CUBE(51, SLIME), + SLIME(ABSTRACT_INSENTIENT), + MAGMA_CUBE(SLIME), // Hangable objects - ABSTRACT_HANGING(-1, ENTITY), - LEASH_KNOT(47, ABSTRACT_HANGING), - ITEM_FRAME(45, ABSTRACT_HANGING), - GLOW_ITEM_FRAME(35, ITEM_FRAME), - PAINTING(63, ABSTRACT_HANGING), + ABSTRACT_HANGING(ENTITY, null), + LEASH_KNOT(ABSTRACT_HANGING), + ITEM_FRAME(ABSTRACT_HANGING), + GLOW_ITEM_FRAME(ITEM_FRAME), + PAINTING(ABSTRACT_HANGING), - ABSTRACT_LIGHTNING(-1, ENTITY), - LIGHTNING_BOLT(48, ABSTRACT_LIGHTNING), + ABSTRACT_LIGHTNING(ENTITY, null), + LIGHTNING_BOLT(ABSTRACT_LIGHTNING), // Arrows - ABSTRACT_ARROW(-1, ENTITY), - ARROW(3, ABSTRACT_ARROW), - SPECTRAL_ARROW(87, ABSTRACT_ARROW), - TRIDENT(97, ABSTRACT_ARROW), + ABSTRACT_ARROW(ENTITY, null), + ARROW(ABSTRACT_ARROW), + SPECTRAL_ARROW(ABSTRACT_ARROW), + TRIDENT(ABSTRACT_ARROW), // Fireballs - ABSTRACT_FIREBALL(-1, ENTITY), - DRAGON_FIREBALL(18, ABSTRACT_FIREBALL), - FIREBALL(46, ABSTRACT_FIREBALL), - SMALL_FIREBALL(84, ABSTRACT_FIREBALL), - WITHER_SKULL(109, ABSTRACT_FIREBALL), + ABSTRACT_FIREBALL(ENTITY, null), + DRAGON_FIREBALL(ABSTRACT_FIREBALL), + FIREBALL(ABSTRACT_FIREBALL), + SMALL_FIREBALL(ABSTRACT_FIREBALL), + WITHER_SKULL(ABSTRACT_FIREBALL), // Projectiles - PROJECTILE_ABSTRACT(-1, ENTITY), - SNOWBALL(86, PROJECTILE_ABSTRACT), - ENDER_PEARL(94, PROJECTILE_ABSTRACT), - EGG(93, PROJECTILE_ABSTRACT), - POTION(96, PROJECTILE_ABSTRACT), - EXPERIENCE_BOTTLE(95, PROJECTILE_ABSTRACT), + PROJECTILE_ABSTRACT(ENTITY, null), + SNOWBALL(PROJECTILE_ABSTRACT), + ENDER_PEARL(PROJECTILE_ABSTRACT), + EGG(PROJECTILE_ABSTRACT), + POTION(PROJECTILE_ABSTRACT), + EXPERIENCE_BOTTLE(PROJECTILE_ABSTRACT), // Vehicles - MINECART_ABSTRACT(-1, ENTITY), - CHESTED_MINECART_ABSTRACT(-1, MINECART_ABSTRACT), - CHEST_MINECART(54, CHESTED_MINECART_ABSTRACT), - HOPPER_MINECART(57, CHESTED_MINECART_ABSTRACT), - MINECART(53, MINECART_ABSTRACT), - FURNACE_MINECART(56, MINECART_ABSTRACT), - COMMAND_BLOCK_MINECART(55, MINECART_ABSTRACT), - TNT_MINECART(59, MINECART_ABSTRACT), - SPAWNER_MINECART(58, MINECART_ABSTRACT), - BOAT(8, ENTITY), - CHEST_BOAT(9, BOAT); + MINECART_ABSTRACT(ENTITY, null), + CHESTED_MINECART_ABSTRACT(MINECART_ABSTRACT, null), + CHEST_MINECART(CHESTED_MINECART_ABSTRACT), + HOPPER_MINECART(CHESTED_MINECART_ABSTRACT), + MINECART(MINECART_ABSTRACT), + FURNACE_MINECART(MINECART_ABSTRACT), + COMMAND_BLOCK_MINECART(MINECART_ABSTRACT), + TNT_MINECART(MINECART_ABSTRACT), + SPAWNER_MINECART(MINECART_ABSTRACT), + BOAT(ENTITY), + CHEST_BOAT(BOAT); - private static final EntityType[] TYPES; - - private final int id; + private static final EntityType[] TYPES = EntityTypeUtil.createSizedArray(values()); private final EntityType parent; + private final String identifier; + private int id; - Entity1_19Types(int id) { - this.id = id; - this.parent = null; + Entity1_19Types(final EntityType parent) { + this.parent = parent; + this.identifier = "minecraft:" + name().toLowerCase(Locale.ROOT); } - Entity1_19Types(int id, EntityType parent) { - this.id = id; + Entity1_19Types(final EntityType parent, @Nullable final String identifier) { this.parent = parent; + this.identifier = identifier; } @Override public int getId() { + if (id == -1) { + throw new IllegalStateException("Ids have not been initialized yet"); + } return id; } @Override - public EntityType getParent() { + public String identifier() { + Preconditions.checkArgument(identifier != null, "Called identifier method on abstract type"); + return identifier; + } + + @Override + public @Nullable EntityType getParent() { return parent; } - static { - TYPES = EntityTypeUtil.toOrderedArray(values()); + @Override + public boolean isAbstractType() { + return identifier == null; } - public static EntityType getTypeFromId(int typeId) { + public static EntityType getTypeFromId(final int typeId) { return EntityTypeUtil.getTypeFromId(TYPES, typeId, ENTITY); } + + public static void initialize(final Protocol protocol) { + for (final Entity1_19Types type : values()) { + if (type.isAbstractType()) { + continue; + } + + final int id = protocol.getMappingData().getEntityMappings().mappedId(type.identifier()); + Preconditions.checkArgument(id != -1, "Entity type %s has no id", type.identifier()); + type.id = id; + } + EntityTypeUtil.fill(values(), TYPES); + } } diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/EntityType.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/EntityType.java index 80da34178..c22f2c553 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/EntityType.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/entities/EntityType.java @@ -30,6 +30,7 @@ public interface EntityType { * Returns the entity id. * * @return entity id + * @throws IllegalStateException if ids have not been loaded yet */ int getId(); @@ -47,6 +48,22 @@ public interface EntityType { */ String name(); + /** + * Returns the entity's Vanilla identifier. + * + * @return entity identifier + * @throws IllegalArgumentException if {@link #isAbstractType()} returns true + */ + String identifier(); + + /** + * Returns whether the type does not represent an actual entity, e.g. animal or monster. + * + * @return whether the type does not represent an actual entity + */ + boolean isAbstractType(); + + @Deprecated/*(forRemoval = true)*/ default boolean is(EntityType... types) { for (EntityType type : types) { if (this == type) { diff --git a/api/src/main/java/com/viaversion/viaversion/api/rewriter/RewriterBase.java b/api/src/main/java/com/viaversion/viaversion/api/rewriter/RewriterBase.java index 2ac2d8954..d07c510e9 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/rewriter/RewriterBase.java +++ b/api/src/main/java/com/viaversion/viaversion/api/rewriter/RewriterBase.java @@ -49,6 +49,9 @@ public abstract class RewriterBase implements Rewriter { protected void registerRewrites() { } + public void onMappingDataLoaded() { + } + @Override public T protocol() { return protocol; diff --git a/api/src/main/java/com/viaversion/viaversion/util/EntityTypeUtil.java b/api/src/main/java/com/viaversion/viaversion/util/EntityTypeUtil.java index 26fd755ca..ebfcc09c4 100644 --- a/api/src/main/java/com/viaversion/viaversion/util/EntityTypeUtil.java +++ b/api/src/main/java/com/viaversion/viaversion/util/EntityTypeUtil.java @@ -37,9 +37,9 @@ public class EntityTypeUtil { * @param values entity types * @return ordered array with each index representing the actual entity id */ - public static EntityType[] toOrderedArray(EntityType[] values) { - List types = new ArrayList<>(); - for (EntityType type : values) { + public static EntityType[] toOrderedArray(final EntityType[] values) { + final List types = new ArrayList<>(); + for (final EntityType type : values) { if (type.getId() != -1) { types.add(type); } @@ -49,6 +49,24 @@ public class EntityTypeUtil { return types.toArray(new EntityType[0]); } + public static EntityType[] createSizedArray(final EntityType[] values) { + int count = 0; + for (final EntityType type : values) { + if (!type.isAbstractType()) { + count++; + } + } + return new EntityType[(int) count]; + } + + public static void fill(final EntityType[] values, final EntityType[] toFill) { + for (final EntityType type : values) { + if (!type.isAbstractType()) { + toFill[type.getId()] = type; + } + } + } + /** * Returns the entity type from id, or the given fallback if out of bounds. * @@ -57,8 +75,8 @@ public class EntityTypeUtil { * @param fallback fallback/base entity type * @return entity type from id */ - public static EntityType getTypeFromId(EntityType[] values, int typeId, EntityType fallback) { - EntityType type; + public static EntityType getTypeFromId(final EntityType[] values, final int typeId, final EntityType fallback) { + final EntityType type; if (typeId < 0 || typeId >= values.length || (type = values[typeId]) == null) { Via.getPlatform().getLogger().severe("Could not find " + fallback.getClass().getSimpleName() + " type id " + typeId); return fallback; diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_11to1_10/metadata/MetadataRewriter1_11To1_10.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_11to1_10/metadata/MetadataRewriter1_11To1_10.java index 1547a0289..dc6a6f616 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_11to1_10/metadata/MetadataRewriter1_11To1_10.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_11to1_10/metadata/MetadataRewriter1_11To1_10.java @@ -69,7 +69,7 @@ public class MetadataRewriter1_11To1_10 extends EntityRewriter { public EntityPackets(final Protocol1_19To1_18_2 protocol) { super(protocol); - mapTypes(Entity1_17Types.values(), Entity1_19Types.class); } @Override @@ -354,6 +353,11 @@ public final class EntityPackets extends EntityRewriter { filter().type(Entity1_19Types.CAT).index(19).handler((event, meta) -> meta.setMetaType(Types1_19.META_TYPES.catVariantType)); } + @Override + public void onMappingDataLoaded() { + mapTypes(); + } + @Override public EntityType typeFromId(final int type) { return Entity1_19Types.getTypeFromId(type); diff --git a/common/src/main/java/com/viaversion/viaversion/rewriter/EntityRewriter.java b/common/src/main/java/com/viaversion/viaversion/rewriter/EntityRewriter.java index 1764a8296..f42a43c09 100644 --- a/common/src/main/java/com/viaversion/viaversion/rewriter/EntityRewriter.java +++ b/common/src/main/java/com/viaversion/viaversion/rewriter/EntityRewriter.java @@ -24,6 +24,8 @@ import com.github.steveice10.opennbt.tag.builtin.Tag; import com.google.common.base.Preconditions; import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.data.Int2IntMapMappings; +import com.viaversion.viaversion.api.data.Mappings; import com.viaversion.viaversion.api.data.ParticleMappings; import com.viaversion.viaversion.api.data.entity.DimensionData; import com.viaversion.viaversion.api.data.entity.EntityTracker; @@ -41,8 +43,6 @@ import com.viaversion.viaversion.api.type.types.Particle; import com.viaversion.viaversion.rewriter.meta.MetaFilter; import com.viaversion.viaversion.rewriter.meta.MetaHandlerEvent; import com.viaversion.viaversion.rewriter.meta.MetaHandlerEventImpl; -import it.unimi.dsi.fastutil.ints.Int2IntMap; -import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; import org.checkerframework.checker.nullness.qual.Nullable; import java.util.ArrayList; @@ -55,7 +55,7 @@ public abstract class EntityRewriter extends RewriterBase private static final Metadata[] EMPTY_ARRAY = new Metadata[0]; protected final List metadataFilters = new ArrayList<>(); protected final boolean trackMappedType; - protected Int2IntMap typeMappings; + protected Mappings typeMappings; protected EntityRewriter(T protocol) { this(protocol, true); @@ -167,7 +167,7 @@ public abstract class EntityRewriter extends RewriterBase @Override public int newEntityId(int id) { - return typeMappings != null ? typeMappings.getOrDefault(id, id) : id; + return typeMappings != null ? typeMappings.getNewIdOrDefault(id, id) : id; } /** @@ -184,10 +184,9 @@ public abstract class EntityRewriter extends RewriterBase protected void mapEntityType(int id, int mappedId) { if (typeMappings == null) { - typeMappings = new Int2IntOpenHashMap(); - typeMappings.defaultReturnValue(-1); + typeMappings = Int2IntMapMappings.of(); } - typeMappings.put(id, mappedId); + typeMappings.setNewId(id, mappedId); } /** @@ -199,15 +198,14 @@ public abstract class EntityRewriter extends RewriterBase */ public & EntityType> void mapTypes(EntityType[] oldTypes, Class newTypeClass) { if (typeMappings == null) { - typeMappings = new Int2IntOpenHashMap(oldTypes.length, .99F); - typeMappings.defaultReturnValue(-1); + typeMappings = Int2IntMapMappings.of(); } for (EntityType oldType : oldTypes) { try { E newType = Enum.valueOf(newTypeClass, oldType.name()); - typeMappings.put(oldType.getId(), newType.getId()); + typeMappings.setNewId(oldType.getId(), newType.getId()); } catch (IllegalArgumentException notFound) { - if (!typeMappings.containsKey(oldType.getId())) { + if (!typeMappings.contains(oldType.getId())) { Via.getPlatform().getLogger().warning("Could not find new entity type for " + oldType + "! " + "Old type: " + oldType.getClass().getEnclosingClass().getSimpleName() + ", new type: " + newTypeClass.getEnclosingClass().getSimpleName()); } @@ -215,6 +213,15 @@ public abstract class EntityRewriter extends RewriterBase } } + /** + * Maps entity ids based on the protocol's mapping data. + */ + public void mapTypes() { + Preconditions.checkArgument(typeMappings == null, "Type mappings have already been set - manual type mappings should be set *after* this"); + Preconditions.checkNotNull(protocol.getMappingData().getEntityMappings(), "Protocol does not have entity mappings"); + typeMappings = protocol.getMappingData().getEntityMappings().mappings(); + } + /** * Registers a metadata handler to rewrite, item, block, and particle ids stored in metadata. * diff --git a/common/src/main/resources/assets/viaversion/data/mapping-1.18.json b/common/src/main/resources/assets/viaversion/data/mapping-1.18.json index 6694af266..59f791488 100644 --- a/common/src/main/resources/assets/viaversion/data/mapping-1.18.json +++ b/common/src/main/resources/assets/viaversion/data/mapping-1.18.json @@ -23765,6 +23765,121 @@ "minecraft:mending", "minecraft:vanishing_curse" ], + "entities": [ + "minecraft:area_effect_cloud", + "minecraft:armor_stand", + "minecraft:arrow", + "minecraft:axolotl", + "minecraft:bat", + "minecraft:bee", + "minecraft:blaze", + "minecraft:boat", + "minecraft:cat", + "minecraft:cave_spider", + "minecraft:chicken", + "minecraft:cod", + "minecraft:cow", + "minecraft:creeper", + "minecraft:dolphin", + "minecraft:donkey", + "minecraft:dragon_fireball", + "minecraft:drowned", + "minecraft:elder_guardian", + "minecraft:end_crystal", + "minecraft:ender_dragon", + "minecraft:enderman", + "minecraft:endermite", + "minecraft:evoker", + "minecraft:evoker_fangs", + "minecraft:experience_orb", + "minecraft:eye_of_ender", + "minecraft:falling_block", + "minecraft:firework_rocket", + "minecraft:fox", + "minecraft:ghast", + "minecraft:giant", + "minecraft:glow_item_frame", + "minecraft:glow_squid", + "minecraft:goat", + "minecraft:guardian", + "minecraft:hoglin", + "minecraft:horse", + "minecraft:husk", + "minecraft:illusioner", + "minecraft:iron_golem", + "minecraft:item", + "minecraft:item_frame", + "minecraft:fireball", + "minecraft:leash_knot", + "minecraft:lightning_bolt", + "minecraft:llama", + "minecraft:llama_spit", + "minecraft:magma_cube", + "minecraft:marker", + "minecraft:minecart", + "minecraft:chest_minecart", + "minecraft:command_block_minecart", + "minecraft:furnace_minecart", + "minecraft:hopper_minecart", + "minecraft:spawner_minecart", + "minecraft:tnt_minecart", + "minecraft:mule", + "minecraft:mooshroom", + "minecraft:ocelot", + "minecraft:painting", + "minecraft:panda", + "minecraft:parrot", + "minecraft:phantom", + "minecraft:pig", + "minecraft:piglin", + "minecraft:piglin_brute", + "minecraft:pillager", + "minecraft:polar_bear", + "minecraft:tnt", + "minecraft:pufferfish", + "minecraft:rabbit", + "minecraft:ravager", + "minecraft:salmon", + "minecraft:sheep", + "minecraft:shulker", + "minecraft:shulker_bullet", + "minecraft:silverfish", + "minecraft:skeleton", + "minecraft:skeleton_horse", + "minecraft:slime", + "minecraft:small_fireball", + "minecraft:snow_golem", + "minecraft:snowball", + "minecraft:spectral_arrow", + "minecraft:spider", + "minecraft:squid", + "minecraft:stray", + "minecraft:strider", + "minecraft:egg", + "minecraft:ender_pearl", + "minecraft:experience_bottle", + "minecraft:potion", + "minecraft:trident", + "minecraft:trader_llama", + "minecraft:tropical_fish", + "minecraft:turtle", + "minecraft:vex", + "minecraft:villager", + "minecraft:vindicator", + "minecraft:wandering_trader", + "minecraft:witch", + "minecraft:wither", + "minecraft:wither_skeleton", + "minecraft:wither_skull", + "minecraft:wolf", + "minecraft:zoglin", + "minecraft:zombie", + "minecraft:zombie_horse", + "minecraft:zombie_villager", + "minecraft:zombified_piglin", + "minecraft:player", + "minecraft:fishing_bobber" + ], "paintings": [ "minecraft:kebab", "minecraft:aztec",