Fix for messed up ownership protection handling in regards to ally/enemy status

In the process, removed the separate painting handling and made it use the standard block place/destroy checking routine, and otherwise cleaned up the related code a bit
This commit is contained in:
Brettflan 2011-10-12 22:31:18 -05:00
parent f575ad6bc0
commit 329cef6465
4 changed files with 88 additions and 196 deletions

View File

@ -11,6 +11,7 @@ import org.bukkit.entity.Player;
import com.massivecraft.factions.iface.EconomyParticipator; import com.massivecraft.factions.iface.EconomyParticipator;
import com.massivecraft.factions.iface.RelationParticipator; import com.massivecraft.factions.iface.RelationParticipator;
import com.massivecraft.factions.integration.Econ; import com.massivecraft.factions.integration.Econ;
import com.massivecraft.factions.struct.Permission;
import com.massivecraft.factions.struct.Relation; import com.massivecraft.factions.struct.Relation;
import com.massivecraft.factions.struct.Role; import com.massivecraft.factions.struct.Role;
import com.massivecraft.factions.util.*; import com.massivecraft.factions.util.*;
@ -631,26 +632,31 @@ public class Faction extends Entity implements EconomyParticipator
public boolean playerHasOwnershipRights(FPlayer fplayer, FLocation loc) public boolean playerHasOwnershipRights(FPlayer fplayer, FLocation loc)
{ {
// sufficient role to bypass ownership? // in own faction, with sufficient role or permission to bypass ownership?
if (fplayer.getFaction() == this && fplayer.getRole().isAtLeast(Conf.ownedAreaModeratorsBypass ? Role.MODERATOR : Role.ADMIN)) if
(
fplayer.getFaction() == this
&&
(
fplayer.getRole().isAtLeast(Conf.ownedAreaModeratorsBypass ? Role.MODERATOR : Role.ADMIN)
||
Permission.OWNERSHIP_BYPASS.has(fplayer.getPlayer())
)
)
{ {
return true; return true;
} }
// make sure claimOwnership is initialized // make sure claimOwnership is initialized
if (claimOwnership.isEmpty()) if (claimOwnership.isEmpty())
{
return true; return true;
}
// need to check the ownership list, then // need to check the ownership list, then
Set<String> ownerData = claimOwnership.get(loc); Set<String> ownerData = claimOwnership.get(loc);
// if no owner list, owner list is empty, or player is in owner list, they're allowed // if no owner list, owner list is empty, or player is in owner list, they're allowed
if (ownerData == null || ownerData.isEmpty() || ownerData.contains(fplayer.getName().toLowerCase())) if (ownerData == null || ownerData.isEmpty() || ownerData.contains(fplayer.getName().toLowerCase()))
{
return true; return true;
}
return false; return false;
} }

View File

