From 6f1f3c791fd174c43f1096236e45342c7752c8cb Mon Sep 17 00:00:00 2001
From: GeorgH93 <git@georgh93.eu>
Date: Wed, 5 Dec 2018 09:57:00 +0100
Subject: [PATCH] Add proper MC 1.13 support for backpack storage

---
 pom.xml                                         |  2 +-
 .../Minepacks/Bukkit/Database/Config.java       |  9 +++++++--
 .../Bukkit/Database/InventorySerializer.java    | 14 ++++++++------
 .../Minepacks/Bukkit/Database/MySQL.java        | 17 +++++++++++++----
 .../Minepacks/Bukkit/Minepacks.java             |  2 +-
 5 files changed, 30 insertions(+), 14 deletions(-)

diff --git a/pom.xml b/pom.xml
index b85ef6f..faebce7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -57,7 +57,7 @@
 		<dependency>
 			<groupId>at.pcgamingfreaks</groupId>
 			<artifactId>PluginLib</artifactId>
-			<version>1.0.5-SNAPSHOT</version>
+			<version>1.0.6-SNAPSHOT</version>
 		</dependency>
 	</dependencies>
 
diff --git a/src/at/pcgamingfreaks/Minepacks/Bukkit/Database/Config.java b/src/at/pcgamingfreaks/Minepacks/Bukkit/Database/Config.java
index 88d1af8..9268d81 100644
--- a/src/at/pcgamingfreaks/Minepacks/Bukkit/Database/Config.java
+++ b/src/at/pcgamingfreaks/Minepacks/Bukkit/Database/Config.java
@@ -27,10 +27,15 @@
 import org.bukkit.ChatColor;
 import org.bukkit.GameMode;
 import org.bukkit.plugin.java.JavaPlugin;
+import org.jetbrains.annotations.NotNull;
 
 import java.io.FileNotFoundException;
-import java.util.*;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
 
+@SuppressWarnings("ConstantConditions")
 public class Config extends Configuration
 {
 	private static final int CONFIG_VERSION = 21, UPGRADE_THRESHOLD = 21;
@@ -49,7 +54,7 @@ protected void doUpdate()
 	}
 
 	@Override
