Allow naming of chunks
This commit is contained in:
		@@ -29,6 +29,10 @@ public class TerritoryAccess
 | 
			
		||||
	private final Set<String> grantedIds;
 | 
			
		||||
	public Set<String> getGrantedIds() { return this.grantedIds; }
 | 
			
		||||
 | 
			
		||||
	// default is null
 | 
			
		||||
	private final String chunkName;
 | 
			
		||||
	public String getChunkName() { return this.chunkName; }
 | 
			
		||||
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	// FIELDS: VERSION
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
@@ -40,9 +44,10 @@ public class TerritoryAccess
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	
 | 
			
		||||
	// The simple ones
 | 
			
		||||
	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> grantedIds) { return valueOf(hostFactionId, hostFactionAllowed, grantedIds); }
 | 
			
		||||
	public TerritoryAccess withHostFactionId(String hostFactionId) { return valueOf(hostFactionId, hostFactionAllowed, grantedIds, chunkName); }
 | 
			
		||||
	public TerritoryAccess withHostFactionAllowed(Boolean hostFactionAllowed) { return valueOf(hostFactionId, hostFactionAllowed, grantedIds, chunkName); }
 | 
			
		||||
	public TerritoryAccess withGrantedIds(Collection<String> grantedIds) { return valueOf(hostFactionId, hostFactionAllowed, grantedIds, chunkName); }
 | 
			
		||||
	public TerritoryAccess withChunkName(String chunkName) { return valueOf(hostFactionId, hostFactionAllowed, grantedIds, chunkName); }
 | 
			
		||||
	
 | 
			
		||||
	// The intermediate ones
 | 
			
		||||
	public TerritoryAccess withGranted(MPermable mpermable, boolean with)
 | 
			
		||||
