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:
		@@ -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_JOIN, this.playerListener, Event.Priority.Normal, 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_DAMAGE, this.entityListener, Event.Priority.Normal, this);
 | 
			
		||||
		pm.registerEvent(Event.Type.ENTITY_EXPLODE, this.entityListener, Event.Priority.Normal, this);
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,8 @@ import org.bukkit.block.Block;
 | 
			
		||||
import org.bukkit.command.CommandSender;
 | 
			
		||||
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.PlayerInteractEvent;
 | 
			
		||||
import org.bukkit.event.player.PlayerJoinEvent;
 | 
			
		||||
@@ -146,6 +148,8 @@ public class FactionsPlayerListener extends PlayerListener{
 | 
			
		||||
			event.setCancelled(true);
 | 
			
		||||
			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())) {
 | 
			
		||||
			event.setCancelled(true);
 | 
			
		||||
			return;
 | 
			
		||||
@@ -215,4 +219,35 @@ public class FactionsPlayerListener extends PlayerListener{
 | 
			
		||||
			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;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user