diff --git a/pom.xml b/pom.xml
index 6d610e3..7360ddf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -142,6 +142,12 @@
test
+
+ com.google.code.gson
+ gson
+ 2.9.1
+
+
diff --git a/src/TestFiles/ExistingEmptyFileInit.json b/src/TestFiles/ExistingEmptyFileInit.json
new file mode 100644
index 0000000..e69de29
diff --git a/src/TestFiles/ExistingPopulatedFileInit.json b/src/TestFiles/ExistingPopulatedFileInit.json
new file mode 100644
index 0000000..ae5bd6a
--- /dev/null
+++ b/src/TestFiles/ExistingPopulatedFileInit.json
@@ -0,0 +1 @@
+{"players":{"BlankUUID":{"playerWorlds":[]}}}
\ No newline at end of file
diff --git a/src/TestFiles/workingDir/dataBaseInitTestCreateValidFile.json b/src/TestFiles/workingDir/dataBaseInitTestCreateValidFile.json
new file mode 100644
index 0000000..ae5bd6a
--- /dev/null
+++ b/src/TestFiles/workingDir/dataBaseInitTestCreateValidFile.json
@@ -0,0 +1 @@
+{"players":{"BlankUUID":{"playerWorlds":[]}}}
\ No newline at end of file
diff --git a/src/TestFiles/workingDir/dataBaseInitTestFromNoFile.json b/src/TestFiles/workingDir/dataBaseInitTestFromNoFile.json
new file mode 100644
index 0000000..ae5bd6a
--- /dev/null
+++ b/src/TestFiles/workingDir/dataBaseInitTestFromNoFile.json
@@ -0,0 +1 @@
+{"players":{"BlankUUID":{"playerWorlds":[]}}}
\ No newline at end of file
diff --git a/src/main/java/de/butzlabben/world/data/WorldDatabase.java b/src/main/java/de/butzlabben/world/data/WorldDatabase.java
index b704ebd..19052c0 100644
--- a/src/main/java/de/butzlabben/world/data/WorldDatabase.java
+++ b/src/main/java/de/butzlabben/world/data/WorldDatabase.java
@@ -1,4 +1,81 @@
package de.butzlabben.world.data;
+import com.google.gson.Gson;
+import de.butzlabben.world.data.objects.PlayerData;
+import de.butzlabben.world.data.objects.WorldSystemData;
+
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
public class WorldDatabase {
+
+ //This is Set to Static to allow for only one to prevent Data to be not saved;
+ private static WorldSystemData wsDataBase;
+ private String dbFilePath;
+
+ public WorldDatabase(String databaseFilePath) {
+ this.dbFilePath = databaseFilePath;
+ this.wsDataBase = getWorldSystemDatabase();
+ }
+
+ public int getPlayerCount() {
+ return wsDataBase.getPlayers();
+ }
+
+ public void addPlayer(String playerUUID) {
+ wsDataBase.addplayer(playerUUID);
+ saveWSData();
+ }
+
+
+
+
+ private WorldSystemData getWorldSystemDatabase() {
+ File wsDataFile = new File(this.dbFilePath);
+ Gson gson = new Gson();
+ WorldSystemData newDatabase = null;
+
+
+ if (!wsDataFile.exists()) {
+ newDatabase = new WorldSystemData();
+ saveWSData();
+ return newDatabase;
+ }
+
+ try {
+ Reader reader = Files.newBufferedReader(Paths.get(this.dbFilePath));
+ newDatabase = gson.fromJson(reader, WorldSystemData.class);
+ reader.close();
+ } catch (IOException e) {
+ //Log Warning
+ }
+
+ if (newDatabase == null) {
+ newDatabase = new WorldSystemData();
+ }
+
+ return newDatabase;
+ }
+
+ private void saveWSData() {
+ Gson gson = new Gson();
+
+ File dataFile = new File(this.dbFilePath);
+ if (!dataFile.exists()) {
+ try {
+ dataFile.createNewFile();
+ } catch (IOException e) {
+ //Should Never Run
+ throw new RuntimeException(e);
+ }
+ }
+ try {
+ FileWriter writer = new FileWriter(dataFile);
+ gson.toJson(wsDataBase, writer);
+ writer.close();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
}
diff --git a/src/main/java/de/butzlabben/world/data/objects/PlayerData.java b/src/main/java/de/butzlabben/world/data/objects/PlayerData.java
new file mode 100644
index 0000000..c9bc5bb
--- /dev/null
+++ b/src/main/java/de/butzlabben/world/data/objects/PlayerData.java
@@ -0,0 +1,27 @@
+package de.butzlabben.world.data.objects;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PlayerData {
+
+ //TODO Write Tests
+ public List playerWorlds;
+
+
+ public PlayerData() {
+ playerWorlds = new ArrayList();
+ }
+
+ public void addWorld(PlayerWorld world) {
+ playerWorlds.add(world);
+ }
+
+ public int getWorldCount() {
+ return playerWorlds.size();
+ }
+
+ public PlayerWorld getWorldAt(int index) {
+ return playerWorlds.get(index);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/de/butzlabben/world/data/objects/PlayerWorld.java b/src/main/java/de/butzlabben/world/data/objects/PlayerWorld.java
new file mode 100644
index 0000000..0c3e293
--- /dev/null
+++ b/src/main/java/de/butzlabben/world/data/objects/PlayerWorld.java
@@ -0,0 +1,11 @@
+package de.butzlabben.world.data.objects;
+
+public class PlayerWorld {
+ public int worldNumber;
+ public long lastLoaded;
+
+ public PlayerWorld(String OWNER, String OWNERname, int worldNumber) {
+ this.worldNumber = worldNumber;
+ this.lastLoaded = 0;
+ }
+}
diff --git a/src/main/java/de/butzlabben/world/data/objects/WorldSystemData.java b/src/main/java/de/butzlabben/world/data/objects/WorldSystemData.java
new file mode 100644
index 0000000..a471792
--- /dev/null
+++ b/src/main/java/de/butzlabben/world/data/objects/WorldSystemData.java
@@ -0,0 +1,41 @@
+package de.butzlabben.world.data.objects;
+
+
+import de.butzlabben.WorldSystem;
+import de.butzlabben.world.data.WorldDatabase;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class WorldSystemData {
+
+ public Map players;
+ public WorldSystemData() {
+ players = new HashMap();
+ }
+
+ public Boolean addplayer(String uuid) {
+ if (players.get(uuid) == null) {
+ players.put(uuid, new PlayerData());
+ return true;
+ }
+ return false;
+ }
+
+ public void addWorldToPlayer(String uuid, PlayerWorld world) {
+ if (players.get(uuid) != null) {
+ players.get(uuid).addWorld(world);
+ }
+ }
+
+ public int getPlayers() {
+ return players.size();
+ }
+
+
+
+}
+
diff --git a/src/test/java/de/butzlabben/world/data/TestWorldDatabase.java b/src/test/java/de/butzlabben/world/data/TestWorldDatabase.java
index 9114387..90b2e3a 100644
--- a/src/test/java/de/butzlabben/world/data/TestWorldDatabase.java
+++ b/src/test/java/de/butzlabben/world/data/TestWorldDatabase.java
@@ -1,4 +1,80 @@
package de.butzlabben.world.data;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.Scanner;
+
+import static org.junit.jupiter.api.Assertions.*;
+
public class TestWorldDatabase {
+
+ /**
+ * Before the Test this function cleans out the Working Directory
+ * This allows us to view the results of our prevous tests as needed
+ * but then allows us to run the tests Fresh.
+ */
+ @BeforeAll
+ static void CleanLastTest() {
+ File workingDir = new File("src\\TestFiles\\workingDir\\");
+ for (File file : workingDir.listFiles()) {
+ file.delete();
+ }
+ }
+
+ /**
+ * This Tests the Basis Initaliaztion of the DataBase from nothing
+ */
+ @Test
+ public void testDatabaseInitalizationFromNoFile() {
+ final String path = "src\\TestFiles\\workingDir\\dataBaseInitTestFromNoFile.json";
+
+ WorldDatabase wb = new WorldDatabase(path);
+ assertEquals(0, wb.getPlayerCount());
+ }
+
+ /**
+ * This Test Creates the new Object and Verifies that is can save data Properly;
+ * @throws FileNotFoundException
+ */
+ @Test
+ public void testDatabaseInitalizationCreateValidFile() throws FileNotFoundException {
+ final String path = "src\\TestFiles\\workingDir\\dataBaseInitTestCreateValidFile.json";
+
+ WorldDatabase wb = new WorldDatabase(path);
+ wb.addPlayer("BlankUUID");
+
+
+ String input = new Scanner(new File(path)).nextLine();
+ assertEquals("{\"players\":{\"BlankUUID\":{\"playerWorlds\":[]}}}", input);
+ }
+
+
+ /**
+ * This Test to see if it can create to database when loading from a blank File
+ */
+ @Test
+ public void testDatabaseInitalizationWithExistingEmptyFile() {
+ final String path = "src\\TestFiles\\ExistingEmptyFileInit.json";
+
+ WorldDatabase wb = new WorldDatabase(path);
+ assertEquals(0, wb.getPlayerCount());
+ }
+
+ /**
+ * This Test to see if it can create to database when loading from a populated File
+ */
+ @Test
+ public void testDatabaseInitalizationWithPopulatedEmptyFile() throws FileNotFoundException {
+ final String path = "src\\TestFiles\\ExistingPopulatedFileInit.json";
+
+ WorldDatabase wb = new WorldDatabase(path);
+
+
+ String input = new Scanner(new File(path)).nextLine();
+ assertEquals("{\"players\":{\"BlankUUID\":{\"playerWorlds\":[]}}}", input);
+ assertEquals(1, wb.getPlayerCount());
+ }
}
diff --git a/target/classes/de/butzlabben/world/WorldSystem.class b/target/classes/de/butzlabben/WorldSystem.class
similarity index 93%
rename from target/classes/de/butzlabben/world/WorldSystem.class
rename to target/classes/de/butzlabben/WorldSystem.class
index d445a26..cc6308c 100644
Binary files a/target/classes/de/butzlabben/world/WorldSystem.class and b/target/classes/de/butzlabben/WorldSystem.class differ
diff --git a/target/classes/de/butzlabben/inventory/OrcListener.class b/target/classes/de/butzlabben/inventory/OrcListener.class
index ca954f5..c69c91e 100644
Binary files a/target/classes/de/butzlabben/inventory/OrcListener.class and b/target/classes/de/butzlabben/inventory/OrcListener.class differ
diff --git a/target/classes/de/butzlabben/world/autoupdater/UpdateInformations.class b/target/classes/de/butzlabben/world/autoupdater/UpdateInformations.class
index d360899..b030ed7 100644
Binary files a/target/classes/de/butzlabben/world/autoupdater/UpdateInformations.class and b/target/classes/de/butzlabben/world/autoupdater/UpdateInformations.class differ
diff --git a/target/classes/de/butzlabben/world/command/commands/WSCommands.class b/target/classes/de/butzlabben/world/command/commands/WSCommands.class
index 68f5893..0a0f331 100644
Binary files a/target/classes/de/butzlabben/world/command/commands/WSCommands.class and b/target/classes/de/butzlabben/world/command/commands/WSCommands.class differ
diff --git a/target/classes/de/butzlabben/world/command/commands/WorldAdministrateCommand.class b/target/classes/de/butzlabben/world/command/commands/WorldAdministrateCommand.class
index 0cbd4ef..4131ad2 100644
Binary files a/target/classes/de/butzlabben/world/command/commands/WorldAdministrateCommand.class and b/target/classes/de/butzlabben/world/command/commands/WorldAdministrateCommand.class differ
diff --git a/target/classes/de/butzlabben/world/command/commands/WorldSettingsCommands.class b/target/classes/de/butzlabben/world/command/commands/WorldSettingsCommands.class
index a857190..1bf730f 100644
Binary files a/target/classes/de/butzlabben/world/command/commands/WorldSettingsCommands.class and b/target/classes/de/butzlabben/world/command/commands/WorldSettingsCommands.class differ
diff --git a/target/classes/de/butzlabben/world/config/GuiConfig.class b/target/classes/de/butzlabben/world/config/GuiConfig.class
index 508e7db..bab66d4 100644
Binary files a/target/classes/de/butzlabben/world/config/GuiConfig.class and b/target/classes/de/butzlabben/world/config/GuiConfig.class differ
diff --git a/target/classes/de/butzlabben/world/config/MessageConfig.class b/target/classes/de/butzlabben/world/config/MessageConfig.class
index 4263a16..bc7f35d 100644
Binary files a/target/classes/de/butzlabben/world/config/MessageConfig.class and b/target/classes/de/butzlabben/world/config/MessageConfig.class differ
diff --git a/target/classes/de/butzlabben/world/config/PluginConfig.class b/target/classes/de/butzlabben/world/config/PluginConfig.class
index 607c0db..176ce18 100644
Binary files a/target/classes/de/butzlabben/world/config/PluginConfig.class and b/target/classes/de/butzlabben/world/config/PluginConfig.class differ
diff --git a/target/classes/de/butzlabben/world/config/SettingsConfig.class b/target/classes/de/butzlabben/world/config/SettingsConfig.class
index 5d2b497..fafbfbf 100644
Binary files a/target/classes/de/butzlabben/world/config/SettingsConfig.class and b/target/classes/de/butzlabben/world/config/SettingsConfig.class differ
diff --git a/target/classes/de/butzlabben/world/data/WorldDatabase.class b/target/classes/de/butzlabben/world/data/WorldDatabase.class
new file mode 100644
index 0000000..c1e22da
Binary files /dev/null and b/target/classes/de/butzlabben/world/data/WorldDatabase.class differ
diff --git a/target/classes/de/butzlabben/world/data/objects/PlayerData.class b/target/classes/de/butzlabben/world/data/objects/PlayerData.class
new file mode 100644
index 0000000..c5aa565
Binary files /dev/null and b/target/classes/de/butzlabben/world/data/objects/PlayerData.class differ
diff --git a/target/classes/de/butzlabben/world/data/objects/PlayerWorld.class b/target/classes/de/butzlabben/world/data/objects/PlayerWorld.class
new file mode 100644
index 0000000..68c2d10
Binary files /dev/null and b/target/classes/de/butzlabben/world/data/objects/PlayerWorld.class differ
diff --git a/target/classes/de/butzlabben/world/data/objects/WorldSystemData.class b/target/classes/de/butzlabben/world/data/objects/WorldSystemData.class
new file mode 100644
index 0000000..089296b
Binary files /dev/null and b/target/classes/de/butzlabben/world/data/objects/WorldSystemData.class differ
diff --git a/target/classes/de/butzlabben/world/util/PapiExtension.class b/target/classes/de/butzlabben/world/util/PapiExtension.class
index 5a8b7d2..72be07b 100644
Binary files a/target/classes/de/butzlabben/world/util/PapiExtension.class and b/target/classes/de/butzlabben/world/util/PapiExtension.class differ
diff --git a/target/classes/de/butzlabben/world/util/VersionUtil.class b/target/classes/de/butzlabben/world/util/VersionUtil.class
index 7d729e7..2feb592 100644
Binary files a/target/classes/de/butzlabben/world/util/VersionUtil.class and b/target/classes/de/butzlabben/world/util/VersionUtil.class differ
diff --git a/target/classes/de/butzlabben/world/wrapper/SystemWorld$1.class b/target/classes/de/butzlabben/world/wrapper/SystemWorld$1.class
index d3ccf87..d06d5ef 100644
Binary files a/target/classes/de/butzlabben/world/wrapper/SystemWorld$1.class and b/target/classes/de/butzlabben/world/wrapper/SystemWorld$1.class differ
diff --git a/target/classes/de/butzlabben/world/wrapper/SystemWorld.class b/target/classes/de/butzlabben/world/wrapper/SystemWorld.class
index f4e1851..8aa01aa 100644
Binary files a/target/classes/de/butzlabben/world/wrapper/SystemWorld.class and b/target/classes/de/butzlabben/world/wrapper/SystemWorld.class differ
diff --git a/target/classes/plugin.yml b/target/classes/plugin.yml
deleted file mode 100644
index 15e9915..0000000
--- a/target/classes/plugin.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-name: 'WorldSystem'
-version: '2.4.20'
-main: de.bulzlabben.world.WorldSystem
-
-description: The one world per player solution you have always dreamed of.
-
-api-version: '1.17'
\ No newline at end of file
diff --git a/target/test-classes/de/butzlabben/world/data/TestWorldDatabase.class b/target/test-classes/de/butzlabben/world/data/TestWorldDatabase.class
new file mode 100644
index 0000000..95e8df2
Binary files /dev/null and b/target/test-classes/de/butzlabben/world/data/TestWorldDatabase.class differ