Compare commits

..
2 Commits
Author SHA1 Message Date
Edson Passos c4a253efb7 v2.14.6 (#115)
Adds delay for PvP denied messages #106
Adds 60 seconds timeout for conversations
Adds message for admin promote success
Adds Default Ranks #110
Adds warning about LuckPerms and auto-group-groupname
Warns when moving the last leader from a clan #94
PlayerDetailsFrame now gets the nickname from ClanPlayer to avoid rare cases where the player data file was deleted
Updated StaffFrame to reflect command changes #114
Fixes parsing large colored strings on wordWrap
Fixes clickable messages on <=1.12
Updated language files
2021-01-03 12:31:44 -03:00
Edson Passos f34b947e59 v2.14.5 (#108)
Adds clickable messages (accept and deny)
Added support to RGB colors
Added modtag for staff
Request messages are now 100% customizable
Moved mod commands to subcommand "mod"
Clan home now saves yaw and pitch
Fixed {clan} showing on chat when not in clan
Shows status "in rank" for untrusted players
Increased color_tag column size to 255
2020-12-17 20:19:11 -03:00
99 changed files with 1607 additions and 1572 deletions

No files matched your search

Binary file not shown.

Before

Width:  |  Height:  |  Size: 418 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 243 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

+12 -3
View File
@@ -1,5 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" version="4">
<component name="FacetManager">
<facet type="minecraft" name="Minecraft">
<configuration>
<autoDetectTypes>
<platformType>SPIGOT</platformType>
</autoDetectTypes>
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
@@ -11,12 +20,12 @@
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.spigotmc:spigot-api:1.13.2-R0.1-SNAPSHOT" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.spigotmc:spigot-api:1.16.4-R0.1-SNAPSHOT" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: commons-lang:commons-lang:2.6" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.guava:guava:21.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.code.gson:gson:2.8.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.md-5:bungeecord-chat:1.13-SNAPSHOT" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.yaml:snakeyaml:1.23" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.md-5:bungeecord-chat:1.16-R0.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.yaml:snakeyaml:1.26" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.github.MilkBowl:VaultAPI:1.7" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.bukkit:bukkit:1.13.1-R0.1-SNAPSHOT" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.googlecode.json-simple:json-simple:1.1.1" level="project" />
+2 -2
View File
@@ -4,7 +4,7 @@
<groupId>net.sacredlabyrinth.phaed.simpleclans</groupId>
<artifactId>SimpleClans</artifactId>
<name>SimpleClans</name>
<version>2.14.3</version>
<version>2.14.6</version>
<url>http://dev.bukkit.org/server-mods/simpleclans/</url>
<ciManagement>
<system>jenkins</system>
@@ -130,7 +130,7 @@
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.13.2-R0.1-SNAPSHOT</version>
<version>1.16.4-R0.1-SNAPSHOT</version>
<scope>provided</scope>
<exclusions>
<exclusion>
+2 -2
View File
@@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>net.sacredlabyrinth.phaed.simpleclans</groupId>
<artifactId>SimpleClans</artifactId>
<version>2.14.4.1</version>
<version>2.14.6</version>
<name>SimpleClans</name>
<url>http://dev.bukkit.org/server-mods/simpleclans/</url>
@@ -111,7 +111,7 @@
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.13.2-R0.1-SNAPSHOT</version>
<version>1.16.4-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
@@ -24,6 +24,8 @@ import java.io.Serializable;
import java.sql.Timestamp;
import java.text.MessageFormat;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
/**
@@ -51,11 +53,14 @@ public class Clan implements Serializable, Comparable<Clan> {
private int homeX = 0;
private int homeY = 0;
private int homeZ = 0;
private String homeWorld = "";
private float homeYaw = 0;
private float homePitch = 0;
private @Nullable String homeWorld = "";
private boolean allowWithdraw = false;
private boolean allowDeposit = true;
private boolean feeEnabled;
private List<Rank> ranks = new ArrayList<>();
private String defaultRank = null;
private @Nullable ItemStack banner;
/**
@@ -1060,6 +1065,9 @@ public class Clan implements Serializable, Comparable<Clan> {
cp.setClan(this);
cp.setLeader(false);
cp.setTrusted(SimpleClans.getInstance().getSettingsManager().isClanTrustByDefault());
if (defaultRank != null) {
cp.setRank(defaultRank);
}
importMember(cp);
@@ -1633,6 +1641,8 @@ public class Clan implements Serializable, Comparable<Clan> {
json.put("homeX", homeX);
json.put("homeY", homeY);
json.put("homeZ", homeZ);
json.put("homePitch", homePitch);
json.put("homeYaw", homeYaw);
json.put("homeWorld", homeWorld == null ? "" : homeWorld);
return json.toString();
@@ -1674,16 +1684,19 @@ public class Clan implements Serializable, Comparable<Clan> {
if (flag.equals("homeZ")) {
homeZ = ((Long) flags.get(flag)).intValue();
}
if (flag.equals("homeYaw")) {
homeYaw = ((Double) flags.get(flag)).floatValue();
}
if (flag.equals("homePitch")) {
homePitch = ((Double) flags.get(flag)).floatValue();
}
if (flag.equals("homeWorld")) {
homeWorld = (String) flags.get(flag);
}
} catch (Exception ex) {
for (StackTraceElement el : ex.getStackTrace()) {
System.out.print("Failed reading flag: " + flag);
System.out.print("Value: " + flags.get(flag));
System.out.print(el.toString());
}
Logger logger = SimpleClans.getInstance().getLogger();
logger.log(Level.SEVERE, String.format("Failed reading flag: %s, value: %s", flag,
flags.get(flag)), ex);
}
}
}
@@ -1710,6 +1723,8 @@ public class Clan implements Serializable, Comparable<Clan> {
homeY = 0;
homeX = 0;
homeZ = 0;
homePitch = 0;
homeYaw = 0;
homeWorld = null;
} else {
home.setY(home.getBlockY() + 1);
@@ -1717,7 +1732,9 @@ public class Clan implements Serializable, Comparable<Clan> {
homeX = home.getBlockX();
homeY = home.getBlockY();
homeZ = home.getBlockZ();
homeWorld = home.getWorld().getName();
homeYaw = home.getYaw();
homePitch = home.getPitch();
homeWorld = home.getWorld() == null ? null : home.getWorld().getName();
}
SimpleClans.getInstance().getStorageManager().updateClan(this);
}
@@ -1736,9 +1753,9 @@ public class Clan implements Serializable, Comparable<Clan> {
if (!(world.getBlockAt(homeX, homeY, homeZ).getType().equals(XMaterial.AIR.parseMaterial())) ||
!(world.getBlockAt(homeX, homeY + 1, homeZ).getType().equals(XMaterial.AIR.parseMaterial()))
|| homeY == 0) {
return new Location(world, homeX, world.getHighestBlockYAt(homeX, homeZ), homeZ);
return new Location(world, homeX, world.getHighestBlockYAt(homeX, homeZ), homeZ, homeYaw, homePitch);
} else {
return new Location(world, homeX, homeY, homeZ);
return new Location(world, homeX, homeY, homeZ, homeYaw, homePitch);
}
}
@@ -1887,6 +1904,29 @@ public class Clan implements Serializable, Comparable<Clan> {
return null;
}
/**
* Sets the default rank for this clan.
*
* @param name The name of the rank to be set as default
*/
public void setDefaultRank(@Nullable String name) {
// I don't know how this could happen, but if it somehow does, here's a check for it
if (!hasRank(name)) {
defaultRank = null;
} else {
defaultRank = name;
}
}
/**
* Gets the default rank for this clan.
*
* @return The default rank or null if there is no default
*/
public @Nullable String getDefaultRank() {
return defaultRank;
}
public void setBanner(@Nullable ItemStack banner) {
if (banner == null) {
this.banner = null;
@@ -1,6 +1,8 @@
package net.sacredlabyrinth.phaed.simpleclans;
import net.sacredlabyrinth.phaed.simpleclans.managers.PermissionsManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils;
import net.sacredlabyrinth.phaed.simpleclans.utils.KDRFormat;
import net.sacredlabyrinth.phaed.simpleclans.utils.VanishUtils;
import org.bukkit.Bukkit;
@@ -77,51 +79,74 @@ public class Helper {
}
return null;
}
/**
* Converts a JSON String to a list of Ranks
*
* @param json the JSON String
* @return a list of ranks or null if the JSON String is null/empty
*/
public static @Nullable List<Rank> ranksFromJson(String json) {
if (json != null && !json.isEmpty()) {
try {
JSONObject jo = (JSONObject) new JSONParser().parse(json);
Object ranks = jo.get("ranks");
if (ranks != null) {
JSONArray array = (JSONArray) ranks;
List<Rank> rankList = new ArrayList<>();
for (Object o : array) {
JSONObject r = (JSONObject) o;
String name = (String) r.get("name");
String displayName = (String) r.get("displayName");
Set<String> permissions = new HashSet<>();
for (Object p : (JSONArray) r.get("permissions")) {
permissions.add((String) p);
}
Rank rank = new Rank(name, displayName, permissions);
rankList.add(rank);
}
return rankList;
}
} catch (ParseException e) {
e.printStackTrace();
}
}
return null;
public static @Nullable JSONObject parseJson(String json) {
if (json != null && !json.isEmpty()) {
try {
return (JSONObject) new JSONParser().parse(json);
} catch (ParseException e) {
e.printStackTrace();
}
}
return null;
}
/**
* Converts a list of Ranks to a JSON String
* Parses a list of ranks from the specified JSONObject
*
* @param ranks
* @param jo the JSON Object
* @return a list of ranks or null if the JSON String is null/empty
*/
public static @Nullable List<Rank> ranksFromJson(JSONObject jo) {
if (jo != null && !jo.isEmpty()) {
Object ranks = jo.get("ranks");
if (ranks != null) {
JSONArray array = (JSONArray) ranks;
List<Rank> rankList = new ArrayList<>();
for (Object o : array) {
JSONObject r = (JSONObject) o;
String name = (String) r.get("name");
String displayName = (String) r.get("displayName");
Set<String> permissions = new HashSet<>();
for (Object p : (JSONArray) r.get("permissions")) {
permissions.add((String) p);
}
Rank rank = new Rank(name, displayName, permissions);
rankList.add(rank);
}
return rankList;
}
}
return null;
}
/**
* Parses the default rank from the specified JSONObject
*
* @param jo the JSON object
* @return the default rank or null if not found and/or it does not exist
*/
public static @Nullable String defaultRankFromJson(JSONObject jo) {
if (jo != null && !jo.isEmpty()) {
if (!jo.containsKey("defaultRank")) {
return null;
} else {
return (String) jo.get("defaultRank");
}
}
return null;
}
/**
* Converts a list of ranks and the default rank to a JSON String
*
* @param ranks the ranks
* @param defaultRank the default rank
* @return a JSON String
*/
@SuppressWarnings("unchecked")
public static String ranksToJson(List<Rank> ranks) {
public static String ranksToJson(List<Rank> ranks, @Nullable String defaultRank) {
if (ranks == null)
ranks = new ArrayList<Rank>();
@@ -140,6 +165,7 @@ public class Helper {
JSONObject object = new JSONObject();
object.put("ranks", array);
object.put("defaultRank", defaultRank);
return object.toJSONString();
}
@@ -202,7 +228,8 @@ public class Helper {
List<Player> players = SimpleClans.getInstance().getServer().matchPlayer(playerName);
if (players.size() == 1) {
return SimpleClans.getInstance().getPermissionsManager().getPrefix(players.get(0)) + players.get(0).getName() + SimpleClans.getInstance().getPermissionsManager().getSuffix(players.get(0));
PermissionsManager pm = SimpleClans.getInstance().getPermissionsManager();
return pm.getPrefix(players.get(0)) + players.get(0).getName() + pm.getSuffix(players.get(0));
}
return playerName;
@@ -375,6 +402,9 @@ public class Helper {
if (hexValue == null) {
return "";
}
if (hexValue.startsWith("&#")) {
return ChatUtils.parseColors(hexValue);
}
ChatColor color = ChatColor.getByChar(hexValue);
if (color == null) {
@@ -511,25 +541,21 @@ public class Helper {
}
/**
* Convert color hex values with ampersand to special character
*
* @param msg
* @return
* @deprecated use {@link ChatUtils#parseColors(String)}
*/
@Deprecated
public static String parseColors(String msg) {
return msg.replace("&", "\u00a7");
return ChatUtils.parseColors(msg);
}
/**
* Removes color codes from strings
*
* @param msg
* @return
* @deprecated use {@link ChatUtils#stripColors(String)}
*/
@Deprecated
public static String stripColors(String msg) {
String out = msg.replaceAll("[&][0-9a-fk-or]", "");
out = out.replaceAll(String.valueOf((char) 194), "");
return out.replaceAll("[\u00a7][0-9a-fk-or]", "");
return ChatUtils.stripColors(msg);
}
/*
@@ -817,8 +843,8 @@ public class Helper {
String leaderColor = sm.getAllyChatLeaderColor();
String memberColor = sm.getAllyChatMemberColor();
String rank = cp.getRankId().isEmpty() ? null : ChatColor.translateAlternateColorCodes('&', cp.getRankDisplayName());
String rankFormat = rank != null ? ChatColor.translateAlternateColorCodes('&', sm.getAllyChatRank()).replace("%rank%", rank) : "";
String rank = cp.getRankId().isEmpty() ? null : ChatUtils.parseColors(cp.getRankDisplayName());
String rankFormat = rank != null ? ChatUtils.parseColors(sm.getAllyChatRank()).replace("%rank%", rank) : "";
String message = replacePlaceholders(sm.getAllyChatFormat(), cp, leaderColor, memberColor, rankFormat, msg);
if (placeholders != null) {
@@ -829,8 +855,13 @@ public class Helper {
return message;
}
private static String replacePlaceholders(String messageFormat, ClanPlayer cp, String leaderColor, String memberColor, String rankFormat, String msg) {
return ChatColor.translateAlternateColorCodes('&', messageFormat)
private static String replacePlaceholders(String messageFormat,
ClanPlayer cp,
String leaderColor,
String memberColor,
String rankFormat,
String msg) {
return ChatUtils.parseColors(messageFormat)
.replace("%clan%", Objects.requireNonNull(cp.getClan()).getColorTag())
.replace("%nick-color%", (cp.isLeader() ? leaderColor : memberColor))
.replace("%player%", cp.getName())
@@ -851,8 +882,8 @@ public class Helper {
String leaderColor = sm.getClanChatLeaderColor();
String memberColor = sm.getClanChatMemberColor();
String rank = cp.getRankId().isEmpty() ? null : ChatColor.translateAlternateColorCodes('&', cp.getRankDisplayName());
String rankFormat = rank != null ? ChatColor.translateAlternateColorCodes('&', sm.getClanChatRank()).replace("%rank%", rank) : "";
String rank = cp.getRankId().isEmpty() ? null : ChatUtils.parseColors(cp.getRankDisplayName());
String rankFormat = rank != null ? ChatUtils.parseColors(sm.getClanChatRank()).replace("%rank%", rank) : "";
String message = replacePlaceholders(sm.getClanChatFormat(), cp, leaderColor, memberColor, rankFormat, msg);
@@ -9,10 +9,10 @@ import net.sacredlabyrinth.phaed.simpleclans.managers.*;
import net.sacredlabyrinth.phaed.simpleclans.tasks.*;
import net.sacredlabyrinth.phaed.simpleclans.ui.InventoryController;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatFormatMigration;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils;
import net.sacredlabyrinth.phaed.simpleclans.utils.UpdateChecker;
import net.sacredlabyrinth.phaed.simpleclans.uuid.UUIDMigration;
import org.bstats.bukkit.Metrics;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.PluginManager;
@@ -249,7 +249,7 @@ public class SimpleClans extends JavaPlugin {
if (lang == null) {
return null;
}
String message = ChatColor.translateAlternateColorCodes('&', lang);
String message = ChatUtils.parseColors(lang);
// contains acf placeholders like {commandprefix}
if (Pattern.compile("\\{(?<key>[a-zA-Z]+?)}").matcher(message).find()) {
return message;
@@ -216,6 +216,7 @@ public class SCCommandManager extends PaperCommandManager {
"modtag", "bb", "clear", "rival", "ally", "add", "remove", "stats", "coords", "vitals", "rivalries",
"alliances", "leaderboard", "allow", "block", "auto", "check", "assign", "unassign", "delete", "me",
"setdisplayname", "permissions", "tag", "deposit", "withdraw", "set", "status", "tp", "all", "everyone",
"lookup", "roster", "profile", "list", "create", "description", "start", "end", "admin", "help");
"lookup", "roster", "profile", "list", "create", "description", "start", "end", "admin", "help", "mod",
"setdefault", "removedefault");
}
}
@@ -7,6 +7,7 @@ import net.sacredlabyrinth.phaed.simpleclans.commands.ClanPlayerInput;
import net.sacredlabyrinth.phaed.simpleclans.conversation.CreateRankNamePrompt;
import net.sacredlabyrinth.phaed.simpleclans.managers.PermissionsManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.StorageManager;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils;
import org.bukkit.ChatColor;
import org.bukkit.conversations.Conversation;
import org.bukkit.conversations.ConversationFactory;
@@ -67,7 +68,7 @@ public class RankCommand extends BaseCommand {
@Description("{@@command.description.rank.create}")
public void create(Player player, Clan clan) {
Conversation conversation = new ConversationFactory(plugin).withFirstPrompt(new CreateRankNamePrompt())
.withLocalEcho(true).buildConversation(player);
.withLocalEcho(true).withTimeout(60).buildConversation(player);
conversation.getContext().setSessionData("clan", clan);
conversation.begin();
}
@@ -98,7 +99,7 @@ public class RankCommand extends BaseCommand {
int count = 1;
for (Rank rank : ranks) {
ChatBlock.sendMessage(player, AQUA + lang("ranks.list.item", player, count,
Helper.parseColors(rank.getDisplayName()) + AQUA, rank.getName()));
ChatUtils.parseColors(rank.getDisplayName()) + AQUA, rank.getName()));
count++;
}
}
@@ -117,6 +118,23 @@ public class RankCommand extends BaseCommand {
ChatBlock.sendMessage(player, ChatColor.AQUA + lang("rank.displayname.updated", player));
}
@Subcommand("%setdefault")
@CommandPermission("simpleclans.leader.rank.setdefault")
@CommandCompletion("@ranks")
@Description("{@@command.description.rank.setdefault}")
public void setDefault(Player player, Clan clan, @Name("rank") Rank rank) {
clan.setDefaultRank(rank.getName());
ChatBlock.sendMessage(player, AQUA + lang("rank.setdefault", player, rank.getDisplayName()));
}
@Subcommand("%removedefault")
@CommandPermission("simpleclans.leader.rank.removedefault")
@Description("{@@command.description.rank.removedefault}")
public void removeDefault(Player player, Clan clan) {
clan.setDefaultRank(null);
ChatBlock.sendMessage(player, AQUA + lang("rank.removedefault", player));
}
@Subcommand("%permissions")
public class PermissionsCommand extends BaseCommand {
private final String validPermissionsToMessage = Helper.toMessage(Helper.fromPermissionArray(), ",");
@@ -23,12 +23,12 @@ public class CanVoteCondition extends AbstractCommandCondition {
ClanPlayer cp = clanManager.getCreateClanPlayer(player.getUniqueId());
Clan clan = cp.getClan();
if (clan != null) {
if (!clan.isLeader(player)) {
throw new ConditionFailedException(RED + lang("no.leader.permissions", player));
}
if (!requestManager.hasRequest(clan.getTag())) {
throw new ConditionFailedException(lang("nothing.to.vote", player));
}
if (!clan.isLeader(player)) {
throw new ConditionFailedException(RED + lang("no.leader.permissions", player));
}
if (cp.getVote() != null) {
throw new ConditionFailedException(RED + lang("you.have.already.voted", player));
}
@@ -1,6 +1,7 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.data;
import net.sacredlabyrinth.phaed.simpleclans.*;
import net.sacredlabyrinth.phaed.simpleclans.utils.VanishUtils;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
@@ -35,7 +36,7 @@ public class ClanRoster extends Sendable {
Player p = cp.toPlayer();
String name = (cp.isTrusted() ? sm.getPageTrustedColor() : sm.getPageUnTrustedColor()) + cp.getName();
String lastSeen = p != null && p.isOnline() && !Helper.isVanished(sender, p) ? GREEN + lang("online", sender) : WHITE + cp.getLastSeenDaysString(sender);
String lastSeen = p != null && p.isOnline() && !VanishUtils.isVanished(sender, p) ? GREEN + lang("online", sender) : WHITE + cp.getLastSeenDaysString(sender);
chatBlock.addRow(" " + name, YELLOW + Helper.parseColors(cp.getRankDisplayName()) + RESET, lastSeen);
}
@@ -48,7 +49,7 @@ public class ClanRoster extends Sendable {
Player p = cp.toPlayer();
String name = sm.getPageLeaderColor() + cp.getName();
String lastSeen = p != null && p.isOnline() && !Helper.isVanished(sender, p) ? GREEN + lang("online", sender)
String lastSeen = p != null && p.isOnline() && !VanishUtils.isVanished(sender, p) ? GREEN + lang("online", sender)
: WHITE + cp.getLastSeenDaysString(sender);
chatBlock.addRow(" " + name, YELLOW + Helper.parseColors(cp.getRankDisplayName()) + RESET, lastSeen);
@@ -75,10 +75,19 @@ public class Lookup extends Sendable {
@NotNull
private String getPlayerStatus() {
return target == null || targetClan == null ? lang("free.agent", sender) : (target.isLeader() ?
sm.getPageLeaderColor() + lang("leader", sender) : (target.isTrusted() ?
sm.getPageTrustedColor() + lang("trusted", sender) : sm.getPageUnTrustedColor() +
lang("untrusted", sender)));
if (target == null || targetClan == null) {
return lang("free.agent", sender);
}
if (target.isLeader()) {
return sm.getPageLeaderColor() + lang("leader", sender);
}
if (target.isTrusted()) {
return sm.getPageTrustedColor() + lang("trusted", sender);
}
if (target.getRankId() != null && !target.getRankId().isEmpty()) {
return sm.getPageTrustedColor() + lang("in.rank", sender);
}
return sm.getPageUnTrustedColor() + lang("untrusted", sender);
}
@NotNull
@@ -75,7 +75,7 @@ public class GeneralCommands extends BaseCommand {
initialData.put(TAG_KEY, tag);
initialData.put(NAME_KEY, name);
Conversation conversation = new ConversationFactory(plugin).withFirstPrompt(new CreateClanTagPrompt())
.withLocalEcho(true).withInitialSessionData(initialData).buildConversation(player);
.withLocalEcho(true).withTimeout(60).withInitialSessionData(initialData).buildConversation(player);
conversation.begin();
}
@@ -6,12 +6,15 @@ import co.aikar.commands.bukkit.contexts.OnlinePlayer;
import net.sacredlabyrinth.phaed.simpleclans.*;
import net.sacredlabyrinth.phaed.simpleclans.commands.ClanInput;
import net.sacredlabyrinth.phaed.simpleclans.commands.ClanPlayerInput;
import net.sacredlabyrinth.phaed.simpleclans.events.TagChangeEvent;
import net.sacredlabyrinth.phaed.simpleclans.language.LanguageResource;
import net.sacredlabyrinth.phaed.simpleclans.managers.ClanManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.PermissionsManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.StorageManager;
import net.sacredlabyrinth.phaed.simpleclans.ui.InventoryController;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils;
import net.sacredlabyrinth.phaed.simpleclans.utils.TagValidator;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
@@ -41,7 +44,7 @@ public class StaffCommands extends BaseCommand {
@Dependency
private StorageManager storage;
@Subcommand("%place")
@Subcommand("%mod %place")
@CommandPermission("simpleclans.mod.place")
@CommandCompletion("@players @clans")
@HelpSearchTags("move put")
@@ -59,9 +62,8 @@ public class StaffCommands extends BaseCommand {
}
if (oldClan.isLeader(player) && oldClan.getLeaders().size() <= 1) {
oldClan.clanAnnounce(player.getName(), AQUA + lang("clan.has.been.disbanded",
oldClan.getName()));
oldClan.disband();
ChatBlock.sendMessage(sender, RED + lang("you.cannot.move.the.last.leader", sender));
return;
} else {
oldClan.addBb(player.getName(), AQUA + lang("0.has.resigned", player.getName()));
oldClan.removePlayerFromClan(player.getUniqueId());
@@ -75,7 +77,37 @@ public class StaffCommands extends BaseCommand {
newClanInput.addPlayerToClan(cp);
}
@Subcommand("%reload")
@Subcommand("%mod %modtag")
@CommandPermission("simpleclans.mod.modtag")
@Description("{@@command.description.modtag.other}")
public void modtag(Player player, @Name("clan") ClanInput clanInput, @Single @Name("tag") String tag) {
Clan clan = clanInput.getClan();
TagChangeEvent event = new TagChangeEvent(player, clan, tag);
plugin.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
}
tag = event.getNewTag();
String cleanTag = Helper.cleanTag(tag);
TagValidator validator = new TagValidator(plugin, player, tag);
if (validator.getErrorMessage() != null) {
ChatBlock.sendMessage(player, validator.getErrorMessage());
return;
}
if (!cleanTag.equals(clan.getTag())) {
ChatBlock.sendMessage(player, RED + lang("you.can.only.modify.the.color.and.case.of.the.tag",
player));
return;
}
clan.addBb(player.getName(), AQUA + lang("tag.changed.to.0", ChatUtils.parseColors(tag)));
clan.changeClanTag(tag);
player.sendMessage(lang("0.tag.changed.to.1", player, clan.getTag(), tag));
}
@Subcommand("%admin %reload")
@CommandPermission("simpleclans.admin.reload")
@Description("{@@command.description.reload}")
public void reload(CommandSender sender) {
@@ -92,7 +124,7 @@ public class StaffCommands extends BaseCommand {
ChatBlock.sendMessage(sender, AQUA + lang("configuration.reloaded", sender));
}
@Subcommand("%home %set")
@Subcommand("%mod %home %set")
@CommandPermission("simpleclans.mod.home")
@CommandCompletion("@clans")
@Description("{@@command.description.mod.home.set}")
@@ -104,7 +136,7 @@ public class StaffCommands extends BaseCommand {
ChatColor.YELLOW + Helper.toLocationString(loc));
}
@Subcommand("%home %tp")
@Subcommand("%mod %home %tp")
@CommandCompletion("@clans:has_home")
@CommandPermission("simpleclans.mod.hometp")
@Description("{@@command.description.mod.home.tp}")
@@ -119,7 +151,7 @@ public class StaffCommands extends BaseCommand {
plugin.getTeleportManager().teleportToHome(player, clan.getClan());
}
@Subcommand("%ban")
@Subcommand("%mod %ban")
@CommandPermission("simpleclans.mod.ban")
@CommandCompletion("@players")
@Description("{@@command.description.ban}")
@@ -139,7 +171,7 @@ public class StaffCommands extends BaseCommand {
}
}
@Subcommand("%unban")
@Subcommand("%mod %unban")
@CommandPermission("simpleclans.mod.ban")
@CommandCompletion("@players")
@Description("{@@command.description.unban}")
@@ -159,7 +191,7 @@ public class StaffCommands extends BaseCommand {
ChatBlock.sendMessage(sender, AQUA + lang("player.removed.from.the.banned.list", sender));
}
@Subcommand("%globalff %allow")
@Subcommand("%mod %globalff %allow")
@CommandPermission("simpleclans.mod.globalff")
@Description("{@@command.description.globalff.allow}")
public void allowGlobalFf(CommandSender sender) {
@@ -171,7 +203,7 @@ public class StaffCommands extends BaseCommand {
}
}
@Subcommand("%globalff %auto")
@Subcommand("%mod %globalff %auto")
@CommandPermission("simpleclans.mod.globalff")
@Description("{@@command.description.globalff.auto}")
public void autoGlobalFf(CommandSender sender) {
@@ -186,7 +218,7 @@ public class StaffCommands extends BaseCommand {
}
@Subcommand("%verify")
@Subcommand("%mod %verify")
@CommandPermission("simpleclans.mod.verify")
@CommandCompletion("@clans:unverified")
@Description("{@@command.description.mod.verify}")
@@ -202,7 +234,7 @@ public class StaffCommands extends BaseCommand {
}
}
@Subcommand("%purge")
@Subcommand("%admin %purge")
@CommandPermission("simpleclans.admin.purge")
@CommandCompletion("@players")
@Description("{@@command.description.purge}")
@@ -220,7 +252,7 @@ public class StaffCommands extends BaseCommand {
ChatBlock.sendMessage(sender, AQUA + lang("player.purged", sender));
}
@Subcommand("%disband")
@Subcommand("%mod %disband")
@CommandCompletion("@clans")
@CommandPermission("simpleclans.mod.disband")
@Description("{@@command.description.mod.disband}")
@@ -248,6 +280,7 @@ public class StaffCommands extends BaseCommand {
clan.addBb(sender.getName(), AQUA + lang("promoted.to.leader", promotePl.getName()));
clan.promote(promotePl.getUniqueId());
ChatBlock.sendMessage(sender, AQUA + lang("player.successfully.promoted", sender));
}
@Subcommand("%admin %demote")
@@ -267,7 +300,7 @@ public class StaffCommands extends BaseCommand {
ChatBlock.sendMessage(sender, AQUA + lang("player.successfully.demoted", sender));
}
@Subcommand("%resetkdr %everyone")
@Subcommand("%admin %resetkdr %everyone")
@CommandPermission("simpleclans.admin.resetkdr")
@Description("{@@command.description.resetkdr.everyone}")
public void resetKdr(CommandSender sender) {
@@ -277,7 +310,7 @@ public class StaffCommands extends BaseCommand {
ChatBlock.sendMessage(sender, RED + lang("you.have.reseted.kdr.of.all.players", sender));
}
@Subcommand("%resetkdr")
@Subcommand("%admin %resetkdr")
@CommandCompletion("@players")
@CommandPermission("simpleclans.admin.resetkdr")
@Description("{@@command.description.resetkdr.player}")
@@ -3,6 +3,7 @@ package net.sacredlabyrinth.phaed.simpleclans.events;
import net.sacredlabyrinth.phaed.simpleclans.Request;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
/**
*
@@ -22,7 +23,7 @@ public class RequestEvent extends Event {
}
@Override
public HandlerList getHandlers() {
public @NotNull HandlerList getHandlers() {
return handlers;
}
@@ -10,7 +10,7 @@ import org.jetbrains.annotations.NotNull;
public class TagChangeEvent extends PlayerEvent implements Cancellable {
private static final HandlerList HANDLER_LIST = new HandlerList();
private final @NotNull Clan clan;
private final @NotNull Clan clan;
private @NotNull String newTag;
private boolean cancelled;
@@ -12,9 +12,15 @@ import org.bukkit.event.entity.EntityDamageEvent;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class FriendlyFire implements Listener {
private final SimpleClans plugin;
private final Map<UUID, Long> warned = new HashMap<>();
private static final long WARN_DELAY = 10000;
public FriendlyFire(@NotNull SimpleClans plugin) {
this.plugin = plugin;
@@ -59,14 +65,24 @@ public class FriendlyFire implements Listener {
}
if (victimClan.equals(attackerClan)) {
ChatBlock.sendMessageKey(attacker, "cannot.attack.clan.member");
warn(attacker, "cannot.attack.clan.member");
event.setCancelled(true);
return;
}
if (victimClan.isAlly(attackerClan.getTag())) {
ChatBlock.sendMessageKey(attacker, "cannot.attack.ally");
warn(attacker, "cannot.attack.ally");
event.setCancelled(true);
}
}
private void warn(Player attacker, String messageKey) {
long timestamp = warned.getOrDefault(attacker.getUniqueId(), 0L);
long currentTimeMillis = System.currentTimeMillis();
if (timestamp + WARN_DELAY <= currentTimeMillis) {
ChatBlock.sendMessageKey(attacker, messageKey);
warned.put(attacker.getUniqueId(), currentTimeMillis);
}
}
}
@@ -9,6 +9,7 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageEvent;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class PvPOnlyInWar implements Listener {
@@ -39,7 +40,8 @@ public class PvPOnlyInWar implements Listener {
}
}
private void process(EntityDamageEvent event, Player attacker, Player victim, Clan attackerClan, Clan victimClan) {
private void process(EntityDamageEvent event, Player attacker, Player victim, @Nullable Clan attackerClan,
@Nullable Clan victimClan) {
if (attackerClan == null || victimClan == null) {
ChatBlock.sendMessageKey(attacker, "must.be.in.clan.to.pvp", victim.getName());
event.setCancelled(true);
@@ -14,8 +14,6 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.*;
import java.util.Objects;
import static net.sacredlabyrinth.phaed.simpleclans.ClanPlayer.Channel.CLAN;
import static net.sacredlabyrinth.phaed.simpleclans.ClanPlayer.Channel.NONE;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
@@ -76,14 +74,15 @@ public class SCPlayerListener implements Listener {
@EventHandler
public void handleChatTags(AsyncPlayerChatEvent event) {
Player player = event.getPlayer();
ClanPlayer cp = plugin.getClanManager().getClanPlayer(player.getUniqueId());
if (cp == null || plugin.getSettingsManager().isBlacklistedWorld(player.getWorld())) {
if (plugin.getSettingsManager().isBlacklistedWorld(player.getWorld())) {
return;
}
Clan clan = Objects.requireNonNull(cp.getClan());
ClanPlayer cp = plugin.getClanManager().getAnyClanPlayer(player.getUniqueId());
String tagLabel = cp != null && cp.isTagEnabled() ? cp.getTagLabel() : null;
if (plugin.getSettingsManager().isCompatMode() && plugin.getSettingsManager().isChatTags()) {
if (cp.isTagEnabled()) {
String tagLabel = clan.getTagLabel(cp.isLeader());
if (tagLabel != null) {
if (player.getDisplayName().contains("{clan}")) {
player.setDisplayName(player.getDisplayName().replace("{clan}", tagLabel));
} else if (event.getFormat().contains("{clan}")) {
@@ -3,6 +3,7 @@ package net.sacredlabyrinth.phaed.simpleclans.managers;
import net.sacredlabyrinth.phaed.simpleclans.*;
import net.sacredlabyrinth.phaed.simpleclans.events.RequestEvent;
import net.sacredlabyrinth.phaed.simpleclans.events.RequestFinishedEvent;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils;
import net.sacredlabyrinth.phaed.simpleclans.uuid.UUIDMigration;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
@@ -406,42 +407,24 @@ public final class RequestManager {
* @param req the Request
*/
public void ask(final Request req) {
final String tag = plugin.getSettingsManager().getClanChatBracketColor() + plugin.getSettingsManager().getClanChatTagBracketLeft() + plugin.getSettingsManager().getTagDefaultColor() + req.getClan().getColorTag() + plugin.getSettingsManager().getClanChatBracketColor() + plugin.getSettingsManager().getClanChatTagBracketRight();
final String message = tag + " " + plugin.getSettingsManager().getRequestMessageColor() + req.getMsg();
if (req.getType().equals(ClanRequest.INVITE)) {
Player player = Bukkit.getPlayerExact(req.getTarget());
if (player != null) {
String options = lang("accept.or.deny", player, ChatBlock.makeEmpty(Helper.stripColors(tag)) + " " + ChatColor.DARK_GREEN + "/" + plugin.getSettingsManager().getCommandAccept() + plugin.getSettingsManager().getPageHeadingsColor(), ChatColor.DARK_RED + "/" + plugin.getSettingsManager().getCommandDeny());
ChatBlock.sendBlank(player);
ChatBlock.sendMessage(player, message);
ChatBlock.sendMessage(player, options);
ChatBlock.sendBlank(player);
}
String message = lang("request.message", req.getClan().getColorTag(), req.getMsg());
ArrayList<Player> recipients = new ArrayList<>();
if (req.getType() == ClanRequest.INVITE) {
recipients.add(Bukkit.getPlayerExact(req.getTarget()));
} else {
for (ClanPlayer cp : req.getAcceptors()) {
if (cp.getVote() == null) {
Player player = cp.toPlayer();
if (player != null) {
String options = lang("accept.or.deny", player, ChatBlock.makeEmpty(Helper.stripColors(tag)) + " " + ChatColor.DARK_GREEN + "/" + plugin.getSettingsManager().getCommandAccept() + plugin.getSettingsManager().getPageHeadingsColor(), ChatColor.DARK_RED + "/" + plugin.getSettingsManager().getCommandDeny());
ChatBlock.sendBlank(player);
ChatBlock.sendMessage(player, message);
ChatBlock.sendMessage(player, options);
ChatBlock.sendBlank(player);
}
recipients.add(cp.toPlayer());
}
}
}
new BukkitRunnable() {
@Override
public void run() {
SimpleClans.getInstance().getServer().getPluginManager().callEvent(new RequestEvent(req));
for (Player recipient : recipients) {
if (recipient != null) {
recipient.spigot().sendMessage(ChatUtils.toBaseComponents(recipient, message));
}
}.runTask(plugin);
}
Bukkit.getScheduler().runTask(plugin, () -> Bukkit.getPluginManager().callEvent(new RequestEvent(req)));
}
}
@@ -13,6 +13,7 @@ import org.bukkit.configuration.file.FileConfiguration;
import net.sacredlabyrinth.phaed.simpleclans.Helper;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -177,7 +178,7 @@ public final class SettingsManager {
private boolean moneyperkill;
private double KDRMultipliesPerKill;
private boolean teleportBlocks;
private boolean AutoGroupGroupName;
private boolean autoGroupGroupName;
private boolean tamableMobsSharing;
private boolean allowReGroupCommand;
private boolean useThreads;
@@ -205,6 +206,7 @@ public final class SettingsManager {
config = plugin.getConfig();
main = new File(plugin.getDataFolder() + File.separator + "config.yml");
load();
warnAboutAutoGroupGroupName();
}
/**
@@ -391,7 +393,7 @@ public final class SettingsManager {
teleportBlocks = getConfig().getBoolean("settings.teleport-blocks");
language = getConfig().getString("settings.language", "");
languagePerPlayer = getConfig().getBoolean("settings.user-language-selector", true);
AutoGroupGroupName = getConfig().getBoolean("permissions.auto-group-groupname");
autoGroupGroupName = getConfig().getBoolean("permissions.auto-group-groupname");
tamableMobsSharing = getConfig().getBoolean("settings.tameable-mobs-sharing");
allowReGroupCommand = getConfig().getBoolean("settings.allow-regroup-command");
loreLength = getConfig().getInt("settings.lore-length", 38);
@@ -425,6 +427,15 @@ public final class SettingsManager {
}
}
private void warnAboutAutoGroupGroupName() {
Plugin luckPerms = Bukkit.getServer().getPluginManager().getPlugin("LuckPerms");
if (luckPerms != null && autoGroupGroupName) {
plugin.getLogger().warning("LuckPerms was found and the setting auto-group-groupname is enabled.");
plugin.getLogger().warning("Be careful with that as players will be automatically added in the group" +
" that matches their clan tag.");
}
}
public int getLoreLength() {
return loreLength;
}
@@ -1681,7 +1692,7 @@ public final class SettingsManager {
* @return the AutoGroupGroupName
*/
public boolean isAutoGroupGroupName() {
return AutoGroupGroupName;
return autoGroupGroupName;
}
/**
@@ -7,6 +7,7 @@ import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import net.sacredlabyrinth.phaed.simpleclans.storage.DBCore;
import net.sacredlabyrinth.phaed.simpleclans.storage.MySQLCore;
import net.sacredlabyrinth.phaed.simpleclans.storage.SQLiteCore;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils;
import net.sacredlabyrinth.phaed.simpleclans.utils.YAMLSerializer;
import net.sacredlabyrinth.phaed.simpleclans.uuid.UUIDFetcher;
import net.sacredlabyrinth.phaed.simpleclans.uuid.UUIDMigration;
@@ -17,6 +18,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable;
import org.jetbrains.annotations.NotNull;
import org.json.simple.JSONObject;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -86,20 +88,20 @@ public final class StorageManager {
plugin.getLogger().info("Creating table: sc_clans");
String query = "CREATE TABLE IF NOT EXISTS `sc_clans` ("
+ " `id` bigint(20) NOT NULL auto_increment,"
+ " `verified` tinyint(1) default '0',"
+ " `tag` varchar(25) NOT NULL,"
+ " `color_tag` varchar(25) NOT NULL,"
+ " `name` varchar(100) NOT NULL,"
+ " `description` varchar(255),"
+ " `friendly_fire` tinyint(1) default '0',"
+ " `founded` bigint NOT NULL,"
+ " `last_used` bigint NOT NULL,"
+ " `packed_allies` text NOT NULL,"
+ " `packed_rivals` text NOT NULL,"
+ " `packed_bb` mediumtext NOT NULL,"
+ " `cape_url` varchar(255) NOT NULL,"
+ " `flags` text NOT NULL,"
+ " `id` bigint(20) NOT NULL auto_increment,"
+ " `verified` tinyint(1) default '0',"
+ " `tag` varchar(25) NOT NULL,"
+ " `color_tag` varchar(255) NOT NULL,"
+ " `name` varchar(100) NOT NULL,"
+ " `description` varchar(255),"
+ " `friendly_fire` tinyint(1) default '0',"
+ " `founded` bigint NOT NULL,"
+ " `last_used` bigint NOT NULL,"
+ " `packed_allies` text NOT NULL,"
+ " `packed_rivals` text NOT NULL,"
+ " `packed_bb` mediumtext NOT NULL,"
+ " `cape_url` varchar(255) NOT NULL,"
+ " `flags` text NOT NULL,"
+ " `balance` double(64,2),"
+ " `fee_enabled` tinyint(1) default '0',"
+ " `fee_value` double(64,2),"
@@ -162,20 +164,20 @@ public final class StorageManager {
plugin.getLogger().info("Creating table: sc_clans");
String query = "CREATE TABLE IF NOT EXISTS `sc_clans` ("
+ " `id` bigint(20),"
+ " `verified` tinyint(1) default '0',"
+ " `tag` varchar(25) NOT NULL,"
+ " `color_tag` varchar(25) NOT NULL,"
+ " `name` varchar(100) NOT NULL,"
+ " `description` varchar(255),"
+ " `friendly_fire` tinyint(1) default '0',"
+ " `founded` bigint NOT NULL,"
+ " `last_used` bigint NOT NULL,"
+ " `packed_allies` text NOT NULL,"
+ " `packed_rivals` text NOT NULL,"
+ " `packed_bb` mediumtext NOT NULL,"
+ " `cape_url` varchar(255) NOT NULL,"
+ " `flags` text NOT NULL,"
+ " `id` bigint(20),"
+ " `verified` tinyint(1) default '0',"
+ " `tag` varchar(25) NOT NULL,"
+ " `color_tag` varchar(255) NOT NULL,"
+ " `name` varchar(100) NOT NULL,"
+ " `description` varchar(255),"
+ " `friendly_fire` tinyint(1) default '0',"
+ " `founded` bigint NOT NULL,"
+ " `last_used` bigint NOT NULL,"
+ " `packed_allies` text NOT NULL,"
+ " `packed_rivals` text NOT NULL,"
+ " `packed_bb` mediumtext NOT NULL,"
+ " `cape_url` varchar(255) NOT NULL,"
+ " `flags` text NOT NULL,"
+ " `balance` double(64,2) default 0.0,"
+ " `fee_enabled` tinyint(1) default '0',"
+ " `fee_value` double(64,2),"
@@ -360,7 +362,7 @@ public final class StorageManager {
boolean verified = res.getBoolean("verified");
boolean friendly_fire = res.getBoolean("friendly_fire");
String tag = res.getString("tag");
String color_tag = Helper.parseColors(res.getString("color_tag"));
String color_tag = ChatUtils.parseColors(res.getString("color_tag"));
String name = res.getString("name");
String description = res.getString("description");
String packed_allies = res.getString("packed_allies");
@@ -368,7 +370,7 @@ public final class StorageManager {
String packed_bb = res.getString("packed_bb");
String cape_url = res.getString("cape_url");
String flags = res.getString("flags");
String ranks = res.getString("ranks");
JSONObject ranks = Helper.parseJson(res.getString("ranks"));
long founded = res.getLong("founded");
long last_used = res.getLong("last_used");
double balance = res.getDouble("balance");
@@ -402,6 +404,7 @@ public final class StorageManager {
clan.setMemberFee(feeValue);
clan.setMemberFeeEnabled(feeEnabled);
clan.setRanks(Helper.ranksFromJson(ranks));
clan.setDefaultRank(Helper.defaultRankFromJson(ranks));
clan.setBanner(banner);
out.add(clan);
@@ -440,7 +443,7 @@ public final class StorageManager {
boolean verified = res.getBoolean("verified");
boolean friendly_fire = res.getBoolean("friendly_fire");
String tag = res.getString("tag");
String color_tag = Helper.parseColors(res.getString("color_tag"));
String color_tag = ChatUtils.parseColors(res.getString("color_tag"));
String name = res.getString("name");
String description = res.getString("description");
String packed_allies = res.getString("packed_allies");
@@ -448,7 +451,7 @@ public final class StorageManager {
String packed_bb = res.getString("packed_bb");
String cape_url = res.getString("cape_url");
String flags = res.getString("flags");
String ranks = res.getString("ranks");
JSONObject ranks = Helper.parseJson(res.getString("ranks"));
long founded = res.getLong("founded");
long last_used = res.getLong("last_used");
double balance = res.getDouble("balance");
@@ -482,6 +485,7 @@ public final class StorageManager {
clan.setMemberFee(feeValue);
clan.setMemberFeeEnabled(feeEnabled);
clan.setRanks(Helper.ranksFromJson(ranks));
clan.setDefaultRank(Helper.defaultRankFromJson(ranks));
clan.setBanner(banner);
out = clan;
@@ -528,7 +532,7 @@ public final class StorageManager {
long last_seen = res.getLong("last_seen");
long join_date = res.getLong("join_date");
String flags = res.getString("flags");
String packed_past_clans = Helper.parseColors(res.getString("packed_past_clans"));
String packed_past_clans = ChatUtils.parseColors(res.getString("packed_past_clans"));
String resign_times = res.getString("resign_times");
Locale locale = Helper.forLanguageTag(res.getString("locale"));
@@ -699,7 +703,7 @@ public final class StorageManager {
"`packed_bb`, `cape_url`, `flags`, `balance`) ";
String values = "VALUES ( '"
+ Helper.escapeQuotes(YAMLSerializer.serialize(clan.getBanner())) + "','"
+ Helper.escapeQuotes(Helper.ranksToJson(clan.getRanks())) + "','"
+ Helper.escapeQuotes(Helper.ranksToJson(clan.getRanks(), clan.getDefaultRank())) + "','"
+ Helper.escapeQuotes(clan.getDescription())+ "',"
+ (clan.isMemberFeeEnabled() ? 1 : 0) +","
+ Helper.escapeQuotes(String.valueOf(clan.getMemberFee())) + ","
@@ -787,7 +791,7 @@ public final class StorageManager {
private String getUpdateClanQuery(Clan clan) {
String query = "UPDATE `sc_clans`" +
" SET ranks = '"+ Helper.escapeQuotes(Helper.ranksToJson(clan.getRanks())) +"'," +
" SET ranks = '"+ Helper.escapeQuotes(Helper.ranksToJson(clan.getRanks(), clan.getDefaultRank())) +"'," +
" banner = '" + Helper.escapeQuotes(YAMLSerializer.serialize(clan.getBanner())) + "'," +
" description = '" + Helper.escapeQuotes(clan.getDescription())+ "'," +
" fee_enabled = "+ (clan.isMemberFeeEnabled() ? 1 : 0) +"," +
@@ -1062,15 +1066,15 @@ public final class StorageManager {
private void updateDatabase() {
String query = null;
/**
/*
* From 2.2.6.3 to 2.3
*/
if (!core.existsColumn("sc_clans", "balance")) {
query = "ALTER TABLE sc_clans ADD COLUMN `balance` double(64,2);";
core.execute(query);
}
/**
/*
* From 2.7.16 to 2.7.17
*/
if (!core.existsColumn("sc_clans", "fee_enabled")) {
@@ -1081,24 +1085,24 @@ public final class StorageManager {
query = "ALTER TABLE sc_clans ADD COLUMN `fee_value` double(64,2);";
core.execute(query);
}
/**
/*
* From 2.7.21 to 2.7.22
*/
if (!core.existsColumn("sc_clans", "description")) {
query = "ALTER TABLE sc_clans ADD COLUMN `description` varchar(255);";
core.execute(query);
}
/**
/*
* From 2.7.22 to 2.7.23
*/
if (!core.existsColumn("sc_players", "resign_times")) {
query = "ALTER TABLE sc_players ADD COLUMN `resign_times` text;";
core.execute(query);
}
/**
/*
* From 2.8.2 to 2.9
*/
if (!core.existsColumn("sc_clans", "ranks")) {
@@ -1115,7 +1119,11 @@ public final class StorageManager {
core.execute("ALTER TABLE sc_clans ADD COLUMN `banner` text;");
}
/**
if (plugin.getSettingsManager().isUseMysql()) {
core.execute("ALTER TABLE sc_clans MODIFY color_tag VARCHAR(255);");
}
/*
* Bukkit 1.7.5+ UUID Migration
*/
if (!core.existsColumn("sc_kills", "attacker_uuid")) {
@@ -84,7 +84,7 @@ public final class TeleportManager {
z = z + zz;
plugin.getTeleportManager().addPlayer(player, new Location(location.getWorld(), x + .5,
location.getBlockY(), z + .5), clan.getName());
location.getBlockY(), z + .5, location.getYaw(), location.getPitch()), clan.getName());
}
}
@@ -23,8 +23,6 @@ import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.scheduler.BukkitRunnable;
import org.jetbrains.annotations.NotNull;
import java.util.*;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
/**
@@ -4,11 +4,11 @@ import net.sacredlabyrinth.phaed.simpleclans.RankPermission;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager;
import net.sacredlabyrinth.phaed.simpleclans.events.FrameOpenEvent;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.util.ChatPaginator;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -69,6 +69,10 @@ public class InventoryDrawer {
return inventory;
}
/**
*
* @deprecated use {@link InventoryDrawer#open(SCFrame)}
*/
@Deprecated
public static void update(@NotNull SCFrame frame) {
open(frame);
@@ -105,7 +109,7 @@ public class InventoryDrawer {
if (oldLore != null) {
ArrayList<String> newLore = new ArrayList<>();
for (String line : oldLore) {
String[] strings = ChatPaginator.wordWrap(line, plugin.getSettingsManager().getLoreLength());
String[] strings = ChatUtils.wordWrap(line, plugin.getSettingsManager().getLoreLength());
newLore.addAll(Arrays.asList(strings));
}
itemMeta.setLore(newLore);
@@ -3,9 +3,9 @@ package net.sacredlabyrinth.phaed.simpleclans.ui.frames;
import com.cryptomorin.xseries.XMaterial;
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.ui.*;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils;
import net.sacredlabyrinth.phaed.simpleclans.utils.KDRFormat;
import net.sacredlabyrinth.phaed.simpleclans.utils.Paginator;
import net.sacredlabyrinth.phaed.simpleclans.utils.VanishUtils;
@@ -41,16 +41,14 @@ public class Components {
boolean openDetails) {
SimpleClans pl = SimpleClans.getInstance();
String status = cp.getClan() == null ? lang("free.agent",viewer)
: (cp.isLeader() ? lang("leader",viewer)
: (cp.isTrusted() ? lang("trusted",viewer) : lang("untrusted",viewer)));
String status = getPlayerStatus(viewer, cp);
SCComponent c = new SCComponentImpl(lang("gui.playerdetails.player.title",viewer, cp.getName()),
Arrays.asList(
cp.getClan() == null ? lang("gui.playerdetails.player.lore.noclan",viewer)
: lang("gui.playerdetails.player.lore.clan",viewer, cp.getClan().getColorTag(),
cp.getClan().getName()),
lang("gui.playerdetails.player.lore.rank",viewer,
Helper.parseColors(cp.getRankDisplayName())),
ChatUtils.parseColors(cp.getRankDisplayName())),
lang("gui.playerdetails.player.lore.status",viewer, status),
lang("gui.playerdetails.player.lore.kdr",viewer,
new DecimalFormat("#.#").format(cp.getKDR())),
@@ -78,6 +76,23 @@ public class Components {
return c;
}
@NotNull
private static String getPlayerStatus(Player viewer, ClanPlayer cp) {
if (cp.getClan() == null) {
return lang("free.agent", viewer);
}
if (cp.isLeader()) {
return lang("leader", viewer);
}
if (cp.isTrusted()) {
return lang("trusted", viewer);
}
if (cp.getRankId() != null && !cp.getRankId().isEmpty()) {
return lang("in.rank", viewer);
}
return lang("untrusted", viewer);
}
public static SCComponent getClanComponent(@NotNull SCFrame frame, @NotNull Player viewer,
@Nullable Clan clan, int slot, boolean openDetails) {
SimpleClans pl = SimpleClans.getInstance();
@@ -167,6 +182,7 @@ public class Components {
return c;
}
@SuppressWarnings("deprecation")
public static void setOwningPlayer(@NotNull ItemStack item, @NotNull OfflinePlayer player) {
SkullMeta itemMeta = (SkullMeta) item.getItemMeta();
if (itemMeta == null) {
@@ -2,6 +2,7 @@ package net.sacredlabyrinth.phaed.simpleclans.ui.frames;
import com.cryptomorin.xseries.XMaterial;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.RankPermission;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.ui.*;
@@ -18,17 +19,19 @@ public class PlayerDetailsFrame extends SCFrame {
private final SimpleClans plugin = SimpleClans.getInstance();
private final OfflinePlayer subject;
private final String subjectName;
private final Clan clan;
public PlayerDetailsFrame(Player viewer, SCFrame parent, OfflinePlayer subject) {
super(parent, viewer);
this.subject = subject;
clan = plugin.getClanManager().getAnyClanPlayer(viewer.getUniqueId()).getClan();
ClanPlayer cp = plugin.getClanManager().getCreateClanPlayer(viewer.getUniqueId());
subjectName = cp.getName();
clan = cp.getClan();
}
@Override
public void createComponents() {
String subjectName = subject.getName();
for (int slot = 0; slot < 9; slot++) {
if (slot == 4)
continue;
@@ -93,7 +96,7 @@ public class PlayerDetailsFrame extends SCFrame {
@Override
public @NotNull String getTitle() {
return lang("gui.playerdetails.title",getViewer(), subject.getName());
return lang("gui.playerdetails.title",getViewer(), subjectName);
}
@Override
@@ -3,10 +3,10 @@ package net.sacredlabyrinth.phaed.simpleclans.ui.frames.staff;
import com.cryptomorin.xseries.XMaterial;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.Helper;
import net.sacredlabyrinth.phaed.simpleclans.ui.*;
import net.sacredlabyrinth.phaed.simpleclans.ui.frames.Components;
import net.sacredlabyrinth.phaed.simpleclans.ui.frames.RosterFrame;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
@@ -50,7 +50,7 @@ public class ClanDetailsFrame extends SCFrame {
Collections.singletonList(lang("gui.staffclandetails.disband.lore", getViewer())),
XMaterial.BARRIER, 34);
disband.setListener(ClickType.LEFT, () -> InventoryController.runSubcommand(getViewer(),
"disband", false, clan.getTag()));
"mod disband", false, clan.getTag()));
disband.setConfirmationRequired(ClickType.LEFT);
disband.setPermission(ClickType.LEFT, "simpleclans.mod.disband");
add(disband);
@@ -71,7 +71,7 @@ public class ClanDetailsFrame extends SCFrame {
verify.setPermission(ClickType.LEFT, "simpleclans.mod.verify");
verify.setConfirmationRequired(ClickType.LEFT);
verify.setListener(ClickType.LEFT, () -> InventoryController.runSubcommand(getViewer(),
"verify", false, clan.getTag()));
"mod verify", false, clan.getTag()));
}
add(verify);
}
@@ -84,10 +84,10 @@ public class ClanDetailsFrame extends SCFrame {
SCComponent home = new SCComponentImpl(lang("gui.clandetails.home.title", getViewer()), lore,
XMaterial.MAGENTA_BED, 30);
home.setListener(ClickType.LEFT, () -> InventoryController.runSubcommand(getViewer(),
"home tp", false, clan.getTag()));
"mod home tp", false, clan.getTag()));
home.setPermission(ClickType.LEFT, "simpleclans.mod.hometp");
home.setListener(ClickType.RIGHT, () -> InventoryController.runSubcommand(getViewer(),
"home set", false, clan.getTag()));
"mod home set", false, clan.getTag()));
home.setPermission(ClickType.RIGHT, "simpleclans.mod.home");
home.setConfirmationRequired(ClickType.RIGHT);
add(home);
@@ -111,7 +111,7 @@ public class ClanDetailsFrame extends SCFrame {
@Override
public @NotNull String getTitle() {
return lang("gui.clandetails.title", getViewer(), Helper.stripColors(clan.getColorTag()),
return lang("gui.clandetails.title", getViewer(), ChatUtils.stripColors(clan.getColorTag()),
clan.getName());
}
@@ -60,7 +60,7 @@ public class ClanListFrame extends SCFrame {
} else {
if (toPlace != null) {
c.setListener(ClickType.LEFT, () -> InventoryController.runSubcommand(getViewer(),
"place", false, toPlace.getName(), clan.getTag()));
"mod place", false, toPlace.getName(), clan.getTag()));
c.setConfirmationRequired(ClickType.LEFT);
c.setPermission(ClickType.LEFT, "simpleclans.mod.place");
}
@@ -83,7 +83,7 @@ public class ClanListFrame extends SCFrame {
}
private void updateFrame() {
InventoryDrawer.update(this);
InventoryDrawer.open(this);
}
@Override
@@ -64,7 +64,7 @@ public class PlayerDetailsFrame extends SCFrame {
lang("gui.playerdetails.purge.lore", getViewer())).build();
purge.setConfirmationRequired(ClickType.LEFT);
purge.setListener(ClickType.LEFT, () -> InventoryController.runSubcommand(getViewer(),
"purge", false, subjectName));
"admin purge", false, subjectName));
purge.setPermission(ClickType.LEFT, "simpleclans.admin.purge");
add(purge);
}
@@ -74,7 +74,7 @@ public class PlayerDetailsFrame extends SCFrame {
.withSlot(30).withDisplayName(lang("gui.main.reset.kdr.title", getViewer()))
.withLoreLine(lang("gui.playerdetails.resetkdr.lore", getViewer())).build();
resetKdr.setListener(ClickType.LEFT, () -> InventoryController.runSubcommand(getViewer(),
"resetkdr", false, subjectName));
"admin resetkdr", false, subjectName));
resetKdr.setConfirmationRequired(ClickType.LEFT);
resetKdr.setPermission(ClickType.LEFT, "simpleclans.admin.resetkdr");
add(resetKdr);
@@ -100,9 +100,9 @@ public class PlayerDetailsFrame extends SCFrame {
banUnban.setPermission(ClickType.LEFT, "simpleclans.mod.ban");
banUnban.setPermission(ClickType.RIGHT, "simpleclans.mod.ban");
banUnban.setListener(ClickType.LEFT, () -> InventoryController.runSubcommand(getViewer(),
"ban", false, subjectName));
"mod ban", false, subjectName));
banUnban.setListener(ClickType.RIGHT, () -> InventoryController.runSubcommand(getViewer(),
"unban", false, subjectName));
"mod unban", false, subjectName));
add(banUnban);
}
@@ -73,7 +73,7 @@ public class StaffFrame extends SCFrame {
reload.setPermission(ClickType.LEFT, "simpleclans.admin.reload");
reload.setConfirmationRequired(ClickType.LEFT);
reload.setListener(ClickType.LEFT, () ->
InventoryController.runSubcommand(getViewer(), "reload", false));
InventoryController.runSubcommand(getViewer(), "admin reload", false));
add(reload);
}
@@ -93,7 +93,7 @@ public class StaffFrame extends SCFrame {
} else {
arg = "allow";
}
InventoryController.runSubcommand(getViewer(), "globalff", true, arg);
InventoryController.runSubcommand(getViewer(), "mod globalff", true, arg);
});
add(globalFf);
}
@@ -0,0 +1,200 @@
package net.sacredlabyrinth.phaed.simpleclans.utils;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.chat.*;
import net.md_5.bungee.api.chat.ComponentBuilder.FormatRetention;
import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static net.md_5.bungee.api.chat.ClickEvent.Action.RUN_COMMAND;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
public class ChatUtils {
private static final Pattern PLACEHOLDER_PATTERN = Pattern.compile("(%([A-Za-z]+)%)");
private static final Pattern HEX_COLOR_PATTERN = Pattern.compile("&#(\\w{5}[0-9A-Fa-f])");
private static boolean supportsHexColors;
static {
try {
ChatColor.class.getDeclaredMethod("of", String.class);
supportsHexColors = true;
} catch (NoSuchMethodException e) {
supportsHexColors = false;
}
}
private ChatUtils() {
}
public static String parseColors(@NotNull String text) {
// Special thanks to the Spigot community!
// https://www.spigotmc.org/threads/hex-color-code-translate.449748/#post-3867795
if (supportsHexColors) {
Matcher matcher = HEX_COLOR_PATTERN.matcher(text);
StringBuffer buffer = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(buffer, ChatColor.of("#" + matcher.group(1)).toString());
}
text = matcher.appendTail(buffer).toString();
}
return ChatColor.translateAlternateColorCodes('&', text);
}
public static String stripColors(String text) {
if (supportsHexColors) {
Matcher matcher = HEX_COLOR_PATTERN.matcher(text);
StringBuffer buffer = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(buffer, "");
}
text = matcher.appendTail(buffer).toString();
}
return oldStripColors(text);
}
private static String oldStripColors(String text) {
return text.replaceAll("[&][0-9A-Za-z]", "")
.replaceAll(String.valueOf((char) 194), "") //don't know why
.replaceAll("[\u00a7][0-9A-Za-z]", "");
}
public static BaseComponent[] toBaseComponents(@Nullable CommandSender receiver, @NotNull String text) {
ComponentBuilder builder = new ComponentBuilder("");
ArrayList<String> placeholders = new ArrayList<>();
Matcher matcher = PLACEHOLDER_PATTERN.matcher(text);
while (matcher.find()) {
placeholders.add(matcher.group(0));
}
String[] split = PLACEHOLDER_PATTERN.split(text);
for (int i = 0; i < split.length; i++) {
builder.append(split[i]);
if (i >= placeholders.size()) {
continue;
}
appendPlaceholder(receiver, builder, placeholders.get(i));
}
return builder.create();
}
@SuppressWarnings("deprecation")
private static void appendPlaceholder(@Nullable CommandSender receiver, ComponentBuilder builder, String placeholder) {
Matcher matcher = PLACEHOLDER_PATTERN.matcher(placeholder);
if (!matcher.find()) {
return;
}
placeholder = matcher.group(2);
builder.retain(FormatRetention.FORMATTING).append(lang("clickable." + placeholder, receiver))
.event(new ClickEvent(RUN_COMMAND, "/" + placeholder))
.event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText(
(lang("hover.click.to." + placeholder, receiver)))));
}
/**
* Breaks a raw string up into a series of lines. Words are wrapped using
* spaces as decimeters and the newline character is respected.
*
* @param rawString The raw string to break.
* @param lineLength The length of a line of text.
* @return An array of word-wrapped lines.
*/
@NotNull
public static String[] wordWrap(@Nullable String rawString, int lineLength) {
// A null string is a single line
if (rawString == null) {
return new String[]{""};
}
// A string shorter than the lineWidth is a single line
if (rawString.length() <= lineLength && !rawString.contains("\n")) {
return new String[]{rawString};
}
Pattern splitPattern = Pattern.compile("(?<=\\G.{" + lineLength + "})");
char[] rawChars = (rawString + ' ').toCharArray(); // add a trailing space to trigger pagination
StringBuilder word = new StringBuilder();
StringBuilder line = new StringBuilder();
List<String> lines = new LinkedList<>();
int lineColorChars = 0;
for (int i = 0; i < rawChars.length; i++) {
char c = rawChars[i];
// skip chat color modifiers
if (c == ChatColor.COLOR_CHAR) {
word.append(ChatColor.COLOR_CHAR);
word.append(rawChars[i + 1]);
lineColorChars += 2;
i++; // Eat the next character as we have already processed it
continue;
}
if (c == ' ' || c == '\n') {
if (line.length() == 0 && word.length() - lineColorChars > lineLength) { // special case: extremely long word begins a line
lines.addAll(Arrays.asList(splitPattern.split(word.toString())));
} else if (line.length() + 1 + word.length() - lineColorChars == lineLength) { // Line exactly the correct length...newline
if (line.length() > 0) {
line.append(' ');
}
line.append(word);
lines.add(line.toString());
line = new StringBuilder();
lineColorChars = 0;
} else if (line.length() + 1 + word.length() - lineColorChars > lineLength) { // Line too long...break the line
for (String partialWord : splitPattern.split(word.toString())) {
lines.add(line.toString());
line = new StringBuilder(partialWord);
}
lineColorChars = 0;
} else {
if (line.length() > 0) {
line.append(' ');
}
line.append(word);
}
word = new StringBuilder();
if (c == '\n') { // Newline forces the line to flush
lines.add(line.toString());
line = new StringBuilder();
}
} else {
word.append(c);
}
}
if (line.length() > 0) { // Only add the last line if there is anything to add
lines.add(line.toString());
}
// Iterate over the wrapped lines, applying the last color from one line to the beginning of the next
applyLastColorToFollowingLines(lines);
return lines.toArray(new String[0]);
}
private static void applyLastColorToFollowingLines(List<String> lines) {
if (lines.get(0).length() == 0 || lines.get(0).charAt(0) != ChatColor.COLOR_CHAR) {
lines.set(0, ChatColor.WHITE + lines.get(0));
}
for (int i = 1; i < lines.size(); i++) {
final String pLine = lines.get(i - 1);
final String subLine = lines.get(i);
char color = pLine.charAt(pLine.lastIndexOf(ChatColor.COLOR_CHAR) + 1);
if (subLine.length() == 0 || subLine.charAt(0) != ChatColor.COLOR_CHAR) {
lines.set(i, ChatColor.getByChar(color) + subLine);
}
}
}
}
@@ -7,8 +7,6 @@ import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.text.MessageFormat;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
public class TagValidator {
@@ -31,9 +29,9 @@ public class TagValidator {
*/
@Nullable
public String getErrorMessage() {
String cleanTag = Helper.stripColors(this.tag);
if (tag.length() > 25) {
return lang("your.clan.color.tag.cannot.be.longer.than.characters", player, 25);
String cleanTag = ChatUtils.stripColors(this.tag);
if (tag.length() > 255 && plugin.getSettingsManager().isUseMysql()) {
return lang("your.clan.color.tag.cannot.be.longer.than.characters", player, 255);
}
if (!plugin.getPermissionsManager().has(player, "simpleclans.mod.bypass")) {
@@ -14,6 +14,7 @@ import com.google.gson.JsonParseException;
import com.google.gson.JsonParser;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.jetbrains.annotations.NotNull;
/**
*
@@ -52,7 +53,7 @@ public class UpdateChecker {
if (parse.isJsonObject()) {
String latestVersion = parse.getAsJsonObject().get("name").getAsString();
if (!version.equals(latestVersion)) {
if (compareVersions(version, latestVersion) < 0) {
plugin.getLogger().info(String.format("You're running an outdated version (%s).", version));
plugin.getLogger().info(String.format("The latest version is %s. Download it at:", latestVersion));
plugin.getLogger().info("https://www.spigotmc.org/resources/simpleclans.71242/");
@@ -69,4 +70,18 @@ public class UpdateChecker {
}.runTaskAsynchronously(plugin);
}
public static int compareVersions(@NotNull String a, @NotNull String b) {
String[] aSplit = a.split("\\.");
String[] bSplit = b.split("\\.");
int length = Math.max(aSplit.length, bSplit.length);
for (int i = 0; i < length; i++) {
int aPart = aSplit.length > i ? Integer.parseInt(aSplit[i]) : 0;
int bPart = bSplit.length > i ? Integer.parseInt(bSplit[i]) : 0;
if (aPart != bPart) {
return Integer.compare(aPart, bPart);
}
}
return 0;
}
}
+18 -1
View File
@@ -3,6 +3,8 @@ create.command=create
delete.command=delete
rank.command=rank
setdisplayname.command=setdisplayname
setdefault.command=setdefault
removedefault.command=removedefault
permissions.command=permissions
list.command=list
list.order.asc=asc
@@ -49,6 +51,7 @@ purge.command=purge
trust.command=trust
untrust.command=untrust
admin.command=admin
mod.command=mod
promote.command=promote
demote.command=demote
clanff.command=clanff
@@ -177,6 +180,8 @@ command.description.rank.create=Creates a rank
command.description.rank.delete=Deletes a rank
command.description.rank.list=Lists your clan''s ranks
command.description.rank.setdisplayname=Sets a rank''s display name
command.description.rank.setdefault=Sets the default rank
command.description.rank.removedefault=Removes the default rank
command.description.rank.permissions.available=Lists the available rank permissions
command.description.rank.permissions.rank=Lists a rank''s permissions
command.description.rank.permissions.add=Adds a permission to a rank
@@ -209,6 +214,7 @@ leader=leader
roster=roster
trusted=trusted
untrusted=untrusted
in.rank=in rank
deaths=Deaths
weights=Weights
stats=stats
@@ -256,7 +262,12 @@ inviting.you.to.join={0} is inviting you to join {1}
asking.for.the.deletion={0} is asking for the deletion of the clan
asking.for.the.promotion={0} is asking for the promotion of {1}
asking.for.the.demotion={0} is asking for the demotion of {1}
accept.or.deny={0} or {1}
# suppress inspection "TrailingSpacesInProperty"
request.message= \n &8[&8{0}&8] &b{1}\n %accept% &bor %deny%\n
clickable.accept=&a&l[ACCEPT]
clickable.deny=&c&l[DENY]
hover.click.to.accept=&aClick here to accept
hover.click.to.deny=&cClick here to deny
not.sufficient.money=You do not have sufficient money in your account
account.has.been.debited=Your account has been debited {0}
mysql.connection.successful=MySQL Connection successful
@@ -349,6 +360,7 @@ inactive.0=Inactive: {0}
clan.commands=clan commands
you.can.only.modify.the.color.and.case.of.the.tag=You can only modify the color and case of the tag
tag.changed.to.0=Tag changed to {0}
0.tag.changed.to.1=&bSuccessfully changed {0}''s tag to {1}
name.0=Name: {0}
description.0=Description: {0}
leaders.0=Leaders: {0}
@@ -463,7 +475,9 @@ resign.no=No
resign.confirmation=Are you sure you want to resign? {0}
resign.success=You have successfully resigned from your clan
you.cannot.demote.the.last.leader=You cannot demote the last leader
you.cannot.move.the.last.leader=You cannot move the last leader
player.successfully.demoted=The player was successfully demoted
player.successfully.promoted=The player was successfully promoted
bb.ago= ago
bb.moments=moments
bb.seconds= seconds
@@ -489,6 +503,8 @@ 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
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}
rank.removedefault=The clan''s default rank has been removed
rank.0.permissions=Rank {0}''s permissions:
available.rank.permissions=Available permissions for ranks:
rank.already.exists=Rank already exists
@@ -778,6 +794,7 @@ clans.not.at.war.pvp.denied=&cYour clan is not at war with {0}!
cannot.attack.civilians=&cYou cannot attack civilians!
cannot.attack.clan.member=&cYou cannot attack another clan member!
cannot.attack.ally=&cYou cannot attack an ally!
# suppress inspection "TrailingSpacesInProperty"
cannot.change.member.fee.now=&cYou cannot change the member fee close to its collection time.
cannot.change.member.fee.hours=&cTry again in {0} hours...
cannot.change.member.fee.minutes=&cTry again in {0} minute(s)...
@@ -0,0 +1,22 @@
description.command=popis
create.command=vytvořit
delete.command=smazat
rank.command=hodnost
setdisplayname.command=setdisplayname
permissions.command=permissions
list.command=list
list.order.asc=vzestupne
list.order.desc=sestupne
list.type.name=jmeno
list.type.kdr=kdr
list.type.size=velikost
list.type.founded=nalezen
list.type.active=aktivní
profile.command=profil
roster.command=roster
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
+2 -1
View File
@@ -83,6 +83,7 @@ acf-core.parameter.order=bestellung
acf-core.parameter.help=seite oder schlüsselwörter
command.description.stats=Zeigt die Mitgliederstatistik deines Clans an
command.description.rivalries=Zeigt alle Clan-Rivalitäten
command.description.kick=Wirf ein Mitglied aus deinem Clan
home-menu=/{0} Home{1} - Teleportiert dich in die Clan Basis
home-set-menu=/{0} Home set{1} - Setzt die Clan Basis
home-clear-menu=/{0} Home clear{1} - Entfernt die Clan Basis
@@ -156,7 +157,7 @@ proposing.an.alliance={0} schlägt vor ein Allianz mit {1} einzugehen
inviting.you.to.join={0} lädt dich zum Beitritt ein {1}
asking.for.the.deletion={0} fragt nach einer Löschung des Clans
asking.for.the.promotion={0} fragt nach einer Beförderung für {1}
accept.or.deny={0} bzw. {1}
# suppress inspection "TrailingSpacesInProperty"
not.sufficient.money=Du hast nicht genügend Geld auf deinem Konto
account.has.been.debited=Ihr Konto wurde belastet {0}
mysql.connection.successful=Verbindung hergestellt
+35 -31
View File
@@ -1,17 +1,17 @@
description.command=description
create.command=create
delete.command=delete
delete.command=eliminar
rank.command=rank
setdisplayname.command=setdisplayname
permissions.command=permissions
permissions.command=permisos
list.command=list
list.order.asc=asc
list.order.desc=desc
list.type.name=name
list.type.name=nombre
list.type.kdr=kdr
list.type.size=size
list.type.founded=founded
list.type.active=active
list.type.size=tamaño
list.type.founded=fundado
list.type.active=activo
profile.command=profile
roster.command=roster
lookup.command=lookup
@@ -22,29 +22,29 @@ vitals.command=vitals
coords.command=coords
stats.command=stats
ally.command=ally
add.command=add
remove.command=remove
allow.command=allow
block.command=block
add.command=añadir
remove.command=eliminar
allow.command=permitir
block.command=bloquear
auto.command=auto
check.command=check
assign.command=assign
unassign.command=unassign
check.command=verificar
assign.command=asignar
unassign.command=desasignar
rival.command=rival
bb.command=bb
clear.command=clear
clear.command=limpiar
modtag.command=modtag
toggle.command=toggle
tag.command=tag
deposit.command=deposit
all.command=all
withdraw.command=withdraw
tag.command=etiqueta
deposit.command=deposito
all.command=todo
withdraw.command=retirar
invite.command=invite
kick.command=kick
bank.command=bank
status.command=status
status.command=estado
fee.command=fee
set.command=set
set.command=poner
purge.command=purge
trust.command=trust
untrust.command=untrust
@@ -63,27 +63,27 @@ globalff.command=globalff
kills.command=kills
mostkilled.command=mostkilled
war.command=war
start.command=start
end.command=end
start.command=iniciar
end.command=terminar
home.command=home
regroup.command=regroup
me.command=me
regroup.command=reagrupar
me.command=yo
tp.command=tp
setrank.command=setrank
place.command=place
resetkdr.command=resetkdr
everyone.command=everyone
setbanner.command=setbanner
everyone.command=todos
setbanner.command=fijarbanner
help.command=ayuda
acf-core.parameter.member=miembro
acf-core.parameter.rank=rango
acf-core.parameter.leader=líder
acf-core.parameter.leader=lider
acf-core.parameter.displayname=nombre de pantalla
acf-core.parameter.permission=permiso
acf-core.parameter.permission=permisos
acf-core.parameter.message=mensaje
acf-core.parameter.tag=tag
acf-core.parameter.tag=etiqueta
acf-core.parameter.fee=tarifa
acf-core.parameter.description=descripción
acf-core.parameter.description=descripcion
acf-core.parameter.player=jugador
acf-core.parameter.clan=clan
acf-core.parameter.type=tipo
@@ -255,7 +255,7 @@ inviting.you.to.join={0} te esta invitando unirte a {1}
asking.for.the.deletion={0} esta solicitando la eliminacion del clan
asking.for.the.promotion={0} esta solicitando promover a {1}
asking.for.the.demotion={0} esta solicitando degradar a {1}
accept.or.deny={0} o {1}
# suppress inspection "TrailingSpacesInProperty"
not.sufficient.money=No tienes suficiente dinero en tu cuenta
account.has.been.debited=Se ha descontado de tu cuenta {0}
mysql.connection.successful=MySQL Connection successful
@@ -529,6 +529,7 @@ gui.main.reset.kdr.lore=&7Clic izquierdo para reiniciar tu KDR
gui.main.leaderboard.title=&fTablero de posiciones
gui.main.leaderboard.lore=&7Clic izquierdo para ver el tablero de posiciones
gui.main.staff.title=&fStaff
gui.main.staff.lore=&7Clic izquierdo para abrir el menú del personal
gui.staff.title=Staff
gui.staff.clan.list.lore.left.click=&7Clic izquierdo para ver la lista de clanes
gui.staff.clan.list.lore.right.click=&7Clic derecho para ver la lista de clanes sin verificar
@@ -750,3 +751,6 @@ clans.not.at.war.pvp.denied=&cTu clan no esta en guerra con {0}\!
cannot.attack.civilians=&cNo puedes atacar civiles\!
cannot.attack.clan.member=&cNo puedes atacar miembros de tu clan\!
cannot.attack.ally=&cNo puedes atacar a un aliado\!
cannot.change.member.fee.now=&cNo puedes cambiar la cuota de miembro cerca de su tiempo de recogida.
cannot.change.member.fee.hours=&cInténtalo de nuevo en {0} horas...
cannot.change.member.fee.minutes=&cInténtalo de nuevo en {0} minuto(s)...
+6 -3
View File
@@ -6,7 +6,7 @@ setdisplayname.command=setdisplayname
permissions.command=permissions
list.command=liste
list.order.desc=desc
list.type.name=nome
list.type.name=nom
list.type.kdr=kda
list.type.size=taille
list.type.founded=fondé
@@ -21,7 +21,7 @@ vitals.command=vitaux
coords.command=coordonnées
stats.command=statistiques
ally.command=allie
add.command=ajouter
add.command=ajoute
remove.command=retirer
allow.command=autoriser
block.command=bloquer
@@ -48,6 +48,7 @@ purge.command=purge
trust.command=confiance
untrust.command=méfiance
admin.command=admin
mod.command=modérateur
promote.command=promouvoir
demote.command=rétrograder
clanff.command=clanff
@@ -81,10 +82,12 @@ acf-core.parameter.displayname=Nom affiché
acf-core.parameter.permission=autorisation
acf-core.parameter.message=message
acf-core.parameter.tag=tag
acf-core.parameter.name=nom
acf-core.parameter.description=description
acf-core.parameter.player=joueur
acf-core.parameter.clan=clan
acf-core.parameter.help=page ou mots-clés
command.description.stats=Montre les stats des membres de votre clan
command.description.list=Liste de tous les clans
command.description.ally=Parle dans le chat des alliés
command.description.deny=Refuser une demande
@@ -212,7 +215,7 @@ inviting.you.to.join={0} vous invite à rejoindre {1}
asking.for.the.deletion={0} demande la suppression du clan
asking.for.the.promotion={0} demande la promotion de {1}
asking.for.the.demotion={0} demande la rétrogradation de {1}
accept.or.deny={0} ou {1}
# suppress inspection "TrailingSpacesInProperty"
not.sufficient.money=Vous n'avez pas assez d'argent sur votre compte
account.has.been.debited=Votre compte a été débité {0}
mysql.connection.successful=MySQL Connexion réussie
+1 -1
View File
@@ -72,7 +72,7 @@ inviting.you.to.join={0} meghívott téged, hogy csatlakozz {1}
asking.for.the.deletion={0} a klán törlését kéri
asking.for.the.promotion={0} kéri a promóció {1}
asking.for.the.demotion={0} kéri a promóció {1}
accept.or.deny={0} vagy {1}
# suppress inspection "TrailingSpacesInProperty"
not.sufficient.money=Nincs elegendő pénz a fiókodban
account.has.been.debited=A fiókod terhelésre került {0}
mysql.connection.successful=MySQL kapcsolat sikeres
+3 -3
View File
@@ -1,7 +1,7 @@
description.command=descrizione
create.command=creare
create.command=crea
delete.command=elimina
rank.command=grado
rank.command=rango
profile.command=profilo
roster.command=membri
lookup.command=ricerca
@@ -144,7 +144,7 @@ proposing.an.alliance={0} sta proponendo un''alleanza con {1}
inviting.you.to.join={0} ti sta invitando ad unirti a {1}
asking.for.the.deletion={0} chiede l''eliminazione del clan
asking.for.the.promotion={0} chiede la promozione di {1}
accept.or.deny={0} oppure {1}
# suppress inspection "TrailingSpacesInProperty"
not.sufficient.money=Non hai abbastanza soldi sul tuo conto
mysql.connection.successful=Connessione MySQL riuscita
mysql.connection.failed=Connessione MySQL fallita
@@ -95,4 +95,5 @@ command.description.regroup.me=Hergroepeert je clan leden naar je locatie
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
@@ -46,4 +46,5 @@ help.command=hjelp
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
+4 -4
View File
@@ -1,5 +1,5 @@
description.command=opis
create.command=stworz
description.command=Opis
create.command=utwórz
delete.command=usun
rank.command=ranking
setdisplayname.command=ustaw nazwe wyswietlana
@@ -255,7 +255,7 @@ inviting.you.to.join={0} zaprasza cie do przylaczenia sie do {1}}
asking.for.the.deletion={0} wnioskuje za usunieciem klanu
asking.for.the.promotion={0} wnioskuje o awansowanie {1}
asking.for.the.demotion={0} wnioskuje o degradacje {1}
accept.or.deny={0} lub {1}
# suppress inspection "TrailingSpacesInProperty"
not.sufficient.money=Nie posiadasz wystarczajacej ilosci dukatow
account.has.been.debited=Twoje konto zostalo zmniejszone o {0}
mysql.connection.successful=MySQL udane polaczenie
@@ -753,4 +753,4 @@ cannot.attack.clan.member=&cNie możesz zaatakować innego członka klanu\!
cannot.attack.ally=&cNie możesz zaatakować sojusznika\!
cannot.change.member.fee.now=&cNie możesz zmienić składki członkowskiej blisko czasu jej pobrania.
cannot.change.member.fee.hours=&cSpróbuj ponownie za {0} godzin...
cannot.change.member.fee.minutes=&cSpróbuj ponownie za {0} minut...
cannot.change.member.fee.minutes=&cSpróbuj ponownie za {0} minut...
+12 -3
View File
@@ -49,6 +49,7 @@ purge.command=apagar
trust.command=confiar
untrust.command=naoconfiar
admin.command=admin
mod.command=mod
promote.command=promover
demote.command=rebaixar
clanff.command=clanff
@@ -82,6 +83,7 @@ acf-core.parameter.displayname=nome de exibição
acf-core.parameter.permission=permissão
acf-core.parameter.message=mensagem
acf-core.parameter.tag=tag
acf-core.parameter.name=nome
acf-core.parameter.fee=taxa
acf-core.parameter.description=descrição
acf-core.parameter.player=jogador
@@ -208,6 +210,7 @@ leader=líder
roster=membros
trusted=confiável
untrusted=não-confiável
in.rank=no cargo
deaths=Morreu
weights=Pesos
stats=estatísticas
@@ -255,7 +258,12 @@ inviting.you.to.join={0} está te convidando para ser membro de {1}
asking.for.the.deletion={0} está pedindo pela remoção do clã
asking.for.the.promotion={0} está pedindo pela promoção de {1}
asking.for.the.demotion={0} está pedindo pelo rebaixamento de {1}
accept.or.deny={0} ou {1}
# suppress inspection "TrailingSpacesInProperty"
request.message= \n &8[&8{0}&8] &b{1}\n %accept% &bou %deny%\n
clickable.accept=&a&l[ACEITAR]
clickable.deny=&c&l[REJEITAR]
hover.click.to.accept=&aClique aqui para aceitar
hover.click.to.deny=&cClique aqui para rejeitar
not.sufficient.money=Você não tem dinheiro suficiente em sua conta
account.has.been.debited={0} foram debitados de sua conta
mysql.connection.successful=Conexão MySQL bem sucedida
@@ -348,6 +356,7 @@ inactive.0=Inativo\: {0}
clan.commands=comandos de clã
you.can.only.modify.the.color.and.case.of.the.tag=Você pode modificar apenas a cor ou a caixa (maiúsculo ou minúsculo) da tag
tag.changed.to.0=Tag modificada para {0}
0.tag.changed.to.1=&bAlterou a tag do clã de {0} para {1}
name.0=Nome\: {0}
description.0=Descrição\: {0}
leaders.0=Líderes\: {0}
@@ -529,7 +538,7 @@ gui.main.reset.kdr.lore=&7Clique com o botão esquerdo para redefinir o seu KDR
gui.main.leaderboard.title=&fRanking
gui.main.leaderboard.lore=&7Clique com o botão esquerdo para ver o ranking
gui.main.staff.title=&fEquipe
gui.main.staff.lore=&7Clique com o botão esquerdo para abrir o menu da Staff
gui.main.staff.lore=&7Clique com o botão esquerdo para abrir o menu da equipe
gui.staff.title=Equipe
gui.staff.clan.list.lore.left.click=&7Clique com o botão esquerdo para ver todos os clãs
gui.staff.clan.list.lore.right.click=&7Clique com o botão direito para ver todos os clãs não verificados
@@ -753,4 +762,4 @@ cannot.attack.clan.member=&cVocê não pode atacar um membro do clã\!
cannot.attack.ally=&cVocê não pode atacar um aliado\!
cannot.change.member.fee.now=&cVocê não pode modificar a taxa perto do horário de coleta.
cannot.change.member.fee.hours=&cTente novamente em {0} horas...
cannot.change.member.fee.minutes=&cTente novamente em {0} minuto(s)...
cannot.change.member.fee.minutes=&cTente novamente em {0} minuto(s)...
@@ -73,4 +73,5 @@ command.description.regroup.home=Adu' membri clanului la casa ta
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
+29 -20
View File
@@ -49,6 +49,7 @@ purge.command=очистка
trust.command=доверие
untrust.command=недоверие
admin.command=админ
mod.command=мод
promote.command=повысить
demote.command=понизить
clanff.command=кланфф
@@ -66,7 +67,7 @@ war.command=война
start.command=начать
end.command=конец
home.command=дом
regroup.command=перегруппироваться
regroup.command=созвать
me.command=мне
tp.command=телепортировать
setrank.command=установить ранг
@@ -82,6 +83,7 @@ acf-core.parameter.displayname=отображаемое имя
acf-core.parameter.permission=права
acf-core.parameter.message=сообщение
acf-core.parameter.tag=тег
acf-core.parameter.name=имя
acf-core.parameter.fee=комиссия
acf-core.parameter.description=описание
acf-core.parameter.player=игрок
@@ -92,7 +94,7 @@ acf-core.parameter.help=страница или ключевые слова
command.description.stats=Показать статистику участников вашего клана
command.description.rivalries=Показать всех соперников клана
command.description.mostkilled=Показать общую статистику убийств на всём сервере
command.description.kills=Показывает количество убийств вашего или другого игрока
command.description.kills=Показать количество убийств вашего или другого игрока
command.description.lookup=Посмотреть информацию о себе
command.description.lookup.other=Посмотреть информацию об игроке
command.description.leaderboard=Показать таблицу лидеров
@@ -108,16 +110,16 @@ command.description.deny=Отклонить запрос
command.description.accept=Принять запрос
command.description.more=Показать больше информации
command.description.create=Создать клан
command.description.ff.allow=Разрешить участникам вашего клана бить друг друга
command.description.ff.allow=Разрешить "огонь по своим" для вас
command.description.ff.auto=Установить ваш статус "огонь по своим" по умолчанию
command.description.globalff.allow=Разрешить участникам всех кланов бить друг друга
command.description.globalff.allow=Установить глобальный статус "огонь по своим" на разрешено
command.description.globalff.auto=Установить глобальный статус "огонь по своим" по умолчанию
command.description.clanff.allow=Разрешить "огонь по своим" участникам вашего клана
command.description.clanff.block=Запретить "огонь по своим" участникам вашего клана
command.description.description=Установить описание вашего клана
command.description.ban=Запретить игроку использовать команды клана
command.description.unban=Разрешить игроку использовать команды клана
command.description.regroup.me=Перегруппировать участников вашего клана в ваше текущее местоположение
command.description.regroup.me=Созвать участников вашего клана к вам
command.description.regroup.home=Созвать всех участников на вашу базу
command.description.home.tp=Телепортироваться на базу вашего клана
command.description.home.clear=Удалить базу вашего клана
@@ -163,7 +165,7 @@ command.description.admin.demote=Понизить лидера из любого
command.description.demote=Понизить лидера
command.description.admin.promote=Повысить любого участника из любого клана
command.description.promote=Повысить участника до лидера
command.description.toggle.bb=Следует ли показывать вашим участникам доску объявлений при входе на сервер
command.description.toggle.bb=Следует ли показывать доску объявлений при входе на сервер
command.description.toggle.tag=Показывать ли рядом с вашим именем тег клана
command.description.toggle.deposit=Можно ли вносить средства в банковский счёт вашего клана
command.description.toggle.withdraw=Можно ли выводить средства с банковского счёта вашего клана
@@ -208,6 +210,7 @@ leader=лидер
roster=список
trusted=проверенный
untrusted=недоверенный
in.rank=в ранге
deaths=Смертей
weights=Весит
stats=статистика
@@ -222,7 +225,7 @@ profile=профиль
civilian.abbreviation=Жители
rank=Ранг
leaders=Лидеры
none=Нету
none=Нет
today=Сегодня
kills=Убиты
mostkilled=Наибольшее число убийств
@@ -255,7 +258,12 @@ inviting.you.to.join={0} пригласил вас присоединится к
asking.for.the.deletion={0} предлагает удалить клан
asking.for.the.promotion={0} просит повышение {1}
asking.for.the.demotion={0} просит понизить {1}
accept.or.deny={0} или {1}
# suppress inspection "TrailingSpacesInProperty"
request.message= \n&8[&8{0}&8] &b{1}\n %accept% &bили %deny%\n
clickable.accept=&a&l[ПРИНЯТЬ]
clickable.deny=&c&l[ОТКЛОНИТЬ]
hover.click.to.accept=Нажмите, чтобы принять
hover.click.to.deny=Нажмите, чтобы отклонить
not.sufficient.money=На вашем балансе недостаточно средств
account.has.been.debited=С вашего баланса было списано {0}
mysql.connection.successful=Соединение с MySQL прошло успешно
@@ -271,7 +279,7 @@ nothing.more.to.see=Больше ничего нет
nothing.to.vote=&cНечего принимать или отклонять
no.leader.permissions=Вы не имеете права лидера
you.have.already.voted=Вы уже проголосовали
has.voted.to.deny={0} проголосовал за отказ
has.voted.to.deny={0} проголосовал, чтобы отклонить
view.next.page=Введите /{0} для просмотра следующей страницы.
voted.to.accept={0} проголосовал за принятие
bulletin.board.header={0}* {1}{2} доска объявлений
@@ -348,6 +356,7 @@ inactive.0=Неактивно\: {0}
clan.commands=команды клана
you.can.only.modify.the.color.and.case.of.the.tag=Вы можете изменить только цвет и регистр тега
tag.changed.to.0=Тег изменён на {0}
0.tag.changed.to.1=&bТег {0} успешно изменён на {1}
name.0=Имя\: {0}
description.0=Описание\:{0}
leaders.0=Лидер\: {0}
@@ -425,7 +434,7 @@ depositoff=Пополнение выключено
withdrawon=Вывод включён
withdrawoff=Вывод выключен
feeoff=Участники клана больше не вносят комиссию на банковский счёт вашего клана.
feeon=Участники клана теперь вносят комиссию на банковский счёт вашего клана. \nУчастники, не имеющие достаточное количество денег, будут автоматически кикнуты с клана.
feeon=Участники клана теперь вносят комиссию на банковский счёт вашего клана. Участники, не имеющие достаточное количество денег, будут автоматически кикнуты с клана.
home.base.only.once=База клана может быть установлена лишь один раз
now.at.homebase=Вы сейчас находитесь на базе клана {0}
hombase.set=База клана\: {0}
@@ -436,7 +445,7 @@ rival.limit.reached=Вы достигли лимита войн, пока что
you.moved.teleport.cancelled=Вы перемещены, телепортация отменена
waiting.for.teleport.stand.still.for.0.seconds=Ожидание телепортирования, оставайтесь на месте ещё {0} секунд
on=включить
off=Выключить
off=выключить
leave=покинуть
join=присоединиться
mute=молчать
@@ -521,7 +530,7 @@ gui.main.languageselector.lore.left.click=&7ЛКМ\: Посмотреть спи
gui.main.languageselector.lore.right.click=&7ПКМ\: &bПомочь с переводом
gui.main.other.commands.title=&fДругие команды
gui.main.other.commands.lore=&7ЛКМ\: Посмотреть все команды клана
gui.main.clan.list.title=&fСписок Кланов
gui.main.clan.list.title=&fСписок кланов
gui.main.clan.list.lore=&7ЛКМ\: Список всех кланов
gui.main.reset.kdr.title=&fСбросить KDR
gui.main.reset.kdr.lore.price=&7Цена\: &b{0}
@@ -569,7 +578,7 @@ gui.clanlist.clan.lore.members=&7Участники\: &b{0}
gui.coords.title=Координаты
gui.coords.player.lore.distance=&7Расстояние\: &b{0}
gui.coords.player.lore.coords=&7Координаты\: &b{0} {1} {2}
gui.coords.player.lore.world=&fМир\: {0}
gui.coords.player.lore.world=&7Мир\: &b{0}
gui.invite.title=Пригласить игрока
gui.invite.player.title=&f{0}
gui.invite.player.price.lore=&7Цена\: &b{0}
@@ -605,7 +614,7 @@ gui.clandetails.clan.lore.status=&7Статус\: &b{0}
gui.clandetails.clan.lore.leaders=&7Лидеры\: &b{0}
gui.clandetails.clan.lore.online.members=&7Участников онлайн\: &b{0}/{1}
gui.clandetails.clan.lore.kdr=&7KDR\: &b{0}
gui.clandetails.clan.lore.kill.totals=&7Убито всего\: &b[Враги\:{0} Нейтральные\:{1} Игроки\:{2}]
gui.clandetails.clan.lore.kill.totals=&7Убито всего\: &b[Соперники\: {0} Нейтралы\: {1} Без клана\: {2}]
gui.clandetails.clan.lore.deaths=&7Смертей\: &b{0}
gui.clandetails.clan.lore.fee=&7Комиссия\: &b{0}, {1}$
# suppress inspection "TrailingSpacesInProperty"
@@ -629,11 +638,11 @@ gui.clandetails.home.title=&fДом
gui.clandetails.home.lore.teleport.price=&7Цена телепортирования\: &b{0}
gui.clandetails.home.lore.teleport=&7ЛКМ\: Телепортироваться на базу вашего клана
gui.staffclandetails.home.lore.teleport=&7ЛКМ\: Телепорироваться на базу этого клана
gui.clandetails.home.lore.clear=&7Кликните средней кнопкой мыши, чтобы очистить дом вашего клана
gui.clandetails.home.lore.clear=&7СКМ\: Удалить точку базы вашего клана
gui.clandetails.home.lore.set.price=&7Установить цену\: &b{0}
gui.clandetails.home.lore.set=&7ПКМ\: Установить точку базы вашего клана
gui.staffclandetails.home.lore.set=&7ПКМ\: Установить точку базы для этого клана
gui.clandetails.regroup.title=&fПерегруппировать
gui.clandetails.regroup.title=&fСозвать
gui.clandetails.regroup.lore.price=&7Цена\: &b{0}
gui.clandetails.regroup.lore.home=&7ЛКМ\: Телепортировать всех участников вашего клана на базу
gui.clandetails.regroup.lore.me=&7ПКМ\: Телепортировать участников вашего клана к вам
@@ -653,7 +662,7 @@ gui.clandetails.fee.status.lore=&7Статус\: &b{0}
gui.clandetails.fee.value.lore=&7Значение\: &b{0}
gui.clandetails.fee.toggle.lore=&7ЛКМ\: Изменить статус комиссии
gui.clandetails.rank.title=&fРанг
gui.clandetails.rank.lore=&7ЛКМ\: Посмотреть список рангов клана и их редактирование
gui.clandetails.rank.lore=&7ЛКМ\: Посмотреть ранги клана и редактировать их
gui.clandetails.verified.title=&fПодтвержден
gui.clandetails.not.verified.title=&fНе подтвержден
gui.clandetails.verify.price.lore=&7Цена\: &b{0}
@@ -680,7 +689,7 @@ gui.playerdetails.player.lore.clan=&7Клан\: &b[{0}&b] {1}
gui.playerdetails.player.lore.rank=&7Ранг\: &b{0}
gui.playerdetails.player.lore.status=&7Статус\: &b{0}
gui.playerdetails.player.lore.kdr=&7KDR\: &b{0}
gui.playerdetails.player.lore.kill.totals=&7Убито всего\: &b[Враги\:{0} Нейтральные\:{1} Игроки\:{2}]
gui.playerdetails.player.lore.kill.totals=&7Убито всего\: &b[Соперники\: {0} Нейтралы\: {1} Без клана\: {2}]
gui.playerdetails.player.lore.deaths=&7Смертей\: &b{0}
gui.playerdetails.player.lore.join.date=&7Дата вступления\: &b{0}
gui.playerdetails.player.lore.last.seen=&7Был в сети\: &b{0}
@@ -737,7 +746,7 @@ you.must.hold.a.banner=&cУ вас в руках должен быть флаг\
you.changed.clan.banner=&bВы изменили флаг своего клана\!
your.clan.already.verified=&cКлан уже подтвержден\!
# suppress inspection "TrailingSpacesInProperty"
clan.profile=\n&7Профиль клана &b%clan_name% &8-------------------------------------------\n \n &7Название\: &e[&8%clan_color_tag%&e] &b%clan_name%\n &7Описание\: &f%clan_description%\n &7Статус\: &f%clan_verified%\n &7Лидеры\: %clan_leaders%\n &7Участников онлайн\: &f%clan_online_count%&7/&f%clan_size%\n &7KDR\: &e%clan_kdr%\n &7Всего убийств\: &8[Соперников\: &f%clan_rival_kills%, &8Нейтральных\: &f%clan_neutral_kills%, &8Гражданских\:&f%clan_civilian_kills%&8]\n &7Смертей\: &f%clan_deaths%\n &7Комиссия\: &f%clan_fee_enabled%&7, &f%clan_fee_value% $\n &7Союзники\: &f%clan_allies%\n &7Соперники\: &f%clan_rivals%\n &7Основан\: &f%clan_founded%\n &7Неактивность клана\: &f%clan_inactive_days%&7/&f%clan_max_inactive_days% дня\n
clan.profile=\n&7Профиль клана &b%clan_name% &8-------------------------------------------\n \n &7Название\: &e[&8%clan_color_tag%&e] &b%clan_name%\n &7Описание\: &f%clan_description%\n &7Статус\: &f%clan_verified%\n &7Лидеры\: %clan_leaders%\n &7Участников онлайн\: &f%clan_online_count%&7/&f%clan_size%\n &7KDR\: &e%clan_kdr%\n &7Всего убийств\: &8[Соперников\:&f%clan_rival_kills% &8Нейтральных\:&f%clan_neutral_kills% &8Гражданских\:&f%clan_civilian_kills%&8]\n &7Смерти\: &f%clan_deaths%\n &7Комиссия\: &f%clan_fee_enabled%&7, &f%clan_fee_value% $\n &7Союзники\: &f%clan_allies%\n &7Враги\: &f%clan_rivals%\n &7Основан\: &f%clan_founded%\n &7Неактивно\: &f%clan_inactive_days%&7/&f%clan_max_inactive_days% дня\n
player.lookup.clanname=&e[&8%clan_color_tag%&e] &b%clan_name%
# suppress inspection "TrailingSpacesInProperty"
player.lookup.killtype=&7Тип убийства\: %player_kill_type%\n
@@ -753,4 +762,4 @@ cannot.attack.clan.member=&cВы не можете атаковать участ
cannot.attack.ally=&cВы не можете атаковать союзников\!
cannot.change.member.fee.now=&cИзменить комиссию участника клана невозможно, так как приближается время её сбора
cannot.change.member.fee.hours=&cПовторите попытку через {0} часов...
cannot.change.member.fee.minutes=&cПовторите попытку через {0} минут(ы)...
cannot.change.member.fee.minutes=&cПовторите попытку через {0} минут(ы)...
@@ -36,4 +36,5 @@ reload.command=omladda
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
+1 -1
View File
@@ -140,7 +140,7 @@ inviting.you.to.join={0} seni klana katılmaya davet ediyor {1}
asking.for.the.deletion={0} Klanın silinmesini istiyor
asking.for.the.promotion={0} Promosyonunu istiyor {1}
asking.for.the.demotion={0} düşmanı istiyor {1}
accept.or.deny={0} veya {1}
# suppress inspection "TrailingSpacesInProperty"
not.sufficient.money=Hesabınızda yeterli para yok
account.has.been.debited={0} Hesabınız borçlandırıldı
mysql.connection.successful=MySQL bağlantısı başarılı
@@ -43,4 +43,5 @@ help.command=допомогу
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
+1 -1
View File
@@ -115,7 +115,7 @@ inviting.you.to.join={0} 邀请您加入 {1}
asking.for.the.deletion={0} 正在请求删除帮派
asking.for.the.promotion={0} 正在请求 {1} 的提升
asking.for.the.demotion={0} 正在请求 {1} 的降级
accept.or.deny={0} 或 {1}
# suppress inspection "TrailingSpacesInProperty"
not.sufficient.money=您的账户没有足够的资金
account.has.been.debited=你的账户已经被扣除了 {0}
mysql.connection.successful=MySQL 连接成功
@@ -62,4 +62,5 @@ command.description.accept=接受請求
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
# suppress inspection "TrailingSpacesInProperty"
+10 -13
View File
@@ -1,15 +1,13 @@
name: SimpleClans
main: net.sacredlabyrinth.phaed.simpleclans.SimpleClans
version: '${project.version}'
softdepend: [VanishNoPacket, Permissions, PermissionsBukkit, Vault, PermissionsEx, mChat, mChatSuite, PlaceholderAPI]
softdepend: [VanishNoPacket, Permissions, PermissionsBukkit, Vault, PermissionsEx, mChat, mChatSuite, PlaceholderAPI, LuckPerms]
api-version: '1.13'
authors:
- Phaed
- RoinujNosde
website: https://www.spigotmc.org/resources/simpleclans.71242/
permissions:
simpleclans.admin.permissions:
description: Can grant clans permissions
simpleclans.admin.reload:
description: Can reload configuration
simpleclans.admin.purge:
@@ -30,10 +28,6 @@ permissions:
description: Can disband any clan
simpleclans.mod.globalff:
description: Can turn off global friendly fire protection
simpleclans.mod.nohide:
description: Messages from these players cannot be hidden via chat commands
simpleclans.mod.home:
description: Can set other clan's home
simpleclans.mod.hometp:
description: Can teleport to all clans homes
simpleclans.mod.bypass:
@@ -109,14 +103,10 @@ permissions:
description: Can modify his clan's tag
simpleclans.leader.description:
description: Can modify his clan's description
simpleclans.leader.cape:
description: Can set his clan's cape url
simpleclans.leader.bb-clear:
description: Can clear his clan's bb
simpleclans.leader.setbanner:
description: Can set his clan's banner
simpleclans.member.cape-toggle:
description: Can toggle his cape on/off
simpleclans.member.kills:
description: Can view his and other's kills
simpleclans.member.tag-toggle:
@@ -129,6 +119,8 @@ permissions:
description: Can keep items when teleporting home
simpleclans.mod.place:
description: Can manually place players in clans
simpleclans.mod.modtag:
description: Can change a clan's tag
simpleclans.mod.staffgui:
description: Can open the staff gui
simpleclans.leader.fee:
@@ -151,8 +143,6 @@ permissions:
description: Can set trust levels for members
simpleclans.leader.war:
description: Can start wars
simpleclans.leader.setrank:
description: Can set ranks
simpleclans.leader.coloredrank:
description: Can set colored ranks
default: true
@@ -178,6 +168,10 @@ permissions:
description: Can remove permissions from a rank
simpleclans.leader.rank.setdisplayname:
description: Can set the rank displayname
simpleclans.leader.rank.setdefault:
description: Can set the default rank
simpleclans.leader.rank.removedefault:
description: Can remove the default rank
simpleclans.member.bank:
description: Can use banks
simpleclans.admin.*:
@@ -204,6 +198,7 @@ permissions:
simpleclans.mod.nopvpinwar: true
simpleclans.mod.place: true
simpleclans.mod.staffgui: true
simpleclans.mod.modtag: true
simpleclans.anyone.*:
description: Permissions for anyone
default: true
@@ -269,6 +264,8 @@ permissions:
simpleclans.leader.coloredrank: true
simpleclans.leader.bb-clear: true
simpleclans.leader.rank.setdisplayname: true
simpleclans.leader.rank.setdefault: true
simpleclans.leader.rank.removedefault: true
simpleclans.leader.rank.list: true
simpleclans.leader.rank.create: true
simpleclans.leader.rank.assign: true
@@ -0,0 +1,21 @@
package net.sacredlabyrinth.phaed.simpleclans.utils;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class UpdateCheckerTest {
@Test
void compareVersions() {
assertEquals(UpdateChecker.compareVersions("0.0", "0"), 0);
assertTrue(UpdateChecker.compareVersions("0.1", "0") > 0);
assertTrue(UpdateChecker.compareVersions("1", "1.1.1") < 0);
assertTrue(UpdateChecker.compareVersions("1.1", "1") > 0);
assertTrue(UpdateChecker.compareVersions("1", "0") > 0);
assertEquals(UpdateChecker.compareVersions("1.0.0", "1"), 0);
assertEquals(UpdateChecker.compareVersions("1.0", "1"), 0);
assertEquals(UpdateChecker.compareVersions("1.0.0", "1.0"), 0);
assertEquals(UpdateChecker.compareVersions("1.0.0", "1.0.0"), 0);
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

+11 -10
View File
@@ -1,23 +1,24 @@
---
description: Добро пожаловать на SimpleClans Wiki!
description: Welcome to the SimpleClans Wiki!
---
# 😃 Вступление
# Introduction
Здесь вы найдете полную документацию о плагине, включая установку, настройку, разрешения и использование SimpleClans.
Here you will find a complete set of documentation including installation, configuration, permissions and usage for SimpleClans.
## Поддержка
## Support
`1) Документация`
`1) The Wiki`
Всегда тщательно проверяйте эту документацию! Даже если кажется, что ответа нет, он может быть здесь!
You should always check this wiki carefully for the answer to your question! Even if it seems hidden, it may be here!
`2) Дискорд`
`2) The Discord`
Если вы не нашли ответа на свой вопрос, то можете найти его в [нашем дискорд канале](https://discord.gg/CkNwgdE), задав свой вопрос.
If the wiki does not have your answer, feel free to join [the discord](https://discord.gg/CkNwgdE) server to ask for help.
## Ошибки и предложения по улучшению
## Bugs and Suggestions
`Issue Tracker`
Если вы уверены в том, что нашли ошибку в плагине или хотите предложить свои идеи, воспользуйтесь [Issue Tracker](https://github.com/RoinujNosde/SimpleClans/issues)! Ошибки будут рассмотрены и устранены при первой же возможности.
If you believe you have found a bug in the plugin, feel free to make an issue on the [issue tracker!](https://github.com/RoinujNosde/SimpleClans/issues) Bugs will be looked into and addressed at the earliest opportunity.
+20 -25
View File
@@ -1,34 +1,29 @@
# Table of contents
* [😃 Вступление](README.md)
* [Дискорд | Поддержка](https://discord.gg/CkNwgdE)
* [Ошибки и предложения](https://github.com/RoinujNosde/SimpleClans/issues)
* [Javadoc](https://ci.roinujnosde.me/job/SimpleClans/Javadoc/)
* [Introduction](README.md)
* [Discord Support](https://discord.gg/CkNwgdE)
* [Bugs and Suggestions](https://github.com/RoinujNosde/SimpleClans/issues)
## Настройка <a href="#how-to-setup" id="how-to-setup"></a>
## How to Setup
* [📘 Конфигурация](how-to-setup/configuration.md)
* [🍕 Перевод](how-to-setup/translation.md)
* [💰 Комиссия в клане](how-to-setup/komissiya-v-klane.md)
* [👇 Клан под ником игрока](how-to-setup/clan-below-players-name.md)
* [☝️ Клан в табе](how-to-setup/clan-on-tablist.md)
* [Configuration](how-to-setup/configuration.md)
* [Translation](how-to-setup/translation.md)
* [Member Fee](how-to-setup/member-fee.md)
* [Clan Upkeep](how-to-setup/clan-upkeep.md)
* [Clan Below Player's Name](how-to-setup/clan-below-players-name.md)
* [Clan on Tablist](how-to-setup/clan-on-tablist.md)
## Команды и разрешения <a href="#commands-and-permissions" id="commands-and-permissions"></a>
## Commands and Permissions
* [📌 Команды](commands-and-permissions/commands.md)
* [🚦 Разрешения](commands-and-permissions/permissions.md)
* [🪖 Союзники и соперники](commands-and-permissions/aliances-and-rivalries.md)
* [🏅 Ранги с разрешениями](commands-and-permissions/ranks-with-permissions.md)
* [👍 Подтвержденные кланы](commands-and-permissions/podtverzhdennye-klany.md)
* [⌛ Постоянные кланы](commands-and-permissions/postoyannye-klany.md)
* [Commands](commands-and-permissions/commands.md)
* [Permissions](commands-and-permissions/permissions.md)
* [Clan Alliances and Rivalries](commands-and-permissions/aliances-and-rivalries.md)
* [Ranks with Permissions](commands-and-permissions/ranks-with-permissions.md)
## Интеграции
## Other
* [🏝️ GriefPrevention, WorldGuard и другие](integracii/land-claims.md)
* [👾 DiscordSRV](integracii/discordsrv.md)
* [Known issues](other/known-issues.md)
* [SimpleClans API Example](other/simpleclans-api.md)
* [PlaceholderAPI Support](other/placeholderapi-support.md)
* [Land Claims Plugins](other/land-claims.md)
## Другое <a href="#other" id="other"></a>
* [🪓 Известные проблемы](other/known-issues.md)
* [♟️ SimpleClans API](other/simpleclans-api.md)
* [🪜 Поддержка PlaceholderAPI](other/placeholderapi-support.md)
@@ -1,28 +1,33 @@
# 🪖 Союзники и соперники
---
description: null
---
Союз – это отличная возможность скрепить ваши дружественные намерения. Он позволяет вам общаться в [союзном чате](https://wiki.roinujnosde.me/simpleclans/how-to-setup/configuration#ally-chat), а также защищает от огня по своим.
# Clan Alliances and Rivalries
Соперничество же обозначает линию между вами. За убитого соперника, ваш клан может повысить свой KDR (смотрите [настройки](https://wiki.roinujnosde.me/simpleclans/how-to-setup/configuration#kill-weights)). В крайнем случае, всегда можно начать [войну](https://wiki.roinujnosde.me/simpleclans/how-to-setup/configuration#war-and-protection) и наконец выяснить ваши отношения!\
\
:warning: Для формирования союза или прекращения вражды **требуется подтверждение** от запрашиваемого клана.&#x20;
Any clan leader can send an request to start an alliance with any other clan with `/clan ally add`. If the request is accepted by a leader of the second clan, the alliance is formed. The alliance can be broken by any leader of either clan at any time with `/clan ally remove`, no one needs to accept the removal of an alliance.
## Команды
Clan rivalries can be started by any clan at any time, no request is needed, rivalries are automatically formed once a clan leader decides he wants one by using `/clan rival add`. If someone has pissed you off and you want them as rivals, their permission is not needed. To break a clan rivalry on the other hand, you need the acceptance of the other clan, you must use `/clan rival remove` to send the other clan a request, once one of their leaders accept the rivalry is broken.
| Команда | Описание |
| -------------------------- | -------------------------------------- |
| `/clan ally add [tag]` | Отправить запрос на формирование союза |
| `/clan ally remove [tag]` | Расформировать союз |
| `/clan rival add [tag]` | Добавить противника |
| `/clan rival remove [tag]` | Удалить противника |
| `/clan alliances` | Список всех кланов и их союзников |
| `/clan rivalries` | Список всех кланов и их противников |
You can view a list of all clans and their allies with the `/clan alliances` command, or their rivals with the `/clan rivalries` command.
## Разрешения
## Commands
| Commands | Description |
| :--- | :--- |
| `/clan ally add [tag]` | Send an request to start an alliance \(acceptance is required\) |
| `/clan ally remove [tag]` | Remove alliance \(no acceptance is required\) |
| `/clan rival add [tag]` | Starting a rivalry \(no acceptance is required\) |
| `/clan rival remove [tag]` | Remove a rivalry \(acceptance is required\) |
| `/clan alliances` | List all clans and their allies |
| `/clan rivalries` | List all clans and their rivals |
## Permissions
| Permission | Description |
| :--- | :--- |
| `simpleclans.member.ally` | Can use ally chat |
| `simpleclans.leader.ally` | Can ally his clan with other simpleclans |
| `simpleclans.leader.rival` | Can start a rivalry with another clan |
| `simpleclans.anyone.alliances` | Can view alliances by clan |
| `simpleclans.anyone.rivalries` | Can view rivalries by clan |
| Права | Описание |
| ------------------------------ | -------------------------------------------------- |
| `simpleclans.member.ally` | Может использовать союзный чат |
| `simpleclans.leader.ally` | Может отправить запрос на союз с другими кланами |
| `simpleclans.leader.rival` | Может отправить запрос на вражду с другими кланами |
| `simpleclans.anyone.alliances` | Может видеть союзников кланов |
| `simpleclans.anyone.rivalries` | Может видеть противников кланов |
+101 -111
View File
@@ -1,130 +1,120 @@
# 📌 Команды
---
description: null
---
> Обязательный аргумент помечен как`(аргумент)`&#x20;
# Commands
> Required arguments are marked with `(argument)`
>
> Необязательный аргумент помечен как `[аргумент]`
> Optional arguments are marked with `[argument]`
## Команды всех игроков
## Anyone Commands
| Команда | Описание | Только подтверждённый клан |
| ----------------------------------------------------------- | -------------------------------------------------------- | -------------------------- |
| `/clan` | Открыть GUI или показывать справку | Нет |
| `/clan help` | Показать команды клана | Нет |
| `/clan create [тег] [название]` | Создать новый клан | Нет |
| `/accept` | Принять запрос | Нет |
| `/deny` | Отклонить запрос | Нет |
| `/more` | Показать больше информации | Нет |
| `/clan leaderboard` | Показать таблицу лидеров | Нет |
| `/clan list [name\|size\|kdr\|founded\|active] [asc\|desc]` | Список всех кланов | Нет |
| `/clan rivalries` | Показать всех соперников клана | Нет |
| `/clan alliances` | Показать всех союзников клана | Нет |
| `/clan lookup [игрок]` | Посмотреть статистику вашу или другого игрока | Нет |
| `/clan profile [тег]` | Показать профиль другого клана | Да\* |
| `/clan roster [тег]` | Показать список участников клана | Да\* |
| `/clan ff (allow\|auto)` | Переключает личный "Огонь по своим" | Нет |
| `/clan resetkdr` | Сбрасывает ваш KDR | Нет |
| `/clan toggle invite` | Переключает возможность быть приглашённым в другие кланы | Нет |
| Command | Description | Verified only |
| :--- | :--- | :--- |
| `/clan` | Opens the GUI or shows the help | No |
| `/clan help` | Shows the plugin's commands | No |
| `/clan create [tag] [name]` | Creates a new clan | No |
| `/accept` | Accepts a request | No |
| `/deny` | Denies a request | No |
| `/more` | Shows more information | No |
| `/clan leaderboard` | Shows the leaderboard | No |
| `/clan list [name|size|kdr|founded|active] [asc|desc]` | Lists all clans | No |
| `/clan rivalries` | Shows all clan rivalries | No |
| `/clan alliances` | Shows all clan alliances | No |
| `/clan lookup [player]` | Looks up your or another player's info | No |
| `/clan profile [tag]` | Shows another clan's profile | Yes\* |
| `/clan roster [tag]` | Shows another clan's roster | Yes\* |
| `/clan ff (allow|auto)` | Toggles personal friendly fire | No |
| `/clan resetkdr` | Resets your KDR | No |
\\\* Указанный клан
\\* The target clan
## Команды участника
## Members Commands
### Основные команды
### General Commands
| Команда | Описание | Только подтверждённый клан |
| --------------------- | ------------------------------------------------------- | -------------------------- |
| `/clan kills [игрок]` | Показывать количество убийств вашего или другого игрока | Да |
| `/clan toggle` | Переключить личную статистику | Да |
| `/clan mostkilled` | Показать общее количество убитых на сервере | Да |
| `/clan resign` | Выйти из клана | Нет |
| `/clan fee check` | Проверить включена ли комиссия и её значение | Да |
| `/clan vitals` | Показать боеспособность вашего клана | Да |
| `/clan stats` | Показать статистику вашего клана | Да |
| `/clan profile` | Показать профиль вашего клана | Да |
| `/clan roster` | Показать список участников вашего клана | Да |
| `/clan coords` | Показать координаты вашего клана | Да |
| `/clan bb` | Показать доску объявлений вашего клана | Да |
| `/clan bb (сообщ)` | Написать сообщение на доску объявления вашего клана | Да |
| Command | Description | Verified only |
| :--- | :--- | :--- |
| `/clan kills [player]` | Shows your or another player's kill counts | Yes |
| `/clan toggle` | Toggles personal settings | Yes |
| `/clan mostkilled` | Shows server-wide most killed counts | Yes |
| `/clan resign` | Resigns from the clan | No |
| `/clan fee check` | Checks if the fee is enabled and how much it costs | Yes |
| `/clan vitals` | Shows your clan's vitals | Yes |
| `/clan stats` | Shows your clan's stats | Yes |
| `/clan profile` | Shows your clan's profile | Yes |
| `/clan roster` | Shows your clan's roster | Yes |
| `/clan coords` | Shows your clan's coords | Yes |
### Команды чата
### Chat Commands
| Команда | Описание | Только подтверждённый клан |
| --------------------------------------------- | -------------------------------------------------- | -------------------------- |
| `/. (сообщение)` | Отправить сообщение в чат клана | Нет |
| `/. [присоединиться\|покинуть\|заглушить]` | Присоединиться/покинуть/Заглушить чат вашего клана | Нет |
| `/ally (сообщение)` | Отправить сообщение в союзный чат | Нет |
| `/ally [присоединиться\|покинуть\|заглушить]` | Присоединиться/Выйти/Заглушить союзный чат | Нет |
| Command | Description | Verified only |
| :--- | :--- | :--- |
| `/. (message)` | Sends a message to your clan's chat | No |
| `/. [join|leave|mute]` | Joins/leaves/mutes your clan's chat | No |
| `/ally (message)` | Sends a message to the ally chat | No |
| `/ally [join|leave|mute]` | Joins/leaves/mutes the ally chat | No |
### Команды банка
## Leaders Commands
| Команда | Описание | Только подтверждённый клан |
| ------------------------- | ------------------------------------------------------------- | -------------------------- |
| `/clan bank status` | Проверить баланс банка вашего клана | Да |
| `/clan bank withdraw all` | Вывести всё из банка вашего клана | Да |
| `/clan bank deposit all` | Внести все деньги, которые у вас имеются, в банк вашего клана | Да |
| `/clan withdraw (кол-во)` | Вывести указанное количество денег из банка вашего клана | Да |
| `/clan deposit (кол-во)` | Внести указанное количество денег в банк вашего клана | Да |
| Command | Description | Verified only |
| :--- | :--- | :--- |
| `/clan description (description)` | Modifies the clan's description | Yes |
| `/clan invite (player)` | Invites a player | No |
| `/clan kick (player)` | Kicks a player from the clan | No |
| `/clan trust (player)` | Sets a member as trusted | No |
| `/clan untrust (player)` | Sets a member as untrusted | No |
| `/clan promote (member)` | Promotes a member to leader | No |
| `/clan demote (leader)` | Demotes a leader to member | No |
| `/clan setbanner` | Sets the clan's banner | Yes |
| `/clan modtag (tag)` | Modifies your clan's tag \(only colors and case\) | |
| `/clan clanff (allow|block)` | Toggles clan's friendly fire | No |
| `/clan war (start|end) (tag)` | Starts or ends a war | Yes |
| `/clan rival (add|remove) (tag)` | Adds or removes a rival | Yes |
| `/clan ally (add|remove) (tag)` | Adds or removes an ally | Yes |
| `/clan verify` | Verifies your clan | No |
| `/clan disband` | Disbands your clan | No |
| `/clan fee set (amount)` | Sets the clan's member fee | No |
| `/clan regroup me` | Regroups your clan members to your location | Yes |
| `/clan regroup home` | Regroups your clan members to your clan's home | Yes |
| `/clan home` | Teleports to your clan's home | Yes |
| `/clan home clear` | Clears your clan's home | Yes |
| `/clan home set` | Sets your clan's home | Yes |
| `/clan rank create` | Creates a rank | Yes |
| `/clan rank setdisplayname (rank) (displayname)` | Sets the display name of the rank \(it can contain colors and multiple words\) | Yes |
| `/clan rank assign (player) (rank)` | Assigns a user to a rank | Yes |
| `/clan rank unassign (player)` | Unassigns a user from a rank | Yes |
| `/clan rank delete (rank)` | Deletes a rank | Yes |
| `/clan rank list` | Lists the clan's ranks | Yes |
| `/clan rank permissions` | Lists the available permissions for ranks | Yes |
| `/clan rank permissions (rank)` | Lists the rank's permissions | Yes |
| `/clan rank permissions add (rank) (permission)` | Adds a permission to the rank | Yes |
| `/clan rank permissions remove (rank) (permission)` | Removes a permission from the rank | Yes |
## Команды лидера
## Mod Commands
| Команда | Описание | Только подтверждённый клан |
| ----------------------------------------------- | -------------------------------------------------------------------------------- | -------------------------- |
| `/clan description (описание)` | Изменить описание клана | Да |
| `/clan invite (игрок)` | Пригласить игрока в клан | Нет |
| `/clan kick (игрок)` | Выкинуть игрока из клана | Нет |
| `/clan trust (игрок)` | Начать доверять участнику клана | Нет |
| `/clan untrust (игрок)` | Перестать доверять участнику клана | Нет |
| `/clan promote (участник)` | Повысить участника до лидера | Нет |
| `/clan demote (лидер)` | Понизить лидера до участника | Нет |
| `/clan setbanner` | Установить баннер клана | Да |
| `/clan modtag (тег)` | Изменить тег клана (только цвет и регистр) | |
| `/clan clanff (allow\|block)` | Переключить параметр "огонь по своим" в клане | Нет |
| `/clan war (start\|end) (тег)` | Начать или окончить войну | Да |
| `/clan rival (add\|remove) (tag)` | Добавить или удалить соперника | Да |
| `/clan ally (add\|remove) (tag)` | Добавить или удалить союзника | Да |
| `/clan verify` | Подтвердить ваш клан | Нет |
| `/clan disband` | Расформировать ваш клан | Нет |
| `/clan fee set (количество)` | Установить комиссию для участников | Нет |
| `/clan regroup me` | Перегруппировать участников к вам | Да |
| `/clan regroup home` | Перегруппировать участников на вашу базу | Да |
| `/clan home` | Телепортироваться на базу вашего клана | Да |
| `/clan home clear` | Очистить точку базы вашего клана | Да |
| `/clan home set` | Установить точку базы вашего клана | Да |
| `/clan rank create` | Создать новый ранг | Да |
| `/clan rank setdisplayname (ранг) (отобр. имя)` | Установить отображаемое имя ранга (Может содержать цвета и иметь несколько слов) | Да |
| `/clan rank assign (игрок) (ранг)` | Назначить участнику ранг | Да |
| `/clan rank unassign (игрок)` | Убрать у участника ранг | Да |
| `/clan rank delete (ранг)` | Удалить ранг | Да |
| `/clan rank list` | Список всех рангов вашего клана | Да |
| `/clan rank permissions` | Список доступных прав рангов | Да |
| `/clan rank permissions (ранг)` | Список прав ранга | Да |
| `/clan rank permissions add (ранг) (право)` | Добавить право к рангу | Да |
| `/clan rank permissions remove (ранг) (право)` | Удалить право у ранга | Да |
| `/clan bb clear` | Очистить все сообщения с доски объявления вашего клана | Да |
| Command | Description |
| :--- | :--- |
| `/clan place (player) (new clan)` | Places a player in a clan |
| `/clan home set (tag)` | Sets a clan's home |
| `/clan home tp (tag)` | Teleports to a clan's home |
| `/clan ban (player)` | Bans a player from clan commands |
| `/clan unban (player)` | Unbans a player from clan commands |
| `/clan globalff (allow|auto)` | Toggles the global friendly-fire status |
| `/clan verify (tag)` | Verifies a clan |
| `/clan disband (tag)` | Disbands a clan |
## Команды модераторов
## Admin Commands
| Команда | Описание |
| ---------------------------------- | ------------------------------------------------------ |
| `/clan place (игрок) (новый клан)` | Переместить игрока в клан |
| `/clan home set (тег)` | Установить точку базы клана |
| `/clan home tp (тег)` | Телепортироваться на точку базы клана |
| `/clan ban (игрок)` | Заблокировать игрока от использования клановых команд |
| `/clan unban (игрок)` | Разблокировать игрока от использования клановых команд |
| `/clan globalff (allow\|auto)` | Переключить общий статус "Огонь по своим" |
| `/clan verify (тег)` | Подтвердить клан |
| `/clan disband (тег)` | Расформировать клан |
| `/clan mod tag (тег) (клан)` | Изменить цвета и регистр клана |
| Command | Description |
| :--- | :--- |
| `/clan reload` | Reloads the plugin and its configuration \(some features may need a server restart\) |
| `/clan purge` | Purges a player's data |
| `/clan resetkdr everyone` | Resets everyone's KDR |
| `/clan resetkdr (player)` | Resets a player's KDR |
| `/clan admin demote (player)` | Demotes a leader from any clan |
| `/clan admin promote (player)` | Promotes a member from any clan |
## Команды администраторов
| Команда | Описание |
| ------------------------------ | ---------------------------------------------------------------------------------------------- |
| `/clan reload` | Перезагрузить плагин и его конфигурацию (Некоторым вещам требуется перезагрузка всего сервера) |
| `/clan purge` | Очистить данные игрока |
| `/clan resetkdr everyone` | Сбросить KDR всех игроков |
| `/clan resetkdr (игрок)` | Сбросить KDR игрока |
| `/clan admin demote (игрок)` | Понизить лидера любого клана |
| `/clan admin promote (игрок)` | Повысить лидера любого клана |
| `/clan admin permanent (клан)` | Выдать перманентный статус клану |
+120 -143
View File
@@ -1,162 +1,139 @@
# 🚦 Разрешения
---
description: null
---
## Супер-права
# Permissions
Эти права – быстрый способ настроить SimpleClans. Некоторые из них добавлены автоматически (см. приписку авто). Если вы хотите настроить каждое разрешение по отдельности (см. [индивидуальные права](permissions.md#individualnye-prava)), то сперва отрицайте эти права.
## SuperPerms Nodes \(Some auto added\)
| Право | Описание |
| ------------------------------------- | --------------------------- |
| `simpleclans.anyone.*` (Авто) | Разрешения любого игрока |
| `simpleclans.member.*` (Авто) | Разрешения участников клана |
| `simpleclans.leader.*` (Авто) | Разрешения лидеров клана |
| `simpleclans.mod.*` (Авто к OP'кам) | Разрешения модераторов |
| `simpleclans.admin.*` (Авто к OP'кам) | Разрешения администраторов |
These super permission nodes are a quick way to setup SimpleClans, some are automatically given \(See Auto Added\). If you wish to setup individual permissions to groups you will need to deny these auto added super permission nodes and setup permissions one by one after.
## Индивидуальные права
| Permission | Description |
| :--- | :--- |
| `simpleclans.anyone.*` \(Auto added\) | Permissions for anyone |
| `simpleclans.member.*` \(Auto added\) | Permissions for those who can be clan members |
| `simpleclans.leader.*` \(Auto added\) | Permissions for those who can be clan leaders |
| `simpleclans.mod.*` \(Auto added to OPS\) | Permissions for moderators |
| `simpleclans.admin.*` \(Auto added to OPS\) | Permissions for admins |
Вам не нужно добавлять их, если права добавлены [автоматически ](permissions.md#superperms-prava-nekotorye-dobavlyayutsya-avtomaticheski)(супер-права).\
\
Индивидуальные права существуют только на тот случай, если вы хотите \
настроить разрешения _по отдельности._&#x20;
## Individual Nodes
**Пример №1**: мы хотим, чтобы никто не мог пользоваться командой `/clan list`\
Для этого мы поставим `simpleclans.anyone.list` на`false` - всё, теперь никто не сможет пользоваться этой командой.
\(You don't need to add these as they are all included if you've already added the node groups \(above\). They are only included here as reference in case you want to toggle a couple of them off individually. Then you can just drop those in, set to false, along with the node groups.\)
**Пример №2**: мы хотим настроить разрешения для лидеров по отдельности.\
Для этого сначала мы поставим `simpleclans.leader.*` на `false`, а уже потом будем настраивать каждое.
### Anyone Nodes
### Разрешения любого игрока
| Permission | Description |
| :--- | :--- |
| `simpleclans.anyone.alliances` | Can view alliances by clan |
| `simpleclans.anyone.leaderboard` | Can view the leaderboard |
| `simpleclans.anyone.list` | Can list simpleclans |
| `simpleclans.anyone.lookup` | Can lookup a player's info |
| `simpleclans.anyone.profile` | Can view a clan's profile |
| `simpleclans.anyone.rivalries` | Can view rivalries by clan |
| `simpleclans.anyone.roster` | Can view a clan's member list |
| Право | Описание |
| ---------------------------------- | -------------------------------------------------------------- |
| `simpleclans.anyone.alliances` | Может просматривать список союзников всех кланов |
| `simpleclans.anyone.leaderboard` | Может посмотреть таблицу лидеров |
| `simpleclans.anyone.list` | Может посмотреть список всех кланов |
| `simpleclans.anyone.lookup` | Может посмотреть информацию об игроках |
| `simpleclans.anyone.profile` | Может посматривать профили кланов |
| `simpleclans.anyone.rivalries` | Может посмотреть список противников всех кланов |
| `simpleclans.anyone.roster` | Может посмотреть список участников кланов |
| `simpleclans.anyone.invite-toggle` | Может переключать возможность быть приглашённым в другие кланы |
### Member Nodes
### Разрешения участника
| Permission | Description |
| :--- | :--- |
| `simpleclans.member.abstain` | Can abstain |
| `simpleclans.member.accept` | Can accept |
| `simpleclans.member.ally` | Can use ally chat |
| `simpleclans.member.chat` | Can use clan chat |
| `simpleclans.member.bank` | Can use the clan bank |
| `simpleclans.member.bb-add` | Can add to his clan's bulletin board |
| `simpleclans.member.bb-toggle` | Can toggle the bulletin board on/off |
| `simpleclans.member.bb` | Can view his clan's bulletin board |
| `simpleclans.member.can-join` | Can join clans |
| `simpleclans.member.coords` | Can view his clan's coords |
| `simpleclans.member.deny` | Can deny |
| `simpleclans.member.ff` | Can toggle his own friendly fire |
| `simpleclans.member.home` | Can tp to home base |
| `simpleclans.member.kills` | Can view his and other's kills |
| `simpleclans.member.lookup` | Can view his own player info |
| `simpleclans.member.profile` | Can view his own clan's profile |
| `simpleclans.member.resign` | Can resign from his clan |
| `simpleclans.member.roster` | Can view his own clan's member list |
| `simpleclans.member.stats` | Can view his clan stats |
| `simpleclans.member.vitals` | Can view his clan's vitals |
| `simpleclans.member.toggle.bb` | Can toggle bb on/off |
| `simpleclans.member.tag-toggle` | Can hide/show their clan tag |
| `simpleclans.member.fee-check` | Allows the member to check how much is the fee and if it's enabled |
| `simpleclans.member.bypass-fee` | Can bypass the member fee |
| Право | Описание |
| ----------------------------------------------- | ------------------------------------------------------------- |
| `simpleclans.member.abstain` | Может воздержаться от участия |
| `simpleclans.member.accept` | Может принять запрос |
| `simpleclans.member.ally` | Может использовать союзный чат |
| `simpleclans.member.chat` | Может использовать чат клана |
| `simpleclans.member.bank` | Может использовать банк клана |
| `simpleclans.member.bb-add` | Может добавлять сообщения на доску объявлений |
| `simpleclans.member.bb-toggle` | Может переключать отображение доски объявлений его клана |
| `simpleclans.member.bb` | Может видеть доску объявлений его клана |
| `simpleclans.member.can-join` | Может присоединяться к кланам |
| `simpleclans.member.coords` | Может посмотреть координаты его клана |
| `simpleclans.member.deny` | Может отклонить запрос |
| `simpleclans.member.ff` | Может переключать собственный "огонь по своим" |
| `simpleclans.member.home` | Может телепортироваться на точку базы клана |
| `simpleclans.member.kills` | Может посмотреть убийства свои и других |
| `simpleclans.member.lookup` | Может посмотреть информацию о себе |
| `simpleclans.member.profile` | Может посмотреть информацию о своём клане |
| `simpleclans.member.resign` | Может покинуть свой клан |
| `simpleclans.member.roster` | Может посмотреть список участников его клана |
| `simpleclans.member.stats` | Может посмотреть статистику его клана |
| `simpleclans.member.vitals` | Может посмотреть боеспособность его клана |
| `simpleclans.member.toggle.bb` | Может переключать видимость доски объявлений при входе в игру |
| `simpleclans.member.tag-toggle` | Может скрыть или показать клан тег |
| `simpleclans.member.fee-check` | Позволяет проверить включена ли комиссия и узнать её размер |
| `simpleclans.member.bypass-fee` | Может обойти комиссию участника |
| `simpleclans.member.land` | Может использовать команду land |
| `simpleclans.member.land.allow.container` | Может разрешить действие container |
| `simpleclans.member.land.allow.place` | Может разрешить действие place |
| `simpleclans.member.land.allow.break` | Может разрешить действие break |
| `simpleclans.member.land.allow.damage` | Может разрешить действие damage |
| `simpleclans.member.land.allow.interact` | Может разрешить действие interact |
| `simpleclans.member.land.allow.interact_entity` | Может разрешить действие interact\_entity |
| `simpleclans.member.land.block.container` | Может заблокировать действие container |
| `simpleclans.member.land.block.place` | Может заблокировать действие place |
| `simpleclans.member.land.block.damage` | Может заблокировать действие damage |
| `simpleclans.member.land.block.break` | Может заблокировать действие break |
| `simpleclans.member.land.block.interact` | Может заблокировать действие interact |
| `simpleclans.member.land.block.interact_entity` | Может заблокировать действие interact\_entity |
### Leader Nodes
### Разрешения лидеров
| Permission | Description |
| :--- | :--- |
| `simpleclans.leader.fee` | allows the user to toggle the fee and set its value |
| `simpleclans.leader.ally` | Can ally his clan with other clans |
| `simpleclans.leader.create` | Can create clans |
| `simpleclans.leader.verify` | Can verify their clan |
| `simpleclans.leader.demote` | Can demote clan leaders to normal players |
| `simpleclans.leader.disband` | Can disband his own clan |
| `simpleclans.leader.ff` | Can toggle his clan's friendly fire |
| `simpleclans.leader.home-set` | Can set home base |
| `simpleclans.leader.regroup.me` | Can teleport the entire clan to themself |
| `simpleclans.leader.regroup.home` | Can teleport the entire clan to homebase |
| `simpleclans.leader.invite` | Can invite players into his clan |
| `simpleclans.leader.kick` | Can kick players form his clan |
| `simpleclans.leader.modtag` | Can modify his clan's tag |
| `simpleclans.leader.description` | Can modify their clan's description |
| `simpleclans.leader.coloredtag` | Can use color codes in tags |
| `simpleclans.leader.coloredrank` | Can use color codes in rank display names |
| `simpleclans.leader.promotable` | Can be promoted to clan leader |
| `simpleclans.leader.promote` | Can promote players to clan leaders |
| `simpleclans.leader.rank.assign` | Can assign a rank to a user |
| `simpleclans.leader.rank.unassign` | Can unassign a player from a rank |
| `simpleclans.leader.rank.create` | Can create a new rank |
| `simpleclans.leader.rank.delete` | Can delete a new rank |
| `simpleclans.leader.rank.list` | Can list all the ranks |
| `simpleclans.leader.rank.setdisplayname` | Can set the display name of the rank |
| `simpleclans.leader.rank.permissions.add` | Can add permissions to a rank |
| `simpleclans.leader.rank.permissions.available` | Can list all available permissions |
| `simpleclans.leader.rank.permissions.list` | Can list the rank's permissions |
| `simpleclans.leader.rank.permissions.remove` | Can remove permissions from a rank |
| `simpleclans.leader.rival` | Can start a rivalry with another clan |
| `simpleclans.leader.settrust` | Can set trust levels for members |
| `simpleclans.leader.war` | Can start wars |
| `simpleclans.leader.setbanner` | Can set his clan's banner |
| `simpleclans.leader.withdraw-toggle:` | Can toggle clan bank withdraw |
| `simpleclans.leader.deposit-toggle:` | Can toggle clan bank deposit |
| `simpleclans.leader.bb-clear` | Clan clear their clan's bb |
| Право | Описание |
| ----------------------------------------------- | ----------------------------------------------------------------------- |
| `simpleclans.leader.fee` | Разрешает переключать комиссию клана и изменять её размер |
| `simpleclans.leader.ally` | Может иметь союз с другим кланом |
| `simpleclans.leader.create` | Может создавать кланы |
| `simpleclans.leader.verify` | Может подать заявку на подтверждение собственного клана |
| `simpleclans.leader.demote` | Может понизить лидера до участника |
| `simpleclans.leader.disband` | Может расформировать собственный клан |
| `simpleclans.leader.ff` | Может переключать "огонь по своим" у собственного клана |
| `simpleclans.leader.home-set` | Может установить точку базы клана |
| `simpleclans.leader.regroup.me` | Может перегруппировать (телепортировать ) весь клан к себе |
| `simpleclans.leader.regroup.home` | Может перегруппировать (телепортировать ) весь клан на точку базы клана |
| `simpleclans.leader.invite` | Может приглашать игроков в собственный клан |
| `simpleclans.leader.kick` | Может выгнать (кикнуть) игроков с собственного клана |
| `simpleclans.leader.modtag` | Может изменять тег собственного клана |
| `simpleclans.leader.description` | Может изменять описание собственного клана |
| `simpleclans.leader.coloredtag` | Может использовать цветовые коды в тегах |
| `simpleclans.leader.coloredrank` | Может использовать цветовые коды в отобр. имени ранга |
| `simpleclans.leader.promotable` | Может быть повышен до лидера клана |
| `simpleclans.leader.promote` | Может повысить участника до лидера клана |
| `simpleclans.leader.rank.assign` | Может назначить участнику ранг |
| `simpleclans.leader.rank.unassign` | Может забрать ранг у участника |
| `simpleclans.leader.rank.create` | Может создать новый ранг |
| `simpleclans.leader.rank.delete` | Может удалить существующий ранг |
| `simpleclans.leader.rank.list` | Может посмотреть список рангов |
| `simpleclans.leader.rank.setdisplayname` | Может устанавливать отобр. имя ранга |
| `simpleclans.leader.rank.permissions.add` | Может добавить право к рангу |
| `simpleclans.leader.rank.permissions.available` | Может посмотреть список доступных прав рангов |
| `simpleclans.leader.rank.permissions.list` | Может посмотреть список прав рангов |
| `simpleclans.leader.rank.permissions.remove` | Может удалить права у ранга |
| `simpleclans.leader.rival` | Может начать вражду с другими кланами |
| `simpleclans.leader.settrust` | Может устанавливать уровень доверия участникам |
| `simpleclans.leader.war` | Может начать войну |
| `simpleclans.leader.setbanner` | Может устанавливать баннер собственного клана |
| `simpleclans.leader.withdraw-toggle` | Может переключать вывод клана |
| `simpleclans.leader.deposit-toggle` | Может переключать взнос клана |
| `simpleclans.leader.bb-clear` | Может очистить доску объявлений собственного клана |
### Mod Nodes
### Разрешения модераторов
| Permission | Description |
| :--- | :--- |
| `simpleclans.mod.ban` | Can ban players from the entire plugin |
| `simpleclans.mod.bypass` | Can bypass restrictions |
| `simpleclans.mod.disband` | Can disband any clan |
| `simpleclans.mod.globalff` | Can turn off global friendly fire protection |
| `simpleclans.mod.home` | Can set other clan's home |
| `simpleclans.mod.hometp` | Can teleport to all clans homes |
| `simpleclans.mod.staffgui` | Can open the staff GUI |
| `simpleclans.mod.place` | Can manually place players in clans |
| `simpleclans.mod.keep-items` | Can keep items when teleporting home |
| `simpleclans.mod.mostkilled` | Can view his and other's clans mostkilled |
| `simpleclans.mod.nopvpinwar` | Can bypass PvP in wars |
| `simpleclans.mod.unban` | Can unban players from the entire plugin |
| `simpleclans.mod.verify` | Can verify clans |
| Право | Описание |
| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `simpleclans.mod.ban` | Может заблокировать игрока от использования команд плагина |
| `simpleclans.mod.bypass` | Может обойти любые ограничения |
| `simpleclans.mod.disband` | Может расформировать любой клан |
| `simpleclans.mod.globalff` | Может выключить глобальный параметр "огонь по своим" |
| `simpleclans.mod.home` | Может ставить точку базы любому клану |
| `simpleclans.mod.hometp` | Может телепортироваться на точку базы любого клана |
| `simpleclans.mod.staffgui` | Может открыть меню администратора |
| `simpleclans.mod.place` | Может перемещать вручную игроков из одного клана в другой |
| `simpleclans.mod.keep-items` | При перемещении на точку дома **не** выбрасывает вещи из [drop-items](https://simpleclans.gitbook.io/simpleclans/how-to-setup/configuration#general-settings). |
| `simpleclans.mod.mostkilled` | Может посмотреть список наибольших убийств у любого клана |
| `simpleclans.mod.nopvpinwar` | Может обойти PvP разрешение в войнах |
| `simpleclans.mod.unban` | Может разблокировать игрока от использования команд плагина |
| `simpleclans.mod.verify` | Может подтвердить клан |
### Admin Nodes
### Разрешешения администраторов
| Permission | Description |
| :--- | :--- |
| `simpleclans.admin.resetkdr` | Can reset a player's or everyone's KDR |
| `simpleclans.admin.purge` | Can purge a player |
| `simpleclans.admin.demote` | Can demote a player back to member |
| `simpleclans.admin.promote` | Can promote players to clan leaders |
| `simpleclans.admin.all-seeing-eye` | Can see all clan chats |
| `simpleclans.admin.reload` | Can reload configuration |
| Право | Описание |
| ---------------------------------- | ----------------------------------------- |
| `simpleclans.admin.resetkdr` | Может очистить KDR любого игрока |
| `simpleclans.admin.purge` | Может очистить данные об игроке |
| `simpleclans.admin.demote` | Может понизить игрока до участника |
| `simpleclans.admin.promote` | Может повышать игроков до лидера |
| `simpleclans.admin.all-seeing-eye` | Может читать чаты всех кланов |
| `simpleclans.admin.reload` | Может перезагрузить конфигурацию |
| `simpleclans.admin.permanent` | Позволяет переключить перманентный статус |
| `simpleclans.admin.bank.status` | Позволяет проверить баланс клана |
| `simpleclans.admin.bank.take` | Позволяет забрать деньги из баланса клана |
| `simpleclans.admin.bank.give` | Позволяет выдать деньги в баланс клана |
| `simpleclans.admin.bank.set` | Позволяет установить баланс клана |
### Other Nodes
### Другие разрешения
| Permission | Node |
| :--- | :--- |
| `simpleclans.other.kdr-exempt` | The player's KDR is not affected on killing/dying \(check Known Issues\) |
| `simpleclans.vip.resetkdr` | Can reset their KDR |
| Право | Описание |
| ------------------------------ | ----------------------------------------------------------------------------- |
| `simpleclans.other.kdr-exempt` | KDR игрока не будет изменяться из-за смерти/убийства (см. известные проблемы) |
| `simpleclans.vip.resetkdr` | Может очистить собственный KDR |
@@ -1,21 +0,0 @@
# 👍 Подтвержденные кланы
## Что это?
<mark style="color:red;">Подтвержденный клан</mark> – это такой клан, который предоставляет больше возможностей для своих участников.
Когда кто-то создаёт клан, в большинстве случаев достаточно лишь _базовых_ команд: выход из клана, приглашение игроков в клан, кик игроков из клана и так далее. Такой тип кланов называется <mark style="color:red;">не подтвержденный</mark>.&#x20;
## Где я могу узнать все возможности?
Вы можете посмотреть все команды подтвержденного статуса на странице с [командами](commands.md).
## Только подтвержденный клан
Предположим, вы хотите сделать, чтобы у вас были только подтвержденные кланы.\
К счастью для вас, SimpleClans позволяет вам это сделать. Просто установите следующую настройку на `false` в конфигурации плагина.&#x20;
```yaml
settings:
new-clan-verification-required: false
```
@@ -1,64 +0,0 @@
# ⌛ Постоянные кланы
## Что это?
Обычно, когда вы создаете какой-либо клан, требуется, чтобы в нем был хотя бы 1 игрок. Но иногда нужно иметь <mark style="color:red;">пустой клан</mark>, верно? Именно этим и занимаются <mark style="color:red;">постоянные кланы</mark>.&#x20;
## Где это может быть полезно?
На самом деле, здесь можно привести достаточно много идей, например:
* Вы хотите продавать кланы на своем сервере, но по каким-то причинам не хотите назначать лидера в этот клан.
* Вы хотите переместить последнего игрока одного клана в другой клан.
* Клан для администраторов: легко вступить и выйти.
* Кланы для RPG сервера.
* И так далее...
## Конкретные примеры
#### Использование постоянных кланов с DeluxeMenus
![Меню, чтобы присоединиться в какой-либо клан](../.gitbook/assets/Permanent-Clans-DeluxeMenus.png)
Пример YAML:
```yaml
items:
'jedi_clan':
material: diamond_block
slot: 5
display_name: "&7Join to &aJedi"
left_click_commands:
- '[console] clan mod place %player_name% jedi'
- '[close]'
```
#### Использование постоянных кланов с Citizens
В качестве альтернативного варианта, вы можете присоединить игроков через NPC:
![](../.gitbook/assets/Permanent-Clans-Citizens.png)
Чтобы это сделать, нужно:
1. Создать NPC: `/npc create <`имя`>`
2. Добавить команду к NPC: `/npc command add clan -o mod place <p> jedi`
## Как использовать постоянные кланы?
Вы можете использовать `/clan admin permanent [clan]` команду для выдачи постоянного статуса клану.
![После вызова команды на каком-нибудь клане](../.gitbook/assets/Permanent-Clans-Command-Usage.png)
{% hint style="danger" %}
**Внимание**
Постоянные кланы не удаляются со временем и не могут быть расформированы игроком. Для удаления используйте: `/clan mod disband`
{% endhint %}
{% hint style="info" %}
**Заметка**
Эта команда (`/clan mod disband)` доступна только администраторам или если у вас имеется разрешение: `simpleclans.admin.permanent` .
{% endhint %}
@@ -1,79 +1,84 @@
# 🏅 Ранги с разрешениями
---
description: null
---
## Как это работает?
# Ranks with Permissions
Лидеры кланов могут создавать и назначать ранги своим соклановцам. Если `/clan trust` выдаёт [почти все](https://github.com/RoinujNosde/SimpleClans/blob/52ff77e6c105810466d45306a8c5982a858610f5/src/main/java/net/sacredlabyrinth/phaed/simpleclans/RankPermission.java#L13) разрешения, то ранг может содержать как все, так и некоторые из них.
## How does it work?
## Рекомендуемые ранги
Leaders have the ability to create ranks and give them permissions to perform several actions inside the clan. Unlike `/clan trust`, ranks with permissions allows leaders to have a finer control of who can do what. Ex.: A rank can handle invites \(`invite` permission\), another takes care of moderation \(`kick` permission\), etc
| Ранг | Описание | Права |
| ---------------------- | --------------------------------------- | :-----------------------------------------------------------------------------------------: |
| **Заместитель лидера** | Заботится о клане, пока нет лидера | `all` |
| **Казначей** | Управляет балансом клана | `bank.balance`, `bank.deposit`, `bank.withdraw` |
| **Посол** | Отвечает за отношения с другими кланами | `ally.chat`, `ally.add`, `ally.remove`, `rival.add`, `rival.remove`, `war.end`, `war.start` |
| **Новобранец** | Участник клана | `stats`, `kills`, `mostkilled`, `rank.list` |
## Suggested ranks
## Команды рангов
| Ranks | Description | Permission |
| :--- | :--- | :---: |
| **Coleader** | Helps take care of the clan | `all` |
| **Treasurer** | Manages the clan's bank account | `bank.balance`, `bank.deposit`, `bank.withdraw` |
| **Ambassador** | Manages the clan's relations with other clans | `ally.chat`, `ally.add`, `ally.remove`, `rival.add`, `rival.remove`, `war.end`, `war.start` |
| **Recruit** | A member in trial | `stats`, `kills`, `mostkilled`, `rank.list` |
| Команда | Описание |
| ----------------------------------------------- | ------------------------------------------------------------------------------- |
| `/clan rank create` | Создать ранг с заданным именем |
| `/clan rank setdisplayname [ранг] [отобр. имя]` | Установить отображаемое имя ранга (Может быть длиннее чем одно слово и цветным) |
| `/clan rank assign (игрок) (ранг)` | Назначить ранг участнику |
| `/clan rank unassign (игрок)` | Убрать ранг у участника |
| `/clan rank delete (ранг)` | Удалить ранг |
| `/clan rank list` | Список рангов клана |
| `/clan rank permissions` | Список доступных прав рангов |
| `/clan rank permissions (ранг)` | Список прав рангов |
| `/clan rank permissions add (ранг) (право)` | Добавить право к рангу |
| `/clan rank permissions remove (ранг) (право)` | Удалить право у ранга |
## Ranks Commands
## Доступные права для рангов
| Command | Description |
| :--- | :--- |
| `/clan rank create` | Creates a rank with this name |
| `/clan rank setdisplayname [rank] [displayname]` | Sets the display name of the rank \(it can be more than one word and colored\) |
| `/clan rank assign (player) (rank)` | Assigns a user to a rank |
| `/clan rank unassign (player)` | Unassigns a user from a rank |
| `/clan rank delete (rank)` | Deletes a rank |
| `/clan rank list` | Lists the clan's ranks |
| `/clan rank permissions` | Lists the available permissions for ranks |
| `/clan rank permissions (rank)` | Lists the rank's permissions |
| `/clan rank permissions add (rank) (permission)` | Adds a permission to the rank |
| `/clan rank permissions remove (rank) (permission)` | Removes a permission from the rank |
Игрок может посмотреть эти права в игре: `/clan rank permissions`
## Available permissions for ranks
| Право ранга | Описание |
| ------------------ | -------------------------------------------------------------------- |
| `ally.add` | Может добавлять союзников |
| `ally.remove` | Может удалять союзников |
| `ally.chat` | Может использовать клановый чат |
| `bank.balance` | Может посмотреть баланс клана |
| `bank.deposit` | Может вносить деньги в банк клана |
| `bank.withdraw` | Может выводить деньги из банка клана |
| `bb.add` | Может добавить сообщение на доске объявлений |
| `bb.clear` | Может очистить доску объявлений |
| `coords` | Может посмотреть координаты клана |
| `fee.enable` | Может включить комиссию участника |
| `fee.set` | Может изменить размер комиссии |
| `home.regroup` | Может перегруппировать (телепортировать) участников клана |
| `home.set` | Может поставить точку базы клана |
| `home.tp` | Может телепортироваться на точку базы клана |
| `invite` | Может приглашать кого-либо в клан |
| `kick` | Может кикнуть кого-либо из клана |
| `modtag` | Может изменять тег клана |
| `rank.displayname` | Может изменять отображаемое имя рангов |
| `rank.list` | Может посмотреть список рангов клана |
| `rival.add` | Может добавить противника |
| `rival.remove` | Может удалить противника |
| `war.end` | Может окончить войну |
| `war.start` | Может начать войну |
| `vitals` | Может посмотреть боеспособность клана |
| `stats` | Может посмотреть статистику клана |
| `kills` | Может посмотреть убийства его или других |
| `mostkilled` | Может посмотреть список участников по наибольшему количеству убийств |
| `description` | Может изменять описание клана |
A player can view those permissions in-game using `/clan rank permissions`
## Права для использования команды рангов
| Rank Permission | Description |
| :--- | :--- |
| `ally.add` | can add an ally |
| `ally.remove` | can remove an ally |
| `ally.chat` | can use ally chat |
| `bank.balance` | can view the bank balance |
| `bank.deposit` | can deposit money |
| `bank.withdraw` | can withdraw money |
| `bb.add` | can add a message to bb |
| `bb.clear` | can clear the bb |
| `coords` | can view the clan's coords |
| `fee.enable` | can enable the member fee |
| `fee.set` | can change the fee value |
| `home.regroup` | can regroup the clan |
| `home.set` | can set the clan home |
| `home.tp` | can tp to the clan home |
| `invite` | can invite someone to the clan |
| `kick` | can kick someone from the clan |
| `modtag` | can modify the clan tag |
| `rank.displayname` | can modify a rank's display name |
| `rank.list` | can list the ranks |
| `rival.add` | can add a rival |
| `rival.remove` | can remove a rival |
| `war.end` | can end a war |
| `war.start` | can start a war |
| `vitals` | can view the clan's vitals |
| `stats` | can view the clan's stats |
| `kills` | can view his or other's kills |
| `mostkilled` | can view the mostkilled |
| `description` | can change the clan's description |
## Permissions to use the rank commands
| Permission | Description |
| :--- | :--- |
| `simpleclans.leader.rank.assign` | Can assign a rank to a user |
| `simpleclans.leader.rank.unassign` | Can unassign a player from a rank |
| `simpleclans.leader.rank.create` | Can create a new rank |
| `simpleclans.leader.rank.delete` | Can delete a new rank |
| `simpleclans.leader.rank.list` | Can list all the ranks |
| `simpleclans.leader.rank.setdisplayname` | Can set the display name of the rank |
| `simpleclans.leader.rank.permissions.add` | Can add permissions to a rank |
| `simpleclans.leader.rank.permissions.available` | Can list all available permissions |
| `simpleclans.leader.rank.permissions.list` | Can list the rank's permissions |
| `simpleclans.leader.rank.permissions.remove` | Can remove permissions from a rank |
| Право | Описание |
| ----------------------------------------------- | -------------------------------------------- |
| `simpleclans.leader.rank.assign` | Может назначить ранг участнику |
| `simpleclans.leader.rank.unassign` | Может убрать ранг у участника |
| `simpleclans.leader.rank.create` | Может создать новый ранг |
| `simpleclans.leader.rank.delete` | Может удалить новый ранг |
| `simpleclans.leader.rank.list` | Может посмотреть список всех рангов |
| `simpleclans.leader.rank.setdisplayname` | Может устанавливать отображаемое имя ранга |
| `simpleclans.leader.rank.permissions.add` | Может добавлять права рангу |
| `simpleclans.leader.rank.permissions.available` | Может посмотреть список доступных прав ранга |
| `simpleclans.leader.rank.permissions.list` | Может посмотреть список прав ранга |
| `simpleclans.leader.rank.permissions.remove` | Может удалить право у ранга |
+14 -9
View File
@@ -1,13 +1,17 @@
# 👇 Клан под ником игрока
---
description: null
---
## Необходимые плагины
# Clan Below Player's Name
## Plugins needed
* [PlaceholderAPI](https://www.spigotmc.org/resources/placeholderapi.6245/)
* [TAB](https://www.spigotmc.org/resources/tab-1-5-x-1-15-x-free-version.57806/) (Вы можете использовать и другие плагины на таб, если он поддерживает PlaceholderAPI)
* [TAB](https://www.spigotmc.org/resources/tab-1-5-x-1-15-x-free-version.57806/) \(you can use a different tablist plugin, as long as it supports PlaceholderAPI\)
## Пошагово
## Step by step
1\. Откройте конфиг TAB и измените раздел groups, добавив %simpleclans\_clan\_color\_tag% к blowname:
1. Open TAB's config and edit the Groups section adding `%simpleclans_clan_color_tag%` to `belowname`:
{% code title="Example:" %}
```yaml
@@ -22,12 +26,13 @@ _OTHER_:
```
{% endcode %}
2\. Найдите параметр `belowname` или `classic-vanilla-belowname` и выключите его.
2. Find the option `belowname` or `classic-vanilla-belowname` and disable it.
3\. Найдите параметр `unlimited-nametag-prefix-suffix-mode` и включите его.
3. Find the option `unlimited-nametag-prefix-suffix-mode` and enable it.
4\. Перезапустите сервер (или перезагрузите конфиг `/tab reload`) и наслаждайтесь!
4. Restart \(or reload\) and enjoy!
## Скриншот
## Screenshot
![](../.gitbook/assets/clans-below-name.png)
+20 -11
View File
@@ -1,25 +1,34 @@
# ☝ Клан в табе
---
description: null
---
## Необходимые плагины
# Clan on Tablist
Вы вправе использовать и другие плагины, изменяющие таб, если они поддерживают PlaceholderAPI.
## Plugins needed
* [PlaceholderAPI](https://www.spigotmc.org/resources/placeholderapi.6245/)
* [TAB](https://www.spigotmc.org/resources/tab-1-7-x-1-16-5-free-version.57806/)
* [PlayerListPlus](https://www.spigotmc.org/resources/%E2%99%9B-playerlistplus-%E2%99%9B-1-8-1-14-3-tablist-editor.55878/) \(you can use a different tablist plugin, as long as it supports PlaceholderAPI\)
## Пошагово
## Step by step
1\. Откройте `groups.yml` файл в TAB и измените формат таба для всех, добавив`%simpleclans_clan_color_tag%`:
1. Open PlayerListPlus config and edit the formats adding `%simpleclans_clan_color_tag%`:
{% code title="Пример:" %}
{% code title="Example:" %}
```yaml
_DEFAULT_:
tabprefix: "%simpleclans_clan_color_tag%%vault-prefix% "
slot-items:
# This slot items will shows all players
PLAYERS:
format: "%simpleclans_clan_color_tag%&c.$displayname"
type: PLAYER_LIST
hidevanished: true
ping: true
skin: true
```
{% endcode %}
2\. Перезапустите сервер (или перезагрузите конфиг: `/tab reload`) и наслаждайтесь!
2. Restart \(or reload\) and enjoy!
## Скриншот
## Screenshot
![](../.gitbook/assets/clans-tablist.png)
+228 -198
View File
@@ -1,43 +1,48 @@
# 📘 Конфигурация
---
description: null
---
[Главный конфигурационный файл для SimpleClans можно найти здесь.](https://github.com/RoinujNosde/SimpleClans/blob/master/src/main/resources/config.yml)
# Configuration
## Главные настройки
[The main configuration file for SimpleClans can be found here.](https://github.com/RoinujNosde/SimpleClans/blob/master/src/main/resources/config.yml)
| Опция | Описание | По умолчанию |
| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------- |
| `enable-gui` | Включить GUI | `true` |
| `disable-messages` | Отключить такие оповещения, как "Клан создан", "Клан расформирован", и другие | `false` |
| `tameable-mobs-sharing` | Если включено, то приручаемые мобы будут поделены с участниками вашего клана. Также отключает любой клановый урон, наносимый по ним | `false` |
| `teleport-blocks` | Мягкое телепортирование (блок стекла под ногами) | `false` |
| `teleport-home-on-spawn` | При возрождении игроки будут телепортированы на базу клана | <p><code>false</code><br></p> |
| `drop-items-on-clan-home` | При телепортации на базу клана, выкидывать предметы на землю | `false` |
| `keep-items-on-clan-hom` | При телепортации на базу клана, оставлять предметы | <p><code>false</code><br><br></p> |
| `item-list` | Список предметов. Используется в связке с `keep-items-on-clan-home` и `drop-items-on-clan-home` | <p><code>[]</code><br></p> |
| `show-debug-info` | Показать отладочную информацию в консоли | `false` |
| `enable-auto-groups` | <p>Управляет группами автоматически. При условии, что у вас есть LuckPerms, а в ней создана любая из следующих групп:</p><ul><li>sc_leader</li><li>sc_trusted</li><li>sc_untrusted</li></ul><p>Будет автоматически закидывать игроков в эту группу</p> | <p><code>false</code><br><br></p> |
| `chat-compatibility-mode` | Режим совместимости с чатом. Если у вас есть какие-либо проблемы с чатом, попробуйте выключить этот параметр | `true` |
| `rival-limit-percent` | <p>Процент возможных соперников на клан.</p><p>Форумула: <code>(rivalsOfClan - 1) * rivalLimitPercent / 100</code></p> | <p><br><br><code>50</code><br></p> |
| `use-colorcode-from-prefix-for-name` | Использовать последний цветовой код в конце префикса | <p><code>true</code><br></p> |
| `display-chat-tags` | Отображать тег клана в чате | `true` |
| `unrivable-clans` | Список кланов, с которыми невозможно начать вражду | `[]` |
| `show-unverified-on-list` | Показывать **не** подтерждённые кланы в `/clan list` | `false` |
| `blacklisted-worlds` | Список миров, где SimpleClans не будет работать | `[]` |
| `banned-players` | Список игроков, которые не могут пользоваться командами плагина | <p><code>[]</code><br></p> |
| `disallowed-tags` | Список запрещенных тегов | `[]` |
| `language` | Язык по умолчанию | <p><code>en</code><br></p> |
| `user-language-selector` | Позволяет игрокам менять их язык | `true` |
| `disallowed-tag-colors` | Список запрещенных цветовых кодов для тега | <p><code>[]</code><br></p> |
| `server-name` | Название вашего сервера | `&4SimpleClans` |
| `new-clan-verification-require` | Должны ли новые кланы проходить верификацию? | `true` |
| `allow-regroup-command` | Разрешить ли команду для перегруппировки (телепортации игроков к себе/на базу) | <p><code>true</code><br></p> |
| `allow-reset-kdr` | <p>Разрешить сброс КДР <br>(соотношение убийств к смертям)</p> | `true` |
| `rejoin-cooldown` | Время в минутах, когда игрок сможет присоединиться к клану после выхода из него. | `60` |
| `rejoin-cooldown-enabled` | Должен ли быть включен таймер пере-присоединения включен? | `false` |
| `min-to-verify` | <p>Количество игроков в клане, чтобы можно было пройти подтверждение </p><p>(Модераторы могут обойти это ограничение)</p> | |
| `ranking-type` | <p></p><p>Допустимые параметры: ORDINAL или DENSE</p><ul><li><code>DENSE</code>: Если у игроков будет одинаковый KDR, их ранговая позиция будет одинаковой. Пример: 12234</li><li><code>ORDINAL</code>: Каждый игрок будет иметь разную ранговую позицию. <br>Пример: 12345</li></ul> | `DENSE` |
## General Settings
### Пример
* `enable-gui` - Enables the GUI.
* `disable-messages` - This will disable broadcasts from the plugin such as "Clan created", "Clan disbanded", etc.
* `tameable-mobs-sharing` -
* `teleport-blocks` -
* `teleport-home-on-spawn` - Players will be teleported to their clan's home when they respawn.
* `drop-items-on-clan-home` -
* `keep-items-on-clan-home` -
* `item-list` -
* `show-debug-info` -
* `mchat-integration` -
* `enable-auto-groups` -
* `chat-compatibility-mode` -
* `rival-limit-percent` -
* `use-colorcode-from-prefix-for-name` -
* `display-chat-tags` -
* `unrivable-clans` -
* `show-unverified-on-list` -
* `blacklisted-worlds` -
* `banned-players` -
* `disallowed-tags` -
* `language` -
* `language-per-player` -
* `disallowed-tag-colors` -
* `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\)
* `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
#### Example
```yaml
settings:
@@ -80,22 +85,22 @@ settings:
ranking-type: DENSE
```
## Формат тегов
## Tags Format
#### Пример
#### Example
* `default-color` - Цвет по-умолчанию
* `max-length` - Максимальная длинна
* `bracket` - Скобки
* `color` - Цвет
* `leader-color` - Цвет лидера
* `left` - Слева
* `right` - Справа
* `min-length` - Минимальная длина
* `separator` - Разделитель
* `color` - Цвет
* `leader-color` - Цвет лидера
* `char` - Символ
* `default-color` -
* `max-length` -
* `bracket` -
* `color` -
* `leader-color` -
* `left` -
* `right` -
* `min-length` -
* `separator` -
* `color` -
* `leader-color` -
* `char` -
```yaml
tag:
@@ -113,11 +118,18 @@ tag:
char: ' .'
```
## Основные команды
## General Commands
В этой секции вы можете редактировать команды плагина. Если какой-то другой плагин уже занимает эти команды, включение `force-priority` на `true` должно помочь.
* `more` -
* `ally` -
* `clan` -
* `accept` -
* `deny` -
* `global` -
* `clan_chat` -
* `force-priority` -
#### Пример
#### Example
```yaml
commands:
@@ -126,19 +138,19 @@ commands:
clan: clan
accept: accept
deny: deny
global: global # Удаленная опция, в новых версиях не встретите.
global: global
clan_chat: "."
force-priority: true
```
## Защита от набивания KDR
## KDR Grinding Prevention
* `enable-max-kills` - Включить максимальное количество убийств
* `max-kills-per-victim` - Максимальное количество убийств за жертву
* `enable-kill-delay` - Включить задержку перед убийствами
* `delay-between-kills` - Задержка перед убийствами
* `enable-max-kills` -
* `max-kills-per-victim` -
* `enable-kill-delay` -
* `delay-between-kills` -
#### Пример
#### Example
```yaml
kdr-grinding-prevention:
@@ -148,36 +160,61 @@ kdr-grinding-prevention:
delay-between-kills: 5
```
## Экономика
## List Commands
* `creation-price` - Цена создания клана&#x20;
* `purchase-clan-create` - Брать ли денги за создание клана?
* `verification-price` - Цена подтверждения
* `purchase-clan-verify` - Брать ли денги за подтверждение клана?
* `invite-price` - Цена приглашения
* `purchase-clan-invite` - Брать ли денги за приглашение в клан?
* `home-teleport-price` - Цена телепортации на базу клана
* `purchase-home-teleport` - Брать ли денги за телепорт на базу клана?
* `home-teleport-set-price` - Цена установки точки базы клана
* `purchase-home-teleport-set` - Брать ли денги за установку точки базы клана?
* `home-regroup-price` - Цена перегруппировки на точку базы клана
* `purchase-home-regroup` - Брать ли денги за перегруппировку на точку базы клана?
* `unique-tax-on-regroup` - Если `false`, цена умножается на количество онлайн-членов клана.
* `issuer-pays-regroup` - Брать ли деньги с того, кто вызвал перегруппировку?
* `money-per-kill` - Награждать ли игроков за убийство?
* `money-per-kill-kdr-multipier` - Множитель убийства.
* `purchase-reset-kdr` - Брать ли денги за сброс KDR?
* `reset-kdr-price` - Цена сброса KDR.
* `purchase-member-fee-set` - Брать ли денги за перегруппировку на точку базы клана
* `member-fee-set-price` - Комиссия на участников.
* `member-fee-enabled` - Включить ли комиссию на участников?
* `max-member-fee` - Максимальная комиссия участников.
* `upkeep` - Коммисия на поддержание клана.
* `upkeep-enabled` - Включить ли комиссию на содержание клана?
* `multiply-upkeep-by-clan-size` - Должна ли комиссия на содержание зависеть от количества участников в клане?
* `charge-upkeep-only-if-member-fee-enabled` - Должна ли комиссия на содержание быть взята только у тех, кто её включил?
* `size` -
* `kdr` -
* `name` -
* `founded` -
* `active` -
* `asc` -
* `desc` -
* `default` -
#### Пример
#### Example
```yaml
list:
size: size
kdr: kdr
name: name
founded: founded
active: active
asc: asc
desc: desc
default: kdr
```
## Economy
* `creation-price` -
* `purchase-clan-create` -
* `verification-price` -
* `purchase-clan-verify` -
* `invite-price` -
* `purchase-clan-invite` -
* `home-teleport-price` -
* `purchase-home-teleport` -
* `home-teleport-set-price` -
* `purchase-home-teleport-set` -
* `home-regroup-price` -
* `purchase-home-regroup` -
* `unique-tax-on-regroup` -
* `issuer-pays-regroup` -
* `money-per-kill` -
* `money-per-kill-kdr-multipier` -
* `purchase-reset-kdr` -
* `reset-kdr-price` -
* `purchase-member-fee-set` -
* `member-fee-set-price` -
* `member-fee-enabled` -
* `max-member-fee` -
* `upkeep` -
* `upkeep-enabled` -
* `multiply-upkeep-by-clan-size` -
* `charge-upkeep-only-if-member-fee-enabled` -
#### Example
```yaml
economy:
@@ -209,40 +246,41 @@ economy:
charge-upkeep-only-if-member-fee-enabled: true
```
## Вес убийств
## Kill Weights
Здесь вы можете установить вес каждого типа убийства. Вес также может быть отрицательным. Он используется для вычисления KDR следующим образом: \
`(Количество убийств * вес убийства) / Количество смертей = KDR`
* `rival` -
* `civilian` -
* `neutral` -
* `deny-same-ip-kills` -
#### Пример
#### Example
```yaml
kill-weights:
rival: 2.0 # соперник/противник
civilian: 0.0 # мирный/без клана
neutral: 1.0 # нейтральный
deny-same-ip-kills: false # Отменять убийства с одного айпи адреса
rival: 2.0
civilian: 0.0
neutral: 1.0
deny-same-ip-kills: false
```
## Настройки клана&#x20;
## Clan Settings
* `homebase-teleport-wait-secs` - Задержка перед телепортацией на точку базы клана
* `homebase-can-be-set-only-once` - Точка базы клана может быть установлена единожды
* `min-size-to-set-rival` - Минимальное количество участников клана для добавления соперников
* `max-length` - Максимальная длина названия клана.
* `max-description-length` - Максимальная длина описания клана
* `min-description-length` - Минимальная длина описания клана.
* `max-members` - Максимальное количество участников
* `confirmation-for-promote` - Должны ли другие лидеры подтвердить повышение участника?
* `trust-members-by-default` - Подтверждать участников по умолчанию?
* `confirmation-for-demote` - Должны ли другие лидеры подтвердить понижение участника?
* `percentage-online-to-demote` - Процент лидеров онлайн для понижения.
* `ff-on-by-default` - Глобальный "Огонь по своим" включен по умолчанию.
* `min-length` - Минимальная длина названия клана.
* `min-size-to-set-ally` - Минимальное количество участников клана для добавления союзников.
* `min-to-verify` - Клан должен иметь следующее число участников, чтобы подтвердить свой клан (модераторы могут обойти это)
* `homebase-teleport-wait-secs` -
* `homebase-can-be-set-only-once` -
* `min-size-to-set-rival` -
* `max-length` -
* `max-description-length` -
* `min-description-length` -
* `max-members` -
* `confirmation-for-promote` -
* `trust-members-by-default` -
* `confirmation-for-demote` -
* `percentage-online-to-demote` -
* `ff-on-by-default` -
* `min-length` -
* `min-size-to-set-ally` -
#### Пример
#### Example
```yaml
clan:
@@ -262,19 +300,19 @@ clan:
min-size-to-set-ally: 3
```
## Запланированные задачи
## Tasks
* `collect-upkeep` - Сбор комиссии на содержание клана
* `hour` - час
* `minute` - минуты
* `collect-upkeep-warning` - Предупреждение о сборе комисии на поддержание клана
* `hour` - час&#x20;
* `minute` - минуты&#x20;
* `collect-fee` - Сбор комиссии
* `hour` - час
* `minute` - минуты
* `collect-upkeep` -
* `hour` -
* `minute` -
* `collect-upkeep-warning` -
* `hour` -
* `minute` -
* `collect-fee` -
* `hour` -
* `minute` -
#### Пример
#### Example
```yaml
tasks:
@@ -289,18 +327,18 @@ tasks:
minute: 0
```
## Страницы
## Page
* `untrusted-color` - Цвет неподтвержденного клана
* `clan-name-color` - Цвет названия клана
* `subtitle-color` - Цвет подзаголовков
* `headings-color` - Цвет заголовков
* `trusted-color` - Цвет подтвержденного клана
* `leader-color` - Цвет лидера
* `separator` - Разделитель
* `size` - Размер
* `untrusted-color` -
* `clan-name-color` -
* `subtitle-color` -
* `headings-color` -
* `trusted-color` -
* `leader-color` -
* `separator` -
* `size` -
#### Пример
#### Example
```yaml
page:
@@ -314,18 +352,18 @@ page:
size: 100
```
## Чат клана
## Clan Chat
* `enable` - Включить клановый чат?
* `tag-based-clan-chat` - Если `true` командой для отправки сообщения в клановый чат станет ваш клан тег.
* `announcement-color` - Цвет, используемый для оповещений.
* `format` - Формат отображения чата
* `rank` - Формат отображения ранга
* `leader-color:` - Цвет лидера в чате
* `trusted-color` - Цвет подтвержденного участника в чате&#x20;
* `member-color` - Цвет участника в чате
* `enable` -
* `tag-based-clan-chat` -
* `announcement-color` -
* `format` -
* `rank` -
* `leader-color:` -
* `trusted-color` -
* `member-color` -
#### Пример
#### Example
```yaml
clanchat:
@@ -339,17 +377,13 @@ clanchat:
member-color: '7'
```
## Discord чат
## Request
Вы можете посмотреть описание конфигурации [здесь](../integracii/discordsrv.md#konfiguraciya).
* `message-color` -
* `ask-frequency-secs` -
* `max-asks-per-request` -
## Запросы
* `message-color` - Цвет сообщений
* `ask-frequency-secs` - Интервал (в секундах) между сообщениями
* `max-asks-per-request` - Максимальное кол-во сообщений перед истечением срока запроса.
#### Пример
#### Example
```yaml
request:
@@ -358,15 +392,15 @@ request:
max-asks-per-request: 1440
```
## Доска объявлений клана
## Bulletin Board
* `color` - Цвет
* `accent-color` - Цвет акцента
* `show-on-login` - Показывать при входе?
* `size` - Размер
* `login-size` - Размер на входе
* `color` -
* `accent-color` -
* `show-on-login` -
* `size` -
* `login-size` -
#### Пример
#### Example
```yaml
bb:
@@ -377,16 +411,16 @@ bb:
login-size: 6
```
## Союзный чат
## Ally Chat
* `enable` - Включить союзный чат?
* `format` - Формат чата
* `rank` - Формат ранга
* `leader-color` - Цвет лидера
* `trusted-color` - Цвет подтвержденного участника
* `member-color` - Цвет участника
* `enable` -
* `format` -
* `rank` -
* `leader-color` -
* `trusted-color` -
* `member-color` -
#### Пример
#### Example
```yaml
allychat:
@@ -398,13 +432,13 @@ allychat:
member-color: '7'
```
## Очистка данных
## Purge Data
* `inactive-player-data-days` - Через сколько дней будут очищены данные о неактивных игроках?
* `inactive-clan-days` - Через сколько дней будут очищены не активные кланы?
* `unverified-clan-days` - Через сколько дней будут очищены не активные и не подтвержденные кланы?
* `inactive-player-data-days` -
* `inactive-clan-days` -
* `unverified-clan-days` -
#### Пример
#### Example
```yaml
purge:
@@ -413,16 +447,16 @@ purge:
unverified-clan-days: 2
```
## MySQL настройки
## mySQL Settings
* `username` - Логин
* `host` - Хост
* `port` - Порт
* `enable` - Включить MySQL подключение?
* `password` - Пароль
* `database` - База данных
* `username` -
* `host` -
* `port` -
* `enable` -
* `password` -
* `database` -
#### Пример
#### Example
```yaml
mysql:
@@ -434,11 +468,11 @@ mysql:
database: ''
```
## Разрешения
## Permissions
* `auto-group-groupname` -&#x20;
* `auto-group-groupname` -
#### Пример
#### Example
```yaml
permissions:
@@ -447,19 +481,14 @@ permissions:
- test.permission
```
## Производительность
## Performance
* `save-periodically` - Плагин будет периодически сохранять данные, а не сразу.\
**Рекомендуется** установить данный параметр на `true`.\
* `save-periodically` - The plugin will save its data periodically as opposed to right away, **RECOMMENDED** to set it true.
* `save-interval` - The interval **in minutes** in which changes are written to the database.
* `use-threads` - The plugin will not use the main thread to connect with the database if this is true, **RECOMMENDED** to set it true.
* `use-bungeecord` -
* `save-interval` - Интервал **в минутах**, в течение которого изменения записываются в базу данных.\
* `use-threads` - Плагин не будет использовать основной поток для подключения к БД.\
**Рекомендуется** установить данный параметр на `true`.\
* `use-bungeecord` - Использовать bungeecord? (WIP)
#### Пример
#### Example
```yaml
performance:
@@ -469,12 +498,13 @@ performance:
use-bungeecord: false
```
## Защита мирных игроков
## Safe Civilians
* `safe-civilians` - Мирные игроки(без клана) будут защищены от PVP.
* `safe-civilians` - Civilians are safe from PvP, even civilian vs civilian combat is disabled
#### Пример
#### Example
```yaml
safe-civilians: false
```
-62
View File
@@ -1,62 +0,0 @@
---
description: Виды комиссий в клане
---
# 💰 Комиссия в клане
## Комиссия участников
**Как это работает?**\
Если включено в [конфигурационном файле](configuration.md#ekonomika) плагина, а также настроено лидерами клана, то в 1:00 ночи с участников клана будет собрана установленная плата. Участник клана, у которого недостаточно средств для оплаты комиссии, будет **автоматически изгнан из клана**. Собранные средства с комиссии идут в банк клана.\
\
**Конфигурация**
* `member-fee-enabled` – Включить или выключить комиссию участников.
* `max-member-fee` – Ограничивает размер взимаемой комиссии, таким образом лидеры не смогут злоупотреблять участниками клана.
* `purchase-member-fee-set` – Включите эту функцию, чтобы взимать нижеприведенное значение каждый раз, когда лидер изменяет значение платы.
* `member-fee-set-price` – Цена, которую вы платите всякий раз, когда меняете размер комиссии.
Пример:
```yaml
economy:
member-fee-enabled: false
max-member-fee: 200.0
purchase-member-fee-set: false
member-fee-set-price: 1000.0
```
**Разрешения**
| **Разрешение** | Описание |
| ------------------------------ | ----------------------------------------------------------------- |
| `simpleclans.leader.fee` | Разрешает игроку переключать комиссию и устанавливать ей значения |
| `simpleclans.member.fee-check` | Разрешает проверять участнику размер комиссии |
**Команды**
| **Разрешение** | Описание | Права |
| ---------------------------- | ----------------------------- | ------------------------------ |
| `/clan toggle fee` | Включить/Выключить комиссию | `simpleclans.leader.fee` |
| `/clan fee set [количество]` | Устанавливает размер комиссии | `simpleclans.leader.fee` |
| `/clan fee check` | Проверить статус комиссии | `simpleclans.member.fee-check` |
## Комиссия на поддержание клана
**Как это работает?**\
Если включено, кланы будут платить комиссию на содержание каждый день. Комиссия будет собрана в `1:30` ночи. В `12:00` утра, если у клана недостаточно денег, чтобы оплатить комиссию, будет отправлено уведомление на доску объявлений. Размер комиссии может быть фиксированным или зависеть от количества участников в клане.\
\
Пример расчёта комиссии с 10 участниками в клане:
```
Цена начальной комиссии = 20.0
Размер клана = 10
Окончательная цена комиссии = 200.0
```
**Настройка**
* `upkeep` – значение начальной комиссии для поддержания клана.
* `upkeep-enabled` – включает/выключает функцию.
* `multiply-upkeep-by-clan-size` – множитель от количества участников (см. пример выше).
* `charge-upkeep-only-if-member-fee-enabled` - Включить комиссию на поддержание кланов, если включена комиссия на участников.
+23 -21
View File
@@ -1,32 +1,34 @@
# 🍕 Перевод
---
description: null
---
## Редактирование сообщений плагина
# Translation
### Необходимые программы:
## Editing the plugin's messages
* Архиватор ZIP (например, [WinRAR](https://www.win-rar.com/download.html?\&L=0) или [7-Zip](https://www.7-zip.org/download.html))
* Текстовый редактор, например: [NotePad++](https://notepad-plus-plus.org/downloads/), [Visual Studio Code](https://code.visualstudio.com/) или [Sublime Text](https://www.sublimetext.com/).
### Requirements:
### Пошагово
* A ZIP explorer program \(such as [WinRAR](https://www.win-rar.com/download.html?&L=0) or [7-Zip](https://www.7-zip.org/download.html)\)
* A Text editor like [NotePad++](https://notepad-plus-plus.org/downloads/), [Visual Studio Code](https://code.visualstudio.com/) or [Sublime Text](https://www.sublimetext.com/).
1. Нажмите правой кнопкой мыши по .jar файлу плагина, выберите пункт "Открыть с помощью..." и выберите ваш ZIP архиватор.
2. Скопируйте файл с сообщениями плагина, соответствующий вашему языку, в папку плагина.
1. Если здесь нет вашего языка, скопируйте "messages.properties" и переименуйте с добавлением кода языка. Например, если ваш язык – русский:`messages_ru_RU.properties`
3. Отредактируйте сообщения и сохраните.
4. Измените параметр `language` в config.yml на код вашего языка;
5. Перезагрузите плагин, используя `/clan reload`.
### Step by step
### Небольшой трюк
1. Right click the plugin jar, click on "Open as" and choose the ZIP program;
2. Copy the messages file corresponding to your language to the plugin's folder;
1. If there isn't one for your language, copy "messages.properties" instead and rename it with your language code appended. For example, if your language is Russian: `messages_ru_RU.properties`
3. Edit the messages and save;
4. Change `language` in config.yml to your language code;
5. Reload the plugin using /clan reload.
Если вам понравился текущий перевод, но хотите изменить пару строчек: \
1\. Скопируйте файл в папку плагина.\
2\. Удалите все строки, кроме тех, которые хотите поменять.\
3\. Отредактируйте и сохраните.
### A little trick
> **Примечание**: учтите, что пользовательский файл `messages.properties` не будет обновлён автоматически при добавлении новых сообщений из Crowdin.
If you like the current translation, but want to change only a few lines: 1. Copy the file to the plugin's folder; 2. Delete all messages except the ones you would like to edit; 3. Edit them and save.
## Делитесь вашим переводом
> **Note**: Please note that your custom `messages.properties` does not automatically update when new messages are added.
SimpleClans есть на [Crowdin](https://crowdin.com/project/simpleclans). Здесь вы можете переводить и предложить исправления.
## Share your translations!
SimpleClans has a project on [Crowdin](https://crowdin.com/project/simpleclans). There you can translate the messages and suggest corrections!
> **Note**: if you have an old `language.yml` file for SimpleClans that you translated to your language, [open an issue here](https://github.com/RoinujNosde/SimpleClans/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc), I will convert the file and add it to the plugin.
> **Примечание**: если у вас уже есть старый файл language.yml, переведённый на ваш язык, откройте [здесь тему](https://github.com/RoinujNosde/SimpleClans/issues), я конвертирую файл и добавлю его в плагин.
-144
View File
@@ -1,144 +0,0 @@
---
description: Больше пространства для коммуникации
---
# 👾 DiscordSRV
## Включение
Чтобы включить эту функцию всё, что вам нужно сделать – включить её в `config.yml` и установить [DiscordSRV](https://www.spigotmc.org/resources/discordsrv.18494/).&#x20;
{% tabs %}
{% tab title="config.yml" %}
```yaml
discordchat:
enable: true
```
{% endtab %}
{% endtabs %}
{% hint style="warning" %}
**Внимание**
Пожалуйста, убедитесь, что вы используете последнюю версию DiscordSRV (>=1.23.0)
{% endhint %}
## Как это работает?
### Автоматически
В начале запуска вашего сервера, SimpleClans создаст категории для ваших кланов, внутри категорий будет отдельный текстовый канал для каждого клана:
![](../.gitbook/assets/DiscordSRV-Clans.png)
{% hint style="warning" %}
**Внимание**
Имейте ввиду, что ваша структура в дискорде будет отличаться от скриншота.\
`clan1`, `clan2`, `clan3`, `clan4` будут находиться в **одной** категории, пока категория не достигнет своего лимита (в таком случае, SimpleClans создаст ещё одну категорию).
{% endhint %}
**Это позволит игрокам общаться в специально созданных для них каналах.**
Канал Discord будет создан/удален/изменен, когда:
* Игрок создает/удаляет клан
* Игрок вступает в клан/выходит из клана
* Игрок клана получил повышение или понижение&#x20;
* Игрок соединил/отсоединил свой аккаунт с Discord'ом
{% hint style="info" %}
**Заметка 1**
Только связанные игроки имеют доступ к своим кланам в дискорде, но сообщения от несвязанных будут также отправляться.
{% endhint %}
{% hint style="info" %}
**Заметка 2**
Если вы являетесь администратором сервера и не можете написать сообщение в **** чат другого клана, спросите себя: позволяет ли вам SimpleClans отправлять сообщения в чаты других кланов? \
\
Вы могли бы использовать `/clan mod place <`клан`>`, чтобы присоединиться и отправить сообщение в нужный чат.
{% endhint %}
### Вручную
Начиная с версии 2.16.2, у вас есть возможность отключить авто-создание каналов и контроллировать ситуацию собственноручно.&#x20;
Чтобы включить ручное создание, надо выключить следующий пункт:
```yaml
discordchat:
auto-creation: false
```
Наши поздравления! Теперь все лидеры с специальным резрешением (`simpleclans.leader.discord.create`) могут создать их собственный канал.
Для этого им необходимо исполнить следующую команду:
```
/clan discord create
```
Более того, если вы используете экономический плагин, вы также можете указать цену за создание:
```yaml
economy:
purchase-discord-create: true
discord-creation-price: 1000
```
### Основные заметки
{% hint style="info" %}
**Заметка 1**
Только привязанные игроки имеют доступ к их кланам в дискорде, но сообщения от непривязанных будут отправлены в том числе.
{% endhint %}
{% hint style="info" %}
**Заметка 2**
Если вы админ сервера и не можете написать сообщения в другие чаты, спросите себя: _позволяет ли SimpleClans писать вам сообщения в другие чаты кланов?_\
__Вы можете использовать `/clan mod place <нужный клан>`, чтобы присоединиться и отправить сообщения в этот чат.
{% endhint %}
## Говоря об ограничениях дискорда...
> Максимум только 50 каналов в одной категории
Поэтому, когда категория будет заполнена 50 каналами, SimpleClans создаст новую категорию и разместит в ней новый канал.
> Максимум 500 кланов в дискорде сервере
Поэтому, если у вас более 500 кланов, то SimpleClans не сможет обработать их все.\
Вы можете использовать `discordchat.text.clans-limit` в конфигурации для ограничения количества каналов на вашем дискорд сервере.
## Конфигурация
| Опция | Значение |
| ---------------------------------- | --------------------------------------------------------------------------------------------------- |
| `discordchat.enable` | Включает интеграцию с DiscordSRV |
| `discordchat.discord-format` | Формат сообщений из майнкрафта в дискорд |
| `discordchat.format` | Формат сообщений из дискорда в майнкрафт |
| `discordchat.spy-format` | <p>Формат сообщений из дискорда к админам</p><p>(<code>simpleclans.admin.all-seeing-eye</code>)</p> |
| `discordchat.rank` | Формат ранга |
| `discordchat.text.category-format` | <p>Наименование категории <br>("SC – TextChannel")</p> |
| `discordchat.text.category-ids` | <p>Айди категорий. <br>Вы можете добавить их вручную, если хотите.</p> |
| `discordchat.text.whitelist` | Белый список кланов создаст только кланы, указанные в нём. |
| `discordchat.text.clans-limit` | Ограничение каналов на дискорд сервере. Максимум - 500. |
## Опции, которые НЕ будут работать
Некоторые конфигурации DiscordSRV не будут работать на каналах SimpleClans'а. \
Вот небольшой список:
* `DiscordChatChannelDiscordToMinecraft` – Вы можете отключить дискорд интеграцию в конфиге SimpleClans'а.
* `DiscordChatChannelRequireLinkedAccount` _–_ Интеграция с дискордом требует наличие только привязанных игроков.
* `DiscordChatChannelBlockBots` – Мы все роботы :robot:, теперь вы знаете правду.
* `DiscordChatChannelBlockedIds` – И где же я могу заблокировать свой айпи? :thinking:
* `DiscordChatChannelBroadcastDiscordMessagesToConsole` – У вас есть шпионский чат для администраторов.
* `DiscordChatChannelTruncateLength` – Кто-нибудь знает что такое `Truncate`? :smile:
* `DiscordChatChannelRolesAllowedToUseColorCodesInChat` – Нет.
Ну, хотя бы `DiscordChatChannelEmojiBehavior` будет работать нормально. :thumbsup:
-74
View File
@@ -1,74 +0,0 @@
---
description: >-
На этой странице содержится информация о совместном использовании вашей
территории с участниками клана.
---
# 🏝 GriefPrevention, WorldGuard и другие
## Раздел территории
В настоящее время SimpleClans может работать с GriefPrevention, WorldGuard (а также плагинами, зависящими от него) и PlotSquared. SimpleClans имеет методы по умолчанию для разрешения и блокирования различных действий (ломать, строить, взаимодействовать и т.д.).
Полный список команд:
> Необязательные аргументы отмечены как \[аргумент]
| Команда | Описание |
| --------------------------- | -------------------------------------------------------------------------- |
| `/clan land allow [action]` | Разрешает **указанное действие** на этой территории для ваших со-клановцев |
| `/clan land block [action]` | Блокирует **указанное действие** на этой территории для ваших со-клановцев |
Список действий:
| Действие | Описание |
| ---------------- | -------------------------------------------------------------------------------------------------------------------------- |
| container | Используется, чтобы разрешить/заблокировать открытие сундуков, наковален, зачаровательных столов и др. на вашей территории |
| place\_block | Используется, чтобы разрешить/заблокировать установку блоков на вашей территории |
| break | Используется, чтобы разрешить/заблокировать ломание блоков на вашей территории |
| damage | Используется, чтобы разрешить/заблокировать получение любого вида урона на вашей территории |
| interact | Используется, чтобы разрешить/заблокировать взаимодействие с дверьми, кнопками, рычагами, и др. на вашей территории |
| interact\_entity | Используется, чтобы разрешить/заблокировать взаимодействие с сущностями на вашей территории |
| all | Используется, чтобы разрешить/заблокировать все действия |
**Пример:** `/clan land allow place_block` разрешит установку блоков на вашей территории для ваших со-клановцев.
{% hint style="info" %}
**Заметка**\
Команды повляют на территорию, в которой вы в текущий момент находитесь, или на все территории, если вы не стоите не на одной. _(когда edit-all-lands – true)_.
{% endhint %}
## Другие пути для раздела территории
### GriefPrevention
#### Конфигурация
* `enable-auto-groups` -&#x20;
* `auto-group-groupname`-&#x20;
#### Пример
```yaml
settings:
enable-auto-groups: false
permissions:
auto-group-groupname: true
YourClanNameHere:
- test.permission
```
Вы можете заменить `<clantag>` с любым клан тегом (будь то союзник, противник, или прочее)
| Команда | Описание |
| ---------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
| `/Trust group.<clantag>` | Даёт право участникам вашего клана изменять ваш регион |
| `/AccessTrust group.<clantag>` | Даёт право участникам вашего клана использовать рычаги, кнопки и кровати, расположенные на вашем регионе |
| `/ContainerTrust group.<clantag>` | Даёт право участникам вашего клана использовать рычаги, кнопки и кровати, столы для крафтов, сундуки и животных. |
| `/PermissionTrust group.<clantag>` | Даёт право участникам вашего клана делиться их уровнем доступа с другими |
| `/UnTrust group.<clantag>` | Забрать любые права, гарантированные ваших сокланавцам, на вашем регионе |
{% hint style="info" %}
**Заметка**\
После того, как вы выдали право, игроки должны перезайти.
{% endhint %}
+11 -37
View File
@@ -1,18 +1,18 @@
---
description: Список известных проблем плагина и возможных решений.
description: List of the plugin's known issues and possible solutions.
---
# 🪓 Известные проблемы
# Known issues
### MySQL #1366 - Некорректное string значение
#### MySQL \#1366 - Incorrect string value
Эта ошибка возникает тогда, когда вы пытаетесь вставить символы, которые не поддерживаются кодировкой MySQL.
This error happens when you try to insert characters that MySQL's current encoding doesn't support.
**Решение:** измените кодировку MySQL на `utf8mb4`.\
1\. Откройте файл MySQL `my.cnf`.\
2\. Добавьте эту конфигурацию, сохраните и перезапустите MySQL:
**Solution:** change MySQL's encoding to `utf8mb4`.
1. Open MySQL's `my.cnf`.
2. Add these configurations, save and restart MySQL:
```
```text
[mysql]
default-character-set=utf8mb4
[mysqld]
@@ -20,35 +20,9 @@ character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
```
### KDR не подсчитывается
#### KDR is not counted
Игроки жалуются, что их KDR не изменяется.
Players report that their KDR is not changing.
**Решение:** отрицайте разрешение`simpleclans.other.kdr-exempt`. В некоторых плагинах на права, просто добавьте `-` перед правом. Другие принимают `false` значение.
**Solution:** deny the permission `simpleclans.other.kdr-exempt`. In some permission plugins, just add a `-` before the node. Others accept the `false` value.
### Странные символы в GUI
В GUI, в некоторых местах, отображаются странные символы.
![Тот самый странный символ](<../.gitbook/assets/izobrazhenie (1).png>)
**Решение:** ваша локальная машина настроена на русский язык из-за чего появляется подобный казус. Решить это можно, добавив следующую строку в параметры запуска сервера:\
`-Duser.country=US -Duser.language=en`
### Geyser | Ошибка при загрузке текстуры головы
Поскольку SimpleClans использует головы игроков в меню, то вы можете столкнуться с [ограничением Geyser](https://wiki.geysermc.org/geyser/current-limitations/).\
\
При попытке открыть меню (`/clan`) вылетает ошибка в консоли.\
Эту ошибку можно определить по стектрейсу:
```
Caused by: java.lang.IllegalArgumentException: Name and ID cannot both be blank
```
**Решение:**\
Поставьте следующее значение на `false` в конфигурации Geyser:
```yaml
allow-custom-skulls: false
```
+38
View File
@@ -0,0 +1,38 @@
---
description: null
---
# Land Claims Plugins
## Configuration
* `enable-auto-groups` -
* `auto-group-groupname`-
### Exemple
```yaml
settings:
enable-auto-groups: false
permissions:
auto-group-groupname: true
YourClanNameHere:
- test.permission
```
## GriefPrevention
You can replace `<clantag>` with ANY clan tag \(ally, rival, etc\)
| Command | Description |
| :--- | :--- |
| `/Trust group.<clantag>` | Gives the Clan members permission to edit in your claim |
| `/AccessTrust group.<clantag>` | Gives the Clan members permission to use your buttons, levers, and beds |
| `/ContainerTrust group.<clantag>` | Gives the Clan members permission to use your buttons, levers, beds, crafting gear, containers, and animals |
| `/PermissionTrust group.<clantag>` | Gives the Clan members permission to share their permission level with others |
| `/UnTrust group.<clantag>` | Revokes any permissions granted to a Clan in your claim |
## Note
After the permission is given, the player must reconnect.
+85 -106
View File
@@ -2,112 +2,91 @@
description: null
---
# 🪜 Поддержка PlaceholderAPI
# PlaceholderAPI Support
## Доступные заполнители
## Available placeholders
| Заполнитель | Результат | Описание | |
| ---------------------------------------------------- | ------------------- | -------------------------------------- | - |
| %simpleclans\_neutral\_kills% | Числовой | | |
| %simpleclans\_rival\_kills% | Числовой | | |
| %simpleclans\_civilian\_kills% | Числовой | | |
| %simpleclans\_total\_kills% | Числовой | | |
| %simpleclans\_weighted\_kills% | Числовой | | |
| %simpleclans\_deaths% | Числовой | | |
| %simpleclans\_kdr% | FLOAT | | |
| %simpleclans\_in\_clan% | Логический (Да/Нет) | | |
| %simpleclans\_is\_leader% | Логический (Да/Нет) | | |
| %simpleclans\_is\_trusted% | Логический (Да/Нет) | | |
| %simpleclans\_is\_member% | Логический (Да/Нет) | | |
| %simpleclans\_is\_bb\_enabled% | Логический (Да/Нет) | | |
| %simpleclans\_is\_usechatshortcut% | Логический (Да/Нет) | | |
| %simpleclans\_is\_allychat% | Логический (Да/Нет) | | |
| %simpleclans\_is\_clanchat% | Логический (Да/Нет) | | |
| %simpleclans\_is\_globalchat% | Логический (Да/Нет) | | |
| %simpleclans\_is\_cape\_enabled% | Логический (Да/Нет) | | |
| %simpleclans\_is\_tag\_enabled% | Логический (Да/Нет) | | |
| %simpleclans\_is\_friendlyfire\_on% | Логический (Да/Нет) | | |
| %simpleclans\_is\_muted% | Логический (Да/Нет) | | |
| %simpleclans\_is\_mutedally% | Логический (Да/Нет) | | |
| %simpleclans\_join\_date% | Дата | Месяц, День, Год, Час | |
| %simpleclans\_inactive\_days% | Числовой | | |
| %simpleclans\_lastseen% | Числовой | | |
| %simpleclans\_lastseendays% | Числовой | | |
| %simpleclans\_tag% | Строковый | Тег клана без цвета в нижнем регистре. | |
| %simpleclans\_tag\_label% | Строковый | Полный тег клана с цветом | |
| %simpleclans\_rank% | Строковый | | |
| %simpleclans\_rank\_displayname% | Строковый | | |
| %simpleclans\_clanchat\_player\_color% | | | |
| %simpleclans\_allychat\_player\_color% | | | |
| %simpleclans\_clan\_total\_neutral% | Числовой | | |
| %simpleclans\_clan\_total\_civilian% | Числовой | | |
| %simpleclans\_clan\_total\_rival% | Числовой | | |
| %simpleclans\_clan\_total\_kills% | Числовой | | |
| %simpleclans\_clan\_total\_deaths% | Числовой | | |
| %simpleclans\_clan\_total\_kdr% | FLOAT | | |
| %simpleclans\_clan\_average\_wk% | Числовой | | |
| %simpleclans\_clan\_leader\_size% | Числовой | | |
| %simpleclans\_clan\_balance% | Числовой | | |
| %simpleclans\_clan\_allow\_withdraw% | Логический (Да/Нет) | | |
| %simpleclans\_clan\_allow\_deposit% | Логический (Да/Нет) | | |
| %simpleclans\_clan\_size% | Числовой | | |
| %simpleclans\_clan\_name% | Строковый | | |
| %simpleclans\_clan\_color\_tag% | | | |
| %simpleclans\_clan\_tag% | | | |
| %simpleclans\_clan\_founded% | | | |
| %simpleclans\_clan\_friendly\_fire% | | | |
| %simpleclans\_clan\_is\_unrivable% | | | |
| %simpleclans\_clan\_is\_anyonline% | | | |
| %simpleclans\_clan\_is\_verified% | | | |
| %simpleclans\_clan\_capeurl% | | | |
| %simpleclans\_clan\_inactivedays% | | | |
| %simpleclans\_clan\_onlinemembers\_count% | | | |
| %simpleclans\_clan\_allies\_count% | | | |
| %simpleclans\_clan\_rivals\_count% | | | |
| %simpleclanstopclans\_#\_clan\_total\_neutral% | | | |
| %simpleclanstopclans\_#\_clan\_total\_civilian% | | | |
| %simpleclanstopclans\_#\_clan\_total\_rival% | | | |
| %simpleclanstopclans\_#\_clan\_total\_kills% | | | |
| %simpleclanstopclans\_#\_clan\_total\_deaths% | | | |
| %simpleclanstopclans\_#\_clan\_total\_kdr% | | | |
| %simpleclanstopclans\_#\_clan\_average\_wk% | | | |
| %simpleclanstopclans\_#\_clan\_leader\_size% | | | |
| %simpleclanstopclans\_#\_clan\_balance% | | | |
| %simpleclanstopclans\_#\_clan\_allow\_withdraw% | | | |
| %simpleclanstopclans\_#\_clan\_allow\_deposit% | | | |
| %simpleclanstopclans\_#\_clan\_size% | | | |
| %simpleclanstopclans\_#\_clan\_name% | | | |
| %simpleclanstopclans\_#\_clan\_color\_tag% | | | |
| %simpleclanstopclans\_#\_clan\_tag% | | | |
| %simpleclanstopclans\_#\_clan\_founded% | | | |
| %simpleclanstopclans\_#\_clan\_friendly\_fire% | | | |
| %simpleclanstopclans\_#\_clan\_is\_unrivable% | | | |
| %simpleclanstopclans\_#\_clan\_is\_anyonline% | | | |
| %simpleclanstopclans\_#\_clan\_is\_verified% | | | |
| %simpleclanstopclans\_#\_clan\_capeurl% | | | |
| %simpleclanstopclans\_#\_clan\_inactivedays% | | | |
| %simpleclanstopclans\_#\_clan\_onlinemembers\_count% | | | |
| %simpleclanstopclans\_#\_clan\_allies\_count% | | | |
| %simpleclanstopclans\_#\_clan\_rivals\_count% | | | |
| Placeholder | Result | Description | |
| :--- | :--- | :--- | :--- |
| %simpleclans\_neutral\_kills% | INTEGER | | |
| %simpleclans\_rival\_kills% | INTEGER | | |
| %simpleclans\_civilian\_kills% | INTEGER | | |
| %simpleclans\_total\_kills% | INTEGER | | |
| %simpleclans\_weighted\_kills% | INTEGER | | |
| %simpleclans\_deaths% | INTEGER | | |
| %simpleclans\_kdr% | FLOAT | | |
| %simpleclans\_in\_clan% | BOOLEAN \(YES/NO\) | | |
| %simpleclans\_is\_leader% | BOOLEAN \(YES/NO\) | | |
| %simpleclans\_is\_trusted% | BOOLEAN \(YES/NO\) | | |
| %simpleclans\_is\_member% | BOOLEAN \(YES/NO\) | | |
| %simpleclans\_is\_bb\_enabled% | BOOLEAN \(YES/NO\) | | |
| %simpleclans\_is\_usechatshortcut% | BOOLEAN \(YES/NO\) | | |
| %simpleclans\_is\_allychat% | BOOLEAN \(YES/NO\) | | |
| %simpleclans\_is\_clanchat% | BOOLEAN \(YES/NO\) | | |
| %simpleclans\_is\_globalchat% | BOOLEAN \(YES/NO\) | | |
| %simpleclans\_is\_cape\_enabled% | BOOLEAN \(YES/NO\) | | |
| %simpleclans\_is\_tag\_enabled% | BOOLEAN \(YES/NO\) | | |
| %simpleclans\_is\_friendlyfire\_on% | BOOLEAN \(YES/NO\) | | |
| %simpleclans\_is\_muted% | BOOLEAN \(YES/NO\) | | |
| %simpleclans\_is\_mutedally% | BOOLEAN \(YES/NO\) | | |
| %simpleclans\_join\_date% | DATE | Month, Day, Year, Hour | |
| %simpleclans\_inactive\_days% | INTEGER | | |
| %simpleclans\_lastseen% | INTEGER | | |
| %simpleclans\_lastseendays% | INTEGER | | |
| %simpleclans\_tag% | STRING | lowerscored Clan tag without color | |
| %simpleclans\_tag\_label% | STRING | Clan tag with correct mayus, color and at the end &c | |
| %simpleclans\_rank% | STRING | | |
| %simpleclans\_rank\_displayname% | STRING | | |
| %simpleclans\_clanchat\_player\_color% | | | |
| %simpleclans\_allychat\_player\_color% | | | |
| %simpleclans\_clan\_total\_neutral% | INTEGER | | |
| %simpleclans\_clan\_total\_civilian% | INTEGER | | |
| %simpleclans\_clan\_total\_rival% | INTEGER | | |
| %simpleclans\_clan\_total\_kills% | INTEGER | | |
| %simpleclans\_clan\_total\_deaths% | INTEGER | | |
| %simpleclans\_clan\_total\_kdr% | FLOAT | | |
| %simpleclans\_clan\_average\_wk% | INTEGER | | |
| %simpleclans\_clan\_leader\_size% | INTEGER | | |
| %simpleclans\_clan\_balance% | INTEGER | | |
| %simpleclans\_clan\_allow\_withdraw% | BOOLEAN \(YES/NO\) | | |
| %simpleclans\_clan\_allow\_deposit% | BOOLEAN \(YES/NO\) | | |
| %simpleclans\_clan\_size% | INTEGER | | |
| %simpleclans\_clan\_name% | STRING | | |
| %simpleclans\_clan\_color\_tag% | | | |
| %simpleclans\_clan\_tag% | | | |
| %simpleclans\_clan\_founded% | | | |
| %simpleclans\_clan\_friendly\_fire% | | | |
| %simpleclans\_clan\_is\_unrivable% | | | |
| %simpleclans\_clan\_is\_anyonline% | | | |
| %simpleclans\_clan\_is\_verified% | | | |
| %simpleclans\_clan\_capeurl% | | | |
| %simpleclans\_clan\_inactivedays% | | | |
| %simpleclans\_clan\_onlinemembers\_count% | | | |
| %simpleclans\_clan\_allies\_count% | | | |
| %simpleclans\_clan\_rivals\_count% | | | |
| %simpleclanstopclans\_\#\_clan\_total\_neutral% | | | |
| %simpleclanstopclans\_\#\_clan\_total\_civilian% | | | |
| %simpleclanstopclans\_\#\_clan\_total\_rival% | | | |
| %simpleclanstopclans\_\#\_clan\_total\_kills% | | | |
| %simpleclanstopclans\_\#\_clan\_total\_deaths% | | | |
| %simpleclanstopclans\_\#\_clan\_total\_kdr% | | | |
| %simpleclanstopclans\_\#\_clan\_average\_wk% | | | |
| %simpleclanstopclans\_\#\_clan\_leader\_size% | | | |
| %simpleclanstopclans\_\#\_clan\_balance% | | | |
| %simpleclanstopclans\_\#\_clan\_allow\_withdraw% | | | |
| %simpleclanstopclans\_\#\_clan\_allow\_deposit% | | | |
| %simpleclanstopclans\_\#\_clan\_size% | | | |
| %simpleclanstopclans\_\#\_clan\_name% | | | |
| %simpleclanstopclans\_\#\_clan\_color\_tag% | | | |
| %simpleclanstopclans\_\#\_clan\_tag% | | | |
| %simpleclanstopclans\_\#\_clan\_founded% | | | |
| %simpleclanstopclans\_\#\_clan\_friendly\_fire% | | | |
| %simpleclanstopclans\_\#\_clan\_is\_unrivable% | | | |
| %simpleclanstopclans\_\#\_clan\_is\_anyonline% | | | |
| %simpleclanstopclans\_\#\_clan\_is\_verified% | | | |
| %simpleclanstopclans\_\#\_clan\_capeurl% | | | |
| %simpleclanstopclans\_\#\_clan\_inactivedays% | | | |
| %simpleclanstopclans\_\#\_clan\_onlinemembers\_count% | | | |
| %simpleclanstopclans\_\#\_clan\_allies\_count% | | | |
| %simpleclanstopclans\_\#\_clan\_rivals\_count% | | | |
## Топ кланов
Топ кланов – это группа placeholder'ов, благодаря которой вы можете создавать свои таблицы лидеров. \
\
Для этого необходимо обратиться к списку выше, взять один из существующих `%simpleclanstopclans_#%`, но вместо `#` добавить `_topclans_#_`, где # – номер позиции клана.\
\
Пример.:\
`%simpleclans_topclans_1_clan_name%` – вернёт клан с именем, находящийся на первой позиции.
## Топ игроков
Другая группа placeholder'ов позволяет создать таблицу лидеров игроков. Принцип схож с топом кланов.\
\
Добавьте `_topplayers_#_` к существующему placeholder'у игроков, чтобы получить значение для указанной позиции.\
\
Пример:\
`%simpleclans_topplayers_2_tag_label%` – Возвращает полный тег клана игрока, находящегося на второй позиции.
#### HolographicDisplays
Чтобы использовать топы (таблицы лидеров) с HolographicDisplays, помните об [установке ](https://www.spigotmc.org/resources/holographicextension.18461/)расширения.
+44 -139
View File
@@ -1,156 +1,61 @@
---
description: >-
Эта страница поможет вам разобраться в том, как установить и использовать
SimpleClans API в своих плагинах.
description: null
---
# ♟️ SimpleClans API
# SimpleClans API Example
## Шаг 1. Добавьте SimpleClans API в свой плагин
You can hook into SimpleClans plugin like so:
Сделать это можно двумя способами: через Maven или локально.\
Мы настоятельно **рекомендуем** делать это через Maven.
### Maven
Добавьте следующие строки в `pom.xml`:
```markup
<repositories>
<repository>
<id>roinujnosde-repo</id>
<url>https://repo.roinujnosde.me/releases/</url>
</repository>
</repositories>
```
```markup
<dependencies>
<dependency>
<groupId>net.sacredlabyrinth.phaed.simpleclans</groupId>
<artifactId>SimpleClans</artifactId>
<version>2.19.2</version>
<!-- Вы можете узнать последнюю доступную версию в заметке ниже -->
<scope>provided</scope>
</dependency>
</dependencies>
```
{% hint style="info" %}
**Заметка**\
Последнюю версию можно узнать тут: [ссылка](https://github.com/RoinujNosde/SimpleClans/releases)
{% endhint %}
### Локально
В указаном примере мы будем использовать IntelliJ IDEA, но последующие действия также работают и в других IDE.
1. Откройте структуру вашего проекта (`F4`)
2. Выберите пункт Libraries, кликните на крестик, в появившемся окошке выбираем "New Project Library -> Java" и добавляем SimpleClans.
![](<../.gitbook/assets/izobrazhenie (4).png>)
Возвращаемся к структуре проекта, дальше заходим в Project Settings -> Modules, ставим режим компиляции "Provided".
![](<../.gitbook/assets/izobrazhenie (5) (1).png>)
* [x] Поздравляю, вы поставили SimpleClans API в свой проект. 😃
## Шаг 2. Используйте SimpleClans API
#### Что вам нужно знать?
* **ClanPlayer –** это класс, представляющий из себя объект игрока. В этом классе содержится информация об игроке, его клане и др.
* **Clan –** это класс, презентующий объект клана. В нём имеется методы для получения игроков клана, тега клана, союзников, лидеров и др.
* **ClanManager –** это класс, позволяющий получить **Clan** и **ClanPlayer.**
#### Пример использования SimpleClans
Вы можете использовать плагин SimpleClans вот так:
{% tabs %}
{% tab title="MyPlugin.class" %}
```java
public class MyPlugin extends JavaPlugin {
private static SimpleClans sc;
@Override
public void onEnable() {
Plugin plug = getServer().getPluginManager().getPlugin("SimpleClans");
if (plug != null) {
sc = (SimpleClans) plug;
}
}
public static getSimpleClans() {
return sc;
}
}
```
{% endtab %}
private SimpleClans sc;
{% tab title="Example.class" %}
```java
public class Example {
public void onEnable()
{
Plugin plug = getServer().getPluginManager().getPlugin("SimpleClans");
public void doClanStuff(Player player) {
UUID playerUuid = player.getUniqueId();
// Получение клана игрока
ClanPlayer cp = MyPlugin.getSimpleClans().getClanManager().getClanPlayer(playerUuid);
if (cp != null) {
Clan clan = cp.getClan();
} else {
// Игрок не является участником какого-либо клана
}
// Получение клана из клан тега
Clan clan = MyPlugin.getSimpleClans().getClanManager().getClan("staff");
if (clan != null) {
// Клан существует
}
}
}
```
{% endtab %}
{% endtabs %}
В случае, если вы не хотите указывать проверку на наличие плагина, вы всегда можете указать зависимость в `plugin.yml`:
{% tabs %}
{% tab title="plugin.yml" %}
```yaml
depend:
- SimpleClans
```
{% endtab %}
{% tab title="Example.class" %}
```java
public class Example {
public void doClanStuff(Player player)
if (plug != null)
{
sc = ((SimpleClans) plug);
}
}
```
```java
public void doClanStuff(Player player)
{
// get a player's clan
if (sc != null)
{
SimpleClans sc = SimpleClans.getInstance();
// Получение клана игрока
ClanPlayer cp = sc.getClanManager().getClanPlayer(player.getUniqueId());
if (cp != null) {
if (cp != null)
{
Clan clan = cp.getClan();
} else {
// Игрок не является участником какого-либо клана
}
// Получение клана из клан тега
else
{
// player is not in a clan
}
}
// get a clan from a clan tag
if (sc != null)
{
Clan clan = sc.getClanManager().getClan("staff");
if (clan != null) {
// Клан существует
if (clan != null)
{
// clan exists
}
}
}
```
{% endtab %}
{% endtabs %}
Every player has a **ClanPlayer** object which holds all his information, including his clan, and can be used to perform various operations on the player.
The **Clan** object holds all the information for a clan and can be used to perform various operations on the clan.
The **ClanManager** holds all the **Clans** and **ClanPlayers** and contains methods that allow you to retrieve them.