diff --git a/SpigotCore_Main/src/de/steamwar/coms/receiver/PacketHandler.java b/SpigotCore_Main/src/de/steamwar/coms/receiver/PacketHandler.java index dd01da8..1f04ad5 100644 --- a/SpigotCore_Main/src/de/steamwar/coms/receiver/PacketHandler.java +++ b/SpigotCore_Main/src/de/steamwar/coms/receiver/PacketHandler.java @@ -2,6 +2,8 @@ package de.steamwar.coms.receiver; import com.google.common.io.ByteArrayDataInput; import com.google.common.io.ByteStreams; +import de.steamwar.coms.receiver.handlers.CloseInventoryHandler; +import de.steamwar.coms.receiver.handlers.InventoryHandler; import de.steamwar.coms.receiver.handlers.PingHandler; import org.bukkit.entity.Player; import org.bukkit.plugin.messaging.PluginMessageListener; @@ -19,6 +21,8 @@ public class PacketHandler implements PluginMessageListener { static { registerHandler(new PingHandler()); + registerHandler(new InventoryHandler()); + registerHandler(new CloseInventoryHandler()); } @Override diff --git a/SpigotCore_Main/src/de/steamwar/coms/receiver/handlers/CloseInventoryHandler.java b/SpigotCore_Main/src/de/steamwar/coms/receiver/handlers/CloseInventoryHandler.java new file mode 100644 index 0000000..7843a24 --- /dev/null +++ b/SpigotCore_Main/src/de/steamwar/coms/receiver/handlers/CloseInventoryHandler.java @@ -0,0 +1,21 @@ +package de.steamwar.coms.receiver.handlers; + +import com.google.common.io.ByteArrayDataInput; +import de.steamwar.coms.receiver.Handler; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.util.UUID; + +public class CloseInventoryHandler extends Handler { + @Override + protected String getName() { + return "InvClose"; + } + + @Override + public void handle(ByteArrayDataInput byteArrayDataInput) { + Player player = Bukkit.getPlayer(UUID.fromString(byteArrayDataInput.readUTF())); + player.closeInventory(); + } +} diff --git a/SpigotCore_Main/src/de/steamwar/coms/receiver/handlers/InventoryHandler.java b/SpigotCore_Main/src/de/steamwar/coms/receiver/handlers/InventoryHandler.java index 346be0e..3eeb8e8 100644 --- a/SpigotCore_Main/src/de/steamwar/coms/receiver/handlers/InventoryHandler.java +++ b/SpigotCore_Main/src/de/steamwar/coms/receiver/handlers/InventoryHandler.java @@ -1,6 +1,7 @@ package de.steamwar.coms.receiver.handlers; import com.google.common.io.ByteArrayDataInput; +import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import de.steamwar.coms.receiver.Handler; @@ -14,8 +15,6 @@ import java.util.*; public class InventoryHandler extends Handler { - private static HashMap callbacks = new HashMap<>(); - @Override protected String getName() { return "Inventory"; @@ -23,13 +22,12 @@ public class InventoryHandler extends Handler { @Override public void handle(ByteArrayDataInput byteArrayDataInput) { - String name = byteArrayDataInput.readUTF(); String player = byteArrayDataInput.readUTF(); String title = byteArrayDataInput.readUTF(); int size = byteArrayDataInput.readInt(); - int lenght = byteArrayDataInput.readInt(); + int length = byteArrayDataInput.readInt(); Map items = new HashMap<>(); - for (int i = 0; i < lenght; i++) { + for (int i = 0; i < length; i++) { JsonObject object = new JsonParser().parse(byteArrayDataInput.readUTF()).getAsJsonObject(); SWItem item = new SWItem(Material.valueOf(object.get("material").getAsString()), object.get("title").getAsString()); if(object.has("skullOwner")) { @@ -40,14 +38,25 @@ public class InventoryHandler extends Handler { item.setEnchanted(true); if(object.has("hideAttributes")) item.hideAttributes(); + if(object.has("lore")) { + List lore = new ArrayList<>(); + JsonArray array = object.getAsJsonArray("lore"); + array.forEach(jsonElement -> lore.add(jsonElement.getAsString())); + item.setLore(lore); + } SWItem finalItem = item; item.setCallback(click -> { - new InventoryCallbackPacket().setItem(finalItem).setPosition(object.get("position").getAsInt()).setTitle(title).send(); + new InventoryCallbackPacket().setItem(finalItem).setClick(click) + .setPosition(object.get("position").getAsInt()) + .setCallback(InventoryCallbackPacket.CallbackType.CLICK) + .setOwner(player).send(Bukkit.getPlayer(UUID.fromString(player))); }); items.put(object.get("position").getAsInt(), item); } - SWInventory inventory = new SWInventory(Bukkit.getPlayer(UUID.fromString(player)), size, title,items); + SWInventory inventory = new SWInventory(Bukkit.getPlayer(UUID.fromString(player)), size, title, items); + inventory.addCloseCallback(click -> new InventoryCallbackPacket() + .setCallback(InventoryCallbackPacket.CallbackType.CLOSE).setOwner(player).send(Bukkit.getPlayer(UUID.fromString(player)))); inventory.open(); } } diff --git a/SpigotCore_Main/src/de/steamwar/coms/sender/Packet.java b/SpigotCore_Main/src/de/steamwar/coms/sender/Packet.java index fa75de1..f3c56d0 100644 --- a/SpigotCore_Main/src/de/steamwar/coms/sender/Packet.java +++ b/SpigotCore_Main/src/de/steamwar/coms/sender/Packet.java @@ -1,18 +1,17 @@ package de.steamwar.coms.sender; -import de.steamwar.coms.sender.PacketSender; +import com.google.common.io.ByteArrayDataOutput; +import org.bukkit.entity.Player; -import java.io.IOException; -import java.io.ObjectOutputStream; import java.io.Serializable; public abstract class Packet implements Serializable { - public void send() { - PacketSender.sendPacket(this); + public void send(Player player) { + PacketSender.sendPacket(this, player); } public abstract String getName(); - public abstract void writeVars(ObjectOutputStream objectOutputStream) throws IOException; + public abstract void writeVars(ByteArrayDataOutput byteArrayDataOutput); } diff --git a/SpigotCore_Main/src/de/steamwar/coms/sender/PacketSender.java b/SpigotCore_Main/src/de/steamwar/coms/sender/PacketSender.java index d2b75c8..5a78040 100644 --- a/SpigotCore_Main/src/de/steamwar/coms/sender/PacketSender.java +++ b/SpigotCore_Main/src/de/steamwar/coms/sender/PacketSender.java @@ -3,27 +3,14 @@ package de.steamwar.coms.sender; import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; import de.steamwar.core.Core; -import org.bukkit.Bukkit; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectOutputStream; -import java.util.stream.Collectors; +import org.bukkit.entity.Player; public class PacketSender { - public static void sendPacket(Packet packet) { - try { - ByteArrayDataOutput out = ByteStreams.newDataOutput(); - out.writeUTF(packet.getName()); - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream); - packet.writeVars(objectOutputStream); - objectOutputStream.flush(); - out.writeUTF(outputStream.toByteArray().toString()); - Bukkit.getOnlinePlayers().stream().limit(1).collect(Collectors.toList()).get(0).sendPluginMessage(Core.getInstance(), "sw:bridge", out.toByteArray()); - } catch (IOException e) { - e.printStackTrace(); - } + public static void sendPacket(Packet packet, Player player) { + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + out.writeUTF(packet.getName()); + packet.writeVars(out); + player.sendPluginMessage(Core.getInstance(), "sw:return", out.toByteArray()); } } \ No newline at end of file diff --git a/SpigotCore_Main/src/de/steamwar/coms/sender/packets/InventoryCallbackPacket.java b/SpigotCore_Main/src/de/steamwar/coms/sender/packets/InventoryCallbackPacket.java index 698f535..97aa2bc 100644 --- a/SpigotCore_Main/src/de/steamwar/coms/sender/packets/InventoryCallbackPacket.java +++ b/SpigotCore_Main/src/de/steamwar/coms/sender/packets/InventoryCallbackPacket.java @@ -1,15 +1,17 @@ package de.steamwar.coms.sender.packets; +import com.google.common.io.ByteArrayDataOutput; import de.steamwar.coms.sender.Packet; import de.steamwar.inventory.SWItem; - -import java.io.ObjectOutputStream; +import org.bukkit.event.inventory.ClickType; public class InventoryCallbackPacket extends Packet { - String title; int position; SWItem item; + ClickType clickType; + CallbackType callbackType; + String owner; @Override public String getName() { @@ -17,13 +19,13 @@ public class InventoryCallbackPacket extends Packet { } @Override - public void writeVars(ObjectOutputStream objectOutputStream) { - - } - - public InventoryCallbackPacket setTitle(String title) { - this.title = title; - return this; + public void writeVars(ByteArrayDataOutput byteArrayDataOutput) { + byteArrayDataOutput.writeUTF(owner); + byteArrayDataOutput.writeUTF(callbackType.name()); + if(item != null){ + byteArrayDataOutput.writeUTF(item.parseToJson(position)); + byteArrayDataOutput.writeUTF(clickType.name()); + } } public InventoryCallbackPacket setPosition(int position) { @@ -35,4 +37,24 @@ public class InventoryCallbackPacket extends Packet { this.item = item; return this; } + + public InventoryCallbackPacket setClick(ClickType type){ + this.clickType = type; + return this; + } + + public InventoryCallbackPacket setCallback(CallbackType callback) { + callbackType = callback; + return this; + } + + public InventoryCallbackPacket setOwner(String uuid) { + this.owner = uuid; + return this; + } + + public enum CallbackType { + CLICK, + CLOSE, + } } diff --git a/SpigotCore_Main/src/de/steamwar/core/Core.java b/SpigotCore_Main/src/de/steamwar/core/Core.java index 9412be6..cf2b126 100644 --- a/SpigotCore_Main/src/de/steamwar/core/Core.java +++ b/SpigotCore_Main/src/de/steamwar/core/Core.java @@ -62,8 +62,8 @@ public class Core extends JavaPlugin{ ChunkListener.init(); if(version >= 12) ErrorLogger.init(); - getServer().getMessenger().registerIncomingPluginChannel( this, "sw:bridge", new PacketHandler()); - getServer().getMessenger().registerOutgoingPluginChannel( this, "sw:bridge" ); + getServer().getMessenger().registerIncomingPluginChannel(this, "sw:bridge", new PacketHandler()); + getServer().getMessenger().registerOutgoingPluginChannel(this, "sw:return"); } diff --git a/SpigotCore_Main/src/de/steamwar/inventory/SWItem.java b/SpigotCore_Main/src/de/steamwar/inventory/SWItem.java index c241792..250d71e 100644 --- a/SpigotCore_Main/src/de/steamwar/inventory/SWItem.java +++ b/SpigotCore_Main/src/de/steamwar/inventory/SWItem.java @@ -205,7 +205,7 @@ public class SWItem { object.addProperty("enchanted", true); if(itemMeta.hasItemFlag(ItemFlag.HIDE_ENCHANTS)) object.addProperty("hideAttributes", true); - if(!itemMeta.getLore().isEmpty()) { + if(itemMeta.getLore() != null) { JsonArray array = new JsonArray(); for (String lores: itemMeta.getLore()) { @@ -214,6 +214,6 @@ public class SWItem { object.add("lore", array); } - return object.getAsString(); + return object.toString(); } }