SteamWar/SpigotCore
Archiviert
13
0

Last Filters in SchematicSelector
Alle Prüfungen waren erfolgreich
SteamWarCI Build successful

Dieser Commit ist enthalten in:
Chaoscaot 2023-10-23 19:17:53 +02:00
Ursprung 97461b198d
Commit 5558d9ccf7
3 geänderte Dateien mit 123 neuen und 42 gelöschten Zeilen

Datei anzeigen

@ -69,6 +69,11 @@ SCHEM_SELECTOR_SCHEMATIC=Schematic
SCHEM_SELECTOR_DIRECTORY=Directory SCHEM_SELECTOR_DIRECTORY=Directory
SCHEM_SELECTOR_SCHEMATIC_NODE=Schematic/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 MATERIAL_SELECTOR_TITLE=Select material
BAN_TEAM={0} §e{1} §7was §e§lbanned§7 by §e{2} {3}§8: §f{4} BAN_TEAM={0} §e{1} §7was §e§lbanned§7 by §e{2} {3}§8: §f{4}

Datei anzeigen

@ -64,6 +64,11 @@ SCHEM_SELECTOR_SCHEMATIC=Schematic
SCHEM_SELECTOR_DIRECTORY=Ordner SCHEM_SELECTOR_DIRECTORY=Ordner
SCHEM_SELECTOR_SCHEMATIC_NODE=Schematic/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 MATERIAL_SELECTOR_TITLE=Material auswählen
BAN_TEAM={0} §e{1} §7wurde von §e{2} {3} §e§lgebannt§8: §f{4} BAN_TEAM={0} §e{1} §7wurde von §e{2} {3} §e§lgebannt§8: §f{4}

Datei anzeigen

