diff --git a/src/main/java/com/massivecraft/factions/Factions.java b/src/main/java/com/massivecraft/factions/Factions.java index 6dc3f97f..bd0378da 100644 --- a/src/main/java/com/massivecraft/factions/Factions.java +++ b/src/main/java/com/massivecraft/factions/Factions.java @@ -39,6 +39,7 @@ import com.massivecraft.factions.integration.herochat.IntegrationHerochat; import com.massivecraft.factions.integration.lwc.IntegrationLwc; import com.massivecraft.factions.mixin.PowerMixin; import com.massivecraft.factions.mixin.PowerMixinDefault; +import com.massivecraft.factions.spigot.SpigotFeatures; import com.massivecraft.factions.task.TaskFlagPermCreate; import com.massivecraft.factions.task.TaskPlayerDataRemove; import com.massivecraft.factions.task.TaskEconLandReward; @@ -158,6 +159,9 @@ public class Factions extends MassivePlugin IntegrationLwc.get() ); + // Spigot + SpigotFeatures.activate(); + // Modulo Repeat Tasks TaskPlayerPowerUpdate.get().activate(this); TaskPlayerDataRemove.get().activate(this); diff --git a/src/main/java/com/massivecraft/factions/engine/EngineMain.java b/src/main/java/com/massivecraft/factions/engine/EngineMain.java index 78f353a6..e00cd91e 100644 --- a/src/main/java/com/massivecraft/factions/engine/EngineMain.java +++ b/src/main/java/com/massivecraft/factions/engine/EngineMain.java @@ -85,6 +85,7 @@ import com.massivecraft.factions.event.EventFactionsPvpDisallowed; import com.massivecraft.factions.event.EventFactionsPowerChange; import com.massivecraft.factions.event.EventFactionsPowerChange.PowerChangeReason; import com.massivecraft.factions.integration.Econ; +import com.massivecraft.factions.spigot.SpigotFeatures; import com.massivecraft.factions.util.VisualizeUtil; import com.massivecraft.massivecore.EngineAbstract; import com.massivecraft.massivecore.PriorityLines; @@ -1496,37 +1497,49 @@ public class EngineMain extends EngineAbstract return true; } + // This event will not fire for Minecraft 1.8 armor stands. + // Armor stands are handled in EngineSpigot instead. @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { - // If a player ... + // Gather Info final Player player = event.getPlayer(); - - // ... right clicked an entity ... final Entity entity = event.getRightClicked(); - if (entity == null) return; - - // ... and using that entity is forbidden ... - if (canPlayerUseEntity(player, entity, true)) return; + final boolean verboose = true; - // ... then cancel the event. + // If we can't use ... + if (EngineMain.canPlayerUseEntity(player, entity, verboose)) return; + + // ... block use. event.setCancelled(true); } public static boolean canPlayerUseEntity(Player player, Entity entity, boolean verboose) { + // If a player ... + if (player == null) return true; + + // ... interacts with an entity ... + if (entity == null) return true; + + // ... and the player does not bypass all protections ... String name = player.getName(); if (MConf.get().playersWhoBypassAllProtection.contains(name)) return true; + // ... and the player is not using admin mode ... MPlayer me = MPlayer.get(player); if (me.isUsingAdminMode()) return true; - PS ps = PS.valueOf(entity.getLocation()); + // ... and the entity is of a container type ... EntityType type = entity.getType(); + if ( ! MConf.get().entityTypesContainer.contains(type)) return true; - if (MConf.get().entityTypesContainer.contains(type) && ! MPerm.getPermContainer().has(me, ps, verboose)) return false; + // ... and the player lacks the container perm ... + PS ps = PS.valueOf(entity.getLocation()); + if (MPerm.getPermContainer().has(me, ps, verboose)) return true; - return true; + // ... then we can't use the entity. + return false; } // For some reason onPlayerInteract() sometimes misses bucket events depending on distance (something like 2-3 blocks away isn't detected), diff --git a/src/main/java/com/massivecraft/factions/entity/MConf.java b/src/main/java/com/massivecraft/factions/entity/MConf.java index 6a583ee0..b0ba717a 100644 --- a/src/main/java/com/massivecraft/factions/entity/MConf.java +++ b/src/main/java/com/massivecraft/factions/entity/MConf.java @@ -528,7 +528,7 @@ public class MConf extends Entity public BackstringEnumSet entityTypesContainer = new BackstringEnumSet(EntityType.class, "MINECART_CHEST", // Minecraft 1.? "MINECART_HOPPER", // Minecraft 1.? - "ARMOR_STAND" // Minecraft 1.? + "ARMOR_STAND" // Minecraft 1.8 ); public BackstringEnumSet entityTypesMonsters = new BackstringEnumSet(EntityType.class, diff --git a/src/main/java/com/massivecraft/factions/spigot/EngineSpigot.java b/src/main/java/com/massivecraft/factions/spigot/EngineSpigot.java new file mode 100644 index 00000000..2529df23 --- /dev/null +++ b/src/main/java/com/massivecraft/factions/spigot/EngineSpigot.java @@ -0,0 +1,76 @@ +package com.massivecraft.factions.spigot; + +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerInteractAtEntityEvent; +import org.bukkit.plugin.Plugin; + +import com.massivecraft.factions.Factions; +import com.massivecraft.factions.engine.EngineMain; +import com.massivecraft.massivecore.EngineAbstract; + + +public class EngineSpigot extends EngineAbstract +{ + // -------------------------------------------- // + // INSTANCE & CONSTRUCT + // -------------------------------------------- // + + private static EngineSpigot i = new EngineSpigot(); + public static EngineSpigot get() { return i; } + private EngineSpigot() {} + + // -------------------------------------------- // + // OVERRIDE + // -------------------------------------------- // + + @Override + public Plugin getPlugin() + { + return Factions.get(); + } + + @Override + public void activate() + { + super.activate(); + SpigotFeatures.setActive(true); + } + + @Override + public void deactivate() + { + super.deactivate(); + SpigotFeatures.setActive(false); + } + + // -------------------------------------------- // + // LISTENER + // -------------------------------------------- // + + // This is a special Spigot event that fires for Minecraft 1.8 armor stands. + // It also fires for other entity types but for those the event is buggy. + // It seems we can only cancel interaction with armor stands from here. + // Thus we only handle armor stands from here and handle everything else in EngineMain. + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + public void onPlayerInteractAtEntity(PlayerInteractAtEntityEvent event) + { + // Gather Info + final Player player = event.getPlayer(); + final Entity entity = event.getRightClicked(); + final boolean verboose = true; + + // Only care for armor stands. + if (entity.getType() != EntityType.ARMOR_STAND) return; + + // If we can't use ... + if (EngineMain.canPlayerUseEntity(player, entity, verboose)) return; + + // ... block use. + event.setCancelled(true); + } + +} diff --git a/src/main/java/com/massivecraft/factions/spigot/SpigotFeatures.java b/src/main/java/com/massivecraft/factions/spigot/SpigotFeatures.java new file mode 100644 index 00000000..a5382d27 --- /dev/null +++ b/src/main/java/com/massivecraft/factions/spigot/SpigotFeatures.java @@ -0,0 +1,31 @@ +package com.massivecraft.factions.spigot; + +public class SpigotFeatures +{ + // -------------------------------------------- // + // STATIC FIELDS + // -------------------------------------------- // + + // The "active" field is set from inside the EngineSpigot + + private static boolean active = false; + public static boolean isActive() { return active; } + public static void setActive(boolean active) { SpigotFeatures.active = active; } + + // -------------------------------------------- // + // ACTIVATE + // -------------------------------------------- // + + public static void activate() + { + try + { + EngineSpigot.get().activate(); + } + catch (Throwable t) + { + // ignored + } + } + +}