summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Panić <david@panic.tk>2018-12-16 01:54:38 +0100
committerDavid Panić <david@panic.tk>2018-12-16 01:54:38 +0100
commit563573392277297862d7b8ded22571c705d51d02 (patch)
treec5e891aba55a836a48ba5cd6a05cfe3e250eba4c
parentcf34444d8b385ff5d4c08828da2e5769c7ff94dd (diff)
Fixed misc
-rw-r--r--src/main/java/com/redstoner/modules/misc/Misc.cmd119
-rw-r--r--src/main/java/com/redstoner/modules/misc/Misc.java425
-rw-r--r--src/main/java/com/redstoner/modules/misc/MiscUtil.java55
3 files changed, 325 insertions, 274 deletions
diff --git a/src/main/java/com/redstoner/modules/misc/Misc.cmd b/src/main/java/com/redstoner/modules/misc/Misc.cmd
index de3b5a3..545030d 100644
--- a/src/main/java/com/redstoner/modules/misc/Misc.cmd
+++ b/src/main/java/com/redstoner/modules/misc/Misc.cmd
@@ -1,72 +1,91 @@
-command tempadd {
- perm pex;
- [string:user] [string:group] {
- help Adds a user to a group for 1w.;
- run tempadddef user group;
- }
- [string:user] [string:group] [string:duration] {
- help Adds a user to a group for a specified duration.;
- run tempadd user group duration;
- }
-}
+command tempadd {
+ perm pex;
+
+ [string:user] [string:group] {
+ help Adds a user to a group for 1w.;
+ run tempadddef user group;
+ }
+
+ [string:user] [string:group] [string:duration] {
+ help Adds a user to a group for a specified duration.;
+ run tempadd user group duration;
+ }
+}
+
command echo {
- perm utils.misc.echo;
- [string:text...] {
- help Echoes back to you.;
- run echo text;
- }
-}
-command ping {
- perm utils.misc.ping
- [empty] {
- help Pongs :D;
- run ping;
- }
- [string:password] {
- help Pongs :D;
- run ping2 password;
- }
-}
-command sudo {
- perm utils.misc.sudo;
- [string:name] [string:command...] {
- help Sudo'es another user (or console);
- run sudo name command;
- }
-}
+ perm utils.misc.echo;
+
+ [string:text...] {
+ help Echoes back to you.;
+ run echo text;
+ }
+}
+
+command ping {
+ perm utils.misc.ping;
+
+ [empty] {
+ help Pongs :D;
+ run ping;
+ }
+
+ [string:player] {
+ help Gets the specified player's ping.;
+ run ping_player player;
+ }
+}
+
+command sudo {
+ perm utils.misc.sudo;
+
+ [string:name] [string:command...] {
+ help Sudo'es another user (or console);
+ run sudo name command;
+ }
+}
+
command hasperm {
perm utils.misc.hasperm;
- [flag:-f] [string:name] [string:node] {
- perm utils.hasperm;
+
+ [flag:-f] [string:name] [string:node] {
+ help Checks if a player has a given permission node or not. Returns \"true/false\" in chat. When -f is set, it returns it unformatted.;
run hasperm -f name node;
- help Checks if a player has a given permission node or not. Returns \"true/false\" in chat. When -f is set, it returns it unformatted.;
- }
+ }
}
+
command nightvision {
- alias nv;
+ alias nv;
+ alias illuminate;
+
perm utils.misc.nightvision;
+
+ type player;
+
[empty] {
- run illuminate;
- type player;
- help Gives the player infinte night vision;
- perm utils.illuminate;
- }
+ help Gives the player infinte night vision;
+ run illuminate;
+ }
}
+
command minecart {
alias cart;
+
perm utils.misc.spawncart;
+
type player;
- default [string:variation] {
- run minecart_default variation;
+ default [string:variation] {
help Sets a default minecart variation.;
+ run minecart_default variation;
}
+
[string:variation] {
- run minecart_variation variation;
help Spawns a certain minecart;
+ run minecart_variation variation;
}
+
[empty] {
- run minecart;
help Spawns a minecart;
- }
+ run minecart;
+ }
} \ No newline at end of file
diff --git a/src/main/java/com/redstoner/modules/misc/Misc.java b/src/main/java/com/redstoner/modules/misc/Misc.java
index 2412d45..74b3657 100644
--- a/src/main/java/com/redstoner/modules/misc/Misc.java
+++ b/src/main/java/com/redstoner/modules/misc/Misc.java
@@ -1,10 +1,17 @@
package com.redstoner.modules.misc;
-import java.lang.reflect.InvocationTargetException;
-import java.util.UUID;
-
+import com.nemez.cmdmgr.Command;
+import com.redstoner.annotations.AutoRegisterListener;
+import com.redstoner.annotations.Commands;
+import com.redstoner.annotations.Version;
+import com.redstoner.misc.CommandHolderType;
+import com.redstoner.misc.Utils;
+import com.redstoner.modules.Module;
+import com.redstoner.modules.datamanager.DataManager;
+import net.nemez.chatapi.ChatAPI;
+import net.nemez.chatapi.click.Message;
import org.bukkit.Bukkit;
-import org.bukkit.Location;
+import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.EntityType;
@@ -12,349 +19,319 @@ import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
-import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockFromToEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-import com.nemez.cmdmgr.Command;
-import com.redstoner.annotations.AutoRegisterListener;
-import com.redstoner.annotations.Commands;
-import com.redstoner.annotations.Version;
-import com.redstoner.misc.CommandHolderType;
-import com.redstoner.misc.Utils;
-import com.redstoner.modules.Module;
-import com.redstoner.modules.datamanager.DataManager;
-
-import net.nemez.chatapi.ChatAPI;
-import net.nemez.chatapi.click.Message;
+import java.util.UUID;
-@Commands(CommandHolderType.File)
+@Commands (CommandHolderType.File)
@AutoRegisterListener
-@Version(major = 4, minor = 1, revision = 0, compatible = 4)
-public class Misc implements Module, Listener
-{
- private final String[] sudoBlacklist = new String[] {"(.*:)?e?sudo", "(.*:)?script.*", "(.*:)?stop",
- "(.*:)?modules", "(.*:)?sayn", "(.*:)?pex", "(.*:)?console_.*", "(.*:)?op", "(.*:)?login", "(.*:)?register",
- "(.*:)?.*pass"};
- JSONObject config;
- JSONArray unprotectedRegions;
-
+@Version (major = 4, minor = 1, revision = 0, compatible = 4)
+public class Misc implements Module, Listener {
+ private static final String[] SUDO_BLACKLIST = new String[] {
+ "(.*:)?e?sudo",
+ "(.*:)?script.*",
+ "(.*:)?stop",
+ "(.*:)?modules",
+ "(.*:)?sayn",
+ "(.*:)?pex",
+ "(.*:)?console_.*",
+ "(.*:)?op",
+ "(.*:)?login",
+ "(.*:)?register",
+ "(.*:)?.*pass"
+ };
+
+ private static final String[] WELCOME_MSG = new String[] {
+ "&4 Welcome to the Redstoner Server!\n",
+ "&6 Before you ask us things, take a quick look at &a&nredstoner.com/info\n",
+ "&6 Thank you and happy playing ;)\n\n"
+ };
+
+ private static final PotionEffect NIGHT_VISION = new PotionEffect(PotionEffectType.NIGHT_VISION, Integer.MAX_VALUE, 0, false, false);
+
@EventHandler
- public void onFirstJoin(PlayerJoinEvent event)
- {
+ public void onFirstJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();
- if (!player.hasPlayedBefore())
- {
- Utils.broadcast("", "\n§a§lPlease welcome §f" + player.getDisplayName() + " §a§lto Redstoner!\n", null);
- String[] message = new String[] {" \n \n \n \n \n \n \n \n \n \n \n \n ",
- " &4Welcome to the Redstoner Server!", " &6Before you ask us things, take a quick",
- " &6look at &a&nredstoner.com/info", " \n&6thank you and happy playing ;)", " \n \n"};
- getLogger().message(player, message);
+
+ if (!player.hasPlayedBefore()) {
+ Utils.broadcast("", "\n§a§lPlease welcome §f" + player.getDisplayName() + " §a§lto Redstoner!\n", recipient -> !recipient.equals(player));
+
+ getLogger().message(player, WELCOME_MSG);
}
+
Material spawnBlock = player.getLocation().getBlock().getType();
- if (spawnBlock == Material.END_PORTAL || spawnBlock == Material.NETHER_PORTAL)
- {
+
+ if (spawnBlock == Material.END_PORTAL || spawnBlock == Material.NETHER_PORTAL) {
getLogger().message(player, "&4Looks like you spawned in a portal... Let me help you out");
getLogger().message(player, "&6You can use /back if you &nreally&6 want to go back");
+
player.teleport(player.getWorld().getSpawnLocation());
}
}
-
+
// Disables spectator teleportation
- @EventHandler(priority = EventPriority.LOWEST)
- public void onTeleport(PlayerTeleportEvent event)
- {
+ @EventHandler (priority = EventPriority.LOWEST)
+ public void onTeleport(PlayerTeleportEvent event) {
Player player = event.getPlayer();
- if (!event.isCancelled() && event.getCause() == TeleportCause.SPECTATE && !player.hasPermission("utils.tp"))
- {
- event.setCancelled(true);
+
+ if (!event.isCancelled() && event.getCause() == TeleportCause.SPECTATE && !player.hasPermission("utils.tp")) {
getLogger().message(event.getPlayer(), true, "Spectator teleportation is disabled!");
+
+ event.setCancelled(true);
}
}
-
+
// Disables water and lava breaking stuff
@EventHandler
- public void onLiquidFlow(BlockFromToEvent event)
- {
+ public void onLiquidFlow(BlockFromToEvent event) {
Material m = event.getToBlock().getType();
- switch (m)
- {
+
+ switch (m) {
case AIR:
case WATER:
case LAVA:
return;
- default:
- {
+ default: {
event.setCancelled(true);
}
}
}
-
- @Command(hook = "tempadddef")
- public boolean tempAddDef(CommandSender sender, String user, String group)
- {
- return tempAdd(sender, user, group, "604800");
+
+ @Command (hook = "tempadddef")
+ public boolean tempAddDef(CommandSender sender, String user, String group) {
+ return tempAdd(sender, user, group, "7d");
}
-
- @Command(hook = "tempadd")
- public boolean tempAdd(CommandSender sender, String user, String group, String duration)
- {
- // Use it to make a proper duration output later. Too lazy rn.
- @SuppressWarnings("unused")
- int i = 0;
- try
- {
- i = Integer.valueOf(duration);
- }
- catch (NumberFormatException e)
- {
- getLogger().message(sender, true, "That is not a valid number!");
+
+ @Command (hook = "tempadd")
+ public boolean tempAdd(CommandSender sender, String user, String group, String duration) {
+ int parsed = MiscUtil.parseDuration(duration);
+
+ if (parsed == -1) {
+ getLogger().message(sender, true, "That is not a valid duration! (format: 1y2m3d4h5m6s)");
return true;
}
- Bukkit.dispatchCommand(sender, "pex user " + user + " group add " + group + " * " + duration);
- getLogger().message(sender, "Added to group " + group + "for " + duration + " seconds.");
+
+ Bukkit.dispatchCommand(sender, "pex user " + user + " group add " + group + " * " + parsed);
+ getLogger().message(sender, "User " + user + " added to group " + group + " for " + duration);
+
return true;
}
-
- @Command(hook = "echo")
- public boolean echo(CommandSender sender, String text)
- {
+
+ @Command (hook = "echo")
+ public boolean echo(CommandSender sender, String text) {
sender.sendMessage(ChatAPI.colorify(null, text));
+
return true;
}
-
- @Command(hook = "ping")
- public boolean ping(CommandSender sender)
- {
- if (sender instanceof Player)
- {
- int ping = getPing((Player) sender);
+
+ @Command (hook = "ping")
+ public boolean ping(CommandSender sender) {
+ if (sender instanceof Player) {
+ int ping = MiscUtil.getPing((Player) sender);
if (ping == -1) {
getLogger().message(sender, "An error occured while getting your ping! Please message a staff member.");
} else {
getLogger().message(sender, "Your ping is " + ping + "ms.");
}
+ } else {
+ sender.sendMessage("That's not how this works... <insert facepalm emoji here>");
}
- else
- {
- sender.sendMessage("Pong!");
- }
- return true;
- }
-
- @Command(hook = "ping2")
- public boolean ping(CommandSender sender, String password)
- {
- if (password.equals("pong"))
- if (sender instanceof Player)
- {
- int ping = getPing((Player) sender);
-
- if (ping == -1) {
- getLogger().message(sender, "An error occured while getting your ping! Please message a staff member.");
- } else {
- getLogger().message(sender, new String[] {"Your ping is " + ping + "ms.", ping < 20
- ? "&aThat's gr8 m8 r8 8/8"
- : (ping < 50 ? "F&eair enough you cunt!"
- : (ping < 100 ? "&eShite, but not shite enough."
- : "&cLooks like the server is about two months ahead of you. GET A NEW FRIGGIN' ISP ALREADY"))});
- }
- }
- else
- getLogger().message(sender, true,
- "M8 you shitty cunt are not supposed to run this shit it's for players only!!!");
- else
- getLogger().message(sender, true, "&4WRONG PASSWORD, 4/3 ATTEMPTS FAILED! BAN COMMENCING!");
+
return true;
}
-
- public int getPing(Player player)
- {
- try {
- Object entityPlayer = player.getClass().getMethod("getHandle").invoke(player);
- int ping = (int) entityPlayer.getClass().getField("ping").get(entityPlayer);
- return ping;
- } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | NoSuchFieldException e) {
- e.printStackTrace();
+
+ @Command (hook = "ping_player")
+ public boolean ping(CommandSender sender, String player) {
+ Player playerObj = Bukkit.getPlayer(player);
+
+ if (playerObj == null) {
+ getLogger().message(sender, "That player is not online!");
+ return true;
+ }
+
+ int ping = MiscUtil.getPing(playerObj);
+
+ if (ping == -1) {
+ getLogger().message(sender, "An error occured while getting that player's ping! Please message a staff member.");
+ } else {
+ getLogger().message(sender, ChatColor.GRAY + playerObj.getDisplayName() + ChatColor.GRAY + "'s ping is " + ping + "ms.");
}
- return -1;
+ return true;
}
-
- @Command(hook = "sudo")
- public boolean sudo(CommandSender sender, String name, String command)
- {
+
+ @Command (hook = "sudo")
+ public boolean sudo(CommandSender sender, String name, String command) {
CommandSender target;
- if (name.equalsIgnoreCase("console"))
- {
+
+ if (name.equalsIgnoreCase("console")) {
target = Bukkit.getConsoleSender();
- }
- else
+ } else {
target = Bukkit.getPlayer(name);
- if (target == null)
- {
+ }
+
+ if (target == null) {
getLogger().message(sender, false, "That player couldn't be found!");
return true;
}
- if (command.startsWith("/") || target.equals(Bukkit.getConsoleSender()))
- {
+
+ if (command.startsWith("/") || target.equals(Bukkit.getConsoleSender())) {
String[] args = command.split(" ");
- for (String regex : sudoBlacklist)
- {
- if (args[0].matches((target.equals(Bukkit.getConsoleSender()) ? "" : "\\/") + regex))
- {
+
+ for (String regex : SUDO_BLACKLIST) {
+ if (args[0].matches((target.equals(Bukkit.getConsoleSender()) ? "" : "\\/") + regex)) {
getLogger().message(sender, true, "You can't sudo anyone into using that command!");
return true;
}
}
+
Bukkit.dispatchCommand(target, command.replaceFirst("/", ""));
getLogger().message(sender, "Sudoed " + Utils.getName(target) + "&7 into running " + command);
- }
- else
- {
+ } else {
((Player) target).chat(command);
getLogger().message(sender, "Sudoed " + Utils.getName(target) + "&7 into saying " + command);
}
+
return true;
}
-
- @Command(hook = "hasperm")
- public boolean hasPerm(CommandSender sender, boolean noformat, String name, String node)
- {
+
+ @Command (hook = "hasperm")
+ public boolean hasPerm(CommandSender sender, boolean noformat, String name, String node) {
Player p;
- if (name.contains("-"))
- try
- {
+
+ if (name.contains("-")) {
+ try {
p = Bukkit.getPlayer(UUID.fromString(name));
- }
- catch (Exception e)
- {
- if (noformat)
+ } catch (Exception e) {
+ if (noformat) {
sender.sendMessage("ERR: Invalid UUID");
- else
+ } else {
getLogger().message(sender, "That UUID is not valid!");
+ }
+
return true;
}
- else
+ } else {
p = Bukkit.getPlayer(name);
- if (p == null)
- {
- if (noformat)
- {
+ }
+
+ if (p == null) {
+ if (noformat) {
Message m = new Message(sender, null);
m.appendText("ERR: Invalid player");
m.send();
- }
- else
- {
+ } else {
getLogger().message(sender, "That player couldn't be found!");
}
+
return true;
}
-
- if (noformat)
- {
+
+ if (noformat) {
Message m = new Message(sender, null);
m.appendText("" + p.hasPermission(node));
m.send();
+ } else {
+ getLogger().message(sender, ChatColor.GRAY + p.getDisplayName() + ChatColor.GRAY + (
+ p.hasPermission(node)
+ ? " has that permission."
+ : " does not have that permission."
+ ));
}
- else
- {
- getLogger().message(sender, "" + p.hasPermission(node));
- }
-
+
return true;
}
-
- public boolean canBuild(Player player, Location location)
- {
- BlockBreakEvent event = new BlockBreakEvent(location.getBlock(), player);
- Bukkit.getPluginManager().callEvent(event);
- return event.isCancelled();
- }
-
- PotionEffect nightvision = new PotionEffect(PotionEffectType.NIGHT_VISION, Integer.MAX_VALUE, 0, false, false);
-
- @Command(hook = "illuminate")
- public void illuminate(CommandSender sender)
- {
+
+ @Command (hook = "illuminate")
+ public void illuminate(CommandSender sender) {
Player player = (Player) sender;
- if (player.hasPotionEffect(PotionEffectType.NIGHT_VISION))
- {
+ if (player.hasPotionEffect(PotionEffectType.NIGHT_VISION)) {
player.removePotionEffect(PotionEffectType.NIGHT_VISION);
getLogger().message(sender, "Night Vision Disabled.");
- }
- else
- {
- player.addPotionEffect(nightvision, true);
+ } else {
+ player.addPotionEffect(NIGHT_VISION, true);
getLogger().message(sender, "Night Vision Enabled.");
}
}
-
- @Command(hook = "minecart")
+
+ @Command (hook = "minecart")
public void minecart(CommandSender sender) {
String type = (String) DataManager.getOrDefault(sender, "minecart_default", "normal");
minecartType(sender, type);
}
-
- @Command(hook = "minecart_variation")
+
+ @Command (hook = "minecart_variation")
public boolean minecartType(CommandSender sender, String type) {
- if (type.equals("help") || type.equals("h") || type.equals("?"))
- return false;
-
+ if (type.equals("help") || type.equals("h") || type.equals("?")) return false;
+
Player p = (Player) sender;
- if (!canBuild(p, p.getLocation())) {
+
+ if (!MiscUtil.canBuild(p, p.getLocation())) {
getLogger().message(sender, true, "You do not have permission to build here!");
return true;
}
-
- EntityType typeE = convertMinecartTypeString(type);
-
+
+ EntityType typeE = convertMinecartTypeString(type.toLowerCase());
+
if (typeE != null) {
p.getWorld().spawnEntity(p.getLocation(), typeE);
getLogger().message(sender, "Minecart Spawned!");
- }
- else
+ } else {
getLogger().message(sender, true, "The type of Minecart you've requested does not exist.");
+ }
+
return false;
}
-
- @Command(hook = "minecart_default")
+
+ @Command (hook = "minecart_default")
public boolean minecartDefault(CommandSender sender, String type) {
- EntityType typeE = convertMinecartTypeString(type);
-
- if (type.equals("help") || type.equals("h") || type.equals("?"))
- return false;
-
+ EntityType typeE = convertMinecartTypeString(type.toLowerCase());
+
+ if (type.equals("help") || type.equals("h") || type.equals("?")) return false;
+
if (typeE != null) {
DataManager.setData(sender, "minecart_default", type);
- getLogger().message(sender, "Minecart Spawned!");
- }
- else
+ getLogger().message(sender, "Set your default minecart to: " + type.toLowerCase());
+ } else {
getLogger().message(sender, true, "The type of Minecart you've requested does not exist.");
+ }
+
return true;
}
-
+
public EntityType convertMinecartTypeString(String type) {
EntityType typeE = null;
-
+
switch (type) {
- case "normal": typeE = EntityType.MINECART; break;
- case "chest": typeE = EntityType.MINECART_CHEST; break;
- case "furnace": typeE = EntityType.MINECART_FURNACE; break;
- case "hopper": typeE = EntityType.MINECART_HOPPER; break;
- case "tnt": typeE = EntityType.MINECART_TNT; break;
- case "command": typeE = EntityType.MINECART_COMMAND; break;
- case "spawner": typeE = EntityType.MINECART_MOB_SPAWNER; break;
+ case "normal":
+ typeE = EntityType.MINECART;
+ break;
+ case "chest":
+ typeE = EntityType.MINECART_CHEST;
+ break;
+ case "furnace":
+ typeE = EntityType.MINECART_FURNACE;
+ break;
+ case "hopper":
+ typeE = EntityType.MINECART_HOPPER;
+ break;
+ case "tnt":
+ typeE = EntityType.MINECART_TNT;
+ break;
+ case "command":
+ typeE = EntityType.MINECART_COMMAND;
+ break;
+ case "spawner":
+ typeE = EntityType.MINECART_MOB_SPAWNER;
+ break;
}
-
+
return typeE;
}
} \ No newline at end of file
diff --git a/src/main/java/com/redstoner/modules/misc/MiscUtil.java b/src/main/java/com/redstoner/modules/misc/MiscUtil.java
new file mode 100644
index 0000000..f2fde6f
--- /dev/null
+++ b/src/main/java/com/redstoner/modules/misc/MiscUtil.java
@@ -0,0 +1,55 @@
+package com.redstoner.modules.misc;
+
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.entity.Player;
+import org.bukkit.event.block.BlockBreakEvent;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class MiscUtil {
+ private static final Pattern durationPattern = Pattern.compile("^(?:(?:(\\d*)y)?(?:(\\d*)m)?(?:(\\d*)d)?(?:(\\d*)h)?(?:(\\d*)m)?(?:(\\d*)s)?){1}$");
+
+ private static int getIntGroup(Matcher matcher, int group) {
+ String strGroup = matcher.group(group);
+ return Integer.parseInt(strGroup == null ? "0" : strGroup);
+ }
+
+ protected static int parseDuration(String duration) {
+ Matcher m = durationPattern.matcher(duration);
+
+ if (m.matches()) {
+ int years = getIntGroup(m, 1);
+ int months = getIntGroup(m, 2);
+ int days = getIntGroup(m, 3);
+ int hours = getIntGroup(m, 4);
+ int minutes = getIntGroup(m, 5);
+ int seconds = getIntGroup(m, 6);
+
+ return (years * 31557600) + (months * 2629800) + (days * 86400) + (hours * 3600) + (minutes * 60) + seconds;
+ } else {
+ return -1;
+ }
+ }
+
+ protected static int getPing(Player player) {
+ try {
+ Object entityPlayer = player.getClass().getMethod("getHandle").invoke(player);
+
+ int ping = (int) entityPlayer.getClass().getField("ping").get(entityPlayer);
+ return ping;
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | NoSuchFieldException e) {
+ e.printStackTrace();
+ }
+
+ return -1;
+ }
+
+ protected static boolean canBuild(Player player, Location location) {
+ BlockBreakEvent event = new BlockBreakEvent(location.getBlock(), player);
+ Bukkit.getPluginManager().callEvent(event);
+ return !event.isCancelled();
+ }
+}