@ -127,47 +127,34 @@ public class FactionsBlockListener extends BlockListener
Faction otherFaction = Board.getFactionAt(new FLocation(target)); Faction otherFaction = Board.getFactionAt(new FLocation(target));
if (pistonFaction == otherFaction) if (pistonFaction == otherFaction)
{
return true; return true;
}
if (otherFaction.isNone()) if (otherFaction.isNone())
{ {
if (!Conf.wildernessDenyBuild || Conf.worldsNoWildernessProtection.contains(target.getWorld().getName())) if (!Conf.wildernessDenyBuild || Conf.worldsNoWildernessProtection.contains(target.getWorld().getName()))
{
return true; return true;
}
return false; return false;
} }
else if (otherFaction.isSafeZone()) else if (otherFaction.isSafeZone())
{ {
if ( ! Conf.safeZoneDenyBuild) if ( ! Conf.safeZoneDenyBuild)
{
return true; return true;
}
return false; return false;
} }
else if (otherFaction.isWarZone()) else if (otherFaction.isWarZone())
{ {
if ( ! Conf.warZoneDenyBuild) if ( ! Conf.warZoneDenyBuild)
{
return true; return true;
}
return false; return false;
} }
Relation rel = pistonFaction.getRelationTo(otherFaction); Relation rel = pistonFaction.getRelationTo(otherFaction);
boolean online = otherFaction.hasPlayersOnline();
if if (rel.confDenyBuild(otherFaction.hasPlayersOnline()))
(
(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 false;
}
return true; return true;
} }
@ -175,106 +162,87 @@ public class FactionsBlockListener extends BlockListener
public static boolean playerCanBuildDestroyBlock(Player player, Location location, String action, boolean justCheck) public static boolean playerCanBuildDestroyBlock(Player player, Location location, String action, boolean justCheck)
{ {
FPlayer me = FPlayers.i.get(player); FPlayer me = FPlayers.i.get(player);
if (me.isAdminBypassing()) if (me.isAdminBypassing())
{
return true; return true;
}
FLocation loc = new FLocation(location); FLocation loc = new FLocation(location);
Faction otherFaction = Board.getFactionAt(loc); Faction otherFaction = Board.getFactionAt(loc);
if (otherFaction.isNone()) if (otherFaction.isNone())
{ {
if (!Conf.wildernessDenyBuild || Conf.worldsNoWildernessProtection.contains(location.getWorld().getName())) if (!Conf.wildernessDenyBuild || Conf.worldsNoWildernessProtection.contains(location.getWorld().getName()))
{
return true; // This is not faction territory. Use whatever you like here. return true; // This is not faction territory. Use whatever you like here.
}
if (!justCheck) if (!justCheck)
{
me.sendMessage("You can't "+action+" in the wilderness."); me.sendMessage("You can't "+action+" in the wilderness.");
}
return false; return false;
} }
else if (otherFaction.isSafeZone()) else if (otherFaction.isSafeZone())
{ {
if (!Conf.safeZoneDenyBuild || Permission.MANAGE_SAFE_ZONE.has(player)) if (!Conf.safeZoneDenyBuild || Permission.MANAGE_SAFE_ZONE.has(player))
{
return true; return true;
}
if (!justCheck) { if (!justCheck)
me.sendMessage("You can't "+action+" in a safe zone."); me.sendMessage("You can't "+action+" in a safe zone.");
}
return false; return false;
} }
else if (otherFaction.isWarZone()) else if (otherFaction.isWarZone())
{ {
if (!Conf.warZoneDenyBuild || Permission.MANAGE_WAR_ZONE.has(player)) if (!Conf.warZoneDenyBuild || Permission.MANAGE_WAR_ZONE.has(player))
{
return true; return true;
}
if (!justCheck) if (!justCheck)
{
me.sendMessage("You can't "+action+" in a war zone."); me.sendMessage("You can't "+action+" in a war zone.");
}
return false; return false;
} }
Faction myFaction = me.getFaction(); Faction myFaction = me.getFaction();
Relation rel = myFaction.getRelationTo(otherFaction); Relation rel = myFaction.getRelationTo(otherFaction);
boolean ownershipFail = Conf.ownedAreasEnabled && (Conf.ownedAreaDenyBuild || Conf.ownedAreaPainBuild) && !otherFaction.playerHasOwnershipRights(me, loc); boolean online = otherFaction.hasPlayersOnline();
boolean pain = !justCheck && rel.confPainBuild(online);
// Cancel and/or cause pain (depending on configuration) if we are not in our own territory boolean deny = rel.confDenyBuild(online);
if (!rel.isMember())
{
boolean online = otherFaction.hasPlayersOnline();
boolean pain = (!justCheck) && rel.confPainBuild(online);
boolean deny = rel.confDenyBuild(online);
//hurt the player for building/destroying? // hurt the player for building/destroying in other territory?
if (pain) 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;
}
}
// Also cancel and/or cause pain if player doesn't have ownership rights for this claim
else if (rel.isMember() && ownershipFail && ! Permission.OWNERSHIP_BYPASS.has(player))
{ {
if (Conf.ownedAreaPainBuild && !justCheck) player.damage(Conf.actionDeniedPainAmount);
if (!deny)
me.sendMessage("It is painful to try to "+action+" in the territory of "+otherFaction.getTag(myFaction));
}
// cancel building/destroying in other territory?
if (deny)
{
if (!justCheck)
me.sendMessage("You can't "+action+" in the territory of "+otherFaction.getTag(myFaction));
return false;
}
// Also cancel and/or cause pain if player doesn't have ownership rights for this claim
if (Conf.ownedAreasEnabled && (Conf.ownedAreaDenyBuild || Conf.ownedAreaPainBuild) && !otherFaction.playerHasOwnershipRights(me, loc))
{
if (!pain && Conf.ownedAreaPainBuild && !justCheck)
{ {
player.damage(Conf.actionDeniedPainAmount); player.damage(Conf.actionDeniedPainAmount);
if (!Conf.ownedAreaDenyBuild) if (!Conf.ownedAreaDenyBuild)
{ me.sendMessage("It is painful to try to "+action+" in this territory, it is owned by: "+otherFaction.getOwnerListString(loc));
me.sendMessage("You are hurt for "+action+" in this territory, it is owned by: "+myFaction.getOwnerListString(loc));
}
} }
if (Conf.ownedAreaDenyBuild) if (Conf.ownedAreaDenyBuild)
{ {
if (!justCheck) if (!justCheck)
{ me.sendMessage("You can't "+action+" in this territory, it is owned by: "+otherFaction.getOwnerListString(loc));
me.sendMessage("You can't "+action+" in this territory, it is owned by: "+myFaction.getOwnerListString(loc));
}
return false; return false;
} }
} }
return true; return true;
} }
} }

