In the implementation of this call-back method, you should consider invoking {@link
+ * JsonSerializationContext#serialize(Object, Type)} method to create JsonElements for any
+ * non-trivial field of the {@code src} object. However, you should never invoke it on the {@code
+ * src} object itself since that will cause an infinite loop (Gson will call your call-back method
+ * again).
+ *
+ * @param src the object that needs to be converted to Json.
+ * @param typeOfSrc the actual type (fully genericized version) of the source object.
+ * @param context
+ * @return a JsonElement corresponding to the specified object.
+ */
+ @Override
+ public JsonElement serialize(ItemStack src, Type typeOfSrc, JsonSerializationContext context) {
+ return new JsonPrimitive(Arrays.toString(src.serializeAsBytes()));
+ }
+}
diff --git a/src/main/java/me/unurled/sacredrealms/sr/gui/BackItem.java b/src/main/java/me/unurled/sacredrealms/sr/gui/BackItem.java
new file mode 100644
index 0000000..9354aa2
--- /dev/null
+++ b/src/main/java/me/unurled/sacredrealms/sr/gui/BackItem.java
@@ -0,0 +1,26 @@
+package me.unurled.sacredrealms.sr.gui;
+
+import org.bukkit.Material;
+import xyz.xenondevs.invui.gui.PagedGui;
+import xyz.xenondevs.invui.item.ItemProvider;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.controlitem.PageItem;
+
+public class BackItem extends PageItem {
+
+ public BackItem() {
+ super(false);
+ }
+
+ @Override
+ public ItemProvider getItemProvider(PagedGui> gui) {
+ ItemBuilder builder = new ItemBuilder(Material.RED_STAINED_GLASS_PANE);
+ builder
+ .setDisplayName("$7Previous Page")
+ .addLoreLines(
+ gui.hasPreviousPage()
+ ? "§7Go to page §e" + gui.getCurrentPage() + "§7/§e" + gui.getPageAmount()
+ : "§cYou can't go further back");
+ return builder;
+ }
+}
diff --git a/src/main/java/me/unurled/sacredrealms/sr/gui/ForwardItem.java b/src/main/java/me/unurled/sacredrealms/sr/gui/ForwardItem.java
new file mode 100644
index 0000000..e26666f
--- /dev/null
+++ b/src/main/java/me/unurled/sacredrealms/sr/gui/ForwardItem.java
@@ -0,0 +1,27 @@
+package me.unurled.sacredrealms.sr.gui;
+
+import org.bukkit.Material;
+import xyz.xenondevs.invui.gui.PagedGui;
+import xyz.xenondevs.invui.item.ItemProvider;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.controlitem.PageItem;
+
+public class ForwardItem extends PageItem {
+
+ public ForwardItem() {
+ super(true);
+ }
+
+ @Override
+ public ItemProvider getItemProvider(PagedGui> gui) {
+ ItemBuilder builder = new ItemBuilder(Material.GREEN_STAINED_GLASS_PANE);
+ builder
+ .setDisplayName("§7Next page")
+ .addLoreLines(
+ gui.hasNextPage()
+ ? "§7Go to page §e" + (gui.getCurrentPage() + 2) + "§7/§e" + gui.getPageAmount()
+ : "§cThere are no more pages");
+
+ return builder;
+ }
+}
diff --git a/src/main/java/me/unurled/sacredrealms/sr/gui/entitytype/EntityArmorItem.java b/src/main/java/me/unurled/sacredrealms/sr/gui/entitytype/EntityArmorItem.java
new file mode 100644
index 0000000..5cf0791
--- /dev/null
+++ b/src/main/java/me/unurled/sacredrealms/sr/gui/entitytype/EntityArmorItem.java
@@ -0,0 +1,51 @@
+package me.unurled.sacredrealms.sr.gui.entitytype;
+
+import me.unurled.sacredrealms.sr.components.entity.SREntityType;
+import org.bukkit.entity.Player;
+import org.bukkit.event.inventory.ClickType;
+import org.bukkit.event.inventory.InventoryClickEvent;
+import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.NotNull;
+import xyz.xenondevs.invui.item.Item;
+import xyz.xenondevs.invui.item.ItemProvider;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.AbstractItem;
+import xyz.xenondevs.invui.window.Window;
+
+public class EntityArmorItem extends AbstractItem {
+
+ private final ItemStack stack;
+
+ public EntityArmorItem(SREntityType type, int armorSlot) {
+ if (armorSlot == 4) {
+ stack = type.getHandItem();
+ } else if (armorSlot == 5) {
+ stack = type.getSecondHandItem();
+ } else {
+ stack = type.getArmor().get(armorSlot);
+ }
+ }
+
+ /**
+ * Gets the {@link ItemProvider}. This method gets called every time a {@link Window} is notified
+ * ({@link #notifyWindows()}).
+ *
+ * @return The {@link ItemProvider}
+ */
+ @Override
+ public ItemProvider getItemProvider() {
+ return new ItemBuilder(stack);
+ }
+
+ /**
+ * A method called if the {@link ItemStack} associated to this {@link Item} has been clicked by a
+ * player.
+ *
+ * @param clickType The {@link ClickType} the {@link Player} performed.
+ * @param player The {@link Player} who clicked on the {@link ItemStack}.
+ * @param event The {@link InventoryClickEvent} associated with this click.
+ */
+ @Override
+ public void handleClick(
+ @NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {}
+}
diff --git a/src/main/java/me/unurled/sacredrealms/sr/gui/entitytype/EntityBehaviorItem.java b/src/main/java/me/unurled/sacredrealms/sr/gui/entitytype/EntityBehaviorItem.java
new file mode 100644
index 0000000..ef9f515
--- /dev/null
+++ b/src/main/java/me/unurled/sacredrealms/sr/gui/entitytype/EntityBehaviorItem.java
@@ -0,0 +1,46 @@
+package me.unurled.sacredrealms.sr.gui.entitytype;
+
+import me.unurled.sacredrealms.sr.components.entity.SREntityType;
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+import org.bukkit.event.inventory.ClickType;
+import org.bukkit.event.inventory.InventoryClickEvent;
+import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.NotNull;
+import xyz.xenondevs.invui.item.Item;
+import xyz.xenondevs.invui.item.ItemProvider;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.AbstractItem;
+import xyz.xenondevs.invui.window.Window;
+
+public class EntityBehaviorItem extends AbstractItem {
+
+ String behavior;
+
+ public EntityBehaviorItem(SREntityType type) {
+ // behavior = type.getBehavior();
+ }
+
+ /**
+ * Gets the {@link ItemProvider}. This method gets called every time a {@link Window} is notified
+ * ({@link #notifyWindows()}).
+ *
+ * @return The {@link ItemProvider}
+ */
+ @Override
+ public ItemProvider getItemProvider() {
+ return new ItemBuilder(Material.NETHERITE_SWORD).setDisplayName("Behavior: " + behavior);
+ }
+
+ /**
+ * A method called if the {@link ItemStack} associated to this {@link Item} has been clicked by a
+ * player.
+ *
+ * @param clickType The {@link ClickType} the {@link Player} performed.
+ * @param player The {@link Player} who clicked on the {@link ItemStack}.
+ * @param event The {@link InventoryClickEvent} associated with this click.
+ */
+ @Override
+ public void handleClick(
+ @NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {}
+}
diff --git a/src/main/java/me/unurled/sacredrealms/sr/gui/entitytype/EntityExpItem.java b/src/main/java/me/unurled/sacredrealms/sr/gui/entitytype/EntityExpItem.java
new file mode 100644
index 0000000..3e526cd
--- /dev/null
+++ b/src/main/java/me/unurled/sacredrealms/sr/gui/entitytype/EntityExpItem.java
@@ -0,0 +1,46 @@
+package me.unurled.sacredrealms.sr.gui.entitytype;
+
+import me.unurled.sacredrealms.sr.components.entity.SREntityType;
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+import org.bukkit.event.inventory.ClickType;
+import org.bukkit.event.inventory.InventoryClickEvent;
+import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.NotNull;
+import xyz.xenondevs.invui.item.Item;
+import xyz.xenondevs.invui.item.ItemProvider;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.AbstractItem;
+import xyz.xenondevs.invui.window.Window;
+
+public class EntityExpItem extends AbstractItem {
+
+ private final Long exp;
+
+ public EntityExpItem(SREntityType type) {
+ exp = type.getExperience();
+ }
+
+ /**
+ * Gets the {@link ItemProvider}. This method gets called every time a {@link Window} is notified
+ * ({@link #notifyWindows()}).
+ *
+ * @return The {@link ItemProvider}
+ */
+ @Override
+ public ItemProvider getItemProvider() {
+ return new ItemBuilder(Material.EXPERIENCE_BOTTLE).setDisplayName("Experience: " + exp);
+ }
+
+ /**
+ * A method called if the {@link ItemStack} associated to this {@link Item} has been clicked by a
+ * player.
+ *
+ * @param clickType The {@link ClickType} the {@link Player} performed.
+ * @param player The {@link Player} who clicked on the {@link ItemStack}.
+ * @param event The {@link InventoryClickEvent} associated with this click.
+ */
+ @Override
+ public void handleClick(
+ @NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {}
+}
diff --git a/src/main/java/me/unurled/sacredrealms/sr/gui/entitytype/EntityItemDisplay.java b/src/main/java/me/unurled/sacredrealms/sr/gui/entitytype/EntityItemDisplay.java
new file mode 100644
index 0000000..cec24ad
--- /dev/null
+++ b/src/main/java/me/unurled/sacredrealms/sr/gui/entitytype/EntityItemDisplay.java
@@ -0,0 +1,46 @@
+package me.unurled.sacredrealms.sr.gui.entitytype;
+
+import me.unurled.sacredrealms.sr.components.entity.SREntityType;
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+import org.bukkit.event.inventory.ClickType;
+import org.bukkit.event.inventory.InventoryClickEvent;
+import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.NotNull;
+import xyz.xenondevs.invui.item.Item;
+import xyz.xenondevs.invui.item.ItemProvider;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.AbstractItem;
+import xyz.xenondevs.invui.window.Window;
+
+public class EntityItemDisplay extends AbstractItem {
+
+ private final String name;
+
+ public EntityItemDisplay(SREntityType type) {
+ name = type.getItem().getType().name();
+ }
+
+ /**
+ * Gets the {@link ItemProvider}. This method gets called every time a {@link Window} is notified
+ * ({@link #notifyWindows()}).
+ *
+ * @return The {@link ItemProvider}
+ */
+ @Override
+ public ItemProvider getItemProvider() {
+ return new ItemBuilder(Material.CREEPER_SPAWN_EGG).setDisplayName("Item Display: " + name);
+ }
+
+ /**
+ * A method called if the {@link ItemStack} associated to this {@link Item} has been clicked by a
+ * player.
+ *
+ * @param clickType The {@link ClickType} the {@link Player} performed.
+ * @param player The {@link Player} who clicked on the {@link ItemStack}.
+ * @param event The {@link InventoryClickEvent} associated with this click.
+ */
+ @Override
+ public void handleClick(
+ @NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {}
+}
diff --git a/src/main/java/me/unurled/sacredrealms/sr/gui/entitytype/EntityLevelItem.java b/src/main/java/me/unurled/sacredrealms/sr/gui/entitytype/EntityLevelItem.java
new file mode 100644
index 0000000..bf5fa89
--- /dev/null
+++ b/src/main/java/me/unurled/sacredrealms/sr/gui/entitytype/EntityLevelItem.java
@@ -0,0 +1,46 @@
+package me.unurled.sacredrealms.sr.gui.entitytype;
+
+import me.unurled.sacredrealms.sr.components.entity.SREntityType;
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+import org.bukkit.event.inventory.ClickType;
+import org.bukkit.event.inventory.InventoryClickEvent;
+import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.NotNull;
+import xyz.xenondevs.invui.item.Item;
+import xyz.xenondevs.invui.item.ItemProvider;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.AbstractItem;
+import xyz.xenondevs.invui.window.Window;
+
+public class EntityLevelItem extends AbstractItem {
+
+ private final int level;
+
+ public EntityLevelItem(SREntityType type) {
+ level = type.getLevel();
+ }
+
+ /**
+ * Gets the {@link ItemProvider}. This method gets called every time a {@link Window} is notified
+ * ({@link #notifyWindows()}).
+ *
+ * @return The {@link ItemProvider}
+ */
+ @Override
+ public ItemProvider getItemProvider() {
+ return new ItemBuilder(Material.DIAMOND).setDisplayName("Level: " + level);
+ }
+
+ /**
+ * A method called if the {@link ItemStack} associated to this {@link Item} has been clicked by a
+ * player.
+ *
+ * @param clickType The {@link ClickType} the {@link Player} performed.
+ * @param player The {@link Player} who clicked on the {@link ItemStack}.
+ * @param event The {@link InventoryClickEvent} associated with this click.
+ */
+ @Override
+ public void handleClick(
+ @NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {}
+}
diff --git a/src/main/java/me/unurled/sacredrealms/sr/gui/entitytype/EntityLootItem.java b/src/main/java/me/unurled/sacredrealms/sr/gui/entitytype/EntityLootItem.java
new file mode 100644
index 0000000..0f845b3
--- /dev/null
+++ b/src/main/java/me/unurled/sacredrealms/sr/gui/entitytype/EntityLootItem.java
@@ -0,0 +1,39 @@
+package me.unurled.sacredrealms.sr.gui.entitytype;
+
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+import org.bukkit.event.inventory.ClickType;
+import org.bukkit.event.inventory.InventoryClickEvent;
+import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.NotNull;
+import xyz.xenondevs.invui.item.Item;
+import xyz.xenondevs.invui.item.ItemProvider;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.AbstractItem;
+import xyz.xenondevs.invui.window.Window;
+
+public class EntityLootItem extends AbstractItem {
+
+ /**
+ * Gets the {@link ItemProvider}. This method gets called every time a {@link Window} is notified
+ * ({@link #notifyWindows()}).
+ *
+ * @return The {@link ItemProvider}
+ */
+ @Override
+ public ItemProvider getItemProvider() {
+ return new ItemBuilder(Material.SKELETON_SKULL).setDisplayName("Death Loot");
+ }
+
+ /**
+ * A method called if the {@link ItemStack} associated to this {@link Item} has been clicked by a
+ * player.
+ *
+ * @param clickType The {@link ClickType} the {@link Player} performed.
+ * @param player The {@link Player} who clicked on the {@link ItemStack}.
+ * @param event The {@link InventoryClickEvent} associated with this click.
+ */
+ @Override
+ public void handleClick(
+ @NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {}
+}
diff --git a/src/main/java/me/unurled/sacredrealms/sr/gui/entitytype/EntityNameItem.java b/src/main/java/me/unurled/sacredrealms/sr/gui/entitytype/EntityNameItem.java
new file mode 100644
index 0000000..b8c05bc
--- /dev/null
+++ b/src/main/java/me/unurled/sacredrealms/sr/gui/entitytype/EntityNameItem.java
@@ -0,0 +1,46 @@
+package me.unurled.sacredrealms.sr.gui.entitytype;
+
+import me.unurled.sacredrealms.sr.components.entity.SREntityType;
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+import org.bukkit.event.inventory.ClickType;
+import org.bukkit.event.inventory.InventoryClickEvent;
+import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.NotNull;
+import xyz.xenondevs.invui.item.Item;
+import xyz.xenondevs.invui.item.ItemProvider;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.AbstractItem;
+import xyz.xenondevs.invui.window.Window;
+
+public class EntityNameItem extends AbstractItem {
+
+ private final String name;
+
+ public EntityNameItem(SREntityType type) {
+ name = type.getName();
+ }
+
+ /**
+ * Gets the {@link ItemProvider}. This method gets called every time a {@link Window} is notified
+ * ({@link #notifyWindows()}).
+ *
+ * @return The {@link ItemProvider}
+ */
+ @Override
+ public ItemProvider getItemProvider() {
+ return new ItemBuilder(Material.NAME_TAG).setDisplayName(name);
+ }
+
+ /**
+ * A method called if the {@link ItemStack} associated to this {@link Item} has been clicked by a
+ * player.
+ *
+ * @param clickType The {@link ClickType} the {@link Player} performed.
+ * @param player The {@link Player} who clicked on the {@link ItemStack}.
+ * @param event The {@link InventoryClickEvent} associated with this click.
+ */
+ @Override
+ public void handleClick(
+ @NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {}
+}
diff --git a/src/main/java/me/unurled/sacredrealms/sr/gui/entitytype/EntityStatsItem.java b/src/main/java/me/unurled/sacredrealms/sr/gui/entitytype/EntityStatsItem.java
new file mode 100644
index 0000000..5173fd8
--- /dev/null
+++ b/src/main/java/me/unurled/sacredrealms/sr/gui/entitytype/EntityStatsItem.java
@@ -0,0 +1,52 @@
+package me.unurled.sacredrealms.sr.gui.entitytype;
+
+import java.util.HashMap;
+import me.unurled.sacredrealms.sr.components.attributes.Attribute;
+import me.unurled.sacredrealms.sr.components.entity.SREntityType;
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+import org.bukkit.event.inventory.ClickType;
+import org.bukkit.event.inventory.InventoryClickEvent;
+import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.NotNull;
+import xyz.xenondevs.invui.item.Item;
+import xyz.xenondevs.invui.item.ItemProvider;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.AbstractItem;
+import xyz.xenondevs.invui.window.Window;
+
+public class EntityStatsItem extends AbstractItem {
+
+ private final HashMap