mirror of
https://github.com/AtlasMediaGroup/TotalFreedomMod.git
synced 2025-07-01 04:26:42 +00:00
Compare commits
58 Commits
RELEASE-20
...
FS-308
Author | SHA1 | Date | |
---|---|---|---|
618d5c5ecb | |||
62529a6171 | |||
0caf972248 | |||
a37364d07e | |||
4ac9844534 | |||
939e98b759 | |||
d99f3e657b | |||
92bbb62379 | |||
e4a0943af2 | |||
36bd8c0fad | |||
d77f59435b | |||
a08fd2afb6 | |||
6fd075fe96 | |||
f57fc56f4a | |||
a6ca6b122c | |||
064e73f58b | |||
32138b2e59 | |||
e1c3bad4d0 | |||
4e78027f0c | |||
721f4f9fc3 | |||
24ad2611a9 | |||
c238f251f2 | |||
02848e3439 | |||
9550f54e2b | |||
39dade78e3 | |||
5b6d8b01a4 | |||
96bc83cead | |||
be700a90ce | |||
6d1fce1716 | |||
d3665f31fe | |||
4188cb80fa | |||
62fe72d99b | |||
f4749559d2 | |||
ed815794ed | |||
0c12a19d1d | |||
96d47e8e0c | |||
3027e2a18c | |||
06025b2e69 | |||
da7e8f64aa | |||
17b051e2a7 | |||
77a05f22a8 | |||
5c3ef1f107 | |||
53c5991971 | |||
ff760a6c11 | |||
63069ff9ec | |||
5e63b71861 | |||
b72782de4f | |||
de9556c550 | |||
6590504545 | |||
8d1e8dcf05 | |||
07b5076717 | |||
6fb9507a4c | |||
879a524bb4 | |||
c60b451ce7 | |||
f85f3e32ea | |||
57b3351047 | |||
dd10eb3f5e | |||
a498104777 |
19
.github/dependabot.yml
vendored
Normal file
19
.github/dependabot.yml
vendored
Normal file
@ -0,0 +1,19 @@
|
||||
# To get started with Dependabot version updates, you'll need to specify which
|
||||
# package ecosystems to update and where the package manifests are located.
|
||||
# Please see the documentation for all configuration options:
|
||||
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||
|
||||
version: 2
|
||||
updates:
|
||||
|
||||
# Maintain Maven Updates
|
||||
- package-ecosystem: "maven" # See documentation for possible values
|
||||
directory: "/" # Location of package manifests
|
||||
schedule:
|
||||
interval: "daily"
|
||||
|
||||
# Maintain dependencies for GitHub Actions
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "daily"
|
12
.github/workflows/maven.yml
vendored
12
.github/workflows/maven.yml
vendored
@ -8,10 +8,20 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
# Java 11 Builds
|
||||
- uses: actions/checkout@v1
|
||||
- name: Set up JDK 1.8
|
||||
- name: Set up JDK 11
|
||||
uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: 11
|
||||
- name: Build with Maven
|
||||
run: mvn -B package --file pom.xml
|
||||
|
||||
# Java 16 Builds
|
||||
- uses: actions/checkout@v1
|
||||
- name: Set up JDK 16
|
||||
uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: 16
|
||||
- name: Build with Maven
|
||||
run: mvn -B package --file pom.xml
|
||||
|
13
.travis.yml
13
.travis.yml
@ -1,13 +0,0 @@
|
||||
language: java
|
||||
jdk:
|
||||
- oraclejdk11
|
||||
- openjdk11
|
||||
notifications:
|
||||
email: false
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- sshpass
|
||||
script: mvn clean install
|
||||
after_success:
|
||||
- ./travis-upload.sh
|
@ -1,4 +1,4 @@
|
||||
# TotalFreedomMod [](https://travis-ci.com/AtlasMediaGroup/TotalFreedomMod) [](https://www.codacy.com/gh/AtlasMediaGroup/TotalFreedomMod/dashboard?utm_source=github.com&utm_medium=referral&utm_content=AtlasMediaGroup/TotalFreedomMod&utm_campaign=Badge_Grade)
|
||||
# TotalFreedomMod [](https://github.com/AtlasMediaGroup/TotalFreedomMod/actions/workflows/maven.yml) [](https://www.codacy.com/gh/AtlasMediaGroup/TotalFreedomMod/dashboard?utm_source=github.com&utm_medium=referral&utm_content=AtlasMediaGroup/TotalFreedomMod&utm_campaign=Badge_Grade) [](https://github.com/AtlasMediaGroup/TotalFreedomMod/actions/workflows/codeql-analysis.yml)
|
||||
|
||||
TotalFreedomMod is a CraftBukkit server plugin designed primarily to support the [Official TotalFreedom Minecraft Server](https://totalfreedom.me/). However, you are more than welcome to adapt the source for your own server.
|
||||
|
||||
@ -14,4 +14,4 @@ For information on our security policy and reporting an issue, please see [SECUR
|
||||
|
||||
### Compiling
|
||||
|
||||
You need Maven to build. You'd also need to set the JDK version to Java 8 as that is the current standard as of now.
|
||||
You need Maven to build. You'd also need to set the JDK version to Java 11 as that is the current standard as of now.
|
||||
|
17
pom.xml
17
pom.xml
@ -105,11 +105,6 @@
|
||||
<url>https://papermc.io/repo/repository/maven-public/</url>
|
||||
</repository>
|
||||
|
||||
<repository>
|
||||
<id>rayzr-repo</id>
|
||||
<url>https://cdn.rawgit.com/Rayzr522/maven-repo/master/</url>
|
||||
</repository>
|
||||
|
||||
<repository>
|
||||
<id>ess-repo</id>
|
||||
<url>https://ci.ender.zone/plugin/repository/everything/</url>
|
||||
@ -168,9 +163,9 @@
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.github.TotalFreedomMC</groupId>
|
||||
<groupId>com.github.AtlasMediaGroup</groupId>
|
||||
<artifactId>TF-LibsDisguises</artifactId>
|
||||
<version>48f01cf2fe</version>
|
||||
<version>5a340341b0</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
@ -216,13 +211,6 @@
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>me.rayzr522</groupId>
|
||||
<artifactId>jsonmessage</artifactId>
|
||||
<version>1.0.0</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.github.vexsoftware</groupId>
|
||||
<artifactId>votifier</artifactId>
|
||||
@ -454,7 +442,6 @@
|
||||
<include>commons-codec:commons-codec</include>
|
||||
<include>org.reflections:reflections</include>
|
||||
<include>org.javassist:javassist</include>
|
||||
<include>me.rayzr522:jsonmessage</include>
|
||||
<include>io.papermc:paperlib</include>
|
||||
<include>com.github.speedxx:Mojangson</include>
|
||||
<include>org.bstats:bstats-bukkit</include>
|
||||
|
@ -85,6 +85,10 @@ public class AutoEject extends FreedomService
|
||||
player.kickPlayer(kickMessage);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
FLog.warning("Unrecognized EjectMethod " + method.name() + " found, defaulting to STRIKE_THREE");
|
||||
}
|
||||
case STRIKE_THREE:
|
||||
{
|
||||
plugin.bm.addBan(Ban.forPlayerFuzzy(player, Bukkit.getConsoleSender(), null, kickMessage));
|
||||
|
@ -25,11 +25,6 @@ public class CommandSpy extends FreedomService
|
||||
{
|
||||
if (plugin.al.isAdmin(player) && plugin.al.getAdmin(player).getCommandSpy())
|
||||
{
|
||||
if (plugin.al.isAdmin(event.getPlayer()) && !plugin.al.isSeniorAdmin(player))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (player != event.getPlayer())
|
||||
{
|
||||
FUtil.playerMsg(player, event.getPlayer().getName() + ": " + event.getMessage());
|
||||
|
@ -2,6 +2,8 @@ package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.util.Groups;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.World;
|
||||
@ -33,7 +35,10 @@ public class EntityWiper extends FreedomService
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
wipeEntities(false);
|
||||
if (ConfigEntry.AUTO_ENTITY_WIPE.getBoolean())
|
||||
{
|
||||
wipeEntities(false);
|
||||
}
|
||||
}
|
||||
}.runTaskTimer(plugin, 600L, 600L); // 30 second delay after startup + run every 30 seconds
|
||||
}
|
||||
|
@ -4,7 +4,6 @@ import io.papermc.lib.PaperLib;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.regex.Pattern;
|
||||
import me.rayzr522.jsonmessage.JSONMessage;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||
|
@ -43,6 +43,7 @@ public class IndefiniteBan implements IConfig
|
||||
@Override
|
||||
public void saveTo(ConfigurationSection cs)
|
||||
{
|
||||
// The indefinite ban list is only intended to be modified manually. It is not intended to save.
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -171,6 +171,11 @@ public class BlockBlocker extends FreedomService
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
// Do nothing
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (Groups.BANNERS.contains(event.getBlockPlaced().getType()))
|
||||
|
@ -36,10 +36,9 @@ public class InteractBlocker extends FreedomService
|
||||
break;
|
||||
}
|
||||
|
||||
case LEFT_CLICK_AIR:
|
||||
case LEFT_CLICK_BLOCK:
|
||||
default:
|
||||
{
|
||||
//
|
||||
// Do nothing
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -158,6 +157,11 @@ public class InteractBlocker extends FreedomService
|
||||
event.setCancelled(true);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
// Do nothing
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,6 +1,8 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.punishments.Punishment;
|
||||
import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.ChatColor;
|
||||
@ -75,9 +77,11 @@ public class Command_blockcmd extends FreedomCommand
|
||||
FPlayer playerdata = plugin.pl.getPlayer(player);
|
||||
if (!playerdata.allCommandsBlocked())
|
||||
{
|
||||
playerdata.setCommandsBlocked(true);
|
||||
FUtil.adminAction(sender.getName(), "Blocking all commands for " + player.getName(), true);
|
||||
playerdata.setCommandsBlocked(true);
|
||||
msg("Blocked commands for " + player.getName() + ".");
|
||||
|
||||
plugin.pul.logPunishment(new Punishment(player.getName(), FUtil.getIp(player), sender.getName(), PunishmentType.BLOCKCMD, null));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1,6 +1,8 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.punishments.Punishment;
|
||||
import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.apache.commons.lang.ArrayUtils;
|
||||
@ -128,6 +130,8 @@ public class Command_blockedit extends FreedomCommand
|
||||
|
||||
msg(player2, "Your block modification abilities have been blocked.", ChatColor.RED);
|
||||
msg("Blocked all block modification abilities for " + player2.getName());
|
||||
|
||||
plugin.pul.logPunishment(new Punishment(player2.getName(), FUtil.getIp(player2), sender.getName(), PunishmentType.BLOCKEDIT, null));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -1,6 +1,8 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.punishments.Punishment;
|
||||
import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.apache.commons.lang3.ArrayUtils;
|
||||
@ -125,6 +127,7 @@ public class Command_blockpvp extends FreedomCommand
|
||||
{
|
||||
Command_smite.smite(sender, p, reason);
|
||||
}
|
||||
plugin.pul.logPunishment(new Punishment(p.getName(), FUtil.getIp(p), sender.getName(), PunishmentType.BLOCKPVP, null));
|
||||
|
||||
msg(p, "Your PVP has been disabled.", ChatColor.RED);
|
||||
msg("Disabled PVP for " + p.getName());
|
||||
|
@ -5,6 +5,8 @@ import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.punishments.Punishment;
|
||||
import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.ChatColor;
|
||||
@ -65,6 +67,11 @@ public class Command_cage extends FreedomCommand
|
||||
outerMaterial = Material.PLAYER_HEAD;
|
||||
if (args.length >= 3)
|
||||
{
|
||||
if (!args[2].matches("([A-z]*)") || args[2].length() < 3 || args[2].length() > 16)
|
||||
{
|
||||
msg("Invalid name!", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
skullName = args[2];
|
||||
}
|
||||
else
|
||||
@ -75,17 +82,43 @@ public class Command_cage extends FreedomCommand
|
||||
}
|
||||
case "block":
|
||||
{
|
||||
if (Material.matchMaterial(args[2]) != null)
|
||||
if (args.length >= 3)
|
||||
{
|
||||
outerMaterial = Material.matchMaterial(args[2]);
|
||||
break;
|
||||
// Checks the validity of the Material and checks if it's a block.
|
||||
// This is incredibly inefficient, as Spigot's isBlock() method in Material is an actual
|
||||
// nightmare of switch-cases.
|
||||
if (Material.matchMaterial(args[2]) != null && Material.matchMaterial(args[2]).isBlock())
|
||||
{
|
||||
outerMaterial = Material.matchMaterial(args[2]);
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
msg("Invalid block!", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
msg("Invalid block!", ChatColor.RED);
|
||||
break;
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
default:
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (outerMaterial == Material.PLAYER_HEAD)
|
||||
{
|
||||
FUtil.adminAction(sender.getName(), "Caging " + player.getName() + " in " + skullName, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
FUtil.adminAction(sender.getName(), "Caging " + player.getName(), true);
|
||||
}
|
||||
|
||||
Location location = player.getLocation().clone().add(0.0, 1.0, 0.0);
|
||||
|
||||
if (skullName != null)
|
||||
@ -96,17 +129,9 @@ public class Command_cage extends FreedomCommand
|
||||
{
|
||||
fPlayer.getCageData().cage(location, outerMaterial, innerMaterial);
|
||||
}
|
||||
|
||||
player.setGameMode(GameMode.SURVIVAL);
|
||||
|
||||
if (outerMaterial == Material.PLAYER_HEAD)
|
||||
{
|
||||
FUtil.adminAction(sender.getName(), "Caging " + player.getName() + " in " + skullName, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
FUtil.adminAction(sender.getName(), "Caging " + player.getName(), true);
|
||||
}
|
||||
plugin.pul.logPunishment(new Punishment(player.getName(), FUtil.getIp(player), sender.getName(), PunishmentType.CAGE, null));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -8,7 +8,7 @@ import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Clears the chat.", usage = "/<command>", aliases = "cc")
|
||||
public class Command_clearchat extends FreedomCommand
|
||||
public class Command_cleanchat extends FreedomCommand
|
||||
{
|
||||
|
||||
@Override
|
@ -64,6 +64,12 @@ public class Command_entitywipe extends FreedomCommand
|
||||
return true;
|
||||
}
|
||||
|
||||
if (type == EntityType.PLAYER)
|
||||
{
|
||||
msg("Player entities cannot be purged.", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!getAllEntities().contains(type))
|
||||
{
|
||||
msg(FUtil.formatName(type.name()) + " is an entity, however: it is a mob.", ChatColor.RED);
|
||||
|
@ -23,12 +23,12 @@ public class Command_freeze extends FreedomCommand
|
||||
|
||||
if (!gFreeze)
|
||||
{
|
||||
FUtil.adminAction(sender.getName(), "Disabling global player freeze", false);
|
||||
FUtil.adminAction(sender.getName(), "Unfreezing all players", false);
|
||||
msg("Players are now free to move.");
|
||||
return true;
|
||||
}
|
||||
|
||||
FUtil.adminAction(sender.getName(), "Enabling global player freeze", false);
|
||||
FUtil.adminAction(sender.getName(), "Freezing all players", false);
|
||||
for (Player player : server.getOnlinePlayers())
|
||||
{
|
||||
if (!isAdmin(player))
|
||||
|
@ -35,8 +35,8 @@ public class Command_manageshop extends FreedomCommand
|
||||
}
|
||||
switch (args[1])
|
||||
{
|
||||
|
||||
case "add":
|
||||
{
|
||||
try
|
||||
{
|
||||
int amount = Math.max(0, Math.min(1000000, Integer.parseInt(args[2])));
|
||||
@ -75,7 +75,9 @@ public class Command_manageshop extends FreedomCommand
|
||||
msg("Invalid number: " + args[2], ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
case "remove":
|
||||
{
|
||||
try
|
||||
{
|
||||
int amount = Math.max(0, Math.min(1000000, Integer.parseInt(args[2])));
|
||||
@ -122,7 +124,9 @@ public class Command_manageshop extends FreedomCommand
|
||||
msg("Invalid number: " + args[2], ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
case "set":
|
||||
{
|
||||
try
|
||||
{
|
||||
int amount = Math.max(0, Math.min(1000000, Integer.parseInt(args[2])));
|
||||
@ -147,6 +151,11 @@ public class Command_manageshop extends FreedomCommand
|
||||
msg("Invalid number: " + args[2], ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
default:
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (args[0].equals("items"))
|
||||
|
@ -116,8 +116,12 @@ public class Command_notes extends FreedomCommand
|
||||
msg("Cleared " + count + " notes.", ChatColor.GREEN);
|
||||
return true;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -1,6 +1,8 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.punishments.Punishment;
|
||||
import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.ChatColor;
|
||||
@ -56,11 +58,13 @@ public class Command_orbit extends FreedomCommand
|
||||
}
|
||||
}
|
||||
|
||||
FUtil.adminAction(sender.getName(), "Orbiting " + player.getName(), false);
|
||||
|
||||
player.setGameMode(GameMode.SURVIVAL);
|
||||
playerdata.startOrbiting(strength);
|
||||
|
||||
player.setVelocity(new Vector(0, strength, 0));
|
||||
FUtil.adminAction(sender.getName(), "Orbiting " + player.getName(), false);
|
||||
|
||||
plugin.pul.logPunishment(new Punishment(player.getName(), FUtil.getIp(player), sender.getName(), PunishmentType.ORBIT, null));
|
||||
return true;
|
||||
}
|
||||
}
|
@ -29,6 +29,7 @@ public class Command_potion extends FreedomCommand
|
||||
switch (args.length)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
if (args[0].equalsIgnoreCase("list"))
|
||||
{
|
||||
List<String> potionEffectTypeNames = new ArrayList<>();
|
||||
@ -58,8 +59,10 @@ public class Command_potion extends FreedomCommand
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
case 2:
|
||||
{
|
||||
if (args[0].equalsIgnoreCase("clear"))
|
||||
{
|
||||
Player target = playerSender;
|
||||
@ -95,9 +98,11 @@ public class Command_potion extends FreedomCommand
|
||||
msg("Cleared all active potion effects " + (!target.equals(playerSender) ? "from player " + target.getName() + "." : "from yourself."), ChatColor.AQUA);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 4:
|
||||
case 5:
|
||||
{
|
||||
if (args[0].equalsIgnoreCase("add"))
|
||||
{
|
||||
Player target = playerSender;
|
||||
@ -167,8 +172,11 @@ public class Command_potion extends FreedomCommand
|
||||
+ (!target.equals(playerSender) ? " to player " + target.getName() + "." : " to yourself."), ChatColor.AQUA);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@ -179,14 +187,17 @@ public class Command_potion extends FreedomCommand
|
||||
switch (args.length)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
List<String> arguments = new ArrayList<>(Arrays.asList("list", "clear", "add"));
|
||||
if (plugin.al.isAdmin(sender))
|
||||
{
|
||||
arguments.add("clearall");
|
||||
}
|
||||
return arguments;
|
||||
}
|
||||
|
||||
case 2:
|
||||
{
|
||||
if (args[0].equals("clear"))
|
||||
{
|
||||
if (plugin.al.isAdmin(sender))
|
||||
@ -199,22 +210,28 @@ public class Command_potion extends FreedomCommand
|
||||
return getAllPotionTypes();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 3:
|
||||
{
|
||||
if (args[0].equals("add"))
|
||||
{
|
||||
return Collections.singletonList("<duration>");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 4:
|
||||
{
|
||||
if (args[0].equals("add"))
|
||||
{
|
||||
return Collections.singletonList("<amplifier>");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 5:
|
||||
{
|
||||
if (plugin.al.isAdmin(sender))
|
||||
{
|
||||
if (args[0].equals("add"))
|
||||
@ -223,6 +240,12 @@ public class Command_potion extends FreedomCommand
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return Collections.emptyList();
|
||||
|
@ -0,0 +1,97 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import net.md_5.bungee.api.chat.BaseComponent;
|
||||
import net.md_5.bungee.api.chat.ClickEvent;
|
||||
import net.md_5.bungee.api.chat.HoverEvent;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import net.md_5.bungee.api.chat.TranslatableComponent;
|
||||
import net.md_5.bungee.api.chat.hover.content.Text;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@CommandPermissions(level = Rank.NON_OP, source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Get the seed of the world you are currently in.", usage = "/seed [world]")
|
||||
public class Command_seed extends FreedomCommand
|
||||
{
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
{
|
||||
World world;
|
||||
|
||||
if (args.length > 0)
|
||||
{
|
||||
world = server.getWorld(args[0]);
|
||||
if (world == null)
|
||||
{
|
||||
msg("That world could not be found", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// If the sender is a Player, use that world. Otherwise, use the overworld as a fallback.
|
||||
if (!senderIsConsole)
|
||||
{
|
||||
world = playerSender.getWorld();
|
||||
}
|
||||
else
|
||||
{
|
||||
world = server.getWorlds().get(0);
|
||||
}
|
||||
}
|
||||
|
||||
// If the sender is not a Player, use the usual msg method to
|
||||
if (senderIsConsole)
|
||||
{
|
||||
msg("Seed: [" + ChatColor.GREEN + world.getSeed() + ChatColor.WHITE + "]", ChatColor.WHITE);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Gets the seed for later uses
|
||||
String seed = String.valueOf(world.getSeed());
|
||||
|
||||
// This is a really stupid hack to get things to play nicely, but it works so I don't give a damn
|
||||
BaseComponent[] components = {new TranslatableComponent("chat.copy.click")};
|
||||
TextComponent seedAsComponent = new TextComponent(seed);
|
||||
|
||||
// Style the message like in vanilla Minecraft.
|
||||
seedAsComponent.setColor(ChatColor.GREEN.asBungee());
|
||||
seedAsComponent.setClickEvent(new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, seed));
|
||||
seedAsComponent.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text(components)));
|
||||
|
||||
// Enclose the seed with brackets
|
||||
TextComponent seedString = new TextComponent("[");
|
||||
seedString.addExtra(seedAsComponent);
|
||||
seedString.addExtra("]");
|
||||
|
||||
// Send the message to the player.
|
||||
TranslatableComponent response = new TranslatableComponent("commands.seed.success", seedString);
|
||||
playerSender.spigot().sendMessage(response);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteOptions(CommandSender sender, Command command, String alias, String[] args)
|
||||
{
|
||||
if (args.length == 1)
|
||||
{
|
||||
// Returns a list of worlds on the server and returns it
|
||||
List<String> worlds = new ArrayList<>();
|
||||
for (World world : server.getWorlds())
|
||||
{
|
||||
worlds.add(world.getName());
|
||||
}
|
||||
return worlds;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
@ -105,6 +105,11 @@ public class Command_tag extends FreedomCommand
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (args.length >= 2)
|
||||
@ -279,6 +284,11 @@ public class Command_tag extends FreedomCommand
|
||||
msg("Tag set to '" + outputTag + ChatColor.GRAY + "'." + (save ? " (Saved)" : "") + from + to);
|
||||
return true;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
@ -16,6 +16,12 @@ import org.bukkit.entity.Player;
|
||||
@CommandParameters(description = "Toggles TotalFreedomMod settings", usage = "/<command> [option] [value] [value]")
|
||||
public class Command_toggle extends FreedomCommand
|
||||
{
|
||||
private final List<String> toggles = Arrays.asList(
|
||||
"waterplace", "fireplace", "lavaplace", "fluidspread", "lavadmg", "firespread", "frostwalk",
|
||||
"firework", "prelog", "lockdown", "petprotect", "entitywipe", "nonuke [range] [count]",
|
||||
"explosives [radius]", "unsafeenchs", "bells", "armorstands", "structureblocks", "jigsaws", "grindstones",
|
||||
"jukeboxes", "spawners", "4chan", "beehives", "respawnanchors", "autotp", "autoclear", "minecarts", "mp44",
|
||||
"landmines", "tossmob", "gravity");
|
||||
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
@ -23,38 +29,10 @@ public class Command_toggle extends FreedomCommand
|
||||
if (args.length == 0)
|
||||
{
|
||||
msg("Available toggles: ");
|
||||
msg("- waterplace");
|
||||
msg("- fireplace");
|
||||
msg("- lavaplace");
|
||||
msg("- fluidspread");
|
||||
msg("- lavadmg");
|
||||
msg("- firespread");
|
||||
msg("- frostwalk");
|
||||
msg("- firework");
|
||||
msg("- prelog");
|
||||
msg("- lockdown");
|
||||
msg("- petprotect");
|
||||
msg("- entitywipe");
|
||||
msg("- nonuke [range] [count]");
|
||||
msg("- explosives [radius]");
|
||||
msg("- unsafeenchs");
|
||||
msg("- bells");
|
||||
msg("- armorstands");
|
||||
msg("- structureblocks");
|
||||
msg("- jigsaws");
|
||||
msg("- grindstones");
|
||||
msg("- jukeboxes");
|
||||
msg("- spawners");
|
||||
msg("- 4chan");
|
||||
msg("- beehives");
|
||||
msg("- respawnanchors");
|
||||
msg("- autotp");
|
||||
msg("- autoclear");
|
||||
msg("- minecarts");
|
||||
msg("- landmines");
|
||||
msg("- mp44");
|
||||
msg("- tossmob");
|
||||
msg("- gravity");
|
||||
for (String toggle : toggles)
|
||||
{
|
||||
msg("- " + toggle);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -304,6 +282,16 @@ public class Command_toggle extends FreedomCommand
|
||||
toggle("Block gravity is", ConfigEntry.ALLOW_GRAVITY);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
msg("Available toggles: ");
|
||||
for (String toggle : toggles)
|
||||
{
|
||||
msg("- " + toggle);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -1,6 +1,9 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.punishments.Punishment;
|
||||
import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.apache.commons.lang.ArrayUtils;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.ChatColor;
|
||||
@ -53,25 +56,28 @@ public class Command_warn extends FreedomCommand
|
||||
|
||||
String warnReason = StringUtils.join(ArrayUtils.subarray(args, 1, args.length), " ");
|
||||
player.sendTitle(ChatColor.RED + "You've been warned.", ChatColor.YELLOW + "Reason: " + warnReason, 20, 100, 60);
|
||||
msg(ChatColor.GREEN + "You have successfully warned " + player.getName());
|
||||
msg(player, ChatColor.RED + "[WARNING] You received a warning from " + sender.getName() + ": " + warnReason);
|
||||
plugin.pl.getPlayer(player).incrementWarnings(quiet);
|
||||
plugin.pul.logPunishment(new Punishment(player.getName(), FUtil.getIp(player), sender.getName(), PunishmentType.WARN, warnReason));
|
||||
|
||||
if (quiet)
|
||||
{
|
||||
msg("Warned " + player.getName() + " quietly");
|
||||
return true;
|
||||
msg("You have successfully warned " + player.getName() + " quietly.");
|
||||
}
|
||||
else
|
||||
{
|
||||
String adminNotice = ChatColor.RED +
|
||||
sender.getName() +
|
||||
" - " +
|
||||
"Warning: " +
|
||||
player.getName() +
|
||||
" - Reason: " +
|
||||
ChatColor.YELLOW +
|
||||
warnReason;
|
||||
plugin.al.messageAllAdmins(adminNotice);
|
||||
|
||||
msg(player, ChatColor.RED + "[WARNING] You received a warning from " + sender.getName() + ": " + warnReason);
|
||||
String adminNotice = ChatColor.RED +
|
||||
sender.getName() +
|
||||
" - " +
|
||||
"Warning: " +
|
||||
player.getName() +
|
||||
" - Reason: " +
|
||||
ChatColor.YELLOW +
|
||||
warnReason;
|
||||
plugin.al.messageAllAdmins(adminNotice);
|
||||
plugin.pl.getPlayer(player).incrementWarnings();
|
||||
msg("You have successfully warned " + player.getName() + ".");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
@ -128,7 +128,7 @@ public class ItemFun extends FreedomService
|
||||
|
||||
LivingEntity livingEntity = (LivingEntity)event.getRightClicked();
|
||||
EntityType entityType = livingEntity.getType();
|
||||
if (!(entityType == fPlayer.mobThrowerCreature()))
|
||||
if (entityType != fPlayer.mobThrowerCreature())
|
||||
{
|
||||
return;
|
||||
}
|
||||
@ -304,6 +304,11 @@ public class ItemFun extends FreedomService
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
// Do nothing
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -73,7 +73,7 @@ public class Landminer extends FreedomService
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!(player.getLocation().distanceSquared(location) <= (landmine.radius * landmine.radius)))
|
||||
if (player.getLocation().distanceSquared(location) > (landmine.radius * landmine.radius))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
@ -79,11 +79,20 @@ public class Module_list extends HTTPDModule
|
||||
switch (admin.getRank())
|
||||
{
|
||||
case ADMIN:
|
||||
{
|
||||
admins.add(player.getName());
|
||||
break;
|
||||
}
|
||||
case SENIOR_ADMIN:
|
||||
{
|
||||
senioradmins.add(player.getName());
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
// Do nothing
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -51,11 +51,20 @@ public class Module_players extends HTTPDModule
|
||||
switch (admin.getRank())
|
||||
{
|
||||
case ADMIN:
|
||||
{
|
||||
admins.add(username);
|
||||
break;
|
||||
}
|
||||
case SENIOR_ADMIN:
|
||||
{
|
||||
senioradmins.add(username);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
// Do nothing
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,5 @@
|
||||
package me.totalfreedom.totalfreedommod.player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
||||
import me.totalfreedom.totalfreedommod.caging.CageData;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
@ -16,8 +14,12 @@ import org.bukkit.entity.Player;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import org.bukkit.scheduler.BukkitTask;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class FPlayer
|
||||
{
|
||||
|
||||
public static final long AUTO_PURGE_TICKS = 5L * 60L * 20L;
|
||||
|
||||
|
||||
@ -247,7 +249,7 @@ public class FPlayer
|
||||
public void startArrowShooter(TotalFreedomMod plugin)
|
||||
{
|
||||
this.stopArrowShooter();
|
||||
this.mp44ScheduleTask = new ArrowShooter(this.player).runTaskTimer(plugin, 1L, 1L);
|
||||
this.mp44ScheduleTask = new ArrowShooter(getPlayer()).runTaskTimer(plugin, 1L, 1L);
|
||||
this.mp44Firing = true;
|
||||
}
|
||||
|
||||
@ -429,14 +431,19 @@ public class FPlayer
|
||||
this.warningCount = warningCount;
|
||||
}
|
||||
|
||||
public void incrementWarnings()
|
||||
public void incrementWarnings(boolean quiet)
|
||||
{
|
||||
this.warningCount++;
|
||||
|
||||
if (this.warningCount % 2 == 0)
|
||||
{
|
||||
Player p = getPlayer();
|
||||
p.getWorld().strikeLightning(p.getLocation());
|
||||
|
||||
if (!quiet)
|
||||
{
|
||||
p.getWorld().strikeLightning(p.getLocation());
|
||||
}
|
||||
|
||||
FUtil.playerMsg(p, ChatColor.RED + "You have been warned at least twice now, make sure to read the rules at " + ConfigEntry.SERVER_BAN_URL.getString());
|
||||
}
|
||||
}
|
||||
@ -704,8 +711,11 @@ public class FPlayer
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
Arrow shot = player.launchProjectile(Arrow.class);
|
||||
shot.setVelocity(shot.getVelocity().multiply(2.0));
|
||||
if (player != null)
|
||||
{
|
||||
Arrow shot = player.launchProjectile(Arrow.class);
|
||||
shot.setVelocity(shot.getVelocity().multiply(2.0));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -7,5 +7,11 @@ public enum PunishmentType
|
||||
KICK,
|
||||
TEMPBAN,
|
||||
BAN,
|
||||
DOOM
|
||||
DOOM,
|
||||
WARN,
|
||||
CAGE,
|
||||
BLOCKEDIT,
|
||||
BLOCKPVP,
|
||||
BLOCKCMD,
|
||||
ORBIT
|
||||
}
|
||||
|
@ -1,16 +1,50 @@
|
||||
#
|
||||
# TotalFreedomMod Permissions
|
||||
# TotalFreedomMod 5.5 Permissions
|
||||
# by ZeroEpoch1969
|
||||
#
|
||||
|
||||
# Note that every group inherits the previous groups' permissions
|
||||
# Meaning Senior Admins have the permissions of Operators and Admins, and etc
|
||||
# Meaning Telnet Admins have the permissions of Operators and Super Admins, and etc
|
||||
|
||||
# This is used to remove all permission begging with the root node
|
||||
# This is useful when a plugin gives all permissions to a player because they are opped
|
||||
remove:
|
||||
- "voxelsniper"
|
||||
- "bending"
|
||||
- "bending.admin"
|
||||
- "bending.ability.Cleanse"
|
||||
- "worldedit.brush.apply"
|
||||
- "essentials.near.exclude"
|
||||
- "plots.admin"
|
||||
- "plots.debugroadregen"
|
||||
- "plots.debugclaimtest"
|
||||
- "plots.debugpaste"
|
||||
- "plots.debugallowunsafe"
|
||||
- "plots.debugloadtest"
|
||||
- "plots.debugsavetest"
|
||||
- "plots.cluster"
|
||||
#Crackshot
|
||||
- "crackshot.bypass.all"
|
||||
#NetworkManager
|
||||
- "networkmanager.*"
|
||||
- "networkmanager.notify.joinbanned"
|
||||
- "networkmanager.notify.*"
|
||||
- "networkmanager.announce.global"
|
||||
- "networkmanager.announce"
|
||||
- "networkmanager.chatlock"
|
||||
- "networkmanager.clearchat.bypass"
|
||||
- "networkmanager.clearchat.*"
|
||||
- "networkmanager.notify.ticket.new"
|
||||
- "networkmanager.lookup"
|
||||
- "networkmanager.maintenance.*"
|
||||
- "networkmanager.permissions"
|
||||
- "networkmanager.reports"
|
||||
- "networkmanager.tickets"
|
||||
- "networkmanager.chatlock.bypass"
|
||||
- "networkmanager.anticaps.bypass"
|
||||
- "networkmanager.antispam.bypass"
|
||||
- "networkmanager.commandblocker.bypass"
|
||||
- "networkmanager.tags.*"
|
||||
|
||||
|
||||
# Operator permission nodes
|
||||
operators:
|
||||
@ -36,7 +70,10 @@ operators:
|
||||
- "worldedit.removebelow"
|
||||
- "worldedit.removenear"
|
||||
- "worldedit.replacenear"
|
||||
|
||||
- "worldedit.brush.*"
|
||||
- "worldedit.global-mask"
|
||||
- "worldedit.fill"
|
||||
- "worldedit.fill.recursive"
|
||||
# LibsDisguises
|
||||
- "libsdisguises.noactionbar"
|
||||
|
||||
@ -46,6 +83,66 @@ operators:
|
||||
- "worldguard.region.removemember.own.*"
|
||||
- "worldguard.region.info.*"
|
||||
|
||||
# Bending
|
||||
- "bending.command.add"
|
||||
- "bending.command.bind"
|
||||
- "bending.command.check"
|
||||
- "bending.command.choose"
|
||||
- "bending.command.rechoose"
|
||||
- "bending.command.clear"
|
||||
- "bending.command.copy"
|
||||
- "bending.command.display"
|
||||
- "bending.command.help"
|
||||
- "bending.command.invincible"
|
||||
- "bending.command.preset"
|
||||
- "bending.command.preset.list"
|
||||
- "bending.command.preset.create"
|
||||
- "bending.command.preset.delete"
|
||||
- "bending.command.preset.bind"
|
||||
- "bending.command.preset.bind.assign"
|
||||
- "bending.command.preset.bind.external"
|
||||
- "bending.command.toggle"
|
||||
- "bending.command.version"
|
||||
- "bending.command.who"
|
||||
- "bending.earth"
|
||||
- "bending.air"
|
||||
- "bending.fire"
|
||||
- "bending.water"
|
||||
- "bending.water.bloodbending.anytime"
|
||||
- "bending.ability.AvatarState"
|
||||
- "bending.command.add.chi"
|
||||
- "bending.command.choose.chi"
|
||||
- "bending.ability.Paralyze"
|
||||
- "bending.ability.RapidPunch"
|
||||
- "bending.ability.Smokescreen"
|
||||
- "bending.ability.WarriorStance"
|
||||
- "bending.ability.AcrobatStance"
|
||||
- "bending.ability.QuickStrike"
|
||||
- "bending.ability.SwiftKick"
|
||||
- "bending.ability.ChiCombo"
|
||||
- "bending.chi.passive"
|
||||
- "bending.ability.MetalClips.throw"
|
||||
- "bending.ability.AirCombo"
|
||||
- "bending.ability.Flight"
|
||||
- "bending.ability.WaterCombo"
|
||||
- "bending.ability.EarthCombo"
|
||||
- "bending.ability.FireCombo"
|
||||
- "bending.ability.ChiCombo"
|
||||
- "bending.air.passive"
|
||||
- "bending.chi.passive"
|
||||
- "bending.earth.passive"
|
||||
- "bending.fire.passive"
|
||||
- "bending.water.passive"
|
||||
# NetworkManager
|
||||
- "networkmanager.chatlog"
|
||||
- "networkmanager.find"
|
||||
- "networkmanager.gtps"
|
||||
- "networkmanager.lookup"
|
||||
- "networkmanager.slashserver.*"
|
||||
- "networkmanager.notification.join"
|
||||
- "networkmanager.party.nolimit"
|
||||
- "networkmanager.tabcompletechat"
|
||||
|
||||
# Master Builder permission nodes
|
||||
master_builders:
|
||||
- "worldedit.tool.*"
|
||||
@ -62,10 +159,22 @@ master_builders:
|
||||
|
||||
# Admin permission nodes
|
||||
admins:
|
||||
- "coreprotect.*"
|
||||
- "worldedit.*"
|
||||
- "worldguard.*"
|
||||
- "bending.*"
|
||||
- "bending.admin.remove"
|
||||
- "bending.command.toggle.all"
|
||||
- "bending.admin.toggle"
|
||||
- "bending.command.reload"
|
||||
- "plots.cluster"
|
||||
- "networkmanager.adminchat"
|
||||
- "networkmanager.announce.server"
|
||||
- "networkmanager.socialspy"
|
||||
- "networkmanager.fullproxy.bypass"
|
||||
- "networkmanager.lookup.ip"
|
||||
#Crackshot
|
||||
- "crackshot.bypass.all"
|
||||
|
||||
# Senior Admin permission nodes
|
||||
senior_admins: []
|
||||
senior_admins:
|
||||
- "bending.admin.permaremove"
|
||||
- "bending.ability.Cleanse"
|
||||
|
Reference in New Issue
Block a user