Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement animated tablist - possible solution for GH-736 #1610

Merged
merged 11 commits into from Sep 8, 2021
92 changes: 44 additions & 48 deletions plugin/src/main/java/net/dzikoysk/funnyguilds/FunnyGuilds.java
Expand Up @@ -2,51 +2,30 @@

import eu.okaeri.configs.exception.OkaeriException;
import net.dzikoysk.funnycommands.FunnyCommands;
import net.dzikoysk.funnyguilds.guild.Guild;
import net.dzikoysk.funnyguilds.guild.GuildUtils;
import net.dzikoysk.funnyguilds.rank.RankRecalculationTask;
import net.dzikoysk.funnyguilds.user.User;
import net.dzikoysk.funnyguilds.user.UserCache;
import net.dzikoysk.funnyguilds.user.UserManager;
import net.dzikoysk.funnyguilds.user.UserUtils;
import net.dzikoysk.funnyguilds.feature.command.CommandsConfiguration;
import net.dzikoysk.funnyguilds.concurrency.ConcurrencyManager;
import net.dzikoysk.funnyguilds.data.DataModel;
import net.dzikoysk.funnyguilds.data.DataPersistenceHandler;
import net.dzikoysk.funnyguilds.data.InvitationPersistenceHandler;
import net.dzikoysk.funnyguilds.config.ConfigurationFactory;
import net.dzikoysk.funnyguilds.config.MessageConfiguration;
import net.dzikoysk.funnyguilds.config.PluginConfiguration;
import net.dzikoysk.funnyguilds.config.tablist.TablistConfiguration;
import net.dzikoysk.funnyguilds.data.DataModel;
import net.dzikoysk.funnyguilds.data.DataPersistenceHandler;
import net.dzikoysk.funnyguilds.data.InvitationPersistenceHandler;
import net.dzikoysk.funnyguilds.data.database.Database;
import net.dzikoysk.funnyguilds.feature.command.CommandsConfiguration;
import net.dzikoysk.funnyguilds.feature.gui.GuiActionHandler;
import net.dzikoysk.funnyguilds.feature.hooks.PluginHook;
import net.dzikoysk.funnyguilds.feature.tablist.IndividualPlayerList;
import net.dzikoysk.funnyguilds.feature.tablist.TablistBroadcastHandler;
import net.dzikoysk.funnyguilds.feature.hooks.PluginHook;
import net.dzikoysk.funnyguilds.listener.BlockFlow;
import net.dzikoysk.funnyguilds.listener.EntityDamage;
import net.dzikoysk.funnyguilds.listener.EntityInteract;
import net.dzikoysk.funnyguilds.listener.PlayerChat;
import net.dzikoysk.funnyguilds.listener.PlayerDeath;
import net.dzikoysk.funnyguilds.listener.PlayerJoin;
import net.dzikoysk.funnyguilds.listener.PlayerLogin;
import net.dzikoysk.funnyguilds.listener.PlayerQuit;
import net.dzikoysk.funnyguilds.listener.TntProtection;
import net.dzikoysk.funnyguilds.feature.validity.GuildValidationHandler;
import net.dzikoysk.funnyguilds.feature.war.WarPacketCallbacks;
import net.dzikoysk.funnyguilds.guild.Guild;
import net.dzikoysk.funnyguilds.guild.GuildUtils;
import net.dzikoysk.funnyguilds.listener.*;
import net.dzikoysk.funnyguilds.listener.dynamic.DynamicListenerManager;
import net.dzikoysk.funnyguilds.listener.region.BlockBreak;
import net.dzikoysk.funnyguilds.listener.region.BlockIgnite;
import net.dzikoysk.funnyguilds.listener.region.BlockPhysics;
import net.dzikoysk.funnyguilds.listener.region.BlockPlace;
import net.dzikoysk.funnyguilds.listener.region.BucketAction;
import net.dzikoysk.funnyguilds.listener.region.EntityExplode;
import net.dzikoysk.funnyguilds.listener.region.EntityPlace;
import net.dzikoysk.funnyguilds.listener.region.EntityProtect;
import net.dzikoysk.funnyguilds.listener.region.GuildHeartProtectionHandler;
import net.dzikoysk.funnyguilds.listener.region.HangingBreak;
import net.dzikoysk.funnyguilds.listener.region.HangingPlace;
import net.dzikoysk.funnyguilds.listener.region.PlayerCommand;
import net.dzikoysk.funnyguilds.listener.region.PlayerInteract;
import net.dzikoysk.funnyguilds.listener.region.PlayerMove;
import net.dzikoysk.funnyguilds.listener.region.PlayerRespawn;
import net.dzikoysk.funnyguilds.listener.region.*;
import net.dzikoysk.funnyguilds.nms.DescriptionChanger;
import net.dzikoysk.funnyguilds.nms.GuildEntityHelper;
import net.dzikoysk.funnyguilds.nms.Reflections;
import net.dzikoysk.funnyguilds.nms.api.NmsAccessor;
import net.dzikoysk.funnyguilds.nms.api.packet.FunnyGuildsChannelHandler;
import net.dzikoysk.funnyguilds.nms.v1_10R1.V1_10R1NmsAccessor;
Expand All @@ -59,21 +38,22 @@
import net.dzikoysk.funnyguilds.nms.v1_17R1.V1_17R1NmsAccessor;
import net.dzikoysk.funnyguilds.nms.v1_8R3.V1_8R3NmsAccessor;
import net.dzikoysk.funnyguilds.nms.v1_9R2.V1_9R2NmsAccessor;
import net.dzikoysk.funnyguilds.feature.validity.GuildValidationHandler;
import net.dzikoysk.funnyguilds.feature.war.WarPacketCallbacks;
import net.dzikoysk.funnyguilds.rank.RankRecalculationTask;
import net.dzikoysk.funnyguilds.shared.bukkit.ChatUtils;
import net.dzikoysk.funnyguilds.shared.bukkit.MinecraftServerUtils;
import net.dzikoysk.funnyguilds.telemetry.metrics.MetricsCollector;
import net.dzikoysk.funnyguilds.nms.DescriptionChanger;
import net.dzikoysk.funnyguilds.nms.GuildEntityHelper;
import net.dzikoysk.funnyguilds.nms.Reflections;
import net.dzikoysk.funnyguilds.user.User;
import net.dzikoysk.funnyguilds.user.UserCache;
import net.dzikoysk.funnyguilds.user.UserManager;
import net.dzikoysk.funnyguilds.user.UserUtils;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitTask;
import panda.std.Option;
import panda.utilities.ClassUtils;