@ -34,6 +34,7 @@ import java.util.function.Consumer;
public class SchematicSelector { public class SchematicSelector {
private static final Sorting[] all_sortings = Sorting.values(); private static final Sorting[] all_sortings = Sorting.values();
private static final Map<Player, SelectorFilter[]> filterCache = new HashMap<>();
@Getter @Getter
private final Player player; private final Player player;
@ -44,7 +45,7 @@ public class SchematicSelector {
private Consumer<SchematicNode> callback; private Consumer<SchematicNode> callback;
private final SelectorTarget target; private final SelectorTarget target;
@Getter @Getter
private final SelectorFilter filter = new SelectorFilter(); private SelectorFilter filter;
private SchematicSelectorInjectable injectable = SchematicSelectorInjectable.DEFAULT; private SchematicSelectorInjectable injectable = SchematicSelectorInjectable.DEFAULT;
@Setter @Setter
@Getter @Getter
@ -96,7 +97,7 @@ public class SchematicSelector {
private void openList(SchematicNode parent) { private void openList(SchematicNode parent) {
lastParent = parent; lastParent = parent;
List<SchematicNode> nodes = applySorting(filter.isFilter()?getFilteredSchematics():getSchematicList(parent)); List<SchematicNode> nodes = applySorting(filter != null?getFilteredSchematics():getSchematicList(parent));
if(sdoTrigger) { if(sdoTrigger) {
sdoTrigger = false; sdoTrigger = false;
@ -115,7 +116,7 @@ public class SchematicSelector {
list.add(renderItem(node)); list.add(renderItem(node));
} }
SWListInv<SchematicNode> 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<SchematicNode> 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(publicMode == PublicMode.ALL) {
if(user.getId() == 0) { if(user.getId() == 0) {
inv.setItem(48, Material.BUCKET, Core.MESSAGE.parse("SCHEM_SELECTOR_OWN", player), clickType -> { inv.setItem(48, Material.BUCKET, Core.MESSAGE.parse("SCHEM_SELECTOR_OWN", player), clickType -> {
@ -188,12 +189,12 @@ public class SchematicSelector {
return; return;
} }
if(node.isDir()) { if(node.isDir()) {
if(filter.isFilter() && target.target.dirs) { if(filter != null && target.target.dirs) {
player.closeInventory(); player.closeInventory();
callback.accept(node); callback.accept(node);
return; return;
} }
filter.reset(); filter = null;
depth++; depth++;
openList(node); openList(node);
return; return;
@ -227,9 +228,9 @@ public class SchematicSelector {
private SWListInv.SWListEntry<SchematicNode> renderItem(SchematicNode node) { private SWListInv.SWListEntry<SchematicNode> renderItem(SchematicNode node) {
Material m = SWItem.getMaterial(node.getItem()); 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())); 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() { 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 -> { InvCallback nameCallback = clickType -> {
if(clickType.isRightClick()) { if(clickType.isRightClick()) {
filter.setName(null); filter = filter.withName(null);
openFilter(); openFilter();
} else { } else {
SWAnvilInv swAnvilInv = new SWAnvilInv(player, Core.MESSAGE.parse("SCHEM_SELECTOR_FILTER_ENTER_NAME", player)); 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.setItem(Material.NAME_TAG, Collections.singletonList(Core.MESSAGE.parse("SCHEM_SELECTOR_CLICK_BACK", player)), false);
swAnvilInv.setCallback(s -> { swAnvilInv.setCallback(s -> {
filter.setName(s); filter = filter.withName(s);
openFilter(); openFilter();
}); });
addLeftCloseAction(swAnvilInv, this::openFilter); addLeftCloseAction(swAnvilInv, this::openFilter);
@ -297,14 +302,14 @@ public class SchematicSelector {
InvCallback ownerCallback = clickType -> { InvCallback ownerCallback = clickType -> {
if(clickType.isRightClick()) { if(clickType.isRightClick()) {
filter.setOwner(null); filter = filter.withOwner(null);
openFilter(); openFilter();
} else { } else {
SWAnvilInv swAnvilInv = new SWAnvilInv(player, Core.MESSAGE.parse("SCHEM_SELECTOR_FILTER_ENTER_OWNER", player)); 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.setItem(SWItem.getMaterial("SKULL_ITEM"), (byte) 3, Collections.singletonList(Core.MESSAGE.parse("SCHEM_SELECTOR_CLICK_BACK", player)), false);
swAnvilInv.setCallback(s -> { swAnvilInv.setCallback(s -> {
if(SteamwarUser.get(s) != null) { if(SteamwarUser.get(s) != null) {
filter.setOwner(SteamwarUser.get(s).getId()); filter = filter.withOwner(SteamwarUser.get(s).getId());
} }
openFilter(); openFilter();
}); });
@ -327,15 +332,13 @@ public class SchematicSelector {
if(target.target != Target.SCHEMATIC_TYPE) { if(target.target != Target.SCHEMATIC_TYPE) {
InvCallback schemTypeCallback = clickType -> { InvCallback schemTypeCallback = clickType -> {
if(clickType.isRightClick()) { if(clickType.isRightClick()) {
filter.setType(null); filter = filter.withType(null);
openFilter(); openFilter();
} else { } else {
List<SWListInv.SWListEntry<SchematicType>> types = new ArrayList<>(); List<SWListInv.SWListEntry<SchematicType>> types = new ArrayList<>();
SchematicType.values().forEach(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)));
types.add(new SWListInv.SWListEntry<>(new SWItem(SWItem.getMaterial(schematicType.getMaterial()), "§e" + schematicType.name(), Collections.emptyList(), schematicType.fightType(), n -> {}), schematicType));
});
SWListInv<SchematicType> listInv = new SWListInv<>(player, Core.MESSAGE.parse("SCHEM_SELECTOR_FILTER_SEL_TYPE", player), types, (clickType1, schematicType) -> { SWListInv<SchematicType> listInv = new SWListInv<>(player, Core.MESSAGE.parse("SCHEM_SELECTOR_FILTER_SEL_TYPE", player), types, (clickType1, schematicType) -> {
filter.setType(schematicType); filter = filter.withType(schematicType);
openFilter(); openFilter();
}); });
listInv.open(); listInv.open();
@ -351,11 +354,11 @@ public class SchematicSelector {
InvCallback materialCallback = clickType -> { InvCallback materialCallback = clickType -> {
if(clickType.isRightClick()) { if(clickType.isRightClick()) {
filter.setItem(null); filter = filter.withItem(null);
openFilter(); openFilter();
} else { } else {
UtilGui.openMaterialSelector(player, material -> { UtilGui.openMaterialSelector(player, material -> {
filter.setItem(material); filter = filter.withItem(material);
openFilter(); 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); 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 -> { inv.setItem(7, SWItem.getDye(1), Core.MESSAGE.parse("SCHEM_SELECTOR_CANCEL", player), clickType -> {
filter.reset(); filter = null;
depth = 0; depth = 0;
openList(null); openList(null);
}); });
inv.setItem(8, SWItem.getDye(10), Core.MESSAGE.parse("SCHEM_SELECTOR_GO", player), clickType -> { 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); injectable.onFilterApply(this);
depth = 0; depth = 0;
openList(null); openList(null);
@ -454,7 +493,7 @@ public class SchematicSelector {
} }
@AllArgsConstructor @AllArgsConstructor
static class SelectorTarget { public static class SelectorTarget {
private final Target target; private final Target target;
private final SchematicType type; private final SchematicType type;
@ -476,31 +515,19 @@ public class SchematicSelector {
} }
} }
@NoArgsConstructor
@Getter @Getter
@Setter @Setter
@AllArgsConstructor
@With
@EqualsAndHashCode
public static class SelectorFilter { public static class SelectorFilter {
private final String name;
private boolean filter; private final Integer owner;
private final SchematicType type;
private String name = null; private final Material item;
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;
}
public boolean matches(SchematicNode node) { public boolean matches(SchematicNode node) {
boolean matches = true; boolean matches = name == null || node.getName().contains(name);
if(name != null && !node.getName().contains(name)) {
matches = false;
}
if(owner != null && node.getOwner() != owner) { if(owner != null && node.getOwner() != owner) {
matches = false; matches = false;
@ -523,6 +550,50 @@ public class SchematicSelector {
} }
return matches; return matches;
} }
public long getCount() {
return Arrays.stream(new Object[]{name, owner, type, item}).filter(Objects::nonNull).count();
}
public List<String> getItemLore(Player player) {
List<String> 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<String> 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 { public enum PublicMode {