diff --git a/plugin.yml b/plugin.yml index 7effa0d..d1174bc 100644 --- a/plugin.yml +++ b/plugin.yml @@ -140,6 +140,10 @@ commands: givepet: description: Allows a player to give away a pet he or she tamed. usage: /GivePet + gpblockinfo: + description: Allows an administrator to get technical information about blocks in the world and items in hand. + usage: /GPBlockInfo + permission: griefprevention.gpblockinfo permissions: griefprevention.createclaims: description: Grants permission to create claims. @@ -204,4 +208,7 @@ permissions: default: true griefprevention.visualizenearbyclaims: description: Allows a player to see all nearby claims at once. + default: op + griefprevention.gpblockinfo: + description: Grants access to /GPBlockInfo. default: op \ No newline at end of file diff --git a/src/me/ryanhamshire/GriefPrevention/CheckForPortalTrapTask.java b/src/me/ryanhamshire/GriefPrevention/CheckForPortalTrapTask.java new file mode 100644 index 0000000..7cc030a --- /dev/null +++ b/src/me/ryanhamshire/GriefPrevention/CheckForPortalTrapTask.java @@ -0,0 +1,54 @@ +/* + GriefPrevention Server Plugin for Minecraft + Copyright (C) 2012 Ryan Hamshire + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +package me.ryanhamshire.GriefPrevention; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Player; + +//players can be "trapped" in a portal frame if they don't have permission to break +//solid blocks blocking them from exiting the frame +//if that happens, we detect the problem and send them back through the portal. +class CheckForPortalTrapTask implements Runnable +{ + //player who recently teleported via nether portal + private Player player; + + //where to send the player back to if he hasn't left the portal frame + private Location returnLocation; + + public CheckForPortalTrapTask(Player player, Location location) + { + this.player = player; + this.returnLocation = location; + } + + @Override + public void run() + { + //if player has logged out, do nothing + if(!this.player.isOnline()) return; + + //otherwise if still standing in a portal frame, teleport him back through + if(this.player.getLocation().getBlock().getType() == Material.PORTAL) + { + this.player.teleport(this.returnLocation); + } + } +} diff --git a/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java b/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java index 7c63fff..79170f2 100644 --- a/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java +++ b/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java @@ -39,6 +39,7 @@ import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.World.Environment; import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; import org.bukkit.command.*; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; @@ -49,6 +50,7 @@ import org.bukkit.inventory.PlayerInventory; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.util.BlockIterator; public class GriefPrevention extends JavaPlugin { @@ -61,6 +63,9 @@ public class GriefPrevention extends JavaPlugin //this handles data storage, like player and region data public DataStore dataStore; + //this tracks item stacks expected to drop which will need protection + ArrayList pendingItemWatchList = new ArrayList(); + //configuration variables, loaded/saved from a config.yml //claim mode for each world @@ -1952,6 +1957,18 @@ public class GriefPrevention extends JavaPlugin return true; } + //gpblockinfo + else if(cmd.getName().equalsIgnoreCase("gpblockinfo") && player != null) + { + ItemStack inHand = player.getItemInHand(); + player.sendMessage("In Hand: " + String.format("%s(%d:%d)", inHand.getType().name(), inHand.getTypeId(), inHand.getData().getData())); + + Block inWorld = GriefPrevention.getTargetNonAirBlock(player, 300); + player.sendMessage("In World: " + String.format("%s(%d:%d)", inWorld.getType().name(), inWorld.getTypeId(), inWorld.getData())); + + return true; + } + return false; } @@ -2590,6 +2607,16 @@ public class GriefPrevention extends JavaPlugin } } - //this tracks item stacks expected to drop which will need protection - ArrayList pendingItemWatchList = new ArrayList(); + private static Block getTargetNonAirBlock(Player player, int maxDistance) throws IllegalStateException + { + BlockIterator iterator = new BlockIterator(player.getLocation(), player.getEyeHeight(), maxDistance); + Block result = player.getLocation().getBlock().getRelative(BlockFace.UP); + while (iterator.hasNext()) + { + result = iterator.next(); + if(result.getType() != Material.AIR) return result; + } + + return result; + } } \ No newline at end of file diff --git a/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java b/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java index cb677c5..c83eddd 100644 --- a/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java +++ b/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java @@ -781,6 +781,13 @@ class PlayerEventHandler implements Listener } } + //FEATURE: when players get trapped in a nether portal, send them back through to the other side + if(event.getCause() == TeleportCause.NETHER_PORTAL) + { + CheckForPortalTrapTask task = new CheckForPortalTrapTask(player, event.getFrom()); + GriefPrevention.instance.getServer().getScheduler().scheduleSyncDelayedTask(GriefPrevention.instance, task, 100L); + } + //FEATURE: prevent teleport abuse to win sieges //these rules only apply to siege worlds only