import java.io.File;

public class FunnyGuilds extends JavaPlugin {
Expand All @@ -82,12 +62,14 @@ public class FunnyGuilds extends JavaPlugin {
private static FunnyGuildsLogger logger;

private final File pluginConfigurationFile = new File(this.getDataFolder(), "config.yml");
private final File tablistConfigurationFile = new File(this.getDataFolder(), "tablist.yml");
private final File messageConfigurationFile = new File(this.getDataFolder(), "messages.yml");
private final File pluginDataFolderFile = new File(this.getDataFolder(), "data");

private FunnyGuildsVersion version;
private FunnyCommands funnyCommands;
private PluginConfiguration pluginConfiguration;
private TablistConfiguration tablistConfiguration;
private MessageConfiguration messageConfiguration;
private ConcurrencyManager concurrencyManager;
private DynamicListenerManager dynamicListenerManager;
Expand Down Expand Up @@ -133,6 +115,7 @@ public void onLoad() {
ConfigurationFactory configurationFactory = new ConfigurationFactory();
this.messageConfiguration = configurationFactory.createMessageConfiguration(messageConfigurationFile);
this.pluginConfiguration = configurationFactory.createPluginConfiguration(pluginConfigurationFile);
this.tablistConfiguration = configurationFactory.createTablistConfiguration(tablistConfigurationFile);
}
catch (Exception exception) {
logger.error("Could not load plugin configuration", exception);
Expand Down Expand Up @@ -184,7 +167,7 @@ public void onEnable() {
collector.start();

this.guildValidationTask = Bukkit.getScheduler().runTaskTimerAsynchronously(this, new GuildValidationHandler(), 100L, 20L);
this.tablistBroadcastTask = Bukkit.getScheduler().runTaskTimerAsynchronously(this, new TablistBroadcastHandler(), 20L, this.pluginConfiguration.playerListUpdateInterval);
this.tablistBroadcastTask = Bukkit.getScheduler().runTaskTimerAsynchronously(this, new TablistBroadcastHandler(), 20L, this.tablistConfiguration.playerListUpdateInterval);
this.rankRecalculationTask = Bukkit.getScheduler().runTaskTimerAsynchronously(this, new RankRecalculationTask(), 20L, this.pluginConfiguration.rankingUpdateInterval);

PluginManager pluginManager = Bukkit.getPluginManager();
Expand Down Expand Up @@ -300,24 +283,25 @@ private void handleReload() {
cache.updateScoreboardIfNull(player);
cache.getDummy();

if (! pluginConfiguration.playerListEnable) {
if (!this.tablistConfiguration.playerListEnable) {
continue;
}

IndividualPlayerList individualPlayerList = new IndividualPlayerList(
user,
this.getNmsAccessor().getPlayerListAccessor(),
this.pluginConfiguration.playerList,
this.pluginConfiguration.playerListHeader, this.pluginConfiguration.playerListFooter,
this.pluginConfiguration.playerListPing,
this.pluginConfiguration.playerListFillCells
this.tablistConfiguration.playerList,
this.tablistConfiguration.playerListHeader, this.tablistConfiguration.playerListFooter,
this.tablistConfiguration.pages,
this.tablistConfiguration.playerListPing,
this.tablistConfiguration.playerListFillCells
);

cache.setPlayerList(individualPlayerList);
}

for (Guild guild : GuildUtils.getGuilds()) {
if (pluginConfiguration.createEntityType != null) {
if (this.pluginConfiguration.createEntityType != null) {
GuildEntityHelper.spawnGuildHeart(guild);
}

Expand Down Expand Up @@ -357,6 +341,14 @@ public File getPluginConfigurationFile() {
return this.pluginConfigurationFile;
}

public TablistConfiguration getTablistConfiguration() {
return this.tablistConfiguration;
}

public File getTablistConfigurationFile() {
return this.tablistConfigurationFile;
}

public MessageConfiguration getMessageConfiguration() {
return this.messageConfiguration;
}
Expand All @@ -381,6 +373,10 @@ public void reloadPluginConfiguration() throws OkaeriException {
this.pluginConfiguration.load();
}

public void reloadTablistConfiguration() throws OkaeriException {
this.tablistConfiguration.load();
}

public void reloadMessageConfiguration() throws OkaeriException {
this.messageConfiguration.load();
}
Expand Down
Expand Up @@ -2,7 +2,7 @@

import net.dzikoysk.funnyguilds.FunnyGuilds;
import net.dzikoysk.funnyguilds.concurrency.util.DefaultConcurrencyRequest;
import net.dzikoysk.funnyguilds.config.PluginConfiguration;
import net.dzikoysk.funnyguilds.config.tablist.TablistConfiguration;
import net.dzikoysk.funnyguilds.feature.tablist.IndividualPlayerList;
import net.dzikoysk.funnyguilds.feature.tablist.variable.DefaultTablistVariables;
import net.dzikoysk.funnyguilds.user.UserManager;
Expand All @@ -25,12 +25,13 @@ public ReloadRequest(CommandSender sender) {
public void execute() throws Exception {
FunnyGuilds funnyGuilds = FunnyGuilds.getInstance();
funnyGuilds.reloadPluginConfiguration();
funnyGuilds.reloadTablistConfiguration();
funnyGuilds.reloadMessageConfiguration();
funnyGuilds.getDataPersistenceHandler().reloadHandler();
funnyGuilds.getDynamicListenerManager().reloadAll();

if (FunnyGuilds.getInstance().getPluginConfiguration().playerListEnable) {
PluginConfiguration config = FunnyGuilds.getInstance().getPluginConfiguration();
if (FunnyGuilds.getInstance().getTablistConfiguration().playerListEnable) {
TablistConfiguration tablistConfig = FunnyGuilds.getInstance().getTablistConfiguration();

DefaultTablistVariables.clearFunnyVariables();

Expand All @@ -40,10 +41,11 @@ public void execute() throws Exception {
.forEach(user -> {
IndividualPlayerList playerList = new IndividualPlayerList(user,
funnyGuilds.getNmsAccessor().getPlayerListAccessor(),
config.playerList,
config.playerListHeader, config.playerListFooter,
config.playerListPing,
config.playerListFillCells
tablistConfig.playerList,
tablistConfig.playerListHeader, tablistConfig.playerListFooter,
tablistConfig.pages,
tablistConfig.playerListPing,
tablistConfig.playerListFillCells
);

user.getCache().setPlayerList(playerList);
Expand Down
Expand Up @@ -5,6 +5,9 @@
import eu.okaeri.configs.serdes.commons.SerdesCommons;
import eu.okaeri.configs.validator.okaeri.OkaeriValidator;
import eu.okaeri.configs.yaml.bukkit.YamlBukkitConfigurer;
import net.dzikoysk.funnyguilds.config.tablist.TablistConfiguration;
import net.dzikoysk.funnyguilds.config.tablist.TablistPageSerializer;

import java.io.File;

public final class ConfigurationFactory {
Expand All @@ -28,4 +31,14 @@ public PluginConfiguration createPluginConfiguration(File pluginConfigurationFil
});
}

public TablistConfiguration createTablistConfiguration(File tablistConfigurationFile) {
return ConfigManager.create(TablistConfiguration.class, (it) -> {
it.withConfigurer(new OkaeriValidator(new YamlBukkitConfigurer(), true), new SerdesCommons());
it.withSerdesPack(registry -> registry.register(new TablistPageSerializer()));
it.withBindFile(tablistConfigurationFile);
it.saveDefaults();
it.load(true);
});
}

}
Expand Up @@ -7,17 +7,17 @@
import eu.okaeri.configs.serdes.commons.duration.DurationSpec;
import eu.okaeri.validator.annotation.*;
import net.dzikoysk.funnyguilds.FunnyGuilds;
import net.dzikoysk.funnyguilds.feature.notification.NotificationStyle;
import net.dzikoysk.funnyguilds.feature.notification.bossbar.provider.BossBarOptions;
import net.dzikoysk.funnyguilds.guild.GuildRegex;
import net.dzikoysk.funnyguilds.nms.Reflections;
import net.dzikoysk.funnyguilds.rank.RankSystem;
import net.dzikoysk.funnyguilds.rank.RankUtils;
import net.dzikoysk.funnyguilds.feature.notification.NotificationStyle;
import net.dzikoysk.funnyguilds.feature.notification.bossbar.provider.BossBarOptions;
import net.dzikoysk.funnyguilds.shared.Cooldown;
import net.dzikoysk.funnyguilds.shared.bukkit.ChatUtils;
import net.dzikoysk.funnyguilds.shared.bukkit.ItemBuilder;
import net.dzikoysk.funnyguilds.shared.bukkit.ItemUtils;
import net.dzikoysk.funnyguilds.shared.bukkit.MaterialUtils;
import net.dzikoysk.funnyguilds.nms.Reflections;
import org.apache.commons.lang3.tuple.Pair;
import org.bukkit.Material;
import org.bukkit.entity.EntityType;
Expand Down Expand Up @@ -890,111 +890,6 @@ public class PluginConfiguration extends OkaeriConfig {
@Exclude
public String dummySuffix;

@Comment("Wyglad listy graczy, przedzial slotow - od 1 do 80")
@Comment("Schemat wygladu listy: https://github.com/FunnyGuilds/FunnyGuilds/blob/master/assets/tab-scheme.png")
@Comment("> Spis zmiennych gracza:")
@Comment("{PLAYER} - nazwa gracza")
@Comment("{WORLD} - swiat, w ktorym znajduje sie gracz")
@Comment("{PING} - ping gracza")
@Comment("{PING-FORMAT} - ping gracza z formatowaniem")
@Comment("{POINTS} - punkty gracza")
@Comment("{POINTS-FORMAT} - punkty gracza z formatowaniem")
@Comment("{POSITION} - pozycja gracza w rankingu")
@Comment("{KILLS} - liczba zabojstw gracza")
@Comment("{DEATHS} - liczba smierci gracza")
@Comment("{ASSISTS} - liczba asyst gracza")
@Comment("{LOGOUTS} - liczba wylogowań gracza podczas walki")
@Comment("{KDR} - stosunek zabojstw do smierci gracza")
@Comment("{WG-REGION} - region WorldGuard'a, na ktorym znajduje sie gracz (pierwszy, jesli jest ich kilka)")
@Comment("{WG-REGIONS} - regiony WorldGuard'a, na ktorych znajduje sie gracz (oddzielone przecinkami)")
@Comment("{VAULT-MONEY} - balans konta gracza pobierany z pluginu Vault")
@Comment("> Spis zmiennych gildyjnych:")
@Comment("{G-NAME} - nazwa gildii do ktorej nalezy gracz")
@Comment("{G-TAG} - tag gildii gracza")
@Comment("{G-OWNER} - wlasciciel gildii")
@Comment("{G-DEPUTIES} - zastepcy gildii")
@Comment("{G-DEPUTY} - losowy z zastepcow gildii")
@Comment("{G-LIVES} - liczba zyc gildii")
@Comment("{G-ALLIES} - liczba sojusznikow gildii")
@Comment("{G-POINTS} - punkty gildii")
@Comment("{G-POINTS-FORMAT} - punkty gildii z formatowaniem")
@Comment("{G-POSITION} - pozycja gildii gracza w rankingu")
@Comment("{G-KILLS} - suma zabojstw czlonkow gildii")
@Comment("{G-DEATHS} - suma smierci czlonkow gildii")
@Comment("{G-KDR} - stosunek zabojstw do smierci czlonkow gildii")
@Comment("{G-MEMBERS-ONLINE} - liczba czlonkow gildii online")
@Comment("{G-MEMBERS-ALL} - liczba wszystkich czlonkow gildii")
@Comment("{G-VALIDITY} - data wygasniecia gildii")
@Comment("{G-REGION-SIZE} - rozmiar gildii")
@Comment("> Spis pozostalych zmiennych:")
@Comment("{GUILDS} - liczba gildii na serwerze")
@Comment("{USERS} - liczba uzytkownikow serwera")
@Comment("{ONLINE} - liczba graczy online")
@Comment("{TPS} - TPS serwera (wspierane tylko od wersji 1.8.8+ spigot/paperspigot)")
@Comment("{SECOND} - Sekunda")
@Comment("{MINUTE} - Minuta")
@Comment("{HOUR} - Godzina")
@Comment("{DAY_OF_WEEK} - Dzien tygodnia wyrazony w postaci nazwy dnia")
@Comment("{DAY_OF_MONTH} - Dzien miesiaca wyrazony w postaci liczby")
@Comment("{MONTH} - Miesiac wyrazony w postaci nazwy miesiaca")
@Comment("{MONTH_NUMBER} - Miesiac wyrazony w postaci liczby")
@Comment("{YEAR} - Rok")
@Comment("{PTOP-<pozycja>} - Gracz na podanej pozycji w rankingu (np. {PTOP-1}, {PTOP-60})")
@Comment("{GTOP-<pozycja>} - Gildia na podanej pozycji w rankingu (np. {GTOP-1}, {PTOP-50})")
@CustomKey("player-list")
public Map<Integer, String> playerList = ImmutableMap.<Integer, String>builder()
.put(1, "&7Nick: &b{PLAYER}")
.put(2, "&7Ping: &b{PING}")
.put(3, "&7Punkty: &b{POINTS}")
.put(4, "&7Zabojstwa: &b{KILLS}")
.put(5, "&7Smierci: &b{DEATHS}")
.put(6, "&7KDR: &b{KDR}")
.put(7, "&7Gildia: &b{G-NAME}")
.put(9, "&7TAG: &b{G-TAG}")
.put(10, "&7Punkty gildii: &b{G-POINTS-FORMAT}")
.put(11, "&7Pozycja gildii: &b{G-POSITION}")
.put(12, "&7Liczba graczy online: &b{G-MEMBERS-ONLINE}")
.put(21, "&7Online: &b{ONLINE}")
.put(22, "&7TPS: &b{TPS}")
.put(41, "&bTop 3 Gildii")
.put(42, "&71. &b{GTOP-1}")
.put(43, "&72. &b{GTOP-2}")
.put(44, "&73. &b{GTOP-3}")
.put(61, "&bTop 3 Graczy")
.put(62, "&71. &b{PTOP-1}")
.put(63, "&72. &b{PTOP-2}")
.put(64, "&73. &b{PTOP-3}")
.build();

@Comment("Wyglad naglowka w liscie graczy.")
@CustomKey("player-list-header")
public String playerListHeader = "&7FunnyGuilds &b4.10.0 Tribute";

@Comment("Wyglad stopki w liscie graczy.")
@CustomKey("player-list-footer")
public String playerListFooter = "&c&lWiadomosci braku (pokazujace sie, gdy gracz nie ma gildii) mozna zmienic w pliku messages.yml!";

@Min(0)
@Comment("Liczba pingu pokazana przy kazdej komorce.")
@CustomKey("player-list-ping")
public int playerListPing = 0;

@Comment("Czy wszystkie mozliwe komorki maja zostac zapelnione, nie zwazywszy na liczbe graczy online")
@CustomKey("player-list-fill-cells")
public boolean playerListFillCells = true;

@Comment("Czy tablista ma byc wlaczona")
@CustomKey("player-list-enable")
public boolean playerListEnable = true;

@Min(1)
@Comment("Co ile tickow lista graczy powinna zostac odswiezona")
public int playerListUpdateInterval = 20;

@Comment("Czy zmienne typu {PTOP-%} oraz {GTOP-%} powinny byc pokolorowane w zaleznosci od relacji gildyjnych")
@CustomKey("player-list-use-relationship-colors")
public boolean playerListUseRelationshipColors = false;

@Comment("Czy tagi gildyjne obok nicku gracza maja byc wlaczone")
@CustomKey("guild-tag-enabled")
public boolean guildTagEnabled = true;
Expand Down Expand Up @@ -1331,7 +1226,7 @@ public void loadProcessedProperties() {

Map<Material, Double> map = new EnumMap<>(Material.class);

for (Map.Entry<String, Double> entry : this.explodeMaterials_.entrySet()) {
for (Entry<String, Double> entry : this.explodeMaterials_.entrySet()) {
double chance = entry.getValue();

if (chance < 0) {
Expand Down