From c4a5874dcaaa14083dfe624d57b07c816599e208 Mon Sep 17 00:00:00 2001
From: Pyrbu <pyrmcserver@gmail.com>
Date: Sun, 23 Apr 2023 20:24:31 +0100
Subject: [PATCH] start work

---
 src/main/java/lol/pyr/znpcsplus/npc/NPC.java  |  4 ++++
 .../java/lol/pyr/znpcsplus/npc/NPCType.java   |  4 ++++
 .../pyr/znpcsplus/packets/PacketFactory.java  | 21 ++++++++++++++++
 .../pyr/znpcsplus/packets/V1_8Factory.java    |  4 ++++
 .../lol/pyr/znpcsplus/util/LazyLoader.java    | 24 +++++++++++++++++++
 5 files changed, 57 insertions(+)
 create mode 100644 src/main/java/lol/pyr/znpcsplus/npc/NPC.java
 create mode 100644 src/main/java/lol/pyr/znpcsplus/npc/NPCType.java
 create mode 100644 src/main/java/lol/pyr/znpcsplus/packets/PacketFactory.java
 create mode 100644 src/main/java/lol/pyr/znpcsplus/packets/V1_8Factory.java
 create mode 100644 src/main/java/lol/pyr/znpcsplus/util/LazyLoader.java

diff --git a/src/main/java/lol/pyr/znpcsplus/npc/NPC.java b/src/main/java/lol/pyr/znpcsplus/npc/NPC.java
new file mode 100644
index 0000000..d619ef8
--- /dev/null
+++ b/src/main/java/lol/pyr/znpcsplus/npc/NPC.java
@@ -0,0 +1,4 @@
+package lol.pyr.znpcsplus.npc;
+
+public class NPC {
+}
diff --git a/src/main/java/lol/pyr/znpcsplus/npc/NPCType.java b/src/main/java/lol/pyr/znpcsplus/npc/NPCType.java
new file mode 100644
index 0000000..4f90fe4
--- /dev/null
+++ b/src/main/java/lol/pyr/znpcsplus/npc/NPCType.java
@@ -0,0 +1,4 @@
+package lol.pyr.znpcsplus.npc;
+
+public class NPCType {
+}
diff --git a/src/main/java/lol/pyr/znpcsplus/packets/PacketFactory.java b/src/main/java/lol/pyr/znpcsplus/packets/PacketFactory.java
new file mode 100644
index 0000000..ce5f394
--- /dev/null
+++ b/src/main/java/lol/pyr/znpcsplus/packets/PacketFactory.java
@@ -0,0 +1,21 @@
+package lol.pyr.znpcsplus.packets;
+
+import com.github.retrooper.packetevents.PacketEvents;
+import com.github.retrooper.packetevents.manager.server.ServerVersion;
+import lol.pyr.znpcsplus.util.LazyLoader;
+
+import java.util.Map;
+
+public interface PacketFactory {
+
+    Map<ServerVersion, LazyLoader<? extends PacketFactory>> factories = buildFactoryMap();
+
+
+    static PacketFactory get() {
+        return factories.get(PacketEvents.getAPI().getServerManager().getVersion()).get();
+    }
+
+    private static Map<ServerVersion, LazyLoader<? extends PacketFactory>> buildFactoryMap() {
+
+    }
+}
diff --git a/src/main/java/lol/pyr/znpcsplus/packets/V1_8Factory.java b/src/main/java/lol/pyr/znpcsplus/packets/V1_8Factory.java
new file mode 100644
index 0000000..6db778c
--- /dev/null
+++ b/src/main/java/lol/pyr/znpcsplus/packets/V1_8Factory.java
@@ -0,0 +1,4 @@
+package lol.pyr.znpcsplus.packets;
+
+public class V1_8Factory implements PacketFactory {
+}
diff --git a/src/main/java/lol/pyr/znpcsplus/util/LazyLoader.java b/src/main/java/lol/pyr/znpcsplus/util/LazyLoader.java
new file mode 100644
index 0000000..e39d16a
--- /dev/null
+++ b/src/main/java/lol/pyr/znpcsplus/util/LazyLoader.java
@@ -0,0 +1,24 @@
+package lol.pyr.znpcsplus.util;
+
+public class LazyLoader <T> {
+    private final ObjectProvider<T> provider;
+    private T value;
+
+    private LazyLoader(ObjectProvider<T> provider) {
+        this.provider = provider;
+    }
+
+    public T get() {
+        if (value == null) value = provider.provide();
+        return value;
+    }
+
+    public static <T> LazyLoader<T> of(ObjectProvider<T> provider) {
+        return new LazyLoader<>(provider);
+    }
+
+    @FunctionalInterface
+    public interface ObjectProvider<T> {
+        T provide();
+    }
+}