Adds per faction warps functionality from #72.

Default max warps per faction is 5. It can be changed in the config.yml.
You can now use {warps} in the info board to show how many warps a faction has when you walk into their territory.
Only faction mods+ can set faction warps.
This commit is contained in:
drtshock 2014-11-07 11:49:54 -06:00
parent 35813c7210
commit 8b64b4bfe1
14 changed files with 192 additions and 5 deletions

View File

@ -4,7 +4,7 @@
<groupId>com.massivecraft</groupId> <groupId>com.massivecraft</groupId>
<artifactId>Factions</artifactId> <artifactId>Factions</artifactId>
<version>1.6.9.5-U0.1.9</version> <version>1.6.9.5-U0.1.10-SNAPSHOT</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>Factions</name> <name>Factions</name>

View File

@ -2,6 +2,7 @@ package com.massivecraft.factions;
import com.massivecraft.factions.util.MiscUtil; import com.massivecraft.factions.util.MiscUtil;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.block.Block; import org.bukkit.block.Block;
@ -149,6 +150,14 @@ public class FLocation implements Serializable {
return dx * dx + dz * dz; return dx * dx + dz * dz;
} }
public boolean isInChunk(Location loc) {
if (loc == null) {
return false;
}
Chunk chunk = loc.getChunk();
return loc.getWorld().getName().equalsIgnoreCase(getWorldName()) && chunk.getX() == x && chunk.getZ() == z;
}
//----------------------------------------------// //----------------------------------------------//
// Some Geometry // Some Geometry
//----------------------------------------------// //----------------------------------------------//

View File

