From 0867fdd3359818b32b47911b1f62aa65b65db493 Mon Sep 17 00:00:00 2001
From: Tofaa <82680183+Tofaa2@users.noreply.github.com>
Date: Thu, 30 Nov 2023 02:14:23 +0300
Subject: [PATCH] implement display and interaction meta (i forgor)

---
 README.md                                     |   1 +
 .../java/me/tofaa/entitylib/EntityLib.java    |  10 ++
 .../entitylib/MetaConverterRegistry.java      |   8 +-
 .../me/tofaa/entitylib/meta/EntityMeta.java   |   8 +
 .../{mobs => }/other/AreaEffectCloudMeta.java |   2 +-
 .../meta/{mobs => }/other/ArmorStandMeta.java |   2 +-
 .../meta/other/BlockDisplayMeta.java          |  24 +++
 .../meta/{mobs => }/other/BoatMeta.java       |   2 +-
 .../meta/{mobs => }/other/EndCrystalMeta.java |   2 +-
 .../{mobs => }/other/EnderDragonMeta.java     |   2 +-
 .../{mobs => }/other/EvokerFangsMeta.java     |   2 +-
 .../{mobs => }/other/FallingBlockMeta.java    |   2 +-
 .../{mobs => }/other/FireworkRocketMeta.java  |   2 +-
 .../{mobs => }/other/FishingHookMeta.java     |   2 +-
 .../{mobs => }/other/GlowItemFrameMeta.java   |   2 +-
 .../entitylib/meta/other/InteractionMeta.java |  41 +++++
 .../entitylib/meta/other/ItemDisplayMeta.java |  39 +++++
 .../meta/{mobs => }/other/ItemFrameMeta.java  |   2 +-
 .../meta/{mobs => }/other/LeashKnotMeta.java  |   2 +-
 .../{mobs => }/other/LightningBoltMeta.java   |   2 +-
 .../meta/{mobs => }/other/LlamaSpitMeta.java  |   2 +-
 .../meta/{mobs => }/other/MarkerMeta.java     |   2 +-
 .../meta/{mobs => }/other/PaintingMeta.java   |   2 +-
 .../meta/{mobs => }/other/PrimedTntMeta.java  |   2 +-
 .../entitylib/meta/other/TextDisplayMeta.java |  96 ++++++++++++
 .../DragonFireballMeta.java                   |   2 +-
 .../other => projectile}/WitherSkullMeta.java |   2 +-
 .../entitylib/meta/types/DisplayMeta.java     | 148 ++++++++++++++++++
 .../me/tofaa/entitylib/EntityLibPlugin.java   |   8 +
 29 files changed, 400 insertions(+), 21 deletions(-)
 rename src/main/java/me/tofaa/entitylib/meta/{mobs => }/other/AreaEffectCloudMeta.java (96%)
 rename src/main/java/me/tofaa/entitylib/meta/{mobs => }/other/ArmorStandMeta.java (98%)
 create mode 100644 src/main/java/me/tofaa/entitylib/meta/other/BlockDisplayMeta.java
 rename src/main/java/me/tofaa/entitylib/meta/{mobs => }/other/BoatMeta.java (98%)
 rename src/main/java/me/tofaa/entitylib/meta/{mobs => }/other/EndCrystalMeta.java (96%)
 rename src/main/java/me/tofaa/entitylib/meta/{mobs => }/other/EnderDragonMeta.java (96%)
 rename src/main/java/me/tofaa/entitylib/meta/{mobs => }/other/EvokerFangsMeta.java (89%)
 rename src/main/java/me/tofaa/entitylib/meta/{mobs => }/other/FallingBlockMeta.java (96%)
 rename src/main/java/me/tofaa/entitylib/meta/{mobs => }/other/FireworkRocketMeta.java (97%)
 rename src/main/java/me/tofaa/entitylib/meta/{mobs => }/other/FishingHookMeta.java (96%)
 rename src/main/java/me/tofaa/entitylib/meta/{mobs => }/other/GlowItemFrameMeta.java (88%)
 create mode 100644 src/main/java/me/tofaa/entitylib/meta/other/InteractionMeta.java
 create mode 100644 src/main/java/me/tofaa/entitylib/meta/other/ItemDisplayMeta.java
 rename src/main/java/me/tofaa/entitylib/meta/{mobs => }/other/ItemFrameMeta.java (97%)
 rename src/main/java/me/tofaa/entitylib/meta/{mobs => }/other/LeashKnotMeta.java (88%)
 rename src/main/java/me/tofaa/entitylib/meta/{mobs => }/other/LightningBoltMeta.java (89%)
 rename src/main/java/me/tofaa/entitylib/meta/{mobs => }/other/LlamaSpitMeta.java (93%)
 rename src/main/java/me/tofaa/entitylib/meta/{mobs => }/other/MarkerMeta.java (88%)
 rename src/main/java/me/tofaa/entitylib/meta/{mobs => }/other/PaintingMeta.java (98%)
 rename src/main/java/me/tofaa/entitylib/meta/{mobs => }/other/PrimedTntMeta.java (93%)
 create mode 100644 src/main/java/me/tofaa/entitylib/meta/other/TextDisplayMeta.java
 rename src/main/java/me/tofaa/entitylib/meta/{mobs/other => projectile}/DragonFireballMeta.java (95%)
 rename src/main/java/me/tofaa/entitylib/meta/{mobs/other => projectile}/WitherSkullMeta.java (96%)
 create mode 100644 src/main/java/me/tofaa/entitylib/meta/types/DisplayMeta.java

