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

281 lines
7.4 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.Location;
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;
import org.bukkit.event.block.BlockPistonExtendEvent;
import org.bukkit.event.block.BlockPistonRetractEvent;
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.FPlayers;
2011-07-18 22:06:02 +02:00
import com.massivecraft.factions.Faction;
import com.massivecraft.factions.P;
2011-10-08 23:22:02 +02:00
import com.massivecraft.factions.struct.Permission;
import com.massivecraft.factions.struct.Relation;
2011-02-06 13:36:11 +01:00
public class FactionsBlockListener extends BlockListener
{
public P p;
public FactionsBlockListener(P p)
{
this.p = p;
}
2011-02-06 13:36:11 +01:00
@Override
public void onBlockPlace(BlockPlaceEvent event)
{
if (event.isCancelled()) return;
if ( ! event.canBuild()) return;
// special case for flint&steel, which should only be prevented by DenyUsage list
if (event.getBlockPlaced().getType() == Material.FIRE)
{
return;
}
if ( ! playerCanBuildDestroyBlock(event.getPlayer(), event.getBlock().getLocation(), "build", false))
{
2011-02-06 13:36:11 +01:00
event.setCancelled(true);
}
}
@Override
public void onBlockBreak(BlockBreakEvent event)
{
if (event.isCancelled()) return;
if ( ! playerCanBuildDestroyBlock(event.getPlayer(), event.getBlock().getLocation(), "destroy", false))
{
event.setCancelled(true);
}
}
2011-02-06 13:36:11 +01:00
@Override
public void onBlockDamage(BlockDamageEvent event)
{
if (event.isCancelled()) return;
if (event.getInstaBreak() && ! playerCanBuildDestroyBlock(event.getPlayer(), event.getBlock().getLocation(), "destroy", false))
{
2011-02-06 13:36:11 +01:00
event.setCancelled(true);
}
}
@Override
public void onBlockPistonExtend(BlockPistonExtendEvent event)
{
if (event.isCancelled()) return;
if ( ! Conf.pistonProtectionThroughDenyBuild) return;
Faction pistonFaction = Board.getFactionAt(new FLocation(event.getBlock()));
// target end-of-the-line empty (air) block which is being pushed into, including if piston itself would extend into air
Block targetBlock = event.getBlock().getRelative(event.getDirection(), event.getLength() + 1);
// if potentially pushing into air in another territory, we need to check it out
if (targetBlock.isEmpty() && !canPistonMoveBlock(pistonFaction, targetBlock.getLocation()))
{
event.setCancelled(true);
return;
}
/*
* note that I originally was testing the territory of each affected block, but since I found that pistons can only push
* up to 12 blocks and the width of any territory is 16 blocks, it should be safe (and much more lightweight) to test
* only the final target block as done above
*/
}
@Override
public void onBlockPistonRetract(BlockPistonRetractEvent event)
{
// if not a sticky piston, retraction should be fine
if (event.isCancelled() || !event.isSticky() || !Conf.pistonProtectionThroughDenyBuild)
{
return;
}
Location targetLoc = event.getRetractLocation();
// if potentially retracted block is just air, no worries
if (targetLoc.getBlock().isEmpty())
{
return;
}
Faction pistonFaction = Board.getFactionAt(new FLocation(event.getBlock()));
if (!canPistonMoveBlock(pistonFaction, targetLoc))
{
event.setCancelled(true);
return;
}
}
private boolean canPistonMoveBlock(Faction pistonFaction, Location target)
{
Faction otherFaction = Board.getFactionAt(new FLocation(target));
if (pistonFaction == otherFaction)
{
return true;
}
if (otherFaction.isNone())
{
if (!Conf.wildernessDenyBuild || Conf.worldsNoWildernessProtection.contains(target.getWorld().getName()))
{
return true;
}
return false;
}
else if (otherFaction.isSafeZone())
{
if ( ! Conf.safeZoneDenyBuild)
{
return true;
}
return false;
}
else if (otherFaction.isWarZone())
{
if ( ! Conf.warZoneDenyBuild)
{
return true;
}
return false;
}
2011-10-12 17:25:01 +02:00
Relation rel = pistonFaction.getRelationTo(otherFaction);
boolean online = otherFaction.hasPlayersOnline();
if
(
(online && (rel.isEnemy() ? Conf.territoryEnemyDenyBuild : (rel.isAlly() ? Conf.territoryAllyDenyBuild : Conf.territoryDenyBuild)))
||
(!online && (rel.isEnemy() ? Conf.territoryEnemyDenyBuildWhenOffline : (rel.isAlly() ? Conf.territoryAllyDenyBuildWhenOffline : Conf.territoryDenyBuildWhenOffline)))
)
{
return false;
}
return true;
}
public static boolean playerCanBuildDestroyBlock(Player player, Location location, String action, boolean justCheck)
{
2011-10-09 18:35:39 +02:00
FPlayer me = FPlayers.i.get(player);
if (me.isAdminBypassing())
{
return true;
}
FLocation loc = new FLocation(location);
2011-07-31 03:17:00 +02:00
Faction otherFaction = Board.getFactionAt(loc);
2011-10-09 18:35:39 +02:00
2011-07-31 03:17:00 +02:00
if (otherFaction.isNone())
{
2011-10-09 18:35:39 +02:00
if (!Conf.wildernessDenyBuild || Conf.worldsNoWildernessProtection.contains(location.getWorld().getName()))
{
return true; // This is not faction territory. Use whatever you like here.
}
if (!justCheck)
{
me.sendMessage("You can't "+action+" in the wilderness.");
}
return false;
2011-02-06 13:36:11 +01:00
}
else if (otherFaction.isSafeZone())
{
2011-10-08 23:22:02 +02:00
if (!Conf.safeZoneDenyBuild || Permission.MANAGE_SAFE_ZONE.has(player))
{
2011-03-23 17:39:56 +01:00
return true;
}
if (!justCheck) {
me.sendMessage("You can't "+action+" in a safe zone.");
}
2011-03-23 17:39:56 +01:00
return false;
}
else if (otherFaction.isWarZone())
{
2011-10-08 23:22:02 +02:00
if (!Conf.warZoneDenyBuild || Permission.MANAGE_WAR_ZONE.has(player))
{
return true;
}
if (!justCheck)
{
me.sendMessage("You can't "+action+" in a war zone.");
}
return false;
}
2011-02-06 13:36:11 +01:00
Faction myFaction = me.getFaction();
2011-10-12 17:25:01 +02:00
Relation rel = myFaction.getRelationTo(otherFaction);
boolean ownershipFail = Conf.ownedAreasEnabled && (Conf.ownedAreaDenyBuild || Conf.ownedAreaPainBuild) && !otherFaction.playerHasOwnershipRights(me, loc);
// Cancel and/or cause pain (depending on configuration) if we are not in our own territory
if (!rel.isMember())
{
boolean online = otherFaction.hasPlayersOnline();
boolean pain = (!justCheck) && rel.confPainBuild(online);
boolean deny = rel.confDenyBuild(online);
//hurt the player for building/destroying?
if (pain)
{
player.damage(Conf.actionDeniedPainAmount);
if (!deny)
{
me.sendMessage("You are hurt for "+action+" in the territory of "+otherFaction.getTag(myFaction));
if (!Conf.ownedAreaDenyBuild)
{
return true;
}
}
}
if (deny)
{
if (!justCheck)
{
me.sendMessage("You can't "+action+" in the territory of "+otherFaction.getTag(myFaction));
}
return false;
}
2011-02-06 13:36:11 +01:00
}
// Also cancel and/or cause pain if player doesn't have ownership rights for this claim
2011-10-08 23:22:02 +02:00
else if (rel.isMember() && ownershipFail && ! Permission.OWNERSHIP_BYPASS.has(player))
{
if (Conf.ownedAreaPainBuild && !justCheck)
{
player.damage(Conf.actionDeniedPainAmount);
if (!Conf.ownedAreaDenyBuild)
{
me.sendMessage("You are hurt for "+action+" in this territory, it is owned by: "+myFaction.getOwnerListString(loc));
}
}
if (Conf.ownedAreaDenyBuild)
{
if (!justCheck)
{
me.sendMessage("You can't "+action+" in this territory, it is owned by: "+myFaction.getOwnerListString(loc));
}
return false;
}
2011-07-31 03:17:00 +02:00
}
2011-02-06 13:36:11 +01:00
return true;
}
}