From db7443038496a5abf830606e6096fabbce744290 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sat, 29 Oct 2016 03:02:27 -0400 Subject: [PATCH] reorganized code, added world share settings --- plugin.yml | 7 +- src/iie/PerWorldInventoryPlugin.java | 41 ----- src/iie/PlayerData.java | 24 --- src/iie/SerializerDebug.java | 80 --------- src/iie/SkullMaker.java | 170 ------------------ src/iie/WorldChangeListener.java | 91 ---------- src/iie/test.java | 25 --- src/main/MainPlugin.java | 59 ++++++ src/{iie => main}/SerializerOld.java | 4 +- src/main/Serializers.java | 126 +++++++++++++ src/main/WorldChangeListener.java | 39 ++++ src/main/WorldChangeManager.java | 156 ++++++++++++++++ src/serializers/Serializers.java | 126 +++++++++++++ .../inventory.java} | 33 ++-- src/serializers/location.java | 32 ++++ src/serializers/playerdata.java | 39 ++++ 16 files changed, 595 insertions(+), 457 deletions(-) delete mode 100644 src/iie/PerWorldInventoryPlugin.java delete mode 100644 src/iie/PlayerData.java delete mode 100644 src/iie/SerializerDebug.java delete mode 100644 src/iie/SkullMaker.java delete mode 100644 src/iie/WorldChangeListener.java delete mode 100644 src/iie/test.java create mode 100644 src/main/MainPlugin.java rename src/{iie => main}/SerializerOld.java (99%) create mode 100644 src/main/Serializers.java create mode 100644 src/main/WorldChangeListener.java create mode 100644 src/main/WorldChangeManager.java create mode 100644 src/serializers/Serializers.java rename src/{iie/Serializer.java => serializers/inventory.java} (75%) create mode 100644 src/serializers/location.java create mode 100644 src/serializers/playerdata.java diff --git a/plugin.yml b/plugin.yml index 1480faf..25e5172 100644 --- a/plugin.yml +++ b/plugin.yml @@ -1,6 +1,3 @@ - main: iie.PerWorldInventoryPlugin + main: main.MainPlugin version: 1.0.0 - name: PerWorldInventoryPlugin - commands: - soundtest: - description: performs SoundTest \ No newline at end of file + name: PerWorldInventories \ No newline at end of file diff --git a/src/iie/PerWorldInventoryPlugin.java b/src/iie/PerWorldInventoryPlugin.java deleted file mode 100644 index df216b9..0000000 --- a/src/iie/PerWorldInventoryPlugin.java +++ /dev/null @@ -1,41 +0,0 @@ -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(){ - PluginManager manager = getServer().getPluginManager(); - manager.registerEvents(new WorldChangeListener(this), this); - PerWorldInventoryPlugin.getPlugin(this.getClass()).getServer().getListeningPluginChannels(); - createConfig(); - } - - - private void createConfig(){ - try { - - - 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 - getLogger().info("Config.yml found, loading!"); - - - }catch (Exception e) { - e.printStackTrace(); - } - } -} diff --git a/src/iie/PlayerData.java b/src/iie/PlayerData.java deleted file mode 100644 index ebf3978..0000000 --- a/src/iie/PlayerData.java +++ /dev/null @@ -1,24 +0,0 @@ -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/SerializerDebug.java b/src/iie/SerializerDebug.java deleted file mode 100644 index 28d3b6e..0000000 --- a/src/iie/SerializerDebug.java +++ /dev/null @@ -1,80 +0,0 @@ -package iie; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.Arrays; -import java.util.Objects; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import org.apache.commons.codec.binary.Base64; -import org.bukkit.entity.Player; - -import net.minecraft.server.v1_10_R1.IInventory; -import net.minecraft.server.v1_10_R1.ItemStack; -import net.minecraft.server.v1_10_R1.JsonList; -import net.minecraft.server.v1_10_R1.NBTCompressedStreamTools; -import net.minecraft.server.v1_10_R1.NBTTagCompound; - -public class SerializerDebug { - - - - public static String serializeItemStack(ItemStack itemStack, Player player){ - player.sendMessage("serializeItemStack: called"); - if (itemStack == null){ player.sendMessage("serializeItemStack: NULL itemStack"); return "null";} - - player.sendMessage("serializeItemStack: nbt tag = " + itemStack.getTag().toString()); - - return itemStack.getTag().toString(); - } - - - - public static ItemStack deserializeItemStack(String itemStackString, Player player){ - - if (itemStackString.equals("null")){ - player.sendMessage("deserializeItemStack: NULL itemStackString"); - return null; - } - - NBTTagCompound nbtTagCompound = (NBTTagCompound) JsonList.func_150315_a(itemStackString);; - - - player.sendMessage(nbtTagCompound.toString()); - - return ItemStack.createStack(nbtTagCompound); - } - - - - public static String serializeInventory (IInventory invInventory, Player player){ - player.sendMessage("serializeInventory: invInventory.getSize() = " + invInventory.getSize()); - return IntStream.range(0, invInventory.getSize() - 1) - .mapToObj(s -> { - ItemStack i = invInventory.getItem(s); - player.sendMessage(Objects.isNull(i) ? "serializeInventory: NULL item" + s : "serializeInventory: item " + s + " found"); - return Objects.isNull(i) ? null : s + "#" + serializeItemStack(i, player); - }) - .filter(s -> s != null) - .collect(Collectors.joining(";")); - } - - - - public static void setInventoryFromSerialized (IInventory invInventory, String invString, Player player){ - if (invInventory == null){ player.sendMessage("setInventoryFromSerialized: invInventory NULL"); return;} - invInventory.l(); - if (invString == null){ player.sendMessage("setInventoryFromSerialized: NULL invString"); return;} - if (invString.isEmpty()){ player.sendMessage("setInventoryFromSerialized: EMPTY invString"); return;} - if (!invString.contains(";")){ player.sendMessage("setInventoryFromSerialized: DOESN'T CONTAIN ';' "); return;} - Arrays.asList(invString.split(";")) - .stream() - .forEach(s -> { - String[] e = s.split("#"); - invInventory.setItem(Integer.parseInt(e[0]), deserializeItemStack(e[1], player)); - player.sendMessage("set item " + e[0] + " to inventory"); - }); - } -} diff --git a/src/iie/SkullMaker.java b/src/iie/SkullMaker.java deleted file mode 100644 index 56171b0..0000000 --- a/src/iie/SkullMaker.java +++ /dev/null @@ -1,170 +0,0 @@ -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 deleted file mode 100644 index efedf86..0000000 --- a/src/iie/WorldChangeListener.java +++ /dev/null @@ -1,91 +0,0 @@ -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 net.minecraft.server.v1_10_R1.IInventory; - - -public class WorldChangeListener implements Listener { - - PerWorldInventoryPlugin plugin; - public WorldChangeListener(PerWorldInventoryPlugin plugin){ - this.plugin = plugin; - } - - @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(); - - - //----------------------------------------------------------------------instantiations - - - - //----------------------------------------------------------------------INVENTORY - - - final IInventory inventory = ((CraftInventory)player.getInventory()).getInventory(); - - config.set(pathFrom + "inventory", SerializerDebug.serializeInventory(inventory, player)); - - plugin.saveConfig(); - - SerializerDebug.setInventoryFromSerialized(inventory, (String) config.get(pathTo + "inventory"), player); - - //player.getInventory().clear(); - //player.getInventory().setContents( - // SerializerDebug.InventoryFromString(invString, invInventory.getType()) - // .getContents() - // ); - - //----------------------------------------------------------------------ENDERCHEST - - - final IInventory enderchest = ((CraftInventory)player.getEnderChest()).getInventory(); - - config.set(pathFrom + "enderchest", SerializerDebug.serializeInventory(enderchest, player)); - - plugin.saveConfig(); - - SerializerDebug.setInventoryFromSerialized(enderchest, (String) config.get(pathTo + "enderchest"), player); - - //player.getEnderChest().clear(); - //player.getEnderChest().setContents( - // SerializerDebug.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 deleted file mode 100644 index 1b39465..0000000 --- a/src/iie/test.java +++ /dev/null @@ -1,25 +0,0 @@ -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(); - } -} diff --git a/src/main/MainPlugin.java b/src/main/MainPlugin.java new file mode 100644 index 0000000..3c83ac0 --- /dev/null +++ b/src/main/MainPlugin.java @@ -0,0 +1,59 @@ +package main; + +import org.bukkit.plugin.java.JavaPlugin; + +public class MainPlugin extends JavaPlugin { + + public void onEnable(){ + + //getServer().getPluginManager().registerEvents(new WorldLoadListener(this), this); + getServer().getPluginManager().registerEvents(new WorldChangeListener(this), this); + MainPlugin.getPlugin(this.getClass()).getServer().getListeningPluginChannels(); + + saveDefaultConfig(); + WorldChangeManager.init(this); + //BukkitTask task = new initWorldSettings().runTaskLater(this, 20); + } +} +/* + public void initWorldSettings(){ + Bukkit.getServer().getWorlds() + .stream() + .forEach(s -> { + FileConfiguration config = getConfig(); + String name = s.getName(); + + if (config.get(name + ".settings.shareinvgroup") == null) + config.set(name + ".settings.shareinvgroup", name); + + if (config.get(name + ".settings.sharedatagroup") == null) + config.set(name + ".settings.sharedatagroup", name); + + }); + saveConfig(); + } +} + + private void createConfig(){ + try { + + + if (!getDataFolder().exists()) + getDataFolder().mkdirs(); + + + File file = new File(getDataFolder(), "config.yml"); + + if (!file.exists()){ + getLogger().info("Config.yml not found, creating!"); + saveDefaultConfig(); + }else + getLogger().info("Config.yml found, loading!"); + + + }catch (Exception e) { + e.printStackTrace(); + } + } + +*/ \ No newline at end of file diff --git a/src/iie/SerializerOld.java b/src/main/SerializerOld.java similarity index 99% rename from src/iie/SerializerOld.java rename to src/main/SerializerOld.java index abf2046..487e1e7 100644 --- a/src/iie/SerializerOld.java +++ b/src/main/SerializerOld.java @@ -1,4 +1,4 @@ -package iie; +package main; import java.util.ArrayList; import java.util.Arrays; @@ -273,7 +273,7 @@ public class SerializerOld { if (texture != null) serializedItemStack += ":texture@" + texture; ((Player) invInventory.getHolder()).sendMessage( - Serializer.serializeItemStack( + Serializers.serializeItemStack( ((CraftInventory) invInventory).getInventory().getContents()[i] ) ); diff --git a/src/main/Serializers.java b/src/main/Serializers.java new file mode 100644 index 0000000..b0e89c8 --- /dev/null +++ b/src/main/Serializers.java @@ -0,0 +1,126 @@ +package main; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Arrays; +import java.util.Objects; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.apache.commons.codec.binary.Base64; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; + +import net.minecraft.server.v1_10_R1.EntityPlayer; +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 net.minecraft.server.v1_10_R1.PlayerList; + +public class Serializers { + + + //----------------------------------------------------------------------( INVENTORY ) + + //SERIALIZE ITEMSTACK + public static String serializeItemStack(ItemStack itemStack){ + + NBTTagCompound tag = itemStack.save(new NBTTagCompound()); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + + try { NBTCompressedStreamTools.a(tag, outputStream); } + catch (IOException e) { e.printStackTrace(); } + + return Base64.encodeBase64String(outputStream.toByteArray()); + } + + //DESERIALIZE ITEMSTACK + public static ItemStack deserializeItemStack(String itemStackString){ + + NBTTagCompound nbtTagCompound = null; + ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64.decodeBase64(itemStackString)); + + try {nbtTagCompound = NBTCompressedStreamTools.a(inputStream);} + catch (IOException e) {e.printStackTrace();} + + return ItemStack.createStack(nbtTagCompound); + } + + //SERIALIZE INVENTORY + 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(";")); + } + + //SET INVENTORY FROM SERIALIZED + public static void setInventoryFromSerialized (IInventory invInventory, String invString){ + invInventory.l(); + if (invString != null && !invString.isEmpty()) + Arrays.asList(invString.split(";")) + .parallelStream() + .forEach(s -> { + String[] e = s.split("#"); + invInventory.setItem(Integer.parseInt(e[0]), deserializeItemStack(e[1])); + }); + } + + + + + + + //----------------------------------------------------------------------( LOCATION ) + + //SERIALIZE LOCATION + public static String serializeLocation(Location location){ + return + "x:" + location.getBlockX() + + ",z:" + location.getBlockZ() + + ",y:" + location.getBlockY() + + ",p:" + location.getPitch() + + ",y:" + location.getYaw(); + } + + //DESERIALIZE LOCATION + public static Location deserializeLocation(World world, String locationString){ + String[] s = locationString.split(","); + return new Location( + world, + Double.valueOf(s[0].split(":")[1]), + Double.valueOf(s[1].split(":")[1]), + Double.valueOf(s[2].split(":")[1]), + Float.valueOf(s[3].split(":")[1]), + Float.valueOf(s[4].split(":")[1]) + ); + } + + + + + + + //----------------------------------------------------------------------( PLAYERDATA ) + + //SERIALIZE PLAYERDATA + public static String serializePlayerData(Player player){ + StringBuilder result = new StringBuilder(); + result.append("health:" + player.getHealth() + ";"); + result.append("food:" + player.getFoodLevel() + ";"); + result.append("exhaustion: " + player.getExhaustion() + ";"); + result.append("exp:" + player.getExp() + ";"); + result.append("air:" + player.getRemainingAir() + ";"); + result.append("fireticks:" + player.getFireTicks() + ";"); + return result.toString(); + } + +} diff --git a/src/main/WorldChangeListener.java b/src/main/WorldChangeListener.java new file mode 100644 index 0000000..7763228 --- /dev/null +++ b/src/main/WorldChangeListener.java @@ -0,0 +1,39 @@ +package main; + +import org.bukkit.configuration.file.FileConfiguration; +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; + +public class WorldChangeListener implements Listener { + + private static MainPlugin plugin; + private static FileConfiguration config; + public WorldChangeListener(MainPlugin plugin){ + WorldChangeListener.plugin = plugin; + WorldChangeListener.config = plugin.getConfig(); + } + + + @EventHandler(priority = EventPriority.MONITOR) + public void onWorldChangeListener(PlayerChangedWorldEvent event){ + Player player = event.getPlayer(); + String worldTo = player.getWorld().getName(); + String worldFrom = event.getFrom().getName(); + + initWorldSettings(worldTo); + initWorldSettings(worldFrom); + WorldChangeManager.update(player,worldTo, worldFrom); + } + + + public static void initWorldSettings(String world){ + if (config.get(world + ".settings.shareinvgroup") == null) + config.set(world + ".settings.shareinvgroup", world); + if (config.get(world + ".settings.sharedatagroup") == null) + config.set(world + ".settings.sharedatagroup", world); + plugin.saveConfig(); + } +} diff --git a/src/main/WorldChangeManager.java b/src/main/WorldChangeManager.java new file mode 100644 index 0000000..9887c75 --- /dev/null +++ b/src/main/WorldChangeManager.java @@ -0,0 +1,156 @@ +package main; + +import java.util.Arrays; + +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventory; +import org.bukkit.entity.Player; + +import net.minecraft.server.v1_10_R1.IInventory; + +public class WorldChangeManager { + + private static MainPlugin plugin; + private static FileConfiguration config; + public static void init(MainPlugin plugin){ //onEnable() + WorldChangeManager.plugin = plugin; + WorldChangeManager.config = plugin.getConfig(); + } + + + //EVALUATE SHARE SETTINGS + public static boolean[] compare (String worldTo, String worldFrom) { + boolean[] result = new boolean[] {false,false}; + String[][] params = + (String[][]) Arrays.asList + (new String[] { + (String) config.get(worldTo + ".settings.shareinvgroup"), + (String) config.get(worldFrom + ".settings.shareinvgroup"), + (String) config.get(worldTo + ".settings.sharedatagroup"), + (String) config.get(worldFrom + ".settings.sharedatagroup") + }) + .stream() + .map(s -> (String[]) s + .trim() + .replaceAll("( )", "") + .toLowerCase() + .split("\\*")) + .toArray(String[][]::new); + + /* Each world has two sharing settings: for inventory sharing, + * and for playerdata sharing. Each setting has two parameters: + * the sharegroup flag, which labels a group of sharing worlds, + * and an optional suffix, *in or *out, specifying that the world + * shares with its group in only one traffic direction + */ + + if (params[0][0].equals(params[1][0])//inv + && ( + ( + params[0].length > 1 ? params[0][1].equals("in") : true + && params[1].length > 1 ? params[1][1].equals("out") : true + ) + || ( + params[1].length > 1 ? params[1][1].equals("out") : true + && params[0].length > 1 ? params[1][1].equals("in") : true + ) + ) + ) + result[0] = true; + + if (params[2][0].equals(params[3][0])//data + && ( + ( + params[2].length > 1 ? params[2][1].equals("in") : true + && params[3].length > 1 ? params[3][1].equals("out") : true + ) + || ( + params[3].length > 1 ? params[3][1].equals("out") : true + && params[2].length > 1 ? params[3][1].equals("in") : true + ) + ) + ) + result[1] = true; + + return result; + } + + + //VALUES USED BY THE UPDATE METHODS + public static class Values { + public String uuid; + public String worldTo; + public String worldFrom; + public String pTo; + public String pFrom; + public boolean shareinv; + public boolean sharedata; + + public Values (Player player, String worldTo, String worldFrom){ + + this.uuid = player.getUniqueId().toString(); + this.worldTo = worldTo; + this.worldFrom = worldFrom; + this.pTo = worldTo + ".players." + uuid; + this.pFrom = worldFrom + ".players." + uuid; + + boolean[] compare = compare(worldTo,worldFrom); + + this.shareinv = compare[0]; + this.sharedata = compare[1]; + } + } + + + //MAIN UPDATE METHOD + public static void update(Player player, String worldTo, String worldFrom){ + + final Values values = new Values(player, worldTo, worldFrom); + + updateLocation(values, player); + updateInventories(values, player); + //updatePlayerData(values, player); + } + + + //UPDATE LOCATION + public static void updateLocation(Values values, Player player){ + config.set( + values.pFrom + ".location", + serializers.location.serialize(player.getLocation()) + ); + plugin.saveConfig(); + /* players are not automatically moved to their stored location, + * this is done only on request, in a dedicated teleport method + */ + } + + + //UPDATE INVENTORIES + public static void updateInventories(Values values, Player player){ + IInventory inventory = ((CraftInventory) player.getInventory()).getInventory(); + config.set(values.pFrom + ".inventory", serializers.inventory.serialize(inventory)); + plugin.saveConfig(); + if (!values.shareinv) + serializers.inventory.setFromSerialized( + inventory, (String) config.get(values.pTo + ".inventory") + ); + + IInventory enderchest = ((CraftInventory) player.getEnderChest()).getInventory(); + config.set(values.pFrom + ".enderchest", serializers.inventory.serialize(enderchest)); + plugin.saveConfig(); + if (!values.sharedata) + serializers.inventory.setFromSerialized( + enderchest, (String) config.get(values.pTo + ".enderchest") + ); + } + + + //UPDATE PLAYERDATA + public static void updatePlayerData(Values values, Player player){ + config.set(values.pFrom + ".playerdata", serializers.playerdata.serialize(player)); + plugin.saveConfig(); + if (!values.sharedata) + ; + } +} diff --git a/src/serializers/Serializers.java b/src/serializers/Serializers.java new file mode 100644 index 0000000..8a24358 --- /dev/null +++ b/src/serializers/Serializers.java @@ -0,0 +1,126 @@ +package serializers; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Arrays; +import java.util.Objects; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.apache.commons.codec.binary.Base64; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; + +import net.minecraft.server.v1_10_R1.EntityPlayer; +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 net.minecraft.server.v1_10_R1.PlayerList; + +public class Serializers { + + + //----------------------------------------------------------------------( INVENTORY ) + + //SERIALIZE ITEMSTACK + public static String serializeItemStack(ItemStack itemStack){ + + NBTTagCompound tag = itemStack.save(new NBTTagCompound()); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + + try { NBTCompressedStreamTools.a(tag, outputStream); } + catch (IOException e) { e.printStackTrace(); } + + return Base64.encodeBase64String(outputStream.toByteArray()); + } + + //DESERIALIZE ITEMSTACK + public static ItemStack deserializeItemStack(String itemStackString){ + + NBTTagCompound nbtTagCompound = null; + ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64.decodeBase64(itemStackString)); + + try {nbtTagCompound = NBTCompressedStreamTools.a(inputStream);} + catch (IOException e) {e.printStackTrace();} + + return ItemStack.createStack(nbtTagCompound); + } + + //SERIALIZE INVENTORY + 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(";")); + } + + //SET INVENTORY FROM SERIALIZED + public static void setInventoryFromSerialized (IInventory invInventory, String invString){ + invInventory.l(); + if (invString != null && !invString.isEmpty()) + Arrays.asList(invString.split(";")) + .parallelStream() + .forEach(s -> { + String[] e = s.split("#"); + invInventory.setItem(Integer.parseInt(e[0]), deserializeItemStack(e[1])); + }); + } + + + + + + + //----------------------------------------------------------------------( LOCATION ) + + //SERIALIZE LOCATION + public static String serializeLocation(Location location){ + return + "x:" + location.getBlockX() + + ",z:" + location.getBlockZ() + + ",y:" + location.getBlockY() + + ",p:" + location.getPitch() + + ",y:" + location.getYaw(); + } + + //DESERIALIZE LOCATION + public static Location deserializeLocation(World world, String locationString){ + String[] s = locationString.split(","); + return new Location( + world, + Double.valueOf(s[0].split(":")[1]), + Double.valueOf(s[1].split(":")[1]), + Double.valueOf(s[2].split(":")[1]), + Float.valueOf(s[3].split(":")[1]), + Float.valueOf(s[4].split(":")[1]) + ); + } + + + + + + + //----------------------------------------------------------------------( PLAYERDATA ) + + //SERIALIZE PLAYERDATA + public static String serializePlayerData(Player player){ + StringBuilder result = new StringBuilder(); + result.append("health:" + player.getHealth() + ";"); + result.append("food:" + player.getFoodLevel() + ";"); + result.append("exhaustion: " + player.getExhaustion() + ";"); + result.append("exp:" + player.getExp() + ";"); + result.append("air:" + player.getRemainingAir() + ";"); + result.append("fireticks:" + player.getFireTicks() + ";"); + return result.toString(); + } + +} diff --git a/src/iie/Serializer.java b/src/serializers/inventory.java similarity index 75% rename from src/iie/Serializer.java rename to src/serializers/inventory.java index f6626c4..9610e51 100644 --- a/src/iie/Serializer.java +++ b/src/serializers/inventory.java @@ -1,4 +1,4 @@ -package iie; +package serializers; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -15,30 +15,25 @@ import net.minecraft.server.v1_10_R1.ItemStack; import net.minecraft.server.v1_10_R1.NBTCompressedStreamTools; import net.minecraft.server.v1_10_R1.NBTTagCompound; -public class Serializer { - +public class inventory { + //SERIALIZE ITEMSTACK public static String serializeItemStack(ItemStack itemStack){ - - if (itemStack == null) return "null"; - + NBTTagCompound tag = itemStack.save(new NBTTagCompound()); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - try { NBTCompressedStreamTools.a(itemStack.getTag(), outputStream); } + try { NBTCompressedStreamTools.a(tag, outputStream); } catch (IOException e) { e.printStackTrace(); } return Base64.encodeBase64String(outputStream.toByteArray()); } - + //DESERIALIZE ITEMSTACK public static ItemStack deserializeItemStack(String itemStackString){ - - if (itemStackString.equals("null")) return null; - - ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64.decodeBase64(itemStackString)); NBTTagCompound nbtTagCompound = null; + ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64.decodeBase64(itemStackString)); try {nbtTagCompound = NBTCompressedStreamTools.a(inputStream);} catch (IOException e) {e.printStackTrace();} @@ -47,8 +42,8 @@ public class Serializer { } - - public static String serializeInventory (IInventory invInventory){ + //SERIALIZE INVENTORY + public static String serialize (IInventory invInventory){ return IntStream.range(0, invInventory.getSize()) .mapToObj(s -> { ItemStack i = invInventory.getItem(s); @@ -59,12 +54,12 @@ public class Serializer { } - - public static void setInventoryFromSerialized (IInventory invInventory, String invString){ - invInventory.l(); - if (invString != null) + //SET INVENTORY FROM SERIALIZED + public static void setFromSerialized (IInventory invInventory, String invString){ + invInventory.l();//clear inventory + if (invString != null && !invString.isEmpty()) Arrays.asList(invString.split(";")) - .stream() + .parallelStream() .forEach(s -> { String[] e = s.split("#"); invInventory.setItem(Integer.parseInt(e[0]), deserializeItemStack(e[1])); diff --git a/src/serializers/location.java b/src/serializers/location.java new file mode 100644 index 0000000..7248f84 --- /dev/null +++ b/src/serializers/location.java @@ -0,0 +1,32 @@ +package serializers; + +import org.bukkit.Location; +import org.bukkit.World; + +public class location { + + + //SERIALIZE LOCATION + public static String serialize(Location location){ + return + location.getBlockX() + "," + + location.getBlockZ() + "," + + location.getBlockY() + "," + + location.getPitch() + "," + + location.getYaw(); + } + + + //DESERIALIZE LOCATION + public static Location deserialize(World world, String locationString){ + String[] s = locationString.split(","); + return new Location( + world, + Double.valueOf(s[0]), + Double.valueOf(s[1]), + Double.valueOf(s[2]), + Float.valueOf(s[3]), + Float.valueOf(s[4]) + ); + } +} diff --git a/src/serializers/playerdata.java b/src/serializers/playerdata.java new file mode 100644 index 0000000..73405ab --- /dev/null +++ b/src/serializers/playerdata.java @@ -0,0 +1,39 @@ +package serializers; + +import java.util.Arrays; + +import org.bukkit.entity.Player; + +public class playerdata { + + + //SERIALIZE PLAYERDATA + public static String serialize(Player player){ + StringBuilder result = new StringBuilder(); + result.append("exp:" + player.getExp() + ","); + result.append("health:" + player.getHealth() + ","); + result.append("food:" + player.getFoodLevel() + ","); + result.append("saturation:" + player.getSaturation() + ","); + result.append("exhaustion:" + player.getExhaustion() + ","); + result.append("air:" + player.getRemainingAir() + ","); + result.append("walkspeed:" + player.getWalkSpeed() + ","); + result.append("fireticks:" + player.getFireTicks() + ","); + return result.toString(); + } + + + //SET PLAYERDATA FROM SERIALIZED + public static void setFromSerialized(String dataString, Player player){ + Double.valueOf(null); + Arrays.asList(dataString.split(",")) + .parallelStream() + .forEach(s -> { + String[] e = s.split(":"); + switch(e[0]){ + case "health" : + player.setHealth(Double.valueOf(e[1])); + } + }); + + } +}