diff --git a/README.md b/README.md
index 3b89d3d..c37341b 100644
--- a/README.md
+++ b/README.md
@@ -107,6 +107,7 @@ Once this list is complete, i will release a stable version of the library.
 - [ ] WrapperEntities must seamlessly send packet updates to viewers, currently they are not.
 - [ ] Add support for more actions using WrapperEntities.
 - [ ] More javadocs.
+- [ ] Make ObjectData actually useful.
 
 ### Credits
 - PacketEvents for providing the API and retrooper being a cool guy in general
diff --git a/src/main/java/me/tofaa/entitylib/EntityLib.java b/src/main/java/me/tofaa/entitylib/EntityLib.java
index 2e3b52a..8cab681 100644
--- a/src/main/java/me/tofaa/entitylib/EntityLib.java
+++ b/src/main/java/me/tofaa/entitylib/EntityLib.java
@@ -21,6 +21,16 @@ import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.BiFunction;
 
+/**
+ * Base API class for EntityLib, contains all the methods to interact with the library.
+ * <p>
+ *     Initialization should be done before PacketEvents. After PE is initialized, call {@link EntityLib#init(PacketEventsAPI)} to initialize EntityLib.
+ *     <br>
+ *     To enable entity interactions, call {@link EntityLib#enableEntityInteractions()}. these will help you interact with a {@link WrapperEntity} object.
+ *     <br>
+ *     By default, EntityLib does not persistently store data, this is planned for a future feature but for now you must store your own data if you want it to persist after restart.
+ * <p>
+ */
 public final class EntityLib {
 
     private EntityLib() {}
diff --git a/src/main/java/me/tofaa/entitylib/MetaConverterRegistry.java b/src/main/java/me/tofaa/entitylib/MetaConverterRegistry.java
index 782f8e6..ce6d4be 100644
--- a/src/main/java/me/tofaa/entitylib/MetaConverterRegistry.java
+++ b/src/main/java/me/tofaa/entitylib/MetaConverterRegistry.java
@@ -1,6 +1,7 @@
 package me.tofaa.entitylib;
 
 import com.github.retrooper.packetevents.protocol.entity.type.EntityType;
+import com.sun.org.apache.bcel.internal.generic.PUTFIELD;
 import me.tofaa.entitylib.meta.EntityMeta;
 import me.tofaa.entitylib.meta.Metadata;
 import me.tofaa.entitylib.meta.mobs.*;
@@ -22,16 +23,15 @@ 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.mobs.villager.VillagerMeta;
 import me.tofaa.entitylib.meta.mobs.villager.WanderingTraderMeta;
+import me.tofaa.entitylib.meta.other.*;
 import me.tofaa.entitylib.meta.projectile.*;
 import me.tofaa.entitylib.meta.types.PlayerMeta;
 import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -45,6 +45,10 @@ final class MetaConverterRegistry {
     private final Map<EntityType, Class<? extends EntityMeta>> metaClasses = new HashMap<>();
 
     MetaConverterRegistry() {
+        put(INTERACTION, InteractionMeta.class, InteractionMeta::new);
+        put(BLOCK_DISPLAY, BlockDisplayMeta.class, BlockDisplayMeta::new);
+        put(ITEM_DISPLAY, ItemDisplayMeta.class, ItemDisplayMeta::new);
+        put(TEXT_DISPLAY, TextDisplayMeta.class, TextDisplayMeta::new);
         put(AREA_EFFECT_CLOUD, AreaEffectCloudMeta.class, AreaEffectCloudMeta::new);
         put(ARMOR_STAND, ArmorStandMeta.class, ArmorStandMeta::new);
         put(BOAT, BoatMeta.class, BoatMeta::new);
diff --git a/src/main/java/me/tofaa/entitylib/meta/EntityMeta.java b/src/main/java/me/tofaa/entitylib/meta/EntityMeta.java
index b90cbe1..dfee9c4 100644
--- a/src/main/java/me/tofaa/entitylib/meta/EntityMeta.java
+++ b/src/main/java/me/tofaa/entitylib/meta/EntityMeta.java
@@ -138,6 +138,14 @@ public class EntityMeta implements EntityMetadataProvider {
         this.metadata.setIndex(offset(OFFSET, 6), EntityDataTypes.ENTITY_POSE, value);
     }
 
+    public int getTicksFrozenInPowderedSnow() {
+        return this.metadata.getIndex(offset(OFFSET, 7), 0);
+    }
+
+    public void setTicksFrozenInPowderedSnow(int value) {
+        this.metadata.setIndex(offset(OFFSET, 7), EntityDataTypes.INT, value);
+    }
+
     public WrapperPlayServerEntityMetadata createPacket() {
         return metadata.createPacket();
     }
diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/AreaEffectCloudMeta.java b/src/main/java/me/tofaa/entitylib/meta/other/AreaEffectCloudMeta.java
similarity index 96%
rename from src/main/java/me/tofaa/entitylib/meta/mobs/other/AreaEffectCloudMeta.java
rename to src/main/java/me/tofaa/entitylib/meta/other/AreaEffectCloudMeta.java
index d5e288f..19e3564 100644
--- a/src/main/java/me/tofaa/entitylib/meta/mobs/other/AreaEffectCloudMeta.java
+++ b/src/main/java/me/tofaa/entitylib/meta/other/AreaEffectCloudMeta.java
@@ -1,4 +1,4 @@
-package me.tofaa.entitylib.meta.mobs.other;
+package me.tofaa.entitylib.meta.other;
 
 import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
 import me.tofaa.entitylib.meta.EntityMeta;
diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/ArmorStandMeta.java b/src/main/java/me/tofaa/entitylib/meta/other/ArmorStandMeta.java
similarity index 98%
rename from src/main/java/me/tofaa/entitylib/meta/mobs/other/ArmorStandMeta.java
rename to src/main/java/me/tofaa/entitylib/meta/other/ArmorStandMeta.java
index b1660bb..75520c9 100644
--- a/src/main/java/me/tofaa/entitylib/meta/mobs/other/ArmorStandMeta.java
+++ b/src/main/java/me/tofaa/entitylib/meta/other/ArmorStandMeta.java
@@ -1,4 +1,4 @@
-package me.tofaa.entitylib.meta.mobs.other;
+package me.tofaa.entitylib.meta.other;
 
 import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
 import com.github.retrooper.packetevents.util.Vector3f;
diff --git a/src/main/java/me/tofaa/entitylib/meta/other/BlockDisplayMeta.java b/src/main/java/me/tofaa/entitylib/meta/other/BlockDisplayMeta.java
new file mode 100644
index 0000000..fa91854
--- /dev/null
+++ b/src/main/java/me/tofaa/entitylib/meta/other/BlockDisplayMeta.java
@@ -0,0 +1,24 @@
+package me.tofaa.entitylib.meta.other;
+
+import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
+import me.tofaa.entitylib.meta.Metadata;
+import me.tofaa.entitylib.meta.types.DisplayMeta;
+
+public class BlockDisplayMeta extends DisplayMeta {
+
+    public static final byte OFFSET = DisplayMeta.MAX_OFFSET;
+    public static final byte MAX_OFFSET = OFFSET + 1;
+
+    public BlockDisplayMeta(int entityId, Metadata metadata) {
+        super(entityId, metadata);
+    }
+
+    public int getBlockId() {
+        return super.metadata.getIndex(OFFSET, 0);
+    }
+
+    public void setBlockId(int blockId) {
+        super.metadata.setIndex(OFFSET, EntityDataTypes.INT, blockId);
+    }
+
+}
diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/BoatMeta.java b/src/main/java/me/tofaa/entitylib/meta/other/BoatMeta.java
similarity index 98%
rename from src/main/java/me/tofaa/entitylib/meta/mobs/other/BoatMeta.java
rename to src/main/java/me/tofaa/entitylib/meta/other/BoatMeta.java
index e8d794f..a69efbb 100644
--- a/src/main/java/me/tofaa/entitylib/meta/mobs/other/BoatMeta.java
+++ b/src/main/java/me/tofaa/entitylib/meta/other/BoatMeta.java
@@ -1,4 +1,4 @@
-package me.tofaa.entitylib.meta.mobs.other;
+package me.tofaa.entitylib.meta.other;
 
 import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
 import me.tofaa.entitylib.meta.EntityMeta;
diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/EndCrystalMeta.java b/src/main/java/me/tofaa/entitylib/meta/other/EndCrystalMeta.java
similarity index 96%
rename from src/main/java/me/tofaa/entitylib/meta/mobs/other/EndCrystalMeta.java
rename to src/main/java/me/tofaa/entitylib/meta/other/EndCrystalMeta.java
index 3e9ee75..c7e09f1 100644
--- a/src/main/java/me/tofaa/entitylib/meta/mobs/other/EndCrystalMeta.java
+++ b/src/main/java/me/tofaa/entitylib/meta/other/EndCrystalMeta.java
@@ -1,4 +1,4 @@
-package me.tofaa.entitylib.meta.mobs.other;
+package me.tofaa.entitylib.meta.other;
 
 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/other/EnderDragonMeta.java b/src/main/java/me/tofaa/entitylib/meta/other/EnderDragonMeta.java
similarity index 96%
rename from src/main/java/me/tofaa/entitylib/meta/mobs/other/EnderDragonMeta.java
rename to src/main/java/me/tofaa/entitylib/meta/other/EnderDragonMeta.java
index 017c8c0..e505bb1 100644
--- a/src/main/java/me/tofaa/entitylib/meta/mobs/other/EnderDragonMeta.java
+++ b/src/main/java/me/tofaa/entitylib/meta/other/EnderDragonMeta.java
@@ -1,4 +1,4 @@
-package me.tofaa.entitylib.meta.mobs.other;
+package me.tofaa.entitylib.meta.other;
 
 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/other/EvokerFangsMeta.java b/src/main/java/me/tofaa/entitylib/meta/other/EvokerFangsMeta.java
similarity index 89%
rename from src/main/java/me/tofaa/entitylib/meta/mobs/other/EvokerFangsMeta.java
rename to src/main/java/me/tofaa/entitylib/meta/other/EvokerFangsMeta.java
index 432633c..6d09c26 100644
--- a/src/main/java/me/tofaa/entitylib/meta/mobs/other/EvokerFangsMeta.java
+++ b/src/main/java/me/tofaa/entitylib/meta/other/EvokerFangsMeta.java
@@ -1,4 +1,4 @@
-package me.tofaa.entitylib.meta.mobs.other;
+package me.tofaa.entitylib.meta.other;
 
 import me.tofaa.entitylib.meta.EntityMeta;
 import me.tofaa.entitylib.meta.Metadata;
diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/FallingBlockMeta.java b/src/main/java/me/tofaa/entitylib/meta/other/FallingBlockMeta.java
similarity index 96%
rename from src/main/java/me/tofaa/entitylib/meta/mobs/other/FallingBlockMeta.java
rename to src/main/java/me/tofaa/entitylib/meta/other/FallingBlockMeta.java
index 6fe0004..ff556ff 100644
--- a/src/main/java/me/tofaa/entitylib/meta/mobs/other/FallingBlockMeta.java
+++ b/src/main/java/me/tofaa/entitylib/meta/other/FallingBlockMeta.java
@@ -1,4 +1,4 @@
-package me.tofaa.entitylib.meta.mobs.other;
+package me.tofaa.entitylib.meta.other;
 
 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/other/FireworkRocketMeta.java b/src/main/java/me/tofaa/entitylib/meta/other/FireworkRocketMeta.java
similarity index 97%
rename from src/main/java/me/tofaa/entitylib/meta/mobs/other/FireworkRocketMeta.java
rename to src/main/java/me/tofaa/entitylib/meta/other/FireworkRocketMeta.java
index bdb6bb9..76b36a5 100644
--- a/src/main/java/me/tofaa/entitylib/meta/mobs/other/FireworkRocketMeta.java
+++ b/src/main/java/me/tofaa/entitylib/meta/other/FireworkRocketMeta.java
@@ -1,4 +1,4 @@
-package me.tofaa.entitylib.meta.mobs.other;
+package me.tofaa.entitylib.meta.other;
 
 import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
 import com.github.retrooper.packetevents.protocol.item.ItemStack;
diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/FishingHookMeta.java b/src/main/java/me/tofaa/entitylib/meta/other/FishingHookMeta.java
similarity index 96%
rename from src/main/java/me/tofaa/entitylib/meta/mobs/other/FishingHookMeta.java
rename to src/main/java/me/tofaa/entitylib/meta/other/FishingHookMeta.java
index 29ea6f2..61f3242 100644
--- a/src/main/java/me/tofaa/entitylib/meta/mobs/other/FishingHookMeta.java
+++ b/src/main/java/me/tofaa/entitylib/meta/other/FishingHookMeta.java
@@ -1,4 +1,4 @@
-package me.tofaa.entitylib.meta.mobs.other;
+package me.tofaa.entitylib.meta.other;
 
 import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
 import me.tofaa.entitylib.meta.EntityMeta;
diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/GlowItemFrameMeta.java b/src/main/java/me/tofaa/entitylib/meta/other/GlowItemFrameMeta.java
similarity index 88%
rename from src/main/java/me/tofaa/entitylib/meta/mobs/other/GlowItemFrameMeta.java
rename to src/main/java/me/tofaa/entitylib/meta/other/GlowItemFrameMeta.java
index 7b73ff9..96fc2d7 100644
--- a/src/main/java/me/tofaa/entitylib/meta/mobs/other/GlowItemFrameMeta.java
+++ b/src/main/java/me/tofaa/entitylib/meta/other/GlowItemFrameMeta.java
@@ -1,4 +1,4 @@
-package me.tofaa.entitylib.meta.mobs.other;
+package me.tofaa.entitylib.meta.other;
 
 import me.tofaa.entitylib.meta.Metadata;
 
diff --git a/src/main/java/me/tofaa/entitylib/meta/other/InteractionMeta.java b/src/main/java/me/tofaa/entitylib/meta/other/InteractionMeta.java
new file mode 100644
index 0000000..77318f9
--- /dev/null
+++ b/src/main/java/me/tofaa/entitylib/meta/other/InteractionMeta.java
@@ -0,0 +1,41 @@
+package me.tofaa.entitylib.meta.other;
+
+import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
+import me.tofaa.entitylib.meta.EntityMeta;
+import me.tofaa.entitylib.meta.Metadata;
+
+public class InteractionMeta extends EntityMeta {
+
+    public static final byte OFFSET = EntityMeta.MAX_OFFSET;
+    public static final byte MAX_OFFSET = OFFSET + 3;
+
+    public InteractionMeta(int entityId, Metadata metadata) {
+        super(entityId, metadata);
+    }
+
+    public float getWidth() {
+        return super.metadata.getIndex(OFFSET, 1.0F);
+    }
+
+    public void setWidth(float value) {
+        super.metadata.setIndex(OFFSET, EntityDataTypes.FLOAT, value);
+    }
+
+    public float getHeight() {
+        return super.metadata.getIndex(offset(OFFSET, 1), 1.0F);
+    }
+
+    public void setHeight(float value) {
+        super.metadata.setIndex(offset(OFFSET, 1), EntityDataTypes.FLOAT, value);
+    }
+
+    public boolean isResponsive() {
+        return super.metadata.getIndex(offset(OFFSET, 2), false);
+    }
+
+    public void setResponsive(boolean value) {
+        super.metadata.setIndex(offset(OFFSET, 2), EntityDataTypes.BOOLEAN, value);
+    }
+
+
+}
diff --git a/src/main/java/me/tofaa/entitylib/meta/other/ItemDisplayMeta.java b/src/main/java/me/tofaa/entitylib/meta/other/ItemDisplayMeta.java
new file mode 100644
index 0000000..204fe7d
--- /dev/null
+++ b/src/main/java/me/tofaa/entitylib/meta/other/ItemDisplayMeta.java
@@ -0,0 +1,39 @@
+package me.tofaa.entitylib.meta.other;
+
+import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
+import me.tofaa.entitylib.meta.Metadata;
+import me.tofaa.entitylib.meta.types.DisplayMeta;
+
+public class ItemDisplayMeta extends DisplayMeta {
+
+    public static final byte OFFSET = DisplayMeta.MAX_OFFSET;
+    public static final byte MAX_OFFSET = OFFSET + 1;
+
+
+    public ItemDisplayMeta(int entityId, Metadata metadata) {
+        super(entityId, metadata);
+    }
+
+    public DisplayType getDisplayType() {
+        return DisplayType.VALUES[super.metadata.getIndex(OFFSET, 0)];
+    }
+
+    public void setDisplayType(DisplayType displayType) {
+        super.metadata.setIndex(OFFSET, EntityDataTypes.BYTE, (byte) displayType.ordinal());
+    }
+
+    public enum DisplayType {
+        NONE,
+        THIRD_PERSON_LEFT_HAND,
+        THIRD_PERSON_RIGHT_HAND,
+        FIRST_PERSON_LEFT_HAND,
+        FIRST_PERSON_RIGHT_HAND,
+        HEAD,
+        GUI,
+        GROUND,
+        FIXED;
+
+        private static final DisplayType[] VALUES = values();
+    }
+
+}
diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/ItemFrameMeta.java b/src/main/java/me/tofaa/entitylib/meta/other/ItemFrameMeta.java
similarity index 97%
rename from src/main/java/me/tofaa/entitylib/meta/mobs/other/ItemFrameMeta.java
rename to src/main/java/me/tofaa/entitylib/meta/other/ItemFrameMeta.java
index 00ec3b7..ad15d4c 100644
--- a/src/main/java/me/tofaa/entitylib/meta/mobs/other/ItemFrameMeta.java
+++ b/src/main/java/me/tofaa/entitylib/meta/other/ItemFrameMeta.java
@@ -1,4 +1,4 @@
-package me.tofaa.entitylib.meta.mobs.other;
+package me.tofaa.entitylib.meta.other;
 
 import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
 import com.github.retrooper.packetevents.protocol.item.ItemStack;
diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/LeashKnotMeta.java b/src/main/java/me/tofaa/entitylib/meta/other/LeashKnotMeta.java
similarity index 88%
rename from src/main/java/me/tofaa/entitylib/meta/mobs/other/LeashKnotMeta.java
rename to src/main/java/me/tofaa/entitylib/meta/other/LeashKnotMeta.java
index 18260a2..551bfde 100644
--- a/src/main/java/me/tofaa/entitylib/meta/mobs/other/LeashKnotMeta.java
+++ b/src/main/java/me/tofaa/entitylib/meta/other/LeashKnotMeta.java
@@ -1,4 +1,4 @@
-package me.tofaa.entitylib.meta.mobs.other;
+package me.tofaa.entitylib.meta.other;
 
 import me.tofaa.entitylib.meta.EntityMeta;
 import me.tofaa.entitylib.meta.Metadata;
diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/LightningBoltMeta.java b/src/main/java/me/tofaa/entitylib/meta/other/LightningBoltMeta.java
similarity index 89%
rename from src/main/java/me/tofaa/entitylib/meta/mobs/other/LightningBoltMeta.java
rename to src/main/java/me/tofaa/entitylib/meta/other/LightningBoltMeta.java
index 4ec7add..36b2fdc 100644
--- a/src/main/java/me/tofaa/entitylib/meta/mobs/other/LightningBoltMeta.java
+++ b/src/main/java/me/tofaa/entitylib/meta/other/LightningBoltMeta.java
@@ -1,4 +1,4 @@
-package me.tofaa.entitylib.meta.mobs.other;
+package me.tofaa.entitylib.meta.other;
 
 import me.tofaa.entitylib.meta.EntityMeta;
 import me.tofaa.entitylib.meta.Metadata;
diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/LlamaSpitMeta.java b/src/main/java/me/tofaa/entitylib/meta/other/LlamaSpitMeta.java
similarity index 93%
rename from src/main/java/me/tofaa/entitylib/meta/mobs/other/LlamaSpitMeta.java
rename to src/main/java/me/tofaa/entitylib/meta/other/LlamaSpitMeta.java
index ad61c8e..1f386e0 100644
--- a/src/main/java/me/tofaa/entitylib/meta/mobs/other/LlamaSpitMeta.java
+++ b/src/main/java/me/tofaa/entitylib/meta/other/LlamaSpitMeta.java
@@ -1,4 +1,4 @@
-package me.tofaa.entitylib.meta.mobs.other;
+package me.tofaa.entitylib.meta.other;
 
 import me.tofaa.entitylib.meta.EntityMeta;
 import me.tofaa.entitylib.meta.Metadata;
diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/MarkerMeta.java b/src/main/java/me/tofaa/entitylib/meta/other/MarkerMeta.java
similarity index 88%
rename from src/main/java/me/tofaa/entitylib/meta/mobs/other/MarkerMeta.java
rename to src/main/java/me/tofaa/entitylib/meta/other/MarkerMeta.java
index 5bc64b5..2656e23 100644
--- a/src/main/java/me/tofaa/entitylib/meta/mobs/other/MarkerMeta.java
+++ b/src/main/java/me/tofaa/entitylib/meta/other/MarkerMeta.java
@@ -1,4 +1,4 @@
-package me.tofaa.entitylib.meta.mobs.other;
+package me.tofaa.entitylib.meta.other;
 
 import me.tofaa.entitylib.meta.EntityMeta;
 import me.tofaa.entitylib.meta.Metadata;
diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/PaintingMeta.java b/src/main/java/me/tofaa/entitylib/meta/other/PaintingMeta.java
similarity index 98%
rename from src/main/java/me/tofaa/entitylib/meta/mobs/other/PaintingMeta.java
rename to src/main/java/me/tofaa/entitylib/meta/other/PaintingMeta.java
index f0f4df4..cd0e64c 100644
--- a/src/main/java/me/tofaa/entitylib/meta/mobs/other/PaintingMeta.java
+++ b/src/main/java/me/tofaa/entitylib/meta/other/PaintingMeta.java
@@ -1,4 +1,4 @@
-package me.tofaa.entitylib.meta.mobs.other;
+package me.tofaa.entitylib.meta.other;
 
 import com.github.retrooper.packetevents.protocol.world.Direction;
 import me.tofaa.entitylib.meta.EntityMeta;
diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/PrimedTntMeta.java b/src/main/java/me/tofaa/entitylib/meta/other/PrimedTntMeta.java
similarity index 93%
rename from src/main/java/me/tofaa/entitylib/meta/mobs/other/PrimedTntMeta.java
rename to src/main/java/me/tofaa/entitylib/meta/other/PrimedTntMeta.java
index 162dee5..0f87fa0 100644
--- a/src/main/java/me/tofaa/entitylib/meta/mobs/other/PrimedTntMeta.java
+++ b/src/main/java/me/tofaa/entitylib/meta/other/PrimedTntMeta.java
@@ -1,4 +1,4 @@
-package me.tofaa.entitylib.meta.mobs.other;
+package me.tofaa.entitylib.meta.other;
 
 import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
 import me.tofaa.entitylib.meta.EntityMeta;
diff --git a/src/main/java/me/tofaa/entitylib/meta/other/TextDisplayMeta.java b/src/main/java/me/tofaa/entitylib/meta/other/TextDisplayMeta.java
new file mode 100644
index 0000000..4c77d23
--- /dev/null
+++ b/src/main/java/me/tofaa/entitylib/meta/other/TextDisplayMeta.java
@@ -0,0 +1,96 @@
+package me.tofaa.entitylib.meta.other;
+
+import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
+import me.tofaa.entitylib.meta.Metadata;
+import me.tofaa.entitylib.meta.types.DisplayMeta;
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
+
+public class TextDisplayMeta extends DisplayMeta {
+
+    public static final byte OFFSET = DisplayMeta.MAX_OFFSET;
+    public static final byte MAX_OFFSET = OFFSET + 5;
+
+    private static final byte SHADOW = 1;
+    private static final byte SEE_THROUGH = 2;
+    private static final byte USE_DEFAULT_BACKGROUND = 4;
+    private static final byte ALIGN_LEFT = 8;
+    private static final byte ALIGN_RIGHT = 16;
+
+    public TextDisplayMeta(int entityId, Metadata metadata) {
+        super(entityId, metadata);
+    }
+
+
+    public Component getText() {
+        return metadata.getIndex(OFFSET, Component.empty());
+    }
+
+    public void setComponent(Component component) {
+        metadata.setIndex(OFFSET, EntityDataTypes.COMPONENT, GsonComponentSerializer.gson().serialize(component));
+    }
+
+    public int getLineWidth() {
+        return metadata.getIndex(offset(OFFSET, 1), 200);
+    }
+
+    public void setLineWidth(int value) {
+        metadata.setIndex(offset(OFFSET, 1), EntityDataTypes.INT, value);
+    }
+
+    public int getBackgroundColor() {
+        return metadata.getIndex(offset(OFFSET, 2), 0);
+    }
+
+    public void setBackgroundColor(int value) {
+        metadata.setIndex(offset(OFFSET, 2), EntityDataTypes.INT, value);
+    }
+
+    public byte getTextOpacity() {
+        return metadata.getIndex(offset(OFFSET, 3), (byte) -1);
+    }
+
+    public void setTextOpacity(byte value) {
+        metadata.setIndex(offset(OFFSET, 3), EntityDataTypes.BYTE, value);
+    }
+
+    public boolean isShadow() {
+        return getMaskBit(offset(OFFSET, 4), SHADOW);
+    }
+
+    public void setShadow(boolean value) {
+        setMaskBit(offset(OFFSET, 4), SHADOW, value);
+    }
+
+    public boolean isSeeThrough() {
+        return getMaskBit(offset(OFFSET, 4), SEE_THROUGH);
+    }
+
+    public void setSeeThrough(boolean value) {
+        setMaskBit(offset(OFFSET, 4), SEE_THROUGH, value);
+    }
+
+    public boolean isUseDefaultBackground() {
+        return getMaskBit(offset(OFFSET, 4), USE_DEFAULT_BACKGROUND);
+    }
+
+    public void setUseDefaultBackground(boolean value) {
+        setMaskBit(offset(OFFSET, 4), USE_DEFAULT_BACKGROUND, value);
+    }
+
+    public boolean isAlignLeft() {
+        return getMaskBit(offset(OFFSET, 4), ALIGN_LEFT);
+    }
+
+    public void setAlignLeft(boolean value) {
+        setMaskBit(OFFSET + 4, ALIGN_LEFT, value);
+    }
+
+    public boolean isAlignRight() {
+        return getMaskBit(offset(OFFSET, 4), ALIGN_RIGHT);
+    }
+
+    public void setAlignRight(boolean value) {
+        setMaskBit(offset(OFFSET, 4), ALIGN_RIGHT, value);
+    }
+}
diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/DragonFireballMeta.java b/src/main/java/me/tofaa/entitylib/meta/projectile/DragonFireballMeta.java
similarity index 95%
rename from src/main/java/me/tofaa/entitylib/meta/mobs/other/DragonFireballMeta.java
rename to src/main/java/me/tofaa/entitylib/meta/projectile/DragonFireballMeta.java
index 62b361e..19d05f9 100644
--- a/src/main/java/me/tofaa/entitylib/meta/mobs/other/DragonFireballMeta.java
+++ b/src/main/java/me/tofaa/entitylib/meta/projectile/DragonFireballMeta.java
@@ -1,4 +1,4 @@
-package me.tofaa.entitylib.meta.mobs.other;
+package me.tofaa.entitylib.meta.projectile;
 
 import me.tofaa.entitylib.meta.EntityMeta;
 import me.tofaa.entitylib.meta.Metadata;
diff --git a/src/main/java/me/tofaa/entitylib/meta/mobs/other/WitherSkullMeta.java b/src/main/java/me/tofaa/entitylib/meta/projectile/WitherSkullMeta.java
similarity index 96%
rename from src/main/java/me/tofaa/entitylib/meta/mobs/other/WitherSkullMeta.java
rename to src/main/java/me/tofaa/entitylib/meta/projectile/WitherSkullMeta.java
index c53372d..985a274 100644
--- a/src/main/java/me/tofaa/entitylib/meta/mobs/other/WitherSkullMeta.java
+++ b/src/main/java/me/tofaa/entitylib/meta/projectile/WitherSkullMeta.java
@@ -1,4 +1,4 @@
-package me.tofaa.entitylib.meta.mobs.other;
+package me.tofaa.entitylib.meta.projectile;
 
 import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
 import me.tofaa.entitylib.meta.EntityMeta;
diff --git a/src/main/java/me/tofaa/entitylib/meta/types/DisplayMeta.java b/src/main/java/me/tofaa/entitylib/meta/types/DisplayMeta.java
new file mode 100644
index 0000000..0f3ed1a
--- /dev/null
+++ b/src/main/java/me/tofaa/entitylib/meta/types/DisplayMeta.java
@@ -0,0 +1,148 @@
+package me.tofaa.entitylib.meta.types;
+
+import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
+import com.github.retrooper.packetevents.util.Quaternion4f;
+import com.github.retrooper.packetevents.util.Vector3f;
+import me.tofaa.entitylib.meta.EntityMeta;
+import me.tofaa.entitylib.meta.Metadata;
+
+public class DisplayMeta extends EntityMeta {
+
+    public static final byte OFFSET = EntityMeta.MAX_OFFSET;
+    public static final byte MAX_OFFSET = OFFSET + 13;
+
+    public DisplayMeta(int entityId, Metadata metadata) {
+        super(entityId, metadata);
+    }
+
+    public int getInterpolationDelay() {
+        return super.metadata.getIndex(OFFSET, 0);
+    }
+
+    public void setInterpolationDelay(int value) {
+        super.metadata.setIndex(OFFSET, EntityDataTypes.INT, value);
+    }
+
+    public int getTransformationInterpolationDuration() {
+        return super.metadata.getIndex(offset(OFFSET, 1), 0);
+    }
+
+    public void setTransformationInterpolationDuration(int value) {
+        super.metadata.setIndex(offset(OFFSET, 1), EntityDataTypes.INT, value);
+    }
+
+    public int getPositionRotationInterpolationDuration() {
+        return super.metadata.getIndex(offset(OFFSET, 2), 0);
+    }
+
+    public void setPositionRotationInterpolationDuration(int value) {
+        super.metadata.setIndex(offset(OFFSET, 2), EntityDataTypes.INT, value);
+    }
+
+    public Vector3f getTranslation() {
+        return super.metadata.getIndex(offset(OFFSET, 3), Vector3f.zero());
+    }
+
+    public void setTranslation(Vector3f value) {
+        super.metadata.setIndex(offset(OFFSET, 3), EntityDataTypes.VECTOR3F, value);
+    }
+
+    public Vector3f getScale() {
+        return super.metadata.getIndex(offset(OFFSET, 4), new Vector3f(1.0f, 1.0f, 1.0f));
+    }
+
+    public void setScale(Vector3f value) {
+        super.metadata.setIndex(offset(OFFSET, 4), EntityDataTypes.VECTOR3F, value);
+    }
+
+    public Quaternion4f getLeftRotation() {
+        return super.metadata.getIndex(offset(OFFSET, 5), new Quaternion4f(0.0f, 0.0f, 0.0f, 1.0f));
+    }
+
+    public void setLeftRotation(Quaternion4f value) {
+        super.metadata.setIndex(offset(OFFSET, 5), EntityDataTypes.QUATERNION, value);
+    }
+
+    public Quaternion4f getRightRotation() {
+        return super.metadata.getIndex(offset(OFFSET, 6), new Quaternion4f(0.0f, 0.0f, 0.0f, 1.0f));
+    }
+
+    public void setRightRotation(Quaternion4f value) {
+        super.metadata.setIndex(offset(OFFSET, 6), EntityDataTypes.QUATERNION, value);
+    }
+
+    public BillboardConstraints getBillboardConstraints() {
+        return BillboardConstraints.VALUES[super.metadata.getIndex(offset(OFFSET, 7), (byte) 0)];
+    }
+
+    public void setBillboardConstraints(BillboardConstraints value) {
+        super.metadata.setIndex(offset(OFFSET, 7), EntityDataTypes.BYTE, (byte) value.ordinal());
+    }
+
+    //(blockLight << 4 | skyLight << 20)
+    public int getBrightnessOverride() {
+        return super.metadata.getIndex(offset(OFFSET, 8), -1);
+    }
+
+    public void setBrightnessOverride(int value) {
+        super.metadata.setIndex(offset(OFFSET, 8), EntityDataTypes.INT, value);
+    }
+
+    public float getViewRange() {
+        return super.metadata.getIndex(offset(OFFSET, 9), 1.0f);
+    }
+
+    public void setViewRange(float value) {
+        super.metadata.setIndex(offset(OFFSET, 9), EntityDataTypes.FLOAT, value);
+    }
+
+    public float getShadowRadius() {
+        return super.metadata.getIndex(offset(OFFSET, 10), 0.0f);
+    }
+
+    public void setShadowRadius(float value) {
+        super.metadata.setIndex(offset(OFFSET, 10), EntityDataTypes.FLOAT, value);
+    }
+
+    public float getShadowStrength() {
+        return super.metadata.getIndex(offset(OFFSET, 11), 1.0f);
+    }
+
+    public void setShadowStrength(float value) {
+        super.metadata.setIndex(offset(OFFSET, 11), EntityDataTypes.FLOAT, value);
+    }
+
+    public float getWidth() {
+        return super.metadata.getIndex(offset(OFFSET, 12), 0.0f);
+    }
+
+    public void setWidth(float value) {
+        super.metadata.setIndex(offset(OFFSET, 12), EntityDataTypes.FLOAT, value);
+    }
+
+    public float getHeight() {
+        return super.metadata.getIndex(offset(OFFSET, 13), 0.0f);
+    }
+
+    public void setHeight(float value) {
+        super.metadata.setIndex(offset(OFFSET, 13), EntityDataTypes.FLOAT, value);
+    }
+
+    public int getGlowColorOverride() {
+        return super.metadata.getIndex(offset(OFFSET, 14), -1);
+    }
+
+    public void setGlowColorOverride(int value) {
+        super.metadata.setIndex(offset(OFFSET, 14), EntityDataTypes.INT, value);
+    }
+
+    public enum BillboardConstraints {
+        FIXED,
+        VERTICAL,
+        HORIZONTAL,
+        CENTER;
+
+        private static final BillboardConstraints[] VALUES = values();
+    }
+
+}
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 4803a82..5798521 100644
--- a/test-plugin/src/main/java/me/tofaa/entitylib/EntityLibPlugin.java
+++ b/test-plugin/src/main/java/me/tofaa/entitylib/EntityLibPlugin.java
@@ -1,7 +1,13 @@
 package me.tofaa.entitylib;
 
 import com.github.retrooper.packetevents.PacketEvents;
+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 me.tofaa.entitylib.entity.EntityInteractionProcessor;
+import me.tofaa.entitylib.entity.WrapperEntity;
 import org.bukkit.plugin.java.JavaPlugin;
+import org.jetbrains.annotations.NotNull;
 
 public final class EntityLibPlugin extends JavaPlugin {
 
@@ -10,6 +16,8 @@ public final class EntityLibPlugin extends JavaPlugin {
     @Override
     public void onEnable() {
         EntityLib.init(PacketEvents.getAPI());
+        EntityLib.enableEntityInteractions();
+        EntityLib.setInteractionProcessor((entity, action, hand, user) -> user.sendMessage("Hello World"));
         getCommand("testapi").setExecutor(new TestCommand());
         getCommand("testentity").setExecutor(new TestEntityCommand());
         instance = this;