From 0ace331ef32864f82d98f8289f11e08cf0050a6b Mon Sep 17 00:00:00 2001 From: Tofaa <82680183+Tofaa2@users.noreply.github.com> Date: Tue, 28 Nov 2023 02:22:08 +0300 Subject: [PATCH] i think that's all the metadata --- .idea/gradle.xml | 1 + .idea/vcs.xml | 6 + build.gradle | 2 +- settings.gradle | 1 + src/.gitignore | 42 +++++ .../me/tofaa/entitylib/EntityIdProvider.java | 21 +++ .../java/me/tofaa/entitylib/EntityLib.java | 72 ++++++++ .../entitylib/MetaConverterRegistry.java | 167 ++++++++++++++---- .../entity/EntityInteractionProcessor.java | 18 ++ .../tofaa/entitylib/entity/WrapperEntity.java | 139 +++++++++++++++ .../me/tofaa/entitylib/extras/Rotation.java | 38 ++++ .../me/tofaa/entitylib/meta/mobs/BatMeta.java | 26 +++ .../meta/mobs/golem/IronGolemMeta.java | 26 +++ .../meta/mobs/golem/ShulkerMeta.java | 54 ++++++ .../meta/mobs/golem/SnowGolemMeta.java | 25 +++ .../meta/mobs/horse/TraderLlamaMeta.java | 14 ++ .../meta/mobs/minecart/BaseMinecartMeta.java | 62 +++++++ .../meta/mobs/minecart/ChestMinecartMeta.java | 19 ++ .../minecart/CommandBlockMinecartMeta.java | 38 ++++ .../mobs/minecart/FurnaceMinecartMeta.java | 26 +++ .../mobs/minecart/HopperMinecartMeta.java | 18 ++ .../meta/mobs/minecart/MinecartMeta.java | 18 ++ .../mobs/minecart/SpawnerMinecartMeta.java | 19 ++ .../meta/mobs/minecart/TntMinecartMeta.java | 18 ++ .../meta/mobs/monster/BlazeMeta.java | 26 +++ .../meta/mobs/monster/CaveSpiderMeta.java | 13 ++ .../meta/mobs/monster/CreeperMeta.java | 49 +++++ .../meta/mobs/monster/ElderGuardianMeta.java | 13 ++ .../meta/mobs/monster/EndermanMeta.java | 44 +++++ .../meta/mobs/monster/EndermiteMeta.java | 14 ++ .../meta/mobs/{ => monster}/GhastMeta.java | 2 +- .../meta/mobs/monster/GiantMeta.java | 13 ++ .../meta/mobs/monster/GuardianMeta.java | 36 ++++ .../meta/mobs/{ => monster}/PhantomMeta.java | 2 +- .../meta/mobs/monster/SilverfishMeta.java | 14 ++ .../meta/mobs/monster/SpiderMeta.java | 27 +++ .../entitylib/meta/mobs/monster/VexMeta.java | 25 +++ .../meta/mobs/monster/WitherMeta.java | 55 ++++++ .../meta/mobs/monster/ZoglinMeta.java | 28 +++ .../mobs/monster/piglin/BasePiglinMeta.java | 25 +++ .../mobs/monster/piglin/PiglinBruteMeta.java | 13 ++ .../meta/mobs/monster/piglin/PiglinMeta.java | 43 +++++ .../meta/mobs/monster/raider/EvokerMeta.java | 13 ++ .../mobs/monster/raider/IllusionerMeta.java | 13 ++ .../mobs/monster/raider/PillagerMeta.java | 14 ++ .../meta/mobs/monster/raider/RaiderMeta.java | 25 +++ .../meta/mobs/monster/raider/RavagerMeta.java | 14 ++ .../raider/SpellcasterIllagerMeta.java | 13 ++ .../mobs/monster/raider/VindicatorMeta.java | 13 ++ .../meta/mobs/monster/raider/WitchMeta.java | 23 +++ .../mobs/monster/skeleton/SkeletonMeta.java | 14 ++ .../meta/mobs/monster/skeleton/StrayMeta.java | 11 ++ .../monster/skeleton/WitherSkeletonMeta.java | 12 ++ .../meta/mobs/monster/zombie/DrownedMeta.java | 12 ++ .../meta/mobs/monster/zombie/HuskMeta.java | 13 ++ .../meta/mobs/monster/zombie/ZombieMeta.java | 35 ++++ .../monster/zombie/ZombieVillagerMeta.java | 43 +++++ .../monster/zombie/ZombifiedPiglinMeta.java | 13 ++ .../meta/mobs/other/AreaEffectCloudMeta.java | 40 +++++ .../meta/mobs/other/ArmorStandMeta.java | 110 ++++++++++++ .../entitylib/meta/mobs/other/BoatMeta.java | 86 +++++++++ .../meta/mobs/other/DragonFireballMeta.java | 38 ++++ .../meta/mobs/other/EndCrystalMeta.java | 36 ++++ .../meta/mobs/other/EnderDragonMeta.java | 43 +++++ .../meta/mobs/other/EvokerFangsMeta.java | 14 ++ .../meta/mobs/other/FallingBlockMeta.java | 46 +++++ .../meta/mobs/other/FireworkRocketMeta.java | 50 ++++++ .../meta/mobs/other/FishingHookMeta.java | 53 ++++++ .../meta/mobs/other/GlowItemFrameMeta.java | 13 ++ .../meta/mobs/other/ItemFrameMeta.java | 74 ++++++++ .../meta/mobs/other/LeashKnotMeta.java | 14 ++ .../meta/mobs/other/LightningBoltMeta.java | 14 ++ .../meta/mobs/other/LlamaSpitMeta.java | 25 +++ .../entitylib/meta/mobs/other/MarkerMeta.java | 14 ++ .../meta/mobs/other/PaintingMeta.java | 120 +++++++++++++ .../meta/mobs/other/PrimedTntMeta.java | 23 +++ .../meta/mobs/other/WitherSkullMeta.java | 50 ++++++ .../meta/mobs/{ => passive}/ChickenMeta.java | 2 +- .../meta/mobs/{ => passive}/CowMeta.java | 2 +- .../mobs/{ => passive}/MooshroomMeta.java | 2 +- .../meta/mobs/{ => passive}/PigMeta.java | 2 +- .../meta/mobs/{ => passive}/RabbitMeta.java | 2 +- .../meta/mobs/{ => passive}/SheepMeta.java | 2 +- .../meta/mobs/{ => passive}/TurtleMeta.java | 2 +- .../meta/mobs/villager/BaseVillagerMeta.java | 24 +++ .../meta/mobs/villager/VillagerMeta.java | 81 +++++++++ .../mobs/villager/WanderingTraderMeta.java | 13 ++ .../meta/mobs/water/AxolotlMeta.java | 50 ++++++ .../meta/mobs/water/BaseFishMeta.java | 25 +++ .../entitylib/meta/mobs/water/CodMeta.java | 13 ++ .../meta/mobs/water/DolphinMeta.java | 43 +++++ .../meta/mobs/water/GlowSquidMeta.java | 24 +++ .../meta/mobs/water/PufferFishMeta.java | 32 ++++ .../entitylib/meta/mobs/water/SalmonMeta.java | 9 + .../entitylib/meta/mobs/water/SquidMeta.java | 14 ++ .../meta/mobs/water/TropicalFishMeta.java | 128 ++++++++++++++ .../meta/projectile/ShulkerBulletMeta.java | 25 +++ .../entitylib/meta/types/WaterMobMeta.java | 13 ++ .../me/tofaa/entitylib/EntityLibPlugin.java | 1 + .../java/me/tofaa/entitylib/TestCommand.java | 4 +- .../me/tofaa/entitylib/TestEntityCommand.java | 48 +++++ test-plugin/src/main/resources/plugin.yml | 4 + 102 files changed, 2970 insertions(+), 51 deletions(-) create mode 100644 .idea/vcs.xml create mode 100644 src/.gitignore create mode 100644 src/main/java/me/tofaa/entitylib/EntityIdProvider.java create mode 100644 src/main/java/me/tofaa/entitylib/entity/EntityInteractionProcessor.java create mode 100644 src/main/java/me/tofaa/entitylib/entity/WrapperEntity.java create mode 100644 src/main/java/me/tofaa/entitylib/extras/Rotation.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/BatMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/golem/IronGolemMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/golem/ShulkerMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/golem/SnowGolemMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/horse/TraderLlamaMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/minecart/BaseMinecartMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/minecart/ChestMinecartMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/minecart/CommandBlockMinecartMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/minecart/FurnaceMinecartMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/minecart/HopperMinecartMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/minecart/MinecartMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/minecart/SpawnerMinecartMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/minecart/TntMinecartMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/BlazeMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/CaveSpiderMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/CreeperMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/ElderGuardianMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/EndermanMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/EndermiteMeta.java rename src/main/java/me/tofaa/entitylib/meta/mobs/{ => monster}/GhastMeta.java (93%) create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/GiantMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/GuardianMeta.java rename src/main/java/me/tofaa/entitylib/meta/mobs/{ => monster}/PhantomMeta.java (93%) create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/SilverfishMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/SpiderMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/VexMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/WitherMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/ZoglinMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/piglin/BasePiglinMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/piglin/PiglinBruteMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/piglin/PiglinMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/EvokerMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/IllusionerMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/PillagerMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/RaiderMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/RavagerMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/SpellcasterIllagerMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/VindicatorMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/WitchMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/skeleton/SkeletonMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/skeleton/StrayMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/skeleton/WitherSkeletonMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/zombie/DrownedMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/zombie/HuskMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/zombie/ZombieMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/zombie/ZombieVillagerMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/monster/zombie/ZombifiedPiglinMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/other/AreaEffectCloudMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/other/ArmorStandMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/other/BoatMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/other/DragonFireballMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/other/EndCrystalMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/other/EnderDragonMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/other/EvokerFangsMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/other/FallingBlockMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/other/FireworkRocketMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/other/FishingHookMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/other/GlowItemFrameMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/other/ItemFrameMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/other/LeashKnotMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/other/LightningBoltMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/other/LlamaSpitMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/other/MarkerMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/other/PaintingMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/other/PrimedTntMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/other/WitherSkullMeta.java rename src/main/java/me/tofaa/entitylib/meta/mobs/{ => passive}/ChickenMeta.java (88%) rename src/main/java/me/tofaa/entitylib/meta/mobs/{ => passive}/CowMeta.java (88%) rename src/main/java/me/tofaa/entitylib/meta/mobs/{ => passive}/MooshroomMeta.java (94%) rename src/main/java/me/tofaa/entitylib/meta/mobs/{ => passive}/PigMeta.java (95%) rename src/main/java/me/tofaa/entitylib/meta/mobs/{ => passive}/RabbitMeta.java (95%) rename src/main/java/me/tofaa/entitylib/meta/mobs/{ => passive}/SheepMeta.java (95%) rename src/main/java/me/tofaa/entitylib/meta/mobs/{ => passive}/TurtleMeta.java (97%) create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/villager/BaseVillagerMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/villager/VillagerMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/villager/WanderingTraderMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/water/AxolotlMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/water/BaseFishMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/water/CodMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/water/DolphinMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/water/GlowSquidMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/water/PufferFishMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/water/SalmonMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/water/SquidMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/mobs/water/TropicalFishMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/projectile/ShulkerBulletMeta.java create mode 100644 src/main/java/me/tofaa/entitylib/meta/types/WaterMobMeta.java create mode 100644 test-plugin/src/main/java/me/tofaa/entitylib/TestEntityCommand.java diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 2a65317..0925429 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -9,6 +9,7 @@ diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index fcdf5ec..5d4059e 100644 --- a/build.gradle +++ b/build.gradle @@ -36,6 +36,6 @@ allprojects { dependencies { - compileOnly("com.github.retrooper.packetevents:spigot:2.0.2") + compileOnlyApi("com.github.retrooper.packetevents:spigot:2.0.2") } diff --git a/settings.gradle b/settings.gradle index a756887..fa9e207 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,3 +1,4 @@ rootProject.name = 'EntityLib' include 'test-plugin' +include 'wrapper-entity' diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 0000000..b63da45 --- /dev/null +++ b/src/.gitignore @@ -0,0 +1,42 @@ +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/src/main/java/me/tofaa/entitylib/EntityIdProvider.java b/src/main/java/me/tofaa/entitylib/EntityIdProvider.java new file mode 100644 index 0000000..b608629 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/EntityIdProvider.java @@ -0,0 +1,21 @@ +package me.tofaa.entitylib; + + +import java.util.concurrent.atomic.AtomicInteger; + +@FunctionalInterface +public interface EntityIdProvider { + + static EntityIdProvider simple() { + return new EntityIdProvider() { + private final AtomicInteger atomicInteger = new AtomicInteger(0); + @Override + public int provide() { + return atomicInteger.incrementAndGet(); + } + }; + } + + + int provide(); +} diff --git a/src/main/java/me/tofaa/entitylib/EntityLib.java b/src/main/java/me/tofaa/entitylib/EntityLib.java index d787d9c..4e7dc34 100644 --- a/src/main/java/me/tofaa/entitylib/EntityLib.java +++ b/src/main/java/me/tofaa/entitylib/EntityLib.java @@ -1,19 +1,33 @@ package me.tofaa.entitylib; import com.github.retrooper.packetevents.PacketEventsAPI; +import com.github.retrooper.packetevents.event.PacketListenerAbstract; +import com.github.retrooper.packetevents.event.PacketReceiveEvent; import com.github.retrooper.packetevents.protocol.entity.type.EntityType; +import com.github.retrooper.packetevents.protocol.packettype.PacketType; +import com.github.retrooper.packetevents.protocol.packettype.PacketTypeCommon; +import com.github.retrooper.packetevents.wrapper.PacketWrapper; +import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientInteractEntity; +import me.tofaa.entitylib.entity.EntityInteractionProcessor; +import me.tofaa.entitylib.entity.WrapperEntity; import me.tofaa.entitylib.meta.EntityMeta; import me.tofaa.entitylib.meta.Metadata; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiFunction; public final class EntityLib { private EntityLib() {} private static final HashMap metadata = new HashMap<>(); + private static final Map entities = new ConcurrentHashMap<>(); + private static final Map entitiesById = new ConcurrentHashMap<>(); + private static EntityInteractionProcessor interactionProcessor; private static boolean initialized = false; private static PacketEventsAPI packetEvents; private static MetaConverterRegistry metaRegistry; @@ -31,6 +45,43 @@ public final class EntityLib { metaRegistry = new MetaConverterRegistry(); } + public static void enableEntityInteractions() { + checkInit(); + packetEvents.getEventManager().registerListener(new PacketListenerAbstract() { + @Override + public void onPacketReceive(PacketReceiveEvent event) { + if (interactionProcessor == null) return; + if (event.getPacketType() != PacketType.Play.Client.INTERACT_ENTITY) return; + WrapperPlayClientInteractEntity packet = new WrapperPlayClientInteractEntity(event); + WrapperEntity entity = getEntity(packet.getEntityId()); + if (entity == null) return; + interactionProcessor.process( + entity, packet.getAction(), packet.getHand(), event.getUser() + ); + } + }); + } + + public static @Nullable WrapperEntity getEntity(int entityId) { + checkInit(); + return entitiesById.get(entityId); + } + + public static @Nullable WrapperEntity getEntity(UUID uuid) { + checkInit(); + return entities.get(uuid); + } + + public static @Nullable WrapperEntity createEntity(UUID uuid, EntityType entityType) { + checkInit(); + int id = WrapperEntity.ID_PROVIDER.provide(); + EntityMeta meta = createMeta(id, entityType); + if (meta == null) return null; + WrapperEntity entity = new WrapperEntity(uuid, entityType, meta); + entities.put(uuid, entity); + entitiesById.put(id, entity); + return entity; + } public static @Nullable EntityMeta getMeta(int entityId) { checkInit(); @@ -61,11 +112,32 @@ public final class EntityLib { return meta; } + public static EntityMeta createMeta(WrapperEntity entity) { + return createMeta(entity.getEntityId(), entity.getEntityType()); + } + + public static Class getMetaClassOf(EntityType entityType) { + return metaRegistry.getMetaClass(entityType); + } + public static PacketEventsAPI getPacketEvents() { checkInit(); return packetEvents; } + public static void sendPacket(UUID user, PacketWrapper wrapper) { + checkInit(); + packetEvents.getProtocolManager().sendPacket(packetEvents.getProtocolManager().getChannel(user), wrapper); + } + + public static @Nullable EntityInteractionProcessor getInteractionProcessor() { + return interactionProcessor; + } + + public static void setInteractionProcessor(EntityInteractionProcessor interactionProcessor) { + EntityLib.interactionProcessor = interactionProcessor; + } + private static void checkInit() { if (!initialized) { throw new IllegalStateException("EntityLib is not initialized"); diff --git a/src/main/java/me/tofaa/entitylib/MetaConverterRegistry.java b/src/main/java/me/tofaa/entitylib/MetaConverterRegistry.java index 6efc07a..3577d45 100644 --- a/src/main/java/me/tofaa/entitylib/MetaConverterRegistry.java +++ b/src/main/java/me/tofaa/entitylib/MetaConverterRegistry.java @@ -7,14 +7,28 @@ import me.tofaa.entitylib.meta.mobs.*; import me.tofaa.entitylib.meta.mobs.DonkeyMeta; import me.tofaa.entitylib.meta.mobs.cuboid.MagmaCubeMeta; import me.tofaa.entitylib.meta.mobs.cuboid.SlimeMeta; +import me.tofaa.entitylib.meta.mobs.golem.IronGolemMeta; +import me.tofaa.entitylib.meta.mobs.golem.ShulkerMeta; +import me.tofaa.entitylib.meta.mobs.golem.SnowGolemMeta; import me.tofaa.entitylib.meta.mobs.horse.*; +import me.tofaa.entitylib.meta.mobs.monster.*; +import me.tofaa.entitylib.meta.mobs.monster.piglin.PiglinBruteMeta; +import me.tofaa.entitylib.meta.mobs.monster.piglin.PiglinMeta; +import me.tofaa.entitylib.meta.mobs.monster.raider.*; +import me.tofaa.entitylib.meta.mobs.monster.skeleton.SkeletonMeta; +import me.tofaa.entitylib.meta.mobs.monster.skeleton.StrayMeta; +import me.tofaa.entitylib.meta.mobs.monster.skeleton.WitherSkeletonMeta; +import me.tofaa.entitylib.meta.mobs.monster.zombie.*; +import me.tofaa.entitylib.meta.mobs.passive.*; +import me.tofaa.entitylib.meta.mobs.water.*; +import me.tofaa.entitylib.meta.mobs.minecart.*; +import me.tofaa.entitylib.meta.mobs.other.*; import me.tofaa.entitylib.meta.mobs.tameable.CatMeta; import me.tofaa.entitylib.meta.mobs.tameable.ParrotMeta; import me.tofaa.entitylib.meta.mobs.tameable.WolfMeta; -import me.tofaa.entitylib.meta.projectile.SmallFireballMeta; -import me.tofaa.entitylib.meta.projectile.ThrownEggMeta; -import me.tofaa.entitylib.meta.projectile.ThrownExpBottleMeta; -import me.tofaa.entitylib.meta.projectile.ThrownTridentMeta; +import me.tofaa.entitylib.meta.mobs.villager.VillagerMeta; +import me.tofaa.entitylib.meta.mobs.villager.WanderingTraderMeta; +import me.tofaa.entitylib.meta.projectile.*; import me.tofaa.entitylib.meta.types.PlayerMeta; import org.jetbrains.annotations.Nullable; @@ -27,45 +41,122 @@ import static com.github.retrooper.packetevents.protocol.entity.type.EntityTypes final class MetaConverterRegistry { private final Map> converters = new HashMap<>(); + private final Map> metaClasses = new HashMap<>(); MetaConverterRegistry() { - put(PLAYER, PlayerMeta::new); - put(THROWN_EXP_BOTTLE, ThrownExpBottleMeta::new); - put(EGG, ThrownEggMeta::new); - put(TRIDENT, ThrownTridentMeta::new); - put(POTION, ThrownTridentMeta::new); - put(SMALL_FIREBALL, SmallFireballMeta::new); - put(PIG, PigMeta::new); - put(COW, CowMeta::new); - put(CHICKEN, ChickenMeta::new); - put(BEE, BeeMeta::new); - put(TURTLE, TurtleMeta::new); - put(DONKEY, DonkeyMeta::new); - put(SHEEP, SheepMeta::new); - put(RABBIT, RabbitMeta::new); - put(POLAR_BEAR, PolarBearMeta::new); - put(OCELOT, OcelotMeta::new ); - put(PANDA, PandaMeta::new); - put(STRIDER, StriderMeta::new); - put(FOX, FoxMeta::new); - put(FROG, FrogMeta::new); - put(GOAT, GoatMeta::new); - put(HOGLIN, HoglinMeta::new); - put(CAT, CatMeta::new); - put(PARROT, ParrotMeta::new); - put(WOLF, WolfMeta::new); - put(DONKEY, DonkeyMeta::new); - put(HORSE, HorseMeta::new); - put(LLAMA, LlamaMeta::new); - put(MULE, MuleMeta::new); - put(SKELETON_HORSE, SkeletonHorseMeta::new); - put(ZOMBIE_HORSE, ZombieHorseMeta::new); - put(SLIME, SlimeMeta::new); - put(MAGMA_CUBE, MagmaCubeMeta::new); + put(AREA_EFFECT_CLOUD, AreaEffectCloudMeta.class, AreaEffectCloudMeta::new); + put(ARMOR_STAND, ArmorStandMeta.class, ArmorStandMeta::new); + put(BOAT, BoatMeta.class, BoatMeta::new); + put(DRAGON_FIREBALL, DragonFireballMeta.class, DragonFireballMeta::new); + put(END_CRYSTAL, EndCrystalMeta.class, EndCrystalMeta::new); + put(ENDER_DRAGON, EnderDragonMeta.class, EnderDragonMeta::new); + put(EVOKER_FANGS, EvokerFangsMeta.class, EvokerFangsMeta::new); + put(FALLING_BLOCK, FallingBlockMeta.class, FallingBlockMeta::new); + put(FIREWORK_ROCKET, FireworkRocketMeta.class, FireworkRocketMeta::new); + put(FISHING_BOBBER, FishingHookMeta.class, FishingHookMeta::new); + put(GLOW_ITEM_FRAME, GlowItemFrameMeta.class, GlowItemFrameMeta::new); + put(ITEM_FRAME, ItemFrameMeta.class, ItemFrameMeta::new); + put(LEASH_KNOT, LeashKnotMeta.class, LeashKnotMeta::new); + put(LIGHTNING_BOLT, LightningBoltMeta.class, LightningBoltMeta::new); + put(LLAMA_SPIT, LlamaSpitMeta.class, LlamaSpitMeta::new); + put(MARKER, MarkerMeta.class, MarkerMeta::new); + put(PAINTING, PaintingMeta.class, PaintingMeta::new); + put(PRIMED_TNT, PrimedTntMeta.class, PrimedTntMeta::new); + put(WITHER_SKULL, WitherSkullMeta.class, WitherSkullMeta::new); + put(ZOGLIN, ZoglinMeta.class, ZoglinMeta::new); + put(WITHER, WitherMeta.class, WitherMeta::new); + put(VEX, VexMeta.class, VexMeta::new); + put(SPIDER, SpiderMeta.class, SpiderMeta::new); + put(SILVERFISH, SilverfishMeta.class, SilverfishMeta::new); + put(GUARDIAN, GuardianMeta.class, GuardianMeta::new); + put(GIANT, GiantMeta.class, GiantMeta::new); + put(ENDERMITE, EndermiteMeta.class, EndermiteMeta::new); + put(ENDERMITE, EndermiteMeta.class, EndermiteMeta::new); + put(ELDER_GUARDIAN, ElderGuardianMeta.class, ElderGuardianMeta::new); + put(CREEPER, CreeperMeta.class, CreeperMeta::new); + put(CAVE_SPIDER, CaveSpiderMeta.class, CaveSpiderMeta::new); + put(BLAZE, BlazeMeta.class, BlazeMeta::new); + put(PIGLIN, PiglinMeta.class, PiglinMeta::new); + put(PIGLIN_BRUTE, PiglinBruteMeta.class, PiglinBruteMeta::new); + put(EVOKER, EvokerMeta.class, EvokerMeta::new); + put(ILLUSIONER, IllusionerMeta.class, IllusionerMeta::new); + put(PILLAGER, PillagerMeta.class, PillagerMeta::new); + put(RAVAGER, RavagerMeta.class, RavagerMeta::new); + put(VINDICATOR, VindicatorMeta.class, VindicatorMeta::new); + put(WITCH, WitchMeta.class, WitchMeta::new); + put(SKELETON, SkeletonMeta.class, SkeletonMeta::new); + put(STRAY, StrayMeta.class, StrayMeta::new); + put(WITHER_SKELETON, WitherSkeletonMeta.class, WitherSkeletonMeta::new); + put(DROWNED, DrownedMeta.class, DrownedMeta::new); + put(HUSK, HuskMeta.class, HuskMeta::new); + put(ZOMBIE, ZombieMeta.class, ZombieMeta::new); + put(ZOMBIE_VILLAGER, ZombieVillagerMeta.class, ZombieVillagerMeta::new); + put(ZOMBIFIED_PIGLIN, ZombifiedPiglinMeta.class, ZombifiedPiglinMeta::new); + put(AXOLOTL, AxolotlMeta.class, AxolotlMeta::new); + put(COD, CodMeta.class, CodMeta::new); + put(DOLPHIN, DolphinMeta.class, DolphinMeta::new); + put(GLOW_SQUID, GlowSquidMeta.class, GlowSquidMeta::new); + put(PUFFERFISH, PufferFishMeta.class, PufferFishMeta::new); + put(SALMON, SalmonMeta.class, SalmonMeta::new); + put(TROPICAL_FISH, TropicalFishMeta.class, TropicalFishMeta::new); + put(ARROW, ArrowMeta.class, ArrowMeta::new); + put(VILLAGER, VillagerMeta.class, VillagerMeta::new); + put(WANDERING_TRADER, WanderingTraderMeta.class, WanderingTraderMeta::new); + put(CHEST_MINECART, ChestMinecartMeta.class, ChestMinecartMeta::new); + put(COMMAND_BLOCK_MINECART, CommandBlockMinecartMeta.class, CommandBlockMinecartMeta::new); + put(COMMAND_BLOCK_MINECART, CommandBlockMinecartMeta.class, CommandBlockMinecartMeta::new); + put(FURNACE_MINECART, FurnaceMinecartMeta.class, FurnaceMinecartMeta::new); + put(HOPPER_MINECART, FurnaceMinecartMeta.class, FurnaceMinecartMeta::new); + put(SPAWNER_MINECART, SpawnerMinecartMeta.class, SpawnerMinecartMeta::new); + put(TNT_MINECART, TntMinecartMeta.class, TntMinecartMeta::new); + put(PLAYER, PlayerMeta.class, PlayerMeta::new); + put(THROWN_EXP_BOTTLE, ThrownExpBottleMeta.class, ThrownExpBottleMeta::new); + put(EGG, ThrownEggMeta.class, ThrownEggMeta::new); + put(TRIDENT, ThrownTridentMeta.class, ThrownTridentMeta::new); + put(POTION, ThrownTridentMeta.class, ThrownTridentMeta::new); + put(SMALL_FIREBALL, SmallFireballMeta.class, SmallFireballMeta::new); + put(PIG, PigMeta.class, PigMeta::new); + put(COW, CowMeta.class, CowMeta::new); + put(CHICKEN, ChickenMeta.class, ChickenMeta::new); + put(BEE, BeeMeta.class, BeeMeta::new); + put(TURTLE, TurtleMeta.class, TurtleMeta::new); + put(DONKEY, DonkeyMeta.class, DonkeyMeta::new); + put(SHEEP, SheepMeta.class, SheepMeta::new); + put(RABBIT, RabbitMeta.class, RabbitMeta::new); + put(POLAR_BEAR, PolarBearMeta.class, PolarBearMeta::new); + put(OCELOT, OcelotMeta.class, OcelotMeta::new ); + put(PANDA, PandaMeta.class, PandaMeta::new); + put(STRIDER, StriderMeta.class, StriderMeta::new); + put(FOX, FoxMeta.class, FoxMeta::new); + put(FROG, FrogMeta.class, FrogMeta::new); + put(GOAT, GoatMeta.class, GoatMeta::new); + put(HOGLIN, HoglinMeta.class, HoglinMeta::new); + put(CAT, CatMeta.class, CatMeta::new); + put(PARROT, ParrotMeta.class, ParrotMeta::new); + put(WOLF, WolfMeta.class, WolfMeta::new); + put(DONKEY, DonkeyMeta.class, DonkeyMeta::new); + put(HORSE, HorseMeta.class, HorseMeta::new); + put(LLAMA, LlamaMeta.class, LlamaMeta::new); + put(MULE, MuleMeta.class, MuleMeta::new); + put(SKELETON_HORSE, SkeletonHorseMeta.class, SkeletonHorseMeta::new); + put(ZOMBIE_HORSE, ZombieHorseMeta.class, ZombieHorseMeta::new); + put(SLIME, SlimeMeta.class, SlimeMeta::new); + put(MAGMA_CUBE, MagmaCubeMeta.class, MagmaCubeMeta::new); + put(SHULKER_BULLET, ShulkerBulletMeta.class, ShulkerBulletMeta::new); + put(TRADER_LLAMA, TraderLlamaMeta.class, TraderLlamaMeta::new); + put(BAT, BatMeta.class, BatMeta::new); + put(IRON_GOLEM, IronGolemMeta.class, IronGolemMeta::new); + put(SHULKER, ShulkerMeta.class, ShulkerMeta::new); + put(SNOW_GOLEM, SnowGolemMeta.class, SnowGolemMeta::new); } - private void put(EntityType entityType, BiFunction function) { + private void put(EntityType entityType, Class metaClass, BiFunction function) { converters.put(entityType, function); + metaClasses.put(entityType, metaClass); + } + + public Class getMetaClass(EntityType entityType) { + return (Class) metaClasses.get(entityType); } public @Nullable BiFunction get(EntityType entityType) { diff --git a/src/main/java/me/tofaa/entitylib/entity/EntityInteractionProcessor.java b/src/main/java/me/tofaa/entitylib/entity/EntityInteractionProcessor.java new file mode 100644 index 0000000..5eb6c79 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/entity/EntityInteractionProcessor.java @@ -0,0 +1,18 @@ +package me.tofaa.entitylib.entity; + +import com.github.retrooper.packetevents.protocol.player.InteractionHand; +import com.github.retrooper.packetevents.protocol.player.User; +import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientInteractEntity; +import org.jetbrains.annotations.NotNull; + +@FunctionalInterface +public interface EntityInteractionProcessor { + + void process( + @NotNull WrapperEntity entity, + @NotNull WrapperPlayClientInteractEntity.InteractAction action, + @NotNull InteractionHand hand, + @NotNull User user + ); + +} diff --git a/src/main/java/me/tofaa/entitylib/entity/WrapperEntity.java b/src/main/java/me/tofaa/entitylib/entity/WrapperEntity.java new file mode 100644 index 0000000..603bb5c --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/entity/WrapperEntity.java @@ -0,0 +1,139 @@ +package me.tofaa.entitylib.entity; + +import com.github.retrooper.packetevents.protocol.entity.type.EntityType; +import com.github.retrooper.packetevents.protocol.player.User; +import com.github.retrooper.packetevents.protocol.world.Location; +import com.github.retrooper.packetevents.wrapper.PacketWrapper; +import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerDestroyEntities; +import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerEntityTeleport; +import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSpawnEntity; +import me.tofaa.entitylib.EntityIdProvider; +import me.tofaa.entitylib.EntityLib; +import me.tofaa.entitylib.meta.EntityMeta; +import org.jetbrains.annotations.NotNull; + +import java.util.HashSet; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; + +public class WrapperEntity { + + public static EntityIdProvider ID_PROVIDER = EntityIdProvider.simple(); + + private final EntityType entityType; + private final int entityId; + private final Optional uuid; + private final EntityMeta meta; + private final Set viewers = new HashSet<>(); + + private Location location; + private boolean spawned; + + public WrapperEntity(@NotNull UUID uuid, EntityType entityType, EntityMeta meta) { + this.uuid = Optional.of(uuid); + this.entityType = entityType; + this.entityId = ID_PROVIDER.provide(); + this.meta = meta; + } + + public boolean spawn(Location location) { + if (spawned) return false; + this.location = location; + this.spawned = true; + sendPacketToViewers( + new WrapperPlayServerSpawnEntity( + entityId, + this.uuid, + entityType, + location.getPosition(), + location.getPitch(), + location.getYaw(), + location.getYaw(), + 0, + Optional.empty() + ) + ); + return true; + } + + public void remove() { + if (!spawned) return; + spawned = false; + sendPacketToViewers(new WrapperPlayServerDestroyEntities(entityId)); + } + + public void teleport(Location location, boolean onGround) { + this.location = location; + sendPacketToViewers( + new WrapperPlayServerEntityTeleport(entityId, location, onGround) + ); + } + + public void teleport(Location location) { + teleport(location, true); + } + + public void sendPacketToViewers(PacketWrapper packet) { + viewers.forEach(uuid -> { + Object user = EntityLib.getPacketEvents().getProtocolManager().getChannel(uuid); + EntityLib.getPacketEvents().getProtocolManager().sendPacket(user, packet); + }); + } + + public boolean addViewer(UUID uuid) { + if (!viewers.add(uuid)) { + return false; + } + if (!spawned) return false; + WrapperPlayServerSpawnEntity packet = new WrapperPlayServerSpawnEntity( + entityId, + this.uuid, + entityType, + location.getPosition(), + location.getPitch(), + location.getYaw(), + location.getYaw(), + 0, + Optional.empty() + ); + EntityLib.sendPacket(uuid, packet); + return true; + } + + public void addViewer(User user) { + addViewer(user.getUUID()); + } + + public void removeViewer(UUID uuid) { + if (!viewers.remove(uuid)) { + return; + } + EntityLib.sendPacket(uuid, new WrapperPlayServerDestroyEntities(entityId)); + } + + public EntityMeta getMeta() { + return meta; + } + + public UUID getUuid() { + return uuid.get(); + } + + public EntityType getEntityType() { + return entityType; + } + + public int getEntityId() { + return entityId; + } + + public Class getMetaClass() { + return EntityLib.getMetaClassOf(entityType); + } + + public boolean hasSpawned() { + return spawned; + } + +} diff --git a/src/main/java/me/tofaa/entitylib/extras/Rotation.java b/src/main/java/me/tofaa/entitylib/extras/Rotation.java new file mode 100644 index 0000000..d79110d --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/extras/Rotation.java @@ -0,0 +1,38 @@ +package me.tofaa.entitylib.extras; + +public enum Rotation { + + /** + * No rotation + */ + NONE, + /** + * Rotated clockwise by 45 degrees + */ + CLOCKWISE_45, + /** + * Rotated clockwise by 90 degrees + */ + CLOCKWISE, + /** + * Rotated clockwise by 135 degrees + */ + CLOCKWISE_135, + /** + * Flipped upside-down, a 180 degree rotation + */ + FLIPPED, + /** + * Flipped upside-down + 45 degree rotation + */ + FLIPPED_45, + /** + * Rotated counter-clockwise by 90 degrees + */ + COUNTER_CLOCKWISE, + /** + * Rotated counter-clockwise by 45 degrees + */ + COUNTER_CLOCKWISE_45; + +} \ No newline at end of file diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/BatMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/BatMeta.java new file mode 100644 index 0000000..e98f8e3 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/BatMeta.java @@ -0,0 +1,26 @@ +package me.tofaa.entitylib.meta.mobs; + +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.MobMeta; + +public class BatMeta extends MobMeta { + + public static final byte OFFSET = MobMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + private final static byte IS_HANGING_BIT = 0x01; + + public BatMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public boolean isHanging() { + return getMaskBit(OFFSET, IS_HANGING_BIT); + } + + public void setHanging(boolean value) { + setMaskBit(OFFSET, IS_HANGING_BIT, value); + } + + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/golem/IronGolemMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/golem/IronGolemMeta.java new file mode 100644 index 0000000..55e83ca --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/golem/IronGolemMeta.java @@ -0,0 +1,26 @@ +package me.tofaa.entitylib.meta.mobs.golem; + +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.MobMeta; + +public class IronGolemMeta extends MobMeta { + + public static final byte OFFSET = MobMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 1; + + private final static byte PLAYER_CREATED_BIT = 0x01; + + public IronGolemMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public boolean isPlayerCreated() { + return getMaskBit(OFFSET, PLAYER_CREATED_BIT); + } + + public void setPlayerCreated(boolean value) { + setMaskBit(OFFSET, PLAYER_CREATED_BIT, value); + } + + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/golem/ShulkerMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/golem/ShulkerMeta.java new file mode 100644 index 0000000..88617a9 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/golem/ShulkerMeta.java @@ -0,0 +1,54 @@ +package me.tofaa.entitylib.meta.mobs.golem; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import com.github.retrooper.packetevents.protocol.world.Direction; +import com.github.retrooper.packetevents.util.Vector3i; +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.MobMeta; + +import java.util.Optional; + +public class ShulkerMeta extends MobMeta { + + public static final byte OFFSET = MobMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 1; + + + public ShulkerMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public Direction getAttachFace() { + return super.metadata.getIndex(OFFSET, Direction.DOWN); + } + + public void setAttachFace(Direction value) { + super.metadata.setIndex(OFFSET, EntityDataTypes.INT, value.ordinal()); + } + + public Optional getAttachmentPosition() { + return super.metadata.getIndex(offset(OFFSET, 1), Optional.empty()); + } + + public void setAttachmentPosition(Vector3i value) { + super.metadata.setIndex(offset(OFFSET, 1), EntityDataTypes.OPTIONAL_BLOCK_POSITION, Optional.of(value)); + } + + public byte getShieldHeight() { + return super.metadata.getIndex(offset(OFFSET, 2), (byte) 0); + } + + public void setShieldHeight(byte value) { + super.metadata.setIndex(offset(OFFSET, 2), EntityDataTypes.BYTE, value); + } + + public byte getColor() { + return super.metadata.getIndex(offset(OFFSET, 3), (byte) 10); + } + + public void setColor(byte value) { + super.metadata.setIndex(offset(OFFSET, 3), EntityDataTypes.BYTE, value); + } + + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/golem/SnowGolemMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/golem/SnowGolemMeta.java new file mode 100644 index 0000000..d2bb5a5 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/golem/SnowGolemMeta.java @@ -0,0 +1,25 @@ +package me.tofaa.entitylib.meta.mobs.golem; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.MobMeta; + +public class SnowGolemMeta extends MobMeta { + + public static final byte OFFSET = MobMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 1; + + public SnowGolemMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public boolean isHasPumpkinHat() { + return super.metadata.getIndex(OFFSET, (byte) 0x10) == (byte) 0x10; + } + + public void setHasPumpkinHat(boolean value) { + byte var = value ? (byte) 0x10 : (byte) 0x00; + super.metadata.setIndex(OFFSET, EntityDataTypes.BYTE, var); + } + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/horse/TraderLlamaMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/horse/TraderLlamaMeta.java new file mode 100644 index 0000000..a4d101d --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/horse/TraderLlamaMeta.java @@ -0,0 +1,14 @@ +package me.tofaa.entitylib.meta.mobs.horse; + +import me.tofaa.entitylib.meta.EntityMeta; +import me.tofaa.entitylib.meta.Metadata; + +public class TraderLlamaMeta extends EntityMeta { + + public static final byte OFFSET = EntityMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public TraderLlamaMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/minecart/BaseMinecartMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/minecart/BaseMinecartMeta.java new file mode 100644 index 0000000..8f17929 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/minecart/BaseMinecartMeta.java @@ -0,0 +1,62 @@ +package me.tofaa.entitylib.meta.mobs.minecart; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import me.tofaa.entitylib.meta.EntityMeta; +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.ObjectData; + +public abstract class BaseMinecartMeta extends EntityMeta implements ObjectData { + + public static final byte OFFSET = EntityMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 6; + + protected BaseMinecartMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public int getShakingPower() { + return super.metadata.getIndex(OFFSET, 0); + } + + public void setShakingPower(int value) { + super.metadata.setIndex(OFFSET, EntityDataTypes.INT, value); + } + + public int getShakingDirection() { + return super.metadata.getIndex(offset(OFFSET, 1), 1); + } + + public void setShakingDirection(int value) { + super.metadata.setIndex(offset(OFFSET, 1), EntityDataTypes.INT, value); + } + + public float getShakingMultiplier() { + return super.metadata.getIndex(offset(OFFSET, 2), 0F); + } + + public void setShakingMultiplier(float value) { + super.metadata.setIndex(offset(OFFSET, 2), EntityDataTypes.FLOAT, value); + } + + public int getCustomBlockIdAndDamage() { + return super.metadata.getIndex(offset(OFFSET, 3), 0); + } + + public void setCustomBlockIdAndDamage(int value) { + super.metadata.setIndex(offset(OFFSET, 3), EntityDataTypes.INT, value); + } + + // in 16th of a block + public int getCustomBlockYPosition() { + return super.metadata.getIndex(offset(OFFSET, 4), 6); + } + + public void setCustomBlockYPosition(int value) { + super.metadata.setIndex(offset(OFFSET, 4), EntityDataTypes.INT, value); + } + + @Override + public boolean requiresVelocityPacketAtSpawn() { + return true; + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/minecart/ChestMinecartMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/minecart/ChestMinecartMeta.java new file mode 100644 index 0000000..b3d0b7a --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/minecart/ChestMinecartMeta.java @@ -0,0 +1,19 @@ +package me.tofaa.entitylib.meta.mobs.minecart; + +import me.tofaa.entitylib.meta.Metadata; + +public class ChestMinecartMeta extends BaseMinecartMeta{ + + public static final byte OFFSET = BaseMinecartMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + + public ChestMinecartMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + @Override + public int getObjectData() { + return 1; + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/minecart/CommandBlockMinecartMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/minecart/CommandBlockMinecartMeta.java new file mode 100644 index 0000000..10459d2 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/minecart/CommandBlockMinecartMeta.java @@ -0,0 +1,38 @@ +package me.tofaa.entitylib.meta.mobs.minecart; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import me.tofaa.entitylib.meta.Metadata; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import org.jetbrains.annotations.NotNull; + +public class CommandBlockMinecartMeta extends BaseMinecartMeta{ + + public static final byte OFFSET = BaseMinecartMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 2; + + public CommandBlockMinecartMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public @NotNull String getCommand() { + return super.metadata.getIndex(OFFSET, ""); + } + + public void setCommand(@NotNull String value) { + super.metadata.setIndex(OFFSET, EntityDataTypes.STRING, value); + } + + public @NotNull Component getLastOutput() { + return super.metadata.getIndex(offset(OFFSET, 1), Component.empty()); + } + + public void setLastOutput(@NotNull Component value) { + super.metadata.setIndex(offset(OFFSET, 1), EntityDataTypes.COMPONENT, GsonComponentSerializer.gson().serialize(value)); + } + + @Override + public int getObjectData() { + return 6; + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/minecart/FurnaceMinecartMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/minecart/FurnaceMinecartMeta.java new file mode 100644 index 0000000..9f745bb --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/minecart/FurnaceMinecartMeta.java @@ -0,0 +1,26 @@ +package me.tofaa.entitylib.meta.mobs.minecart; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import me.tofaa.entitylib.meta.Metadata; + +public class FurnaceMinecartMeta extends BaseMinecartMeta { + + public static final byte OFFSET = BaseMinecartMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 1; + + public FurnaceMinecartMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public boolean isHasFuel() { + return super.metadata.getIndex(OFFSET, false); + } + + public void setHasFuel(boolean value) { + super.metadata.setIndex(OFFSET, EntityDataTypes.BOOLEAN, value); + } + + @Override + public int getObjectData() { + return 2; } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/minecart/HopperMinecartMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/minecart/HopperMinecartMeta.java new file mode 100644 index 0000000..ac8a4fb --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/minecart/HopperMinecartMeta.java @@ -0,0 +1,18 @@ +package me.tofaa.entitylib.meta.mobs.minecart; + +import me.tofaa.entitylib.meta.Metadata; + +public class HopperMinecartMeta extends BaseMinecartMeta { + + public static final byte OFFSET = BaseMinecartMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public HopperMinecartMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + @Override + public int getObjectData() { + return 5; + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/minecart/MinecartMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/minecart/MinecartMeta.java new file mode 100644 index 0000000..3c43de7 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/minecart/MinecartMeta.java @@ -0,0 +1,18 @@ +package me.tofaa.entitylib.meta.mobs.minecart; + +import me.tofaa.entitylib.meta.Metadata; + +public class MinecartMeta extends BaseMinecartMeta { + + public static final byte OFFSET = BaseMinecartMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public MinecartMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + @Override + public int getObjectData() { + return 0; + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/minecart/SpawnerMinecartMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/minecart/SpawnerMinecartMeta.java new file mode 100644 index 0000000..8e3a7e8 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/minecart/SpawnerMinecartMeta.java @@ -0,0 +1,19 @@ +package me.tofaa.entitylib.meta.mobs.minecart; + +import me.tofaa.entitylib.meta.Metadata; + +public class SpawnerMinecartMeta extends BaseMinecartMeta { + + public static final byte OFFSET = BaseMinecartMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public SpawnerMinecartMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + @Override + public int getObjectData() { + return 4; + } + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/minecart/TntMinecartMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/minecart/TntMinecartMeta.java new file mode 100644 index 0000000..9ceca9b --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/minecart/TntMinecartMeta.java @@ -0,0 +1,18 @@ +package me.tofaa.entitylib.meta.mobs.minecart; + +import me.tofaa.entitylib.meta.Metadata; + +public class TntMinecartMeta extends BaseMinecartMeta{ + + public static final byte OFFSET = BaseMinecartMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public TntMinecartMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + @Override + public int getObjectData() { + return 3; + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/BlazeMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/BlazeMeta.java new file mode 100644 index 0000000..3e45084 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/BlazeMeta.java @@ -0,0 +1,26 @@ +package me.tofaa.entitylib.meta.mobs.monster; + +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.MobMeta; + +public class BlazeMeta extends MobMeta { + + public static final byte OFFSET = MobMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 1; + + private final static byte ON_FIRE_BIT = 0x01; + + public BlazeMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public boolean isOnFire() { + return getMaskBit(OFFSET, ON_FIRE_BIT); + } + + public void setOnFire(boolean value) { + setMaskBit(OFFSET, ON_FIRE_BIT, value); + } + + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/CaveSpiderMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/CaveSpiderMeta.java new file mode 100644 index 0000000..73eab25 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/CaveSpiderMeta.java @@ -0,0 +1,13 @@ +package me.tofaa.entitylib.meta.mobs.monster; + +import me.tofaa.entitylib.meta.Metadata; + +public class CaveSpiderMeta extends SpiderMeta{ + + public static final byte OFFSET = SpiderMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public CaveSpiderMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/CreeperMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/CreeperMeta.java new file mode 100644 index 0000000..3867cc9 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/CreeperMeta.java @@ -0,0 +1,49 @@ +package me.tofaa.entitylib.meta.mobs.monster; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.MobMeta; +import org.jetbrains.annotations.NotNull; + +public class CreeperMeta extends MobMeta { + + public static final byte OFFSET = MobMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 3; + + public CreeperMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + @NotNull + public State getState() { + int id = super.metadata.getIndex(OFFSET, -1); + return id == -1 ? State.IDLE : State.FUSE; + } + + public void setState(@NotNull State value) { + super.metadata.setIndex(OFFSET, EntityDataTypes.INT, value == State.IDLE ? -1 : 1); + } + + public boolean isCharged() { + return super.metadata.getIndex(offset(OFFSET, 1), false); + } + + public void setCharged(boolean value) { + super.metadata.setIndex(offset(OFFSET, 1), EntityDataTypes.BOOLEAN, value); + } + + public boolean isIgnited() { + return super.metadata.getIndex(offset(OFFSET, 2), false); + } + + public void setIgnited(boolean value) { + super.metadata.setIndex(offset(OFFSET, 2), EntityDataTypes.BOOLEAN, value); + } + + public enum State { + IDLE, + FUSE + } + + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/ElderGuardianMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/ElderGuardianMeta.java new file mode 100644 index 0000000..f292b68 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/ElderGuardianMeta.java @@ -0,0 +1,13 @@ +package me.tofaa.entitylib.meta.mobs.monster; + +import me.tofaa.entitylib.meta.Metadata; + +public class ElderGuardianMeta extends GuardianMeta{ + + public static final byte OFFSET = GuardianMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public ElderGuardianMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/EndermanMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/EndermanMeta.java new file mode 100644 index 0000000..0ba5c73 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/EndermanMeta.java @@ -0,0 +1,44 @@ +package me.tofaa.entitylib.meta.mobs.monster; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.MobMeta; +import org.jetbrains.annotations.Nullable; + +import java.util.Optional; + +public class EndermanMeta extends MobMeta { + + public static final byte OFFSET = MobMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 3; + + public EndermanMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public Integer getCarriedBlockID() { + return super.metadata.getIndex(OFFSET, null); + } + + public void setCarriedBlockID(@Nullable Integer value) { + super.metadata.setIndex(OFFSET, EntityDataTypes.OPTIONAL_INT, Optional.ofNullable(value)); + } + + public boolean isScreaming() { + return super.metadata.getIndex(offset(OFFSET, 1), false); + } + + public void setScreaming(boolean value) { + super.metadata.setIndex(offset(OFFSET, 1), EntityDataTypes.BOOLEAN, value); + } + + public boolean isStaring() { + return super.metadata.getIndex(offset(OFFSET, 2), false); + } + + public void setStaring(boolean value) { + super.metadata.setIndex(offset(OFFSET, 2), EntityDataTypes.BOOLEAN, value); + } + + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/EndermiteMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/EndermiteMeta.java new file mode 100644 index 0000000..4ff42c9 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/EndermiteMeta.java @@ -0,0 +1,14 @@ +package me.tofaa.entitylib.meta.mobs.monster; + +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.MobMeta; + +public class EndermiteMeta extends MobMeta { + + public static final byte OFFSET = MobMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public EndermiteMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/GhastMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/GhastMeta.java similarity index 93% rename from src/main/java/me/tofaa/entitylib/meta/mobs/GhastMeta.java rename to src/main/java/me/tofaa/entitylib/meta/mobs/monster/GhastMeta.java index 6dfd0c2..5192227 100644 --- a/src/main/java/me/tofaa/entitylib/meta/mobs/GhastMeta.java +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/GhastMeta.java @@ -1,4 +1,4 @@ -package me.tofaa.entitylib.meta.mobs; +package me.tofaa.entitylib.meta.mobs.monster; import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; import me.tofaa.entitylib.meta.Metadata; diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/GiantMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/GiantMeta.java new file mode 100644 index 0000000..1d00514 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/GiantMeta.java @@ -0,0 +1,13 @@ +package me.tofaa.entitylib.meta.mobs.monster; + +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.MobMeta; + +public class GiantMeta extends MobMeta { + public static final byte OFFSET = MobMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public GiantMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/GuardianMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/GuardianMeta.java new file mode 100644 index 0000000..39ef78a --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/GuardianMeta.java @@ -0,0 +1,36 @@ +package me.tofaa.entitylib.meta.mobs.monster; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.MobMeta; + +public class GuardianMeta extends MobMeta { + + public static final byte OFFSET = MobMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 2; + + private int target = -1; + + public GuardianMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public boolean isRetractingSpikes() { + return super.metadata.getIndex(OFFSET, false); + } + + public void setRetractingSpikes(boolean retractingSpikes) { + super.metadata.setIndex(OFFSET, EntityDataTypes.BOOLEAN, retractingSpikes); + } + + public int getTarget() { + return this.target; + } + + public void setTarget(int target) { + this.target = target; + super.metadata.setIndex(offset(OFFSET, 1), EntityDataTypes.INT, target == -1 ? 0 : target); + } + + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/PhantomMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/PhantomMeta.java similarity index 93% rename from src/main/java/me/tofaa/entitylib/meta/mobs/PhantomMeta.java rename to src/main/java/me/tofaa/entitylib/meta/mobs/monster/PhantomMeta.java index ccc7202..11641ff 100644 --- a/src/main/java/me/tofaa/entitylib/meta/mobs/PhantomMeta.java +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/PhantomMeta.java @@ -1,4 +1,4 @@ -package me.tofaa.entitylib.meta.mobs; +package me.tofaa.entitylib.meta.mobs.monster; import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; import me.tofaa.entitylib.meta.Metadata; diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/SilverfishMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/SilverfishMeta.java new file mode 100644 index 0000000..19e3789 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/SilverfishMeta.java @@ -0,0 +1,14 @@ +package me.tofaa.entitylib.meta.mobs.monster; + +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.MobMeta; + +public class SilverfishMeta extends MobMeta { + public static final byte OFFSET = MobMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + + public SilverfishMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/SpiderMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/SpiderMeta.java new file mode 100644 index 0000000..13b0de0 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/SpiderMeta.java @@ -0,0 +1,27 @@ +package me.tofaa.entitylib.meta.mobs.monster; + +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.MobMeta; + +public class SpiderMeta extends MobMeta { + + public static final byte OFFSET = MobMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 1; + + private final static byte CLIMBING_BIT = 0x01; + + + public SpiderMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public boolean isClimbing() { + return getMaskBit(OFFSET, CLIMBING_BIT); + } + + public void setClimbing(boolean value) { + setMaskBit(OFFSET, CLIMBING_BIT, value); + } + + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/VexMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/VexMeta.java new file mode 100644 index 0000000..ea8835d --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/VexMeta.java @@ -0,0 +1,25 @@ +package me.tofaa.entitylib.meta.mobs.monster; + +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.MobMeta; + +public class VexMeta extends MobMeta { + + public static final byte OFFSET = MobMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 1; + + private final static byte ATTACKING_BIT = 0x01; + + public VexMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public boolean isAttacking() { + return getMaskBit(OFFSET, ATTACKING_BIT); + } + + public void setAttacking(boolean value) { + setMaskBit(OFFSET, ATTACKING_BIT, value); + } + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/WitherMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/WitherMeta.java new file mode 100644 index 0000000..2f8c861 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/WitherMeta.java @@ -0,0 +1,55 @@ +package me.tofaa.entitylib.meta.mobs.monster; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.MobMeta; + +public class WitherMeta extends MobMeta { + + public static final byte OFFSET = MobMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 4; + + private int centerHead = -1; + private int leftHead = -1; + private int rightHead = -1; + + public WitherMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public void setCenterHead(int centerHead) { + this.centerHead = centerHead; + super.metadata.setIndex(offset(OFFSET,0), EntityDataTypes.INT, centerHead == -1 ? 0 : centerHead); + } + + public void setLeftHead(int leftHead) { + this.leftHead = leftHead; + super.metadata.setIndex(offset(OFFSET,1), EntityDataTypes.INT, leftHead == -1 ? 0 : leftHead); + } + + public void setRightHead(int rightHead) { + this.rightHead = rightHead; + super.metadata.setIndex(offset(OFFSET,2), EntityDataTypes.INT, rightHead == -1 ? 0 : rightHead); + } + + public int getCenterHead() { + return centerHead; + } + + public int getLeftHead() { + return leftHead; + } + + public int getRightHead() { + return rightHead; + } + + public int getInvulnerableTime() { + return super.metadata.getIndex(offset(OFFSET, 3), 0); + } + + public void setInvulnerableTime(int value) { + super.metadata.setIndex(offset(OFFSET, 3), EntityDataTypes.INT, value); + } + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/ZoglinMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/ZoglinMeta.java new file mode 100644 index 0000000..0df787f --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/ZoglinMeta.java @@ -0,0 +1,28 @@ +package me.tofaa.entitylib.meta.mobs.monster; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.MobMeta; + +public class ZoglinMeta extends MobMeta { + + public static final byte OFFSET = MobMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 1; + + public ZoglinMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + + public boolean isBaby() { + return super.metadata.getIndex(OFFSET, false); + } + + public void setBaby(boolean value) { + if (isBaby() == value) { + return; + } + super.metadata.setIndex(OFFSET, EntityDataTypes.BOOLEAN, value); + } + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/piglin/BasePiglinMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/piglin/BasePiglinMeta.java new file mode 100644 index 0000000..2aef4e9 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/piglin/BasePiglinMeta.java @@ -0,0 +1,25 @@ +package me.tofaa.entitylib.meta.mobs.monster.piglin; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.MobMeta; + +public abstract class BasePiglinMeta extends MobMeta { + + public static final byte OFFSET = MobMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 1; + + protected BasePiglinMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public boolean isImmuneToZombification() { + return super.metadata.getIndex(OFFSET, false); + } + + public void setImmuneToZombification(boolean value) { + super.metadata.setIndex(OFFSET, EntityDataTypes.BOOLEAN, value); + } + + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/piglin/PiglinBruteMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/piglin/PiglinBruteMeta.java new file mode 100644 index 0000000..9fe68b6 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/piglin/PiglinBruteMeta.java @@ -0,0 +1,13 @@ +package me.tofaa.entitylib.meta.mobs.monster.piglin; + +import me.tofaa.entitylib.meta.Metadata; + +public class PiglinBruteMeta extends BasePiglinMeta{ + + public static final byte OFFSET = BasePiglinMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public PiglinBruteMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/piglin/PiglinMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/piglin/PiglinMeta.java new file mode 100644 index 0000000..04747f3 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/piglin/PiglinMeta.java @@ -0,0 +1,43 @@ +package me.tofaa.entitylib.meta.mobs.monster.piglin; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import me.tofaa.entitylib.meta.Metadata; + +public class PiglinMeta extends BasePiglinMeta{ + + public static final byte OFFSET = BasePiglinMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 3; + + public PiglinMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public boolean isBaby() { + return super.metadata.getIndex(OFFSET, false); + } + + public void setBaby(boolean value) { + if (isBaby() == value) { + return; + } + super.metadata.setIndex(OFFSET, EntityDataTypes.BOOLEAN, value); + } + + public boolean isChargingCrossbow() { + return super.metadata.getIndex(offset(OFFSET, 1), false); + } + + public void setChargingCrossbow(boolean value) { + super.metadata.setIndex(offset(OFFSET, 1), EntityDataTypes.BOOLEAN, value); + } + + public boolean isDancing() { + return super.metadata.getIndex(offset(OFFSET, 2), false); + } + + public void setDancing(boolean value) { + super.metadata.setIndex(offset(OFFSET, 2), EntityDataTypes.BOOLEAN, value); + } + + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/EvokerMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/EvokerMeta.java new file mode 100644 index 0000000..0f68113 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/EvokerMeta.java @@ -0,0 +1,13 @@ +package me.tofaa.entitylib.meta.mobs.monster.raider; + +import me.tofaa.entitylib.meta.Metadata; + +public class EvokerMeta extends SpellcasterIllagerMeta { + + public static final byte OFFSET = SpellcasterIllagerMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public EvokerMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/IllusionerMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/IllusionerMeta.java new file mode 100644 index 0000000..07ec254 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/IllusionerMeta.java @@ -0,0 +1,13 @@ +package me.tofaa.entitylib.meta.mobs.monster.raider; + +import me.tofaa.entitylib.meta.Metadata; + +public class IllusionerMeta extends SpellcasterIllagerMeta { + + public static final byte OFFSET = SpellcasterIllagerMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public IllusionerMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/PillagerMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/PillagerMeta.java new file mode 100644 index 0000000..83264ef --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/PillagerMeta.java @@ -0,0 +1,14 @@ +package me.tofaa.entitylib.meta.mobs.monster.raider; + +import me.tofaa.entitylib.meta.Metadata; + +public class PillagerMeta extends RaiderMeta{ + + public static final byte OFFSET = RaiderMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + + public PillagerMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/RaiderMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/RaiderMeta.java new file mode 100644 index 0000000..563fe01 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/RaiderMeta.java @@ -0,0 +1,25 @@ +package me.tofaa.entitylib.meta.mobs.monster.raider; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.MobMeta; + +public class RaiderMeta extends MobMeta { + + public static final byte OFFSET = MobMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 1; + + public RaiderMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public boolean isCelebrating() { + return super.metadata.getIndex(OFFSET, false); + } + + public void setCelebrating(boolean value) { + super.metadata.setIndex(OFFSET, EntityDataTypes.BOOLEAN, value); + } + + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/RavagerMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/RavagerMeta.java new file mode 100644 index 0000000..63549a6 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/RavagerMeta.java @@ -0,0 +1,14 @@ +package me.tofaa.entitylib.meta.mobs.monster.raider; + +import me.tofaa.entitylib.meta.Metadata; + +public class RavagerMeta extends RaiderMeta { + + public static final byte OFFSET = RaiderMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + + public RavagerMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/SpellcasterIllagerMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/SpellcasterIllagerMeta.java new file mode 100644 index 0000000..493d361 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/SpellcasterIllagerMeta.java @@ -0,0 +1,13 @@ +package me.tofaa.entitylib.meta.mobs.monster.raider; + +import me.tofaa.entitylib.meta.Metadata; + +public class SpellcasterIllagerMeta extends RaiderMeta{ + + public static final byte OFFSET = RaiderMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 1; + + public SpellcasterIllagerMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/VindicatorMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/VindicatorMeta.java new file mode 100644 index 0000000..ee79027 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/VindicatorMeta.java @@ -0,0 +1,13 @@ +package me.tofaa.entitylib.meta.mobs.monster.raider; + +import me.tofaa.entitylib.meta.Metadata; + +public class VindicatorMeta extends RaiderMeta{ + + public static final byte OFFSET = RaiderMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public VindicatorMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/WitchMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/WitchMeta.java new file mode 100644 index 0000000..808d8fd --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/raider/WitchMeta.java @@ -0,0 +1,23 @@ +package me.tofaa.entitylib.meta.mobs.monster.raider; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import me.tofaa.entitylib.meta.Metadata; + +public class WitchMeta extends RaiderMeta { + + public static final byte OFFSET = RaiderMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 1; + + public WitchMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public boolean isDrinkingPotion() { + return super.metadata.getIndex(OFFSET, false); + } + + public void setDrinkingPotion(boolean value) { + super.metadata.setIndex(OFFSET, EntityDataTypes.BOOLEAN, value); + } + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/skeleton/SkeletonMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/skeleton/SkeletonMeta.java new file mode 100644 index 0000000..d675179 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/skeleton/SkeletonMeta.java @@ -0,0 +1,14 @@ +package me.tofaa.entitylib.meta.mobs.monster.skeleton; + +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.MobMeta; + +public class SkeletonMeta extends MobMeta { + + public static final byte OFFSET = MobMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public SkeletonMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/skeleton/StrayMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/skeleton/StrayMeta.java new file mode 100644 index 0000000..a514fde --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/skeleton/StrayMeta.java @@ -0,0 +1,11 @@ +package me.tofaa.entitylib.meta.mobs.monster.skeleton; + +import me.tofaa.entitylib.meta.Metadata; + +public class StrayMeta extends SkeletonMeta{ + + + public StrayMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/skeleton/WitherSkeletonMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/skeleton/WitherSkeletonMeta.java new file mode 100644 index 0000000..9d6e9ea --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/skeleton/WitherSkeletonMeta.java @@ -0,0 +1,12 @@ +package me.tofaa.entitylib.meta.mobs.monster.skeleton; + +import me.tofaa.entitylib.meta.Metadata; + +public class WitherSkeletonMeta extends SkeletonMeta { + public static final byte OFFSET = SkeletonMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public WitherSkeletonMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/zombie/DrownedMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/zombie/DrownedMeta.java new file mode 100644 index 0000000..1c07800 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/zombie/DrownedMeta.java @@ -0,0 +1,12 @@ +package me.tofaa.entitylib.meta.mobs.monster.zombie; + +import me.tofaa.entitylib.meta.Metadata; + +public class DrownedMeta extends ZombieMeta { + + public static final byte OFFSET = ZombieMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + public DrownedMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/zombie/HuskMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/zombie/HuskMeta.java new file mode 100644 index 0000000..f986fca --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/zombie/HuskMeta.java @@ -0,0 +1,13 @@ +package me.tofaa.entitylib.meta.mobs.monster.zombie; + +import me.tofaa.entitylib.meta.Metadata; + +public class HuskMeta extends ZombieMeta { + + public static final byte OFFSET = ZombieMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public HuskMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/zombie/ZombieMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/zombie/ZombieMeta.java new file mode 100644 index 0000000..856d907 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/zombie/ZombieMeta.java @@ -0,0 +1,35 @@ +package me.tofaa.entitylib.meta.mobs.monster.zombie; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.MobMeta; + +public class ZombieMeta extends MobMeta { + + public static final byte OFFSET = MobMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 3; + + public ZombieMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public boolean isBaby() { + return super.metadata.getIndex(OFFSET, false); + } + + public void setBaby(boolean value) { + if (isBaby() == value) { + return; + } + super.metadata.setIndex(OFFSET, EntityDataTypes.BOOLEAN, value); + } + + public boolean isBecomingDrowned() { + return super.metadata.getIndex(offset(OFFSET, 2), false); + } + + public void setBecomingDrowned(boolean value) { + super.metadata.setIndex(offset(OFFSET, 2), EntityDataTypes.BOOLEAN, value); + } + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/zombie/ZombieVillagerMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/zombie/ZombieVillagerMeta.java new file mode 100644 index 0000000..c7416c5 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/zombie/ZombieVillagerMeta.java @@ -0,0 +1,43 @@ +package me.tofaa.entitylib.meta.mobs.monster.zombie; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import com.github.retrooper.packetevents.protocol.entity.villager.VillagerData; +import com.github.retrooper.packetevents.protocol.entity.villager.profession.VillagerProfessions; +import com.github.retrooper.packetevents.protocol.entity.villager.type.VillagerTypes; +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.mobs.villager.VillagerMeta; + +public class ZombieVillagerMeta extends ZombieMeta { + + public static final byte OFFSET = ZombieMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 2; + + public ZombieVillagerMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public boolean isConverting() { + return super.metadata.getIndex(OFFSET, false); + } + + public void setConverting(boolean value) { + super.metadata.setIndex(OFFSET, EntityDataTypes.BOOLEAN, value); + } + + public VillagerData getVillagerData() { + int[] data = super.metadata.getIndex(offset(OFFSET, 1), null); + if (data == null) { + return new VillagerData(VillagerTypes.PLAINS, VillagerProfessions.NONE, VillagerMeta.Level.NOVICE.ordinal()); + } + return new VillagerData(VillagerMeta.TYPES[data[0]], VillagerMeta.PROFESSIONS[data[1]], VillagerMeta.Level.VALUES[data[2] - 1].ordinal()); + } + + public void setVillagerData(VillagerData data) { + super.metadata.setIndex(offset(OFFSET, 1), EntityDataTypes.VILLAGER_DATA, new VillagerData( + data.getType().getId(), + data.getProfession().getId(), + data.getLevel() + 1 + )); + } + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/monster/zombie/ZombifiedPiglinMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/zombie/ZombifiedPiglinMeta.java new file mode 100644 index 0000000..f6794e5 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/monster/zombie/ZombifiedPiglinMeta.java @@ -0,0 +1,13 @@ +package me.tofaa.entitylib.meta.mobs.monster.zombie; + +import me.tofaa.entitylib.meta.Metadata; + +public class ZombifiedPiglinMeta extends ZombieMeta { + + public static final byte OFFSET = ZombieMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public ZombifiedPiglinMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/AreaEffectCloudMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/other/AreaEffectCloudMeta.java new file mode 100644 index 0000000..d5e288f --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/other/AreaEffectCloudMeta.java @@ -0,0 +1,40 @@ +package me.tofaa.entitylib.meta.mobs.other; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import me.tofaa.entitylib.meta.EntityMeta; +import me.tofaa.entitylib.meta.Metadata; + +public class AreaEffectCloudMeta extends EntityMeta { + + public static final byte OFFSET = EntityMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 4; + + public AreaEffectCloudMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public float getRadius() { + return super.metadata.getIndex(OFFSET, .5F); + } + + public void setRadius(float value) { + super.metadata.setIndex(OFFSET, EntityDataTypes.FLOAT, value); + } + + public int getColor() { + return super.metadata.getIndex(offset(OFFSET, 1), 0); + } + + public void setColor(int value) { + super.metadata.setIndex(offset(OFFSET, 1), EntityDataTypes.INT, value); + } + + public boolean isSinglePoint() { + return super.metadata.getIndex(offset(OFFSET, 2), false); + } + + public void setSinglePoint(boolean value) { + super.metadata.setIndex(offset(OFFSET, 2), EntityDataTypes.BOOLEAN, value); + } + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/ArmorStandMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/other/ArmorStandMeta.java new file mode 100644 index 0000000..b1660bb --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/other/ArmorStandMeta.java @@ -0,0 +1,110 @@ +package me.tofaa.entitylib.meta.mobs.other; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import com.github.retrooper.packetevents.util.Vector3f; +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.LivingEntityMeta; +import org.jetbrains.annotations.NotNull; + +public class ArmorStandMeta extends LivingEntityMeta { + + public static final byte OFFSET = LivingEntityMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 7; + + 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(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public boolean isSmall() { + return getMaskBit(OFFSET, IS_SMALL_BIT); + } + + public void setSmall(boolean value) { + setMaskBit(OFFSET, IS_SMALL_BIT, value); + } + + public boolean isHasArms() { + return getMaskBit(OFFSET, HAS_ARMS_BIT); + } + + public void setHasArms(boolean value) { + setMaskBit(OFFSET, HAS_ARMS_BIT, value); + } + + public boolean isHasNoBasePlate() { + return getMaskBit(OFFSET, HAS_NO_BASE_PLATE_BIT); + } + + public void setHasNoBasePlate(boolean value) { + setMaskBit(OFFSET, HAS_NO_BASE_PLATE_BIT, value); + } + + public boolean isMarker() { + return getMaskBit(OFFSET, IS_MARKER_BIT); + } + + public void setMarker(boolean value) { + setMaskBit(OFFSET, IS_MARKER_BIT, value); + } + + @NotNull + public Vector3f getHeadRotation() { + return super.metadata.getIndex(offset(OFFSET, 1), Vector3f.zero()); + } + + public void setHeadRotation(@NotNull Vector3f value) { + super.metadata.setIndex(offset(OFFSET, 1), EntityDataTypes.ROTATION, value); + } + + @NotNull + public Vector3f getBodyRotation() { + return super.metadata.getIndex(offset(OFFSET, 2), Vector3f.zero()); + } + + public void setBodyRotation(@NotNull Vector3f value) { + super.metadata.setIndex(offset(OFFSET, 2), EntityDataTypes.ROTATION, value); + } + + @NotNull + public Vector3f getLeftArmRotation() { + return super.metadata.getIndex(offset(OFFSET, 3), new Vector3f(-10f, 0f, -10f)); + } + + public void setLeftArmRotation(@NotNull Vector3f value) { + super.metadata.setIndex(offset(OFFSET, 3), EntityDataTypes.ROTATION, value); + } + + @NotNull + public Vector3f getRightArmRotation() { + return super.metadata.getIndex(offset(OFFSET, 4), new Vector3f(-15f, 0f, 10f)); + } + + public void setRightArmRotation(@NotNull Vector3f value) { + super.metadata.setIndex(offset(OFFSET, 4), EntityDataTypes.ROTATION, value); + } + + @NotNull + public Vector3f getLeftLegRotation() { + return super.metadata.getIndex(offset(OFFSET, 5), new Vector3f(-1f, 0f, -1f)); + } + + public void setLeftLegRotation(@NotNull Vector3f value) { + super.metadata.setIndex(offset(OFFSET, 5), EntityDataTypes.ROTATION, value); + } + + @NotNull + public Vector3f getRightLegRotation() { + return super.metadata.getIndex(offset(OFFSET, 6), new Vector3f(1f, 0f, 1f)); + } + + public void setRightLegRotation(@NotNull Vector3f value) { + super.metadata.setIndex(offset(OFFSET, 6), EntityDataTypes.ROTATION, value); + } + + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/BoatMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/other/BoatMeta.java new file mode 100644 index 0000000..e8d794f --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/other/BoatMeta.java @@ -0,0 +1,86 @@ +package me.tofaa.entitylib.meta.mobs.other; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import me.tofaa.entitylib.meta.EntityMeta; +import me.tofaa.entitylib.meta.Metadata; +import org.jetbrains.annotations.NotNull; + +public class BoatMeta extends EntityMeta { + + public static final byte OFFSET = EntityMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 7; + + public BoatMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public int getTimeSinceLastHit() { + return super.metadata.getIndex(OFFSET, 0); + } + + public void setTimeSinceLastHit(int value) { + super.metadata.setIndex(OFFSET, EntityDataTypes.INT, value); + } + + public int getForwardDirection() { + return super.metadata.getIndex(offset(OFFSET, 1), 1); + } + + public void setForwardDirection(int value) { + super.metadata.setIndex(offset(OFFSET, 1), EntityDataTypes.INT, value); + } + + public float getDamageTaken() { + return super.metadata.getIndex(offset(OFFSET, 2), 0); + } + + public void setDamageTaken(float value) { + super.metadata.setIndex(offset(OFFSET, 2), EntityDataTypes.FLOAT, value); + } + + @NotNull + public Type getType() { + return Type.VALUES[super.metadata.getIndex(offset(OFFSET, 3), 0)]; + } + + public void setType(@NotNull Type value) { + super.metadata.setIndex(offset(OFFSET, 3), EntityDataTypes.INT, value.ordinal()); + } + + public boolean isLeftPaddleTurning() { + return super.metadata.getIndex(offset(OFFSET, 4), false); + } + + public void setLeftPaddleTurning(boolean value) { + super.metadata.setIndex(offset(OFFSET, 4), EntityDataTypes.BOOLEAN, value); + } + + public boolean isRightPaddleTurning() { + return super.metadata.getIndex(offset(OFFSET, 5), false); + } + + public void setRightPaddleTurning(boolean value) { + super.metadata.setIndex(offset(OFFSET, 5), EntityDataTypes.BOOLEAN, value); + } + + public int getSplashTimer() { + return super.metadata.getIndex(offset(OFFSET, 6), 0); + } + + public void setSplashTimer(int value) { + super.metadata.setIndex(offset(OFFSET, 6), EntityDataTypes.INT, value); + } + + public enum Type { + OAK, + SPRUCE, + BIRCH, + JUNGLE, + ACACIA, + DARK_OAK; + + private final static Type[] VALUES = values(); + } + + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/DragonFireballMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/other/DragonFireballMeta.java new file mode 100644 index 0000000..62b361e --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/other/DragonFireballMeta.java @@ -0,0 +1,38 @@ +package me.tofaa.entitylib.meta.mobs.other; + +import me.tofaa.entitylib.meta.EntityMeta; +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.ObjectData; +import me.tofaa.entitylib.meta.types.ProjectileMeta; + +public class DragonFireballMeta extends EntityMeta implements ProjectileMeta, ObjectData { + + public static final byte OFFSET = EntityMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + private int shooter = -1; + + public DragonFireballMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + @Override + public int getObjectData() { + return this.shooter == -1 ? 0 : this.shooter; + } + + @Override + public boolean requiresVelocityPacketAtSpawn() { + return true; + } + + @Override + public int getShooter() { + return shooter; + } + + @Override + public void setShooter(int entityId) { + this.shooter = entityId; + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/EndCrystalMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/other/EndCrystalMeta.java new file mode 100644 index 0000000..3e9ee75 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/other/EndCrystalMeta.java @@ -0,0 +1,36 @@ +package me.tofaa.entitylib.meta.mobs.other; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import com.github.retrooper.packetevents.util.Vector3i; +import me.tofaa.entitylib.meta.EntityMeta; +import me.tofaa.entitylib.meta.Metadata; +import org.jetbrains.annotations.Nullable; + +import java.util.Optional; + +public class EndCrystalMeta extends EntityMeta { + + public static final byte OFFSET = EntityMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 2; + + public EndCrystalMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public @Nullable Optional getBeamTarget() { + return super.metadata.getIndex(OFFSET, Optional.empty()); + } + + public void setBeamTarget(@Nullable Vector3i value) { + super.metadata.setIndex(OFFSET, EntityDataTypes.OPTIONAL_BLOCK_POSITION, Optional.ofNullable(value)); + } + + public boolean isShowingBottom() { + return super.metadata.getIndex(offset(OFFSET, 1), true); + } + + public void setShowingBottom(boolean value) { + super.metadata.setIndex(offset(OFFSET, 1), EntityDataTypes.BOOLEAN, value); + } + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/EnderDragonMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/other/EnderDragonMeta.java new file mode 100644 index 0000000..017c8c0 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/other/EnderDragonMeta.java @@ -0,0 +1,43 @@ +package me.tofaa.entitylib.meta.mobs.other; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.MobMeta; +import org.jetbrains.annotations.NotNull; + +public class EnderDragonMeta extends MobMeta { + + public static final byte OFFSET = MobMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + + public EnderDragonMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + @NotNull + public Phase getPhase() { + return Phase.VALUES[super.metadata.getIndex(OFFSET, 0)]; + } + + public void setPhase(@NotNull Phase value) { + super.metadata.setIndex(OFFSET, EntityDataTypes.INT, 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/me/tofaa/entitylib/meta/mobs/other/EvokerFangsMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/other/EvokerFangsMeta.java new file mode 100644 index 0000000..432633c --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/other/EvokerFangsMeta.java @@ -0,0 +1,14 @@ +package me.tofaa.entitylib.meta.mobs.other; + +import me.tofaa.entitylib.meta.EntityMeta; +import me.tofaa.entitylib.meta.Metadata; + +public class EvokerFangsMeta extends EntityMeta { + + public static final byte OFFSET = EntityMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public EvokerFangsMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/FallingBlockMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/other/FallingBlockMeta.java new file mode 100644 index 0000000..6fe0004 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/other/FallingBlockMeta.java @@ -0,0 +1,46 @@ +package me.tofaa.entitylib.meta.mobs.other; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import com.github.retrooper.packetevents.util.Vector3i; +import me.tofaa.entitylib.meta.EntityMeta; +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.ObjectData; + +public class FallingBlockMeta extends EntityMeta implements ObjectData { + + public static final byte OFFSET = EntityMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 1; + + private int blockStateId; + + public FallingBlockMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public Vector3i getSpawnPosition() { + return super.metadata.getIndex(OFFSET, Vector3i.zero()); + } + + public void setSpawnPosition(Vector3i value) { + super.metadata.setIndex(OFFSET, EntityDataTypes.BLOCK_POSITION, value); + } + + + public int getBlockStateId() { + return blockStateId; + } + + public void setBlockStateId(int blockStateId) { + this.blockStateId = blockStateId; + } + + @Override + public int getObjectData() { + return blockStateId; + } + + @Override + public boolean requiresVelocityPacketAtSpawn() { + return false; + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/FireworkRocketMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/other/FireworkRocketMeta.java new file mode 100644 index 0000000..bdb6bb9 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/other/FireworkRocketMeta.java @@ -0,0 +1,50 @@ +package me.tofaa.entitylib.meta.mobs.other; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import com.github.retrooper.packetevents.protocol.item.ItemStack; +import me.tofaa.entitylib.meta.EntityMeta; +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.ProjectileMeta; + +import java.util.Optional; + +public class FireworkRocketMeta extends EntityMeta implements ProjectileMeta { + + public static final byte OFFSET = EntityMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 3; + + private int shooter = -1; + + public FireworkRocketMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public ItemStack getFireworkItem() { + return super.metadata.getIndex(OFFSET, ItemStack.EMPTY); + } + + public void setFireworkItem(ItemStack value) { + super.metadata.setIndex(OFFSET, EntityDataTypes.ITEMSTACK, value); + } + + + public boolean isShotAtAngle() { + return super.metadata.getIndex(offset(OFFSET, 2), false); + } + + public void setShotAtAngle(boolean value) { + super.metadata.setIndex(offset(OFFSET, 2), EntityDataTypes.BOOLEAN, value); + } + + @Override + public int getShooter() { + return shooter; + } + + @Override + public void setShooter(int entityId) { + this.shooter = entityId; + Optional optional = Optional.ofNullable(entityId == -1 ? null : entityId); + super.metadata.setIndex(offset(OFFSET, 1), EntityDataTypes.OPTIONAL_INT, optional); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/FishingHookMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/other/FishingHookMeta.java new file mode 100644 index 0000000..29ea6f2 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/other/FishingHookMeta.java @@ -0,0 +1,53 @@ +package me.tofaa.entitylib.meta.mobs.other; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import me.tofaa.entitylib.meta.EntityMeta; +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.ObjectData; + +import java.util.Optional; + +public class FishingHookMeta extends EntityMeta implements ObjectData { + + public static final byte OFFSET = EntityMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 2; + + private int shooterId; + private int hookedId; + + public FishingHookMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public boolean isCatchable() { + return super.metadata.getIndex(offset(OFFSET, 1), false); + } + + public void setCatchable(boolean value) { + super.metadata.setIndex(offset(OFFSET, 1), EntityDataTypes.BOOLEAN, value); + } + + public int getHookedEntity() { + return hookedId; + } + + public void setShooter(int entityId) { + this.shooterId = entityId; + } + + public void setHookedEntity(int entityId) { + this.hookedId = entityId; + super.metadata.setIndex(OFFSET, EntityDataTypes.INT, entityId == -1 ? 0 : entityId + 1); + } + + @Override + public int getObjectData() { + return shooterId != -1 ? shooterId : 0; + } + + @Override + public boolean requiresVelocityPacketAtSpawn() { + return false; + } + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/GlowItemFrameMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/other/GlowItemFrameMeta.java new file mode 100644 index 0000000..7b73ff9 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/other/GlowItemFrameMeta.java @@ -0,0 +1,13 @@ +package me.tofaa.entitylib.meta.mobs.other; + +import me.tofaa.entitylib.meta.Metadata; + +public class GlowItemFrameMeta extends ItemFrameMeta { + + public static final byte OFFSET = ItemFrameMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public GlowItemFrameMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/ItemFrameMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/other/ItemFrameMeta.java new file mode 100644 index 0000000..00ec3b7 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/other/ItemFrameMeta.java @@ -0,0 +1,74 @@ +package me.tofaa.entitylib.meta.mobs.other; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import com.github.retrooper.packetevents.protocol.item.ItemStack; +import me.tofaa.entitylib.extras.Rotation; +import me.tofaa.entitylib.meta.EntityMeta; +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.ObjectData; +import org.jetbrains.annotations.NotNull; + +public class ItemFrameMeta extends EntityMeta implements ObjectData { + + public static final byte OFFSET = EntityMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 2; + + private Orientation orientation = Orientation.DOWN; + + public ItemFrameMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + @NotNull + public ItemStack getItem() { + return super.metadata.getIndex(OFFSET, ItemStack.EMPTY); + } + + public void setItem(@NotNull ItemStack value) { + super.metadata.setIndex(OFFSET, EntityDataTypes.ITEMSTACK, value); + } + + @NotNull + public Rotation getRotation() { + return Rotation.values()[super.metadata.getIndex(offset(OFFSET, 1), 0)]; + } + + public void setRotation(@NotNull Rotation value) { + super.metadata.setIndex(offset(OFFSET, 1), EntityDataTypes.INT, 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/me/tofaa/entitylib/meta/mobs/other/LeashKnotMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/other/LeashKnotMeta.java new file mode 100644 index 0000000..18260a2 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/other/LeashKnotMeta.java @@ -0,0 +1,14 @@ +package me.tofaa.entitylib.meta.mobs.other; + +import me.tofaa.entitylib.meta.EntityMeta; +import me.tofaa.entitylib.meta.Metadata; + +public class LeashKnotMeta extends EntityMeta { + + public static final byte OFFSET = EntityMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public LeashKnotMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/LightningBoltMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/other/LightningBoltMeta.java new file mode 100644 index 0000000..4ec7add --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/other/LightningBoltMeta.java @@ -0,0 +1,14 @@ +package me.tofaa.entitylib.meta.mobs.other; + +import me.tofaa.entitylib.meta.EntityMeta; +import me.tofaa.entitylib.meta.Metadata; + +public class LightningBoltMeta extends EntityMeta { + + public static final byte OFFSET = EntityMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public LightningBoltMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/LlamaSpitMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/other/LlamaSpitMeta.java new file mode 100644 index 0000000..ad61c8e --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/other/LlamaSpitMeta.java @@ -0,0 +1,25 @@ +package me.tofaa.entitylib.meta.mobs.other; + +import me.tofaa.entitylib.meta.EntityMeta; +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.ObjectData; + +public class LlamaSpitMeta extends EntityMeta implements ObjectData { + public static final byte OFFSET = EntityMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public LlamaSpitMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + + @Override + public int getObjectData() { + return 0; + } + + @Override + public boolean requiresVelocityPacketAtSpawn() { + return true; + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/MarkerMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/other/MarkerMeta.java new file mode 100644 index 0000000..5bc64b5 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/other/MarkerMeta.java @@ -0,0 +1,14 @@ +package me.tofaa.entitylib.meta.mobs.other; + +import me.tofaa.entitylib.meta.EntityMeta; +import me.tofaa.entitylib.meta.Metadata; + +public class MarkerMeta extends EntityMeta { + + public static final byte OFFSET = EntityMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public MarkerMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/PaintingMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/other/PaintingMeta.java new file mode 100644 index 0000000..f0f4df4 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/other/PaintingMeta.java @@ -0,0 +1,120 @@ +package me.tofaa.entitylib.meta.mobs.other; + +import com.github.retrooper.packetevents.protocol.world.Direction; +import me.tofaa.entitylib.meta.EntityMeta; +import me.tofaa.entitylib.meta.Metadata; +import org.jetbrains.annotations.NotNull; + +import java.util.Locale; + +/** + * TODO + */ +public class PaintingMeta extends EntityMeta { + + public static final byte OFFSET = EntityMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + private Direction direction = Direction.SOUTH; + private Type type = Type.KEBAB; + + public PaintingMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + @NotNull + public Type getType() { + return type; + } + + public void setType(@NotNull Type type) { + this.type = type; + } + + @NotNull + public Direction getDirection() { + return direction; + } + + public void setDirection(@NotNull Direction direction) { + if (direction == Direction.UP || direction == Direction.DOWN) { + throw new IllegalArgumentException("Direction cannot be up or down"); + } + this.direction = direction; + } + + + + public enum Type { + 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; + + Type(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; + } + + Type(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/me/tofaa/entitylib/meta/mobs/other/PrimedTntMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/other/PrimedTntMeta.java new file mode 100644 index 0000000..162dee5 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/other/PrimedTntMeta.java @@ -0,0 +1,23 @@ +package me.tofaa.entitylib.meta.mobs.other; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import me.tofaa.entitylib.meta.EntityMeta; +import me.tofaa.entitylib.meta.Metadata; + +public class PrimedTntMeta extends EntityMeta { + public static final byte OFFSET = EntityMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 1; + + + public PrimedTntMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public int getFuseTime() { + return super.metadata.getIndex(OFFSET, 80); + } + + public void setFuseTime(int value) { + super.metadata.setIndex(OFFSET, EntityDataTypes.INT, value); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/WitherSkullMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/other/WitherSkullMeta.java new file mode 100644 index 0000000..c53372d --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/other/WitherSkullMeta.java @@ -0,0 +1,50 @@ +package me.tofaa.entitylib.meta.mobs.other; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import me.tofaa.entitylib.meta.EntityMeta; +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.ObjectData; +import me.tofaa.entitylib.meta.types.ProjectileMeta; + +public class WitherSkullMeta extends EntityMeta implements ObjectData, ProjectileMeta { + + public static final byte OFFSET = EntityMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 1; + + private int shooter = -1; + + public WitherSkullMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + + public boolean isInvulnerable() { + return super.metadata.getIndex(OFFSET, false); + } + + public void setInvulnerable(boolean value) { + super.metadata.setIndex(OFFSET, EntityDataTypes.BOOLEAN, value); + } + + + + @Override + public int getObjectData() { + return this.shooter == -1 ? 0 : this.shooter; + } + + @Override + public boolean requiresVelocityPacketAtSpawn() { + return true; + } + + @Override + public int getShooter() { + return shooter; + } + + @Override + public void setShooter(int entityId) { + this.shooter = entityId; + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/ChickenMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/passive/ChickenMeta.java similarity index 88% rename from src/main/java/me/tofaa/entitylib/meta/mobs/ChickenMeta.java rename to src/main/java/me/tofaa/entitylib/meta/mobs/passive/ChickenMeta.java index e38ce0c..a410b29 100644 --- a/src/main/java/me/tofaa/entitylib/meta/mobs/ChickenMeta.java +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/passive/ChickenMeta.java @@ -1,4 +1,4 @@ -package me.tofaa.entitylib.meta.mobs; +package me.tofaa.entitylib.meta.mobs.passive; import me.tofaa.entitylib.meta.Metadata; import me.tofaa.entitylib.meta.types.AgeableMeta; diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/CowMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/passive/CowMeta.java similarity index 88% rename from src/main/java/me/tofaa/entitylib/meta/mobs/CowMeta.java rename to src/main/java/me/tofaa/entitylib/meta/mobs/passive/CowMeta.java index 424a68d..135162b 100644 --- a/src/main/java/me/tofaa/entitylib/meta/mobs/CowMeta.java +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/passive/CowMeta.java @@ -1,4 +1,4 @@ -package me.tofaa.entitylib.meta.mobs; +package me.tofaa.entitylib.meta.mobs.passive; import me.tofaa.entitylib.meta.Metadata; import me.tofaa.entitylib.meta.types.AgeableMeta; diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/MooshroomMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/passive/MooshroomMeta.java similarity index 94% rename from src/main/java/me/tofaa/entitylib/meta/mobs/MooshroomMeta.java rename to src/main/java/me/tofaa/entitylib/meta/mobs/passive/MooshroomMeta.java index b989d08..074763a 100644 --- a/src/main/java/me/tofaa/entitylib/meta/mobs/MooshroomMeta.java +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/passive/MooshroomMeta.java @@ -1,4 +1,4 @@ -package me.tofaa.entitylib.meta.mobs; +package me.tofaa.entitylib.meta.mobs.passive; import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; import me.tofaa.entitylib.meta.Metadata; diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/PigMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/passive/PigMeta.java similarity index 95% rename from src/main/java/me/tofaa/entitylib/meta/mobs/PigMeta.java rename to src/main/java/me/tofaa/entitylib/meta/mobs/passive/PigMeta.java index ed6feef..86f973c 100644 --- a/src/main/java/me/tofaa/entitylib/meta/mobs/PigMeta.java +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/passive/PigMeta.java @@ -1,4 +1,4 @@ -package me.tofaa.entitylib.meta.mobs; +package me.tofaa.entitylib.meta.mobs.passive; import com.github.retrooper.packetevents.manager.server.ServerVersion; import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/RabbitMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/passive/RabbitMeta.java similarity index 95% rename from src/main/java/me/tofaa/entitylib/meta/mobs/RabbitMeta.java rename to src/main/java/me/tofaa/entitylib/meta/mobs/passive/RabbitMeta.java index a3ce6f4..2e3c68b 100644 --- a/src/main/java/me/tofaa/entitylib/meta/mobs/RabbitMeta.java +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/passive/RabbitMeta.java @@ -1,4 +1,4 @@ -package me.tofaa.entitylib.meta.mobs; +package me.tofaa.entitylib.meta.mobs.passive; import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; import me.tofaa.entitylib.meta.Metadata; diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/SheepMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/passive/SheepMeta.java similarity index 95% rename from src/main/java/me/tofaa/entitylib/meta/mobs/SheepMeta.java rename to src/main/java/me/tofaa/entitylib/meta/mobs/passive/SheepMeta.java index 703b67f..00f7505 100644 --- a/src/main/java/me/tofaa/entitylib/meta/mobs/SheepMeta.java +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/passive/SheepMeta.java @@ -1,4 +1,4 @@ -package me.tofaa.entitylib.meta.mobs; +package me.tofaa.entitylib.meta.mobs.passive; import me.tofaa.entitylib.meta.Metadata; import me.tofaa.entitylib.meta.types.AgeableMeta; diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/TurtleMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/passive/TurtleMeta.java similarity index 97% rename from src/main/java/me/tofaa/entitylib/meta/mobs/TurtleMeta.java rename to src/main/java/me/tofaa/entitylib/meta/mobs/passive/TurtleMeta.java index b7b970e..136be80 100644 --- a/src/main/java/me/tofaa/entitylib/meta/mobs/TurtleMeta.java +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/passive/TurtleMeta.java @@ -1,4 +1,4 @@ -package me.tofaa.entitylib.meta.mobs; +package me.tofaa.entitylib.meta.mobs.passive; import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; import com.github.retrooper.packetevents.util.Vector3i; diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/villager/BaseVillagerMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/villager/BaseVillagerMeta.java new file mode 100644 index 0000000..c5a24fc --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/villager/BaseVillagerMeta.java @@ -0,0 +1,24 @@ +package me.tofaa.entitylib.meta.mobs.villager; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.AgeableMeta; + +public class BaseVillagerMeta extends AgeableMeta { + + public static final byte OFFSET = AgeableMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 1; + + public BaseVillagerMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public int getHeadShakeTimer() { + return super.metadata.getIndex(OFFSET, 0); + } + + public void setHeadShakeTimer(int value) { + super.metadata.setIndex(OFFSET, EntityDataTypes.INT, value); + } + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/villager/VillagerMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/villager/VillagerMeta.java new file mode 100644 index 0000000..37011fa --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/villager/VillagerMeta.java @@ -0,0 +1,81 @@ +package me.tofaa.entitylib.meta.mobs.villager; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import com.github.retrooper.packetevents.protocol.entity.villager.VillagerData; +import com.github.retrooper.packetevents.protocol.entity.villager.profession.VillagerProfession; +import com.github.retrooper.packetevents.protocol.entity.villager.profession.VillagerProfessions; +import com.github.retrooper.packetevents.protocol.entity.villager.type.VillagerType; +import com.github.retrooper.packetevents.protocol.entity.villager.type.VillagerTypes; +import me.tofaa.entitylib.meta.Metadata; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +public class VillagerMeta extends BaseVillagerMeta { + + public static final byte OFFSET = BaseVillagerMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 1; + + @ApiStatus.Internal + public static final VillagerType[] TYPES = new VillagerType[] { + VillagerTypes.DESERT, + VillagerTypes.JUNGLE, + VillagerTypes.PLAINS, + VillagerTypes.SAVANNA, + VillagerTypes.SNOW, + VillagerTypes.SWAMP, + VillagerTypes.TAIGA + }; + + @ApiStatus.Internal + public static final VillagerProfession[] PROFESSIONS = new VillagerProfession[] { + VillagerProfessions.NONE, + VillagerProfessions.ARMORER, + VillagerProfessions.BUTCHER, + VillagerProfessions.CARTOGRAPHER, + VillagerProfessions.CLERIC, + VillagerProfessions.FARMER, + VillagerProfessions.FISHERMAN, + VillagerProfessions.FLETCHER, + VillagerProfessions.LEATHERWORKER, + VillagerProfessions.LIBRARIAN, + VillagerProfessions.MASON, + VillagerProfessions.NITWIT, + VillagerProfessions.SHEPHERD, + VillagerProfessions.TOOLSMITH, + VillagerProfessions.WEAPONSMITH + }; + + public VillagerMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + @NotNull + public VillagerData getVillagerData() { + int[] data = super.metadata.getIndex(OFFSET, null); + if (data == null) { + return new VillagerData(VillagerTypes.PLAINS, VillagerProfessions.NONE, Level.NOVICE.ordinal()); + } + return new VillagerData(TYPES[data[0]], PROFESSIONS[data[1]], Level.VALUES[data[2] - 1].ordinal()); + } + + public void setVillagerData(@NotNull VillagerData data) { + super.metadata.setIndex(OFFSET, EntityDataTypes.VILLAGER_DATA, new VillagerData( + data.getType().getId(), + data.getProfession().getId(), + data.getLevel() + )); + } + + + public enum Level { + NOVICE, + APPRENTICE, + JOURNEYMAN, + EXPERT, + MASTER; + + public final static Level[] VALUES = values(); + } + + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/villager/WanderingTraderMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/villager/WanderingTraderMeta.java new file mode 100644 index 0000000..7ce92d5 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/villager/WanderingTraderMeta.java @@ -0,0 +1,13 @@ +package me.tofaa.entitylib.meta.mobs.villager; + +import me.tofaa.entitylib.meta.Metadata; + +public class WanderingTraderMeta extends VillagerMeta{ + + public static final byte OFFSET = VillagerMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public WanderingTraderMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/water/AxolotlMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/water/AxolotlMeta.java new file mode 100644 index 0000000..74b1a6f --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/water/AxolotlMeta.java @@ -0,0 +1,50 @@ +package me.tofaa.entitylib.meta.mobs.water; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.WaterMobMeta; + +public class AxolotlMeta extends WaterMobMeta { + + public static final byte OFFSET = WaterMobMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 3; + + public AxolotlMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public Variant getVariant() { + return Variant.VALUES[super.metadata.getIndex(OFFSET, 0)]; + } + + public void setVariant(Variant variant) { + metadata.setIndex(OFFSET, EntityDataTypes.INT, variant.ordinal()); + } + + public boolean isPlayingDead() { + return metadata.getIndex(offset(OFFSET, 1), false); + } + + public void setPlayingDead(boolean playingDead) { + metadata.setIndex(offset(OFFSET, 1), EntityDataTypes.BOOLEAN, playingDead); + } + + public boolean isFromBucket() { + return metadata.getIndex(offset(OFFSET, 2), false); + } + + public void setFromBucket(boolean fromBucket) { + metadata.setIndex(offset(OFFSET, 2), EntityDataTypes.BOOLEAN, fromBucket); + } + + public enum Variant { + LUCY, + WILD, + GOLD, + CYAN, + BLUE; + + private final static AxolotlMeta.Variant[] VALUES = values(); + } + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/water/BaseFishMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/water/BaseFishMeta.java new file mode 100644 index 0000000..76e3f7a --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/water/BaseFishMeta.java @@ -0,0 +1,25 @@ +package me.tofaa.entitylib.meta.mobs.water; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.WaterMobMeta; + +public class BaseFishMeta extends WaterMobMeta { + + public static final byte OFFSET = WaterMobMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 1; + + public BaseFishMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + + public boolean isFromBucket() { + return super.metadata.getIndex(OFFSET, false); + } + + public void setFromBucket(boolean value) { + super.metadata.setIndex(OFFSET, EntityDataTypes.BOOLEAN, value); + } + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/water/CodMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/water/CodMeta.java new file mode 100644 index 0000000..fc5ce2d --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/water/CodMeta.java @@ -0,0 +1,13 @@ +package me.tofaa.entitylib.meta.mobs.water; + +import me.tofaa.entitylib.meta.Metadata; + +public class CodMeta extends BaseFishMeta{ + + public static final byte OFFSET = BaseFishMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public CodMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/water/DolphinMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/water/DolphinMeta.java new file mode 100644 index 0000000..c875e1d --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/water/DolphinMeta.java @@ -0,0 +1,43 @@ +package me.tofaa.entitylib.meta.mobs.water; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import com.github.retrooper.packetevents.util.Vector3i; +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.WaterMobMeta; +import org.jetbrains.annotations.NotNull; + +public class DolphinMeta extends WaterMobMeta { + + public static final byte OFFSET = WaterMobMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 3; + + public DolphinMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + @NotNull + public Vector3i getTreasurePosition() { + return super.metadata.getIndex(OFFSET, Vector3i.zero()); + } + + public void setTreasurePosition(@NotNull Vector3i value) { + super.metadata.setIndex(OFFSET, EntityDataTypes.BLOCK_POSITION, value); + } + + public boolean isCanFindTreasure() { + return super.metadata.getIndex(offset(OFFSET, 1), false); + } + + public void setCanFindTreasure(boolean value) { + super.metadata.setIndex(offset(OFFSET, 1), EntityDataTypes.BOOLEAN, value); + } + + public boolean isHasFish() { + return super.metadata.getIndex(offset(OFFSET, 2), false); + } + + public void setHasFish(boolean value) { + super.metadata.setIndex(offset(OFFSET, 2), EntityDataTypes.BOOLEAN, value); + } + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/water/GlowSquidMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/water/GlowSquidMeta.java new file mode 100644 index 0000000..d6115b4 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/water/GlowSquidMeta.java @@ -0,0 +1,24 @@ +package me.tofaa.entitylib.meta.mobs.water; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import me.tofaa.entitylib.meta.Metadata; + +public class GlowSquidMeta extends SquidMeta { + + public static final byte OFFSET = SquidMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 1; + + public GlowSquidMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public int getDarkTicksRemaining() { + return metadata.getIndex(OFFSET, 0); + } + + public void setDarkTicksRemaining(int ticks) { + metadata.setIndex(OFFSET, EntityDataTypes.INT, ticks); + } + + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/water/PufferFishMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/water/PufferFishMeta.java new file mode 100644 index 0000000..84180e9 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/water/PufferFishMeta.java @@ -0,0 +1,32 @@ +package me.tofaa.entitylib.meta.mobs.water; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import me.tofaa.entitylib.meta.Metadata; + +public class PufferFishMeta extends BaseFishMeta { + + public static final byte OFFSET = BaseFishMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 1; + + public PufferFishMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public State getState() { + return State.VALUES[super.metadata.getIndex(OFFSET, 0)]; + } + + public void setState(State state) { + super.metadata.setIndex(OFFSET, EntityDataTypes.INT, state.ordinal()); + } + + + public enum State { + UNPUFFED, + SEMI_PUFFED, + FULLY_PUFFED; + + private final static State[] VALUES = values(); + } + +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/water/SalmonMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/water/SalmonMeta.java new file mode 100644 index 0000000..2c74f0d --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/water/SalmonMeta.java @@ -0,0 +1,9 @@ +package me.tofaa.entitylib.meta.mobs.water; + +import me.tofaa.entitylib.meta.Metadata; + +public class SalmonMeta extends BaseFishMeta{ + public SalmonMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/water/SquidMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/water/SquidMeta.java new file mode 100644 index 0000000..9c99af2 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/water/SquidMeta.java @@ -0,0 +1,14 @@ +package me.tofaa.entitylib.meta.mobs.water; + +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.WaterMobMeta; + +public class SquidMeta extends WaterMobMeta { + + public static final byte OFFSET = WaterMobMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public SquidMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/water/TropicalFishMeta.java b/src/main/java/me/tofaa/entitylib/meta/mobs/water/TropicalFishMeta.java new file mode 100644 index 0000000..1392827 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/mobs/water/TropicalFishMeta.java @@ -0,0 +1,128 @@ +package me.tofaa.entitylib.meta.mobs.water; + +import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.ObjectData; +import org.jetbrains.annotations.NotNull; + +public class TropicalFishMeta extends BaseFishMeta implements ObjectData { + + public static final byte OFFSET = BaseFishMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 1; + + public TropicalFishMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + public Variant getVariant() { + return getVariantFromID(super.metadata.getIndex(OFFSET, 0)); + } + + public void setVariant(Variant variant) { + super.metadata.setIndex(OFFSET, EntityDataTypes.INT, 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/me/tofaa/entitylib/meta/projectile/ShulkerBulletMeta.java b/src/main/java/me/tofaa/entitylib/meta/projectile/ShulkerBulletMeta.java new file mode 100644 index 0000000..a0925b8 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/projectile/ShulkerBulletMeta.java @@ -0,0 +1,25 @@ +package me.tofaa.entitylib.meta.projectile; + +import me.tofaa.entitylib.meta.EntityMeta; +import me.tofaa.entitylib.meta.Metadata; +import me.tofaa.entitylib.meta.types.ObjectData; + +public class ShulkerBulletMeta extends EntityMeta implements ObjectData { + + public static final byte OFFSET = EntityMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public ShulkerBulletMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } + + @Override + public int getObjectData() { + return 0; + } + + @Override + public boolean requiresVelocityPacketAtSpawn() { + return true; + } +} diff --git a/src/main/java/me/tofaa/entitylib/meta/types/WaterMobMeta.java b/src/main/java/me/tofaa/entitylib/meta/types/WaterMobMeta.java new file mode 100644 index 0000000..5b99469 --- /dev/null +++ b/src/main/java/me/tofaa/entitylib/meta/types/WaterMobMeta.java @@ -0,0 +1,13 @@ +package me.tofaa.entitylib.meta.types; + +import me.tofaa.entitylib.meta.Metadata; + +public class WaterMobMeta extends MobMeta { + + public static final byte OFFSET = MobMeta.MAX_OFFSET; + public static final byte MAX_OFFSET = OFFSET + 0; + + public WaterMobMeta(int entityId, Metadata metadata) { + super(entityId, metadata); + } +} diff --git a/test-plugin/src/main/java/me/tofaa/entitylib/EntityLibPlugin.java b/test-plugin/src/main/java/me/tofaa/entitylib/EntityLibPlugin.java index dae11e6..4803a82 100644 --- a/test-plugin/src/main/java/me/tofaa/entitylib/EntityLibPlugin.java +++ b/test-plugin/src/main/java/me/tofaa/entitylib/EntityLibPlugin.java @@ -11,6 +11,7 @@ public final class EntityLibPlugin extends JavaPlugin { public void onEnable() { EntityLib.init(PacketEvents.getAPI()); getCommand("testapi").setExecutor(new TestCommand()); + getCommand("testentity").setExecutor(new TestEntityCommand()); instance = this; } } diff --git a/test-plugin/src/main/java/me/tofaa/entitylib/TestCommand.java b/test-plugin/src/main/java/me/tofaa/entitylib/TestCommand.java index a860637..719ebba 100644 --- a/test-plugin/src/main/java/me/tofaa/entitylib/TestCommand.java +++ b/test-plugin/src/main/java/me/tofaa/entitylib/TestCommand.java @@ -6,9 +6,7 @@ import com.github.retrooper.packetevents.util.Vector3d; import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerEntityMetadata; import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSpawnEntity; import me.tofaa.entitylib.meta.EntityMeta; -import me.tofaa.entitylib.meta.mobs.PigMeta; -import me.tofaa.entitylib.meta.mobs.SheepMeta; -import me.tofaa.entitylib.meta.types.PlayerMeta; +import me.tofaa.entitylib.meta.mobs.passive.SheepMeta; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; diff --git a/test-plugin/src/main/java/me/tofaa/entitylib/TestEntityCommand.java b/test-plugin/src/main/java/me/tofaa/entitylib/TestEntityCommand.java new file mode 100644 index 0000000..6c69bee --- /dev/null +++ b/test-plugin/src/main/java/me/tofaa/entitylib/TestEntityCommand.java @@ -0,0 +1,48 @@ +package me.tofaa.entitylib; + +import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes; +import com.github.retrooper.packetevents.protocol.world.Location; +import me.tofaa.entitylib.entity.WrapperEntity; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.UUID; + +public class TestEntityCommand implements CommandExecutor { + + private WrapperEntity entity; + + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if (!(sender instanceof Player)) return false; + Player player = (Player) sender; + + if (entity == null) { + entity = EntityLib.createEntity(UUID.randomUUID(), EntityTypes.PIG); + if (entity == null) { + player.sendMessage("idk"); + return false; + } + } + + if (entity.hasSpawned()) { + entity.remove(); + player.sendMessage("removed"); + } + else { + entity.addViewer(player.getUniqueId()); + entity.spawn(fromBukkit(player.getLocation())); + player.sendMessage("spawned"); + } + + return false; + } + + public static Location fromBukkit(org.bukkit.Location location) { + return new Location(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); + } + +} diff --git a/test-plugin/src/main/resources/plugin.yml b/test-plugin/src/main/resources/plugin.yml index 7f9b2ae..62e7405 100644 --- a/test-plugin/src/main/resources/plugin.yml +++ b/test-plugin/src/main/resources/plugin.yml @@ -6,4 +6,8 @@ main: me.tofaa.entitylib.EntityLibPlugin commands: testapi: description: Test PEEntityMeta API + usage: / + + testentity: + description: Test PEEntity API usage: / \ No newline at end of file