diff --git a/SchematicSystem_Main/src/de/steamwar/schematicsystem/commands/GUI.java b/SchematicSystem_Main/src/de/steamwar/schematicsystem/commands/GUI.java index 37bd232..8183e09 100644 --- a/SchematicSystem_Main/src/de/steamwar/schematicsystem/commands/GUI.java +++ b/SchematicSystem_Main/src/de/steamwar/schematicsystem/commands/GUI.java @@ -24,11 +24,10 @@ import de.steamwar.inventory.SWInventory; import de.steamwar.inventory.SWItem; import de.steamwar.inventory.SWListInv; import de.steamwar.schematicsystem.SchematicSystem; -import de.steamwar.schematicsystem.util.SchematicSelector; -import de.steamwar.schematicsystem.util.SchematicSelectorInjectable; -import de.steamwar.schematicsystem.util.SchematicSelectorInjectableAdapter; -import de.steamwar.schematicsystem.util.UtilGui; import de.steamwar.sql.*; +import de.steamwar.util.SchematicSelector; +import de.steamwar.util.SchematicSelectorInjectableAdapter; +import de.steamwar.util.UtilGui; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; @@ -59,7 +58,7 @@ public class GUI { }, node -> { info(player, node); }); - selector.setTitle("Schematic GUI"); + selector.setTitle("Schematic GUI: {1}"); selector.open(); } diff --git a/SchematicSystem_Main/src/de/steamwar/schematicsystem/util/SchematicSelector.java b/SchematicSystem_Main/src/de/steamwar/schematicsystem/util/SchematicSelector.java deleted file mode 100644 index d69bc2c..0000000 --- a/SchematicSystem_Main/src/de/steamwar/schematicsystem/util/SchematicSelector.java +++ /dev/null @@ -1,413 +0,0 @@ -/* - This file is a part of the SteamWar software. - - Copyright (C) 2021 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.util; - -import com.google.common.collect.Lists; -import de.steamwar.inventory.*; -import de.steamwar.sql.SchematicNode; -import de.steamwar.sql.SchematicType; -import de.steamwar.sql.SteamwarUser; -import lombok.*; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.function.Consumer; - -public class SchematicSelector { - - @Getter - private final Player player; - @Getter - private final SteamwarUser user; - @Getter - private final Consumer callback; - @Getter - private final SelectorTarget target; - @Getter - private final SelectorFilter filter = new SelectorFilter(); - private SchematicSelectorInjectable injectable; - private boolean useHooks; - @Setter - @Getter - private boolean allowPublics = true; - @Setter - @Getter - private String title = "{0} auswahl"; - - public SchematicSelector(Player player, SelectorTarget target, Consumer callback) { - this.player = player; - this.user = SteamwarUser.get(player.getUniqueId()); - this.target = target; - this.callback = callback; - } - - public SchematicSelector(Player player, SelectorTarget target, SchematicSelectorInjectable injectable, Consumer callback) { - this(player, target, callback); - this.useHooks = true; - this.injectable = injectable; - } - - public void open() { - if(useHooks) { - injectable.onSelectorCreate(this); - } - openList(null, false); - } - - private void openList(SchematicNode parent, boolean publics) { - List> list = new ArrayList<>(); - - if(parent != null) { - list.add(new SWListInv.SWListEntry<>(new SWItem(Material.ARROW, "§eZurück", clickType -> {}), null)); - } - - List nodes = new ArrayList<>(); - - if(filter.isFilter()) { - nodes.addAll(SchematicNode.getAllSchematicsAccessibleByUser(publics?0:user.getId())); - nodes.removeIf(node -> { - if(useHooks) { - injectable.onNodeFilter(this, node); - } - return !filter.matches(node); - }); - if(target.target == SelectorTarget.Target.DIRECTORY) { - nodes.removeIf(node -> !node.isDir()); - } - if(target.target == SelectorTarget.Target.SCHEMATIC_TYPE) { - nodes.removeIf(node -> node.isDir() || !node.getType().equals(target.type.toDB())); - } - } else { - switch (target.target) { - case DIRECTORY: - if(parent == null) { - nodes.addAll(SchematicNode.getSchematicsAccessibleByUser(publics?0:user.getId(), null)); - nodes.removeIf(node -> !node.isDir()); - } else { - nodes.addAll(SchematicNode.getSchematicDirectoryInNode(parent.getId())); - } - break; - case SCHEMATIC_TYPE: - nodes.addAll(SchematicNode.getAccessibleSchematicsOfTypeInParent(publics?0:user.getId(), target.type.toDB(), parent==null?0:parent.getId())); - break; - default: - nodes.addAll(SchematicNode.getSchematicsAccessibleByUser(publics?0:user.getId(), parent == null?0:parent.getId())); - } - } - - for (SchematicNode node : nodes) { - Material m; - if (node.getItem().isEmpty()) - m = node.isDir()?SWItem.getMaterial("CHEST"):SWItem.getMaterial("CAULDRON_ITEM"); - else - m = SWItem.getMaterial(node.getItem()); - - String name = "§" + (filter.getName().isEmpty()?"e":"7") + node.getName(); - - if(!filter.getName().isEmpty()) { - name = name.replace(filter.getName(), "§e" + filter.getName() + "§7"); - } - - SWItem item = new SWItem(m, name, Collections.singletonList(node.isDir() ? "§9Ordner" : "§7" + node.getSchemtype().name()), !node.isDir() && !node.getSchemtype().writeable(), click -> { - }); - if(!node.isDir()) { - if(node.getRank() > 0) - item.setLore(Lists.newArrayList("§7" + node.getSchemtype().name(), "§8Rang " + node.getRank())); - } - list.add(new SWListInv.SWListEntry<>(item, node)); - } - - SWListInv inv = new SWListInv<>(player, MessageFormat.format(title, target.target.getName()), false, list, (clickType, node) -> { - if(node == null) { - openList(getParent(parent), publics); - return; - } - if(node.isDir()) { - if(filter.isFilter() && target.target.isDirs()) { - player.closeInventory(); - callback.accept(node); - return; - } - filter.reset(); - openList(node, publics); - return; - } - player.closeInventory(); - callback.accept(node); - }); - if(allowPublics) { - if(publics) { - inv.setItem(48, Material.BUCKET, "§7Eigene Schematics", clickType -> openList(null, false)); - } else { - inv.setItem(48, Material.GLASS, "§7Public Schematics", clickType -> openList(null, true)); - } - } - if(target.target.isDirs()) { - inv.setItem(49, SWItem.getDye(10), "§7Ordner auswählen", clickType -> { - player.closeInventory(); - callback.accept(parent); - }); - } - if(!publics) { - inv.setItem(50, Material.CHEST, "§7Neuer Ordner", clickType -> createFolderIn(parent)); - } - inv.setItem(51, Material.NAME_TAG, "§7Filter", clickType -> openFilter(publics)); - - if(useHooks) { - injectable.onListRender(this, inv, parent); - } - inv.open(); - } - - private void createFolderIn(SchematicNode parent) { - SWAnvilInv inv = new SWAnvilInv(player, "Ordner Erstellen"); - inv.setItem(Material.CHEST); - inv.setCallback(s -> { - if(useHooks) { - if(injectable.onFolderCreate(this, s)) { - SchematicNode.createSchematicDirectory(user.getId(), s, parent==null?0:parent.getId()); - openList(parent, false); - } - } else { - SchematicNode.createSchematicDirectory(user.getId(), s, parent==null?0:parent.getId()); - openList(parent, false); - } - }); - inv.open(); - } - - private void openFilter(boolean publics) { - SWInventory inv = new SWInventory(player, 9, "Filter"); - InvCallback nameCallback = clickType -> { - if(clickType.isRightClick()) { - filter.setName(""); - openFilter(publics); - } else { - SWAnvilInv swAnvilInv = new SWAnvilInv(player, "Name eingeben"); - swAnvilInv.setItem(Material.NAME_TAG); - swAnvilInv.setCallback(s -> { - filter.setName(s); - openFilter(publics); - }); - swAnvilInv.open(); - } - }; - if(filter.getName().isEmpty()) { - inv.setItem(0, Material.NAME_TAG, "§7Nach namen suchen...", nameCallback); - } else { - inv.setItem(0, Material.NAME_TAG, "§7Nach namen suchen...", Collections.singletonList("§7Suchwort: §e" + filter.getName()), true, nameCallback); - } - - InvCallback ownerCallback = clickType -> { - if(clickType.isRightClick()) { - filter.setOwner(null); - openFilter(publics); - } else { - SWAnvilInv swAnvilInv = new SWAnvilInv(player, "Besitzer eingeben"); - swAnvilInv.setItem(Material.PLAYER_HEAD); - swAnvilInv.setCallback(s -> { - filter.setOwner(SteamwarUser.get(s).getId()); - openFilter(publics); - }); - swAnvilInv.open(); - } - }; - if(filter.getOwner() == null) { - inv.setItem(1, Material.PLAYER_HEAD, "§7Nach Besitzer suchen...", ownerCallback); - } else { - SteamwarUser user = SteamwarUser.get(filter.getOwner()); - SWItem item = SWItem.getPlayerSkull(user.getUserName()); - item.setName("§7Nach Besitzer suchen..."); - item.setEnchanted(true); - item.setLore(Collections.singletonList("§7Besitzer: §e" + user.getUserName())); - item.setCallback(ownerCallback); - inv.setItem(1, item); - } - - if(target.target == SelectorTarget.Target.SCHEMATIC_TYPE) { - InvCallback schemTypeCallback = clickType -> { - if(clickType.isRightClick()) { - filter.setType(null); - openFilter(publics); - } else { - List> types = new ArrayList<>(); - SchematicType.values().forEach(schematicType -> { - types.add(new SWListInv.SWListEntry<>(new SWItem(SWItem.getMaterial("STONE_BUTTON"), "§e" + schematicType.name(), Collections.emptyList(), schematicType.fightType(), n -> {}), schematicType)); - }); - SWListInv listInv = new SWListInv<>(player, "Typ wählen...", types, (clickType1, schematicType) -> { - filter.setType(schematicType); - openFilter(publics); - }); - listInv.open(); - } - }; - - if(filter.getType() == null) { - inv.setItem(2, SWItem.getMaterial("STONE_BUTTON"), "§7Nach Typ Filtern...", schemTypeCallback); - } else { - inv.setItem(2, SWItem.getMaterial("STONE_BUTTON"), "§7Nach Typ Filtern...", Collections.singletonList("§7Typ: §e" + filter.getType().name()), true, schemTypeCallback); - } - } - - InvCallback materialCallback = clickType -> { - if(clickType.isRightClick()) { - filter.setItem(null); - openFilter(publics); - } else { - UtilGui.openMaterialSelector(player, material -> { - filter.setItem(material); - openFilter(publics); - }); - } - }; - - final int iSlot = target.target== SelectorTarget.Target.SCHEMATIC_TYPE?2:3; - - if(filter.getItem() == null) { - inv.setItem(iSlot, Material.STONE, "§7Nach Item Filtern...", materialCallback); - } else { - inv.setItem(iSlot, filter.getItem(), "§7Nach Item Filtern...", Collections.singletonList("§7Item: §e" + filter.getItem().name()), true, materialCallback); - } - - inv.setItem(7, SWItem.getDye(1), "§eAbbrechen", clickType -> { - filter.reset(); - openList(null, publics); - }); - inv.setItem(8, SWItem.getDye(10), "§eSuchen...", clickType -> { - filter.setFilter(true); - if(useHooks) { - injectable.onFilterApply(this); - } - openList(null, publics); - }); - - if(useHooks) { - injectable.onFilterRender(this, inv); - } - - inv.open(); - } - - private static SchematicNode getParent(SchematicNode node) { - if(node.getParent() == null) { - return null; - } - return node.getParentNode(); - } - - public static SelectorTarget selectSchematic() { - return new SelectorTarget(SelectorTarget.Target.SCHEMATIC, null); - } - - public static SelectorTarget selectDirectory() { - return new SelectorTarget(SelectorTarget.Target.DIRECTORY, null); - } - - public static SelectorTarget selectSchematicNode() { - return new SelectorTarget(SelectorTarget.Target.SCHEMATIC_NODE, null); - } - - public static SelectorTarget selectSchematicType(SchematicType type) { - return new SelectorTarget(SelectorTarget.Target.SCHEMATIC_TYPE, type); - } - - private static class SelectorTarget { - - private final Target target; - private final SchematicType type; - - private SelectorTarget(Target target, SchematicType type) { - this.target = target; - this.type = type; - } - - @AllArgsConstructor - private enum Target { - SCHEMATIC("Schematic", false), - DIRECTORY("Ordner", true), - SCHEMATIC_NODE("Schematic/Ordner", true), - SCHEMATIC_TYPE("Schematic", false); - - @Getter - private String name; - @Getter - private boolean dirs; - } - } - - @NoArgsConstructor - @Getter - @Setter - public static class SelectorFilter { - - private boolean filter; - - private String name = ""; - private Integer owner = null; - private SchematicType type = null; - private Material item = null; - - public void reset() { - name = ""; - owner = null; - type = null; - item = null; - filter = false; - } - - public boolean matches(SchematicNode node) { - boolean matches = true; - if(!name.isEmpty()) { - if(!node.getName().contains(name)) { - matches = false; - } - } - - if(owner != null) { - if(node.getOwner() != owner) { - matches = false; - } - } - - if(type != null) { - if(node.isDir() || !node.getType().equals(type.toDB())) { - matches = false; - } - } - - if(item != null) { - String i; - if(node.getItem().isEmpty()) { - i = node.isDir()?"CHEST":"CAULDRON"; - } else { - i = node.getItem(); - } - if(!item.name().equals(i)) { - matches = false; - } - } - return matches; - } - } -} diff --git a/SchematicSystem_Main/src/de/steamwar/schematicsystem/util/SchematicSelectorInjectable.java b/SchematicSystem_Main/src/de/steamwar/schematicsystem/util/SchematicSelectorInjectable.java deleted file mode 100644 index aa8768f..0000000 --- a/SchematicSystem_Main/src/de/steamwar/schematicsystem/util/SchematicSelectorInjectable.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - This file is a part of the SteamWar software. - - Copyright (C) 2021 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.util; - -import de.steamwar.inventory.SWInventory; -import de.steamwar.inventory.SWListInv; -import de.steamwar.sql.SchematicNode; - -public interface SchematicSelectorInjectable { - - void onSelectorCreate(SchematicSelector selector); - - void onListRender(SchematicSelector selector, SWListInv inv, SchematicNode parent); - - void onFilterRender(SchematicSelector selector, SWInventory inventory); - - void onFilterApply(SchematicSelector selector); - - boolean onFolderCreate(SchematicSelector selector, String name); - - void onNodeFilter(SchematicSelector selector, SchematicNode node); -} diff --git a/SchematicSystem_Main/src/de/steamwar/schematicsystem/util/SchematicSelectorInjectableAdapter.java b/SchematicSystem_Main/src/de/steamwar/schematicsystem/util/SchematicSelectorInjectableAdapter.java deleted file mode 100644 index 046e99b..0000000 --- a/SchematicSystem_Main/src/de/steamwar/schematicsystem/util/SchematicSelectorInjectableAdapter.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - This file is a part of the SteamWar software. - - Copyright (C) 2021 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.util; - -import de.steamwar.inventory.SWInventory; -import de.steamwar.inventory.SWListInv; -import de.steamwar.sql.SchematicNode; -import org.bukkit.entity.Player; - -public abstract class SchematicSelectorInjectableAdapter implements SchematicSelectorInjectable { - @Override - public void onSelectorCreate(SchematicSelector selector) {} - - @Override - public void onListRender(SchematicSelector selector, SWListInv inv, SchematicNode parent) {} - - @Override - public void onFilterRender(SchematicSelector selector, SWInventory inventory) {} - - @Override - public void onFilterApply(SchematicSelector selector) {} - - @Override - public boolean onFolderCreate(SchematicSelector selector, String name) { - return true; - } - - @Override - public void onNodeFilter(SchematicSelector selector, SchematicNode node) {} -} diff --git a/SchematicSystem_Main/src/de/steamwar/schematicsystem/util/UtilGui.java b/SchematicSystem_Main/src/de/steamwar/schematicsystem/util/UtilGui.java deleted file mode 100644 index 709f0c8..0000000 --- a/SchematicSystem_Main/src/de/steamwar/schematicsystem/util/UtilGui.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - 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.util; - -import de.steamwar.inventory.SWItem; -import de.steamwar.inventory.SWListInv; -import lombok.experimental.UtilityClass; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -import java.util.LinkedList; -import java.util.List; -import java.util.function.Consumer; - -@UtilityClass -public class UtilGui { - - public static void openMaterialSelector(Player player, Consumer callback) { - openMaterialSelector(player, "Material auswählen", callback); - } - - public static void openMaterialSelector(Player player, String title, Consumer callback) { - List> materials = new LinkedList<>(); - for(Material material : Material.values()){ - if(material.name().startsWith(Material.LEGACY_PREFIX)) - continue; - SWItem item = new SWItem(material, "§7" + material.name()); - if(item.getItemMeta() != null && material.isItem()) { - materials.add(new SWListInv.SWListEntry<>(item, material)); - } - } - - SWListInv swListInv = new SWListInv<>(player, title, materials, (clickType3, material) -> callback.accept(material)); - swListInv.open(); - } -}