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