2017-06-24 17:26:42 +02:00
/ *
2021-03-23 11:51:40 +01:00
* This file is part of ViaVersion - https : //github.com/ViaVersion/ViaVersion
2023-01-12 12:45:53 +01:00
* Copyright ( C ) 2016 - 2023 ViaVersion and contributors
2017-06-24 17:26:42 +02:00
*
2021-03-23 11:51:40 +01:00
* 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 :
2017-06-24 17:26:42 +02:00
*
2021-03-23 11:51:40 +01:00
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software .
2017-06-24 17:26:42 +02:00
*
2021-03-23 11:51:40 +01:00
* 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 .
2017-06-24 17:26:42 +02:00
* /
2021-04-26 21:16:10 +02:00
package com.viaversion.viaversion.api.minecraft.entities ;
2017-06-24 17:26:42 +02:00
2021-04-26 20:52:34 +02:00
import com.viaversion.viaversion.api.Via ;
2017-06-24 17:26:42 +02:00
2019-04-27 18:36:01 +02:00
import java.util.HashMap ;
import java.util.Map ;
2019-09-21 11:57:28 +02:00
import java.util.Optional ;
2019-04-27 18:36:01 +02:00
2017-06-24 17:26:42 +02:00
// 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 Entity1_12Types {
2019-05-15 12:04:56 +02:00
2017-06-24 17:26:42 +02:00
public static EntityType getTypeFromId ( int typeID , boolean isObject ) {
Optional < EntityType > type ;
if ( isObject )
2019-09-19 11:22:06 +02:00
type = ObjectType . getPCEntity ( typeID ) ;
2017-06-24 17:26:42 +02:00
else
type = EntityType . findById ( typeID ) ;
if ( ! type . isPresent ( ) ) {
2019-11-27 00:55:33 +01:00
Via . getPlatform ( ) . getLogger ( ) . severe ( " Could not find 1.12 type id " + typeID + " isObject= " + isObject ) ;
2017-06-24 17:26:42 +02:00
return EntityType . ENTITY ; // Fall back to the basic ENTITY
}
return type . get ( ) ;
}
2021-04-26 21:16:10 +02:00
public enum EntityType implements com . viaversion . viaversion . api . minecraft . entities . EntityType {
2017-06-24 17:26:42 +02:00
ENTITY ( - 1 ) ,
DROPPED_ITEM ( 1 , 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 ) ,
FALLING_BLOCK ( 21 , ENTITY ) ,
FIREWORK ( 22 , ENTITY ) ,
SPECTRAL_ARROW ( 24 , ARROW ) ,
SHULKER_BULLET ( 25 , ENTITY ) ,
DRAGON_FIREBALL ( 26 , FIREBALL ) ,
EVOCATION_FANGS ( 33 , 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 ) ,
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 ) ,
// 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_SKELETON ( - 1 , ENTITY_INSENTIENT ) ,
SKELETON ( 51 , ABSTRACT_SKELETON ) ,
WITHER_SKELETON ( 5 , ABSTRACT_SKELETON ) ,
STRAY ( 6 , ABSTRACT_SKELETON ) ,
SPIDER ( 52 , ENTITY_INSENTIENT ) ,
GIANT ( 53 , ENTITY_INSENTIENT ) ,
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 ) ,
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 ) ,
2019-05-13 12:04:03 +02:00
ELDER_GUARDIAN ( 4 , GUARDIAN ) , // Moved down to avoid illegal forward reference
2017-06-24 17:26:42 +02:00
IRON_GOLEM ( 99 , ENTITY_INSENTIENT ) , // moved up to avoid illegal forward references
2019-05-13 12:04:03 +02:00
SHULKER ( 69 , IRON_GOLEM ) ,
2017-06-24 17:26:42 +02:00
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 ) ,
2019-05-13 12:04:03 +02:00
SNOWMAN ( 97 , IRON_GOLEM ) ,
2017-06-24 17:26:42 +02:00
OCELOT ( 98 , ENTITY_TAMEABLE_ANIMAL ) ,
PARROT ( 105 , ENTITY_TAMEABLE_ANIMAL ) ,
ABSTRACT_HORSE ( - 1 , ENTITY_AGEABLE ) ,
HORSE ( 100 , ABSTRACT_HORSE ) ,
SKELETON_HORSE ( 28 , ABSTRACT_HORSE ) ,
ZOMBIE_HORSE ( 29 , ABSTRACT_HORSE ) ,
CHESTED_HORSE ( - 1 , ABSTRACT_HORSE ) ,
DONKEY ( 31 , CHESTED_HORSE ) ,
MULE ( 32 , CHESTED_HORSE ) ,
LIAMA ( 103 , CHESTED_HORSE ) ,
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 ) ;
2019-04-27 18:36:01 +02:00
private static final Map < Integer , EntityType > TYPES = new HashMap < > ( ) ;
2017-06-24 17:26:42 +02:00
private final int id ;
private final EntityType parent ;
EntityType ( int id ) {
this . id = id ;
this . parent = null ;
}
2020-04-23 21:07:12 +02:00
EntityType ( int id , EntityType parent ) {
this . id = id ;
this . parent = parent ;
}
@Override
public int getId ( ) {
return id ;
}
@Override
public EntityType getParent ( ) {
return parent ;
}
2022-04-01 16:54:07 +02:00
@Override
public String identifier ( ) {
throw new UnsupportedOperationException ( ) ;
}
@Override
public boolean isAbstractType ( ) {
return id ! = - 1 ;
}
2019-04-27 18:36:01 +02:00
static {
for ( EntityType type : EntityType . values ( ) ) {
TYPES . put ( type . id , type ) ;
}
}
2017-06-24 17:26:42 +02:00
public static Optional < EntityType > findById ( int id ) {
if ( id = = - 1 ) // Check if this is called
2019-09-21 11:57:28 +02:00
return Optional . empty ( ) ;
return Optional . ofNullable ( TYPES . get ( id ) ) ;
2017-06-24 17:26:42 +02:00
}
}
2021-04-26 21:16:10 +02:00
public enum ObjectType implements com . viaversion . viaversion . api . minecraft . entities . ObjectType {
2017-06-24 17:26:42 +02:00
BOAT ( 1 , EntityType . BOAT ) ,
ITEM ( 2 , EntityType . DROPPED_ITEM ) ,
AREA_EFFECT_CLOUD ( 3 , EntityType . AREA_EFFECT_CLOUD ) ,
2019-03-04 12:37:38 +01:00
MINECART ( 10 , EntityType . MINECART_RIDEABLE ) ,
2017-06-24 17:26:42 +02:00
TNT_PRIMED ( 50 , EntityType . PRIMED_TNT ) ,
ENDER_CRYSTAL ( 51 , EntityType . ENDER_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 ) ,
LIAMA_SPIT ( 68 , EntityType . LIAMA_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 ) ,
ARMOR_STAND ( 78 , EntityType . ARMOR_STAND ) ,
EVOCATION_FANGS ( 79 , EntityType . EVOCATION_FANGS ) ,
FISHIHNG_HOOK ( 90 , EntityType . FISHING_HOOK ) ,
SPECTRAL_ARROW ( 91 , EntityType . SPECTRAL_ARROW ) ,
DRAGON_FIREBALL ( 93 , EntityType . DRAGON_FIREBALL ) ;
2019-09-19 11:22:06 +02:00
private static final Map < Integer , ObjectType > TYPES = new HashMap < > ( ) ;
2019-04-27 18:36:01 +02:00
2017-06-24 17:26:42 +02:00
private final int id ;
private final EntityType type ;
2019-04-27 18:36:01 +02:00
static {
2019-09-19 11:22:06 +02:00
for ( ObjectType type : ObjectType . values ( ) ) {
2019-04-27 18:36:01 +02:00
TYPES . put ( type . id , type ) ;
}
}
2020-04-23 21:07:12 +02:00
ObjectType ( int id , EntityType type ) {
this . id = id ;
this . type = type ;
}
@Override
public int getId ( ) {
return id ;
}
@Override
public EntityType getType ( ) {
return type ;
}
2019-09-19 11:22:06 +02:00
public static Optional < ObjectType > findById ( int id ) {
2017-06-24 17:26:42 +02:00
if ( id = = - 1 )
2019-09-21 11:57:28 +02:00
return Optional . empty ( ) ;
return Optional . ofNullable ( TYPES . get ( id ) ) ;
2017-06-24 17:26:42 +02:00
}
public static Optional < EntityType > getPCEntity ( int id ) {
2019-09-19 11:22:06 +02:00
Optional < ObjectType > output = findById ( id ) ;
2017-06-24 17:26:42 +02:00
if ( ! output . isPresent ( ) )
2019-09-21 11:57:28 +02:00
return Optional . empty ( ) ;
return Optional . of ( output . get ( ) . type ) ;
2017-06-24 17:26:42 +02:00
}
}
}