From 5558d9ccf7dc966783ee46b00bc9c7ee851972fd Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Mon, 23 Oct 2023 19:17:53 +0200 Subject: [PATCH 1/2] Last Filters in SchematicSelector --- SpigotCore_Main/src/SpigotCore.properties | 5 + SpigotCore_Main/src/SpigotCore_de.properties | 5 + .../steamwar/inventory/SchematicSelector.java | 155 +++++++++++++----- 3 files changed, 123 insertions(+), 42 deletions(-) diff --git a/SpigotCore_Main/src/SpigotCore.properties b/SpigotCore_Main/src/SpigotCore.properties index 388f441..04425f0 100644 --- a/SpigotCore_Main/src/SpigotCore.properties +++ b/SpigotCore_Main/src/SpigotCore.properties @@ -69,6 +69,11 @@ SCHEM_SELECTOR_SCHEMATIC=Schematic SCHEM_SELECTOR_DIRECTORY=Directory SCHEM_SELECTOR_SCHEMATIC_NODE=Schematic/Directory +SCHEM_SELECTOR_FILTER_TITLE_SINGLE=§eSingle Filter +SCHEM_SELECTOR_FILTER_TITLE_MULTI=§e{0} Filters +SCHEM_SELECTOR_FILTER_TITLE_EMPTY=§eNo Filters +SCHEM_SELECTOR_FILTER_EMPTY=§7Empty + MATERIAL_SELECTOR_TITLE=Select material BAN_TEAM={0} §e{1} §7was §e§lbanned§7 by §e{2} {3}§8: §f{4} diff --git a/SpigotCore_Main/src/SpigotCore_de.properties b/SpigotCore_Main/src/SpigotCore_de.properties index 1279d36..967190b 100644 --- a/SpigotCore_Main/src/SpigotCore_de.properties +++ b/SpigotCore_Main/src/SpigotCore_de.properties @@ -64,6 +64,11 @@ SCHEM_SELECTOR_SCHEMATIC=Schematic SCHEM_SELECTOR_DIRECTORY=Ordner SCHEM_SELECTOR_SCHEMATIC_NODE=Schematic/Ordner +SCHEM_SELECTOR_FILTER_TITLE_SINGLE=§eEinzelfilter +SCHEM_SELECTOR_FILTER_TITLE_MULTI=§e{0} §e§lMehrfachfilter +SCHEM_SELECTOR_FILTER_TITLE_EMPTY=§eKeine Filter +SCHEM_SELECTOR_FILTER_EMPTY=§7Leer + MATERIAL_SELECTOR_TITLE=Material auswählen BAN_TEAM={0} §e{1} §7wurde von §e{2} {3} §e§lgebannt§8: §f{4} diff --git a/SpigotCore_Main/src/de/steamwar/inventory/SchematicSelector.java b/SpigotCore_Main/src/de/steamwar/inventory/SchematicSelector.java index ed3f856..e5b54e0 100644 --- a/SpigotCore_Main/src/de/steamwar/inventory/SchematicSelector.java +++ b/SpigotCore_Main/src/de/steamwar/inventory/SchematicSelector.java @@ -34,6 +34,7 @@ import java.util.function.Consumer; public class SchematicSelector { private static final Sorting[] all_sortings = Sorting.values(); + private static final Map filterCache = new HashMap<>(); @Getter private final Player player; @@ -44,7 +45,7 @@ public class SchematicSelector { private Consumer callback; private final SelectorTarget target; @Getter - private final SelectorFilter filter = new SelectorFilter(); + private SelectorFilter filter; private SchematicSelectorInjectable injectable = SchematicSelectorInjectable.DEFAULT; @Setter @Getter @@ -96,7 +97,7 @@ public class SchematicSelector { private void openList(SchematicNode parent) { lastParent = parent; - List nodes = applySorting(filter.isFilter()?getFilteredSchematics():getSchematicList(parent)); + List nodes = applySorting(filter != null?getFilteredSchematics():getSchematicList(parent)); if(sdoTrigger) { sdoTrigger = false; @@ -115,7 +116,7 @@ public class SchematicSelector { list.add(renderItem(node)); } - SWListInv inv = new SWListInv<>(player, MessageFormat.format(injectable.createTitle(player), target.target.getName(player), filter.getName() == null?(parent == null?"/":parent.generateBreadcrumbs()):filter.getName()), false, list, (clickType, node) -> handleClick(node, parent)); + SWListInv inv = new SWListInv<>(player, MessageFormat.format(injectable.createTitle(player), target.target.getName(player), (filter == null || filter.getName() == null)?(parent == null?"/":parent.generateBreadcrumbs()):filter.getName()), false, list, (clickType, node) -> handleClick(node, parent)); if(publicMode == PublicMode.ALL) { if(user.getId() == 0) { inv.setItem(48, Material.BUCKET, Core.MESSAGE.parse("SCHEM_SELECTOR_OWN", player), clickType -> { @@ -188,12 +189,12 @@ public class SchematicSelector { return; } if(node.isDir()) { - if(filter.isFilter() && target.target.dirs) { + if(filter != null && target.target.dirs) { player.closeInventory(); callback.accept(node); return; } - filter.reset(); + filter = null; depth++; openList(node); return; @@ -227,9 +228,9 @@ public class SchematicSelector { private SWListInv.SWListEntry renderItem(SchematicNode node) { Material m = SWItem.getMaterial(node.getItem()); - String name = Core.MESSAGE.parse(filter.name == null?"SCHEM_SELECTOR_ITEM_NAME":"SCHEM_SELECTOR_ITEM_NAME_FILTER", player, node.getName()); + String name = Core.MESSAGE.parse((filter != null && filter.name == null)?"SCHEM_SELECTOR_ITEM_NAME":"SCHEM_SELECTOR_ITEM_NAME_FILTER", player, node.getName()); - if(filter.getName() != null) { + if(filter != null && filter.getName() != null) { name = name.replace(filter.getName(), Core.MESSAGE.parse("SCHEM_SELECTOR_ITEM_REPLACE", player, filter.getName())); } @@ -273,16 +274,20 @@ public class SchematicSelector { } private void openFilter() { - SWInventory inv = new SWInventory(player, 9, Core.MESSAGE.parse("SCHEM_SELECTOR_FILTER_TITLE", player)); + if (filter == null) { + filter = new SelectorFilter(null, null, null, null); + } + + SWInventory inv = new SWInventory(player, 9 * 2, Core.MESSAGE.parse("SCHEM_SELECTOR_FILTER_TITLE", player)); InvCallback nameCallback = clickType -> { if(clickType.isRightClick()) { - filter.setName(null); + filter = filter.withName(null); openFilter(); } else { SWAnvilInv swAnvilInv = new SWAnvilInv(player, Core.MESSAGE.parse("SCHEM_SELECTOR_FILTER_ENTER_NAME", player)); swAnvilInv.setItem(Material.NAME_TAG, Collections.singletonList(Core.MESSAGE.parse("SCHEM_SELECTOR_CLICK_BACK", player)), false); swAnvilInv.setCallback(s -> { - filter.setName(s); + filter = filter.withName(s); openFilter(); }); addLeftCloseAction(swAnvilInv, this::openFilter); @@ -297,14 +302,14 @@ public class SchematicSelector { InvCallback ownerCallback = clickType -> { if(clickType.isRightClick()) { - filter.setOwner(null); + filter = filter.withOwner(null); openFilter(); } else { SWAnvilInv swAnvilInv = new SWAnvilInv(player, Core.MESSAGE.parse("SCHEM_SELECTOR_FILTER_ENTER_OWNER", player)); swAnvilInv.setItem(SWItem.getMaterial("SKULL_ITEM"), (byte) 3, Collections.singletonList(Core.MESSAGE.parse("SCHEM_SELECTOR_CLICK_BACK", player)), false); swAnvilInv.setCallback(s -> { if(SteamwarUser.get(s) != null) { - filter.setOwner(SteamwarUser.get(s).getId()); + filter = filter.withOwner(SteamwarUser.get(s).getId()); } openFilter(); }); @@ -327,15 +332,13 @@ public class SchematicSelector { if(target.target != Target.SCHEMATIC_TYPE) { InvCallback schemTypeCallback = clickType -> { if(clickType.isRightClick()) { - filter.setType(null); + filter = filter.withType(null); openFilter(); } else { List> types = new ArrayList<>(); - SchematicType.values().forEach(schematicType -> { - types.add(new SWListInv.SWListEntry<>(new SWItem(SWItem.getMaterial(schematicType.getMaterial()), "§e" + schematicType.name(), Collections.emptyList(), schematicType.fightType(), n -> {}), schematicType)); - }); + SchematicType.values().forEach(schematicType -> types.add(new SWListInv.SWListEntry<>(new SWItem(SWItem.getMaterial(schematicType.getMaterial()), "§e" + schematicType.name(), Collections.emptyList(), schematicType.fightType(), n -> {}), schematicType))); SWListInv listInv = new SWListInv<>(player, Core.MESSAGE.parse("SCHEM_SELECTOR_FILTER_SEL_TYPE", player), types, (clickType1, schematicType) -> { - filter.setType(schematicType); + filter = filter.withType(schematicType); openFilter(); }); listInv.open(); @@ -351,11 +354,11 @@ public class SchematicSelector { InvCallback materialCallback = clickType -> { if(clickType.isRightClick()) { - filter.setItem(null); + filter = filter.withItem(null); openFilter(); } else { UtilGui.openMaterialSelector(player, material -> { - filter.setItem(material); + filter = filter.withItem(material); openFilter(); }); } @@ -369,13 +372,49 @@ public class SchematicSelector { inv.setItem(iSlot, filter.getItem(), Core.MESSAGE.parse("SCHEM_SELECTOR_FILTER_MAT", player), Collections.singletonList(Core.MESSAGE.parse("SCHEM_SELECTOR_FILTER_MAT_SEARCH", player, filter.getItem().name())), true, materialCallback); } + if (!filterCache.containsKey(player)) { + filterCache.put(player, new SelectorFilter[9]); + } + + SelectorFilter[] filters = filterCache.get(player); + + for (int i = 0; i < filters.length; i++) { + SelectorFilter filterCached = filters[i]; + if (filterCached == null) { + inv.setItem(i + 9, new SWItem(Material.BARRIER, "SCHEM_SELECTOR_FILTER_EMPTY", click -> {})); + } else { + SWItem item = filterCached.toItemStack(player); + item.setEnchanted(filterCached.equals(filter)); + inv.setItem(i + 9, item.getItemStack(), click -> { + filter = filterCached; + openFilter(); + }); + } + } + inv.setItem(7, SWItem.getDye(1), Core.MESSAGE.parse("SCHEM_SELECTOR_CANCEL", player), clickType -> { - filter.reset(); + filter = null; depth = 0; openList(null); }); inv.setItem(8, SWItem.getDye(10), Core.MESSAGE.parse("SCHEM_SELECTOR_GO", player), clickType -> { - filter.setFilter(true); + if (!filter.equals(filters[0])) { + for (int i = filters.length - 1; i > 0; i--) { + filters[i] = filters[i-1]; + if (filter.equals(filters[i])) { + filters[i] = null; + for (int j = i; j < filters.length - 1; j++) { + filters[j] = filters[j+1]; + } + filters[filters.length - 1] = null; + } + } + + filters[0] = filter; + + filterCache.put(player, filters); + } + injectable.onFilterApply(this); depth = 0; openList(null); @@ -454,7 +493,7 @@ public class SchematicSelector { } @AllArgsConstructor - static class SelectorTarget { + public static class SelectorTarget { private final Target target; private final SchematicType type; @@ -476,31 +515,19 @@ public class SchematicSelector { } } - @NoArgsConstructor @Getter @Setter + @AllArgsConstructor + @With + @EqualsAndHashCode public static class SelectorFilter { - - private boolean filter; - - private String name = null; - private Integer owner = null; - private SchematicType type = null; - private Material item = null; - - public void reset() { - name = null; - owner = null; - type = null; - item = null; - filter = false; - } + private final String name; + private final Integer owner; + private final SchematicType type; + private final Material item; public boolean matches(SchematicNode node) { - boolean matches = true; - if(name != null && !node.getName().contains(name)) { - matches = false; - } + boolean matches = name == null || node.getName().contains(name); if(owner != null && node.getOwner() != owner) { matches = false; @@ -523,6 +550,50 @@ public class SchematicSelector { } return matches; } + + public long getCount() { + return Arrays.stream(new Object[]{name, owner, type, item}).filter(Objects::nonNull).count(); + } + + public List getItemLore(Player player) { + List lore = new ArrayList<>(4); + if(name != null) { + lore.add(Core.MESSAGE.parse("SCHEM_SELECTOR_FILTER_NAME_SEARCH", player, name)); + } + if(owner != null) { + lore.add(Core.MESSAGE.parse("SCHEM_SELECTOR_FILTER_OWNER_SEARCH", player, SteamwarUser.get(owner).getUserName())); + } + if(type != null) { + lore.add(Core.MESSAGE.parse("SCHEM_SELECTOR_FILTER_TYPE_SEARCH", player, type.name())); + } + if(item != null) { + lore.add(Core.MESSAGE.parse("SCHEM_SELECTOR_FILTER_MAT_SEARCH", player, item.name())); + } + + return lore; + } + + public SWItem toItemStack(Player player) { + long count = getCount(); + String itemName = count != 1 ? Core.MESSAGE.parse("SCHEM_SELECTOR_FILTER_TITLE_MULTI", player, count) : Core.MESSAGE.parse("SCHEM_SELECTOR_FILTER_TITLE_SINGLE", player); + + List lore = getItemLore(player); + + if (name != null) { + return new SWItem(Material.NAME_TAG, itemName, lore, false, click -> {}); + } else if (owner != null) { + SWItem playerSkull = SWItem.getPlayerSkull(SteamwarUser.get(owner).getUserName()); + playerSkull.setName(itemName); + playerSkull.setLore(lore); + return playerSkull; + } else if (type != null) { + return new SWItem(SWItem.getMaterial(type.getMaterial()), itemName, lore, false, n -> {}); + } else if (item != null) { + return new SWItem(item, itemName, lore, false, click -> {}); + } else { + return new SWItem(Material.BARRIER, Core.MESSAGE.parse("SCHEM_SELECTOR_FILTER_TITLE_EMPTY", player), Collections.emptyList(), false, click -> {}); + } + } } public enum PublicMode { -- 2.39.2 From 96b73f2d282538cddeb6891cb267c8f2dca5ffe8 Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Tue, 24 Oct 2023 13:35:09 +0200 Subject: [PATCH 2/2] Persistency --- .../steamwar/inventory/SchematicSelector.java | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/SpigotCore_Main/src/de/steamwar/inventory/SchematicSelector.java b/SpigotCore_Main/src/de/steamwar/inventory/SchematicSelector.java index e5b54e0..b3e3e32 100644 --- a/SpigotCore_Main/src/de/steamwar/inventory/SchematicSelector.java +++ b/SpigotCore_Main/src/de/steamwar/inventory/SchematicSelector.java @@ -19,6 +19,9 @@ package de.steamwar.inventory; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import de.steamwar.core.Core; import de.steamwar.sql.*; import lombok.*; @@ -374,6 +377,16 @@ public class SchematicSelector { if (!filterCache.containsKey(player)) { filterCache.put(player, new SelectorFilter[9]); + + String cfg = UserConfig.getConfig(user.getId(), "selector:filters"); + + if (cfg != null) { + JsonArray array = JsonParser.parseString(cfg).getAsJsonArray(); + for (int i = 0; i < array.size(); i++) { + JsonObject object = array.get(i).getAsJsonObject(); + filterCache.get(player)[i] = new SelectorFilter(object); + } + } } SelectorFilter[] filters = filterCache.get(player); @@ -381,7 +394,7 @@ public class SchematicSelector { for (int i = 0; i < filters.length; i++) { SelectorFilter filterCached = filters[i]; if (filterCached == null) { - inv.setItem(i + 9, new SWItem(Material.BARRIER, "SCHEM_SELECTOR_FILTER_EMPTY", click -> {})); + inv.setItem(i + 9, new SWItem(Material.BARRIER, Core.MESSAGE.parse("SCHEM_SELECTOR_FILTER_EMPTY", player), click -> {})); } else { SWItem item = filterCached.toItemStack(player); item.setEnchanted(filterCached.equals(filter)); @@ -413,6 +426,14 @@ public class SchematicSelector { filters[0] = filter; filterCache.put(player, filters); + JsonArray array = new JsonArray(); + for (SelectorFilter f : filters) { + if (f != null) { + array.add(f.toJson()); + } + } + + UserConfig.updatePlayerConfig(user.getId(), "selector:filters", array.toString()); } injectable.onFilterApply(this); @@ -526,6 +547,13 @@ public class SchematicSelector { private final SchematicType type; private final Material item; + public SelectorFilter(JsonObject object) { + this.name = object.get("name").isJsonNull() ? null : object.get("name").getAsString(); + this.owner = object.get("owner").isJsonNull() ? null : object.get("owner").getAsInt(); + this.type = object.get("type").isJsonNull() ? null : SchematicType.fromDB(object.get("type").getAsString()); + this.item = object.get("item").isJsonNull() ? null : Material.valueOf(object.get("item").getAsString()); + } + public boolean matches(SchematicNode node) { boolean matches = name == null || node.getName().contains(name); @@ -594,6 +622,16 @@ public class SchematicSelector { return new SWItem(Material.BARRIER, Core.MESSAGE.parse("SCHEM_SELECTOR_FILTER_TITLE_EMPTY", player), Collections.emptyList(), false, click -> {}); } } + + public JsonObject toJson() { + JsonObject object = new JsonObject(); + object.addProperty("name", name); + object.addProperty("owner", owner); + object.addProperty("type", type == null?null:type.toDB()); + object.addProperty("item", item == null?null:item.name()); + + return object; + } } public enum PublicMode { -- 2.39.2