From e1f0938f59af482363062fecfe6a6f434732a3a0 Mon Sep 17 00:00:00 2001 From: utarwyn Date: Thu, 17 May 2018 01:38:59 +0200 Subject: [PATCH 1/3] Fix item frame/armor stand protection --- .../listeners/FactionsEntityListener.java | 28 +++++++++++++++++ .../listeners/FactionsPlayerListener.java | 30 +++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/src/main/java/com/massivecraft/factions/listeners/FactionsEntityListener.java b/src/main/java/com/massivecraft/factions/listeners/FactionsEntityListener.java index 3a80dc09..a8edb958 100644 --- a/src/main/java/com/massivecraft/factions/listeners/FactionsEntityListener.java +++ b/src/main/java/com/massivecraft/factions/listeners/FactionsEntityListener.java @@ -131,6 +131,34 @@ public class FactionsEntityListener implements Listener { } } } else { + // Protect armor stands/item frames from being damaged in protected territories + if (damagee.getType() == EntityType.ITEM_FRAME || damagee.getType() == EntityType.ARMOR_STAND) { + // Run the check for a player + if (damager instanceof Player) { + // Generate the action message. + String entityAction; + + if (damagee.getType() == EntityType.ITEM_FRAME) { + entityAction = "item frames"; + } else { + entityAction = "armor stands"; + } + + if (!FactionsBlockListener.playerCanBuildDestroyBlock((Player) damager, damagee.getLocation(), "destroy " + entityAction, false)) { + event.setCancelled(true); + } + } else { + // we don't want to let mobs/arrows destroy item frames/armor stands + // so we only have to run the check as if there had been an explosion at the damager location + if (!this.checkExplosionForBlock(damager, damagee.getLocation().getBlock())) { + event.setCancelled(true); + } + } + + // we don't need to go after + return; + } + //this one should trigger if something other than a player takes damage if (damager instanceof Player) { // now itll only go here if the damage is dealt by a player diff --git a/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java b/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java index 8a03536b..5178a04d 100644 --- a/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java +++ b/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java @@ -658,6 +658,36 @@ public class FactionsPlayerListener implements Listener { } } + // For disabling interactions with item frames in another faction's territory + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { + // only need to check for item frames + if (event.getRightClicked().getType() != EntityType.ITEM_FRAME) { + return; + } + + Player player = event.getPlayer(); + Entity entity = event.getRightClicked(); + + if (!FactionsBlockListener.playerCanBuildDestroyBlock(player, entity.getLocation(), "use item frames", false)) { + event.setCancelled(true); + } + } + + // For disabling interactions with armor stands in another faction's territory + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + public void onPlayerInteractAtEntity(PlayerInteractAtEntityEvent event) { + Entity entity = event.getRightClicked(); + + // only need to check for armor stand and item frames + if (entity.getType() != EntityType.ARMOR_STAND) { + return; + } + + if (!FactionsBlockListener.playerCanBuildDestroyBlock(event.getPlayer(), entity.getLocation(), "use armor stands", false)) { + event.setCancelled(true); + } + } // for handling people who repeatedly spam attempts to open a door (or similar) in another faction's territory private Map interactSpammers = new HashMap<>(); From 4a8721e453f96e5e6d1438943000a4d830985006 Mon Sep 17 00:00:00 2001 From: utarwyn Date: Thu, 17 May 2018 17:50:07 +0200 Subject: [PATCH 2/3] =?UTF-8?q?Prevent=20usage=20of=20armor=20stands=20by?= =?UTF-8?q?=20default=20=E2=80=94=20Prevent=20item=20frames=20from=20being?= =?UTF-8?q?=20shot?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/massivecraft/factions/Conf.java | 2 ++ .../factions/listeners/FactionsEntityListener.java | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/src/main/java/com/massivecraft/factions/Conf.java b/src/main/java/com/massivecraft/factions/Conf.java index 79b408e0..99a811e9 100644 --- a/src/main/java/com/massivecraft/factions/Conf.java +++ b/src/main/java/com/massivecraft/factions/Conf.java @@ -411,6 +411,7 @@ public class Conf { territoryDenyUseageMaterials.add(Material.BUCKET); territoryDenyUseageMaterials.add(Material.WATER_BUCKET); territoryDenyUseageMaterials.add(Material.LAVA_BUCKET); + territoryDenyUseageMaterials.add(Material.ARMOR_STAND); territoryProtectedMaterialsWhenOffline.add(Material.WOODEN_DOOR); territoryProtectedMaterialsWhenOffline.add(Material.TRAP_DOOR); @@ -437,6 +438,7 @@ public class Conf { territoryDenyUseageMaterialsWhenOffline.add(Material.BUCKET); territoryDenyUseageMaterialsWhenOffline.add(Material.WATER_BUCKET); territoryDenyUseageMaterialsWhenOffline.add(Material.LAVA_BUCKET); + territoryDenyUseageMaterialsWhenOffline.add(Material.ARMOR_STAND); safeZoneNerfedCreatureTypes.add(EntityType.BLAZE); safeZoneNerfedCreatureTypes.add(EntityType.CAVE_SPIDER); diff --git a/src/main/java/com/massivecraft/factions/listeners/FactionsEntityListener.java b/src/main/java/com/massivecraft/factions/listeners/FactionsEntityListener.java index a8edb958..8fefd298 100644 --- a/src/main/java/com/massivecraft/factions/listeners/FactionsEntityListener.java +++ b/src/main/java/com/massivecraft/factions/listeners/FactionsEntityListener.java @@ -133,6 +133,11 @@ public class FactionsEntityListener implements Listener { } else { // Protect armor stands/item frames from being damaged in protected territories if (damagee.getType() == EntityType.ITEM_FRAME || damagee.getType() == EntityType.ARMOR_STAND) { + // Manage projectiles launched by players + if (damager instanceof Projectile && ((Projectile) damager).getShooter() instanceof Entity) { + damager = (Entity) ((Projectile) damager).getShooter(); + } + // Run the check for a player if (damager instanceof Player) { // Generate the action message. @@ -612,6 +617,8 @@ public class FactionsEntityListener implements Listener { public void onPaintingPlace(HangingPlaceEvent event) { if (!FactionsBlockListener.playerCanBuildDestroyBlock(event.getPlayer(), event.getBlock().getLocation(), "place paintings", false)) { event.setCancelled(true); + // Fix: update player's inventory to avoid items glitches + event.getPlayer().updateInventory(); } } From 5fecc4979cf6977e8484c5c30741201e66044e00 Mon Sep 17 00:00:00 2001 From: utarwyn Date: Thu, 17 May 2018 18:01:05 +0200 Subject: [PATCH 3/3] Reformat code for item frames/armor stands protection --- .../java/com/massivecraft/factions/Conf.java | 2 +- .../listeners/FactionsEntityListener.java | 14 ++++++------ .../listeners/FactionsPlayerListener.java | 22 +++++++++---------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/massivecraft/factions/Conf.java b/src/main/java/com/massivecraft/factions/Conf.java index 99a811e9..cc466758 100644 --- a/src/main/java/com/massivecraft/factions/Conf.java +++ b/src/main/java/com/massivecraft/factions/Conf.java @@ -438,7 +438,7 @@ public class Conf { territoryDenyUseageMaterialsWhenOffline.add(Material.BUCKET); territoryDenyUseageMaterialsWhenOffline.add(Material.WATER_BUCKET); territoryDenyUseageMaterialsWhenOffline.add(Material.LAVA_BUCKET); - territoryDenyUseageMaterialsWhenOffline.add(Material.ARMOR_STAND); + territoryDenyUseageMaterialsWhenOffline.add(Material.ARMOR_STAND); safeZoneNerfedCreatureTypes.add(EntityType.BLAZE); safeZoneNerfedCreatureTypes.add(EntityType.CAVE_SPIDER); diff --git a/src/main/java/com/massivecraft/factions/listeners/FactionsEntityListener.java b/src/main/java/com/massivecraft/factions/listeners/FactionsEntityListener.java index 8fefd298..241a47e6 100644 --- a/src/main/java/com/massivecraft/factions/listeners/FactionsEntityListener.java +++ b/src/main/java/com/massivecraft/factions/listeners/FactionsEntityListener.java @@ -134,9 +134,9 @@ public class FactionsEntityListener implements Listener { // Protect armor stands/item frames from being damaged in protected territories if (damagee.getType() == EntityType.ITEM_FRAME || damagee.getType() == EntityType.ARMOR_STAND) { // Manage projectiles launched by players - if (damager instanceof Projectile && ((Projectile) damager).getShooter() instanceof Entity) { - damager = (Entity) ((Projectile) damager).getShooter(); - } + if (damager instanceof Projectile && ((Projectile) damager).getShooter() instanceof Entity) { + damager = (Entity) ((Projectile) damager).getShooter(); + } // Run the check for a player if (damager instanceof Player) { @@ -154,10 +154,10 @@ public class FactionsEntityListener implements Listener { } } else { // we don't want to let mobs/arrows destroy item frames/armor stands - // so we only have to run the check as if there had been an explosion at the damager location - if (!this.checkExplosionForBlock(damager, damagee.getLocation().getBlock())) { - event.setCancelled(true); - } + // so we only have to run the check as if there had been an explosion at the damager location + if (!this.checkExplosionForBlock(damager, damagee.getLocation().getBlock())) { + event.setCancelled(true); + } } // we don't need to go after diff --git a/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java b/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java index 5178a04d..5183969a 100644 --- a/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java +++ b/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java @@ -675,19 +675,19 @@ public class FactionsPlayerListener implements Listener { } // For disabling interactions with armor stands in another faction's territory - @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) - public void onPlayerInteractAtEntity(PlayerInteractAtEntityEvent event) { - Entity entity = event.getRightClicked(); + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + public void onPlayerInteractAtEntity(PlayerInteractAtEntityEvent event) { + Entity entity = event.getRightClicked(); - // only need to check for armor stand and item frames - if (entity.getType() != EntityType.ARMOR_STAND) { - return; - } + // only need to check for armor stand and item frames + if (entity.getType() != EntityType.ARMOR_STAND) { + return; + } - if (!FactionsBlockListener.playerCanBuildDestroyBlock(event.getPlayer(), entity.getLocation(), "use armor stands", false)) { - event.setCancelled(true); - } - } + if (!FactionsBlockListener.playerCanBuildDestroyBlock(event.getPlayer(), entity.getLocation(), "use armor stands", false)) { + event.setCancelled(true); + } + } // for handling people who repeatedly spam attempts to open a door (or similar) in another faction's territory private Map interactSpammers = new HashMap<>();