mirror of
https://github.com/NoCheatPlus/NoCheatPlus.git
synced 2025-03-02 10:31:25 +01:00
Version 0.6.4, Commands and code cleanup
This commit is contained in:
parent
45b4f11452
commit
4a09449d2c
10
plugin.yml
10
plugin.yml
@ -3,5 +3,13 @@ name: NoCheatPlugin
|
|||||||
author: Evenprime
|
author: Evenprime
|
||||||
|
|
||||||
main: cc.co.evenprime.bukkit.nocheat.NoCheatPlugin
|
main: cc.co.evenprime.bukkit.nocheat.NoCheatPlugin
|
||||||
version: 0.6.3a
|
version: 0.6.4
|
||||||
|
|
||||||
|
commands:
|
||||||
|
nocheat:
|
||||||
|
description: Provides information about the current status of the NoCheatPlugin
|
||||||
|
usage: |
|
||||||
|
/<command>
|
||||||
|
Example: /<command> | Displays version, enabled checks and bugfixes
|
||||||
|
Example: /<command> -p | Get your permissions, * = check disabled globally
|
||||||
|
Example: /<command> -p [player] | Get permissions of the player, * = check disabled globally
|
@ -170,7 +170,7 @@ public class NoCheatConfiguration {
|
|||||||
w.write(" low: 30"); w.newLine();
|
w.write(" low: 30"); w.newLine();
|
||||||
w.write(" med: 45"); w.newLine();
|
w.write(" med: 45"); w.newLine();
|
||||||
w.write(" high: 60"); w.newLine();
|
w.write(" high: 60"); w.newLine();
|
||||||
w.write("# Speedhack Action, one or more of loglow logmed loghigh reset"); w.newLine();
|
w.write("# Speedhack Action, one or more of 'loglow logmed loghigh reset'"); w.newLine();
|
||||||
w.write(" action:"); w.newLine();
|
w.write(" action:"); w.newLine();
|
||||||
w.write(" low: loglow reset"); w.newLine();
|
w.write(" low: loglow reset"); w.newLine();
|
||||||
w.write(" med: logmed reset"); w.newLine();
|
w.write(" med: logmed reset"); w.newLine();
|
||||||
@ -178,14 +178,14 @@ public class NoCheatConfiguration {
|
|||||||
w.write("# Moving specific optionse") ;w.newLine();
|
w.write("# Moving specific optionse") ;w.newLine();
|
||||||
w.write("moving:"); w.newLine();
|
w.write("moving:"); w.newLine();
|
||||||
w.write(" freemoves: 10"); w.newLine();
|
w.write(" freemoves: 10"); w.newLine();
|
||||||
w.write("# Moving Action, one or more of loglow logmed loghigh reset"); w.newLine();
|
w.write("# Moving Action, one or more of 'loglow logmed loghigh reset'"); w.newLine();
|
||||||
w.write(" action:"); w.newLine();
|
w.write(" action:"); w.newLine();
|
||||||
w.write(" low: loglow reset"); w.newLine();
|
w.write(" low: loglow reset"); w.newLine();
|
||||||
w.write(" med: logmed reset"); w.newLine();
|
w.write(" med: logmed reset"); w.newLine();
|
||||||
w.write(" high: loghigh reset"); w.newLine();
|
w.write(" high: loghigh reset"); w.newLine();
|
||||||
w.write("# Airbuild specific options"); w.newLine();
|
w.write("# Airbuild specific options"); w.newLine();
|
||||||
w.write("airbuild:"); w.newLine();
|
w.write("airbuild:"); w.newLine();
|
||||||
w.write("# Airbuild Action, one or more of loglow logmed loghigh deny"); w.newLine();
|
w.write("# Airbuild Action, one or more of 'loglow logmed loghigh deny'"); w.newLine();
|
||||||
w.write(" action: logmed deny"); w.newLine();
|
w.write(" action: logmed deny"); w.newLine();
|
||||||
w.write("# Dupebydeath specific options (none exist yet)"); w.newLine();
|
w.write("# Dupebydeath specific options (none exist yet)"); w.newLine();
|
||||||
w.write("dupebydeath:"); w.newLine();
|
w.write("dupebydeath:"); w.newLine();
|
||||||
|
@ -6,6 +6,8 @@ import java.util.Map;
|
|||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.Event.Priority;
|
import org.bukkit.event.Event.Priority;
|
||||||
import org.bukkit.event.Event;
|
import org.bukkit.event.Event;
|
||||||
@ -76,6 +78,50 @@ public class NoCheatPlugin extends JavaPlugin {
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCommand(CommandSender sender, Command command, String commandLabel, String[] args)
|
||||||
|
{
|
||||||
|
if(sender instanceof Player) {
|
||||||
|
if(!hasPermission((Player)sender, "nocheat.p")) {
|
||||||
|
sender.sendMessage("NC: You are not allowed to use this command.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(args.length == 0) {
|
||||||
|
sender.sendMessage("NC: Using "+ ((Permissions == null) ? "isOp()" : "Permissions") + ". Activated checks/bugfixes: " + getActiveChecksAsString());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if(args.length == 1 && args[0] != null && args[0].trim().equals("-p")) {
|
||||||
|
if(sender instanceof Player) {
|
||||||
|
Player p = (Player) sender;
|
||||||
|
|
||||||
|
sender.sendMessage("NC: You have permissions: " + getPermissionsForPlayerAsString(p));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sender.sendMessage("NC: You have to be a player to use this command");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(args.length == 2 && args[0] != null && args[0].trim().equals("-p")) {
|
||||||
|
Player p = getServer().getPlayer(args[1]);
|
||||||
|
|
||||||
|
if(p != null) {
|
||||||
|
sender.sendMessage("NC: "+p.getName() + " has permissions: " + getPermissionsForPlayerAsString(p));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sender.sendMessage("NC: Player " + args[1] + " was not found.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void onDisable() {
|
public void onDisable() {
|
||||||
PluginDescriptionFile pdfFile = this.getDescription();
|
PluginDescriptionFile pdfFile = this.getDescription();
|
||||||
Logger.getLogger("Minecraft").info( "[NoCheatPlugin] version [" + pdfFile.getVersion() + "] is disabled.");
|
Logger.getLogger("Minecraft").info( "[NoCheatPlugin] version [" + pdfFile.getVersion() + "] is disabled.");
|
||||||
@ -90,7 +136,7 @@ public class NoCheatPlugin extends JavaPlugin {
|
|||||||
log = NoCheatConfiguration.logger;
|
log = NoCheatConfiguration.logger;
|
||||||
|
|
||||||
PluginManager pm = getServer().getPluginManager();
|
PluginManager pm = getServer().getPluginManager();
|
||||||
pm.registerEvent(Event.Type.PLAYER_MOVE, playerListener, Priority.Lowest, this); // needed for speedhack and moving checks
|
pm.registerEvent(Event.Type.PLAYER_MOVE, playerListener, Priority.Lowest, this); // used for speedhack and moving checks
|
||||||
pm.registerEvent(Event.Type.PLAYER_QUIT, playerListener, Priority.Monitor, this); // used to delete old data of users
|
pm.registerEvent(Event.Type.PLAYER_QUIT, playerListener, Priority.Monitor, this); // used to delete old data of users
|
||||||
pm.registerEvent(Event.Type.BLOCK_PLACED, blockListener, Priority.Low, this); // used for airbuild check
|
pm.registerEvent(Event.Type.BLOCK_PLACED, blockListener, Priority.Low, this); // used for airbuild check
|
||||||
pm.registerEvent(Event.Type.ENTITY_DEATH, entityListener, Priority.Highest, this); // used for dupebydeath check
|
pm.registerEvent(Event.Type.ENTITY_DEATH, entityListener, Priority.Highest, this); // used for dupebydeath check
|
||||||
@ -104,34 +150,32 @@ public class NoCheatPlugin extends JavaPlugin {
|
|||||||
// parse the nocheat.yml config file
|
// parse the nocheat.yml config file
|
||||||
setupConfig();
|
setupConfig();
|
||||||
|
|
||||||
String checks = (NoCheatConfiguration.movingCheckActive ? "moving ": "") +
|
Logger.getLogger("Minecraft").info( "[NoCheatPlugin] version [" + pdfFile.getVersion() + "] is enabled with the following checks: "+getActiveChecksAsString());
|
||||||
(NoCheatConfiguration.speedhackCheckActive ? "speedhack " : "") +
|
|
||||||
(NoCheatConfiguration.airbuildCheckActive ? "airbuild " : "") +
|
|
||||||
(NoCheatConfiguration.dupebydeathCheckActive ? "dupebydeath " : "") +
|
|
||||||
(NoCheatConfiguration.bedteleportCheckActive ? "bedteleport " : "");
|
|
||||||
|
|
||||||
Logger.getLogger("Minecraft").info( "[NoCheatPlugin] version [" + pdfFile.getVersion() + "] is enabled with the following checks: "+checks);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get, if available, a reference to the Permissions-plugin
|
* Get, if available, a reference to the Permissions-plugin
|
||||||
*/
|
*/
|
||||||
public void setupPermissions() {
|
public void setupPermissions() {
|
||||||
Permissions = null;
|
PermissionHandler p = null;
|
||||||
|
|
||||||
Plugin test = this.getServer().getPluginManager().getPlugin("Permissions");
|
Plugin test = this.getServer().getPluginManager().getPlugin("Permissions");
|
||||||
|
|
||||||
if(test != null) {
|
if(test != null) {
|
||||||
Permissions = ((Permissions)test).getHandler();
|
p = ((Permissions)test).getHandler();
|
||||||
if(Permissions == null) {
|
if(p == null) {
|
||||||
this.getServer().getPluginManager().enablePlugin(test);
|
this.getServer().getPluginManager().enablePlugin(test);
|
||||||
}
|
}
|
||||||
Permissions = ((Permissions)test).getHandler();
|
p = ((Permissions)test).getHandler();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Permissions == null) {
|
if(p == null) {
|
||||||
log.info("Nocheat couldn't find Permissions plugin. Fallback to 'isOp()' equals 'all allowed'.");
|
PluginDescriptionFile pdfFile = this.getDescription();
|
||||||
|
log.info("[NoCheatPlugin] version [" + pdfFile.getVersion() + "] couldn't find Permissions plugin. Fallback to 'isOp()' equals 'nocheat.*'");
|
||||||
|
Permissions = null;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
Permissions = p;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -146,12 +190,10 @@ public class NoCheatPlugin extends JavaPlugin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private static void logToChat(Level l, String message) {
|
private static void logToChat(Level l, String message) {
|
||||||
if(NoCheatConfiguration.notifyLevel.intValue() <= l.intValue()) {
|
if(NoCheatConfiguration.notifyLevel.intValue() <= l.intValue()) {
|
||||||
for(Player player : p.getServer().getOnlinePlayers()) {
|
for(Player player : p.getServer().getOnlinePlayers()) {
|
||||||
if((Permissions != null && Permissions.has(player, "nocheat.notify")) ||
|
if(hasPermission(player, "nocheat.notify")) {
|
||||||
(Permissions == null && player.isOp())) {
|
|
||||||
player.sendMessage("["+l.getName()+"] " + message);
|
player.sendMessage("["+l.getName()+"] " + message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -178,10 +220,46 @@ public class NoCheatPlugin extends JavaPlugin {
|
|||||||
NoCheatPlugin.log(logLevel, "NC: "+message);
|
NoCheatPlugin.log(logLevel, "NC: "+message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean hasPermission(Player player, String permission) {
|
||||||
|
|
||||||
|
if(player == null || permission == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(NoCheatPlugin.Permissions != null && NoCheatPlugin.Permissions.has(player, permission))
|
||||||
|
return true;
|
||||||
|
else if(NoCheatPlugin.Permissions == null && player.isOp())
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read the config file
|
* Read the config file
|
||||||
*/
|
*/
|
||||||
public void setupConfig() {
|
public void setupConfig() {
|
||||||
NoCheatConfiguration.config(new File("plugins/NoCheat/nocheat.yml"));
|
NoCheatConfiguration.config(new File("plugins/NoCheat/nocheat.yml"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private String getActiveChecksAsString() {
|
||||||
|
return (NoCheatConfiguration.movingCheckActive ? "moving ": "") +
|
||||||
|
(NoCheatConfiguration.speedhackCheckActive ? "speedhack " : "") +
|
||||||
|
(NoCheatConfiguration.airbuildCheckActive ? "airbuild " : "") +
|
||||||
|
(NoCheatConfiguration.dupebydeathCheckActive ? "dupebydeath " : "") +
|
||||||
|
(NoCheatConfiguration.bedteleportCheckActive ? "bedteleport " : "");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private String getPermissionsForPlayerAsString(Player p) {
|
||||||
|
return (!NoCheatConfiguration.movingCheckActive ? "moving* ": (hasPermission(p, "nocheat.moving") ? "moving " : "") +
|
||||||
|
(!NoCheatConfiguration.speedhackCheckActive ? "speedhack* " : (hasPermission(p, "nocheat.speedhack") ? "speedhack " : "")) +
|
||||||
|
(!NoCheatConfiguration.airbuildCheckActive ? "airbuild* " : (hasPermission(p, "nocheat.airbuild") ? "airbuild " : "")) +
|
||||||
|
(!NoCheatConfiguration.dupebydeathCheckActive ? "dupebydeath* " : (hasPermission(p, "nocheat.dupebydeath") ? "dupebydeath " : "")) +
|
||||||
|
(!NoCheatConfiguration.bedteleportCheckActive ? "bedteleport* " : (hasPermission(p, "nocheat.bedteleport") ? "bedteleport " : "")) +
|
||||||
|
(hasPermission(p, "nocheat.notify") ? "notify " : ""));
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
@ -21,12 +21,8 @@ public class AirbuildCheck {
|
|||||||
public static void check(BlockPlaceEvent event) {
|
public static void check(BlockPlaceEvent event) {
|
||||||
|
|
||||||
// Should we check at all?
|
// Should we check at all?
|
||||||
if(NoCheatPlugin.Permissions != null && NoCheatPlugin.Permissions.has(event.getPlayer(), "nocheat.airbuild")) {
|
if(NoCheatPlugin.hasPermission(event.getPlayer(), "nocheat.airbuild"))
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
else if(NoCheatPlugin.Permissions == null && event.getPlayer().isOp() ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Location l = event.getBlockPlaced().getLocation();
|
Location l = event.getBlockPlaced().getLocation();
|
||||||
World w = event.getBlock().getWorld();
|
World w = event.getBlock().getWorld();
|
||||||
|
@ -5,23 +5,14 @@ import org.bukkit.event.player.PlayerMoveEvent;
|
|||||||
|
|
||||||
import cc.co.evenprime.bukkit.nocheat.NoCheatPlugin;
|
import cc.co.evenprime.bukkit.nocheat.NoCheatPlugin;
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author Evenprime
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class BedteleportCheck {
|
public class BedteleportCheck {
|
||||||
|
|
||||||
|
|
||||||
public static void check(PlayerMoveEvent event) {
|
public static void check(PlayerMoveEvent event) {
|
||||||
|
|
||||||
// Should we check at all
|
// Should we check at all?
|
||||||
if(NoCheatPlugin.Permissions != null && NoCheatPlugin.Permissions.has(event.getPlayer(), "nocheat.bedteleport")) {
|
if(NoCheatPlugin.hasPermission(event.getPlayer(), "nocheat.bedteleport"))
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
else if(NoCheatPlugin.Permissions == null && event.getPlayer().isOp() ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(event.getFrom().getWorld().getBlockTypeIdAt(event.getFrom()) == Material.BED_BLOCK.getId()) {
|
if(event.getFrom().getWorld().getBlockTypeIdAt(event.getFrom()) == Material.BED_BLOCK.getId()) {
|
||||||
double yRest = Math.floor(event.getFrom().getY()) - event.getFrom().getY();
|
double yRest = Math.floor(event.getFrom().getY()) - event.getFrom().getY();
|
||||||
|
@ -9,11 +9,6 @@ import org.bukkit.inventory.PlayerInventory;
|
|||||||
|
|
||||||
import cc.co.evenprime.bukkit.nocheat.NoCheatPlugin;
|
import cc.co.evenprime.bukkit.nocheat.NoCheatPlugin;
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author Evenprime
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class DupebydeathCheck {
|
public class DupebydeathCheck {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -27,12 +22,8 @@ public class DupebydeathCheck {
|
|||||||
Player p = (Player)event.getEntity();
|
Player p = (Player)event.getEntity();
|
||||||
|
|
||||||
// Should we prevent at all?
|
// Should we prevent at all?
|
||||||
if(NoCheatPlugin.Permissions != null && NoCheatPlugin.Permissions.has(p, "nocheat.dupebydeath")) {
|
if(NoCheatPlugin.hasPermission(p, "nocheat.dupebydeath"))
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
else if(NoCheatPlugin.Permissions == null && p.isOp() ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
PlayerInventory playerInventory = p.getInventory();
|
PlayerInventory playerInventory = p.getInventory();
|
||||||
List<ItemStack> drops = event.getDrops();
|
List<ItemStack> drops = event.getDrops();
|
||||||
|
@ -131,18 +131,13 @@ public class MovingCheck {
|
|||||||
public static void check(NoCheatData data, PlayerMoveEvent event) {
|
public static void check(NoCheatData data, PlayerMoveEvent event) {
|
||||||
|
|
||||||
// Should we check at all
|
// Should we check at all
|
||||||
if(NoCheatPlugin.Permissions != null && NoCheatPlugin.Permissions.has(event.getPlayer(), "nocheat.moving")) {
|
if(NoCheatPlugin.hasPermission(event.getPlayer(), "nocheat.moving"))
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
else if(NoCheatPlugin.Permissions == null && event.getPlayer().isOp() ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the two locations of the event
|
// Get the two locations of the event
|
||||||
Location from = event.getFrom();
|
Location from = event.getFrom();
|
||||||
Location to = event.getTo();
|
Location to = event.getTo();
|
||||||
|
|
||||||
System.out.println(from.getY() + " " + to.getY());
|
|
||||||
// First check the distance the player has moved horizontally
|
// First check the distance the player has moved horizontally
|
||||||
// TODO: Make this check much more precise
|
// TODO: Make this check much more precise
|
||||||
double xDistance = Math.abs(from.getX() - to.getX());
|
double xDistance = Math.abs(from.getX() - to.getX());
|
||||||
|
@ -21,12 +21,8 @@ public class SpeedhackCheck {
|
|||||||
public static void check(NoCheatData data, PlayerMoveEvent event) {
|
public static void check(NoCheatData data, PlayerMoveEvent event) {
|
||||||
|
|
||||||
// Should we check at all?
|
// Should we check at all?
|
||||||
if(NoCheatPlugin.Permissions != null && NoCheatPlugin.Permissions.has(event.getPlayer(), "nocheat.speedhack")) {
|
if(NoCheatPlugin.hasPermission(event.getPlayer(), "nocheat.speedhack"))
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
else if(NoCheatPlugin.Permissions == null && event.getPlayer().isOp() ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the time of the server
|
// Get the time of the server
|
||||||
long time = System.currentTimeMillis();
|
long time = System.currentTimeMillis();
|
||||||
|
@ -7,11 +7,6 @@ import org.bukkit.event.entity.EntityListener;
|
|||||||
import cc.co.evenprime.bukkit.nocheat.NoCheatConfiguration;
|
import cc.co.evenprime.bukkit.nocheat.NoCheatConfiguration;
|
||||||
import cc.co.evenprime.bukkit.nocheat.checks.DupebydeathCheck;
|
import cc.co.evenprime.bukkit.nocheat.checks.DupebydeathCheck;
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author Evenprime
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class NoCheatEntityListener extends EntityListener {
|
public class NoCheatEntityListener extends EntityListener {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package cc.co.evenprime.bukkit.nocheat.listeners;
|
package cc.co.evenprime.bukkit.nocheat.listeners;
|
||||||
|
|
||||||
|
|
||||||
import org.bukkit.event.player.PlayerEvent;
|
import org.bukkit.event.player.PlayerEvent;
|
||||||
import org.bukkit.event.player.PlayerListener;
|
import org.bukkit.event.player.PlayerListener;
|
||||||
import org.bukkit.event.player.PlayerMoveEvent;
|
import org.bukkit.event.player.PlayerMoveEvent;
|
||||||
@ -19,6 +20,8 @@ import cc.co.evenprime.bukkit.nocheat.checks.SpeedhackCheck;
|
|||||||
|
|
||||||
public class NoCheatPlayerListener extends PlayerListener {
|
public class NoCheatPlayerListener extends PlayerListener {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public NoCheatPlayerListener() { }
|
public NoCheatPlayerListener() { }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -39,7 +42,6 @@ public class NoCheatPlayerListener extends PlayerListener {
|
|||||||
MovingCheck.check(data, event);
|
MovingCheck.check(data, event);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPlayerTeleport(PlayerMoveEvent event) {
|
public void onPlayerTeleport(PlayerMoveEvent event) {
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user