diff --git a/SpigotCore_Main/src/de/steamwar/comms/BungeeReceiver.java b/SpigotCore_Main/src/de/steamwar/comms/BungeeReceiver.java new file mode 100644 index 0000000..7c1ba11 --- /dev/null +++ b/SpigotCore_Main/src/de/steamwar/comms/BungeeReceiver.java @@ -0,0 +1,67 @@ +/* + This file is a part of the SteamWar software. + + Copyright (C) 2020 SteamWar.de-Serverteam + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +package de.steamwar.comms; + +import com.google.common.io.ByteArrayDataInput; +import com.google.common.io.ByteStreams; +import de.steamwar.comms.handlers.BungeeHandler; +import de.steamwar.comms.handlers.InventoryHandler; +import de.steamwar.sql.SteamwarUser; +import org.bukkit.Bukkit; +import org.bukkit.Sound; +import org.bukkit.SoundCategory; +import org.bukkit.entity.Player; +import org.bukkit.plugin.messaging.PluginMessageListener; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class BungeeReceiver implements PluginMessageListener { + + private static Map handlerMap = new HashMap<>(); + + public static void registerHandler(Byte code, BungeeHandler handler) { + handlerMap.put(code, handler); + } + + static { + registerHandler(PacketIdManager.PING_PACKET, byteArrayDataInput -> { + UUID uuid = SteamwarUser.get(byteArrayDataInput.readInt()).getUUID(); + if(Bukkit.getPlayer(uuid).isOnline()) { + Player player = Bukkit.getPlayer(uuid); + player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.MASTER, 1, 1); + } + + }); + registerHandler(PacketIdManager.INVENTORY_PACKET, new InventoryHandler()); + registerHandler(PacketIdManager.INVENTORY_CLOSE_PACKET, byteArrayDataInput -> { + Player player = Bukkit.getPlayer(SteamwarUser.get(byteArrayDataInput.readInt()).getUUID()); + player.closeInventory(); + }); + } + + @Override + public void onPluginMessageReceived(String s, Player player, byte[] bytes) { + ByteArrayDataInput in = ByteStreams.newDataInput(bytes); + Byte handler = in.readByte(); + handlerMap.get(handler).handle(in); + } +} diff --git a/SpigotCore_Main/src/de/steamwar/comms/PacketIdManager.java b/SpigotCore_Main/src/de/steamwar/comms/PacketIdManager.java new file mode 100644 index 0000000..27dbd81 --- /dev/null +++ b/SpigotCore_Main/src/de/steamwar/comms/PacketIdManager.java @@ -0,0 +1,30 @@ +/* + This file is a part of the SteamWar software. + + Copyright (C) 2020 SteamWar.de-Serverteam + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +package de.steamwar.comms; + +public class PacketIdManager { + + //0x0(X) Standalone Packets + public final static byte PING_PACKET = 0x01; + //0x1(X) Bungee Inventory + public final static byte INVENTORY_PACKET = 0x10; + public final static byte INVENTORY_CALLBACK_PACKET = 0x11; + public final static byte INVENTORY_CLOSE_PACKET = 0x12; +} diff --git a/SpigotCore_Main/src/de/steamwar/comms/handlers/BungeeHandler.java b/SpigotCore_Main/src/de/steamwar/comms/handlers/BungeeHandler.java new file mode 100644 index 0000000..8907fee --- /dev/null +++ b/SpigotCore_Main/src/de/steamwar/comms/handlers/BungeeHandler.java @@ -0,0 +1,27 @@ +/* + This file is a part of the SteamWar software. + + Copyright (C) 2020 SteamWar.de-Serverteam + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +package de.steamwar.comms.handlers; + +import com.google.common.io.ByteArrayDataInput; + +public interface BungeeHandler { + + void handle(ByteArrayDataInput byteArrayDataInput); +} \ No newline at end of file diff --git a/SpigotCore_Main/src/de/steamwar/comms/handlers/InventoryHandler.java b/SpigotCore_Main/src/de/steamwar/comms/handlers/InventoryHandler.java new file mode 100644 index 0000000..433aa86 --- /dev/null +++ b/SpigotCore_Main/src/de/steamwar/comms/handlers/InventoryHandler.java @@ -0,0 +1,56 @@ +/* + This file is a part of the SteamWar software. + + Copyright (C) 2020 SteamWar.de-Serverteam + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +package de.steamwar.comms.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.inventory.SWInventory; +import de.steamwar.inventory.SWItem; +import de.steamwar.sql.SteamwarUser; +import org.bukkit.Bukkit; +import de.steamwar.comms.packets.*; + +import java.util.*; + +public class InventoryHandler implements BungeeHandler { + + @Override + public void handle(ByteArrayDataInput byteArrayDataInput) { + JsonObject object = new JsonParser().parse(byteArrayDataInput.readUTF()).getAsJsonObject(); + UUID player = SteamwarUser.get(object.get("id").getAsInt()).getUUID(); + String title = object.get("title").getAsString(); + int size = object.get("size").getAsInt(); + int length = object.get("itemcount").getAsInt(); + Map items = new HashMap<>(); + JsonArray array = object.get("items").getAsJsonArray(); + for (int i = 0; i < length; i++) { + JsonObject itemJson = array.get(i).getAsJsonObject(); + SWItem item = SWItem.getItemFromJson(itemJson); + item.setCallback(click -> new InventoryCallbackPacket(itemJson, click, player).send(Bukkit.getPlayer(player))); + items.put(itemJson.get("position").getAsInt(), item); + } + + SWInventory inventory = new SWInventory(Bukkit.getPlayer(player), size, title, items); + inventory.addCloseCallback(click -> new InventoryCallbackPacket(player).send(Bukkit.getPlayer(player))); + inventory.open(); + } +} diff --git a/SpigotCore_Main/src/de/steamwar/comms/packets/InventoryCallbackPacket.java b/SpigotCore_Main/src/de/steamwar/comms/packets/InventoryCallbackPacket.java new file mode 100644 index 0000000..6ba1c42 --- /dev/null +++ b/SpigotCore_Main/src/de/steamwar/comms/packets/InventoryCallbackPacket.java @@ -0,0 +1,90 @@ +/* + This file is a part of the SteamWar software. + + Copyright (C) 2020 SteamWar.de-Serverteam + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +package de.steamwar.comms.packets; + +import com.google.common.io.ByteArrayDataOutput; +import com.google.gson.JsonObject; +import de.steamwar.comms.PacketIdManager; +import de.steamwar.sql.SteamwarUser; +import org.bukkit.event.inventory.ClickType; + +import java.util.UUID; + +public class InventoryCallbackPacket extends SpigotPacket { + + int position = -1; + ClickType clickType; + CallbackType callbackType; + int owner; + + @Override + public int getName() { + return PacketIdManager.INVENTORY_CALLBACK_PACKET; + } + + @Override + public void writeVars(ByteArrayDataOutput byteArrayDataOutput) { + byteArrayDataOutput.writeInt(owner); + byteArrayDataOutput.writeUTF(callbackType.name()); + if(position != -1){ + byteArrayDataOutput.writeInt(position); + byteArrayDataOutput.writeUTF(clickType.name()); + } + } + + public InventoryCallbackPacket() {} + + public InventoryCallbackPacket(JsonObject itemJson, ClickType click, UUID player) { + setPosition(itemJson.get("position").getAsInt()); + setClick(click); + setCallback(InventoryCallbackPacket.CallbackType.CLICK); + setOwner(SteamwarUser.get(player).getId()); + } + + public InventoryCallbackPacket(UUID player) { + setCallback(CallbackType.CLOSE); + setOwner(SteamwarUser.get(player).getId()); + } + + public InventoryCallbackPacket setPosition(int position) { + this.position = position; + return this; + } + + public InventoryCallbackPacket setClick(ClickType type){ + this.clickType = type; + return this; + } + + public InventoryCallbackPacket setCallback(CallbackType callback) { + callbackType = callback; + return this; + } + + public InventoryCallbackPacket setOwner(int id) { + this.owner = id; + return this; + } + + public enum CallbackType { + CLICK, + CLOSE, + } +} diff --git a/SpigotCore_Main/src/de/steamwar/comms/packets/SpigotPacket.java b/SpigotCore_Main/src/de/steamwar/comms/packets/SpigotPacket.java new file mode 100644 index 0000000..25b5ecb --- /dev/null +++ b/SpigotCore_Main/src/de/steamwar/comms/packets/SpigotPacket.java @@ -0,0 +1,39 @@ +/* + This file is a part of the SteamWar software. + + Copyright (C) 2020 SteamWar.de-Serverteam + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +package de.steamwar.comms.packets; + +import com.google.common.io.ByteArrayDataOutput; +import com.google.common.io.ByteStreams; +import de.steamwar.core.Core; +import org.bukkit.entity.Player; + +public abstract class SpigotPacket { + + public void send(Player player) { + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + out.writeByte(getName()); + writeVars(out); + player.sendPluginMessage(Core.getInstance(), "sw:bridge", out.toByteArray()); + } + + public abstract int getName(); + + public abstract void writeVars(ByteArrayDataOutput byteArrayDataOutput); +} diff --git a/SpigotCore_Main/src/de/steamwar/core/Core.java b/SpigotCore_Main/src/de/steamwar/core/Core.java index 27d799c..893e53a 100644 --- a/SpigotCore_Main/src/de/steamwar/core/Core.java +++ b/SpigotCore_Main/src/de/steamwar/core/Core.java @@ -19,6 +19,7 @@ package de.steamwar.core; +import de.steamwar.comms.BungeeReceiver; import de.steamwar.core.events.ChattingEvent; import de.steamwar.core.events.ChunkListener; import de.steamwar.core.events.PlayerJoinedEvent; @@ -61,6 +62,9 @@ public class Core extends JavaPlugin{ ChunkListener.init(); if(version >= 12) ErrorLogger.init(); + getServer().getMessenger().registerIncomingPluginChannel(this, "sw:bridge", new BungeeReceiver()); + getServer().getMessenger().registerOutgoingPluginChannel(this, "sw:bridge"); + } @Override diff --git a/SpigotCore_Main/src/de/steamwar/inventory/SWItem.java b/SpigotCore_Main/src/de/steamwar/inventory/SWItem.java index 55aa8aa..d77ffab 100644 --- a/SpigotCore_Main/src/de/steamwar/inventory/SWItem.java +++ b/SpigotCore_Main/src/de/steamwar/inventory/SWItem.java @@ -19,6 +19,8 @@ package de.steamwar.inventory; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; import de.steamwar.core.Core; import org.bukkit.Material; import org.bukkit.OfflinePlayer; @@ -137,6 +139,31 @@ public class SWItem { callback = c; } + public static SWItem getItemFromJson(JsonObject itemJson) { + SWItem item = null; + try { + item = new SWItem(Material.valueOf(itemJson.get("material").getAsString()), itemJson.get("title").getAsString()); + }catch (IllegalArgumentException e) { + item = new SWItem(Material.STONE, itemJson.get("title").getAsString()); + } + if(itemJson.has("skullOwner")) { + item = SWItem.getPlayerSkull(itemJson.get("skullOwner").getAsString()); + item.setName(itemJson.get("title").getAsString()); + } + if(itemJson.has("color")) { + item.getItemStack().setType(SWItem.getDye(itemJson.get("color").getAsInt())); + } + if(itemJson.has("enchanted")) + item.setEnchanted(true); + if(itemJson.has("lore")) { + List lore = new ArrayList<>(); + JsonArray loreArray = itemJson.getAsJsonArray("lore"); + loreArray.forEach(jsonElement -> lore.add(jsonElement.getAsString())); + item.setLore(lore); + } + return item; + } + private void hideAttributes() { if (itemMeta == null) return; itemMeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);