diff --git a/src/main/java/com/graywolf336/jail/beans/Jail.java b/src/main/java/com/graywolf336/jail/beans/Jail.java index 31d09dd..551d0a4 100644 --- a/src/main/java/com/graywolf336/jail/beans/Jail.java +++ b/src/main/java/com/graywolf336/jail/beans/Jail.java @@ -7,8 +7,10 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; +import org.bukkit.util.Vector; import com.graywolf336.jail.JailMain; +import com.graywolf336.jail.Util; /** Represents a Jail, contains the prisoners and the cells. * @@ -314,4 +316,18 @@ public class Jail { if (loc.getWorld().getName().equalsIgnoreCase(getTeleportIn().getWorld().getName())) return (double) Integer.MAX_VALUE; else return loc.distance(getTeleportIn()); } + + /** + * Returns whether the given location is inside this Jail. + * + * @param loc to check whether is inside this jail + * @return True if the location is in the jail, false if it isn't + */ + public boolean isInside(Location loc) { + if(loc.getWorld().getName().equalsIgnoreCase(world)) { + return Util.isInsideAB(loc.toVector(), new Vector(minX, minY, minZ), new Vector(maxX, maxY, maxZ)); + }else { + return false; + } + } } diff --git a/src/main/java/com/graywolf336/jail/enums/LangString.java b/src/main/java/com/graywolf336/jail/enums/LangString.java index 6d99d16..b2140b0 100644 --- a/src/main/java/com/graywolf336/jail/enums/LangString.java +++ b/src/main/java/com/graywolf336/jail/enums/LangString.java @@ -15,6 +15,8 @@ public enum LangString { INTERACTIONBLOCKS ("actions"), /** Section for when a player interacts with an item that is blacklisted. */ INTERACTIONITEMS ("actions"), + /** Section for when a player moves outside of the jail. */ + MOVING ("actions"), //Jailing section diff --git a/src/main/java/com/graywolf336/jail/enums/Settings.java b/src/main/java/com/graywolf336/jail/enums/Settings.java index eedf0fd..714aeef 100644 --- a/src/main/java/com/graywolf336/jail/enums/Settings.java +++ b/src/main/java/com/graywolf336/jail/enums/Settings.java @@ -31,6 +31,8 @@ public enum Settings { JAILEDSTOREINVENTORY("jailing.jail.storeInventory"), LOGJAILING("jailing.jail.logToConsole"), MAXAFKTIME("jailing.during.maxAFKTime"), + MOVEPENALTY("jailing.during.movePenalty"), + MOVEPROTECTION("jailing.during.moveProtection"), OPENCHEST("jailing.during.openChest"), PREVENTINTERACTIONBLOCKS("jailing.during.preventInteractionBlocks"), PREVENTINTERACTIONBLOCKSPENALTY("jailing.during.preventInteractionBlocksPenalty"), diff --git a/src/main/java/com/graywolf336/jail/listeners/ProtectionListener.java b/src/main/java/com/graywolf336/jail/listeners/ProtectionListener.java index be1e426..124eddf 100644 --- a/src/main/java/com/graywolf336/jail/listeners/ProtectionListener.java +++ b/src/main/java/com/graywolf336/jail/listeners/ProtectionListener.java @@ -11,9 +11,13 @@ import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.event.player.PlayerTeleportEvent; import com.graywolf336.jail.JailMain; import com.graywolf336.jail.Util; +import com.graywolf336.jail.beans.Jail; +import com.graywolf336.jail.beans.Prisoner; import com.graywolf336.jail.enums.LangString; import com.graywolf336.jail.enums.Settings; @@ -316,4 +320,68 @@ public class ProtectionListener implements Listener { } } } + + @EventHandler(ignoreCancelled=true) + public void moveProtection(PlayerMoveEvent event) { + //If we have the move protection enabled, then let's do it. + //Other wise we don't need to deal with it. + //TODO: Should probably figure out how to not register this, as this is called so many times per step + if(pl.getConfig().getBoolean(Settings.MOVEPROTECTION.getPath())) { + //Let's be sure the player we're dealing with is in jail + if(pl.getJailManager().isPlayerJailed(event.getPlayer().getName())) { + Jail j = pl.getJailManager().getJailPlayerIsIn(event.getPlayer().getName()); + Prisoner p = j.getPrisoner(event.getPlayer().getName()); + + //If the player is being teleported, let's ignore it + if(p.isTeleporting()) { + return; + } + + //They moved, so they're no longer afk + p.setAFKTime(0L); + + //If the event's to location is NOT inside the jail, then let's do some action. + //For right now, we're only going to apply the time. Later we're going to do + //the guards, but first get a beta version out. + if (!j.isInside(event.getTo())) { + try { + long add = Util.getTime(pl.getConfig().getString(Settings.MOVEPENALTY.getPath())); + pl.getJailManager().getPrisoner(event.getPlayer().getName()).addTime(add); + + String msg = ""; + if(add == 0L) { + //Generate the protection message, provide the method with one argument + //which is the thing we are protecting against + msg = pl.getJailIO().getLanguageString(LangString.PROTECTIONMESSAGENOPENALTY, pl.getJailIO().getLanguageString(LangString.MOVING)); + }else { + //Generate the protection message, provide the method with two arguments + //First is the time in minutes and second is the thing we are protecting against + msg = pl.getJailIO().getLanguageString(LangString.PROTECTIONMESSAGE, + new String[] { String.valueOf(TimeUnit.MINUTES.convert(add, TimeUnit.MILLISECONDS)), + pl.getJailIO().getLanguageString(LangString.MOVING) }); + } + + //Send the message + event.getPlayer().sendMessage(msg); + }catch(Exception e) { + pl.getLogger().severe("Moving (escaping) outside a jail penalty time is in the wrong format, please fix."); + } + + //If the prisoner is in a cell, then let's teleport them to the cell's in location + if(j.isJailedInACell(event.getPlayer().getName())) { + event.setTo(j.getCellPrisonerIsIn(event.getPlayer().getName()).getTeleport()); + }else { + //Otherwise let's teleport them to the in location of the jail + event.setTo(j.getTeleportIn()); + } + } + } + } + } + + @EventHandler(ignoreCancelled=true) + public void onPlayerTeleport(PlayerTeleportEvent event) { + PlayerMoveEvent move = new PlayerMoveEvent(event.getPlayer(), event.getFrom(), event.getTo()); + moveProtection(move); + } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index b04fec0..c801921 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -33,6 +33,8 @@ jailing: foodControlMin: 10 ignoreSleeping: true maxAFKTime: 10m #in minutes + movePenalty: 10m + moveProtection: true openChest: true preventInteractionBlocks: ['wooden_door', 'iron_door_block'] preventInteractionBlocksPenalty: 5m diff --git a/src/main/resources/en.yml b/src/main/resources/en.yml index 09d1f60..6f5f36a 100644 --- a/src/main/resources/en.yml +++ b/src/main/resources/en.yml @@ -6,6 +6,7 @@ language: croptrampling: 'trampling crops' interactionBlocks: 'interacting with a block' interactionItems: 'interacting with an item' + moving: 'trying to escape' general: alljails: 'all the jails' cellremoved: '&9Cell %0% has been successfully removed from the jail %1%.' @@ -36,7 +37,7 @@ language: notjailed: '&c%0% is not jailed.' offlinejail: '&2%0% is offline and will be jailed when they next come online for %1% minutes.' onlinejail: '&2%0% was jailed for %1% minutes.' - protectionmessage: '&c%0% minutes has been added to your time for %1%.' + protectionmessage: '&c%0% minutes have been added to your time for %1%.' protectionmessagenopenalty: '&cProtection enabled for %0%, do not do it again.' suggestedcell: '&cAn empty cell in the same jail, %0%, was found: %1%' unjailed: '&2You have been released! Please respect the server rules.'