From 37b687b9990bb0e76b139ae62b99997e5dd87517 Mon Sep 17 00:00:00 2001 From: Steev Date: Tue, 10 May 2022 02:17:51 +0200 Subject: [PATCH] initial commit --- .gitignore | 3 + config.yml | 63 ++++++++++ off.txt | 20 +++ plugin.yml | 4 + pom.xml | 34 ++++++ slpnetlobby.iml | 12 ++ src/main/java/de/slpnetwork/lobby/Lobby.java | 91 ++++++++++++++ .../lobby/Manager/InventoryManager.java | 115 ++++++++++++++++++ .../lobby/Manager/LobbyManager.java | 37 ++++++ .../lobby/Manager/PlayerManager.java | 43 +++++++ .../lobby/Manager/ScoreboradManager.java | 4 + .../lobby/Utils/CommandInterpreter.java | 38 ++++++ src/main/resources/items.yml | 7 ++ src/main/resources/menus.yml | 15 +++ todo.md | 30 +++++ 15 files changed, 516 insertions(+) create mode 100644 .gitignore create mode 100644 config.yml create mode 100644 off.txt create mode 100644 plugin.yml create mode 100644 pom.xml create mode 100644 slpnetlobby.iml create mode 100644 src/main/java/de/slpnetwork/lobby/Lobby.java create mode 100644 src/main/java/de/slpnetwork/lobby/Manager/InventoryManager.java create mode 100644 src/main/java/de/slpnetwork/lobby/Manager/LobbyManager.java create mode 100644 src/main/java/de/slpnetwork/lobby/Manager/PlayerManager.java create mode 100644 src/main/java/de/slpnetwork/lobby/Manager/ScoreboradManager.java create mode 100644 src/main/java/de/slpnetwork/lobby/Utils/CommandInterpreter.java create mode 100644 src/main/resources/items.yml create mode 100644 src/main/resources/menus.yml create mode 100644 todo.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3199f0f --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.idea +out +target diff --git a/config.yml b/config.yml new file mode 100644 index 0000000..23b751f --- /dev/null +++ b/config.yml @@ -0,0 +1,63 @@ +menu: + navigator: + title: "Navigator" + material: "COMPASS" + slots: 54 + slot: 4 + permission: slpnet.lobby.navigator + items: + tridentwar: + title: "TridentWar" + material: "TRIDENT" + description: "test\ntest" + slot: 18 + action: + type: "connect" + argument: "tw1" + bedwars: + title: "Bedwars" + material: "RED_BED" + description: "test\ntest" + slot: 20 + action: + type: "connect" + argument: "tw1" + masterbuilders: + title: "Master Builder" + material: "CRAFTING_TABLE" + description: "test\ntest" + slot: 22 + action: + type: "connect" + argument: "tw1" + profile: + title: "Profile" + material: "BOOK" + slot: 2 + slots: 54 + permission: slpnet.lobby.profile + items: + tridentwar: + title: "TridentWar" + material: "TRIDENT" + description: "test\ntest" + slot: 18 + action: + type: "connect" + argument: "tw1" + bedwars: + title: "Bedwars" + material: "RED_BED" + description: "test\ntest" + slot: 20 + action: + type: "connect" + argument: "tw1" + masterbuilders: + title: "Master Builder" + material: "CRAFTING_TABLE" + description: "test\ntest" + slot: 22 + action: + type: "connect" + argument: "tw1" \ No newline at end of file diff --git a/off.txt b/off.txt new file mode 100644 index 0000000..139e88f --- /dev/null +++ b/off.txt @@ -0,0 +1,20 @@ + Inventory inv = inventories.get(this.lobbyManager.getLobby().config.getString(key + ".title")); + + // Nullpointer debugging + System.out.println(key + "0"); + if(this.lobbyManager.getLobby().config.get("menu." + key + ".items") == null) System.out.println("Error: no items have been set, Menu will not be created"); // fixes nullpointer + if(this.lobbyManager.getLobby().config.get("menu." + key + ".items") == null) return; // fixes nullpointer + + for(String keyItem : this.lobbyManager.getLobby().config.getConfigurationSection("menu." + key + ".items").getKeys(true)) { + if(this.lobbyManager.getLobby().config.get("menu." + key + ".items") == null) System.out.println("Error: no items have been set, Menu will not be created"); // fixes nullpointer + if(this.lobbyManager.getLobby().config.get("menu." + key + ".items") == null) return; // fixes nullpointer + // Error: material from config results null though it shouldn't + System.out.println(this.lobbyManager.getLobby().config.getString("menu."+key+".items."+keyItem+".material") + "1"); + System.out.println(keyItem + "2"); + inv.setItem(this.lobbyManager.getLobby().config.getInt("menu." + key + ".items." + keyItem + ".slot"), + createGuiItem(Material.getMaterial(this.lobbyManager.getLobby().config.getString("menu." + key + ".items." + keyItem + ".material")), + this.lobbyManager.getLobby().config.getString("menu." + key + ".items." + keyItem + ".title"), + this.lobbyManager.getLobby().config.getString("menu." + key + ".items." + keyItem + ".description") + ) + ); + } \ No newline at end of file diff --git a/plugin.yml b/plugin.yml new file mode 100644 index 0000000..cab9cfb --- /dev/null +++ b/plugin.yml @@ -0,0 +1,4 @@ +name: Lobby +main: de.slpnetwork.lobby.Lobby +version: 0.1 +api-version: 1.18 \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..7a6c752 --- /dev/null +++ b/pom.xml @@ -0,0 +1,34 @@ + + + 4.0.0 + + de.slpnetwork.lobby + slpnetlobby + 1.0 + + + 17 + 17 + + + + + + spigot-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + + + + + org.spigotmc + spigot-api + 1.18.2-R0.1-SNAPSHOT + provided + + + + \ No newline at end of file diff --git a/slpnetlobby.iml b/slpnetlobby.iml new file mode 100644 index 0000000..fa63d4b --- /dev/null +++ b/slpnetlobby.iml @@ -0,0 +1,12 @@ + + + + + + + SPIGOT + + + + + \ No newline at end of file diff --git a/src/main/java/de/slpnetwork/lobby/Lobby.java b/src/main/java/de/slpnetwork/lobby/Lobby.java new file mode 100644 index 0000000..513506e --- /dev/null +++ b/src/main/java/de/slpnetwork/lobby/Lobby.java @@ -0,0 +1,91 @@ +package de.slpnetwork.lobby; + +import de.slpnetwork.lobby.Manager.InventoryManager; +import de.slpnetwork.lobby.Manager.LobbyManager; +import org.bukkit.Material; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.plugin.messaging.PluginMessageListener; + +import java.io.File; + +public class Lobby extends JavaPlugin implements Listener, PluginMessageListener { + public LobbyManager lobbyManager; + public FileConfiguration config; + public File itemData; + public FileConfiguration itemDataConfig; + public File menuData; + public FileConfiguration menuDataConfig; + + + @Override + public void onEnable(){ + super.onEnable(); + this.getServer().getLogger().info("Initializing Configs"); + try { + this.saveDefaultConfig(); + config = this.getConfig(); + itemData = new File(this.getDataFolder(), "items.yml"); + itemDataConfig = YamlConfiguration.loadConfiguration(itemData); + menuData = new File(this.getDataFolder(), "menu.yml"); + menuDataConfig = YamlConfiguration.loadConfiguration(menuData); + }catch (Exception ex) { + + } + + this.lobbyManager = new LobbyManager(this); + this.getServer().getPluginManager().registerEvents(this, this); + this.getServer().getPluginManager().registerEvents(new InventoryManager(this.lobbyManager), this); + this.getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord"); + this.getServer().getMessenger().registerIncomingPluginChannel(this, "BungeeCord", this); + } + + @Override + public void onDisable(){ + super.onDisable(); + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent e) { + e.getPlayer().getInventory().clear(); + + // TODO: loop over itemdataconfig(items) + for (String key: this.config.getConfigurationSection("menu").getKeys(false)) { + // TODO: replace current datapoints with new ones + ItemStack is = new ItemStack(Material.getMaterial(this.config.getString("menu." + key + ".material"))); + ItemMeta im = is.getItemMeta(); + im.setDisplayName(this.config.getString("menu." + key + ".title")); + im.addItemFlags(); + is.setItemMeta(im); + e.getPlayer().getInventory().setItem(this.config.getInt("menu." + key + ".slot"), is); + } + } + + @EventHandler + public void onPlayerUse(PlayerInteractEvent e) { + // Error: somewhere on the way of triggering + // The menu does not get opened + try { + Player p = e.getPlayer(); + // TODO: Replace current datapoints with new ones + // TODO: Grab menu Datapoint based on Material Type + this.lobbyManager.getInventoryManager().openInventory(p, p.getInventory().getItemInMainHand().getItemMeta().getDisplayName()); + } catch (Exception ex) { + // possibly nullpointer nothing else can happen here + } + } + + @Override + public void onPluginMessageReceived(String channel, Player player, byte[] bytes) { + if (!channel.equals("BungeeCord")) { return; } + } +} diff --git a/src/main/java/de/slpnetwork/lobby/Manager/InventoryManager.java b/src/main/java/de/slpnetwork/lobby/Manager/InventoryManager.java new file mode 100644 index 0000000..66995ea --- /dev/null +++ b/src/main/java/de/slpnetwork/lobby/Manager/InventoryManager.java @@ -0,0 +1,115 @@ +package de.slpnetwork.lobby.Manager; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.HumanEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryDragEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.Arrays; +import java.util.HashMap; + +public class InventoryManager implements Listener { + private final LobbyManager lobbyManager; + private HashMap inventories; + + public InventoryManager(LobbyManager lobbyManager){ + this.lobbyManager = lobbyManager; + this.lobbyManager.getLobby().getServer().getLogger().info("Initializing Lobby"); + this.lobbyManager.setInventoryManager(this); + this.inventories = new HashMap(); + + // TODO: replace default config with menudataconfig and iterate over its menu datapoint + for(String key: this.lobbyManager.getLobby().config.getConfigurationSection("menu").getKeys(false)) { + // TODO: replace current datapoints with new ones + this.inventories.put( + this.lobbyManager.getLobby().config.getString("menu." + key + ".title"), Bukkit.createInventory(null, + this.lobbyManager.getLobby().config.getInt("menu." + key + ".slots"), + this.lobbyManager.getLobby().config.getString("menu." + key + ".title") + ) + ); + System.out.println(this.inventories.size() + " inventories stored"); // debugging inventories not beeing generated + initializeItems(key); + } + } + + void initializeItems(String key){ + Inventory inv = inventories.get(this.lobbyManager.getLobby().config.getString("menu." + key + ".title")); + + // Nullpointer debugging + System.out.println(key + "0"); + if(this.lobbyManager.getLobby().config.get("menu." + key) == null) System.out.println("Error: no items have been set, Menu will not be created"); // fixes nullpointer + if(this.lobbyManager.getLobby().config.get("menu." + key) == null) return; // fixes nullpointer + + for(String keyItem : this.lobbyManager.getLobby().config.getConfigurationSection("menu." + key + ".items").getKeys(false)) { + System.out.println("debug-> " + keyItem); + System.out.println(this.lobbyManager.getLobby().config.getString("menu."+key+".items."+keyItem+".material") + "1"); + + inv.setItem(this.lobbyManager.getLobby().config.getInt("menu." + key + ".items." + keyItem + ".slot"), + createGuiItem(Material.getMaterial(this.lobbyManager.getLobby().config.getString("menu." + key + ".items." + keyItem + ".material")), + this.lobbyManager.getLobby().config.getString("menu." + key + ".items." + keyItem + ".title"), + this.lobbyManager.getLobby().config.getString("menu." + key + ".items." + keyItem + ".description") + ) + ); + } + } + + protected ItemStack createGuiItem(final Material material, final String name, final String... lore) { + final ItemStack item = new ItemStack(material, 1); + final ItemMeta meta = item.getItemMeta(); + + // Set the name of the item + meta.setDisplayName(name); + + // Set the lore of the item + meta.setLore(Arrays.asList(lore)); + + item.setItemMeta(meta); + + return item; + } + + // You can open the inventory with this + public void openInventory(final HumanEntity ent, String Inventory) { + System.out.println(Inventory); + System.out.println(inventories.containsKey(Inventory)); + if(inventories.containsKey(Inventory)) { + ent.openInventory(inventories.get(Inventory)); + } + } + + // Check for clicks on items + @EventHandler + public void onInventoryClick(final InventoryClickEvent e) { + if(!inventories.containsValue(e.getInventory())) return; + + e.setCancelled(true); + + final ItemStack clickedItem = e.getCurrentItem(); + this.lobbyManager.getLobby().getServer().getLogger().info(clickedItem.toString()); + + // verify current item is not null + if (clickedItem == null || clickedItem.getType().isAir()) return; + + final Player p = (Player) e.getWhoClicked(); + this.lobbyManager.getCommandInterpreter().execute(p.getPlayer(), + this.lobbyManager.getLobby().config.getString("menu." + e.getView().getTitle().toLowerCase()+ ".items."+ clickedItem.getItemMeta().getDisplayName().toLowerCase() + ".action.type"), + this.lobbyManager.getLobby().config.getString("menu." + e.getView().getTitle().toLowerCase()+ ".items."+ clickedItem.getItemMeta().getDisplayName().toLowerCase() + ".action.argument")); + // Using slots click is a best option for your inventory click's + p.sendMessage("You clicked at slot " + e.getRawSlot()); + } + + // Cancel dragging in our inventory + @EventHandler + public void onInventoryClick(final InventoryDragEvent e) { + if (inventories.containsValue(e.getInventory())) { + e.setCancelled(true); + } + } +} diff --git a/src/main/java/de/slpnetwork/lobby/Manager/LobbyManager.java b/src/main/java/de/slpnetwork/lobby/Manager/LobbyManager.java new file mode 100644 index 0000000..dc37a82 --- /dev/null +++ b/src/main/java/de/slpnetwork/lobby/Manager/LobbyManager.java @@ -0,0 +1,37 @@ +package de.slpnetwork.lobby.Manager; + +import de.slpnetwork.lobby.Lobby; +import de.slpnetwork.lobby.Utils.CommandInterpreter; + +public class LobbyManager { + private Lobby lobby; + private InventoryManager inventoryManager; + private CommandInterpreter commandInterpreter; + private PlayerManager playerManager; + + public LobbyManager(Lobby lobby) { + this.lobby = lobby; + this.commandInterpreter = new CommandInterpreter(this); + this.playerManager = new PlayerManager(this); + } + + public Lobby getLobby() { + return lobby; + } + + public InventoryManager getInventoryManager() { + return inventoryManager; + } + + public CommandInterpreter getCommandInterpreter() { + return commandInterpreter; + } + + public PlayerManager getPlayerManager() { + return playerManager; + } + + public void setInventoryManager(InventoryManager inventoryManager) { + this.inventoryManager = inventoryManager; + } +} diff --git a/src/main/java/de/slpnetwork/lobby/Manager/PlayerManager.java b/src/main/java/de/slpnetwork/lobby/Manager/PlayerManager.java new file mode 100644 index 0000000..d4bebc8 --- /dev/null +++ b/src/main/java/de/slpnetwork/lobby/Manager/PlayerManager.java @@ -0,0 +1,43 @@ +package de.slpnetwork.lobby.Manager; + +import com.google.common.io.ByteArrayDataOutput; +import com.google.common.io.ByteStreams; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +public class PlayerManager { + private LobbyManager lobbyManager; + + public PlayerManager(LobbyManager lobbyManager) { + this.lobbyManager = lobbyManager; + } + + public void giveItems(Player player){ + player.getInventory().addItem(new ItemStack(Material.BOOK)); + player.getInventory().addItem(new ItemStack(Material.COMPASS)); + player.getInventory().addItem(new ItemStack(Material.PLAYER_HEAD)); + } + + /** + * teleports a player to a location + * @param player the wanted player + * @param loc the wanted location + */ + public void teleportPlayer(Player player, Location loc) { + player.teleport(loc); + } + + /** + * Moves a player from a server to another + * @param dest the destination + * @param target the player to send + */ + public void moveFromServer(String dest, Player target) { + ByteArrayDataOutput aOut = ByteStreams.newDataOutput(); + aOut.writeUTF("Connect"); + aOut.writeUTF(dest); + target.sendPluginMessage(this.lobbyManager.getLobby(), "BungeeCord", aOut.toByteArray()); + } +} diff --git a/src/main/java/de/slpnetwork/lobby/Manager/ScoreboradManager.java b/src/main/java/de/slpnetwork/lobby/Manager/ScoreboradManager.java new file mode 100644 index 0000000..f8c31e8 --- /dev/null +++ b/src/main/java/de/slpnetwork/lobby/Manager/ScoreboradManager.java @@ -0,0 +1,4 @@ +package de.slpnetwork.lobby.Manager; + +public class ScoreboradManager { +} diff --git a/src/main/java/de/slpnetwork/lobby/Utils/CommandInterpreter.java b/src/main/java/de/slpnetwork/lobby/Utils/CommandInterpreter.java new file mode 100644 index 0000000..bbcc22c --- /dev/null +++ b/src/main/java/de/slpnetwork/lobby/Utils/CommandInterpreter.java @@ -0,0 +1,38 @@ +package de.slpnetwork.lobby.Utils; + +import de.slpnetwork.lobby.Manager.LobbyManager; +import org.bukkit.entity.Player; + +import java.util.Objects; + +public class CommandInterpreter { + private LobbyManager lobbyManager; + public CommandInterpreter(LobbyManager lobbyManager) { + this.lobbyManager = lobbyManager; + } + + /** + * Executes configured action + * @param executor User who performed the Action + * @param action the action to perform + * @param args aditional arguments + */ + public void execute(Player executor, String action, String args){ + switch (action.toLowerCase()) { + default: + this.lobbyManager.getLobby().getServer().getLogger().warning("The Action: '" + action + "' is not defined"); + break; + case "menu": + // opens menu + this.lobbyManager.getInventoryManager().openInventory(executor, args); + break; + case "teleport": + break; + case "connect": + this.lobbyManager.getPlayerManager().moveFromServer(args, Objects.requireNonNull(executor.getPlayer())); + break; + case "execute": + break; + } + } +} diff --git a/src/main/resources/items.yml b/src/main/resources/items.yml new file mode 100644 index 0000000..6889a7d --- /dev/null +++ b/src/main/resources/items.yml @@ -0,0 +1,7 @@ +items: + COMPASS: + menu: "navigator" + display: "Navigator" + slot: 4 + material: "COMPASS" + permission: "lobby.item.navigator" \ No newline at end of file diff --git a/src/main/resources/menus.yml b/src/main/resources/menus.yml new file mode 100644 index 0000000..b05eb75 --- /dev/null +++ b/src/main/resources/menus.yml @@ -0,0 +1,15 @@ +navigator: + title: "Navigator" + identifier: "navigator" + slots: 54 + slot: 4 + permission: slpnet.lobby.navigator + items: + tridentwar: + title: "TridentWar" + material: "TRIDENT" + description: "test\ntest" + slot: 18 + action: + type: "connect" + argument: "tw1" \ No newline at end of file diff --git a/todo.md b/todo.md new file mode 100644 index 0000000..e083a26 --- /dev/null +++ b/todo.md @@ -0,0 +1,30 @@ +# first target +- [X] Plugin Stabillity +- [X] Debuggin: items properly handed on Join [In Progress] +- [ ] command interpreter + - [ ] Player prefix + - [ ] Connection Prefix + - [ ] Teleportation Prefix + - [ ] Comamnd Execution Prefix + - [ ] open prefix + - Opens a specified new inventory and closes the old one + - [ ] prefix chainig (eg. execute prefix + player prefix) +- [ ] Inventory Layering +# secondary +- [ ] Scoreboard Support +- [ ] Motd Message Suport +- [ ] Custom Bossbar support +- [ ] Scheduled Message Support +- [ ] Custom event based Title Support +- [ ] Firework Support +- [ ] Sound Support +- [ ] Updatable Items in Inventory + - [ ] Items change on events (eg. settings toggle) +- [ ] User Settings + - [ ] Players will be shown + - [ ] Toggle Referal Program + - [ ] Languages + - [ ] fly + - [ ] Doublejump +- [ ] User Refereal Program +- [ ] Documentation \ No newline at end of file