Saber-Factions/src/com/massivecraft/factions/listeners/FactionsBlockListener.java

111 lines
3.1 KiB
Java
Raw Normal View History

2011-07-18 22:06:02 +02:00
package com.massivecraft.factions.listeners;
2011-02-06 13:36:11 +01:00
import org.bukkit.Material;
2011-02-06 13:36:11 +01:00
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.block.BlockBreakEvent;
2011-02-06 13:36:11 +01:00
import org.bukkit.event.block.BlockDamageEvent;
import org.bukkit.event.block.BlockListener;
import org.bukkit.event.block.BlockPlaceEvent;
2011-07-18 22:06:02 +02:00
import com.massivecraft.factions.Board;
import com.massivecraft.factions.Conf;
import com.massivecraft.factions.FLocation;
import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.Faction;
import com.massivecraft.factions.Factions;
2011-02-06 13:36:11 +01:00
public class FactionsBlockListener extends BlockListener {
@Override
public void onBlockPlace(BlockPlaceEvent event) {
if (event.isCancelled()) {
2011-03-22 17:20:21 +01:00
return;
2011-02-06 13:36:11 +01:00
}
if (!event.canBuild()) {
return;
}
// special case for flint&steel, which should only be prevented by DenyUsage list
if (event.getBlockPlaced().getType() == Material.FIRE) {
return;
}
2011-02-06 13:36:11 +01:00
if ( ! this.playerCanBuildDestroyBlock(event.getPlayer(), event.getBlock(), "build")) {
event.setCancelled(true);
}
}
@Override
public void onBlockBreak(BlockBreakEvent event) {
if (event.isCancelled()) {
return;
}
if ( ! this.playerCanBuildDestroyBlock(event.getPlayer(), event.getBlock(), "destroy")) {
event.setCancelled(true);
}
}
2011-02-06 13:36:11 +01:00
@Override
public void onBlockDamage(BlockDamageEvent event) {
if (event.isCancelled()) {
2011-03-23 12:00:38 +01:00
return;
2011-02-06 13:36:11 +01:00
}
if (event.getInstaBreak() && ! this.playerCanBuildDestroyBlock(event.getPlayer(), event.getBlock(), "destroy")) {
2011-02-06 13:36:11 +01:00
event.setCancelled(true);
}
}
public boolean playerCanBuildDestroyBlock(Player player, Block block, String action) {
if (Conf.adminBypassPlayers.contains(player.getName())) {
return true;
}
2011-03-22 17:20:21 +01:00
Faction otherFaction = Board.getFactionAt(new FLocation(block));
2011-02-06 13:36:11 +01:00
FPlayer me = FPlayer.get(player);
2011-03-23 17:39:56 +01:00
if (otherFaction.isNone()) {
if (!Conf.wildernessDenyBuild || Factions.hasPermAdminBypass(player)) {
return true; // This is not faction territory. Use whatever you like here.
}
me.sendMessage("You can't "+action+" in the wilderness.");
return false;
2011-02-06 13:36:11 +01:00
}
else if (otherFaction.isSafeZone()) {
if (!Conf.safeZoneDenyBuild || Factions.hasPermManageSafeZone(player)) {
2011-03-23 17:39:56 +01:00
return true;
}
me.sendMessage("You can't "+action+" in a safe zone.");
return false;
}
else if (otherFaction.isWarZone()) {
if (!Conf.warZoneDenyBuild || Factions.hasPermManageWarZone(player)) {
return true;
}
me.sendMessage("You can't "+action+" in a war zone.");
return false;
}
2011-02-06 13:36:11 +01:00
Faction myFaction = me.getFaction();
boolean areEnemies = myFaction.getRelation(otherFaction).isEnemy();
2011-02-06 13:36:11 +01:00
// Cancel if we are not in our own territory
if (myFaction != otherFaction) {
boolean online = otherFaction.hasPlayersOnline();
if (
(online && (areEnemies ? Conf.territoryEnemyDenyBuild : Conf.territoryDenyBuild))
|| (!online && (areEnemies ? Conf.territoryEnemyDenyBuildWhenOffline : Conf.territoryDenyBuildWhenOffline))
) {
me.sendMessage("You can't "+action+" in the territory of "+otherFaction.getTag(myFaction));
return false;
}
2011-02-06 13:36:11 +01:00
}
return true;
}
}