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

View File

@ -7,9 +7,8 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.massivecraft.factions.entity.FPlayer; import com.massivecraft.factions.entity.FPlayer;
import com.massivecraft.factions.entity.FPlayerColl;
import com.massivecraft.factions.entity.Faction; import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.FactionColl; import com.massivecraft.factions.entity.FactionColls;
public class TerritoryAccess public class TerritoryAccess
{ {
@ -19,7 +18,6 @@ public class TerritoryAccess
private String hostFactionId; private String hostFactionId;
public String getHostFactionId() { return this.hostFactionId; } public String getHostFactionId() { return this.hostFactionId; }
public Faction getHostFaction() { return FactionColl.get().get(this.hostFactionId); }
public void setHostFactionId(String hostFactionId) { this.hostFactionId = hostFactionId; } public void setHostFactionId(String hostFactionId) { this.hostFactionId = hostFactionId; }
private boolean hostFactionAllowed = true; private boolean hostFactionAllowed = true;
@ -105,7 +103,7 @@ public class TerritoryAccess
if (testSubject instanceof String) if (testSubject instanceof String)
return hostFactionId.equals((String)testSubject); return hostFactionId.equals((String)testSubject);
else if (testSubject instanceof CommandSender) 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) else if (testSubject instanceof FPlayer)
return hostFactionId.equals(((FPlayer)testSubject).getFactionId()); return hostFactionId.equals(((FPlayer)testSubject).getFactionId());
else if (testSubject instanceof Faction) else if (testSubject instanceof Faction)
@ -131,14 +129,14 @@ public class TerritoryAccess
this.fplayerIds.clear(); this.fplayerIds.clear();
} }
public String factionList() public String factionList(Faction universeExtractable)
{ {
StringBuilder list = new StringBuilder(); StringBuilder list = new StringBuilder();
for (String factionID : factionIds) for (String factionID : factionIds)
{ {
if (list.length() > 0) if (list.length() > 0)
list.append(", "); list.append(", ");
list.append(FactionColl.get().get(factionID).getTag()); list.append(FactionColls.get().get(universeExtractable).get(factionID).getTag());
} }
return list.toString(); return list.toString();
} }
@ -160,7 +158,7 @@ public class TerritoryAccess
public boolean subjectHasAccess(Object testSubject) public boolean subjectHasAccess(Object testSubject)
{ {
if (testSubject instanceof Player) if (testSubject instanceof Player)
return fPlayerHasAccess(FPlayerColl.get().get(testSubject)); return fPlayerHasAccess(FPlayer.get(testSubject));
else if (testSubject instanceof FPlayer) else if (testSubject instanceof FPlayer)
return fPlayerHasAccess((FPlayer)testSubject); return fPlayerHasAccess((FPlayer)testSubject);
else if (testSubject instanceof Faction) 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 // 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) 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); PS chunk = PS.valueOf(me).getChunk(true);
TerritoryAccess territory = BoardColls.get().getTerritoryAccessAt(chunk); TerritoryAccess territory = BoardColls.get().getTerritoryAccessAt(chunk);
Faction locFaction = territory.getHostFaction(); Faction locFaction = BoardColls.get().getFactionAt(chunk);
boolean accessAny = Perm.ACCESS_ANY.has(sender, false); boolean accessAny = Perm.ACCESS_ANY.has(sender, false);
if (type.isEmpty() || type.equals("view")) 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")); 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 players = territory.fplayerList();
String factions = territory.factionList(); String factions = territory.factionList(locFaction);
if (factions.isEmpty()) if (factions.isEmpty())
msg("No factions have been explicitly granted access."); 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) public Faction getFactionAt(PS ps)
{ {
if (ps == null) return null; if (ps == null) return null;
return this.getTerritoryAccessAt(ps).getHostFaction(); return FactionColls.get().get(this).get(this.getTerritoryAccessAt(ps).getHostFactionId());
} }
// SET // SET

View File

@ -153,13 +153,9 @@ public class FPlayer extends SenderEntity<FPlayer> implements EconomyParticipato
public FPlayer() public FPlayer()
{ {
this.resetFactionData(false); this.resetFactionData(false);
this.setFactionId(ConfServer.newPlayerStartingFactionID);
this.power = ConfServer.powerStarting; this.power = ConfServer.powerStarting;
this.lastPowerUpdateTime = System.currentTimeMillis(); 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) public final void resetFactionData(boolean doSpoutUpdate)

View File

@ -5,7 +5,6 @@ import java.util.Collection;
import java.util.Iterator; import java.util.Iterator;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.entity.Enderman; import org.bukkit.entity.Enderman;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
@ -594,7 +593,7 @@ public class FactionsListenerMain implements Listener
if (targetFaction == pistonFaction) return; if (targetFaction == pistonFaction) return;
// if potentially pushing into air/water/lava in another territory, we need to check it out // 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); event.setCancelled(true);
} }
@ -614,18 +613,19 @@ public class FactionsListenerMain implements Listener
// if not a sticky piston, retraction should be fine // if not a sticky piston, retraction should be fine
if (!event.isSticky()) return; 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 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())); 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 // 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 (targetFaction == pistonFaction) return;
if ( ! FPerm.BUILD.has(pistonFaction, targetLoc)) if (!FPerm.BUILD.has(pistonFaction, retractPs))
{ {
event.setCancelled(true); event.setCancelled(true);
} }

View File

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