@ -4,15 +4,29 @@ import com.massivecraft.factions.iface.EconomyParticipator;
import com.massivecraft.factions.iface.RelationParticipator; import com.massivecraft.factions.iface.RelationParticipator;
import com.massivecraft.factions.struct.Relation; import com.massivecraft.factions.struct.Relation;
import com.massivecraft.factions.struct.Role; import com.massivecraft.factions.struct.Role;
import com.massivecraft.factions.util.LazyLocation;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
public interface Faction extends EconomyParticipator { public interface Faction extends EconomyParticipator {
public HashMap<String, List<String>> getAnnouncements(); public HashMap<String, List<String>> getAnnouncements();
public ConcurrentHashMap<String, LazyLocation> getWarps();
public LazyLocation getWarp(String name);
public void setWarp(String name, LazyLocation loc);
public boolean isWarp(String name);
public boolean removeWarp(String name);
public void clearWarps();
public void addAnnouncement(FPlayer fPlayer, String msg); public void addAnnouncement(FPlayer fPlayer, String msg);
public void sendUnreadAnnouncements(FPlayer fPlayer); public void sendUnreadAnnouncements(FPlayer fPlayer);

View File

@ -0,0 +1,29 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.struct.Permission;
public class CmdDelFWarp extends FCommand {
public CmdDelFWarp() {
super();
this.aliases.add("delwarp");
this.aliases.add("dw");
this.aliases.add("deletewarp");
this.requiredArgs.add("warp name");
this.senderMustBeMember = true;
this.senderMustBeModerator = true;
this.senderMustBePlayer = true;
this.permission = Permission.SETWARP.node;
}
@Override
public void perform() {
String warp = argAsString(0);
if (myFaction.isWarp(warp)) {
myFaction.removeWarp(warp);
fme.msg("<i>Deleted warp <a>%s", warp);
} else {
fme.msg("<i>Couldn't find warp <a>%s", warp);
}
}
}

View File

@ -0,0 +1,39 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.struct.Permission;
public class CmdFWarp extends FCommand {
public CmdFWarp() {
super();
this.aliases.add("warp");
this.aliases.add("warps");
this.optionalArgs.put("warpname", "warpname");
this.permission = Permission.WARP.node;
this.senderMustBeMember = true;
this.senderMustBeModerator = false;
}
@Override
public void perform() {
//TODO: check if in combat.
if (args.size() == 0) {
StringBuilder sb = new StringBuilder();
for (String s : myFaction.getWarps().keySet()) {
sb.append(s + " ");
}
fme.msg("<i>Warps: <a>" + sb.toString().trim());
} else if (args.size() > 1) {
fme.msg("<i>/f warp <warpname>");
} else {
String warpName = argAsString(0);
if (myFaction.isWarp(argAsString(0))) {
fme.getPlayer().teleport(myFaction.getWarp(warpName).getLocation());
fme.msg("<i>Warped to <a>%s", warpName);
} else {
fme.msg("<i>Couldn't find warp <a>%s", warpName);
}
}
}
}

View File

@ -0,0 +1,39 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.P;
import com.massivecraft.factions.struct.Permission;
import com.massivecraft.factions.struct.Relation;
import com.massivecraft.factions.util.LazyLocation;
public class CmdSetFWarp extends FCommand {
public CmdSetFWarp() {
super();
this.aliases.add("setwarp");
this.aliases.add("sw");
this.requiredArgs.add("warp name");
this.senderMustBeMember = true;
this.senderMustBeModerator = true;
this.senderMustBePlayer = true;
this.permission = Permission.SETWARP.node;
}
@Override
public void perform() {
if (!(fme.getRelationToLocation() == Relation.MEMBER)) {
fme.msg("<i>You can only set warps in your faction territory.");
return;
}
int maxWarps = P.p.getConfig().getInt("max-warps", 5);
if (maxWarps <= myFaction.getWarps().size()) {
fme.msg("<i>Your Faction already has the max amount of warps set <a>(%d).", maxWarps);
return;
}
String warp = argAsString(0);
LazyLocation loc = new LazyLocation(fme.getPlayer().getLocation());
myFaction.setWarp(warp, loc);
fme.msg("<i>Set warp <a>%s <i>to your location.", warp);
}
}

View File

@ -57,6 +57,9 @@ public class FCmdRoot extends FCommand {
public CmdAnnounce cmdAnnounce = new CmdAnnounce(); public CmdAnnounce cmdAnnounce = new CmdAnnounce();
public CmdSeeChunk cmdSeeChunk = new CmdSeeChunk(); public CmdSeeChunk cmdSeeChunk = new CmdSeeChunk();
public CmdConvert cmdConvert = new CmdConvert(); public CmdConvert cmdConvert = new CmdConvert();
public CmdFWarp cmdFWarp = new CmdFWarp();
public CmdSetFWarp cmdSetFWarp = new CmdSetFWarp();
public CmdDelFWarp cmdDelFWarp = new CmdDelFWarp();
public FCmdRoot() { public FCmdRoot() {
super(); super();
@ -130,6 +133,9 @@ public class FCmdRoot extends FCommand {
this.addSubCommand(this.cmdAnnounce); this.addSubCommand(this.cmdAnnounce);
this.addSubCommand(this.cmdSeeChunk); this.addSubCommand(this.cmdSeeChunk);
this.addSubCommand(this.cmdConvert); this.addSubCommand(this.cmdConvert);
this.addSubCommand(this.cmdFWarp);
this.addSubCommand(this.cmdSetFWarp);
this.addSubCommand(this.cmdDelFWarp);
} }
@Override @Override

View File

@ -30,7 +30,8 @@ public class FDefaultSidebar extends FSidebarProvider {
private String replace(FPlayer fplayer, String s) { private String replace(FPlayer fplayer, String s) {
String faction = !fplayer.getFaction().isNone() ? fplayer.getFaction().getTag() : "factionless"; String faction = !fplayer.getFaction().isNone() ? fplayer.getFaction().getTag() : "factionless";
s = s.replace("{name}", fplayer.getName()).replace("{power}", String.valueOf(fplayer.getPowerRounded())).replace("{balance}", String.valueOf(Econ.getFriendlyBalance(fplayer.getPlayer().getUniqueId()))).replace("{faction}", faction).replace("{maxPower}", String.valueOf(fplayer.getPowerMaxRounded())).replace("{totalOnline}", String.valueOf(Bukkit.getServer().getOnlinePlayers().length)); String powerBoost = String.valueOf((int) fplayer.getPowerBoost());
s = s.replace("{name}", fplayer.getName()).replace("{power}", String.valueOf(fplayer.getPowerRounded())).replace("{balance}", String.valueOf(Econ.getFriendlyBalance(fplayer.getPlayer().getUniqueId()))).replace("{faction}", faction).replace("{maxPower}", String.valueOf(fplayer.getPowerMaxRounded())).replace("{totalOnline}", String.valueOf(Bukkit.getServer().getOnlinePlayers().length)).replace("{powerBoost}", powerBoost);
return ChatColor.translateAlternateColorCodes('&', s); return ChatColor.translateAlternateColorCodes('&', s);
} }
} }

View File

@ -37,6 +37,6 @@ public class FInfoSidebar extends FSidebarProvider {
boolean raidable = faction.getLandRounded() > faction.getPower(); boolean raidable = faction.getLandRounded() > faction.getPower();
FPlayer fLeader = faction.getFPlayerAdmin(); FPlayer fLeader = faction.getFPlayerAdmin();
String leader = fLeader == null ? "Server" : fLeader.getName().substring(0, fLeader.getName().length() > 14 ? 13 : fLeader.getName().length()); String leader = fLeader == null ? "Server" : fLeader.getName().substring(0, fLeader.getName().length() > 14 ? 13 : fLeader.getName().length());
return ChatColor.translateAlternateColorCodes('&', s.replace("{power}", String.valueOf(faction.getPowerRounded())).replace("{online}", String.valueOf(faction.getOnlinePlayers().size())).replace("{members}", String.valueOf(faction.getFPlayers().size())).replace("{leader}", leader).replace("{chunks}", String.valueOf(faction.getLandRounded())).replace("{raidable}", String.valueOf(raidable))); return ChatColor.translateAlternateColorCodes('&', s.replace("{power}", String.valueOf(faction.getPowerRounded())).replace("{online}", String.valueOf(faction.getOnlinePlayers().size())).replace("{members}", String.valueOf(faction.getFPlayers().size())).replace("{leader}", leader).replace("{chunks}", String.valueOf(faction.getLandRounded())).replace("{raidable}", String.valueOf(raidable)).replace("{warps}", String.valueOf(faction.getWarps().size())));
} }
} }

