For some reason onPlayerInteract() doesn't always detect bucket usage if it's about 2-3 blocks away from you, so I added monitoring of PLAYER_BUCKET_EMPTY and PLAYER_BUCKET_FILL events which seem to always fire correctly without fail

This commit is contained in:
Brettflan 2011-03-30 04:23:20 -05:00
parent 8970de026b
commit bddcc798ce
2 changed files with 37 additions and 0 deletions

View File

@ -140,6 +140,8 @@ public class Factions extends JavaPlugin {
pm.registerEvent(Event.Type.PLAYER_MOVE, this.playerListener, Event.Priority.Normal, this); pm.registerEvent(Event.Type.PLAYER_MOVE, this.playerListener, Event.Priority.Normal, this);
pm.registerEvent(Event.Type.PLAYER_JOIN, this.playerListener, Event.Priority.Normal, this); pm.registerEvent(Event.Type.PLAYER_JOIN, this.playerListener, Event.Priority.Normal, this);
pm.registerEvent(Event.Type.PLAYER_RESPAWN, this.playerListener, Event.Priority.High, this); pm.registerEvent(Event.Type.PLAYER_RESPAWN, this.playerListener, Event.Priority.High, this);
pm.registerEvent(Event.Type.PLAYER_BUCKET_EMPTY, this.playerListener, Event.Priority.Normal, this);
pm.registerEvent(Event.Type.PLAYER_BUCKET_FILL, this.playerListener, Event.Priority.Normal, this);
pm.registerEvent(Event.Type.ENTITY_DEATH, this.entityListener, Event.Priority.Normal, this); pm.registerEvent(Event.Type.ENTITY_DEATH, this.entityListener, Event.Priority.Normal, this);
pm.registerEvent(Event.Type.ENTITY_DAMAGE, this.entityListener, Event.Priority.Normal, this); pm.registerEvent(Event.Type.ENTITY_DAMAGE, this.entityListener, Event.Priority.Normal, this);
pm.registerEvent(Event.Type.ENTITY_EXPLODE, this.entityListener, Event.Priority.Normal, this); pm.registerEvent(Event.Type.ENTITY_EXPLODE, this.entityListener, Event.Priority.Normal, this);

View File

@ -9,6 +9,8 @@ import org.bukkit.block.Block;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.block.Action; 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.PlayerChatEvent;
import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerJoinEvent;
@ -146,6 +148,8 @@ public class FactionsPlayerListener extends PlayerListener{
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
// this check below might no longer be needed... bucket detection is now necessarily handled separately in onPlayerBucketXXX() events, and
// Flint&Steel is somehow detected before this in onBlockPlace(), and that's currently it for the default territoryDenyUseageMaterials
if ( ! this.playerCanUseItemHere(player, block, event.getMaterial())) { if ( ! this.playerCanUseItemHere(player, block, event.getMaterial())) {
event.setCancelled(true); event.setCancelled(true);
return; return;
@ -215,4 +219,35 @@ public class FactionsPlayerListener extends PlayerListener{
event.setRespawnLocation(home); event.setRespawnLocation(home);
} }
} }
// 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
public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event) {
if (event.isCancelled()) {
return;
}
Block block = event.getBlockClicked();
Player player = event.getPlayer();
if ( ! this.playerCanUseItemHere(player, block, event.getBucket())) {
event.setCancelled(true);
return;
}
}
@Override
public void onPlayerBucketFill(PlayerBucketFillEvent event) {
if (event.isCancelled()) {
return;
}
Block block = event.getBlockClicked();
Player player = event.getPlayer();
if ( ! this.playerCanUseItemHere(player, block, event.getBucket())) {
event.setCancelled(true);
return;
}
}
} }