diff --git a/src/de/steamwar/bungeecore/BungeeCore.java b/src/de/steamwar/bungeecore/BungeeCore.java index 4013f34..16f1c32 100644 --- a/src/de/steamwar/bungeecore/BungeeCore.java +++ b/src/de/steamwar/bungeecore/BungeeCore.java @@ -156,6 +156,7 @@ public class BungeeCore extends Plugin { new LocalCommand(); new SetLocaleCommand(); new BuilderCloudCommand(); + new SlimTablistToggleCommand(); // Punishment Commands: new PunishmentCommand("ban", Punishment.PunishmentType.Ban); diff --git a/src/de/steamwar/bungeecore/commands/SlimTablistToggleCommand.java b/src/de/steamwar/bungeecore/commands/SlimTablistToggleCommand.java new file mode 100644 index 0000000..2f451f0 --- /dev/null +++ b/src/de/steamwar/bungeecore/commands/SlimTablistToggleCommand.java @@ -0,0 +1,45 @@ +/* + * 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.bungeecore.commands; + +import de.steamwar.bungeecore.Message; +import de.steamwar.bungeecore.sql.SteamwarUser; +import de.steamwar.bungeecore.sql.UserConfig; +import de.steamwar.command.SWCommand; +import net.md_5.bungee.api.connection.ProxiedPlayer; + +public class SlimTablistToggleCommand extends SWCommand { + + public SlimTablistToggleCommand() { + super("toggleslimtablist", null, "toggleslim", "toggletablist", "toggleslimtab", "toggletab"); + } + + @Register(description = "SLIMTABLIST_USAGE") + public void toggle(ProxiedPlayer player) { + SteamwarUser user = SteamwarUser.get(player.getUniqueId()); + boolean alwaysSlim = Boolean.parseBoolean(UserConfig.getConfig(user.getId(), "slimTablist")); + UserConfig.updateUserConfig(user.getId(), "slimTablist", String.valueOf(!alwaysSlim)); + if (alwaysSlim) { + Message.send("SLIMTABLIST_DISABLED", player); + } else { + Message.send("SLIMTABLIST_ENABLED", player); + } + } +} diff --git a/src/de/steamwar/bungeecore/tablist/Tablist.java b/src/de/steamwar/bungeecore/tablist/Tablist.java index 338a38d..1a2bc91 100644 --- a/src/de/steamwar/bungeecore/tablist/Tablist.java +++ b/src/de/steamwar/bungeecore/tablist/Tablist.java @@ -20,6 +20,7 @@ package de.steamwar.bungeecore.tablist; import de.steamwar.bungeecore.Storage; +import de.steamwar.bungeecore.sql.UserConfig; import de.steamwar.messages.ChatSender; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; @@ -76,7 +77,12 @@ public class Tablist extends MessageToMessageDecoder { List tablist = new ArrayList<>(); List direct = new ArrayList<>(); - global.print(viewer, player, tablist, direct); + boolean alwaysSlim = Boolean.parseBoolean(UserConfig.getConfig(viewer.user().getId(), "slimTablist")); + if (alwaysSlim || global.size(viewer, player) > 80) { + global.slimPrint(viewer, player, tablist, direct); + } else { + global.print(viewer, player, tablist, direct); + } // NPC handling List addNpc = new ArrayList<>(); diff --git a/src/de/steamwar/bungeecore/tablist/TablistBuild.java b/src/de/steamwar/bungeecore/tablist/TablistBuild.java index 15039fe..6ee3fb8 100644 --- a/src/de/steamwar/bungeecore/tablist/TablistBuild.java +++ b/src/de/steamwar/bungeecore/tablist/TablistBuild.java @@ -21,15 +21,15 @@ package de.steamwar.bungeecore.tablist; import de.steamwar.bungeecore.Servertype; import de.steamwar.bungeecore.Subserver; +import de.steamwar.bungeecore.sql.SteamwarUser; +import de.steamwar.bungeecore.sql.UserGroup; import de.steamwar.messages.ChatSender; +import net.md_5.bungee.BungeeCord; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.ProxiedPlayer; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; public class TablistBuild implements TablistPart { @@ -54,6 +54,12 @@ public class TablistBuild implements TablistPart { return "Build"; } + @Override + public int size(ChatSender viewer, ProxiedPlayer player) { + ServerInfo server = player.getServer().getInfo(); + return servers.stream().mapToInt(s -> players.get(s).size()).sum() + (players.keySet().stream().anyMatch(info -> server != info) ? 2 : 0); + } + @Override public void print(ChatSender viewer, ProxiedPlayer player, List tablist, List direct) { ServerInfo server = player.getServer().getInfo(); @@ -67,4 +73,35 @@ public class TablistBuild implements TablistPart { .forEach(((server == info) ? direct : tablist)::add); } } + + @Override + public void slimPrint(ChatSender viewer, ProxiedPlayer player, List tablist, List direct) { + ServerInfo server = player.getServer().getInfo(); + List toPrint = new ArrayList<>(); + for (ServerInfo info : servers) { + if (server == info) { + TablistServer.teamify(players.get(info), player) + .forEach(direct::add); + } else { + toPrint.addAll(players.get(info)); + } + } + if (toPrint.isEmpty()) return; + + int all = toPrint.size(); + toPrint = TablistServer.slimify(viewer, toPrint); + + if (tablist.isEmpty() || tablist.get(tablist.size() - 1).getDisplayName().equals("")) { + tablist.add(new Item(null, "", TablistServer.GRAY)); + } + if (toPrint.size() == all) { + tablist.add(new Item(null, viewer.parseToLegacy("TABLIST_BAU"), TablistServer.LIGHT_GRAY)); + } else if (toPrint.isEmpty()) { + tablist.add(new Item(null, viewer.parseToLegacy("TABLIST_BAU") + " (" + all + ")", TablistServer.LIGHT_GRAY)); + } else { + tablist.add(new Item(null, viewer.parseToLegacy("TABLIST_BAU") + " (+" + (all - toPrint.size()) + ")", TablistServer.LIGHT_GRAY)); + } + TablistServer.teamify(toPrint, player) + .forEach(tablist::add); + } } diff --git a/src/de/steamwar/bungeecore/tablist/TablistGroup.java b/src/de/steamwar/bungeecore/tablist/TablistGroup.java index fdb227a..4a654cc 100644 --- a/src/de/steamwar/bungeecore/tablist/TablistGroup.java +++ b/src/de/steamwar/bungeecore/tablist/TablistGroup.java @@ -36,10 +36,26 @@ public class TablistGroup implements TablistPart { return ""; } + @Override + public int size(ChatSender viewer, ProxiedPlayer player) { + int size = 0; + for (TablistPart part : sublists) { + size += part.size(viewer, player); + } + return size; + } + @Override public void print(ChatSender viewer, ProxiedPlayer player, List tablist, List direct) { for (TablistPart sublist : sublists) { sublist.print(viewer, player, tablist, direct); } } + + @Override + public void slimPrint(ChatSender viewer, ProxiedPlayer player, List tablist, List direct) { + for (TablistPart sublist : sublists) { + sublist.slimPrint(viewer, player, tablist, direct); + } + } } diff --git a/src/de/steamwar/bungeecore/tablist/TablistPart.java b/src/de/steamwar/bungeecore/tablist/TablistPart.java index b140114..21a352c 100644 --- a/src/de/steamwar/bungeecore/tablist/TablistPart.java +++ b/src/de/steamwar/bungeecore/tablist/TablistPart.java @@ -33,7 +33,9 @@ import java.util.UUID; interface TablistPart { String sortKey(); + int size(ChatSender viewer, ProxiedPlayer player); void print(ChatSender viewer, ProxiedPlayer player, List tablist, List direct); + void slimPrint(ChatSender viewer, ProxiedPlayer player, List tablist, List direct); class Item { diff --git a/src/de/steamwar/bungeecore/tablist/TablistServer.java b/src/de/steamwar/bungeecore/tablist/TablistServer.java index 2a63645..cef376e 100644 --- a/src/de/steamwar/bungeecore/tablist/TablistServer.java +++ b/src/de/steamwar/bungeecore/tablist/TablistServer.java @@ -19,8 +19,10 @@ package de.steamwar.bungeecore.tablist; -import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.bungeecore.Arenaserver; +import de.steamwar.bungeecore.Subserver; import de.steamwar.bungeecore.sql.SteamwarUser; +import de.steamwar.bungeecore.sql.UserGroup; import de.steamwar.messages.ChatSender; import de.steamwar.network.packets.common.FightInfoPacket; import net.md_5.bungee.BungeeCord; @@ -28,10 +30,7 @@ import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.protocol.Property; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Optional; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -66,6 +65,11 @@ public class TablistServer implements TablistPart { return server.getName(); } + @Override + public int size(ChatSender viewer, ProxiedPlayer player) { + return (player.getServer().getInfo() == server ? 2 : 0) + players.size(); + } + @Override public void print(ChatSender viewer, ProxiedPlayer player, List tablist, List direct) { boolean onServer = player.getServer().getInfo() == server; @@ -79,6 +83,30 @@ public class TablistServer implements TablistPart { teamify(players, player).forEach(items::add); } + @Override + public void slimPrint(ChatSender viewer, ProxiedPlayer player, List tablist, List direct) { + boolean onServer = player.getServer().getInfo() == server; + List items = onServer ? direct : tablist; + + List toPrint = players; + if (!onServer) { + toPrint = TablistServer.slimify(viewer, players); + + if (tablist.isEmpty() || tablist.get(tablist.size() - 1).getDisplayName().equals("")) { + items.add(new Item(null, "", GRAY)); + } + if (toPrint.size() == players.size()) { + items.add(new Item(null, "§7§l" + server.getName(), LIGHT_GRAY)); + } else if (toPrint.isEmpty()) { + items.add(new Item(null, "§7§l" + server.getName() + " (" + players.size() + ")", LIGHT_GRAY)); + } else { + items.add(new Item(null, "§7§l" + server.getName() + " (+" + (players.size() - toPrint.size()) + ")", LIGHT_GRAY)); + } + } + + teamify(toPrint, player).forEach(items::add); + } + private void addPlayers(String prefix, List teamPlayers, Collection onlinePlayers){ teamPlayers.stream().map(SteamwarUser::get).map( user -> onlinePlayers.stream().filter(player -> player.getUniqueId().equals(user.getUuid())).findAny() @@ -96,4 +124,24 @@ public class TablistServer implements TablistPart { return new Item(p, true); }); } + + public static List slimify(ChatSender viewer, List items) { + int team = viewer.user().getTeam(); + return items.stream() + .map(Item::getUuid) + .map(SteamwarUser::get) + .filter(steamwarUser -> { + if (steamwarUser.getUserGroup() != UserGroup.Member) return true; + Subserver subserver = Subserver.getSubserver(BungeeCord.getInstance().getPlayer(steamwarUser.getUuid())); + if (subserver instanceof Arenaserver && subserver.getServer().getPlayers().size() == 1) { + return true; + } + return steamwarUser.getTeam() == team; + }) + .map(SteamwarUser::getUuid) + .map(BungeeCord.getInstance()::getPlayer) + .filter(Objects::nonNull) + .map(TablistPart.Item::new) + .collect(Collectors.toList()); + } } diff --git a/src/de/steamwar/messages/BungeeCore.properties b/src/de/steamwar/messages/BungeeCore.properties index 878ede1..0bc0f6d 100644 --- a/src/de/steamwar/messages/BungeeCore.properties +++ b/src/de/steamwar/messages/BungeeCore.properties @@ -648,4 +648,9 @@ LOCK_LOCALE_CHANGED=§aLanguage saved #Builder Cloud BUILDERCLOUD_USAGE=§8/§7buildercloud §8[§eversion§8] §8[§emap§8] §8<§7generator§8> -BUILDERCLOUD_VERSION=§cUnknown version. \ No newline at end of file +BUILDERCLOUD_VERSION=§cUnknown version. + +# SlimTablist Command +SLIMTABLIST_USAGE=§c/§7toggleslimtablist +SLIMTABLIST_ENABLED=§aSlimTablist enabled +SLIMTABLIST_DISABLED=§cSlimTablist disabled \ No newline at end of file