From 7144da54c7e80e1564d803888bd79bf66c74a135 Mon Sep 17 00:00:00 2001 From: Brettflan Date: Sat, 28 Jan 2012 03:16:25 -0600 Subject: [PATCH 1/5] Workaround fix for half-step placement on existing half-steps not being prevented; it's caused by a CraftBukkit bug: https://bukkit.atlassian.net/browse/BUKKIT-646 Fix for a potential NPE in FPlayer autoLeaveOnInactivityRoutine. Added CaptureThePoints and CombatTag to our softdepend list so they can potentially cancel Factions commands. --- plugin.yml | 2 +- src/com/massivecraft/factions/FPlayers.java | 6 +++++- .../listeners/FactionsPlayerListener.java | 21 ++++++++++++++++++- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/plugin.yml b/plugin.yml index 578238ac..aaa8ab4b 100644 --- a/plugin.yml +++ b/plugin.yml @@ -2,7 +2,7 @@ name: Factions version: 1.7_dev main: com.massivecraft.factions.P authors: [Olof Larsson, Brett Flannigan] -softdepend: [PermissionsEx, Permissions, Essentials, EssentialsChat, HeroChat, iChat, LocalAreaChat, LWC, nChat, ChatManager, CAPI, AuthMe, Vault, Spout, WorldEdit, WorldGuard] +softdepend: [PermissionsEx, Permissions, Essentials, EssentialsChat, HeroChat, iChat, LocalAreaChat, LWC, nChat, ChatManager, CAPI, AuthMe, Vault, Spout, WorldEdit, WorldGuard, CaptureThePoints, CombatTag] commands: factions: description: Reference command for Factions. diff --git a/src/com/massivecraft/factions/FPlayers.java b/src/com/massivecraft/factions/FPlayers.java index 08952141..186b47a8 100644 --- a/src/com/massivecraft/factions/FPlayers.java +++ b/src/com/massivecraft/factions/FPlayers.java @@ -67,7 +67,11 @@ public class FPlayers extends PlayerEntityCollection // if player is faction leader, sort out the faction since he's going away if (fplayer.getRole() == Rel.LEADER) - fplayer.getFaction().promoteNewLeader(); + { + Faction faction = fplayer.getFaction(); + if (faction != null) + fplayer.getFaction().promoteNewLeader(); + } fplayer.leave(false); fplayer.detach(); diff --git a/src/com/massivecraft/factions/listeners/FactionsPlayerListener.java b/src/com/massivecraft/factions/listeners/FactionsPlayerListener.java index 16760a7c..ab79097c 100644 --- a/src/com/massivecraft/factions/listeners/FactionsPlayerListener.java +++ b/src/com/massivecraft/factions/listeners/FactionsPlayerListener.java @@ -8,12 +8,12 @@ import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; import org.bukkit.entity.Player; import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerBucketEmptyEvent; import org.bukkit.event.player.PlayerBucketFillEvent; import org.bukkit.event.player.PlayerChatEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerKickEvent; @@ -229,6 +229,25 @@ public class FactionsPlayerListener extends PlayerListener return; // only interested on right-clicks for below } + // workaround fix for new CraftBukkit 1.1-R1 bug where half-step on half-step placement doesn't trigger BlockPlaceEvent + if ( + event.hasItem() + && + event.getItem().getType() == Material.STEP + && + block.getType() == Material.STEP + && + event.getBlockFace() == BlockFace.UP + && + event.getItem().getData().getData() == block.getData() + && + ! FactionsBlockListener.playerCanBuildDestroyBlock(player, block, "build", false) + ) + { + event.setCancelled(true); + return; + } + if ( ! playerCanUseItemHere(player, block.getLocation(), event.getMaterial(), false)) { event.setCancelled(true); From 1dc5a0f2266c76321a2dc50cc5fcc93f06453b25 Mon Sep 17 00:00:00 2001 From: Brettflan Date: Sat, 28 Jan 2012 04:07:21 -0600 Subject: [PATCH 2/5] removed TNT exploit handling code, since they did finally fix the bug in the CraftBukkit 1.1-RC1 release --- src/com/massivecraft/factions/P.java | 1 - .../listeners/FactionsEntityListener.java | 41 ------------------- 2 files changed, 42 deletions(-) diff --git a/src/com/massivecraft/factions/P.java b/src/com/massivecraft/factions/P.java index 15529d0d..b8b55bd5 100644 --- a/src/com/massivecraft/factions/P.java +++ b/src/com/massivecraft/factions/P.java @@ -132,7 +132,6 @@ public class P extends MPlugin this.registerEvent(Event.Type.ENTITY_TARGET, this.entityListener, Event.Priority.Normal); this.registerEvent(Event.Type.PAINTING_BREAK, this.entityListener, Event.Priority.Normal); this.registerEvent(Event.Type.PAINTING_PLACE, this.entityListener, Event.Priority.Normal); - this.registerEvent(Event.Type.EXPLOSION_PRIME, this.entityListener, Event.Priority.Normal); // Block Events this.registerEvent(Event.Type.BLOCK_BREAK, this.blockListener, Event.Priority.Normal); diff --git a/src/com/massivecraft/factions/listeners/FactionsEntityListener.java b/src/com/massivecraft/factions/listeners/FactionsEntityListener.java index c6426d50..c53e36d2 100644 --- a/src/com/massivecraft/factions/listeners/FactionsEntityListener.java +++ b/src/com/massivecraft/factions/listeners/FactionsEntityListener.java @@ -94,47 +94,6 @@ public class FactionsEntityListener extends EntityListener }*/ } - @Override - public void onExplosionPrime(ExplosionPrimeEvent event) - { - if (event.isCancelled()) return; - if (! (event.getEntity() instanceof TNTPrimed)) return; - if (exploitExplosions.isEmpty()) return; - - // make sure this isn't a TNT explosion exploit attempt - - int locX = event.getEntity().getLocation().getBlockX(); - int locZ = event.getEntity().getLocation().getBlockZ(); - - for (int i = exploitExplosions.size() - 1; i >= 0; i--) - { - PotentialExplosionExploit ex = exploitExplosions.get(i); - - // remove anything from the list older than 10 seconds (TNT takes 4 seconds to trigger; provide some leeway) - if (ex.timeMillis + 10000 < System.currentTimeMillis()) - { - exploitExplosions.remove(i); - continue; - } - - int absX = Math.abs(ex.X - locX); - int absZ = Math.abs(ex.Z - locZ); - if (absX < 5 && absZ < 5) - { // it sure looks like an exploit attempt - // let's tattle on him to everyone - String msg = "NOTICE: Player \""+ex.playerName+"\" attempted to exploit a TNT bug in the territory of \""+ex.faction.getTag()+"\" at "+ex.X+","+ex.Z+" (X,Z) using "+ex.item.name(); - P.p.log(Level.WARNING, msg); - for (FPlayer fplayer : FPlayers.i.getOnline()) - { - fplayer.sendMessage(msg); - } - event.setCancelled(true); - exploitExplosions.remove(i); - return; - } - } - } - @Override public void onEntityExplode(EntityExplodeEvent event) { From fb92fb7c686b7bd3b47be6cffe0ab2bdaea910dc Mon Sep 17 00:00:00 2001 From: Brettflan Date: Sat, 28 Jan 2012 04:37:56 -0600 Subject: [PATCH 3/5] Update to new Bukkit Event system Also remove leftover TNT exploit prevention code which I missed earlier --- src/com/massivecraft/factions/P.java | 46 +++---------- .../listeners/FactionsBlockListener.java | 27 ++++---- .../listeners/FactionsChatEarlyListener.java | 8 ++- .../listeners/FactionsEntityListener.java | 65 ++++--------------- .../listeners/FactionsPlayerListener.java | 24 +++---- .../listeners/FactionsServerListener.java | 10 +-- 6 files changed, 56 insertions(+), 124 deletions(-) diff --git a/src/com/massivecraft/factions/P.java b/src/com/massivecraft/factions/P.java index b8b55bd5..b0d89cb8 100644 --- a/src/com/massivecraft/factions/P.java +++ b/src/com/massivecraft/factions/P.java @@ -11,7 +11,6 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.event.Event; import org.bukkit.event.player.PlayerChatEvent; import org.bukkit.plugin.Plugin; @@ -109,43 +108,14 @@ public class P extends MPlugin { Worldguard.init(this); } - - // Player Events - this.registerEvent(Event.Type.PLAYER_CHAT, this.playerListener, Event.Priority.Highest); - this.registerEvent(Event.Type.PLAYER_CHAT, this.chatEarlyListener, Event.Priority.Lowest); - this.registerEvent(Event.Type.PLAYER_INTERACT, this.playerListener, Event.Priority.Normal); - this.registerEvent(Event.Type.PLAYER_MOVE, this.playerListener, Event.Priority.Normal); - this.registerEvent(Event.Type.PLAYER_JOIN, this.playerListener, Event.Priority.Normal); - this.registerEvent(Event.Type.PLAYER_QUIT, this.playerListener, Event.Priority.Normal); - this.registerEvent(Event.Type.PLAYER_RESPAWN, this.playerListener, Event.Priority.High); - this.registerEvent(Event.Type.PLAYER_BUCKET_EMPTY, this.playerListener, Event.Priority.Normal); - this.registerEvent(Event.Type.PLAYER_BUCKET_FILL, this.playerListener, Event.Priority.Normal); - this.registerEvent(Event.Type.PLAYER_KICK, this.playerListener, Event.Priority.Normal); - - // Entity Events - this.registerEvent(Event.Type.ENDERMAN_PICKUP, this.entityListener, Event.Priority.Normal); - this.registerEvent(Event.Type.ENDERMAN_PLACE, this.entityListener, Event.Priority.Normal); - this.registerEvent(Event.Type.ENTITY_DEATH, this.entityListener, Event.Priority.Normal); - this.registerEvent(Event.Type.ENTITY_DAMAGE, this.entityListener, Event.Priority.Normal); - this.registerEvent(Event.Type.ENTITY_EXPLODE, this.entityListener, Event.Priority.Normal); - this.registerEvent(Event.Type.CREATURE_SPAWN, this.entityListener, Event.Priority.Normal); - this.registerEvent(Event.Type.ENTITY_TARGET, this.entityListener, Event.Priority.Normal); - this.registerEvent(Event.Type.PAINTING_BREAK, this.entityListener, Event.Priority.Normal); - this.registerEvent(Event.Type.PAINTING_PLACE, this.entityListener, Event.Priority.Normal); - - // Block Events - this.registerEvent(Event.Type.BLOCK_BREAK, this.blockListener, Event.Priority.Normal); - this.registerEvent(Event.Type.BLOCK_DAMAGE, this.blockListener, Event.Priority.Normal); - this.registerEvent(Event.Type.BLOCK_PLACE, this.blockListener, Event.Priority.Normal); - this.registerEvent(Event.Type.BLOCK_PISTON_EXTEND, this.blockListener, Event.Priority.Normal); - this.registerEvent(Event.Type.BLOCK_PISTON_RETRACT, this.blockListener, Event.Priority.Normal); - this.registerEvent(Event.Type.BLOCK_SPREAD, this.blockListener, Event.Priority.Normal); - this.registerEvent(Event.Type.BLOCK_BURN, this.blockListener, Event.Priority.Normal); - - // Server Events - this.registerEvent(Event.Type.PLUGIN_ENABLE, this.serverListener, Event.Priority.Monitor); - this.registerEvent(Event.Type.PLUGIN_DISABLE, this.serverListener, Event.Priority.Monitor); - + + // Register Event Handlers + getServer().getPluginManager().registerEvents(playerListener, this); + getServer().getPluginManager().registerEvents(chatEarlyListener, this); + getServer().getPluginManager().registerEvents(entityListener, this); + getServer().getPluginManager().registerEvents(blockListener, this); + getServer().getPluginManager().registerEvents(serverListener, this); + postEnable(); } diff --git a/src/com/massivecraft/factions/listeners/FactionsBlockListener.java b/src/com/massivecraft/factions/listeners/FactionsBlockListener.java index a26a4d3c..b4fe95c6 100644 --- a/src/com/massivecraft/factions/listeners/FactionsBlockListener.java +++ b/src/com/massivecraft/factions/listeners/FactionsBlockListener.java @@ -4,10 +4,12 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockBurnEvent; import org.bukkit.event.block.BlockDamageEvent; -import org.bukkit.event.block.BlockListener; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.BlockPistonExtendEvent; import org.bukkit.event.block.BlockPistonRetractEvent; @@ -24,7 +26,7 @@ import com.massivecraft.factions.struct.FFlag; import com.massivecraft.factions.struct.FPerm; -public class FactionsBlockListener extends BlockListener +public class FactionsBlockListener implements Listener { public P p; public FactionsBlockListener(P p) @@ -32,7 +34,7 @@ public class FactionsBlockListener extends BlockListener this.p = p; } - @Override + @EventHandler(priority = EventPriority.NORMAL) public void onBlockSpread(BlockSpreadEvent event) { if (event.isCancelled()) return; @@ -44,7 +46,7 @@ public class FactionsBlockListener extends BlockListener } } - @Override + @EventHandler(priority = EventPriority.NORMAL) public void onBlockBurn(BlockBurnEvent event) { if (event.isCancelled()) return; @@ -78,7 +80,7 @@ public class FactionsBlockListener extends BlockListener return FPerm.BUILD.has(me, loc, true); } - @Override + @EventHandler(priority = EventPriority.NORMAL) public void onBlockPlace(BlockPlaceEvent event) { if (event.isCancelled()) return; @@ -94,17 +96,10 @@ public class FactionsBlockListener extends BlockListener if ( ! playerCanBuildDestroyBlock(event.getPlayer(), event.getBlock(), "build", false)) { event.setCancelled(true); - - Material handItem = event.getPlayer().getItemInHand().getType(); - if (handItem == Material.TNT || handItem == Material.REDSTONE_TORCH_ON) - { - Faction targetFaction = Board.getFactionAt(new FLocation(event.getBlock())); - FactionsEntityListener.trackPotentialExplosionExploit(event.getPlayer().getName(), targetFaction, handItem, event.getBlock().getLocation()); - } } } - @Override + @EventHandler(priority = EventPriority.NORMAL) public void onBlockBreak(BlockBreakEvent event) { if (event.isCancelled()) return; @@ -115,7 +110,7 @@ public class FactionsBlockListener extends BlockListener } } - @Override + @EventHandler(priority = EventPriority.NORMAL) public void onBlockDamage(BlockDamageEvent event) { if (event.isCancelled()) return; @@ -127,7 +122,7 @@ public class FactionsBlockListener extends BlockListener } } - @Override + @EventHandler(priority = EventPriority.NORMAL) public void onBlockPistonExtend(BlockPistonExtendEvent event) { if (event.isCancelled()) return; @@ -152,7 +147,7 @@ public class FactionsBlockListener extends BlockListener */ } - @Override + @EventHandler(priority = EventPriority.NORMAL) public void onBlockPistonRetract(BlockPistonRetractEvent event) { // if not a sticky piston, retraction should be fine diff --git a/src/com/massivecraft/factions/listeners/FactionsChatEarlyListener.java b/src/com/massivecraft/factions/listeners/FactionsChatEarlyListener.java index 6a1f113f..40e569c3 100644 --- a/src/com/massivecraft/factions/listeners/FactionsChatEarlyListener.java +++ b/src/com/massivecraft/factions/listeners/FactionsChatEarlyListener.java @@ -4,8 +4,10 @@ import java.util.logging.Level; import org.bukkit.ChatColor; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerChatEvent; -import org.bukkit.event.player.PlayerListener; import com.massivecraft.factions.Conf; import com.massivecraft.factions.FPlayer; @@ -17,7 +19,7 @@ import com.massivecraft.factions.struct.Rel; // this is an addtional PlayerListener for handling slashless command usage and faction chat, to be set at low priority so Factions gets to them first -public class FactionsChatEarlyListener extends PlayerListener +public class FactionsChatEarlyListener implements Listener { public P p; public FactionsChatEarlyListener(P p) @@ -25,7 +27,7 @@ public class FactionsChatEarlyListener extends PlayerListener this.p = p; } - @Override + @EventHandler(priority = EventPriority.LOWEST) public void onPlayerChat(PlayerChatEvent event) { if (event.isCancelled()) return; diff --git a/src/com/massivecraft/factions/listeners/FactionsEntityListener.java b/src/com/massivecraft/factions/listeners/FactionsEntityListener.java index c53e36d2..27cb9d41 100644 --- a/src/com/massivecraft/factions/listeners/FactionsEntityListener.java +++ b/src/com/massivecraft/factions/listeners/FactionsEntityListener.java @@ -1,16 +1,15 @@ package com.massivecraft.factions.listeners; import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.logging.Level; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; -import org.bukkit.entity.TNTPrimed; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.EndermanPickupEvent; import org.bukkit.event.entity.EndermanPlaceEvent; @@ -18,9 +17,7 @@ import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.EntityExplodeEvent; -import org.bukkit.event.entity.EntityListener; import org.bukkit.event.entity.EntityTargetEvent; -import org.bukkit.event.entity.ExplosionPrimeEvent; import org.bukkit.event.painting.PaintingBreakByEntityEvent; import org.bukkit.event.painting.PaintingBreakEvent; import org.bukkit.event.painting.PaintingPlaceEvent; @@ -37,7 +34,7 @@ import com.massivecraft.factions.struct.Rel; import com.massivecraft.factions.util.MiscUtil; -public class FactionsEntityListener extends EntityListener +public class FactionsEntityListener implements Listener { public P p; public FactionsEntityListener(P p) @@ -45,9 +42,7 @@ public class FactionsEntityListener extends EntityListener this.p = p; } - private static ArrayList exploitExplosions = new ArrayList(); - - @Override + @EventHandler(priority = EventPriority.NORMAL) public void onEntityDeath(EntityDeathEvent event) { Entity entity = event.getEntity(); @@ -73,7 +68,7 @@ public class FactionsEntityListener extends EntityListener fplayer.msg("Your power is now "+fplayer.getPowerRounded()+" / "+fplayer.getPowerMaxRounded()); } - @Override + @EventHandler(priority = EventPriority.NORMAL) public void onEntityDamage(EntityDamageEvent event) { if ( event.isCancelled()) return; @@ -94,7 +89,7 @@ public class FactionsEntityListener extends EntityListener }*/ } - @Override + @EventHandler(priority = EventPriority.NORMAL) public void onEntityExplode(EntityExplodeEvent event) { if ( event.isCancelled()) return; @@ -228,7 +223,7 @@ public class FactionsEntityListener extends EntityListener return true; } - @Override + @EventHandler(priority = EventPriority.NORMAL) public void onCreatureSpawn(CreatureSpawnEvent event) { if (event.isCancelled()) return; @@ -243,7 +238,7 @@ public class FactionsEntityListener extends EntityListener event.setCancelled(true); } - @Override + @EventHandler(priority = EventPriority.NORMAL) public void onEntityTarget(EntityTargetEvent event) { if (event.isCancelled()) return; @@ -263,7 +258,7 @@ public class FactionsEntityListener extends EntityListener event.setCancelled(true); } - @Override + @EventHandler(priority = EventPriority.NORMAL) public void onPaintingBreak(PaintingBreakEvent event) { if (event.isCancelled()) return; @@ -285,7 +280,7 @@ public class FactionsEntityListener extends EntityListener } } - @Override + @EventHandler(priority = EventPriority.NORMAL) public void onPaintingPlace(PaintingPlaceEvent event) { if (event.isCancelled()) return; @@ -296,7 +291,7 @@ public class FactionsEntityListener extends EntityListener } } - @Override + @EventHandler(priority = EventPriority.NORMAL) public void onEndermanPickup(EndermanPickupEvent event) { if (event.isCancelled()) return; @@ -309,7 +304,7 @@ public class FactionsEntityListener extends EntityListener event.setCancelled(true); } - @Override + @EventHandler(priority = EventPriority.NORMAL) public void onEndermanPlace(EndermanPlaceEvent event) { if (event.isCancelled()) return; @@ -321,38 +316,4 @@ public class FactionsEntityListener extends EntityListener event.setCancelled(true); } - - - /** - * Since the Bukkit team still don't seem to be in any hurry to fix the problem after at least half a year, - * we'll track potential explosion exploits ourselves and try to prevent them - * For reference, canceled TNT placement next to redstone power is bugged and triggers a free explosion - * Same thing happens for canceled redstone torch placement next to existing TNT - * https://bukkit.atlassian.net/browse/BUKKIT-89 - */ - - public static void trackPotentialExplosionExploit(String playerName, Faction faction, Material item, Location location) - { - exploitExplosions.add(new PotentialExplosionExploit(playerName, faction, item, location)); - } - - public static class PotentialExplosionExploit - { - public String playerName; - public Faction faction; - public Material item; - public long timeMillis; - public int X; - public int Z; - - public PotentialExplosionExploit(String playerName, Faction faction, Material item, Location location) - { - this.playerName = playerName; - this.faction = faction; - this.item = item; - this.timeMillis = System.currentTimeMillis(); - this.X = location.getBlockX(); - this.Z = location.getBlockZ(); - } - } } diff --git a/src/com/massivecraft/factions/listeners/FactionsPlayerListener.java b/src/com/massivecraft/factions/listeners/FactionsPlayerListener.java index ab79097c..30386acf 100644 --- a/src/com/massivecraft/factions/listeners/FactionsPlayerListener.java +++ b/src/com/massivecraft/factions/listeners/FactionsPlayerListener.java @@ -10,6 +10,9 @@ import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerBucketEmptyEvent; import org.bukkit.event.player.PlayerBucketFillEvent; @@ -17,7 +20,6 @@ import org.bukkit.event.player.PlayerChatEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerKickEvent; -import org.bukkit.event.player.PlayerListener; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerRespawnEvent; @@ -37,7 +39,7 @@ import java.util.logging.Level; -public class FactionsPlayerListener extends PlayerListener +public class FactionsPlayerListener implements Listener { public P p; public FactionsPlayerListener(P p) @@ -45,7 +47,7 @@ public class FactionsPlayerListener extends PlayerListener this.p = p; } - @Override + @EventHandler(priority = EventPriority.HIGHEST) public void onPlayerChat(PlayerChatEvent event) { if (event.isCancelled()) return; @@ -140,7 +142,7 @@ public class FactionsPlayerListener extends PlayerListener } } - @Override + @EventHandler(priority = EventPriority.NORMAL) public void onPlayerJoin(PlayerJoinEvent event) { // Make sure that all online players do have a fplayer. @@ -156,7 +158,7 @@ public class FactionsPlayerListener extends PlayerListener SpoutFeatures.updateAppearancesShortly(event.getPlayer()); } - @Override + @EventHandler(priority = EventPriority.NORMAL) public void onPlayerQuit(PlayerQuitEvent event) { // Make sure player's power is up to date when they log off. @@ -165,7 +167,7 @@ public class FactionsPlayerListener extends PlayerListener SpoutFeatures.playerDisconnect(me); } - @Override + @EventHandler(priority = EventPriority.NORMAL) public void onPlayerMove(PlayerMoveEvent event) { // Did we change block? @@ -205,7 +207,7 @@ public class FactionsPlayerListener extends PlayerListener } } - @Override + @EventHandler(priority = EventPriority.NORMAL) public void onPlayerInteract(PlayerInteractEvent event) { if (event.isCancelled()) return; @@ -279,7 +281,7 @@ public class FactionsPlayerListener extends PlayerListener return true; } - @Override + @EventHandler(priority = EventPriority.HIGH) public void onPlayerRespawn(PlayerRespawnEvent event) { FPlayer me = FPlayers.i.get(event.getPlayer()); @@ -305,7 +307,7 @@ public class FactionsPlayerListener extends PlayerListener // For some reason onPlayerInteract() sometimes misses bucket events depending on distance (something like 2-3 blocks away isn't detected), // but these separate bucket events below always fire without fail - @Override + @EventHandler(priority = EventPriority.NORMAL) public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event) { if (event.isCancelled()) return; @@ -319,7 +321,7 @@ public class FactionsPlayerListener extends PlayerListener return; } } - @Override + @EventHandler(priority = EventPriority.NORMAL) public void onPlayerBucketFill(PlayerBucketFillEvent event) { if (event.isCancelled()) return; @@ -425,7 +427,7 @@ public class FactionsPlayerListener extends PlayerListener return false; } - @Override + @EventHandler(priority = EventPriority.NORMAL) public void onPlayerKick(PlayerKickEvent event) { if (event.isCancelled()) return; diff --git a/src/com/massivecraft/factions/listeners/FactionsServerListener.java b/src/com/massivecraft/factions/listeners/FactionsServerListener.java index 07d95ffe..205a547e 100644 --- a/src/com/massivecraft/factions/listeners/FactionsServerListener.java +++ b/src/com/massivecraft/factions/listeners/FactionsServerListener.java @@ -1,7 +1,9 @@ package com.massivecraft.factions.listeners; import org.bukkit.plugin.Plugin; -import org.bukkit.event.server.ServerListener; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; import org.bukkit.event.server.PluginDisableEvent; import org.bukkit.event.server.PluginEnableEvent; @@ -9,7 +11,7 @@ import com.massivecraft.factions.P; import com.massivecraft.factions.integration.SpoutFeatures; -public class FactionsServerListener extends ServerListener +public class FactionsServerListener implements Listener { public P p; public FactionsServerListener(P p) @@ -17,7 +19,7 @@ public class FactionsServerListener extends ServerListener this.p = p; } - @Override + @EventHandler(priority = EventPriority.MONITOR) public void onPluginDisable(PluginDisableEvent event) { String name = event.getPlugin().getDescription().getName(); @@ -27,7 +29,7 @@ public class FactionsServerListener extends ServerListener } } - @Override + @EventHandler(priority = EventPriority.MONITOR) public void onPluginEnable(PluginEnableEvent event) { Plugin plug = event.getPlugin(); From 5ac0baf84a7fa095fa3abe6c186c94af0c289416 Mon Sep 17 00:00:00 2001 From: Brettflan Date: Sat, 28 Jan 2012 05:24:39 -0600 Subject: [PATCH 4/5] Fix for Vault economy integration bugging out if the target economy plugin loaded after Factions (really seems like a Vault issue, but we'll work around it) Fix for users who have Vault but don't use economy getting an NPE --- src/com/massivecraft/factions/P.java | 3 +- .../factions/integration/Econ.java | 30 +++++++++++++++---- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/com/massivecraft/factions/P.java b/src/com/massivecraft/factions/P.java index b0d89cb8..a64d26eb 100644 --- a/src/com/massivecraft/factions/P.java +++ b/src/com/massivecraft/factions/P.java @@ -99,8 +99,7 @@ public class P extends MPlugin //setupPermissions(); integrateEssentialsChat(); setupSpout(this); - Econ.doSetup(); - Econ.oldMoneyDoTransfer(); + Econ.initialSetup(this); CapiFeatures.setup(); setupLWC(); diff --git a/src/com/massivecraft/factions/integration/Econ.java b/src/com/massivecraft/factions/integration/Econ.java index cff3919b..8237ae27 100644 --- a/src/com/massivecraft/factions/integration/Econ.java +++ b/src/com/massivecraft/factions/integration/Econ.java @@ -32,7 +32,26 @@ public class Econ { return econ != null; } - + + public static void initialSetup(P p) + { + if (Bukkit.getServer().getPluginManager().getPlugin("Vault") == null) + { + P.p.log("Economy integration is "+(Conf.econEnabled ? "enabled, but" : "disabled, and")+" the plugin \"Vault\" is not installed."); + return; + } + + p.getServer().getScheduler().scheduleSyncDelayedTask(p, new Runnable() + { + @Override + public void run() + { + doSetup(); + oldMoneyDoTransfer(); + } + }, 1); + } + public static void doSetup() { if (isSetup()) return; @@ -40,6 +59,11 @@ public class Econ if (Bukkit.getServer().getPluginManager().getPlugin("Vault") != null) { RegisteredServiceProvider rsp = Bukkit.getServer().getServicesManager().getRegistration(Economy.class); + if (rsp == null) + { + P.p.log("Economy integration is "+(Conf.econEnabled ? "enabled" : "disabled")+", but the plugin \"Vault\" is not hooked into an economy plugin."); + return; + } econ = rsp.getProvider(); P.p.log("Economy integration through Vault plugin successful."); @@ -47,10 +71,6 @@ public class Econ if ( ! Conf.econEnabled) P.p.log("NOTE: Economy is disabled. Enable with command: f config econEnabled true"); } - else - { - P.p.log("Economy integration is "+(Conf.econEnabled ? "enabled, but" : "disabled, and")+" the plugin \"Vault\" is not installed."); - } P.p.cmdBase.cmdHelp.updateHelp(); } From 30b3facc198890bc5c559248b09e6c074395e9c7 Mon Sep 17 00:00:00 2001 From: Brettflan Date: Sat, 28 Jan 2012 05:59:07 -0600 Subject: [PATCH 5/5] Players no longer regain power while dead; no more waiting to respawn in order to regain power Also added AuthDB to softdepend list, so it has first shot at Factions commands in case it needs to cancel one --- plugin.yml | 2 +- src/com/massivecraft/factions/FPlayer.java | 3 +++ .../factions/listeners/FactionsPlayerListener.java | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/plugin.yml b/plugin.yml index aaa8ab4b..4ff23f60 100644 --- a/plugin.yml +++ b/plugin.yml @@ -2,7 +2,7 @@ name: Factions version: 1.7_dev main: com.massivecraft.factions.P authors: [Olof Larsson, Brett Flannigan] -softdepend: [PermissionsEx, Permissions, Essentials, EssentialsChat, HeroChat, iChat, LocalAreaChat, LWC, nChat, ChatManager, CAPI, AuthMe, Vault, Spout, WorldEdit, WorldGuard, CaptureThePoints, CombatTag] +softdepend: [PermissionsEx, Permissions, Essentials, EssentialsChat, HeroChat, iChat, LocalAreaChat, LWC, nChat, ChatManager, CAPI, AuthMe, Vault, Spout, WorldEdit, WorldGuard, AuthDB, CaptureThePoints, CombatTag] commands: factions: description: Reference command for Factions. diff --git a/src/com/massivecraft/factions/FPlayer.java b/src/com/massivecraft/factions/FPlayer.java index d8a84367..746ebd56 100644 --- a/src/com/massivecraft/factions/FPlayer.java +++ b/src/com/massivecraft/factions/FPlayer.java @@ -385,6 +385,9 @@ public class FPlayer extends PlayerEntity implements EconomyParticipator long millisPassed = now - this.lastPowerUpdateTime; this.lastPowerUpdateTime = now; + Player thisPlayer = this.getPlayer(); + if (thisPlayer != null && thisPlayer.isDead()) return; // don't let dead players regain power until they respawn + int millisPerMinute = 60*1000; double powerPerMinute = Conf.powerPerMinute; if(Conf.scaleNegativePower && this.power < 0) diff --git a/src/com/massivecraft/factions/listeners/FactionsPlayerListener.java b/src/com/massivecraft/factions/listeners/FactionsPlayerListener.java index 30386acf..d083a8d4 100644 --- a/src/com/massivecraft/factions/listeners/FactionsPlayerListener.java +++ b/src/com/massivecraft/factions/listeners/FactionsPlayerListener.java @@ -285,6 +285,9 @@ public class FactionsPlayerListener implements Listener public void onPlayerRespawn(PlayerRespawnEvent event) { FPlayer me = FPlayers.i.get(event.getPlayer()); + + me.getPower(); // update power, so they won't have gained any while dead + Location home = me.getFaction().getHome(); if (