package com.massivecraft.factions.struct; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import org.bukkit.Location; 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.iface.RelationParticipator; import com.massivecraft.factions.util.RelationUtil; import com.massivecraft.factions.zcore.util.TextUtil; /** * Permissions that you (a player) may or may not have in the territory of a certain faction. * Each faction have many Rel's assigned to each one of these Perms. */ public enum FPerm { BUILD("build", "edit the terrain", Rel.MEMBER), PAINBUILD("painbuild", "edit but take damage", Rel.ALLY), DOOR("door", "use doors", Rel.MEMBER, Rel.ALLY), CONTAINER("container", "use containers", Rel.MEMBER), BUTTON("button", "use stone buttons", Rel.MEMBER, Rel.ALLY), LEVER("lever", "use levers", Rel.MEMBER, Rel.ALLY), ; private final String nicename; private final String desc; public final Set defaultDefaultValue; private FPerm(final String nicename, final String desc, final Rel... rels) { this.nicename = nicename; this.desc = desc; this.defaultDefaultValue = new HashSet(); this.defaultDefaultValue.addAll(Arrays.asList(rels)); } public String getNicename() { return this.nicename; } public String getDescription() { return this.desc; } public Set getDefault() { Set ret = Conf.factionPermDefaults.get(this); if (ret == null) return this.defaultDefaultValue; return ret; } public static FPerm parse(String str) { str = str.toLowerCase(); if (str.startsWith("bui")) return BUILD; if (str.startsWith("p")) return PAINBUILD; if (str.startsWith("d")) return DOOR; if (str.startsWith("c")) return CONTAINER; if (str.startsWith("but")) return BUTTON; if (str.startsWith("l")) return LEVER; return null; } public String getStateInfo(Set value, boolean withDesc) { String ret = ""+this.getNicename()+ " "; List rels = new ArrayList(); for (Rel rel : value) { rels.add("

"+rel.nicename); } ret += TextUtil.implode(rels, "+"); if (withDesc) { ret += " " + this.getDescription(); } return ret; } public static Set parseRelDeltas(String str, Set current) { Set ret = new HashSet(); ret.addAll(current); List nodes = new ArrayList(Arrays.asList(str.split("\\s+"))); for (String node : nodes) { boolean add = true; if (node.startsWith("-")) { add = false; node = node.substring(1); } else if (node.startsWith("+")) { node = node.substring(1); } Rel rel = Rel.parse(node); if (rel == null) continue; if (add) { ret.add(rel); } else { ret.remove(rel); } } return ret; } private static final String errorpattern = "%s can't %s in the territory of %s."; public boolean has(RelationParticipator testSubject, FLocation floc, boolean informIfNot) { Faction factionThere = Board.getFactionAt(floc); Faction factionDoer = RelationUtil.getFaction(testSubject); boolean ret = factionThere.getPermittedRelations(this).contains(factionThere.getRelationTo(factionDoer)); if (!ret && informIfNot && testSubject instanceof FPlayer) { FPlayer fplayer = (FPlayer)testSubject; fplayer.msg(errorpattern, fplayer.describeTo(fplayer, true), this.getDescription(), factionThere.describeTo(fplayer)); } return ret; } public boolean has(RelationParticipator testSubject, Location loc, boolean informIfNot) { FLocation floc = new FLocation(loc); return this.has(testSubject, floc, informIfNot); } public boolean has(RelationParticipator testSubject, Location loc) { return this.has(testSubject, loc, false); } public boolean has(RelationParticipator testSubject, FLocation floc) { return this.has(testSubject, floc, false); } }