diff --git a/src/main/java/net/sacredlabyrinth/phaed/simpleclans/ClanPlayer.java b/src/main/java/net/sacredlabyrinth/phaed/simpleclans/ClanPlayer.java index f7c67614e..273d4c0e3 100644 --- a/src/main/java/net/sacredlabyrinth/phaed/simpleclans/ClanPlayer.java +++ b/src/main/java/net/sacredlabyrinth/phaed/simpleclans/ClanPlayer.java @@ -600,6 +600,7 @@ public Set getPastClans() { * * @return the resign times */ + @NotNull public Map getResignTimes() { return resignTimes; } diff --git a/src/main/java/net/sacredlabyrinth/phaed/simpleclans/commands/clan/ClanCommands.java b/src/main/java/net/sacredlabyrinth/phaed/simpleclans/commands/clan/ClanCommands.java index 7d51e1727..71de986d6 100644 --- a/src/main/java/net/sacredlabyrinth/phaed/simpleclans/commands/clan/ClanCommands.java +++ b/src/main/java/net/sacredlabyrinth/phaed/simpleclans/commands/clan/ClanCommands.java @@ -71,10 +71,10 @@ public class ClanCommands extends BaseCommand { @Conditions("verified|rank:name=WAR_START") @Description("{@@command.description.war.start}") @CommandCompletion("@rivals") - public void startWar(Player player, ClanPlayer requester, Clan requestClan, @Conditions("can_war_target") @Name("clan") ClanInput targetClanInput) { - Clan targetClan = targetClanInput.getClan(); + public void startWar(final Player player, final ClanPlayer requester, final Clan requestClan, @Conditions("can_war_target") @Name("clan") final ClanInput targetClanInput) { + final Clan targetClan = targetClanInput.getClan(); - List onlineLeaders = Helper.stripOffLinePlayers(requestClan.getLeaders()); + final List onlineLeaders = Helper.stripOffLinePlayers(requestClan.getLeaders()); if (settings.is(WAR_START_REQUEST_ENABLED)) { if (!onlineLeaders.isEmpty()) { @@ -94,8 +94,8 @@ public void startWar(Player player, ClanPlayer requester, Clan requestClan, @Con @Conditions("verified|rank:name=WAR_END") @Description("{@@command.description.war.end}") @CommandCompletion("@warring_clans") - public void endWar(ClanPlayer cp, Clan issuerClan, @Name("clan") ClanInput other) { - Clan war = other.getClan(); + public void endWar(final ClanPlayer cp, final Clan issuerClan, @Name("clan") final ClanInput other) { + final Clan war = other.getClan(); if (issuerClan.isWarring(war.getTag())) { requestManager.addWarEndRequest(cp, war, issuerClan); ChatBlock.sendMessage(cp, AQUA + lang("leaders.asked.to.end.rivalry", cp, war.getName())); @@ -108,16 +108,16 @@ public void endWar(ClanPlayer cp, Clan issuerClan, @Name("clan") ClanInput other @CommandPermission("simpleclans.leader.modtag") @Conditions("verified|rank:name=MODTAG") @Description("{@@command.description.modtag}") - public void modtag(Player player, Clan clan, @Single @Name("tag") String tag) { - TagChangeEvent event = new TagChangeEvent(player, clan, tag); + public void modtag(final Player player, final Clan clan, @Single @Name("tag") String tag) { + final TagChangeEvent event = new TagChangeEvent(player, clan, tag); plugin.getServer().getPluginManager().callEvent(event); if (event.isCancelled()) { return; } tag = event.getNewTag(); - String cleanTag = Helper.cleanTag(tag); + final String cleanTag = Helper.cleanTag(tag); - Optional validationError = plugin.getTagValidator().validate(player, tag); + final Optional validationError = plugin.getTagValidator().validate(player, tag); if (validationError.isPresent()) { ChatBlock.sendMessage(player, validationError.get()); return; @@ -138,9 +138,8 @@ public void modtag(Player player, Clan clan, @Single @Name("tag") String tag) { @CommandPermission("simpleclans.leader.setbanner") @Conditions("verified|rank:name=SETBANNER") @Description("{@@command.description.setbanner}") - public void setbanner(Player player, Clan clan) { - @SuppressWarnings("deprecation") - ItemStack hand = player.getItemInHand(); + public void setbanner(final Player player, final Clan clan) { + @SuppressWarnings("deprecation") final ItemStack hand = player.getItemInHand(); if (!hand.getType().toString().contains("BANNER")) { ChatBlock.sendMessageKey(player, "you.must.hold.a.banner"); return; @@ -156,13 +155,13 @@ public void setbanner(Player player, Clan clan) { @CommandCompletion("@non_members:ignore_vanished") @Conditions("rank:name=INVITE") @Description("{@@command.description.invite}") - public void invite(Player sender, ClanPlayer cp, Clan clan, - @Conditions("not_banned|not_in_clan|online:ignore_vanished") @Name("player") ClanPlayerInput invited) { + public void invite(final Player sender, final ClanPlayer cp, final Clan clan, + @Conditions("not_banned|not_in_clan|online:ignore_vanished") @Name("player") final ClanPlayerInput invited) { if (!invited.getClanPlayer().isInviteEnabled()) { ChatBlock.sendMessage(sender, RED + lang("invitedplayer.invite.off", sender)); return; } - Player invitedPlayer = invited.getClanPlayer().toPlayer(); + final Player invitedPlayer = invited.getClanPlayer().toPlayer(); if (invitedPlayer == null) return; if (!permissions.has(invitedPlayer, "simpleclans.member.can-join")) { ChatBlock.sendMessage(sender, RED + @@ -173,8 +172,8 @@ public void invite(Player sender, ClanPlayer cp, Clan clan, ChatBlock.sendMessage(sender, RED + lang("you.cannot.invite.yourself", sender)); return; } - long minutesBeforeRejoin = cm.getMinutesBeforeRejoin(invited.getClanPlayer(), clan); - if (minutesBeforeRejoin != 0) { + final long minutesBeforeRejoin = cm.getMinutesBeforeRejoin(invited.getClanPlayer(), clan); + if (minutesBeforeRejoin > 0L) { ChatBlock.sendMessage(sender, RED + lang("the.player.must.wait.0.before.joining.your.clan.again", sender, minutesBeforeRejoin)); return; @@ -197,7 +196,7 @@ public void invite(Player sender, ClanPlayer cp, Clan clan, @Conditions("member_fee_enabled|verified") @CommandPermission("simpleclans.member.fee-check") @Description("{@@command.description.fee.check}") - public void checkFee(Player player, Clan clan) { + public void checkFee(final Player player, final Clan clan) { ChatBlock.sendMessage(player, AQUA + lang("the.fee.is.0.and.its.current.value.is.1", player, clan.isMemberFeeEnabled() ? lang("fee.enabled", player) : lang("fee.disabled", player), @@ -209,9 +208,9 @@ public void checkFee(Player player, Clan clan) { @CommandPermission("simpleclans.leader.fee") @Conditions("rank:name=FEE_SET|change_fee") @Description("{@@command.description.fee.set}") - public void setFee(Player player, Clan clan, @Name("fee") double fee) { + public void setFee(final Player player, final Clan clan, @Name("fee") double fee) { fee = Math.abs(fee); - double maxFee = settings.getDouble(ECONOMY_MAX_MEMBER_FEE); + final double maxFee = settings.getDouble(ECONOMY_MAX_MEMBER_FEE); if (fee > maxFee) { ChatBlock.sendMessage(player, RED + lang("max.fee.allowed.is.0", player, CurrencyFormat.format(maxFee))); @@ -229,7 +228,7 @@ public void setFee(Player player, Clan clan, @Name("fee") double fee) { @CommandPermission("simpleclans.leader.ff") @Conditions("rank:name=FRIENDLYFIRE") @Description("{@@command.description.clanff.allow}") - public void allowClanFf(Player player, Clan clan) { + public void allowClanFf(final Player player, final Clan clan) { clan.addBb(player.getName(), lang("clan.wide.friendly.fire.is.allowed")); clan.setFriendlyFire(true); storage.updateClan(clan); @@ -238,7 +237,7 @@ public void allowClanFf(Player player, Clan clan) { @Subcommand("%clanff %block") @CommandPermission("simpleclans.leader.ff") @Description("{@@command.description.clanff.block}") - public void blockClanFf(Player player, Clan clan) { + public void blockClanFf(final Player player, final Clan clan) { clan.addBb(player.getName(), lang("clan.wide.friendly.fire.blocked")); clan.setFriendlyFire(false); storage.updateClan(clan); @@ -248,7 +247,7 @@ public void blockClanFf(Player player, Clan clan) { @CommandPermission("simpleclans.leader.description") @Conditions("verified|rank:name=DESCRIPTION") @Description("{@@command.description.description}") - public void setDescription(Player player, Clan clan, @Name("description") String description) { + public void setDescription(final Player player, final Clan clan, @Name("description") final String description) { if (description.length() < settings.getInt(CLAN_MIN_DESCRIPTION_LENGTH)) { ChatBlock.sendMessage(player, RED + lang("your.clan.description.must.be.longer.than", player, settings.getInt(CLAN_MIN_DESCRIPTION_LENGTH))); @@ -269,8 +268,8 @@ public void setDescription(Player player, Clan clan, @Name("description") String @Conditions("verified|rivable|minimum_to_rival|rank:name=RIVAL_ADD") @CommandCompletion("@clans:hide_own") @Description("{@@command.description.rival.add}") - public void addRival(Player player, Clan issuerClan, @Conditions("verified|different") @Name("clan") ClanInput rival) { - Clan rivalInput = rival.getClan(); + public void addRival(final Player player, final Clan issuerClan, @Conditions("verified|different") @Name("clan") final ClanInput rival) { + final Clan rivalInput = rival.getClan(); if (settings.isUnrivable(rivalInput.getTag())) { ChatBlock.sendMessage(player, RED + lang("the.clan.cannot.be.rivaled", player)); return; @@ -295,11 +294,11 @@ public void addRival(Player player, Clan issuerClan, @Conditions("verified|diffe @Conditions("verified|rank:name=RIVAL_REMOVE") @CommandCompletion("@rivals") @Description("{@@command.description.rival.remove}") - public void removeRival(Player player, - ClanPlayer cp, - Clan issuerClan, - @Conditions("different") @Name("clan") ClanInput rival) { - Clan rivalInput = rival.getClan(); + public void removeRival(final Player player, + final ClanPlayer cp, + final Clan issuerClan, + @Conditions("different") @Name("clan") final ClanInput rival) { + final Clan rivalInput = rival.getClan(); if (issuerClan.isRival(rivalInput.getTag())) { requestManager.addRivalryBreakRequest(cp, rivalInput, issuerClan); ChatBlock.sendMessage(player, AQUA + lang("leaders.asked.to.end.rivalry", player, @@ -314,16 +313,16 @@ public void removeRival(Player player, @Conditions("verified|rank:name=ALLY_ADD|minimum_to_ally") @CommandCompletion("@clans:hide_own") @Description("{@@command.description.ally.add}") - public void addAlly(Player player, - ClanPlayer cp, - Clan issuerClan, - @Conditions("verified|different") @Name("clan") ClanInput other) { - Clan input = other.getClan(); + public void addAlly(final Player player, + final ClanPlayer cp, + final Clan issuerClan, + @Conditions("verified|different") @Name("clan") final ClanInput other) { + final Clan input = other.getClan(); if (issuerClan.isAlly(input.getTag())) { ChatBlock.sendMessage(player, RED + lang("your.clans.are.already.allies", player)); return; } - int maxAlliances = settings.getInt(CLAN_MAX_ALLIANCES); + final int maxAlliances = settings.getInt(CLAN_MAX_ALLIANCES); if (maxAlliances != -1) { if (issuerClan.getAllies().size() >= maxAlliances) { ChatBlock.sendMessage(player, lang("your.clan.reached.max.alliances", player)); @@ -335,7 +334,7 @@ public void addAlly(Player player, } } - List onlineLeaders = Helper.stripOffLinePlayers(issuerClan.getLeaders()); + final List onlineLeaders = Helper.stripOffLinePlayers(issuerClan.getLeaders()); if (onlineLeaders.isEmpty()) { ChatBlock.sendMessage(player, RED + lang("at.least.one.leader.accept.the.alliance", player)); @@ -352,8 +351,8 @@ public void addAlly(Player player, @CommandPermission("simpleclans.leader.ally") @Description("{@@command.description.ally.remove}") @CommandCompletion("@allied_clans") - public void removeAlly(Player player, Clan issuerClan, @Conditions("different|allied_clan") @Name("clan") ClanInput ally) { - Clan allyInput = ally.getClan(); + public void removeAlly(final Player player, final Clan issuerClan, @Conditions("different|allied_clan") @Name("clan") final ClanInput ally) { + final Clan allyInput = ally.getClan(); issuerClan.removeAlly(allyInput); allyInput.addBb(player.getName(), lang("has.broken.the.alliance", issuerClan.getName(), allyInput.getName()), false); @@ -366,14 +365,14 @@ public void removeAlly(Player player, Clan issuerClan, @Conditions("different|al @CommandCompletion("@clan_members:hide_own") @Conditions("rank:name=KICK") @Description("{@@command.description.kick}") - public void kick(@Conditions("clan_member") Player sender, - @Conditions("same_clan") @Name("member") ClanPlayerInput other) { - ClanPlayer clanPlayer = other.getClanPlayer(); + public void kick(@Conditions("clan_member") final Player sender, + @Conditions("same_clan") @Name("member") final ClanPlayerInput other) { + final ClanPlayer clanPlayer = other.getClanPlayer(); if (sender.getUniqueId().equals(clanPlayer.getUniqueId())) { ChatBlock.sendMessage(sender, RED + lang("you.cannot.kick.yourself", sender)); return; } - Clan clan = cm.getClanByPlayerUniqueId(sender.getUniqueId()); + final Clan clan = cm.getClanByPlayerUniqueId(sender.getUniqueId()); if (Objects.requireNonNull(clan).isLeader(clanPlayer.getUniqueId())) { ChatBlock.sendMessage(sender, RED + lang("you.cannot.kick.another.leader", sender)); return; @@ -390,7 +389,7 @@ public void kick(@Conditions("clan_member") Player sender, @CommandPermission("simpleclans.member.resign") @Description("{@@command.description.resign}") @HelpSearchTags("leave") - public void resignConfirm(Player player, ClanPlayer cp, Clan clan) { + public void resignConfirm(final Player player, final ClanPlayer cp, final Clan clan) { if (!new PrePlayerLeaveClanEvent(player, player).callEvent()) { ChatBlock.sendMessage(player, RED + lang("error.event.cancelled", player)); } else if (clan.isPermanent() || !clan.isLeader(player) || clan.getLeaders().size() > 1) { @@ -410,7 +409,7 @@ public void resignConfirm(Player player, ClanPlayer cp, Clan clan) { @CommandPermission("simpleclans.member.resign") @Description("{@@command.description.resign}") @HelpSearchTags("leave") - public void resign(@Conditions("clan_member") Player player) { + public void resign(@Conditions("clan_member") final Player player) { if (!new PrePlayerLeaveClanEvent(player, player).callEvent()) { ChatBlock.sendMessage(player, RED + lang("error.event.cancelled", player)); return; diff --git a/src/main/java/net/sacredlabyrinth/phaed/simpleclans/commands/general/GeneralCommands.java b/src/main/java/net/sacredlabyrinth/phaed/simpleclans/commands/general/GeneralCommands.java index 7074e9090..4afcd5355 100644 --- a/src/main/java/net/sacredlabyrinth/phaed/simpleclans/commands/general/GeneralCommands.java +++ b/src/main/java/net/sacredlabyrinth/phaed/simpleclans/commands/general/GeneralCommands.java @@ -4,11 +4,36 @@ import co.aikar.commands.CommandHelp; import co.aikar.commands.CommandParameter; import co.aikar.commands.HelpEntry; -import co.aikar.commands.annotation.*; -import net.sacredlabyrinth.phaed.simpleclans.*; +import co.aikar.commands.annotation.CatchUnknown; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandCompletion; +import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Conditions; +import co.aikar.commands.annotation.Default; +import co.aikar.commands.annotation.Dependency; +import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.HelpSearchTags; +import co.aikar.commands.annotation.Name; +import co.aikar.commands.annotation.Optional; +import co.aikar.commands.annotation.Single; +import co.aikar.commands.annotation.Subcommand; +import co.aikar.commands.annotation.Values; +import net.sacredlabyrinth.phaed.simpleclans.ChatBlock; +import net.sacredlabyrinth.phaed.simpleclans.Clan; +import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer; +import net.sacredlabyrinth.phaed.simpleclans.Helper; +import net.sacredlabyrinth.phaed.simpleclans.SimpleClans; import net.sacredlabyrinth.phaed.simpleclans.commands.ClanInput; import net.sacredlabyrinth.phaed.simpleclans.commands.ClanPlayerInput; -import net.sacredlabyrinth.phaed.simpleclans.commands.data.*; +import net.sacredlabyrinth.phaed.simpleclans.commands.data.Alliances; +import net.sacredlabyrinth.phaed.simpleclans.commands.data.ClanList; +import net.sacredlabyrinth.phaed.simpleclans.commands.data.ClanProfile; +import net.sacredlabyrinth.phaed.simpleclans.commands.data.ClanRoster; +import net.sacredlabyrinth.phaed.simpleclans.commands.data.Kills; +import net.sacredlabyrinth.phaed.simpleclans.commands.data.Leaderboard; +import net.sacredlabyrinth.phaed.simpleclans.commands.data.Lookup; +import net.sacredlabyrinth.phaed.simpleclans.commands.data.MostKilled; +import net.sacredlabyrinth.phaed.simpleclans.commands.data.Rivalries; import net.sacredlabyrinth.phaed.simpleclans.conversation.CreateClanTagPrompt; import net.sacredlabyrinth.phaed.simpleclans.conversation.RequestCanceller; import net.sacredlabyrinth.phaed.simpleclans.conversation.ResetKdrPrompt; @@ -32,8 +57,21 @@ import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang; import static net.sacredlabyrinth.phaed.simpleclans.conversation.CreateClanNamePrompt.NAME_KEY; import static net.sacredlabyrinth.phaed.simpleclans.conversation.CreateClanTagPrompt.TAG_KEY; -import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.*; -import static org.bukkit.ChatColor.*; +import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.ALLOW_RESET_KDR; +import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.COMMANDS_MORE; +import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.ENABLE_GUI; +import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.LANGUAGE_SELECTOR; +import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.PAGE_CLAN_NAME_COLOR; +import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.PAGE_HEADINGS_COLOR; +import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.PAGE_SIZE; +import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.SERVER_NAME; +import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.TAG_BRACKET_COLOR; +import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.TAG_BRACKET_LEFT; +import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.TAG_BRACKET_RIGHT; +import static org.bukkit.ChatColor.AQUA; +import static org.bukkit.ChatColor.GRAY; +import static org.bukkit.ChatColor.GREEN; +import static org.bukkit.ChatColor.RED; @CommandAlias("%clan") @Conditions("%basic_conditions") @@ -53,7 +91,7 @@ public class GeneralCommands extends BaseCommand { @Default @Description("{@@command.description.clan}") @HelpSearchTags("menu gui interface ui") - public void main(CommandSender sender) { + public void main(final CommandSender sender) { if (sender instanceof Player && settings.is(ENABLE_GUI)) { InventoryDrawer.open(new MainFrame((Player) sender)); } else { @@ -66,7 +104,7 @@ public void main(CommandSender sender) { @CommandPermission("simpleclans.anyone.locale") @Description("{@@command.description.locale}") @CommandCompletion("@locales") - public void locale(ClanPlayer cp, @Values("@locales") @Name("locale") @Single String locale) { + public void locale(final ClanPlayer cp, @Values("@locales") @Name("locale") @Single final String locale) { if (!settings.is(LANGUAGE_SELECTOR)) { ChatBlock.sendMessageKey(cp, "locale.is.prohibited"); return; @@ -82,18 +120,27 @@ public void locale(ClanPlayer cp, @Values("@locales") @Name("locale") @Single St @CommandPermission("simpleclans.leader.create") @CommandCompletion("%compl:tag %compl:name") @Description("{@@command.description.create}") - public void create(Player player, @Optional @Name("tag") String tag, @Optional @Name("name") String name) { - ClanPlayer cp = cm.getAnyClanPlayer(player.getUniqueId()); + public void create(final Player player, @Optional @Name("tag") final String tag, @Optional @Name("name") final String name) { + final ClanPlayer cp = cm.getAnyClanPlayer(player.getUniqueId()); + + if (cp != null) { + if (cp.getClan() != null) { + ChatBlock.sendMessage(player, RED + lang("you.must.first.resign", player, + cp.getClan().getName())); + return; + } - if (cp != null && cp.getClan() != null) { - ChatBlock.sendMessage(player, RED + lang("you.must.first.resign", player, - cp.getClan().getName())); - return; + final long minutesBeforeAction = cm.getMinutesBeforeAction(cp); + if (minutesBeforeAction > 0L) { + ChatBlock.sendMessage(player, RED + lang("you.must.wait.0.before.creating.a.clan", player, minutesBeforeAction)); + return; + } } - HashMap initialData = new HashMap<>(); + + final HashMap initialData = new HashMap<>(); initialData.put(TAG_KEY, tag); initialData.put(NAME_KEY, name); - SCConversation conversation = new SCConversation(plugin, player, new CreateClanTagPrompt(), initialData); + final SCConversation conversation = new SCConversation(plugin, player, new CreateClanTagPrompt(), initialData); conversation.addConversationCanceller(new RequestCanceller(player, RED + lang("clan.create.request.cancelled", player))); conversation.begin(); } @@ -101,8 +148,8 @@ public void create(Player player, @Optional @Name("tag") String tag, @Optional @ @Subcommand("%leaderboard") @CommandPermission("simpleclans.anyone.leaderboard") @Description("{@@command.description.leaderboard}") - public void leaderboard(CommandSender sender) { - Leaderboard l = new Leaderboard(plugin, sender); + public void leaderboard(final CommandSender sender) { + final Leaderboard l = new Leaderboard(plugin, sender); l.send(); } @@ -110,16 +157,16 @@ public void leaderboard(CommandSender sender) { @CommandCompletion("@players") @CommandPermission("simpleclans.anyone.lookup") @Description("{@@command.description.lookup.other}") - public void lookup(CommandSender sender, @Name("player") ClanPlayerInput player) { - Lookup l = new Lookup(plugin, sender, player.getClanPlayer().getUniqueId()); + public void lookup(final CommandSender sender, @Name("player") final ClanPlayerInput player) { + final Lookup l = new Lookup(plugin, sender, player.getClanPlayer().getUniqueId()); l.send(); } @Subcommand("%lookup") @CommandPermission("simpleclans.member.lookup") @Description("{@@command.description.lookup}") - public void lookup(Player sender) { - Lookup l = new Lookup(plugin, sender, sender.getUniqueId()); + public void lookup(final Player sender) { + final Lookup l = new Lookup(plugin, sender, sender.getUniqueId()); l.send(); } @@ -128,12 +175,12 @@ public void lookup(Player sender) { @Conditions("verified|rank:name=KILLS") @CommandCompletion("@players") @Description("{@@command.description.kills}") - public void kills(Player sender, @Optional @Name("player") ClanPlayerInput player) { + public void kills(final Player sender, @Optional @Name("player") final ClanPlayerInput player) { String name = sender.getName(); if (player != null) { name = player.getClanPlayer().getName(); } - Kills k = new Kills(plugin, sender, name); + final Kills k = new Kills(plugin, sender, name); k.send(); } @@ -141,8 +188,8 @@ public void kills(Player sender, @Optional @Name("player") ClanPlayerInput playe @CommandPermission("simpleclans.anyone.profile") @CommandCompletion("@clans:hide_own") @Description("{@@command.description.profile.other}") - public void profile(CommandSender sender, @Conditions("verified") @Name("clan") ClanInput clan) { - ClanProfile p = new ClanProfile(plugin, sender, clan.getClan()); + public void profile(final CommandSender sender, @Conditions("verified") @Name("clan") final ClanInput clan) { + final ClanProfile p = new ClanProfile(plugin, sender, clan.getClan()); p.send(); } @@ -150,15 +197,15 @@ public void profile(CommandSender sender, @Conditions("verified") @Name("clan") @CommandCompletion("@clans:hide_own") @CommandPermission("simpleclans.anyone.roster") @Description("{@@command.description.roster.other}") - public void roster(CommandSender sender, @Conditions("verified") @Name("clan") ClanInput clan) { - ClanRoster r = new ClanRoster(plugin, sender, clan.getClan()); + public void roster(final CommandSender sender, @Conditions("verified") @Name("clan") final ClanInput clan) { + final ClanRoster r = new ClanRoster(plugin, sender, clan.getClan()); r.send(); } @Subcommand("%ff %allow") @CommandPermission("simpleclans.member.ff") @Description("{@@command.description.ff.allow}") - public void allowPersonalFf(Player player, ClanPlayer cp) { + public void allowPersonalFf(final Player player, final ClanPlayer cp) { cp.setFriendlyFire(true); storage.updateClanPlayer(cp); ChatBlock.sendMessage(player, AQUA + lang("personal.friendly.fire.is.set.to.allowed", player)); @@ -167,7 +214,7 @@ public void allowPersonalFf(Player player, ClanPlayer cp) { @Subcommand("%ff %auto") @CommandPermission("simpleclans.member.ff") @Description("{@@command.description.ff.auto}") - public void autoPersonalFf(Player player, ClanPlayer cp) { + public void autoPersonalFf(final Player player, final ClanPlayer cp) { cp.setFriendlyFire(false); storage.updateClanPlayer(cp); ChatBlock.sendMessage(player, AQUA + lang("friendy.fire.is.now.managed.by.your.clan", player)); @@ -176,12 +223,12 @@ public void autoPersonalFf(Player player, ClanPlayer cp) { @Subcommand("%resetkdr %confirm") @CommandPermission("simpleclans.vip.resetkdr") @Description("{@@command.description.resetkdr}") - public void resetKdrConfirm(Player player, ClanPlayer cp) { + public void resetKdrConfirm(final Player player, final ClanPlayer cp) { if (!settings.is(ALLOW_RESET_KDR)) { ChatBlock.sendMessage(player, RED + lang("disabled.command", player)); return; } - PlayerResetKdrEvent event = new PlayerResetKdrEvent(cp); + final PlayerResetKdrEvent event = new PlayerResetKdrEvent(cp); Bukkit.getServer().getPluginManager().callEvent(event); if (!event.isCancelled() && cm.purchaseResetKdr(player)) { cm.resetKdr(cp); @@ -192,7 +239,7 @@ public void resetKdrConfirm(Player player, ClanPlayer cp) { @Subcommand("%resetkdr") @CommandPermission("simpleclans.vip.resetkdr") @Description("{@@command.description.resetkdr}") - public void resetKdr(Player player, ClanPlayer cp) { + public void resetKdr(final Player player, final ClanPlayer cp) { if (!settings.is(ALLOW_RESET_KDR)) { ChatBlock.sendMessage(player, RED + lang("disabled.command", player)); } else { @@ -203,8 +250,8 @@ public void resetKdr(Player player, ClanPlayer cp) { @CommandAlias("%accept") @Description("{@@command.description.accept}") @Conditions("can_vote") - public void accept(Player player, ClanPlayer cp) { - Clan clan = cp.getClan(); + public void accept(final Player player, final ClanPlayer cp) { + final Clan clan = cp.getClan(); if (clan != null) { clan.leaderAnnounce(GREEN + lang("voted.to.accept", player.getName())); } @@ -214,8 +261,8 @@ public void accept(Player player, ClanPlayer cp) { @CommandAlias("%deny") @Description("{@@command.description.deny}") @Conditions("can_vote") - public void deny(Player player, ClanPlayer cp) { - Clan clan = cp.getClan(); + public void deny(final Player player, final ClanPlayer cp) { + final Clan clan = cp.getClan(); if (clan != null) { clan.leaderAnnounce(RED + lang("has.voted.to.deny", player.getName())); } @@ -224,8 +271,8 @@ public void deny(Player player, ClanPlayer cp) { @CommandAlias("%more") @Description("{@@command.description.more}") - public void more(Player player) { - ChatBlock chatBlock = storage.getChatBlock(player); + public void more(final Player player) { + final ChatBlock chatBlock = storage.getChatBlock(player); if (chatBlock == null || chatBlock.size() <= 0) { ChatBlock.sendMessage(player, RED + lang("nothing.more.to.see", player)); @@ -245,10 +292,10 @@ public void more(Player player) { @CatchUnknown @Subcommand("%help") @Description("{@@command.description.help}") - public void help(CommandSender sender, CommandHelp help) { - boolean inClan = sender instanceof Player player && cm.getClanByPlayerUniqueId(player.getUniqueId()) != null; - for (HelpEntry helpEntry : help.getHelpEntries()) { - for (@SuppressWarnings("rawtypes") CommandParameter parameter : helpEntry.getParameters()) { + public void help(final CommandSender sender, final CommandHelp help) { + final boolean inClan = sender instanceof final Player player && cm.getClanByPlayerUniqueId(player.getUniqueId()) != null; + for (final HelpEntry helpEntry : help.getHelpEntries()) { + for (@SuppressWarnings("rawtypes") final CommandParameter parameter : helpEntry.getParameters()) { if (parameter.getType().equals(Clan.class) && !inClan) { helpEntry.setSearchScore(0); } @@ -261,16 +308,16 @@ public void help(CommandSender sender, CommandHelp help) { @CommandPermission("simpleclans.mod.mostkilled") @Conditions("verified|rank:name=MOSTKILLED") @Description("{@@command.description.mostkilled}") - public void mostKilled(Player player) { - MostKilled mk = new MostKilled(plugin, player); + public void mostKilled(final Player player) { + final MostKilled mk = new MostKilled(plugin, player); mk.send(); } @Subcommand("%list %balance") @CommandPermission("simpleclans.anyone.list.balance") @Description("{@@command.description.list.balance}") - public void listBalance(CommandSender sender) { - List clans = cm.getClans(); + public void listBalance(final CommandSender sender) { + final List clans = cm.getClans(); if (clans.isEmpty()) { sender.sendMessage(RED + lang("no.clans.have.been.created", sender)); return; @@ -278,14 +325,14 @@ public void listBalance(CommandSender sender) { clans.sort(Comparator.comparingDouble(Clan::getBalance).reversed()); sender.sendMessage(lang("clan.list.balance.header", sender, settings.getColored(SERVER_NAME), clans.size())); - String lineFormat = lang("clan.list.balance.line", sender); + final String lineFormat = lang("clan.list.balance.line", sender); - String leftBracket = settings.getColored(TAG_BRACKET_COLOR) + settings.getColored(TAG_BRACKET_LEFT); - String rightBracket = settings.getColored(TAG_BRACKET_COLOR) + settings.getColored(TAG_BRACKET_RIGHT); + final String leftBracket = settings.getColored(TAG_BRACKET_COLOR) + settings.getColored(TAG_BRACKET_LEFT); + final String rightBracket = settings.getColored(TAG_BRACKET_COLOR) + settings.getColored(TAG_BRACKET_RIGHT); for (int i = 0; i < 10 && i < clans.size(); i++) { - Clan clan = clans.get(i); - String name = " " + (clan.isVerified() ? settings.getColored(PAGE_CLAN_NAME_COLOR) : GRAY) + clan.getName(); - String line = MessageFormat.format(lineFormat, i + 1, leftBracket, clan.getColorTag(), + final Clan clan = clans.get(i); + final String name = " " + (clan.isVerified() ? settings.getColored(PAGE_CLAN_NAME_COLOR) : GRAY) + clan.getName(); + final String line = MessageFormat.format(lineFormat, i + 1, leftBracket, clan.getColorTag(), rightBracket, name, clan.getBalanceFormatted()); sender.sendMessage(line); } @@ -295,25 +342,25 @@ public void listBalance(CommandSender sender) { @CommandPermission("simpleclans.anyone.list") @Description("{@@command.description.list}") @CommandCompletion("@clan_list_type @order") - public void list(CommandSender sender, @Optional @Values("@clan_list_type") String type, - @Optional @Single @Values("@order") String order) { - ClanList list = new ClanList(plugin, sender, type, order); + public void list(final CommandSender sender, @Optional @Values("@clan_list_type") final String type, + @Optional @Single @Values("@order") final String order) { + final ClanList list = new ClanList(plugin, sender, type, order); list.send(); } @Subcommand("%rivalries") @CommandPermission("simpleclans.anyone.rivalries") @Description("{@@command.description.rivalries}") - public void rivalries(CommandSender sender) { - Rivalries rivalries = new Rivalries(plugin, sender); + public void rivalries(final CommandSender sender) { + final Rivalries rivalries = new Rivalries(plugin, sender); rivalries.send(); } @Subcommand("%alliances") @CommandPermission("simpleclans.anyone.alliances") @Description("{@@command.description.alliances}") - public void alliances(CommandSender sender) { - Alliances a = new Alliances(plugin, sender); + public void alliances(final CommandSender sender) { + final Alliances a = new Alliances(plugin, sender); a.send(); } diff --git a/src/main/java/net/sacredlabyrinth/phaed/simpleclans/listeners/VentureChatListener.java b/src/main/java/net/sacredlabyrinth/phaed/simpleclans/listeners/VentureChatListener.java index 46bc099ea..4a779979e 100644 --- a/src/main/java/net/sacredlabyrinth/phaed/simpleclans/listeners/VentureChatListener.java +++ b/src/main/java/net/sacredlabyrinth/phaed/simpleclans/listeners/VentureChatListener.java @@ -3,29 +3,23 @@ import mineverse.Aust1n46.chat.api.events.ChannelJoinEvent; import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer; import net.sacredlabyrinth.phaed.simpleclans.SimpleClans; -import net.sacredlabyrinth.phaed.simpleclans.managers.ClanManager; -import net.sacredlabyrinth.phaed.simpleclans.managers.StorageManager; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; import org.jetbrains.annotations.NotNull; -public class VentureChatListener implements Listener { - private final ClanManager clanManager; - private final StorageManager storageManager; +public class VentureChatListener extends SCListener { - public VentureChatListener(@NotNull SimpleClans plugin) { - this.clanManager = plugin.getClanManager(); - this.storageManager = plugin.getStorageManager(); + public VentureChatListener(@NotNull final SimpleClans plugin) { + super(plugin); } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onVentureChat(@NotNull ChannelJoinEvent event) { - ClanPlayer clanPlayer = clanManager.getClanPlayer(event.getPlayer()); + public void onVentureChat(@NotNull final ChannelJoinEvent event) { + final ClanPlayer clanPlayer = plugin.getClanManager().getClanPlayer(event.getPlayer()); if (clanPlayer == null) return; if (clanPlayer.getChannel() == ClanPlayer.Channel.NONE) return; clanPlayer.setChannel(ClanPlayer.Channel.NONE); - storageManager.updateClanPlayer(clanPlayer); + plugin.getStorageManager().updateClanPlayer(clanPlayer); } } diff --git a/src/main/java/net/sacredlabyrinth/phaed/simpleclans/managers/ClanManager.java b/src/main/java/net/sacredlabyrinth/phaed/simpleclans/managers/ClanManager.java index 18444159d..4b2e5e16a 100644 --- a/src/main/java/net/sacredlabyrinth/phaed/simpleclans/managers/ClanManager.java +++ b/src/main/java/net/sacredlabyrinth/phaed/simpleclans/managers/ClanManager.java @@ -28,6 +28,7 @@ import org.jetbrains.annotations.Nullable; import java.text.MessageFormat; +import java.time.Duration; import java.time.Instant; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; @@ -35,6 +36,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; @@ -65,6 +67,7 @@ import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.ECONOMY_UNIQUE_TAX_ON_REGROUP; import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.ECONOMY_VERIFICATION_PRICE; import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.ENABLE_REJOIN_COOLDOWN; +import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.GLOBAL_REJOIN_COOLDOWN; import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.KDR_DELAY_BETWEEN_KILLS; import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.PAGE_HEADINGS_COLOR; import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.REJOIN_COOLDOWN; @@ -635,7 +638,7 @@ public String getArmorString(final PlayerInventory inv) { } } - if (out.length() == 0) { + if (out.isEmpty()) { out = lang("none", player); } @@ -706,7 +709,7 @@ public String getWeaponString(final PlayerInventory inv) { out += ChatColor.WHITE + lang("weapon.A", player) + headColor + count; } - if (out.length() == 0) { + if (out.isEmpty()) { out = lang("none", player); } @@ -942,17 +945,56 @@ public void sortClanPlayersByLastSeen(final List cps) { public long getMinutesBeforeRejoin(@NotNull final ClanPlayer cp, @NotNull final Clan clan) { final SettingsManager settings = plugin.getSettingsManager(); - if (settings.is(ENABLE_REJOIN_COOLDOWN)) { - final Long resign = cp.getResignTime(clan.getTag()); - if (resign != null) { - final long timePassed = Instant.ofEpochMilli(resign).until(Instant.now(), ChronoUnit.MINUTES); - final int cooldown = settings.getInt(REJOIN_COOLDOWN); - if (timePassed < cooldown) { - return cooldown - timePassed; - } + if (!settings.is(ENABLE_REJOIN_COOLDOWN)) { + return 0L; + } + if (settings.is(GLOBAL_REJOIN_COOLDOWN)) { + return getMinutesBeforeAction(cp); + } + final Long resign = cp.getResignTime(clan.getTag()); + if (resign != null) { + final long timePassed = Instant.ofEpochMilli(resign).until(Instant.now(), ChronoUnit.MINUTES); + final int cooldown = settings.getInt(REJOIN_COOLDOWN); + if (timePassed < cooldown) { + return cooldown - timePassed; } } - return 0; + return 0L; + } + + /** + * Returns the minutes remaining before a player can perform restricted actions + * based on the rejoin cooldown across all previous clans. + */ + public long getMinutesBeforeAction(@NotNull final ClanPlayer cp) { + final SettingsManager settings = plugin.getSettingsManager(); + if (!settings.is(ENABLE_REJOIN_COOLDOWN) || !settings.is(GLOBAL_REJOIN_COOLDOWN)) { + return 0L; + } + + final int cooldown = settings.getInt(REJOIN_COOLDOWN); + if (cooldown <= 0) { + return 0L; + } + + final Map resignTimesMap = cp.getResignTimes(); + if (resignTimesMap.isEmpty()) { + return 0L; + } + + final Instant now = Instant.now(); + + // Longest remaining time among all resignations + final long maxRemaining = resignTimesMap.values().stream() + .mapToLong(resignMs -> { + final Instant resignAt = Instant.ofEpochMilli(resignMs); + final long minutesPassed = Duration.between(resignAt, now).toMinutes(); + return cooldown - minutesPassed; + }) + .max() + .orElse(0L); + + return Math.max(0L, maxRemaining); } /** diff --git a/src/main/java/net/sacredlabyrinth/phaed/simpleclans/managers/SettingsManager.java b/src/main/java/net/sacredlabyrinth/phaed/simpleclans/managers/SettingsManager.java index e71176296..d60db56bb 100644 --- a/src/main/java/net/sacredlabyrinth/phaed/simpleclans/managers/SettingsManager.java +++ b/src/main/java/net/sacredlabyrinth/phaed/simpleclans/managers/SettingsManager.java @@ -304,6 +304,7 @@ public enum ConfigField { ALLOW_RESET_KDR("settings.allow-reset-kdr", false), REJOIN_COOLDOWN("settings.rejoin-cooldown", 60), ENABLE_REJOIN_COOLDOWN("settings.rejoin-cooldown-enabled", false), + GLOBAL_REJOIN_COOLDOWN("settings.rejoin-cooldown-global", false), RANKING_TYPE("settings.ranking-type", "DENSE"), LIST_DEFAULT_ORDER_BY("settings.list-default-order-by", "kdr"), LORE_LENGTH("settings.lore-length", 36), diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 12e8a1d7d..058978ec1 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -48,9 +48,10 @@ settings: new-clan-verification-required: true allow-regroup-command: true allow-reset-kdr: false - rejoin-cooldown: 60 - rejoin-cooldown-enabled: false - ranking-type: "DENSE" + rejoin-cooldown: 60 + rejoin-cooldown-enabled: false + rejoin-cooldown-global: false + ranking-type: "DENSE" list-default-order-by: kdr lore-length: 36 past-clans-limit: 10 diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties index 377f58e55..d28ed5ffe 100644 --- a/src/main/resources/messages.properties +++ b/src/main/resources/messages.properties @@ -577,6 +577,7 @@ your.clan.description.cannot.be.longer.than=Your clan description cannot be long description.changed=You have successfully changed your clan''s description no.description=No description the.player.must.wait.0.before.joining.your.clan.again=This player must wait {0} minute(s) before joining your clan again +you.must.wait.0.before.creating.a.clan=You must wait {0} minute(s) before creating a clan disabled.command=Disabled command rank.displayname.updated=The rank''s display name was updated! rank.setdefault=The clan''s default rank has now been set to {0} diff --git a/src/main/resources/messages_en_US.properties b/src/main/resources/messages_en_US.properties new file mode 100644 index 000000000..7797176f0 --- /dev/null +++ b/src/main/resources/messages_en_US.properties @@ -0,0 +1 @@ +you.must.wait.0.before.creating.a.clan=You must wait {0} minute(s) before creating a clan diff --git a/wiki/how-to-setup/configuration.md b/wiki/how-to-setup/configuration.md index dffb648f7..ef15e00d0 100644 --- a/wiki/how-to-setup/configuration.md +++ b/wiki/how-to-setup/configuration.md @@ -34,10 +34,11 @@ description: null * `server-name` - * `new-clan-verification-required` - * `allow-regroup-command` - -* `allow-reset-kdr` - -* `rejoin-cooldown` - -* `rejoin-cooldown-enabled` - -* `min-to-verify` - The clan must have this amount of members to get verified \(moderators can bypass this\) +* `allow-reset-kdr` - +* `rejoin-cooldown` - +* `rejoin-cooldown-enabled` - +* `rejoin-cooldown-global` - If enabled, the rejoin cooldown applies to all clans globally, not just the clan the player left. +* `min-to-verify` - The clan must have this amount of members to get verified \(moderators can bypass this\) * `ranking-type` - Valid options: ORDINAL and DENSE * `DENSE`: if players have the same KDR, they will have the same rank position. Ex.: 12234 * `ORDINAL`: Every player will have a different rank position. Ex.: 12345 @@ -81,6 +82,7 @@ settings: allow-reset-kdr: false rejoin-cooldown: 60 rejoin-cooldown-enabled: false + rejoin-cooldown-global: false min-to-verify: 1 ranking-type: DENSE ```