From 8bc9cbb7c2a2855208f035786b85426856a40961 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Tue, 25 Oct 2016 23:33:45 -0400 Subject: [PATCH] new Serializer class uses only NMS --- src/iie/PerWorldInventoryPlugin.java | 16 +- src/iie/PlayerData.java | 24 ++ src/iie/Serializer.java | 482 ++++---------------------- src/iie/SerializerOld.java | 494 +++++++++++++++++++++++++++ src/iie/SkullMaker.java | 170 +++++++++ src/iie/WorldChangeListener.java | 115 ++++--- src/iie/test.java | 25 ++ 7 files changed, 854 insertions(+), 472 deletions(-) create mode 100644 src/iie/PlayerData.java create mode 100644 src/iie/SerializerOld.java create mode 100644 src/iie/SkullMaker.java create mode 100644 src/iie/test.java diff --git a/src/iie/PerWorldInventoryPlugin.java b/src/iie/PerWorldInventoryPlugin.java index b7bf793..df216b9 100644 --- a/src/iie/PerWorldInventoryPlugin.java +++ b/src/iie/PerWorldInventoryPlugin.java @@ -2,17 +2,20 @@ package iie; import java.io.File; +import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; public class PerWorldInventoryPlugin extends JavaPlugin { - public void onEnable(){ - getServer().getPluginManager().registerEvents(new WorldChangeListener(this), this); - createConfig(); + public void onEnable(){ + PluginManager manager = getServer().getPluginManager(); + manager.registerEvents(new WorldChangeListener(this), this); + PerWorldInventoryPlugin.getPlugin(this.getClass()).getServer().getListeningPluginChannels(); + createConfig(); } - + private void createConfig(){ try { @@ -20,14 +23,15 @@ public class PerWorldInventoryPlugin extends JavaPlugin { if (!getDataFolder().exists()) getDataFolder().mkdirs(); + + //CONFIG.YML File file = new File(getDataFolder(), "config.yml"); if (!file.exists()){ getLogger().info("Config.yml not found, creating!"); saveDefaultConfig(); - }else{ + }else getLogger().info("Config.yml found, loading!"); - } }catch (Exception e) { diff --git a/src/iie/PlayerData.java b/src/iie/PlayerData.java new file mode 100644 index 0000000..ebf3978 --- /dev/null +++ b/src/iie/PlayerData.java @@ -0,0 +1,24 @@ +package iie; + +import org.bukkit.Location; +import org.bukkit.entity.Player; + +public class PlayerData { + + + + public static class Position { + + public static String StringFromLocation(Player player){ + Location location = player.getLocation(); + return "x:" + location.getBlockX() + ",z:" + location.getBlockZ() + ",y:" + location.getBlockY(); + } + + public Location LocationFromString(String locationString){ + return null; + } + } + + + +} diff --git a/src/iie/Serializer.java b/src/iie/Serializer.java index 1199541..ae84848 100644 --- a/src/iie/Serializer.java +++ b/src/iie/Serializer.java @@ -1,431 +1,73 @@ package iie; -import java.util.ArrayList; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; +import java.util.Objects; import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.apache.commons.codec.binary.Base64; + +import net.minecraft.server.v1_10_R1.IInventory; +import net.minecraft.server.v1_10_R1.ItemStack; +import net.minecraft.server.v1_10_R1.NBTCompressedStreamTools; +import net.minecraft.server.v1_10_R1.NBTTagCompound; -import org.bukkit.Bukkit; -import org.bukkit.Color; -import org.bukkit.DyeColor; -import org.bukkit.FireworkEffect; -import org.bukkit.Material; -import org.bukkit.block.banner.Pattern; -import org.bukkit.block.banner.PatternType; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.event.inventory.InventoryType; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemFlag; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.BannerMeta; -import org.bukkit.inventory.meta.BookMeta; -import org.bukkit.inventory.meta.EnchantmentStorageMeta; -import org.bukkit.inventory.meta.FireworkEffectMeta; -import org.bukkit.inventory.meta.FireworkMeta; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.inventory.meta.LeatherArmorMeta; -import org.bukkit.inventory.meta.MapMeta; -import org.bukkit.inventory.meta.PotionMeta; -import org.bukkit.inventory.meta.SkullMeta; -import org.bukkit.inventory.meta.BookMeta.Generation; -import org.bukkit.potion.PotionData; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; -import org.bukkit.potion.PotionType; - public class Serializer { - public static String StringFromInventory (Inventory invInventory){ - String serialization = invInventory.getSize() + ";"; - for (int i = 0; i < invInventory.getSize(); i++){ - ItemStack is = invInventory.getItem(i); - ItemMeta im = null; - if (is != null){ - if (is.hasItemMeta()) im = is.getItemMeta(); - String serializedItemStack = new String(); - - String isType = String.valueOf(is.getType()); - serializedItemStack += "t@" + isType; - - if (is.getDurability() != 0) - serializedItemStack += ":d@" + String.valueOf(is.getDurability()); - - if (is.getAmount() != 1) - serializedItemStack += ":a@" + String.valueOf(is.getAmount()); - - Map isEnch = is.getEnchantments(); - if (isEnch.size() > 0) - for (Entry ench : isEnch.entrySet()) - serializedItemStack += ":e@" + ench.getKey().getName() + "@" + ench.getValue(); - - if (im == null){ - serialization += i + "#" + serializedItemStack + ";"; - continue; - } - - - //ITEM META - if (im.getDisplayName() != null){ - serializedItemStack += ":n@" + is.getItemMeta().getDisplayName() - .replace("#", "{hash}") - .replace("@", "{ampersand}") - .replace(";", "{semicolon}") - .replace("'", "{single quote}") - .replace("\"", "{double quote}"); - } - if (im.getLore() != null){ - serializedItemStack += ":l@" + is.getItemMeta().getLore().stream() - .map(s -> s - .replace("[", "{bracket start}") - .replace("]", "{bracket end}") - .replace(",", "{comma}") - - .replace("#", "{hash}") - .replace("@", "{ampersand}") - .replace(";", "{semicolon}") - .replace("'", "{single quote}") - .replace("\"", "{double quote}")) - .collect(Collectors.joining(",")); - } - if (im.getItemFlags().size() > 0){ - ItemFlag[] flags = ItemFlag.values(); - if (im.hasItemFlag(flags[0])) - serializedItemStack += ":f@HIDE_ATTRIBUTES"; - if (im.hasItemFlag(flags[1])) - serializedItemStack += ":f@HIDE_DESTROYS"; - if (im.hasItemFlag(flags[2])) - serializedItemStack += ":f@HIDE_ENCHANTS"; - if (im.hasItemFlag(flags[3])) - serializedItemStack += ":f@HIDE_PLACED_ON"; - if (im.hasItemFlag(flags[4])) - serializedItemStack += ":f@HIDE_POTION_EFFECTS"; - if (im.hasItemFlag(flags[5])) - serializedItemStack += ":f@HIDE_UNBREAKABLE"; - } - - - //BANNER META - if (isType == "BANNER"){ - BannerMeta meta = (BannerMeta) im; - serializedItemStack += ":basecolor@" + meta.getBaseColor().name(); - if (meta.getPatterns().size() > 0){ - serializedItemStack += ":patterns@"; - String list = meta.getPatterns().stream() - .map(p -> p.getPattern().name() + "~" + p.getColor().name()) - .collect(Collectors.joining(",")); - serializedItemStack += list; - } - } - - - //BOOK META - if (isType == "WRITTEN_BOOK"){ - BookMeta meta = (BookMeta) im; - if (meta.hasTitle()) - serializedItemStack += ":title@" + meta.getTitle(); - if (meta.hasAuthor()) - serializedItemStack += ":author@" + meta.getAuthor(); - //if (meta.hasGeneration()) - // serializedItemStack += ":generation@" + meta.getGeneration().name(); - if (meta.hasPages()){ - serializedItemStack += ":pages@" + meta.getPages().stream() - .map(s -> s - .replace("º", "°") - .replace("[", "{bracket start}") - .replace("]", "{bracket end}") - .replace(",", "{comma}") - .replace("#", "{hash}") - .replace("@", "{ampersand}") - .replace(";", "{semicolon}") - .replace("'", "{single quote}") - .replace("\"", "{double quote}")) - .collect(Collectors.joining("º")); - } - } - - - //ENCHANTED BOOK META - if (isType == "ENCHANTED_BOOK"){ - EnchantmentStorageMeta meta = (EnchantmentStorageMeta) im; - if (meta.hasStoredEnchants()){ - //serializedItemStack += ":storedenchants@" + meta.getStoredEnchants().entrySet().stream() - //.map(e -> e.getKey() + "~" + String.valueOf(e.getValue())) - //.collect(Collectors.joining(",")); - ArrayList list = new ArrayList(); - meta.getStoredEnchants().forEach((k,v) -> list.add(k.getName() + "~" + v)); - serializedItemStack += ":storedenchants@" + list.stream().collect(Collectors.joining(",")); - } - } - - - //FIREWORK CHARGE META - if (isType == "FIREWORK_CHARGE"){ - FireworkEffectMeta meta = (FireworkEffectMeta) im; - if (meta.hasEffect()){ - FireworkEffect e = meta.getEffect(); - serializedItemStack += ":charge-effect@" - + e.getType().name() + "~" - + e.getColors() - .stream().map(c -> String.valueOf(c.asRGB())) - .collect(Collectors.joining("/")) + "~" - + e.getFadeColors() - .stream().map(c -> String.valueOf(c.asRGB())) - .collect(Collectors.joining("/")) + "~" - + e.hasFlicker() + "~" - + e.hasTrail(); - } - } - - - //FIREWORK META - if (isType == "FIREWORK"){ - FireworkMeta meta = (FireworkMeta) im; - if (meta.hasEffects()) - serializedItemStack += ":firework-effects@" + meta.getEffects().stream() - .map(s -> s.getType().name() + "~" - + s.getColors() - .stream().map(c -> String.valueOf(c.asRGB())) - .collect(Collectors.joining("/")) + "~" - + s.getFadeColors() - .stream().map(c -> String.valueOf(c.asRGB())) - .collect(Collectors.joining("/")) + "~" - + s.hasFlicker() + "~" - + s.hasTrail()) - .collect(Collectors.joining(",")); - serializedItemStack += ":power@" + meta.getPower(); - } - - - //LEATHER ARMOR META - if (isType == "LEATHER_HELMET" || isType == "LEATHER_CHESTPLATE" || isType == "LEATHER_LEGGINGS" || isType == "LEATHER_BOOTS") - serializedItemStack += ":color@" + ((LeatherArmorMeta) im).getColor().asRGB(); - - - //MAP META - if (isType == "MAP") - serializedItemStack += ":scaling@" + ((MapMeta) im).isScaling(); - - - //POTION META - if (isType == "POTION" || isType == "LINGERING_POTION" || isType == "SPLASH_POTION"){ - PotionMeta meta = (PotionMeta) im; - PotionData data = (PotionData) meta.getBasePotionData(); - serializedItemStack += ":effect@" + data.getType().name() + "~" + data.isExtended() + "~" + data.isUpgraded(); - if (meta.hasCustomEffects()) - serializedItemStack += ":customeffects@" + meta.getCustomEffects().stream() - .map(s -> s.getType().getName() + "~" - + s.getAmplifier() + "~" - + s.getDuration() + "~" - + s.hasParticles() + "~" - + s.isAmbient() + "~" - + s.getColor().asRGB()) - .collect(Collectors.joining(",")); - } - - - //SKULL META - if (isType == "SKULL") - serializedItemStack += ":owner@" + ((SkullMeta) im).getOwner(); - - - - serialization += i + "#" + serializedItemStack + ";"; - } - } - return serialization; + + + + public static String serializeItemStack(ItemStack itemStack){ + + if (itemStack == null) return "null"; + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + + try { NBTCompressedStreamTools.a(itemStack.getTag(), outputStream); } + catch (IOException e) { e.printStackTrace(); } + + return Base64.encodeBase64String(outputStream.toByteArray()); } - - - - - - - - - - - - - - - public static Inventory InventoryFromString(String invString, InventoryType type){ - String[] serializedBlocks = invString.split(";"); - int invSize = Integer.valueOf(serializedBlocks[0]); - Inventory deserializedInventory = Bukkit.getServer().createInventory(null, type); - for (int i = 1; i < serializedBlocks.length; i++){ - String[] serializedBlock = serializedBlocks[i].split("#"); - int stackPosition = Integer.valueOf(serializedBlock[0]); - if (stackPosition >= invSize) - continue; - - ItemStack is = null; - ItemMeta im = null; - Boolean createdItemStack = false; - - String[] serializedItemStack = serializedBlock[1].split(":"); - for (String itemInfo : serializedItemStack){ - String[] itemAttribute = itemInfo.split("@"); - if (itemAttribute[0].equals("t")){ - is = new ItemStack(Material.getMaterial((itemAttribute[1]))); - createdItemStack = true; - if (is.getItemMeta() != null) - im = is.getItemMeta(); - }else if(itemAttribute[0].equals("d") && createdItemStack){ - is.setDurability(Short.valueOf(itemAttribute[1])); - }else if(itemAttribute[0].equals("a") && createdItemStack){ - is.setAmount(Integer.valueOf(itemAttribute[1])); - }else if(itemAttribute[0].equals("e") && createdItemStack){ - is.addUnsafeEnchantment(Enchantment.getByName(itemAttribute[1]), Integer.valueOf(itemAttribute[2])); - }else if(itemAttribute[0].equals("n") && createdItemStack){ - im.setDisplayName(itemAttribute[1] - .replace("#", "{hash}") - .replace("@", "{ampersand}") - .replace(";", "{semicolon}") - .replace("'", "{single quote}") - .replace("\"", "{double quote}")); - - }else if(itemAttribute[0].equals("l") && createdItemStack){ - im.setLore(Arrays.asList(itemAttribute[1].split("(,)")).stream().map(s -> s - .replace("[", "{bracket start}") - .replace("]", "{bracket end}") - .replace(",", "{comma}") - - .replace("#", "{hash}") - .replace("@", "{ampersand}") - .replace(";", "{semicolon}") - .replace("'", "{single quote}") - .replace("\"", "{double quote}")) - .collect(Collectors.toList())); - - }else if(itemAttribute[0].equals("f") && createdItemStack){ - im.addItemFlags(ItemFlag.valueOf(itemAttribute[1])); - - - //BANNER ATTRIBUTES - }else if(itemAttribute[0].equals("basecolor") && createdItemStack){ - ((BannerMeta) im).setBaseColor(DyeColor.valueOf(itemAttribute[1])); - }else if(itemAttribute[0].equals("patterns") && createdItemStack){ - ((BannerMeta) im).setPatterns((List) Arrays.asList(itemAttribute[1].split("(,)")).stream() - .map(s -> new Pattern( - DyeColor.valueOf(Arrays.asList(s.split("(~)")).get(1)), - PatternType.valueOf(Arrays.asList(s.split("(~)")).get(0)))) - .collect(Collectors.toList())); - - - //BOOK ATTRIBUES - }else if(itemAttribute[0].equals("title") && createdItemStack){ - ((BookMeta) im).setTitle(itemAttribute[1]); - }else if(itemAttribute[0].equals("author") && createdItemStack){ - ((BookMeta) im).setAuthor(itemAttribute[1]); - }else if(itemAttribute[0].equals("generation") && createdItemStack){ - ((BookMeta) im).setGeneration(Generation.valueOf(itemAttribute[1])); - }else if(itemAttribute[0].equals("pages") && createdItemStack){ - ((BookMeta) im).setPages(Arrays.asList(itemAttribute[1] - .replace("{bracket start}","[") - .replace("{bracket end}","]") - .replace("{comma}",",") - .replace("{hash}","#") - .replace("{ampersand}","@") - .replace("{semicolon}",";") - .replace("{single quote}","'") - .replace("{double quote}","\"") - .split("º"))); - - - //ENCHANTED BOOK ATTRIBUTES - }else if(itemAttribute[0].equals("storedenchants") && createdItemStack){ - final EnchantmentStorageMeta storedEnchants = (EnchantmentStorageMeta) im; - Arrays.asList(itemAttribute[1].split("(,)")).stream().map(e -> e.split("(~)")) - .forEach(e -> storedEnchants.addStoredEnchant(Enchantment.getByName(e[0]),Integer.valueOf(e[1]),true)); - im = storedEnchants; - - - //FIREWORK CHARGE ATTRIBUTES - }else if(itemAttribute[0].equals("charge-effect") && createdItemStack){ - String[] e = itemAttribute[1].split("(~)"); - ((FireworkEffectMeta) im).setEffect( - FireworkEffect.builder() - .with(FireworkEffect.Type.valueOf(e[0])) - .withColor(Arrays.asList(e[1].split("/")).stream() - .map(s -> Color.fromRGB(Integer.valueOf(s))) - .collect(Collectors.toList())) - .withFade(Arrays.asList(e[2].split("/")).stream() - .map(s -> Color.fromRGB(Integer.valueOf(s))) - .collect(Collectors.toList())) - .flicker(Boolean.valueOf(e[3])) - .trail(Boolean.valueOf(e[4])) - .build()); - - - //FIREWORK ATTRIBUTES - }else if(itemAttribute[0].equals("firework-effects") && createdItemStack){ - final FireworkMeta effects = (FireworkMeta) im; - Arrays.asList(itemAttribute[1].split("(,)")).stream() - .map(s -> s.split("(~)")) - .forEach(s -> { - effects.addEffect( - FireworkEffect.builder() - .with(FireworkEffect.Type.valueOf(s[0])) - .withColor(Arrays.asList(s[1].split("/")).stream() - .map(c -> Color.fromRGB(Integer.valueOf(c))) - .collect(Collectors.toList())) - .withFade(Arrays.asList(s[2].split("/")).stream() - .map(c -> Color.fromRGB(Integer.valueOf(c))) - .collect(Collectors.toList())) - .flicker(Boolean.valueOf(s[3])) - .trail(Boolean.valueOf(s[4])) - .build()); - }); - im = effects; - - - //LEATHER ARMOR ATTRIBUTES - }else if(itemAttribute[0].equals("color") && createdItemStack){ - ((LeatherArmorMeta) im).setColor(Color.fromRGB(Integer.valueOf(itemAttribute[1]))); - - - //MAP ATTRIBUTES - }else if(itemAttribute[0].equals("scaling") && createdItemStack){ - ((MapMeta) im).setScaling(Boolean.valueOf(itemAttribute[1])); - - - //POTION ATTRIBUTES - }else if(itemAttribute[0].equals("effect") && createdItemStack){ - String[] data = itemAttribute[1].split("(~)"); - ((PotionMeta) im).setBasePotionData(new PotionData(PotionType.valueOf(data[0]), Boolean.valueOf(data[1]), Boolean.valueOf(data[2]))); - }else if(itemAttribute[0].equals("customeffects") && createdItemStack){ - final PotionMeta potionMeta = (PotionMeta) im; - Arrays.asList(itemAttribute[1].split("(,)")).stream() - .forEach(s -> { - String[] e = s.split("(~)"); - ((PotionMeta) potionMeta).addCustomEffect( - new PotionEffect( - PotionEffectType.getByName(e[0]), - Integer.valueOf(e[1]), - Integer.valueOf(e[2]), - Boolean.valueOf(e[3]), - Boolean.valueOf(e[4]), - Color.fromRGB(Integer.valueOf(e[5]))), - false); - }); - im = potionMeta; - - - //SKULL ATTRIBUTES - }else if(itemAttribute[0].equals("owner") && createdItemStack) - ((SkullMeta) im).setOwner(itemAttribute[1]); - - - } - is.setItemMeta(im); - deserializedInventory.setItem(stackPosition, is); - } - return deserializedInventory; + public static ItemStack deserializeItemStack(String itemStackString){ + + if (itemStackString.equals("null")) return null; + + ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64.decodeBase64(itemStackString)); + NBTTagCompound nbtTagCompound = null; + + try {nbtTagCompound = NBTCompressedStreamTools.a(inputStream);} + catch (IOException e) {e.printStackTrace();} + + return ItemStack.createStack(nbtTagCompound); } - - -} \ No newline at end of file + + + + public static String serializeInventory (IInventory invInventory){ + return IntStream.range(0, invInventory.getSize()) + .mapToObj(s -> { + ItemStack i = invInventory.getItem(s); + return Objects.isNull(i) ? null : s + "#" + serializeItemStack(i); + }) + .filter(s -> s != null) + .collect(Collectors.joining(";")); + } + + + + public static void setInventoryFromSerialized (IInventory invInventory, String invString){ + invInventory.l(); + if (invString != null && invString.contains(";")) + Arrays.asList(invString.split("(;)")) + .stream() + .forEach(s -> { + String[] e = s.split("#"); + invInventory.setItem(Integer.parseInt(e[0]), deserializeItemStack(e[1])); + }); + } +} diff --git a/src/iie/SerializerOld.java b/src/iie/SerializerOld.java new file mode 100644 index 0000000..abf2046 --- /dev/null +++ b/src/iie/SerializerOld.java @@ -0,0 +1,494 @@ +package iie; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Base64; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; + +import org.bukkit.Bukkit; +import org.bukkit.Color; +import org.bukkit.DyeColor; +import org.bukkit.FireworkEffect; +import org.bukkit.Material; +import org.bukkit.block.banner.Pattern; +import org.bukkit.block.banner.PatternType; +import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventory; +import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventoryPlayer; +import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftItemStack; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.BannerMeta; +import org.bukkit.inventory.meta.BookMeta; +import org.bukkit.inventory.meta.EnchantmentStorageMeta; +import org.bukkit.inventory.meta.FireworkEffectMeta; +import org.bukkit.inventory.meta.FireworkMeta; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.LeatherArmorMeta; +import org.bukkit.inventory.meta.MapMeta; +import org.bukkit.inventory.meta.PotionMeta; +import org.bukkit.inventory.meta.SkullMeta; +import org.bukkit.inventory.meta.BookMeta.Generation; +import org.bukkit.potion.PotionData; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.potion.PotionType; + +import com.mojang.authlib.GameProfile; + +import net.minecraft.server.v1_10_R1.MinecraftServer; +import net.minecraft.server.v1_10_R1.ChunkProviderServer; +import net.minecraft.server.v1_10_R1.DataConverterManager; +import net.minecraft.server.v1_10_R1.EntityPlayer; +import net.minecraft.server.v1_10_R1.PlayerList; +import net.minecraft.server.v1_10_R1.WorldServer; + +public class SerializerOld { + + //public void test(){ + // GameProfile profile = new com.mojang.authlib.GameProfile(player.getUniqueId(), ""); + // profile.getProperties(); + //} + + public static String StringFromInventory (Inventory invInventory){ + String serialization = invInventory.getSize() + ";"; + for (int i = 0; i < invInventory.getSize(); i++){ + ItemStack is = invInventory.getItem(i); + ItemMeta im = null; + if (is != null){ + + if (is.hasItemMeta()) im = is.getItemMeta(); + String serializedItemStack = new String(); + + String isType = String.valueOf(is.getType()); + serializedItemStack += "t@" + isType; + + if (is.getDurability() != 0) + serializedItemStack += ":d@" + String.valueOf(is.getDurability()); + + if (is.getAmount() != 1) + serializedItemStack += ":a@" + String.valueOf(is.getAmount()); + + Map isEnch = is.getEnchantments(); + if (isEnch.size() > 0) + for (Entry ench : isEnch.entrySet()) + serializedItemStack += ":e@" + ench.getKey().getName() + "@" + ench.getValue(); + + if (im == null){ + serialization += i + "#" + serializedItemStack + ";"; + continue; + } + + + //ITEM META + if (im.getDisplayName() != null){ + serializedItemStack += ":n@" + is.getItemMeta().getDisplayName() + .replace("#", "{hash}") + .replace("@", "{ampersand}") + .replace(";", "{semicolon}") + .replace("'", "{single quote}") + .replace("\"", "{double quote}"); + } + if (im.getLore() != null){ + serializedItemStack += ":l@" + is.getItemMeta().getLore().stream() + .map(s -> s + .replace("[", "{bracket start}") + .replace("]", "{bracket end}") + .replace(",", "{comma}") + + .replace("#", "{hash}") + .replace("@", "{ampersand}") + .replace(";", "{semicolon}") + .replace("'", "{single quote}") + .replace("\"", "{double quote}")) + .collect(Collectors.joining(",")); + } + if (im.getItemFlags().size() > 0){ + ItemFlag[] flags = ItemFlag.values(); + if (im.hasItemFlag(flags[0])) + serializedItemStack += ":f@HIDE_ATTRIBUTES"; + if (im.hasItemFlag(flags[1])) + serializedItemStack += ":f@HIDE_DESTROYS"; + if (im.hasItemFlag(flags[2])) + serializedItemStack += ":f@HIDE_ENCHANTS"; + if (im.hasItemFlag(flags[3])) + serializedItemStack += ":f@HIDE_PLACED_ON"; + if (im.hasItemFlag(flags[4])) + serializedItemStack += ":f@HIDE_POTION_EFFECTS"; + if (im.hasItemFlag(flags[5])) + serializedItemStack += ":f@HIDE_UNBREAKABLE"; + } + + + //BANNER META + if (isType == "BANNER"){ + BannerMeta meta = (BannerMeta) im; + serializedItemStack += ":basecolor@" + meta.getBaseColor().name(); + if (meta.getPatterns().size() > 0){ + serializedItemStack += ":patterns@"; + String list = meta.getPatterns().stream() + .map(p -> p.getPattern().name() + "~" + p.getColor().name()) + .collect(Collectors.joining(",")); + serializedItemStack += list; + } + } + + + //BOOK META + if (isType == "WRITTEN_BOOK"){ + BookMeta meta = (BookMeta) im; + if (meta.hasTitle()) + serializedItemStack += ":title@" + meta.getTitle(); + if (meta.hasAuthor()) + serializedItemStack += ":author@" + meta.getAuthor(); + //if (meta.hasGeneration()) + // serializedItemStack += ":generation@" + meta.getGeneration().name(); + if (meta.hasPages()){ + serializedItemStack += ":pages@" + meta.getPages().stream() + .map(s -> s + .replace("º", "°") + .replace("[", "{bracket start}") + .replace("]", "{bracket end}") + .replace(",", "{comma}") + .replace("#", "{hash}") + .replace("@", "{ampersand}") + .replace(";", "{semicolon}") + .replace("'", "{single quote}") + .replace("\"", "{double quote}")) + .collect(Collectors.joining("º")); + } + } + + + //ENCHANTED BOOK META + if (isType == "ENCHANTED_BOOK"){ + EnchantmentStorageMeta meta = (EnchantmentStorageMeta) im; + if (meta.hasStoredEnchants()){ + //serializedItemStack += ":storedenchants@" + meta.getStoredEnchants().entrySet().stream() + //.map(e -> e.getKey() + "~" + String.valueOf(e.getValue())) + //.collect(Collectors.joining(",")); + ArrayList list = new ArrayList(); + meta.getStoredEnchants().forEach((k,v) -> list.add(k.getName() + "~" + v)); + serializedItemStack += ":storedenchants@" + list.stream().collect(Collectors.joining(",")); + } + } + + + //FIREWORK CHARGE META + if (isType == "FIREWORK_CHARGE"){ + FireworkEffectMeta meta = (FireworkEffectMeta) im; + if (meta.hasEffect()){ + FireworkEffect e = meta.getEffect(); + serializedItemStack += ":charge-effect@" + + e.getType().name() + "~" + + e.getColors() + .stream().map(c -> String.valueOf(c.asRGB())) + .collect(Collectors.joining("/")) + "~" + + e.getFadeColors() + .stream().map(c -> String.valueOf(c.asRGB())) + .collect(Collectors.joining("/")) + "~" + + e.hasFlicker() + "~" + + e.hasTrail(); + } + } + + + //FIREWORK META + if (isType == "FIREWORK"){ + FireworkMeta meta = (FireworkMeta) im; + if (meta.hasEffects()) + serializedItemStack += ":firework-effects@" + meta.getEffects().stream() + .map(s -> s.getType().name() + "~" + + s.getColors() + .stream().map(c -> String.valueOf(c.asRGB())) + .collect(Collectors.joining("/")) + "~" + + s.getFadeColors() + .stream().map(c -> String.valueOf(c.asRGB())) + .collect(Collectors.joining("/")) + "~" + + s.hasFlicker() + "~" + + s.hasTrail()) + .collect(Collectors.joining(",")); + serializedItemStack += ":power@" + meta.getPower(); + } + + + //LEATHER ARMOR META + if (isType == "LEATHER_HELMET" || isType == "LEATHER_CHESTPLATE" || isType == "LEATHER_LEGGINGS" || isType == "LEATHER_BOOTS") + serializedItemStack += ":color@" + ((LeatherArmorMeta) im).getColor().asRGB(); + + + //MAP META + if (isType == "MAP") + serializedItemStack += ":scaling@" + ((MapMeta) im).isScaling(); + + + //POTION META + if (isType == "POTION" || isType == "LINGERING_POTION" || isType == "SPLASH_POTION"){ + PotionMeta meta = (PotionMeta) im; + PotionData data = (PotionData) meta.getBasePotionData(); + serializedItemStack += ":effect@" + data.getType().name() + "~" + data.isExtended() + "~" + data.isUpgraded(); + if (meta.hasCustomEffects()) + serializedItemStack += ":customeffects@" + meta.getCustomEffects().stream() + .map(s -> { + String p = s.getType().getName() + "~" + + s.getAmplifier() + "~" + + s.getDuration() + "~" + + s.hasParticles() + "~" + + s.isAmbient() + "~"; + if (s.getColor() != null) + return p + s.getColor().asRGB(); + return p; + }) + .collect(Collectors.joining(",")); + } + + + //SKULL META + if (isType == "SKULL_ITEM"){ + String texture = null; + //net.minecraft.server.v1_10_R1.ItemStack nmsItem = + texture = ((CraftInventory) invInventory) + .getInventory() + .getContents()[i] + .getTag() + .getCompound("SkullOwner") + .toString(); + //texture = Base64.getUrlEncoder().encodeToString + // ( + // nmsItem.getTag().getCompound("SkullOwner").toString().getBytes() + // ); + //.getCompound("SkullOwner") + //.getCompound("Properties") + //.getCompound("textures") + //.getString("Value"); + if (((SkullMeta) im).hasOwner()) + serializedItemStack += ":owner@" + ((SkullMeta) im).getOwner(); + if (texture != null) + serializedItemStack += ":texture@" + texture; + ((Player) invInventory.getHolder()).sendMessage( + Serializer.serializeItemStack( + ((CraftInventory) invInventory).getInventory().getContents()[i] + ) + ); + } + + + + serialization += i + "#" + serializedItemStack + ";"; + } + } + return serialization; + } + + + + + + + + + + + + + + + + + + public static Inventory InventoryFromString(String invString, InventoryType type){ + String[] serializedBlocks = invString.split(";"); + int invSize = Integer.valueOf(serializedBlocks[0]); + Inventory deserializedInventory = Bukkit.getServer().createInventory(null, type); + for (int i = 1; i < serializedBlocks.length; i++){ + String[] serializedBlock = serializedBlocks[i].split("#"); + int stackPosition = Integer.valueOf(serializedBlock[0]); + if (stackPosition >= invSize) + continue; + + ItemStack is = null; + ItemMeta im = null; + Boolean createdItemStack = false; + + String[] serializedItemStack = serializedBlock[1].split(":"); + for (String itemInfo : serializedItemStack){ + String[] itemAttribute = itemInfo.split("@"); + if (itemAttribute[0].equals("t")){ + is = new ItemStack(Material.getMaterial((itemAttribute[1]))); + createdItemStack = true; + if (is.getItemMeta() != null) + im = is.getItemMeta(); + }else if(itemAttribute[0].equals("d") && createdItemStack){ + is.setDurability(Short.valueOf(itemAttribute[1])); + }else if(itemAttribute[0].equals("a") && createdItemStack){ + is.setAmount(Integer.valueOf(itemAttribute[1])); + }else if(itemAttribute[0].equals("e") && createdItemStack){ + is.addUnsafeEnchantment(Enchantment.getByName(itemAttribute[1]), Integer.valueOf(itemAttribute[2])); + }else if(itemAttribute[0].equals("n") && createdItemStack){ + im.setDisplayName(itemAttribute[1] + .replace("#", "{hash}") + .replace("@", "{ampersand}") + .replace(";", "{semicolon}") + .replace("'", "{single quote}") + .replace("\"", "{double quote}")); + + }else if(itemAttribute[0].equals("l") && createdItemStack){ + im.setLore(Arrays.asList(itemAttribute[1].split("(,)")).stream().map(s -> s + .replace("[", "{bracket start}") + .replace("]", "{bracket end}") + .replace(",", "{comma}") + + .replace("#", "{hash}") + .replace("@", "{ampersand}") + .replace(";", "{semicolon}") + .replace("'", "{single quote}") + .replace("\"", "{double quote}")) + .collect(Collectors.toList())); + + }else if(itemAttribute[0].equals("f") && createdItemStack){ + im.addItemFlags(ItemFlag.valueOf(itemAttribute[1])); + + + //BANNER ATTRIBUTES + }else if(itemAttribute[0].equals("basecolor") && createdItemStack){ + ((BannerMeta) im).setBaseColor(DyeColor.valueOf(itemAttribute[1])); + }else if(itemAttribute[0].equals("patterns") && createdItemStack){ + ((BannerMeta) im).setPatterns((List) Arrays.asList(itemAttribute[1].split("(,)")).stream() + .map(s -> new Pattern( + DyeColor.valueOf(Arrays.asList(s.split("(~)")).get(1)), + PatternType.valueOf(Arrays.asList(s.split("(~)")).get(0)))) + .collect(Collectors.toList())); + + + //BOOK ATTRIBUES + }else if(itemAttribute[0].equals("title") && createdItemStack){ + ((BookMeta) im).setTitle(itemAttribute[1]); + }else if(itemAttribute[0].equals("author") && createdItemStack){ + ((BookMeta) im).setAuthor(itemAttribute[1]); + }else if(itemAttribute[0].equals("generation") && createdItemStack){ + ((BookMeta) im).setGeneration(Generation.valueOf(itemAttribute[1])); + }else if(itemAttribute[0].equals("pages") && createdItemStack){ + ((BookMeta) im).setPages(Arrays.asList(itemAttribute[1] + .replace("{bracket start}","[") + .replace("{bracket end}","]") + .replace("{comma}",",") + .replace("{hash}","#") + .replace("{ampersand}","@") + .replace("{semicolon}",";") + .replace("{single quote}","'") + .replace("{double quote}","\"") + .split("º"))); + + + //ENCHANTED BOOK ATTRIBUTES + }else if(itemAttribute[0].equals("storedenchants") && createdItemStack){ + final EnchantmentStorageMeta storedEnchants = (EnchantmentStorageMeta) im; + Arrays.asList(itemAttribute[1].split("(,)")).stream().map(e -> e.split("(~)")) + .forEach(e -> storedEnchants.addStoredEnchant(Enchantment.getByName(e[0]),Integer.valueOf(e[1]),true)); + im = storedEnchants; + + + //FIREWORK CHARGE ATTRIBUTES + }else if(itemAttribute[0].equals("charge-effect") && createdItemStack){ + String[] e = itemAttribute[1].split("(~)"); + ((FireworkEffectMeta) im).setEffect( + FireworkEffect.builder() + .with(FireworkEffect.Type.valueOf(e[0])) + .withColor(Arrays.asList(e[1].split("/")).stream() + .map(s -> Color.fromRGB(Integer.valueOf(s))) + .collect(Collectors.toList())) + .withFade(Arrays.asList(e[2].split("/")).stream() + .map(s -> Color.fromRGB(Integer.valueOf(s))) + .collect(Collectors.toList())) + .flicker(Boolean.valueOf(e[3])) + .trail(Boolean.valueOf(e[4])) + .build()); + + + //FIREWORK ATTRIBUTES + }else if(itemAttribute[0].equals("firework-effects") && createdItemStack){ + final FireworkMeta effects = (FireworkMeta) im; + Arrays.asList(itemAttribute[1].split("(,)")).stream() + .map(s -> s.split("(~)")) + .forEach(s -> { + effects.addEffect( + FireworkEffect.builder() + .with(FireworkEffect.Type.valueOf(s[0])) + .withColor(Arrays.asList(s[1].split("/")).stream() + .map(c -> Color.fromRGB(Integer.valueOf(c))) + .collect(Collectors.toList())) + .withFade(Arrays.asList(s[2].split("/")).stream() + .map(c -> Color.fromRGB(Integer.valueOf(c))) + .collect(Collectors.toList())) + .flicker(Boolean.valueOf(s[3])) + .trail(Boolean.valueOf(s[4])) + .build()); + }); + im = effects; + + + //LEATHER ARMOR ATTRIBUTES + }else if(itemAttribute[0].equals("color") && createdItemStack){ + ((LeatherArmorMeta) im).setColor(Color.fromRGB(Integer.valueOf(itemAttribute[1]))); + + + //MAP ATTRIBUTES + }else if(itemAttribute[0].equals("scaling") && createdItemStack){ + ((MapMeta) im).setScaling(Boolean.valueOf(itemAttribute[1])); + + + //POTION ATTRIBUTES + }else if(itemAttribute[0].equals("effect") && createdItemStack){ + String[] data = itemAttribute[1].split("(~)"); + ((PotionMeta) im).setBasePotionData(new PotionData(PotionType.valueOf(data[0]), Boolean.valueOf(data[1]), Boolean.valueOf(data[2]))); + }else if(itemAttribute[0].equals("customeffects") && createdItemStack){ + final PotionMeta potionMeta = (PotionMeta) im; + Arrays.asList(itemAttribute[1].split("(,)")).stream() + .forEach(s -> { + String[] e = s.split("(~)"); + if (e.length == 6) + ((PotionMeta) potionMeta).addCustomEffect( + new PotionEffect( + PotionEffectType.getByName(e[0]), + Integer.valueOf(e[1]), + Integer.valueOf(e[2]), + Boolean.valueOf(e[3]), + Boolean.valueOf(e[4]), + Color.fromRGB(Integer.valueOf(e[5]))), + false + ); + else + ((PotionMeta) potionMeta).addCustomEffect( + new PotionEffect( + PotionEffectType.getByName(e[0]), + Integer.valueOf(e[1]), + Integer.valueOf(e[2]), + Boolean.valueOf(e[3]), + Boolean.valueOf(e[4])), + false + ); + }); + im = potionMeta; + + + //SKULL ATTRIBUTES + }else if(itemAttribute[0].equals("owner") && createdItemStack) + ((SkullMeta) im).setOwner(itemAttribute[1]); + + + } + is.setItemMeta(im); + deserializedInventory.setItem(stackPosition, is); + } + return deserializedInventory; + } + + +} \ No newline at end of file diff --git a/src/iie/SkullMaker.java b/src/iie/SkullMaker.java new file mode 100644 index 0000000..56171b0 --- /dev/null +++ b/src/iie/SkullMaker.java @@ -0,0 +1,170 @@ +package iie; + +import com.google.common.collect.ForwardingMultimap; +import org.apache.commons.codec.binary.Base64; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.SkullMeta; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; + +public class SkullMaker { + + private String owner; + private String url; + + private int amount = 1; + private String name; + private List lore = new ArrayList<>(); + + public SkullMaker withAmount(int amount) { + this.amount = amount; + return this; + } + + public SkullMaker withName(String name) { + this.name = name; + return this; + } + + public SkullMaker withLore(String line) { + lore.add(line); + return this; + } + + public SkullMaker withLore(String... lines) { + lore.addAll(Arrays.asList(lines)); + return this; + } + + public SkullMaker withLore(List lines) { + lore.addAll(lines); + return this; + } + + public SkullMaker withOwner(String ownerName) { + this.owner = ownerName; + return this; + } + + public SkullMaker withSkinUrl(String url) { + this.url = url; + return this; + } + + public ItemStack build() { + ItemStack item = new ItemStack(Material.SKULL_ITEM, amount, (short) 3); + SkullMeta meta = (SkullMeta) item.getItemMeta(); + if (owner != null) { + meta.setOwner(owner); + } else if (url != null) { + loadProfile(meta, url); + } + if (name != null) { + meta.setDisplayName(name); + } + if (!lore.isEmpty()) { + meta.setLore(lore); + } + item.setItemMeta(meta); + return item; + } + + private void loadProfile(ItemMeta meta, String url) { + + Class profileClass = Reflection.getClass("com.mojang.authlib.GameProfile"); + + Constructor profileConstructor = Reflection.getDeclaredConstructor(profileClass, UUID.class, String.class); + + Object profile = Reflection.newInstance(profileConstructor, UUID.randomUUID(), null); + + byte[] encodedData = Base64.encodeBase64(String.format("{textures:{SKIN:{url:\"%s\"}}}", url).getBytes()); + + Method getPropertiesMethod = Reflection.getDeclaredMethod(profileClass, "getProperties"); + + Object propertyMap = Reflection.invoke(getPropertiesMethod, profile); + + Class propertyClass = Reflection.getClass("com.mojang.authlib.properties.Property"); + + Reflection.invoke( + Reflection.getDeclaredMethod( + ForwardingMultimap.class, "put", Object.class, Object.class + ), + propertyMap, + "textures", + Reflection.newInstance(Reflection.getDeclaredConstructor(propertyClass, String.class, String.class), "textures", new String(encodedData)) + ); + + Reflection.setField("profile", meta, profile); + } + + private static final class Reflection { + + private static Class getClass(String forName) { + try { + return Class.forName(forName); + } catch (ClassNotFoundException e) { + return null; + } + } + + private static Constructor getDeclaredConstructor(Class clazz, Class... params) { + try { + return clazz.getDeclaredConstructor(params); + } catch (NoSuchMethodException e) { + return null; + } + } + + private static T newInstance(Constructor constructor, Object... params) { + try { + return constructor.newInstance(params); + } catch (IllegalAccessException | InstantiationException | InvocationTargetException e) { + return null; + } + } + + private static Method getDeclaredMethod(Class clazz, String name, Class... params) { + try { + return clazz.getDeclaredMethod(name, params); + } catch (NoSuchMethodException e) { + return null; + } + } + + private static Object invoke(Method method, Object object, Object... params) { + method.setAccessible(true); + try { + return method.invoke(object, params); + } catch (InvocationTargetException | IllegalAccessException e) { + return null; + } + } + + private static void setField(String name, Object instance, Object value) { + Field field = getDeclaredField(instance.getClass(), name); + field.setAccessible(true); + try { + field.set(instance, value); + } catch (IllegalAccessException ignored) {} + } + + private static Field getDeclaredField(Class clazz, String name) { + try { + return clazz.getDeclaredField(name); + } catch (NoSuchFieldException e) { + return null; + } + } + + } + +} \ No newline at end of file diff --git a/src/iie/WorldChangeListener.java b/src/iie/WorldChangeListener.java index 1b6f12b..d2654db 100644 --- a/src/iie/WorldChangeListener.java +++ b/src/iie/WorldChangeListener.java @@ -1,12 +1,17 @@ package iie; +import java.util.UUID; + import org.bukkit.World; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventory; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerChangedWorldEvent; -import org.bukkit.inventory.Inventory; + +import net.minecraft.server.v1_10_R1.IInventory; public class WorldChangeListener implements Listener { @@ -16,53 +21,71 @@ public class WorldChangeListener implements Listener { this.plugin = plugin; } - @EventHandler(priority = EventPriority.MONITOR) - public void onWorldChangeListener(PlayerChangedWorldEvent event){ - - Player player = event.getPlayer(); - String playername = player.getName(); - - World worldTo = player.getWorld(); - World worldFrom = event.getFrom(); - String worldToName = worldTo.getName(); - String worldFromName = worldFrom.getName(); - - String pathTo = worldToName + "." + playername + "."; - String pathFrom = worldFromName + "." + playername + "."; - - Inventory invInventory; - String invString; - - - - //----------------------------------------------------------------------INVENTORY + @EventHandler(priority = EventPriority.MONITOR) + public void onWorldChangeListener(PlayerChangedWorldEvent event){ + + + Player player = event.getPlayer(); + UUID uuid = player.getUniqueId(); + String playerPath = ".players.(" + player.getName() + ")" + uuid.toString() + "."; + + World worldTo = player.getWorld(); + World worldFrom = event.getFrom(); + String worldToName = worldTo.getName(); + String worldFromName = worldFrom.getName(); + + String pathTo = worldToName + playerPath; + String pathFrom = worldFromName + playerPath; + + FileConfiguration config = plugin.getConfig(); - invInventory = player.getInventory(); - invString = Serializer.StringFromInventory(invInventory); - plugin.getConfig().set(pathFrom + "inventory",invString); - plugin.saveConfig(); + //----------------------------------------------------------------------instantiations + + //Serializer serializer = new Serializer(player); - invString = (String) plugin.getConfig().get(pathTo + "inventory"); - - player.getInventory().clear(); - player.getInventory().setContents( - Serializer.InventoryFromString(invString, invInventory.getType()).getContents()); - - - - //----------------------------------------------------------------------ENDERCHEST - - - invInventory = player.getEnderChest(); - invString = Serializer.StringFromInventory(invInventory); - plugin.getConfig().set(pathFrom + "enderchest",invString); - plugin.saveConfig(); - - invString = (String) plugin.getConfig().get(pathTo + "enderchest"); - - player.getEnderChest().clear(); - player.getEnderChest().setContents( - Serializer.InventoryFromString(invString, invInventory.getType()).getContents()); + //----------------------------------------------------------------------INVENTORY + + + final IInventory inventory = ((CraftInventory)player.getInventory()).getInventory(); + + config.set(pathFrom + "inventory", Serializer.serializeInventory(inventory)); + + plugin.saveConfig(); + + Serializer.setInventoryFromSerialized(inventory, (String) config.get(pathTo + "inventory")); + + //player.getInventory().clear(); + //player.getInventory().setContents( + // Serializer.InventoryFromString(invString, invInventory.getType()) + // .getContents() + // ); + + //----------------------------------------------------------------------ENDERCHEST + + + final IInventory enderchest = ((CraftInventory)player.getEnderChest()).getInventory(); + + config.set(pathFrom + "enderchest", Serializer.serializeInventory(enderchest)); + + plugin.saveConfig(); + + Serializer.setInventoryFromSerialized(enderchest, (String) config.get(pathTo + "enderchest")); + + //player.getEnderChest().clear(); + //player.getEnderChest().setContents( + // Serializer.InventoryFromString(invString, invInventory.getType()) + // .getContents() + // ); + + //----------------------------------------------------------------------PLAYER DATA + + + config.set(pathFrom + "status", PlayerData.Position.StringFromLocation(player)); + + + + + plugin.saveConfig(); } } diff --git a/src/iie/test.java b/src/iie/test.java new file mode 100644 index 0000000..1b39465 --- /dev/null +++ b/src/iie/test.java @@ -0,0 +1,25 @@ +package iie; + +import net.minecraft.server.v1_10_R1.IInventory; + +public class test { + + public static IInventory invInventory (){ + IInventory invInventory = null; + try{ + invInventory = IInventory.class.newInstance(); + }catch (IllegalAccessException | InstantiationException e) { + e.printStackTrace(); + } + return invInventory; + } + + public void method(){ + final IInventory invInventory = invInventory(); + Serializer.setInventoryFromSerialized(invInventory, "string"); + } + + public void method2(){ + method(); + } +}