@@ -54,7 +59,7 @@ public class TerritoryAccess
 | 
			
		||||
	{
 | 
			
		||||
		if (this.getHostFactionId().equals(grantedId))
 | 
			
		||||
		{
 | 
			
		||||
			return valueOf(hostFactionId, with, grantedIds);
 | 
			
		||||
			return valueOf(hostFactionId, with, grantedIds, chunkName);
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		Set<String> grantedIds = new MassiveSet<>(this.getGrantedIds());
 | 
			
		||||
@@ -66,7 +71,7 @@ public class TerritoryAccess
 | 
			
		||||
		{
 | 
			
		||||
			grantedIds.remove(grantedId);
 | 
			
		||||
		}
 | 
			
		||||
		return valueOf(hostFactionId, hostFactionAllowed, grantedIds);
 | 
			
		||||
		return valueOf(hostFactionId, hostFactionAllowed, grantedIds, chunkName);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
@@ -95,9 +100,10 @@ public class TerritoryAccess
 | 
			
		||||
		this.hostFactionId = null;
 | 
			
		||||
		this.hostFactionAllowed = true;
 | 
			
		||||
		this.grantedIds = null;
 | 
			
		||||
		this.chunkName = null;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	private TerritoryAccess(String hostFactionId, Boolean hostFactionAllowed, Collection<String> grantedIds)
 | 
			
		||||
	private TerritoryAccess(String hostFactionId, Boolean hostFactionAllowed, Collection<String> grantedIds, String chunkName)
 | 
			
		||||
	{
 | 
			
		||||
		if (hostFactionId == null) throw new NullPointerException("hostFactionId");
 | 
			
		||||
		if (grantedIds == null) throw new NullPointerException("grantedIds");
 | 
			
		||||
@@ -112,23 +118,25 @@ public class TerritoryAccess
 | 
			
		||||
		this.grantedIds = Collections.unmodifiableSet(grantedIdsInner);
 | 
			
		||||
		
 | 
			
		||||
		this.hostFactionAllowed = (hostFactionAllowed == null || hostFactionAllowed);
 | 
			
		||||
 | 
			
		||||
		this.chunkName = chunkName;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	// FACTORY: VALUE OF
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	
 | 
			
		||||
	public static TerritoryAccess valueOf(String hostFactionId, Boolean hostFactionAllowed, Collection<String> grantedIds)
 | 
			
		||||
	public static TerritoryAccess valueOf(String hostFactionId, Boolean hostFactionAllowed, Collection<String> grantedIds, String chunkName)
 | 
			
		||||
	{
 | 
			
		||||
		if (hostFactionId == null) throw new NullPointerException("hostFactionId");
 | 
			
		||||
		if (grantedIds == null) throw new NullPointerException("grantedIds");
 | 
			
		||||
		return new TerritoryAccess(hostFactionId, hostFactionAllowed, grantedIds);
 | 
			
		||||
		return new TerritoryAccess(hostFactionId, hostFactionAllowed, grantedIds, chunkName);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static TerritoryAccess valueOf(String hostFactionId)
 | 
			
		||||
	{
 | 
			
		||||
		if (hostFactionId == null) throw new NullPointerException("hostFactionId");
 | 
			
		||||
		return valueOf(hostFactionId, null, Collections.emptySet());
 | 
			
		||||
		return valueOf(hostFactionId, null, Collections.emptySet(), null);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
@@ -150,7 +158,7 @@ public class TerritoryAccess
 | 
			
		||||
	// 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.getGrantedIds().isEmpty();
 | 
			
		||||
		return this.isHostFactionAllowed() && this.getGrantedIds().isEmpty() && this.getChunkName() == null;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,7 @@ 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 GRANTED_IDS = "grantedIds";
 | 
			
		||||
	public static final String CHUNK_NAME = "chunkName";
 | 
			
		||||
	
 | 
			
		||||
	public static final Type SET_OF_STRING_TYPE = new TypeToken<Set<String>>(){}.getType();
 | 
			
		||||
			
 | 
			
		||||
@@ -57,7 +58,8 @@ public class TerritoryAccessAdapter implements JsonDeserializer<TerritoryAccess>
 | 
			
		||||
		String hostFactionId = null;
 | 
			
		||||
		Boolean hostFactionAllowed = null;
 | 
			
		||||
		Set<String> grantedIds = Collections.emptySet();
 | 
			
		||||
		
 | 
			
		||||
		String chunkName = null;
 | 
			
		||||
 | 
			
		||||
		// Read variables (test old values first)
 | 
			
		||||
		JsonElement element = null;
 | 
			
		||||
		
 | 
			
		||||
@@ -69,8 +71,11 @@ public class TerritoryAccessAdapter implements JsonDeserializer<TerritoryAccess>
 | 
			
		||||
 | 
			
		||||
		element = obj.get(GRANTED_IDS);
 | 
			
		||||
		if (element != null) grantedIds = context.deserialize(element, SET_OF_STRING_TYPE);
 | 
			
		||||
 | 
			
		||||
		element = obj.get(CHUNK_NAME);
 | 
			
		||||
		if (element != null) chunkName = element.getAsString();
 | 
			
		||||
		
 | 
			
		||||
		return TerritoryAccess.valueOf(hostFactionId, hostFactionAllowed, grantedIds);
 | 
			
		||||
		return TerritoryAccess.valueOf(hostFactionId, hostFactionAllowed, grantedIds, chunkName);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
@@ -99,6 +104,11 @@ public class TerritoryAccessAdapter implements JsonDeserializer<TerritoryAccess>
 | 
			
		||||
			obj.add(GRANTED_IDS, context.serialize(src.getGrantedIds(), SET_OF_STRING_TYPE));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (src.getChunkName() != null)
 | 
			
		||||
		{
 | 
			
		||||
			obj.addProperty(CHUNK_NAME, src.getChunkName());
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		obj.add(MigratorUtil.VERSION_FIELD_NAME, new JsonPrimitive(src.version));
 | 
			
		||||
 | 
			
		||||
		return obj;
 | 
			
		||||
 
 | 
			
		||||
@@ -46,6 +46,7 @@ public class CmdFactions extends FactionsCommand
 | 
			
		||||
	public CmdFactionsClaim cmdFactionsClaim = new CmdFactionsClaim();
 | 
			
		||||
	public CmdFactionsUnclaim cmdFactionsUnclaim = new CmdFactionsUnclaim();
 | 
			
		||||
	public CmdFactionsAccess cmdFactionsAccess = new CmdFactionsAccess();
 | 
			
		||||
	public CmdFactionsChunkname cmdFactionsChunkname = new CmdFactionsChunkname();
 | 
			
		||||
	public CmdFactionsRelation cmdFactionsRelation = new CmdFactionsRelation();
 | 
			
		||||
	public CmdFactionsRelationOld cmdFactionsRelationOldAlly = new CmdFactionsRelationOld("ally");
 | 
			
		||||
	public CmdFactionsRelationOld cmdFactionsRelationOldTruce = new CmdFactionsRelationOld("truce");
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,6 @@ import com.massivecraft.factions.entity.MPerm.MPermable;
 | 
			
		||||
import com.massivecraft.factions.util.AsciiMap;
 | 
			
		||||
import com.massivecraft.massivecore.command.requirement.RequirementIsPlayer;
 | 
			
		||||
import com.massivecraft.massivecore.ps.PS;
 | 
			
		||||
import com.massivecraft.massivecore.ps.PSFormatHumanSpace;
 | 
			
		||||
import com.massivecraft.massivecore.util.Txt;
 | 
			
		||||
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
@@ -59,7 +58,7 @@ public abstract class CmdFactionsAccessAbstract extends FactionsCommand
 | 
			
		||||
 | 
			
		||||
	public void sendAccessInfo()
 | 
			
		||||
	{
 | 
			
		||||
		String chunkDesc = AsciiMap.showChunkCoords(chunk) ? " at " + chunk.toString(PSFormatHumanSpace.get()) : "";
 | 
			
		||||
		String chunkDesc = AsciiMap.getChunkDescWithName(chunk, ta);
 | 
			
		||||
		Object title = "Access" + chunkDesc;
 | 
			
		||||
		title = Txt.titleize(title);
 | 
			
		||||
		message(title);
 | 
			
		||||
@@ -80,7 +79,7 @@ public abstract class CmdFactionsAccessAbstract extends FactionsCommand
 | 
			
		||||
		Faction faction = ta.getHostFaction();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		String chunkDesc = AsciiMap.showChunkCoords(chunk) ? " at " + chunk.toString(PSFormatHumanSpace.get()) : "";
 | 
			
		||||
		String chunkDesc = AsciiMap.getChunkDescWithName(chunk, ta);
 | 
			
		||||
		String grantedDenied = granted ? "granted" : "denied";
 | 
			
		||||
		String mpermableDesc = mpermable.getDisplayName(msender);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										81
									
								
								src/com/massivecraft/factions/cmd/CmdFactionsChunkname.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								src/com/massivecraft/factions/cmd/CmdFactionsChunkname.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,81 @@
 | 
			
		||||
package com.massivecraft.factions.cmd;
 | 
			
		||||
 | 
			
		||||
import com.massivecraft.factions.TerritoryAccess;
 | 
			
		||||
import com.massivecraft.factions.entity.BoardColl;
 | 
			
		||||
import com.massivecraft.factions.entity.MPerm;
 | 
			
		||||
import com.massivecraft.factions.util.AsciiMap;
 | 
			
		||||
import com.massivecraft.massivecore.MassiveException;
 | 
			
		||||
import com.massivecraft.massivecore.command.requirement.RequirementIsPlayer;
 | 
			
		||||
import com.massivecraft.massivecore.command.type.TypeNullable;
 | 
			
		||||
import com.massivecraft.massivecore.command.type.primitive.TypeString;
 | 
			
		||||
import com.massivecraft.massivecore.ps.PS;
 | 
			
		||||
import com.massivecraft.massivecore.util.MUtil;
 | 
			
		||||
import com.massivecraft.massivecore.util.Txt;
 | 
			
		||||
 | 
			
		||||
public class CmdFactionsChunkname extends FactionsCommand
 | 
			
		||||
{
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	// CONSTRUCT
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
 | 
			
		||||
	public CmdFactionsChunkname()
 | 
			
		||||
	{
 | 
			
		||||
		// Parameters
 | 
			
		||||
		this.addParameter(TypeNullable.get(TypeString.get()), "name", "read");
 | 
			
		||||
 | 
			
		||||
		this.addRequirements(RequirementIsPlayer.get());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	// OVERRIDE
 | 
			
		||||
	// -------------------------------------------- //
 | 
			
		||||
	
 | 
			
		||||
	@Override
 | 
			
		||||
	public void perform() throws MassiveException
 | 
			
		||||
	{
 | 
			
		||||
		PS chunk = PS.valueOf(me.getLocation()).getChunk(true);
 | 
			
		||||
		TerritoryAccess ta = BoardColl.get().getTerritoryAccessAt(chunk);
 | 
			
		||||
 | 
			
		||||
		if (!this.argIsSet(0))
 | 
			
		||||
		{
 | 
			
		||||
			String name = ta.getChunkName();
 | 
			
		||||
			if (name == null)
 | 
			
		||||
			{
 | 
			
		||||
				msg("<i>This chunk has no name.");
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				msg("<i>This chunk is called <h>%s<i>.", name);
 | 
			
		||||
			}
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// MPerm
 | 
			
		||||
		if (!MPerm.getPermTerritory().has(msender, msenderFaction, true)) return;
 | 
			
		||||
 | 
			
		||||
		// Args
 | 
			
		||||
		String target = this.readArg();
 | 
			
		||||
 | 
			
		||||
		target = target.trim();
 | 
			
		||||
		target = Txt.parse(target);
 | 
			
		||||
 | 
			
		||||
		String old = ta.getChunkName();
 | 
			
		||||
 | 
			
		||||
		// NoChange
 | 
			
		||||
		if (MUtil.equals(old, target))
 | 
			
		||||
		{
 | 
			
		||||
			if (old == null)
 | 
			
		||||
			{
 | 
			
		||||
				throw new MassiveException().addMsg("<b>This chunk already has no name.");
 | 
			
		||||
			}
 | 
			
		||||
			throw new MassiveException().addMsg("<b>The name for this chunk is already <h>%s<b>.", old);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		ta = ta.withChunkName(target);
 | 
			
		||||
		BoardColl.get().setTerritoryAccessAt(chunk, ta);
 | 
			
		||||
 | 
			
		||||
		String chunkDesc = AsciiMap.getChunkDesc(chunk);
 | 
			
		||||
		msg("<i>The chunk name%s<i> is now %s.", chunkDesc, target);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
@@ -1,12 +1,14 @@
 | 
			
		||||
package com.massivecraft.factions.util;
 | 
			
		||||
 | 
			
		||||
import com.massivecraft.factions.RelationParticipator;
 | 
			
		||||
import com.massivecraft.factions.TerritoryAccess;
 | 
			
		||||
import com.massivecraft.factions.entity.Board;
 | 
			
		||||
import com.massivecraft.factions.entity.BoardColl;
 | 
			
		||||
import com.massivecraft.factions.entity.Faction;
 | 
			
		||||
import com.massivecraft.massivecore.collections.MassiveList;
 | 
			
		||||
import com.massivecraft.massivecore.mson.Mson;
 | 
			
		||||
import com.massivecraft.massivecore.ps.PS;
 | 
			
		||||
import com.massivecraft.massivecore.ps.PSFormatHumanSpace;
 | 
			
		||||
import com.massivecraft.massivecore.util.Txt;
 | 
			
		||||
import org.bukkit.ChatColor;
 | 
			
		||||
import org.bukkit.GameRule;
 | 
			
		||||
@@ -112,7 +114,7 @@ public class AsciiMap
 | 
			
		||||
		ret.add(this.getTitle());
 | 
			
		||||
		ret.addAll(this.getLines());
 | 
			
		||||
		ret.add(this.getFactionLegend());
 | 
			
		||||
		
 | 
			
		||||
 | 
			
		||||
		// Return
 | 
			
		||||
		return ret;
 | 
			
		||||
	}
 | 
			
		||||
@@ -164,31 +166,42 @@ public class AsciiMap
 | 
			
		||||
		for (int deltaX = startX; deltaX < WIDTH; deltaX++)
 | 
			
		||||
		{
 | 
			
		||||
			boolean isMiddle = deltaX == WIDTH_HALF && deltaZ == this.getHeightHalf();
 | 
			
		||||
			factionChar = isMiddle ? KEY_MIDDLE : this.getCharFaction(deltaZ, deltaX);
 | 
			
		||||
			factionChar = isMiddle ? KEY_MIDDLE : this.getCharChunk(deltaZ, deltaX);
 | 
			
		||||
			ret = ret.add(factionChar);
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		// Return
 | 
			
		||||
		return ret;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private Mson getCharChunk(int deltaZ, int deltaX)
 | 
			
		||||
	{
 | 
			
		||||
		PS herePs = this.getTopLeft().plusChunkCoords(deltaX, deltaZ);
 | 
			
		||||
		Faction hereFaction = this.getBoard().getFactionAt(herePs);
 | 
			
		||||
 | 
			
		||||
		String chunkName = this.getBoard().getTerritoryAccessAt(herePs).getChunkName();
 | 
			
		||||
		Mson charFaction = getCharFaction(hereFaction);
 | 
			
		||||
		String tooltip = charFaction.getTooltip();
 | 
			
		||||
		if (chunkName != null) tooltip += "\n" + ChatColor.WHITE + chunkName;
 | 
			
		||||
		Mson charChunk = charFaction.tooltip(tooltip);
 | 
			
		||||
		return charChunk;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	private Mson getCharFaction(int deltaZ, int deltaX)
 | 
			
		||||
	private Mson getCharFaction(Faction faction)
 | 
			
		||||
	{
 | 
			
		||||
		// Calculate overflow
 | 
			
		||||
		int index = this.getFactionChars().size();
 | 
			
		||||
		if (!this.isOverflown() && index >= KEY_SIZE) this.setOverflown(true);
 | 
			
		||||
		
 | 
			
		||||
		PS herePs = this.getTopLeft().plusChunkCoords(deltaX, deltaZ);
 | 
			
		||||
		Faction hereFaction = this.getBoard().getFactionAt(herePs);
 | 
			
		||||
		Mson factionChar = this.getFactionChars().get(hereFaction);
 | 
			
		||||
 | 
			
		||||
		Mson factionChar = this.getFactionChars().get(faction);
 | 
			
		||||
		
 | 
			
		||||
		// Is Wilderness or known?
 | 
			
		||||
		if (hereFaction.isNone()) return KEY_WILDERNESS;
 | 
			
		||||
		if (faction.isNone()) return KEY_WILDERNESS;
 | 
			
		||||
		if (factionChar != null) return factionChar;
 | 
			
		||||
		
 | 
			
		||||
		// Create descriptions
 | 
			
		||||
		ChatColor color = hereFaction.getColorTo(this.getRelationParticipator());
 | 
			
		||||
		String name = hereFaction.getName(this.getRelationParticipator());
 | 
			
		||||
		ChatColor color = faction.getColorTo(this.getRelationParticipator());
 | 
			
		||||
		String name = faction.getName(this.getRelationParticipator());
 | 
			
		||||
		String tooltip = color.toString() + name;
 | 
			
		||||
		
 | 
			
		||||
		// Is overflown?
 | 
			
		||||
@@ -199,7 +212,7 @@ public class AsciiMap
 | 
			
		||||
		factionChar = factionChar.tooltip(tooltip);
 | 
			
		||||
		
 | 
			
		||||
		// Store for later use
 | 
			
		||||
		this.getFactionChars().put(hereFaction, factionChar);
 | 
			
		||||
		this.getFactionChars().put(faction, factionChar);
 | 
			
		||||
		
 | 
			
		||||
		// Return
 | 
			
		||||
		return factionChar;
 | 
			
		||||
@@ -237,4 +250,22 @@ public class AsciiMap
 | 
			
		||||
		return ! w.getGameRuleValue(GameRule.REDUCED_DEBUG_INFO);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static String getChunkDesc(PS chunk)
 | 
			
		||||
	{
 | 
			
		||||
		return showChunkCoords(chunk) ? " at " + chunk.toString(PSFormatHumanSpace.get()) : "";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static String getChunkDescWithName(PS chunk, TerritoryAccess ta)
 | 
			
		||||
	{
 | 
			
		||||
		String name = ta.getChunkName();
 | 
			
		||||
		if (name == null) return getChunkDesc(chunk);
 | 
			
		||||
 | 
			
		||||
		String ret = Txt.parse(" at <h>%s", name);
 | 
			
		||||
		if (showChunkCoords(chunk))
 | 
			
		||||
		{
 | 
			
		||||
			ret += Txt.parse(" <i>(%s<i>)", chunk.toString(PSFormatHumanSpace.get()));
 | 
			
		||||
		}
 | 
			
		||||
		return ret;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user