Change the underlying mechanics of /f access
This commit is contained in:
		@@ -64,6 +64,7 @@ import com.massivecraft.factions.entity.migrator.MigratorMConf005Warps;
 | 
			
		||||
import com.massivecraft.factions.entity.migrator.MigratorMPerm001Warps;
 | 
			
		||||
import com.massivecraft.factions.entity.migrator.MigratorMPlayer001Ranks;
 | 
			
		||||
import com.massivecraft.factions.entity.migrator.MigratorMPlayer002UsingAdminMode;
 | 
			
		||||
import com.massivecraft.factions.entity.migrator.MigratorTerritoryAccess001Restructure;
 | 
			
		||||
import com.massivecraft.factions.event.EventFactionsChunkChangeType;
 | 
			
		||||
import com.massivecraft.factions.integration.V18.IntegrationV18;
 | 
			
		||||
import com.massivecraft.factions.integration.V19.IntegrationV19;
 | 
			
		||||
@@ -131,6 +132,7 @@ public class Factions extends MassivePlugin
 | 
			
		||||
		MUtil.registerExtractor(String.class, "accountId", ExtractorFactionAccountId.get());
 | 
			
		||||
 | 
			
		||||
		MigratorUtil.addJsonRepresentation(Board.class, Board.MAP_TYPE);
 | 
			
		||||
		MigratorUtil.setTargetVersion(TerritoryAccess.class, 1);
 | 
			
		||||
 | 
			
		||||
		// Activate
 | 
			
		||||
		this.activateAuto();
 | 
			
		||||
@@ -154,7 +156,8 @@ public class Factions extends MassivePlugin
 | 
			
		||||
			MigratorMConf005Warps.class,
 | 
			
		||||
			MigratorMPerm001Warps.class,
 | 
			
		||||
			MigratorMPlayer001Ranks.class,
 | 
			
		||||
			MigratorMPlayer002UsingAdminMode.class
 | 
			
		||||
			MigratorMPlayer002UsingAdminMode.class,
 | 
			
		||||
			MigratorTerritoryAccess001Restructure.class
 | 
			
		||||
		);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,10 @@
 | 
			
		||||
package com.massivecraft.factions;
 | 
			
		||||
 | 
			
		||||
import com.massivecraft.factions.entity.Faction;
 | 
			
		||||
import com.massivecraft.factions.entity.MPerm;
 | 
			
		||||
import com.massivecraft.factions.entity.MPerm.MPermable;
 | 
			
		||||
import com.massivecraft.factions.entity.MPlayer;
 | 
			
		||||
import com.massivecraft.factions.util.RelationUtil;
 | 
			
		||||
