Packet System + Bungee GUI #111
@ -20,7 +20,6 @@
|
||||
package de.steamwar.bungeecore;
|
||||
|
||||
import de.steamwar.bungeecore.commands.*;
|
||||
import de.steamwar.bungeecore.comms.handlers.InventoryCallbackHandler;
|
||||
import de.steamwar.bungeecore.comms.SpigotReceiver;
|
||||
import de.steamwar.bungeecore.listeners.*;
|
||||
import de.steamwar.bungeecore.listeners.mods.Fabric;
|
||||
@ -41,7 +40,6 @@ import net.md_5.bungee.api.plugin.Plugin;
|
||||
import net.md_5.bungee.config.Configuration;
|
||||
import net.md_5.bungee.config.ConfigurationProvider;
|
||||
import net.md_5.bungee.config.YamlConfiguration;
|
||||
import org.yaml.snakeyaml.error.YAMLException;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import java.io.IOException;
|
||||
|
@ -20,8 +20,8 @@
|
||||
package de.steamwar.bungeecore.commands;
|
||||
|
||||
import de.steamwar.bungeecore.*;
|
||||
import de.steamwar.bungeecore.comms.packets.inventory.SWInventory;
|
||||
import de.steamwar.bungeecore.comms.packets.inventory.SWItem;
|
||||
import de.steamwar.bungeecore.inventory.SWInventory;
|
||||
import de.steamwar.bungeecore.inventory.SWItem;
|
||||
import de.steamwar.bungeecore.sql.BauweltMember;
|
||||
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||
import net.md_5.bungee.api.ProxyServer;
|
||||
@ -228,11 +228,11 @@ public class BauCommand {
|
||||
}
|
||||
|
||||
private static void delete(ProxiedPlayer p, String[] command){
|
||||
SWInventory inventory = new SWInventory(p, 9, "§eDelete Confirm");
|
||||
inventory.addItem(1, new SWItem(1, "§cDecline", 1), click -> {
|
||||
SWInventory inventory = new SWInventory(p, 9, "§e/Bau delete Bestätigen");
|
||||
Lixfel
hat
"Wirklich Welt löschen?" fände ich besser. "Wirklich Welt löschen?" fände ich besser.
|
||||
inventory.addItem(0, new SWItem(0, "§cAbbrechen", 1), click -> {
|
||||
Lixfel
hat
Noch sind wir nicht multilingual, und den Knopf "Abbrechen" bitte auf Position 9 packen, dass Abbrechen ganz rechts ist, und "Löschen" links ist. Noch sind wir nicht multilingual, und den Knopf "Abbrechen" bitte auf Position 9 packen, dass Abbrechen ganz rechts ist, und "Löschen" links ist.
Lixfel
hat
Bitte Abbrechen auf Position 8 und Löschen auf Position 1 (Das eine möchtest du machen, das andere ist optional). Löschen sollte grün sein und abbrechen rot oder alternativ Löschen rot und Abbrechen hellgrau. (Weiß nicht die Farbcodes auswendig, ob die so passend sind. Bitte Abbrechen auf Position 8 und Löschen auf Position 1 (Das eine möchtest du machen, das andere ist optional). Löschen sollte grün sein und abbrechen rot oder alternativ Löschen rot und Abbrechen hellgrau. (Weiß nicht die Farbcodes auswendig, ob die so passend sind.
|
||||
inventory.close();
|
||||
});
|
||||
inventory.addItem(7, new SWItem(7, "§aAccept", 10), click -> {
|
||||
inventory.addItem(8, new SWItem(8, "§aLöchen", 10), click -> {
|
||||
if(bau15(p, command, 2)){
|
||||
BungeeCore.send(p, BungeeCore.CHAT_PREFIX + "§aDeine Welt wird zurückgesetzt.");
|
||||
ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> {
|
||||
|
@ -30,7 +30,7 @@ public abstract class BungeePacket {
|
||||
|
||||
public void send(Server server) {
|
||||
ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
||||
out.writeInt(getId());
|
||||
out.writeByte(getId());
|
||||
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||
writeVars(out);
|
||||
out.writeUTF(outputStream.toByteArray().toString());
|
||||
@ -38,12 +38,7 @@ public abstract class BungeePacket {
|
||||
}
|
||||
|
||||
public void send(ProxiedPlayer player) {
|
||||
ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
||||
out.writeInt(getId());
|
||||
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||
writeVars(out);
|
||||
out.writeUTF(outputStream.toByteArray().toString());
|
||||
player.getServer().sendData("sw:bridge", out.toByteArray());
|
||||
send(player.getServer());
|
||||
}
|
||||
|
||||
public abstract int getId();
|
||||
|
11
src/de/steamwar/bungeecore/comms/PacketIdManager.java
Normale Datei
@ -0,0 +1,11 @@
|
||||
package de.steamwar.bungeecore.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;
|
||||
}
|
@ -31,26 +31,25 @@ import java.util.Map;
|
||||
|
||||
public class SpigotReceiver extends BasicListener {
|
||||
|
||||
private static final Map<Integer, SpigotHandler> handlerMap = new HashMap<>();
|
||||
private static final Map<Byte, SpigotHandler> handlerMap = new HashMap<>();
|
||||
|
||||
@EventHandler
|
||||
public void onPluginMessage(PluginMessageEvent event) {
|
||||
if(!event.getTag().equalsIgnoreCase("sw:bridge"))
|
||||
return;
|
||||
if(!event.getSender().getAddress().getHostName().equals("localhost"))
|
||||
return;
|
||||
ByteArrayDataInput in = ByteStreams.newDataInput(event.getData());
|
||||
int handler = in.readInt();
|
||||
Byte handler = in.readByte();
|
||||
handlerMap.get(handler).handle(in);
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
public static void registerHandler(int id, SpigotHandler handler) {
|
||||
public static void registerHandler(Byte id, SpigotHandler handler) {
|
||||
handlerMap.put(id, handler);
|
||||
}
|
||||
Lixfel
hat
Ich weiß nicht, ob ich die HashCode-Variante so viel besser finde, da könnte es zu Kollisionen kommt. Was spricht denn dagegen, jedem Pakettyp von Hand eine Zahl zuzuordnen? Ich weiß nicht, ob ich die HashCode-Variante so viel besser finde, da könnte es zu Kollisionen kommt. Was spricht denn dagegen, jedem Pakettyp von Hand eine Zahl zuzuordnen?
|
||||
|
||||
public static void registerHandler(String name, SpigotHandler handler) {
|
||||
handlerMap.put(name.hashCode(), handler);
|
||||
}
|
||||
|
||||
static {
|
||||
registerHandler("InventoryCallback", new InventoryCallbackHandler());
|
||||
registerHandler(PacketIdManager.INVENTORY_CALLBACK_PACKET, new InventoryCallbackHandler());
|
||||
}
|
||||
}
|
||||
|
@ -21,8 +21,8 @@ package de.steamwar.bungeecore.comms.handlers;
|
||||
|
||||
import com.google.common.io.ByteArrayDataInput;
|
||||
import de.steamwar.bungeecore.comms.SpigotHandler;
|
||||
import de.steamwar.bungeecore.comms.packets.inventory.InvCallback;
|
||||
import de.steamwar.bungeecore.comms.packets.inventory.SWInventory;
|
||||
import de.steamwar.bungeecore.inventory.InvCallback;
|
||||
import de.steamwar.bungeecore.inventory.SWInventory;
|
||||
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||
|
||||
import java.util.HashMap;
|
||||
@ -41,7 +41,11 @@ public class InventoryCallbackHandler implements SpigotHandler {
|
||||
InvCallback.ClickType clickType = InvCallback.ClickType.valueOf(byteArrayDataInput.readUTF());
|
||||
inventoryHashMap.get(owner.getId()).handleCallback(clickType, pos);
|
||||
}else if(type == CallbackType.CLOSE) {
|
||||
inventoryHashMap.get(owner.getId()).handleClose();
|
||||
if(inventoryHashMap.get(owner.getId()).isNext()) {
|
||||
inventoryHashMap.get(owner.getId()).handleClose();
|
||||
return;
|
||||
}
|
||||
inventoryHashMap.get(owner.getId()).setNext(true);
|
||||
Lixfel
hat
Was macht denn dieses Next? Was macht denn dieses Next?
Chaoscaot
hat
Dies ist weil aus irgendwelchen gründen beim öffnen des Inventares ein Close Packet geschiekt wird und mir das meine Hashmap zerhaut. Deshalb dieser flag, dass das Inventar erst beim zweiten aus der Map entfernt wird. Dies ist weil aus irgendwelchen gründen beim öffnen des Inventares ein Close Packet geschiekt wird und mir das meine Hashmap zerhaut. Deshalb dieser flag, dass das Inventar erst beim zweiten aus der Map entfernt wird.
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -21,25 +21,25 @@ package de.steamwar.bungeecore.comms.packets;
|
||||
|
||||
import com.google.common.io.ByteArrayDataOutput;
|
||||
import de.steamwar.bungeecore.comms.BungeePacket;
|
||||
import de.steamwar.bungeecore.comms.PacketIdManager;
|
||||
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||
|
||||
public class CloseInventoryPacket extends BungeePacket {
|
||||
|
||||
ProxiedPlayer player;
|
||||
final ProxiedPlayer player;
|
||||
|
||||
@Override
|
||||
public int getId() {
|
||||
return "CloseInventory".hashCode();
|
||||
return PacketIdManager.INVENTORY_CLOSE_PACKET;
|
||||
}
|
||||
|
||||
public CloseInventoryPacket(ProxiedPlayer player) {
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeVars(ByteArrayDataOutput byteArrayDataOutput) {
|
||||
byteArrayDataOutput.writeInt(SteamwarUser.get(player).getId());
|
||||
}
|
||||
|
||||
public CloseInventoryPacket setPlayer(ProxiedPlayer player) {
|
||||
this.player = player;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
@ -22,7 +22,8 @@ package de.steamwar.bungeecore.comms.packets;
|
||||
import com.google.common.io.ByteArrayDataOutput;
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonObject;
|
||||
import de.steamwar.bungeecore.comms.packets.inventory.SWItem;
|
||||
import de.steamwar.bungeecore.comms.PacketIdManager;
|
||||
import de.steamwar.bungeecore.inventory.SWItem;
|
||||
import de.steamwar.bungeecore.comms.BungeePacket;
|
||||
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||
@ -31,10 +32,10 @@ import java.util.HashMap;
|
||||
|
||||
public class InventoryPacket extends BungeePacket {
|
||||
|
||||
String title;
|
||||
int player;
|
||||
int size;
|
||||
HashMap<Integer, SWItem> items;
|
||||
final String title;
|
||||
final int player;
|
||||
Lixfel
hat
Die Drei Attribute könnten final sein. Die Drei Attribute könnten final sein.
|
||||
final int size;
|
||||
final HashMap<Integer, SWItem> items;
|
||||
|
||||
public InventoryPacket(int size, String title, ProxiedPlayer player) {
|
||||
Lixfel
hat
Wäre es nicht ggf. schlauer, das InventoryPacket mit einem SWInventory zu initialisieren, dann hättest du alle Parameter, auch die items für das senden und müsstest da nicht eine neue HashMap füllen. Wäre es nicht ggf. schlauer, das InventoryPacket mit einem SWInventory zu initialisieren, dann hättest du alle Parameter, auch die items für das senden und müsstest da nicht eine neue HashMap füllen.
|
||||
items = new HashMap<>();
|
||||
@ -45,7 +46,7 @@ public class InventoryPacket extends BungeePacket {
|
||||
|
||||
@Override
|
||||
public int getId() {
|
||||
return "InventoryHandler".hashCode();
|
||||
return PacketIdManager.INVENTORY_PACKET;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -21,23 +21,23 @@ package de.steamwar.bungeecore.comms.packets;
|
||||
|
||||
import com.google.common.io.ByteArrayDataOutput;
|
||||
import de.steamwar.bungeecore.comms.BungeePacket;
|
||||
import de.steamwar.bungeecore.comms.PacketIdManager;
|
||||
|
||||
public class PingPacket extends BungeePacket {
|
||||
|
||||
int id;
|
||||
final int id;
|
||||
|
||||
@Override
|
||||
public int getId() {
|
||||
return "PingHandler".hashCode();
|
||||
return PacketIdManager.PING_PACKET;
|
||||
}
|
||||
|
||||
public PingPacket(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeVars(ByteArrayDataOutput byteArrayDataOutput) {
|
||||
byteArrayDataOutput.writeInt(id);
|
||||
}
|
||||
|
||||
public PingPacket setUser(int id) {
|
||||
this.id = id;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
@ -17,7 +17,7 @@
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bungeecore.comms.packets.inventory;
|
||||
package de.steamwar.bungeecore.inventory;
|
||||
|
||||
public interface InvCallback {
|
||||
|
@ -17,7 +17,7 @@
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bungeecore.comms.packets.inventory;
|
||||
package de.steamwar.bungeecore.inventory;
|
||||
|
||||
import de.steamwar.bungeecore.comms.handlers.InventoryCallbackHandler;
|
||||
import de.steamwar.bungeecore.comms.packets.CloseInventoryPacket;
|
||||
@ -35,6 +35,7 @@ public class SWInventory {
|
||||
private ProxiedPlayer player;
|
||||
private int size;
|
||||
private String title;
|
||||
private boolean next;
|
||||
|
||||
public SWInventory(ProxiedPlayer proxiedPlayer, int size, String title) {
|
||||
itemMap = new HashMap<>();
|
||||
@ -42,6 +43,7 @@ public class SWInventory {
|
||||
this.player = proxiedPlayer;
|
||||
this.size = size;
|
||||
this.title = title;
|
||||
next = false;
|
||||
}
|
||||
|
||||
public void addItem(SWItem item) {
|
||||
@ -86,11 +88,20 @@ public class SWInventory {
|
||||
itemMap.get(pos).setCallback(callback);
|
||||
}
|
||||
|
||||
public void setNext(boolean next) {
|
||||
this.next = next;
|
||||
}
|
||||
|
||||
public boolean isNext() {
|
||||
return next;
|
||||
}
|
||||
|
||||
public void handleCallback(InvCallback.ClickType type, int pos) {
|
||||
itemMap.get(pos).getCallback().clicked(type);
|
||||
}
|
||||
|
||||
public void handleClose() {
|
||||
InventoryCallbackHandler.inventoryHashMap.remove(SteamwarUser.get(player).getId(), this);
|
||||
if(close != null)
|
||||
close.clicked(null);
|
||||
}
|
||||
@ -104,6 +115,6 @@ public class SWInventory {
|
||||
}
|
||||
|
||||
public void close() {
|
||||
new CloseInventoryPacket().setPlayer(player).send(player);
|
||||
new CloseInventoryPacket(player).send(player);
|
||||
}
|
||||
}
|
@ -17,7 +17,7 @@
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bungeecore.comms.packets.inventory;
|
||||
package de.steamwar.bungeecore.inventory;
|
||||
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonObject;
|
@ -17,7 +17,7 @@
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bungeecore.comms.packets.inventory;
|
||||
package de.steamwar.bungeecore.inventory;
|
||||
|
||||
import de.steamwar.bungeecore.sql.Schematic;
|
||||
import de.steamwar.bungeecore.sql.SchematicType;
|
@ -189,7 +189,7 @@ public class ChatListener extends BasicListener {
|
||||
for (String curr : msgSplits) {
|
||||
if(curr.equalsIgnoreCase("@" + target.getName())) {
|
||||
builder.append("§e@").append(target.getName()).append(chatcolor).append(" ");
|
||||
new PingPacket().setUser(SteamwarUser.get(target).getId()).send(target);
|
||||
new PingPacket(SteamwarUser.get(target).getId()).send(target);
|
||||
}else {
|
||||
builder.append(curr).append(" ");
|
||||
}
|
||||
|
@ -126,7 +126,7 @@ public class Schematic {
|
||||
|
||||
public String getSchemItem() {
|
||||
Lixfel
hat
Das Item sollte man direkt in der Schematic mit abspeichern (es wird ja auch glaube ich mit SELECTed, zumindest in der Selection, die du hinzugefügt hast). Ansonsten steigert das die Anzahl der SQL-Requests doch erheblich. Also bitte in Schematic.item hinzufügen. Das Item sollte man direkt in der Schematic mit abspeichern (es wird ja auch glaube ich mit SELECTed, zumindest in der Selection, die du hinzugefügt hast). Ansonsten steigert das die Anzahl der SQL-Requests doch erheblich. Also bitte in Schematic.item hinzufügen.
|
||||
try {
|
||||
ResultSet set = SQL.select("SELECT Item WHERE SchemID = ? AND SchemOwner = ?", schemID, schemOwner);
|
||||
ResultSet set = SQL.select("SELECT Item WHERE SchemID = ?", schemID);
|
||||
Lixfel
hat
SchemID reicht, SchemOwner ist unnötig SchemID reicht, SchemOwner ist unnötig
|
||||
return set.getString("Item");
|
||||
} catch (SQLException throwables) {
|
||||
return "CAULDRON_ITEM";
|
||||
Lixfel
hat
Wenn hier eine Exception auftritt, solltest du die Exception loggen und nicht mit der normalen Codeexecution fortfahren (SecurityException werfen) Wenn hier eine Exception auftritt, solltest du die Exception loggen und nicht mit der normalen Codeexecution fortfahren (SecurityException werfen)
|
||||
|
Woher kommen die neuen Imports? Ich sehe keine Codestelle, die diese Imports neuerdings benötigt :)