mirror of
https://github.com/YouHaveTrouble/PreventStabby.git
synced 2026-05-12 05:16:55 +00:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| bea0d9c7df | |||
| 0eccf1b1af | |||
| 2669c538cd | |||
| 36861084cc | |||
| f182c2c859 | |||
| 60b360f170 |
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
<groupId>me.youhavetrouble</groupId>
|
<groupId>me.youhavetrouble</groupId>
|
||||||
<artifactId>PreventStabby</artifactId>
|
<artifactId>PreventStabby</artifactId>
|
||||||
<version>1.3-pre1</version>
|
<version>1.3-pre4</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<name>PreventStabby</name>
|
<name>PreventStabby</name>
|
||||||
@@ -74,8 +74,12 @@
|
|||||||
<url>https://oss.sonatype.org/content/groups/public/</url>
|
<url>https://oss.sonatype.org/content/groups/public/</url>
|
||||||
</repository>
|
</repository>
|
||||||
<repository>
|
<repository>
|
||||||
<id>jitpack.io</id>
|
<id>bs-repo</id>
|
||||||
<url>https://jitpack.io</url>
|
<url>https://ci.pluginwiki.us/plugin/repository/everything/</url>
|
||||||
|
</repository>
|
||||||
|
<repository>
|
||||||
|
<id>sk89q-repo</id>
|
||||||
|
<url>https://maven.enginehub.org/repo/</url>
|
||||||
</repository>
|
</repository>
|
||||||
</repositories>
|
</repositories>
|
||||||
|
|
||||||
@@ -98,10 +102,9 @@
|
|||||||
<version>0.9.12</version>
|
<version>0.9.12</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.github.Thatsmusic99</groupId>
|
<groupId>com.github.thatsmusic99</groupId>
|
||||||
<artifactId>ConfigurationMaster</artifactId>
|
<artifactId>ConfigurationMaster</artifactId>
|
||||||
<version>v1.0-RC-2</version>
|
<version>v1.0.3</version>
|
||||||
<scope>compile</scope>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.bstats</groupId>
|
<groupId>org.bstats</groupId>
|
||||||
@@ -109,5 +112,11 @@
|
|||||||
<version>2.2.1</version>
|
<version>2.2.1</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.sk89q.worldguard</groupId>
|
||||||
|
<artifactId>worldguard-bukkit</artifactId>
|
||||||
|
<version>7.0.4-SNAPSHOT</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package me.youhavetrouble.preventstabby;
|
|||||||
|
|
||||||
import me.youhavetrouble.preventstabby.commands.MainCommand;
|
import me.youhavetrouble.preventstabby.commands.MainCommand;
|
||||||
import me.youhavetrouble.preventstabby.config.ConfigCache;
|
import me.youhavetrouble.preventstabby.config.ConfigCache;
|
||||||
|
import me.youhavetrouble.preventstabby.hooks.WorldGuardHook;
|
||||||
import me.youhavetrouble.preventstabby.players.PlayerManager;
|
import me.youhavetrouble.preventstabby.players.PlayerManager;
|
||||||
import me.youhavetrouble.preventstabby.players.SmartCache;
|
import me.youhavetrouble.preventstabby.players.SmartCache;
|
||||||
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
|
import me.youhavetrouble.preventstabby.util.PreventStabbyListener;
|
||||||
@@ -21,9 +22,9 @@ public final class PreventStabby extends JavaPlugin {
|
|||||||
|
|
||||||
@Getter private static PreventStabby plugin;
|
@Getter private static PreventStabby plugin;
|
||||||
private ConfigCache configCache;
|
private ConfigCache configCache;
|
||||||
protected PlayerManager playerManager;
|
private PlayerManager playerManager;
|
||||||
protected DatabaseSQLite sqLite;
|
private DatabaseSQLite sqLite;
|
||||||
protected SmartCache smartCache;
|
private SmartCache smartCache;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
@@ -68,6 +69,10 @@ public final class PreventStabby extends JavaPlugin {
|
|||||||
pvpCommand.setExecutor(mainCommand);
|
pvpCommand.setExecutor(mainCommand);
|
||||||
pvpCommand.setTabCompleter(mainCommand);
|
pvpCommand.setTabCompleter(mainCommand);
|
||||||
|
|
||||||
|
try {
|
||||||
|
WorldGuardHook.init();
|
||||||
|
} catch (NoClassDefFoundError ignored) {}
|
||||||
|
|
||||||
Metrics metrics = new Metrics(this, 10597);
|
Metrics metrics = new Metrics(this, 10597);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,7 +83,7 @@ public final class PreventStabby extends JavaPlugin {
|
|||||||
public void reloadPluginConfig(CommandSender commandSender) {
|
public void reloadPluginConfig(CommandSender commandSender) {
|
||||||
getServer().getScheduler().runTaskAsynchronously(this, () -> {
|
getServer().getScheduler().runTaskAsynchronously(this, () -> {
|
||||||
reloadPluginConfig();
|
reloadPluginConfig();
|
||||||
commandSender.sendMessage("TogglePvP configuration reloaded.");
|
commandSender.sendMessage("PreventStabby configuration reloaded.");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ public class HelpCommand {
|
|||||||
|
|
||||||
List<String> helpPage = new ArrayList<>();
|
List<String> helpPage = new ArrayList<>();
|
||||||
|
|
||||||
helpPage.add(PluginMessages.parseMessage("&b&m &bTogglePvP Help&b&m "));
|
helpPage.add(PluginMessages.parseMessage("&b&m &bPreventStabby Help&b&m "));
|
||||||
helpPage.add(PluginMessages.parseMessage("&9/pvp &b&lhelp &f- shows this message"));
|
helpPage.add(PluginMessages.parseMessage("&9/pvp &b&lhelp &f- shows this message"));
|
||||||
if (sender.hasPermission("preventstabby.command.toggle")) {
|
if (sender.hasPermission("preventstabby.command.toggle")) {
|
||||||
helpPage.add(PluginMessages.parseMessage("&9/pvp &b&l[on/off] &f- enables or disables PvP"));
|
helpPage.add(PluginMessages.parseMessage("&9/pvp &b&l[on/off] &f- enables or disables PvP"));
|
||||||
|
|||||||
@@ -0,0 +1,74 @@
|
|||||||
|
package me.youhavetrouble.preventstabby.hooks;
|
||||||
|
|
||||||
|
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
||||||
|
import com.sk89q.worldedit.util.Location;
|
||||||
|
import com.sk89q.worldguard.LocalPlayer;
|
||||||
|
import com.sk89q.worldguard.WorldGuard;
|
||||||
|
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
|
||||||
|
import com.sk89q.worldguard.protection.ApplicableRegionSet;
|
||||||
|
import com.sk89q.worldguard.protection.flags.Flag;
|
||||||
|
import com.sk89q.worldguard.protection.flags.StateFlag;
|
||||||
|
import com.sk89q.worldguard.protection.flags.registry.FlagConflictException;
|
||||||
|
import com.sk89q.worldguard.protection.flags.registry.FlagRegistry;
|
||||||
|
import com.sk89q.worldguard.protection.regions.RegionContainer;
|
||||||
|
import com.sk89q.worldguard.protection.regions.RegionQuery;
|
||||||
|
import me.youhavetrouble.preventstabby.PreventStabby;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.plugin.Plugin;
|
||||||
|
|
||||||
|
public class WorldGuardHook {
|
||||||
|
|
||||||
|
private static WorldGuardPlugin worldGuardPlugin;
|
||||||
|
private static FlagRegistry flagRegistry;
|
||||||
|
public static StateFlag FORCE_PVP_FLAG;
|
||||||
|
|
||||||
|
|
||||||
|
public static void init() {
|
||||||
|
PreventStabby plugin = PreventStabby.getPlugin();
|
||||||
|
try {
|
||||||
|
Class.forName("com.sk89q.worldguard.protection.flags.registry.FlagConflictException");
|
||||||
|
worldGuardPlugin = WorldGuardPlugin.inst();
|
||||||
|
if (WorldGuard.getInstance() == null || worldGuardPlugin == null) return;
|
||||||
|
plugin.getLogger().info("Hooking into WorldGuard");
|
||||||
|
flagRegistry = WorldGuard.getInstance().getFlagRegistry();
|
||||||
|
createForcePvpFlag(plugin);
|
||||||
|
} catch (NoClassDefFoundError | ClassNotFoundException e) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void createForcePvpFlag(Plugin plugin) {
|
||||||
|
if (!isHooked()) return;
|
||||||
|
if (flagRegistry == null) return;
|
||||||
|
String flagName = "preventstabby-force-pvp";
|
||||||
|
try {
|
||||||
|
StateFlag flag = new StateFlag(flagName, false);
|
||||||
|
flagRegistry.register(flag);
|
||||||
|
FORCE_PVP_FLAG = flag;
|
||||||
|
} catch (FlagConflictException e) {
|
||||||
|
Flag<?> existing = flagRegistry.get(flagName);
|
||||||
|
if (existing instanceof StateFlag) {
|
||||||
|
FORCE_PVP_FLAG = (StateFlag) existing;
|
||||||
|
} else {
|
||||||
|
plugin.getLogger().severe("There is a conflict between flag names!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isPlayerForcedToPvp(Player player) {
|
||||||
|
if (!isHooked()) return false;
|
||||||
|
RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
|
||||||
|
RegionQuery query = container.createQuery();
|
||||||
|
org.bukkit.Location loc = player.getLocation();
|
||||||
|
LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer(player);
|
||||||
|
ApplicableRegionSet set = query.getApplicableRegions(new Location(BukkitAdapter.adapt(loc.getWorld()), loc.getX(), loc.getY(), loc.getZ()));
|
||||||
|
return set.testState(localPlayer, FORCE_PVP_FLAG);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isHooked() {
|
||||||
|
return worldGuardPlugin != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
+1
-1
@@ -26,7 +26,7 @@ public class PlayerJoinAndLeaveListener implements Listener {
|
|||||||
PlayerData playerData = PreventStabby.getPlugin().getPlayerManager().getPlayer(player.getUniqueId());
|
PlayerData playerData = PreventStabby.getPlugin().getPlayerManager().getPlayer(player.getUniqueId());
|
||||||
long time = Instant.now().getEpochSecond();
|
long time = Instant.now().getEpochSecond();
|
||||||
if (playerData == null) {
|
if (playerData == null) {
|
||||||
PreventStabby.getPlugin().getPlayerManager().addPlayer(uuid, new PlayerData(false));
|
PreventStabby.getPlugin().getPlayerManager().addPlayer(uuid, new PlayerData(uuid,false));
|
||||||
Bukkit.getScheduler().runTaskAsynchronously(PreventStabby.getPlugin(), () -> {
|
Bukkit.getScheduler().runTaskAsynchronously(PreventStabby.getPlugin(), () -> {
|
||||||
PlayerData data = PreventStabby.getPlugin().getSqLite().getPlayerInfo(uuid);
|
PlayerData data = PreventStabby.getPlugin().getSqLite().getPlayerInfo(uuid);
|
||||||
PreventStabby.getPlugin().getPlayerManager().addPlayer(uuid, data);
|
PreventStabby.getPlugin().getPlayerManager().addPlayer(uuid, data);
|
||||||
|
|||||||
@@ -7,11 +7,12 @@ import java.util.UUID;
|
|||||||
|
|
||||||
public class PlayerData {
|
public class PlayerData {
|
||||||
|
|
||||||
private UUID playerUuid;
|
private final UUID playerUuid;
|
||||||
private long cachetime, combattime, loginTimestamp, teleportTimestamp;
|
private long cachetime, combattime, loginTimestamp, teleportTimestamp;
|
||||||
private boolean pvpEnabled, lastCombatCheck, inCombat;
|
private boolean pvpEnabled, lastCombatCheck, inCombat;
|
||||||
|
|
||||||
public PlayerData(boolean pvpEnabled) {
|
public PlayerData(UUID playerUuid, boolean pvpEnabled) {
|
||||||
|
this.playerUuid = playerUuid;
|
||||||
this.pvpEnabled = pvpEnabled;
|
this.pvpEnabled = pvpEnabled;
|
||||||
this.combattime = Instant.now().getEpochSecond()-1;
|
this.combattime = Instant.now().getEpochSecond()-1;
|
||||||
this.loginTimestamp = Instant.now().getEpochSecond()-1;
|
this.loginTimestamp = Instant.now().getEpochSecond()-1;
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package me.youhavetrouble.preventstabby.players;
|
|||||||
import me.youhavetrouble.preventstabby.PreventStabby;
|
import me.youhavetrouble.preventstabby.PreventStabby;
|
||||||
import me.youhavetrouble.preventstabby.api.event.PlayerLeaveCombatEvent;
|
import me.youhavetrouble.preventstabby.api.event.PlayerLeaveCombatEvent;
|
||||||
import me.youhavetrouble.preventstabby.config.ConfigCache;
|
import me.youhavetrouble.preventstabby.config.ConfigCache;
|
||||||
|
import me.youhavetrouble.preventstabby.hooks.WorldGuardHook;
|
||||||
import me.youhavetrouble.preventstabby.util.CombatTimer;
|
import me.youhavetrouble.preventstabby.util.CombatTimer;
|
||||||
import me.youhavetrouble.preventstabby.util.PluginMessages;
|
import me.youhavetrouble.preventstabby.util.PluginMessages;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
@@ -36,8 +37,7 @@ public class PlayerManager {
|
|||||||
if (!CombatTimer.isInCombat(uuid)) {
|
if (!CombatTimer.isInCombat(uuid)) {
|
||||||
if (playerData.getLastCombatCheck()) {
|
if (playerData.getLastCombatCheck()) {
|
||||||
Player player = Bukkit.getPlayer(uuid);
|
Player player = Bukkit.getPlayer(uuid);
|
||||||
if (player == null)
|
if (player == null) continue;
|
||||||
return;
|
|
||||||
PlayerLeaveCombatEvent playerLeaveCombatEvent = new PlayerLeaveCombatEvent(player);
|
PlayerLeaveCombatEvent playerLeaveCombatEvent = new PlayerLeaveCombatEvent(player);
|
||||||
Bukkit.getScheduler().runTask(PreventStabby.getPlugin(), () -> {
|
Bukkit.getScheduler().runTask(PreventStabby.getPlugin(), () -> {
|
||||||
Bukkit.getPluginManager().callEvent(playerLeaveCombatEvent);
|
Bukkit.getPluginManager().callEvent(playerLeaveCombatEvent);
|
||||||
@@ -111,25 +111,25 @@ public class PlayerManager {
|
|||||||
|
|
||||||
public boolean canDamage(UUID attacker, UUID victim, boolean sendDenyMessage, boolean checkVictimSpawnProtection) {
|
public boolean canDamage(UUID attacker, UUID victim, boolean sendDenyMessage, boolean checkVictimSpawnProtection) {
|
||||||
|
|
||||||
if (hasLoginProtection(attacker) || hasTeleportProtection(attacker))
|
if (hasLoginProtection(attacker) || hasTeleportProtection(attacker)) return false;
|
||||||
return false;
|
|
||||||
|
|
||||||
if (checkVictimSpawnProtection && hasLoginProtection(victim))
|
if (checkVictimSpawnProtection && hasLoginProtection(victim)) return false;
|
||||||
return false;
|
|
||||||
|
|
||||||
if (checkVictimSpawnProtection && hasTeleportProtection(victim))
|
if (checkVictimSpawnProtection && hasTeleportProtection(victim)) return false;
|
||||||
return false;
|
|
||||||
|
|
||||||
SmartCache smartCache = PreventStabby.getPlugin().getSmartCache();
|
SmartCache smartCache = PreventStabby.getPlugin().getSmartCache();
|
||||||
|
|
||||||
if (!smartCache.getPlayerData(attacker).isPvpEnabled()) {
|
Player attackerPlayer = Bukkit.getPlayer(attacker);
|
||||||
|
Player victimPlayer = Bukkit.getPlayer(victim);
|
||||||
|
|
||||||
|
if (!smartCache.getPlayerData(attacker).isPvpEnabled() && (attackerPlayer != null && !isInForcedPvpRegion(attackerPlayer))) {
|
||||||
if (sendDenyMessage) {
|
if (sendDenyMessage) {
|
||||||
ConfigCache config = PreventStabby.getPlugin().getConfigCache();
|
ConfigCache config = PreventStabby.getPlugin().getConfigCache();
|
||||||
PluginMessages.sendActionBar(attacker, config.getCannot_attack_attacker());
|
PluginMessages.sendActionBar(attacker, config.getCannot_attack_attacker());
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!smartCache.getPlayerData(victim).isPvpEnabled()) {
|
if (!smartCache.getPlayerData(victim).isPvpEnabled() && (victimPlayer != null && !isInForcedPvpRegion(victimPlayer))) {
|
||||||
if (sendDenyMessage) {
|
if (sendDenyMessage) {
|
||||||
ConfigCache config = PreventStabby.getPlugin().getConfigCache();
|
ConfigCache config = PreventStabby.getPlugin().getConfigCache();
|
||||||
PluginMessages.sendActionBar(attacker, config.getCannot_attack_victim());
|
PluginMessages.sendActionBar(attacker, config.getCannot_attack_victim());
|
||||||
@@ -157,4 +157,9 @@ public class PlayerManager {
|
|||||||
return Instant.now().getEpochSecond() < smartCache.getPlayerData(uuid).getTeleportTimestamp();
|
return Instant.now().getEpochSecond() < smartCache.getPlayerData(uuid).getTeleportTimestamp();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isInForcedPvpRegion(Player player) {
|
||||||
|
if (!WorldGuardHook.isHooked()) return false;
|
||||||
|
return WorldGuardHook.isPlayerForcedToPvp(player);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ public class SmartCache {
|
|||||||
return playerData;
|
return playerData;
|
||||||
} catch (NullPointerException ex) {
|
} catch (NullPointerException ex) {
|
||||||
// Return false if database call fails
|
// Return false if database call fails
|
||||||
return new PlayerData(false);
|
return new PlayerData(uuid,false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -53,7 +53,7 @@ public class SmartCache {
|
|||||||
PreventStabby.getPlugin().getPlayerManager().getPlayer(uuid).setPvpEnabled(state);
|
PreventStabby.getPlugin().getPlayerManager().getPlayer(uuid).setPvpEnabled(state);
|
||||||
}
|
}
|
||||||
// Update the database aswell
|
// Update the database aswell
|
||||||
PreventStabby.getPlugin().getSqLite().updatePlayerInfo(uuid, new PlayerData(state));
|
PreventStabby.getPlugin().getSqLite().updatePlayerInfo(uuid, new PlayerData(uuid, state));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -64,12 +64,12 @@ public class DatabaseSQLite {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Statement statement = conn.createStatement();
|
Statement statement = conn.createStatement();
|
||||||
String sql = "SELECT * FROM `players` WHERE `player_uuid` = '" + uuid.toString() + "';";
|
String sql = "SELECT * FROM `players` WHERE `player_uuid` = '" + uuid + "';";
|
||||||
statement.execute(sql);
|
statement.execute(sql);
|
||||||
ResultSet result = statement.getResultSet();
|
ResultSet result = statement.getResultSet();
|
||||||
boolean state = result.getBoolean("pvpenabled");
|
boolean state = result.getBoolean("pvpenabled");
|
||||||
conn.close();
|
conn.close();
|
||||||
return new PlayerData(state);
|
return new PlayerData(uuid, state);
|
||||||
} catch (SQLException throwables) {
|
} catch (SQLException throwables) {
|
||||||
throwables.printStackTrace();
|
throwables.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,14 +45,16 @@ public class Util {
|
|||||||
|
|
||||||
Set<UUID> playerPassengersWithPvpEnabled = new HashSet<>();
|
Set<UUID> playerPassengersWithPvpEnabled = new HashSet<>();
|
||||||
|
|
||||||
|
boolean hasPlayerPassengers = false;
|
||||||
for (Entity passenger : mount.getPassengers()) {
|
for (Entity passenger : mount.getPassengers()) {
|
||||||
if (!(passenger instanceof Player)) continue;
|
if (!(passenger instanceof Player)) continue;
|
||||||
Player player = (Player) passenger;
|
Player player = (Player) passenger;
|
||||||
|
hasPlayerPassengers = true;
|
||||||
if (PreventStabby.getPlugin().getPlayerManager().getPlayerPvPState(player.getUniqueId()))
|
if (PreventStabby.getPlugin().getPlayerManager().getPlayerPvPState(player.getUniqueId()))
|
||||||
playerPassengersWithPvpEnabled.add(player.getUniqueId());
|
playerPassengersWithPvpEnabled.add(player.getUniqueId());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (playerPassengersWithPvpEnabled.isEmpty()) {
|
if (hasPlayerPassengers && playerPassengersWithPvpEnabled.isEmpty()) {
|
||||||
PluginMessages.sendActionBar(attacker, config.getCannot_attack_mounts_victim());
|
PluginMessages.sendActionBar(attacker, config.getCannot_attack_mounts_victim());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,14 @@
|
|||||||
name: TogglePvP
|
name: PreventStabby
|
||||||
version: ${project.version}
|
version: ${project.version}
|
||||||
main: eu.endermite.togglepvp.PreventStabby
|
main: me.youhavetrouble.preventstabby.PreventStabby
|
||||||
authors: [YouHaveTrouble]
|
authors: [YouHaveTrouble]
|
||||||
api-version: 1.13
|
api-version: 1.13
|
||||||
description: Stop people from getting stabbed!
|
description: Stop people from getting stabbed!
|
||||||
|
soft-depend:
|
||||||
|
- WorldGuard
|
||||||
commands:
|
commands:
|
||||||
preventstabby:
|
preventstabby:
|
||||||
|
permission: preventstabby.command
|
||||||
aliases:
|
aliases:
|
||||||
- pvp
|
- pvp
|
||||||
permissions:
|
permissions:
|
||||||
|
|||||||
Reference in New Issue
Block a user