-	protected void doUpgrade(YamlFileManager oldConfig)
+	protected void doUpgrade(@NotNull YamlFileManager oldConfig)
 	{
 		if(oldConfig.getVersion() < 20) // Pre V2.0 config file
 		{
diff --git a/src/at/pcgamingfreaks/Minepacks/Bukkit/Database/InventorySerializer.java b/src/at/pcgamingfreaks/Minepacks/Bukkit/Database/InventorySerializer.java
index eb30adb..abe9fd1 100644
--- a/src/at/pcgamingfreaks/Minepacks/Bukkit/Database/InventorySerializer.java
+++ b/src/at/pcgamingfreaks/Minepacks/Bukkit/Database/InventorySerializer.java
@@ -19,7 +19,7 @@
 
 import at.pcgamingfreaks.Bukkit.ItemStackSerializer.BukkitItemStackSerializer;
 import at.pcgamingfreaks.Bukkit.ItemStackSerializer.ItemStackSerializer;
-import at.pcgamingfreaks.Bukkit.ItemStackSerializer.NBTItemStackSerializer;
+import at.pcgamingfreaks.Bukkit.ItemStackSerializer.NBTItemStackSerializerGen2;
 import at.pcgamingfreaks.ConsoleColor;
 
 import org.bukkit.inventory.Inventory;
@@ -32,16 +32,16 @@ public class InventorySerializer
 	private static final ItemStackSerializer BUKKIT_ITEM_STACK_SERIALIZER = new BukkitItemStackSerializer();
 	private final Logger logger;
 	private ItemStackSerializer serializer;
-	private int usedSerializer = 1;
+	private int usedSerializer = 2;
 	
 	public InventorySerializer(Logger logger)
 	{
 		this.logger = logger;
 		try
 		{
-			if(NBTItemStackSerializer.isMCVersionCompatible())
+			if(NBTItemStackSerializerGen2.isMCVersionCompatible())
 			{
-				serializer = new NBTItemStackSerializer(logger);
+				serializer = new NBTItemStackSerializerGen2(logger);
 			}
 		}
 		catch(Exception e)
@@ -66,9 +66,11 @@ public ItemStack[] deserialize(byte[] data, int usedSerializer)
 		switch(usedSerializer)
 		{
 			case 0: return BUKKIT_ITEM_STACK_SERIALIZER.deserialize(data);
-			case 1: if(usedSerializer != this.usedSerializer) { logger.warning(ConsoleColor.RED + "No compatible serializer for item format available!" + ConsoleColor.RESET); return null; }
-			default: return serializer.deserialize(data);
+			case 1:
+			case 2: return serializer.deserialize(data);
+			default: logger.warning(ConsoleColor.RED + "No compatible serializer for item format available!" + ConsoleColor.RESET);
 		}
+		return null;
 	}
 	
 	public int getUsedSerializer()
diff --git a/src/at/pcgamingfreaks/Minepacks/Bukkit/Database/MySQL.java b/src/at/pcgamingfreaks/Minepacks/Bukkit/Database/MySQL.java
index ef4dd00..ce9172b 100644
--- a/src/at/pcgamingfreaks/Minepacks/Bukkit/Database/MySQL.java
+++ b/src/at/pcgamingfreaks/Minepacks/Bukkit/Database/MySQL.java
@@ -57,13 +57,22 @@ protected void checkDB()
 	{
 		try(Connection connection = getConnection())
 		{
-			DBTools.updateDB(connection, replacePlaceholders("CREATE TABLE {TablePlayers} (\n{FieldPlayerID} INT UNSIGNED NOT NULL AUTO_INCREMENT,\n{FieldName} CHAR(16) NOT NULL,\n{FieldUUID} CHAR(36) DEFAULT NULL," +
-					                                                 "\nPRIMARY KEY ({FieldPlayerID}),\nUNIQUE INDEX {FieldUUID}_UNIQUE ({FieldUUID})\n);"));
-			DBTools.updateDB(connection, replacePlaceholders("CREATE TABLE {TableBackpacks} (\n{FieldBPOwner} INT UNSIGNED NOT NULL,\n{FieldBPITS} BLOB,\n{FieldBPVersion} INT DEFAULT 0,\n" +
+			if(useUUIDs)
+			{
+				DBTools.updateDB(connection, replacePlaceholders("CREATE TABLE IF NOT EXISTS {TablePlayers} (\n{FieldPlayerID} INT UNSIGNED NOT NULL AUTO_INCREMENT,\n{FieldName} VARCHAR(16) NOT NULL,\n" +
+						                                                 "{FieldUUID} CHAR(" +  ((useUUIDSeparators) ? "36" : "32") + ") DEFAULT NULL," + "\nPRIMARY KEY ({FieldPlayerID}),\n" +
+						                                                 "UNIQUE INDEX {FieldUUID}_UNIQUE ({FieldUUID})\n);"));
+			}
+			else
+			{
+				DBTools.updateDB(connection, replacePlaceholders("CREATE TABLE IF NOT EXISTS {TablePlayers} (\n{FieldPlayerID} INT UNSIGNED NOT NULL AUTO_INCREMENT,\n{FieldName} CHAR(16) NOT NULL,\n" +
+						                                                 "\nPRIMARY KEY ({FieldPlayerID}),\nUNIQUE INDEX {FieldUUID}_UNIQUE ({FieldUUID})\n);"));
+			}
+			DBTools.updateDB(connection, replacePlaceholders("CREATE TABLE IF NOT EXISTS {TableBackpacks} (\n{FieldBPOwner} INT UNSIGNED NOT NULL,\n{FieldBPITS} BLOB,\n{FieldBPVersion} INT DEFAULT 0,\n" +
 					                                                 "{FieldBPLastUpdate} TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n" +
 					                                                 "PRIMARY KEY ({FieldBPOwner}),\nCONSTRAINT fk_{TableBackpacks}_{TablePlayers}_{FieldBPOwner} FOREIGN KEY ({FieldBPOwner}) " +
 					                                                 "REFERENCES {TablePlayers} ({FieldPlayerID}) ON DELETE CASCADE ON UPDATE CASCADE\n);"));
-			DBTools.updateDB(connection, replacePlaceholders("CREATE TABLE {TableCooldowns} (\n{FieldCDPlayer} INT UNSIGNED,\n{FieldCDTime} LONG NOT NULL,\nPRIMARY KEY ({FieldCDPlayer}),\n" +
+			DBTools.updateDB(connection, replacePlaceholders("CREATE TABLE IF NOT EXISTS {TableCooldowns} (\n{FieldCDPlayer} INT UNSIGNED,\n{FieldCDTime} LONG NOT NULL,\nPRIMARY KEY ({FieldCDPlayer}),\n" +
 					                                                 "CONSTRAINT fk_{TableCooldowns}_{TablePlayers}_{FieldCDPlayer} FOREIGN KEY ({FieldCDPlayer}) " +
 					                                                 "REFERENCES {TablePlayers} ({FieldPlayerID}) ON DELETE CASCADE ON UPDATE CASCADE\n);"));
 		}
diff --git a/src/at/pcgamingfreaks/Minepacks/Bukkit/Minepacks.java b/src/at/pcgamingfreaks/Minepacks/Bukkit/Minepacks.java
index 3a0a6a3..a041786 100644
--- a/src/at/pcgamingfreaks/Minepacks/Bukkit/Minepacks.java
+++ b/src/at/pcgamingfreaks/Minepacks/Bukkit/Minepacks.java
@@ -86,7 +86,7 @@ public void onEnable()
 	{
 		Utils.warnOnJava_1_7(getLogger());
 		//region Check compatibility with used minecraft version
-		if(MCVersion.is(MCVersion.UNKNOWN) || MCVersion.isNewerThan(MCVersion.MC_NMS_1_13_R1))
+		if(MCVersion.is(MCVersion.UNKNOWN) || MCVersion.isNewerThan(MCVersion.MC_NMS_1_13_R2))
 		{
 			String name = Bukkit.getServer().getClass().getPackage().getName();
 			String[] version = name.substring(name.lastIndexOf('.') + 2).split("_");