diff --git a/SchematicSystem_Core/src/de/steamwar/schematicsystem/CheckSchemType.java b/SchematicSystem_Core/src/de/steamwar/schematicsystem/CheckSchemType.java index f3c3a01..6a929a3 100644 --- a/SchematicSystem_Core/src/de/steamwar/schematicsystem/CheckSchemType.java +++ b/SchematicSystem_Core/src/de/steamwar/schematicsystem/CheckSchemType.java @@ -23,7 +23,7 @@ import com.sk89q.worldedit.extent.clipboard.Clipboard; import de.steamwar.core.Core; import de.steamwar.core.VersionDependent; import de.steamwar.sql.NoClipboardException; -import de.steamwar.sql.Schematic; +import de.steamwar.sql.SchematicNode; import de.steamwar.sql.SchematicType; import org.bukkit.Bukkit; import org.bukkit.configuration.ConfigurationSection; @@ -88,7 +88,7 @@ public class CheckSchemType { return types.get(type); } - public AutoCheckResult autoCheck(Schematic schematic) { + public AutoCheckResult autoCheck(SchematicNode schematic) { AutoCheckResult result = new AutoCheckResult(this); Clipboard clipboard; try { diff --git a/SchematicSystem_Core/src/de/steamwar/schematicsystem/SchematicSystem.java b/SchematicSystem_Core/src/de/steamwar/schematicsystem/SchematicSystem.java index 935e9e5..de7ec61 100644 --- a/SchematicSystem_Core/src/de/steamwar/schematicsystem/SchematicSystem.java +++ b/SchematicSystem_Core/src/de/steamwar/schematicsystem/SchematicSystem.java @@ -31,7 +31,7 @@ public class SchematicSystem extends JavaPlugin { public void onEnable() { instance = this; - getCommand("schem").setExecutor(new SchematicCommand()); + new SchematicCommand(); } public static SchematicSystem getInstance() { diff --git a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/GUI.java b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/GUI.java index c9bf36e..d3c96ab 100644 --- a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/GUI.java +++ b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/GUI.java @@ -19,11 +19,7 @@ package de.steamwar.schematicsystem.commands; -import com.google.common.collect.Lists; -import de.steamwar.inventory.SWAnvilInv; -import de.steamwar.inventory.SWInventory; -import de.steamwar.inventory.SWItem; -import de.steamwar.inventory.SWListInv; +import de.steamwar.inventory.*; import de.steamwar.schematicsystem.SchematicSystem; import de.steamwar.sql.*; import org.bukkit.Material; @@ -32,10 +28,122 @@ import org.bukkit.event.inventory.ClickType; import java.util.*; -class GUI { - private GUI(){} +import static de.steamwar.schematicsystem.commands.SchematicCommandUtils.*; - static void changeType(Player p, Schematic schem){ +public class GUI { + private GUI() {} + + public static void list(Player player) { + SchematicSelector selector = new SchematicSelector(player, SchematicSelector.selectSchematic(), new SchematicSelectorInjectable() { + @Override + public String createTitle(Player player) { + return "Schematics {1}"; + } + + @Override + public void onListRender(SchematicSelector selector, SWListInv inv, SchematicNode parent) { + if(parent == null) { + inv.setItem(49, Material.AIR, "", clickType -> {}); + } else { + inv.setItem(49, Material.ANVIL, "§7Ordnereigenschaften", clickType -> { + info(selector.getPlayer(), parent); + }); + } + } + }, node -> info(player, node)); + selector.setSingleDirOpen(false); + selector.open(); + } + + private static void info(Player player, SchematicNode node) { + SteamwarUser user = getUser(player); + SWInventory inv = new SWInventory(player, 9, node.generateBreadcrumbs(user)); + if(!node.isDir()) { + inv.setItem(0, SWItem.getMaterial("WOOD_AXE"), "§eLaden", click -> { + player.closeInventory(); + SchematicCommandUtils.loadSchem(player, node); + }); + } + + if(node.getOwner() == user.getId()){ + if(!node.isDir() && node.getSchemtype().writeable()){ + List checkedSchematics = CheckedSchematic.getLastDeclined(player.getUniqueId()); + ListIterator i = checkedSchematics.listIterator(checkedSchematics.size()); + while(i.hasPrevious()) { + CheckedSchematic checkedSchematic = i.previous(); + if(checkedSchematic.getNode() == node.getId()) { + inv.setItem(1, SWItem.getDye(10), (byte) 10, "§eStatus " + node.getSchemtype().name(), Collections.singletonList("§7" + checkedSchematic.getDeclineReason()), false, click -> {}); + break; + } + } + } + Material mat = SWItem.getMaterial(node.getItem()); + + inv.setItem(2, mat, "§e" + mat.name(), Arrays.asList("§7Zum Ändern", "§7anklicken"), false, click -> { + player.closeInventory(); + changeItem(player, node); + }); + if(!node.isDir()) { + inv.setItem(3, SWItem.getMaterial("CAULDRON_ITEM"), "§e" + node.getSchemtype().name(), Arrays.asList("§7Zum Ändern", "§7anklicken"), false, click -> { + player.closeInventory(); + changeType(player, node); + }); + inv.setItem(4, SWItem.getMaterial("MAGENTA_GLAZED_TERRACOTTA"), "§eDownload", click -> { + player.closeInventory(); + SchematicCommandUtils.download(player, node); + }); + } + SWItem skull = SWItem.getPlayerSkull("MHF_STEVE"); + skull.setCallback(click -> { + player.closeInventory(); + delmembers(player, node); + }); + skull.setName("§eMitglieder"); + inv.setItem(5, skull); + inv.setItem(6, Material.ARROW, "§eVerschieben", clickType -> { + SchematicSelector selector = new SchematicSelector(player, SchematicSelector.selectDirectory(), npar -> { + node.setParent(npar==null?null:npar.getId()); + info(player, SchematicNode.getSchematicNode(node.getId())); + }); + selector.open(); + }); + Material finalMat = mat; + inv.setItem(7, Material.NAME_TAG, "§eUmbenennen", clickType -> { + SWAnvilInv anvilInv = new SWAnvilInv(player, node.getName() + " umbenennen", node.getName()); + anvilInv.setItem(finalMat); + anvilInv.setCallback(s -> { + if (!invalidSchemName(player, new String[]{s})) { + node.setName(s); + } + info(player, node); + }); + anvilInv.open(); + }); + inv.setItem(8, SWItem.getDye(1), (byte) 1, "§cLöschen", click -> { + player.closeInventory(); + delete(player, node); + }); + }else{ + if(!node.isDir()) { + inv.setItem(4, SWItem.getMaterial("CAULDRON_ITEM"), "§e" + node.getSchemtype().name(), click -> {}); + } + + SteamwarUser owneruser = SteamwarUser.get(node.getOwner()); + SWItem skull = SWItem.getPlayerSkull(owneruser.getUserName()); + skull.setName("§7von §e" + owneruser.getUserName()); + inv.setItem(6, skull.getItemStack(), clickType -> {}); + + inv.setItem(8, SWItem.getDye(1), (byte) 1, "§cZugriff entfernen", click -> { + player.closeInventory(); + delete(player, node); + }); + } + + inv.setCallback(-999, click -> player.closeInventory()); + inv.open(); + } + + static void changeType(Player p, SchematicNode schem){ List> types = new LinkedList<>(); for(SchematicType type : SchematicType.values()){ if(!type.isAssignable()) @@ -49,18 +157,20 @@ class GUI { } SWListInv inv = new SWListInv<>(p, "Typ ändern", types, (clickType, schematicType) -> { - SchematicCommand.changetype(p, schem, schematicType); + p.closeInventory(); + SchematicCommandUtils.changeType(p, schem, schematicType, null); }); inv.setCallback(-999, (ClickType click) -> p.closeInventory()); inv.open(); } - private static void deleteOwn(Player p, Schematic schem){ - SWInventory inv = new SWInventory(p, 9, schem.getSchemName() + " löschen"); + private static void deleteOwn(Player p, SchematicNode schem){ + SteamwarUser user = getUser(p); + SWInventory inv = new SWInventory(p, 9, schem.generateBreadcrumbs(user) + " löschen"); inv.setItem(0, SWItem.getDye(1), (byte) 1, "§eLöschen", click -> { - schem.remove(); + schem.delete(); - p.sendMessage(SchematicSystem.PREFIX + "Schematic §e" + schem.getSchemName() + " §7gelöscht"); + p.sendMessage(SchematicSystem.PREFIX + "Schematic §e" + schem.generateBreadcrumbs(user) + " §7gelöscht"); p.closeInventory(); }); inv.setItem(8, SWItem.getDye(14), (byte) 14, "§cAbbruch", click -> p.closeInventory()); @@ -68,13 +178,14 @@ class GUI { inv.open(); } - private static void deleteMembership(Player p, Schematic schem){ - SWInventory inv = new SWInventory(p, 9, schem.getSchemName() + " entfernen"); + private static void deleteMembership(Player p, SchematicNode schem){ + SteamwarUser user = getUser(p); + SWInventory inv = new SWInventory(p, 9, schem.generateBreadcrumbs(user) + " entfernen"); inv.setItem(0, SWItem.getDye(1), (byte) 1, "§eZugriff entfernen", click -> { - SchematicMember member = SchematicMember.getSchemMemberFromDB(schem.getSchemName(), schem.getSchemOwner(), SteamwarUser.get(p.getUniqueId()).getId()); + NodeMember member = NodeMember.getNodeMember(schem.getId(), user.getId()); if(member != null) - member.remove(); - p.sendMessage(SchematicSystem.PREFIX + "Zugriff zu Schematic §e" + schem.getSchemName() + " §7entfernt"); + member.delete(); + p.sendMessage(SchematicSystem.PREFIX + "Zugriff zu Schematic §e" + schem.generateBreadcrumbs(user) + " §7entfernt"); p.closeInventory(); }); inv.setItem(8, SWItem.getDye(14), (byte) 14, "§cAbbruch", click -> p.closeInventory()); @@ -82,22 +193,22 @@ class GUI { inv.open(); } - static void delete(Player p, Schematic schem){ - if(SteamwarUser.get(p.getUniqueId()).getId() == schem.getSchemOwner()) + static void delete(Player p, SchematicNode schem){ + if(SteamwarUser.get(p.getUniqueId()).getId() == schem.getOwner()) deleteOwn(p, schem); else deleteMembership(p, schem); } - static void delmembers(Player p, Schematic schem){ - List> members = new LinkedList<>(); - for(SchematicMember member : SchematicMember.getSchemMembers(schem.getSchemName(), schem.getSchemOwner())){ + static void delmembers(Player p, SchematicNode schem){ + List> members = new LinkedList<>(); + for(NodeMember member : schem.getMembers()){ SteamwarUser user = SteamwarUser.get(member.getMember()); members.add(new SWListInv.SWListEntry<>(SWItem.getPlayerSkull(user.getUserName()), member)); } - SWListInv inv = new SWListInv<>(p, "Mitglieder entfernen", members, (clickType, member) -> { - member.remove(); + SWListInv inv = new SWListInv<>(p, "Mitglieder entfernen", members, (clickType, member) -> { + member.delete(); p.closeInventory(); delmembers(p, schem); }); @@ -105,128 +216,11 @@ class GUI { inv.open(); } - private static void changeItem(Player p, Schematic schem){ - List> materials = new LinkedList<>(); - for(Material material : Material.values()){ - if(material.name().startsWith("LEGACY_")) - continue; - SWItem item = new SWItem(material, "§7" + material.name()); - if(item.getItemMeta() != null && material.isItem()) - materials.add(new SWListInv.SWListEntry<>(item, material)); - } - - SWListInv inv = new SWListInv<>(p, "Item ändern", materials, (clickType, material) -> { + private static void changeItem(Player p, SchematicNode schem){ + UtilGui.openMaterialSelector(p, "Item ändern", material -> { schem.setItem(material.name()); p.closeInventory(); info(p, schem); }); - inv.setCallback(-999, (ClickType click) -> p.closeInventory()); - inv.open(); - } - - private static void info(Player p, Schematic schem){ - SWInventory inv = new SWInventory(p, 9, schem.getSchemName()); - if(schem.availible()) - inv.setItem(0, SWItem.getMaterial("WOOD_AXE"), "§eLaden", click -> { - SchematicCommand.load(p, schem); - p.closeInventory(); - }); - - if(schem.getSchemOwner() == SteamwarUser.get(p.getUniqueId()).getId()){ - if(schem.getSchemType().writeable()){ - List checkedSchematics = CheckedSchematic.getLastDeclined(p.getUniqueId()); - ListIterator i = checkedSchematics.listIterator(checkedSchematics.size()); - while(i.hasPrevious()) { - CheckedSchematic checkedSchematic = i.previous(); - if(checkedSchematic.getSchemName().equals(schem.getSchemName()) && - checkedSchematic.getSchemOwner() == schem.getSchemOwner()) { - inv.setItem(1, SWItem.getDye(10), (byte) 10, "§eStatus " + schem.getSchemType().name(), Collections.singletonList("§7" + checkedSchematic.getDeclineReason()), false, click -> {}); - break; - } - } - } - Material mat = SWItem.getMaterial("CAULDRON_ITEM"); - if(schem.getItem() != null && !schem.getItem().equals("")) - mat = SWItem.getMaterial(schem.getItem()); - - inv.setItem(2, mat, "§e" + mat.name(), Arrays.asList("§7Zum Ändern", "§7anklicken"), false, click -> { - p.closeInventory(); - changeItem(p, schem); - }); - if(schem.availible()) - inv.setItem(4, SWItem.getMaterial("CAULDRON_ITEM"), "§e" + schem.getSchemType().name(), Arrays.asList("§7Zum Ändern", "§7anklicken"), false, click -> { - p.closeInventory(); - changeType(p, schem); - }); - inv.setItem(5, SWItem.getMaterial("MAGENTA_GLAZED_TERRACOTTA"), "§eDownload", click -> { - p.closeInventory(); - SchematicCommand.download(p, schem); - }); - SWItem skull = SWItem.getPlayerSkull("MHF_STEVE"); - skull.setCallback(click -> { - p.closeInventory(); - delmembers(p, schem); - }); - skull.setName("§eMitglieder"); - inv.setItem(6, skull); - inv.setItem(8, SWItem.getDye(1), (byte) 1, "§cLöschen", click -> { - p.closeInventory(); - delete(p, schem); - }); - }else{ - inv.setItem(4, SWItem.getMaterial("CAULDRON_ITEM"), "§e" + schem.getSchemType().name(), click -> {}); - - SteamwarUser owneruser = SteamwarUser.get(schem.getSchemOwner()); - SWItem skull = SWItem.getPlayerSkull(owneruser.getUserName()); - skull.setName("§7von §e" + owneruser.getUserName()); - inv.setItem(6, skull); - - inv.setItem(8, SWItem.getDye(1), (byte) 1, "§cZugriff entfernen", click -> { - p.closeInventory(); - delete(p, schem); - }); - } - - inv.setCallback(-999, click -> p.closeInventory()); - inv.open(); - } - - static void list(Player p){ - list(p, Schematic.getSchemsAccessibleByUser(SteamwarUser.get(p.getUniqueId()).getId()), false); - } - - private static void list(Player p, List schems, boolean publics){ - List> schemList = new ArrayList<>(); - - for(Schematic schem : schems) { - Material m; - if (schem.getItem().isEmpty()) - m = SWItem.getMaterial("CAULDRON_ITEM"); - else - m = SWItem.getMaterial(schem.getItem()); - - SWItem item = new SWItem(m, "§e" + schem.getSchemName(), Collections.singletonList("§7" + schem.getSchemType().name()), !schem.getSchemType().writeable(), click -> {}); - if(schem.getRank() > 0) - item.setLore(Lists.newArrayList("§7" + schem.getSchemType().name(), "§8Rang " + schem.getRank())); - schemList.add(new SWListInv.SWListEntry<>(item, schem)); - } - - SWListInv inv = new SWListInv<>(p, "§eSchematicliste", false, schemList, (clickType, schem) -> info(p, schem)); - if(publics) - inv.setItem(48, Material.BUCKET, "§7Eigene Schematics", clickType -> list(p)); - else - inv.setItem(48, Material.GLASS, "§7Public Schematics", clickType -> list(p, Schematic.getSchemsAccessibleByUser(0), true)); - inv.setItem(50, Material.NAME_TAG, "§7Suche", clickType -> search(p, schems)); - inv.open(); - } - - static void search(Player p, List schems){ - SWAnvilInv inv = new SWAnvilInv(p, "§7Schematicsuche"); - inv.setCallback(term -> { - ArrayList schemCopy = new ArrayList<>(schems); - schemCopy.removeIf(schem -> !schem.getSchemName().toLowerCase().contains(term.toLowerCase())); - list(p, schemCopy, false); - }); - inv.open(); } } diff --git a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommand.java b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommand.java index 1760e60..ae6db12 100644 --- a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommand.java +++ b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommand.java @@ -1,6 +1,6 @@ -/* +/* 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 @@ -19,11 +19,10 @@ package de.steamwar.schematicsystem.commands; -import de.steamwar.comms.packets.PrepareSchemPacket; -import de.steamwar.inventory.SWInventory; -import de.steamwar.inventory.SWItem; -import de.steamwar.schematicsystem.AutoCheckResult; -import de.steamwar.schematicsystem.CheckSchemType; +import de.steamwar.command.SWCommand; +import de.steamwar.command.TypeMapper; +import de.steamwar.inventory.SWAnvilInv; +import de.steamwar.inventory.SchematicSelector; import de.steamwar.schematicsystem.SchematicSystem; import de.steamwar.sql.*; import net.md_5.bungee.api.ChatColor; @@ -32,539 +31,590 @@ import net.md_5.bungee.api.chat.ComponentBuilder; import net.md_5.bungee.api.chat.HoverEvent; import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.Bukkit; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; +import org.bukkit.Material; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import java.util.*; import java.util.logging.Level; +import java.util.stream.Collectors; -public class SchematicCommand implements CommandExecutor { +import static de.steamwar.schematicsystem.commands.SchematicCommandHelp.*; +import static de.steamwar.schematicsystem.commands.SchematicCommandUtils.*; - private static final int FILES_PER_PAGE = 15; +public class SchematicCommand extends SWCommand { - @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - if(!(sender instanceof Player)) - return false; - Player player = (Player) sender; - - if(args.length == 0){ - help(player); - return false; - } - - switch(args[0].toLowerCase()){ - case "gui": - GUI.list(player); - break; - case "list": - list(player, args); - break; - case "load": - load(player, args); - break; - case "delete": - delete(player, args); - break; - case "save": - save(player, args); - break; - case "info": - info(player, args); - break; - case "changetype": - changetype(player, args); - break; - case "addmember": - addmember(player, args); - break; - case "delmember": - delmember(player, args); - break; - case "download": - download(player, args); - break; - case "search": - search(player, args); - break; - default: - help(player); - } - return false; + public SchematicCommand() { + super("schematic", "/schematic", "schem", "/schem"); } - private void list(Player player, String[] args){ - if(args.length <= 1){ - sendPlayerSchematicList(0, player, "/schem list ", Schematic.getSchemsAccessibleByUser(SteamwarUser.get(player.getUniqueId()).getId())); - return; - } + @Register(help = true) + @Register("help") + public void genericHelp(Player player, String... args) { + printHelpMainPage(player); + } - if("public".equalsIgnoreCase(args[1])){ - if(args.length == 2){ - sendPlayerSchematicList(0, player, "/schem list public ", Schematic.getSchemsAccessibleByUser(0)); - return; + @Register("help") + public void pagedHelp(Player player, HelpPage page) { + printHelpPage(player, page); + } + + @Register("gui") + public void gui(Player player) { + GUI.list(player); + } + + @Register("list") + @Register({"list", "/"}) + public void schemList(Player player) { + renderSchemlist(player, SchematicNode.getSchematicsAccessibleByUser(getUser(player).getId(), 0), 0, "", false, null); + } + + @Register("list") + @Register({"list", "/"}) + public void schemList(Player player, int page) { + renderSchemlist(player, SchematicNode.getSchematicsAccessibleByUser(getUser(player).getId(), 0), page, "", false, null); + } + + @Register({"list", "public"}) + public void schemListPublic(Player player, @Mapper("publicDirMapper") SchematicNode node) { + schemList(player, node); + } + + @Register({"list", "public"}) + public void schemListPublic(Player player, @Mapper("publicDirMapper") SchematicNode node, int page) { + schemList(player, node, page); + } + + @Register({"list", "public"}) + @Register({"list", "public", "/"}) + public void schemListPublic(Player player) { + renderSchemlist(player, SchematicNode.getSchematicsAccessibleByUser(0, 0), 0, "", true, null); + } + + @Register({"list", "public"}) + @Register({"list", "public", "/"}) + public void schemListPublic(Player player, int page) { + renderSchemlist(player, SchematicNode.getSchematicsAccessibleByUser(0, 0), page, "", true, null); + } + + + @Register({"info", "public"}) + public void schemInfoPublic(Player player, @Mapper("publicMapper") SchematicNode node) { + schemInfo(player, node); + } + + @Register("list") + public void schemList(Player player, @Mapper("dirMapper") SchematicNode node) { + SteamwarUser user = getUser(player); + if (!node.isDir()) { + player.sendMessage(SchematicSystem.PREFIX + "Das ist eine Schematic und kein Ordner"); + } else { + renderSchemlist(player, SchematicNode.getSchematicNodeInNode(node), 0, node.generateBreadcrumbs(user), node.getOwner() == 0, node); + } + } + + @Register("list") + public void schemList(Player player, @Mapper("dirMapper") SchematicNode node, int page) { + SteamwarUser user = getUser(player); + if (!node.isDir()) { + player.sendMessage(SchematicSystem.PREFIX + "Das ist eine Schematic und kein Ordner"); + } else { + renderSchemlist(player, SchematicNode.getSchematicNodeInNode(node), page, node.generateBreadcrumbs(user), node.getOwner() == 0, node); + } + } + + @Register({"l", "public"}) + @Register({"load", "public"}) + public void loadSchemPublic(Player player, @Mapper("publicMapper") SchematicNode node) { + loadSchem(player, node); + } + + @Register("info") + public void schemInfo(Player player, SchematicNode node) { + printSchemInfo(player, node); + } + + @Register("l") + @Register("load") + public void loadSchem(Player player, SchematicNode node) { + SchematicCommandUtils.loadSchem(player, node); + } + + @Register("save") + @Register("s") + public void saveSchem(Player player) { + SchematicSelector selector = new SchematicSelector(player, SchematicSelector.selectSchematicNode(), schematicNode -> { + SteamwarUser user = SteamwarUser.get(player.getUniqueId()); + if(schematicNode.isDir()) { + SWAnvilInv anvilInv = new SWAnvilInv(player, "Namen eingeben"); + anvilInv.setCallback(s -> saveSchem(player, schematicNode.generateBreadcrumbs(user) + s)); + anvilInv.setItem(Material.CAULDRON); + anvilInv.open(); + } else { + saveSchem(player, schematicNode.generateBreadcrumbs(user)); } - - try { - sendPlayerSchematicList(Integer.parseInt(args[2]), player, "/schem list public ", Schematic.getSchemsAccessibleByUser(0)); - } catch (NumberFormatException ex) { - player.sendMessage(SchematicSystem.PREFIX + "§cUngültige Seitenzahl"); - } - return; - } - - try { - sendPlayerSchematicList(Integer.parseInt(args[1]), player, "/schem list ", Schematic.getSchemsAccessibleByUser(SteamwarUser.get(player.getUniqueId()).getId())); - } catch (NumberFormatException ex) { - player.sendMessage(SchematicSystem.PREFIX + "§cUngültige Seitenzahl"); - } + }); + selector.setSingleDirOpen(false); + selector.open(); } - private boolean invalidSchemName(Player player, String name){ - if(name.contains("/") || - name.contains("\\") || - name.contains("<") || - name.contains(">") || - name.contains("^") || - name.contains("°") || - name.contains("'") || - name.contains("\"")){ - player.sendMessage(SchematicSystem.PREFIX + "§cDer angegebene Schematicname enthält verbotene Zeichen"); - return true; - } - return false; - } + @Register("save") + @Register("s") + public void saveSchem(Player player, @Mapper("dirStringMapper") String name) { + SteamwarUser user = getUser(player); + if (name.startsWith("/")) name = name.substring(1); + String[] layers = name.split("/"); + if (invalidSchemName(player, layers)) return; + SchematicNode currentNode = mkdirs(layers, user, 1); - private Schematic getSchem(Player player, String name){ - if(invalidSchemName(player, name)) - return null; - - Schematic schematic = Schematic.getSchemFromDB(name, player.getUniqueId()); - if(schematic == null) - schematic = Schematic.getSchemFromDB(name, 0); //public schematic - - if (schematic == null) { - player.sendMessage(SchematicSystem.PREFIX + "§cDie angegebene Schematic existiert nicht"); - return null; - } - - return schematic; - } - - private void load(Player player, String[] args){ - if(args.length < 2){ - help(player); - return; - } - - Schematic schematic = getSchem(player, args[1]); - if(schematic == null) - return; - - load(player, schematic); - } - - static void load(Player player, Schematic schematic){ - try { - schematic.loadToPlayer(player); - player.sendMessage(SchematicSystem.PREFIX + "Schematic §e" + schematic.getSchemName() + " §7geladen"); - }catch (Exception e){ - Bukkit.getLogger().log(Level.SEVERE, "Schematic konnte nicht geladen werden", e); - player.sendMessage(SchematicSystem.PREFIX + "§cFehler beim Laden der Schematic. Dies liegt wahrscheinlich an einer defekten Schematic."); - } - } - - private void delete(Player player, String[] args){ - if(args.length < 2){ - help(player); - return; - } - - Schematic schematic = getSchem(player, args[1]); - if(schematic == null) - return; - - GUI.delete(player, schematic); - } - - private void save(Player player, String[] args){ - if(args.length < 2){ - help(player); - return; - } - - if(invalidSchemName(player, args[1])) - return; - - if(args[1].length() > 64){ - player.sendMessage(SchematicSystem.PREFIX + "§cDer Name der Schematic ist zu lang"); - return; - } - - Schematic schematic = Schematic.getSchemFromDB(args[1], player.getUniqueId()); - if(schematic != null && !schematic.getSchemType().writeable()) { + SchematicNode node = SchematicNode.getSchematicNode(layers[layers.length - 1], currentNode == null ? 0 : currentNode.getId()); + if (node != null && !node.getSchemtype().writeable()) { player.sendMessage(SchematicSystem.PREFIX + "§cDu darfst diese Schematic nicht überschreiben"); return; } boolean newSchem = false; - if(schematic == null || schematic.getSchemOwner() != SteamwarUser.get(player.getUniqueId()).getId()){ + if (node == null) { newSchem = true; - Schematic.createSchem(args[1], player.getUniqueId(), "", SchematicType.Normal); - schematic = Schematic.getSchemFromDB(args[1], player.getUniqueId()); + node = SchematicNode.createSchematic(user.getId(), layers[layers.length - 1], currentNode == null ? 0 : currentNode.getId()); } try { - schematic.saveFromPlayer(player); - }catch (NoClipboardException e) { + node.saveFromPlayer(player); + } catch (NoClipboardException e) { player.sendMessage(SchematicSystem.PREFIX + "§cDein Clipboard ist leer"); - if(newSchem) - schematic.remove(); + if (newSchem) + node.delete(); return; - }catch(Exception ex){ + } catch (Exception ex) { Bukkit.getLogger().log(Level.SEVERE, "Could not save schematic", ex); player.sendMessage(SchematicSystem.PREFIX + "§cFehler beim Speichern der Schematic."); - if(newSchem) - schematic.remove(); + if (newSchem) + node.delete(); return; } - if (newSchem) - player.sendMessage(SchematicSystem.PREFIX + "Schematic §e" + args[1] + " §7gespeichert"); - else - player.sendMessage(SchematicSystem.PREFIX + "Schematic §e" + args[1] + " §7überschrieben"); - } - - private void changetype(Player player, String[] args){ - if(args.length < 2){ - help(player); - return; - } - - Schematic schematic = getSchem(player, args[1]); - if(schematic == null) - return; - - if(args.length < 3) { - GUI.changeType(player, schematic); - return; - } - - SchematicType type = SchematicType.fromDB(args[2]); - if(type == null || !type.isAssignable()){ - player.sendMessage(SchematicSystem.PREFIX + "§cDiesen Schematictypen gibt es nicht"); - return; - } - - changetype(player, schematic, type); - } - - static void changetype(Player player, Schematic schematic, SchematicType type){ - if(schematic.getSchemType() == type){ - player.sendMessage(SchematicSystem.PREFIX + "§cDie Schematic hat bereits diesen Typen"); - return; - } - - if(type.writeable()){ - schematic.setSchemType(type); - player.sendMessage(SchematicSystem.PREFIX + "§aSchematictyp geändert"); - }else if(type.fightType()){ - if(schematic.getSchemType().check()){ - player.sendMessage(SchematicSystem.PREFIX + "§cDu hast diese Schematic bereits eingesendet"); - return; - } - - AutoCheckResult result = CheckSchemType.get(type).autoCheck(schematic); - Collection errors = result.errors(); - for(String warning : result.warnings()){ - player.sendMessage(" §e" + warning); - } - for(String error : errors){ - player.sendMessage(" §c" + error); - } - if(!errors.isEmpty()){ - player.sendMessage(SchematicSystem.PREFIX + "§cDie Schematic ist nicht regelkonform"); - return; - } - - SWInventory inv = new SWInventory(player, 9, "Schematic ausfahren"); - inv.setItem(0, SWItem.getDye(10), (byte)10, "§eSchematic ausfahren", click -> { - new PrepareSchemPacket(SteamwarUser.get(player.getUniqueId()), schematic, type).send(player); - player.sendMessage(SchematicSystem.PREFIX + "§aDer Vorbereitungsserver wird gestartet"); - player.closeInventory(); - }); - inv.setItem(8, SWItem.getDye(7), (byte)7, "§eDirekt einsenden", click -> { - schematic.setSchemType(type.checkType()); - player.sendMessage(SchematicSystem.PREFIX + "§aDie Schematic wird zeitnah überprüft"); - player.closeInventory(); - }); - inv.setCallback(-999, click -> player.closeInventory()); - inv.open(); - } - } - - private void info(Player player, String[] args){ - if(args.length < 2){ - help(player); - return; - } - - Schematic schematic = getSchem(player, args[1]); - if(schematic == null) - return; - - player.sendMessage("§eName: §7" + schematic.getSchemName()); - - TextComponent type = new TextComponent("§eTyp: §7" + schematic.getSchemType().name()); - if(SteamwarUser.get(schematic.getSchemOwner()).getUUID().equals(player.getUniqueId()) && schematic.availible()){ - type.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("§eTyp ändern"))); - type.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem changetype " + schematic.getSchemName())); - } - if(schematic.getRank() > 0){ - type.addExtra("§8Rang " + schematic.getRank()); - } - player.spigot().sendMessage(type); - - if(SteamwarUser.get(schematic.getSchemOwner()).getUUID().equals(player.getUniqueId())){ - TextComponent download = new TextComponent("§eDownload Schematic"); - download.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("§eGeneriere Downloadlink"))); - download.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem download " + schematic.getSchemName())); - player.spigot().sendMessage(download); - } - - List checkedSchematics = CheckedSchematic.getLastDeclined(player.getUniqueId()); - for (CheckedSchematic checkedSchematic : checkedSchematics) { - if (checkedSchematic.getSchemName().equals(schematic.getSchemName()) && - checkedSchematic.getSchemOwner() == schematic.getSchemOwner()) { - player.sendMessage("§cStatus: §c" + checkedSchematic.getStartTime() + " : " + checkedSchematic.getDeclineReason()); - break; - } - } - - if(!SteamwarUser.get(schematic.getSchemOwner()).getUUID().equals(player.getUniqueId())) { - player.sendMessage("§eBesitzer: §7" + SteamwarUser.get(schematic.getSchemOwner()).getUserName()); + if (newSchem) { + player.sendMessage(SchematicSystem.PREFIX + "Schematic §e" + node.getName() + " §7gespeichert"); } else { - List schematicMembers = new ArrayList<>(); - for(SchematicMember schematicMember : SchematicMember.getSchemMembers(schematic.getSchemName(), schematic.getSchemOwner())) { - schematicMembers.add(SteamwarUser.get(schematicMember.getMember()).getUserName()); + player.sendMessage(SchematicSystem.PREFIX + "Schematic §e" + node.getName() + " §7überschrieben"); + } + } + + @Register("addmember") + public void addMember(Player player, SchematicNode node, SteamwarUser... targets) { + SteamwarUser user = getUser(player); + if (node.getOwner() != user.getId()) { + player.sendMessage(SchematicSystem.PREFIX + "§cDu kannst nur auf deine eigenen Sachen jemanden hinzufügen."); + return; + } + List added = new ArrayList<>(); + for (SteamwarUser target: targets) { + if (user.getId() == target.getId()) { + player.sendMessage(SchematicSystem.PREFIX + "§cAlso bitte: Das ist deine eigene Schematic!"); + continue; + } + + if (target.getId() == 0) { + player.sendMessage(SchematicSystem.PREFIX + "§cFür Public-Anträge bitte bei der Moderation melden"); + continue; + } + + if (NodeMember.getNodeMember(node.getId(), target.getId()) != null) { + player.sendMessage(SchematicSystem.PREFIX + "§c" + target.getUserName() + " ist bereits auf diese Schematic geaddet"); + continue; + } + + NodeMember.createNodeMember(node.getId(), target.getId()); + added.add(target); + + Player t = Bukkit.getPlayer(target.getUUID()); + if (t != null) { + t.sendMessage(SchematicSystem.PREFIX + "Du hast nun Zugriff auf die Schematic §e" + node.getName() + " §7von §e" + player.getName()); } - player.sendMessage("§eMitglieder: §7" + schematicMembers.toString()); } - if(schematic.availible()){ - TextComponent loadSchematic = new TextComponent("LADEN"); - loadSchematic.setColor(ChatColor.DARK_GREEN); - loadSchematic.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem load " + schematic.getSchemName())); - player.spigot().sendMessage(loadSchematic); + Optional reduced = added.stream().map(SteamwarUser::getUserName).reduce((s, s2) -> s + ", " + s2); + if (reduced.isPresent()) { + player.sendMessage(SchematicSystem.PREFIX + "§7" + (added.size()>1?"Die":"Der") + " Spieler §e" + reduced.get() + " §7" + (added.size()>1?"wurden":"wurde") + " auf die Schematic hinzugefügt"); + } else { + player.sendMessage(SchematicSystem.PREFIX + "§cEs wurde kein Spieler hinzugefügt"); } } - private void download(Player player, String[] args){ - if(args.length < 2){ - help(player); + @Register("delmember") + public void delMember(Player player, SchematicNode node, @Mapper("memberMapper") NodeMember member) { + SteamwarUser user = getUser(player); + + if (node.getOwner() != user.getId()) { + player.sendMessage(SchematicSystem.PREFIX + "§cDu kannst nur auf deine eigenen Sachen jemanden entfernen."); return; } - Schematic schematic = getSchem(player, args[1]); - if(schematic == null) - return; + SteamwarUser target = SteamwarUser.get(member.getMember()); - download(player, schematic); - } - - private void search(Player player, String[] args) { - if(args.length < 2) { - help(player); - return; + List nodes = SchematicNode.deepGet(node.getId(), node1 -> node1.getOwner() != user.getId()); + if (!nodes.isEmpty()) { + for (SchematicNode schematicNode : nodes) { + SchematicNode newNode = mkdirs(schematicNode.generateBreadcrumbs(user).split("/"), target, 1); + schematicNode.setParent(newNode == null ? 0 : newNode.getId()); + } } - List schems = Schematic.getSchemsAccessibleByUser(SteamwarUser.get(player.getUniqueId()).getId()); - schems.removeIf(schem -> !schem.getSchemName().toLowerCase().contains(args[1].toLowerCase())); + member.delete(); + player.sendMessage(SchematicSystem.PREFIX + "Der Spieler §e" + target.getUserName() + " §7hat nun keinen Zugriff mehr auf die Schematic §e" + node.generateBreadcrumbs(user)); - if(args.length == 2){ - sendPlayerSchematicList(0, player, "/schem search " + args[1] + " ", schems); - return; - } - - try { - sendPlayerSchematicList(Integer.parseInt(args[2]), player, "/schem search " + args[1] + " ", schems); - } catch (NumberFormatException ex) { - player.sendMessage(SchematicSystem.PREFIX + "§cUngültige Seitenzahl"); + Player t = Bukkit.getPlayer(target.getUUID()); + if (t != null) { + t.sendMessage(SchematicSystem.PREFIX + "Du hast nun keinen Zugriff mehr auf die Schematic §e" + node.getName() + " §7von §e" + player.getName()); } } - static void download(Player player, Schematic schematic){ - if(schematic.getSchemOwner() != SteamwarUser.get(player.getUniqueId()).getId()){ - player.sendMessage("§cDu darfst nur deine eigenen Schematics herunterladen!"); - return; - } - - player.sendMessage(DownloadSchematic.getLink(schematic)); - } - - private void addmember(Player player, String[] args){ - if(args.length < 3){ - help(player); - return; - } - - Schematic schematic = getSchem(player, args[1]); - if(schematic == null) - return; - - if(schematic.getSchemOwner() != SteamwarUser.get(player.getUniqueId()).getId()) { - player.sendMessage(SchematicSystem.PREFIX + "§cDu darfst nur auf deine eigene Schematic Mitglieder hinzufügen"); - return; - } - - SteamwarUser warkingUser = SteamwarUser.get(args[2]); - if(warkingUser == null){ - player.sendMessage(SchematicSystem.PREFIX + "§cDieser Spieler existiert nicht"); - return; - } - if(schematic.getSchemOwner() == warkingUser.getId()){ - player.sendMessage(SchematicSystem.PREFIX + "§cAlso bitte: Das ist deine eigene Schematic!"); - return; - } - - if(SchematicMember.getSchemMemberFromDB(schematic.getSchemName(), SteamwarUser.get(schematic.getSchemOwner()).getUUID(), warkingUser.getUUID()) != null){ - player.sendMessage(SchematicSystem.PREFIX + "§cDieser Spieler ist bereits auf diese Schematic geaddet"); - return; - } - - new SchematicMember(schematic.getSchemName(), SteamwarUser.get(schematic.getSchemOwner()).getUUID(), warkingUser.getUUID()); - player.sendMessage(SchematicSystem.PREFIX + "Der Spieler §e" + warkingUser.getUserName() + " §7hat nun Zugriff auf die Schematic §e" + schematic.getSchemName()); - - Player target = Bukkit.getPlayer(warkingUser.getUUID()); - if(target != null) - target.sendMessage(SchematicSystem.PREFIX + "Du hast nun Zugriff auf die Schematic §e" + schematic.getSchemName() + " §7von §e" + SteamwarUser.get(schematic.getSchemOwner()).getUserName()); - } - - private void delmember(Player player, String[] args){ - if(args.length < 2){ - help(player); - return; - } - - Schematic schematic = getSchem(player, args[1]); - if(schematic == null) - return; - - if(schematic.getSchemOwner() != SteamwarUser.get(player.getUniqueId()).getId()) { - player.sendMessage(SchematicSystem.PREFIX + "§cDu darfst nur von deinen eigenen Schematics Mitglieder entfernen"); - return; - } - - if(args.length < 3){ - GUI.delmembers(player, schematic); - return; - } - - SteamwarUser user = SteamwarUser.get(args[2]); - if(user == null){ - player.sendMessage(SchematicSystem.PREFIX + "§cDieser Spieler existiert nicht"); - return; - } - if(schematic.getSchemOwner() == user.getId()){ - player.sendMessage(SchematicSystem.PREFIX + "§cAlso bitte: Das ist deine eigene Schematic!"); - return; - } - - SchematicMember schematicMember = SchematicMember.getSchemMemberFromDB(schematic.getSchemName(), SteamwarUser.get(schematic.getSchemOwner()).getUUID(), user.getUUID()); - if(schematicMember == null) { - player.sendMessage(SchematicSystem.PREFIX + "§cDieser Spieler ist nicht auf die Schematic hinzugefügt"); - return; - } - - schematicMember.remove(); - player.sendMessage(SchematicSystem.PREFIX + "Der Spieler §e" + user.getUserName() + " §7hat keinen Zugriff mehr auf die Schematic §e" + schematic.getSchemName()); - - Player target = Bukkit.getPlayer(user.getUUID()); - if(target != null) - target.sendMessage(SchematicSystem.PREFIX + "Du hast keinen Zugriff mehr auf die Schematic §e" + schematic.getSchemName() + "§7von §e" + SteamwarUser.get(schematic.getSchemOwner()).getUserName()); - } - - private void help(Player player) { - player.sendMessage(SchematicSystem.PREFIX + "Befehle§8:"); - player.sendMessage("§8/§eschem gui §8- §7Öffnet die Schematic-GUI"); - player.sendMessage("§8/§eschem list §8- §7Zeigt dir deine Schematics an"); - player.sendMessage("§8/§eschem list public §8- §7Zeigt alle Public-Schematics"); - player.sendMessage("§8/§eschem search §8[§7Stichwort§8] - §7Sucht nach passenden Schematics"); - player.sendMessage("§8/§eschem load §8[§7Schematic§8] - §7Lädt eine Schematic"); - player.sendMessage("§8/§eschem save §8[§7Schematic§8] - §7Speichert dein Clipboard als Schematic"); - player.sendMessage("§8/§eschem changetype §8[§7Schematic§8] - §7Ändert die Art deiner Schematic"); - player.sendMessage("§8/§eschem delete §8[§7Schematic§8] - §7Löscht eine Schematic"); - player.sendMessage("§8/§eschem info §8[§7Schematic§8] - §7Zeigt dir Informationen zur Schematic"); - player.sendMessage("§8/§eschem download §8[§7Schematic§8] - §7Gibt dir einen Downloadlink (1 min gültig)"); - player.sendMessage("§8/§eschem addmember §8[§7Schematic§8] §8[§7Spieler§8] - §7Fügt einen Spieler zu einer Schematic hinzu"); - player.sendMessage("§8/§eschem delmember §8[§7Schematic§8] §8[§7Spieler§8] - §7Entfernt einen Spieler von einer Schematic"); - } - - private void sendPlayerSchematicList(int currentPage, Player player, String precommand, List schematicList) { - SteamwarUser user = SteamwarUser.get(player.getUniqueId()); - - if(schematicList.isEmpty()) { - player.sendMessage(SchematicSystem.PREFIX + "§cKeine Schematics gefunden"); - return; - } - - int pages; - - double doublePages = schematicList.size() / (double) FILES_PER_PAGE; - int intPages = schematicList.size() / FILES_PER_PAGE; - - if(schematicList.size() <= FILES_PER_PAGE) { - pages = 1; - }else if(doublePages > intPages){ - pages = (intPages + 1); - }else - pages = intPages; - - if(currentPage >= pages || currentPage < 0) return; - - player.sendMessage("§eSeite " + (currentPage + 1) + " §8/ " + pages + " §8| §e" + schematicList.size() + " Schematics"); - - for(int i = currentPage * FILES_PER_PAGE; i < (currentPage * FILES_PER_PAGE) + FILES_PER_PAGE; i++) { - if(schematicList.size() <= i) break; - - Schematic schematic = schematicList.get(i); - - String schematicPlayer = ""; - if(schematic.getSchemOwner() != user.getId()) - schematicPlayer = " §8von §7" + SteamwarUser.get(schematic.getSchemOwner()).getUserName(); - - TextComponent schematics = new TextComponent("§e" + schematic.getSchemType().getKuerzel() + " §7" + schematic.getSchemName() + schematicPlayer); - schematics.setBold(true); - + @Register("search") + public void schemSearch(Player player, String query) { + SteamwarUser user = getUser(player); + List nodes = SchematicNode.filterSchems(user.getId(), node -> node.getName().contains(query)); + player.sendMessage("§eSchematics §8(§e" + nodes.size() + "§8)"); + nodes.forEach(node -> { + String br = node.generateBreadcrumbs(user); + TextComponent schematics = new TextComponent("§7" + br.replace(query, "§e§l" + query + "§7")); schematics.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§eSchematic verwalten").create())); - schematics.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem info " + schematic.getSchemName())); + schematics.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem info " + br)); player.spigot().sendMessage(schematics); + }); + } + + @Register("download") + public void download(Player player, SchematicNode node) { + SchematicCommandUtils.download(player, node); + } + + @Register("dir") + @Register("ordner") + @Register("mkdir") + public void mkdir(Player player, @Mapper("dirStringMapper") String name) { + SteamwarUser user = getUser(player); + if (name.startsWith("/")) name = name.substring(1); + if (name.endsWith("/")) name = name.substring(0, name.length() - 1); + String[] layers = name.split("/"); + if (invalidSchemName(player, layers)) return; + SchematicNode node = mkdirs(layers, user, 0); + player.sendMessage(SchematicSystem.PREFIX + "§7Ordner §e" + node.generateBreadcrumbs(user) + " §7erstellt"); + } + + @Register("changetype") + public void changeType(Player player, SchematicNode node) { + SteamwarUser user = getUser(player); + if (node.getOwner() != user.getId()) { + player.sendMessage(SchematicSystem.PREFIX + "§cDu kannst nur deine eigenen Schematics einsenden."); + return; + } + TextComponent base = new TextComponent(); + + SchematicType.values().forEach(type -> { + if (!type.isAssignable()) return; + + TextComponent component = new TextComponent(type.name() + " "); + component.setColor(ChatColor.GRAY); + component.setBold(true); + component.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("§eTyp auswählen"))); + component.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem changetype " + node.generateBreadcrumbs(user) + " " + type.name())); + base.addExtra(component); + }); + + player.spigot().sendMessage(base); + } + + @Register("changetype") + public void changeType(Player player, SchematicNode node, SchematicType type) { + changeType(player, node, type, null); + } + + @Register("changetype") + public void changeType(Player player, SchematicNode node, SchematicType type, Extend extend) { + SchematicCommandUtils.changeType(player, node, type, extend); + } + + @Register("move") + public void moveToNull(Player player, SchematicNode node) { + move(player, node, "/"); + } + + @Register("move") + public void move(Player player, SchematicNode node, @Mapper("dirStringMapper") String name) { + SteamwarUser user = getUser(player); + if (node.getOwner() != user.getId()) { + player.sendMessage(SchematicSystem.PREFIX + "§cDu kannst nur deine eigenen Schems verschieben."); + return; } - if(pages <= 1) return; + if (name.equals("/")) { + node.setParent(null); + } else { + if (name.startsWith("/")) name = name.substring(1); + if (name.endsWith("/")) name = name.substring(0, name.length() - 1); + String[] layers = name.split("/"); + if (invalidSchemName(player, layers)) return; + SchematicNode newNode = mkdirs(layers, user, 0); + if(SchematicNode.getAllParentsOfNode(newNode).contains(node)) { + player.sendMessage(SchematicSystem.PREFIX + "§cDas gibt nur Fehler, vertrau mir."); + return; + } + node.setParent(newNode.getId()); + } + player.sendMessage(SchematicSystem.PREFIX + "§7Die Schematic ist nun unter §e" + node.generateBreadcrumbs(user) + " §7zu finden"); + } - TextComponent beforePage = new TextComponent("««"); - if(currentPage > 0){ - beforePage.setColor(ChatColor.YELLOW); - beforePage.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§eVorherige Seite").create())); - beforePage.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, precommand + (currentPage - 1))); - }else - beforePage.setColor(ChatColor.RED); + @Register("rename") + public void rename(Player player, SchematicNode node, String name) { + SteamwarUser user = getUser(player); + if (node.getOwner() != user.getId()) { + player.sendMessage(SchematicSystem.PREFIX + "§cDas kannst du nur bei deinen eigenen Schems machen"); + return; + } + if (invalidSchemName(player, new String[]{name})) { + return; + } + node.setName(name); + player.sendMessage(SchematicSystem.PREFIX + "§7Die Schematic heist nun §e" + node.generateBreadcrumbs(user)); + } - TextComponent nextPage = new TextComponent(" Seite »»"); - if(currentPage < pages-1){ - nextPage.setColor(ChatColor.YELLOW); - nextPage.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§eNächste Seite").create())); - nextPage.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, precommand + (currentPage + 1))); - }else - nextPage.setColor(ChatColor.RED); + @Register("addteam") + public void addTeam(Player player, SchematicNode node) { + SteamwarUser user = getUser(player); + if (node.getOwner() != user.getId()) { + player.sendMessage(SchematicSystem.PREFIX + "§cDas kannst du nur bei deinen eigenen Schems machen"); + return; + } + Team team = Team.get(user.getTeam()); + if (team == null) { + player.sendMessage(SchematicSystem.PREFIX + "§cDu bist in keinem Team"); + return; + } - beforePage.addExtra(nextPage); - player.spigot().sendMessage(beforePage); + addMember(player, node, team.getMembers().stream().map(SteamwarUser::get).toArray(SteamwarUser[]::new)); + } + + @Register("delteam") + public void remTeam(Player player, SchematicNode node) { + SteamwarUser user = getUser(player); + if (node.getOwner() != user.getId()) { + player.sendMessage(SchematicSystem.PREFIX + "§cDas kannst du nur bei deinen eigenen Schems machen"); + return; + } + Team team = Team.get(user.getTeam()); + if (team == null) { + player.sendMessage(SchematicSystem.PREFIX + "§cDu bist in keinem Team"); + return; + } + + List removed = new ArrayList<>(); + for (Integer member : team.getMembers()) { + if (user.getId() == member) continue; + NodeMember nodeMember = NodeMember.getNodeMember(node.getId(), member); + if (nodeMember != null) { + nodeMember.delete(); + removed.add(SteamwarUser.get(member).getUserName()); + } + } + + Optional reduced = removed.stream().reduce((s, s2) -> s + ", " + s2); + if (reduced.isPresent()) { + player.sendMessage(SchematicSystem.PREFIX + "§7Die Spieler §e" + reduced.get() + " §7wurden von der Schematic entfernt"); + } else { + player.sendMessage(SchematicSystem.PREFIX + "§7Es wurde kein Spieler entfernt"); + } + } + + @Register("clearmember") + public void clearMember(Player player, SchematicNode node) { + SteamwarUser user = getUser(player); + if (node.getOwner() != user.getId()) { + player.sendMessage(SchematicSystem.PREFIX + "§cDas kannst du nur bei deinen eigenen Schems machen"); + return; + } + + node.getMembers().forEach(NodeMember::delete); + player.sendMessage(SchematicSystem.PREFIX + "§7Alle Spieler wurden von der Schematic entfernt"); + } + + @Register("togglepublic") + public void togglePublicMode(Player player) { + SteamwarUser user = SteamwarUser.get(player.getUniqueId()); + if (!user.getUserGroup().isAdminGroup()) { + genericHelp(player); + return; + } + + if (togglePublic(player)) { + player.sendMessage(SchematicSystem.PREFIX + "§aDu bist nun der Public User"); + } else { + player.sendMessage(SchematicSystem.PREFIX + "§cDu bist nun nicht mehr der Public User"); + } + } + + @Register("delete") + public void deleteSchem(Player player, SchematicNode node) { + SteamwarUser user = SteamwarUser.get(player.getUniqueId()); + if (node.getOwner() != user.getId()) { + NodeMember member = NodeMember.getNodeMember(node.getId(), user.getId()); + if (member == null) { + player.sendMessage(SchematicSystem.PREFIX + "§cDie Schematic gehört dir nicht"); + return; + } + member.delete(); + player.sendMessage(SchematicSystem.PREFIX + "§aDu hast dich von der Schematic entfernt"); + return; + } + + if (node.isDir()) { + if (SchematicNode.getSchematicNodeInNode(node).isEmpty()) { + player.sendMessage(SchematicSystem.PREFIX + "§aDer Ordner §e" + node.generateBreadcrumbs(user) + "§a wird gelöcht..."); + node.delete(); + } else { + player.sendMessage(SchematicSystem.PREFIX + "§cDer Ordner muss leer sein, um ihn zu löchen!"); + } + } else { + player.sendMessage(SchematicSystem.PREFIX + "§aDie Schematic §e" + node.generateBreadcrumbs(user) + "§a wird gelöcht..."); + node.delete(); + } + } + + private final TypeMapper publicCommandTypeMapper = publicNodeTypeMapper(); + + @Mapper("publicMapper") + public TypeMapper publicNodeTypeMapper() { + return new TypeMapper() { + @Override + public List tabCompletes(CommandSender commandSender, String[] strings, String s) { + return SchematicNode.getNodeTabcomplete(SteamwarUser.get(0), s); + } + + @Override + public SchematicNode map(CommandSender commandSender, String[] previousArguments, String s) { + return SchematicNode.getNodeFromPath(SteamwarUser.get(0), s); + } + }; + } + + @Mapper("memberMapper") + public TypeMapper nodeMemberTypeMapper() { + return new TypeMapper() { + @Override + public NodeMember map(CommandSender commandSender, String[] previousArguments, String s) { + SchematicNode node = SchematicNode.getNodeFromPath(getUser((Player) commandSender), previousArguments[previousArguments.length - 1]); + SteamwarUser user = SteamwarUser.get(s); + return NodeMember.getNodeMember(node.getId(), user.getId()); + } + + @Override + public List tabCompletes(CommandSender commandSender, String[] strings, String s) { + List list = new ArrayList<>(); + SchematicNode node = SchematicNode.getNodeFromPath(getUser((Player) commandSender), strings[strings.length - 1]); + if (node == null) { + return list; + } + node.getMembers().forEach(nodeMember -> list.add(SteamwarUser.get(nodeMember.getMember()).getUserName())); + return list; + } + }; + } + + @Mapper("dirMapper") + public TypeMapper dirNodeTypeMapper() { + return new TypeMapper() { + @Override + public List tabCompletes(CommandSender commandSender, String[] strings, String s) { + List list = SchematicNode.getNodeTabcomplete(getUser((Player) commandSender), s); + list.removeIf(s1 -> !s1.endsWith("/")); + return list; + } + + @Override + public SchematicNode map(CommandSender commandSender, String[] previousArguments, String s) { + SchematicNode result = SchematicNode.getNodeFromPath(getUser((Player) commandSender), s); + if (result == null || !result.isDir()) { + return null; + } else { + return result; + } + } + }; + } + + @Mapper("publicDirMapper") + public TypeMapper publicDirNodeTypeMapper() { + return new TypeMapper() { + @Override + public List tabCompletes(CommandSender commandSender, String[] strings, String s) { + List list = publicCommandTypeMapper.tabCompletes(commandSender, strings, s); + list.removeIf(s1 -> !s1.endsWith("/")); + return list; + } + + @Override + public SchematicNode map(CommandSender commandSender, String[] previousArguments, String s) { + SchematicNode result = publicCommandTypeMapper.map(commandSender, previousArguments, s); + if (result == null || !result.isDir()) { + return null; + } else { + return result; + } + } + }; + } + + @Mapper("dirStringMapper") + public TypeMapper stringTabMapper() { + return new TypeMapper() { + @Override + public List tabCompletes(CommandSender commandSender, String[] strings, String s) { + List list = SchematicNode.getNodeTabcomplete(getUser((Player) commandSender), s); + list.removeIf(s1 -> !s1.endsWith("/")); + return list; + } + + @Override + public String map(CommandSender commandSender, String[] previousArguments, String s) { + return s; + } + }; + } + + @ClassMapper(SchematicType.class) + public TypeMapper typeTypeMapper() { + return new TypeMapper() { + @Override + public List tabCompletes(CommandSender commandSender, String[] strings, String s) { + return SchematicType.values().stream().filter(SchematicType::isAssignable).map(SchematicType::name).collect(Collectors.toList()); + } + + @Override + public SchematicType map(CommandSender commandSender, String[] previousArguments, String s) { + return SchematicType.values().stream().filter(type -> type.name().equals(s)).collect(Collectors.toList()).get(0); + } + }; + } + + @ClassMapper(value = SchematicNode.class, local = true) + public TypeMapper nodeTypeMapper() { + return new TypeMapper() { + @Override + public List tabCompletes(CommandSender commandSender, String[] strings, String s) { + return SchematicNode.getNodeTabcomplete(getUser((Player) commandSender), s); + } + + @Override + public SchematicNode map(CommandSender commandSender, String[] previousArguments, String s) { + return SchematicNode.getNodeFromPath(getUser((Player) commandSender), s); + } + }; + } + + enum Extend { + AUSFAHREN, + NORMAL } } diff --git a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandHelp.java b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandHelp.java new file mode 100644 index 0000000..5d48306 --- /dev/null +++ b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandHelp.java @@ -0,0 +1,88 @@ +/* + 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.schematicsystem.commands; + +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.entity.Player; + +public class SchematicCommandHelp { + + private SchematicCommandHelp() { + } + + public static void printHelpMainPage(Player player) { + player.sendMessage("§e§lSchematicSystem §8§lHilfe"); + for (HelpPage page : HelpPage.values()) { + TextComponent pageComp = new TextComponent(page.mainText); + pageComp.setColor(ChatColor.GRAY); + pageComp.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("§e" + page.hover))); + pageComp.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem help " + page.name())); + player.spigot().sendMessage(pageComp); + } + } + + public static void printHelpPage(Player player, HelpPage page) { + player.sendMessage("§e§lSchematicSystem §8§lHilfe"); + for (String s : page.content) { + player.sendMessage(s); + } + } + + public enum HelpPage { + + ANSICHT("Finden & Laden", "Suche oder lade Schematics", new String[]{ + "§8/§7schem §einfo §8[§7Schematic§8] - §7Zeigt dir Informationen zur Schematic", + "§8/§7schem §elist §8- §7Zeigt dir deine Schematics an", + "§8/§7schem §elist public §8- §7Zeigt alle Public-Schematics", + "§8/§7schem §esearch §8[§7Stichwort§8] - §7Sucht nach passenden Schematics", + "§8/§7schem §eload §8[§7Schematic§8] - §7Lädt eine Schematic", + "§8/§7schem §edownload §8[§7Schematic§8] - §7Gibt dir einen Downloadlink (1 min gültig)" + }), + BEARBEITUNG("Speichern & Bearbeiten", "Modifizierung von Schematics und Ordnern", new String[]{ + "§8/§7schem §esave §8[§7Schematic§8] - §7Speichert dein Clipboard als Schematic", + "§8/§7schem §eordner §8[§7Ordner§8] - §7Erstelle einen leeren Ordner", + "§8/§7schem §emove §8[§7Schematic§8] [§7Neuer Pfad§8] - §7Verschiebe eine Schematic", + "§8/§7schem §erename §8[§7Schematic§8] [§7Neuer Name§8] - §7Gib der Schematic einen neuen Namen", + "§8/§7schem §echangetype §8[§7Schematic§8] - §7Ändert die Art deiner Schematic", + "§8/§7schem §edelete §8[§7Schematic§8] - §7Löscht eine Schematic" + }), + MEMBER("Besitzrechte", "Schematics mit anderen teilen", new String[]{ + "§8/§7schem §eaddmember §8[§7Schematic§8] §8[§7Spieler§8] - §7Fügt einen Spieler zu einer Schematic hinzu", + "§8/§7schem §edelmember §8[§7Schematic§8] §8[§7Spieler§8] - §7Entfernt einen Spieler von einer Schematic", + "§8/§7schem §eclearmember §8[§7Schematic§8] - §7Entfernt alle Spieler von der Schematic", + "§8/§7schem §eaddteam §8[§7Schematic§8] - §7Füge jeden aus deinem Team auf die Schematic hinzu", + "§8/§7schem §eremteam §8[§7Schematic§8] - §7Entferne jeden aus deinem Team von der Schematic" + }); + + + private final String mainText; + private final String[] content; + private final String hover; + + HelpPage(String mainText, String hover, String[] content) { + this.mainText = mainText; + this.hover = hover; + this.content = content; + } + } +} diff --git a/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java new file mode 100644 index 0000000..92d099f --- /dev/null +++ b/SchematicSystem_Core/src/de/steamwar/schematicsystem/commands/SchematicCommandUtils.java @@ -0,0 +1,385 @@ +/* + 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.schematicsystem.commands; + +import de.steamwar.comms.packets.PrepareSchemPacket; +import de.steamwar.inventory.SWInventory; +import de.steamwar.inventory.SWItem; +import de.steamwar.schematicsystem.AutoCheckResult; +import de.steamwar.schematicsystem.CheckSchemType; +import de.steamwar.schematicsystem.SchematicSystem; +import de.steamwar.sql.*; +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.logging.Level; +import java.util.stream.Collectors; + +public class SchematicCommandUtils { + + private static final int CHUNK_SIZE = 15; + private static final List PUBLIC_TOGGLED = new ArrayList<>(); + private static final List FORBIDDEN_NAMES = Collections.unmodifiableList(Arrays.asList("public")); + + private SchematicCommandUtils() {} + + public static boolean invalidSchemName(Player player, String[] layers) { + for (String layer : layers) { + if (layer.isEmpty()) { + player.sendMessage(SchematicSystem.PREFIX + "§cDeine Ordner brauchen schon einen Namen!"); + return true; + } + if (layer.contains("/") || + layer.contains("\\") || + layer.contains("<") || + layer.contains(">") || + layer.contains("^") || + layer.contains("°") || + layer.contains("'") || + layer.contains("\"")) { + player.sendMessage(SchematicSystem.PREFIX + "§cDer angegebene Schematicname enthält verbotene Zeichen"); + return true; + } + if(FORBIDDEN_NAMES.contains(layer.toLowerCase())) { + player.sendMessage(SchematicSystem.PREFIX + "§cDer Pfad darf nicht \"§l" + layer + "§c\" enthalten"); + return true; + } + } + return false; + } + + public static void renderSchemlist(Player player, List nodes, int chunk, String breadcrumbs, boolean isPublic, SchematicNode parent) { + nodes.sort(Comparator.comparing(SchematicNode::getName)); + SteamwarUser user = getUser(player); + int pageCount = (int) Math.ceil(nodes.size() / (double) CHUNK_SIZE); + + player.sendMessage("§eSchematics §8(§e" + nodes.size() + "§8)"); + player.sendMessage("§7Aktueller Pfad: §e" + (breadcrumbs.isEmpty() ? "/" : breadcrumbs)); + if (!breadcrumbs.isEmpty()) { + TextComponent back = new TextComponent("§e../"); + String str = breadcrumbs.substring(0, Math.max(0, breadcrumbs.substring(0, breadcrumbs.length() - 1).lastIndexOf("/"))); + back.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§eZurück gehen" + str).create())); + back.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem list " + (isPublic ? "public" : "") + " " + str)); + + player.spigot().sendMessage(back); + } + for (int i = chunk * CHUNK_SIZE; i < nodes.size() && i < (chunk + 1) * CHUNK_SIZE; i++) { + SchematicNode node = nodes.get(i); + + StringBuilder nodeString = new StringBuilder(); + + if (node.isDir()) { + nodeString.append("§7§lDIR §e"); + } else { + SchematicType type = node.getSchemtype(); + if (type != SchematicType.Normal) { + nodeString.append("§8§l") + .append(type.getKuerzel().toUpperCase()) + .append(" "); + } + nodeString.append("§e"); + } + + nodeString.append(node.getName()); + + if (node.isDir()) { + nodeString.append("/"); + } + + if (node.getOwner() != user.getId()) { + nodeString.append(" §8von §7") + .append(SteamwarUser.get(node.getOwner()).getUserName()); + } + TextComponent schematics = new TextComponent(nodeString.toString()); + + if (node.isDir()) { + schematics.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§eOrdner anzeigen").create())); + schematics.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem list " + (isPublic ? "public" : "") + " " + breadcrumbs + node.getName() + "/")); + } else { + schematics.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§eSchematic verwalten").create())); + schematics.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem info " + (isPublic ? "public" : "") + " " + breadcrumbs + node.getName())); + } + + player.spigot().sendMessage(schematics); + } + + if (parent != null && parent.getOwner() != user.getId() && NodeMember.getNodeMember(parent.getId(), user.getId()) != null) { + TextComponent deadd = new TextComponent("[Entfernen]"); + deadd.setColor(ChatColor.RED); + deadd.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("§7Entferne dich von dem Ordner"))); + deadd.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem delete " + parent.generateBreadcrumbs(user))); + player.spigot().sendMessage(deadd); + } + + TextComponent beforePage = new TextComponent("««"); + if (chunk > 0) { + beforePage.setColor(ChatColor.YELLOW); + beforePage.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§eVorherige Seite").create())); + beforePage.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem list " + (isPublic ? "public" : "") + " " + breadcrumbs + " " + (chunk - 1))); + } else { + beforePage.setColor(ChatColor.RED); + } + + TextComponent nextPage = new TextComponent(" Seite (" + (chunk + 1) + "/" + Math.max(pageCount, 1) + ") »»"); + if (chunk < pageCount - 1) { + nextPage.setColor(ChatColor.YELLOW); + nextPage.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§eNächste Seite").create())); + nextPage.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem list " + (isPublic ? "public" : "") + " " + breadcrumbs + " " + (chunk + 1))); + } else { + nextPage.setColor(ChatColor.RED); + } + + beforePage.addExtra(nextPage); + player.spigot().sendMessage(beforePage); + } + + public static void printSchemInfo(Player player, SchematicNode node) { + SteamwarUser user = getUser(player); + player.sendMessage("§7Schematic: §e" + node.getName()); + player.sendMessage("§7Name: §e" + node.generateBreadcrumbs(user)); + player.sendMessage("§7Besitzer: §e" + SteamwarUser.get(node.getOwner()).getUserName()); + player.sendMessage("§7Ordner: §e" + (node.getParent() == null || node.getParent() == 0 ? "/" : node.getParentNode().generateBreadcrumbs(user))); + player.sendMessage("§7Letzes Update: §e" + node.getLastUpdate().toLocalDateTime().format(DateTimeFormatter.ofPattern("HH:mm dd.MM.yyyy", Locale.GERMAN))); + player.sendMessage("§7Typ: §e" + (node.isDir() ? "§7DIR" : node.getSchemtype().name())); + if (!node.isDir()) { + if (node.getRank() > 0) { + player.sendMessage("§7Rang: §e" + node.getRank()); + } + player.sendMessage("§7Format: §e" + (node.getSchemFormat() ? ".schem" : ".schematic")); + List checkedSchematics = CheckedSchematic.getLastDeclined(player.getUniqueId()); + for (CheckedSchematic checkedSchematic : checkedSchematics) { + if (checkedSchematic.getSchemName().equals(node.getName()) && + checkedSchematic.getSchemOwner() == node.getOwner()) { + player.sendMessage("§cStatus: §c" + checkedSchematic.getStartTime() + " : " + checkedSchematic.getDeclineReason()); + break; + } + } + } + List schematicMembers = new ArrayList<>(); + NodeMember.getNodeMembers(node.getId()).forEach(nodeMember -> schematicMembers.add(SteamwarUser.get(nodeMember.getMember()).getUserName())); + if (!schematicMembers.isEmpty()) { + player.sendMessage("§7Mitglieder: §e" + schematicMembers); + } + + TextComponent base = new TextComponent(); + + if (!node.isDir()) { + TextComponent load = new TextComponent("[Laden] "); + load.setColor(ChatColor.GREEN); + load.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("§eSchematic laden"))); + load.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem load " + (node.getOwner() == 0 ? "public " : "") + node.generateBreadcrumbs(user))); + base.addExtra(load); + + if (node.getOwner() == user.getId()) { + TextComponent download = new TextComponent("[Download] "); + download.setColor(ChatColor.GOLD); + download.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("§eSchematic downloaden"))); + download.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem download " + node.generateBreadcrumbs(user))); + base.addExtra(download); + + TextComponent changeTyp = new TextComponent("[Typ ändern] "); + changeTyp.setColor(ChatColor.BLUE); + changeTyp.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("§eSchematic Typ ändern"))); + changeTyp.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem changetype " + node.generateBreadcrumbs(user))); + base.addExtra(changeTyp); + } + } + + if (node.getOwner() == user.getId()) { + TextComponent addMember = new TextComponent("[Hinzufügen] "); + addMember.setColor(ChatColor.AQUA); + addMember.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("§eMember hinzufügen"))); + addMember.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/schem addmember " + node.generateBreadcrumbs(user) + " ")); + base.addExtra(addMember); + + TextComponent delMember = new TextComponent("[Entfernen] "); + delMember.setColor(ChatColor.RED); + delMember.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("§eMember entfernen"))); + delMember.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/schem delmember " + node.generateBreadcrumbs(user) + " ")); + base.addExtra(delMember); + + TextComponent move = new TextComponent("[Verschieben] "); + move.setColor(ChatColor.DARK_PURPLE); + move.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("§e" + (node.isDir() ? "Ordner" : "Schematic") + " verschieben"))); + move.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/schem move " + node.generateBreadcrumbs(user) + " " + node.generateBreadcrumbs(user).replace("/" + node.getName(), ""))); + base.addExtra(move); + + TextComponent rename = new TextComponent("[Umbenennen] "); + rename.setColor(ChatColor.LIGHT_PURPLE); + rename.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("§e" + (node.isDir() ? "Ordner" : "Schematic") + " umbenennen"))); + rename.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/schem rename " + node.generateBreadcrumbs(user) + " [Neuer Name]")); + base.addExtra(rename); + } + + TextComponent delete = new TextComponent("[" + (node.getOwner()==user.getId()?"Löschen":"Entfernen") + "] "); + delete.setColor(ChatColor.DARK_RED); + delete.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText("§e" + (node.isDir() ? "Ordner" : "Schematic") + " Löschen"))); + delete.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem delete " + node.generateBreadcrumbs(user))); + base.addExtra(delete); + + if (!base.getExtra().isEmpty()) { + player.spigot().sendMessage(base); + } + } + + public static SchematicNode mkdirs(String[] layers, SteamwarUser user, int minus) { + SchematicNode currentNode = null; + for (int i = 0; i < layers.length - minus; i++) { + int finalI = i; + List nodes; + if (currentNode == null) { + nodes = SchematicNode.getSchematicsAccessibleByUser(user.getId(), 0).stream().filter(node -> node.getName().equals(layers[finalI])).collect(Collectors.toList()); + } else { + nodes = SchematicNode.getSchematicNodeInNode(currentNode).stream().filter(node -> node.getName().equals(layers[finalI])).collect(Collectors.toList()); + } + if (nodes.isEmpty()) { + currentNode = SchematicNode.createSchematicDirectory(user.getId(), layers[i], currentNode == null ? 0 : currentNode.getId()); + } else { + if (!nodes.get(0).isDir()) { + nodes.set(0, SchematicNode.createSchematicDirectory(user.getId(), layers[i] + "-dir-" + System.currentTimeMillis() % 100, currentNode == null ? 0 : currentNode.getId())); + } + currentNode = nodes.get(0); + } + } + return currentNode; + } + + public static SteamwarUser getUser(Player player) { + if (PUBLIC_TOGGLED.contains(player)) { + return SteamwarUser.get(0); + } else { + return SteamwarUser.get(player.getUniqueId()); + } + } + + public static boolean togglePublic(Player player) { + if (PUBLIC_TOGGLED.contains(player)) { + PUBLIC_TOGGLED.remove(player); + return false; + } else { + PUBLIC_TOGGLED.add(player); + return true; + } + } + + public static void turnOffPublic(Player player) { + PUBLIC_TOGGLED.remove(player); + } + + public static void loadSchem(Player player, SchematicNode node) { + if (node.isDir()) { + player.sendMessage(SchematicSystem.PREFIX + "§cDu kannst keine Ordner Laden"); + return; + } + + try { + node.loadToPlayer(player); + player.sendMessage(SchematicSystem.PREFIX + "§7Schematic §e" + node.getName() + " §7geladen!"); + Bukkit.getLogger().log(Level.INFO, "{0} has loaded Schematic {1} {2}", new Object[]{player.getName(), node.getId(), node.getName()}); + } catch (NoClipboardException e) { + player.sendMessage(SchematicSystem.PREFIX + "§cEs konnte keine Daten in der Schematic gefunden werden."); + } catch (Exception e) { + player.sendMessage(SchematicSystem.PREFIX + "§cDie Schematic konnte nicht geladen werden."); + throw new SecurityException(e); + } + } + + public static void download(Player player, SchematicNode node) { + SteamwarUser user = getUser(player); + if (node.getOwner() != user.getId()) { + player.sendMessage("§cDu darfst nur deine eigenen Schematics herunterladen!"); + return; + } + + player.sendMessage(SchematicSystem.PREFIX + "Dein Download Link:"); + player.sendMessage(NodeDownload.getLink(node)); + } + + public static void changeType(Player player, SchematicNode node, SchematicType type, SchematicCommand.Extend extend) { + SteamwarUser user = getUser(player); + if (node.getOwner() != user.getId()) { + player.sendMessage(SchematicSystem.PREFIX + "§cDu kannst nur deine eigenen Schematics einsenden."); + return; + } + + if (node.isDir()) { + player.sendMessage(SchematicSystem.PREFIX + "§cOrdner haben keinen Typen."); + return; + } + + if(!type.isAssignable()) { + player.sendMessage(SchematicSystem.PREFIX + "§cZu diesem Typen können keine Schematics geändert werden."); + } + + if (node.getSchemtype().equals(type)) { + player.sendMessage(SchematicSystem.PREFIX + "§cDie Schematic hat schon diesen Typen"); + return; + } + + if (type.writeable()) { + node.setSchemtype(type); + player.sendMessage(SchematicSystem.PREFIX + "§aSchematictyp geändert"); + } else if (type.fightType()) { + if (node.getSchemtype().check()) { + player.sendMessage(SchematicSystem.PREFIX + "§cDu hast diese Schematic bereits eingesendet"); + return; + } + + AutoCheckResult result = CheckSchemType.get(type).autoCheck(node); + Collection errors = result.errors(); + for (String warning : result.warnings()) { + player.sendMessage(" §e" + warning); + } + for (String error : errors) { + player.sendMessage(" §c" + error); + } + if (!errors.isEmpty()) { + player.sendMessage(SchematicSystem.PREFIX + "§cDie Schematic ist nicht regelkonform"); + return; + } + + if (extend == null) { + SWInventory inv = new SWInventory(player, 9, "Schematic ausfahren"); + inv.setItem(0, SWItem.getDye(10), (byte) 10, "§eSchematic ausfahren", click -> { + new PrepareSchemPacket(SteamwarUser.get(player.getUniqueId()), node, type).send(player); + player.sendMessage(SchematicSystem.PREFIX + "§aDer Vorbereitungsserver wird gestartet"); + player.closeInventory(); + }); + inv.setItem(8, SWItem.getDye(7), (byte) 7, "§eDirekt einsenden", click -> { + node.setSchemtype(type.checkType()); + player.sendMessage(SchematicSystem.PREFIX + "§aDie Schematic wird zeitnah überprüft"); + player.closeInventory(); + }); + inv.setCallback(-999, click -> player.closeInventory()); + inv.open(); + } else if (extend == SchematicCommand.Extend.AUSFAHREN) { + new PrepareSchemPacket(SteamwarUser.get(player.getUniqueId()), node, type).send(player); + player.sendMessage(SchematicSystem.PREFIX + "§aDer Vorbereitungsserver wird gestartet"); + } + } + } +} diff --git a/SchematicSystem_Core/src/plugin.yml b/SchematicSystem_Core/src/plugin.yml index 35345c4..457fdd9 100644 --- a/SchematicSystem_Core/src/plugin.yml +++ b/SchematicSystem_Core/src/plugin.yml @@ -1,13 +1,9 @@ name: SchematicSystem -version: "1.0" -authors: [Yaruma3341, Lixfel] +version: "2.0" +authors: [Yaruma3341, Lixfel, Chaoscaot] depend: [SpigotCore, WorldEdit] main: de.steamwar.schematicsystem.SchematicSystem +website: steamwar.de api-version: "1.13" -commands: - schem: - aliases: - - schematic - - /schematic - - /schem \ No newline at end of file +commands: \ No newline at end of file diff --git a/pom.xml b/pom.xml index 27a550f..b1a8c5c 100644 --- a/pom.xml +++ b/pom.xml @@ -16,6 +16,7 @@ + clean package org.apache.maven.plugins