import com.massivecraft.massivecore.collections.MassiveSet;
 | 
			
		||||
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
@@ -21,60 +24,46 @@ public class TerritoryAccess
 | 
			
		||||
	// default is true
 | 
			
		||||
	private final boolean hostFactionAllowed;
 | 
			
		||||
	public boolean isHostFactionAllowed() { return this.hostFactionAllowed; }
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	// default is empty
 | 
			
		||||
	private final Set<String> factionIds;
 | 
			
		||||
	public Set<String> getFactionIds() { return this.factionIds; }
 | 
			
		||||
	
 | 
			
		||||
	// default is empty
 | 
			
		||||
	private final Set<String> playerIds;
 | 
			
		||||
	public Set<String> getPlayerIds() { return this.playerIds; }
 | 
			
		||||
	
 | 
			
		||||
	private final Set<String> grantedIds;
 | 
			
		||||
	public Set<String> getGrantedIds() { return this.grantedIds; }
 | 
			
		||||
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	// FIELDS: VERSION
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
 | 
			
		||||
	public int version = 1;
 | 
			
		||||
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	// FIELDS: DELTA
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	
 | 
			
		||||
	// The simple ones
 | 
			
		||||
	public TerritoryAccess withHostFactionId(String hostFactionId) { return valueOf(hostFactionId, hostFactionAllowed, factionIds, playerIds); }
 | 
			
		||||
	public TerritoryAccess withHostFactionAllowed(Boolean hostFactionAllowed) { return valueOf(hostFactionId, hostFactionAllowed, factionIds, playerIds); }
 | 
			
		||||
	public TerritoryAccess withFactionIds(Collection<String> factionIds) { return valueOf(hostFactionId, hostFactionAllowed, factionIds, playerIds); }
 | 
			
		||||
	public TerritoryAccess withPlayerIds(Collection<String> playerIds) { return valueOf(hostFactionId, hostFactionAllowed, factionIds, playerIds); }
 | 
			
		||||
	public TerritoryAccess withHostFactionId(String hostFactionId) { return valueOf(hostFactionId, hostFactionAllowed, grantedIds); }
 | 
			
		||||
	public TerritoryAccess withHostFactionAllowed(Boolean hostFactionAllowed) { return valueOf(hostFactionId, hostFactionAllowed, grantedIds); }
 | 
			
		||||
	public TerritoryAccess withGrantedIds(Collection<String> factionIds) { return valueOf(hostFactionId, hostFactionAllowed, grantedIds); }
 | 
			
		||||
	
 | 
			
		||||
	// The intermediate ones
 | 
			
		||||
	public TerritoryAccess withFactionId(String factionId, boolean with)
 | 
			
		||||
	public TerritoryAccess withGrantedId(String grantedId, boolean with)
 | 
			
		||||
	{
 | 
			
		||||
		if (this.getHostFactionId().equals(factionId))
 | 
			
		||||
		if (this.getHostFactionId().equals(grantedId))
 | 
			
		||||
		{
 | 
			
		||||
			return valueOf(hostFactionId, with, factionIds, playerIds);
 | 
			
		||||
			return valueOf(hostFactionId, with, grantedIds);
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		Set<String> factionIds = new MassiveSet<>(this.getFactionIds());
 | 
			
		||||
		Set<String> grantedIds = new MassiveSet<>(this.getGrantedIds());
 | 
			
		||||
		if (with)
 | 
			
		||||
		{
 | 
			
		||||
			factionIds.add(factionId);
 | 
			
		||||
			grantedIds.add(grantedId);
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			factionIds.remove(factionId);
 | 
			
		||||
			grantedIds.remove(grantedId);
 | 
			
		||||
		}
 | 
			
		||||
		return valueOf(hostFactionId, hostFactionAllowed, factionIds, playerIds);
 | 
			
		||||
		return valueOf(hostFactionId, hostFactionAllowed, grantedIds);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public TerritoryAccess withPlayerId(String playerId, boolean with)
 | 
			
		||||
	{
 | 
			
		||||
		playerId = playerId.toLowerCase();
 | 
			
		||||
		Set<String> playerIds = new MassiveSet<>(this.getPlayerIds());
 | 
			
		||||
		if (with)
 | 
			
		||||
		{
 | 
			
		||||
			playerIds.add(playerId);
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			playerIds.remove(playerId);
 | 
			
		||||
		}
 | 
			
		||||
		return valueOf(hostFactionId, hostFactionAllowed, factionIds, playerIds);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	// FIELDS: DIRECT
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
@@ -86,67 +75,36 @@ public class TerritoryAccess
 | 
			
		||||
		return Faction.get(this.getHostFactionId());
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public Set<MPlayer> getGrantedMPlayers()
 | 
			
		||||
	public Set<MPermable> getGranteds()
 | 
			
		||||
	{
 | 
			
		||||
		// Create
 | 
			
		||||
		Set<MPlayer> ret = new MassiveSet<>();
 | 
			
		||||
		
 | 
			
		||||
		// Fill
 | 
			
		||||
		for (String playerId : this.getPlayerIds())
 | 
			
		||||
		{
 | 
			
		||||
			ret.add(MPlayer.get(playerId));
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		// Return
 | 
			
		||||
		return ret;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public Set<Faction> getGrantedFactions()
 | 
			
		||||
	{
 | 
			
		||||
		// Create
 | 
			
		||||
		Set<Faction> ret = new MassiveSet<>();
 | 
			
		||||
		
 | 
			
		||||
		// Fill
 | 
			
		||||
		for (String factionId : this.getFactionIds())
 | 
			
		||||
		{
 | 
			
		||||
			Faction faction = Faction.get(factionId);
 | 
			
		||||
			if (faction == null) continue;
 | 
			
		||||
			ret.add(faction);
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		// Return
 | 
			
		||||
		return ret;
 | 
			
		||||
		return MPerm.idsToMPermables(this.getGrantedIds());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	// PRIVATE CONSTRUCTOR
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	
 | 
			
		||||
	private TerritoryAccess(String hostFactionId, Boolean hostFactionAllowed, Collection<String> factionIds, Collection<String> playerIds)
 | 
			
		||||
 | 
			
		||||
	// Strictly for GSON only
 | 
			
		||||
	private TerritoryAccess()
 | 
			
		||||
	{
 | 
			
		||||
		if (hostFactionId == null) throw new IllegalArgumentException("hostFactionId was null");
 | 
			
		||||
		this.hostFactionId = null;
 | 
			
		||||
		this.hostFactionAllowed = true;
 | 
			
		||||
		this.grantedIds = null;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	private TerritoryAccess(String hostFactionId, Boolean hostFactionAllowed, Collection<String> grantedIds)
 | 
			
		||||
	{
 | 
			
		||||
		if (hostFactionId == null) throw new NullPointerException("hostFactionId");
 | 
			
		||||
		if (grantedIds == null) throw new NullPointerException("grantedIds");
 | 
			
		||||
		this.hostFactionId = hostFactionId;
 | 
			
		||||
		
 | 
			
		||||
		Set<String> factionIdsInner = new MassiveSet<>();
 | 
			
		||||
		if (factionIds != null)
 | 
			
		||||
		Set<String> grantedIdsInner = new MassiveSet<>();
 | 
			
		||||
		grantedIdsInner.addAll(grantedIds);
 | 
			
		||||
		if (grantedIdsInner.remove(hostFactionId))
 | 
			
		||||
		{
 | 
			
		||||
			factionIdsInner.addAll(factionIds);
 | 
			
		||||
			if (factionIdsInner.remove(hostFactionId))
 | 
			
		||||
			{
 | 
			
		||||
				hostFactionAllowed = true;
 | 
			
		||||
			}
 | 
			
		||||
			hostFactionAllowed = true;
 | 
			
		||||
		}
 | 
			
		||||
		this.factionIds = Collections.unmodifiableSet(factionIdsInner);
 | 
			
		||||
		
 | 
			
		||||
		Set<String> playerIdsInner = new MassiveSet<>();
 | 
			
		||||
		if (playerIds != null)
 | 
			
		||||
		{
 | 
			
		||||
			for (String playerId : playerIds)
 | 
			
		||||
			{
 | 
			
		||||
				playerIdsInner.add(playerId.toLowerCase());
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		this.playerIds = Collections.unmodifiableSet(playerIdsInner);
 | 
			
		||||
		this.grantedIds = Collections.unmodifiableSet(grantedIdsInner);
 | 
			
		||||
		
 | 
			
		||||
		this.hostFactionAllowed = (hostFactionAllowed == null || hostFactionAllowed);
 | 
			
		||||
	}
 | 
			
		||||
@@ -155,45 +113,35 @@ public class TerritoryAccess
 | 
			
		||||
	// FACTORY: VALUE OF
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	
 | 
			
		||||
	public static TerritoryAccess valueOf(String hostFactionId, Boolean hostFactionAllowed, Collection<String> factionIds, Collection<String> playerIds)
 | 
			
		||||
	public static TerritoryAccess valueOf(String hostFactionId, Boolean hostFactionAllowed, Collection<String> grantedIds)
 | 
			
		||||
	{
 | 
			
		||||
		return new TerritoryAccess(hostFactionId, hostFactionAllowed, factionIds, playerIds);
 | 
			
		||||
		return new TerritoryAccess(hostFactionId, hostFactionAllowed, grantedIds);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static TerritoryAccess valueOf(String hostFactionId)
 | 
			
		||||
	{
 | 
			
		||||
		return valueOf(hostFactionId, null, null, null);
 | 
			
		||||
		return valueOf(hostFactionId, null, Collections.emptySet());
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	// INSTANCE METHODS
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	
 | 
			
		||||
	public boolean isFactionGranted(Faction faction)
 | 
			
		||||
 | 
			
		||||
	public boolean isGranted(MPermable permable)
 | 
			
		||||
	{
 | 
			
		||||
		String factionId = faction.getId();
 | 
			
		||||
		
 | 
			
		||||
		if (this.getHostFactionId().equals(factionId))
 | 
			
		||||
		{
 | 
			
		||||
			return this.isHostFactionAllowed();
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return this.getFactionIds().contains(factionId);
 | 
			
		||||
		return isGranted(permable.getId());
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	// Note that the player can have access without being specifically granted.
 | 
			
		||||
	// The player could for example be a member of a granted faction. 
 | 
			
		||||
	public boolean isMPlayerGranted(MPlayer mplayer)
 | 
			
		||||
 | 
			
		||||
	public boolean isGranted(String permableId)
 | 
			
		||||
	{
 | 
			
		||||
		String mplayerId = mplayer.getId();
 | 
			
		||||
		return this.getPlayerIds().contains(mplayerId);
 | 
			
		||||
		return this.getGrantedIds().contains(permableId);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	// A "default" TerritoryAccess could be serialized as a simple string only.
 | 
			
		||||
	// The host faction is still allowed (default) and no faction or player has been granted explicit access (default).
 | 
			
		||||
	public boolean isDefault()
 | 
			
		||||
	{
 | 
			
		||||
		return this.isHostFactionAllowed() && this.getFactionIds().isEmpty() && this.getPlayerIds().isEmpty(); 
 | 
			
		||||
		return this.isHostFactionAllowed() && this.getGrantedIds().isEmpty();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
@@ -202,20 +150,14 @@ public class TerritoryAccess
 | 
			
		||||
	
 | 
			
		||||
	public AccessStatus getTerritoryAccess(MPlayer mplayer)
 | 
			
		||||
	{
 | 
			
		||||
		if (this.isMPlayerGranted(mplayer)) return AccessStatus.ELEVATED;
 | 
			
		||||
		if (isGranted(mplayer.getId())) return AccessStatus.ELEVATED;
 | 
			
		||||
		if (isGranted(mplayer.getFaction().getId())) return AccessStatus.ELEVATED;
 | 
			
		||||
		if (isGranted(mplayer.getRank().getId())) return AccessStatus.ELEVATED;
 | 
			
		||||
		if (isGranted(RelationUtil.getRelationOfThatToMe(mplayer, this.getHostFaction()).toString())) return AccessStatus.ELEVATED;
 | 
			
		||||
		
 | 
			
		||||
		String factionId = mplayer.getFaction().getId();
 | 
			
		||||
		if (this.getFactionIds().contains(factionId)) return AccessStatus.ELEVATED;
 | 
			
		||||
		
 | 
			
		||||
		if (this.getHostFactionId().equals(factionId) && !this.isHostFactionAllowed()) return AccessStatus.DECREASED;
 | 
			
		||||
		if (this.getHostFactionId().equals(mplayer.getFaction().getId()) && !this.isHostFactionAllowed()) return AccessStatus.DECREASED;
 | 
			
		||||
		
 | 
			
		||||
		return AccessStatus.STANDARD;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	@Deprecated
 | 
			
		||||
	public Boolean hasTerritoryAccess(MPlayer mplayer)
 | 
			
		||||
	{
 | 
			
		||||
		return this.getTerritoryAccess(mplayer).hasAccess();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,7 @@ import com.google.gson.JsonSerializationContext;
 | 
			
		||||
import com.google.gson.JsonSerializer;
 | 
			
		||||
import com.google.gson.reflect.TypeToken;
 | 
			
		||||
import com.massivecraft.factions.TerritoryAccess;
 | 
			
		||||
import com.massivecraft.massivecore.store.migrator.MigratorUtil;
 | 
			
		||||
 | 
			
		||||
import java.lang.reflect.Type;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
@@ -23,8 +24,9 @@ public class TerritoryAccessAdapter implements JsonDeserializer<TerritoryAccess>
 | 
			
		||||
 | 
			
		||||
	public static final String HOST_FACTION_ID = "hostFactionId";
 | 
			
		||||
	public static final String HOST_FACTION_ALLOWED = "hostFactionAllowed";
 | 
			
		||||
	public static final String FACTION_IDS = "factionIds";
 | 
			
		||||
	public static final String PLAYER_IDS = "playerIds";
 | 
			
		||||
	/*public static final String FACTION_IDS = "factionIds";
 | 
			
		||||
	public static final String PLAYER_IDS = "playerIds";*/
 | 
			
		||||
	public static final String GRANTED_IDS = "grantedIds";
 | 
			
		||||
	
 | 
			
		||||
	public static final Type SET_OF_STRING_TYPE = new TypeToken<Set<String>>(){}.getType();
 | 
			
		||||
			
 | 
			
		||||
@@ -55,8 +57,7 @@ public class TerritoryAccessAdapter implements JsonDeserializer<TerritoryAccess>
 | 
			
		||||
		// Prepare variables
 | 
			
		||||
		String hostFactionId = null;
 | 
			
		||||
		Boolean hostFactionAllowed = null;
 | 
			
		||||
		Set<String> factionIds = null;
 | 
			
		||||
		Set<String> playerIds = null;
 | 
			
		||||
		Set<String> grantedIds = null;
 | 
			
		||||
		
 | 
			
		||||
		// Read variables (test old values first)
 | 
			
		||||
		JsonElement element = null;
 | 
			
		||||
@@ -68,16 +69,11 @@ public class TerritoryAccessAdapter implements JsonDeserializer<TerritoryAccess>
 | 
			
		||||
		element = obj.get("open");
 | 
			
		||||
		if (element == null) element = obj.get(HOST_FACTION_ALLOWED);
 | 
			
		||||
		if (element != null) hostFactionAllowed = element.getAsBoolean();
 | 
			
		||||
 | 
			
		||||
		element = obj.get(GRANTED_IDS);
 | 
			
		||||
		if (element != null) grantedIds = context.deserialize(element, SET_OF_STRING_TYPE);
 | 
			
		||||
		
 | 
			
		||||
		element = obj.get("factions");
 | 
			
		||||
		if (element == null) element = obj.get(FACTION_IDS);
 | 
			
		||||
		if (element != null) factionIds = context.deserialize(element, SET_OF_STRING_TYPE);
 | 
			
		||||
		
 | 
			
		||||
		element = obj.get("fplayers");
 | 
			
		||||
		if (element == null) element = obj.get(PLAYER_IDS);
 | 
			
		||||
		if (element != null) playerIds = context.deserialize(element, SET_OF_STRING_TYPE);
 | 
			
		||||
		
 | 
			
		||||
		return TerritoryAccess.valueOf(hostFactionId, hostFactionAllowed, factionIds, playerIds);
 | 
			
		||||
		return TerritoryAccess.valueOf(hostFactionId, hostFactionAllowed, grantedIds);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
@@ -101,16 +97,13 @@ public class TerritoryAccessAdapter implements JsonDeserializer<TerritoryAccess>
 | 
			
		||||
			obj.addProperty(HOST_FACTION_ALLOWED, src.isHostFactionAllowed());
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		if (!src.getFactionIds().isEmpty())
 | 
			
		||||
		if (!src.getGrantedIds().isEmpty())
 | 
			
		||||
		{
 | 
			
		||||
			obj.add(FACTION_IDS, context.serialize(src.getFactionIds(), SET_OF_STRING_TYPE));
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		if (!src.getPlayerIds().isEmpty())
 | 
			
		||||
		{
 | 
			
		||||
			obj.add(PLAYER_IDS, context.serialize(src.getPlayerIds(), SET_OF_STRING_TYPE));
 | 
			
		||||
			obj.add(GRANTED_IDS, context.serialize(src.getGrantedIds(), SET_OF_STRING_TYPE));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		obj.add(MigratorUtil.VERSION_FIELD_NAME, new JsonPrimitive(src.version));
 | 
			
		||||
 | 
			
		||||
		return obj;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
 
 | 
			
		||||
@@ -59,8 +59,7 @@ public abstract class CmdFactionsAccessAbstract extends FactionsCommand
 | 
			
		||||
		
 | 
			
		||||
		msg("<k>Host Faction: %s", hostFaction.describeTo(msender, true));
 | 
			
		||||
		msg("<k>Host Faction Allowed: %s", ta.isHostFactionAllowed() ? Txt.parse("<lime>TRUE") : Txt.parse("<rose>FALSE"));
 | 
			
		||||
		msg("<k>Granted Players: %s", describeRelationParticipators(ta.getGrantedMPlayers(), msender));
 | 
			
		||||
		msg("<k>Granted Factions: %s", describeRelationParticipators(ta.getGrantedFactions(), msender));
 | 
			
		||||
		msg("<k>Granted to: %s", CmdFactionsPermShow.permablesToDisplayString(ta.getGranteds(), msender));
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static String describeRelationParticipators(Collection<? extends RelationParticipator> relationParticipators, RelationParticipator observer)
 | 
			
		||||
 
 | 
			
		||||
@@ -29,13 +29,13 @@ public class CmdFactionsAccessFaction extends CmdFactionsAccessAbstract
 | 
			
		||||
	{
 | 
			
		||||
		// Args
 | 
			
		||||
		Faction faction = this.readArg();
 | 
			
		||||
		boolean newValue = this.readArg(!ta.isFactionGranted(faction));
 | 
			
		||||
		boolean newValue = this.readArg(!ta.isGranted(faction));
 | 
			
		||||
		
 | 
			
		||||
		// MPerm
 | 
			
		||||
		if (!MPerm.getPermAccess().has(msender, hostFaction, true)) return;
 | 
			
		||||
		
 | 
			
		||||
		// Apply
 | 
			
		||||
		ta = ta.withFactionId(faction.getId(), newValue);
 | 
			
		||||
		ta = ta.withGrantedId(faction.getId(), newValue);
 | 
			
		||||
		BoardColl.get().setTerritoryAccessAt(chunk, ta);
 | 
			
		||||
		
 | 
			
		||||
		// Inform
 | 
			
		||||
 
 | 
			
		||||
@@ -29,13 +29,13 @@ public class CmdFactionsAccessPlayer extends CmdFactionsAccessAbstract
 | 
			
		||||
	{
 | 
			
		||||
		// Args
 | 
			
		||||
		MPlayer mplayer = this.readArg();
 | 
			
		||||
		boolean newValue = this.readArg(!ta.isMPlayerGranted(mplayer));
 | 
			
		||||
		boolean newValue = this.readArg(!ta.isGranted(mplayer));
 | 
			
		||||
		
 | 
			
		||||
		// MPerm
 | 
			
		||||
		if (!MPerm.getPermAccess().has(msender, hostFaction, true)) return;
 | 
			
		||||
		
 | 
			
		||||
		// Apply
 | 
			
		||||
		ta = ta.withPlayerId(mplayer.getId(), newValue);
 | 
			
		||||
		ta = ta.withGrantedId(mplayer.getId(), newValue);
 | 
			
		||||
		BoardColl.get().setTerritoryAccessAt(chunk, ta);
 | 
			
		||||
		
 | 
			
		||||
		// Inform
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@ import com.massivecraft.factions.entity.BoardColl;
 | 
			
		||||
import com.massivecraft.factions.entity.Faction;
 | 
			
		||||
import com.massivecraft.factions.entity.FactionColl;
 | 
			
		||||
import com.massivecraft.factions.entity.Invitation;
 | 
			
		||||
import com.massivecraft.factions.entity.MPerm;
 | 
			
		||||
import com.massivecraft.factions.entity.MPlayer;
 | 
			
		||||
import com.massivecraft.factions.entity.MPlayerColl;
 | 
			
		||||
import com.massivecraft.massivecore.MassiveException;
 | 
			
		||||
@@ -144,11 +145,11 @@ public class CmdFactionsClean extends FactionsCommand
 | 
			
		||||
				TerritoryAccess territoryAccess = entry.getValue();
 | 
			
		||||
				boolean changed = false;
 | 
			
		||||
				
 | 
			
		||||
				for (String factionId : territoryAccess.getFactionIds())
 | 
			
		||||
				for (String grantedIds : territoryAccess.getGrantedIds())
 | 
			
		||||
				{
 | 
			
		||||
					if (FactionColl.get().containsId(factionId)) continue;
 | 
			
		||||
					if (MPerm.idToMPermableOptional(grantedIds).isPresent()) continue;
 | 
			
		||||
					
 | 
			
		||||
					territoryAccess = territoryAccess.withFactionId(factionId, false);
 | 
			
		||||
					territoryAccess = territoryAccess.withGrantedId(grantedIds, false);
 | 
			
		||||
					ret += 1;
 | 
			
		||||
					changed = true;
 | 
			
		||||
				}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +1,11 @@
 | 
			
		||||
package com.massivecraft.factions.cmd;
 | 
			
		||||
 | 
			
		||||
import com.massivecraft.factions.Rel;
 | 
			
		||||
import com.massivecraft.factions.cmd.type.TypeFaction;
 | 
			
		||||
import com.massivecraft.factions.cmd.type.TypeMPerm;
 | 
			
		||||
import com.massivecraft.factions.entity.Faction;
 | 
			
		||||
import com.massivecraft.factions.entity.FactionColl;
 | 
			
		||||
import com.massivecraft.factions.entity.MPerm;
 | 
			
		||||
import com.massivecraft.factions.entity.MPerm.MPermable;
 | 
			
		||||
import com.massivecraft.factions.entity.MPlayer;
 | 
			
		||||
import com.massivecraft.factions.entity.MPlayerColl;
 | 
			
		||||
import com.massivecraft.factions.entity.Rank;
 | 
			
		||||
import com.massivecraft.massivecore.MassiveException;
 | 
			
		||||
import com.massivecraft.massivecore.collections.MassiveList;
 | 
			
		||||
import com.massivecraft.massivecore.util.Txt;
 | 
			
		||||
@@ -62,26 +58,10 @@ public class CmdFactionsPermShow extends FactionsCommand
 | 
			
		||||
		msg("<i>In <reset>%s <i>permission <reset>%s <i>is granted to <reset>%s<i>.", faction.describeTo(msender), mperm.getDesc(true, false), permableNames);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Deprecated
 | 
			
		||||
	public static MPerm.MPermable idToMPermable(String id)
 | 
			
		||||
	{
 | 
			
		||||
		MPlayer mplayer = MPlayerColl.get().get(id, false);
 | 
			
		||||
		if (mplayer != null) return mplayer;
 | 
			
		||||
 | 
			
		||||
		Faction faction = Faction.get(id);
 | 
			
		||||
		if (faction != null) return faction;
 | 
			
		||||
 | 
			
		||||
		for (Faction f : FactionColl.get().getAll())
 | 
			
		||||
		{
 | 
			
		||||
			Rank rank = f.getRank(id);
 | 
			
		||||
			if (rank != null) return rank;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (Rel.ALLY.name().equalsIgnoreCase(id)) return Rel.ALLY;
 | 
			
		||||
		if (Rel.TRUCE.name().equalsIgnoreCase(id)) return Rel.TRUCE;
 | 
			
		||||
		if (Rel.NEUTRAL.name().equalsIgnoreCase(id)) return Rel.NEUTRAL;
 | 
			
		||||
		if (Rel.ENEMY.name().equalsIgnoreCase(id)) return Rel.ENEMY;
 | 
			
		||||
 | 
			
		||||
		throw new RuntimeException(id);
 | 
			
		||||
		return MPerm.idToMPermable(id);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static String permablesToDisplayString(Collection<MPermable> permables, Object watcherObject)
 | 
			
		||||
 
 | 
			
		||||
@@ -52,8 +52,6 @@ public class Board extends Entity<Board> implements BoardInterface
 | 
			
		||||
	// FIELDS
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	
 | 
			
		||||
	// TODO: Make TerritoryAccess immutable.
 | 
			
		||||
	
 | 
			
		||||
	private ConcurrentSkipListMap<PS, TerritoryAccess> map;
 | 
			
		||||
	public Map<PS, TerritoryAccess> getMap() { return Collections.unmodifiableMap(this.map); }
 | 
			
		||||
	public Map<PS, TerritoryAccess> getMapRaw() { return this.map; }
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,6 @@ import com.massivecraft.factions.FactionsIndex;
 | 
			
		||||
import com.massivecraft.factions.FactionsParticipator;
 | 
			
		||||
import com.massivecraft.factions.Rel;
 | 
			
		||||
import com.massivecraft.factions.RelationParticipator;
 | 
			
		||||
import com.massivecraft.factions.cmd.CmdFactionsPermShow;
 | 
			
		||||
import com.massivecraft.factions.entity.MPerm.MPermable;
 | 
			
		||||
import com.massivecraft.factions.predicate.PredicateCommandSenderFaction;
 | 
			
		||||
import com.massivecraft.factions.predicate.PredicateMPlayerRank;
 | 
			
		||||
@@ -867,9 +866,7 @@ public class Faction extends Entity<Faction> implements FactionsParticipator, MP
 | 
			
		||||
 | 
			
		||||
	public Set<MPermable> getPermittedPermables(String permId)
 | 
			
		||||
	{
 | 
			
		||||
		return getPermitted(permId).stream()
 | 
			
		||||
			.map(CmdFactionsPermShow::idToMPermable)
 | 
			
		||||
			.collect(Collectors.toSet());
 | 
			
		||||
		return MPerm.idsToMPermables(getPermitted(permId));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public Set<MPermable> getPermittedPermables(MPerm mperm)
 | 
			
		||||
@@ -882,6 +879,7 @@ public class Faction extends Entity<Faction> implements FactionsParticipator, MP
 | 
			
		||||
		if (permableId == null) throw new NullPointerException("permableId");
 | 
			
		||||
		if (permId == null) throw new NullPointerException("permId");
 | 
			
		||||
 | 
			
		||||
		// TODO: Isn't this section redundant and just a copy of that from getPermitted?
 | 
			
		||||
		Set<String> permables = this.perms.get(permId);
 | 
			
		||||
		if (permables == null)
 | 
			
		||||
		{
 | 
			
		||||
 
 | 
			
		||||
@@ -16,15 +16,19 @@ import com.massivecraft.massivecore.comparator.ComparatorSmart;
 | 
			
		||||
import com.massivecraft.massivecore.predicate.PredicateIsRegistered;
 | 
			
		||||
import com.massivecraft.massivecore.ps.PS;
 | 
			
		||||
import com.massivecraft.massivecore.store.Entity;
 | 
			
		||||
import com.massivecraft.massivecore.util.IdUtil;
 | 
			
		||||
import com.massivecraft.massivecore.util.MUtil;
 | 
			
		||||
import com.massivecraft.massivecore.util.Txt;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.Comparator;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
public class MPerm extends Entity<MPerm> implements Prioritized, Registerable, Named
 | 
			
		||||
{
 | 
			
		||||
@@ -414,7 +418,7 @@ public class MPerm extends Entity<MPerm> implements Prioritized, Registerable, N
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	// UTIL: ASCII
 | 
			
		||||
	// PERMABLES
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
 | 
			
		||||
	public static List<MPermable> getPermables(Faction faction)
 | 
			
		||||
@@ -430,60 +434,6 @@ public class MPerm extends Entity<MPerm> implements Prioritized, Registerable, N
 | 
			
		||||
 | 
			
		||||
		return list;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/*public static String getStateHeaders(Faction faction)
 | 
			
		||||
	{
 | 
			
		||||
		if (faction == null) throw new NullPointerException("faction");
 | 
			
		||||
 | 
			
		||||
		String ret = "";
 | 
			
		||||
		for (MPermable permable : getPermables(faction))
 | 
			
		||||
		{
 | 
			
		||||
			ret += permable.getColor().toString();
 | 
			
		||||
			ret += permable.getShortName().toUpperCase();
 | 
			
		||||
			ret += " ";
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return ret;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public String getStateInfo(Faction faction, boolean withDesc)
 | 
			
		||||
	{
 | 
			
		||||
		if (faction == null) throw new NullPointerException("faction");
 | 
			
		||||
 | 
			
		||||
		String ret = "";
 | 
			
		||||
 | 
			
		||||
		for (MPermable permable : getPermables(faction))
 | 
			
		||||
		{
 | 
			
		||||
			if (faction.isPermablePermitted(permable, this))
 | 
			
		||||
			{
 | 
			
		||||
				ret += "<g>YES";
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				ret += "<b>NOO";
 | 
			
		||||
			}
 | 
			
		||||
			ret += " ";
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		String color = "<aqua>";
 | 
			
		||||
		if (!this.isVisible())
 | 
			
		||||
		{
 | 
			
		||||
			color = "<silver>";
 | 
			
		||||
		}
 | 
			
		||||
		else if (this.isEditable())
 | 
			
		||||
		{
 | 
			
		||||
			color = "<pink>";
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		ret += color;
 | 
			
		||||
		ret += this.getName();
 | 
			
		||||
		
 | 
			
		||||
		ret = Txt.parse(ret);
 | 
			
		||||
		
 | 
			
		||||
		if (withDesc) ret += " <i>" + this.getDesc();
 | 
			
		||||
		
 | 
			
		||||
		return ret;
 | 
			
		||||
	}*/
 | 
			
		||||
 | 
			
		||||
	public interface MPermable extends Named, Identified
 | 
			
		||||
	{
 | 
			
		||||
@@ -504,5 +454,43 @@ public class MPerm extends Entity<MPerm> implements Prioritized, Registerable, N
 | 
			
		||||
 | 
			
		||||
		String getDisplayName(Object senderObject);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static Set<MPermable> idsToMPermables(Collection<String> ids)
 | 
			
		||||
	{
 | 
			
		||||
		return ids.stream()
 | 
			
		||||
			.map(MPerm::idToMPermable)
 | 
			
		||||
			.collect(Collectors.toSet());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static MPermable idToMPermable(String id)
 | 
			
		||||
	{
 | 
			
		||||
		return idToMPermableOptional(id).orElseThrow(() -> new RuntimeException(id));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static Optional<MPermable> idToMPermableOptional(String id)
 | 
			
		||||
	{
 | 
			
		||||
		MPlayer mplayer = MPlayerColl.get().get(id, false);
 | 
			
		||||
		if (mplayer != null) return Optional.of(mplayer);
 | 
			
		||||
 | 
			
		||||
		// Workaround for registered senders
 | 
			
		||||
		// Players ussually have a power, which makes sure they are in the coll
 | 
			
		||||
		if (IdUtil.getRegistryIdToSender().containsKey(id)) return Optional.of(MPlayerColl.get().get(id, true));
 | 
			
		||||
 | 
			
		||||
		Faction faction = Faction.get(id);
 | 
			
		||||
		if (faction != null) return Optional.of(faction);
 | 
			
		||||
 | 
			
		||||
		for (Faction f : FactionColl.get().getAll())
 | 
			
		||||
		{
 | 
			
		||||
			Rank rank = f.getRank(id);
 | 
			
		||||
			if (rank != null) return Optional.of(rank);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (Rel.ALLY.name().equalsIgnoreCase(id)) return Optional.of(Rel.ALLY);
 | 
			
		||||
		if (Rel.TRUCE.name().equalsIgnoreCase(id)) return Optional.of(Rel.TRUCE);
 | 
			
		||||
		if (Rel.NEUTRAL.name().equalsIgnoreCase(id)) return Optional.of(Rel.NEUTRAL);
 | 
			
		||||
		if (Rel.ENEMY.name().equalsIgnoreCase(id)) return Optional.of(Rel.ENEMY);
 | 
			
		||||
 | 
			
		||||
		return Optional.empty();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,50 @@
 | 
			
		||||
package com.massivecraft.factions.entity.migrator;
 | 
			
		||||
 | 
			
		||||
import com.google.gson.JsonArray;
 | 
			
		||||
import com.google.gson.JsonElement;
 | 
			
		||||
import com.google.gson.JsonObject;
 | 
			
		||||
import com.massivecraft.factions.TerritoryAccess;
 | 
			
		||||
import com.massivecraft.factions.adapter.TerritoryAccessAdapter;
 | 
			
		||||
import com.massivecraft.massivecore.store.migrator.MigratorRoot;
 | 
			
		||||
 | 
			
		||||
public class MigratorTerritoryAccess001Restructure extends MigratorRoot
 | 
			
		||||
{
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	// INSTANCE & CONSTRUCT
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
 | 
			
		||||
	private static MigratorTerritoryAccess001Restructure i = new MigratorTerritoryAccess001Restructure();
 | 
			
		||||
	public static MigratorTerritoryAccess001Restructure get() { return i; }
 | 
			
		||||
	private MigratorTerritoryAccess001Restructure()
 | 
			
		||||
	{
 | 
			
		||||
		super(TerritoryAccess.class);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	// OVERRIDE
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void migrateInner(JsonObject entity)
 | 
			
		||||
	{
 | 
			
		||||
		JsonElement factionIds = entity.remove("factionIds");
 | 
			
		||||
		JsonElement playerIds = entity.remove("playerIds");
 | 
			
		||||
 | 
			
		||||
		JsonArray grantedIds = new JsonArray();
 | 
			
		||||
 | 
			
		||||
		if (factionIds != null && factionIds.isJsonArray())
 | 
			
		||||
		{
 | 
			
		||||
			JsonArray factionIdsArr = factionIds.getAsJsonArray();
 | 
			
		||||
			grantedIds.addAll(factionIdsArr);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (playerIds != null && playerIds.isJsonArray())
 | 
			
		||||
		{
 | 
			
		||||
			JsonArray playerIdsArr = playerIds.getAsJsonArray();
 | 
			
		||||
			grantedIds.addAll(playerIdsArr);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (grantedIds.size() > 0) entity.add(TerritoryAccessAdapter.GRANTED_IDS, grantedIds);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user