Mirror von
https://github.com/ViaVersion/ViaVersion.git
synchronisiert 2024-12-26 16:12:42 +01:00
Fixup legacy entity type hierarchy and namings (#3849)
Dieser Commit ist enthalten in:
Ursprung
0fc0259d8c
Commit
04b31d70b2
@ -25,141 +25,160 @@ package com.viaversion.viaversion.api.minecraft.entities;
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
// 1.10 Entity / Object ids
|
||||
public class EntityTypes1_10 {
|
||||
|
||||
public static EntityType getTypeFromId(int typeID, boolean isObject) {
|
||||
Optional<EntityType> type;
|
||||
public static EntityType getTypeFromId(final int typeId, final boolean object) {
|
||||
EntityType type;
|
||||
|
||||
if (isObject)
|
||||
type = ObjectType.getPCEntity(typeID);
|
||||
else
|
||||
type = EntityType.findById(typeID);
|
||||
|
||||
if (type.isEmpty()) {
|
||||
Via.getPlatform().getLogger().severe("Could not find 1.10 type id " + typeID + " isObject=" + isObject);
|
||||
if (object) {
|
||||
type = ObjectType.getEntityType(typeId);
|
||||
} else {
|
||||
type = EntityType.findById(typeId);
|
||||
}
|
||||
if (type == null) {
|
||||
Via.getPlatform().getLogger().severe("Could not find 1.10 type id " + typeId + " objectType=" + object);
|
||||
return EntityType.ENTITY; // Fall back to the basic ENTITY
|
||||
}
|
||||
|
||||
return type.get();
|
||||
return type;
|
||||
}
|
||||
|
||||
public enum EntityType implements com.viaversion.viaversion.api.minecraft.entities.EntityType {
|
||||
ENTITY(-1),
|
||||
DROPPED_ITEM(1, ENTITY),
|
||||
|
||||
ENTITY,
|
||||
|
||||
AREA_EFFECT_CLOUD(3, ENTITY),
|
||||
END_CRYSTAL(200, ENTITY),
|
||||
EXPERIENCE_ORB(2, ENTITY),
|
||||
LEASH_HITCH(8, ENTITY), // Actually entity hanging, but it doesn't make a lot of difference for metadata
|
||||
PAINTING(9, ENTITY), // Actually entity hanging, but it doesn't make a lot of difference for metadata
|
||||
ARROW(10, ENTITY),
|
||||
SNOWBALL(11, ENTITY), // Actually EntityProjectile
|
||||
FIREBALL(12, ENTITY),
|
||||
SMALL_FIREBALL(13, ENTITY),
|
||||
ENDER_PEARL(14, ENTITY), // Actually EntityProjectile
|
||||
ENDER_SIGNAL(15, ENTITY),
|
||||
THROWN_EXP_BOTTLE(17, ENTITY),
|
||||
ITEM_FRAME(18, ENTITY), // Actually EntityHanging
|
||||
WITHER_SKULL(19, ENTITY),
|
||||
PRIMED_TNT(20, ENTITY),
|
||||
EYE_OF_ENDER(15, ENTITY),
|
||||
FALLING_BLOCK(21, ENTITY),
|
||||
FIREWORK(22, ENTITY),
|
||||
TIPPED_ARROW(23, ARROW),
|
||||
SPECTRAL_ARROW(24, ARROW),
|
||||
ITEM(1, ENTITY),
|
||||
TNT(20, ENTITY),
|
||||
LIGHTNING_BOLT(ENTITY), // Needed for entity (un)tracking
|
||||
|
||||
// Hanging entities
|
||||
HANGING_ENTITY(ENTITY),
|
||||
LEASH_KNOT(8, HANGING_ENTITY),
|
||||
ITEM_FRAME(18, HANGING_ENTITY),
|
||||
PAINTING(9, HANGING_ENTITY),
|
||||
|
||||
// Projectiles
|
||||
PROJECTILE(ENTITY),
|
||||
FIREWORK_ROCKET(22, ENTITY),
|
||||
SHULKER_BULLET(25, ENTITY),
|
||||
DRAGON_FIREBALL(26, FIREBALL),
|
||||
SNOWBALL(11, PROJECTILE),
|
||||
ENDER_PEARL(14, PROJECTILE),
|
||||
EGG(7, PROJECTILE),
|
||||
EXPERIENCE_BOTTLE(17, PROJECTILE),
|
||||
POTION(16, PROJECTILE),
|
||||
FISHING_HOOK(ENTITY),
|
||||
|
||||
ENTITY_LIVING(-1, ENTITY),
|
||||
ENTITY_INSENTIENT(-1, ENTITY_LIVING),
|
||||
ENTITY_AGEABLE(-1, ENTITY_INSENTIENT),
|
||||
ENTITY_TAMEABLE_ANIMAL(-1, ENTITY_AGEABLE),
|
||||
ENTITY_HUMAN(-1, ENTITY_LIVING),
|
||||
ABSTRACT_ARROW(ENTITY),
|
||||
ARROW(10, ABSTRACT_ARROW),
|
||||
SPECTRAL_ARROW(24, ABSTRACT_ARROW),
|
||||
|
||||
ARMOR_STAND(30, ENTITY_LIVING),
|
||||
HURTING_PROJECTILE(ENTITY),
|
||||
DRAGON_FIREBALL(26, HURTING_PROJECTILE),
|
||||
FIREBALL(12, HURTING_PROJECTILE),
|
||||
SMALL_FIREBALL(13, HURTING_PROJECTILE),
|
||||
WITHER_SKULL(19, HURTING_PROJECTILE),
|
||||
|
||||
// Vehicles
|
||||
MINECART_ABSTRACT(-1, ENTITY),
|
||||
MINECART_COMMAND(40, MINECART_ABSTRACT),
|
||||
BOAT(41, ENTITY),
|
||||
MINECART_RIDEABLE(42, MINECART_ABSTRACT),
|
||||
MINECART_CHEST(43, MINECART_ABSTRACT),
|
||||
MINECART_FURNACE(44, MINECART_ABSTRACT),
|
||||
MINECART_TNT(45, MINECART_ABSTRACT),
|
||||
MINECART_HOPPER(46, MINECART_ABSTRACT),
|
||||
MINECART_MOB_SPAWNER(47, MINECART_ABSTRACT),
|
||||
|
||||
CREEPER(50, ENTITY_INSENTIENT),
|
||||
SKELETON(51, ENTITY_INSENTIENT),
|
||||
SPIDER(52, ENTITY_INSENTIENT),
|
||||
GIANT(53, ENTITY_INSENTIENT),
|
||||
ZOMBIE(54, ENTITY_INSENTIENT),
|
||||
SLIME(55, ENTITY_INSENTIENT),
|
||||
GHAST(56, ENTITY_INSENTIENT),
|
||||
PIG_ZOMBIE(57, ZOMBIE),
|
||||
ENDERMAN(58, ENTITY_INSENTIENT),
|
||||
CAVE_SPIDER(59, SPIDER),
|
||||
SILVERFISH(60, ENTITY_INSENTIENT),
|
||||
BLAZE(61, ENTITY_INSENTIENT),
|
||||
ABSTRACT_MINECART(ENTITY),
|
||||
MINECART(42, ABSTRACT_MINECART),
|
||||
FURNACE_MINECART(44, ABSTRACT_MINECART),
|
||||
COMMAND_BLOCK_MINECART(40, ABSTRACT_MINECART),
|
||||
TNT_MINECART(45, ABSTRACT_MINECART),
|
||||
SPAWNER_MINECART(47, ABSTRACT_MINECART),
|
||||
|
||||
ABSTRACT_MINECART_CONTAINER(ABSTRACT_MINECART),
|
||||
CHEST_MINECART(43, ABSTRACT_MINECART_CONTAINER),
|
||||
HOPPER_MINECART(46, ABSTRACT_MINECART_CONTAINER),
|
||||
|
||||
LIVING_ENTITY_BASE(ENTITY),
|
||||
ARMOR_STAND(30, LIVING_ENTITY_BASE),
|
||||
PLAYER(LIVING_ENTITY_BASE), // Needed for entity (un)tracking
|
||||
|
||||
// Living entities as a larger subclass
|
||||
LIVING_ENTITY(48, LIVING_ENTITY_BASE),
|
||||
ENDER_DRAGON(63, LIVING_ENTITY),
|
||||
ABSTRACT_CREATURE(LIVING_ENTITY),
|
||||
SLIME(55, LIVING_ENTITY),
|
||||
MAGMA_CUBE(62, SLIME),
|
||||
ENDER_DRAGON(63, ENTITY_INSENTIENT),
|
||||
WITHER(64, ENTITY_INSENTIENT),
|
||||
BAT(65, ENTITY_INSENTIENT),
|
||||
WITCH(66, ENTITY_INSENTIENT),
|
||||
ENDERMITE(67, ENTITY_INSENTIENT),
|
||||
GUARDIAN(68, ENTITY_INSENTIENT),
|
||||
IRON_GOLEM(99, ENTITY_INSENTIENT), // moved up to avoid illegal forward references
|
||||
SHULKER(69, IRON_GOLEM),
|
||||
PIG(90, ENTITY_AGEABLE),
|
||||
SHEEP(91, ENTITY_AGEABLE),
|
||||
COW(92, ENTITY_AGEABLE),
|
||||
CHICKEN(93, ENTITY_AGEABLE),
|
||||
SQUID(94, ENTITY_INSENTIENT),
|
||||
WOLF(95, ENTITY_TAMEABLE_ANIMAL),
|
||||
MUSHROOM_COW(96, COW),
|
||||
SNOWMAN(97, IRON_GOLEM),
|
||||
OCELOT(98, ENTITY_TAMEABLE_ANIMAL),
|
||||
HORSE(100, ENTITY_AGEABLE),
|
||||
RABBIT(101, ENTITY_AGEABLE),
|
||||
POLAR_BEAR(102, ENTITY_AGEABLE),
|
||||
VILLAGER(120, ENTITY_AGEABLE),
|
||||
ENDER_CRYSTAL(200, ENTITY),
|
||||
SPLASH_POTION(-1, ENTITY),
|
||||
LINGERING_POTION(-1, SPLASH_POTION),
|
||||
AREA_EFFECT_CLOUD(-1, ENTITY),
|
||||
EGG(-1, ENTITY),
|
||||
FISHING_HOOK(-1, ENTITY),
|
||||
LIGHTNING(-1, ENTITY),
|
||||
WEATHER(-1, ENTITY),
|
||||
PLAYER(-1, ENTITY_HUMAN),
|
||||
COMPLEX_PART(-1, ENTITY);
|
||||
|
||||
// Flying entities
|
||||
FLYING_MOB(LIVING_ENTITY),
|
||||
GHAST(56, FLYING_MOB),
|
||||
|
||||
AMBIENT_CREATURE(LIVING_ENTITY),
|
||||
BAT(65, AMBIENT_CREATURE),
|
||||
|
||||
ABSTRACT_GOLEM(ABSTRACT_CREATURE),
|
||||
SNOW_GOLEM(97, ABSTRACT_GOLEM),
|
||||
IRON_GOLEM(99, ABSTRACT_GOLEM),
|
||||
SHULKER(69, ABSTRACT_GOLEM),
|
||||
|
||||
WATER_ANIMAL(LIVING_ENTITY),
|
||||
SQUID(94, WATER_ANIMAL),
|
||||
|
||||
// Ageable mobs and (tamable) animals
|
||||
ABSTRACT_AGEABLE(ABSTRACT_CREATURE),
|
||||
VILLAGER(120, ABSTRACT_AGEABLE),
|
||||
|
||||
ABSTRACT_ANIMAL(ABSTRACT_AGEABLE),
|
||||
CHICKEN(93, ABSTRACT_ANIMAL),
|
||||
COW(92, ABSTRACT_ANIMAL),
|
||||
MOOSHROOM(96, COW),
|
||||
PIG(90, ABSTRACT_ANIMAL),
|
||||
POLAR_BEAR(102, ABSTRACT_ANIMAL),
|
||||
RABBIT(101, ABSTRACT_ANIMAL),
|
||||
SHEEP(91, ABSTRACT_ANIMAL),
|
||||
HORSE(100, ABSTRACT_ANIMAL),
|
||||
|
||||
TAMABLE_ANIMAL(ABSTRACT_ANIMAL),
|
||||
OCELOT(98, TAMABLE_ANIMAL),
|
||||
WOLF(95, TAMABLE_ANIMAL),
|
||||
|
||||
// Monsters
|
||||
ABSTRACT_MONSTER(49, ABSTRACT_CREATURE),
|
||||
BLAZE(61, ABSTRACT_MONSTER),
|
||||
CREEPER(50, ABSTRACT_MONSTER),
|
||||
ENDERMITE(67, ABSTRACT_MONSTER),
|
||||
ENDERMAN(58, ABSTRACT_MONSTER),
|
||||
GIANT(53, ABSTRACT_MONSTER),
|
||||
SILVERFISH(60, ABSTRACT_MONSTER),
|
||||
WITCH(66, ABSTRACT_MONSTER),
|
||||
WITHER(64, ABSTRACT_MONSTER),
|
||||
SKELETON(51, ABSTRACT_MONSTER),
|
||||
ZOMBIE(54, ABSTRACT_MONSTER),
|
||||
ZOMBIE_PIGMEN(57, ZOMBIE),
|
||||
|
||||
GUARDIAN(68, ABSTRACT_MONSTER),
|
||||
SPIDER(52, ABSTRACT_MONSTER),
|
||||
CAVE_SPIDER(59, SPIDER);
|
||||
|
||||
private static final Map<Integer, EntityType> TYPES = new HashMap<>();
|
||||
|
||||
private final int id;
|
||||
private final EntityType parent;
|
||||
|
||||
EntityType(int id) {
|
||||
this.id = id;
|
||||
EntityType() {
|
||||
this.id = -1;
|
||||
this.parent = null;
|
||||
}
|
||||
|
||||
EntityType(EntityType parent) {
|
||||
this.id = -1;
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
EntityType(int id, EntityType parent) {
|
||||
this.id = id;
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
static {
|
||||
for (EntityType type : EntityType.values()) {
|
||||
TYPES.put(type.id, type);
|
||||
}
|
||||
}
|
||||
|
||||
public static Optional<EntityType> findById(int id) {
|
||||
if (id == -1) // Check if this is called
|
||||
return Optional.empty();
|
||||
return Optional.ofNullable(TYPES.get(id));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getId() {
|
||||
return id;
|
||||
@ -179,16 +198,29 @@ public class EntityTypes1_10 {
|
||||
public boolean isAbstractType() {
|
||||
return id != -1;
|
||||
}
|
||||
|
||||
static {
|
||||
for (EntityType type : EntityType.values()) {
|
||||
TYPES.put(type.id, type);
|
||||
}
|
||||
}
|
||||
|
||||
public static EntityType findById(final int id) {
|
||||
if (id == -1) {
|
||||
return null;
|
||||
}
|
||||
return TYPES.get(id);
|
||||
}
|
||||
}
|
||||
|
||||
public enum ObjectType implements com.viaversion.viaversion.api.minecraft.entities.ObjectType {
|
||||
BOAT(1, EntityType.BOAT),
|
||||
ITEM(2, EntityType.DROPPED_ITEM),
|
||||
ITEM(2, EntityType.ITEM),
|
||||
AREA_EFFECT_CLOUD(3, EntityType.AREA_EFFECT_CLOUD),
|
||||
MINECART(10, EntityType.MINECART_RIDEABLE),
|
||||
TNT_PRIMED(50, EntityType.PRIMED_TNT),
|
||||
ENDER_CRYSTAL(51, EntityType.ENDER_CRYSTAL),
|
||||
TIPPED_ARROW(60, EntityType.TIPPED_ARROW),
|
||||
MINECART(10, EntityType.MINECART), // There are multiple types, but we don't need them
|
||||
TNT_PRIMED(50, EntityType.TNT),
|
||||
ENDER_CRYSTAL(51, EntityType.END_CRYSTAL),
|
||||
TIPPED_ARROW(60, EntityType.ARROW),
|
||||
SNOWBALL(61, EntityType.SNOWBALL),
|
||||
EGG(62, EntityType.EGG),
|
||||
FIREBALL(63, EntityType.FIREBALL),
|
||||
@ -198,11 +230,11 @@ public class EntityTypes1_10 {
|
||||
SHULKER_BULLET(67, EntityType.SHULKER_BULLET),
|
||||
FALLING_BLOCK(70, EntityType.FALLING_BLOCK),
|
||||
ITEM_FRAME(71, EntityType.ITEM_FRAME),
|
||||
ENDER_SIGNAL(72, EntityType.ENDER_SIGNAL),
|
||||
POTION(73, EntityType.SPLASH_POTION),
|
||||
THROWN_EXP_BOTTLE(75, EntityType.THROWN_EXP_BOTTLE),
|
||||
FIREWORK(76, EntityType.FIREWORK),
|
||||
LEASH(77, EntityType.LEASH_HITCH),
|
||||
EYE_OF_ENDER(72, EntityType.EYE_OF_ENDER),
|
||||
POTION(73, EntityType.POTION),
|
||||
EXPERIENCE_BOTTLE(75, EntityType.EXPERIENCE_BOTTLE),
|
||||
FIREWORK_ROCKET(76, EntityType.FIREWORK_ROCKET),
|
||||
LEASH(77, EntityType.LEASH_KNOT),
|
||||
ARMOR_STAND(78, EntityType.ARMOR_STAND),
|
||||
FISHIHNG_HOOK(90, EntityType.FISHING_HOOK),
|
||||
SPECTRAL_ARROW(91, EntityType.SPECTRAL_ARROW),
|
||||
@ -234,15 +266,16 @@ public class EntityTypes1_10 {
|
||||
return type;
|
||||
}
|
||||
|
||||
public static Optional<ObjectType> findById(int id) {
|
||||
if (id == -1)
|
||||
return Optional.empty();
|
||||
return Optional.ofNullable(TYPES.get(id));
|
||||
public static ObjectType findById(final int id) {
|
||||
if (id == -1) {
|
||||
return null;
|
||||
}
|
||||
return TYPES.get(id);
|
||||
}
|
||||
|
||||
public static Optional<EntityType> getPCEntity(int id) {
|
||||
Optional<ObjectType> output = findById(id);
|
||||
return output.map(objectType -> objectType.type);
|
||||
public static EntityType getEntityType(final int id) {
|
||||
final ObjectType objectType = findById(id);
|
||||
return objectType != null ? objectType.type : null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -25,152 +25,180 @@ package com.viaversion.viaversion.api.minecraft.entities;
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
// 1.11 Entity / Object ids
|
||||
public class EntityTypes1_11 {
|
||||
|
||||
public static EntityType getTypeFromId(int typeID, boolean isObject) {
|
||||
Optional<EntityType> type;
|
||||
public static EntityType getTypeFromId(final int typeId, final boolean object) {
|
||||
EntityType type;
|
||||
|
||||
if (isObject)
|
||||
type = ObjectType.getPCEntity(typeID);
|
||||
else
|
||||
type = EntityType.findById(typeID);
|
||||
|
||||
if (type.isEmpty()) {
|
||||
Via.getPlatform().getLogger().severe("Could not find 1.11 type id " + typeID + " isObject=" + isObject);
|
||||
if (object) {
|
||||
type = ObjectType.getEntityType(typeId);
|
||||
} else {
|
||||
type = EntityType.findById(typeId);
|
||||
}
|
||||
if (type == null) {
|
||||
Via.getPlatform().getLogger().severe("Could not find 1.11 type id " + typeId + " objectType=" + object);
|
||||
return EntityType.ENTITY; // Fall back to the basic ENTITY
|
||||
}
|
||||
|
||||
return type.get();
|
||||
return type;
|
||||
}
|
||||
|
||||
public enum EntityType implements com.viaversion.viaversion.api.minecraft.entities.EntityType {
|
||||
ENTITY(-1),
|
||||
DROPPED_ITEM(1, ENTITY),
|
||||
|
||||
ENTITY,
|
||||
|
||||
AREA_EFFECT_CLOUD(3, ENTITY),
|
||||
END_CRYSTAL(200, ENTITY),
|
||||
EVOKER_FANGS(33, ENTITY),
|
||||
EXPERIENCE_ORB(2, ENTITY),
|
||||
LEASH_HITCH(8, ENTITY), // Actually entity hanging, but it doesn't make a lot of difference for metadata
|
||||
PAINTING(9, ENTITY), // Actually entity hanging but, it doesn't make a lot of difference for metadata
|
||||
ARROW(10, ENTITY),
|
||||
SNOWBALL(11, ENTITY), // Actually EntityProjectile
|
||||
FIREBALL(12, ENTITY),
|
||||
SMALL_FIREBALL(13, ENTITY),
|
||||
ENDER_PEARL(14, ENTITY), // Actually EntityProjectile
|
||||
ENDER_SIGNAL(15, ENTITY),
|
||||
THROWN_EXP_BOTTLE(17, ENTITY),
|
||||
ITEM_FRAME(18, ENTITY), // Actually EntityHanging
|
||||
WITHER_SKULL(19, ENTITY),
|
||||
PRIMED_TNT(20, ENTITY),
|
||||
EYE_OF_ENDER(15, ENTITY),
|
||||
FALLING_BLOCK(21, ENTITY),
|
||||
FIREWORK(22, ENTITY),
|
||||
SPECTRAL_ARROW(24, ARROW),
|
||||
ITEM(1, ENTITY),
|
||||
TNT(20, ENTITY),
|
||||
LIGHTNING_BOLT(ENTITY), // Needed for entity (un)tracking
|
||||
|
||||
// Hanging entities
|
||||
HANGING_ENTITY(ENTITY),
|
||||
LEASH_KNOT(8, HANGING_ENTITY),
|
||||
ITEM_FRAME(18, HANGING_ENTITY),
|
||||
PAINTING(9, HANGING_ENTITY),
|
||||
|
||||
// Projectiles
|
||||
PROJECTILE(ENTITY),
|
||||
FIREWORK_ROCKET(22, ENTITY),
|
||||
LLAMA_SPIT(104, ENTITY),
|
||||
SHULKER_BULLET(25, ENTITY),
|
||||
DRAGON_FIREBALL(26, FIREBALL),
|
||||
EVOCATION_FANGS(33, ENTITY),
|
||||
SNOWBALL(11, PROJECTILE),
|
||||
ENDER_PEARL(14, PROJECTILE),
|
||||
EGG(7, PROJECTILE),
|
||||
EXPERIENCE_BOTTLE(17, PROJECTILE),
|
||||
POTION(16, PROJECTILE),
|
||||
FISHING_HOOK(ENTITY),
|
||||
|
||||
ABSTRACT_ARROW(ENTITY),
|
||||
ARROW(10, ABSTRACT_ARROW),
|
||||
SPECTRAL_ARROW(24, ABSTRACT_ARROW),
|
||||
|
||||
ENTITY_LIVING(-1, ENTITY),
|
||||
ENTITY_INSENTIENT(-1, ENTITY_LIVING),
|
||||
ENTITY_AGEABLE(-1, ENTITY_INSENTIENT),
|
||||
ENTITY_TAMEABLE_ANIMAL(-1, ENTITY_AGEABLE),
|
||||
ENTITY_HUMAN(-1, ENTITY_LIVING),
|
||||
|
||||
ARMOR_STAND(30, ENTITY_LIVING),
|
||||
EVOCATION_ILLAGER(34, ENTITY_INSENTIENT),
|
||||
VEX(35, ENTITY_INSENTIENT),
|
||||
VINDICATION_ILLAGER(36, ENTITY_INSENTIENT),
|
||||
HURTING_PROJECTILE(ENTITY),
|
||||
DRAGON_FIREBALL(26, HURTING_PROJECTILE),
|
||||
FIREBALL(12, HURTING_PROJECTILE),
|
||||
SMALL_FIREBALL(13, HURTING_PROJECTILE),
|
||||
WITHER_SKULL(19, HURTING_PROJECTILE),
|
||||
|
||||
// Vehicles
|
||||
MINECART_ABSTRACT(-1, ENTITY),
|
||||
MINECART_COMMAND(40, MINECART_ABSTRACT),
|
||||
BOAT(41, ENTITY),
|
||||
MINECART_RIDEABLE(42, MINECART_ABSTRACT),
|
||||
MINECART_CHEST(43, MINECART_ABSTRACT),
|
||||
MINECART_FURNACE(44, MINECART_ABSTRACT),
|
||||
MINECART_TNT(45, MINECART_ABSTRACT),
|
||||
MINECART_HOPPER(46, MINECART_ABSTRACT),
|
||||
MINECART_MOB_SPAWNER(47, MINECART_ABSTRACT),
|
||||
|
||||
CREEPER(50, ENTITY_INSENTIENT),
|
||||
ABSTRACT_MINECART(ENTITY),
|
||||
MINECART(42, ABSTRACT_MINECART),
|
||||
FURNACE_MINECART(44, ABSTRACT_MINECART),
|
||||
COMMAND_BLOCK_MINECART(40, ABSTRACT_MINECART),
|
||||
TNT_MINECART(45, ABSTRACT_MINECART),
|
||||
SPAWNER_MINECART(47, ABSTRACT_MINECART),
|
||||
|
||||
ABSTRACT_SKELETON(-1, ENTITY_INSENTIENT),
|
||||
SKELETON(51, ABSTRACT_SKELETON),
|
||||
WITHER_SKELETON(5, ABSTRACT_SKELETON),
|
||||
STRAY(6, ABSTRACT_SKELETON),
|
||||
ABSTRACT_MINECART_CONTAINER(ABSTRACT_MINECART),
|
||||
CHEST_MINECART(43, ABSTRACT_MINECART_CONTAINER),
|
||||
HOPPER_MINECART(46, ABSTRACT_MINECART_CONTAINER),
|
||||
|
||||
SPIDER(52, ENTITY_INSENTIENT),
|
||||
GIANT(53, ENTITY_INSENTIENT),
|
||||
LIVING_ENTITY_BASE(ENTITY),
|
||||
ARMOR_STAND(30, LIVING_ENTITY_BASE),
|
||||
PLAYER(LIVING_ENTITY_BASE), // Needed for entity (un)tracking
|
||||
|
||||
ZOMBIE(54, ENTITY_INSENTIENT),
|
||||
HUSK(23, ZOMBIE),
|
||||
ZOMBIE_VILLAGER(27, ZOMBIE),
|
||||
|
||||
SLIME(55, ENTITY_INSENTIENT),
|
||||
GHAST(56, ENTITY_INSENTIENT),
|
||||
PIG_ZOMBIE(57, ZOMBIE),
|
||||
ENDERMAN(58, ENTITY_INSENTIENT),
|
||||
CAVE_SPIDER(59, SPIDER),
|
||||
SILVERFISH(60, ENTITY_INSENTIENT),
|
||||
BLAZE(61, ENTITY_INSENTIENT),
|
||||
// Living entities as a larger subclass
|
||||
LIVING_ENTITY(LIVING_ENTITY_BASE),
|
||||
ENDER_DRAGON(63, LIVING_ENTITY),
|
||||
ABSTRACT_CREATURE(LIVING_ENTITY),
|
||||
SLIME(55, LIVING_ENTITY),
|
||||
MAGMA_CUBE(62, SLIME),
|
||||
ENDER_DRAGON(63, ENTITY_INSENTIENT),
|
||||
WITHER(64, ENTITY_INSENTIENT),
|
||||
BAT(65, ENTITY_INSENTIENT),
|
||||
WITCH(66, ENTITY_INSENTIENT),
|
||||
ENDERMITE(67, ENTITY_INSENTIENT),
|
||||
|
||||
GUARDIAN(68, ENTITY_INSENTIENT),
|
||||
ELDER_GUARDIAN(4, GUARDIAN), // Moved down to avoid illegal forward reference
|
||||
// Flying entities
|
||||
FLYING_MOB(LIVING_ENTITY),
|
||||
GHAST(56, FLYING_MOB),
|
||||
|
||||
IRON_GOLEM(99, ENTITY_INSENTIENT), // moved up to avoid illegal forward references
|
||||
SHULKER(69, IRON_GOLEM),
|
||||
PIG(90, ENTITY_AGEABLE),
|
||||
SHEEP(91, ENTITY_AGEABLE),
|
||||
COW(92, ENTITY_AGEABLE),
|
||||
CHICKEN(93, ENTITY_AGEABLE),
|
||||
SQUID(94, ENTITY_INSENTIENT),
|
||||
WOLF(95, ENTITY_TAMEABLE_ANIMAL),
|
||||
MUSHROOM_COW(96, COW),
|
||||
SNOWMAN(97, IRON_GOLEM),
|
||||
OCELOT(98, ENTITY_TAMEABLE_ANIMAL),
|
||||
AMBIENT_CREATURE(LIVING_ENTITY),
|
||||
BAT(65, AMBIENT_CREATURE),
|
||||
|
||||
ABSTRACT_HORSE(-1, ENTITY_AGEABLE),
|
||||
ABSTRACT_GOLEM(ABSTRACT_CREATURE),
|
||||
SNOW_GOLEM(97, ABSTRACT_GOLEM),
|
||||
IRON_GOLEM(99, ABSTRACT_GOLEM),
|
||||
SHULKER(69, ABSTRACT_GOLEM),
|
||||
|
||||
WATER_ANIMAL(ABSTRACT_CREATURE),
|
||||
SQUID(94, WATER_ANIMAL),
|
||||
|
||||
// Ageable mobs and (tamable) animals
|
||||
ABSTRACT_AGEABLE(ABSTRACT_CREATURE),
|
||||
VILLAGER(120, ABSTRACT_AGEABLE),
|
||||
|
||||
ABSTRACT_ANIMAL(ABSTRACT_AGEABLE),
|
||||
CHICKEN(93, ABSTRACT_ANIMAL),
|
||||
COW(92, ABSTRACT_ANIMAL),
|
||||
MOOSHROOM(96, COW),
|
||||
PIG(90, ABSTRACT_ANIMAL),
|
||||
POLAR_BEAR(102, ABSTRACT_ANIMAL),
|
||||
RABBIT(101, ABSTRACT_ANIMAL),
|
||||
SHEEP(91, ABSTRACT_ANIMAL),
|
||||
|
||||
TAMABLE_ANIMAL(ABSTRACT_ANIMAL),
|
||||
OCELOT(98, TAMABLE_ANIMAL),
|
||||
WOLF(95, TAMABLE_ANIMAL),
|
||||
|
||||
// Horses
|
||||
ABSTRACT_HORSE(ABSTRACT_ANIMAL),
|
||||
HORSE(100, ABSTRACT_HORSE),
|
||||
SKELETON_HORSE(28, ABSTRACT_HORSE),
|
||||
ZOMBIE_HORSE(29, ABSTRACT_HORSE),
|
||||
|
||||
CHESTED_HORSE(-1, ABSTRACT_HORSE),
|
||||
CHESTED_HORSE(ABSTRACT_HORSE),
|
||||
DONKEY(31, CHESTED_HORSE),
|
||||
MULE(32, CHESTED_HORSE),
|
||||
LIAMA(103, CHESTED_HORSE),
|
||||
LLAMA(103, CHESTED_HORSE),
|
||||
|
||||
// Monsters
|
||||
ABSTRACT_MONSTER(ABSTRACT_CREATURE),
|
||||
BLAZE(61, ABSTRACT_MONSTER),
|
||||
CREEPER(50, ABSTRACT_MONSTER),
|
||||
ENDERMITE(67, ABSTRACT_MONSTER),
|
||||
ENDERMAN(58, ABSTRACT_MONSTER),
|
||||
GIANT(53, ABSTRACT_MONSTER),
|
||||
SILVERFISH(60, ABSTRACT_MONSTER),
|
||||
VEX(35, ABSTRACT_MONSTER),
|
||||
WITCH(66, ABSTRACT_MONSTER),
|
||||
WITHER(64, ABSTRACT_MONSTER),
|
||||
|
||||
RABBIT(101, ENTITY_AGEABLE),
|
||||
POLAR_BEAR(102, ENTITY_AGEABLE),
|
||||
VILLAGER(120, ENTITY_AGEABLE),
|
||||
ENDER_CRYSTAL(200, ENTITY),
|
||||
SPLASH_POTION(-1, ENTITY),
|
||||
LINGERING_POTION(-1, SPLASH_POTION),
|
||||
AREA_EFFECT_CLOUD(-1, ENTITY),
|
||||
EGG(-1, ENTITY),
|
||||
FISHING_HOOK(-1, ENTITY),
|
||||
LIGHTNING(-1, ENTITY),
|
||||
WEATHER(-1, ENTITY),
|
||||
PLAYER(-1, ENTITY_HUMAN),
|
||||
COMPLEX_PART(-1, ENTITY),
|
||||
LIAMA_SPIT(-1, ENTITY);
|
||||
ABSTRACT_SKELETON(ABSTRACT_MONSTER),
|
||||
SKELETON(51, ABSTRACT_SKELETON),
|
||||
STRAY(6, ABSTRACT_SKELETON),
|
||||
WITHER_SKELETON(5, ABSTRACT_SKELETON),
|
||||
|
||||
ZOMBIE(54, ABSTRACT_MONSTER),
|
||||
HUSK(23, ZOMBIE),
|
||||
ZOMBIE_PIGMEN(57, ZOMBIE),
|
||||
ZOMBIE_VILLAGER(27, ZOMBIE),
|
||||
|
||||
GUARDIAN(68, ABSTRACT_MONSTER),
|
||||
ELDER_GUARDIAN(4, GUARDIAN),
|
||||
SPIDER(52, ABSTRACT_MONSTER),
|
||||
CAVE_SPIDER(59, ABSTRACT_MONSTER),
|
||||
|
||||
// Illagers
|
||||
EVOKER(34, ABSTRACT_MONSTER),
|
||||
VINDICATOR(36, ABSTRACT_MONSTER);
|
||||
|
||||
private static final Map<Integer, EntityType> TYPES = new HashMap<>();
|
||||
|
||||
private final int id;
|
||||
private final EntityType parent;
|
||||
|
||||
EntityType(int id) {
|
||||
this.id = id;
|
||||
EntityType() {
|
||||
this.id = -1;
|
||||
this.parent = null;
|
||||
}
|
||||
|
||||
EntityType(EntityType parent) {
|
||||
this.id = -1;
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
EntityType(int id, EntityType parent) {
|
||||
this.id = id;
|
||||
this.parent = parent;
|
||||
@ -202,20 +230,21 @@ public class EntityTypes1_11 {
|
||||
}
|
||||
}
|
||||
|
||||
public static Optional<EntityType> findById(int id) {
|
||||
if (id == -1) // Check if this is called
|
||||
return Optional.empty();
|
||||
return Optional.ofNullable(TYPES.get(id));
|
||||
public static EntityType findById(final int id) {
|
||||
if (id == -1) {
|
||||
return null;
|
||||
}
|
||||
return TYPES.get(id);
|
||||
}
|
||||
}
|
||||
|
||||
public enum ObjectType implements com.viaversion.viaversion.api.minecraft.entities.ObjectType {
|
||||
BOAT(1, EntityType.BOAT),
|
||||
ITEM(2, EntityType.DROPPED_ITEM),
|
||||
ITEM(2, EntityType.ITEM),
|
||||
AREA_EFFECT_CLOUD(3, EntityType.AREA_EFFECT_CLOUD),
|
||||
MINECART(10, EntityType.MINECART_RIDEABLE),
|
||||
TNT_PRIMED(50, EntityType.PRIMED_TNT),
|
||||
ENDER_CRYSTAL(51, EntityType.ENDER_CRYSTAL),
|
||||
MINECART(10, EntityType.MINECART), // There are multiple types, but we don't need them
|
||||
TNT_PRIMED(50, EntityType.TNT),
|
||||
ENDER_CRYSTAL(51, EntityType.END_CRYSTAL),
|
||||
TIPPED_ARROW(60, EntityType.ARROW),
|
||||
SNOWBALL(61, EntityType.SNOWBALL),
|
||||
EGG(62, EntityType.EGG),
|
||||
@ -224,16 +253,16 @@ public class EntityTypes1_11 {
|
||||
ENDER_PEARL(65, EntityType.ENDER_PEARL),
|
||||
WITHER_SKULL(66, EntityType.WITHER_SKULL),
|
||||
SHULKER_BULLET(67, EntityType.SHULKER_BULLET),
|
||||
LIAMA_SPIT(68, EntityType.LIAMA_SPIT),
|
||||
LLAMA_SPIT(68, EntityType.LLAMA_SPIT),
|
||||
FALLING_BLOCK(70, EntityType.FALLING_BLOCK),
|
||||
ITEM_FRAME(71, EntityType.ITEM_FRAME),
|
||||
ENDER_SIGNAL(72, EntityType.ENDER_SIGNAL),
|
||||
POTION(73, EntityType.SPLASH_POTION),
|
||||
THROWN_EXP_BOTTLE(75, EntityType.THROWN_EXP_BOTTLE),
|
||||
FIREWORK(76, EntityType.FIREWORK),
|
||||
LEASH(77, EntityType.LEASH_HITCH),
|
||||
EYE_OF_ENDER(72, EntityType.EYE_OF_ENDER),
|
||||
POTION(73, EntityType.POTION),
|
||||
EXPERIENCE_BOTTLE(75, EntityType.EXPERIENCE_BOTTLE),
|
||||
FIREWORK_ROCKET(76, EntityType.FIREWORK_ROCKET),
|
||||
LEASH(77, EntityType.LEASH_KNOT),
|
||||
ARMOR_STAND(78, EntityType.ARMOR_STAND),
|
||||
EVOCATION_FANGS(79, EntityType.EVOCATION_FANGS),
|
||||
EVOKER_FANGS(79, EntityType.EVOKER_FANGS),
|
||||
FISHIHNG_HOOK(90, EntityType.FISHING_HOOK),
|
||||
SPECTRAL_ARROW(91, EntityType.SPECTRAL_ARROW),
|
||||
DRAGON_FIREBALL(93, EntityType.DRAGON_FIREBALL);
|
||||
@ -264,15 +293,16 @@ public class EntityTypes1_11 {
|
||||
return type;
|
||||
}
|
||||
|
||||
public static Optional<ObjectType> findById(int id) {
|
||||
if (id == -1)
|
||||
return Optional.empty();
|
||||
return Optional.ofNullable(TYPES.get(id));
|
||||
public static ObjectType findById(final int id) {
|
||||
if (id == -1) {
|
||||
return null;
|
||||
}
|
||||
return TYPES.get(id);
|
||||
}
|
||||
|
||||
public static Optional<EntityType> getPCEntity(int id) {
|
||||
Optional<ObjectType> output = findById(id);
|
||||
return output.map(objectType -> objectType.type);
|
||||
public static EntityType getEntityType(final int id) {
|
||||
final ObjectType objectType = findById(id);
|
||||
return objectType != null ? objectType.type : null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -20,161 +20,191 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package com.viaversion.viaversion.api.minecraft.entities;
|
||||
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
// 1.12 Entity / Object taken from https://github.com/Matsv/ViaBackwards/blob/master/core/src/main/java/nl/matsv/viabackwards/api/entities/types/EntityType1_12.java
|
||||
public class EntityTypes1_12 {
|
||||
|
||||
public static EntityType getTypeFromId(int typeID, boolean isObject) {
|
||||
Optional<EntityType> type;
|
||||
public static EntityType getTypeFromId(final int typeId, final boolean object) {
|
||||
EntityType type;
|
||||
|
||||
if (isObject)
|
||||
type = ObjectType.getPCEntity(typeID);
|
||||
else
|
||||
type = EntityType.findById(typeID);
|
||||
|
||||
if (type.isEmpty()) {
|
||||
Via.getPlatform().getLogger().severe("Could not find 1.12 type id " + typeID + " isObject=" + isObject);
|
||||
if (object) {
|
||||
type = ObjectType.getEntityType(typeId);
|
||||
} else {
|
||||
type = EntityType.findById(typeId);
|
||||
}
|
||||
if (type == null) {
|
||||
Via.getPlatform().getLogger().severe("Could not find 1.12 type id " + typeId + " objectType=" + object);
|
||||
return EntityType.ENTITY; // Fall back to the basic ENTITY
|
||||
}
|
||||
|
||||
return type.get();
|
||||
return type;
|
||||
}
|
||||
|
||||
public enum EntityType implements com.viaversion.viaversion.api.minecraft.entities.EntityType {
|
||||
ENTITY(-1),
|
||||
DROPPED_ITEM(1, ENTITY),
|
||||
|
||||
ENTITY,
|
||||
|
||||
AREA_EFFECT_CLOUD(3, ENTITY),
|
||||
END_CRYSTAL(200, ENTITY),
|
||||
EVOKER_FANGS(33, ENTITY),
|
||||
EXPERIENCE_ORB(2, ENTITY),
|
||||
LEASH_HITCH(8, ENTITY), // Actually entity hanging, but it doesn't make a lot of difference for metadata
|
||||
PAINTING(9, ENTITY), // Actually entity hanging, but it doesn't make a lot of difference for metadata
|
||||
ARROW(10, ENTITY),
|
||||
SNOWBALL(11, ENTITY), // Actually EntityProjectile
|
||||
FIREBALL(12, ENTITY),
|
||||
SMALL_FIREBALL(13, ENTITY),
|
||||
ENDER_PEARL(14, ENTITY), // Actually EntityProjectile
|
||||
ENDER_SIGNAL(15, ENTITY),
|
||||
THROWN_EXP_BOTTLE(17, ENTITY),
|
||||
ITEM_FRAME(18, ENTITY), // Actually EntityHanging
|
||||
WITHER_SKULL(19, ENTITY),
|
||||
PRIMED_TNT(20, ENTITY),
|
||||
EYE_OF_ENDER(15, ENTITY),
|
||||
FALLING_BLOCK(21, ENTITY),
|
||||
FIREWORK(22, ENTITY),
|
||||
SPECTRAL_ARROW(24, ARROW),
|
||||
ITEM(1, ENTITY),
|
||||
TNT(20, ENTITY),
|
||||
LIGHTNING_BOLT(ENTITY), // Needed for entity (un)tracking
|
||||
|
||||
// Hanging entities
|
||||
HANGING_ENTITY(ENTITY),
|
||||
LEASH_KNOT(8, HANGING_ENTITY),
|
||||
ITEM_FRAME(18, HANGING_ENTITY),
|
||||
PAINTING(9, HANGING_ENTITY),
|
||||
|
||||
// Projectiles
|
||||
PROJECTILE(ENTITY),
|
||||
FIREWORK_ROCKET(22, ENTITY),
|
||||
LLAMA_SPIT(104, ENTITY),
|
||||
SHULKER_BULLET(25, ENTITY),
|
||||
DRAGON_FIREBALL(26, FIREBALL),
|
||||
EVOCATION_FANGS(33, ENTITY),
|
||||
SNOWBALL(11, PROJECTILE),
|
||||
ENDER_PEARL(14, PROJECTILE),
|
||||
EGG(7, PROJECTILE),
|
||||
EXPERIENCE_BOTTLE(17, PROJECTILE),
|
||||
POTION(16, PROJECTILE),
|
||||
FISHING_HOOK(ENTITY),
|
||||
|
||||
ABSTRACT_ARROW(ENTITY),
|
||||
ARROW(10, ABSTRACT_ARROW),
|
||||
SPECTRAL_ARROW(24, ABSTRACT_ARROW),
|
||||
|
||||
ENTITY_LIVING(-1, ENTITY),
|
||||
ENTITY_INSENTIENT(-1, ENTITY_LIVING),
|
||||
ENTITY_AGEABLE(-1, ENTITY_INSENTIENT),
|
||||
ENTITY_TAMEABLE_ANIMAL(-1, ENTITY_AGEABLE),
|
||||
ENTITY_HUMAN(-1, ENTITY_LIVING),
|
||||
|
||||
ARMOR_STAND(30, ENTITY_LIVING),
|
||||
ENTITY_ILLAGER_ABSTRACT(-1, ENTITY_INSENTIENT),
|
||||
EVOCATION_ILLAGER(34, ENTITY_ILLAGER_ABSTRACT),
|
||||
VEX(35, ENTITY_INSENTIENT),
|
||||
VINDICATION_ILLAGER(36, ENTITY_ILLAGER_ABSTRACT),
|
||||
ILLUSION_ILLAGER(37, EVOCATION_ILLAGER),
|
||||
HURTING_PROJECTILE(ENTITY),
|
||||
DRAGON_FIREBALL(26, HURTING_PROJECTILE),
|
||||
FIREBALL(12, HURTING_PROJECTILE),
|
||||
SMALL_FIREBALL(13, HURTING_PROJECTILE),
|
||||
WITHER_SKULL(19, HURTING_PROJECTILE),
|
||||
|
||||
// Vehicles
|
||||
MINECART_ABSTRACT(-1, ENTITY),
|
||||
MINECART_COMMAND(40, MINECART_ABSTRACT),
|
||||
BOAT(41, ENTITY),
|
||||
MINECART_RIDEABLE(42, MINECART_ABSTRACT),
|
||||
MINECART_CHEST(43, MINECART_ABSTRACT),
|
||||
MINECART_FURNACE(44, MINECART_ABSTRACT),
|
||||
MINECART_TNT(45, MINECART_ABSTRACT),
|
||||
MINECART_HOPPER(46, MINECART_ABSTRACT),
|
||||
MINECART_MOB_SPAWNER(47, MINECART_ABSTRACT),
|
||||
|
||||
CREEPER(50, ENTITY_INSENTIENT),
|
||||
ABSTRACT_MINECART(ENTITY),
|
||||
MINECART(42, ABSTRACT_MINECART),
|
||||
FURNACE_MINECART(44, ABSTRACT_MINECART),
|
||||
COMMAND_BLOCK_MINECART(40, ABSTRACT_MINECART),
|
||||
TNT_MINECART(45, ABSTRACT_MINECART),
|
||||
SPAWNER_MINECART(47, ABSTRACT_MINECART),
|
||||
|
||||
ABSTRACT_SKELETON(-1, ENTITY_INSENTIENT),
|
||||
SKELETON(51, ABSTRACT_SKELETON),
|
||||
WITHER_SKELETON(5, ABSTRACT_SKELETON),
|
||||
STRAY(6, ABSTRACT_SKELETON),
|
||||
ABSTRACT_MINECART_CONTAINER(ABSTRACT_MINECART),
|
||||
CHEST_MINECART(43, ABSTRACT_MINECART_CONTAINER),
|
||||
HOPPER_MINECART(46, ABSTRACT_MINECART_CONTAINER),
|
||||
|
||||
SPIDER(52, ENTITY_INSENTIENT),
|
||||
GIANT(53, ENTITY_INSENTIENT),
|
||||
LIVING_ENTITY_BASE(ENTITY),
|
||||
ARMOR_STAND(30, LIVING_ENTITY_BASE),
|
||||
PLAYER(ENTITY), // Needed for entity (un)tracking
|
||||
|
||||
ZOMBIE(54, ENTITY_INSENTIENT),
|
||||
HUSK(23, ZOMBIE),
|
||||
ZOMBIE_VILLAGER(27, ZOMBIE),
|
||||
|
||||
SLIME(55, ENTITY_INSENTIENT),
|
||||
GHAST(56, ENTITY_INSENTIENT),
|
||||
PIG_ZOMBIE(57, ZOMBIE),
|
||||
ENDERMAN(58, ENTITY_INSENTIENT),
|
||||
CAVE_SPIDER(59, SPIDER),
|
||||
SILVERFISH(60, ENTITY_INSENTIENT),
|
||||
BLAZE(61, ENTITY_INSENTIENT),
|
||||
// Living entities as a larger subclass
|
||||
LIVING_ENTITY(LIVING_ENTITY_BASE),
|
||||
ENDER_DRAGON(63, LIVING_ENTITY),
|
||||
ABSTRACT_CREATURE(LIVING_ENTITY),
|
||||
SLIME(55, LIVING_ENTITY),
|
||||
MAGMA_CUBE(62, SLIME),
|
||||
ENDER_DRAGON(63, ENTITY_INSENTIENT),
|
||||
WITHER(64, ENTITY_INSENTIENT),
|
||||
BAT(65, ENTITY_INSENTIENT),
|
||||
WITCH(66, ENTITY_INSENTIENT),
|
||||
ENDERMITE(67, ENTITY_INSENTIENT),
|
||||
|
||||
GUARDIAN(68, ENTITY_INSENTIENT),
|
||||
ELDER_GUARDIAN(4, GUARDIAN), // Moved down to avoid illegal forward reference
|
||||
// Flying entities
|
||||
FLYING_MOB(LIVING_ENTITY),
|
||||
GHAST(56, FLYING_MOB),
|
||||
|
||||
IRON_GOLEM(99, ENTITY_INSENTIENT), // moved up to avoid illegal forward references
|
||||
SHULKER(69, IRON_GOLEM),
|
||||
PIG(90, ENTITY_AGEABLE),
|
||||
SHEEP(91, ENTITY_AGEABLE),
|
||||
COW(92, ENTITY_AGEABLE),
|
||||
CHICKEN(93, ENTITY_AGEABLE),
|
||||
SQUID(94, ENTITY_INSENTIENT),
|
||||
WOLF(95, ENTITY_TAMEABLE_ANIMAL),
|
||||
MUSHROOM_COW(96, COW),
|
||||
SNOWMAN(97, IRON_GOLEM),
|
||||
OCELOT(98, ENTITY_TAMEABLE_ANIMAL),
|
||||
PARROT(105, ENTITY_TAMEABLE_ANIMAL),
|
||||
AMBIENT_CREATURE(LIVING_ENTITY),
|
||||
BAT(65, AMBIENT_CREATURE),
|
||||
|
||||
ABSTRACT_HORSE(-1, ENTITY_AGEABLE),
|
||||
ABSTRACT_GOLEM(ABSTRACT_CREATURE),
|
||||
SNOW_GOLEM(97, ABSTRACT_GOLEM),
|
||||
IRON_GOLEM(99, ABSTRACT_GOLEM),
|
||||
SHULKER(69, ABSTRACT_GOLEM),
|
||||
|
||||
WATER_ANIMAL(ABSTRACT_CREATURE),
|
||||
SQUID(94, WATER_ANIMAL),
|
||||
|
||||
// Ageable mobs and (tamable) animals
|
||||
ABSTRACT_AGEABLE(ABSTRACT_CREATURE),
|
||||
VILLAGER(120, ABSTRACT_AGEABLE),
|
||||
|
||||
ABSTRACT_ANIMAL(ABSTRACT_AGEABLE),
|
||||
CHICKEN(93, ABSTRACT_ANIMAL),
|
||||
COW(92, ABSTRACT_ANIMAL),
|
||||
MOOSHROOM(96, COW),
|
||||
PIG(90, ABSTRACT_ANIMAL),
|
||||
POLAR_BEAR(102, ABSTRACT_ANIMAL),
|
||||
RABBIT(101, ABSTRACT_ANIMAL),
|
||||
SHEEP(91, ABSTRACT_ANIMAL),
|
||||
|
||||
TAMABLE_ANIMAL(ABSTRACT_ANIMAL),
|
||||
OCELOT(98, TAMABLE_ANIMAL),
|
||||
WOLF(95, TAMABLE_ANIMAL),
|
||||
|
||||
ABSTRACT_SHOULDER_RIDING(TAMABLE_ANIMAL),
|
||||
PARROT(105, ABSTRACT_SHOULDER_RIDING),
|
||||
|
||||
// Horses
|
||||
ABSTRACT_HORSE(ABSTRACT_ANIMAL),
|
||||
HORSE(100, ABSTRACT_HORSE),
|
||||
SKELETON_HORSE(28, ABSTRACT_HORSE),
|
||||
ZOMBIE_HORSE(29, ABSTRACT_HORSE),
|
||||
|
||||
CHESTED_HORSE(-1, ABSTRACT_HORSE),
|
||||
CHESTED_HORSE(ABSTRACT_HORSE),
|
||||
DONKEY(31, CHESTED_HORSE),
|
||||
MULE(32, CHESTED_HORSE),
|
||||
LIAMA(103, CHESTED_HORSE),
|
||||
LLAMA(103, CHESTED_HORSE),
|
||||
|
||||
// Monsters
|
||||
ABSTRACT_MONSTER(ABSTRACT_CREATURE),
|
||||
BLAZE(61, ABSTRACT_MONSTER),
|
||||
CREEPER(50, ABSTRACT_MONSTER),
|
||||
ENDERMITE(67, ABSTRACT_MONSTER),
|
||||
ENDERMAN(58, ABSTRACT_MONSTER),
|
||||
GIANT(53, ABSTRACT_MONSTER),
|
||||
SILVERFISH(60, ABSTRACT_MONSTER),
|
||||
VEX(35, ABSTRACT_MONSTER),
|
||||
WITCH(66, ABSTRACT_MONSTER),
|
||||
WITHER(64, ABSTRACT_MONSTER),
|
||||
|
||||
RABBIT(101, ENTITY_AGEABLE),
|
||||
POLAR_BEAR(102, ENTITY_AGEABLE),
|
||||
VILLAGER(120, ENTITY_AGEABLE),
|
||||
ENDER_CRYSTAL(200, ENTITY),
|
||||
SPLASH_POTION(-1, ENTITY),
|
||||
LINGERING_POTION(-1, SPLASH_POTION),
|
||||
AREA_EFFECT_CLOUD(-1, ENTITY),
|
||||
EGG(-1, ENTITY),
|
||||
FISHING_HOOK(-1, ENTITY),
|
||||
LIGHTNING(-1, ENTITY),
|
||||
WEATHER(-1, ENTITY),
|
||||
PLAYER(-1, ENTITY_HUMAN),
|
||||
COMPLEX_PART(-1, ENTITY),
|
||||
LIAMA_SPIT(-1, ENTITY);
|
||||
ABSTRACT_SKELETON(ABSTRACT_MONSTER),
|
||||
SKELETON(51, ABSTRACT_SKELETON),
|
||||
STRAY(6, ABSTRACT_SKELETON),
|
||||
WITHER_SKELETON(5, ABSTRACT_SKELETON),
|
||||
|
||||
ZOMBIE(54, ABSTRACT_MONSTER),
|
||||
HUSK(23, ZOMBIE),
|
||||
ZOMBIE_PIGMEN(57, ZOMBIE),
|
||||
ZOMBIE_VILLAGER(27, ZOMBIE),
|
||||
|
||||
GUARDIAN(68, ABSTRACT_MONSTER),
|
||||
ELDER_GUARDIAN(4, GUARDIAN),
|
||||
SPIDER(52, ABSTRACT_MONSTER),
|
||||
CAVE_SPIDER(59, ABSTRACT_MONSTER),
|
||||
|
||||
// Illagers
|
||||
ABSTRACT_ILLAGER(ABSTRACT_MONSTER),
|
||||
SPELLCASTER_ILLAGER(ABSTRACT_ILLAGER),
|
||||
VINDICATOR(36, ABSTRACT_ILLAGER),
|
||||
EVOKER(34, SPELLCASTER_ILLAGER),
|
||||
ILLUSIONER(37, SPELLCASTER_ILLAGER);
|
||||
|
||||
private static final Map<Integer, EntityType> TYPES = new HashMap<>();
|
||||
|
||||
private final int id;
|
||||
private final EntityType parent;
|
||||
|
||||
EntityType(int id) {
|
||||
this.id = id;
|
||||
EntityType() {
|
||||
this.id = -1;
|
||||
this.parent = null;
|
||||
}
|
||||
|
||||
EntityType(EntityType parent) {
|
||||
this.id = -1;
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
EntityType(int id, EntityType parent) {
|
||||
this.id = id;
|
||||
this.parent = parent;
|
||||
@ -206,20 +236,21 @@ public class EntityTypes1_12 {
|
||||
}
|
||||
}
|
||||
|
||||
public static Optional<EntityType> findById(int id) {
|
||||
if (id == -1) // Check if this is called
|
||||
return Optional.empty();
|
||||
return Optional.ofNullable(TYPES.get(id));
|
||||
public static EntityType findById(final int id) {
|
||||
if (id == -1) {
|
||||
return null;
|
||||
}
|
||||
return TYPES.get(id);
|
||||
}
|
||||
}
|
||||
|
||||
public enum ObjectType implements com.viaversion.viaversion.api.minecraft.entities.ObjectType {
|
||||
BOAT(1, EntityType.BOAT),
|
||||
ITEM(2, EntityType.DROPPED_ITEM),
|
||||
ITEM(2, EntityType.ITEM),
|
||||
AREA_EFFECT_CLOUD(3, EntityType.AREA_EFFECT_CLOUD),
|
||||
MINECART(10, EntityType.MINECART_RIDEABLE),
|
||||
TNT_PRIMED(50, EntityType.PRIMED_TNT),
|
||||
ENDER_CRYSTAL(51, EntityType.ENDER_CRYSTAL),
|
||||
MINECART(10, EntityType.MINECART), // There are multiple types, but we don't need them
|
||||
TNT_PRIMED(50, EntityType.TNT),
|
||||
ENDER_CRYSTAL(51, EntityType.END_CRYSTAL),
|
||||
TIPPED_ARROW(60, EntityType.ARROW),
|
||||
SNOWBALL(61, EntityType.SNOWBALL),
|
||||
EGG(62, EntityType.EGG),
|
||||
@ -228,16 +259,16 @@ public class EntityTypes1_12 {
|
||||
ENDER_PEARL(65, EntityType.ENDER_PEARL),
|
||||
WITHER_SKULL(66, EntityType.WITHER_SKULL),
|
||||
SHULKER_BULLET(67, EntityType.SHULKER_BULLET),
|
||||
LIAMA_SPIT(68, EntityType.LIAMA_SPIT),
|
||||
LLAMA_SPIT(68, EntityType.LLAMA_SPIT),
|
||||
FALLING_BLOCK(70, EntityType.FALLING_BLOCK),
|
||||
ITEM_FRAME(71, EntityType.ITEM_FRAME),
|
||||
ENDER_SIGNAL(72, EntityType.ENDER_SIGNAL),
|
||||
POTION(73, EntityType.SPLASH_POTION),
|
||||
THROWN_EXP_BOTTLE(75, EntityType.THROWN_EXP_BOTTLE),
|
||||
FIREWORK(76, EntityType.FIREWORK),
|
||||
LEASH(77, EntityType.LEASH_HITCH),
|
||||
EYE_OF_ENDER(72, EntityType.EYE_OF_ENDER),
|
||||
POTION(73, EntityType.POTION),
|
||||
EXPERIENCE_BOTTLE(75, EntityType.EXPERIENCE_BOTTLE),
|
||||
FIREWORK_ROCKET(76, EntityType.FIREWORK_ROCKET),
|
||||
LEASH(77, EntityType.LEASH_KNOT),
|
||||
ARMOR_STAND(78, EntityType.ARMOR_STAND),
|
||||
EVOCATION_FANGS(79, EntityType.EVOCATION_FANGS),
|
||||
EVOKER_FANGS(79, EntityType.EVOKER_FANGS),
|
||||
FISHIHNG_HOOK(90, EntityType.FISHING_HOOK),
|
||||
SPECTRAL_ARROW(91, EntityType.SPECTRAL_ARROW),
|
||||
DRAGON_FIREBALL(93, EntityType.DRAGON_FIREBALL);
|
||||
@ -268,15 +299,16 @@ public class EntityTypes1_12 {
|
||||
return type;
|
||||
}
|
||||
|
||||
public static Optional<ObjectType> findById(int id) {
|
||||
if (id == -1)
|
||||
return Optional.empty();
|
||||
return Optional.ofNullable(TYPES.get(id));
|
||||
public static ObjectType findById(final int id) {
|
||||
if (id == -1) {
|
||||
return null;
|
||||
}
|
||||
return TYPES.get(id);
|
||||
}
|
||||
|
||||
public static Optional<EntityType> getPCEntity(int id) {
|
||||
Optional<ObjectType> output = findById(id);
|
||||
return output.map(objectType -> objectType.type);
|
||||
public static EntityType getEntityType(final int id) {
|
||||
final ObjectType objectType = findById(id);
|
||||
return objectType != null ? objectType.type : null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -25,205 +25,197 @@ package com.viaversion.viaversion.api.minecraft.entities;
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
public class EntityTypes1_13 {
|
||||
|
||||
public static EntityType getTypeFromId(int typeID, boolean isObject) {
|
||||
Optional<EntityType> type;
|
||||
public static EntityType getTypeFromId(final int typeId, final boolean object) {
|
||||
EntityType type;
|
||||
|
||||
if (isObject)
|
||||
type = ObjectType.getPCEntity(typeID);
|
||||
else
|
||||
type = EntityType.findById(typeID);
|
||||
|
||||
if (type.isEmpty()) {
|
||||
Via.getPlatform().getLogger().severe("Could not find 1.13 type id " + typeID + " isObject=" + isObject);
|
||||
if (object) {
|
||||
type = ObjectType.getEntityType(typeId);
|
||||
} else {
|
||||
type = EntityType.findById(typeId);
|
||||
}
|
||||
if (type == null) {
|
||||
Via.getPlatform().getLogger().severe("Could not find 1.13 type id " + typeId + " objectType=" + object);
|
||||
return EntityType.ENTITY; // Fall back to the basic ENTITY
|
||||
}
|
||||
|
||||
return type.get();
|
||||
return type;
|
||||
}
|
||||
|
||||
public enum EntityType implements com.viaversion.viaversion.api.minecraft.entities.EntityType {
|
||||
// Auto generated
|
||||
|
||||
ENTITY(-1), // abm
|
||||
ENTITY,
|
||||
|
||||
AREA_EFFECT_CLOUD(0, ENTITY), // abk
|
||||
END_CRYSTAL(16, ENTITY), // aho
|
||||
EVOKER_FANGS(20, ENTITY), // ala
|
||||
EXPERIENCE_ORB(22, ENTITY), // abs
|
||||
EYE_OF_ENDER(23, ENTITY), // alb
|
||||
FALLING_BLOCK(24, ENTITY), // aix
|
||||
FIREWORK_ROCKET(25, ENTITY), // alc
|
||||
ITEM(32, ENTITY), // aiy
|
||||
LLAMA_SPIT(37, ENTITY), // ale
|
||||
TNT(55, ENTITY), // aiz
|
||||
SHULKER_BULLET(60, ENTITY), // alh
|
||||
FISHING_BOBBER(93, ENTITY), // ais
|
||||
AREA_EFFECT_CLOUD(0, ENTITY),
|
||||
END_CRYSTAL(16, ENTITY),
|
||||
EVOKER_FANGS(20, ENTITY),
|
||||
EXPERIENCE_ORB(22, ENTITY),
|
||||
EYE_OF_ENDER(23, ENTITY),
|
||||
FALLING_BLOCK(24, ENTITY),
|
||||
ITEM(32, ENTITY),
|
||||
TNT(55, ENTITY),
|
||||
LIGHTNING_BOLT(91, ENTITY), // Weather effect entity
|
||||
|
||||
LIVINGENTITY(-1, ENTITY), // abv
|
||||
ARMOR_STAND(1, LIVINGENTITY), // ail
|
||||
PLAYER(92, LIVINGENTITY), // aks
|
||||
|
||||
ABSTRACT_INSENTIENT(-1, LIVINGENTITY), // abw
|
||||
ENDER_DRAGON(17, ABSTRACT_INSENTIENT), // ahp
|
||||
|
||||
ABSTRACT_CREATURE(-1, ABSTRACT_INSENTIENT), // acd
|
||||
|
||||
ABSTRACT_AGEABLE(-1, ABSTRACT_CREATURE), // abj
|
||||
VILLAGER(79, ABSTRACT_AGEABLE), // akn
|
||||
|
||||
// Animals
|
||||
ABSTRACT_ANIMAL(-1, ABSTRACT_AGEABLE), // agd
|
||||
CHICKEN(7, ABSTRACT_ANIMAL), // age
|
||||
COW(9, ABSTRACT_ANIMAL), // agg
|
||||
MOOSHROOM(47, COW), // agi
|
||||
PIG(51, ABSTRACT_ANIMAL), // agl
|
||||
POLAR_BEAR(54, ABSTRACT_ANIMAL), // agm
|
||||
RABBIT(56, ABSTRACT_ANIMAL), // ago
|
||||
SHEEP(58, ABSTRACT_ANIMAL), // agq
|
||||
TURTLE(73, ABSTRACT_ANIMAL), // agv
|
||||
|
||||
ABSTRACT_TAMEABLE_ANIMAL(-1, ABSTRACT_ANIMAL), // acg
|
||||
OCELOT(48, ABSTRACT_TAMEABLE_ANIMAL), // agj
|
||||
WOLF(86, ABSTRACT_TAMEABLE_ANIMAL), // agy
|
||||
|
||||
ABSTRACT_PARROT(-1, ABSTRACT_TAMEABLE_ANIMAL), // agr
|
||||
PARROT(50, ABSTRACT_PARROT), // agk
|
||||
|
||||
// Horses
|
||||
ABSTRACT_HORSE(-1, ABSTRACT_ANIMAL), // aha
|
||||
CHESTED_HORSE(-1, ABSTRACT_HORSE), // agz
|
||||
DONKEY(11, CHESTED_HORSE), // ahb
|
||||
MULE(46, CHESTED_HORSE), // ahf
|
||||
LLAMA(36, CHESTED_HORSE), // ahe
|
||||
HORSE(29, ABSTRACT_HORSE), // ahc
|
||||
SKELETON_HORSE(63, ABSTRACT_HORSE), // ahg
|
||||
ZOMBIE_HORSE(88, ABSTRACT_HORSE), // ahi
|
||||
|
||||
// Golem
|
||||
ABSTRACT_GOLEM(-1, ABSTRACT_CREATURE), // agc
|
||||
SNOW_GOLEM(66, ABSTRACT_GOLEM), // ags
|
||||
IRON_GOLEM(80, ABSTRACT_GOLEM), // agw
|
||||
SHULKER(59, ABSTRACT_GOLEM), // ajx
|
||||
|
||||
// Fish
|
||||
ABSTRACT_FISHES(-1, ABSTRACT_CREATURE), // agb
|
||||
COD(8, ABSTRACT_FISHES), // agf
|
||||
PUFFERFISH(52, ABSTRACT_FISHES), // agn
|
||||
SALMON(57, ABSTRACT_FISHES), // agp
|
||||
TROPICAL_FISH(72, ABSTRACT_FISHES), // agu
|
||||
|
||||
// Monsters
|
||||
ABSTRACT_MONSTER(-1, ABSTRACT_CREATURE), // ajs
|
||||
BLAZE(4, ABSTRACT_MONSTER), // ajd
|
||||
CREEPER(10, ABSTRACT_MONSTER), // ajf
|
||||
ENDERMITE(19, ABSTRACT_MONSTER), // ajj
|
||||
ENDERMAN(18, ABSTRACT_MONSTER), // aji
|
||||
GIANT(27, ABSTRACT_MONSTER), // ajn
|
||||
SILVERFISH(61, ABSTRACT_MONSTER), // ajy
|
||||
VEX(78, ABSTRACT_MONSTER), // ake
|
||||
WITCH(82, ABSTRACT_MONSTER), // akg
|
||||
WITHER(83, ABSTRACT_MONSTER), // aij
|
||||
|
||||
// Illagers
|
||||
ABSTRACT_ILLAGER_BASE(-1, ABSTRACT_MONSTER), // ajb
|
||||
ABSTRACT_EVO_ILLU_ILLAGER(-1, ABSTRACT_ILLAGER_BASE), // akb
|
||||
EVOKER(21, ABSTRACT_EVO_ILLU_ILLAGER), // ajl
|
||||
ILLUSIONER(31, ABSTRACT_EVO_ILLU_ILLAGER), // ajq
|
||||
VINDICATOR(81, ABSTRACT_ILLAGER_BASE), // akf
|
||||
|
||||
// Skeletons
|
||||
ABSTRACT_SKELETON(-1, ABSTRACT_MONSTER), // ajc
|
||||
SKELETON(62, ABSTRACT_SKELETON), // ajz
|
||||
STRAY(71, ABSTRACT_SKELETON), // akd
|
||||
WITHER_SKELETON(84, ABSTRACT_SKELETON), // akh
|
||||
|
||||
// Guardians
|
||||
GUARDIAN(28, ABSTRACT_MONSTER), // ajo
|
||||
ELDER_GUARDIAN(15, GUARDIAN), // ajh
|
||||
|
||||
// Spiders
|
||||
SPIDER(69, ABSTRACT_MONSTER), // akc
|
||||
CAVE_SPIDER(6, SPIDER), // aje
|
||||
|
||||
// Zombies - META CHECKED
|
||||
ZOMBIE(87, ABSTRACT_MONSTER), // aki
|
||||
DROWNED(14, ZOMBIE), // ajg
|
||||
HUSK(30, ZOMBIE), // ajp
|
||||
ZOMBIE_PIGMAN(53, ZOMBIE), // aju
|
||||
ZOMBIE_VILLAGER(89, ZOMBIE), // akj
|
||||
|
||||
// Flying entities
|
||||
ABSTRACT_FLYING(-1, ABSTRACT_INSENTIENT), // abt
|
||||
GHAST(26, ABSTRACT_FLYING), // ajm
|
||||
PHANTOM(90, ABSTRACT_FLYING), // ajt
|
||||
|
||||
ABSTRACT_AMBIENT(-1, ABSTRACT_INSENTIENT), // afy
|
||||
BAT(3, ABSTRACT_AMBIENT), // afz
|
||||
|
||||
ABSTRACT_WATERMOB(-1, ABSTRACT_INSENTIENT), // agx
|
||||
SQUID(70, ABSTRACT_WATERMOB), // agt
|
||||
DOLPHIN(12, ABSTRACT_WATERMOB),
|
||||
|
||||
// Slimes
|
||||
SLIME(64, ABSTRACT_INSENTIENT), // aka
|
||||
MAGMA_CUBE(38, SLIME), // ajr
|
||||
|
||||
// Hangable objects
|
||||
ABSTRACT_HANGING(-1, ENTITY), // aim
|
||||
LEASH_KNOT(35, ABSTRACT_HANGING), // aio
|
||||
ITEM_FRAME(33, ABSTRACT_HANGING), // ain
|
||||
PAINTING(49, ABSTRACT_HANGING), // aiq
|
||||
|
||||
ABSTRACT_LIGHTNING(-1, ENTITY), // aiu
|
||||
LIGHTNING_BOLT(91, ABSTRACT_LIGHTNING), // aiv
|
||||
|
||||
// Arrows
|
||||
ABSTRACT_ARROW(-1, ENTITY), // akw
|
||||
ARROW(2, ABSTRACT_ARROW), // aky
|
||||
SPECTRAL_ARROW(68, ABSTRACT_ARROW), // alk
|
||||
TRIDENT(94, ABSTRACT_ARROW), // alq
|
||||
|
||||
// Fireballs
|
||||
ABSTRACT_FIREBALL(-1, ENTITY), // akx
|
||||
DRAGON_FIREBALL(13, ABSTRACT_FIREBALL), // akz
|
||||
FIREBALL(34, ABSTRACT_FIREBALL), // ald
|
||||
SMALL_FIREBALL(65, ABSTRACT_FIREBALL), // ali
|
||||
WITHER_SKULL(85, ABSTRACT_FIREBALL), // alr
|
||||
// Hanging entities
|
||||
HANGING_ENTITY(ENTITY),
|
||||
LEASH_KNOT(35, HANGING_ENTITY),
|
||||
ITEM_FRAME(33, HANGING_ENTITY),
|
||||
PAINTING(49, HANGING_ENTITY),
|
||||
|
||||
// Projectiles
|
||||
PROJECTILE_ABSTRACT(-1, ENTITY), // all
|
||||
SNOWBALL(67, PROJECTILE_ABSTRACT), // alj
|
||||
ENDER_PEARL(75, PROJECTILE_ABSTRACT), // aln
|
||||
EGG(74, PROJECTILE_ABSTRACT), // alm
|
||||
POTION(77, PROJECTILE_ABSTRACT), // alp
|
||||
EXPERIENCE_BOTTLE(76, PROJECTILE_ABSTRACT), // alo
|
||||
PROJECTILE(ENTITY),
|
||||
FIREWORK_ROCKET(25, ENTITY),
|
||||
LLAMA_SPIT(37, ENTITY),
|
||||
SHULKER_BULLET(60, ENTITY),
|
||||
SNOWBALL(67, PROJECTILE),
|
||||
ENDER_PEARL(75, PROJECTILE),
|
||||
EGG(74, PROJECTILE),
|
||||
EXPERIENCE_BOTTLE(76, PROJECTILE),
|
||||
POTION(77, PROJECTILE),
|
||||
FISHING_BOBBER(93, ENTITY),
|
||||
|
||||
ABSTRACT_ARROW(ENTITY),
|
||||
ARROW(2, ABSTRACT_ARROW),
|
||||
SPECTRAL_ARROW(68, ABSTRACT_ARROW),
|
||||
TRIDENT(94, ABSTRACT_ARROW),
|
||||
|
||||
HURTING_PROJECTILE(ENTITY),
|
||||
DRAGON_FIREBALL(13, HURTING_PROJECTILE),
|
||||
FIREBALL(34, HURTING_PROJECTILE),
|
||||
SMALL_FIREBALL(65, HURTING_PROJECTILE),
|
||||
WITHER_SKULL(85, HURTING_PROJECTILE),
|
||||
|
||||
// Vehicles
|
||||
MINECART_ABSTRACT(-1, ENTITY), // alt
|
||||
CHESTED_MINECART_ABSTRACT(-1, MINECART_ABSTRACT), // alu
|
||||
CHEST_MINECART(40, CHESTED_MINECART_ABSTRACT), // alx
|
||||
HOPPER_MINECART(43, CHESTED_MINECART_ABSTRACT), // ama
|
||||
MINECART(39, MINECART_ABSTRACT), // alw
|
||||
FURNACE_MINECART(42, MINECART_ABSTRACT), // alz
|
||||
COMMAND_BLOCK_MINECART(41, MINECART_ABSTRACT), // aly
|
||||
TNT_MINECART(45, MINECART_ABSTRACT), // amc
|
||||
SPAWNER_MINECART(44, MINECART_ABSTRACT), // amb
|
||||
BOAT(5, ENTITY); // alv
|
||||
BOAT(5, ENTITY),
|
||||
|
||||
ABSTRACT_MINECART(ENTITY),
|
||||
MINECART(39, ABSTRACT_MINECART),
|
||||
FURNACE_MINECART(42, ABSTRACT_MINECART),
|
||||
COMMAND_BLOCK_MINECART(41, ABSTRACT_MINECART),
|
||||
TNT_MINECART(45, ABSTRACT_MINECART),
|
||||
SPAWNER_MINECART(44, ABSTRACT_MINECART),
|
||||
|
||||
ABSTRACT_MINECART_CONTAINER(ABSTRACT_MINECART),
|
||||
CHEST_MINECART(40, ABSTRACT_MINECART_CONTAINER),
|
||||
HOPPER_MINECART(43, ABSTRACT_MINECART_CONTAINER),
|
||||
|
||||
LIVING_ENTITY_BASE(ENTITY),
|
||||
ARMOR_STAND(1, LIVING_ENTITY_BASE),
|
||||
PLAYER(92, LIVING_ENTITY_BASE),
|
||||
|
||||
// Living entities as a larger subclass
|
||||
LIVING_ENTITY(LIVING_ENTITY_BASE),
|
||||
ENDER_DRAGON(17, LIVING_ENTITY),
|
||||
ABSTRACT_CREATURE(LIVING_ENTITY),
|
||||
SLIME(64, LIVING_ENTITY),
|
||||
MAGMA_CUBE(38, SLIME),
|
||||
|
||||
// Flying entities
|
||||
FLYING_MOB(ABSTRACT_CREATURE),
|
||||
GHAST(26, FLYING_MOB),
|
||||
PHANTOM(90, FLYING_MOB),
|
||||
|
||||
AMBIENT_CREATURE(-1, LIVING_ENTITY),
|
||||
BAT(3, AMBIENT_CREATURE),
|
||||
|
||||
ABSTRACT_GOLEM(ABSTRACT_CREATURE),
|
||||
SNOW_GOLEM(66, ABSTRACT_GOLEM),
|
||||
IRON_GOLEM(80, ABSTRACT_GOLEM),
|
||||
SHULKER(59, ABSTRACT_GOLEM),
|
||||
|
||||
WATER_ANIMAL(ABSTRACT_CREATURE),
|
||||
SQUID(70, WATER_ANIMAL),
|
||||
DOLPHIN(12, WATER_ANIMAL),
|
||||
|
||||
ABSTRACT_FISH(WATER_ANIMAL),
|
||||
COD(8, ABSTRACT_FISH),
|
||||
PUFFERFISH(52, ABSTRACT_FISH),
|
||||
SALMON(57, ABSTRACT_FISH),
|
||||
TROPICAL_FISH(72, ABSTRACT_FISH),
|
||||
|
||||
// Ageable mobs and (tamable) animals
|
||||
ABSTRACT_AGEABLE(ABSTRACT_CREATURE),
|
||||
VILLAGER(79, ABSTRACT_AGEABLE),
|
||||
|
||||
ABSTRACT_ANIMAL(ABSTRACT_AGEABLE),
|
||||
CHICKEN(7, ABSTRACT_ANIMAL),
|
||||
COW(9, ABSTRACT_ANIMAL),
|
||||
MOOSHROOM(47, COW),
|
||||
PIG(51, ABSTRACT_ANIMAL),
|
||||
POLAR_BEAR(54, ABSTRACT_ANIMAL),
|
||||
RABBIT(56, ABSTRACT_ANIMAL),
|
||||
SHEEP(58, ABSTRACT_ANIMAL),
|
||||
TURTLE(73, ABSTRACT_ANIMAL),
|
||||
|
||||
TAMABLE_ANIMAL(ABSTRACT_ANIMAL),
|
||||
OCELOT(48, TAMABLE_ANIMAL),
|
||||
WOLF(86, TAMABLE_ANIMAL),
|
||||
|
||||
ABSTRACT_SHOULDER_RIDING(TAMABLE_ANIMAL),
|
||||
PARROT(50, ABSTRACT_SHOULDER_RIDING),
|
||||
|
||||
// Horses
|
||||
ABSTRACT_HORSE(ABSTRACT_ANIMAL),
|
||||
HORSE(29, ABSTRACT_HORSE),
|
||||
SKELETON_HORSE(63, ABSTRACT_HORSE),
|
||||
ZOMBIE_HORSE(88, ABSTRACT_HORSE),
|
||||
|
||||
CHESTED_HORSE(ABSTRACT_HORSE),
|
||||
DONKEY(11, CHESTED_HORSE),
|
||||
MULE(46, CHESTED_HORSE),
|
||||
LLAMA(36, CHESTED_HORSE),
|
||||
|
||||
// Monsters
|
||||
ABSTRACT_MONSTER(ABSTRACT_CREATURE),
|
||||
BLAZE(4, ABSTRACT_MONSTER),
|
||||
CREEPER(10, ABSTRACT_MONSTER),
|
||||
ENDERMITE(19, ABSTRACT_MONSTER),
|
||||
ENDERMAN(18, ABSTRACT_MONSTER),
|
||||
GIANT(27, ABSTRACT_MONSTER),
|
||||
SILVERFISH(61, ABSTRACT_MONSTER),
|
||||
VEX(78, ABSTRACT_MONSTER),
|
||||
WITCH(82, ABSTRACT_MONSTER),
|
||||
WITHER(83, ABSTRACT_MONSTER),
|
||||
|
||||
ABSTRACT_SKELETON(ABSTRACT_MONSTER),
|
||||
SKELETON(62, ABSTRACT_SKELETON),
|
||||
STRAY(71, ABSTRACT_SKELETON),
|
||||
WITHER_SKELETON(84, ABSTRACT_SKELETON),
|
||||
|
||||
ZOMBIE(87, ABSTRACT_MONSTER),
|
||||
DROWNED(14, ZOMBIE),
|
||||
HUSK(30, ZOMBIE),
|
||||
ZOMBIE_PIGMAN(53, ZOMBIE),
|
||||
ZOMBIE_VILLAGER(89, ZOMBIE),
|
||||
|
||||
GUARDIAN(28, ABSTRACT_MONSTER),
|
||||
ELDER_GUARDIAN(15, GUARDIAN),
|
||||
SPIDER(69, ABSTRACT_MONSTER),
|
||||
CAVE_SPIDER(6, SPIDER),
|
||||
|
||||
// Illagers
|
||||
ABSTRACT_ILLAGER(ABSTRACT_MONSTER),
|
||||
SPELLCASTER_ILLAGER(ABSTRACT_ILLAGER),
|
||||
VINDICATOR(81, ABSTRACT_ILLAGER),
|
||||
EVOKER(21, SPELLCASTER_ILLAGER),
|
||||
ILLUSIONER(31, SPELLCASTER_ILLAGER);
|
||||
|
||||
private static final Map<Integer, EntityType> TYPES = new HashMap<>();
|
||||
|
||||
private final int id;
|
||||
private final EntityType parent;
|
||||
|
||||
EntityType(int id) {
|
||||
this.id = id;
|
||||
EntityType() {
|
||||
this.id = -1;
|
||||
this.parent = null;
|
||||
}
|
||||
|
||||
EntityType(EntityType parent) {
|
||||
this.id = -1;
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
EntityType(int id, EntityType parent) {
|
||||
this.id = id;
|
||||
this.parent = parent;
|
||||
@ -255,10 +247,11 @@ public class EntityTypes1_13 {
|
||||
}
|
||||
}
|
||||
|
||||
public static Optional<EntityType> findById(int id) {
|
||||
if (id == -1) // Check if this is called
|
||||
return Optional.empty();
|
||||
return Optional.ofNullable(TYPES.get(id));
|
||||
public static EntityType findById(final int id) {
|
||||
if (id == -1) {
|
||||
return null;
|
||||
}
|
||||
return TYPES.get(id);
|
||||
}
|
||||
}
|
||||
|
||||
@ -266,7 +259,7 @@ public class EntityTypes1_13 {
|
||||
BOAT(1, EntityType.BOAT),
|
||||
ITEM(2, EntityType.ITEM),
|
||||
AREA_EFFECT_CLOUD(3, EntityType.AREA_EFFECT_CLOUD),
|
||||
MINECART(10, EntityType.MINECART),
|
||||
MINECART(10, EntityType.MINECART), // There are multiple types, but we don't need them
|
||||
TNT_PRIMED(50, EntityType.TNT),
|
||||
ENDER_CRYSTAL(51, EntityType.END_CRYSTAL),
|
||||
TIPPED_ARROW(60, EntityType.ARROW),
|
||||
@ -318,22 +311,16 @@ public class EntityTypes1_13 {
|
||||
return type;
|
||||
}
|
||||
|
||||
public static Optional<ObjectType> findById(int id) {
|
||||
if (id == -1)
|
||||
return Optional.empty();
|
||||
return Optional.ofNullable(TYPES.get(id));
|
||||
public static ObjectType findById(final int id) {
|
||||
if (id == -1) {
|
||||
return null;
|
||||
}
|
||||
return TYPES.get(id);
|
||||
}
|
||||
|
||||
public static Optional<EntityType> getPCEntity(int id) {
|
||||
Optional<ObjectType> output = findById(id);
|
||||
return output.map(objectType -> objectType.type);
|
||||
}
|
||||
|
||||
public static Optional<ObjectType> fromEntityType(EntityType type) {
|
||||
for (ObjectType ent : ObjectType.values())
|
||||
if (ent.type == type)
|
||||
return Optional.of(ent);
|
||||
return Optional.empty();
|
||||
public static EntityType getEntityType(final int id) {
|
||||
final ObjectType objectType = findById(id);
|
||||
return objectType != null ? objectType.type : null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,269 @@
|
||||
/*
|
||||
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
|
||||
* Copyright (C) 2016-2024 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.minecraft.entities;
|
||||
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class EntityTypes1_8 {
|
||||
|
||||
public static EntityType getTypeFromId(final int typeId, final boolean object) {
|
||||
EntityType type;
|
||||
|
||||
if (object) {
|
||||
type = ObjectType.getEntityType(typeId);
|
||||
} else {
|
||||
type = EntityType.findById(typeId);
|
||||
}
|
||||
if (type == null) {
|
||||
Via.getPlatform().getLogger().severe("Could not find 1.8 type id " + typeId + " objectType=" + object);
|
||||
return EntityType.ENTITY; // Fall back to the basic ENTITY
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
public enum EntityType implements com.viaversion.viaversion.api.minecraft.entities.EntityType {
|
||||
|
||||
ENTITY,
|
||||
|
||||
END_CRYSTAL(200, ENTITY),
|
||||
EXPERIENCE_ORB(2, ENTITY),
|
||||
EYE_OF_ENDER(15, ENTITY),
|
||||
FALLING_BLOCK(21, ENTITY),
|
||||
ITEM(1, ENTITY),
|
||||
TNT(20, ENTITY),
|
||||
LIGHTNING_BOLT(ENTITY), // Needed for entity (un)tracking
|
||||
|
||||
// Hanging entities
|
||||
HANGING_ENTITY(ENTITY),
|
||||
LEASH_KNOT(8, HANGING_ENTITY),
|
||||
ITEM_FRAME(18, HANGING_ENTITY),
|
||||
PAINTING(9, HANGING_ENTITY),
|
||||
|
||||
// Projectiles
|
||||
PROJECTILE(ENTITY),
|
||||
FIREWORK_ROCKET(22, ENTITY),
|
||||
SNOWBALL(11, PROJECTILE),
|
||||
ENDER_PEARL(14, PROJECTILE),
|
||||
EGG(7, PROJECTILE),
|
||||
EXPERIENCE_BOTTLE(17, PROJECTILE),
|
||||
POTION(16, PROJECTILE),
|
||||
FISHING_HOOK(ENTITY),
|
||||
ARROW(10, ENTITY),
|
||||
|
||||
HURTING_PROJECTILE(ENTITY),
|
||||
FIREBALL(12, HURTING_PROJECTILE),
|
||||
SMALL_FIREBALL(13, HURTING_PROJECTILE),
|
||||
WITHER_SKULL(19, HURTING_PROJECTILE),
|
||||
|
||||
// Vehicles
|
||||
BOAT(41, ENTITY),
|
||||
|
||||
ABSTRACT_MINECART(ENTITY),
|
||||
MINECART(42, ABSTRACT_MINECART),
|
||||
FURNACE_MINECART(44, ABSTRACT_MINECART),
|
||||
COMMAND_BLOCK_MINECART(40, ABSTRACT_MINECART),
|
||||
TNT_MINECART(45, ABSTRACT_MINECART),
|
||||
SPAWNER_MINECART(47, ABSTRACT_MINECART),
|
||||
|
||||
ABSTRACT_MINECART_CONTAINER(ABSTRACT_MINECART),
|
||||
CHEST_MINECART(43, ABSTRACT_MINECART_CONTAINER),
|
||||
HOPPER_MINECART(46, ABSTRACT_MINECART_CONTAINER),
|
||||
|
||||
LIVING_ENTITY_BASE(ENTITY),
|
||||
ARMOR_STAND(30, LIVING_ENTITY_BASE),
|
||||
PLAYER(LIVING_ENTITY_BASE), // Needed for entity (un)tracking and metadata indexing
|
||||
|
||||
// Living entities as a larger subclass
|
||||
LIVING_ENTITY(48, LIVING_ENTITY_BASE),
|
||||
ENDER_DRAGON(63, LIVING_ENTITY),
|
||||
ABSTRACT_CREATURE(LIVING_ENTITY),
|
||||
SLIME(55, LIVING_ENTITY),
|
||||
MAGMA_CUBE(62, SLIME),
|
||||
|
||||
// Flying entities
|
||||
FLYING_MOB(LIVING_ENTITY),
|
||||
GHAST(56, FLYING_MOB),
|
||||
|
||||
AMBIENT_CREATURE(LIVING_ENTITY),
|
||||
BAT(65, AMBIENT_CREATURE),
|
||||
|
||||
ABSTRACT_GOLEM(ABSTRACT_CREATURE),
|
||||
SNOW_GOLEM(97, ABSTRACT_GOLEM),
|
||||
IRON_GOLEM(99, ABSTRACT_GOLEM),
|
||||
|
||||
WATER_ANIMAL(LIVING_ENTITY),
|
||||
SQUID(94, WATER_ANIMAL),
|
||||
|
||||
// Ageable mobs and (tamable) animals
|
||||
ABSTRACT_AGEABLE(ABSTRACT_CREATURE),
|
||||
VILLAGER(120, ABSTRACT_AGEABLE),
|
||||
|
||||
ABSTRACT_ANIMAL(ABSTRACT_AGEABLE),
|
||||
CHICKEN(93, ABSTRACT_ANIMAL),
|
||||
COW(92, ABSTRACT_ANIMAL),
|
||||
MOOSHROOM(96, COW),
|
||||
PIG(90, ABSTRACT_ANIMAL),
|
||||
RABBIT(101, ABSTRACT_ANIMAL),
|
||||
SHEEP(91, ABSTRACT_ANIMAL),
|
||||
HORSE(100, ABSTRACT_ANIMAL),
|
||||
|
||||
TAMABLE_ANIMAL(ABSTRACT_ANIMAL),
|
||||
OCELOT(98, TAMABLE_ANIMAL),
|
||||
WOLF(95, TAMABLE_ANIMAL),
|
||||
|
||||
// Monsters
|
||||
ABSTRACT_MONSTER(49, ABSTRACT_CREATURE),
|
||||
BLAZE(61, ABSTRACT_MONSTER),
|
||||
CREEPER(50, ABSTRACT_MONSTER),
|
||||
ENDERMITE(67, ABSTRACT_MONSTER),
|
||||
ENDERMAN(58, ABSTRACT_MONSTER),
|
||||
GIANT(53, ABSTRACT_MONSTER),
|
||||
SILVERFISH(60, ABSTRACT_MONSTER),
|
||||
WITCH(66, ABSTRACT_MONSTER),
|
||||
WITHER(64, ABSTRACT_MONSTER),
|
||||
SKELETON(51, ABSTRACT_MONSTER),
|
||||
ZOMBIE(54, ABSTRACT_MONSTER),
|
||||
ZOMBIE_PIGMEN(57, ZOMBIE),
|
||||
|
||||
GUARDIAN(68, ABSTRACT_MONSTER),
|
||||
SPIDER(52, ABSTRACT_MONSTER),
|
||||
CAVE_SPIDER(59, SPIDER);
|
||||
|
||||
private static final Map<Integer, EntityType> TYPES = new HashMap<>();
|
||||
|
||||
private final int id;
|
||||
private final EntityType parent;
|
||||
|
||||
EntityType() {
|
||||
this.id = -1;
|
||||
this.parent = null;
|
||||
}
|
||||
|
||||
EntityType(EntityType parent) {
|
||||
this.id = -1;
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
EntityType(int id, EntityType parent) {
|
||||
this.id = id;
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EntityType getParent() {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
public static EntityType findById(final int id) {
|
||||
if (id == -1) {
|
||||
return null;
|
||||
}
|
||||
return TYPES.get(id);
|
||||
}
|
||||
}
|
||||
|
||||
public enum ObjectType implements com.viaversion.viaversion.api.minecraft.entities.ObjectType {
|
||||
BOAT(1, EntityType.BOAT),
|
||||
ITEM(2, EntityType.ITEM),
|
||||
MINECART(10, EntityType.MINECART), // There are multiple types, but we don't need them
|
||||
TNT_PRIMED(50, EntityType.TNT),
|
||||
ENDER_CRYSTAL(51, EntityType.END_CRYSTAL),
|
||||
TIPPED_ARROW(60, EntityType.ARROW),
|
||||
SNOWBALL(61, EntityType.SNOWBALL),
|
||||
EGG(62, EntityType.EGG),
|
||||
FIREBALL(63, EntityType.FIREBALL),
|
||||
SMALL_FIREBALL(64, EntityType.SMALL_FIREBALL),
|
||||
ENDER_PEARL(65, EntityType.ENDER_PEARL),
|
||||
WITHER_SKULL(66, EntityType.WITHER_SKULL),
|
||||
FALLING_BLOCK(70, EntityType.FALLING_BLOCK),
|
||||
ITEM_FRAME(71, EntityType.ITEM_FRAME),
|
||||
EYE_OF_ENDER(72, EntityType.EYE_OF_ENDER),
|
||||
POTION(73, EntityType.POTION),
|
||||
EXPERIENCE_BOTTLE(75, EntityType.EXPERIENCE_BOTTLE),
|
||||
FIREWORK_ROCKET(76, EntityType.FIREWORK_ROCKET),
|
||||
LEASH(77, EntityType.LEASH_KNOT),
|
||||
ARMOR_STAND(78, EntityType.ARMOR_STAND),
|
||||
FISHIHNG_HOOK(90, EntityType.FISHING_HOOK);
|
||||
|
||||
private static final Map<Integer, ObjectType> TYPES = new HashMap<>();
|
||||
|
||||
private final int id;
|
||||
private final EntityType type;
|
||||
|
||||
static {
|
||||
for (ObjectType type : ObjectType.values()) {
|
||||
TYPES.put(type.id, type);
|
||||
}
|
||||
}
|
||||
|
||||
ObjectType(int id, EntityType type) {
|
||||
this.id = id;
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EntityType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public static ObjectType findById(final int id) {
|
||||
if (id == -1) {
|
||||
return null;
|
||||
}
|
||||
return TYPES.get(id);
|
||||
}
|
||||
|
||||
public static EntityType getEntityType(final int id) {
|
||||
final ObjectType objectType = findById(id);
|
||||
return objectType != null ? objectType.type : null;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,280 @@
|
||||
/*
|
||||
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
|
||||
* Copyright (C) 2016-2024 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.minecraft.entities;
|
||||
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class EntityTypes1_9 {
|
||||
|
||||
public static EntityType getTypeFromId(final int typeId, final boolean object) {
|
||||
EntityType type;
|
||||
|
||||
if (object) {
|
||||
type = ObjectType.getEntityType(typeId);
|
||||
} else {
|
||||
type = EntityType.findById(typeId);
|
||||
}
|
||||
if (type == null) {
|
||||
Via.getPlatform().getLogger().severe("Could not find 1.9 type id " + typeId + " objectType=" + object);
|
||||
return EntityType.ENTITY; // Fall back to the basic ENTITY
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
public enum EntityType implements com.viaversion.viaversion.api.minecraft.entities.EntityType {
|
||||
|
||||
ENTITY,
|
||||
|
||||
AREA_EFFECT_CLOUD(3, ENTITY),
|
||||
END_CRYSTAL(200, ENTITY),
|
||||
EXPERIENCE_ORB(2, ENTITY),
|
||||
EYE_OF_ENDER(15, ENTITY),
|
||||
FALLING_BLOCK(21, ENTITY),
|
||||
ITEM(1, ENTITY),
|
||||
TNT(20, ENTITY),
|
||||
LIGHTNING_BOLT(ENTITY), // Needed for entity (un)tracking
|
||||
|
||||
// Hanging entities
|
||||
HANGING_ENTITY(ENTITY),
|
||||
LEASH_KNOT(8, HANGING_ENTITY),
|
||||
ITEM_FRAME(18, HANGING_ENTITY),
|
||||
PAINTING(9, HANGING_ENTITY),
|
||||
|
||||
// Projectiles
|
||||
PROJECTILE(ENTITY),
|
||||
FIREWORK_ROCKET(22, ENTITY),
|
||||
SHULKER_BULLET(25, ENTITY),
|
||||
SNOWBALL(11, PROJECTILE),
|
||||
ENDER_PEARL(14, PROJECTILE),
|
||||
EGG(7, PROJECTILE),
|
||||
EXPERIENCE_BOTTLE(17, PROJECTILE),
|
||||
POTION(16, PROJECTILE),
|
||||
FISHING_HOOK(ENTITY),
|
||||
|
||||
ABSTRACT_ARROW(ENTITY),
|
||||
ARROW(10, ABSTRACT_ARROW),
|
||||
SPECTRAL_ARROW(24, ABSTRACT_ARROW),
|
||||
|
||||
HURTING_PROJECTILE(ENTITY),
|
||||
DRAGON_FIREBALL(26, HURTING_PROJECTILE),
|
||||
FIREBALL(12, HURTING_PROJECTILE),
|
||||
SMALL_FIREBALL(13, HURTING_PROJECTILE),
|
||||
WITHER_SKULL(19, HURTING_PROJECTILE),
|
||||
|
||||
// Vehicles
|
||||
BOAT(41, ENTITY),
|
||||
|
||||
ABSTRACT_MINECART(ENTITY),
|
||||
MINECART(42, ABSTRACT_MINECART),
|
||||
FURNACE_MINECART(44, ABSTRACT_MINECART),
|
||||
COMMAND_BLOCK_MINECART(40, ABSTRACT_MINECART),
|
||||
TNT_MINECART(45, ABSTRACT_MINECART),
|
||||
SPAWNER_MINECART(47, ABSTRACT_MINECART),
|
||||
|
||||
ABSTRACT_MINECART_CONTAINER(ABSTRACT_MINECART),
|
||||
CHEST_MINECART(43, ABSTRACT_MINECART_CONTAINER),
|
||||
HOPPER_MINECART(46, ABSTRACT_MINECART_CONTAINER),
|
||||
|
||||
LIVING_ENTITY_BASE(ENTITY),
|
||||
ARMOR_STAND(30, LIVING_ENTITY_BASE),
|
||||
PLAYER(ENTITY), // Needed for entity (un)tracking
|
||||
|
||||
// Living entities as a larger subclass
|
||||
LIVING_ENTITY(48, LIVING_ENTITY_BASE),
|
||||
ENDER_DRAGON(63, LIVING_ENTITY),
|
||||
ABSTRACT_CREATURE(LIVING_ENTITY),
|
||||
SLIME(55, LIVING_ENTITY),
|
||||
MAGMA_CUBE(62, SLIME),
|
||||
|
||||
// Flying entities
|
||||
FLYING_MOB(LIVING_ENTITY),
|
||||
GHAST(56, FLYING_MOB),
|
||||
|
||||
AMBIENT_CREATURE(LIVING_ENTITY),
|
||||
BAT(65, AMBIENT_CREATURE),
|
||||
|
||||
ABSTRACT_GOLEM(ABSTRACT_CREATURE),
|
||||
SNOW_GOLEM(97, ABSTRACT_GOLEM),
|
||||
IRON_GOLEM(99, ABSTRACT_GOLEM),
|
||||
SHULKER(69, ABSTRACT_GOLEM),
|
||||
|
||||
WATER_ANIMAL(LIVING_ENTITY),
|
||||
SQUID(94, WATER_ANIMAL),
|
||||
|
||||
// Ageable mobs and (tamable) animals
|
||||
ABSTRACT_AGEABLE(ABSTRACT_CREATURE),
|
||||
VILLAGER(120, ABSTRACT_AGEABLE),
|
||||
|
||||
ABSTRACT_ANIMAL(ABSTRACT_AGEABLE),
|
||||
CHICKEN(93, ABSTRACT_ANIMAL),
|
||||
COW(92, ABSTRACT_ANIMAL),
|
||||
MOOSHROOM(96, COW),
|
||||
PIG(90, ABSTRACT_ANIMAL),
|
||||
RABBIT(101, ABSTRACT_ANIMAL),
|
||||
SHEEP(91, ABSTRACT_ANIMAL),
|
||||
HORSE(100, ABSTRACT_ANIMAL),
|
||||
|
||||
TAMABLE_ANIMAL(ABSTRACT_ANIMAL),
|
||||
OCELOT(98, TAMABLE_ANIMAL),
|
||||
WOLF(95, TAMABLE_ANIMAL),
|
||||
|
||||
// Monsters
|
||||
ABSTRACT_MONSTER(49, ABSTRACT_CREATURE),
|
||||
BLAZE(61, ABSTRACT_MONSTER),
|
||||
CREEPER(50, ABSTRACT_MONSTER),
|
||||
ENDERMITE(67, ABSTRACT_MONSTER),
|
||||
ENDERMAN(58, ABSTRACT_MONSTER),
|
||||
GIANT(53, ABSTRACT_MONSTER),
|
||||
SILVERFISH(60, ABSTRACT_MONSTER),
|
||||
WITCH(66, ABSTRACT_MONSTER),
|
||||
WITHER(64, ABSTRACT_MONSTER),
|
||||
SKELETON(51, ABSTRACT_MONSTER),
|
||||
ZOMBIE(54, ABSTRACT_MONSTER),
|
||||
ZOMBIE_PIGMEN(57, ZOMBIE),
|
||||
|
||||
GUARDIAN(68, ABSTRACT_MONSTER),
|
||||
SPIDER(52, ABSTRACT_MONSTER),
|
||||
CAVE_SPIDER(59, SPIDER);
|
||||
|
||||
private static final Map<Integer, EntityType> TYPES = new HashMap<>();
|
||||
|
||||
private final int id;
|
||||
private final EntityType parent;
|
||||
|
||||
EntityType() {
|
||||
this.id = -1;
|
||||
this.parent = null;
|
||||
}
|
||||
|
||||
EntityType(EntityType parent) {
|
||||
this.id = -1;
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
EntityType(int id, EntityType parent) {
|
||||
this.id = id;
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EntityType getParent() {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
public static EntityType findById(final int id) {
|
||||
if (id == -1) {
|
||||
return null;
|
||||
}
|
||||
return TYPES.get(id);
|
||||
}
|
||||
}
|
||||
|
||||
public enum ObjectType implements com.viaversion.viaversion.api.minecraft.entities.ObjectType {
|
||||
BOAT(1, EntityType.BOAT),
|
||||
ITEM(2, EntityType.ITEM),
|
||||
AREA_EFFECT_CLOUD(3, EntityType.AREA_EFFECT_CLOUD),
|
||||
MINECART(10, EntityType.MINECART), // There are multiple types, but we don't need them
|
||||
TNT_PRIMED(50, EntityType.TNT),
|
||||
ENDER_CRYSTAL(51, EntityType.END_CRYSTAL),
|
||||
TIPPED_ARROW(60, EntityType.ARROW),
|
||||
SNOWBALL(61, EntityType.SNOWBALL),
|
||||
EGG(62, EntityType.EGG),
|
||||
FIREBALL(63, EntityType.FIREBALL),
|
||||
SMALL_FIREBALL(64, EntityType.SMALL_FIREBALL),
|
||||
ENDER_PEARL(65, EntityType.ENDER_PEARL),
|
||||
WITHER_SKULL(66, EntityType.WITHER_SKULL),
|
||||
SHULKER_BULLET(67, EntityType.SHULKER_BULLET),
|
||||
FALLING_BLOCK(70, EntityType.FALLING_BLOCK),
|
||||
ITEM_FRAME(71, EntityType.ITEM_FRAME),
|
||||
EYE_OF_ENDER(72, EntityType.EYE_OF_ENDER),
|
||||
POTION(73, EntityType.POTION),
|
||||
EXPERIENCE_BOTTLE(75, EntityType.EXPERIENCE_BOTTLE),
|
||||
FIREWORK_ROCKET(76, EntityType.FIREWORK_ROCKET),
|
||||
LEASH(77, EntityType.LEASH_KNOT),
|
||||
ARMOR_STAND(78, EntityType.ARMOR_STAND),
|
||||
FISHIHNG_HOOK(90, EntityType.FISHING_HOOK),
|
||||
SPECTRAL_ARROW(91, EntityType.SPECTRAL_ARROW),
|
||||
DRAGON_FIREBALL(93, EntityType.DRAGON_FIREBALL);
|
||||
|
||||
private static final Map<Integer, ObjectType> TYPES = new HashMap<>();
|
||||
|
||||
private final int id;
|
||||
private final EntityType type;
|
||||
|
||||
static {
|
||||
for (ObjectType type : ObjectType.values()) {
|
||||
TYPES.put(type.id, type);
|
||||
}
|
||||
}
|
||||
|
||||
ObjectType(int id, EntityType type) {
|
||||
this.id = id;
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EntityType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public static ObjectType findById(final int id) {
|
||||
if (id == -1) {
|
||||
return null;
|
||||
}
|
||||
return TYPES.get(id);
|
||||
}
|
||||
|
||||
public static EntityType getEntityType(final int id) {
|
||||
final ObjectType objectType = findById(id);
|
||||
return objectType != null ? objectType.type : null;
|
||||
}
|
||||
}
|
||||
}
|
@ -260,8 +260,6 @@ public class EntityPacketRewriter1_11 extends EntityRewriter<ClientboundPackets1
|
||||
return null;
|
||||
}
|
||||
|
||||
EntityType type = optType.get();
|
||||
|
||||
try {
|
||||
if (type.is(EntityType.GUARDIAN)) {
|
||||
// ElderGuardian - 4
|
||||
|
@ -81,7 +81,7 @@ public class EntityPacketRewriter1_12 extends EntityRewriter<ClientboundPackets1
|
||||
}
|
||||
});
|
||||
|
||||
filter().type(EntityTypes1_12.EntityType.EVOCATION_ILLAGER).index(12).toIndex(13); // Aggressive
|
||||
filter().type(EntityTypes1_12.EntityType.ABSTRACT_ILLAGER).addIndex(12); // Aggressive
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -195,7 +195,7 @@ public class EntityPacketRewriter1_13 extends EntityRewriter<ClientboundPackets1
|
||||
|
||||
filter().type(EntityTypes1_13.EntityType.ZOMBIE).addIndex(15); // Shaking
|
||||
|
||||
filter().type(EntityTypes1_13.EntityType.MINECART_ABSTRACT).index(9).handler((event, meta) -> {
|
||||
filter().type(EntityTypes1_13.EntityType.ABSTRACT_MINECART).index(9).handler((event, meta) -> {
|
||||
final int oldId = meta.value();
|
||||
final int combined = (((oldId & 4095) << 4) | (oldId >> 12 & 15));
|
||||
final int newId = WorldPacketRewriter1_13.toNewId(combined);
|
||||
|
@ -22,7 +22,7 @@ import com.viaversion.viaversion.api.Via;
|
||||
import com.viaversion.viaversion.api.minecraft.EulerAngle;
|
||||
import com.viaversion.viaversion.api.minecraft.Vector;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_10;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_9;
|
||||
import com.viaversion.viaversion.api.minecraft.item.Item;
|
||||
import com.viaversion.viaversion.api.minecraft.entitydata.EntityData;
|
||||
import com.viaversion.viaversion.api.minecraft.entitydata.EntityDataType;
|
||||
@ -419,7 +419,7 @@ public class EntityPacketRewriter1_9 extends EntityRewriter<ClientboundPackets1_
|
||||
metadata.setValue(((Integer) value).byteValue());
|
||||
}
|
||||
// After writing the last one
|
||||
if (metaIndex == MetaIndex1_8.ENTITY_STATUS && type == EntityTypes1_10.EntityType.PLAYER) {
|
||||
if (metaIndex == MetaIndex1_8.ENTITY_STATUS && type == EntityTypes1_9.EntityType.PLAYER) {
|
||||
byte val = 0;
|
||||
if ((((Byte) value) & 0x10) == 0x10) { // Player eating/aiming/drinking
|
||||
val = 1;
|
||||
@ -456,7 +456,7 @@ public class EntityPacketRewriter1_9 extends EntityRewriter<ClientboundPackets1_
|
||||
metadata.setValue(value);
|
||||
break;
|
||||
case BOOLEAN:
|
||||
if (metaIndex == MetaIndex1_8.AGEABLE_CREATURE_AGE)
|
||||
if (metaIndex == MetaIndex1_8.ABSTRACT_AGEABLE_AGE)
|
||||
metadata.setValue((Byte) value < 0);
|
||||
else
|
||||
metadata.setValue((Byte) value != 0);
|
||||
@ -489,11 +489,11 @@ public class EntityPacketRewriter1_9 extends EntityRewriter<ClientboundPackets1_
|
||||
|
||||
@Override
|
||||
public EntityType typeFromId(int type) {
|
||||
return EntityTypes1_10.getTypeFromId(type, false);
|
||||
return EntityTypes1_9.getTypeFromId(type, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public EntityType objectTypeFromId(int type) {
|
||||
return EntityTypes1_10.getTypeFromId(type, true);
|
||||
return EntityTypes1_9.getTypeFromId(type, true);
|
||||
}
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ import com.viaversion.nbt.tag.StringTag;
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
import com.viaversion.viaversion.api.minecraft.ClientWorld;
|
||||
import com.viaversion.viaversion.api.minecraft.GameMode;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_10;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_9;
|
||||
import com.viaversion.viaversion.api.minecraft.item.Item;
|
||||
import com.viaversion.viaversion.api.protocol.remapper.PacketHandler;
|
||||
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
|
||||
@ -185,7 +185,7 @@ public class PlayerPacketRewriter1_9 {
|
||||
handler(wrapper -> {
|
||||
int entityId = wrapper.get(Types.INT, 0);
|
||||
EntityTracker1_9 tracker = wrapper.user().getEntityTracker(Protocol1_8To1_9.class);
|
||||
tracker.addEntity(entityId, EntityTypes1_10.EntityType.PLAYER);
|
||||
tracker.addEntity(entityId, EntityTypes1_9.EntityType.PLAYER);
|
||||
tracker.setClientEntityId(entityId);
|
||||
});
|
||||
map(Types.UNSIGNED_BYTE); // 1 - Player Gamemode
|
||||
|
@ -18,7 +18,8 @@
|
||||
package com.viaversion.viaversion.protocols.v1_8to1_9.rewriter;
|
||||
|
||||
import com.viaversion.viaversion.api.data.entity.EntityTracker;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_10;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_8;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_9;
|
||||
import com.viaversion.viaversion.api.minecraft.item.DataItem;
|
||||
import com.viaversion.viaversion.api.minecraft.item.Item;
|
||||
import com.viaversion.viaversion.api.minecraft.entitydata.EntityData;
|
||||
@ -62,7 +63,7 @@ public class SpawnPacketRewriter1_9 {
|
||||
int entityID = wrapper.get(Types.VAR_INT, 0);
|
||||
int typeID = wrapper.get(Types.BYTE, 0);
|
||||
EntityTracker1_9 tracker = wrapper.user().getEntityTracker(Protocol1_8To1_9.class);
|
||||
tracker.addEntity(entityID, EntityTypes1_10.getTypeFromId(typeID, true));
|
||||
tracker.addEntity(entityID, EntityTypes1_9.getTypeFromId(typeID, true));
|
||||
});
|
||||
|
||||
map(Types.INT, toNewDouble); // 3 - X - Needs to be divided by 32
|
||||
@ -98,7 +99,7 @@ public class SpawnPacketRewriter1_9 {
|
||||
final int data = wrapper.get(Types.INT, 0); // Data
|
||||
|
||||
int typeID = wrapper.get(Types.BYTE, 0);
|
||||
if (EntityTypes1_10.getTypeFromId(typeID, true) == EntityTypes1_10.EntityType.SPLASH_POTION) {
|
||||
if (EntityTypes1_8.getTypeFromId(typeID, true) == EntityTypes1_8.EntityType.POTION) {
|
||||
// Convert this to meta data, woo!
|
||||
PacketWrapper metaPacket = wrapper.create(ClientboundPackets1_9.SET_ENTITY_DATA, wrapper1 -> {
|
||||
wrapper1.write(Types.VAR_INT, entityID);
|
||||
@ -128,7 +129,7 @@ public class SpawnPacketRewriter1_9 {
|
||||
handler(wrapper -> {
|
||||
int entityID = wrapper.get(Types.VAR_INT, 0);
|
||||
EntityTracker1_9 tracker = wrapper.user().getEntityTracker(Protocol1_8To1_9.class);
|
||||
tracker.addEntity(entityID, EntityTypes1_10.EntityType.EXPERIENCE_ORB);
|
||||
tracker.addEntity(entityID, EntityTypes1_9.EntityType.EXPERIENCE_ORB);
|
||||
});
|
||||
|
||||
map(Types.INT, toNewDouble); // 1 - X - Needs to be divided by 32
|
||||
@ -149,7 +150,7 @@ public class SpawnPacketRewriter1_9 {
|
||||
// Currently only lightning uses this
|
||||
int entityID = wrapper.get(Types.VAR_INT, 0);
|
||||
EntityTracker1_9 tracker = wrapper.user().getEntityTracker(Protocol1_8To1_9.class);
|
||||
tracker.addEntity(entityID, EntityTypes1_10.EntityType.LIGHTNING);
|
||||
tracker.addEntity(entityID, EntityTypes1_9.EntityType.LIGHTNING_BOLT);
|
||||
});
|
||||
|
||||
map(Types.INT, toNewDouble); // 2 - X - Needs to be divided by 32
|
||||
@ -175,7 +176,7 @@ public class SpawnPacketRewriter1_9 {
|
||||
int entityID = wrapper.get(Types.VAR_INT, 0);
|
||||
int typeID = wrapper.get(Types.UNSIGNED_BYTE, 0);
|
||||
EntityTracker1_9 tracker = wrapper.user().getEntityTracker(Protocol1_8To1_9.class);
|
||||
tracker.addEntity(entityID, EntityTypes1_10.getTypeFromId(typeID, false));
|
||||
tracker.addEntity(entityID, EntityTypes1_9.getTypeFromId(typeID, false));
|
||||
});
|
||||
|
||||
map(Types.INT, toNewDouble); // 3 - X - Needs to be divided by 32
|
||||
@ -221,7 +222,7 @@ public class SpawnPacketRewriter1_9 {
|
||||
handler(wrapper -> {
|
||||
int entityID = wrapper.get(Types.VAR_INT, 0);
|
||||
EntityTracker1_9 tracker = wrapper.user().getEntityTracker(Protocol1_8To1_9.class);
|
||||
tracker.addEntity(entityID, EntityTypes1_10.EntityType.PAINTING);
|
||||
tracker.addEntity(entityID, EntityTypes1_9.EntityType.PAINTING);
|
||||
});
|
||||
handler(wrapper -> {
|
||||
int entityID = wrapper.get(Types.VAR_INT, 0);
|
||||
@ -245,7 +246,7 @@ public class SpawnPacketRewriter1_9 {
|
||||
handler(wrapper -> {
|
||||
int entityID = wrapper.get(Types.VAR_INT, 0);
|
||||
EntityTracker1_9 tracker = wrapper.user().getEntityTracker(Protocol1_8To1_9.class);
|
||||
tracker.addEntity(entityID, EntityTypes1_10.EntityType.PLAYER);
|
||||
tracker.addEntity(entityID, EntityTypes1_9.EntityType.PLAYER);
|
||||
});
|
||||
|
||||
map(Types.INT, toNewDouble); // 2 - X - Needs to be divided by 32
|
||||
|
@ -25,7 +25,7 @@ import com.viaversion.viaversion.api.legacy.bossbar.BossColor;
|
||||
import com.viaversion.viaversion.api.legacy.bossbar.BossStyle;
|
||||
import com.viaversion.viaversion.api.minecraft.GameMode;
|
||||
import com.viaversion.viaversion.api.minecraft.Position;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_10.EntityType;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_9.EntityType;
|
||||
import com.viaversion.viaversion.api.minecraft.item.DataItem;
|
||||
import com.viaversion.viaversion.api.minecraft.item.Item;
|
||||
import com.viaversion.viaversion.api.minecraft.entitydata.EntityData;
|
||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren