Patched away the errors with ugly meassures.

This commit is contained in:
Olof Larsson 2013-04-22 14:16:07 +02:00
parent 61e8730495
commit 390ad76fa6
7 changed files with 39 additions and 54 deletions

View File

@ -8,9 +8,7 @@ import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import org.bukkit.Location;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import com.massivecraft.factions.entity.BoardColls;
import com.massivecraft.factions.entity.FPlayer;
@ -171,8 +169,6 @@ public enum FPerm
private static final String errorpattern = "%s<b> does not allow you to %s<b>.";
public boolean has(Object testSubject, Faction hostFaction, boolean informIfNot)
{
if (testSubject instanceof ConsoleCommandSender) return true;
RelationParticipator rpSubject = null;
if (testSubject instanceof CommandSender)
@ -232,16 +228,8 @@ public enum FPerm
return false;
}
}
return this.has(testSubject, access.getHostFaction(), informIfNot);
}
public boolean has(Object testSubject, Location loc, boolean informIfNot)
{
PS ps = PS.valueOf(loc);
return this.has(testSubject, ps, informIfNot);
}
public boolean has(Object testSubject, Location loc)
{
return this.has(testSubject, loc, false);
return this.has(testSubject, BoardColls.get().getFactionAt(ps), informIfNot);
}
public boolean has(Object testSubject, PS ps)
{

View File

@ -7,9 +7,8 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.massivecraft.factions.entity.FPlayer;
import com.massivecraft.factions.entity.FPlayerColl;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.FactionColl;
import com.massivecraft.factions.entity.FactionColls;
public class TerritoryAccess
{
@ -19,7 +18,6 @@ public class TerritoryAccess
private String hostFactionId;
public String getHostFactionId() { return this.hostFactionId; }
public Faction getHostFaction() { return FactionColl.get().get(this.hostFactionId); }
public void setHostFactionId(String hostFactionId) { this.hostFactionId = hostFactionId; }
private boolean hostFactionAllowed = true;
@ -105,7 +103,7 @@ public class TerritoryAccess
if (testSubject instanceof String)
return hostFactionId.equals((String)testSubject);
else if (testSubject instanceof CommandSender)
return hostFactionId.equals(FPlayerColl.get().get(testSubject).getFactionId());
return hostFactionId.equals(FPlayer.get(testSubject).getFactionId());
else if (testSubject instanceof FPlayer)
return hostFactionId.equals(((FPlayer)testSubject).getFactionId());
else if (testSubject instanceof Faction)
@ -131,14 +129,14 @@ public class TerritoryAccess
this.fplayerIds.clear();
}
public String factionList()
public String factionList(Faction universeExtractable)
{
StringBuilder list = new StringBuilder();
for (String factionID : factionIds)
{
if (list.length() > 0)
list.append(", ");
list.append(FactionColl.get().get(factionID).getTag());
list.append(FactionColls.get().get(universeExtractable).get(factionID).getTag());
}
return list.toString();
}
@ -160,7 +158,7 @@ public class TerritoryAccess
public boolean subjectHasAccess(Object testSubject)
{
if (testSubject instanceof Player)
return fPlayerHasAccess(FPlayerColl.get().get(testSubject));
return fPlayerHasAccess(FPlayer.get(testSubject));
else if (testSubject instanceof FPlayer)
return fPlayerHasAccess((FPlayer)testSubject);
else if (testSubject instanceof Faction)
@ -184,7 +182,8 @@ public class TerritoryAccess
// this should normally only be checked after running subjectHasAccess() or fPlayerHasAccess() above to see if they have access explicitly granted
public boolean subjectAccessIsRestricted(Object testSubject)
{
return ( ! this.isHostFactionAllowed() && this.doesHostFactionMatch(testSubject) && ! FPerm.ACCESS.has(testSubject, this.getHostFaction()));
Faction hostFaction = FactionColls.get().get(testSubject).get(this.getHostFactionId());
return ( ! this.isHostFactionAllowed() && this.doesHostFactionMatch(testSubject) && ! FPerm.ACCESS.has(testSubject, hostFaction));
}
//----------------------------------------------//

View File

@ -37,7 +37,7 @@ public class CmdFactionsAccess extends FCommand
PS chunk = PS.valueOf(me).getChunk(true);
TerritoryAccess territory = BoardColls.get().getTerritoryAccessAt(chunk);
Faction locFaction = territory.getHostFaction();
Faction locFaction = BoardColls.get().getFactionAt(chunk);
boolean accessAny = Perm.ACCESS_ANY.has(sender, false);
if (type.isEmpty() || type.equals("view"))
@ -96,7 +96,7 @@ public class CmdFactionsAccess extends FCommand
msg("<i>Host faction %s has %s<i> in this territory.", locFaction.getTag(), Txt.parse(territory.isHostFactionAllowed() ? "<lime>normal access" : "<rose>restricted access"));
String players = territory.fplayerList();
String factions = territory.factionList();
String factions = territory.factionList(locFaction);
if (factions.isEmpty())
msg("No factions have been explicitly granted access.");

View File

@ -98,7 +98,7 @@ public class Board extends Entity<Board> implements BoardInterface
public Faction getFactionAt(PS ps)
{
if (ps == null) return null;
return this.getTerritoryAccessAt(ps).getHostFaction();
return FactionColls.get().get(this).get(this.getTerritoryAccessAt(ps).getHostFactionId());
}
// SET

View File

@ -153,13 +153,9 @@ public class FPlayer extends SenderEntity<FPlayer> implements EconomyParticipato
public FPlayer()
{
this.resetFactionData(false);
this.setFactionId(ConfServer.newPlayerStartingFactionID);
this.power = ConfServer.powerStarting;
this.lastPowerUpdateTime = System.currentTimeMillis();
if ( ! ConfServer.newPlayerStartingFactionID.equals(Const.FACTIONID_NONE) && FactionColl.get().containsId(ConfServer.newPlayerStartingFactionID))
{
this.factionId = ConfServer.newPlayerStartingFactionID;
}
}
public final void resetFactionData(boolean doSpoutUpdate)

View File

@ -5,7 +5,6 @@ import java.util.Collection;
import java.util.Iterator;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.entity.Enderman;
import org.bukkit.entity.Entity;
@ -594,7 +593,7 @@ public class FactionsListenerMain implements Listener
if (targetFaction == pistonFaction) return;
// if potentially pushing into air/water/lava in another territory, we need to check it out
if ((targetBlock.isEmpty() || targetBlock.isLiquid()) && ! FPerm.BUILD.has(pistonFaction, targetBlock.getLocation()))
if ((targetBlock.isEmpty() || targetBlock.isLiquid()) && ! FPerm.BUILD.has(pistonFaction, PS.valueOf(targetBlock)))
{
event.setCancelled(true);
}
@ -614,18 +613,19 @@ public class FactionsListenerMain implements Listener
// if not a sticky piston, retraction should be fine
if (!event.isSticky()) return;
Location targetLoc = event.getRetractLocation();
Block retractBlock = event.getRetractLocation().getBlock();
PS retractPs = PS.valueOf(retractBlock);
// if potentially retracted block is just air/water/lava, no worries
if (targetLoc.getBlock().isEmpty() || targetLoc.getBlock().isLiquid()) return;
if (retractBlock.isEmpty() || retractBlock.isLiquid()) return;
Faction pistonFaction = BoardColls.get().getFactionAt(PS.valueOf(event.getBlock()));
// members of faction might not have build rights in their own territory, but pistons should still work regardless; so, address that corner case
Faction targetFaction = BoardColls.get().getFactionAt(PS.valueOf(targetLoc));
Faction targetFaction = BoardColls.get().getFactionAt(retractPs);
if (targetFaction == pistonFaction) return;
if ( ! FPerm.BUILD.has(pistonFaction, targetLoc))
if (!FPerm.BUILD.has(pistonFaction, retractPs))
{
event.setCancelled(true);
}

View File

@ -1,6 +1,5 @@
package com.massivecraft.factions.listeners;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
@ -82,7 +81,7 @@ public class TodoFactionsPlayerListener implements Listener
TerritoryAccess access = BoardColls.get().getTerritoryAccessAt(chunkTo);
// Did we change "host"(faction)?
boolean changedFaction = (BoardColls.get().getFactionAt(chunkFrom) != access.getHostFaction());
boolean changedFaction = (BoardColls.get().getFactionAt(chunkFrom) != BoardColls.get().getFactionAt(chunkTo));
// let Spout handle most of this if it's available
boolean handledBySpout = changedFaction && SpoutFeatures.updateTerritoryDisplay(fplayer);
@ -130,41 +129,44 @@ public class TodoFactionsPlayerListener implements Listener
if (event.getAction() != Action.RIGHT_CLICK_BLOCK) return; // only interested on right-clicks for below
if ( ! playerCanUseItemHere(player, block.getLocation(), event.getMaterial(), false))
if ( ! playerCanUseItemHere(player, PS.valueOf(block), event.getMaterial(), false))
{
event.setCancelled(true);
return;
}
}
// TODO: Refactor ! justCheck -> to informIfNot
// TODO: Possibly incorporate pain build...
public static boolean playerCanUseItemHere(Player player, Location loc, Material material, boolean justCheck)
public static boolean playerCanUseItemHere(Player player, PS ps, Material material, boolean justCheck)
{
if (!Const.MATERIALS_EDIT_TOOLS.contains(material)) return true;
String name = player.getName();
if (MConf.get().playersWhoBypassAllProtection.contains(name)) return true;
FPlayer me = FPlayer.get(name);
if (me.isUsingAdminMode()) return true;
if (Const.MATERIALS_EDIT_TOOLS.contains(material) && ! FPerm.BUILD.has(me, loc, ! justCheck)) return false;
return true;
FPlayer fplayer = FPlayer.get(player);
if (fplayer.isUsingAdminMode()) return true;
return FPerm.BUILD.has(fplayer, ps, !justCheck);
}
public static boolean canPlayerUseBlock(Player player, Block block, boolean justCheck)
{
String name = player.getName();
if (MConf.get().playersWhoBypassAllProtection.contains(name)) return true;
FPlayer me = FPlayer.get(name);
FPlayer me = FPlayer.get(player);
if (me.isUsingAdminMode()) return true;
Location loc = block.getLocation();
PS ps = PS.valueOf(block);
Material material = block.getType();
if (Const.MATERIALS_EDIT_ON_INTERACT.contains(material) && ! FPerm.BUILD.has(me, loc, ! justCheck)) return false;
if (Const.MATERIALS_CONTAINER.contains(material) && ! FPerm.CONTAINER.has(me, loc, ! justCheck)) return false;
if (Const.MATERIALS_DOOR.contains(material) && ! FPerm.DOOR.has(me, loc, ! justCheck)) return false;
if (material == Material.STONE_BUTTON && ! FPerm.BUTTON.has(me, loc, ! justCheck)) return false;
if (material == Material.LEVER && ! FPerm.LEVER.has(me, loc, ! justCheck)) return false;
if (Const.MATERIALS_EDIT_ON_INTERACT.contains(material) && ! FPerm.BUILD.has(me, ps, ! justCheck)) return false;
if (Const.MATERIALS_CONTAINER.contains(material) && ! FPerm.CONTAINER.has(me, ps, ! justCheck)) return false;
if (Const.MATERIALS_DOOR.contains(material) && ! FPerm.DOOR.has(me, ps, ! justCheck)) return false;
if (material == Material.STONE_BUTTON && ! FPerm.BUTTON.has(me, ps, ! justCheck)) return false;
if (material == Material.LEVER && ! FPerm.LEVER.has(me, ps, ! justCheck)) return false;
return true;
}
@ -176,7 +178,7 @@ public class TodoFactionsPlayerListener implements Listener
Block block = event.getBlockClicked();
Player player = event.getPlayer();
if ( ! playerCanUseItemHere(player, block.getLocation(), event.getBucket(), false))
if ( ! playerCanUseItemHere(player, PS.valueOf(block), event.getBucket(), false))
{
event.setCancelled(true);
return;
@ -188,7 +190,7 @@ public class TodoFactionsPlayerListener implements Listener
Block block = event.getBlockClicked();
Player player = event.getPlayer();
if ( ! playerCanUseItemHere(player, block.getLocation(), event.getBucket(), false))
if ( ! playerCanUseItemHere(player, PS.valueOf(block), event.getBucket(), false))
{
event.setCancelled(true);
return;