New access commands
This commit is contained in:
parent
d015f19181
commit
ae442c677b
39
plugin.yml
39
plugin.yml
@ -12,8 +12,17 @@ permissions:
|
||||
# THE REAL NODES
|
||||
# -------------------------------------------- #
|
||||
factions.access: {description: manage access, with the proper fperm, default: false}
|
||||
factions.access.faction: {description: grant faction access, with the proper fperm, default: false}
|
||||
factions.access.player: {description: grant player access, with the proper fperm, default: false}
|
||||
factions.access.deny: {description: deny faction access, default: false}
|
||||
factions.access.deny.one: {description: deny access in a single chunk, default: false}
|
||||
factions.access.deny.fill: {description: deny access by filling, default: false}
|
||||
factions.access.deny.square: {description: deny access by square and radius, default: false}
|
||||
factions.access.deny.circle: {description: deny access by circle and radius, default: false}
|
||||
factions.access.grant: {description: grant faction access, default: false}
|
||||
factions.access.grant.one: {description: grant access in a single chunk, default: false}
|
||||
factions.access.grant.fill: {description: grant access by filling, default: false}
|
||||
factions.access.grant.square: {description: grant access by square and radius, default: false}
|
||||
factions.access.grant.circle: {description: grant access by circle and radius, default: false}
|
||||
factions.access.inspect: {description: inspect where someone has access, default: false}
|
||||
factions.access.view: {description: view access, default: false}
|
||||
factions.override: {description: enable override mode, default: false}
|
||||
factions.basecommand: {description: use factions base command, default: false}
|
||||
@ -134,8 +143,17 @@ permissions:
|
||||
factions.*:
|
||||
children:
|
||||
factions.access: true
|
||||
factions.access.faction: true
|
||||
factions.access.player: true
|
||||
factions.access.deny: true
|
||||
factions.access.deny.one: true
|
||||
factions.access.deny.fill: true
|
||||
factions.access.deny.square: true
|
||||
factions.access.deny.circle: true
|
||||
factions.access.grant: true
|
||||
factions.access.grant.one: true
|
||||
factions.access.grant.fill: true
|
||||
factions.access.grant.square: true
|
||||
factions.access.grant.circle: true
|
||||
factions.access.inspect: true
|
||||
factions.access.view: true
|
||||
factions.override: true
|
||||
factions.basecommand: true
|
||||
@ -301,8 +319,17 @@ permissions:
|
||||
default: false
|
||||
children:
|
||||
factions.access: true
|
||||
factions.access.faction: true
|
||||
factions.access.player: true
|
||||
factions.access.deny: true
|
||||
factions.access.deny.one: true
|
||||
factions.access.deny.fill: true
|
||||
factions.access.deny.square: true
|
||||
factions.access.deny.circle: true
|
||||
factions.access.grant: true
|
||||
factions.access.grant.one: true
|
||||
factions.access.grant.fill: true
|
||||
factions.access.grant.square: true
|
||||
factions.access.grant.circle: true
|
||||
factions.access.inspect: true
|
||||
factions.access.view: true
|
||||
factions.basecommand: true
|
||||
factions.claim: true
|
||||
|
@ -11,6 +11,15 @@ public enum Perm implements Identified
|
||||
// ENUM
|
||||
// -------------------------------------------- //
|
||||
|
||||
ACCESS_GRANT_ONE,
|
||||
ACCESS_GRANT_FILL,
|
||||
ACCESS_GRANT_SQUARE,
|
||||
ACCESS_GRANT_CIRCLE,
|
||||
ACCESS_DENY_ONE,
|
||||
ACCESS_DENY_FILL,
|
||||
ACCESS_DENY_SQUARE,
|
||||
ACCESS_DENY_CIRCLE,
|
||||
|
||||
CLAIM_ONE,
|
||||
CLAIM_AUTO,
|
||||
CLAIM_FILL,
|
||||
|
@ -45,6 +45,11 @@ public class TerritoryAccess
|
||||
public TerritoryAccess withGrantedIds(Collection<String> factionIds) { return valueOf(hostFactionId, hostFactionAllowed, grantedIds); }
|
||||
|
||||
// The intermediate ones
|
||||
public TerritoryAccess withGranted(MPermable mpermable, boolean with)
|
||||
{
|
||||
return withGrantedId(mpermable.getId(), with);
|
||||
}
|
||||
|
||||
public TerritoryAccess withGrantedId(String grantedId, boolean with)
|
||||
{
|
||||
if (this.getHostFactionId().equals(grantedId))
|
||||
|
@ -9,8 +9,9 @@ public class CmdFactionsAccess extends FactionsCommand
|
||||
// -------------------------------------------- //
|
||||
|
||||
public CmdFactionsAccessView cmdFactionsAccessView = new CmdFactionsAccessView();
|
||||
public CmdFactionsAccessPlayer cmdFactionsAccessPlayer = new CmdFactionsAccessPlayer();
|
||||
public CmdFactionsAccessFaction cmdFactionsAccessFaction = new CmdFactionsAccessFaction();
|
||||
public CmdFactionsAccessGrant cmdFactionsAccessGrant = new CmdFactionsAccessGrant();
|
||||
public CmdFactionsAccessDeny cmdFactionsAccessDeny = new CmdFactionsAccessDeny();
|
||||
public CmdFactionsAccessInspect cmdFactionsAccessInspect = new CmdFactionsAccessInspect();
|
||||
|
||||
// -------------------------------------------- //
|
||||
// CONSTRUCT
|
||||
|
@ -1,18 +1,16 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.RelationParticipator;
|
||||
import com.massivecraft.factions.TerritoryAccess;
|
||||
import com.massivecraft.factions.entity.BoardColl;
|
||||
import com.massivecraft.factions.entity.Faction;
|
||||
import com.massivecraft.massivecore.MassiveException;
|
||||
import com.massivecraft.factions.entity.MPerm;
|
||||
import com.massivecraft.factions.entity.MPerm.MPermable;
|
||||
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.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
public abstract class CmdFactionsAccessAbstract extends FactionsCommand
|
||||
@ -38,18 +36,25 @@ public abstract class CmdFactionsAccessAbstract extends FactionsCommand
|
||||
// -------------------------------------------- //
|
||||
// OVERRIDE
|
||||
// -------------------------------------------- //
|
||||
|
||||
|
||||
@Override
|
||||
public void perform() throws MassiveException
|
||||
public void senderFields(boolean set)
|
||||
{
|
||||
chunk = PS.valueOf(me.getLocation()).getChunk(true);
|
||||
ta = BoardColl.get().getTerritoryAccessAt(chunk);
|
||||
hostFaction = ta.getHostFaction();
|
||||
|
||||
this.innerPerform();
|
||||
super.senderFields(set);
|
||||
|
||||
if (set)
|
||||
{
|
||||
chunk = PS.valueOf(me.getLocation()).getChunk(true);
|
||||
ta = BoardColl.get().getTerritoryAccessAt(chunk);
|
||||
hostFaction = ta.getHostFaction();
|
||||
}
|
||||
else
|
||||
{
|
||||
chunk = null;
|
||||
ta = null;
|
||||
hostFaction = null;
|
||||
}
|
||||
}
|
||||
|
||||
public abstract void innerPerform() throws MassiveException;
|
||||
|
||||
public void sendAccessInfo()
|
||||
{
|
||||
@ -61,16 +66,37 @@ public abstract class CmdFactionsAccessAbstract extends FactionsCommand
|
||||
msg("<k>Host Faction Allowed: %s", ta.isHostFactionAllowed() ? Txt.parse("<lime>TRUE") : Txt.parse("<rose>FALSE"));
|
||||
msg("<k>Granted to: %s", CmdFactionsPermShow.permablesToDisplayString(ta.getGranteds(), msender));
|
||||
}
|
||||
|
||||
public static String describeRelationParticipators(Collection<? extends RelationParticipator> relationParticipators, RelationParticipator observer)
|
||||
|
||||
public void setAccess(Collection<PS> chunks, MPermable mpermable, boolean granted)
|
||||
{
|
||||
if (relationParticipators.size() == 0) return Txt.parse("<silver><em>none");
|
||||
List<String> descriptions = new ArrayList<>();
|
||||
for (RelationParticipator relationParticipator : relationParticipators)
|
||||
{
|
||||
descriptions.add(relationParticipator.describeTo(observer));
|
||||
}
|
||||
return Txt.implodeCommaAnd(descriptions, Txt.parse("<i>, "), Txt.parse(" <i>and "));
|
||||
chunks.forEach(chunk -> setAccess(chunk, mpermable, granted));
|
||||
}
|
||||
|
||||
|
||||
public void setAccess(PS chunk, MPermable mpermable, boolean granted)
|
||||
{
|
||||
TerritoryAccess ta = BoardColl.get().getTerritoryAccessAt(chunk);
|
||||
Faction faction = ta.getHostFaction();
|
||||
|
||||
String chunkDesc = chunk.toString(PSFormatHumanSpace.get());
|
||||
String grantedDenied = granted ? "granted" : "denied";
|
||||
String mpermableDesc = mpermable.getDisplayName(msender);
|
||||
|
||||
if ( ! MPerm.getPermAccess().has(msender, faction, false))
|
||||
{
|
||||
msg("<b>You do not have permission to edit access at %s<b>.", chunkDesc);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ta.isGranted(mpermable) == granted)
|
||||
{
|
||||
msg("<b>Access at %s <b>is already %s to %s<b>.", chunkDesc, grantedDenied, mpermableDesc);
|
||||
return;
|
||||
}
|
||||
|
||||
ta = ta.withGranted(mpermable, granted);
|
||||
BoardColl.get().setTerritoryAccessAt(chunk, ta);
|
||||
|
||||
msg("<i>Access at %s<i> is now %s to %s<i>.", chunkDesc, grantedDenied, mpermableDesc);
|
||||
}
|
||||
|
||||
}
|
||||
|
26
src/com/massivecraft/factions/cmd/CmdFactionsAccessDeny.java
Normal file
26
src/com/massivecraft/factions/cmd/CmdFactionsAccessDeny.java
Normal file
@ -0,0 +1,26 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.massivecore.command.requirement.RequirementIsPlayer;
|
||||
|
||||
public class CmdFactionsAccessDeny extends CmdFactionsAccessAbstract
|
||||
{
|
||||
// -------------------------------------------- //
|
||||
// FIELDS
|
||||
// -------------------------------------------- //
|
||||
|
||||
public CmdFactionsAccessSetOne cmdFactionsAccessDenyOne = new CmdFactionsAccessSetOne(false);
|
||||
public CmdFactionsAccessSetSquare cmdFactionsAccessDenySquare = new CmdFactionsAccessSetSquare(false);
|
||||
public CmdFactionsAccessSetCircle cmdFactionsAccessDenyCircle = new CmdFactionsAccessSetCircle(false);
|
||||
public CmdFactionsAccessSetFill cmdFactionsAccessDenyFill = new CmdFactionsAccessSetFill(false);
|
||||
|
||||
// -------------------------------------------- //
|
||||
// CONSTRUCT
|
||||
// -------------------------------------------- //
|
||||
|
||||
public CmdFactionsAccessDeny()
|
||||
{
|
||||
// Requirements
|
||||
this.addRequirements(RequirementIsPlayer.get());
|
||||
}
|
||||
|
||||
}
|
@ -1,45 +0,0 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.cmd.type.TypeFaction;
|
||||
import com.massivecraft.factions.entity.BoardColl;
|
||||
import com.massivecraft.factions.entity.Faction;
|
||||
import com.massivecraft.factions.entity.MPerm;
|
||||
import com.massivecraft.massivecore.MassiveException;
|
||||
import com.massivecraft.massivecore.command.type.primitive.TypeBooleanYes;
|
||||
|
||||
public class CmdFactionsAccessFaction extends CmdFactionsAccessAbstract
|
||||
{
|
||||
// -------------------------------------------- //
|
||||
// CONSTRUCT
|
||||
// -------------------------------------------- //
|
||||
|
||||
public CmdFactionsAccessFaction()
|
||||
{
|
||||
// Parameters
|
||||
this.addParameter(TypeFaction.get(), "faction");
|
||||
this.addParameter(TypeBooleanYes.get(), "yes/no", "toggle");
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// OVERRIDE
|
||||
// -------------------------------------------- //
|
||||
|
||||
@Override
|
||||
public void innerPerform() throws MassiveException
|
||||
{
|
||||
// Args
|
||||
Faction faction = this.readArg();
|
||||
boolean newValue = this.readArg(!ta.isGranted(faction));
|
||||
|
||||
// MPerm
|
||||
if (!MPerm.getPermAccess().has(msender, hostFaction, true)) return;
|
||||
|
||||
// Apply
|
||||
ta = ta.withGrantedId(faction.getId(), newValue);
|
||||
BoardColl.get().setTerritoryAccessAt(chunk, ta);
|
||||
|
||||
// Inform
|
||||
this.sendAccessInfo();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.massivecore.command.requirement.RequirementIsPlayer;
|
||||
|
||||
public class CmdFactionsAccessGrant extends CmdFactionsAccessAbstract
|
||||
{
|
||||
// -------------------------------------------- //
|
||||
// FIELDS
|
||||
// -------------------------------------------- //
|
||||
|
||||
public CmdFactionsAccessSetOne cmdFactionsAccessGrantOne = new CmdFactionsAccessSetOne(true);
|
||||
public CmdFactionsAccessSetSquare cmdFactionsAccessGrantSquare = new CmdFactionsAccessSetSquare(true);
|
||||
public CmdFactionsAccessSetCircle cmdFactionsAccessGrantCircle = new CmdFactionsAccessSetCircle(true);
|
||||
public CmdFactionsAccessSetFill cmdFactionsAccessGrantFill = new CmdFactionsAccessSetFill(true);
|
||||
|
||||
// -------------------------------------------- //
|
||||
// CONSTRUCT
|
||||
// -------------------------------------------- //
|
||||
|
||||
public CmdFactionsAccessGrant()
|
||||
{
|
||||
// Requirements
|
||||
this.addRequirements(RequirementIsPlayer.get());
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,96 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.cmd.type.TypeFaction;
|
||||
import com.massivecraft.factions.cmd.type.TypeMPermable;
|
||||
import com.massivecraft.factions.entity.Board;
|
||||
import com.massivecraft.factions.entity.BoardColl;
|
||||
import com.massivecraft.factions.entity.Faction;
|
||||
import com.massivecraft.factions.entity.MPerm;
|
||||
import com.massivecraft.factions.entity.MPerm.MPermable;
|
||||
import com.massivecraft.massivecore.MassiveException;
|
||||
import com.massivecraft.massivecore.collections.MassiveMap;
|
||||
import com.massivecraft.massivecore.mixin.MixinWorld;
|
||||
import com.massivecraft.massivecore.ps.PS;
|
||||
import com.massivecraft.massivecore.ps.PSFormatHumanSpace;
|
||||
import com.massivecraft.massivecore.util.Txt;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class CmdFactionsAccessInspect extends FactionsCommand
|
||||
{
|
||||
// -------------------------------------------- //
|
||||
// CONSTRUCT
|
||||
// -------------------------------------------- //
|
||||
|
||||
public CmdFactionsAccessInspect()
|
||||
{
|
||||
// Parameters
|
||||
this.addParameter(TypeMPermable.get(), "rank/rel/player/faction");
|
||||
this.addParameter(TypeFaction.get(), "faction", "your");
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// OVERRIDE
|
||||
// -------------------------------------------- //
|
||||
|
||||
@Override
|
||||
public void perform() throws MassiveException
|
||||
{
|
||||
// Parameter
|
||||
Faction faction = this.readArgAt(1, msenderFaction);
|
||||
MPermable mpermable = TypeMPermable.get(faction).read(this.argAt(0), sender);
|
||||
|
||||
String factionId = faction.getId();
|
||||
|
||||
// Check if they have access perms, unless they are checking for their own access
|
||||
if (mpermable != msender && mpermable != msenderFaction && mpermable != msender.getRank());
|
||||
{
|
||||
if ( ! MPerm.getPermAccess().has(msender, faction, true)) return;
|
||||
}
|
||||
|
||||
// Turn into id->chunks
|
||||
// And filter the ones that are empty
|
||||
Map<String, Set<PS>> world2Chunks = new MassiveMap<>();
|
||||
for (Board board : BoardColl.get().getAll())
|
||||
{
|
||||
String worldId = board.getId();
|
||||
Set<PS> chunks = board.getMap().entrySet().stream()
|
||||
.filter(e -> e.getValue().getHostFactionId().equals(factionId))
|
||||
.filter(e -> e.getValue().isGranted(mpermable))
|
||||
.map(Entry::getKey)
|
||||
.collect(Collectors.toSet());
|
||||
if ( ! chunks.isEmpty()) world2Chunks.put(worldId, chunks);
|
||||
}
|
||||
|
||||
if (world2Chunks.isEmpty())
|
||||
{
|
||||
msg("%s <i>has no special access in <reset>%s <i>.", mpermable.getDisplayName(msender), faction.describeTo(msender));
|
||||
return;
|
||||
}
|
||||
|
||||
msg("%s <i>has special access in <reset>%s <i> in the following chunks:", mpermable.getDisplayName(msender), faction.describeTo(msender));
|
||||
|
||||
for (Entry<String, Set<PS>> entry : world2Chunks.entrySet())
|
||||
{
|
||||
String worldId = entry.getKey();
|
||||
Set<PS> chunks = entry.getValue();
|
||||
|
||||
String worldName = MixinWorld.get().getWorldDisplayName(worldId);
|
||||
|
||||
// Remove world from chunks
|
||||
List<String> chunkNames = chunks.stream()
|
||||
.map(PS::getChunkCoords)
|
||||
.map(PSFormatHumanSpace.get()::format)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
String chunkDesc = Txt.implodeCommaAnd(chunkNames, Txt.parse("<i>"));
|
||||
|
||||
msg("%s<i> (%d): <reset>%s", worldName, chunks.size(), chunkDesc);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,45 +0,0 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.cmd.type.TypeMPlayer;
|
||||
import com.massivecraft.factions.entity.BoardColl;
|
||||
import com.massivecraft.factions.entity.MPerm;
|
||||
import com.massivecraft.factions.entity.MPlayer;
|
||||
import com.massivecraft.massivecore.MassiveException;
|
||||
import com.massivecraft.massivecore.command.type.primitive.TypeBooleanYes;
|
||||
|
||||
public class CmdFactionsAccessPlayer extends CmdFactionsAccessAbstract
|
||||
{
|
||||
// -------------------------------------------- //
|
||||
// CONSTRUCT
|
||||
// -------------------------------------------- //
|
||||
|
||||
public CmdFactionsAccessPlayer()
|
||||
{
|
||||
// Parameters
|
||||
this.addParameter(TypeMPlayer.get(), "player");
|
||||
this.addParameter(TypeBooleanYes.get(), "yes/no", "toggle");
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// OVERRIDE
|
||||
// -------------------------------------------- //
|
||||
|
||||
@Override
|
||||
public void innerPerform() throws MassiveException
|
||||
{
|
||||
// Args
|
||||
MPlayer mplayer = this.readArg();
|
||||
boolean newValue = this.readArg(!ta.isGranted(mplayer));
|
||||
|
||||
// MPerm
|
||||
if (!MPerm.getPermAccess().has(msender, hostFaction, true)) return;
|
||||
|
||||
// Apply
|
||||
ta = ta.withGrantedId(mplayer.getId(), newValue);
|
||||
BoardColl.get().setTerritoryAccessAt(chunk, ta);
|
||||
|
||||
// Inform
|
||||
this.sendAccessInfo();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Perm;
|
||||
import com.massivecraft.massivecore.MassiveException;
|
||||
import com.massivecraft.massivecore.command.requirement.RequirementHasPerm;
|
||||
import com.massivecraft.massivecore.command.requirement.RequirementIsPlayer;
|
||||
import com.massivecraft.massivecore.ps.PS;
|
||||
import com.massivecraft.massivecore.util.ChunkUtil;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
|
||||
public class CmdFactionsAccessSetCircle extends CmdFactionsAccessSetXRadius
|
||||
{
|
||||
// -------------------------------------------- //
|
||||
// CONSTRUCT
|
||||
// -------------------------------------------- //
|
||||
|
||||
public CmdFactionsAccessSetCircle(boolean grant)
|
||||
{
|
||||
// Super
|
||||
super(grant);
|
||||
|
||||
// Aliases
|
||||
this.addAliases("circle");
|
||||
|
||||
// Requirements
|
||||
this.addRequirements(RequirementIsPlayer.get());
|
||||
Perm perm = grant ? Perm.ACCESS_GRANT_CIRCLE : Perm.ACCESS_DENY_CIRCLE;
|
||||
this.addRequirements(RequirementHasPerm.get(perm));
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// OVERRIDE
|
||||
// -------------------------------------------- //
|
||||
|
||||
@Override
|
||||
public Set<PS> getChunks() throws MassiveException
|
||||
{
|
||||
// Common Startup
|
||||
final PS chunk = PS.valueOf(me.getLocation()).getChunk(true);
|
||||
return ChunkUtil.getChunksCircle(chunk, this.getRadius());
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,57 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Perm;
|
||||
import com.massivecraft.factions.entity.BoardColl;
|
||||
import com.massivecraft.factions.entity.Faction;
|
||||
import com.massivecraft.factions.entity.MConf;
|
||||
import com.massivecraft.massivecore.MassiveException;
|
||||
import com.massivecraft.massivecore.command.requirement.RequirementHasPerm;
|
||||
import com.massivecraft.massivecore.command.requirement.RequirementIsPlayer;
|
||||
import com.massivecraft.massivecore.predicate.Predicate;
|
||||
import com.massivecraft.massivecore.ps.PS;
|
||||
import com.massivecraft.massivecore.util.ChunkUtil;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
|
||||
public class CmdFactionsAccessSetFill extends CmdFactionsAccessSetXSimple
|
||||
{
|
||||
// -------------------------------------------- //
|
||||
// CONSTRUCT
|
||||
// -------------------------------------------- //
|
||||
|
||||
public CmdFactionsAccessSetFill(boolean claim)
|
||||
{
|
||||
// Super
|
||||
super(claim);
|
||||
|
||||
// Aliases
|
||||
this.addAliases("fill");
|
||||
|
||||
// Requirements
|
||||
this.addRequirements(RequirementIsPlayer.get());
|
||||
Perm perm = claim ? Perm.ACCESS_GRANT_FILL : Perm.ACCESS_DENY_FILL;
|
||||
this.addRequirements(RequirementHasPerm.get(perm));
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// OVERRIDE
|
||||
// -------------------------------------------- //
|
||||
|
||||
@Override
|
||||
public Set<PS> getChunks() throws MassiveException
|
||||
{
|
||||
// Common Startup
|
||||
final PS chunk = PS.valueOf(me.getLocation()).getChunk(true);
|
||||
|
||||
// What faction (aka color) resides there?
|
||||
// NOTE: Wilderness/None is valid.
|
||||
final Faction color = BoardColl.get().getFactionAt(chunk);
|
||||
|
||||
// Calculate
|
||||
int max = MConf.get().setFillMax;
|
||||
Predicate<PS> matcher = ps -> BoardColl.get().getFactionAt(ps) == color;
|
||||
return ChunkUtil.getChunkArea(chunk, matcher, max);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Perm;
|
||||
import com.massivecraft.massivecore.command.requirement.RequirementHasPerm;
|
||||
import com.massivecraft.massivecore.command.requirement.RequirementIsPlayer;
|
||||
import com.massivecraft.massivecore.ps.PS;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Set;
|
||||
|
||||
|
||||
public class CmdFactionsAccessSetOne extends CmdFactionsAccessSetXSimple
|
||||
{
|
||||
// -------------------------------------------- //
|
||||
// CONSTRUCT
|
||||
// -------------------------------------------- //
|
||||
|
||||
public CmdFactionsAccessSetOne(boolean claim)
|
||||
{
|
||||
// Super
|
||||
super(claim);
|
||||
|
||||
// Aliases
|
||||
this.addAliases("one");
|
||||
|
||||
// Requirements
|
||||
this.addRequirements(RequirementIsPlayer.get());
|
||||
Perm perm = claim ? Perm.ACCESS_GRANT_ONE : Perm.ACCESS_DENY_ONE;
|
||||
this.addRequirements(RequirementHasPerm.get(perm));
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// OVERRIDE
|
||||
// -------------------------------------------- //
|
||||
|
||||
@Override
|
||||
public Set<PS> getChunks()
|
||||
{
|
||||
final PS chunk = PS.valueOf(me.getLocation()).getChunk(true);
|
||||
final Set<PS> chunks = Collections.singleton(chunk);
|
||||
return chunks;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Perm;
|
||||
import com.massivecraft.massivecore.MassiveException;
|
||||
import com.massivecraft.massivecore.command.requirement.RequirementHasPerm;
|
||||
import com.massivecraft.massivecore.command.requirement.RequirementIsPlayer;
|
||||
import com.massivecraft.massivecore.ps.PS;
|
||||
import com.massivecraft.massivecore.util.ChunkUtil;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
|
||||
public class CmdFactionsAccessSetSquare extends CmdFactionsAccessSetXRadius
|
||||
{
|
||||
// -------------------------------------------- //
|
||||
// CONSTRUCT
|
||||
// -------------------------------------------- //
|
||||
|
||||
public CmdFactionsAccessSetSquare(boolean grant)
|
||||
{
|
||||
// Super
|
||||
super(grant);
|
||||
|
||||
// Aliases
|
||||
this.addAliases("square");
|
||||
|
||||
// Requirements
|
||||
this.addRequirements(RequirementIsPlayer.get());
|
||||
Perm perm = grant ? Perm.ACCESS_GRANT_SQUARE : Perm.ACCESS_DENY_SQUARE;
|
||||
this.addRequirements(RequirementHasPerm.get(perm));
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// OVERRIDE
|
||||
// -------------------------------------------- //
|
||||
|
||||
@Override
|
||||
public Set<PS> getChunks() throws MassiveException
|
||||
{
|
||||
// Common Startup
|
||||
final PS chunk = PS.valueOf(me.getLocation()).getChunk(true);
|
||||
return ChunkUtil.getChunksSquare(chunk, this.getRadius());
|
||||
}
|
||||
|
||||
}
|
68
src/com/massivecraft/factions/cmd/CmdFactionsAccessSetX.java
Normal file
68
src/com/massivecraft/factions/cmd/CmdFactionsAccessSetX.java
Normal file
@ -0,0 +1,68 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.cmd.type.TypeMPermable;
|
||||
import com.massivecraft.factions.entity.Faction;
|
||||
import com.massivecraft.factions.entity.MPerm.MPermable;
|
||||
import com.massivecraft.massivecore.MassiveException;
|
||||
import com.massivecraft.massivecore.ps.PS;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
public abstract class CmdFactionsAccessSetX extends CmdFactionsAccessAbstract
|
||||
{
|
||||
// -------------------------------------------- //
|
||||
// FIELDS
|
||||
// -------------------------------------------- //
|
||||
|
||||
private boolean grant = true;
|
||||
public boolean isGranting() { return this.grant; }
|
||||
public void setGranting(boolean grant) { this.grant = grant; }
|
||||
|
||||
private int mpermableArgIndex = 0;
|
||||
public int getMPermableArgIndex() { return this.mpermableArgIndex; }
|
||||
public void setMPermableArgIndex(int mpermableArgIndex) { this.mpermableArgIndex = mpermableArgIndex; }
|
||||
|
||||
// -------------------------------------------- //
|
||||
// CONSTRUCT
|
||||
// -------------------------------------------- //
|
||||
|
||||
public CmdFactionsAccessSetX(boolean grant)
|
||||
{
|
||||
this.setGranting(grant);
|
||||
this.setSetupEnabled(false);
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// OVERRIDE
|
||||
// -------------------------------------------- //
|
||||
|
||||
@Override
|
||||
public void perform() throws MassiveException
|
||||
{
|
||||
// Args
|
||||
final MPermable mpermable = this.getMPermable(hostFaction);
|
||||
|
||||
final Set<PS> chunks = this.getChunks();
|
||||
if (chunks == null) throw new NullPointerException("chunks");
|
||||
|
||||
// Apply / Inform
|
||||
setAccess(chunks, mpermable, this.isGranting());
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// ABSTRACT
|
||||
// -------------------------------------------- //
|
||||
|
||||
public abstract Set<PS> getChunks() throws MassiveException;
|
||||
|
||||
// -------------------------------------------- //
|
||||
// EXTRAS
|
||||
// -------------------------------------------- //
|
||||
|
||||
public MPermable getMPermable(Faction faction) throws MassiveException
|
||||
{
|
||||
String arg = this.argAt(this.getMPermableArgIndex());
|
||||
return TypeMPermable.get(faction).read(arg, sender);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,51 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.cmd.type.TypeMPermable;
|
||||
import com.massivecraft.factions.entity.MConf;
|
||||
import com.massivecraft.massivecore.MassiveException;
|
||||
import com.massivecraft.massivecore.command.type.primitive.TypeInteger;
|
||||
|
||||
|
||||
public abstract class CmdFactionsAccessSetXRadius extends CmdFactionsAccessSetX
|
||||
{
|
||||
// -------------------------------------------- //
|
||||
// CONSTRUCT
|
||||
// -------------------------------------------- //
|
||||
|
||||
public CmdFactionsAccessSetXRadius(boolean claim)
|
||||
{
|
||||
// Super
|
||||
super(claim);
|
||||
|
||||
// Parameters
|
||||
this.addParameter(TypeInteger.get(), "radius");
|
||||
|
||||
this.addParameter(TypeMPermable.get(), "rank/rel/faction/player");
|
||||
this.setMPermableArgIndex(1);
|
||||
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// EXTRAS
|
||||
// -------------------------------------------- //
|
||||
|
||||
public Integer getRadius() throws MassiveException
|
||||
{
|
||||
int radius = this.readArgAt(0);
|
||||
|
||||
// Radius Claim Min
|
||||
if (radius < 1)
|
||||
{
|
||||
throw new MassiveException().setMsg("<b>If you specify a radius, it must be at least 1.");
|
||||
}
|
||||
|
||||
// Radius Claim Max
|
||||
if (radius > MConf.get().setRadiusMax && ! msender.isOverriding())
|
||||
{
|
||||
throw new MassiveException().setMsg("<b>The maximum radius allowed is <h>%s<b>.", MConf.get().setRadiusMax);
|
||||
}
|
||||
|
||||
return radius;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.cmd.type.TypeMPermable;
|
||||
|
||||
public abstract class CmdFactionsAccessSetXSimple extends CmdFactionsAccessSetX
|
||||
{
|
||||
// -------------------------------------------- //
|
||||
// CONSTRUCT
|
||||
// -------------------------------------------- //
|
||||
|
||||
public CmdFactionsAccessSetXSimple(boolean claim)
|
||||
{
|
||||
// Super
|
||||
super(claim);
|
||||
|
||||
// Parameters
|
||||
this.addParameter(TypeMPermable.get(), "rank/rel/player/faction");
|
||||
this.setMPermableArgIndex(0);
|
||||
}
|
||||
|
||||
}
|
@ -7,7 +7,7 @@ public class CmdFactionsAccessView extends CmdFactionsAccessAbstract
|
||||
// -------------------------------------------- //
|
||||
|
||||
@Override
|
||||
public void innerPerform()
|
||||
public void perform()
|
||||
{
|
||||
this.sendAccessInfo();
|
||||
}
|
||||
|
@ -2,12 +2,11 @@ package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Perm;
|
||||
import com.massivecraft.massivecore.MassiveException;
|
||||
import com.massivecraft.massivecore.collections.MassiveSet;
|
||||
import com.massivecraft.massivecore.command.requirement.RequirementHasPerm;
|
||||
import com.massivecraft.massivecore.command.requirement.RequirementIsPlayer;
|
||||
import com.massivecraft.massivecore.ps.PS;
|
||||
import com.massivecraft.massivecore.util.ChunkUtil;
|
||||
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.Set;
|
||||
|
||||
|
||||
@ -44,27 +43,7 @@ public class CmdFactionsSetCircle extends CmdFactionsSetXRadius
|
||||
{
|
||||
// Common Startup
|
||||
final PS chunk = PS.valueOf(me.getLocation()).getChunk(true);
|
||||
final Set<PS> chunks = new MassiveSet<>();
|
||||
|
||||
chunks.add(chunk); // The center should come first for pretty messages
|
||||
|
||||
Integer radiusZero = this.getRadiusZero();
|
||||
double radiusSquared = radiusZero * radiusZero;
|
||||
|
||||
for (int dx = -radiusZero; dx <= radiusZero; dx++)
|
||||
{
|
||||
for (int dz = -radiusZero; dz <= radiusZero; dz++)
|
||||
{
|
||||
if (dx*dx + dz*dz > radiusSquared) continue;
|
||||
|
||||
int x = chunk.getChunkX() + dx;
|
||||
int z = chunk.getChunkZ() + dz;
|
||||
|
||||
chunks.add(chunk.withChunkX(x).withChunkZ(z));
|
||||
}
|
||||
}
|
||||
|
||||
return chunks;
|
||||
return ChunkUtil.getChunksCircle(chunk, this.getRadius());
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -5,11 +5,11 @@ import com.massivecraft.factions.entity.BoardColl;
|
||||
import com.massivecraft.factions.entity.Faction;
|
||||
import com.massivecraft.factions.entity.MConf;
|
||||
import com.massivecraft.massivecore.MassiveException;
|
||||
import com.massivecraft.massivecore.collections.MassiveSet;
|
||||
import com.massivecraft.massivecore.command.requirement.RequirementHasPerm;
|
||||
import com.massivecraft.massivecore.command.requirement.RequirementIsPlayer;
|
||||
import com.massivecraft.massivecore.predicate.Predicate;
|
||||
import com.massivecraft.massivecore.ps.PS;
|
||||
import com.massivecraft.massivecore.util.MUtil;
|
||||
import com.massivecraft.massivecore.util.ChunkUtil;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
@ -47,69 +47,15 @@ public class CmdFactionsSetFill extends CmdFactionsSetXSimple
|
||||
{
|
||||
// Common Startup
|
||||
final PS chunk = PS.valueOf(me.getLocation()).getChunk(true);
|
||||
final Set<PS> chunks = new MassiveSet<>();
|
||||
|
||||
// What faction (aka color) resides there?
|
||||
// NOTE: Wilderness/None is valid.
|
||||
final Faction color = BoardColl.get().getFactionAt(chunk);
|
||||
|
||||
// We start where we are!
|
||||
chunks.add(chunk);
|
||||
|
||||
// Flood!
|
||||
// Calculate
|
||||
int max = MConf.get().setFillMax;
|
||||
floodSearch(chunks, color, max);
|
||||
|
||||
// Limit Reached?
|
||||
if (chunks.size() >= max)
|
||||
{
|
||||
throw new MassiveException().addMsg("<b>Fill limit of <h>%d <b>reached.", max);
|
||||
}
|
||||
|
||||
// OK!
|
||||
return chunks;
|
||||
Predicate<PS> matcher = ps -> BoardColl.get().getFactionAt(ps) == color;
|
||||
return ChunkUtil.getChunkArea(chunk, matcher, max);
|
||||
}
|
||||
|
||||
// -------------------------------------------- //
|
||||
// FLOOD FILL
|
||||
// -------------------------------------------- //
|
||||
|
||||
public static void floodSearch(Set<PS> set, Faction color, int max)
|
||||
{
|
||||
// Clean
|
||||
if (set == null) throw new NullPointerException("set");
|
||||
if (color == null) throw new NullPointerException("color");
|
||||
|
||||
// Expand
|
||||
Set<PS> expansion = new MassiveSet<>();
|
||||
for (PS chunk : set)
|
||||
{
|
||||
Set<PS> neighbours = MUtil.set(
|
||||
chunk.withChunkX(chunk.getChunkX() + 1),
|
||||
chunk.withChunkX(chunk.getChunkX() - 1),
|
||||
chunk.withChunkZ(chunk.getChunkZ() + 1),
|
||||
chunk.withChunkZ(chunk.getChunkZ() - 1)
|
||||
);
|
||||
|
||||
for (PS neighbour : neighbours)
|
||||
{
|
||||
if (set.contains(neighbour)) continue;
|
||||
Faction faction = BoardColl.get().getFactionAt(neighbour);
|
||||
if (faction == null) continue;
|
||||
if (faction != color) continue;
|
||||
expansion.add(neighbour);
|
||||
}
|
||||
}
|
||||
set.addAll(expansion);
|
||||
|
||||
// No Expansion?
|
||||
if (expansion.isEmpty()) return;
|
||||
|
||||
// Reached Max?
|
||||
if (set.size() >= max) return;
|
||||
|
||||
// Recurse
|
||||
floodSearch(set, color, max);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -2,12 +2,11 @@ package com.massivecraft.factions.cmd;
|
||||
|
||||
import com.massivecraft.factions.Perm;
|
||||
import com.massivecraft.massivecore.MassiveException;
|
||||
import com.massivecraft.massivecore.collections.MassiveSet;
|
||||
import com.massivecraft.massivecore.command.requirement.RequirementHasPerm;
|
||||
import com.massivecraft.massivecore.command.requirement.RequirementIsPlayer;
|
||||
import com.massivecraft.massivecore.ps.PS;
|
||||
import com.massivecraft.massivecore.util.ChunkUtil;
|
||||
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.Set;
|
||||
|
||||
|
||||
@ -44,24 +43,7 @@ public class CmdFactionsSetSquare extends CmdFactionsSetXRadius
|
||||
{
|
||||
// Common Startup
|
||||
final PS chunk = PS.valueOf(me.getLocation()).getChunk(true);
|
||||
final Set<PS> chunks = new MassiveSet<>();
|
||||
|
||||
chunks.add(chunk); // The center should come first for pretty messages
|
||||
|
||||
Integer radiusZero = this.getRadiusZero();
|
||||
|
||||
for (int dx = -radiusZero; dx <= radiusZero; dx++)
|
||||
{
|
||||
for (int dz = -radiusZero; dz <= radiusZero; dz++)
|
||||
{
|
||||
int x = chunk.getChunkX() + dx;
|
||||
int z = chunk.getChunkZ() + dz;
|
||||
|
||||
chunks.add(chunk.withChunkX(x).withChunkZ(z));
|
||||
}
|
||||
}
|
||||
|
||||
return chunks;
|
||||
return ChunkUtil.getChunksSquare(chunk, this.getRadius());
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -49,10 +49,4 @@ public abstract class CmdFactionsSetXRadius extends CmdFactionsSetX
|
||||
return radius;
|
||||
}
|
||||
|
||||
public Integer getRadiusZero() throws MassiveException
|
||||
{
|
||||
Integer ret = this.getRadius();
|
||||
return ret - 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user