View File

@ -68,7 +68,9 @@ public enum Permission {
UNCLAIM_ALL("unclaimall"), UNCLAIM_ALL("unclaimall"),
VERSION("version"), VERSION("version"),
SCOREBOARD("scoreboard"), SCOREBOARD("scoreboard"),
SEECHUNK("seechunk"); SEECHUNK("seechunk"),
SETWARP("setwarp"),
WARP("warp");
public final String node; public final String node;

View File

@ -10,6 +10,7 @@ import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.logging.Level;
public abstract class MemoryBoard extends Board { public abstract class MemoryBoard extends Board {
@ -45,6 +46,13 @@ public abstract class MemoryBoard extends Board {
} }
public void removeAt(FLocation flocation) { public void removeAt(FLocation flocation) {
Faction faction = getFactionAt(flocation);
for (String s : faction.getWarps().keySet()) {
if (flocation.isInChunk(faction.getWarp(s).getLocation())) {
faction.removeWarp(s);
P.p.log(Level.INFO, "Removed warp %s from faction %s", s, faction.getTag());
}
}
clearOwnershipAt(flocation); clearOwnershipAt(flocation);
flocationIds.remove(flocation); flocationIds.remove(flocation);
} }
@ -62,6 +70,7 @@ public abstract class MemoryBoard extends Board {
if (faction != null && faction.isNormal()) { if (faction != null && faction.isNormal()) {
faction.clearAllClaimOwnership(); faction.clearAllClaimOwnership();
} }
faction.clearWarps();
clean(factionId); clean(factionId);
} }

View File

@ -38,6 +38,7 @@ public abstract class MemoryFaction implements Faction, EconomyParticipator {
protected transient Set<FPlayer> fplayers = new HashSet<FPlayer>(); protected transient Set<FPlayer> fplayers = new HashSet<FPlayer>();
protected Set<String> invites = new HashSet<String>(); protected Set<String> invites = new HashSet<String>();
protected HashMap<String, List<String>> announcements = new HashMap<String, List<String>>(); protected HashMap<String, List<String>> announcements = new HashMap<String, List<String>>();
protected ConcurrentHashMap<String, LazyLocation> warps = new ConcurrentHashMap<String, LazyLocation>();
public HashMap<String, List<String>> getAnnouncements() { public HashMap<String, List<String>> getAnnouncements() {
return this.announcements; return this.announcements;
@ -67,6 +68,34 @@ public abstract class MemoryFaction implements Faction, EconomyParticipator {
} }
} }
public ConcurrentHashMap<String, LazyLocation> getWarps() {
return this.warps;
}
public LazyLocation getWarp(String name) {
return this.warps.get(name);
}
public void setWarp(String name, LazyLocation loc) {
this.warps.put(name, loc);
}
public boolean isWarp(String name) {
return this.warps.containsKey(name);
}
public boolean removeWarp(String name) {
if (warps.containsKey(name)) {
warps.remove(name);
return true;
}
return false;
}
public void clearWarps() {
warps.clear();
}
public Set<String> getInvites() { public Set<String> getInvites() {
return invites; return invites;
} }

View File

@ -19,6 +19,10 @@ findfactionsexploit:
cooldown: 2000 # in miliseconds. 2000 = 2 seconds. cooldown: 2000 # in miliseconds. 2000 = 2 seconds.
log: false log: false
# Warps
# What should be the max amount of warps that a Factoin can set?
max-warps: 5
# Configuration section for Scoreboards # Configuration section for Scoreboards
# This will allow you to completely customize how your scoreboards look. # This will allow you to completely customize how your scoreboards look.
# Make sure that no lines are duplicates of each other otherwise only the first will display. # Make sure that no lines are duplicates of each other otherwise only the first will display.
@ -34,6 +38,7 @@ scoreboard:
# {power} - faction's power. {chunks} - total claimed chunks. {members} - total members. # {power} - faction's power. {chunks} - total claimed chunks. {members} - total members.
# {online} - online members. {leader} - faction's leader. {open} - shows either true or false if open. # {online} - online members. {leader} - faction's leader. {open} - shows either true or false if open.
# {raidable} - true if the faction can be claimed over, otherwise false. # {raidable} - true if the faction can be claimed over, otherwise false.
# {warps} - the number of warps that a faction has set.
# The title of the scoreboard will be the Faction's tag and colored according to the relation with the player's Faction. # The title of the scoreboard will be the Faction's tag and colored according to the relation with the player's Faction.
# Commenting this section out will cause the info to appear in chat as the plugin originally did. # Commenting this section out will cause the info to appear in chat as the plugin originally did.
finfo-enabled: false # Default to false to keep original functionality. finfo-enabled: false # Default to false to keep original functionality.
@ -52,6 +57,7 @@ scoreboard:
# Replace {name} - player's name. {faction} - player's faction title, factionless if none. # Replace {name} - player's name. {faction} - player's faction title, factionless if none.
# {totalOnline} - total players on the server. {balance} - player's balance. # {totalOnline} - total players on the server. {balance} - player's balance.
# {maxPower} - player's max power. # {maxPower} - player's max power.
# {powerBoost} - player's powerboost.
default-enabled: false # Default to false to keep original functionality. default-enabled: false # Default to false to keep original functionality.
default-title: "i love drt" # Can use any of the values from above but this won't update once it's set (so don't set {balance}). default-title: "i love drt" # Can use any of the values from above but this won't update once it's set (so don't set {balance}).

View File

@ -234,3 +234,7 @@ permissions:
description: show pending invites to your faction description: show pending invites to your faction
factions.seechunk: factions.seechunk:
description: see the chunk you stand in description: see the chunk you stand in
factions.setwarp:
description: set a warp for your faction
factions.warp:
description: access your faction warps