diff --git a/src/autogenerated/java/net/minestom/server/entity/EntityType.java b/src/autogenerated/java/net/minestom/server/entity/EntityType.java index a92bbdd83..dab56474a 100644 --- a/src/autogenerated/java/net/minestom/server/entity/EntityType.java +++ b/src/autogenerated/java/net/minestom/server/entity/EntityType.java @@ -1,7 +1,118 @@ package net.minestom.server.entity; +import java.util.function.BiFunction; +import net.minestom.server.entity.metadata.EntityMeta; +import net.minestom.server.entity.metadata.PlayerMeta; +import net.minestom.server.entity.metadata.ambient.BatMeta; +import net.minestom.server.entity.metadata.animal.BeeMeta; +import net.minestom.server.entity.metadata.animal.ChickenMeta; +import net.minestom.server.entity.metadata.animal.CowMeta; +import net.minestom.server.entity.metadata.animal.DonkeyMeta; +import net.minestom.server.entity.metadata.animal.FoxMeta; +import net.minestom.server.entity.metadata.animal.HoglinMeta; +import net.minestom.server.entity.metadata.animal.HorseMeta; +import net.minestom.server.entity.metadata.animal.LlamaMeta; +import net.minestom.server.entity.metadata.animal.MooshroomMeta; +import net.minestom.server.entity.metadata.animal.MuleMeta; +import net.minestom.server.entity.metadata.animal.OcelotMeta; +import net.minestom.server.entity.metadata.animal.PandaMeta; +import net.minestom.server.entity.metadata.animal.PigMeta; +import net.minestom.server.entity.metadata.animal.PolarBearMeta; +import net.minestom.server.entity.metadata.animal.RabbitMeta; +import net.minestom.server.entity.metadata.animal.SheepMeta; +import net.minestom.server.entity.metadata.animal.SkeletonHorseMeta; +import net.minestom.server.entity.metadata.animal.StriderMeta; +import net.minestom.server.entity.metadata.animal.TurtleMeta; +import net.minestom.server.entity.metadata.animal.ZombieHorseMeta; +import net.minestom.server.entity.metadata.animal.tameable.CatMeta; +import net.minestom.server.entity.metadata.animal.tameable.ParrotMeta; +import net.minestom.server.entity.metadata.animal.tameable.WolfMeta; +import net.minestom.server.entity.metadata.arrow.ArrowMeta; +import net.minestom.server.entity.metadata.arrow.SpectralArrowMeta; +import net.minestom.server.entity.metadata.arrow.ThrownTridentMeta; +import net.minestom.server.entity.metadata.flying.GhastMeta; +import net.minestom.server.entity.metadata.flying.PhantomMeta; +import net.minestom.server.entity.metadata.golem.IronGolemMeta; +import net.minestom.server.entity.metadata.golem.ShulkerMeta; +import net.minestom.server.entity.metadata.golem.SnowGolemMeta; +import net.minestom.server.entity.metadata.item.EyeOfEnderMeta; +import net.minestom.server.entity.metadata.item.FireballMeta; +import net.minestom.server.entity.metadata.item.ItemEntityMeta; +import net.minestom.server.entity.metadata.item.SmallFireballMeta; +import net.minestom.server.entity.metadata.item.SnowballMeta; +import net.minestom.server.entity.metadata.item.ThrownEggMeta; +import net.minestom.server.entity.metadata.item.ThrownEnderPearlMeta; +import net.minestom.server.entity.metadata.item.ThrownExperienceBottleMeta; +import net.minestom.server.entity.metadata.item.ThrownPotionMeta; +import net.minestom.server.entity.metadata.minecart.ChestMinecartMeta; +import net.minestom.server.entity.metadata.minecart.CommandBlockMinecartMeta; +import net.minestom.server.entity.metadata.minecart.FurnaceMinecartMeta; +import net.minestom.server.entity.metadata.minecart.HopperMinecartMeta; +import net.minestom.server.entity.metadata.minecart.MinecartMeta; +import net.minestom.server.entity.metadata.minecart.SpawnerMinecartMeta; +import net.minestom.server.entity.metadata.minecart.TntMinecartMeta; +import net.minestom.server.entity.metadata.monster.BlazeMeta; +import net.minestom.server.entity.metadata.monster.CaveSpiderMeta; +import net.minestom.server.entity.metadata.monster.CreeperMeta; +import net.minestom.server.entity.metadata.monster.ElderGuardianMeta; +import net.minestom.server.entity.metadata.monster.EndermanMeta; +import net.minestom.server.entity.metadata.monster.EndermiteMeta; +import net.minestom.server.entity.metadata.monster.GiantMeta; +import net.minestom.server.entity.metadata.monster.GuardianMeta; +import net.minestom.server.entity.metadata.monster.PiglinBruteMeta; +import net.minestom.server.entity.metadata.monster.PiglinMeta; +import net.minestom.server.entity.metadata.monster.SilverfishMeta; +import net.minestom.server.entity.metadata.monster.SpiderMeta; +import net.minestom.server.entity.metadata.monster.VexMeta; +import net.minestom.server.entity.metadata.monster.WitherMeta; +import net.minestom.server.entity.metadata.monster.ZoglinMeta; +import net.minestom.server.entity.metadata.monster.raider.EvokerMeta; +import net.minestom.server.entity.metadata.monster.raider.IllusionerMeta; +import net.minestom.server.entity.metadata.monster.raider.PillagerMeta; +import net.minestom.server.entity.metadata.monster.raider.RavagerMeta; +import net.minestom.server.entity.metadata.monster.raider.VindicatorMeta; +import net.minestom.server.entity.metadata.monster.raider.WitchMeta; +import net.minestom.server.entity.metadata.monster.skeleton.SkeletonMeta; +import net.minestom.server.entity.metadata.monster.skeleton.StrayMeta; +import net.minestom.server.entity.metadata.monster.skeleton.WitherSkeletonMeta; +import net.minestom.server.entity.metadata.monster.zombie.DrownedMeta; +import net.minestom.server.entity.metadata.monster.zombie.HuskMeta; +import net.minestom.server.entity.metadata.monster.zombie.ZombieMeta; +import net.minestom.server.entity.metadata.monster.zombie.ZombieVillagerMeta; +import net.minestom.server.entity.metadata.monster.zombie.ZombifiedPiglinMeta; +import net.minestom.server.entity.metadata.other.AreaEffectCloudMeta; +import net.minestom.server.entity.metadata.other.ArmorStandMeta; +import net.minestom.server.entity.metadata.other.BoatMeta; +import net.minestom.server.entity.metadata.other.DragonFireballMeta; +import net.minestom.server.entity.metadata.other.EndCrystalMeta; +import net.minestom.server.entity.metadata.other.EnderDragonMeta; +import net.minestom.server.entity.metadata.other.EvokerFangsMeta; +import net.minestom.server.entity.metadata.other.ExperienceOrbMeta; +import net.minestom.server.entity.metadata.other.FallingBlockMeta; +import net.minestom.server.entity.metadata.other.FireworkRocketMeta; +import net.minestom.server.entity.metadata.other.FishingHookMeta; +import net.minestom.server.entity.metadata.other.ItemFrameMeta; +import net.minestom.server.entity.metadata.other.LeashKnotMeta; +import net.minestom.server.entity.metadata.other.LightningBoltMeta; +import net.minestom.server.entity.metadata.other.LlamaSpitMeta; +import net.minestom.server.entity.metadata.other.MagmaCubeMeta; +import net.minestom.server.entity.metadata.other.PaintingMeta; +import net.minestom.server.entity.metadata.other.PrimedTntMeta; +import net.minestom.server.entity.metadata.other.ShulkerBulletMeta; +import net.minestom.server.entity.metadata.other.SlimeMeta; +import net.minestom.server.entity.metadata.other.TraderLlamaMeta; +import net.minestom.server.entity.metadata.other.WitherSkullMeta; +import net.minestom.server.entity.metadata.villager.VillagerMeta; +import net.minestom.server.entity.metadata.villager.WanderingTraderMeta; +import net.minestom.server.entity.metadata.water.DolphinMeta; +import net.minestom.server.entity.metadata.water.SquidMeta; +import net.minestom.server.entity.metadata.water.fish.CodMeta; +import net.minestom.server.entity.metadata.water.fish.PufferfishMeta; +import net.minestom.server.entity.metadata.water.fish.SalmonMeta; +import net.minestom.server.entity.metadata.water.fish.TropicalFishMeta; import net.minestom.server.registry.Registries; import net.minestom.server.utils.NamespaceID; +import org.jetbrains.annotations.NotNull; /** * //============================== @@ -10,241 +121,276 @@ import net.minestom.server.utils.NamespaceID; */ @SuppressWarnings({"deprecation"}) public enum EntityType { - AREA_EFFECT_CLOUD("minecraft:area_effect_cloud"), + AREA_EFFECT_CLOUD("minecraft:area_effect_cloud", 6.0, 0.5, AreaEffectCloudMeta::new, EntitySpawnType.BASE), - ARMOR_STAND("minecraft:armor_stand"), + ARMOR_STAND("minecraft:armor_stand", 0.5, 1.975, ArmorStandMeta::new, EntitySpawnType.LIVING), - ARROW("minecraft:arrow"), + ARROW("minecraft:arrow", 0.5, 0.5, ArrowMeta::new, EntitySpawnType.BASE), - BAT("minecraft:bat"), + BAT("minecraft:bat", 0.5, 0.9, BatMeta::new, EntitySpawnType.LIVING), - BEE("minecraft:bee"), + BEE("minecraft:bee", 0.7, 0.6, BeeMeta::new, EntitySpawnType.LIVING), - BLAZE("minecraft:blaze"), + BLAZE("minecraft:blaze", 0.6, 1.8, BlazeMeta::new, EntitySpawnType.LIVING), - BOAT("minecraft:boat"), + BOAT("minecraft:boat", 1.375, 0.5625, BoatMeta::new, EntitySpawnType.BASE), - CAT("minecraft:cat"), + CAT("minecraft:cat", 0.6, 0.7, CatMeta::new, EntitySpawnType.LIVING), - CAVE_SPIDER("minecraft:cave_spider"), + CAVE_SPIDER("minecraft:cave_spider", 0.7, 0.5, CaveSpiderMeta::new, EntitySpawnType.LIVING), - CHICKEN("minecraft:chicken"), + CHICKEN("minecraft:chicken", 0.4, 0.7, ChickenMeta::new, EntitySpawnType.LIVING), - COD("minecraft:cod"), + COD("minecraft:cod", 0.5, 0.3, CodMeta::new, EntitySpawnType.LIVING), - COW("minecraft:cow"), + COW("minecraft:cow", 0.9, 1.4, CowMeta::new, EntitySpawnType.LIVING), - CREEPER("minecraft:creeper"), + CREEPER("minecraft:creeper", 0.6, 1.7, CreeperMeta::new, EntitySpawnType.LIVING), - DOLPHIN("minecraft:dolphin"), + DOLPHIN("minecraft:dolphin", 0.9, 0.6, DolphinMeta::new, EntitySpawnType.LIVING), - DONKEY("minecraft:donkey"), + DONKEY("minecraft:donkey", 1.39648, 1.5, DonkeyMeta::new, EntitySpawnType.LIVING), - DRAGON_FIREBALL("minecraft:dragon_fireball"), + DRAGON_FIREBALL("minecraft:dragon_fireball", 1.0, 1.0, DragonFireballMeta::new, EntitySpawnType.BASE), - DROWNED("minecraft:drowned"), + DROWNED("minecraft:drowned", 0.6, 1.95, DrownedMeta::new, EntitySpawnType.LIVING), - ELDER_GUARDIAN("minecraft:elder_guardian"), + ELDER_GUARDIAN("minecraft:elder_guardian", 1.9975, 1.9975, ElderGuardianMeta::new, EntitySpawnType.LIVING), - END_CRYSTAL("minecraft:end_crystal"), + END_CRYSTAL("minecraft:end_crystal", 2.0, 2.0, EndCrystalMeta::new, EntitySpawnType.BASE), - ENDER_DRAGON("minecraft:ender_dragon"), + ENDER_DRAGON("minecraft:ender_dragon", 16.0, 8.0, EnderDragonMeta::new, EntitySpawnType.LIVING), - ENDERMAN("minecraft:enderman"), + ENDERMAN("minecraft:enderman", 0.6, 2.9, EndermanMeta::new, EntitySpawnType.LIVING), - ENDERMITE("minecraft:endermite"), + ENDERMITE("minecraft:endermite", 0.4, 0.3, EndermiteMeta::new, EntitySpawnType.LIVING), - EVOKER("minecraft:evoker"), + EVOKER("minecraft:evoker", 0.6, 1.95, EvokerMeta::new, EntitySpawnType.LIVING), - EVOKER_FANGS("minecraft:evoker_fangs"), + EVOKER_FANGS("minecraft:evoker_fangs", 0.5, 0.8, EvokerFangsMeta::new, EntitySpawnType.BASE), - EXPERIENCE_ORB("minecraft:experience_orb"), + EXPERIENCE_ORB("minecraft:experience_orb", 0.5, 0.5, ExperienceOrbMeta::new, EntitySpawnType.EXPERIENCE_ORB), - EYE_OF_ENDER("minecraft:eye_of_ender"), + EYE_OF_ENDER("minecraft:eye_of_ender", 0.25, 0.25, EyeOfEnderMeta::new, EntitySpawnType.BASE), - FALLING_BLOCK("minecraft:falling_block"), + FALLING_BLOCK("minecraft:falling_block", 0.98, 0.98, FallingBlockMeta::new, EntitySpawnType.BASE), - FIREWORK_ROCKET("minecraft:firework_rocket"), + FIREWORK_ROCKET("minecraft:firework_rocket", 0.25, 0.25, FireworkRocketMeta::new, EntitySpawnType.BASE), - FOX("minecraft:fox"), + FOX("minecraft:fox", 0.6, 0.7, FoxMeta::new, EntitySpawnType.LIVING), - GHAST("minecraft:ghast"), + GHAST("minecraft:ghast", 4.0, 4.0, GhastMeta::new, EntitySpawnType.LIVING), - GIANT("minecraft:giant"), + GIANT("minecraft:giant", 3.6, 12.0, GiantMeta::new, EntitySpawnType.LIVING), - GUARDIAN("minecraft:guardian"), + GUARDIAN("minecraft:guardian", 0.85, 0.85, GuardianMeta::new, EntitySpawnType.LIVING), - HOGLIN("minecraft:hoglin"), + HOGLIN("minecraft:hoglin", 1.39648, 1.4, HoglinMeta::new, EntitySpawnType.LIVING), - HORSE("minecraft:horse"), + HORSE("minecraft:horse", 1.39648, 1.6, HorseMeta::new, EntitySpawnType.LIVING), - HUSK("minecraft:husk"), + HUSK("minecraft:husk", 0.6, 1.95, HuskMeta::new, EntitySpawnType.LIVING), - ILLUSIONER("minecraft:illusioner"), + ILLUSIONER("minecraft:illusioner", 0.6, 1.95, IllusionerMeta::new, EntitySpawnType.LIVING), - IRON_GOLEM("minecraft:iron_golem"), + IRON_GOLEM("minecraft:iron_golem", 1.4, 2.7, IronGolemMeta::new, EntitySpawnType.LIVING), - ITEM("minecraft:item"), + ITEM("minecraft:item", 0.25, 0.25, ItemEntityMeta::new, EntitySpawnType.BASE), - ITEM_FRAME("minecraft:item_frame"), + ITEM_FRAME("minecraft:item_frame", 0.5, 0.5, ItemFrameMeta::new, EntitySpawnType.BASE), - FIREBALL("minecraft:fireball"), + FIREBALL("minecraft:fireball", 1.0, 1.0, FireballMeta::new, EntitySpawnType.BASE), - LEASH_KNOT("minecraft:leash_knot"), + LEASH_KNOT("minecraft:leash_knot", 0.5, 0.5, LeashKnotMeta::new, EntitySpawnType.BASE), - LIGHTNING_BOLT("minecraft:lightning_bolt"), + LIGHTNING_BOLT("minecraft:lightning_bolt", 0.0, 0.0, LightningBoltMeta::new, EntitySpawnType.BASE), - LLAMA("minecraft:llama"), + LLAMA("minecraft:llama", 0.9, 1.87, LlamaMeta::new, EntitySpawnType.LIVING), - LLAMA_SPIT("minecraft:llama_spit"), + LLAMA_SPIT("minecraft:llama_spit", 0.25, 0.25, LlamaSpitMeta::new, EntitySpawnType.BASE), - MAGMA_CUBE("minecraft:magma_cube"), + MAGMA_CUBE("minecraft:magma_cube", 2.04, 2.04, MagmaCubeMeta::new, EntitySpawnType.LIVING), - MINECART("minecraft:minecart"), + MINECART("minecraft:minecart", 0.98, 0.7, MinecartMeta::new, EntitySpawnType.BASE), - CHEST_MINECART("minecraft:chest_minecart"), + CHEST_MINECART("minecraft:chest_minecart", 0.98, 0.7, ChestMinecartMeta::new, EntitySpawnType.BASE), - COMMAND_BLOCK_MINECART("minecraft:command_block_minecart"), + COMMAND_BLOCK_MINECART("minecraft:command_block_minecart", 0.98, 0.7, CommandBlockMinecartMeta::new, EntitySpawnType.BASE), - FURNACE_MINECART("minecraft:furnace_minecart"), + FURNACE_MINECART("minecraft:furnace_minecart", 0.98, 0.7, FurnaceMinecartMeta::new, EntitySpawnType.BASE), - HOPPER_MINECART("minecraft:hopper_minecart"), + HOPPER_MINECART("minecraft:hopper_minecart", 0.98, 0.7, HopperMinecartMeta::new, EntitySpawnType.BASE), - SPAWNER_MINECART("minecraft:spawner_minecart"), + SPAWNER_MINECART("minecraft:spawner_minecart", 0.98, 0.7, SpawnerMinecartMeta::new, EntitySpawnType.BASE), - TNT_MINECART("minecraft:tnt_minecart"), + TNT_MINECART("minecraft:tnt_minecart", 0.98, 0.7, TntMinecartMeta::new, EntitySpawnType.BASE), - MULE("minecraft:mule"), + MULE("minecraft:mule", 1.39648, 1.6, MuleMeta::new, EntitySpawnType.LIVING), - MOOSHROOM("minecraft:mooshroom"), + MOOSHROOM("minecraft:mooshroom", 0.9, 1.4, MooshroomMeta::new, EntitySpawnType.LIVING), - OCELOT("minecraft:ocelot"), + OCELOT("minecraft:ocelot", 0.6, 0.7, OcelotMeta::new, EntitySpawnType.LIVING), - PAINTING("minecraft:painting"), + PAINTING("minecraft:painting", 0.5, 0.5, PaintingMeta::new, EntitySpawnType.PAINTING), - PANDA("minecraft:panda"), + PANDA("minecraft:panda", 1.3, 1.25, PandaMeta::new, EntitySpawnType.LIVING), - PARROT("minecraft:parrot"), + PARROT("minecraft:parrot", 0.5, 0.9, ParrotMeta::new, EntitySpawnType.LIVING), - PHANTOM("minecraft:phantom"), + PHANTOM("minecraft:phantom", 0.9, 0.5, PhantomMeta::new, EntitySpawnType.LIVING), - PIG("minecraft:pig"), + PIG("minecraft:pig", 0.9, 0.9, PigMeta::new, EntitySpawnType.LIVING), - PIGLIN("minecraft:piglin"), + PIGLIN("minecraft:piglin", 0.6, 1.95, PiglinMeta::new, EntitySpawnType.LIVING), - PIGLIN_BRUTE("minecraft:piglin_brute"), + PIGLIN_BRUTE("minecraft:piglin_brute", 0.6, 1.95, PiglinBruteMeta::new, EntitySpawnType.LIVING), - PILLAGER("minecraft:pillager"), + PILLAGER("minecraft:pillager", 0.6, 1.95, PillagerMeta::new, EntitySpawnType.LIVING), - POLAR_BEAR("minecraft:polar_bear"), + POLAR_BEAR("minecraft:polar_bear", 1.4, 1.4, PolarBearMeta::new, EntitySpawnType.LIVING), - TNT("minecraft:tnt"), + TNT("minecraft:tnt", 0.98, 0.98, PrimedTntMeta::new, EntitySpawnType.BASE), - PUFFERFISH("minecraft:pufferfish"), + PUFFERFISH("minecraft:pufferfish", 0.7, 0.7, PufferfishMeta::new, EntitySpawnType.LIVING), - RABBIT("minecraft:rabbit"), + RABBIT("minecraft:rabbit", 0.4, 0.5, RabbitMeta::new, EntitySpawnType.LIVING), - RAVAGER("minecraft:ravager"), + RAVAGER("minecraft:ravager", 1.95, 2.2, RavagerMeta::new, EntitySpawnType.LIVING), - SALMON("minecraft:salmon"), + SALMON("minecraft:salmon", 0.7, 0.4, SalmonMeta::new, EntitySpawnType.LIVING), - SHEEP("minecraft:sheep"), + SHEEP("minecraft:sheep", 0.9, 1.3, SheepMeta::new, EntitySpawnType.LIVING), - SHULKER("minecraft:shulker"), + SHULKER("minecraft:shulker", 1.0, 1.0, ShulkerMeta::new, EntitySpawnType.LIVING), - SHULKER_BULLET("minecraft:shulker_bullet"), + SHULKER_BULLET("minecraft:shulker_bullet", 0.3125, 0.3125, ShulkerBulletMeta::new, EntitySpawnType.BASE), - SILVERFISH("minecraft:silverfish"), + SILVERFISH("minecraft:silverfish", 0.4, 0.3, SilverfishMeta::new, EntitySpawnType.LIVING), - SKELETON("minecraft:skeleton"), + SKELETON("minecraft:skeleton", 0.6, 1.99, SkeletonMeta::new, EntitySpawnType.LIVING), - SKELETON_HORSE("minecraft:skeleton_horse"), + SKELETON_HORSE("minecraft:skeleton_horse", 1.39648, 1.6, SkeletonHorseMeta::new, EntitySpawnType.LIVING), - SLIME("minecraft:slime"), + SLIME("minecraft:slime", 2.04, 2.04, SlimeMeta::new, EntitySpawnType.LIVING), - SMALL_FIREBALL("minecraft:small_fireball"), + SMALL_FIREBALL("minecraft:small_fireball", 0.3125, 0.3125, SmallFireballMeta::new, EntitySpawnType.BASE), - SNOW_GOLEM("minecraft:snow_golem"), + SNOW_GOLEM("minecraft:snow_golem", 0.7, 1.9, SnowGolemMeta::new, EntitySpawnType.LIVING), - SNOWBALL("minecraft:snowball"), + SNOWBALL("minecraft:snowball", 0.25, 0.25, SnowballMeta::new, EntitySpawnType.BASE), - SPECTRAL_ARROW("minecraft:spectral_arrow"), + SPECTRAL_ARROW("minecraft:spectral_arrow", 0.5, 0.5, SpectralArrowMeta::new, EntitySpawnType.BASE), - SPIDER("minecraft:spider"), + SPIDER("minecraft:spider", 1.4, 0.9, SpiderMeta::new, EntitySpawnType.LIVING), - SQUID("minecraft:squid"), + SQUID("minecraft:squid", 0.8, 0.8, SquidMeta::new, EntitySpawnType.LIVING), - STRAY("minecraft:stray"), + STRAY("minecraft:stray", 0.6, 1.99, StrayMeta::new, EntitySpawnType.LIVING), - STRIDER("minecraft:strider"), + STRIDER("minecraft:strider", 0.9, 1.7, StriderMeta::new, EntitySpawnType.LIVING), - EGG("minecraft:egg"), + EGG("minecraft:egg", 0.25, 0.25, ThrownEggMeta::new, EntitySpawnType.BASE), - ENDER_PEARL("minecraft:ender_pearl"), + ENDER_PEARL("minecraft:ender_pearl", 0.25, 0.25, ThrownEnderPearlMeta::new, EntitySpawnType.BASE), - EXPERIENCE_BOTTLE("minecraft:experience_bottle"), + EXPERIENCE_BOTTLE("minecraft:experience_bottle", 0.25, 0.25, ThrownExperienceBottleMeta::new, EntitySpawnType.BASE), - POTION("minecraft:potion"), + POTION("minecraft:potion", 0.25, 0.25, ThrownPotionMeta::new, EntitySpawnType.BASE), - TRIDENT("minecraft:trident"), + TRIDENT("minecraft:trident", 0.5, 0.5, ThrownTridentMeta::new, EntitySpawnType.BASE), - TRADER_LLAMA("minecraft:trader_llama"), + TRADER_LLAMA("minecraft:trader_llama", 0.9, 1.87, TraderLlamaMeta::new, EntitySpawnType.BASE), - TROPICAL_FISH("minecraft:tropical_fish"), + TROPICAL_FISH("minecraft:tropical_fish", 0.5, 0.4, TropicalFishMeta::new, EntitySpawnType.LIVING), - TURTLE("minecraft:turtle"), + TURTLE("minecraft:turtle", 1.2, 0.4, TurtleMeta::new, EntitySpawnType.LIVING), - VEX("minecraft:vex"), + VEX("minecraft:vex", 0.4, 0.8, VexMeta::new, EntitySpawnType.LIVING), - VILLAGER("minecraft:villager"), + VILLAGER("minecraft:villager", 0.6, 1.95, VillagerMeta::new, EntitySpawnType.LIVING), - VINDICATOR("minecraft:vindicator"), + VINDICATOR("minecraft:vindicator", 0.6, 1.95, VindicatorMeta::new, EntitySpawnType.LIVING), - WANDERING_TRADER("minecraft:wandering_trader"), + WANDERING_TRADER("minecraft:wandering_trader", 0.6, 1.95, WanderingTraderMeta::new, EntitySpawnType.LIVING), - WITCH("minecraft:witch"), + WITCH("minecraft:witch", 0.6, 1.95, WitchMeta::new, EntitySpawnType.LIVING), - WITHER("minecraft:wither"), + WITHER("minecraft:wither", 0.9, 3.5, WitherMeta::new, EntitySpawnType.LIVING), - WITHER_SKELETON("minecraft:wither_skeleton"), + WITHER_SKELETON("minecraft:wither_skeleton", 0.7, 2.4, WitherSkeletonMeta::new, EntitySpawnType.LIVING), - WITHER_SKULL("minecraft:wither_skull"), + WITHER_SKULL("minecraft:wither_skull", 0.3125, 0.3125, WitherSkullMeta::new, EntitySpawnType.BASE), - WOLF("minecraft:wolf"), + WOLF("minecraft:wolf", 0.6, 0.85, WolfMeta::new, EntitySpawnType.LIVING), - ZOGLIN("minecraft:zoglin"), + ZOGLIN("minecraft:zoglin", 1.39648, 1.4, ZoglinMeta::new, EntitySpawnType.LIVING), - ZOMBIE("minecraft:zombie"), + ZOMBIE("minecraft:zombie", 0.6, 1.95, ZombieMeta::new, EntitySpawnType.LIVING), - ZOMBIE_HORSE("minecraft:zombie_horse"), + ZOMBIE_HORSE("minecraft:zombie_horse", 1.39648, 1.6, ZombieHorseMeta::new, EntitySpawnType.LIVING), - ZOMBIE_VILLAGER("minecraft:zombie_villager"), + ZOMBIE_VILLAGER("minecraft:zombie_villager", 0.6, 1.95, ZombieVillagerMeta::new, EntitySpawnType.LIVING), - ZOMBIFIED_PIGLIN("minecraft:zombified_piglin"), + ZOMBIFIED_PIGLIN("minecraft:zombified_piglin", 0.6, 1.95, ZombifiedPiglinMeta::new, EntitySpawnType.LIVING), - PLAYER("minecraft:player"), + PLAYER("minecraft:player", 0.6, 1.8, PlayerMeta::new, EntitySpawnType.PLAYER), - FISHING_BOBBER("minecraft:fishing_bobber"); + FISHING_BOBBER("minecraft:fishing_bobber", 0.25, 0.25, FishingHookMeta::new, EntitySpawnType.BASE); - private String namespaceID; + private static final EntityType[] VALUES = values(); - EntityType(String namespaceID) { + @NotNull + private final String namespaceID; + + private final double width; + + private final double height; + + @NotNull + private final BiFunction metaConstructor; + + @NotNull + private final EntitySpawnType spawnType; + + EntityType(@NotNull String namespaceID, double width, double height, + @NotNull BiFunction metaConstructor, + @NotNull EntitySpawnType spawnType) { this.namespaceID = namespaceID; + this.width = width; + this.height = height; + this.metaConstructor = metaConstructor; + this.spawnType = spawnType; Registries.entityTypes.put(NamespaceID.from(namespaceID), this); } - public int getId() { - return ordinal(); + public short getId() { + return (short) ordinal(); } public String getNamespaceID() { - return namespaceID; + return this.namespaceID; } - public static EntityType fromId(int id) { - if (id >= 0 && id < values().length) { - return values()[id]; + public double getWidth() { + return this.width; + } + + public double getHeight() { + return this.height; + } + + public BiFunction getMetaConstructor() { + return this.metaConstructor; + } + + public EntitySpawnType getSpawnType() { + return this.spawnType; + } + + public static EntityType fromId(short id) { + if(id >= 0 && id < VALUES.length) { + return VALUES[id]; } - return PIG; + return null; } } diff --git a/src/autogenerated/java/net/minestom/server/registry/Registries.java b/src/autogenerated/java/net/minestom/server/registry/Registries.java index 3b6be532c..b4ab492cd 100644 --- a/src/autogenerated/java/net/minestom/server/registry/Registries.java +++ b/src/autogenerated/java/net/minestom/server/registry/Registries.java @@ -1,6 +1,7 @@ // AUTOGENERATED by net.minestom.codegen.RegistriesGenerator package net.minestom.server.registry; +import java.util.HashMap; import net.minestom.server.entity.EntityType; import net.minestom.server.fluids.Fluid; import net.minestom.server.instance.block.Block; @@ -15,8 +16,6 @@ import net.minestom.server.utils.NamespaceID; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.HashMap; - /** * AUTOGENERATED */ diff --git a/src/generators/java/net/minestom/codegen/ConstructorLambda.java b/src/generators/java/net/minestom/codegen/ConstructorLambda.java new file mode 100644 index 000000000..b1b77c112 --- /dev/null +++ b/src/generators/java/net/minestom/codegen/ConstructorLambda.java @@ -0,0 +1,16 @@ +package net.minestom.codegen; + +import com.squareup.javapoet.ClassName; + +public class ConstructorLambda { + + private final ClassName className; + + public ConstructorLambda(ClassName className) { + this.className = className; + } + + public ClassName getClassName() { + return className; + } +} diff --git a/src/generators/java/net/minestom/codegen/EnumGenerator.java b/src/generators/java/net/minestom/codegen/EnumGenerator.java index 628093700..4400596f3 100644 --- a/src/generators/java/net/minestom/codegen/EnumGenerator.java +++ b/src/generators/java/net/minestom/codegen/EnumGenerator.java @@ -21,6 +21,7 @@ public class EnumGenerator implements CodeGenerator { private final String enumName; private ParameterSpec[] parameters; private List methods = new LinkedList<>(); + private List fields = new LinkedList<>(); private List instances = new LinkedList<>(); private List hardcodedFields = new LinkedList<>(); private List annotations = new LinkedList<>(); @@ -50,6 +51,10 @@ public class EnumGenerator implements CodeGenerator { methods.add(new Method(true, name, signature, returnType, code, false)); } + public void addStaticField(TypeName type, String name, String value) { + fields.add(new Field(type, name, value)); + } + public void addInstance(String name, Object... parameters) { instances.add(new Instance(name, parameters)); } @@ -58,17 +63,22 @@ public class EnumGenerator implements CodeGenerator { TypeSpec.Builder enumClass = TypeSpec.enumBuilder(ClassName.get(enumPackage, enumName)).addModifiers(Modifier.PUBLIC); enumClass.addJavadoc(COMMENT); - for(AnnotationSpec annotation : annotations) { + for (AnnotationSpec annotation : annotations) { enumClass.addAnnotation(annotation); } - for(Instance instance : instances) { + for (Instance instance : instances) { StringBuilder format = new StringBuilder(); for (int i = 0; i < instance.parameters.length; i++) { if (i != 0) { format.append(", "); } - format.append("$L"); + if (instance.parameters[i] instanceof ConstructorLambda) { + instance.parameters[i] = ((ConstructorLambda) instance.parameters[i]).getClassName(); + format.append("$T::new"); + } else { + format.append("$L"); + } } // generate instances @@ -76,7 +86,7 @@ public class EnumGenerator implements CodeGenerator { enumClass.addEnumConstant(instance.name, arguments); } - if(staticBlock != null) { + if (staticBlock != null) { enumClass.addStaticBlock(staticBlock); } @@ -85,11 +95,18 @@ public class EnumGenerator implements CodeGenerator { // properties for (ParameterSpec property : parameters) { enumClass.addField(FieldSpec.builder(property.type, property.name) - .addModifiers(Modifier.PRIVATE) + .addModifiers(Modifier.PRIVATE, Modifier.FINAL) .addAnnotations(property.annotations) .build()); } + for (Field field : fields) { + enumClass.addField(FieldSpec.builder(field.type, field.name) + .initializer("$L", field.value) + .addModifiers(Modifier.PRIVATE, Modifier.FINAL, Modifier.STATIC) + .build()); + } + // hard coded fields for (Field hardcoded : hardcodedFields) { enumClass.addField(FieldSpec.builder(hardcoded.type, hardcoded.name) @@ -121,10 +138,10 @@ public class EnumGenerator implements CodeGenerator { } methodBuilder.addModifiers(Modifier.PUBLIC); methodBuilder.returns(m.returnType); - if(m.vararg) { + if (m.vararg) { methodBuilder.varargs(true); } - for(ParameterSpec parameter : m.signature) { + for (ParameterSpec parameter : m.signature) { methodBuilder.addParameter(parameter); } @@ -134,7 +151,6 @@ public class EnumGenerator implements CodeGenerator { enumClass.addMethod(methodBuilder.build()); } - JavaFile file = JavaFile.builder(enumPackage, enumClass.build()) .skipJavaLangImports(true) .indent(" ") diff --git a/src/generators/java/net/minestom/codegen/RegistriesGenerator.java b/src/generators/java/net/minestom/codegen/RegistriesGenerator.java index 30bd8aeb5..fdcbba675 100644 --- a/src/generators/java/net/minestom/codegen/RegistriesGenerator.java +++ b/src/generators/java/net/minestom/codegen/RegistriesGenerator.java @@ -20,7 +20,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.lang.model.element.Modifier; -import java.io.*; +import java.io.File; +import java.io.IOException; import java.lang.annotation.Annotation; import java.util.Collections; import java.util.HashMap; @@ -39,7 +40,7 @@ public class RegistriesGenerator implements CodeGenerator { new ImmutablePair<>(Block.class.getCanonicalName(), "AIR"), new ImmutablePair<>(Material.class.getCanonicalName(), "AIR"), new ImmutablePair<>(Enchantment.class.getCanonicalName(), null), - new ImmutablePair<>(EntityType.class.getCanonicalName(), "PIG"), + new ImmutablePair<>(EntityType.class.getCanonicalName(), null), new ImmutablePair<>(Particle.class.getCanonicalName(), null), new ImmutablePair<>(PotionType.class.getCanonicalName(), null), new ImmutablePair<>(PotionEffect.class.getCanonicalName(), null), @@ -61,7 +62,7 @@ public class RegistriesGenerator implements CodeGenerator { ClassName type = ClassName.bestGuess(registries[i].left); String simpleType = type.simpleName(); - FieldSpec field = FieldSpec.builder(ParameterizedTypeName.get(ClassName.get(HashMap.class), ClassName.get(NamespaceID.class), type), CodeGenerator.decapitalize(simpleType)+"s") + FieldSpec field = FieldSpec.builder(ParameterizedTypeName.get(ClassName.get(HashMap.class), ClassName.get(NamespaceID.class), type), CodeGenerator.decapitalize(simpleType) + "s") .addModifiers(Modifier.FINAL, Modifier.STATIC, Modifier.PUBLIC) .addJavadoc("Should only be used for internal code, please use the get* methods.") .addAnnotation(Deprecated.class) @@ -103,7 +104,7 @@ public class RegistriesGenerator implements CodeGenerator { CodeBlock.Builder code = CodeBlock.builder(); Class annotation; - if(defaultValue != null) { + if (defaultValue != null) { annotation = NotNull.class; code.addStatement("return $N.getOrDefault($N, $T.$N)", fields[i], namespaceIDParam, type, defaultValue); } else { @@ -114,7 +115,7 @@ public class RegistriesGenerator implements CodeGenerator { // string variant ParameterSpec idParam = ParameterSpec.builder(ClassName.get(String.class), "id") .build(); - MethodSpec idMethod = MethodSpec.methodBuilder("get"+simpleType) + MethodSpec idMethod = MethodSpec.methodBuilder("get" + simpleType) .returns(type) .addAnnotation(annotation) .addModifiers(Modifier.STATIC, Modifier.PUBLIC) @@ -125,7 +126,7 @@ public class RegistriesGenerator implements CodeGenerator { registriesClass.addMethod(idMethod); // NamespaceID variant - registriesClass.addMethod(MethodSpec.methodBuilder("get"+simpleType) + registriesClass.addMethod(MethodSpec.methodBuilder("get" + simpleType) .returns(type) .addAnnotation(annotation) .addModifiers(Modifier.STATIC, Modifier.PUBLIC) @@ -136,7 +137,7 @@ public class RegistriesGenerator implements CodeGenerator { } JavaFile file = JavaFile.builder("net.minestom.server.registry", registriesClass.build()) - .addFileComment("AUTOGENERATED by "+getClass().getCanonicalName()) + .addFileComment("AUTOGENERATED by " + getClass().getCanonicalName()) .indent(" ") .skipJavaLangImports(true) .build(); diff --git a/src/generators/java/net/minestom/codegen/entitytypes/BurgerEntity.java b/src/generators/java/net/minestom/codegen/entitytypes/BurgerEntity.java new file mode 100644 index 000000000..2d0279d78 --- /dev/null +++ b/src/generators/java/net/minestom/codegen/entitytypes/BurgerEntity.java @@ -0,0 +1,8 @@ +package net.minestom.codegen.entitytypes; + +public class BurgerEntity { + int id; + String name; + double width; + double height; +} diff --git a/src/generators/java/net/minestom/codegen/entitytypes/EntityTypeContainer.java b/src/generators/java/net/minestom/codegen/entitytypes/EntityTypeContainer.java new file mode 100644 index 000000000..cdd2a37b2 --- /dev/null +++ b/src/generators/java/net/minestom/codegen/entitytypes/EntityTypeContainer.java @@ -0,0 +1,153 @@ +package net.minestom.codegen.entitytypes; + +import com.google.common.base.CaseFormat; +import net.minestom.server.entity.EntitySpawnType; +import net.minestom.server.entity.metadata.LivingEntityMeta; +import net.minestom.server.entity.metadata.PlayerMeta; +import net.minestom.server.entity.metadata.other.ExperienceOrbMeta; +import net.minestom.server.entity.metadata.other.PaintingMeta; +import net.minestom.server.utils.NamespaceID; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; + +public class EntityTypeContainer implements Comparable { + + private int id; + private NamespaceID name; + private double width; + private double height; + private Class metaClass; + private EntitySpawnType spawnType; + + public EntityTypeContainer(int id, NamespaceID name, double width, double height) { + this.id = id; + this.name = name; + this.width = width; + this.height = height; + String metaClassName = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, name.getPath()); + // special cases + switch (metaClassName) { + case "Item": + metaClassName = "ItemEntity"; + break; + case "Tnt": + metaClassName = "PrimedTnt"; + break; + case "FishingBobber": + metaClassName = "FishingHook"; + break; + case "Egg": + case "EnderPearl": + case "ExperienceBottle": + case "Potion": + case "Trident": + metaClassName = "Thrown" + metaClassName; + break; + default: + break; + } + metaClassName += "Meta"; + this.metaClass = findClassIn("net.minestom.server.entity.metadata", metaClassName); + + if (this.metaClass == PlayerMeta.class) { + this.spawnType = EntitySpawnType.PLAYER; + } else if (this.metaClass == PaintingMeta.class) { + this.spawnType = EntitySpawnType.PAINTING; + } else if (this.metaClass == ExperienceOrbMeta.class) { + this.spawnType = EntitySpawnType.EXPERIENCE_ORB; + } else if (LivingEntityMeta.class.isAssignableFrom(this.metaClass)) { + this.spawnType = EntitySpawnType.LIVING; + } else { + this.spawnType = EntitySpawnType.BASE; + } + } + + public int getId() { + return id; + } + + public NamespaceID getName() { + return name; + } + + public double getWidth() { + return width; + } + + public double getHeight() { + return height; + } + + public Class getMetaClass() { + return metaClass; + } + + public EntitySpawnType getSpawnType() { + return spawnType; + } + + @Override + public int compareTo(@NotNull EntityTypeContainer o) { + return Integer.compare(id, o.id); + } + + private static Class findClassIn(String pkg, String className) { + try { + return getClasses(pkg).stream() + .filter(clazz -> clazz.getSimpleName().equals(className)) + .findAny() + .orElseThrow(); + } catch (Throwable t) { + throw new IllegalStateException("Could not find class " + className + " in " + pkg, t); + } + } + + private static List> getClasses(String packageName) + throws ClassNotFoundException, IOException { + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + assert classLoader != null; + String path = packageName.replace('.', '/'); + Enumeration resources = classLoader.getResources(path); + List dirs = new ArrayList<>(); + while (resources.hasMoreElements()) { + URL resource = resources.nextElement(); + dirs.add(new File(resource.getFile())); + } + List> classes = new ArrayList<>(); + for (File directory : dirs) { + classes.addAll(findClasses(directory, packageName)); + } + return classes; + } + + /** + * Recursive method used to find all classes in a given directory and subdirs. + * + * @param directory The base directory + * @param packageName The package name for classes found inside the base directory + * @return The classes + * @throws ClassNotFoundException + */ + private static List> findClasses(File directory, String packageName) throws ClassNotFoundException { + List> classes = new ArrayList<>(); + if (!directory.exists()) { + return classes; + } + File[] files = directory.listFiles(); + for (File file : files) { + if (file.isDirectory()) { + assert !file.getName().contains("."); + classes.addAll(findClasses(file, packageName + "." + file.getName())); + } else if (file.getName().endsWith(".class")) { + classes.add(Class.forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6))); + } + } + return classes; + } +} diff --git a/src/generators/java/net/minestom/codegen/entitytypes/EntityTypeEnumGenerator.java b/src/generators/java/net/minestom/codegen/entitytypes/EntityTypeEnumGenerator.java index f9cdc6e05..dc8649a30 100644 --- a/src/generators/java/net/minestom/codegen/entitytypes/EntityTypeEnumGenerator.java +++ b/src/generators/java/net/minestom/codegen/entitytypes/EntityTypeEnumGenerator.java @@ -1,21 +1,45 @@ package net.minestom.codegen.entitytypes; -import net.minestom.codegen.BasicEnumGenerator; -import net.minestom.codegen.stats.StatsEnumGenerator; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.squareup.javapoet.*; +import net.minestom.codegen.ConstructorLambda; +import net.minestom.codegen.EnumGenerator; +import net.minestom.codegen.MinestomEnumGenerator; +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.EntitySpawnType; +import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.EntityMeta; +import net.minestom.server.registry.Registries; import net.minestom.server.registry.ResourceGatherer; +import net.minestom.server.utils.NamespaceID; +import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.BufferedReader; import java.io.File; import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URL; +import java.util.*; +import java.util.function.BiFunction; -public class EntityTypeEnumGenerator extends BasicEnumGenerator { +/** + * Generates an EntityType enum containing all data about entity types + */ +public class EntityTypeEnumGenerator extends MinestomEnumGenerator { private static final Logger LOGGER = LoggerFactory.getLogger(EntityTypeEnumGenerator.class); + private final String targetVersion; + private final File targetFolder; + public static void main(String[] args) throws IOException { String targetVersion; - if(args.length < 1) { + if (args.length < 1) { System.err.println("Usage: [target folder]"); return; } @@ -29,25 +53,44 @@ public class EntityTypeEnumGenerator extends BasicEnumGenerator { } String targetPart = DEFAULT_TARGET_PATH; - if(args.length >= 2) { + if (args.length >= 2) { targetPart = args[1]; } File targetFolder = new File(targetPart); - if(!targetFolder.exists()) { + if (!targetFolder.exists()) { targetFolder.mkdirs(); } - new EntityTypeEnumGenerator(targetFolder); + new EntityTypeEnumGenerator(targetVersion, targetFolder); } - private EntityTypeEnumGenerator(File targetFolder) throws IOException { - super(targetFolder); + private EntityTypeEnumGenerator(String targetVersion, File targetFolder) throws IOException { + this.targetVersion = targetVersion; + this.targetFolder = targetFolder; + generateTo(targetFolder); } - @Override - protected String getCategoryID() { - return "minecraft:entity_type"; + /** + * Extract entity information from Burger (submodule of Minestom) + * + * @param gson + * @param url + * @return + * @throws IOException + */ + private List parseEntitiesFromBurger(Gson gson, String url) throws IOException { + try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new URL(url).openStream()))) { + LOGGER.debug("\tConnection established, reading file"); + JsonObject dictionary = gson.fromJson(bufferedReader, JsonArray.class).get(0).getAsJsonObject(); + JsonObject entitiesMap = dictionary.getAsJsonObject("entities").getAsJsonObject("entity"); + List entities = new LinkedList<>(); + for (var entry : entitiesMap.entrySet()) { + BurgerEntity entity = gson.fromJson(entry.getValue(), BurgerEntity.class); + entities.add(entity); + } + return entities; + } } @Override @@ -60,6 +103,103 @@ public class EntityTypeEnumGenerator extends BasicEnumGenerator { return "EntityType"; } + @Override + protected Collection compile() throws IOException { + Gson gson = new Gson(); + LOGGER.debug("Loading PrismarineJS entity types data"); + List burgerEntities = parseEntitiesFromBurger(gson, BURGER_URL_BASE_URL + targetVersion + ".json"); + + TreeSet types = new TreeSet<>(EntityTypeContainer::compareTo); + for (var burgerEntity : burgerEntities) { + if (burgerEntity.name.contains("~")) { + continue; + } + types.add(new EntityTypeContainer( + burgerEntity.id, + NamespaceID.from("minecraft:" + burgerEntity.name), + burgerEntity.width, + burgerEntity.height + )); + } + return types; + } + + @Override + protected void prepare(EnumGenerator generator) { + ClassName className = ClassName.get(getPackageName(), getClassName()); + generator.addClassAnnotation(AnnotationSpec.builder(SuppressWarnings.class).addMember("value", "{$S}", "deprecation").build()); + generator.setParams( + ParameterSpec.builder(String.class, "namespaceID").addAnnotation(NotNull.class).build(), + ParameterSpec.builder(TypeName.DOUBLE, "width").build(), + ParameterSpec.builder(TypeName.DOUBLE, "height").build(), + ParameterSpec.builder(ParameterizedTypeName.get( + BiFunction.class, + Entity.class, + Metadata.class, + EntityMeta.class + ), "metaConstructor").addAnnotation(NotNull.class).build(), + ParameterSpec.builder(EntitySpawnType.class, "spawnType").addAnnotation(NotNull.class).build() + ); + generator.appendToConstructor(code -> { + code.addStatement("$T.$N.put($T.from(namespaceID), this)", Registries.class, "entityTypes", NamespaceID.class); + }); + + generator.addMethod("getId", new ParameterSpec[0], TypeName.SHORT, code -> { + code.addStatement("return (short) ordinal()"); + }); + generator.addMethod("getNamespaceID", new ParameterSpec[0], ClassName.get(String.class), code -> { + code.addStatement("return this.namespaceID"); + }); + generator.addMethod("getWidth", new ParameterSpec[0], TypeName.DOUBLE, code -> { + code.addStatement("return this.width"); + }); + generator.addMethod("getHeight", new ParameterSpec[0], TypeName.DOUBLE, code -> { + code.addStatement("return this.height"); + }); + generator.addMethod("getMetaConstructor", new ParameterSpec[0], + ParameterizedTypeName.get( + BiFunction.class, + Entity.class, + Metadata.class, + EntityMeta.class + ), + code -> code.addStatement("return this.metaConstructor") + ); + generator.addMethod("getSpawnType", new ParameterSpec[0], ClassName.get(EntitySpawnType.class), code -> { + code.addStatement("return this.spawnType"); + }); + + generator.addStaticField(ArrayTypeName.of(ClassName.get(EntityType.class)), "VALUES", "values()"); + + generator.addStaticMethod("fromId", new ParameterSpec[]{ParameterSpec.builder(TypeName.SHORT, "id").build()}, className, code -> { + code.beginControlFlow("if(id >= 0 && id < VALUES.length)") + .addStatement("return VALUES[id]") + .endControlFlow() + .addStatement("return null"); + }); + } + + @Override + protected void writeSingle(EnumGenerator generator, EntityTypeContainer type) { + String instanceName = type.getName().getPath().toUpperCase(); + generator.addInstance(instanceName, + "\"" + type.getName().toString() + "\"", + type.getWidth(), + type.getHeight(), + new ConstructorLambda(ClassName.get(type.getMetaClass())), + "EntitySpawnType." + type.getSpawnType().name() + ); + } + + @Override + protected List postGeneration(Collection types) { + return Collections.emptyList(); + } + + @Override + protected void postWrite(EnumGenerator generator) { + } + @Override public Logger getLogger() { return LOGGER; diff --git a/src/generators/java/net/minestom/codegen/particles/ParticleEnumGenerator.java b/src/generators/java/net/minestom/codegen/particles/ParticleEnumGenerator.java index 2bc6789bf..c7363e01f 100644 --- a/src/generators/java/net/minestom/codegen/particles/ParticleEnumGenerator.java +++ b/src/generators/java/net/minestom/codegen/particles/ParticleEnumGenerator.java @@ -1,7 +1,6 @@ package net.minestom.codegen.particles; import net.minestom.codegen.BasicEnumGenerator; -import net.minestom.codegen.stats.StatsEnumGenerator; import net.minestom.server.registry.ResourceGatherer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentEnum.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentEnum.java new file mode 100644 index 000000000..2ab8ed3f5 --- /dev/null +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentEnum.java @@ -0,0 +1,80 @@ +package net.minestom.server.command.builder.arguments; + +import net.minestom.server.command.builder.NodeMaker; +import net.minestom.server.command.builder.exception.ArgumentSyntaxException; +import net.minestom.server.network.packet.server.play.DeclareCommandsPacket; +import org.jetbrains.annotations.NotNull; + +import java.util.Locale; +import java.util.function.Consumer; +import java.util.function.Function; + +@SuppressWarnings("rawtypes") +public class ArgumentEnum extends Argument { + + public final static int NOT_ENUM_VALUE_ERROR = 1; + + private final Class enumClass; + private final E[] values; + private Format format = Format.DEFAULT; + + public ArgumentEnum(@NotNull String id, Class enumClass) { + super(id); + this.enumClass = enumClass; + this.values = enumClass.getEnumConstants(); + } + + public void setFormat(@NotNull Format format) { + this.format = format; + } + + @NotNull + @Override + public E parse(@NotNull String input) throws ArgumentSyntaxException { + for (E value : this.values) { + if (this.format.formatter.apply(value.name()).equals(input)) { + return value; + } + } + throw new ArgumentSyntaxException("Not a " + this.enumClass.getSimpleName() + " value", input, NOT_ENUM_VALUE_ERROR); + } + + @Override + public void processNodes(@NotNull NodeMaker nodeMaker, boolean executable) { + // Add the single word properties + parser + final Consumer wordConsumer = node -> { + node.parser = "brigadier:string"; + node.properties = packetWriter -> { + packetWriter.writeVarInt(0); // Single word + }; + }; + + // Create a primitive array for mapping + DeclareCommandsPacket.Node[] nodes = new DeclareCommandsPacket.Node[this.values.length]; + + // Create a node for each restrictions as literal + for (int i = 0; i < nodes.length; i++) { + DeclareCommandsPacket.Node argumentNode = new DeclareCommandsPacket.Node(); + + argumentNode.flags = DeclareCommandsPacket.getFlag(DeclareCommandsPacket.NodeType.LITERAL, + executable, false, false); + argumentNode.name = this.format.formatter.apply(this.values[i].name()); + wordConsumer.accept(argumentNode); + nodes[i] = argumentNode; + } + nodeMaker.addNodes(nodes); + } + + public enum Format { + DEFAULT(name -> name), + LOWER_CASED(name -> name.toLowerCase(Locale.ROOT)), + UPPER_CASED(name -> name.toUpperCase(Locale.ROOT)); + + private final Function formatter; + + Format(Function formatter) { + this.formatter = formatter; + } + } + +} diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentType.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentType.java index 5edab32de..5f40d2b79 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentType.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentType.java @@ -79,6 +79,11 @@ public class ArgumentType { return new ArgumentCommand(id); } + @SuppressWarnings("rawtypes") + public static ArgumentEnum Enum(@NotNull String id, @NotNull Class enumClass) { + return new ArgumentEnum<>(id, enumClass); + } + // Minecraft specific arguments public static ArgumentColor Color(@NotNull String id) { diff --git a/src/main/java/net/minestom/server/entity/Entity.java b/src/main/java/net/minestom/server/entity/Entity.java index 0f64fba0c..b4ce6973e 100644 --- a/src/main/java/net/minestom/server/entity/Entity.java +++ b/src/main/java/net/minestom/server/entity/Entity.java @@ -8,15 +8,20 @@ import net.minestom.server.collision.BoundingBox; import net.minestom.server.collision.CollisionUtils; import net.minestom.server.data.Data; import net.minestom.server.data.DataContainer; +import net.minestom.server.entity.metadata.EntityMeta; import net.minestom.server.event.Event; import net.minestom.server.event.EventCallback; import net.minestom.server.event.entity.*; import net.minestom.server.event.handler.EventHandler; +import net.minestom.server.event.item.ArmorEquipEvent; import net.minestom.server.instance.Chunk; import net.minestom.server.instance.Instance; import net.minestom.server.instance.InstanceManager; import net.minestom.server.instance.block.CustomBlock; +import net.minestom.server.inventory.EquipmentHandler; +import net.minestom.server.item.ItemStack; import net.minestom.server.network.packet.server.play.*; +import net.minestom.server.network.player.PlayerConnection; import net.minestom.server.permission.Permission; import net.minestom.server.permission.PermissionHandler; import net.minestom.server.potion.Potion; @@ -26,7 +31,6 @@ import net.minestom.server.thread.ThreadProvider; import net.minestom.server.utils.BlockPosition; import net.minestom.server.utils.Position; import net.minestom.server.utils.Vector; -import net.minestom.server.utils.binary.BitmaskUtil; import net.minestom.server.utils.callback.OptionalCallback; import net.minestom.server.utils.chunk.ChunkCallback; import net.minestom.server.utils.chunk.ChunkUtils; @@ -39,6 +43,7 @@ import net.minestom.server.utils.validate.Check; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.time.Year; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; @@ -51,33 +56,12 @@ import java.util.function.Consumer; *

* To create your own entity you probably want to extends {@link ObjectEntity} or {@link EntityCreature} instead. */ -public abstract class Entity implements Viewable, EventHandler, DataContainer, PermissionHandler { +public class Entity implements Viewable, EventHandler, DataContainer, PermissionHandler { private static final Map entityById = new ConcurrentHashMap<>(); private static final Map entityByUuid = new ConcurrentHashMap<>(); private static final AtomicInteger lastEntityId = new AtomicInteger(); - // Metadata - protected static final byte METADATA_BYTE = 0; - protected static final byte METADATA_VARINT = 1; - protected static final byte METADATA_FLOAT = 2; - protected static final byte METADATA_STRING = 3; - protected static final byte METADATA_CHAT = 4; - protected static final byte METADATA_OPTCHAT = 5; - protected static final byte METADATA_SLOT = 6; - protected static final byte METADATA_BOOLEAN = 7; - protected static final byte METADATA_ROTATION = 8; - protected static final byte METADATA_POSITION = 9; - protected static final byte METADATA_OPTPOSITION = 10; - protected static final byte METADATA_DIRECTION = 11; - protected static final byte METADATA_OPTUUID = 12; - protected static final byte METADATA_OPTBLOCKID = 13; - protected static final byte METADATA_NBT = 14; - protected static final byte METADATA_PARTICLE = 15; - protected static final byte METADATA_VILLAGERDATA = 16; - protected static final byte METADATA_OPTVARINT = 17; - protected static final byte METADATA_POSE = 18; - protected Instance instance; protected final Position position; protected double lastX, lastY, lastZ; @@ -123,6 +107,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P private final Map, Collection> eventCallbacks = new ConcurrentHashMap<>(); protected Metadata metadata = new Metadata(this); + protected EntityMeta entityMeta; private final List effects = new CopyOnWriteArrayList<>(); @@ -133,16 +118,20 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P private long ticks; private final EntityTickEvent tickEvent = new EntityTickEvent(this); - public Entity(@NotNull EntityType entityType, @NotNull UUID uuid, @NotNull Position spawnPosition) { + /** + * Lock used to support #switchEntityType + */ + private final Object entityTypeLock = new Object(); + + public Entity(@NotNull EntityType entityType, @NotNull UUID uuid) { this.id = generateId(); this.entityType = entityType; this.uuid = uuid; - this.position = spawnPosition.clone(); - this.lastX = spawnPosition.getX(); - this.lastY = spawnPosition.getY(); - this.lastZ = spawnPosition.getZ(); + this.position = new Position(); - setBoundingBox(0, 0, 0); + setBoundingBox(entityType.getWidth(), entityType.getHeight(), entityType.getWidth()); + + this.entityMeta = entityType.getMetaConstructor().apply(this, this.metadata); setAutoViewable(true); @@ -150,12 +139,22 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P Entity.entityByUuid.put(uuid, this); } - public Entity(@NotNull EntityType entityType, @NotNull Position spawnPosition) { - this(entityType, UUID.randomUUID(), spawnPosition); + public Entity(@NotNull EntityType entityType) { + this(entityType, UUID.randomUUID()); } - public Entity(@NotNull EntityType entityType) { - this(entityType, new Position()); + @Deprecated + public Entity(@NotNull EntityType entityType, @NotNull UUID uuid, @NotNull Position spawnPosition) { + this(entityType, uuid); + this.position.set(spawnPosition); + this.lastX = spawnPosition.getX(); + this.lastY = spawnPosition.getY(); + this.lastZ = spawnPosition.getZ(); + } + + @Deprecated + public Entity(@NotNull EntityType entityType, @NotNull Position spawnPosition) { + this(entityType, UUID.randomUUID(), spawnPosition); } /** @@ -209,17 +208,32 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P * * @param time time of the update in milliseconds */ - public abstract void update(long time); + public void update(long time) { + + } /** * Called when a new instance is set. */ - public abstract void spawn(); + public void spawn() { + + } public boolean isOnGround() { return onGround || EntityUtils.isOnGround(this) /* backup for levitating entities */; } + /** + * Gets metadata of this entity. + * You may want to cast it to specific implementation. + * + * @return metadata of this entity. + */ + @NotNull + public EntityMeta getEntityMeta() { + return this.entityMeta; + } + /** * Teleports the entity only if the chunk at {@code position} is loaded or if * {@link Instance#hasEnabledAutoChunkLoad()} returns true. @@ -319,18 +333,41 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P } @Override - public boolean addViewer(@NotNull Player player) { - boolean result = this.viewers.add(player); - if (!result) + public final boolean addViewer(@NotNull Player player) { + synchronized (this.entityTypeLock) { + return addViewer0(player); + } + } + + public boolean addViewer0(@NotNull Player player) { + if (!this.viewers.add(player)) { return false; + } player.viewableEntities.add(this); + + PlayerConnection playerConnection = player.getPlayerConnection(); + playerConnection.sendPacket(getEntityType().getSpawnType().getSpawnPacket(this)); + playerConnection.sendPacket(getVelocityPacket()); + playerConnection.sendPacket(getMetadataPacket()); + + if (hasPassenger()) { + playerConnection.sendPacket(getPassengersPacket()); + } + return true; } @Override - public boolean removeViewer(@NotNull Player player) { - if (!viewers.remove(player)) + public final boolean removeViewer(@NotNull Player player) { + synchronized (this.entityTypeLock) { + return removeViewer0(player); + } + } + + public boolean removeViewer0(@NotNull Player player) { + if (!viewers.remove(player)) { return false; + } DestroyEntitiesPacket destroyEntitiesPacket = new DestroyEntitiesPacket(); destroyEntitiesPacket.entityIds = new int[]{getEntityId()}; @@ -345,6 +382,29 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P return unmodifiableViewers; } + /** + * Changes the entity type of this entity. + *

+ * Works by changing the internal entity type field and by calling {@link #removeViewer(Player)} + * followed by {@link #addViewer(Player)} to all current viewers. + *

+ * Be aware that this only change the visual of the entity, the {@link net.minestom.server.collision.BoundingBox} + * will not be modified. + * + * @param entityType the new entity type + */ + public final void switchEntityType(@NotNull EntityType entityType) { + synchronized (entityTypeLock) { + this.entityType = entityType; + this.metadata = new Metadata(this); + this.entityMeta = entityType.getMetaConstructor().apply(this, this.metadata); + + Set viewers = new HashSet<>(getViewers()); + getViewers().forEach(this::removeViewer0); + viewers.forEach(this::addViewer0); + } + } + @Override public Data getData() { return data; @@ -660,6 +720,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P * * @return the entity type */ + @NotNull public EntityType getEntityType() { return entityType; } @@ -751,13 +812,13 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P } /** - * Changes the entity instance. + * Changes the entity instance, i.e. spawns it. * * @param instance the new instance of the entity - * @throws NullPointerException if {@code instance} is null + * @param spawnPosition the spawn position for the entity. * @throws IllegalStateException if {@code instance} has not been registered in {@link InstanceManager} */ - public void setInstance(@NotNull Instance instance) { + public void setInstance(@NotNull Instance instance, @NotNull Position spawnPosition) { Check.stateCondition(!instance.isRegistered(), "Instances need to be registered, please use InstanceManager#registerInstance or InstanceManager#registerSharedInstance"); @@ -765,6 +826,11 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P this.instance.UNSAFE_removeEntity(this); } + this.position.set(spawnPosition); + this.lastX = this.position.getX(); + this.lastY = this.position.getY(); + this.lastZ = this.position.getZ(); + this.isActive = true; this.instance = instance; instance.UNSAFE_addEntity(this); @@ -773,6 +839,19 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P callEvent(EntitySpawnEvent.class, entitySpawnEvent); } + /** + * Changes the entity instance. + * + * @param instance the new instance of the entity + * @deprecated Use {@link Entity#setInstance(Instance, Position)} instead. + * @throws NullPointerException if {@code instance} is null + * @throws IllegalStateException if {@code instance} has not been registered in {@link InstanceManager} + */ + @Deprecated + public void setInstance(@NotNull Instance instance) { + setInstance(instance, this.position); + } + /** * Gets the entity current velocity. * @@ -975,7 +1054,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P * @return true if the entity is in fire, false otherwise */ public boolean isOnFire() { - return (getStateMeta() & 0x01) != 0; + return this.entityMeta.isOnFire(); } /** @@ -987,8 +1066,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P * @param fire should the entity be set in fire */ public void setOnFire(boolean fire) { - final byte state = BitmaskUtil.changeBit(getStateMeta(), (byte) 0x01, (byte) (fire ? 1 : 0), (byte) 0); - this.metadata.setIndex((byte) 0, Metadata.Byte(state)); + this.entityMeta.setOnFire(fire); } /** @@ -999,7 +1077,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P * @return true if the player is sneaking */ public boolean isSneaking() { - return (getStateMeta() & 0x02) != 0; + return this.entityMeta.isSneaking(); } /** @@ -1011,9 +1089,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P */ public void setSneaking(boolean sneaking) { setPose(sneaking ? Pose.SNEAKING : Pose.STANDING); - // update the crouched metadata - final byte state = BitmaskUtil.changeBit(getStateMeta(), (byte) 0x02, (byte) (sneaking ? 1 : 0), (byte) 1); - this.metadata.setIndex((byte) 0, Metadata.Byte(state)); + this.entityMeta.setSneaking(sneaking); } /** @@ -1024,7 +1100,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P * @return true if the player is sprinting */ public boolean isSprinting() { - return (getStateMeta() & 0x08) != 0; + return this.entityMeta.isSprinting(); } /** @@ -1035,8 +1111,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P * @param sprinting true to make the entity sprint */ public void setSprinting(boolean sprinting) { - final byte state = BitmaskUtil.changeBit(getStateMeta(), (byte) 0x08, (byte) (sprinting ? 1 : 0), (byte) 3); - this.metadata.setIndex((byte) 0, Metadata.Byte(state)); + this.entityMeta.setSprinting(sprinting); } /** @@ -1045,7 +1120,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P * @return true if the entity is invisible, false otherwise */ public boolean isInvisible() { - return (getStateMeta() & 0x20) != 0; + return this.entityMeta.isInvisible(); } /** @@ -1055,8 +1130,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P * @param invisible true to set the entity invisible, false otherwise */ public void setInvisible(boolean invisible) { - final byte state = BitmaskUtil.changeBit(getStateMeta(), (byte) 0x20, (byte) (invisible ? 1 : 0), (byte) 5); - this.metadata.setIndex((byte) 0, Metadata.Byte(state)); + this.entityMeta.setInvisible(invisible); } /** @@ -1065,7 +1139,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P * @return true if the entity is glowing, false otherwise */ public boolean isGlowing() { - return (getStateMeta() & 0x40) != 0; + return this.entityMeta.isHasGlowingEffect(); } /** @@ -1074,8 +1148,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P * @param glowing true to make the entity glows, false otherwise */ public void setGlowing(boolean glowing) { - final byte state = BitmaskUtil.changeBit(getStateMeta(), (byte) 0x40, (byte) (glowing ? 1 : 0), (byte) 6); - this.metadata.setIndex((byte) 0, Metadata.Byte(state)); + this.entityMeta.setHasGlowingEffect(glowing); } /** @@ -1085,7 +1158,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P */ @NotNull public Pose getPose() { - return metadata.getIndex((byte) 6, Pose.STANDING); + return this.entityMeta.getPose(); } /** @@ -1098,7 +1171,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P */ @NotNull public void setPose(@NotNull Pose pose) { - this.metadata.setIndex((byte) 6, Metadata.Pose(pose)); + this.entityMeta.setPose(pose); } /** @@ -1108,7 +1181,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P */ @Nullable public JsonMessage getCustomName() { - return metadata.getIndex((byte) 2, null); + return this.entityMeta.getCustomName(); } /** @@ -1117,7 +1190,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P * @param customName the custom name of the entity, null to remove it */ public void setCustomName(@Nullable JsonMessage customName) { - this.metadata.setIndex((byte) 2, Metadata.OptChat(customName)); + this.entityMeta.setCustomName(customName); } /** @@ -1126,7 +1199,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P * @return true if the custom name is visible, false otherwise */ public boolean isCustomNameVisible() { - return metadata.getIndex((byte) 3, false); + return this.entityMeta.isCustomNameVisible(); } /** @@ -1136,15 +1209,15 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P * @param customNameVisible true to make the custom name visible, false otherwise */ public void setCustomNameVisible(boolean customNameVisible) { - this.metadata.setIndex((byte) 3, Metadata.Boolean(customNameVisible)); + this.entityMeta.setCustomNameVisible(customNameVisible); } public boolean isSilent() { - return metadata.getIndex((byte) 4, false); + return this.entityMeta.isSilent(); } public void setSilent(boolean silent) { - this.metadata.setIndex((byte) 4, Metadata.Boolean(silent)); + this.entityMeta.setSilent(silent); } /** @@ -1153,7 +1226,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P * @return true if the entity ignore gravity, false otherwise */ public boolean hasNoGravity() { - return metadata.getIndex((byte) 5, false); + return this.entityMeta.isHasNoGravity(); } /** @@ -1162,7 +1235,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P * @param noGravity should the entity ignore gravity */ public void setNoGravity(boolean noGravity) { - this.metadata.setIndex((byte) 5, Metadata.Boolean(noGravity)); + this.entityMeta.setHasNoGravity(noGravity); } /** @@ -1368,14 +1441,19 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P return scheduledRemoveTime != 0; } + @NotNull + protected Vector getVelocityForPacket() { + return this.velocity.clone().multiply(8000f / MinecraftServer.TICK_PER_SECOND); + } + @NotNull protected EntityVelocityPacket getVelocityPacket() { - final float strength = 8000f / MinecraftServer.TICK_PER_SECOND; EntityVelocityPacket velocityPacket = new EntityVelocityPacket(); velocityPacket.entityId = getEntityId(); - velocityPacket.velocityX = (short) (velocity.getX() * strength); - velocityPacket.velocityY = (short) (velocity.getY() * strength); - velocityPacket.velocityZ = (short) (velocity.getZ() * strength); + Vector velocity = getVelocityForPacket(); + velocityPacket.velocityX = (short) velocity.getX(); + velocityPacket.velocityY = (short) velocity.getY(); + velocityPacket.velocityZ = (short) velocity.getZ(); return velocityPacket; } @@ -1392,10 +1470,6 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P return metaDataPacket; } - private byte getStateMeta() { - return metadata.getIndex((byte) 0, (byte) 0); - } - protected void sendSynchronization() { EntityTeleportPacket entityTeleportPacket = new EntityTeleportPacket(); entityTeleportPacket.entityId = getEntityId(); diff --git a/src/main/java/net/minestom/server/entity/EntityCreature.java b/src/main/java/net/minestom/server/entity/EntityCreature.java index ee1de261d..adf594dd7 100644 --- a/src/main/java/net/minestom/server/entity/EntityCreature.java +++ b/src/main/java/net/minestom/server/entity/EntityCreature.java @@ -8,23 +8,17 @@ import net.minestom.server.entity.ai.TargetSelector; import net.minestom.server.entity.pathfinding.NavigableEntity; import net.minestom.server.entity.pathfinding.Navigator; import net.minestom.server.event.entity.EntityAttackEvent; -import net.minestom.server.event.item.ArmorEquipEvent; import net.minestom.server.instance.Instance; -import net.minestom.server.item.ItemStack; -import net.minestom.server.network.packet.server.play.EntityEquipmentPacket; -import net.minestom.server.network.packet.server.play.SpawnLivingEntityPacket; -import net.minestom.server.network.player.PlayerConnection; import net.minestom.server.utils.Position; import net.minestom.server.utils.time.TimeUnit; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; -import java.util.Set; +import java.util.UUID; -public abstract class EntityCreature extends LivingEntity implements NavigableEntity, EntityAI { +public class EntityCreature extends LivingEntity implements NavigableEntity, EntityAI { private int removalAnimationDelay = 1000; @@ -37,36 +31,26 @@ public abstract class EntityCreature extends LivingEntity implements NavigableEn private Entity target; /** - * Lock used to support #switchEntityType + * Constructor which allows to specify an UUID. Only use if you know what you are doing! */ - private final Object entityTypeLock = new Object(); - - // Equipments - private ItemStack mainHandItem; - private ItemStack offHandItem; - - private ItemStack helmet; - private ItemStack chestplate; - private ItemStack leggings; - private ItemStack boots; - - public EntityCreature(@NotNull EntityType entityType, @NotNull Position spawnPosition) { - super(entityType, spawnPosition); - - this.mainHandItem = ItemStack.getAirItem(); - this.offHandItem = ItemStack.getAirItem(); - - this.helmet = ItemStack.getAirItem(); - this.chestplate = ItemStack.getAirItem(); - this.leggings = ItemStack.getAirItem(); - this.boots = ItemStack.getAirItem(); - + public EntityCreature(@NotNull EntityType entityType, @NotNull UUID uuid) { + super(entityType, uuid); heal(); } + public EntityCreature(@NotNull EntityType entityType) { + this(entityType, UUID.randomUUID()); + } + + @Deprecated + public EntityCreature(@NotNull EntityType entityType, @NotNull Position spawnPosition) { + super(entityType, spawnPosition); + heal(); + } + + @Deprecated public EntityCreature(@NotNull EntityType entityType, @NotNull Position spawnPosition, @Nullable Instance instance) { this(entityType, spawnPosition); - if (instance != null) { setInstance(instance); } @@ -109,63 +93,6 @@ public abstract class EntityCreature extends LivingEntity implements NavigableEn } } - @Override - public boolean addViewer(@NotNull Player player) { - synchronized (entityTypeLock) { - final boolean result = super.addViewer(player); - - final PlayerConnection playerConnection = player.getPlayerConnection(); - - SpawnLivingEntityPacket spawnLivingEntityPacket = new SpawnLivingEntityPacket(); - spawnLivingEntityPacket.entityId = getEntityId(); - spawnLivingEntityPacket.entityUuid = getUuid(); - spawnLivingEntityPacket.entityType = getEntityType().getId(); - spawnLivingEntityPacket.position = getPosition(); - spawnLivingEntityPacket.headPitch = getPosition().getYaw(); - - playerConnection.sendPacket(spawnLivingEntityPacket); - playerConnection.sendPacket(getVelocityPacket()); - playerConnection.sendPacket(getMetadataPacket()); - - // Equipments synchronization - syncEquipments(playerConnection); - - if (hasPassenger()) { - playerConnection.sendPacket(getPassengersPacket()); - } - - return result; - } - } - - @Override - public boolean removeViewer(@NotNull Player player) { - synchronized (entityTypeLock) { - return super.removeViewer(player); - } - } - - /** - * Changes the entity type of this entity. - *

- * Works by changing the internal entity type field and by calling {@link #removeViewer(Player)} - * followed by {@link #addViewer(Player)} to all current viewers. - *

- * Be aware that this only change the visual of the entity, the {@link net.minestom.server.collision.BoundingBox} - * will not be modified. - * - * @param entityType the new entity type - */ - public void switchEntityType(@NotNull EntityType entityType) { - synchronized (entityTypeLock) { - this.entityType = entityType; - - Set viewers = new HashSet<>(getViewers()); - getViewers().forEach(this::removeViewer); - viewers.forEach(this::addViewer); - } - } - /** * Gets the kill animation delay before vanishing the entity. * @@ -175,7 +102,6 @@ public abstract class EntityCreature extends LivingEntity implements NavigableEn return removalAnimationDelay; } - /** * Changes the removal animation delay of the entity. *

@@ -229,78 +155,6 @@ public abstract class EntityCreature extends LivingEntity implements NavigableEn this.target = target; } - @NotNull - @Override - public ItemStack getItemInMainHand() { - return mainHandItem; - } - - @Override - public void setItemInMainHand(@NotNull ItemStack itemStack) { - this.mainHandItem = itemStack; - syncEquipment(EntityEquipmentPacket.Slot.MAIN_HAND); - } - - @NotNull - @Override - public ItemStack getItemInOffHand() { - return offHandItem; - } - - @Override - public void setItemInOffHand(@NotNull ItemStack itemStack) { - this.offHandItem = itemStack; - syncEquipment(EntityEquipmentPacket.Slot.OFF_HAND); - } - - @NotNull - @Override - public ItemStack getHelmet() { - return helmet; - } - - @Override - public void setHelmet(@NotNull ItemStack itemStack) { - this.helmet = getEquipmentItem(itemStack, ArmorEquipEvent.ArmorSlot.HELMET); - syncEquipment(EntityEquipmentPacket.Slot.HELMET); - } - - @NotNull - @Override - public ItemStack getChestplate() { - return chestplate; - } - - @Override - public void setChestplate(@NotNull ItemStack itemStack) { - this.chestplate = getEquipmentItem(itemStack, ArmorEquipEvent.ArmorSlot.CHESTPLATE); - syncEquipment(EntityEquipmentPacket.Slot.CHESTPLATE); - } - - @NotNull - @Override - public ItemStack getLeggings() { - return leggings; - } - - @Override - public void setLeggings(@NotNull ItemStack itemStack) { - this.leggings = getEquipmentItem(itemStack, ArmorEquipEvent.ArmorSlot.LEGGINGS); - syncEquipment(EntityEquipmentPacket.Slot.LEGGINGS); - } - - @NotNull - @Override - public ItemStack getBoots() { - return boots; - } - - @Override - public void setBoots(@NotNull ItemStack itemStack) { - this.boots = getEquipmentItem(itemStack, ArmorEquipEvent.ArmorSlot.BOOTS); - syncEquipment(EntityEquipmentPacket.Slot.BOOTS); - } - @NotNull @Override public Navigator getNavigator() { @@ -331,9 +185,4 @@ public abstract class EntityCreature extends LivingEntity implements NavigableEn attack(target, false); } - private ItemStack getEquipmentItem(@NotNull ItemStack itemStack, @NotNull ArmorEquipEvent.ArmorSlot armorSlot) { - ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent(this, itemStack, armorSlot); - callEvent(ArmorEquipEvent.class, armorEquipEvent); - return armorEquipEvent.getArmorItem(); - } } diff --git a/src/main/java/net/minestom/server/entity/EntitySpawnType.java b/src/main/java/net/minestom/server/entity/EntitySpawnType.java new file mode 100644 index 000000000..9ebd261a5 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/EntitySpawnType.java @@ -0,0 +1,109 @@ +package net.minestom.server.entity; + +import net.minestom.server.entity.metadata.ObjectDataProvider; +import net.minestom.server.entity.metadata.other.ExperienceOrbMeta; +import net.minestom.server.entity.metadata.other.PaintingMeta; +import net.minestom.server.network.packet.server.ServerPacket; +import net.minestom.server.network.packet.server.play.*; +import net.minestom.server.utils.BlockPosition; +import net.minestom.server.utils.Vector; + +public enum EntitySpawnType { + BASE { + @Override + public ServerPacket getSpawnPacket(Entity entity) { + SpawnEntityPacket packet = new SpawnEntityPacket(); + packet.entityId = entity.getEntityId(); + packet.uuid = entity.getUuid(); + packet.type = entity.getEntityType().ordinal(); + packet.position = entity.getPosition(); + if (entity.getEntityMeta() instanceof ObjectDataProvider) { + ObjectDataProvider objectDataProvider = (ObjectDataProvider) entity.getEntityMeta(); + packet.data = objectDataProvider.getObjectData(); + if (objectDataProvider.requiresVelocityPacketAtSpawn()) { + Vector velocity = entity.getVelocityForPacket(); + packet.velocityX = (short) velocity.getX(); + packet.velocityY = (short) velocity.getY(); + packet.velocityZ = (short) velocity.getZ(); + } + } + return packet; + } + }, + LIVING { + @Override + public ServerPacket getSpawnPacket(Entity entity) { + SpawnLivingEntityPacket packet = new SpawnLivingEntityPacket(); + packet.entityId = entity.getEntityId(); + packet.entityUuid = entity.getUuid(); + packet.entityType = entity.getEntityType().ordinal(); + packet.position = entity.getPosition(); + packet.headPitch = entity.getPosition().getPitch(); + Vector velocity = entity.getVelocityForPacket(); + packet.velocityX = (short) velocity.getX(); + packet.velocityY = (short) velocity.getY(); + packet.velocityZ = (short) velocity.getZ(); + return packet; + } + }, + PLAYER { + @Override + public ServerPacket getSpawnPacket(Entity entity) { + SpawnPlayerPacket packet = new SpawnPlayerPacket(); + packet.entityId = entity.getEntityId(); + packet.playerUuid = entity.getUuid(); + packet.position = entity.getPosition(); + return packet; + } + }, + EXPERIENCE_ORB { + @Override + public ServerPacket getSpawnPacket(Entity entity) { + SpawnExperienceOrbPacket packet = new SpawnExperienceOrbPacket(); + packet.entityId = entity.getEntityId(); + packet.position = entity.getPosition(); + if (entity.getEntityMeta() instanceof ExperienceOrbMeta) { + ExperienceOrbMeta experienceOrbMeta = (ExperienceOrbMeta) entity.getEntityMeta(); + packet.expCount = (short) experienceOrbMeta.getCount(); + } + return packet; + } + }, + PAINTING { + @Override + public ServerPacket getSpawnPacket(Entity entity) { + SpawnPaintingPacket packet = new SpawnPaintingPacket(); + packet.entityId = entity.getEntityId(); + packet.entityUuid = entity.getUuid(); + if (entity.getEntityMeta() instanceof PaintingMeta) { + PaintingMeta paintingMeta = (PaintingMeta) entity.getEntityMeta(); + packet.motive = paintingMeta.getMotive().ordinal(); + packet.position = new BlockPosition( + Math.max(0, (paintingMeta.getMotive().getWidth() >> 1) - 1), + paintingMeta.getMotive().getHeight() >> 1, + 0 + ); + switch (paintingMeta.getDirection()) { + case SOUTH: + packet.direction = 0; + break; + case WEST: + packet.direction = 1; + break; + case NORTH: + packet.direction = 2; + break; + case EAST: + packet.direction = 3; + break; + } + } else { + packet.position = new BlockPosition(0, 0, 0); + } + return packet; + } + }; + + public abstract ServerPacket getSpawnPacket(Entity entity); + +} diff --git a/src/main/java/net/minestom/server/entity/ExperienceOrb.java b/src/main/java/net/minestom/server/entity/ExperienceOrb.java index 71b99dad7..379b647ac 100644 --- a/src/main/java/net/minestom/server/entity/ExperienceOrb.java +++ b/src/main/java/net/minestom/server/entity/ExperienceOrb.java @@ -1,8 +1,6 @@ package net.minestom.server.entity; import net.minestom.server.instance.Instance; -import net.minestom.server.network.packet.server.play.SpawnExperienceOrbPacket; -import net.minestom.server.network.player.PlayerConnection; import net.minestom.server.utils.Position; import net.minestom.server.utils.Vector; import org.jetbrains.annotations.NotNull; @@ -87,25 +85,6 @@ public class ExperienceOrb extends Entity { } - @Override - public boolean addViewer(@NotNull Player player) { - final boolean result = super.addViewer(player); // Add player to viewers list - if (!result) - return false; - - final PlayerConnection playerConnection = player.getPlayerConnection(); - - SpawnExperienceOrbPacket experienceOrbPacket = new SpawnExperienceOrbPacket(); - experienceOrbPacket.entityId = getEntityId(); - experienceOrbPacket.position = getPosition(); - experienceOrbPacket.expCount = experienceCount; - - playerConnection.sendPacket(experienceOrbPacket); - playerConnection.sendPacket(getVelocityPacket()); - - return true; - } - /** * Gets the experience count. * diff --git a/src/main/java/net/minestom/server/entity/LivingEntity.java b/src/main/java/net/minestom/server/entity/LivingEntity.java index 9f6d49e8c..b34d7fc46 100644 --- a/src/main/java/net/minestom/server/entity/LivingEntity.java +++ b/src/main/java/net/minestom/server/entity/LivingEntity.java @@ -5,18 +5,17 @@ import net.minestom.server.attribute.AttributeInstance; import net.minestom.server.attribute.Attributes; import net.minestom.server.collision.BoundingBox; import net.minestom.server.entity.damage.DamageType; +import net.minestom.server.entity.metadata.LivingEntityMeta; import net.minestom.server.event.entity.EntityDamageEvent; import net.minestom.server.event.entity.EntityDeathEvent; import net.minestom.server.event.entity.EntityFireEvent; +import net.minestom.server.event.item.ArmorEquipEvent; import net.minestom.server.event.item.PickupItemEvent; import net.minestom.server.instance.Chunk; import net.minestom.server.instance.block.Block; import net.minestom.server.inventory.EquipmentHandler; import net.minestom.server.item.ItemStack; -import net.minestom.server.network.packet.server.play.CollectItemPacket; -import net.minestom.server.network.packet.server.play.EntityAnimationPacket; -import net.minestom.server.network.packet.server.play.EntityPropertiesPacket; -import net.minestom.server.network.packet.server.play.SoundEffectPacket; +import net.minestom.server.network.packet.server.play.*; import net.minestom.server.scoreboard.Team; import net.minestom.server.sound.Sound; import net.minestom.server.sound.SoundCategory; @@ -27,6 +26,7 @@ import net.minestom.server.utils.block.BlockIterator; import net.minestom.server.utils.time.CooldownUtils; import net.minestom.server.utils.time.TimeUnit; import net.minestom.server.utils.time.UpdateOption; +import net.minestom.server.utils.validate.Check; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -34,7 +34,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; //TODO: Default attributes registration (and limitation ?) -public abstract class LivingEntity extends Entity implements EquipmentHandler { +public class LivingEntity extends Entity implements EquipmentHandler { // Item pickup protected boolean canPickupItem; @@ -70,30 +70,134 @@ public abstract class LivingEntity extends Entity implements EquipmentHandler { private Team team; - public LivingEntity(@NotNull EntityType entityType, @NotNull Position spawnPosition) { - super(entityType, spawnPosition); - setupAttributes(); - setGravity(0.02f, 0.08f, 3.92f); - } + private int arrowCount; + private float health = 1F; - /** - * Constructor which allows to specify an UUID. Only use if you know what you are doing! - */ - public LivingEntity(@NotNull EntityType entityType, @NotNull UUID uuid, @NotNull Position spawnPosition) { - super(entityType, uuid, spawnPosition); - setupAttributes(); - setGravity(0.02f, 0.08f, 3.92f); - } + // Equipments + private ItemStack mainHandItem; + private ItemStack offHandItem; - public LivingEntity(@NotNull EntityType entityType) { - this(entityType, new Position()); - } + private ItemStack helmet; + private ItemStack chestplate; + private ItemStack leggings; + private ItemStack boots; /** * Constructor which allows to specify an UUID. Only use if you know what you are doing! */ public LivingEntity(@NotNull EntityType entityType, @NotNull UUID uuid) { this(entityType, uuid, new Position()); + setupAttributes(); + setGravity(0.02f, 0.08f, 3.92f); + initEquipments(); + } + + public LivingEntity(@NotNull EntityType entityType) { + this(entityType, UUID.randomUUID()); + } + + /** + * Constructor which allows to specify an UUID. Only use if you know what you are doing! + */ + @Deprecated + public LivingEntity(@NotNull EntityType entityType, @NotNull UUID uuid, @NotNull Position spawnPosition) { + super(entityType, uuid, spawnPosition); + setupAttributes(); + setGravity(0.02f, 0.08f, 3.92f); + initEquipments(); + } + + @Deprecated + public LivingEntity(@NotNull EntityType entityType, @NotNull Position spawnPosition) { + this(entityType, UUID.randomUUID(), spawnPosition); + } + + private void initEquipments() { + this.mainHandItem = ItemStack.getAirItem(); + this.offHandItem = ItemStack.getAirItem(); + + this.helmet = ItemStack.getAirItem(); + this.chestplate = ItemStack.getAirItem(); + this.leggings = ItemStack.getAirItem(); + this.boots = ItemStack.getAirItem(); + } + + @NotNull + @Override + public ItemStack getItemInMainHand() { + return mainHandItem; + } + + @Override + public void setItemInMainHand(@NotNull ItemStack itemStack) { + this.mainHandItem = itemStack; + syncEquipment(EntityEquipmentPacket.Slot.MAIN_HAND); + } + + @NotNull + @Override + public ItemStack getItemInOffHand() { + return offHandItem; + } + + @Override + public void setItemInOffHand(@NotNull ItemStack itemStack) { + this.offHandItem = itemStack; + syncEquipment(EntityEquipmentPacket.Slot.OFF_HAND); + } + + @NotNull + @Override + public ItemStack getHelmet() { + return helmet; + } + + @Override + public void setHelmet(@NotNull ItemStack itemStack) { + this.helmet = getEquipmentItem(itemStack, ArmorEquipEvent.ArmorSlot.HELMET); + syncEquipment(EntityEquipmentPacket.Slot.HELMET); + } + + @NotNull + @Override + public ItemStack getChestplate() { + return chestplate; + } + + @Override + public void setChestplate(@NotNull ItemStack itemStack) { + this.chestplate = getEquipmentItem(itemStack, ArmorEquipEvent.ArmorSlot.CHESTPLATE); + syncEquipment(EntityEquipmentPacket.Slot.CHESTPLATE); + } + + @NotNull + @Override + public ItemStack getLeggings() { + return leggings; + } + + @Override + public void setLeggings(@NotNull ItemStack itemStack) { + this.leggings = getEquipmentItem(itemStack, ArmorEquipEvent.ArmorSlot.LEGGINGS); + syncEquipment(EntityEquipmentPacket.Slot.LEGGINGS); + } + + @NotNull + @Override + public ItemStack getBoots() { + return boots; + } + + @Override + public void setBoots(@NotNull ItemStack itemStack) { + this.boots = getEquipmentItem(itemStack, ArmorEquipEvent.ArmorSlot.BOOTS); + syncEquipment(EntityEquipmentPacket.Slot.BOOTS); + } + + private ItemStack getEquipmentItem(@NotNull ItemStack itemStack, @NotNull ArmorEquipEvent.ArmorSlot armorSlot) { + ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent(this, itemStack, armorSlot); + callEvent(ArmorEquipEvent.class, armorEquipEvent); + return armorEquipEvent.getArmorItem(); } @Override @@ -146,13 +250,18 @@ public abstract class LivingEntity extends Entity implements EquipmentHandler { } } + @Override + public void spawn() { + + } + /** * Gets the amount of arrows in the entity. * * @return the arrow count */ public int getArrowCount() { - return metadata.getIndex((byte) 11, 0); + return this.arrowCount; } /** @@ -161,7 +270,11 @@ public abstract class LivingEntity extends Entity implements EquipmentHandler { * @param arrowCount the arrow count */ public void setArrowCount(int arrowCount) { - this.metadata.setIndex((byte) 11, Metadata.VarInt(arrowCount)); + this.arrowCount = arrowCount; + LivingEntityMeta meta = getLivingEntityMeta(); + if (meta != null) { + meta.setArrowCount(arrowCount); + } } /** @@ -315,7 +428,7 @@ public abstract class LivingEntity extends Entity implements EquipmentHandler { * @return the entity health */ public float getHealth() { - return metadata.getIndex((byte) 8, 1f); + return this.health; } /** @@ -324,12 +437,14 @@ public abstract class LivingEntity extends Entity implements EquipmentHandler { * @param health the new entity health */ public void setHealth(float health) { - health = Math.min(health, getMaxHealth()); - if (health <= 0 && !isDead) { + this.health = Math.min(health, getMaxHealth()); + if (this.health <= 0 && !isDead) { kill(); } - - this.metadata.setIndex((byte) 8, Metadata.Float(health)); + LivingEntityMeta meta = getLivingEntityMeta(); + if (meta != null) { + meta.setHealth(this.health); + } } /** @@ -418,6 +533,15 @@ public abstract class LivingEntity extends Entity implements EquipmentHandler { this.canPickupItem = canPickupItem; } + @Override + public boolean addViewer0(@NotNull Player player) { + if (!super.addViewer0(player)) { + return false; + } + syncEquipments(player.getPlayerConnection()); + return true; + } + @Override public void setBoundingBox(double x, double y, double z) { super.setBoundingBox(x, y, z); @@ -447,15 +571,14 @@ public abstract class LivingEntity extends Entity implements EquipmentHandler { } public void refreshActiveHand(boolean isHandActive, boolean offHand, boolean riptideSpinAttack) { - byte handState = 0; - if (isHandActive) - handState |= 0x01; - if (offHand) - handState |= 0x02; - if (riptideSpinAttack) - handState |= 0x04; - - this.metadata.setIndex((byte) 7, Metadata.Byte(handState)); + LivingEntityMeta meta = getLivingEntityMeta(); + if (meta != null) { + meta.setNotifyAboutChanges(false); + meta.setHandActive(isHandActive); + meta.setActiveHand(offHand ? Player.Hand.OFF : Player.Hand.MAIN); + meta.setInRiptideSpinAttack(riptideSpinAttack); + meta.setNotifyAboutChanges(true); + } } /** @@ -630,4 +753,16 @@ public abstract class LivingEntity extends Entity implements EquipmentHandler { return null; } + /** + * Gets {@link net.minestom.server.entity.metadata.EntityMeta} of this entity casted to {@link LivingEntityMeta}. + * + * @return null if meta of this entity does not inherit {@link LivingEntityMeta}, casted value otherwise. + */ + public LivingEntityMeta getLivingEntityMeta() { + if (this.entityMeta instanceof LivingEntityMeta) { + return (LivingEntityMeta) this.entityMeta; + } + return null; + } + } diff --git a/src/main/java/net/minestom/server/entity/Metadata.java b/src/main/java/net/minestom/server/entity/Metadata.java index e6f97cec9..8d90adc3e 100644 --- a/src/main/java/net/minestom/server/entity/Metadata.java +++ b/src/main/java/net/minestom/server/entity/Metadata.java @@ -12,10 +12,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jglrxavpok.hephaistos.nbt.NBT; -import java.util.Collection; -import java.util.Collections; -import java.util.Map; -import java.util.UUID; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; @@ -153,14 +150,18 @@ public class Metadata { private final Entity entity; - private Map> metadataMap = new ConcurrentHashMap<>(); + private final Map> metadataMap = new ConcurrentHashMap<>(); + + private volatile boolean notifyAboutChanges = true; + private final Map> notNotifiedChanges = new HashMap<>(); public Metadata(@Nullable Entity entity) { this.entity = entity; } + @SuppressWarnings("unchecked") public T getIndex(byte index, @Nullable T defaultValue) { - Entry value = metadataMap.get(index); + Entry value = this.metadataMap.get(index); return value != null ? (T) value.getMetaValue().value : defaultValue; } @@ -169,15 +170,49 @@ public class Metadata { this.metadataMap.put(index, entry); // Send metadata packet to update viewers and self - if (entity != null && entity.isActive()) { + if (this.entity != null && this.entity.isActive()) { + if (!this.notifyAboutChanges) { + synchronized (this.notNotifiedChanges) { + this.notNotifiedChanges.put(index, entry); + } + return; + } EntityMetaDataPacket metaDataPacket = new EntityMetaDataPacket(); - metaDataPacket.entityId = entity.getEntityId(); + metaDataPacket.entityId = this.entity.getEntityId(); metaDataPacket.entries = Collections.singleton(entry); this.entity.sendPacketToViewersAndSelf(metaDataPacket); } } + public void setNotifyAboutChanges(boolean notifyAboutChanges) { + if (this.notifyAboutChanges == notifyAboutChanges) { + return; + } + + Collection> entries = null; + synchronized (this.notNotifiedChanges) { + this.notifyAboutChanges = notifyAboutChanges; + if (notifyAboutChanges) { + entries = this.notNotifiedChanges.values(); + if (entries.isEmpty()) { + return; + } + this.notNotifiedChanges.clear(); + } + } + + if (entries == null || this.entity == null || !this.entity.isActive()) { + return; + } + + EntityMetaDataPacket metaDataPacket = new EntityMetaDataPacket(); + metaDataPacket.entityId = this.entity.getEntityId(); + metaDataPacket.entries = entries; + + this.entity.sendPacketToViewersAndSelf(metaDataPacket); + } + @NotNull public Collection> getEntries() { return metadataMap.values(); diff --git a/src/main/java/net/minestom/server/entity/ObjectEntity.java b/src/main/java/net/minestom/server/entity/ObjectEntity.java index 11083c20c..50b46dd29 100644 --- a/src/main/java/net/minestom/server/entity/ObjectEntity.java +++ b/src/main/java/net/minestom/server/entity/ObjectEntity.java @@ -1,10 +1,13 @@ package net.minestom.server.entity; -import net.minestom.server.network.packet.server.play.SpawnEntityPacket; -import net.minestom.server.network.player.PlayerConnection; import net.minestom.server.utils.Position; import org.jetbrains.annotations.NotNull; +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.EntityMeta} that inherits + * {@link net.minestom.server.entity.metadata.ObjectDataProvider} instead. + */ +@Deprecated public abstract class ObjectEntity extends Entity { public ObjectEntity(@NotNull EntityType entityType, @NotNull Position spawnPosition) { @@ -30,29 +33,4 @@ public abstract class ObjectEntity extends Entity { } - @Override - public boolean addViewer(@NotNull Player player) { - final boolean result = super.addViewer(player); - if (!result) - return false; - - final PlayerConnection playerConnection = player.getPlayerConnection(); - - SpawnEntityPacket spawnEntityPacket = new SpawnEntityPacket(); - spawnEntityPacket.entityId = getEntityId(); - spawnEntityPacket.uuid = getUuid(); - spawnEntityPacket.type = getEntityType().getId(); - spawnEntityPacket.position = getPosition(); - spawnEntityPacket.data = getObjectData(); - playerConnection.sendPacket(spawnEntityPacket); - playerConnection.sendPacket(getVelocityPacket()); - playerConnection.sendPacket(getMetadataPacket()); - - if (hasPassenger()) { - playerConnection.sendPacket(getPassengersPacket()); - } - - return true; - } - } diff --git a/src/main/java/net/minestom/server/entity/Player.java b/src/main/java/net/minestom/server/entity/Player.java index 7dd3f7949..f63c2b837 100644 --- a/src/main/java/net/minestom/server/entity/Player.java +++ b/src/main/java/net/minestom/server/entity/Player.java @@ -626,13 +626,10 @@ public class Player extends LivingEntity implements CommandSender { } @Override - public boolean addViewer(@NotNull Player player) { - if (player == this) - return false; - - final boolean result = super.addViewer(player); - if (!result) + public boolean addViewer0(@NotNull Player player) { + if (player == this || !super.addViewer0(player)) { return false; + } PlayerConnection viewerConnection = player.getPlayerConnection(); showPlayer(viewerConnection); @@ -640,18 +637,19 @@ public class Player extends LivingEntity implements CommandSender { } @Override - public boolean removeViewer(@NotNull Player player) { - if (player == this) + public boolean removeViewer0(@NotNull Player player) { + if (player == this || !super.removeViewer0(player)) { return false; + } - boolean result = super.removeViewer(player); PlayerConnection viewerConnection = player.getPlayerConnection(); viewerConnection.sendPacket(getRemovePlayerToList()); // Team - if (this.getTeam() != null && this.getTeam().getMembers().size() == 1) // If team only contains "this" player + if (this.getTeam() != null && this.getTeam().getMembers().size() == 1) {// If team only contains "this" player viewerConnection.sendPacket(this.getTeam().createTeamDestructionPacket()); - return result; + } + return true; } /** @@ -663,6 +661,7 @@ public class Player extends LivingEntity implements CommandSender { * @param instance the new player instance * @param spawnPosition the new position of the player */ + @Override public void setInstance(@NotNull Instance instance, @NotNull Position spawnPosition) { Check.argCondition(this.instance == instance, "Instance should be different than the current one"); @@ -1435,11 +1434,7 @@ public class Player extends LivingEntity implements CommandSender { protected void refreshAfterTeleport() { getInventory().update(); - SpawnPlayerPacket spawnPlayerPacket = new SpawnPlayerPacket(); - spawnPlayerPacket.entityId = getEntityId(); - spawnPlayerPacket.playerUuid = getUuid(); - spawnPlayerPacket.position = getPosition(); - sendPacketToViewers(spawnPlayerPacket); + sendPacketsToViewers(getEntityType().getSpawnType().getSpawnPacket(this)); // Update for viewers sendPacketToViewersAndSelf(getVelocityPacket()); @@ -2418,14 +2413,9 @@ public class Player extends LivingEntity implements CommandSender { * @param connection the connection to show the player to */ protected void showPlayer(@NotNull PlayerConnection connection) { - SpawnPlayerPacket spawnPlayerPacket = new SpawnPlayerPacket(); - spawnPlayerPacket.entityId = getEntityId(); - spawnPlayerPacket.playerUuid = getUuid(); - spawnPlayerPacket.position = getPosition(); - connection.sendPacket(getAddPlayerToList()); - connection.sendPacket(spawnPlayerPacket); + connection.sendPacket(getEntityType().getSpawnType().getSpawnPacket(this)); connection.sendPacket(getVelocityPacket()); connection.sendPacket(getMetadataPacket()); diff --git a/src/main/java/net/minestom/server/entity/metadata/AgeableMobMeta.java b/src/main/java/net/minestom/server/entity/metadata/AgeableMobMeta.java new file mode 100644 index 000000000..6a51c1c61 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/AgeableMobMeta.java @@ -0,0 +1,31 @@ +package net.minestom.server.entity.metadata; + +import net.minestom.server.collision.BoundingBox; +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class AgeableMobMeta extends PathfinderMobMeta { + + protected AgeableMobMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isBaby() { + return super.metadata.getIndex((byte) 15, false); + } + + public void setBaby(boolean value) { + if (isBaby() == value) { + return; + } + BoundingBox bb = this.entity.getBoundingBox(); + if (value) { + setBoundingBox(bb.getWidth() / 2, bb.getHeight() / 2); + } else { + setBoundingBox(bb.getWidth() * 2, bb.getHeight() * 2); + } + super.metadata.setIndex((byte) 15, Metadata.Boolean(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/EntityMeta.java b/src/main/java/net/minestom/server/entity/metadata/EntityMeta.java new file mode 100644 index 000000000..9d535e594 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/EntityMeta.java @@ -0,0 +1,183 @@ +package net.minestom.server.entity.metadata; + +import net.minestom.server.chat.JsonMessage; +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class EntityMeta { + + private final static byte MASK_INDEX = 0; + + private final static byte ON_FIRE_BIT = 0x01; + private final static byte CROUNCHING_BIT = 0x02; + private final static byte SPRINTING_BIT = 0x08; + private final static byte SWIMMING_BIT = 0x10; + private final static byte INVISIBLE_BIT = 0x20; + private final static byte HAS_GLOWING_EFFECT_BIT = 0x40; + private final static byte FLYING_WITH_ELYTRA_BIT = (byte) 0x80; + + protected final Entity entity; + protected final Metadata metadata; + + protected EntityMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + this.entity = entity; + this.metadata = metadata; + } + + /** + * Sets whether any changes to this meta must result in a metadata packet being sent to entity viewers. + * By default it's set to true. + *

+ * It's usable if you want to change multiple values of this meta at the same time and want just a + * single packet being sent: if so, disable notification before your first change and enable it + * right after the last one: once notification is set to false, we collect all the updates + * that are being performed, and when it's returned to true we send them all together. + * An example usage could be found at + * {@link net.minestom.server.entity.LivingEntity#refreshActiveHand(boolean, boolean, boolean)}. + * + * @param notifyAboutChanges if to notify entity viewers about this meta changes. + */ + public void setNotifyAboutChanges(boolean notifyAboutChanges) { + this.metadata.setNotifyAboutChanges(notifyAboutChanges); + } + + public boolean isOnFire() { + return getMaskBit(MASK_INDEX, ON_FIRE_BIT); + } + + public void setOnFire(boolean value) { + setMaskBit(MASK_INDEX, ON_FIRE_BIT, value); + } + + public boolean isSneaking() { + return getMaskBit(MASK_INDEX, CROUNCHING_BIT); + } + + public void setSneaking(boolean value) { + setMaskBit(MASK_INDEX, CROUNCHING_BIT, value); + } + + public boolean isSprinting() { + return getMaskBit(MASK_INDEX, SPRINTING_BIT); + } + + public void setSprinting(boolean value) { + setMaskBit(MASK_INDEX, SPRINTING_BIT, value); + } + + public boolean isSwimming() { + return getMaskBit(MASK_INDEX, SWIMMING_BIT); + } + + public void setSwimming(boolean value) { + setMaskBit(MASK_INDEX, SWIMMING_BIT, value); + } + + public boolean isInvisible() { + return getMaskBit(MASK_INDEX, INVISIBLE_BIT); + } + + public void setInvisible(boolean value) { + setMaskBit(MASK_INDEX, INVISIBLE_BIT, value); + } + + public boolean isHasGlowingEffect() { + return getMaskBit(MASK_INDEX, HAS_GLOWING_EFFECT_BIT); + } + + public void setHasGlowingEffect(boolean value) { + setMaskBit(MASK_INDEX, HAS_GLOWING_EFFECT_BIT, value); + } + + public boolean isFlyingWithElytra() { + return getMaskBit(MASK_INDEX, FLYING_WITH_ELYTRA_BIT); + } + + public void setFlyingWithElytra(boolean value) { + setMaskBit(MASK_INDEX, FLYING_WITH_ELYTRA_BIT, value); + } + + public int getAirTicks() { + return this.metadata.getIndex((byte) 1, 300); + } + + public void setAirTicks(int value) { + this.metadata.setIndex((byte) 1, Metadata.VarInt(value)); + } + + public JsonMessage getCustomName() { + return this.metadata.getIndex((byte) 2, null); + } + + public void setCustomName(JsonMessage value) { + this.metadata.setIndex((byte) 2, Metadata.OptChat(value)); + } + + public boolean isCustomNameVisible() { + return this.metadata.getIndex((byte) 3, false); + } + + public void setCustomNameVisible(boolean value) { + this.metadata.setIndex((byte) 3, Metadata.Boolean(value)); + } + + public boolean isSilent() { + return this.metadata.getIndex((byte) 4, false); + } + + public void setSilent(boolean value) { + this.metadata.setIndex((byte) 4, Metadata.Boolean(value)); + } + + public boolean isHasNoGravity() { + return this.metadata.getIndex((byte) 5, false); + } + + public void setHasNoGravity(boolean value) { + this.metadata.setIndex((byte) 5, Metadata.Boolean(value)); + } + + public Entity.Pose getPose() { + return this.metadata.getIndex((byte) 6, Entity.Pose.STANDING); + } + + public void setPose(Entity.Pose value) { + this.metadata.setIndex((byte) 6, Metadata.Pose(value)); + } + + protected byte getMask(byte index) { + return this.metadata.getIndex(index, (byte) 0); + } + + protected void setMask(byte index, byte mask) { + this.metadata.setIndex(index, Metadata.Byte(mask)); + } + + protected boolean getMaskBit(byte index, byte bit) { + return (getMask(index) & bit) == bit; + } + + protected void setMaskBit(byte index, byte bit, boolean value) { + byte mask = getMask(index); + boolean currentValue = (mask & bit) == bit; + if (currentValue == value) { + return; + } + if (value) { + mask |= bit; + } else { + mask &= ~bit; + } + setMask(index, mask); + } + + protected void setBoundingBox(double x, double y, double z) { + this.entity.setBoundingBox(x, y, z); + } + + protected void setBoundingBox(double width, double height) { + setBoundingBox(width, height, width); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/LivingEntityMeta.java b/src/main/java/net/minestom/server/entity/metadata/LivingEntityMeta.java new file mode 100644 index 000000000..8ecc46876 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/LivingEntityMeta.java @@ -0,0 +1,96 @@ +package net.minestom.server.entity.metadata; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.Player; +import net.minestom.server.utils.BlockPosition; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class LivingEntityMeta extends EntityMeta { + + private final static byte MASK_INDEX = 7; + + private final static byte IS_HAND_ACTIVE_BIT = 0x01; + private final static byte ACTIVE_HAND_BIT = 0x02; + private final static byte IS_IN_SPIN_ATTACK_BIT = 0x04; + + protected LivingEntityMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isHandActive() { + return getMaskBit(MASK_INDEX, IS_HAND_ACTIVE_BIT); + } + + public void setHandActive(boolean value) { + setMaskBit(MASK_INDEX, IS_HAND_ACTIVE_BIT, value); + } + + @NotNull + public Player.Hand getActiveHand() { + return getMaskBit(MASK_INDEX, ACTIVE_HAND_BIT) ? Player.Hand.OFF : Player.Hand.MAIN; + } + + public void setActiveHand(@NotNull Player.Hand hand) { + setMaskBit(MASK_INDEX, ACTIVE_HAND_BIT, hand == Player.Hand.OFF); + } + + public boolean isInRiptideSpinAttack() { + return getMaskBit(MASK_INDEX, IS_IN_SPIN_ATTACK_BIT); + } + + public void setInRiptideSpinAttack(boolean value) { + setMaskBit(MASK_INDEX, IS_IN_SPIN_ATTACK_BIT, value); + } + + public float getHealth() { + return super.metadata.getIndex((byte) 8, 1F); + } + + public void setHealth(float value) { + super.metadata.setIndex((byte) 8, Metadata.Float(value)); + } + + public int getPotionEffectColor() { + return super.metadata.getIndex((byte) 9, 0); + } + + public void setPotionEffectColor(int value) { + super.metadata.setIndex((byte) 9, Metadata.VarInt(value)); + } + + public boolean isPotionEffectAmbient() { + return super.metadata.getIndex((byte) 10, false); + } + + public void setPotionEffectAmbient(boolean value) { + super.metadata.setIndex((byte) 10, Metadata.Boolean(value)); + } + + public int getArrowCount() { + return super.metadata.getIndex((byte) 11, 0); + } + + public void setArrowCount(int value) { + super.metadata.getIndex((byte) 11, Metadata.VarInt(value)); + } + + public int getHealthAddedByAbsorption() { + return super.metadata.getIndex((byte) 12, 0); + } + + public void setHealthAddedByAbsorption(int value) { + super.metadata.getIndex((byte) 12, Metadata.VarInt(value)); + } + + @Nullable + public BlockPosition getBedInWhichSleepingPosition() { + return super.metadata.getIndex((byte) 13, null); + } + + public void setBedInWhichSleepingPosition(@Nullable BlockPosition value) { + super.metadata.setIndex((byte) 13, Metadata.OptPosition(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/MobMeta.java b/src/main/java/net/minestom/server/entity/metadata/MobMeta.java new file mode 100644 index 000000000..c340fa9e0 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/MobMeta.java @@ -0,0 +1,43 @@ +package net.minestom.server.entity.metadata; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class MobMeta extends LivingEntityMeta { + + private final static byte MASK_INDEX = 14; + + private final static byte NO_AI_BIT = 0x01; + private final static byte IS_LEFT_HANDED_BIT = 0x02; + private final static byte IS_AGGRESSIVE_BIT = 0x04; + + protected MobMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isNoAi() { + return getMaskBit(MASK_INDEX, NO_AI_BIT); + } + + public void setNoAi(boolean value) { + setMaskBit(MASK_INDEX, NO_AI_BIT, value); + } + + public boolean isLeftHanded() { + return getMaskBit(MASK_INDEX, IS_LEFT_HANDED_BIT); + } + + public void setLeftHanded(boolean value) { + setMaskBit(MASK_INDEX, IS_LEFT_HANDED_BIT, value); + } + + public boolean isAggressive() { + return getMaskBit(MASK_INDEX, IS_AGGRESSIVE_BIT); + } + + public void setAggressive(boolean value) { + setMaskBit(MASK_INDEX, IS_AGGRESSIVE_BIT, value); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/ObjectDataProvider.java b/src/main/java/net/minestom/server/entity/metadata/ObjectDataProvider.java new file mode 100644 index 000000000..326479c00 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/ObjectDataProvider.java @@ -0,0 +1,10 @@ +package net.minestom.server.entity.metadata; + +// https://wiki.vg/Object_Data +public interface ObjectDataProvider { + + int getObjectData(); + + boolean requiresVelocityPacketAtSpawn(); + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/PathfinderMobMeta.java b/src/main/java/net/minestom/server/entity/metadata/PathfinderMobMeta.java new file mode 100644 index 000000000..9a4920d16 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/PathfinderMobMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class PathfinderMobMeta extends MobMeta { + + protected PathfinderMobMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/PlayerMeta.java b/src/main/java/net/minestom/server/entity/metadata/PlayerMeta.java new file mode 100644 index 000000000..1a17c0986 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/PlayerMeta.java @@ -0,0 +1,123 @@ +package net.minestom.server.entity.metadata; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jglrxavpok.hephaistos.nbt.NBT; + +public class PlayerMeta extends LivingEntityMeta { + + private final static byte MASK_INDEX = 16; + + private final static byte CAPE_BIT = 0x01; + private final static byte JACKET_BIT = 0x02; + private final static byte LEFT_SLEEVE_BIT = 0x04; + private final static byte RIGHT_SLEEVE_BIT = 0x08; + private final static byte LEFT_LEG_BIT = 0x10; + private final static byte RIGHT_LEG_BIT = 0x20; + private final static byte HAT_BIT = 0x40; + + public PlayerMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public float getAdditionalHearts() { + return super.metadata.getIndex((byte) 14, 0F); + } + + public void setAdditionalHearts(float value) { + super.metadata.setIndex((byte) 14, Metadata.Float(value)); + } + + public int getScore() { + return super.metadata.getIndex((byte) 15, 0); + } + + public void setScore(int value) { + super.metadata.setIndex((byte) 15, Metadata.VarInt(value)); + } + + public boolean isCapeEnabled() { + return getMaskBit(MASK_INDEX, CAPE_BIT); + } + + public void setCapeEnabled(boolean value) { + setMaskBit(MASK_INDEX, CAPE_BIT, value); + } + + public boolean isJacketEnabled() { + return getMaskBit(MASK_INDEX, JACKET_BIT); + } + + public void setJacketEnabled(boolean value) { + setMaskBit(MASK_INDEX, JACKET_BIT, value); + } + + public boolean isLeftSleeveEnabled() { + return getMaskBit(MASK_INDEX, LEFT_SLEEVE_BIT); + } + + public void setLeftSleeveEnabled(boolean value) { + setMaskBit(MASK_INDEX, LEFT_SLEEVE_BIT, value); + } + + public boolean isRightSleeveEnabled() { + return getMaskBit(MASK_INDEX, RIGHT_SLEEVE_BIT); + } + + public void setRightSleeveEnabled(boolean value) { + setMaskBit(MASK_INDEX, RIGHT_SLEEVE_BIT, value); + } + + public boolean isLeftLegEnabled() { + return getMaskBit(MASK_INDEX, LEFT_LEG_BIT); + } + + public void setLeftLegEnabled(boolean value) { + setMaskBit(MASK_INDEX, LEFT_LEG_BIT, value); + } + + public boolean isRightLegEnabled() { + return getMaskBit(MASK_INDEX, RIGHT_LEG_BIT); + } + + public void setRightLegEnabled(boolean value) { + setMaskBit(MASK_INDEX, RIGHT_LEG_BIT, value); + } + + public boolean isHatEnabled() { + return getMaskBit(MASK_INDEX, HAT_BIT); + } + + public void setHatEnabled(boolean value) { + setMaskBit(MASK_INDEX, HAT_BIT, value); + } + + public boolean isRightMainHand() { + return super.metadata.getIndex((byte) 17, (byte) 1) == (byte) 1; + } + + public void setRightMainHand(boolean value) { + super.metadata.setIndex((byte) 17, Metadata.Byte(value ? (byte) 1 : (byte) 0)); + } + + @Nullable + public NBT getLeftShoulderEntityData() { + return super.metadata.getIndex((byte) 18, null); + } + + public void setLeftShoulderEntityData(@Nullable NBT value) { + super.metadata.setIndex((byte) 18, Metadata.NBT(value)); + } + + @Nullable + public NBT getRightShoulderEntityData() { + return super.metadata.getIndex((byte) 19, null); + } + + public void setRightShoulderEntityData(@Nullable NBT value) { + super.metadata.setIndex((byte) 19, Metadata.NBT(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/ambient/AmbientCreatureMeta.java b/src/main/java/net/minestom/server/entity/metadata/ambient/AmbientCreatureMeta.java new file mode 100644 index 000000000..ab1a24279 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/ambient/AmbientCreatureMeta.java @@ -0,0 +1,14 @@ +package net.minestom.server.entity.metadata.ambient; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.MobMeta; +import org.jetbrains.annotations.NotNull; + +public class AmbientCreatureMeta extends MobMeta { + + protected AmbientCreatureMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/ambient/BatMeta.java b/src/main/java/net/minestom/server/entity/metadata/ambient/BatMeta.java new file mode 100644 index 000000000..ce048f2ef --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/ambient/BatMeta.java @@ -0,0 +1,25 @@ +package net.minestom.server.entity.metadata.ambient; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class BatMeta extends AmbientCreatureMeta { + + private final static byte MASK_INDEX = 15; + + private final static byte IS_HANGING_BIT = 0x01; + + public BatMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isHanging() { + return getMaskBit(MASK_INDEX, IS_HANGING_BIT); + } + + public void setHanging(boolean value) { + setMaskBit(MASK_INDEX, IS_HANGING_BIT, value); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/AbstractHorseMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/AbstractHorseMeta.java new file mode 100644 index 000000000..1455f0f84 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/animal/AbstractHorseMeta.java @@ -0,0 +1,80 @@ +package net.minestom.server.entity.metadata.animal; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +import java.util.UUID; + +public class AbstractHorseMeta extends AnimalMeta { + + private final static byte MASK_INDEX = 16; + + private final static byte TAMED_BIT = 0x02; + private final static byte SADDLED_BIT = 0x04; + private final static byte HAS_BRED_BIT = 0x08; + private final static byte EATING_BIT = 0x10; + private final static byte REARING_BIT = 0x20; + private final static byte MOUTH_OPEN_BIT = 0x40; + + protected AbstractHorseMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isTamed() { + return getMaskBit(MASK_INDEX, TAMED_BIT); + } + + public void setTamed(boolean value) { + setMaskBit(MASK_INDEX, TAMED_BIT, value); + } + + public boolean isSaddled() { + return getMaskBit(MASK_INDEX, SADDLED_BIT); + } + + public void setSaddled(boolean value) { + setMaskBit(MASK_INDEX, SADDLED_BIT, value); + } + + public boolean isHasBred() { + return getMaskBit(MASK_INDEX, HAS_BRED_BIT); + } + + public void setHasBred(boolean value) { + setMaskBit(MASK_INDEX, HAS_BRED_BIT, value); + } + + public boolean isEating() { + return getMaskBit(MASK_INDEX, EATING_BIT); + } + + public void setEating(boolean value) { + setMaskBit(MASK_INDEX, EATING_BIT, value); + } + + public boolean isRearing() { + return getMaskBit(MASK_INDEX, REARING_BIT); + } + + public void setRearing(boolean value) { + setMaskBit(MASK_INDEX, REARING_BIT, value); + } + + public boolean isMouthOpen() { + return getMaskBit(MASK_INDEX, MOUTH_OPEN_BIT); + } + + public void setMouthOpen(boolean value) { + setMaskBit(MASK_INDEX, MOUTH_OPEN_BIT, value); + } + + public UUID getOwner() { + return super.metadata.getIndex((byte) 17, null); + } + + public void setOwner(UUID value) { + super.metadata.setIndex((byte) 17, Metadata.OptUUID(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/AnimalMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/AnimalMeta.java new file mode 100644 index 000000000..e34ef8604 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/animal/AnimalMeta.java @@ -0,0 +1,14 @@ +package net.minestom.server.entity.metadata.animal; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.AgeableMobMeta; +import org.jetbrains.annotations.NotNull; + +public class AnimalMeta extends AgeableMobMeta { + + protected AnimalMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/BeeMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/BeeMeta.java new file mode 100644 index 000000000..2267bb03a --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/animal/BeeMeta.java @@ -0,0 +1,51 @@ +package net.minestom.server.entity.metadata.animal; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class BeeMeta extends AnimalMeta { + + private final static byte MASK_INDEX = 16; + + private final static byte ANGRY_BIT = 0x02; + private final static byte HAS_STUNG_BIT = 0x04; + private final static byte HAS_NECTAR_BIT = 0x08; + + public BeeMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isAngry() { + return getMaskBit(MASK_INDEX, ANGRY_BIT); + } + + public void setAngry(boolean value) { + setMaskBit(MASK_INDEX, ANGRY_BIT, value); + } + + public boolean isHasStung() { + return getMaskBit(MASK_INDEX, HAS_STUNG_BIT); + } + + public void setHasStung(boolean value) { + setMaskBit(MASK_INDEX, HAS_STUNG_BIT, value); + } + + public boolean isHasNectar() { + return getMaskBit(MASK_INDEX, HAS_NECTAR_BIT); + } + + public void setHasNectar(boolean value) { + setMaskBit(MASK_INDEX, HAS_NECTAR_BIT, value); + } + + public int getAngerTicks() { + return super.metadata.getIndex((byte) 17, 0); + } + + public void setAngerTicks(int value) { + super.metadata.setIndex((byte) 17, Metadata.VarInt(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/ChestedHorseMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/ChestedHorseMeta.java new file mode 100644 index 000000000..9793257ad --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/animal/ChestedHorseMeta.java @@ -0,0 +1,21 @@ +package net.minestom.server.entity.metadata.animal; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class ChestedHorseMeta extends AbstractHorseMeta { + + protected ChestedHorseMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isHasChest() { + return super.metadata.getIndex((byte) 18, false); + } + + public void setHasChest(boolean value) { + super.metadata.setIndex((byte) 18, Metadata.Boolean(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/ChickenMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/ChickenMeta.java new file mode 100644 index 000000000..422324d24 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/animal/ChickenMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.animal; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class ChickenMeta extends AnimalMeta { + + public ChickenMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/CowMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/CowMeta.java new file mode 100644 index 000000000..6c86455bc --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/animal/CowMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.animal; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class CowMeta extends AnimalMeta { + + public CowMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/DonkeyMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/DonkeyMeta.java new file mode 100644 index 000000000..62dba04b6 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/animal/DonkeyMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.animal; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class DonkeyMeta extends ChestedHorseMeta { + + public DonkeyMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/FoxMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/FoxMeta.java new file mode 100644 index 000000000..cc45e76e4 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/animal/FoxMeta.java @@ -0,0 +1,116 @@ +package net.minestom.server.entity.metadata.animal; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; +import java.util.UUID; + +public class FoxMeta extends AnimalMeta { + + private final static byte MASK_INDEX = 17; + + private final static byte SITTING_BIT = 0x01; + private final static byte CROUCHING_BIT = 0x04; + private final static byte INTERESTED_BIT = 0x08; + private final static byte POUNCING_BIT = 0x10; + private final static byte SLEEPING_BIT = 0x20; + private final static byte FACEPLANTED_BIT = 0x40; + private final static byte DEFENDING_BIT = (byte) 0x80; + + public FoxMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + @NotNull + public Type getType() { + return Type.VALUES[super.metadata.getIndex((byte) 16, 0)]; + } + + public void setType(@NotNull Type type) { + super.metadata.setIndex((byte) 16, Metadata.VarInt(type.ordinal())); + } + + public boolean isSitting() { + return getMaskBit(MASK_INDEX, SITTING_BIT); + } + + public void setSitting(boolean value) { + setMaskBit(MASK_INDEX, SITTING_BIT, value); + } + + public boolean isFoxSneaking() { + return getMaskBit(MASK_INDEX, CROUCHING_BIT); + } + + public void setFoxSneaking(boolean value) { + setMaskBit(MASK_INDEX, CROUCHING_BIT, value); + } + + public boolean isInterested() { + return getMaskBit(MASK_INDEX, INTERESTED_BIT); + } + + public void setInterested(boolean value) { + setMaskBit(MASK_INDEX, INTERESTED_BIT, value); + } + + public boolean isPouncing() { + return getMaskBit(MASK_INDEX, POUNCING_BIT); + } + + public void setPouncing(boolean value) { + setMaskBit(MASK_INDEX, POUNCING_BIT, value); + } + + public boolean isSleeping() { + return getMaskBit(MASK_INDEX, SLEEPING_BIT); + } + + public void setSleeping(boolean value) { + setMaskBit(MASK_INDEX, SLEEPING_BIT, value); + } + + public boolean isFaceplanted() { + return getMaskBit(MASK_INDEX, FACEPLANTED_BIT); + } + + public void setFaceplanted(boolean value) { + setMaskBit(MASK_INDEX, FACEPLANTED_BIT, value); + } + + public boolean isDefending() { + return getMaskBit(MASK_INDEX, DEFENDING_BIT); + } + + public void setDefending(boolean value) { + setMaskBit(MASK_INDEX, DEFENDING_BIT, value); + } + + @Nullable + public UUID getFirstUUID() { + return super.metadata.getIndex((byte) 18, null); + } + + public void setFirstUUID(@Nullable UUID value) { + super.metadata.setIndex((byte) 18, Metadata.OptUUID(value)); + } + + @Nullable + public UUID getSecondUUID() { + return super.metadata.getIndex((byte) 19, null); + } + + public void setSecondUUID(@Nullable UUID value) { + super.metadata.setIndex((byte) 19, Metadata.OptUUID(value)); + } + + public enum Type { + RED, + SNOW; + + private final static Type[] VALUES = values(); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/HoglinMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/HoglinMeta.java new file mode 100644 index 000000000..c3a31e156 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/animal/HoglinMeta.java @@ -0,0 +1,21 @@ +package net.minestom.server.entity.metadata.animal; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class HoglinMeta extends AnimalMeta { + + public HoglinMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isImmuneToZombification() { + return super.metadata.getIndex((byte) 16, false); + } + + public void setImmuneToZombification(boolean value) { + super.metadata.setIndex((byte) 16, Metadata.Boolean(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/HorseMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/HorseMeta.java new file mode 100644 index 000000000..4c12c69a9 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/animal/HorseMeta.java @@ -0,0 +1,84 @@ +package net.minestom.server.entity.metadata.animal; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class HorseMeta extends AbstractHorseMeta { + + public HorseMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public Variant getVariant() { + return getVariantFromID(super.metadata.getIndex((byte) 18, 0)); + } + + public void setVariant(Variant variant) { + super.metadata.setIndex((byte) 18, Metadata.VarInt(getVariantID(variant.marking, variant.color))); + } + + public static int getVariantID(@NotNull Marking marking, @NotNull Color color) { + return (marking.ordinal() << 8) + color.ordinal(); + } + + public static Variant getVariantFromID(int variantID) { + return new Variant( + Marking.VALUES[variantID >> 8], + Color.VALUES[variantID & 0xFF] + ); + } + + public static class Variant { + + private Marking marking; + private Color color; + + public Variant(@NotNull Marking marking, @NotNull Color color) { + this.marking = marking; + this.color = color; + } + + @NotNull + public Marking getMarking() { + return this.marking; + } + + public void setMarking(@NotNull Marking marking) { + this.marking = marking; + } + + @NotNull + public Color getColor() { + return this.color; + } + + public void setColor(@NotNull Color color) { + this.color = color; + } + + } + + public enum Marking { + NONE, + WHITE, + WHITE_FIELD, + WHITE_DOTS, + BLACK_DOTS; + + private final static Marking[] VALUES = values(); + } + + public enum Color { + WHITE, + CREAMY, + CHESTNUT, + BROWN, + BLACK, + GRAY, + DARK_BROWN; + + private final static Color[] VALUES = values(); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/LlamaMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/LlamaMeta.java new file mode 100644 index 000000000..b62701d87 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/animal/LlamaMeta.java @@ -0,0 +1,46 @@ +package net.minestom.server.entity.metadata.animal; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class LlamaMeta extends ChestedHorseMeta { + + public LlamaMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public int getStrength() { + return super.metadata.getIndex((byte) 19, 0); + } + + public void setStrength(int value) { + super.metadata.setIndex((byte) 19, Metadata.VarInt(value)); + } + + public int getCarpetColor() { + return super.metadata.getIndex((byte) 20, -1); + } + + public void setCarpetColor(int value) { + super.metadata.setIndex((byte) 20, Metadata.VarInt(value)); + } + + public Variant getVariant() { + return Variant.VALUES[super.metadata.getIndex((byte) 21, 0)]; + } + + public void setVariant(Variant value) { + super.metadata.setIndex((byte) 21, Metadata.VarInt(value.ordinal())); + } + + public enum Variant { + CREAMY, + WHITE, + BROWN, + GRAY; + + private final static Variant[] VALUES = values(); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/MooshroomMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/MooshroomMeta.java new file mode 100644 index 000000000..ee580ed2a --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/animal/MooshroomMeta.java @@ -0,0 +1,29 @@ +package net.minestom.server.entity.metadata.animal; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +import java.util.Locale; + +public class MooshroomMeta extends CowMeta { + + public MooshroomMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + @NotNull + public Variant getVariant() { + return Variant.valueOf(super.metadata.getIndex((byte) 16, "red").toUpperCase(Locale.ROOT)); + } + + public void setVariant(@NotNull Variant value) { + super.metadata.setIndex((byte) 16, Metadata.String(value.name().toLowerCase(Locale.ROOT))); + } + + public enum Variant { + RED, + BROWN; + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/MuleMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/MuleMeta.java new file mode 100644 index 000000000..661ff00c2 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/animal/MuleMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.animal; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class MuleMeta extends ChestedHorseMeta { + + public MuleMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/OcelotMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/OcelotMeta.java new file mode 100644 index 000000000..5869835f7 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/animal/OcelotMeta.java @@ -0,0 +1,21 @@ +package net.minestom.server.entity.metadata.animal; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class OcelotMeta extends AnimalMeta { + + public OcelotMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isTrusting() { + return super.metadata.getIndex((byte) 16, false); + } + + public void setTrusting(boolean value) { + super.metadata.setIndex((byte) 16, Metadata.Boolean(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/PandaMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/PandaMeta.java new file mode 100644 index 000000000..298ea0763 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/animal/PandaMeta.java @@ -0,0 +1,106 @@ +package net.minestom.server.entity.metadata.animal; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class PandaMeta extends AnimalMeta { + + private final static byte MASK_INDEX = 21; + + private final static byte SNEEZING_BIT = 0x02; + private final static byte ROLLING_BIT = 0x04; + private final static byte SITTING_BIT = 0x08; + private final static byte ON_BACK_BIT = 0x10; + + public PandaMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public int getBreedTimer() { + return super.metadata.getIndex((byte) 16, 0); + } + + public void setBreedTimer(int value) { + super.metadata.setIndex((byte) 16, Metadata.VarInt(value)); + } + + public int getSneezeTimer() { + return super.metadata.getIndex((byte) 17, 0); + } + + public void setSneezeTimer(int value) { + super.metadata.setIndex((byte) 17, Metadata.VarInt(value)); + } + + public int getEatTimer() { + return super.metadata.getIndex((byte) 18, 0); + } + + public void setEatTimer(int value) { + super.metadata.setIndex((byte) 18, Metadata.VarInt(value)); + } + + @NotNull + public Gene getMainGene() { + return Gene.VALUES[super.metadata.getIndex((byte) 19, (byte) 0)]; + } + + public void setMainGene(@NotNull Gene value) { + super.metadata.setIndex((byte) 19, Metadata.Byte((byte) value.ordinal())); + } + + @NotNull + public Gene getHiddenGene() { + return Gene.VALUES[super.metadata.getIndex((byte) 20, (byte) 0)]; + } + + public void setHiddenGene(@NotNull Gene value) { + super.metadata.setIndex((byte) 20, Metadata.Byte((byte) value.ordinal())); + } + + public boolean isSneezing() { + return getMaskBit(MASK_INDEX, SNEEZING_BIT); + } + + public void setSneezing(boolean value) { + setMaskBit(MASK_INDEX, SNEEZING_BIT, value); + } + + public boolean isRolling() { + return getMaskBit(MASK_INDEX, ROLLING_BIT); + } + + public void setRolling(boolean value) { + setMaskBit(MASK_INDEX, ROLLING_BIT, value); + } + + public boolean isSitting() { + return getMaskBit(MASK_INDEX, SITTING_BIT); + } + + public void setSitting(boolean value) { + setMaskBit(MASK_INDEX, SITTING_BIT, value); + } + + public boolean isOnBack() { + return getMaskBit(MASK_INDEX, ON_BACK_BIT); + } + + public void setOnBack(boolean value) { + setMaskBit(MASK_INDEX, ON_BACK_BIT, value); + } + + public enum Gene { + NORMAL, + AGGRESSIVE, + LAZY, + WORRIED, + PLAYFUL, + WEAK, + BROWN; + + private final static Gene[] VALUES = values(); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/PigMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/PigMeta.java new file mode 100644 index 000000000..482ac2c1a --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/animal/PigMeta.java @@ -0,0 +1,29 @@ +package net.minestom.server.entity.metadata.animal; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class PigMeta extends AnimalMeta { + + public PigMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isHasSaddle() { + return super.metadata.getIndex((byte) 16, false); + } + + public void setHasSaddle(boolean value) { + super.metadata.setIndex((byte) 16, Metadata.Boolean(value)); + } + + public int getTimeToBoost() { + return super.metadata.getIndex((byte) 17, 0); + } + + public void setTimeToBoost(int value) { + super.metadata.getIndex((byte) 17, Metadata.VarInt(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/PolarBearMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/PolarBearMeta.java new file mode 100644 index 000000000..0da00b06c --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/animal/PolarBearMeta.java @@ -0,0 +1,21 @@ +package net.minestom.server.entity.metadata.animal; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class PolarBearMeta extends AnimalMeta { + + public PolarBearMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isStandingUp() { + return super.metadata.getIndex((byte) 16, false); + } + + public void setStandingUp(boolean value) { + super.metadata.setIndex((byte) 16, Metadata.Boolean(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/RabbitMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/RabbitMeta.java new file mode 100644 index 000000000..a24fb2d15 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/animal/RabbitMeta.java @@ -0,0 +1,39 @@ +package net.minestom.server.entity.metadata.animal; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class RabbitMeta extends AnimalMeta { + + public RabbitMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + @NotNull + public Type getType() { + int id = super.metadata.getIndex((byte) 16, 0); + if (id == 99) { + return Type.KILLER_BUNNY; + } + return Type.VALUES[id]; + } + + public void setType(@NotNull Type value) { + int id = value == Type.KILLER_BUNNY ? 99 : value.ordinal(); + super.metadata.setIndex((byte) 16, Metadata.VarInt(id)); + } + + public enum Type { + BROWN, + WHITE, + BLACK, + BLACK_AND_WHITE, + GOLD, + SALT_AND_PEPPER, + KILLER_BUNNY; + + private final static Type[] VALUES = values(); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/SheepMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/SheepMeta.java new file mode 100644 index 000000000..4dc2c4805 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/animal/SheepMeta.java @@ -0,0 +1,40 @@ +package net.minestom.server.entity.metadata.animal; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class SheepMeta extends AnimalMeta { + + private final static byte MASK_INDEX = 16; + + private final static byte COLOR_BITS = 0x0F; + private final static byte SHEARED_BIT = 0x10; + + public SheepMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public int getColor() { + return getMask(MASK_INDEX) & COLOR_BITS; + } + + public void setColor(byte color) { + byte before = getMask(MASK_INDEX); + byte mask = before; + mask &= ~COLOR_BITS; + mask |= (color & COLOR_BITS); + if (mask != before) { + setMask(MASK_INDEX, mask); + } + } + + public boolean isSheared() { + return getMaskBit(MASK_INDEX, SHEARED_BIT); + } + + public void setSheared(boolean value) { + setMaskBit(MASK_INDEX, SHEARED_BIT, value); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/SkeletonHorseMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/SkeletonHorseMeta.java new file mode 100644 index 000000000..c644d783e --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/animal/SkeletonHorseMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.animal; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class SkeletonHorseMeta extends AbstractHorseMeta { + + public SkeletonHorseMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/StriderMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/StriderMeta.java new file mode 100644 index 000000000..8ad2cf944 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/animal/StriderMeta.java @@ -0,0 +1,37 @@ +package net.minestom.server.entity.metadata.animal; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class StriderMeta extends AnimalMeta { + + public StriderMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public int getTimeToBoost() { + return super.metadata.getIndex((byte) 16, 0); + } + + public void setTimeToBoost(int value) { + super.metadata.setIndex((byte) 16, Metadata.VarInt(value)); + } + + public boolean isShaking() { + return super.metadata.getIndex((byte) 17, false); + } + + public void setShaking(boolean value) { + super.metadata.setIndex((byte) 17, Metadata.Boolean(value)); + } + + public boolean isHasSaddle() { + return super.metadata.getIndex((byte) 18, false); + } + + public void setHasSaddle(boolean value) { + super.metadata.setIndex((byte) 18, Metadata.Boolean(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/TurtleMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/TurtleMeta.java new file mode 100644 index 000000000..299bdae87 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/animal/TurtleMeta.java @@ -0,0 +1,64 @@ +package net.minestom.server.entity.metadata.animal; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.utils.BlockPosition; +import org.jetbrains.annotations.NotNull; + +public class TurtleMeta extends AnimalMeta { + + public TurtleMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + @NotNull + public BlockPosition getHomePosition() { + return super.metadata.getIndex((byte) 16, new BlockPosition(0, 0, 0)); + } + + public void setBlockPosition(@NotNull BlockPosition value) { + super.metadata.setIndex((byte) 16, Metadata.Position(value)); + } + + public boolean isHasEgg() { + return super.metadata.getIndex((byte) 17, false); + } + + public void setHasEgg(boolean value) { + super.metadata.setIndex((byte) 17, Metadata.Boolean(value)); + } + + public boolean isLayingEgg() { + return super.metadata.getIndex((byte) 18, false); + } + + public void setLayingEgg(boolean value) { + super.metadata.setIndex((byte) 18, Metadata.Boolean(value)); + } + + @NotNull + public BlockPosition getTravelPosition() { + return super.metadata.getIndex((byte) 19, new BlockPosition(0, 0, 0)); + } + + public void setTravelPosition(@NotNull BlockPosition value) { + super.metadata.setIndex((byte) 19, Metadata.Position(value)); + } + + public boolean isGoingHome() { + return super.metadata.getIndex((byte) 20, false); + } + + public void setGoingHome(boolean value) { + super.metadata.setIndex((byte) 20, Metadata.Boolean(value)); + } + + public boolean isTravelling() { + return super.metadata.getIndex((byte) 21, false); + } + + public void setTravelling(boolean value) { + super.metadata.setIndex((byte) 21, Metadata.Boolean(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/ZombieHorseMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/ZombieHorseMeta.java new file mode 100644 index 000000000..b5efa4b9b --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/animal/ZombieHorseMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.animal; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class ZombieHorseMeta extends AbstractHorseMeta { + + public ZombieHorseMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/tameable/CatMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/tameable/CatMeta.java new file mode 100644 index 000000000..4c32fe10b --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/animal/tameable/CatMeta.java @@ -0,0 +1,62 @@ +package net.minestom.server.entity.metadata.animal.tameable; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class CatMeta extends TameableAnimalMeta { + + public CatMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + @NotNull + public Color getColor() { + return Color.VALUES[super.metadata.getIndex((byte) 18, 1)]; + } + + public void setColor(@NotNull Color value) { + super.metadata.setIndex((byte) 18, Metadata.VarInt(value.ordinal())); + } + + public boolean isLying() { + return super.metadata.getIndex((byte) 19, false); + } + + public void setLying(boolean value) { + super.metadata.setIndex((byte) 19, Metadata.Boolean(value)); + } + + public boolean isRelaxed() { + return super.metadata.getIndex((byte) 20, false); + } + + public void setRelaxed(boolean value) { + super.metadata.setIndex((byte) 20, Metadata.Boolean(value)); + } + + public int getCollarColor() { + return super.metadata.getIndex((byte) 21, 14); + } + + public void setCollarColor(int value) { + super.metadata.setIndex((byte) 21, Metadata.VarInt(value)); + } + + public enum Color { + TABBY, + BLACK, + RED, + SIAMESE, + BRITISH_SHORTHAIR, + CALICO, + PERSIAN, + RAGDOLL, + WHITE, + JELLIE, + ALL_BLACK; + + private final static Color[] VALUES = values(); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/tameable/ParrotMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/tameable/ParrotMeta.java new file mode 100644 index 000000000..603d1feb4 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/animal/tameable/ParrotMeta.java @@ -0,0 +1,32 @@ +package net.minestom.server.entity.metadata.animal.tameable; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class ParrotMeta extends TameableAnimalMeta { + + public ParrotMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + @NotNull + public Color getColor() { + return Color.VALUES[super.metadata.getIndex((byte) 18, 0)]; + } + + public void setColor(@NotNull Color value) { + super.metadata.setIndex((byte) 18, Metadata.VarInt(value.ordinal())); + } + + public enum Color { + RED_BLUE, + BLUE, + GREEN, + YELLOW_BLUE, + GREY; + + private final static Color[] VALUES = values(); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/tameable/TameableAnimalMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/tameable/TameableAnimalMeta.java new file mode 100644 index 000000000..90d06be95 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/animal/tameable/TameableAnimalMeta.java @@ -0,0 +1,46 @@ +package net.minestom.server.entity.metadata.animal.tameable; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.animal.AnimalMeta; +import org.jetbrains.annotations.NotNull; + +import java.util.UUID; + +public class TameableAnimalMeta extends AnimalMeta { + + private final static byte MASK_INDEX = 16; + + private final static byte SITTING_BIT = 0x01; + private final static byte TAMED_BIT = 0x04; + + protected TameableAnimalMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isSitting() { + return getMaskBit(MASK_INDEX, SITTING_BIT); + } + + public void setSitting(boolean value) { + setMaskBit(MASK_INDEX, SITTING_BIT, value); + } + + public boolean isTamed() { + return getMaskBit(MASK_INDEX, TAMED_BIT); + } + + public void setTamed(boolean value) { + setMaskBit(MASK_INDEX, TAMED_BIT, value); + } + + @NotNull + public UUID getOwner() { + return super.metadata.getIndex((byte) 17, null); + } + + public void setOwner(@NotNull UUID value) { + super.metadata.setIndex((byte) 17, Metadata.OptUUID(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/animal/tameable/WolfMeta.java b/src/main/java/net/minestom/server/entity/metadata/animal/tameable/WolfMeta.java new file mode 100644 index 000000000..2a6959822 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/animal/tameable/WolfMeta.java @@ -0,0 +1,37 @@ +package net.minestom.server.entity.metadata.animal.tameable; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class WolfMeta extends TameableAnimalMeta { + + public WolfMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isBegging() { + return super.metadata.getIndex((byte) 18, false); + } + + public void setBegging(boolean value) { + super.metadata.setIndex((byte) 18, Metadata.Boolean(value)); + } + + public int getCollarColor() { + return super.metadata.getIndex((byte) 19, 14); + } + + public void setCollarColor(int value) { + super.metadata.setIndex((byte) 19, Metadata.VarInt(value)); + } + + public int getAngerTime() { + return super.metadata.getIndex((byte) 20, 0); + } + + public void setAngerTime(int value) { + super.metadata.setIndex((byte) 20, Metadata.VarInt(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/arrow/AbstractArrowMeta.java b/src/main/java/net/minestom/server/entity/metadata/arrow/AbstractArrowMeta.java new file mode 100644 index 000000000..d3332ddaa --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/arrow/AbstractArrowMeta.java @@ -0,0 +1,43 @@ +package net.minestom.server.entity.metadata.arrow; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.EntityMeta; +import org.jetbrains.annotations.NotNull; + +public class AbstractArrowMeta extends EntityMeta { + + private final static byte MASK_INDEX = 7; + + private final static byte CRITICAL_BIT = 0x01; + private final static byte NO_CLIP_BIT = 0x01; + + protected AbstractArrowMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isCritical() { + return getMaskBit(MASK_INDEX, CRITICAL_BIT); + } + + public void setCritical(boolean value) { + setMaskBit(MASK_INDEX, CRITICAL_BIT, value); + } + + public boolean isNoClip() { + return getMaskBit(MASK_INDEX, NO_CLIP_BIT); + } + + public void setNoClip(boolean value) { + setMaskBit(MASK_INDEX, NO_CLIP_BIT, value); + } + + public byte getPiercingLevel() { + return super.metadata.getIndex((byte) 8, (byte) 0); + } + + public void setPiercingLevel(byte value) { + super.metadata.setIndex((byte) 8, Metadata.Byte(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/arrow/ArrowMeta.java b/src/main/java/net/minestom/server/entity/metadata/arrow/ArrowMeta.java new file mode 100644 index 000000000..d02f96cdc --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/arrow/ArrowMeta.java @@ -0,0 +1,44 @@ +package net.minestom.server.entity.metadata.arrow; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.ObjectDataProvider; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class ArrowMeta extends AbstractArrowMeta implements ObjectDataProvider { + + private Entity shooter; + + public ArrowMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public int getColor() { + return super.metadata.getIndex((byte) 9, -1); + } + + public void setColor(int value) { + super.metadata.setIndex((byte) 9, Metadata.VarInt(value)); + } + + @Nullable + public Entity getShooter() { + return this.shooter; + } + + public void setShooter(@Nullable Entity shooter) { + this.shooter = shooter; + } + + @Override + public int getObjectData() { + return this.shooter == null ? 0 : this.shooter.getEntityId() + 1; + } + + @Override + public boolean requiresVelocityPacketAtSpawn() { + return true; + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/arrow/SpectralArrowMeta.java b/src/main/java/net/minestom/server/entity/metadata/arrow/SpectralArrowMeta.java new file mode 100644 index 000000000..4e356f4df --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/arrow/SpectralArrowMeta.java @@ -0,0 +1,36 @@ +package net.minestom.server.entity.metadata.arrow; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.ObjectDataProvider; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class SpectralArrowMeta extends AbstractArrowMeta implements ObjectDataProvider { + + private Entity shooter; + + public SpectralArrowMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + @Nullable + public Entity getShooter() { + return this.shooter; + } + + public void setShooter(@Nullable Entity shooter) { + this.shooter = shooter; + } + + @Override + public int getObjectData() { + return this.shooter == null ? 0 : this.shooter.getEntityId() + 1; + } + + @Override + public boolean requiresVelocityPacketAtSpawn() { + return true; + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/arrow/ThrownTridentMeta.java b/src/main/java/net/minestom/server/entity/metadata/arrow/ThrownTridentMeta.java new file mode 100644 index 000000000..2ab3cd990 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/arrow/ThrownTridentMeta.java @@ -0,0 +1,29 @@ +package net.minestom.server.entity.metadata.arrow; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class ThrownTridentMeta extends AbstractArrowMeta { + + public ThrownTridentMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public int getLoyaltyLevel() { + return super.metadata.getIndex((byte) 9, 0); + } + + public void setLoyaltyLevel(int value) { + super.metadata.setIndex((byte) 9, Metadata.VarInt(value)); + } + + public boolean isHasEnchantmentGlint() { + return super.metadata.getIndex((byte) 10, false); + } + + public void setHasEnchantmentGlint(boolean value) { + super.metadata.setIndex((byte) 10, Metadata.Boolean(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/flying/FlyingMeta.java b/src/main/java/net/minestom/server/entity/metadata/flying/FlyingMeta.java new file mode 100644 index 000000000..84b8d6fab --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/flying/FlyingMeta.java @@ -0,0 +1,14 @@ +package net.minestom.server.entity.metadata.flying; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.MobMeta; +import org.jetbrains.annotations.NotNull; + +public class FlyingMeta extends MobMeta { + + protected FlyingMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/flying/GhastMeta.java b/src/main/java/net/minestom/server/entity/metadata/flying/GhastMeta.java new file mode 100644 index 000000000..d7d3068a9 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/flying/GhastMeta.java @@ -0,0 +1,21 @@ +package net.minestom.server.entity.metadata.flying; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class GhastMeta extends FlyingMeta { + + public GhastMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isAttacking() { + return super.metadata.getIndex((byte) 15, false); + } + + public void setAttacking(boolean value) { + super.metadata.setIndex((byte) 15, Metadata.Boolean(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/flying/PhantomMeta.java b/src/main/java/net/minestom/server/entity/metadata/flying/PhantomMeta.java new file mode 100644 index 000000000..2cf2317d6 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/flying/PhantomMeta.java @@ -0,0 +1,21 @@ +package net.minestom.server.entity.metadata.flying; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class PhantomMeta extends FlyingMeta { + + public PhantomMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public int getSize() { + return super.metadata.getIndex((byte) 15, 0); + } + + public void setSize(int value) { + super.metadata.setIndex((byte) 15, Metadata.VarInt(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/golem/AbstractGolemMeta.java b/src/main/java/net/minestom/server/entity/metadata/golem/AbstractGolemMeta.java new file mode 100644 index 000000000..dfbbc2b61 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/golem/AbstractGolemMeta.java @@ -0,0 +1,14 @@ +package net.minestom.server.entity.metadata.golem; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.PathfinderMobMeta; +import org.jetbrains.annotations.NotNull; + +public class AbstractGolemMeta extends PathfinderMobMeta { + + protected AbstractGolemMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/golem/IronGolemMeta.java b/src/main/java/net/minestom/server/entity/metadata/golem/IronGolemMeta.java new file mode 100644 index 000000000..af0de2ff9 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/golem/IronGolemMeta.java @@ -0,0 +1,25 @@ +package net.minestom.server.entity.metadata.golem; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class IronGolemMeta extends AbstractGolemMeta { + + private final static byte MASK_INDEX = 15; + + private final static byte PLAYER_CREATED_BIT = 0x01; + + public IronGolemMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isPlayerCreated() { + return getMaskBit(MASK_INDEX, PLAYER_CREATED_BIT); + } + + public void setPlayerCreated(boolean value) { + setMaskBit(MASK_INDEX, PLAYER_CREATED_BIT, value); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/golem/ShulkerMeta.java b/src/main/java/net/minestom/server/entity/metadata/golem/ShulkerMeta.java new file mode 100644 index 000000000..1269d9c05 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/golem/ShulkerMeta.java @@ -0,0 +1,47 @@ +package net.minestom.server.entity.metadata.golem; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.utils.BlockPosition; +import net.minestom.server.utils.Direction; +import org.jetbrains.annotations.NotNull; + +public class ShulkerMeta extends AbstractGolemMeta { + + public ShulkerMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public Direction getAttachFace() { + return super.metadata.getIndex((byte) 15, Direction.DOWN); + } + + public void setAttachFace(Direction value) { + super.metadata.setIndex((byte) 15, Metadata.Direction(value)); + } + + public BlockPosition getAttachmentPosition() { + return super.metadata.getIndex((byte) 16, null); + } + + public void setAttachmentPosition(BlockPosition value) { + super.metadata.setIndex((byte) 16, Metadata.OptPosition(value)); + } + + public byte getShieldHeight() { + return super.metadata.getIndex((byte) 17, (byte) 0); + } + + public void setShieldHeight(byte value) { + super.metadata.setIndex((byte) 17, Metadata.Byte(value)); + } + + public byte getColor() { + return super.metadata.getIndex((byte) 18, (byte) 10); + } + + public void setColor(byte value) { + super.metadata.setIndex((byte) 18, Metadata.Byte(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/golem/SnowGolemMeta.java b/src/main/java/net/minestom/server/entity/metadata/golem/SnowGolemMeta.java new file mode 100644 index 000000000..143b7f7e8 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/golem/SnowGolemMeta.java @@ -0,0 +1,21 @@ +package net.minestom.server.entity.metadata.golem; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class SnowGolemMeta extends AbstractGolemMeta { + + public SnowGolemMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isHasPumpkinHat() { + return super.metadata.getIndex((byte) 15, (byte) 0x10) == (byte) 0x10; + } + + public void setHasPumpkinHat(boolean value) { + super.metadata.setIndex((byte) 15, Metadata.Byte(value ? (byte) 0x10 : (byte) 0x00)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/item/EyeOfEnderMeta.java b/src/main/java/net/minestom/server/entity/metadata/item/EyeOfEnderMeta.java new file mode 100644 index 000000000..86aeed45c --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/item/EyeOfEnderMeta.java @@ -0,0 +1,14 @@ +package net.minestom.server.entity.metadata.item; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.item.Material; +import org.jetbrains.annotations.NotNull; + +public class EyeOfEnderMeta extends ItemContainingMeta { + + public EyeOfEnderMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata, Material.ENDER_EYE); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/item/FireballMeta.java b/src/main/java/net/minestom/server/entity/metadata/item/FireballMeta.java new file mode 100644 index 000000000..822de1f39 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/item/FireballMeta.java @@ -0,0 +1,37 @@ +package net.minestom.server.entity.metadata.item; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.ObjectDataProvider; +import net.minestom.server.item.Material; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class FireballMeta extends ItemContainingMeta implements ObjectDataProvider { + + private Entity shooter; + + public FireballMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata, Material.AIR); + } + + @Nullable + public Entity getShooter() { + return shooter; + } + + public void setShooter(@Nullable Entity shooter) { + this.shooter = shooter; + } + + @Override + public int getObjectData() { + return this.shooter == null ? 0 : this.shooter.getEntityId(); + } + + @Override + public boolean requiresVelocityPacketAtSpawn() { + return true; + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/item/ItemContainingMeta.java b/src/main/java/net/minestom/server/entity/metadata/item/ItemContainingMeta.java new file mode 100644 index 000000000..18e2512b7 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/item/ItemContainingMeta.java @@ -0,0 +1,28 @@ +package net.minestom.server.entity.metadata.item; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.EntityMeta; +import net.minestom.server.item.ItemStack; +import net.minestom.server.item.Material; +import org.jetbrains.annotations.NotNull; + +class ItemContainingMeta extends EntityMeta { + + private final ItemStack defaultItem; + + protected ItemContainingMeta(@NotNull Entity entity, @NotNull Metadata metadata, @NotNull Material defaultItemMaterial) { + super(entity, metadata); + this.defaultItem = new ItemStack(defaultItemMaterial, (byte) 1); + } + + @NotNull + public ItemStack getItem() { + return super.metadata.getIndex((byte) 7, this.defaultItem); + } + + public void setItem(@NotNull ItemStack item) { + super.metadata.setIndex((byte) 7, Metadata.Slot(item)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/item/ItemEntityMeta.java b/src/main/java/net/minestom/server/entity/metadata/item/ItemEntityMeta.java new file mode 100644 index 000000000..812f0f9c6 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/item/ItemEntityMeta.java @@ -0,0 +1,25 @@ +package net.minestom.server.entity.metadata.item; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.ObjectDataProvider; +import net.minestom.server.item.Material; +import org.jetbrains.annotations.NotNull; + +public class ItemEntityMeta extends ItemContainingMeta implements ObjectDataProvider { + + public ItemEntityMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata, Material.AIR); + } + + @Override + public int getObjectData() { + return 1; + } + + @Override + public boolean requiresVelocityPacketAtSpawn() { + return true; + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/item/SmallFireballMeta.java b/src/main/java/net/minestom/server/entity/metadata/item/SmallFireballMeta.java new file mode 100644 index 000000000..5953445cb --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/item/SmallFireballMeta.java @@ -0,0 +1,37 @@ +package net.minestom.server.entity.metadata.item; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.ObjectDataProvider; +import net.minestom.server.item.Material; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class SmallFireballMeta extends ItemContainingMeta implements ObjectDataProvider { + + private Entity shooter; + + public SmallFireballMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata, Material.FIRE_CHARGE); + } + + @Nullable + public Entity getShooter() { + return shooter; + } + + public void setShooter(@Nullable Entity shooter) { + this.shooter = shooter; + } + + @Override + public int getObjectData() { + return this.shooter == null ? 0 : this.shooter.getEntityId(); + } + + @Override + public boolean requiresVelocityPacketAtSpawn() { + return true; + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/item/SnowballMeta.java b/src/main/java/net/minestom/server/entity/metadata/item/SnowballMeta.java new file mode 100644 index 000000000..4d60ec831 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/item/SnowballMeta.java @@ -0,0 +1,14 @@ +package net.minestom.server.entity.metadata.item; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.item.Material; +import org.jetbrains.annotations.NotNull; + +public class SnowballMeta extends ItemContainingMeta { + + public SnowballMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata, Material.SNOWBALL); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/item/ThrownEggMeta.java b/src/main/java/net/minestom/server/entity/metadata/item/ThrownEggMeta.java new file mode 100644 index 000000000..ba8911d55 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/item/ThrownEggMeta.java @@ -0,0 +1,14 @@ +package net.minestom.server.entity.metadata.item; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.item.Material; +import org.jetbrains.annotations.NotNull; + +public class ThrownEggMeta extends ItemContainingMeta { + + public ThrownEggMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata, Material.EGG); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/item/ThrownEnderPearlMeta.java b/src/main/java/net/minestom/server/entity/metadata/item/ThrownEnderPearlMeta.java new file mode 100644 index 000000000..1fc85438e --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/item/ThrownEnderPearlMeta.java @@ -0,0 +1,14 @@ +package net.minestom.server.entity.metadata.item; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.item.Material; +import org.jetbrains.annotations.NotNull; + +public class ThrownEnderPearlMeta extends ItemContainingMeta { + + public ThrownEnderPearlMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata, Material.ENDER_PEARL); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/item/ThrownExperienceBottleMeta.java b/src/main/java/net/minestom/server/entity/metadata/item/ThrownExperienceBottleMeta.java new file mode 100644 index 000000000..9b574140a --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/item/ThrownExperienceBottleMeta.java @@ -0,0 +1,14 @@ +package net.minestom.server.entity.metadata.item; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.item.Material; +import org.jetbrains.annotations.NotNull; + +public class ThrownExperienceBottleMeta extends ItemContainingMeta { + + public ThrownExperienceBottleMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata, Material.EXPERIENCE_BOTTLE); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/item/ThrownPotionMeta.java b/src/main/java/net/minestom/server/entity/metadata/item/ThrownPotionMeta.java new file mode 100644 index 000000000..3fc282f89 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/item/ThrownPotionMeta.java @@ -0,0 +1,14 @@ +package net.minestom.server.entity.metadata.item; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.item.Material; +import org.jetbrains.annotations.NotNull; + +public class ThrownPotionMeta extends ItemContainingMeta { + + public ThrownPotionMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata, Material.AIR); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/minecart/AbstractMinecartContainerMeta.java b/src/main/java/net/minestom/server/entity/metadata/minecart/AbstractMinecartContainerMeta.java new file mode 100644 index 000000000..8d35eb323 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/minecart/AbstractMinecartContainerMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.minecart; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public abstract class AbstractMinecartContainerMeta extends AbstractMinecartMeta { + + protected AbstractMinecartContainerMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/minecart/AbstractMinecartMeta.java b/src/main/java/net/minestom/server/entity/metadata/minecart/AbstractMinecartMeta.java new file mode 100644 index 000000000..194ccc8b2 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/minecart/AbstractMinecartMeta.java @@ -0,0 +1,61 @@ +package net.minestom.server.entity.metadata.minecart; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.EntityMeta; +import net.minestom.server.entity.metadata.ObjectDataProvider; +import org.jetbrains.annotations.NotNull; + +public abstract class AbstractMinecartMeta extends EntityMeta implements ObjectDataProvider { + + protected AbstractMinecartMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public int getShakingPower() { + return super.metadata.getIndex((byte) 7, 0); + } + + public void setShakingPower(int value) { + super.metadata.setIndex((byte) 7, Metadata.VarInt(value)); + } + + public int getShakingDirection() { + return super.metadata.getIndex((byte) 8, 1); + } + + public void setShakingDirection(int value) { + super.metadata.setIndex((byte) 8, Metadata.VarInt(value)); + } + + public float getShakingMultiplier() { + return super.metadata.getIndex((byte) 9, 0F); + } + + public void setShakingMultiplier(float value) { + super.metadata.setIndex((byte) 9, Metadata.Float(value)); + } + + public int getCustomBlockIdAndDamage() { + return super.metadata.getIndex((byte) 10, 0); + } + + public void setCustomBlockIdAndDamage(int value) { + super.metadata.setIndex((byte) 10, Metadata.VarInt(value)); + } + + // in 16th of a block + public int getCustomBlockYPosition() { + return super.metadata.getIndex((byte) 11, 6); + } + + public void setCustomBlockYPosition(int value) { + super.metadata.setIndex((byte) 11, Metadata.VarInt(value)); + } + + @Override + public boolean requiresVelocityPacketAtSpawn() { + return true; + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/minecart/ChestMinecartMeta.java b/src/main/java/net/minestom/server/entity/metadata/minecart/ChestMinecartMeta.java new file mode 100644 index 000000000..78c0d52dd --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/minecart/ChestMinecartMeta.java @@ -0,0 +1,18 @@ +package net.minestom.server.entity.metadata.minecart; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class ChestMinecartMeta extends AbstractMinecartContainerMeta { + + public ChestMinecartMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + @Override + public int getObjectData() { + return 1; + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/minecart/CommandBlockMinecartMeta.java b/src/main/java/net/minestom/server/entity/metadata/minecart/CommandBlockMinecartMeta.java new file mode 100644 index 000000000..acac0c2fe --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/minecart/CommandBlockMinecartMeta.java @@ -0,0 +1,38 @@ +package net.minestom.server.entity.metadata.minecart; + +import net.minestom.server.chat.ColoredText; +import net.minestom.server.chat.JsonMessage; +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class CommandBlockMinecartMeta extends AbstractMinecartMeta { + + public CommandBlockMinecartMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + @NotNull + public String getCommand() { + return super.metadata.getIndex((byte) 13, ""); + } + + public void setCommand(@NotNull String value) { + super.metadata.setIndex((byte) 13, Metadata.String(value)); + } + + @NotNull + public JsonMessage getLastOutput() { + return super.metadata.getIndex((byte) 14, ColoredText.of("")); + } + + public void setLastOutput(@NotNull JsonMessage value) { + super.metadata.setIndex((byte) 14, Metadata.Chat(value)); + } + + @Override + public int getObjectData() { + return 6; + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/minecart/FurnaceMinecartMeta.java b/src/main/java/net/minestom/server/entity/metadata/minecart/FurnaceMinecartMeta.java new file mode 100644 index 000000000..57fd31199 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/minecart/FurnaceMinecartMeta.java @@ -0,0 +1,26 @@ +package net.minestom.server.entity.metadata.minecart; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class FurnaceMinecartMeta extends AbstractMinecartMeta { + + public FurnaceMinecartMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isHasFuel() { + return super.metadata.getIndex((byte) 13, false); + } + + public void setHasFuel(boolean value) { + super.metadata.setIndex((byte) 13, Metadata.Boolean(value)); + } + + @Override + public int getObjectData() { + return 2; + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/minecart/HopperMinecartMeta.java b/src/main/java/net/minestom/server/entity/metadata/minecart/HopperMinecartMeta.java new file mode 100644 index 000000000..043da17e7 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/minecart/HopperMinecartMeta.java @@ -0,0 +1,18 @@ +package net.minestom.server.entity.metadata.minecart; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class HopperMinecartMeta extends AbstractMinecartContainerMeta { + + public HopperMinecartMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + @Override + public int getObjectData() { + return 5; + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/minecart/MinecartMeta.java b/src/main/java/net/minestom/server/entity/metadata/minecart/MinecartMeta.java new file mode 100644 index 000000000..10e139bc6 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/minecart/MinecartMeta.java @@ -0,0 +1,18 @@ +package net.minestom.server.entity.metadata.minecart; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class MinecartMeta extends AbstractMinecartMeta { + + public MinecartMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + @Override + public int getObjectData() { + return 0; + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/minecart/SpawnerMinecartMeta.java b/src/main/java/net/minestom/server/entity/metadata/minecart/SpawnerMinecartMeta.java new file mode 100644 index 000000000..2d378a33e --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/minecart/SpawnerMinecartMeta.java @@ -0,0 +1,18 @@ +package net.minestom.server.entity.metadata.minecart; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class SpawnerMinecartMeta extends AbstractMinecartMeta { + + public SpawnerMinecartMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + @Override + public int getObjectData() { + return 4; + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/minecart/TntMinecartMeta.java b/src/main/java/net/minestom/server/entity/metadata/minecart/TntMinecartMeta.java new file mode 100644 index 000000000..3a03be33f --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/minecart/TntMinecartMeta.java @@ -0,0 +1,18 @@ +package net.minestom.server.entity.metadata.minecart; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class TntMinecartMeta extends AbstractMinecartMeta { + + public TntMinecartMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + @Override + public int getObjectData() { + return 3; + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/BasePiglinMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/BasePiglinMeta.java new file mode 100644 index 000000000..b2accacb2 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/BasePiglinMeta.java @@ -0,0 +1,21 @@ +package net.minestom.server.entity.metadata.monster; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class BasePiglinMeta extends MonsterMeta { + + protected BasePiglinMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isImmuneToZombification() { + return super.metadata.getIndex((byte) 15, false); + } + + public void setImmuneToZombification(boolean value) { + super.metadata.setIndex((byte) 15, Metadata.Boolean(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/BlazeMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/BlazeMeta.java new file mode 100644 index 000000000..d2004436f --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/BlazeMeta.java @@ -0,0 +1,25 @@ +package net.minestom.server.entity.metadata.monster; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class BlazeMeta extends MonsterMeta { + + private final static byte MASK_INDEX = 15; + + private final static byte ON_FIRE_BIT = 0x01; + + public BlazeMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isOnFire() { + return getMaskBit(MASK_INDEX, ON_FIRE_BIT); + } + + public void setOnFire(boolean value) { + setMaskBit(MASK_INDEX, ON_FIRE_BIT, value); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/CaveSpiderMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/CaveSpiderMeta.java new file mode 100644 index 000000000..f62677c72 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/CaveSpiderMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.monster; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class CaveSpiderMeta extends SpiderMeta { + + public CaveSpiderMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/CreeperMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/CreeperMeta.java new file mode 100644 index 000000000..582416405 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/CreeperMeta.java @@ -0,0 +1,44 @@ +package net.minestom.server.entity.metadata.monster; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class CreeperMeta extends MonsterMeta { + + public CreeperMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + @NotNull + public State getState() { + int id = super.metadata.getIndex((byte) 15, -1); + return id == -1 ? State.IDLE : State.FUSE; + } + + public void setState(@NotNull State value) { + super.metadata.setIndex((byte) 15, Metadata.VarInt(value == State.IDLE ? -1 : 1)); + } + + public boolean isCharged() { + return super.metadata.getIndex((byte) 16, false); + } + + public void setCharged(boolean value) { + super.metadata.setIndex((byte) 16, Metadata.Boolean(value)); + } + + public boolean isIgnited() { + return super.metadata.getIndex((byte) 17, false); + } + + public void setIgnited(boolean value) { + super.metadata.setIndex((byte) 17, Metadata.Boolean(value)); + } + + public enum State { + IDLE, + FUSE + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/ElderGuardianMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/ElderGuardianMeta.java new file mode 100644 index 000000000..d08ebc32c --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/ElderGuardianMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.monster; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class ElderGuardianMeta extends GuardianMeta { + + public ElderGuardianMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/EndermanMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/EndermanMeta.java new file mode 100644 index 000000000..9856f38ec --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/EndermanMeta.java @@ -0,0 +1,38 @@ +package net.minestom.server.entity.metadata.monster; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class EndermanMeta extends MonsterMeta { + + public EndermanMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public Integer getCarriedBlockID() { + return super.metadata.getIndex((byte) 15, null); + } + + public void setCarriedBlockID(@Nullable Integer value) { + super.metadata.setIndex((byte) 15, Metadata.OptBlockID(value)); + } + + public boolean isScreaming() { + return super.metadata.getIndex((byte) 16, false); + } + + public void setScreaming(boolean value) { + super.metadata.setIndex((byte) 16, Metadata.Boolean(value)); + } + + public boolean isStaring() { + return super.metadata.getIndex((byte) 17, false); + } + + public void setStaring(boolean value) { + super.metadata.setIndex((byte) 17, Metadata.Boolean(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/EndermiteMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/EndermiteMeta.java new file mode 100644 index 000000000..33850f32b --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/EndermiteMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.monster; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class EndermiteMeta extends MonsterMeta { + + public EndermiteMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/GiantMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/GiantMeta.java new file mode 100644 index 000000000..543a24e64 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/GiantMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.monster; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class GiantMeta extends MonsterMeta { + + public GiantMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/GuardianMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/GuardianMeta.java new file mode 100644 index 000000000..410e0f617 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/GuardianMeta.java @@ -0,0 +1,32 @@ +package net.minestom.server.entity.metadata.monster; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class GuardianMeta extends MonsterMeta { + + private Entity target; + + public GuardianMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isRetractingSpikes() { + return super.metadata.getIndex((byte) 15, false); + } + + public void setRetractingSpikes(boolean retractingSpikes) { + super.metadata.setIndex((byte) 15, Metadata.Boolean(retractingSpikes)); + } + + public Entity getTarget() { + return this.target; + } + + public void setTarget(@NotNull Entity target) { + this.target = target; + super.metadata.setIndex((byte) 16, Metadata.VarInt(target.getEntityId())); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/MonsterMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/MonsterMeta.java new file mode 100644 index 000000000..373ce713e --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/MonsterMeta.java @@ -0,0 +1,14 @@ +package net.minestom.server.entity.metadata.monster; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.PathfinderMobMeta; +import org.jetbrains.annotations.NotNull; + +public class MonsterMeta extends PathfinderMobMeta { + + protected MonsterMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/PiglinBruteMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/PiglinBruteMeta.java new file mode 100644 index 000000000..ad3bb28d2 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/PiglinBruteMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.monster; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class PiglinBruteMeta extends BasePiglinMeta { + + public PiglinBruteMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/PiglinMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/PiglinMeta.java new file mode 100644 index 000000000..609b77690 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/PiglinMeta.java @@ -0,0 +1,47 @@ +package net.minestom.server.entity.metadata.monster; + +import net.minestom.server.collision.BoundingBox; +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class PiglinMeta extends BasePiglinMeta { + + public PiglinMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isBaby() { + return super.metadata.getIndex((byte) 16, false); + } + + public void setBaby(boolean value) { + if (isBaby() == value) { + return; + } + BoundingBox bb = this.entity.getBoundingBox(); + if (value) { + setBoundingBox(bb.getWidth() / 2, bb.getHeight() / 2); + } else { + setBoundingBox(bb.getWidth() * 2, bb.getHeight() * 2); + } + super.metadata.setIndex((byte) 16, Metadata.Boolean(value)); + } + + public boolean isChargingCrossbow() { + return super.metadata.getIndex((byte) 17, false); + } + + public void setChargingCrossbow(boolean value) { + super.metadata.setIndex((byte) 17, Metadata.Boolean(value)); + } + + public boolean isDancing() { + return super.metadata.getIndex((byte) 18, false); + } + + public void setDancing(boolean value) { + super.metadata.setIndex((byte) 18, Metadata.Boolean(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/SilverfishMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/SilverfishMeta.java new file mode 100644 index 000000000..fc9b06439 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/SilverfishMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.monster; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class SilverfishMeta extends MonsterMeta { + + public SilverfishMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/SpiderMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/SpiderMeta.java new file mode 100644 index 000000000..c2183216a --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/SpiderMeta.java @@ -0,0 +1,25 @@ +package net.minestom.server.entity.metadata.monster; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class SpiderMeta extends MonsterMeta { + + private final static byte MASK_INDEX = 15; + + private final static byte CLIMBING_BIT = 0x01; + + public SpiderMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isClimbing() { + return getMaskBit(MASK_INDEX, CLIMBING_BIT); + } + + public void setClimbing(boolean value) { + setMaskBit(MASK_INDEX, CLIMBING_BIT, value); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/VexMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/VexMeta.java new file mode 100644 index 000000000..7891fa5a6 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/VexMeta.java @@ -0,0 +1,25 @@ +package net.minestom.server.entity.metadata.monster; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class VexMeta extends MonsterMeta { + + private final static byte MASK_INDEX = 15; + + private final static byte ATTACKING_BIT = 0x01; + + public VexMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isAttacking() { + return getMaskBit(MASK_INDEX, ATTACKING_BIT); + } + + public void setAttacking(boolean value) { + setMaskBit(MASK_INDEX, ATTACKING_BIT, value); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/WitherMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/WitherMeta.java new file mode 100644 index 000000000..959df41c4 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/WitherMeta.java @@ -0,0 +1,56 @@ +package net.minestom.server.entity.metadata.monster; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class WitherMeta extends MonsterMeta { + + private Entity centerHead; + private Entity leftHead; + private Entity rightHead; + + public WitherMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + @Nullable + public Entity getCenterHead() { + return this.centerHead; + } + + public void setCenterHead(@Nullable Entity value) { + this.centerHead = value; + super.metadata.setIndex((byte) 15, Metadata.VarInt(value == null ? 0 : value.getEntityId())); + } + + @Nullable + public Entity getLeftHead() { + return this.leftHead; + } + + public void setLeftHead(@Nullable Entity value) { + this.leftHead = value; + super.metadata.setIndex((byte) 16, Metadata.VarInt(value == null ? 0 : value.getEntityId())); + } + + @Nullable + public Entity getRightHead() { + return this.rightHead; + } + + public void setRightHead(@Nullable Entity value) { + this.rightHead = value; + super.metadata.setIndex((byte) 17, Metadata.VarInt(value == null ? 0 : value.getEntityId())); + } + + public int getInvulnerableTime() { + return super.metadata.getIndex((byte) 18, 0); + } + + public void setInvulnerableTime(int value) { + super.metadata.setIndex((byte) 18, Metadata.VarInt(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/ZoglinMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/ZoglinMeta.java new file mode 100644 index 000000000..212f60fde --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/ZoglinMeta.java @@ -0,0 +1,31 @@ +package net.minestom.server.entity.metadata.monster; + +import net.minestom.server.collision.BoundingBox; +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class ZoglinMeta extends MonsterMeta { + + public ZoglinMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isBaby() { + return super.metadata.getIndex((byte) 15, false); + } + + public void setBaby(boolean value) { + if (isBaby() == value) { + return; + } + BoundingBox bb = this.entity.getBoundingBox(); + if (value) { + setBoundingBox(bb.getWidth() / 2, bb.getHeight() / 2); + } else { + setBoundingBox(bb.getWidth() * 2, bb.getHeight() * 2); + } + super.metadata.setIndex((byte) 15, Metadata.Boolean(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/raider/AbstractIllagerMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/raider/AbstractIllagerMeta.java new file mode 100644 index 000000000..3f137d6d7 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/raider/AbstractIllagerMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.monster.raider; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class AbstractIllagerMeta extends RaiderMeta { + + protected AbstractIllagerMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/raider/EvokerMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/raider/EvokerMeta.java new file mode 100644 index 000000000..158dd4fe7 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/raider/EvokerMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.monster.raider; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class EvokerMeta extends SpellcasterIllagerMeta { + + public EvokerMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/raider/IllusionerMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/raider/IllusionerMeta.java new file mode 100644 index 000000000..2e68e9882 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/raider/IllusionerMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.monster.raider; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class IllusionerMeta extends SpellcasterIllagerMeta { + + public IllusionerMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/raider/PillagerMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/raider/PillagerMeta.java new file mode 100644 index 000000000..ba9c5531f --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/raider/PillagerMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.monster.raider; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class PillagerMeta extends AbstractIllagerMeta { + + public PillagerMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/raider/RaiderMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/raider/RaiderMeta.java new file mode 100644 index 000000000..6a0428af7 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/raider/RaiderMeta.java @@ -0,0 +1,22 @@ +package net.minestom.server.entity.metadata.monster.raider; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.monster.MonsterMeta; +import org.jetbrains.annotations.NotNull; + +public class RaiderMeta extends MonsterMeta { + + protected RaiderMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isCelebrating() { + return super.metadata.getIndex((byte) 15, false); + } + + public void setCelebrating(boolean value) { + super.metadata.setIndex((byte) 15, Metadata.Boolean(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/raider/RavagerMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/raider/RavagerMeta.java new file mode 100644 index 000000000..cd7c08516 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/raider/RavagerMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.monster.raider; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class RavagerMeta extends RaiderMeta { + + public RavagerMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/raider/SpellcasterIllagerMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/raider/SpellcasterIllagerMeta.java new file mode 100644 index 000000000..0fe9a1f68 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/raider/SpellcasterIllagerMeta.java @@ -0,0 +1,33 @@ +package net.minestom.server.entity.metadata.monster.raider; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class SpellcasterIllagerMeta extends AbstractIllagerMeta { + + protected SpellcasterIllagerMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + @NotNull + public Spell getSpell() { + return Spell.VALUES[super.metadata.getIndex((byte) 16, (byte) 0)]; + } + + public void setSpell(@NotNull Spell spell) { + super.metadata.setIndex((byte) 16, Metadata.Byte((byte) spell.ordinal())); + } + + public enum Spell { + NONE, + SUMMON_VEX, + ATTACK, + WOLOLO, + DISAPPEAR, + BLINDNESS; + + private final static Spell[] VALUES = values(); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/raider/VindicatorMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/raider/VindicatorMeta.java new file mode 100644 index 000000000..76d25086d --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/raider/VindicatorMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.monster.raider; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class VindicatorMeta extends AbstractIllagerMeta { + + public VindicatorMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/raider/WitchMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/raider/WitchMeta.java new file mode 100644 index 000000000..3454caff6 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/raider/WitchMeta.java @@ -0,0 +1,21 @@ +package net.minestom.server.entity.metadata.monster.raider; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class WitchMeta extends RaiderMeta { + + public WitchMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isDrinkingPotion() { + return super.metadata.getIndex((byte) 16, false); + } + + public void setDrinkingPotion(boolean value) { + super.metadata.setIndex((byte) 16, Metadata.Boolean(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/skeleton/AbstractSkeletonMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/skeleton/AbstractSkeletonMeta.java new file mode 100644 index 000000000..053f63547 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/skeleton/AbstractSkeletonMeta.java @@ -0,0 +1,14 @@ +package net.minestom.server.entity.metadata.monster.skeleton; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.monster.MonsterMeta; +import org.jetbrains.annotations.NotNull; + +public class AbstractSkeletonMeta extends MonsterMeta { + + protected AbstractSkeletonMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/skeleton/SkeletonMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/skeleton/SkeletonMeta.java new file mode 100644 index 000000000..e0abb8643 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/skeleton/SkeletonMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.monster.skeleton; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class SkeletonMeta extends AbstractSkeletonMeta { + + public SkeletonMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/skeleton/StrayMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/skeleton/StrayMeta.java new file mode 100644 index 000000000..261079ab8 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/skeleton/StrayMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.monster.skeleton; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class StrayMeta extends AbstractSkeletonMeta { + + public StrayMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/skeleton/WitherSkeletonMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/skeleton/WitherSkeletonMeta.java new file mode 100644 index 000000000..4f9f83317 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/skeleton/WitherSkeletonMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.monster.skeleton; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class WitherSkeletonMeta extends AbstractSkeletonMeta { + + public WitherSkeletonMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/zombie/DrownedMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/zombie/DrownedMeta.java new file mode 100644 index 000000000..a6101e304 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/zombie/DrownedMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.monster.zombie; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class DrownedMeta extends ZombieMeta { + + public DrownedMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/zombie/HuskMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/zombie/HuskMeta.java new file mode 100644 index 000000000..4f530a8a7 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/zombie/HuskMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.monster.zombie; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class HuskMeta extends ZombieMeta { + + public HuskMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/zombie/ZombieMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/zombie/ZombieMeta.java new file mode 100644 index 000000000..218fc0449 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/zombie/ZombieMeta.java @@ -0,0 +1,40 @@ +package net.minestom.server.entity.metadata.monster.zombie; + +import net.minestom.server.collision.BoundingBox; +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.monster.MonsterMeta; +import org.jetbrains.annotations.NotNull; + +public class ZombieMeta extends MonsterMeta { + + public ZombieMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isBaby() { + return super.metadata.getIndex((byte) 15, false); + } + + public void setBaby(boolean value) { + if (isBaby() == value) { + return; + } + BoundingBox bb = this.entity.getBoundingBox(); + if (value) { + setBoundingBox(bb.getWidth() / 2, bb.getHeight() / 2); + } else { + setBoundingBox(bb.getWidth() * 2, bb.getHeight() * 2); + } + super.metadata.setIndex((byte) 15, Metadata.Boolean(value)); + } + + public boolean isBecomingDrowned() { + return super.metadata.getIndex((byte) 17, false); + } + + public void setBecomingDrowned(boolean value) { + super.metadata.setIndex((byte) 17, Metadata.Boolean(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/zombie/ZombieVillagerMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/zombie/ZombieVillagerMeta.java new file mode 100644 index 000000000..5d5072d45 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/zombie/ZombieVillagerMeta.java @@ -0,0 +1,38 @@ +package net.minestom.server.entity.metadata.monster.zombie; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.villager.VillagerMeta; +import org.jetbrains.annotations.NotNull; + +public class ZombieVillagerMeta extends ZombieMeta { + + public ZombieVillagerMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isConverting() { + return super.metadata.getIndex((byte) 18, false); + } + + public void setConverting(boolean value) { + super.metadata.setIndex((byte) 18, Metadata.Boolean(value)); + } + + public VillagerMeta.VillagerData getVillagerData() { + int[] data = super.metadata.getIndex((byte) 17, null); + if (data == null) { + return new VillagerMeta.VillagerData(VillagerMeta.Type.PLAINS, VillagerMeta.Profession.NONE, VillagerMeta.Level.NOVICE); + } + return new VillagerMeta.VillagerData(VillagerMeta.Type.VALUES[data[0]], VillagerMeta.Profession.VALUES[data[1]], VillagerMeta.Level.VALUES[data[2] - 1]); + } + + public void setVillagerData(VillagerMeta.VillagerData data) { + super.metadata.setIndex((byte) 17, Metadata.VillagerData( + data.getType().ordinal(), + data.getProfession().ordinal(), + data.getLevel().ordinal() + 1 + )); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/monster/zombie/ZombifiedPiglinMeta.java b/src/main/java/net/minestom/server/entity/metadata/monster/zombie/ZombifiedPiglinMeta.java new file mode 100644 index 000000000..775de78c6 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/monster/zombie/ZombifiedPiglinMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.monster.zombie; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class ZombifiedPiglinMeta extends ZombieMeta { + + public ZombifiedPiglinMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/other/AreaEffectCloudMeta.java b/src/main/java/net/minestom/server/entity/metadata/other/AreaEffectCloudMeta.java new file mode 100644 index 000000000..7ca62378d --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/other/AreaEffectCloudMeta.java @@ -0,0 +1,46 @@ +package net.minestom.server.entity.metadata.other; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.EntityMeta; +import org.jetbrains.annotations.NotNull; + +public class AreaEffectCloudMeta extends EntityMeta { + + public AreaEffectCloudMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public float getRadius() { + return super.metadata.getIndex((byte) 7, .5F); + } + + public void setRadius(float value) { + super.metadata.setIndex((byte) 7, Metadata.Float(value)); + } + + public int getColor() { + return super.metadata.getIndex((byte) 8, 0); + } + + public void setColor(int value) { + super.metadata.setIndex((byte) 8, Metadata.VarInt(value)); + } + + public boolean isSinglePoint() { + return super.metadata.getIndex((byte) 9, false); + } + + public void setSinglePoint(boolean value) { + super.metadata.setIndex((byte) 9, Metadata.Boolean(value)); + } + +// public ParticleWrapper getParticle() { +// return super.metadata.getIndex((byte) 10, new ParticleWrapper(Particle.EFFECT, null)); +// } +// +// public void setParticle(ParticleWrapper value) { +// super.metadata.setIndex((byte) 11, Metadata.Particle(value)); +// } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/other/ArmorStandMeta.java b/src/main/java/net/minestom/server/entity/metadata/other/ArmorStandMeta.java new file mode 100644 index 000000000..ae7d8a6b0 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/other/ArmorStandMeta.java @@ -0,0 +1,108 @@ +package net.minestom.server.entity.metadata.other; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.LivingEntityMeta; +import net.minestom.server.utils.Vector; +import org.jetbrains.annotations.NotNull; + +public class ArmorStandMeta extends LivingEntityMeta { + + private final static byte MASK_INDEX = 14; + + private final static byte IS_SMALL_BIT = 0x01; + private final static byte HAS_ARMS_BIT = 0x04; + private final static byte HAS_NO_BASE_PLATE_BIT = 0x08; + private final static byte IS_MARKER_BIT = 0x10; + + public ArmorStandMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isSmall() { + return getMaskBit(MASK_INDEX, IS_SMALL_BIT); + } + + public void setSmall(boolean value) { + setMaskBit(MASK_INDEX, IS_SMALL_BIT, value); + } + + public boolean isHasArms() { + return getMaskBit(MASK_INDEX, HAS_ARMS_BIT); + } + + public void setHasArms(boolean value) { + setMaskBit(MASK_INDEX, HAS_ARMS_BIT, value); + } + + public boolean isHasNoBasePlate() { + return getMaskBit(MASK_INDEX, HAS_NO_BASE_PLATE_BIT); + } + + public void setHasNoBasePlate(boolean value) { + setMaskBit(MASK_INDEX, HAS_NO_BASE_PLATE_BIT, value); + } + + public boolean isMarker() { + return getMaskBit(MASK_INDEX, IS_MARKER_BIT); + } + + public void setMarker(boolean value) { + setMaskBit(MASK_INDEX, IS_MARKER_BIT, value); + } + + @NotNull + public Vector getHeadRotation() { + return super.metadata.getIndex((byte) 15, new Vector(0D, 0D, 0D)); + } + + public void setHeadRotation(@NotNull Vector value) { + super.metadata.setIndex((byte) 15, Metadata.Rotation(value)); + } + + @NotNull + public Vector getBodyRotation() { + return super.metadata.getIndex((byte) 16, new Vector(0D, 0D, 0D)); + } + + public void setBodyRotation(@NotNull Vector value) { + super.metadata.setIndex((byte) 16, Metadata.Rotation(value)); + } + + @NotNull + public Vector getLeftArmRotation() { + return super.metadata.getIndex((byte) 17, new Vector(-10D, 0D, -10D)); + } + + public void setLeftArmRotation(@NotNull Vector value) { + super.metadata.setIndex((byte) 17, Metadata.Rotation(value)); + } + + @NotNull + public Vector getRightArmRotation() { + return super.metadata.getIndex((byte) 18, new Vector(-15D, 0D, 10D)); + } + + public void setRightArmRotation(@NotNull Vector value) { + super.metadata.setIndex((byte) 18, Metadata.Rotation(value)); + } + + @NotNull + public Vector getLeftLegRotation() { + return super.metadata.getIndex((byte) 19, new Vector(-1D, 0D, -1D)); + } + + public void setLeftLegRotation(@NotNull Vector value) { + super.metadata.setIndex((byte) 19, Metadata.Rotation(value)); + } + + @NotNull + public Vector getRightLegRotation() { + return super.metadata.getIndex((byte) 20, new Vector(1D, 0D, 1D)); + } + + public void setRightLegRotation(@NotNull Vector value) { + super.metadata.setIndex((byte) 20, Metadata.Rotation(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/other/BoatMeta.java b/src/main/java/net/minestom/server/entity/metadata/other/BoatMeta.java new file mode 100644 index 000000000..6a3b5a8f3 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/other/BoatMeta.java @@ -0,0 +1,82 @@ +package net.minestom.server.entity.metadata.other; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.EntityMeta; +import org.jetbrains.annotations.NotNull; + +public class BoatMeta extends EntityMeta { + + public BoatMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public int getTimeSinceLastHit() { + return super.metadata.getIndex((byte) 7, 0); + } + + public void setTimeSinceLastHit(int value) { + super.metadata.setIndex((byte) 7, Metadata.VarInt(value)); + } + + public int getForwardDirection() { + return super.metadata.getIndex((byte) 8, 1); + } + + public void setForwardDirection(int value) { + super.metadata.setIndex((byte) 8, Metadata.VarInt(value)); + } + + public float getDamageTaken() { + return super.metadata.getIndex((byte) 9, 0); + } + + public void setDamageTaken(float value) { + super.metadata.setIndex((byte) 9, Metadata.Float(value)); + } + + @NotNull + public Type getType() { + return Type.VALUES[super.metadata.getIndex((byte) 10, 0)]; + } + + public void setType(@NotNull Type value) { + super.metadata.setIndex((byte) 10, Metadata.VarInt(value.ordinal())); + } + + public boolean isLeftPaddleTurning() { + return super.metadata.getIndex((byte) 11, false); + } + + public void setLeftPaddleTurning(boolean value) { + super.metadata.setIndex((byte) 11, Metadata.Boolean(value)); + } + + public boolean isRightPaddleTurning() { + return super.metadata.getIndex((byte) 12, false); + } + + public void setRightPaddleTurning(boolean value) { + super.metadata.setIndex((byte) 12, Metadata.Boolean(value)); + } + + public int getSplashTimer() { + return super.metadata.getIndex((byte) 13, 0); + } + + public void setSplashTimer(int value) { + super.metadata.setIndex((byte) 13, Metadata.VarInt(value)); + } + + public enum Type { + OAK, + SPRUCE, + BIRCH, + JUNGLE, + ACACIA, + DARK_OAK; + + private final static Type[] VALUES = values(); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/other/DragonFireballMeta.java b/src/main/java/net/minestom/server/entity/metadata/other/DragonFireballMeta.java new file mode 100644 index 000000000..27abf9d32 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/other/DragonFireballMeta.java @@ -0,0 +1,37 @@ +package net.minestom.server.entity.metadata.other; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.EntityMeta; +import net.minestom.server.entity.metadata.ObjectDataProvider; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class DragonFireballMeta extends EntityMeta implements ObjectDataProvider { + + private Entity shooter; + + public DragonFireballMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + @Nullable + public Entity getShooter() { + return shooter; + } + + public void setShooter(@Nullable Entity shooter) { + this.shooter = shooter; + } + + @Override + public int getObjectData() { + return this.shooter == null ? 0 : this.shooter.getEntityId(); + } + + @Override + public boolean requiresVelocityPacketAtSpawn() { + return true; + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/other/EndCrystalMeta.java b/src/main/java/net/minestom/server/entity/metadata/other/EndCrystalMeta.java new file mode 100644 index 000000000..df111b35e --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/other/EndCrystalMeta.java @@ -0,0 +1,33 @@ +package net.minestom.server.entity.metadata.other; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.EntityMeta; +import net.minestom.server.utils.BlockPosition; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class EndCrystalMeta extends EntityMeta { + + public EndCrystalMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + @Nullable + public BlockPosition getBeamTarget() { + return super.metadata.getIndex((byte) 7, null); + } + + public void setBeamTarget(@Nullable BlockPosition value) { + super.metadata.setIndex((byte) 7, Metadata.OptPosition(value)); + } + + public boolean isShowingBottom() { + return super.metadata.getIndex((byte) 8, true); + } + + public void setShowingBottom(boolean value) { + super.metadata.setIndex((byte) 8, Metadata.Boolean(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/other/EnderDragonMeta.java b/src/main/java/net/minestom/server/entity/metadata/other/EnderDragonMeta.java new file mode 100644 index 000000000..fa1d6f308 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/other/EnderDragonMeta.java @@ -0,0 +1,39 @@ +package net.minestom.server.entity.metadata.other; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.MobMeta; +import org.jetbrains.annotations.NotNull; + +public class EnderDragonMeta extends MobMeta { + + public EnderDragonMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + @NotNull + public Phase getPhase() { + return Phase.VALUES[super.metadata.getIndex((byte) 15, 0)]; + } + + public void setPhase(@NotNull Phase value) { + super.metadata.getIndex((byte) 15, Metadata.VarInt(value.ordinal())); + } + + public enum Phase { + CIRCLING, + STRAFING, + FLYING_TO_THE_PORTAL, + LANDING_ON_THE_PORTAL, + TAKING_OFF_FROM_THE_PORTAL, + BREATH_ATTACK, + LOOKING_FOR_BREATH_ATTACK_PLAYER, + ROAR, + CHARGING_PLAYER, + FLYING_TO_THE_PORTAL_TO_DIE, + HOVERING_WITHOUT_AI; + + private final static Phase[] VALUES = values(); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/other/EvokerFangsMeta.java b/src/main/java/net/minestom/server/entity/metadata/other/EvokerFangsMeta.java new file mode 100644 index 000000000..ab57d071d --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/other/EvokerFangsMeta.java @@ -0,0 +1,14 @@ +package net.minestom.server.entity.metadata.other; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.EntityMeta; +import org.jetbrains.annotations.NotNull; + +public class EvokerFangsMeta extends EntityMeta { + + public EvokerFangsMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/other/ExperienceOrbMeta.java b/src/main/java/net/minestom/server/entity/metadata/other/ExperienceOrbMeta.java new file mode 100644 index 000000000..08076974c --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/other/ExperienceOrbMeta.java @@ -0,0 +1,29 @@ +package net.minestom.server.entity.metadata.other; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.EntityMeta; +import org.jetbrains.annotations.NotNull; + +public class ExperienceOrbMeta extends EntityMeta { + + private int count = 1; + + public ExperienceOrbMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public int getCount() { + return count; + } + + /** + * Sets count of orbs. + * This is possible only before spawn packet is sent. + * + * @param count count of orbs. + */ + public void setCount(int count) { + this.count = count; + } +} diff --git a/src/main/java/net/minestom/server/entity/metadata/other/FallingBlockMeta.java b/src/main/java/net/minestom/server/entity/metadata/other/FallingBlockMeta.java new file mode 100644 index 000000000..94a6e36b3 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/other/FallingBlockMeta.java @@ -0,0 +1,55 @@ +package net.minestom.server.entity.metadata.other; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.EntityMeta; +import net.minestom.server.entity.metadata.ObjectDataProvider; +import net.minestom.server.instance.block.Block; +import net.minestom.server.utils.BlockPosition; +import org.jetbrains.annotations.NotNull; + +public class FallingBlockMeta extends EntityMeta implements ObjectDataProvider { + + private Block block = Block.STONE; + + public FallingBlockMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public BlockPosition getSpawnPosition() { + return super.metadata.getIndex((byte) 7, new BlockPosition(0, 0, 0)); + } + + public void setSpawnPosition(BlockPosition value) { + super.metadata.setIndex((byte) 7, Metadata.Position(value)); + } + + @NotNull + public Block getBlock() { + return block; + } + + /** + * Sets which block to display. + * This is possible only before spawn packet is sent. + * + * @param block which block to display. + */ + public void setBlock(@NotNull Block block) { + this.block = block; + } + + @SuppressWarnings("ConstantConditions") + @Override + public int getObjectData() { + int id = this.block.getBlockId(); + int metadata = 0; // TODO ? + return id | (metadata << 12); + } + + @Override + public boolean requiresVelocityPacketAtSpawn() { + return false; + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/other/FireworkRocketMeta.java b/src/main/java/net/minestom/server/entity/metadata/other/FireworkRocketMeta.java new file mode 100644 index 000000000..4dd141292 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/other/FireworkRocketMeta.java @@ -0,0 +1,46 @@ +package net.minestom.server.entity.metadata.other; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.EntityMeta; +import net.minestom.server.item.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class FireworkRocketMeta extends EntityMeta { + + private Entity shooter; + + public FireworkRocketMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + @NotNull + public ItemStack getFireworkInfo() { + return super.metadata.getIndex((byte) 7, ItemStack.getAirItem()); + } + + public void setFireworkInfo(@NotNull ItemStack value) { + super.metadata.setIndex((byte) 7, Metadata.Slot(value)); + } + + @Nullable + public Entity getShooter() { + return this.shooter; + } + + public void setShooter(@Nullable Entity value) { + this.shooter = value; + Integer entityID = value == null ? null : value.getEntityId(); + super.metadata.setIndex((byte) 8, Metadata.OptVarInt(entityID)); + } + + public boolean isShotAtAngle() { + return super.metadata.getIndex((byte) 9, false); + } + + public void setShotAtAngle(boolean value) { + super.metadata.setIndex((byte) 9, Metadata.Boolean(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/other/FishingHookMeta.java b/src/main/java/net/minestom/server/entity/metadata/other/FishingHookMeta.java new file mode 100644 index 000000000..7f824143b --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/other/FishingHookMeta.java @@ -0,0 +1,36 @@ +package net.minestom.server.entity.metadata.other; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.EntityMeta; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class FishingHookMeta extends EntityMeta { + + private Entity hooked; + + public FishingHookMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + @Nullable + public Entity getHookedEntity() { + return this.hooked; + } + + public void setHookedEntity(@Nullable Entity value) { + this.hooked = value; + int entityID = value == null ? 0 : value.getEntityId() + 1; + super.metadata.setIndex((byte) 7, Metadata.VarInt(entityID)); + } + + public boolean isCatchable() { + return super.metadata.getIndex((byte) 8, false); + } + + public void setCatchable(boolean value) { + super.metadata.setIndex((byte) 8, Metadata.Boolean(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/other/ItemFrameMeta.java b/src/main/java/net/minestom/server/entity/metadata/other/ItemFrameMeta.java new file mode 100644 index 000000000..b4d0e2f68 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/other/ItemFrameMeta.java @@ -0,0 +1,72 @@ +package net.minestom.server.entity.metadata.other; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.EntityMeta; +import net.minestom.server.entity.metadata.ObjectDataProvider; +import net.minestom.server.item.ItemStack; +import net.minestom.server.utils.Rotation; +import org.jetbrains.annotations.NotNull; + +public class ItemFrameMeta extends EntityMeta implements ObjectDataProvider { + + private Orientation orientation; + + public ItemFrameMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + this.orientation = Orientation.DOWN; + } + + @NotNull + public ItemStack getItem() { + return super.metadata.getIndex((byte) 7, ItemStack.getAirItem()); + } + + public void setItem(@NotNull ItemStack value) { + super.metadata.setIndex((byte) 7, Metadata.Slot(value)); + } + + @NotNull + public Rotation getRotation() { + return Rotation.values()[super.metadata.getIndex((byte) 8, 0)]; + } + + public void setRotation(@NotNull Rotation value) { + super.metadata.setIndex((byte) 8, Metadata.VarInt(value.ordinal())); + } + + @NotNull + public Orientation getOrientation() { + return this.orientation; + } + + /** + * Sets orientation of the item frame. + * This is possible only before spawn packet is sent. + * + * @param orientation the orientation of the item frame. + */ + public void setOrientation(@NotNull Orientation orientation) { + this.orientation = orientation; + } + + @Override + public int getObjectData() { + return this.orientation.ordinal(); + } + + @Override + public boolean requiresVelocityPacketAtSpawn() { + return false; + } + + public enum Orientation { + DOWN, + UP, + NORTH, + SOUTH, + WEST, + EAST + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/other/LeashKnotMeta.java b/src/main/java/net/minestom/server/entity/metadata/other/LeashKnotMeta.java new file mode 100644 index 000000000..0d5c3e753 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/other/LeashKnotMeta.java @@ -0,0 +1,14 @@ +package net.minestom.server.entity.metadata.other; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.EntityMeta; +import org.jetbrains.annotations.NotNull; + +public class LeashKnotMeta extends EntityMeta { + + public LeashKnotMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/other/LightningBoltMeta.java b/src/main/java/net/minestom/server/entity/metadata/other/LightningBoltMeta.java new file mode 100644 index 000000000..ab3522e30 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/other/LightningBoltMeta.java @@ -0,0 +1,14 @@ +package net.minestom.server.entity.metadata.other; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.EntityMeta; +import org.jetbrains.annotations.NotNull; + +public class LightningBoltMeta extends EntityMeta { + + public LightningBoltMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/other/LlamaSpitMeta.java b/src/main/java/net/minestom/server/entity/metadata/other/LlamaSpitMeta.java new file mode 100644 index 000000000..e3b313dd0 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/other/LlamaSpitMeta.java @@ -0,0 +1,25 @@ +package net.minestom.server.entity.metadata.other; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.EntityMeta; +import net.minestom.server.entity.metadata.ObjectDataProvider; +import org.jetbrains.annotations.NotNull; + +public class LlamaSpitMeta extends EntityMeta implements ObjectDataProvider { + + public LlamaSpitMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + @Override + public int getObjectData() { + return 0; + } + + @Override + public boolean requiresVelocityPacketAtSpawn() { + return true; + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/other/MagmaCubeMeta.java b/src/main/java/net/minestom/server/entity/metadata/other/MagmaCubeMeta.java new file mode 100644 index 000000000..e70d7c6c2 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/other/MagmaCubeMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.other; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class MagmaCubeMeta extends SlimeMeta { + + public MagmaCubeMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/other/PaintingMeta.java b/src/main/java/net/minestom/server/entity/metadata/other/PaintingMeta.java new file mode 100644 index 000000000..de1318ad2 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/other/PaintingMeta.java @@ -0,0 +1,128 @@ +package net.minestom.server.entity.metadata.other; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.EntityMeta; +import net.minestom.server.utils.Direction; +import net.minestom.server.utils.validate.Check; +import org.jetbrains.annotations.NotNull; + +import java.util.Locale; + +public class PaintingMeta extends EntityMeta { + + private Motive motive = Motive.KEBAB; + private Direction direction = Direction.SOUTH; + + public PaintingMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + @NotNull + public Motive getMotive() { + return motive; + } + + /** + * Sets motive of a painting. + * This is possible only before spawn packet is sent. + * + * @param motive motive of a painting. + */ + public void setMotive(@NotNull Motive motive) { + this.motive = motive; + } + + @NotNull + public Direction getDirection() { + return direction; + } + + /** + * Sets direction of a painting. + * This is possible only before spawn packet is sent. + * + * @param direction direction of a painting. + */ + public void setDirection(@NotNull Direction direction) { + Check.argCondition(direction == Direction.UP || direction == Direction.DOWN, "Painting can't look up or down!"); + this.direction = direction; + } + + /* + TODO: write a parser? + Currently none of existing ones support it. + */ + public enum Motive { + KEBAB(0, 0, 16, 16), + AZTEC(16, 0, 16, 16), + ALBAN(32, 0, 16, 16), + AZTEC2(48, 0, 16, 16), + BOMB(64, 0, 16, 16), + PLANT(80, 0, 16, 16), + WASTELAND(96, 0, 16, 16), + POOL(0, 32, 32, 16), + COURBET(32, 32, 32, 16), + SEA(64, 32, 32, 16), + SUNSET(96, 32, 32, 16), + CREEBET(128, 32, 32, 16), + WANDERER(0, 64, 16, 32), + GRAHAM(16, 64, 16, 32), + MATCH(0, 128, 32, 32), + BUST(32, 128, 32, 32), + STAGE(64, 128, 32, 32), + VOID(96, 128, 32, 32), + SKULL_AND_ROSES("skull_and_roses", 128, 128, 32, 32), + WITHER(160, 128, 32, 32), + FIGHTERS(0, 96, 64, 32), + POINTER(0, 192, 64, 64), + PIGSCENE(64, 192, 64, 64), + BURNING_SKULL(128, 192, 64, 64), + SKELETON(192, 64, 64, 48), + DONKEY_KONG(192, 112, 64, 48); + + private final String name; + private final int x; + private final int y; + private final int width; + private final int height; + + Motive(String name, int x, int y, int width, int height) { + this.name = name; + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } + + Motive(int x, int y, int width, int height) { + this.name = "minecraft:" + name().toLowerCase(Locale.ROOT); + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } + + public String getName() { + return this.name; + } + + public int getX() { + return this.x; + } + + public int getY() { + return this.y; + } + + public int getWidth() { + return this.width; + } + + public int getHeight() { + return this.height; + } + + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/other/PrimedTntMeta.java b/src/main/java/net/minestom/server/entity/metadata/other/PrimedTntMeta.java new file mode 100644 index 000000000..944eec2eb --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/other/PrimedTntMeta.java @@ -0,0 +1,22 @@ +package net.minestom.server.entity.metadata.other; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.EntityMeta; +import org.jetbrains.annotations.NotNull; + +public class PrimedTntMeta extends EntityMeta { + + public PrimedTntMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public int getFuseTime() { + return super.metadata.getIndex((byte) 7, 80); + } + + public void setFuseTime(int value) { + super.metadata.setIndex((byte) 7, Metadata.VarInt(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/other/ShulkerBulletMeta.java b/src/main/java/net/minestom/server/entity/metadata/other/ShulkerBulletMeta.java new file mode 100644 index 000000000..d19d272d1 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/other/ShulkerBulletMeta.java @@ -0,0 +1,25 @@ +package net.minestom.server.entity.metadata.other; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.EntityMeta; +import net.minestom.server.entity.metadata.ObjectDataProvider; +import org.jetbrains.annotations.NotNull; + +public class ShulkerBulletMeta extends EntityMeta implements ObjectDataProvider { + + public ShulkerBulletMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + @Override + public int getObjectData() { + return 0; + } + + @Override + public boolean requiresVelocityPacketAtSpawn() { + return true; + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/other/SlimeMeta.java b/src/main/java/net/minestom/server/entity/metadata/other/SlimeMeta.java new file mode 100644 index 000000000..495cdae82 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/other/SlimeMeta.java @@ -0,0 +1,24 @@ +package net.minestom.server.entity.metadata.other; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.MobMeta; +import org.jetbrains.annotations.NotNull; + +public class SlimeMeta extends MobMeta { + + public SlimeMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public int getSize() { + return super.metadata.getIndex((byte) 15, 0); + } + + public void setSize(int value) { + float boxSize = 0.51000005f * value; + setBoundingBox(boxSize, boxSize); + super.metadata.setIndex((byte) 15, Metadata.VarInt(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/other/TraderLlamaMeta.java b/src/main/java/net/minestom/server/entity/metadata/other/TraderLlamaMeta.java new file mode 100644 index 000000000..e4734298a --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/other/TraderLlamaMeta.java @@ -0,0 +1,14 @@ +package net.minestom.server.entity.metadata.other; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.EntityMeta; +import org.jetbrains.annotations.NotNull; + +public class TraderLlamaMeta extends EntityMeta { + + public TraderLlamaMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/other/WitherSkullMeta.java b/src/main/java/net/minestom/server/entity/metadata/other/WitherSkullMeta.java new file mode 100644 index 000000000..7f751ab12 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/other/WitherSkullMeta.java @@ -0,0 +1,45 @@ +package net.minestom.server.entity.metadata.other; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.EntityMeta; +import net.minestom.server.entity.metadata.ObjectDataProvider; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class WitherSkullMeta extends EntityMeta implements ObjectDataProvider { + + private Entity shooter; + + public WitherSkullMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isInvulnerable() { + return super.metadata.getIndex((byte) 7, false); + } + + public void setInvulnerable(boolean value) { + super.metadata.setIndex((byte) 7, Metadata.Boolean(value)); + } + + @Nullable + public Entity getShooter() { + return shooter; + } + + public void setShooter(@Nullable Entity shooter) { + this.shooter = shooter; + } + + @Override + public int getObjectData() { + return this.shooter == null ? 0 : this.shooter.getEntityId(); + } + + @Override + public boolean requiresVelocityPacketAtSpawn() { + return true; + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/villager/AbstractVillagerMeta.java b/src/main/java/net/minestom/server/entity/metadata/villager/AbstractVillagerMeta.java new file mode 100644 index 000000000..4244c4e75 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/villager/AbstractVillagerMeta.java @@ -0,0 +1,21 @@ +package net.minestom.server.entity.metadata.villager; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.AgeableMobMeta; +import org.jetbrains.annotations.NotNull; + +public class AbstractVillagerMeta extends AgeableMobMeta { + + protected AbstractVillagerMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public int getHeadShakeTimer() { + return super.metadata.getIndex((byte) 16, 0); + } + + public void setHeadShakeTimer(int value) { + super.metadata.setIndex((byte) 16, Metadata.VarInt(value)); + } +} diff --git a/src/main/java/net/minestom/server/entity/metadata/villager/VillagerMeta.java b/src/main/java/net/minestom/server/entity/metadata/villager/VillagerMeta.java new file mode 100644 index 000000000..724f65354 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/villager/VillagerMeta.java @@ -0,0 +1,113 @@ +package net.minestom.server.entity.metadata.villager; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class VillagerMeta extends AbstractVillagerMeta { + + public VillagerMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + @NotNull + public VillagerData getVillagerData() { + int[] data = super.metadata.getIndex((byte) 17, null); + if (data == null) { + return new VillagerData(Type.PLAINS, Profession.NONE, Level.NOVICE); + } + return new VillagerData(Type.VALUES[data[0]], Profession.VALUES[data[1]], Level.VALUES[data[2] - 1]); + } + + public void setVillagerData(@NotNull VillagerData data) { + super.metadata.setIndex((byte) 17, Metadata.VillagerData( + data.type.ordinal(), + data.profession.ordinal(), + data.level.ordinal() + 1 + )); + } + + public static class VillagerData { + + private Type type; + private Profession profession; + private Level level; + + public VillagerData(@NotNull Type type, @NotNull Profession profession, @NotNull Level level) { + this.type = type; + this.profession = profession; + this.level = level; + } + + @NotNull + public Type getType() { + return this.type; + } + + public void setType(@NotNull Type type) { + this.type = type; + } + + @NotNull + public Profession getProfession() { + return this.profession; + } + + public void setProfession(@NotNull Profession profession) { + this.profession = profession; + } + + @NotNull + public Level getLevel() { + return level; + } + + public void setLevel(@NotNull Level level) { + this.level = level; + } + } + + public enum Type { + DESERT, + JUNGLE, + PLAINS, + SAVANNA, + SNOW, + SWAMP, + TAIGA; + + public final static Type[] VALUES = values(); + } + + public enum Profession { + NONE, + ARMORER, + BUTCHER, + CARTOGRAPHER, + CLERIC, + FARMER, + FISHERMAN, + FLETCHER, + LEATHERWORKER, + LIBRARIAN, + NITWIT, + UNEMPLOYED, + MASON, + SHEPHERD, + TOOLSMITH, + WEAPONSMITH; + + public final static Profession[] VALUES = values(); + } + + public enum Level { + NOVICE, + APPRENTICE, + JOURNEYMAN, + EXPERT, + MASTER; + + public final static Level[] VALUES = values(); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/villager/WanderingTraderMeta.java b/src/main/java/net/minestom/server/entity/metadata/villager/WanderingTraderMeta.java new file mode 100644 index 000000000..2384b63b5 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/villager/WanderingTraderMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.villager; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class WanderingTraderMeta extends VillagerMeta { + + public WanderingTraderMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/water/DolphinMeta.java b/src/main/java/net/minestom/server/entity/metadata/water/DolphinMeta.java new file mode 100644 index 000000000..7dc4f37e7 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/water/DolphinMeta.java @@ -0,0 +1,39 @@ +package net.minestom.server.entity.metadata.water; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.utils.BlockPosition; +import org.jetbrains.annotations.NotNull; + +public class DolphinMeta extends WaterAnimalMeta { + + public DolphinMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + @NotNull + public BlockPosition getTreasurePosition() { + return super.metadata.getIndex((byte) 15, new BlockPosition(0, 0, 0)); + } + + public void setTreasurePosition(@NotNull BlockPosition value) { + super.metadata.setIndex((byte) 15, Metadata.Position(value)); + } + + public boolean isCanFindTreasure() { + return super.metadata.getIndex((byte) 16, false); + } + + public void setCanFindTreasure(boolean value) { + super.metadata.setIndex((byte) 16, Metadata.Boolean(value)); + } + + public boolean isHasFish() { + return super.metadata.getIndex((byte) 17, false); + } + + public void setHasFish(boolean value) { + super.metadata.setIndex((byte) 17, Metadata.Boolean(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/water/SquidMeta.java b/src/main/java/net/minestom/server/entity/metadata/water/SquidMeta.java new file mode 100644 index 000000000..b1c24e42d --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/water/SquidMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.water; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class SquidMeta extends WaterAnimalMeta { + + public SquidMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/water/WaterAnimalMeta.java b/src/main/java/net/minestom/server/entity/metadata/water/WaterAnimalMeta.java new file mode 100644 index 000000000..587f0c490 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/water/WaterAnimalMeta.java @@ -0,0 +1,14 @@ +package net.minestom.server.entity.metadata.water; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.PathfinderMobMeta; +import org.jetbrains.annotations.NotNull; + +public class WaterAnimalMeta extends PathfinderMobMeta { + + protected WaterAnimalMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/water/fish/AbstractFishMeta.java b/src/main/java/net/minestom/server/entity/metadata/water/fish/AbstractFishMeta.java new file mode 100644 index 000000000..c62455368 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/water/fish/AbstractFishMeta.java @@ -0,0 +1,21 @@ +package net.minestom.server.entity.metadata.water.fish; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.water.WaterAnimalMeta; +import org.jetbrains.annotations.NotNull; + +public class AbstractFishMeta extends WaterAnimalMeta { + + protected AbstractFishMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public boolean isFromBucket() { + return super.metadata.getIndex((byte) 15, false); + } + + public void setFromBucket(boolean value) { + super.metadata.setIndex((byte) 15, Metadata.Boolean(value)); + } +} diff --git a/src/main/java/net/minestom/server/entity/metadata/water/fish/CodMeta.java b/src/main/java/net/minestom/server/entity/metadata/water/fish/CodMeta.java new file mode 100644 index 000000000..5add05569 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/water/fish/CodMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.water.fish; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class CodMeta extends AbstractFishMeta { + + public CodMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/water/fish/PufferfishMeta.java b/src/main/java/net/minestom/server/entity/metadata/water/fish/PufferfishMeta.java new file mode 100644 index 000000000..591ebe110 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/water/fish/PufferfishMeta.java @@ -0,0 +1,45 @@ +package net.minestom.server.entity.metadata.water.fish; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class PufferfishMeta extends AbstractFishMeta { + + public PufferfishMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + updateBoundingBox(State.UNPUFFED); + } + + public State getState() { + return State.VALUES[super.metadata.getIndex((byte) 16, 0)]; + } + + public void setState(State state) { + super.metadata.setIndex((byte) 16, Metadata.VarInt(state.ordinal())); + updateBoundingBox(state); + } + + private void updateBoundingBox(State state) { + switch (state) { + case UNPUFFED: + setBoundingBox(.35D, .35D); + break; + case SEMI_PUFFED: + setBoundingBox(.5D, .5D); + break; + default: + setBoundingBox(.7D, .7D); + break; + } + } + + public enum State { + UNPUFFED, + SEMI_PUFFED, + FULLY_PUFFED; + + private final static State[] VALUES = values(); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/water/fish/SalmonMeta.java b/src/main/java/net/minestom/server/entity/metadata/water/fish/SalmonMeta.java new file mode 100644 index 000000000..2b57af49c --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/water/fish/SalmonMeta.java @@ -0,0 +1,13 @@ +package net.minestom.server.entity.metadata.water.fish; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import org.jetbrains.annotations.NotNull; + +public class SalmonMeta extends AbstractFishMeta { + + public SalmonMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + +} diff --git a/src/main/java/net/minestom/server/entity/metadata/water/fish/TropicalFishMeta.java b/src/main/java/net/minestom/server/entity/metadata/water/fish/TropicalFishMeta.java new file mode 100644 index 000000000..9cae81e02 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/metadata/water/fish/TropicalFishMeta.java @@ -0,0 +1,125 @@ +package net.minestom.server.entity.metadata.water.fish; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.ObjectDataProvider; +import org.jetbrains.annotations.NotNull; + +public class TropicalFishMeta extends AbstractFishMeta implements ObjectDataProvider { + + public TropicalFishMeta(@NotNull Entity entity, @NotNull Metadata metadata) { + super(entity, metadata); + } + + public Variant getVariant() { + return getVariantFromID(super.metadata.getIndex((byte) 16, 0)); + } + + public void setVariant(Variant variant) { + super.metadata.setIndex((byte) 16, Metadata.VarInt(getVariantID(variant))); + } + + public static int getVariantID(Variant variant) { + int id = 0; + id |= variant.patternColor; + id <<= 8; + id |= variant.bodyColor; + id <<= 8; + id |= variant.pattern.ordinal(); + id <<= 8; + id |= variant.type.ordinal(); + return id; + } + + public static Variant getVariantFromID(int variantID) { + Type type = Type.VALUES[variantID & 0xFF]; + variantID >>= 8; + Pattern pattern = Pattern.VALUES[variantID & 0xFF]; + variantID >>= 8; + byte bodyColor = (byte) (variantID & 0xFF); + variantID >>= 8; + byte patternColor = (byte) (variantID & 0xFF); + return new Variant(type, pattern, bodyColor, patternColor); + } + + @Override + public int getObjectData() { + // TODO: returns Entity ID of the owner (???) + return 0; + } + + @Override + public boolean requiresVelocityPacketAtSpawn() { + return false; + } + + public static class Variant { + + private Type type; + private Pattern pattern; + private byte bodyColor; + private byte patternColor; + + public Variant(@NotNull Type type, @NotNull Pattern pattern, byte bodyColor, byte patternColor) { + this.type = type; + this.pattern = pattern; + this.bodyColor = bodyColor; + this.patternColor = patternColor; + } + + @NotNull + public Type getType() { + return this.type; + } + + public void setType(@NotNull Type type) { + this.type = type; + } + + @NotNull + public Pattern getPattern() { + return this.pattern; + } + + public void setPattern(@NotNull Pattern pattern) { + this.pattern = pattern; + } + + public byte getBodyColor() { + return this.bodyColor; + } + + public void setBodyColor(byte bodyColor) { + this.bodyColor = bodyColor; + } + + public byte getPatternColor() { + return this.patternColor; + } + + public void setPatternColor(byte patternColor) { + this.patternColor = patternColor; + } + } + + public enum Type { + SMALL, + LARGE, + INVISIBLE; + + private final static Type[] VALUES = values(); + } + + public enum Pattern { + KOB, // FLOPPER for LARGE fish + SUNSTREAK, // STRIPEY for LARGE fish + SNOOPER, // GLITTER for LARGE fish + DASHER, // BLOCKFISH for LARGE fish + BRINELY, // BETTY for LARGE fish + SPOTTY, // CLAYFISH for LARGE fish + NONE; + + private final static Pattern[] VALUES = values(); + } + +} diff --git a/src/main/java/net/minestom/server/entity/type/Ageable.java b/src/main/java/net/minestom/server/entity/type/Ageable.java new file mode 100644 index 000000000..a402447aa --- /dev/null +++ b/src/main/java/net/minestom/server/entity/type/Ageable.java @@ -0,0 +1,9 @@ +package net.minestom.server.entity.type; + +public interface Ageable { + + boolean isBaby(); + + void setBaby(boolean value); + +} diff --git a/src/main/java/net/minestom/server/entity/type/AgeableCreature.java b/src/main/java/net/minestom/server/entity/type/AgeableCreature.java new file mode 100644 index 000000000..ace7a0078 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/type/AgeableCreature.java @@ -0,0 +1,35 @@ +package net.minestom.server.entity.type; + +import net.minestom.server.entity.EntityCreature; +import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.Metadata; +import net.minestom.server.instance.Instance; +import net.minestom.server.utils.Position; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class AgeableCreature extends EntityCreature implements Ageable { + + protected AgeableCreature(@NotNull EntityType entityType, @NotNull Position spawnPosition) { + super(entityType, spawnPosition); + } + + protected AgeableCreature(@NotNull EntityType entityType, @NotNull Position spawnPosition, @Nullable Instance instance) { + super(entityType, spawnPosition, instance); + } + + @Override + public boolean isBaby() { + return this.metadata.getIndex((byte) 15, false); + } + + @Override + public void setBaby(boolean value) { + this.metadata.setIndex((byte) 15, Metadata.Boolean(value)); + } + + @Override + public double getEyeHeight() { + return isBaby() ? super.getEyeHeight() / 2 : super.getEyeHeight(); + } +} diff --git a/src/main/java/net/minestom/server/entity/type/Animal.java b/src/main/java/net/minestom/server/entity/type/Animal.java index 994abd637..db2df4236 100644 --- a/src/main/java/net/minestom/server/entity/type/Animal.java +++ b/src/main/java/net/minestom/server/entity/type/Animal.java @@ -1,4 +1,4 @@ package net.minestom.server.entity.type; -public interface Animal { +public interface Animal extends Ageable { } diff --git a/src/main/java/net/minestom/server/entity/type/TameableAnimalCreature.java b/src/main/java/net/minestom/server/entity/type/TameableAnimalCreature.java new file mode 100644 index 000000000..186d55c80 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/type/TameableAnimalCreature.java @@ -0,0 +1,71 @@ +package net.minestom.server.entity.type; + +import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.Metadata; +import net.minestom.server.instance.Instance; +import net.minestom.server.utils.Position; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.UUID; + +public class TameableAnimalCreature extends AgeableCreature implements TameableAnimal { + + private final static byte SITTING_BIT = 0x1; + private final static byte TAMED_BIT = 0x4; + + protected TameableAnimalCreature(@NotNull EntityType entityType, @NotNull Position spawnPosition) { + super(entityType, spawnPosition); + } + + protected TameableAnimalCreature(@NotNull EntityType entityType, @NotNull Position spawnPosition, @Nullable Instance instance) { + super(entityType, spawnPosition, instance); + } + + public boolean isSitting() { + return (getMask() & SITTING_BIT) != 0; + } + + public void setSitting(boolean value) { + modifyMask(SITTING_BIT, value); + } + + public boolean isTamed() { + return (getMask() & TAMED_BIT) != 0; + } + + public void setTamed(boolean value) { + modifyMask(TAMED_BIT, value); + } + + public UUID getOwner() { + return this.metadata.getIndex((byte) 17, null); + } + + public void setOwner(UUID value) { + this.metadata.setIndex((byte) 17, Metadata.OptUUID(value)); + } + + private byte getMask() { + return this.metadata.getIndex((byte) 16, (byte) 0); + } + + private void setMask(byte mask) { + this.metadata.setIndex((byte) 16, Metadata.Byte(mask)); + } + + private void modifyMask(byte bit, boolean value) { + byte mask = getMask(); + boolean isPresent = (mask & bit) == bit; + if (isPresent == value) { + return; + } + if (value) { + mask |= bit; + } else { + mask &= ~bit; + } + setMask(mask); + } + +} diff --git a/src/main/java/net/minestom/server/entity/type/ambient/EntityBat.java b/src/main/java/net/minestom/server/entity/type/ambient/EntityBat.java deleted file mode 100644 index e039cb0bf..000000000 --- a/src/main/java/net/minestom/server/entity/type/ambient/EntityBat.java +++ /dev/null @@ -1,33 +0,0 @@ -package net.minestom.server.entity.type.ambient; - -import net.minestom.server.entity.EntityCreature; -import net.minestom.server.entity.EntityType; -import net.minestom.server.entity.Metadata; -import net.minestom.server.entity.type.Animal; -import net.minestom.server.utils.Position; - -public class EntityBat extends EntityCreature implements Animal { - - public EntityBat(Position spawnPosition) { - super(EntityType.BAT, spawnPosition); - setBoundingBox(0.5f, 0.9f, 0.5f); - } - - /** - * Gets if the bat is hanging. - * - * @return true if the bat is hanging, false otherwise - */ - public boolean isHanging() { - return metadata.getIndex((byte) 15, 0) == 1; - } - - /** - * Makes the bat hanging or cancel. - * - * @param hanging true to make the bat hanging, false otherwise - */ - public void setHanging(boolean hanging) { - this.metadata.setIndex((byte) 15, Metadata.Byte((byte) (hanging ? 1 : 0))); - } -} diff --git a/src/main/java/net/minestom/server/entity/type/animal/EntityBee.java b/src/main/java/net/minestom/server/entity/type/animal/EntityBee.java index 6a8be079f..4128ab86a 100644 --- a/src/main/java/net/minestom/server/entity/type/animal/EntityBee.java +++ b/src/main/java/net/minestom/server/entity/type/animal/EntityBee.java @@ -1,13 +1,17 @@ package net.minestom.server.entity.type.animal; -import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.type.AgeableCreature; import net.minestom.server.entity.type.Animal; import net.minestom.server.utils.Position; -public class EntityBee extends EntityCreature implements Animal { +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.animal.BeeMeta} instead. + */ +@Deprecated +public class EntityBee extends AgeableCreature implements Animal { public EntityBee(Position spawnPosition) { super(EntityType.BEE, spawnPosition); - setBoundingBox(0.7f,0.6f,0.7f); + setBoundingBox(0.7f, 0.6f, 0.7f); } } diff --git a/src/main/java/net/minestom/server/entity/type/animal/EntityCat.java b/src/main/java/net/minestom/server/entity/type/animal/EntityCat.java index 4fd48e24e..a22079b0a 100644 --- a/src/main/java/net/minestom/server/entity/type/animal/EntityCat.java +++ b/src/main/java/net/minestom/server/entity/type/animal/EntityCat.java @@ -1,13 +1,74 @@ package net.minestom.server.entity.type.animal; -import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; -import net.minestom.server.entity.type.TameableAnimal; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.type.TameableAnimalCreature; +import net.minestom.server.instance.Instance; import net.minestom.server.utils.Position; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -public class EntityCat extends EntityCreature implements TameableAnimal { - public EntityCat(Position spawnPosition) { +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.animal.tameable.CatMeta} instead. + */ +@Deprecated +public class EntityCat extends TameableAnimalCreature { + + public EntityCat(@NotNull Position spawnPosition) { super(EntityType.CAT, spawnPosition); - setBoundingBox(0.6f, 0.7f, 0.6f); + setBoundingBox(.6D, .7D, .6D); + } + + public EntityCat(@NotNull Position spawnPosition, @Nullable Instance instance) { + super(EntityType.CAT, spawnPosition, instance); + setBoundingBox(.6D, .7D, .6D); + } + + public Color getColor() { + return Color.VALUES[this.metadata.getIndex((byte) 18, 1)]; + } + + public void setColor(Color value) { + this.metadata.setIndex((byte) 18, Metadata.VarInt(value.ordinal())); + } + + public boolean isLying() { + return this.metadata.getIndex((byte) 19, false); + } + + public void setLying(boolean value) { + this.metadata.setIndex((byte) 19, Metadata.Boolean(value)); + } + + public boolean isRelaxed() { + return this.metadata.getIndex((byte) 20, false); + } + + public void setRelaxed(boolean value) { + this.metadata.setIndex((byte) 20, Metadata.Boolean(value)); + } + + public int getCollarColor() { + return this.metadata.getIndex((byte) 21, 14); + } + + public void setCollarColor(int value) { + this.metadata.setIndex((byte) 21, Metadata.VarInt(value)); + } + + public enum Color { + TABBY, + BLACK, + RED, + SIAMESE, + BRITISH_SHORTHAIR, + CALICO, + PERSIAN, + RAGDOLL, + WHITE, + JELLIE, + ALL_BLACK; + + private final static Color[] VALUES = values(); } } diff --git a/src/main/java/net/minestom/server/entity/type/animal/EntityChicken.java b/src/main/java/net/minestom/server/entity/type/animal/EntityChicken.java index 85186ff86..e7306d8a1 100644 --- a/src/main/java/net/minestom/server/entity/type/animal/EntityChicken.java +++ b/src/main/java/net/minestom/server/entity/type/animal/EntityChicken.java @@ -1,11 +1,15 @@ package net.minestom.server.entity.type.animal; -import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.type.AgeableCreature; import net.minestom.server.entity.type.Animal; import net.minestom.server.utils.Position; -public class EntityChicken extends EntityCreature implements Animal { +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.animal.ChickenMeta} instead. + */ +@Deprecated +public class EntityChicken extends AgeableCreature implements Animal { public EntityChicken(Position spawnPosition) { super(EntityType.CHICKEN, spawnPosition); setBoundingBox(0.4f, 0.7f, 0.4f); diff --git a/src/main/java/net/minestom/server/entity/type/animal/EntityCow.java b/src/main/java/net/minestom/server/entity/type/animal/EntityCow.java index 580f915e6..228a9614a 100644 --- a/src/main/java/net/minestom/server/entity/type/animal/EntityCow.java +++ b/src/main/java/net/minestom/server/entity/type/animal/EntityCow.java @@ -1,11 +1,15 @@ package net.minestom.server.entity.type.animal; -import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.type.AgeableCreature; import net.minestom.server.entity.type.Animal; import net.minestom.server.utils.Position; -public class EntityCow extends EntityCreature implements Animal { +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.animal.CowMeta} instead. + */ +@Deprecated +public class EntityCow extends AgeableCreature implements Animal { public EntityCow(Position spawnPosition) { super(EntityType.COW, spawnPosition); setBoundingBox(0.9f, 1.4f, 0.9f); diff --git a/src/main/java/net/minestom/server/entity/type/animal/EntityDolphin.java b/src/main/java/net/minestom/server/entity/type/animal/EntityDolphin.java index 419a7c5fd..56a51db92 100644 --- a/src/main/java/net/minestom/server/entity/type/animal/EntityDolphin.java +++ b/src/main/java/net/minestom/server/entity/type/animal/EntityDolphin.java @@ -1,13 +1,17 @@ package net.minestom.server.entity.type.animal; -import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.type.AgeableCreature; import net.minestom.server.entity.type.Animal; import net.minestom.server.utils.Position; -public class EntityDolphin extends EntityCreature implements Animal { +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.water.DolphinMeta} instead. + */ +@Deprecated +public class EntityDolphin extends AgeableCreature implements Animal { public EntityDolphin(Position spawnPosition) { super(EntityType.DOLPHIN, spawnPosition); - setBoundingBox(0.9f,0.6f,0.9f); + setBoundingBox(0.9f, 0.6f, 0.9f); } } diff --git a/src/main/java/net/minestom/server/entity/type/animal/EntityFox.java b/src/main/java/net/minestom/server/entity/type/animal/EntityFox.java index 86323ef25..8b79e65a6 100644 --- a/src/main/java/net/minestom/server/entity/type/animal/EntityFox.java +++ b/src/main/java/net/minestom/server/entity/type/animal/EntityFox.java @@ -1,11 +1,15 @@ package net.minestom.server.entity.type.animal; -import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.type.AgeableCreature; import net.minestom.server.entity.type.Animal; import net.minestom.server.utils.Position; -public class EntityFox extends EntityCreature implements Animal { +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.animal.FoxMeta} instead. + */ +@Deprecated +public class EntityFox extends AgeableCreature implements Animal { public EntityFox(Position spawnPosition) { super(EntityType.FOX, spawnPosition); setBoundingBox(0.6f, 0.7f, 0.6f); diff --git a/src/main/java/net/minestom/server/entity/type/animal/EntityLlama.java b/src/main/java/net/minestom/server/entity/type/animal/EntityLlama.java index 9f3891d5d..be1c1b66b 100644 --- a/src/main/java/net/minestom/server/entity/type/animal/EntityLlama.java +++ b/src/main/java/net/minestom/server/entity/type/animal/EntityLlama.java @@ -2,12 +2,26 @@ package net.minestom.server.entity.type.animal; import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; -import net.minestom.server.entity.type.Animal; +import net.minestom.server.entity.Metadata; +import net.minestom.server.instance.Instance; import net.minestom.server.utils.Position; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -public class EntityLlama extends EntityCreature implements Animal { - public EntityLlama(Position spawnPosition) { +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.animal.LlamaMeta} instead. + */ +@Deprecated +public class EntityLlama extends EntityCreature { + + public EntityLlama(@NotNull Position spawnPosition) { super(EntityType.LLAMA, spawnPosition); - setBoundingBox(0.45f, 0.9375f, 0.45f); + setBoundingBox(.9D, 1.87D, .9D); } + + public EntityLlama(@NotNull Position spawnPosition, @Nullable Instance instance) { + super(EntityType.LLAMA, spawnPosition, instance); + setBoundingBox(.9D, 1.87D, .9D); + } + } diff --git a/src/main/java/net/minestom/server/entity/type/animal/EntityMooshroom.java b/src/main/java/net/minestom/server/entity/type/animal/EntityMooshroom.java index 41c794b2f..368947ae1 100644 --- a/src/main/java/net/minestom/server/entity/type/animal/EntityMooshroom.java +++ b/src/main/java/net/minestom/server/entity/type/animal/EntityMooshroom.java @@ -1,13 +1,17 @@ package net.minestom.server.entity.type.animal; -import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.type.AgeableCreature; import net.minestom.server.entity.type.Animal; import net.minestom.server.utils.Position; import org.jetbrains.annotations.NotNull; -public class EntityMooshroom extends EntityCreature implements Animal { +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.animal.MooshroomMeta} instead. + */ +@Deprecated +public class EntityMooshroom extends AgeableCreature implements Animal { public EntityMooshroom(Position spawnPosition) { super(EntityType.MOOSHROOM, spawnPosition); diff --git a/src/main/java/net/minestom/server/entity/type/animal/EntityOcelot.java b/src/main/java/net/minestom/server/entity/type/animal/EntityOcelot.java index 3b69f5522..0d08f19bf 100644 --- a/src/main/java/net/minestom/server/entity/type/animal/EntityOcelot.java +++ b/src/main/java/net/minestom/server/entity/type/animal/EntityOcelot.java @@ -1,11 +1,15 @@ package net.minestom.server.entity.type.animal; -import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.type.AgeableCreature; import net.minestom.server.entity.type.Animal; import net.minestom.server.utils.Position; -public class EntityOcelot extends EntityCreature implements Animal { +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.animal.OcelotMeta} instead. + */ +@Deprecated +public class EntityOcelot extends AgeableCreature implements Animal { public EntityOcelot(Position spawnPosition) { super(EntityType.OCELOT, spawnPosition); setBoundingBox(0.6f, 0.7f, 0.6f); diff --git a/src/main/java/net/minestom/server/entity/type/animal/EntityPanda.java b/src/main/java/net/minestom/server/entity/type/animal/EntityPanda.java index 62308a13b..11709f376 100644 --- a/src/main/java/net/minestom/server/entity/type/animal/EntityPanda.java +++ b/src/main/java/net/minestom/server/entity/type/animal/EntityPanda.java @@ -1,11 +1,15 @@ package net.minestom.server.entity.type.animal; -import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.type.AgeableCreature; import net.minestom.server.entity.type.Animal; import net.minestom.server.utils.Position; -public class EntityPanda extends EntityCreature implements Animal { +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.animal.PandaMeta} instead. + */ +@Deprecated +public class EntityPanda extends AgeableCreature implements Animal { public EntityPanda(Position spawnPosition) { super(EntityType.PANDA, spawnPosition); setBoundingBox(1.3f, 1.25f, 1.3f); diff --git a/src/main/java/net/minestom/server/entity/type/animal/EntityPig.java b/src/main/java/net/minestom/server/entity/type/animal/EntityPig.java index 206746e1e..59acb3728 100644 --- a/src/main/java/net/minestom/server/entity/type/animal/EntityPig.java +++ b/src/main/java/net/minestom/server/entity/type/animal/EntityPig.java @@ -1,12 +1,16 @@ package net.minestom.server.entity.type.animal; -import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.type.AgeableCreature; import net.minestom.server.entity.type.Animal; import net.minestom.server.utils.Position; -public class EntityPig extends EntityCreature implements Animal { +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.animal.PigMeta} instead. + */ +@Deprecated +public class EntityPig extends AgeableCreature implements Animal { public EntityPig(Position spawnPosition) { super(EntityType.PIG, spawnPosition); diff --git a/src/main/java/net/minestom/server/entity/type/animal/EntityPolarBear.java b/src/main/java/net/minestom/server/entity/type/animal/EntityPolarBear.java index 33f77b5c9..ebb0ab8f2 100644 --- a/src/main/java/net/minestom/server/entity/type/animal/EntityPolarBear.java +++ b/src/main/java/net/minestom/server/entity/type/animal/EntityPolarBear.java @@ -1,12 +1,16 @@ package net.minestom.server.entity.type.animal; -import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.type.AgeableCreature; import net.minestom.server.entity.type.Animal; import net.minestom.server.utils.Position; -public class EntityPolarBear extends EntityCreature implements Animal { +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.animal.PolarBearMeta} instead. + */ +@Deprecated +public class EntityPolarBear extends AgeableCreature implements Animal { public EntityPolarBear(Position spawnPosition) { super(EntityType.POLAR_BEAR, spawnPosition); diff --git a/src/main/java/net/minestom/server/entity/type/animal/EntityRabbit.java b/src/main/java/net/minestom/server/entity/type/animal/EntityRabbit.java index d5ae7c314..841d4e6a4 100644 --- a/src/main/java/net/minestom/server/entity/type/animal/EntityRabbit.java +++ b/src/main/java/net/minestom/server/entity/type/animal/EntityRabbit.java @@ -1,12 +1,16 @@ package net.minestom.server.entity.type.animal; -import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.type.AgeableCreature; import net.minestom.server.entity.type.Animal; import net.minestom.server.utils.Position; -public class EntityRabbit extends EntityCreature implements Animal { +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.animal.RabbitMeta} instead. + */ +@Deprecated +public class EntityRabbit extends AgeableCreature implements Animal { public EntityRabbit(Position spawnPosition) { super(EntityType.RABBIT, spawnPosition); diff --git a/src/main/java/net/minestom/server/entity/type/decoration/EntityArmorStand.java b/src/main/java/net/minestom/server/entity/type/decoration/EntityArmorStand.java index e8b473ad5..d293f79b8 100644 --- a/src/main/java/net/minestom/server/entity/type/decoration/EntityArmorStand.java +++ b/src/main/java/net/minestom/server/entity/type/decoration/EntityArmorStand.java @@ -13,6 +13,10 @@ import net.minestom.server.utils.Vector; import net.minestom.server.utils.binary.BitmaskUtil; import org.jetbrains.annotations.NotNull; +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.other.ArmorStandMeta} instead. + */ +@Deprecated public class EntityArmorStand extends ObjectEntity implements EquipmentHandler { // Equipments @@ -48,10 +52,12 @@ public class EntityArmorStand extends ObjectEntity implements EquipmentHandler { } @Override - public boolean addViewer(@NotNull Player player) { - final boolean result = super.addViewer(player); + public boolean addViewer0(@NotNull Player player) { + if (!super.addViewer0(player)) { + return false; + } syncEquipments(player.getPlayerConnection()); - return result; + return true; } @Override diff --git a/src/main/java/net/minestom/server/entity/type/decoration/EntityItemFrame.java b/src/main/java/net/minestom/server/entity/type/decoration/EntityItemFrame.java index 242e09358..7683a76ce 100644 --- a/src/main/java/net/minestom/server/entity/type/decoration/EntityItemFrame.java +++ b/src/main/java/net/minestom/server/entity/type/decoration/EntityItemFrame.java @@ -10,6 +10,10 @@ import org.jetbrains.annotations.NotNull; // FIXME: https://wiki.vg/Object_Data#Item_Frame_.28id_71.29 // "You have to set both Orientation and Yaw/Pitch accordingly, otherwise it will not work." +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.other.ItemFrameMeta} instead. + */ +@Deprecated public class EntityItemFrame extends ObjectEntity { private final ItemFrameOrientation orientation; diff --git a/src/main/java/net/minestom/server/entity/type/monster/EntityBlaze.java b/src/main/java/net/minestom/server/entity/type/monster/EntityBlaze.java index 5b572a8bb..c3620c5d4 100644 --- a/src/main/java/net/minestom/server/entity/type/monster/EntityBlaze.java +++ b/src/main/java/net/minestom/server/entity/type/monster/EntityBlaze.java @@ -6,6 +6,10 @@ import net.minestom.server.entity.Metadata; import net.minestom.server.entity.type.Monster; import net.minestom.server.utils.Position; +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.monster.BlazeMeta} instead. + */ +@Deprecated public class EntityBlaze extends EntityCreature implements Monster { public EntityBlaze(Position spawnPosition) { diff --git a/src/main/java/net/minestom/server/entity/type/monster/EntityCaveSpider.java b/src/main/java/net/minestom/server/entity/type/monster/EntityCaveSpider.java index b607f23c9..2ab612f89 100644 --- a/src/main/java/net/minestom/server/entity/type/monster/EntityCaveSpider.java +++ b/src/main/java/net/minestom/server/entity/type/monster/EntityCaveSpider.java @@ -5,6 +5,10 @@ import net.minestom.server.entity.EntityType; import net.minestom.server.entity.type.Monster; import net.minestom.server.utils.Position; +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.monster.SpiderMeta} instead. + */ +@Deprecated public class EntityCaveSpider extends EntityCreature implements Monster { public EntityCaveSpider(Position spawnPosition) { super(EntityType.CAVE_SPIDER, spawnPosition); diff --git a/src/main/java/net/minestom/server/entity/type/monster/EntityCreeper.java b/src/main/java/net/minestom/server/entity/type/monster/EntityCreeper.java index 8ec9ea27a..4ac1bb2df 100644 --- a/src/main/java/net/minestom/server/entity/type/monster/EntityCreeper.java +++ b/src/main/java/net/minestom/server/entity/type/monster/EntityCreeper.java @@ -7,6 +7,10 @@ import net.minestom.server.entity.type.Monster; import net.minestom.server.utils.Position; import org.jetbrains.annotations.NotNull; +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.monster.CreeperMeta} instead. + */ +@Deprecated public class EntityCreeper extends EntityCreature implements Monster { public EntityCreeper(Position spawnPosition) { diff --git a/src/main/java/net/minestom/server/entity/type/monster/EntityEndermite.java b/src/main/java/net/minestom/server/entity/type/monster/EntityEndermite.java index b951d4abc..85cc67445 100644 --- a/src/main/java/net/minestom/server/entity/type/monster/EntityEndermite.java +++ b/src/main/java/net/minestom/server/entity/type/monster/EntityEndermite.java @@ -2,9 +2,14 @@ package net.minestom.server.entity.type.monster; import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.metadata.monster.EndermiteMeta; import net.minestom.server.entity.type.Monster; import net.minestom.server.utils.Position; +/** + * @deprecated Use {@link EndermiteMeta} instead. + */ +@Deprecated public class EntityEndermite extends EntityCreature implements Monster { public EntityEndermite(Position spawnPosition) { super(EntityType.ENDERMITE, spawnPosition); diff --git a/src/main/java/net/minestom/server/entity/type/monster/EntityGhast.java b/src/main/java/net/minestom/server/entity/type/monster/EntityGhast.java index 09852cec3..2e318f404 100644 --- a/src/main/java/net/minestom/server/entity/type/monster/EntityGhast.java +++ b/src/main/java/net/minestom/server/entity/type/monster/EntityGhast.java @@ -6,6 +6,10 @@ import net.minestom.server.entity.Metadata; import net.minestom.server.entity.type.Monster; import net.minestom.server.utils.Position; +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.flying.GhastMeta} instead. + */ +@Deprecated public class EntityGhast extends EntityCreature implements Monster { public EntityGhast(Position spawnPosition) { diff --git a/src/main/java/net/minestom/server/entity/type/monster/EntityGiant.java b/src/main/java/net/minestom/server/entity/type/monster/EntityGiant.java index dc8be9a06..8fc470d3c 100644 --- a/src/main/java/net/minestom/server/entity/type/monster/EntityGiant.java +++ b/src/main/java/net/minestom/server/entity/type/monster/EntityGiant.java @@ -5,6 +5,10 @@ import net.minestom.server.entity.EntityType; import net.minestom.server.entity.type.Monster; import net.minestom.server.utils.Position; +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.monster.GiantMeta} instead. + */ +@Deprecated public class EntityGiant extends EntityCreature implements Monster { public EntityGiant(Position spawnPosition) { super(EntityType.GIANT, spawnPosition); diff --git a/src/main/java/net/minestom/server/entity/type/monster/EntityGuardian.java b/src/main/java/net/minestom/server/entity/type/monster/EntityGuardian.java index c3936ea50..23b34a76a 100644 --- a/src/main/java/net/minestom/server/entity/type/monster/EntityGuardian.java +++ b/src/main/java/net/minestom/server/entity/type/monster/EntityGuardian.java @@ -5,18 +5,37 @@ import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; import net.minestom.server.entity.Metadata; import net.minestom.server.entity.type.Monster; +import net.minestom.server.instance.Instance; import net.minestom.server.utils.Position; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.monster.GuardianMeta} instead. + */ +@Deprecated public class EntityGuardian extends EntityCreature implements Monster { private Entity target; - public EntityGuardian(Position spawnPosition) { + public EntityGuardian(@NotNull Position spawnPosition) { super(EntityType.GUARDIAN, spawnPosition); setBoundingBox(0.85f, 0.85f, 0.85f); } + public EntityGuardian(@NotNull Position spawnPosition, @Nullable Instance instance) { + super(EntityType.GUARDIAN, spawnPosition, instance); + setBoundingBox(0.85f, 0.85f, 0.85f); + } + + EntityGuardian(@NotNull EntityType entityType, @NotNull Position spawnPosition) { + super(entityType, spawnPosition); + } + + EntityGuardian(@NotNull EntityType entityType, @NotNull Position spawnPosition, @Nullable Instance instance) { + super(entityType, spawnPosition, instance); + } + public boolean isRetractingSpikes() { return metadata.getIndex((byte) 15, false); } diff --git a/src/main/java/net/minestom/server/entity/type/monster/EntityPhantom.java b/src/main/java/net/minestom/server/entity/type/monster/EntityPhantom.java index 423dc92ed..94f5f469c 100644 --- a/src/main/java/net/minestom/server/entity/type/monster/EntityPhantom.java +++ b/src/main/java/net/minestom/server/entity/type/monster/EntityPhantom.java @@ -6,6 +6,10 @@ import net.minestom.server.entity.Metadata; import net.minestom.server.entity.type.Monster; import net.minestom.server.utils.Position; +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.flying.PhantomMeta} instead. + */ +@Deprecated public class EntityPhantom extends EntityCreature implements Monster { public EntityPhantom(Position spawnPosition) { diff --git a/src/main/java/net/minestom/server/entity/type/monster/EntitySilverfish.java b/src/main/java/net/minestom/server/entity/type/monster/EntitySilverfish.java index b9bd87c37..f7f0df93e 100644 --- a/src/main/java/net/minestom/server/entity/type/monster/EntitySilverfish.java +++ b/src/main/java/net/minestom/server/entity/type/monster/EntitySilverfish.java @@ -5,6 +5,10 @@ import net.minestom.server.entity.EntityType; import net.minestom.server.entity.type.Monster; import net.minestom.server.utils.Position; +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.monster.SilverfishMeta} instead. + */ +@Deprecated public class EntitySilverfish extends EntityCreature implements Monster { public EntitySilverfish(Position spawnPosition) { super(EntityType.SILVERFISH, spawnPosition); diff --git a/src/main/java/net/minestom/server/entity/type/monster/EntitySlime.java b/src/main/java/net/minestom/server/entity/type/monster/EntitySlime.java index ab2471bc3..3da2b83bc 100644 --- a/src/main/java/net/minestom/server/entity/type/monster/EntitySlime.java +++ b/src/main/java/net/minestom/server/entity/type/monster/EntitySlime.java @@ -5,11 +5,20 @@ import net.minestom.server.entity.EntityType; import net.minestom.server.entity.Metadata; import net.minestom.server.entity.type.Monster; import net.minestom.server.utils.Position; +import org.jetbrains.annotations.NotNull; +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.other.SlimeMeta} instead. + */ +@Deprecated public class EntitySlime extends EntityCreature implements Monster { - public EntitySlime(Position spawnPosition) { - super(EntityType.SLIME, spawnPosition); + public EntitySlime(@NotNull Position spawnPosition) { + this(EntityType.SLIME, spawnPosition); + } + + EntitySlime(@NotNull EntityType type, @NotNull Position spawnPosition) { + super(type, spawnPosition); setSize(1); } diff --git a/src/main/java/net/minestom/server/entity/type/monster/EntitySpider.java b/src/main/java/net/minestom/server/entity/type/monster/EntitySpider.java index 3a656f912..2cb346470 100644 --- a/src/main/java/net/minestom/server/entity/type/monster/EntitySpider.java +++ b/src/main/java/net/minestom/server/entity/type/monster/EntitySpider.java @@ -6,6 +6,10 @@ import net.minestom.server.entity.Metadata; import net.minestom.server.entity.type.Monster; import net.minestom.server.utils.Position; +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.monster.SpiderMeta} instead. + */ +@Deprecated public class EntitySpider extends EntityCreature implements Monster { public EntitySpider(Position spawnPosition) { diff --git a/src/main/java/net/minestom/server/entity/type/monster/EntityWitch.java b/src/main/java/net/minestom/server/entity/type/monster/EntityWitch.java index 68f9c5743..cc72c6b93 100644 --- a/src/main/java/net/minestom/server/entity/type/monster/EntityWitch.java +++ b/src/main/java/net/minestom/server/entity/type/monster/EntityWitch.java @@ -6,6 +6,10 @@ import net.minestom.server.entity.Metadata; import net.minestom.server.entity.type.Monster; import net.minestom.server.utils.Position; +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.monster.raider.WitchMeta} instead. + */ +@Deprecated public class EntityWitch extends EntityCreature implements Monster { public EntityWitch(Position spawnPosition) { diff --git a/src/main/java/net/minestom/server/entity/type/monster/EntityZombie.java b/src/main/java/net/minestom/server/entity/type/monster/EntityZombie.java index a45ac5265..598475d31 100644 --- a/src/main/java/net/minestom/server/entity/type/monster/EntityZombie.java +++ b/src/main/java/net/minestom/server/entity/type/monster/EntityZombie.java @@ -5,11 +5,20 @@ import net.minestom.server.entity.EntityType; import net.minestom.server.entity.Metadata; import net.minestom.server.entity.type.Monster; import net.minestom.server.utils.Position; +import org.jetbrains.annotations.NotNull; +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.monster.zombie.ZombieMeta} instead. + */ +@Deprecated public class EntityZombie extends EntityCreature implements Monster { - public EntityZombie(Position spawnPosition) { - super(EntityType.ZOMBIE, spawnPosition); + public EntityZombie(@NotNull Position spawnPosition) { + this(EntityType.ZOMBIE, spawnPosition); + } + + EntityZombie(@NotNull EntityType entityType, @NotNull Position spawnPosition) { + super(entityType, spawnPosition); setBoundingBox(0.6f, 1.95f, 0.6f); } diff --git a/src/main/java/net/minestom/server/entity/type/monster/EntityZombifiedPiglin.java b/src/main/java/net/minestom/server/entity/type/monster/EntityZombifiedPiglin.java index bf279fe22..a3ce5cdd4 100644 --- a/src/main/java/net/minestom/server/entity/type/monster/EntityZombifiedPiglin.java +++ b/src/main/java/net/minestom/server/entity/type/monster/EntityZombifiedPiglin.java @@ -1,46 +1,17 @@ package net.minestom.server.entity.type.monster; -import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; -import net.minestom.server.entity.Metadata; -import net.minestom.server.entity.type.Monster; import net.minestom.server.utils.Position; +import org.jetbrains.annotations.NotNull; -public class EntityZombifiedPiglin extends EntityCreature implements Monster { +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.monster.zombie.ZombifiedPiglinMeta} instead. + */ +@Deprecated +public class EntityZombifiedPiglin extends EntityZombie { - public EntityZombifiedPiglin(Position spawnPosition) { + public EntityZombifiedPiglin(@NotNull Position spawnPosition) { super(EntityType.ZOMBIFIED_PIGLIN, spawnPosition); - setBoundingBox(0.6f, 1.95f, 0.6f); } - /** - * Gets if the pig zombie is a baby. - * - * @return true if it is a baby, false otherwise - */ - public boolean isBaby() { - return metadata.getIndex((byte) 15, false); - } - - /** - * Sets the pig zombie a baby or adult. - * - * @param baby true to make it a baby, false otherwise - */ - public void setBaby(boolean baby) { - this.metadata.setIndex((byte) 15, Metadata.Boolean(baby)); - } - - public boolean isBecomingDrowned() { - return metadata.getIndex((byte) 17, false); - } - - public void setBecomingDrowned(boolean becomingDrowned) { - this.metadata.setIndex((byte) 17, Metadata.Boolean(becomingDrowned)); - } - - @Override - public double getEyeHeight() { - return isBaby() ? 0.93 : 1.74; - } } diff --git a/src/main/java/net/minestom/server/entity/type/other/EntityAreaEffectCloud.java b/src/main/java/net/minestom/server/entity/type/other/EntityAreaEffectCloud.java index 43a89af82..a7e6ddb5e 100644 --- a/src/main/java/net/minestom/server/entity/type/other/EntityAreaEffectCloud.java +++ b/src/main/java/net/minestom/server/entity/type/other/EntityAreaEffectCloud.java @@ -8,13 +8,17 @@ import net.minestom.server.utils.binary.BinaryWriter; import java.util.function.Consumer; +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.other.AreaEffectCloudMeta} instead. + */ +@Deprecated public class EntityAreaEffectCloud extends ObjectEntity { public Consumer particleDataConsumer; private float radius; private int color; private boolean ignoreRadius; - private Particle particle; + private Particle particleType; public EntityAreaEffectCloud(Position spawnPosition) { super(EntityType.AREA_EFFECT_CLOUD, spawnPosition); @@ -95,11 +99,11 @@ public class EntityAreaEffectCloud extends ObjectEntity { } public Particle getParticle() { - return particle; + return particleType; } - public void setParticle(Particle particle) { - this.particle = particle; + public void setParticle(Particle particleType) { + this.particleType = particleType; //sendMetadataIndex(10); } diff --git a/src/main/java/net/minestom/server/entity/type/other/EntityEndCrystal.java b/src/main/java/net/minestom/server/entity/type/other/EntityEndCrystal.java index 109b039fe..e1a205a66 100644 --- a/src/main/java/net/minestom/server/entity/type/other/EntityEndCrystal.java +++ b/src/main/java/net/minestom/server/entity/type/other/EntityEndCrystal.java @@ -8,6 +8,10 @@ import net.minestom.server.utils.Position; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.other.EndCrystalMeta} instead. + */ +@Deprecated public class EntityEndCrystal extends ObjectEntity { public EntityEndCrystal(@NotNull Position spawnPosition) { diff --git a/src/main/java/net/minestom/server/entity/type/other/EntityIronGolem.java b/src/main/java/net/minestom/server/entity/type/other/EntityIronGolem.java index a0731d8ee..97b5582be 100644 --- a/src/main/java/net/minestom/server/entity/type/other/EntityIronGolem.java +++ b/src/main/java/net/minestom/server/entity/type/other/EntityIronGolem.java @@ -6,6 +6,10 @@ import net.minestom.server.entity.Metadata; import net.minestom.server.entity.type.Constructable; import net.minestom.server.utils.Position; +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.golem.IronGolemMeta} instead. + */ +@Deprecated public class EntityIronGolem extends EntityCreature implements Constructable { public EntityIronGolem(Position spawnPosition) { diff --git a/src/main/java/net/minestom/server/entity/type/other/EntitySnowman.java b/src/main/java/net/minestom/server/entity/type/other/EntitySnowman.java index f69fb4ce1..5726ce421 100644 --- a/src/main/java/net/minestom/server/entity/type/other/EntitySnowman.java +++ b/src/main/java/net/minestom/server/entity/type/other/EntitySnowman.java @@ -6,6 +6,10 @@ import net.minestom.server.entity.Metadata; import net.minestom.server.entity.type.Constructable; import net.minestom.server.utils.Position; +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.golem.SnowGolemMeta} instead. + */ +@Deprecated public class EntitySnowman extends EntityCreature implements Constructable { public EntitySnowman(Position spawnPosition) { diff --git a/src/main/java/net/minestom/server/entity/type/projectile/AbstractProjectile.java b/src/main/java/net/minestom/server/entity/type/projectile/AbstractProjectile.java index 5adf4d6f1..c4ad5c8eb 100644 --- a/src/main/java/net/minestom/server/entity/type/projectile/AbstractProjectile.java +++ b/src/main/java/net/minestom/server/entity/type/projectile/AbstractProjectile.java @@ -8,12 +8,13 @@ import net.minestom.server.utils.Position; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public abstract class AbstractProjectile extends ObjectEntity implements Projectile { +public abstract class AbstractProjectile extends Entity implements Projectile { private final Entity shooter; public AbstractProjectile(@Nullable Entity shooter, @NotNull EntityType entityType, @NotNull Position spawnPosition) { super(entityType, spawnPosition); + setGravity(0.02f, 0.04f, 1.96f); this.shooter = shooter; } diff --git a/src/main/java/net/minestom/server/entity/type/projectile/EntityAbstractArrow.java b/src/main/java/net/minestom/server/entity/type/projectile/EntityAbstractArrow.java index d910afff6..bab55e201 100644 --- a/src/main/java/net/minestom/server/entity/type/projectile/EntityAbstractArrow.java +++ b/src/main/java/net/minestom/server/entity/type/projectile/EntityAbstractArrow.java @@ -20,9 +20,6 @@ import java.util.stream.Collectors; public class EntityAbstractArrow extends AbstractProjectile { - private final static byte CRITICAL_BIT = 0x01; - private final static byte NO_CLIP_BIT = 0x02; - EntityAbstractArrow(@Nullable Entity shooter, @NotNull EntityType entityType, @NotNull Position spawnPosition) { super(shooter, entityType, spawnPosition); super.hasPhysics = false; @@ -122,56 +119,4 @@ public class EntityAbstractArrow extends AbstractProjectile { return false; } - public void setCritical(boolean value) { - modifyMask(CRITICAL_BIT, value); - } - - public boolean isCritical() { - return (getMask() & CRITICAL_BIT) != 0; - } - - public void setNoClip(boolean value) { - modifyMask(NO_CLIP_BIT, value); - } - - public boolean isNoClip() { - return (getMask() & NO_CLIP_BIT) != 0; - } - - public void setPiercingLevel(byte value) { - this.metadata.setIndex((byte) 8, Metadata.Byte(value)); - } - - public byte getPiercingLevel() { - return this.metadata.getIndex((byte) 8, (byte) 0); - } - - private byte getMask() { - return this.metadata.getIndex((byte) 7, (byte) 0); - } - - private void setMask(byte mask) { - this.metadata.setIndex((byte) 7, Metadata.Byte(mask)); - } - - private void modifyMask(byte bit, boolean value) { - byte mask = getMask(); - boolean isPresent = (mask & bit) == bit; - if (isPresent == value) { - return; - } - if (value) { - mask |= bit; - } else { - mask &= ~bit; - } - setMask(mask); - } - - @Override - public int getObjectData() { - Entity shooter = getShooter(); - return shooter == null ? 0 : shooter.getEntityId() + 1; - } - } diff --git a/src/main/java/net/minestom/server/entity/type/projectile/EntityArrow.java b/src/main/java/net/minestom/server/entity/type/projectile/EntityArrow.java index 39bc7ef1c..a5a3efc21 100644 --- a/src/main/java/net/minestom/server/entity/type/projectile/EntityArrow.java +++ b/src/main/java/net/minestom/server/entity/type/projectile/EntityArrow.java @@ -3,6 +3,7 @@ package net.minestom.server.entity.type.projectile; import net.minestom.server.entity.Entity; import net.minestom.server.entity.EntityType; import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.metadata.arrow.ArrowMeta; import net.minestom.server.utils.Position; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -11,15 +12,7 @@ public class EntityArrow extends EntityAbstractArrow { public EntityArrow(@Nullable Entity shooter, @NotNull Position spawnPosition) { super(shooter, EntityType.ARROW, spawnPosition); - - } - - public void setColor(int value) { - this.metadata.setIndex((byte) 9, Metadata.VarInt(value)); - } - - public int getColor() { - return this.metadata.getIndex((byte) 9, -1); + ((ArrowMeta) getEntityMeta()).setShooter(shooter); } } diff --git a/src/main/java/net/minestom/server/entity/type/projectile/EntityEyeOfEnder.java b/src/main/java/net/minestom/server/entity/type/projectile/EntityEyeOfEnder.java index 3abdbe66e..609a87377 100644 --- a/src/main/java/net/minestom/server/entity/type/projectile/EntityEyeOfEnder.java +++ b/src/main/java/net/minestom/server/entity/type/projectile/EntityEyeOfEnder.java @@ -3,14 +3,16 @@ package net.minestom.server.entity.type.projectile; import net.minestom.server.entity.Entity; import net.minestom.server.entity.EntityType; import net.minestom.server.entity.Metadata; -import net.minestom.server.entity.ObjectEntity; -import net.minestom.server.entity.type.Projectile; import net.minestom.server.item.ItemStack; import net.minestom.server.item.Material; import net.minestom.server.utils.Position; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.item.EyeOfEnderMeta} instead. + */ +@Deprecated public class EntityEyeOfEnder extends AbstractProjectile { public EntityEyeOfEnder(@Nullable Entity shooter, @NotNull Position spawnPosition) { @@ -38,8 +40,4 @@ public class EntityEyeOfEnder extends AbstractProjectile { this.metadata.setIndex((byte) 7, Metadata.Slot(itemStack)); } - @Override - public int getObjectData() { - return 0; - } } diff --git a/src/main/java/net/minestom/server/entity/type/projectile/EntityPotion.java b/src/main/java/net/minestom/server/entity/type/projectile/EntityPotion.java index c3f216cea..f7b9f17de 100644 --- a/src/main/java/net/minestom/server/entity/type/projectile/EntityPotion.java +++ b/src/main/java/net/minestom/server/entity/type/projectile/EntityPotion.java @@ -3,13 +3,15 @@ package net.minestom.server.entity.type.projectile; import net.minestom.server.entity.Entity; import net.minestom.server.entity.EntityType; import net.minestom.server.entity.Metadata; -import net.minestom.server.entity.ObjectEntity; -import net.minestom.server.entity.type.Projectile; import net.minestom.server.item.ItemStack; import net.minestom.server.utils.Position; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.item.ThrownPotionMeta} instead. + */ +@Deprecated public class EntityPotion extends AbstractProjectile { public EntityPotion(@Nullable Entity shooter, @NotNull Position spawnPosition, @NotNull ItemStack potion) { @@ -18,11 +20,6 @@ public class EntityPotion extends AbstractProjectile { setPotion(potion); } - @Override - public int getObjectData() { - return 0; - } - @NotNull public ItemStack getPotion() { return metadata.getIndex((byte) 7, ItemStack.getAirItem()); diff --git a/src/main/java/net/minestom/server/entity/type/projectile/EntitySpectralArrow.java b/src/main/java/net/minestom/server/entity/type/projectile/EntitySpectralArrow.java index 944b13690..21b958d41 100644 --- a/src/main/java/net/minestom/server/entity/type/projectile/EntitySpectralArrow.java +++ b/src/main/java/net/minestom/server/entity/type/projectile/EntitySpectralArrow.java @@ -2,6 +2,7 @@ package net.minestom.server.entity.type.projectile; import net.minestom.server.entity.Entity; import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.metadata.arrow.SpectralArrowMeta; import net.minestom.server.utils.Position; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -10,6 +11,7 @@ public class EntitySpectralArrow extends EntityAbstractArrow { public EntitySpectralArrow(@Nullable Entity shooter, @NotNull Position spawnPosition) { super(shooter, EntityType.SPECTRAL_ARROW, spawnPosition); + ((SpectralArrowMeta) getEntityMeta()).setShooter(shooter); } } diff --git a/src/main/java/net/minestom/server/entity/type/vehicle/EntityBoat.java b/src/main/java/net/minestom/server/entity/type/vehicle/EntityBoat.java index 177936714..5590a0f96 100644 --- a/src/main/java/net/minestom/server/entity/type/vehicle/EntityBoat.java +++ b/src/main/java/net/minestom/server/entity/type/vehicle/EntityBoat.java @@ -7,6 +7,10 @@ import net.minestom.server.entity.type.Vehicle; import net.minestom.server.utils.Position; import org.jetbrains.annotations.NotNull; +/** + * @deprecated Use {@link net.minestom.server.entity.metadata.other.BoatMeta} instead. + */ +@Deprecated public class EntityBoat extends ObjectEntity implements Vehicle { public EntityBoat(Position spawnPosition) { diff --git a/src/main/java/net/minestom/server/particle/ParticleCreator.java b/src/main/java/net/minestom/server/particle/ParticleCreator.java index 06866189b..49a10c272 100644 --- a/src/main/java/net/minestom/server/particle/ParticleCreator.java +++ b/src/main/java/net/minestom/server/particle/ParticleCreator.java @@ -10,12 +10,12 @@ import java.util.function.Consumer; */ public class ParticleCreator { - public static ParticlePacket createParticlePacket(Particle particle, boolean distance, + public static ParticlePacket createParticlePacket(Particle particleType, boolean distance, double x, double y, double z, float offsetX, float offsetY, float offsetZ, float particleData, int count, Consumer dataWriter) { ParticlePacket particlePacket = new ParticlePacket(); - particlePacket.particleId = particle.getId(); + particlePacket.particleId = particleType.getId(); particlePacket.longDistance = distance; particlePacket.x = x; @@ -33,11 +33,11 @@ public class ParticleCreator { return particlePacket; } - public static ParticlePacket createParticlePacket(Particle particle, + public static ParticlePacket createParticlePacket(Particle particleType, double x, double y, double z, float offsetX, float offsetY, float offsetZ, int count) { - return createParticlePacket(particle, false, + return createParticlePacket(particleType, false, x, y, z, offsetX, offsetY, offsetZ, 0, count, null); diff --git a/src/main/java/net/minestom/server/utils/Position.java b/src/main/java/net/minestom/server/utils/Position.java index bea0d25d0..3527c9f29 100644 --- a/src/main/java/net/minestom/server/utils/Position.java +++ b/src/main/java/net/minestom/server/utils/Position.java @@ -336,6 +336,17 @@ public class Position implements PublicCloneable { this.z = z; } + /** + * Changes the position to the given one. + * + * @param position the new position. + */ + public void set(Position position) { + this.x = position.x; + this.y = position.y; + this.z = position.z; + } + /** * Gets the position yaw. * diff --git a/src/test/java/demo/Main.java b/src/test/java/demo/Main.java index 438b4e278..c49111ed3 100644 --- a/src/test/java/demo/Main.java +++ b/src/test/java/demo/Main.java @@ -43,6 +43,7 @@ public class Main { commandManager.register(new TitleCommand()); commandManager.register(new BookCommand()); commandManager.register(new ShootCommand()); + commandManager.register(new HorseCommand()); commandManager.setUnknownCommandCallback((sender, command) -> sender.sendMessage("unknown command")); diff --git a/src/test/java/demo/commands/HorseCommand.java b/src/test/java/demo/commands/HorseCommand.java new file mode 100644 index 000000000..cc5bd7cce --- /dev/null +++ b/src/test/java/demo/commands/HorseCommand.java @@ -0,0 +1,75 @@ +package demo.commands; + +import net.minestom.server.command.CommandSender; +import net.minestom.server.command.builder.Arguments; +import net.minestom.server.command.builder.Command; +import net.minestom.server.command.builder.arguments.ArgumentType; +import net.minestom.server.command.builder.exception.ArgumentSyntaxException; +import net.minestom.server.entity.EntityCreature; +import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.Player; +import net.minestom.server.entity.metadata.animal.HorseMeta; + +import java.util.Locale; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class HorseCommand extends Command { + + public HorseCommand() { + super("horse"); + setCondition(this::condition); + setDefaultExecutor(this::defaultExecutor); + var babyArg = ArgumentType.Boolean("baby"); + var markingArg = ArgumentType.Enum("marking", HorseMeta.Marking.class); + var colorArg = ArgumentType.Enum("color", HorseMeta.Color.class); + setArgumentCallback(this::onBabyError, babyArg); + setArgumentCallback(this::onMarkingError, markingArg); + setArgumentCallback(this::onColorError, colorArg); + addSyntax(this::onHorseCommand, babyArg, markingArg, colorArg); + } + + private boolean condition(CommandSender sender, String commandString) { + if (!sender.isPlayer()) { + sender.sendMessage("The command is only available for player"); + return false; + } + return true; + } + + private void defaultExecutor(CommandSender sender, Arguments args) { + sender.sendMessage("Correct usage: horse [baby] [marking] [color]"); + } + + private void onBabyError(CommandSender sender, ArgumentSyntaxException exception) { + sender.sendMessage("SYNTAX ERROR: '" + exception.getInput() + "' should be replaced by 'true' or 'false'"); + } + + private void onMarkingError(CommandSender sender, ArgumentSyntaxException exception) { + String values = Stream.of(HorseMeta.Marking.values()) + .map(value -> "'" + value.name().toLowerCase(Locale.ROOT) + "'") + .collect(Collectors.joining(", ")); + sender.sendMessage("SYNTAX ERROR: '" + exception.getInput() + "' should be replaced by " + values + "."); + } + + private void onColorError(CommandSender sender, ArgumentSyntaxException exception) { + String values = Stream.of(HorseMeta.Color.values()) + .map(value -> "'" + value.name().toLowerCase(Locale.ROOT) + "'") + .collect(Collectors.joining(", ")); + sender.sendMessage("SYNTAX ERROR: '" + exception.getInput() + "' should be replaced by " + values + "."); + } + + private void onHorseCommand(CommandSender sender, Arguments args) { + var player = (Player) sender; + + boolean baby = args.get("baby"); + HorseMeta.Marking marking = args.get("marking"); + HorseMeta.Color color = args.get("color"); + var horse = new EntityCreature(EntityType.HORSE, player.getPosition()); + var meta = (HorseMeta) horse.getEntityMeta(); + meta.setBaby(baby); + meta.setVariant(new HorseMeta.Variant(marking, color)); + horse.setInstance(player.getInstance()); + } + +} diff --git a/src/test/java/demo/commands/ShootCommand.java b/src/test/java/demo/commands/ShootCommand.java index 8520399ce..60950889b 100644 --- a/src/test/java/demo/commands/ShootCommand.java +++ b/src/test/java/demo/commands/ShootCommand.java @@ -7,6 +7,7 @@ import net.minestom.server.command.builder.arguments.ArgumentType; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; import net.minestom.server.entity.Entity; import net.minestom.server.entity.Player; +import net.minestom.server.entity.metadata.arrow.ArrowMeta; import net.minestom.server.entity.type.Projectile; import net.minestom.server.entity.type.projectile.EntityArrow; import net.minestom.server.entity.type.projectile.EntitySpectralArrow; @@ -54,7 +55,8 @@ public class ShootCommand extends Command { break; case "colored": projectile = new EntityArrow(player, pos); - ((EntityArrow) projectile).setColor(ThreadLocalRandom.current().nextInt()); + var meta = (ArrowMeta) ((Entity) projectile).getEntityMeta(); + meta.setColor(ThreadLocalRandom.current().nextInt()); break; default: return; diff --git a/src/test/java/demo/entity/TestArrow.java b/src/test/java/demo/entity/TestArrow.java deleted file mode 100644 index fef5a70f5..000000000 --- a/src/test/java/demo/entity/TestArrow.java +++ /dev/null @@ -1,25 +0,0 @@ -package demo.entity; - -import net.minestom.server.entity.EntityType; -import net.minestom.server.entity.LivingEntity; -import net.minestom.server.entity.ObjectEntity; -import net.minestom.server.utils.Position; - -public class TestArrow extends ObjectEntity { - - private LivingEntity shooter; - - public TestArrow(LivingEntity shooter, Position spawnPosition) { - super(EntityType.ARROW, spawnPosition); - this.shooter = shooter; - } - - @Override - public int getObjectData() { - return shooter.getEntityId() + 1; - } - - public LivingEntity getShooter() { - return shooter; - } -}