View File

@ -117,14 +117,17 @@ public class FactionsEntityListener extends EntityListener
Location loc = event.getLocation(); Location loc = event.getLocation();
Faction faction = Board.getFactionAt(new FLocation(loc)); Faction faction = Board.getFactionAt(new FLocation(loc));
boolean online = faction.hasPlayersOnline();
if (faction.noExplosionsInTerritory()) if (faction.noExplosionsInTerritory())
{ {
// faction is peaceful and has explosions set to disabled // faction is peaceful and has explosions set to disabled
event.setCancelled(true); event.setCancelled(true);
return;
} }
else if
boolean online = faction.hasPlayersOnline();
if
( (
event.getEntity() instanceof Creeper event.getEntity() instanceof Creeper
&& &&
@ -418,9 +421,7 @@ public class FactionsEntityListener extends EntityListener
return; return;
} }
FLocation loc = new FLocation(event.getPainting().getLocation()); if ( ! FactionsBlockListener.playerCanBuildDestroyBlock((Player)breaker, event.getPainting().getLocation(), "remove paintings", false))
if ( ! this.playerCanDoPaintings((Player)breaker, loc, "remove"))
{ {
event.setCancelled(true); event.setCancelled(true);
} }
@ -431,71 +432,12 @@ public class FactionsEntityListener extends EntityListener
{ {
if (event.isCancelled()) return; if (event.isCancelled()) return;
if ( ! this.playerCanDoPaintings(event.getPlayer(), new FLocation(event.getBlock()), "place")) if ( ! FactionsBlockListener.playerCanBuildDestroyBlock(event.getPlayer(), event.getBlock().getLocation(), "place paintings", false) )
{ {
event.setCancelled(true); event.setCancelled(true);
} }
} }
public boolean playerCanDoPaintings(Player player, FLocation loc, String action)
{
FPlayer me = FPlayers.i.get(player);
if (me.isAdminBypassing())
{
return true;
}
Faction otherFaction = Board.getFactionAt(loc);
if (otherFaction.isNone())
{
if (!Conf.wildernessDenyBuild || Conf.worldsNoWildernessProtection.contains(player.getWorld().getName()))
{
return true; // This is not faction territory. Use whatever you like here.
}
me.sendMessage("You can't "+action+" paintings in the wilderness.");
return false;
}
if (otherFaction.isSafeZone())
{
if (Permission.MANAGE_SAFE_ZONE.has(player) || !Conf.safeZoneDenyBuild)
{
return true;
}
me.sendMessage("You can't "+action+" paintings in a safe zone.");
return false;
}
else if (otherFaction.isWarZone())
{
if (Permission.MANAGE_WAR_ZONE.has(player) || !Conf.warZoneDenyBuild)
{
return true;
}
me.sendMessage("You can't "+action+" paintings in a war zone.");
return false;
}
Faction myFaction = me.getFaction();
Relation rel = myFaction.getRelationTo(otherFaction);
boolean ownershipFail = Conf.ownedAreasEnabled && Conf.ownedAreaDenyBuild && !otherFaction.playerHasOwnershipRights(me, loc);
// Cancel if we are not in our own territory and building should be denied
if (!rel.isMember() && rel.confDenyBuild(otherFaction.hasPlayersOnline()))
{
me.sendMessage("You can't "+action+" paintings in the territory of "+otherFaction.getTag(myFaction));
return false;
}
// Also cancel if player doesn't have ownership rights for this claim
else if (rel.isMember() && ownershipFail && !Permission.OWNERSHIP_BYPASS.has(player))
{
me.sendMessage("You can't "+action+" paintings in this territory, it is owned by: "+otherFaction.getOwnerListString(loc));
return false;
}
return true;
}
@Override @Override
public void onEndermanPickup(EndermanPickupEvent event) public void onEndermanPickup(EndermanPickupEvent event)
{ {

View File

@ -231,6 +231,9 @@ public class FactionsPlayerListener extends PlayerListener
Faction myFaction = me.getFaction(); Faction myFaction = me.getFaction();
// TODO: Why is this ("cost") here and unused??? Should it be used somewhere Brettflan? :) // TODO: Why is this ("cost") here and unused??? Should it be used somewhere Brettflan? :)
// Olof just commented it out to avoid the error. // Olof just commented it out to avoid the error.
// So sayeth Brettflan, answered in a comment since you asked in a comment:
// NOTHING MORE TODO: it was used, but apparently not needed after some changes including this commit: https://github.com/MassiveCraft/Factions/commit/5eaf9c68358c6076bb856baf80fd6496e2ab02ce
//
//Faction otherFaction = Board.getFactionAt(to); //Faction otherFaction = Board.getFactionAt(to);
//double cost = Econ.calculateClaimCost(myFaction.getLandRounded(), otherFaction.isNormal()); //double cost = Econ.calculateClaimCost(myFaction.getLandRounded(), otherFaction.isNormal());
@ -323,90 +326,74 @@ public class FactionsPlayerListener extends PlayerListener
{ {
FPlayer me = FPlayers.i.get(player); FPlayer me = FPlayers.i.get(player);
if (me.isAdminBypassing()) if (me.isAdminBypassing())
{
return true; return true;
}
FLocation loc = new FLocation(location); FLocation loc = new FLocation(location);
Faction otherFaction = Board.getFactionAt(loc); Faction otherFaction = Board.getFactionAt(loc);
if (otherFaction.hasPlayersOnline()){ if (otherFaction.hasPlayersOnline())
{
if ( ! Conf.territoryDenyUseageMaterials.contains(material)) if ( ! Conf.territoryDenyUseageMaterials.contains(material))
{
return true; // Item isn't one we're preventing for online factions. return true; // Item isn't one we're preventing for online factions.
}
} }
else else
{ {
if ( ! Conf.territoryDenyUseageMaterialsWhenOffline.contains(material)) if ( ! Conf.territoryDenyUseageMaterialsWhenOffline.contains(material))
{
return true; // Item isn't one we're preventing for offline factions. return true; // Item isn't one we're preventing for offline factions.
}
} }
if (otherFaction.isNone()) if (otherFaction.isNone())
{ {
if (!Conf.wildernessDenyUseage || Conf.worldsNoWildernessProtection.contains(location.getWorld().getName())) if (!Conf.wildernessDenyUseage || Conf.worldsNoWildernessProtection.contains(location.getWorld().getName()))
{
return true; // This is not faction territory. Use whatever you like here. return true; // This is not faction territory. Use whatever you like here.
}
if (!justCheck) if (!justCheck)
{
me.sendMessage("You can't use "+TextUtil.getMaterialName(material)+" in the wilderness."); me.sendMessage("You can't use "+TextUtil.getMaterialName(material)+" in the wilderness.");
}
return false; return false;
} }
else if (otherFaction.isSafeZone()) else if (otherFaction.isSafeZone())
{ {
if (!Conf.safeZoneDenyUseage || Permission.MANAGE_SAFE_ZONE.has(player)) if (!Conf.safeZoneDenyUseage || Permission.MANAGE_SAFE_ZONE.has(player))
{
return true; return true;
}
if (!justCheck) if (!justCheck)
{
me.sendMessage("You can't use "+TextUtil.getMaterialName(material)+" in a safe zone."); me.sendMessage("You can't use "+TextUtil.getMaterialName(material)+" in a safe zone.");
}
return false; return false;
} }
else if (otherFaction.isWarZone()) else if (otherFaction.isWarZone())
{ {
if (!Conf.warZoneDenyUseage || Permission.MANAGE_WAR_ZONE.has(player)) if (!Conf.warZoneDenyUseage || Permission.MANAGE_WAR_ZONE.has(player))
{
return true; return true;
}
if (!justCheck) if (!justCheck)
{
me.sendMessage("You can't use "+TextUtil.getMaterialName(material)+" in a war zone."); me.sendMessage("You can't use "+TextUtil.getMaterialName(material)+" in a war zone.");
}
return false; return false;
} }
Faction myFaction = me.getFaction(); Faction myFaction = me.getFaction();
Relation rel = myFaction.getRelationTo(otherFaction); Relation rel = myFaction.getRelationTo(otherFaction);
boolean ownershipFail = Conf.ownedAreasEnabled && Conf.ownedAreaDenyUseage && !otherFaction.playerHasOwnershipRights(me, loc);
// Cancel if we are not in our own territory // Cancel if we are not in our own territory
if (!rel.isMember() && rel.confDenyUseage()) if (rel.confDenyUseage())
{ {
if (!justCheck) if (!justCheck)
{
me.sendMessage("You can't use "+TextUtil.getMaterialName(material)+" in the territory of "+otherFaction.getTag(myFaction)); me.sendMessage("You can't use "+TextUtil.getMaterialName(material)+" in the territory of "+otherFaction.getTag(myFaction));
}
return false; return false;
} }
// Also cancel if player doesn't have ownership rights for this claim // Also cancel if player doesn't have ownership rights for this claim
else if (rel.isMember() && ownershipFail && ! Permission.OWNERSHIP_BYPASS.has(player)) if (Conf.ownedAreasEnabled && Conf.ownedAreaDenyUseage && !otherFaction.playerHasOwnershipRights(me, loc))
{ {
if (!justCheck) if (!justCheck)
{ me.sendMessage("You can't use "+TextUtil.getMaterialName(material)+" in this territory, it is owned by: "+otherFaction.getOwnerListString(loc));
me.sendMessage("You can't use "+TextUtil.getMaterialName(material)+" in this territory, it is owned by: "+myFaction.getOwnerListString(loc));
}
return false; return false;
} }
return true; return true;
} }
@ -414,9 +401,7 @@ public class FactionsPlayerListener extends PlayerListener
{ {
FPlayer me = FPlayers.i.get(player); FPlayer me = FPlayers.i.get(player);
if (me.isAdminBypassing()) if (me.isAdminBypassing())
{
return true; return true;
}
Material material = block.getType(); Material material = block.getType();
FLocation loc = new FLocation(block); FLocation loc = new FLocation(block);
@ -424,47 +409,38 @@ public class FactionsPlayerListener extends PlayerListener
// no door/chest/whatever protection in wilderness, war zones, or safe zones // no door/chest/whatever protection in wilderness, war zones, or safe zones
if (!otherFaction.isNormal()) if (!otherFaction.isNormal())
{
return true; return true;
}
// We only care about some material types. // We only care about some material types.
if (otherFaction.hasPlayersOnline()) if (otherFaction.hasPlayersOnline())
{ {
if ( ! Conf.territoryProtectedMaterials.contains(material)) if ( ! Conf.territoryProtectedMaterials.contains(material))
{
return true; return true;
}
} }
else else
{ {
if ( ! Conf.territoryProtectedMaterialsWhenOffline.contains(material)) if ( ! Conf.territoryProtectedMaterialsWhenOffline.contains(material))
{
return true; return true;
}
} }
Faction myFaction = me.getFaction(); Faction myFaction = me.getFaction();
Relation rel = myFaction.getRelationTo(otherFaction); Relation rel = myFaction.getRelationTo(otherFaction);
boolean ownershipFail = Conf.ownedAreasEnabled && Conf.ownedAreaProtectMaterials && !otherFaction.playerHasOwnershipRights(me, loc);
// You may use any block unless it is another faction's territory... // You may use any block unless it is another faction's territory...
if (rel.isNeutral() || (rel.isEnemy() && Conf.territoryEnemyProtectMaterials) || (rel.isAlly() && Conf.territoryAllyProtectMaterials)) if (rel.isNeutral() || (rel.isEnemy() && Conf.territoryEnemyProtectMaterials) || (rel.isAlly() && Conf.territoryAllyProtectMaterials))
{ {
if (!justCheck) if (!justCheck)
{
me.sendMessage("You can't use "+TextUtil.getMaterialName(material)+" in the territory of "+otherFaction.getTag(myFaction)); me.sendMessage("You can't use "+TextUtil.getMaterialName(material)+" in the territory of "+otherFaction.getTag(myFaction));
}
return false; return false;
} }
// Also cancel if player doesn't have ownership rights for this claim // Also cancel if player doesn't have ownership rights for this claim
else if (rel.isMember() && ownershipFail && ! Permission.OWNERSHIP_BYPASS.has(player)) if (Conf.ownedAreasEnabled && Conf.ownedAreaProtectMaterials && !otherFaction.playerHasOwnershipRights(me, loc))
{ {
if (!justCheck) if (!justCheck)
{ me.sendMessage("You can't use "+TextUtil.getMaterialName(material)+" in this territory, it is owned by: "+otherFaction.getOwnerListString(loc));
me.sendMessage("You can't use "+TextUtil.getMaterialName(material)+" in this territory, it is owned by: "+myFaction.getOwnerListString(loc));
}
return false; return false;
} }