diff --git a/pom.xml b/pom.xml index fcdc961..7d2b124 100644 --- a/pom.xml +++ b/pom.xml @@ -55,6 +55,10 @@ + + codemc-releases + https://repo.codemc.io/repository/maven-releases/ + papermc-repo https://papermc.io/repo/repository/maven-public/ @@ -83,6 +87,12 @@ mysql-connector-java 8.0.28 + + xyz.janboerman + GuiLib-Plugin + 1.11.9 + provided + webukkit dynmap diff --git a/src/main/java/moe/oko/opennaw/OpenNAW.java b/src/main/java/moe/oko/opennaw/OpenNAW.java index 7b62ae7..18b7b88 100644 --- a/src/main/java/moe/oko/opennaw/OpenNAW.java +++ b/src/main/java/moe/oko/opennaw/OpenNAW.java @@ -9,6 +9,8 @@ import net.luckperms.api.LuckPerms; import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; +import java.io.File; + import static moe.oko.opennaw.util.CommandHelper.info; public final class OpenNAW extends JavaPlugin { @@ -45,6 +47,11 @@ public final class OpenNAW extends JavaPlugin { public void onEnable() { // Initialize internals instance = this; + if(!new File(getDataFolder().getAbsolutePath() + "/config.yml").exists()) { + saveDefaultConfig(); //Default if non existent. + } else { + saveConfig(); //Save cfg on start + } configHelper = new ConfigHelper(this.getConfig()); this.luckPerms = getServer().getServicesManager().load(LuckPerms.class); actionLogger = new ActionLogger(); diff --git a/src/main/java/moe/oko/opennaw/command/NationCommand.java b/src/main/java/moe/oko/opennaw/command/NationCommand.java index 6a16966..17e6aaa 100644 --- a/src/main/java/moe/oko/opennaw/command/NationCommand.java +++ b/src/main/java/moe/oko/opennaw/command/NationCommand.java @@ -2,6 +2,7 @@ package moe.oko.opennaw.command; import moe.oko.opennaw.OpenNAW; import moe.oko.opennaw.util.CommandHelper; +import moe.oko.opennaw.util.GuiHelper; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; @@ -50,20 +51,12 @@ public class NationCommand implements TabExecutor { sender.sendMessage("Removed nation " + args[1]); } case "join" -> { - var player = args.length < 3 - ? ((Player) sender).getPlayer() - : OpenNAW.getInstance().getServer().getOfflinePlayer(args[2]); - - if (!player.hasPlayedBefore()) { - sender.sendMessage(args[2] + " has never joined the server"); + if(!(sender instanceof Player)) { + sender.sendMessage("This is an in-game command only."); return true; } - - var group = OpenNAW.getInstance().getNationHandler().getNationGroup(args[1]); - OpenNAW.getInstance().getNationHandler().getNationByName(args[1]).getPlayerMap().put(player.getUniqueId(), player); - OpenNAW.getInstance().getGroupHandler().addPlayerToGroup(player, group); - - sender.sendMessage("Added " + player.getName() + " to nation " + args[1]); + var player = (Player) sender; + player.openInventory(GuiHelper.getJoinMenu().getInventory()); } case "leave" -> { var player = args.length < 3 diff --git a/src/main/java/moe/oko/opennaw/model/Nation.java b/src/main/java/moe/oko/opennaw/model/Nation.java index 52363b3..09f24b8 100644 --- a/src/main/java/moe/oko/opennaw/model/Nation.java +++ b/src/main/java/moe/oko/opennaw/model/Nation.java @@ -18,20 +18,24 @@ public class Nation { //The icon used for cities owned by this nation (default is a tower) private String dynmapIcon; + //Should be a color of wool, used for join GUI and flag generation (TODO) + private String colour; public Nation(String name, Group group) { this.name = name; this.group = group; this.players = new HashMap<>(); this.dynmapIcon = "tower"; + this.colour = "WHITE"; this.spawn = null; } //Db Constructor - public Nation(String name, Group group, String dynmapIcon, Location spawn) { + public Nation(String name, Group group, String dynmapIcon, String colour, Location spawn) { this.name = name; this.group = group; this.players = new HashMap<>(); + this.colour = colour; this.dynmapIcon = dynmapIcon; this.spawn = spawn; } @@ -39,6 +43,8 @@ public class Nation { public String getName() { return name; } public Group getGroup() { return group; } public Location getSpawn() { return spawn; } + + public String getColour() { return colour; } public void setSpawn(Location l) { this.spawn = l; } diff --git a/src/main/java/moe/oko/opennaw/storage/NAWDatabase.java b/src/main/java/moe/oko/opennaw/storage/NAWDatabase.java index 78cc788..8823db6 100644 --- a/src/main/java/moe/oko/opennaw/storage/NAWDatabase.java +++ b/src/main/java/moe/oko/opennaw/storage/NAWDatabase.java @@ -24,6 +24,7 @@ public class NAWDatabase { "`nation_name` VARCHAR(50) NOT NULL COMMENT 'Nation name', PRIMARY KEY (`nation_name`)," + "`groupName` VARCHAR(50) NOT NULL COMMENT 'Name for the luckperms group.', " + "`dynmapIcon` VARCHAR(50) NOT NULL COMMENT 'National Icon for Dynmap'," + + "`colour` VARCHAR(50) NOT NULL COMMENT 'Colour for the nation'," + "`spawnworld` VARCHAR(50) NOT NULL," + "`spawnx` INT NOT NULL DEFAULT 0," + "`spawny` INT NOT NULL DEFAULT 0," + @@ -40,11 +41,11 @@ public class NAWDatabase { private final String SELECT_NATION = "SELECT * FROM `nations`;"; private final String SELECT_PLAYERS = "SELECT * FROM `nation_players`;"; - //name 1,8; group 2,9; icon 3,10; world 4,11; x 5,12; y 6,13; z 7,14; + //name 1,8; group 2,9; icon 3,10; colour 4, 11; world 5,12; x 6,13; y 7,14; z 8,15; //14 - private final String SAVE_NATION = "INSERT INTO `nations`(nation_name,groupName,dynmapIcon, spawnworld,spawnx,spawny,spawnz) VALUES " + + private final String SAVE_NATION = "INSERT INTO `nations`(nation_name,groupName,dynmapIcon, colour, spawnworld,spawnx,spawny,spawnz) VALUES " + "(?,?,?,?,?,?,?)" + - "ON DUPLICATE KEY UPDATE nation_name=?, groupName=?, dynmapIcon=?, spawnworld=?, spawnx=?, spawny=?, spawnz=?;"; + "ON DUPLICATE KEY UPDATE nation_name=?, groupName=?, dynmapIcon=?, colour=?, spawnworld=?, spawnx=?, spawny=?, spawnz=?;"; //MAKE SURE YOU RUN AS BATCH (nation, 1,3) (playeruuid, 2,4); private final String SAVE_PLAYER = "INSERT INTO `nation_players`(nation_name, player_uuid) VALUES (?,?) " + "ON DUPLICATE KEY UPDATE nation_name=?, player_uuid=?;"; @@ -114,8 +115,9 @@ public class NAWDatabase { var name = rs.getString(1); var group = OpenNAW.getInstance().getGroupHandler().getGroupFromString(rs.getString(2)); var icon = rs.getString(3); - var location = new Location(Bukkit.getWorld(rs.getString(4)), rs.getInt(5), rs.getInt(6), rs.getInt(7)); - nationLoad.add(new Nation(name, group, icon, location)); + var colour = rs.getString(4); + var location = new Location(Bukkit.getWorld(rs.getString(5)), rs.getInt(6), rs.getInt(7), rs.getInt(8)); + nationLoad.add(new Nation(name, group, icon, colour, location)); i++; } OpenNAW.getInstance().getLogger().info(i + " nations loaded."); @@ -147,7 +149,7 @@ public class NAWDatabase { public void saveNations(Collection nations) { try { OpenNAW.getInstance().getLogger().info("Starting nation save..."); - //name 1,8; group 2,9; icon 3,10; world 4,11; x 5,12; y 6,13; z 7,14; + //name 1,8; group 2,9; icon 3,10; colour 4, 11; world 5,12; x 6,13; y 7,14; z 8,15; //14 PreparedStatement nationSave = connection.prepareStatement(SAVE_NATION); int i = 0; @@ -158,15 +160,17 @@ public class NAWDatabase { nationSave.setString(9, nation.getGroup().getName()); nationSave.setString(3, nation.getDynmapIcon()); nationSave.setString(10, nation.getDynmapIcon()); + nationSave.setString(4, nation.getColour()); + nationSave.setString(11, nation.getColour()); var loc = nation.getSpawn(); - nationSave.setString(4, loc.getWorld().getName()); - nationSave.setString(11, loc.getWorld().getName()); - nationSave.setInt(5, loc.getBlockX()); - nationSave.setInt(12, loc.getBlockX()); - nationSave.setInt(6, loc.getBlockY()); - nationSave.setInt(13, loc.getBlockY()); - nationSave.setInt(7, loc.getBlockZ()); - nationSave.setInt(14, loc.getBlockZ()); + nationSave.setString(5, loc.getWorld().getName()); + nationSave.setString(12, loc.getWorld().getName()); + nationSave.setInt(6, loc.getBlockX()); + nationSave.setInt(13, loc.getBlockX()); + nationSave.setInt(7, loc.getBlockY()); + nationSave.setInt(14, loc.getBlockY()); + nationSave.setInt(8, loc.getBlockZ()); + nationSave.setInt(15, loc.getBlockZ()); //Values are set, this is autistic. Run. nationSave.addBatch(); diff --git a/src/main/java/moe/oko/opennaw/util/ActionLogger.java b/src/main/java/moe/oko/opennaw/util/ActionLogger.java index dce27ab..17fab3b 100644 --- a/src/main/java/moe/oko/opennaw/util/ActionLogger.java +++ b/src/main/java/moe/oko/opennaw/util/ActionLogger.java @@ -18,34 +18,34 @@ public class ActionLogger { } public boolean tryAction(Action action) { - if(action instanceof CityAttackAction) { + if (action instanceof CityAttackAction) { //City attack logic - CityAttackAction CAA = (CityAttackAction) action; - if (actionByUuid.containsKey(CAA.getPlayer().getUniqueId())) { - Action storedAction = actionByUuid.get(CAA.getPlayer().getUniqueId()); - if(actionByUuid.get(CAA.getPlayer().getUniqueId()) instanceof CityAttackAction) { - //Action is already running. - return true; - } else { - actionByUuid.get(CAA.getPlayer().getUniqueId()).setCancelled(true); //Cancel prior action. - actionByUuid.remove(CAA.getPlayer().getUniqueId()); - CAA.getPlayer().getPlayer().sendMessage(ChatColor.YELLOW + "Action switched."); - } - } - actionByUuid.put(CAA.getPlayer().getUniqueId(), action); - CAA.initiation(); //Code to run when action started. - Bukkit.getScheduler().runTaskLater(OpenNAW.getInstance(), () -> { - OpenNAW.getInstance().getLogger().info("Starting Callback..."); - var actionCallback = actionByUuid.get(CAA.getPlayer().getUniqueId()); - if (!actionCallback.isCancelled()) { - OpenNAW.getInstance().getLogger().info("Callback not cancelled!"); - CAA.completion(); - } + CityAttackAction CAA = (CityAttackAction) action; + if (actionByUuid.containsKey(CAA.getPlayer().getUniqueId())) { + Action storedAction = actionByUuid.get(CAA.getPlayer().getUniqueId()); + if (actionByUuid.get(CAA.getPlayer().getUniqueId()) instanceof CityAttackAction) { + //Action is already running. + return true; + } else { + actionByUuid.get(CAA.getPlayer().getUniqueId()).setCancelled(true); //Cancel prior action. actionByUuid.remove(CAA.getPlayer().getUniqueId()); - }, CityAttackAction.DELAY); + CAA.getPlayer().getPlayer().sendMessage(ChatColor.YELLOW + "Action switched."); + } + } + actionByUuid.put(CAA.getPlayer().getUniqueId(), action); + CAA.initiation(); //Code to run when action started. + Bukkit.getScheduler().runTaskLater(OpenNAW.getInstance(), () -> { + OpenNAW.getInstance().getLogger().info("Starting Callback..."); + var actionCallback = actionByUuid.get(CAA.getPlayer().getUniqueId()); + if (!actionCallback.isCancelled()) { + OpenNAW.getInstance().getLogger().info("Callback not cancelled!"); + CAA.completion(); + } + actionByUuid.remove(CAA.getPlayer().getUniqueId()); + }, CityAttackAction.DELAY); CAA.getPlayer().getPlayer().sendMessage(ChatColor.GREEN + "" + ChatColor.ITALIC + "You raise your sword..."); return true; - } else if(action instanceof CityDefenseAction) { + } else if (action instanceof CityDefenseAction) { CityDefenseAction CDA = (CityDefenseAction) action; if (actionByUuid.containsKey(CDA.getPlayer().getUniqueId())) { Action storedAction = actionByUuid.get(CDA.getPlayer().getUniqueId()); diff --git a/src/main/java/moe/oko/opennaw/util/GuiHelper.java b/src/main/java/moe/oko/opennaw/util/GuiHelper.java new file mode 100644 index 0000000..54fb094 --- /dev/null +++ b/src/main/java/moe/oko/opennaw/util/GuiHelper.java @@ -0,0 +1,43 @@ +package moe.oko.opennaw.util; + +import moe.oko.opennaw.OpenNAW; +import net.kyori.adventure.text.Component; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; +import xyz.janboerman.guilib.api.menu.ItemButton; +import xyz.janboerman.guilib.api.menu.MenuHolder; + +public class GuiHelper { + public static MenuHolder getJoinMenu() { + var menu = new MenuHolder<>(OpenNAW.getInstance(), 9, "Join a Nation!"); + + int i = 9; + int s = 0; + for(var nation : OpenNAW.getInstance().getNationHandler().getNationList()) { + var is = new ItemStack(Material.getMaterial(nation.getColour() + "_WOOL")); + is.getItemMeta().displayName(Component.text(ChatColor.valueOf(nation.getColour()) + nation.getName())); + menu.setButton(s, new ItemButton<>(is) { + @Override + public void onClick(MenuHolder menu, InventoryClickEvent event) { + if(event.getClick().equals(ClickType.LEFT)) { + //Left click, run join logic. + var viewer = event.getViewers().get(1); + if(!(viewer instanceof Player)) { return; } //fugged + var player = (Player) viewer; + + nation.getPlayerMap().put(player.getUniqueId(), player); + OpenNAW.getInstance().getGroupHandler().addPlayerToGroup(player, nation.getGroup()); + + player.sendMessage(ChatColor.GREEN + "Joined " + nation.getName() + " successfully."); + event.getView().close(); //Close inv. + } + } + }); + } + return menu; + } +} diff --git a/src/main/java/moe/oko/opennaw/util/NationHandler.java b/src/main/java/moe/oko/opennaw/util/NationHandler.java index 558ccb8..0b49d3b 100644 --- a/src/main/java/moe/oko/opennaw/util/NationHandler.java +++ b/src/main/java/moe/oko/opennaw/util/NationHandler.java @@ -7,10 +7,7 @@ import net.luckperms.api.model.group.Group; import org.bukkit.Bukkit; import org.bukkit.entity.Player; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.UUID; +import java.util.*; public class NationHandler { @@ -68,7 +65,7 @@ public class NationHandler { } } - public List getNationList() { + public List getNationStringList() { List nationList = new ArrayList(); for (Nation nation : nations.values()) { nationList.add(nation.getName()); @@ -76,6 +73,10 @@ public class NationHandler { return nationList; } + public Collection getNationList() { + return nations.values(); + } + public void saveNations() { OpenNAW.getInstance().getDatabase().saveNations(nations.values()); } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 0950e4b..837b7c3 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -4,6 +4,7 @@ main: moe.oko.opennaw.OpenNAW api-version: 1.18 prefix: OpenNAW softdepend: [dynmap] +depend: [GuiLib] authors: [ oko ] description: Open source recreation of Nations at War website: https://oko.moe @@ -14,3 +15,4 @@ commands: city: description: Manages cities usage: / + permission: naw.admin \ No newline at end of file