1
0
mirror of https://e.coding.net/circlecloud/Residence.git synced 2025-11-24 21:46:16 +00:00

尝试修复领地卡TP的BUG...

This commit is contained in:
502647092
2015-12-09 19:55:51 +08:00
parent d9c80e8825
commit 489797f2f0
2 changed files with 1333 additions and 1339 deletions

View File

@@ -2,7 +2,6 @@
* To change this template, choose Tools | Templates and open the template in * To change this template, choose Tools | Templates and open the template in
* the editor. * the editor.
*/ */
package cn.citycraft.Residence.listeners; package cn.citycraft.Residence.listeners;
import java.util.ArrayList; import java.util.ArrayList;
@@ -53,501 +52,497 @@ import cn.citycraft.Residence.permissions.PermissionGroup;
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public class ResidencePlayerListener implements Listener { public class ResidencePlayerListener implements Listener {
protected boolean chatenabled; protected boolean chatenabled;
protected Map<String, String> currentRes; protected Map<String, String> currentRes;
protected Map<String, Location> lastOutsideLoc; protected Map<String, Location> lastOutsideLoc;
protected Map<String, Long> lastUpdate; protected Map<String, Long> lastUpdate;
protected int minUpdateTime; protected int minUpdateTime;
protected List<String> playerToggleChat; protected List<String> playerToggleChat;
ResidenceMain plugin; ResidenceMain plugin;
public ResidencePlayerListener(final ResidenceMain plugin) { public ResidencePlayerListener(final ResidenceMain plugin) {
this.plugin = plugin; this.plugin = plugin;
currentRes = new HashMap<String, String>(); currentRes = new HashMap<>();
lastUpdate = new HashMap<String, Long>(); lastUpdate = new HashMap<>();
lastOutsideLoc = new HashMap<String, Location>(); lastOutsideLoc = new HashMap<>();
playerToggleChat = new ArrayList<String>(); playerToggleChat = new ArrayList<>();
minUpdateTime = plugin.getConfigManager().getMinMoveUpdateInterval(); minUpdateTime = plugin.getConfigManager().getMinMoveUpdateInterval();
chatenabled = plugin.getConfigManager().chatEnabled(); chatenabled = plugin.getConfigManager().chatEnabled();
for (final Player player : Bukkit.getServer().getOnlinePlayers()) { for (final Player player : Bukkit.getServer().getOnlinePlayers()) {
lastUpdate.put(player.getName(), System.currentTimeMillis()); lastUpdate.put(player.getName(), System.currentTimeMillis());
} }
} }
public String getCurrentResidenceName(final String player) { public String getCurrentResidenceName(final String player) {
return currentRes.get(player); return currentRes.get(player);
} }
public void handleNewLocation(final Player player, final Location loc, final boolean move) { public void handleNewLocation(final Player player, final Location loc, final boolean move) {
final String pname = player.getName(); final String pname = player.getName();
ClaimedResidence res = plugin.getResidenceManager().getByLoc(loc); ClaimedResidence res = plugin.getResidenceManager().getByLoc(loc);
String areaname = null; String areaname = null;
boolean chatchange = false; boolean chatchange = false;
String subzone = null; String subzone = null;
if (res != null) { if (res != null) {
areaname = plugin.getResidenceManager().getNameByLoc(loc); areaname = plugin.getResidenceManager().getNameByLoc(loc);
while (res.getSubzoneByLoc(player.getLocation()) != null) { while (res.getSubzoneByLoc(player.getLocation()) != null) {
subzone = res.getSubzoneNameByLoc(player.getLocation()); subzone = res.getSubzoneNameByLoc(player.getLocation());
res = res.getSubzoneByLoc(player.getLocation()); res = res.getSubzoneByLoc(player.getLocation());
areaname = areaname + "." + subzone; areaname = areaname + "." + subzone;
} }
} }
ClaimedResidence ResOld = null; ClaimedResidence ResOld = null;
if (currentRes.containsKey(pname)) { if (currentRes.containsKey(pname)) {
ResOld = plugin.getResidenceManager().getByName(currentRes.get(pname)); ResOld = plugin.getResidenceManager().getByName(currentRes.get(pname));
if (ResOld == null) { if (ResOld == null) {
currentRes.remove(pname); currentRes.remove(pname);
} }
} }
if (res == null) { if (res == null) {
lastOutsideLoc.put(pname, loc); lastOutsideLoc.put(pname, loc);
if (ResOld != null) { if (ResOld != null) {
final String leave = ResOld.getLeaveMessage(); final String leave = ResOld.getLeaveMessage();
final ResidenceChangedEvent chgEvent = new ResidenceChangedEvent(ResOld, null, player); final ResidenceChangedEvent chgEvent = new ResidenceChangedEvent(ResOld, null, player);
plugin.getServer().getPluginManager().callEvent(chgEvent); plugin.getServer().getPluginManager().callEvent(chgEvent);
if (leave != null && !leave.equals("")) { if (leave != null && !leave.equals("")) {
if (plugin.getConfigManager().useActionBar()) { if (plugin.getConfigManager().useActionBar()) {
ActionBar.send(player, ChatColor.YELLOW + insertMessages(player, ResOld.getName(), ResOld, leave)); ActionBar.send(player, ChatColor.YELLOW + insertMessages(player, ResOld.getName(), ResOld, leave));
} else { } else {
player.sendMessage(ChatColor.YELLOW + insertMessages(player, ResOld.getName(), ResOld, leave)); player.sendMessage(ChatColor.YELLOW + insertMessages(player, ResOld.getName(), ResOld, leave));
} }
} }
currentRes.remove(pname); currentRes.remove(pname);
plugin.getChatManager().removeFromChannel(pname); plugin.getChatManager().removeFromChannel(pname);
} }
return; return;
} }
if (move && !res.getPermissions().playerHas(pname, "move", true) && !plugin.isResAdminOn(player) && !player.hasPermission("residence.admin.move") if (move && !res.getPermissions().playerHas(pname, "move", true) && !plugin.isResAdminOn(player) && !player.hasPermission("residence.admin.move")) {
&& !player.hasPermission("residence.admin.tp")) { final Location lastLoc = lastOutsideLoc.get(pname);
final Location lastLoc = lastOutsideLoc.get(pname); if (lastLoc != null) {
if (lastLoc != null) { player.teleport(lastLoc);
player.teleport(lastLoc); } else {
} else { player.teleport(res.getOutsideFreeLoc(loc));
player.teleport(res.getOutsideFreeLoc(loc)); }
} player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("ResidenceMoveDeny", res.getName().split("\\.")[res.getName().split("\\.").length - 1]));
player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("ResidenceMoveDeny", res.getName().split("\\.")[res.getName().split("\\.").length - 1])); return;
return; }
} lastOutsideLoc.put(pname, loc);
lastOutsideLoc.put(pname, loc); if (!currentRes.containsKey(pname) || ResOld != res) {
if (!currentRes.containsKey(pname) || ResOld != res) { currentRes.put(pname, areaname);
currentRes.put(pname, areaname); if (subzone == null) {
if (subzone == null) { chatchange = true;
chatchange = true; }
} ClaimedResidence chgFrom = null;
ClaimedResidence chgFrom = null; if (ResOld != res && ResOld != null) {
if (ResOld != res && ResOld != null) { final String leave = ResOld.getLeaveMessage();
final String leave = ResOld.getLeaveMessage(); chgFrom = ResOld;
chgFrom = ResOld;
if (leave != null && !leave.equals("") && ResOld != res.getParent()) { if (leave != null && !leave.equals("") && ResOld != res.getParent()) {
if (plugin.getConfigManager().useActionBar()) { if (plugin.getConfigManager().useActionBar()) {
ActionBar.send(player, ChatColor.YELLOW + insertMessages(player, ResOld.getName(), ResOld, leave)); ActionBar.send(player, ChatColor.YELLOW + insertMessages(player, ResOld.getName(), ResOld, leave));
} else { } else {
player.sendMessage(ChatColor.YELLOW + insertMessages(player, ResOld.getName(), ResOld, leave)); player.sendMessage(ChatColor.YELLOW + insertMessages(player, ResOld.getName(), ResOld, leave));
} }
} }
} }
final String enterMessage = res.getEnterMessage(); final String enterMessage = res.getEnterMessage();
final ResidenceChangedEvent chgEvent = new ResidenceChangedEvent(chgFrom, res, player); final ResidenceChangedEvent chgEvent = new ResidenceChangedEvent(chgFrom, res, player);
plugin.getServer().getPluginManager().callEvent(chgEvent); plugin.getServer().getPluginManager().callEvent(chgEvent);
if (enterMessage != null && !enterMessage.equals("") && !(ResOld != null && res == ResOld.getParent())) { if (enterMessage != null && !enterMessage.equals("") && !(ResOld != null && res == ResOld.getParent())) {
if (plugin.getConfigManager().useActionBar()) { if (plugin.getConfigManager().useActionBar()) {
ActionBar.send(player, ChatColor.YELLOW + insertMessages(player, areaname, res, enterMessage)); ActionBar.send(player, ChatColor.YELLOW + insertMessages(player, areaname, res, enterMessage));
} else { } else {
player.sendMessage(ChatColor.YELLOW + insertMessages(player, areaname, res, enterMessage)); player.sendMessage(ChatColor.YELLOW + insertMessages(player, areaname, res, enterMessage));
} }
} }
} }
if (chatchange && chatenabled) { if (chatchange && chatenabled) {
plugin.getChatManager().setChannel(pname, areaname); plugin.getChatManager().setChannel(pname, areaname);
} }
} }
public String insertMessages(final Player player, final String areaname, final ClaimedResidence res, String message) { public String insertMessages(final Player player, final String areaname, final ClaimedResidence res, String message) {
try { try {
message = message.replaceAll("%player", player.getName()); message = message.replaceAll("%player", player.getName());
message = message.replaceAll("%owner", res.getPermissions().getOwner()); message = message.replaceAll("%owner", res.getPermissions().getOwner());
message = message.replaceAll("%residence", areaname); message = message.replaceAll("%residence", areaname);
message = ChatColor.translateAlternateColorCodes('&', message); message = ChatColor.translateAlternateColorCodes('&', message);
} catch (final Exception ex) { } catch (final Exception ex) {
return ""; return "";
} }
return message; return message;
} }
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
public void onPlayerBucketEmpty(final PlayerBucketEmptyEvent event) { public void onPlayerBucketEmpty(final PlayerBucketEmptyEvent event) {
final Player player = event.getPlayer(); final Player player = event.getPlayer();
if (plugin.isResAdminOn(player)) { if (plugin.isResAdminOn(player)) {
return; return;
} }
final String pname = player.getName(); final String pname = player.getName();
final ClaimedResidence res = plugin.getResidenceManager().getByLoc(event.getBlockClicked().getLocation()); final ClaimedResidence res = plugin.getResidenceManager().getByLoc(event.getBlockClicked().getLocation());
if (res != null) { if (res != null) {
if (plugin.getConfigManager().preventRentModify() && plugin.getConfigManager().enabledRentSystem()) { if (plugin.getConfigManager().preventRentModify() && plugin.getConfigManager().enabledRentSystem()) {
if (plugin.getRentManager().isRented(res.getName())) { if (plugin.getRentManager().isRented(res.getName())) {
player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("RentedModifyDeny")); player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("RentedModifyDeny"));
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
} }
} }
final FlagPermissions perms = plugin.getPermsByLocForPlayer(event.getBlockClicked().getLocation(), player); final FlagPermissions perms = plugin.getPermsByLocForPlayer(event.getBlockClicked().getLocation(), player);
if (!perms.playerHas(pname, player.getWorld().getName(), "bucket", perms.playerHas(pname, player.getWorld().getName(), "build", true))) { if (!perms.playerHas(pname, player.getWorld().getName(), "bucket", perms.playerHas(pname, player.getWorld().getName(), "build", true))) {
player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("FlagDeny", "bucket")); player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("FlagDeny", "bucket"));
event.setCancelled(true); event.setCancelled(true);
} }
} }
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
public void onPlayerBucketFill(final PlayerBucketFillEvent event) { public void onPlayerBucketFill(final PlayerBucketFillEvent event) {
final Player player = event.getPlayer(); final Player player = event.getPlayer();
final String pname = player.getName(); final String pname = player.getName();
if (plugin.isResAdminOn(player)) { if (plugin.isResAdminOn(player)) {
return; return;
} }
final ClaimedResidence res = plugin.getResidenceManager().getByLoc(event.getBlockClicked().getLocation()); final ClaimedResidence res = plugin.getResidenceManager().getByLoc(event.getBlockClicked().getLocation());
if (res != null) { if (res != null) {
if (plugin.getConfigManager().preventRentModify() && plugin.getConfigManager().enabledRentSystem()) { if (plugin.getConfigManager().preventRentModify() && plugin.getConfigManager().enabledRentSystem()) {
if (plugin.getRentManager().isRented(res.getName())) { if (plugin.getRentManager().isRented(res.getName())) {
player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("RentedModifyDeny")); player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("RentedModifyDeny"));
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
} }
} }
final FlagPermissions perms = plugin.getPermsByLocForPlayer(event.getBlockClicked().getLocation(), player); final FlagPermissions perms = plugin.getPermsByLocForPlayer(event.getBlockClicked().getLocation(), player);
final boolean hasbucket = perms.playerHas(pname, player.getWorld().getName(), "bucket", perms.playerHas(pname, player.getWorld().getName(), "build", true)); final boolean hasbucket = perms.playerHas(pname, player.getWorld().getName(), "bucket", perms.playerHas(pname, player.getWorld().getName(), "build", true));
if (!hasbucket) { if (!hasbucket) {
player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("FlagDeny", "bucket")); player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("FlagDeny", "bucket"));
event.setCancelled(true); event.setCancelled(true);
} }
} }
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
public void onPlayerChat(final AsyncPlayerChatEvent event) { public void onPlayerChat(final AsyncPlayerChatEvent event) {
final String pname = event.getPlayer().getName(); final String pname = event.getPlayer().getName();
if (chatenabled && playerToggleChat.contains(pname)) { if (chatenabled && playerToggleChat.contains(pname)) {
final String area = currentRes.get(pname); final String area = currentRes.get(pname);
if (area != null) { if (area != null) {
final ChatChannel channel = plugin.getChatManager().getChannel(area); final ChatChannel channel = plugin.getChatManager().getChannel(area);
if (channel != null) { if (channel != null) {
channel.chat(pname, event.getMessage()); channel.chat(pname, event.getMessage());
} }
event.setCancelled(true); event.setCancelled(true);
} }
} }
} }
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
public void onPlayerInteract(final PlayerInteractEvent event) { public void onPlayerInteract(final PlayerInteractEvent event) {
final Player player = event.getPlayer(); final Player player = event.getPlayer();
final Material heldItem = player.getItemInHand().getType(); final Material heldItem = player.getItemInHand().getType();
final Block block = event.getClickedBlock(); final Block block = event.getClickedBlock();
if (block == null) { if (block == null) {
return; return;
} }
final Material mat = block.getType(); final Material mat = block.getType();
if (!((isContainer(mat, block) || isCanUseEntity_RClickOnly(mat, block)) && event.getAction() == Action.RIGHT_CLICK_BLOCK || isCanUseEntity_BothClick(mat, block) if (!((isContainer(mat, block) || isCanUseEntity_RClickOnly(mat, block)) && event.getAction() == Action.RIGHT_CLICK_BLOCK || isCanUseEntity_BothClick(mat, block)
|| event.getAction() == Action.PHYSICAL)) { || event.getAction() == Action.PHYSICAL)) {
final int typeId = player.getItemInHand().getTypeId(); final int typeId = player.getItemInHand().getTypeId();
if (typeId != plugin.getConfigManager().getSelectionTooldID() && typeId != plugin.getConfigManager().getInfoToolID() && typeId != 351 && typeId != 416) { if (typeId != plugin.getConfigManager().getSelectionTooldID() && typeId != plugin.getConfigManager().getInfoToolID() && typeId != 351 && typeId != 416) {
return; return;
} }
} }
FlagPermissions perms = plugin.getPermsByLocForPlayer(block.getLocation(), player); FlagPermissions perms = plugin.getPermsByLocForPlayer(block.getLocation(), player);
final String world = player.getWorld().getName(); final String world = player.getWorld().getName();
final String permgroup = plugin.getPermissionManager().getGroupNameByPlayer(player); final String permgroup = plugin.getPermissionManager().getGroupNameByPlayer(player);
final boolean resadmin = plugin.isResAdminOn(player); final boolean resadmin = plugin.isResAdminOn(player);
if (event.getAction() == Action.PHYSICAL) { if (event.getAction() == Action.PHYSICAL) {
if (!resadmin) { if (!resadmin) {
final boolean hasuse = perms.playerHas(player.getName(), world, "use", true); final boolean hasuse = perms.playerHas(player.getName(), world, "use", true);
final boolean haspressure = perms.playerHas(player.getName(), world, "pressure", hasuse); final boolean haspressure = perms.playerHas(player.getName(), world, "pressure", hasuse);
if ((!hasuse && !haspressure || !haspressure) && (mat == Material.STONE_PLATE || mat == Material.WOOD_PLATE)) { if ((!hasuse && !haspressure || !haspressure) && (mat == Material.STONE_PLATE || mat == Material.WOOD_PLATE)) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
} }
if (!perms.playerHas(player.getName(), world, "trample", perms.playerHas(player.getName(), world, "build", true)) && (mat == Material.SOIL || mat == Material.SOUL_SAND)) { if (!perms.playerHas(player.getName(), world, "trample", perms.playerHas(player.getName(), world, "build", true)) && (mat == Material.SOIL || mat == Material.SOUL_SAND)) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
return; return;
} }
if (!resadmin && !plugin.getItemManager().isAllowed(heldItem, permgroup, world)) { if (!resadmin && !plugin.getItemManager().isAllowed(heldItem, permgroup, world)) {
player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("ItemBlacklisted")); player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("ItemBlacklisted"));
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
if (event.getAction() == Action.LEFT_CLICK_BLOCK || event.getAction() == Action.RIGHT_CLICK_BLOCK) { if (event.getAction() == Action.LEFT_CLICK_BLOCK || event.getAction() == Action.RIGHT_CLICK_BLOCK) {
if (player.getItemInHand().getTypeId() == plugin.getConfigManager().getSelectionTooldID()) { if (player.getItemInHand().getTypeId() == plugin.getConfigManager().getSelectionTooldID()) {
final Plugin wep = Bukkit.getPluginManager().getPlugin("WorldEdit"); final Plugin wep = Bukkit.getPluginManager().getPlugin("WorldEdit");
if (wep != null) { if (wep != null) {
if (((WorldEditPlugin) wep).getConfig().getInt("wand-item") == plugin.getConfigManager().getSelectionTooldID()) { if (((WorldEditPlugin) wep).getConfig().getInt("wand-item") == plugin.getConfigManager().getSelectionTooldID()) {
return; return;
} }
} }
final PermissionGroup group = plugin.getPermissionManager().getGroup(player); final PermissionGroup group = plugin.getPermissionManager().getGroup(player);
if (player.hasPermission("residence.select") || player.hasPermission("residence.create") && !player.isPermissionSet("residence.select") if (player.hasPermission("residence.select") || player.hasPermission("residence.create") && !player.isPermissionSet("residence.select")
|| group.canCreateResidences() && !player.isPermissionSet("residence.create") && !player.isPermissionSet("residence.select") || resadmin) { || group.canCreateResidences() && !player.isPermissionSet("residence.create") && !player.isPermissionSet("residence.select") || resadmin) {
if (event.getAction() == Action.LEFT_CLICK_BLOCK) { if (event.getAction() == Action.LEFT_CLICK_BLOCK) {
final Location loc = block.getLocation(); final Location loc = block.getLocation();
plugin.getSelectionManager().placeLoc1(player, loc); plugin.getSelectionManager().placeLoc1(player, loc);
player.sendMessage(ChatColor.GREEN + plugin.getLanguage().getPhrase("SelectPoint", plugin.getLanguage().getPhrase("Primary")) + ChatColor.RED + "(" + loc.getBlockX() + "," player.sendMessage(ChatColor.GREEN + plugin.getLanguage().getPhrase("SelectPoint", plugin.getLanguage().getPhrase("Primary")) + ChatColor.RED + "(" + loc.getBlockX() + ","
+ loc.getBlockY() + "," + loc.getBlockZ() + ")" + ChatColor.GREEN + "!"); + loc.getBlockY() + "," + loc.getBlockZ() + ")" + ChatColor.GREEN + "!");
event.setCancelled(true); event.setCancelled(true);
} else if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { } else if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
final Location loc = block.getLocation(); final Location loc = block.getLocation();
plugin.getSelectionManager().placeLoc2(player, loc); plugin.getSelectionManager().placeLoc2(player, loc);
player.sendMessage(ChatColor.GREEN + plugin.getLanguage().getPhrase("SelectPoint", plugin.getLanguage().getPhrase("Secondary")) + ChatColor.RED + "(" + loc.getBlockX() + "," player.sendMessage(ChatColor.GREEN + plugin.getLanguage().getPhrase("SelectPoint", plugin.getLanguage().getPhrase("Secondary")) + ChatColor.RED + "(" + loc.getBlockX() + ","
+ loc.getBlockY() + "," + loc.getBlockZ() + ")" + ChatColor.GREEN + "!"); + loc.getBlockY() + "," + loc.getBlockZ() + ")" + ChatColor.GREEN + "!");
} }
} }
} }
if (player.getItemInHand().getTypeId() == plugin.getConfigManager().getInfoToolID()) { if (player.getItemInHand().getTypeId() == plugin.getConfigManager().getInfoToolID()) {
if (event.getAction() == Action.LEFT_CLICK_BLOCK) { if (event.getAction() == Action.LEFT_CLICK_BLOCK) {
final Location loc = block.getLocation(); final Location loc = block.getLocation();
final String res = plugin.getResidenceManager().getNameByLoc(loc); final String res = plugin.getResidenceManager().getNameByLoc(loc);
if (res != null) { if (res != null) {
plugin.getResidenceManager().printAreaInfo(res, player); plugin.getResidenceManager().printAreaInfo(res, player);
event.setCancelled(true); event.setCancelled(true);
} else { } else {
event.setCancelled(true); event.setCancelled(true);
player.sendMessage(plugin.getLanguage().getPhrase("NoResHere")); player.sendMessage(plugin.getLanguage().getPhrase("NoResHere"));
} }
} }
} }
if (!resadmin) { if (!resadmin) {
if (heldItem != null) { if (heldItem != null) {
if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
if (player.getItemInHand().getTypeId() == 351) { if (player.getItemInHand().getTypeId() == 351) {
if (player.getItemInHand().getData().getData() == 15 && block.getType() == Material.GRASS || player.getItemInHand().getData().getData() == 3 && block.getTypeId() == 17 if (player.getItemInHand().getData().getData() == 15 && block.getType() == Material.GRASS || player.getItemInHand().getData().getData() == 3 && block.getTypeId() == 17
&& (block.getData() == 3 || block.getData() == 7 || block.getData() == 11 || block.getData() == 15)) { && (block.getData() == 3 || block.getData() == 7 || block.getData() == 11 || block.getData() == 15)) {
perms = plugin.getPermsByLocForPlayer(block.getRelative(event.getBlockFace()).getLocation(), player); perms = plugin.getPermsByLocForPlayer(block.getRelative(event.getBlockFace()).getLocation(), player);
if (!perms.playerHas(player.getName(), world, "build", true)) { if (!perms.playerHas(player.getName(), world, "build", true)) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
} }
} }
if (plugin.isGt1_8()) { if (plugin.isGt1_8()) {
if (heldItem == Material.ARMOR_STAND) { if (heldItem == Material.ARMOR_STAND) {
perms = plugin.getPermsByLocForPlayer(block.getRelative(event.getBlockFace()).getLocation(), player); perms = plugin.getPermsByLocForPlayer(block.getRelative(event.getBlockFace()).getLocation(), player);
if (!perms.playerHas(player.getName(), world, "build", true)) { if (!perms.playerHas(player.getName(), world, "build", true)) {
player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("NoPermission")); player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("NoPermission"));
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
} }
} }
} }
} }
if (isContainer(mat, block) || isCanUseEntity(mat, block)) { if (isContainer(mat, block) || isCanUseEntity(mat, block)) {
final boolean hasuse = perms.playerHas(player.getName(), world, "use", true); final boolean hasuse = perms.playerHas(player.getName(), world, "use", true);
for (final Entry<Material, String> checkMat : FlagPermissions.getMaterialUseFlagList().entrySet()) { for (final Entry<Material, String> checkMat : FlagPermissions.getMaterialUseFlagList().entrySet()) {
if (mat == checkMat.getKey()) { if (mat == checkMat.getKey()) {
if (!perms.playerHas(player.getName(), world, checkMat.getValue(), hasuse)) { if (!perms.playerHas(player.getName(), world, checkMat.getValue(), hasuse)) {
if (hasuse || checkMat.getValue().equals("container")) { if (hasuse || checkMat.getValue().equals("container")) {
event.setCancelled(true); event.setCancelled(true);
player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("FlagDeny", checkMat.getValue())); player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("FlagDeny", checkMat.getValue()));
return; return;
} else { } else {
event.setCancelled(true); event.setCancelled(true);
player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("FlagDeny", "use")); player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("FlagDeny", "use"));
return; return;
} }
} }
} }
} }
if (plugin.getConfigManager().getCustomContainers().contains(Integer.valueOf(block.getTypeId()))) { if (plugin.getConfigManager().getCustomContainers().contains(block.getTypeId())) {
if (!perms.playerHas(player.getName(), world, "container", hasuse)) { if (!perms.playerHas(player.getName(), world, "container", hasuse)) {
event.setCancelled(true); event.setCancelled(true);
player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("FlagDeny", "container")); player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("FlagDeny", "container"));
return; return;
} }
} }
if (plugin.getConfigManager().getCustomBothClick().contains(Integer.valueOf(block.getTypeId()))) { if (plugin.getConfigManager().getCustomBothClick().contains(block.getTypeId())) {
if (!hasuse) { if (!hasuse) {
event.setCancelled(true); event.setCancelled(true);
player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("FlagDeny", "use")); player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("FlagDeny", "use"));
return; return;
} }
} }
if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
if (plugin.getConfigManager().getCustomRightClick().contains(Integer.valueOf(block.getTypeId()))) { if (plugin.getConfigManager().getCustomRightClick().contains(block.getTypeId())) {
if (!hasuse) { if (!hasuse) {
event.setCancelled(true); event.setCancelled(true);
player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("FlagDeny", "use")); player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("FlagDeny", "use"));
return; }
} }
} }
} }
} }
} }
} }
}
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
public void onPlayerInteractEntity(final PlayerInteractEntityEvent event) { public void onPlayerInteractEntity(final PlayerInteractEntityEvent event) {
final Player player = event.getPlayer(); final Player player = event.getPlayer();
if (plugin.isResAdminOn(player)) { if (plugin.isResAdminOn(player)) {
return; return;
} }
final Entity ent = event.getRightClicked(); final Entity ent = event.getRightClicked();
/* Trade */ /* Trade */
if (ent.getType() == EntityType.VILLAGER) { if (ent.getType() == EntityType.VILLAGER) {
final ClaimedResidence res = plugin.getResidenceManager().getByLoc(event.getPlayer().getLocation()); final ClaimedResidence res = plugin.getResidenceManager().getByLoc(event.getPlayer().getLocation());
if (res != null && !res.getPermissions().playerHas(player.getName(), "trade", true)) { if (res != null && !res.getPermissions().playerHas(player.getName(), "trade", true)) {
player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("NoPermission")); player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("NoPermission"));
event.setCancelled(true); event.setCancelled(true);
} }
} }
/* Container - ItemFrame protection */
final Material heldItem = player.getItemInHand().getType();
if (!(ent instanceof Hanging)) {
return;
}
final Hanging hanging = (Hanging) ent;
if (hanging.getType() != EntityType.ITEM_FRAME) {
return;
}
final FlagPermissions perms = plugin.getPermsByLocForPlayer(ent.getLocation(), player);
final String world = player.getWorld().getName();
final String permgroup = plugin.getPermissionManager().getGroupNameByPlayer(player);
if (!plugin.getItemManager().isAllowed(heldItem, permgroup, world)) {
player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("ItemBlacklisted"));
event.setCancelled(true);
return;
}
if (!perms.playerHas(player.getName(), world, "container", perms.playerHas(player.getName(), world, "use", true))) {
event.setCancelled(true);
player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("FlagDeny", "container"));
}
}
/* Container - ItemFrame protection */ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
final Material heldItem = player.getItemInHand().getType(); public void onPlayerJoin(final PlayerJoinEvent event) {
if (!(ent instanceof Hanging)) { final Player player = event.getPlayer();
return; lastUpdate.put(player.getName(), 0L);
} if (plugin.getPermissionManager().isResidenceAdmin(player)) {
final Hanging hanging = (Hanging) ent; plugin.turnResAdminOn(player);
if (hanging.getType() != EntityType.ITEM_FRAME) { }
return; handleNewLocation(player, player.getLocation(), false);
} }
final FlagPermissions perms = plugin.getPermsByLocForPlayer(ent.getLocation(), player);
final String world = player.getWorld().getName();
final String permgroup = plugin.getPermissionManager().getGroupNameByPlayer(player);
if (!plugin.getItemManager().isAllowed(heldItem, permgroup, world)) {
player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("ItemBlacklisted"));
event.setCancelled(true);
return;
}
if (!perms.playerHas(player.getName(), world, "container", perms.playerHas(player.getName(), world, "use", true))) {
event.setCancelled(true);
player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("FlagDeny", "container"));
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
public void onPlayerJoin(final PlayerJoinEvent event) { public void onPlayerMove(final PlayerMoveEvent event) {
final Player player = event.getPlayer(); final Player player = event.getPlayer();
lastUpdate.put(player.getName(), 0L); if (player == null) {
if (plugin.getPermissionManager().isResidenceAdmin(player)) { return;
plugin.turnResAdminOn(player); }
} final long now = System.currentTimeMillis();
handleNewLocation(player, player.getLocation(), false); if (!lastUpdate.containsKey(player.getName())) {
} lastUpdate.put(player.getName(), now);
return;
}
final long last = lastUpdate.get(player.getName());
if (now - last < plugin.getConfigManager().getMinMoveUpdateInterval()) {
return;
}
lastUpdate.put(player.getName(), now);
if (event.getFrom().getWorld() == event.getTo().getWorld()) {
if (event.getFrom().distance(event.getTo()) == 0) {
return;
}
}
handleNewLocation(player, event.getTo(), true);
}
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.MONITOR)
public void onPlayerMove(final PlayerMoveEvent event) { public void onPlayerQuit(final PlayerQuitEvent event) {
final Player player = event.getPlayer(); final String pname = event.getPlayer().getName();
if (player == null) { currentRes.remove(pname);
return; lastUpdate.remove(pname);
} lastOutsideLoc.remove(pname);
final long now = System.currentTimeMillis(); plugin.getChatManager().removeFromChannel(pname);
if (!lastUpdate.containsKey(player.getName())) { }
lastUpdate.put(player.getName(), now);
return;
}
final long last = lastUpdate.get(player.getName());
if (now - last < plugin.getConfigManager().getMinMoveUpdateInterval()) {
return;
}
lastUpdate.put(player.getName(), now);
if (event.getFrom().getWorld() == event.getTo().getWorld()) {
if (event.getFrom().distance(event.getTo()) == 0) {
return;
}
}
handleNewLocation(player, event.getTo(), true);
}
@EventHandler(priority = EventPriority.MONITOR) @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
public void onPlayerQuit(final PlayerQuitEvent event) { public void onPlayerSpawn(final PlayerRespawnEvent event) {
final String pname = event.getPlayer().getName(); Location loc = event.getRespawnLocation();
currentRes.remove(pname); final Boolean bed = event.isBedSpawn();
lastUpdate.remove(pname); final Player player = event.getPlayer();
lastOutsideLoc.remove(pname); ClaimedResidence res = plugin.getResidenceManager().getByLoc(loc);
plugin.getChatManager().removeFromChannel(pname); if (res == null) {
} return;
}
if (res.getPermissions().playerHas(player.getName(), "move", true)) {
return;
}
if (bed) {
loc = player.getWorld().getSpawnLocation();
}
res = plugin.getResidenceManager().getByLoc(loc);
if (res != null) {
if (!res.getPermissions().playerHas(player.getName(), "move", true)) {
loc = res.getOutsideFreeLoc(loc);
}
}
player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("NoSpawn"));
event.setRespawnLocation(loc);
}
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
public void onPlayerSpawn(final PlayerRespawnEvent event) { public void onPlayerTeleport(final PlayerTeleportEvent event) {
Location loc = event.getRespawnLocation(); final Location loc = event.getTo();
final Boolean bed = event.isBedSpawn(); final Player player = event.getPlayer();
final Player player = event.getPlayer(); final ClaimedResidence res = plugin.getResidenceManager().getByLoc(loc);
ClaimedResidence res = plugin.getResidenceManager().getByLoc(loc); if (res != null) {
if (res == null) { if (plugin.isResAdminOn(player) || ((res.getPermissions().playerHas(player.getName(), "tp", true) || player.hasPermission("residence.admin.tp"))
return; && (res.getPermissions().playerHas(player.getName(), "move", true) || player.hasPermission("residence.admin.move")))) {
} handleNewLocation(player, loc, false);
if (res.getPermissions().playerHas(player.getName(), "move", true)) { } else {
return; final String areaname = res.getName();
} event.setCancelled(true);
if (bed) { player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("TeleportDeny", areaname));
loc = player.getWorld().getSpawnLocation(); }
} }
res = plugin.getResidenceManager().getByLoc(loc); }
if (res != null) {
if (!res.getPermissions().playerHas(player.getName(), "move", true)) {
loc = res.getOutsideFreeLoc(loc);
}
}
player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("NoSpawn"));
event.setRespawnLocation(loc);
}
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void tooglePlayerResidenceChat(final Player player) {
public void onPlayerTeleport(final PlayerTeleportEvent event) { final String pname = player.getName();
final Location loc = event.getTo(); if (playerToggleChat.contains(pname)) {
final Player player = event.getPlayer(); playerToggleChat.remove(pname);
final ClaimedResidence res = plugin.getResidenceManager().getByLoc(loc); player.sendMessage(ChatColor.YELLOW + plugin.getLanguage().getPhrase("ResidenceChat", ChatColor.RED + "OFF" + ChatColor.YELLOW + "!"));
if (res != null) { } else {
if (plugin.isResAdminOn(player) || ((res.getPermissions().playerHas(player.getName(), "tp", true) || player.hasPermission("residence.admin.tp")) playerToggleChat.add(pname);
&& (res.getPermissions().playerHas(player.getName(), "move", true) || player.hasPermission("residence.admin.move")))) { player.sendMessage(ChatColor.YELLOW + plugin.getLanguage().getPhrase("ResidenceChat", ChatColor.RED + "ON" + ChatColor.YELLOW + "!"));
handleNewLocation(player, loc, false); }
} else { }
final String areaname = res.getName();
event.setCancelled(true);
player.sendMessage(ChatColor.RED + plugin.getLanguage().getPhrase("TeleportDeny", areaname));
return;
}
}
}
public void tooglePlayerResidenceChat(final Player player) { private boolean isCanUseEntity(final Material mat, final Block block) {
final String pname = player.getName(); return isCanUseEntity_BothClick(mat, block) || isCanUseEntity_RClickOnly(mat, block);
if (playerToggleChat.contains(pname)) { }
playerToggleChat.remove(pname);
player.sendMessage(ChatColor.YELLOW + plugin.getLanguage().getPhrase("ResidenceChat", ChatColor.RED + "OFF" + ChatColor.YELLOW + "!"));
} else {
playerToggleChat.add(pname);
player.sendMessage(ChatColor.YELLOW + plugin.getLanguage().getPhrase("ResidenceChat", ChatColor.RED + "ON" + ChatColor.YELLOW + "!"));
}
}
private boolean isCanUseEntity(final Material mat, final Block block) { private boolean isCanUseEntity_BothClick(final Material mat, final Block block) {
return isCanUseEntity_BothClick(mat, block) || isCanUseEntity_RClickOnly(mat, block); return mat == Material.LEVER || mat == Material.STONE_BUTTON || mat == Material.WOOD_BUTTON || mat == Material.WOODEN_DOOR || mat == Material.TRAP_DOOR || mat == Material.FENCE_GATE
} || mat == Material.PISTON_BASE || mat == Material.PISTON_STICKY_BASE || mat == Material.DRAGON_EGG
|| plugin.getConfigManager().getCustomBothClick().contains(block.getTypeId())
|| (plugin.isGt1_8() && (mat == Material.SPRUCE_DOOR || mat == Material.BIRCH_DOOR || mat == Material.JUNGLE_DOOR || mat == Material.ACACIA_DOOR || mat == Material.DARK_OAK_DOOR
|| mat == Material.SPRUCE_FENCE_GATE || mat == Material.BIRCH_FENCE_GATE || mat == Material.JUNGLE_FENCE_GATE || mat == Material.ACACIA_FENCE_GATE
|| mat == Material.DARK_OAK_FENCE_GATE));
}
private boolean isCanUseEntity_BothClick(final Material mat, final Block block) { private boolean isCanUseEntity_RClickOnly(final Material mat, final Block block) {
return mat == Material.LEVER || mat == Material.STONE_BUTTON || mat == Material.WOOD_BUTTON || mat == Material.WOODEN_DOOR || mat == Material.TRAP_DOOR || mat == Material.FENCE_GATE return mat == Material.ITEM_FRAME || mat == Material.BEACON || mat == Material.FLOWER_POT || mat == Material.COMMAND || mat == Material.ANVIL || mat == Material.CAKE_BLOCK
|| mat == Material.PISTON_BASE || mat == Material.PISTON_STICKY_BASE || mat == Material.DRAGON_EGG || mat == Material.NOTE_BLOCK || mat == Material.DIODE || mat == Material.DIODE_BLOCK_OFF || mat == Material.DIODE_BLOCK_ON || mat == Material.BED_BLOCK || mat == Material.WORKBENCH
|| plugin.getConfigManager().getCustomBothClick().contains(Integer.valueOf(block.getTypeId())) || mat == Material.BREWING_STAND || mat == Material.ENCHANTMENT_TABLE || plugin.getConfigManager().getCustomRightClick().contains(block.getTypeId());
|| (plugin.isGt1_8() && (mat == Material.SPRUCE_DOOR || mat == Material.BIRCH_DOOR || mat == Material.JUNGLE_DOOR || mat == Material.ACACIA_DOOR || mat == Material.DARK_OAK_DOOR }
|| mat == Material.SPRUCE_FENCE_GATE || mat == Material.BIRCH_FENCE_GATE || mat == Material.JUNGLE_FENCE_GATE || mat == Material.ACACIA_FENCE_GATE
|| mat == Material.DARK_OAK_FENCE_GATE));
}
private boolean isCanUseEntity_RClickOnly(final Material mat, final Block block) { private boolean isContainer(final Material mat, final Block block) {
return mat == Material.ITEM_FRAME || mat == Material.BEACON || mat == Material.FLOWER_POT || mat == Material.COMMAND || mat == Material.ANVIL || mat == Material.CAKE_BLOCK return FlagPermissions.getMaterialUseFlagList().containsKey(mat) && FlagPermissions.getMaterialUseFlagList().get(mat).equals("container")
|| mat == Material.NOTE_BLOCK || mat == Material.DIODE || mat == Material.DIODE_BLOCK_OFF || mat == Material.DIODE_BLOCK_ON || mat == Material.BED_BLOCK || mat == Material.WORKBENCH || plugin.getConfigManager().getCustomContainers().contains(block.getTypeId());
|| mat == Material.BREWING_STAND || mat == Material.ENCHANTMENT_TABLE || plugin.getConfigManager().getCustomRightClick().contains(Integer.valueOf(block.getTypeId())); }
}
private boolean isContainer(final Material mat, final Block block) {
return FlagPermissions.getMaterialUseFlagList().containsKey(mat) && FlagPermissions.getMaterialUseFlagList().get(mat).equals("container")
|| plugin.getConfigManager().getCustomContainers().contains(Integer.valueOf(block.getTypeId()));
}
} }