diff --git a/src/com/massivecraft/factions/listeners/FactionsListenerMain.java b/src/com/massivecraft/factions/listeners/FactionsListenerMain.java index ee706070..dfda1cbe 100644 --- a/src/com/massivecraft/factions/listeners/FactionsListenerMain.java +++ b/src/com/massivecraft/factions/listeners/FactionsListenerMain.java @@ -1,5 +1,6 @@ package com.massivecraft.factions.listeners; +import java.util.Collection; import java.util.Iterator; import org.bukkit.Bukkit; @@ -33,6 +34,7 @@ import org.bukkit.event.hanging.HangingBreakByEntityEvent; import org.bukkit.event.hanging.HangingBreakEvent; import org.bukkit.event.hanging.HangingPlaceEvent; import org.bukkit.event.hanging.HangingBreakEvent.RemoveCause; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.event.player.PlayerTeleportEvent; @@ -45,10 +47,13 @@ import com.massivecraft.factions.Const; import com.massivecraft.factions.FFlag; import com.massivecraft.factions.FPerm; import com.massivecraft.factions.FPlayer; +import com.massivecraft.factions.FPlayerColl; import com.massivecraft.factions.Faction; import com.massivecraft.factions.Factions; +import com.massivecraft.factions.Rel; import com.massivecraft.factions.integration.SpoutFeatures; import com.massivecraft.mcore.ps.PS; +import com.massivecraft.mcore.util.Txt; public class FactionsListenerMain implements Listener { @@ -69,6 +74,69 @@ public class FactionsListenerMain implements Listener Bukkit.getPluginManager().registerEvents(this, Factions.get()); } + // -------------------------------------------- // + // DENY COMMANDS + // -------------------------------------------- // + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void denyCommands(PlayerCommandPreprocessEvent event) + { + // If a player is trying to run a command ... + Player player = event.getPlayer(); + FPlayer fplayer = FPlayerColl.get().get(player); + + // ... and the player does not have adminmode ... + if (fplayer.isUsingAdminMode()) return; + + // ... clean up the command ... + String command = event.getMessage(); + command = Txt.removeLeadingCommandDust(command); + command = command.toLowerCase(); + command = command.trim(); + + if (fplayer.hasFaction() && fplayer.getFaction().getFlag(FFlag.PERMANENT) && containsCommand(command, ConfServer.permanentFactionMemberDenyCommands)) + { + fplayer.msg("You can't use \"%s\" as member of a permanent faction.", command); + event.setCancelled(true); + return; + } + + Rel rel = fplayer.getRelationToLocation(); + if (BoardColl.get().getFactionAt(fplayer.getCurrentChunk()).isNone()) return; + + if (rel == Rel.NEUTRAL && containsCommand(command, ConfServer.territoryNeutralDenyCommands)) + { + fplayer.msg("You can't use \"%s\" in neutral territory.", command); + event.setCancelled(true); + return; + } + + if (rel == Rel.ENEMY && containsCommand(command, ConfServer.territoryEnemyDenyCommands)) + { + fplayer.msg("You can't use \"%s\" in enemy territory.", command); + event.setCancelled(true); + return; + } + } + + private static boolean containsCommand(String needle, Collection haystack) + { + if (needle == null) return false; + needle = Txt.removeLeadingCommandDust(needle); + needle = needle.toLowerCase(); + + for (String string : haystack) + { + if (string == null) continue; + string = Txt.removeLeadingCommandDust(string); + string = string.toLowerCase(); + + if (needle.startsWith(string)) return true; + } + + return false; + } + // -------------------------------------------- // // FLAG: MONSTERS // -------------------------------------------- // diff --git a/src/com/massivecraft/factions/listeners/TodoFactionsEntityListener.java b/src/com/massivecraft/factions/listeners/TodoFactionsEntityListener.java index c55ccb7b..79fa99cd 100644 --- a/src/com/massivecraft/factions/listeners/TodoFactionsEntityListener.java +++ b/src/com/massivecraft/factions/listeners/TodoFactionsEntityListener.java @@ -87,6 +87,12 @@ public class TodoFactionsEntityListener implements Listener fplayer.msg(msg, fplayer.getPowerRounded(), fplayer.getPowerMaxRounded()); } } + + // -------------------------------------------- // + // PVP STUFF?? + // -------------------------------------------- // + + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onEntityDamage(EntityDamageEvent event) diff --git a/src/com/massivecraft/factions/listeners/TodoFactionsPlayerListener.java b/src/com/massivecraft/factions/listeners/TodoFactionsPlayerListener.java index f33e1278..1e2da05f 100644 --- a/src/com/massivecraft/factions/listeners/TodoFactionsPlayerListener.java +++ b/src/com/massivecraft/factions/listeners/TodoFactionsPlayerListener.java @@ -1,8 +1,5 @@ package com.massivecraft.factions.listeners; -import java.util.Collection; -import java.util.Iterator; - import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; @@ -13,7 +10,6 @@ import org.bukkit.event.Listener; import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerBucketEmptyEvent; import org.bukkit.event.player.PlayerBucketFillEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerKickEvent; @@ -22,7 +18,6 @@ import org.bukkit.event.player.PlayerMoveEvent; import com.massivecraft.factions.BoardColl; import com.massivecraft.factions.ConfServer; import com.massivecraft.factions.Const; -import com.massivecraft.factions.FFlag; import com.massivecraft.factions.FPerm; import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.FPlayerColl; @@ -204,64 +199,7 @@ public class TodoFactionsPlayerListener implements Listener } } - @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) - public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) - { - // Get the player - Player player = event.getPlayer(); - FPlayer me = FPlayerColl.get().get(player); - - // With adminmode no commands are denied. - if (me.isUsingAdminMode()) return; - - // The full command is converted to lowercase and does include the slash in the front - String fullCmd = event.getMessage().toLowerCase(); - - if (me.hasFaction() && me.getFaction().getFlag(FFlag.PERMANENT) && isCommandInList(fullCmd, ConfServer.permanentFactionMemberDenyCommands)) - { - me.msg("You can't use the command \""+fullCmd+"\" because you are in a permanent faction."); - event.setCancelled(true); - return; - } - - Rel rel = me.getRelationToLocation(); - if (BoardColl.get().getFactionAt(me.getCurrentChunk()).isNone()) return; - - if (rel == Rel.NEUTRAL && isCommandInList(fullCmd, ConfServer.territoryNeutralDenyCommands)) - { - me.msg("You can't use the command \""+fullCmd+"\" in neutral territory."); - event.setCancelled(true); - return; - } - - if (rel == Rel.ENEMY && isCommandInList(fullCmd, ConfServer.territoryEnemyDenyCommands)) - { - me.msg("You can't use the command \""+fullCmd+"\" in enemy territory."); - event.setCancelled(true); - return; - } - - return; - } - - private static boolean isCommandInList(String fullCmd, Collection strings) - { - String shortCmd = fullCmd.substring(1); - Iterator iter = strings.iterator(); - while (iter.hasNext()) - { - String cmdCheck = iter.next(); - if (cmdCheck == null) - { - iter.remove(); - continue; - } - cmdCheck = cmdCheck.toLowerCase(); - if (fullCmd.startsWith(cmdCheck)) return true; - if (shortCmd.startsWith(cmdCheck)) return true; - } - return false; - } + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onPlayerKick(PlayerKickEvent event)